construct-hub-webapp 0.1.869 → 0.1.871
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/build/asset-manifest.json +7 -7
- package/build/index.html +1 -1
- package/build/static/js/{51.56334876.chunk.js → 51.17b41704.chunk.js} +2 -2
- package/build/static/js/{51.56334876.chunk.js.map → 51.17b41704.chunk.js.map} +1 -1
- package/build/static/js/545.41006be2.chunk.js +2 -0
- package/build/static/js/{545.cb269c67.chunk.js.map → 545.41006be2.chunk.js.map} +1 -1
- package/build/static/js/main.3aa4cbb5.js +3 -0
- package/build/static/js/main.3aa4cbb5.js.map +1 -0
- package/package.json +2 -2
- package/build/static/js/545.cb269c67.chunk.js +0 -2
- package/build/static/js/main.0f1b2c3f.js +0 -3
- package/build/static/js/main.0f1b2c3f.js.map +0 -1
- /package/build/static/js/{main.0f1b2c3f.js.LICENSE.txt → main.3aa4cbb5.js.LICENSE.txt} +0 -0
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"files": {
|
|
3
3
|
"main.css": "/static/css/main.efe592a7.css",
|
|
4
|
-
"main.js": "/static/js/main.
|
|
4
|
+
"main.js": "/static/js/main.3aa4cbb5.js",
|
|
5
5
|
"static/js/19.d330fc34.chunk.js": "/static/js/19.d330fc34.chunk.js",
|
|
6
6
|
"static/js/679.4c3850de.chunk.js": "/static/js/679.4c3850de.chunk.js",
|
|
7
7
|
"static/js/58.a6b0cce7.chunk.js": "/static/js/58.a6b0cce7.chunk.js",
|
|
8
8
|
"static/js/577.0fbaedf1.chunk.js": "/static/js/577.0fbaedf1.chunk.js",
|
|
9
|
-
"static/js/545.
|
|
9
|
+
"static/js/545.41006be2.chunk.js": "/static/js/545.41006be2.chunk.js",
|
|
10
10
|
"static/js/418.6340af6e.chunk.js": "/static/js/418.6340af6e.chunk.js",
|
|
11
|
-
"static/js/51.
|
|
11
|
+
"static/js/51.17b41704.chunk.js": "/static/js/51.17b41704.chunk.js",
|
|
12
12
|
"static/js/540.c326d22f.chunk.js": "/static/js/540.c326d22f.chunk.js",
|
|
13
13
|
"static/js/259.07e40dd7.chunk.js": "/static/js/259.07e40dd7.chunk.js",
|
|
14
14
|
"static/js/787.34927533.chunk.js": "/static/js/787.34927533.chunk.js",
|
|
@@ -21,14 +21,14 @@
|
|
|
21
21
|
"service-worker.js": "/service-worker.js",
|
|
22
22
|
"index.html": "/index.html",
|
|
23
23
|
"main.efe592a7.css.map": "/static/css/main.efe592a7.css.map",
|
|
24
|
-
"main.
|
|
24
|
+
"main.3aa4cbb5.js.map": "/static/js/main.3aa4cbb5.js.map",
|
|
25
25
|
"19.d330fc34.chunk.js.map": "/static/js/19.d330fc34.chunk.js.map",
|
|
26
26
|
"679.4c3850de.chunk.js.map": "/static/js/679.4c3850de.chunk.js.map",
|
|
27
27
|
"58.a6b0cce7.chunk.js.map": "/static/js/58.a6b0cce7.chunk.js.map",
|
|
28
28
|
"577.0fbaedf1.chunk.js.map": "/static/js/577.0fbaedf1.chunk.js.map",
|
|
29
|
-
"545.
|
|
29
|
+
"545.41006be2.chunk.js.map": "/static/js/545.41006be2.chunk.js.map",
|
|
30
30
|
"418.6340af6e.chunk.js.map": "/static/js/418.6340af6e.chunk.js.map",
|
|
31
|
-
"51.
|
|
31
|
+
"51.17b41704.chunk.js.map": "/static/js/51.17b41704.chunk.js.map",
|
|
32
32
|
"540.c326d22f.chunk.js.map": "/static/js/540.c326d22f.chunk.js.map",
|
|
33
33
|
"259.07e40dd7.chunk.js.map": "/static/js/259.07e40dd7.chunk.js.map",
|
|
34
34
|
"787.34927533.chunk.js.map": "/static/js/787.34927533.chunk.js.map",
|
|
@@ -41,6 +41,6 @@
|
|
|
41
41
|
},
|
|
42
42
|
"entrypoints": [
|
|
43
43
|
"static/css/main.efe592a7.css",
|
|
44
|
-
"static/js/main.
|
|
44
|
+
"static/js/main.3aa4cbb5.js"
|
|
45
45
|
]
|
|
46
46
|
}
|
package/build/index.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!doctype html><html lang="en"><head><script src="/preload.js"></script><meta charset="utf-8"/><meta name="description" content="Construct Hub helps developers find open-source construct libraries for use with AWS CDK, CDK8s, CDKTF and other construct-based tools."/><meta name="viewport" content="width=device-width,initial-scale=1"/><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link rel="manifest" href="/manifest.json"><meta name="theme-color" content="#ffffff"><title>Construct Hub</title><script defer="defer" src="/static/js/main.
|
|
1
|
+
<!doctype html><html lang="en"><head><script src="/preload.js"></script><meta charset="utf-8"/><meta name="description" content="Construct Hub helps developers find open-source construct libraries for use with AWS CDK, CDK8s, CDKTF and other construct-based tools."/><meta name="viewport" content="width=device-width,initial-scale=1"/><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link rel="manifest" href="/manifest.json"><meta name="theme-color" content="#ffffff"><title>Construct Hub</title><script defer="defer" src="/static/js/main.3aa4cbb5.js"></script><link href="/static/css/main.efe592a7.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkconstruct_hub_webapp=self.webpackChunkconstruct_hub_webapp||[]).push([[51],{55051:function(e,n,t){t.r(n),t.d(n,{default:function(){return we}});var r,a=t(28735),i=t(93433),o=t(4942),s=t(1413),l=t(29439),c=t(72791),u=t(3445),d=t(16478),f=t(59534),v=(r={},(0,o.Z)(r,d.W.NameAsc,"A-Z"),(0,o.Z)(r,d.W.NameDesc,"Z-A"),(0,o.Z)(r,d.W.PublishDateAsc,"Oldest"),(0,o.Z)(r,d.W.PublishDateDesc,"Recently updated"),(0,o.Z)(r,d.W.DownloadsDesc,"Most downloads"),(0,o.Z)(r,d.W.DownloadsAsc,"Least downloads"),r),h=function(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];return f.oJ.apply(void 0,["Search"].concat(n))},x={FILTERS:h("Filters"),RESULTS:h("Results"),SEARCH:h("Search"),SORT:h("Sort")},m=t(75272),g=t(10855),p=t(74817),j=t(80184),y=function(e){var n=e.name,t=e.hint,r=(0,g.Sx)({base:"auto",md:"right"});return(0,j.jsxs)(a.kC,{align:"center",mb:1,children:[(0,j.jsx)(a.X6,{as:"h3",size:"sm",w:"max-content",children:n}),t?(0,j.jsxs)(p.J2,{colorScheme:"dark",placement:r,strategy:"fixed",children:[(0,j.jsx)(p.xo,{children:(0,j.jsx)(a.kC,{"aria-label":"Hint: ".concat(n),as:"button","data-event":(0,f.oJ)(x.FILTERS,n,"Popover"),ml:2,children:(0,j.jsx)(m.UO,{h:3.5,w:3.5})})}),(0,j.jsxs)(p.yk,{bg:"gray.700",borderRadius:"base",color:"white",fontSize:"sm",mx:{base:"1rem",md:"initial"},shadow:"whiteAlpha.300",children:[(0,j.jsx)(p.QH,{bg:"gray.700"}),(0,j.jsx)(p.b,{children:(0,j.jsx)(a.xv,{children:t})})]})]}):null]})},b=(0,t(88606).$)("searchRedesign",["page","searchDetails","nextPage","prevPage","goToPage","sortButton","sortDropdown","sortItem","filtersPanel","cdkTypeFilter","cdkVersionFilter","filterItem","languagesFilter"]),C=function(e){var n=e["data-testid"],t=e.value,r=e.onValueChange,i=e.options,o=e.name,s=e.hint;return(0,j.jsxs)(a.Kq,{"data-testid":n,spacing:1,children:[(0,j.jsx)(y,{hint:s,name:o}),(0,j.jsx)(u.Ee,{onChange:r,value:t,children:(0,j.jsx)(a.Kq,{spacing:1,children:i.map((function(e){var n=e.display,t=e.value,r=(0,f.oJ)(x.FILTERS,o,"Filter",n);return(0,j.jsx)(u.Y8,{"data-event":r,value:t,children:(0,j.jsx)(a.xv,{color:"textTertiary","data-event":r,"data-testid":b.filterItem,"data-value":t,isTruncated:!0,children:n})},t)}))})})]})},k=t(29499),S=function(e){var n=parseInt(e);return"NaN"==="".concat(n)?0:n},T=function(e){return e?decodeURIComponent(e).split(","):[]},Z=function(e){return"undefined"===typeof window?null:new URL(window.location.href).searchParams.get(e)},w=t(4487),R=function(e,n){var t=(0,w.K)().get(e);return(0,c.useMemo)((function(){return n?n(t):t}),[t])},D=function(){var e;return null!==(e=R(k.Tx.CDK_TYPE))&&void 0!==e?e:void 0},F=function(){return R(k.Tx.CDK_MAJOR,(function(e){return e?S(e):void 0}))},E=function(){return R(k.Tx.KEYWORDS,T)},K=function(){return R(k.Tx.LANGUAGES,T)},O=function(){var e;return null!==(e=R(k.Tx.SEARCH_QUERY))&&void 0!==e?e:""},A=function(){var e;return null!==(e=R(k.Tx.SORT))&&void 0!==e?e:void 0},I=function(){return R(k.Tx.TAGS,T)},P=t(45987),L=t(64880),W=t(19748),q=["offset"],M=function(){var e=(0,L.k6)().push;return(0,c.useCallback)((function(n){var t=null!==n&&void 0!==n?n:{},r=t.offset,a=(0,P.Z)(t,q);e((0,W.yc)((0,s.Z)((0,s.Z)((0,s.Z)({},function(){var e,n,t,r;return{query:null!==(e=Z(k.Tx.SEARCH_QUERY))&&void 0!==e?e:"",keywords:T(Z(k.Tx.KEYWORDS)),cdkType:null!==(n=Z(k.Tx.CDK_TYPE))&&void 0!==n?n:void 0,cdkMajor:function(){var e=Z(k.Tx.CDK_MAJOR);return e?S(e):void 0}(),languages:T(Z(k.Tx.LANGUAGES)),offset:S(null!==(t=Z(k.Tx.OFFSET))&&void 0!==t?t:""),sort:null!==(r=Z(k.Tx.SORT))&&void 0!==r?r:void 0,tags:T(Z(k.Tx.TAGS))}}()),a),{},{offset:null!==r&&void 0!==r?r:0})))}),[e])},J=t(30791),N=t(59707),V=function(){var e,n=D(),t=F(),r=M(),a=(0,N.A)(),u=(0,c.useMemo)((function(){var e=a.constructFrameworks,n=Object.entries(e).reduce((function(e,n){var t=(0,l.Z)(n,2),r=t[0],a=t[1];return a.pkgCount<1?e:(0,s.Z)((0,s.Z)({},e),{},(0,o.Z)({},r,(0,s.Z)({display:J.lQ[r],value:r},a)))}),{});return Object.keys(n).length?n:void 0}),[a]),d=(0,c.useMemo)((function(){var e;if(u&&n){var t=null===(e=u[n])||void 0===e?void 0:e.majorVersions;if(t)return(0,i.Z)(t).sort((function(e,n){return e-n})).map((function(e){return{value:e.toString(),display:"".concat(J.lQ[n]," v").concat(e)}}))}}),[u,n]);if(!u)return null;return(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(C,{"data-testid":b.cdkTypeFilter,hint:"Choose the right CDK for your IaC technology: AWS CDK for AWS CloudFormation, CDKTF for Terraform, or CDK8s for Kubernetes.",name:"CDK Type",onValueChange:function(e){r({cdkType:e?e:void 0,cdkMajor:void 0})},options:[{display:"Any CDK Type",value:""}].concat((0,i.Z)(Object.values(u))),value:null!==n&&void 0!==n?n:""}),!!(d&&d.length>1)&&(0,j.jsx)(C,{"data-testid":b.cdkVersionFilter,hint:"Choose the major version of the CDK you're using to see only constructs that will work with that version.",name:"CDK Major Version",onValueChange:function(e){var n=void 0;e&&(n=parseInt(e,10)),r({cdkMajor:n})},options:[{display:"Any Major Version",value:""}].concat((0,i.Z)(d)),value:null!==(e=null===t||void 0===t?void 0:t.toString())&&void 0!==e?e:""})]})},U=t(62732),z=t(81070),H=t(65223),_=t(77231),Y=t(82504),G=function(e){var n=e.display,t=e.value,r=e.isDisabled,i=e.disabledHint,o=e.isChecked,s=e.onChange;return(0,j.jsx)(U.XZ,{isChecked:o,isDisabled:r,onChange:s,children:(0,j.jsx)(z.u,{hasArrow:!0,isDisabled:!r&&!i,label:i,placement:"right",children:(0,j.jsx)(a.xv,{color:"textTertiary","data-testid":b.filterItem,"data-value":t,isTruncated:!0,children:n})})},t)},Q=function(e){var n=e["data-testid"],t=e.initialItemCount,r=e.hint,i=e.name,o=e.options,l=e.values,u=e.onValueChange,d=(0,H.qY)(),v=(0,f.z$)().trackCustomEvent,h=function(e){return function(){v((0,f.Q5)({name:(0,f.oJ)(x.FILTERS,i,"Filter",e.display)})),u(e.value)}},g=o,p=[];t&&(g=o.slice(0,t),p=o.slice(t,o.length));var b=p.length>0;return(0,j.jsxs)(a.kC,{"data-testid":n,direction:"column",children:[(0,j.jsx)(y,{hint:r,name:i}),(0,j.jsxs)(a.Kq,{mt:1,spacing:1,children:[g.map((function(e){return(0,c.createElement)(G,(0,s.Z)((0,s.Z)({},e),{},{isChecked:l.includes(e.value),key:e.value,onChange:h(e)}))})),b&&(0,j.jsx)(_.UO,{animateOpacity:!0,in:d.isOpen,unmountOnExit:!0,children:(0,j.jsx)(a.Kq,{spacing:1,children:p.map((function(e){return(0,c.createElement)(G,(0,s.Z)((0,s.Z)({},e),{},{isChecked:l.includes(e.value),key:e.value,onChange:h(e)}))}))})})]}),b&&(0,j.jsx)(a.kC,{align:"start",mt:1,children:(0,j.jsx)(Y.zx,{color:"textTertiary","data-event":(0,f.oJ)(x.FILTERS,i,"Show More"),fontWeight:"normal",leftIcon:d.isOpen?(0,j.jsx)(m.g8,{}):(0,j.jsx)(m.v4,{}),onClick:d.onToggle,size:"sm",textAlign:"left",variant:"link",w:"auto",children:d.isOpen?"Show fewer options (".concat(g.length,")"):"Show more options (".concat(p.length,")")})})]})},$=function(){var e=E(),n=(0,N.A)().keywords,t=M(),r=(0,c.useMemo)((function(){var t=(0,i.Z)(n.entries()).sort((function(e,n){return(0,l.Z)(e,2)[1]<(0,l.Z)(n,2)[1]?1:-1})).filter((function(n){var t=(0,l.Z)(n,1)[0];return!e.includes(t)})).map((function(e){var n=(0,l.Z)(e,1)[0];return{display:n,value:n}})).slice(0,25),r=e.filter((function(e){return!t.some((function(n){return n.value===e}))}));return[].concat((0,i.Z)(r.map((function(e){return{display:e,value:e}}))),(0,i.Z)(t))}),[n,e]);return(0,j.jsx)(Q,{"data-testid":b.languagesFilter,hint:"Focus the results by choosing one or more keywords reflecting the kind of construct you're looking for. Keywords are provided by construct authors.",initialItemCount:5,name:"Keywords",onValueChange:function(n){t({keywords:e.includes(n)?e.filter((function(e){return e!==n})):[].concat((0,i.Z)(e),[n])})},options:r,values:e})},B=t(86617),X=Object.entries(B.k8).map((function(e){var n=(0,l.Z)(e,2),t=n[0],r=n[1];return(0,s.Z)({display:r,value:t},B.dX.has(t)?{isDisabled:!1}:{isDisabled:!0,disabledHint:"".concat(B.k8[t]," support is coming soon!")})})).sort((function(e,n){return e.isDisabled>n.isDisabled?1:-1})),ee=function(){var e=K(),n=M();return(0,j.jsx)(Q,{"data-testid":b.languagesFilter,hint:"Choose one or more languages. Results include constructs for use with at least one of the selected languages.",name:"Programming Language",onValueChange:function(t){var r=t;n({languages:e.includes(r)?e.filter((function(e){return e!==r})):[].concat((0,i.Z)(e),[r])})},options:X,values:e})},ne=t(56804),te=function(){var e=(0,ne.E)("packageTags"),n=(0,ne.E)("packageTagGroups"),t=(0,c.useMemo)((function(){var t,r=new Map;return null===n||void 0===n||n.forEach((function(e){r.set(e.id,e)})),function(e,n){return e.reduce((function(e,t){var r,a,l,c=null===(r=t.searchFilter)||void 0===r?void 0:r.groupBy,u=c?n.get(c):void 0;if(c&&u){var d=e[c];return d?(d.tags=[].concat((0,i.Z)(d.tags),[t]),e):(0,s.Z)((0,s.Z)({},e),{},(0,o.Z)({},c,(0,s.Z)((0,s.Z)({},u),{},{tags:[t]})))}return c?(0,s.Z)((0,s.Z)({},e),{},(0,o.Z)({},c,{id:c,tags:[].concat((0,i.Z)(null!==(a=null===e||void 0===e||null===(l=e[c])||void 0===l?void 0:l.tags)&&void 0!==a?a:[]),[t])})):e}),{})}(null!==(t=null===e||void 0===e?void 0:e.filter((function(e){return Boolean(e.searchFilter)})))&&void 0!==t?t:[],r)}),[e,n]),r=I(),a=M(),l=function(e){a({tags:r.includes(e)?r.filter((function(n){return n!==e})):[].concat((0,i.Z)(r),[e])})},u=(0,c.useCallback)((function(e){var n,o,s=new Set((null!==(n=null===(o=t[e])||void 0===o?void 0:o.tags)&&void 0!==n?n:[]).map((function(e){return e.id})));return function(e){var n=r.filter((function(e){return!s.has(e)}));a({tags:e?[].concat((0,i.Z)(n),[e]):n})}}),[t,r,a]);return(0,j.jsx)(j.Fragment,{children:Object.values(t).map((function(e){var n,t,a=e.filterType,o=e.id,d=e.label,f=e.tooltip,v=e.tags,h={hint:f,name:null!==d&&void 0!==d?d:o,options:v.map((function(e){return{display:e.searchFilter.display,value:e.id}}))};return"radio"===a?(0,c.createElement)(C,(0,s.Z)((0,s.Z)({},h),{},{key:o,onValueChange:u(o),options:[{display:"Any ".concat(h.name),value:""}].concat((0,i.Z)(h.options)),value:null!==(n=null===(t=v.find((function(e){return r.includes(e.id)})))||void 0===t?void 0:t.id)&&void 0!==n?n:""})):(0,c.createElement)(Q,(0,s.Z)((0,s.Z)({},h),{},{key:o,onValueChange:l,values:r}))}))})},re=t(777),ae="5.75rem",ie=function(){return(0,j.jsx)(re.Z,{borderRadius:"sm","data-testid":b.filtersPanel,display:{base:"none",md:"flex"},maxH:"calc(100vh - ".concat(ae," - 1.25rem)"),maxW:"23rem",minW:"100%",overflow:"hidden auto",p:4,pos:"sticky",top:ae,zIndex:"docked",children:(0,j.jsxs)(a.Kq,{color:"textPrimary",h:"max-content",spacing:4,top:4,children:[(0,j.jsx)(a.X6,{as:"h2",size:"sm",children:"Filters"}),(0,j.jsx)(V,{}),(0,j.jsx)(ee,{}),(0,j.jsx)(te,{}),(0,j.jsx)($,{})]})})},oe=function(e){var n=e["data-event"],t=e["data-testid"],r=e.icon,a=e.label,i=e.onClick,o={"aria-label":a,borderRadius:"md",borderColor:"blue.500",colorScheme:"blue","data-event":n,"data-testid":t,icon:(0,j.jsx)(r,{color:"blue.500",h:5,w:5}),mx:2,h:10,w:10,variant:"outline"};return(0,j.jsx)(Y.hU,(0,s.Z)((0,s.Z)({},o),{},{disabled:!i,onClick:i}))},se=t(95798),le=function(e){var n=e["data-event"],t=e["data-testid"],r=e.pageLimit,i=e.offset,o=M(),s=(0,f.z$)().trackCustomEvent,u=(0,c.useState)((i+1).toString()),d=(0,l.Z)(u,2),v=d[0],h=d[1];(0,c.useEffect)((function(){h((i+1).toString())}),[i]);return(0,j.jsxs)(a.kC,{align:"center",as:"form",mx:2,onSubmit:function(e){e.preventDefault(),o({offset:parseInt(v)-1})},children:[(0,j.jsx)(se.II,{"aria-label":"Jump to page",colorScheme:"brand","data-testid":t,h:10,max:r+1,min:1,name:"page",onChange:function(e){e.preventDefault(),h(e.target.value)},onFocus:function(){n&&s((0,f.Q5)({name:n}))},p:0,textAlign:"center",type:"number",value:v,w:10}),(0,j.jsxs)(a.xv,{ml:2,w:"max-content",children:["of ",r+1]})]})},ce=function(e){var n=e.offset,t=e.pageLimit,r=M(),i=n<t?function(){return r({offset:n+1})}:void 0,o=n>0?function(){return r({offset:n-1})}:void 0;return(0,j.jsxs)(a.Kq,{align:"center",direction:"row",justify:"space-between",maxW:"18rem",mx:"auto",spacing:4,w:"full",children:[(0,j.jsx)(oe,{"data-event":(0,f.oJ)(x.RESULTS,"Previous Page"),"data-testid":b.prevPage,icon:m.wy,label:"Previous page button",onClick:o}),(0,j.jsx)(le,{"data-event":(0,f.oJ)(x.RESULTS,"Go to Page"),"data-testid":b.goToPage,offset:n,pageLimit:t}),(0,j.jsx)(oe,{"data-event":(0,f.oJ)(x.RESULTS,"Next Page"),"data-testid":b.nextPage,icon:m.XC,label:"Next page button",onClick:i})]})},ue=t(99185),de=function(){var e=O(),n=M(),t=(0,c.useState)(null!==e&&void 0!==e?e:""),r=(0,l.Z)(t,2),a=r[0],i=r[1];return(0,j.jsx)(ue.E1,{bg:"bgSecondary","data-event":x.SEARCH,onChange:function(e){return i(e.target.value)},onSubmit:function(e){e.preventDefault(),n({query:a,sort:void 0})},value:a})},fe=function(e){var n=e.children;return(0,j.jsx)(a.xv,{as:"strong",color:"textSecondary",children:n})},ve=function(e){var n=e.first,t=e.count,r=e.last;return!n&&r>=t?(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(fe,{children:t})," of ",(0,j.jsx)(fe,{children:t})]}):(0,j.jsxs)(j.Fragment,{children:[(0,j.jsxs)(fe,{children:[t?n+1:t," - ",r>t?t:r]})," ","of ",(0,j.jsx)(fe,{children:t})]})},he=function(e){var n=e.limit,t=e.offset,r=e.count,i=e.filtered,o=e.query,s=n*t,l=s+n,c=r>0;return(0,j.jsxs)(a.xv,{"data-testid":b.searchDetails,children:[c?(0,j.jsxs)(j.Fragment,{children:["Displaying ",(0,j.jsx)(ve,{count:r,first:s,last:l})," ",i?"search results":"constructs"]}):(0,j.jsx)(j.Fragment,{children:i?"There were no search results":"No constructs found"}),o&&(0,j.jsxs)(j.Fragment,{children:[" for ",(0,j.jsx)(fe,{children:o})]}),".",!c&&i&&(0,j.jsx)(j.Fragment,{children:" Try a different term."})]})},xe=t(3308),me=function(){var e=A(),n=M();return(0,j.jsx)(C,{hint:"Sets the order of search results",name:"Sorted By",onValueChange:function(e){n({sort:e||void 0})},options:[{display:"Relevance",value:""}].concat((0,i.Z)(Object.entries(v).map((function(e){var n=(0,l.Z)(e,2),t=n[0];return{display:n[1],value:t}})))),value:null!==e&&void 0!==e?e:""})},ge=function(){var e=(0,H.qY)();return(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(Y.zx,{colorScheme:"brand",display:{md:"none"},onClick:e.onOpen,rightIcon:(0,j.jsx)(m.v4,{}),variant:"link",children:"Sorting and Filters"}),(0,j.jsxs)(xe.dy,(0,s.Z)((0,s.Z)({},e),{},{placement:"bottom",children:[(0,j.jsx)(xe.P1,{}),(0,j.jsxs)(xe.sc,{color:"textPrimary",maxH:"full",children:[(0,j.jsx)(xe.OX,{borderBottom:"base",children:"Sorting and Filters"}),(0,j.jsx)(xe.cC,{}),(0,j.jsx)(xe.Ng,{children:(0,j.jsxs)(a.Kq,{color:"textPrimary",pb:4,spacing:4,children:[(0,j.jsx)(me,{}),(0,j.jsx)(V,{}),(0,j.jsx)(ee,{}),(0,j.jsx)(te,{}),(0,j.jsx)($,{})]})})]})]}))]})},pe=t(81641),je=function(){var e=A(),n=M(),t=e?v[e]:"Relevance";return(0,j.jsxs)(a.kC,{align:"center",children:[(0,j.jsx)(a.xv,{children:"Sorted by"}),(0,j.jsxs)(pe.v2,{children:[(0,j.jsx)(pe.j2,{as:Y.zx,color:"link","data-event":(0,f.oJ)(x.SORT,"Menu"),"data-testid":b.sortButton,ml:2,pl:2,pr:2,py:1,rightIcon:(0,j.jsx)(m.v4,{}),variant:"link",children:t}),(0,j.jsxs)(pe.qy,{"data-testid":b.sortDropdown,minW:"180",zIndex:"sticky",children:[(0,j.jsx)(pe.sN,{"data-event":(0,f.oJ)(x.SORT,"Option","Relevance"),"data-testid":b.sortItem,"data-value":"",onClick:function(){return n({sort:void 0})},children:"Relevance"},"Relevance"),Object.entries(v).map((function(e){var t=(0,l.Z)(e,2),r=t[0],a=t[1];return(0,j.jsx)(pe.sN,{"data-event":(0,f.oJ)(x.SORT,"Option",a),"data-testid":b.sortItem,"data-value":r,onClick:function(){return n({sort:r})},children:a},r)}))]})]})]})},ye=t(92213),be=t(64159),Ce=(0,o.Z)({},be.$.Wide,(function(e){var n=e["data-event"],t=e.items;return(0,j.jsx)(a.Kq,{spacing:4,children:t.map((function(e){return(0,j.jsx)(be.L,{"data-event":n,pkg:e,variant:be.$.Wide},"".concat(e.name,"-").concat(e.version))}))})})),ke=(0,c.memo)((function(e){var n=e["data-event"],t=e.cardView,r=void 0===t?be.$.Wide:t,i=e.items;if(e.loading||!i)return(0,j.jsx)(a.M5,{children:(0,j.jsx)(ye.$,{size:"xl"})});var o=Ce[r];return(0,j.jsx)(o,{"data-event":n,items:i})}));ke.displayName="PackageList";var Se=t(41712),Te=t(45832),Ze=function(){var e=M(),n=R(k.Tx.OFFSET,(function(e){return S(null!==e&&void 0!==e?e:"")})),t=O(),r=E(),i=K(),o=F(),s=D(),l=A(),u=I(),d=(0,Te.D)({offset:n,limit:25,query:t,keywords:r,languages:i,cdkMajor:o,cdkType:s,sort:l,tags:u}),f=d.page,v=d.pageLimit,h=d.results;return(0,c.useEffect)((function(){h.length&&(n<0||n>v)&&e(n<0?{offset:0}:{offset:v})}),[h,n,v]),(0,c.useEffect)((function(){window.scrollTo(0,0)}),[f]),(0,j.jsx)(Se.T,{meta:{title:t||"Search",description:t?"".concat(h.length," results for ").concat(t," at Construct Hub"):"Search reusable components for your cloud application"},pageName:"search",children:(0,j.jsxs)(a.Kq,{direction:"column",maxW:"100vw",pb:4,px:4,spacing:4,children:[(0,j.jsx)(de,{}),(0,j.jsxs)(a.Kq,{align:{base:"start",lg:"center"},direction:{base:"column-reverse",lg:"row"},justify:{base:"initial",lg:"space-between"},spacing:4,children:[(0,j.jsx)(he,{count:h.length,filtered:!!t,limit:25,offset:n,query:t}),(0,j.jsx)(a.xu,{display:{base:"none",md:"initial"},children:(0,j.jsx)(je,{})}),(0,j.jsx)(a.xu,{display:{md:"none"},children:(0,j.jsx)(ge,{})})]}),(0,j.jsx)(ke,{"data-event":x.RESULTS,items:f}),(0,j.jsx)(a.xu,{w:"full",children:(0,j.jsx)(ce,{offset:n,pageLimit:v})})]})})},we=function(){return(0,j.jsx)(Se.T,{meta:{title:"Search - Construct Hub",description:"Search Construct Libraries for AWS CDK, CDK8s, and CDKTF"},pageName:"search",children:(0,j.jsxs)(a.rj,{"data-testid":b.page,gap:4,h:"full",maxW:"100%",px:{base:0,md:6},py:6,templateColumns:{base:"1fr",md:"auto 1fr"},templateRows:"1fr",children:[(0,j.jsx)(ie,{}),(0,j.jsx)(Ze,{})]})})}}}]);
|
|
2
|
-
//# sourceMappingURL=51.
|
|
1
|
+
"use strict";(self.webpackChunkconstruct_hub_webapp=self.webpackChunkconstruct_hub_webapp||[]).push([[51],{55051:function(e,n,t){t.r(n),t.d(n,{default:function(){return we}});var r,a=t(28735),i=t(93433),o=t(4942),s=t(1413),l=t(29439),c=t(72791),u=t(3445),d=t(16478),f=t(59534),v=(r={},(0,o.Z)(r,d.W.NameAsc,"A-Z"),(0,o.Z)(r,d.W.NameDesc,"Z-A"),(0,o.Z)(r,d.W.PublishDateAsc,"Oldest"),(0,o.Z)(r,d.W.PublishDateDesc,"Recently updated"),(0,o.Z)(r,d.W.DownloadsDesc,"Most downloads"),(0,o.Z)(r,d.W.DownloadsAsc,"Least downloads"),r),h=function(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];return f.oJ.apply(void 0,["Search"].concat(n))},x={FILTERS:h("Filters"),RESULTS:h("Results"),SEARCH:h("Search"),SORT:h("Sort")},m=t(75272),g=t(10855),p=t(74817),j=t(80184),y=function(e){var n=e.name,t=e.hint,r=(0,g.Sx)({base:"auto",md:"right"});return(0,j.jsxs)(a.kC,{align:"center",mb:1,children:[(0,j.jsx)(a.X6,{as:"h3",size:"sm",w:"max-content",children:n}),t?(0,j.jsxs)(p.J2,{colorScheme:"dark",placement:r,strategy:"fixed",children:[(0,j.jsx)(p.xo,{children:(0,j.jsx)(a.kC,{"aria-label":"Hint: ".concat(n),as:"button","data-event":(0,f.oJ)(x.FILTERS,n,"Popover"),ml:2,children:(0,j.jsx)(m.UO,{h:3.5,w:3.5})})}),(0,j.jsxs)(p.yk,{bg:"gray.700",borderRadius:"base",color:"white",fontSize:"sm",mx:{base:"1rem",md:"initial"},shadow:"whiteAlpha.300",children:[(0,j.jsx)(p.QH,{bg:"gray.700"}),(0,j.jsx)(p.b,{children:(0,j.jsx)(a.xv,{children:t})})]})]}):null]})},b=(0,t(88606).$)("searchRedesign",["page","searchDetails","nextPage","prevPage","goToPage","sortButton","sortDropdown","sortItem","filtersPanel","cdkTypeFilter","cdkVersionFilter","filterItem","languagesFilter"]),C=function(e){var n=e["data-testid"],t=e.value,r=e.onValueChange,i=e.options,o=e.name,s=e.hint;return(0,j.jsxs)(a.Kq,{"data-testid":n,spacing:1,children:[(0,j.jsx)(y,{hint:s,name:o}),(0,j.jsx)(u.Ee,{onChange:r,value:t,children:(0,j.jsx)(a.Kq,{spacing:1,children:i.map((function(e){var n=e.display,t=e.value,r=(0,f.oJ)(x.FILTERS,o,"Filter",n);return(0,j.jsx)(u.Y8,{"data-event":r,value:t,children:(0,j.jsx)(a.xv,{color:"textTertiary","data-event":r,"data-testid":b.filterItem,"data-value":t,isTruncated:!0,children:n})},t)}))})})]})},k=t(29499),S=function(e){var n=parseInt(e);return"NaN"==="".concat(n)?0:n},T=function(e){return e?decodeURIComponent(e).split(","):[]},Z=function(e){return"undefined"===typeof window?null:new URL(window.location.href).searchParams.get(e)},w=t(4487),R=function(e,n){var t=(0,w.K)().get(e);return(0,c.useMemo)((function(){return n?n(t):t}),[t])},D=function(){var e;return null!==(e=R(k.Tx.CDK_TYPE))&&void 0!==e?e:void 0},F=function(){return R(k.Tx.CDK_MAJOR,(function(e){return e?S(e):void 0}))},E=function(){return R(k.Tx.KEYWORDS,T)},K=function(){return R(k.Tx.LANGUAGES,T)},O=function(){var e;return null!==(e=R(k.Tx.SEARCH_QUERY))&&void 0!==e?e:""},A=function(){var e;return null!==(e=R(k.Tx.SORT))&&void 0!==e?e:void 0},I=function(){return R(k.Tx.TAGS,T)},P=t(45987),L=t(64880),W=t(19748),q=["offset"],M=function(){var e=(0,L.k6)().push;return(0,c.useCallback)((function(n){var t=null!==n&&void 0!==n?n:{},r=t.offset,a=(0,P.Z)(t,q);e((0,W.yc)((0,s.Z)((0,s.Z)((0,s.Z)({},function(){var e,n,t,r;return{query:null!==(e=Z(k.Tx.SEARCH_QUERY))&&void 0!==e?e:"",keywords:T(Z(k.Tx.KEYWORDS)),cdkType:null!==(n=Z(k.Tx.CDK_TYPE))&&void 0!==n?n:void 0,cdkMajor:function(){var e=Z(k.Tx.CDK_MAJOR);return e?S(e):void 0}(),languages:T(Z(k.Tx.LANGUAGES)),offset:S(null!==(t=Z(k.Tx.OFFSET))&&void 0!==t?t:""),sort:null!==(r=Z(k.Tx.SORT))&&void 0!==r?r:void 0,tags:T(Z(k.Tx.TAGS))}}()),a),{},{offset:null!==r&&void 0!==r?r:0})))}),[e])},J=t(30791),N=t(59707),V=function(){var e,n=D(),t=F(),r=M(),a=(0,N.A)(),u=(0,c.useMemo)((function(){var e=a.constructFrameworks,n=Object.entries(e).reduce((function(e,n){var t=(0,l.Z)(n,2),r=t[0],a=t[1];return a.pkgCount<1?e:(0,s.Z)((0,s.Z)({},e),{},(0,o.Z)({},r,(0,s.Z)({display:J.lQ[r],value:r},a)))}),{});return Object.keys(n).length?n:void 0}),[a]),d=(0,c.useMemo)((function(){var e;if(u&&n){var t=null===(e=u[n])||void 0===e?void 0:e.majorVersions;if(t)return(0,i.Z)(t).sort((function(e,n){return e-n})).map((function(e){return{value:e.toString(),display:"".concat(J.lQ[n]," v").concat(e)}}))}}),[u,n]);if(!u)return null;return(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(C,{"data-testid":b.cdkTypeFilter,hint:"Choose the right CDK for your IaC technology: AWS CDK for AWS CloudFormation, CDKTF for Terraform, or CDK8s for Kubernetes.",name:"CDK Type",onValueChange:function(e){r({cdkType:e?e:void 0,cdkMajor:void 0})},options:[{display:"Any CDK Type",value:""}].concat((0,i.Z)(Object.values(u))),value:null!==n&&void 0!==n?n:""}),!!(d&&d.length>1)&&(0,j.jsx)(C,{"data-testid":b.cdkVersionFilter,hint:"Choose the major version of the CDK you're using to see only constructs that will work with that version.",name:"CDK Major Version",onValueChange:function(e){var n=void 0;e&&(n=parseInt(e,10)),r({cdkMajor:n})},options:[{display:"Any Major Version",value:""}].concat((0,i.Z)(d)),value:null!==(e=null===t||void 0===t?void 0:t.toString())&&void 0!==e?e:""})]})},U=t(62732),z=t(81070),H=t(65223),_=t(77231),Y=t(82504),G=function(e){var n=e.display,t=e.value,r=e.isDisabled,i=e.disabledHint,o=e.isChecked,s=e.onChange;return(0,j.jsx)(U.XZ,{isChecked:o,isDisabled:r,onChange:s,children:(0,j.jsx)(z.u,{hasArrow:!0,isDisabled:!r&&!i,label:i,placement:"right",children:(0,j.jsx)(a.xv,{color:"textTertiary","data-testid":b.filterItem,"data-value":t,isTruncated:!0,children:n})})},t)},Q=function(e){var n=e["data-testid"],t=e.initialItemCount,r=e.hint,i=e.name,o=e.options,l=e.values,u=e.onValueChange,d=(0,H.qY)(),v=(0,f.z$)().trackCustomEvent,h=function(e){return function(){v((0,f.Q5)({name:(0,f.oJ)(x.FILTERS,i,"Filter",e.display)})),u(e.value)}},g=o,p=[];t&&(g=o.slice(0,t),p=o.slice(t,o.length));var b=p.length>0;return(0,j.jsxs)(a.kC,{"data-testid":n,direction:"column",children:[(0,j.jsx)(y,{hint:r,name:i}),(0,j.jsxs)(a.Kq,{mt:1,spacing:1,children:[g.map((function(e){return(0,c.createElement)(G,(0,s.Z)((0,s.Z)({},e),{},{isChecked:l.includes(e.value),key:e.value,onChange:h(e)}))})),b&&(0,j.jsx)(_.UO,{animateOpacity:!0,in:d.isOpen,unmountOnExit:!0,children:(0,j.jsx)(a.Kq,{spacing:1,children:p.map((function(e){return(0,c.createElement)(G,(0,s.Z)((0,s.Z)({},e),{},{isChecked:l.includes(e.value),key:e.value,onChange:h(e)}))}))})})]}),b&&(0,j.jsx)(a.kC,{align:"start",mt:1,children:(0,j.jsx)(Y.zx,{color:"textTertiary","data-event":(0,f.oJ)(x.FILTERS,i,"Show More"),fontWeight:"normal",leftIcon:d.isOpen?(0,j.jsx)(m.g8,{}):(0,j.jsx)(m.v4,{}),onClick:d.onToggle,size:"sm",textAlign:"left",variant:"link",w:"auto",children:d.isOpen?"Show fewer options (".concat(g.length,")"):"Show more options (".concat(p.length,")")})})]})},$=function(){var e=E(),n=(0,N.A)().keywords,t=M(),r=(0,c.useMemo)((function(){var t=(0,i.Z)(n.entries()).sort((function(e,n){return(0,l.Z)(e,2)[1]<(0,l.Z)(n,2)[1]?1:-1})).filter((function(n){var t=(0,l.Z)(n,1)[0];return!e.includes(t)})).map((function(e){var n=(0,l.Z)(e,1)[0];return{display:n,value:n}})).slice(0,25),r=e.filter((function(e){return!t.some((function(n){return n.value===e}))}));return[].concat((0,i.Z)(r.map((function(e){return{display:e,value:e}}))),(0,i.Z)(t))}),[n,e]);return(0,j.jsx)(Q,{"data-testid":b.languagesFilter,hint:"Focus the results by choosing one or more keywords reflecting the kind of construct you're looking for. Keywords are provided by construct authors.",initialItemCount:5,name:"Keywords",onValueChange:function(n){t({keywords:e.includes(n)?e.filter((function(e){return e!==n})):[].concat((0,i.Z)(e),[n])})},options:r,values:e})},B=t(86617),X=Object.entries(B.k8).map((function(e){var n=(0,l.Z)(e,2),t=n[0],r=n[1];return(0,s.Z)({display:r,value:t},B.dX.has(t)?{isDisabled:!1}:{isDisabled:!0,disabledHint:"".concat(B.k8[t]," support is coming soon!")})})).sort((function(e,n){return e.isDisabled>n.isDisabled?1:-1})),ee=function(){var e=K(),n=M();return(0,j.jsx)(Q,{"data-testid":b.languagesFilter,hint:"Choose one or more languages. Results include constructs for use with at least one of the selected languages.",name:"Programming Language",onValueChange:function(t){var r=t;n({languages:e.includes(r)?e.filter((function(e){return e!==r})):[].concat((0,i.Z)(e),[r])})},options:X,values:e})},ne=t(56804),te=function(){var e=(0,ne.E)("packageTags"),n=(0,ne.E)("packageTagGroups"),t=(0,c.useMemo)((function(){var t,r=new Map;return null===n||void 0===n||n.forEach((function(e){r.set(e.id,e)})),function(e,n){return e.reduce((function(e,t){var r,a,l,c=null===(r=t.searchFilter)||void 0===r?void 0:r.groupBy,u=c?n.get(c):void 0;if(c&&u){var d=e[c];return d?(d.tags=[].concat((0,i.Z)(d.tags),[t]),e):(0,s.Z)((0,s.Z)({},e),{},(0,o.Z)({},c,(0,s.Z)((0,s.Z)({},u),{},{tags:[t]})))}return c?(0,s.Z)((0,s.Z)({},e),{},(0,o.Z)({},c,{id:c,tags:[].concat((0,i.Z)(null!==(a=null===e||void 0===e||null===(l=e[c])||void 0===l?void 0:l.tags)&&void 0!==a?a:[]),[t])})):e}),{})}(null!==(t=null===e||void 0===e?void 0:e.filter((function(e){return Boolean(e.searchFilter)})))&&void 0!==t?t:[],r)}),[e,n]),r=I(),a=M(),l=function(e){a({tags:r.includes(e)?r.filter((function(n){return n!==e})):[].concat((0,i.Z)(r),[e])})},u=(0,c.useCallback)((function(e){var n,o,s=new Set((null!==(n=null===(o=t[e])||void 0===o?void 0:o.tags)&&void 0!==n?n:[]).map((function(e){return e.id})));return function(e){var n=r.filter((function(e){return!s.has(e)}));a({tags:e?[].concat((0,i.Z)(n),[e]):n})}}),[t,r,a]);return(0,j.jsx)(j.Fragment,{children:Object.values(t).map((function(e){var n,t,a=e.filterType,o=e.id,d=e.label,f=e.tooltip,v=e.tags,h={hint:f,name:null!==d&&void 0!==d?d:o,options:v.map((function(e){return{display:e.searchFilter.display,value:e.id}}))};return"radio"===a?(0,c.createElement)(C,(0,s.Z)((0,s.Z)({},h),{},{key:o,onValueChange:u(o),options:[{display:"Any ".concat(h.name),value:""}].concat((0,i.Z)(h.options)),value:null!==(n=null===(t=v.find((function(e){return r.includes(e.id)})))||void 0===t?void 0:t.id)&&void 0!==n?n:""})):(0,c.createElement)(Q,(0,s.Z)((0,s.Z)({},h),{},{key:o,onValueChange:l,values:r}))}))})},re=t(777),ae="5.75rem",ie=function(){return(0,j.jsx)(re.Z,{borderRadius:"sm","data-testid":b.filtersPanel,display:{base:"none",md:"flex"},maxH:"calc(100vh - ".concat(ae," - 1.25rem)"),maxW:"23rem",minW:"100%",overflow:"hidden auto",p:4,pos:"sticky",top:ae,zIndex:"docked",children:(0,j.jsxs)(a.Kq,{color:"textPrimary",h:"max-content",spacing:4,top:4,children:[(0,j.jsx)(a.X6,{as:"h2",size:"sm",children:"Filters"}),(0,j.jsx)(V,{}),(0,j.jsx)(ee,{}),(0,j.jsx)(te,{}),(0,j.jsx)($,{})]})})},oe=function(e){var n=e["data-event"],t=e["data-testid"],r=e.icon,a=e.label,i=e.onClick,o={"aria-label":a,borderRadius:"md",borderColor:"blue.500",colorScheme:"blue","data-event":n,"data-testid":t,icon:(0,j.jsx)(r,{color:"blue.500",h:5,w:5}),mx:2,h:10,w:10,variant:"outline"};return(0,j.jsx)(Y.hU,(0,s.Z)((0,s.Z)({},o),{},{disabled:!i,onClick:i}))},se=t(95798),le=function(e){var n=e["data-event"],t=e["data-testid"],r=e.pageLimit,i=e.offset,o=M(),s=(0,f.z$)().trackCustomEvent,u=(0,c.useState)((i+1).toString()),d=(0,l.Z)(u,2),v=d[0],h=d[1];(0,c.useEffect)((function(){h((i+1).toString())}),[i]);return(0,j.jsxs)(a.kC,{align:"center",as:"form",mx:2,onSubmit:function(e){e.preventDefault(),o({offset:parseInt(v)-1})},children:[(0,j.jsx)(se.II,{"aria-label":"Jump to page",colorScheme:"brand","data-testid":t,h:10,max:r+1,min:1,name:"page",onChange:function(e){e.preventDefault(),h(e.target.value)},onFocus:function(){n&&s((0,f.Q5)({name:n}))},p:0,textAlign:"center",type:"number",value:v,w:10}),(0,j.jsxs)(a.xv,{ml:2,w:"max-content",children:["of ",r+1]})]})},ce=function(e){var n=e.offset,t=e.pageLimit,r=M(),i=n<t?function(){return r({offset:n+1})}:void 0,o=n>0?function(){return r({offset:n-1})}:void 0;return(0,j.jsxs)(a.Kq,{align:"center",direction:"row",justify:"space-between",maxW:"18rem",mx:"auto",spacing:4,w:"full",children:[(0,j.jsx)(oe,{"data-event":(0,f.oJ)(x.RESULTS,"Previous Page"),"data-testid":b.prevPage,icon:m.wy,label:"Previous page button",onClick:o}),(0,j.jsx)(le,{"data-event":(0,f.oJ)(x.RESULTS,"Go to Page"),"data-testid":b.goToPage,offset:n,pageLimit:t}),(0,j.jsx)(oe,{"data-event":(0,f.oJ)(x.RESULTS,"Next Page"),"data-testid":b.nextPage,icon:m.XC,label:"Next page button",onClick:i})]})},ue=t(99185),de=function(){var e=O(),n=M(),t=(0,c.useState)(null!==e&&void 0!==e?e:""),r=(0,l.Z)(t,2),a=r[0],i=r[1];return(0,j.jsx)(ue.E1,{bg:"bgSecondary","data-event":x.SEARCH,onChange:function(e){return i(e.target.value)},onSubmit:function(e){e.preventDefault(),n({query:a,sort:void 0})},value:a})},fe=function(e){var n=e.children;return(0,j.jsx)(a.xv,{as:"strong",color:"textSecondary",children:n})},ve=function(e){var n=e.first,t=e.count,r=e.last;return!n&&r>=t?(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(fe,{children:t})," of ",(0,j.jsx)(fe,{children:t})]}):(0,j.jsxs)(j.Fragment,{children:[(0,j.jsxs)(fe,{children:[t?n+1:t," - ",r>t?t:r]})," ","of ",(0,j.jsx)(fe,{children:t})]})},he=function(e){var n=e.limit,t=e.offset,r=e.count,i=e.filtered,o=e.query,s=n*t,l=s+n,c=r>0;return(0,j.jsxs)(a.xv,{"data-testid":b.searchDetails,children:[c?(0,j.jsxs)(j.Fragment,{children:["Displaying ",(0,j.jsx)(ve,{count:r,first:s,last:l})," ",i?"search results":"constructs"]}):(0,j.jsx)(j.Fragment,{children:i?"There were no search results":"No constructs found"}),o&&(0,j.jsxs)(j.Fragment,{children:[" for ",(0,j.jsx)(fe,{children:o})]}),".",!c&&i&&(0,j.jsx)(j.Fragment,{children:" Try a different term."})]})},xe=t(15617),me=function(){var e=A(),n=M();return(0,j.jsx)(C,{hint:"Sets the order of search results",name:"Sorted By",onValueChange:function(e){n({sort:e||void 0})},options:[{display:"Relevance",value:""}].concat((0,i.Z)(Object.entries(v).map((function(e){var n=(0,l.Z)(e,2),t=n[0];return{display:n[1],value:t}})))),value:null!==e&&void 0!==e?e:""})},ge=function(){var e=(0,H.qY)();return(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(Y.zx,{colorScheme:"brand",display:{md:"none"},onClick:e.onOpen,rightIcon:(0,j.jsx)(m.v4,{}),variant:"link",children:"Sorting and Filters"}),(0,j.jsxs)(xe.dy,(0,s.Z)((0,s.Z)({},e),{},{placement:"bottom",children:[(0,j.jsx)(xe.P1,{}),(0,j.jsxs)(xe.sc,{color:"textPrimary",maxH:"full",children:[(0,j.jsx)(xe.OX,{borderBottom:"base",children:"Sorting and Filters"}),(0,j.jsx)(xe.cC,{}),(0,j.jsx)(xe.Ng,{children:(0,j.jsxs)(a.Kq,{color:"textPrimary",pb:4,spacing:4,children:[(0,j.jsx)(me,{}),(0,j.jsx)(V,{}),(0,j.jsx)(ee,{}),(0,j.jsx)(te,{}),(0,j.jsx)($,{})]})})]})]}))]})},pe=t(81641),je=function(){var e=A(),n=M(),t=e?v[e]:"Relevance";return(0,j.jsxs)(a.kC,{align:"center",children:[(0,j.jsx)(a.xv,{children:"Sorted by"}),(0,j.jsxs)(pe.v2,{children:[(0,j.jsx)(pe.j2,{as:Y.zx,color:"link","data-event":(0,f.oJ)(x.SORT,"Menu"),"data-testid":b.sortButton,ml:2,pl:2,pr:2,py:1,rightIcon:(0,j.jsx)(m.v4,{}),variant:"link",children:t}),(0,j.jsxs)(pe.qy,{"data-testid":b.sortDropdown,minW:"180",zIndex:"sticky",children:[(0,j.jsx)(pe.sN,{"data-event":(0,f.oJ)(x.SORT,"Option","Relevance"),"data-testid":b.sortItem,"data-value":"",onClick:function(){return n({sort:void 0})},children:"Relevance"},"Relevance"),Object.entries(v).map((function(e){var t=(0,l.Z)(e,2),r=t[0],a=t[1];return(0,j.jsx)(pe.sN,{"data-event":(0,f.oJ)(x.SORT,"Option",a),"data-testid":b.sortItem,"data-value":r,onClick:function(){return n({sort:r})},children:a},r)}))]})]})]})},ye=t(92213),be=t(64159),Ce=(0,o.Z)({},be.$.Wide,(function(e){var n=e["data-event"],t=e.items;return(0,j.jsx)(a.Kq,{spacing:4,children:t.map((function(e){return(0,j.jsx)(be.L,{"data-event":n,pkg:e,variant:be.$.Wide},"".concat(e.name,"-").concat(e.version))}))})})),ke=(0,c.memo)((function(e){var n=e["data-event"],t=e.cardView,r=void 0===t?be.$.Wide:t,i=e.items;if(e.loading||!i)return(0,j.jsx)(a.M5,{children:(0,j.jsx)(ye.$,{size:"xl"})});var o=Ce[r];return(0,j.jsx)(o,{"data-event":n,items:i})}));ke.displayName="PackageList";var Se=t(41712),Te=t(45832),Ze=function(){var e=M(),n=R(k.Tx.OFFSET,(function(e){return S(null!==e&&void 0!==e?e:"")})),t=O(),r=E(),i=K(),o=F(),s=D(),l=A(),u=I(),d=(0,Te.D)({offset:n,limit:25,query:t,keywords:r,languages:i,cdkMajor:o,cdkType:s,sort:l,tags:u}),f=d.page,v=d.pageLimit,h=d.results;return(0,c.useEffect)((function(){h.length&&(n<0||n>v)&&e(n<0?{offset:0}:{offset:v})}),[h,n,v]),(0,c.useEffect)((function(){window.scrollTo(0,0)}),[f]),(0,j.jsx)(Se.T,{meta:{title:t||"Search",description:t?"".concat(h.length," results for ").concat(t," at Construct Hub"):"Search reusable components for your cloud application"},pageName:"search",children:(0,j.jsxs)(a.Kq,{direction:"column",maxW:"100vw",pb:4,px:4,spacing:4,children:[(0,j.jsx)(de,{}),(0,j.jsxs)(a.Kq,{align:{base:"start",lg:"center"},direction:{base:"column-reverse",lg:"row"},justify:{base:"initial",lg:"space-between"},spacing:4,children:[(0,j.jsx)(he,{count:h.length,filtered:!!t,limit:25,offset:n,query:t}),(0,j.jsx)(a.xu,{display:{base:"none",md:"initial"},children:(0,j.jsx)(je,{})}),(0,j.jsx)(a.xu,{display:{md:"none"},children:(0,j.jsx)(ge,{})})]}),(0,j.jsx)(ke,{"data-event":x.RESULTS,items:f}),(0,j.jsx)(a.xu,{w:"full",children:(0,j.jsx)(ce,{offset:n,pageLimit:v})})]})})},we=function(){return(0,j.jsx)(Se.T,{meta:{title:"Search - Construct Hub",description:"Search Construct Libraries for AWS CDK, CDK8s, and CDKTF"},pageName:"search",children:(0,j.jsxs)(a.rj,{"data-testid":b.page,gap:4,h:"full",maxW:"100%",px:{base:0,md:6},py:6,templateColumns:{base:"1fr",md:"auto 1fr"},templateRows:"1fr",children:[(0,j.jsx)(ie,{}),(0,j.jsx)(Ze,{})]})})}}}]);
|
|
2
|
+
//# sourceMappingURL=51.17b41704.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static/js/51.56334876.chunk.js","mappings":"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","sources":["views/Search/constants.ts","views/Search/FilterHeading.tsx","views/Search/testIds.ts","views/Search/RadioFilter.tsx","views/Search/util.ts","views/Search/useSearchParam.ts","views/Search/useUpdateSearchParam.ts","views/Search/CDKFilter.tsx","views/Search/CheckboxFilter.tsx","views/Search/KeywordsFilter.tsx","views/Search/LanguageFilter.tsx","views/Search/TagFilter.tsx","views/Search/FilterPanel.tsx","views/Search/ArrowButton.tsx","views/Search/GoToPage.tsx","views/Search/PageControls.tsx","views/Search/SearchBar.tsx","views/Search/SearchDetails.tsx","views/Search/SortFilter.tsx","views/Search/SortAndFilterDrawer.tsx","views/Search/SortedBy.tsx","components/PackageList/PackageList.tsx","components/PackageList/WideCardList.tsx","views/Search/SearchResults.tsx","views/Search/Search.tsx"],"sourcesContent":["import { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport type { QueryParamKey } from \"../../constants/url\";\nimport { eventName } from \"../../contexts/Analytics\";\n\nconst LIMITS = [25, 50, 75, 100];\nexport const LIMIT = LIMITS[0];\n\nexport type SearchQueryParam = Extract<QueryParamKey, \"offset\" | \"q\">;\n\nexport const SORT_RENDER_MAP = {\n [CatalogSearchSort.NameAsc]: \"A-Z\",\n [CatalogSearchSort.NameDesc]: \"Z-A\",\n [CatalogSearchSort.PublishDateAsc]: \"Oldest\",\n [CatalogSearchSort.PublishDateDesc]: \"Recently updated\",\n [CatalogSearchSort.DownloadsDesc]: \"Most downloads\",\n [CatalogSearchSort.DownloadsAsc]: \"Least downloads\",\n};\n\nconst searchEvent: typeof eventName = (...e) => eventName(\"Search\", ...e);\n\nexport const SEARCH_ANALYTICS = {\n FILTERS: searchEvent(\"Filters\"),\n RESULTS: searchEvent(\"Results\"),\n SEARCH: searchEvent(\"Search\"),\n SORT: searchEvent(\"Sort\"),\n};\n","import { QuestionIcon } from \"@chakra-ui/icons\";\nimport {\n Flex,\n Heading,\n Text,\n Popover,\n PopoverTrigger,\n PopoverBody,\n PopoverArrow,\n PopoverContent,\n useBreakpointValue,\n PlacementWithLogical,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { eventName } from \"../../contexts/Analytics\";\n\nexport interface FilterHeadingProps {\n name: string;\n hint?: string;\n}\n\nexport const FilterHeading: FunctionComponent<FilterHeadingProps> = ({\n name,\n hint,\n}) => {\n const placement = useBreakpointValue<PlacementWithLogical>({\n base: \"auto\",\n md: \"right\",\n });\n\n return (\n <Flex align=\"center\" mb={1}>\n <Heading as=\"h3\" size=\"sm\" w=\"max-content\">\n {name}\n </Heading>\n {hint ? (\n <Popover colorScheme=\"dark\" placement={placement} strategy=\"fixed\">\n <PopoverTrigger>\n <Flex\n aria-label={`Hint: ${name}`}\n as=\"button\"\n data-event={eventName(SEARCH_ANALYTICS.FILTERS, name, \"Popover\")}\n ml={2}\n >\n <QuestionIcon h={3.5} w={3.5} />\n </Flex>\n </PopoverTrigger>\n <PopoverContent\n bg=\"gray.700\"\n borderRadius=\"base\"\n color=\"white\"\n fontSize=\"sm\"\n mx={{ base: \"1rem\", md: \"initial\" }}\n shadow=\"whiteAlpha.300\"\n >\n <PopoverArrow bg=\"gray.700\" />\n <PopoverBody>\n <Text>{hint}</Text>\n </PopoverBody>\n </PopoverContent>\n </Popover>\n ) : null}\n </Flex>\n );\n};\n","import { createTestIds } from \"../../util/createTestIds\";\n\nexport default createTestIds(\"searchRedesign\", [\n \"page\",\n // Results\n \"searchDetails\",\n \"nextPage\",\n \"prevPage\",\n \"goToPage\",\n // Sorting\n \"sortButton\",\n \"sortDropdown\",\n \"sortItem\",\n // Filters Panel\n \"filtersPanel\",\n \"cdkTypeFilter\",\n \"cdkVersionFilter\",\n \"filterItem\",\n \"languagesFilter\",\n] as const);\n","import { Radio, RadioGroup, Stack, Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { FilterHeading, FilterHeadingProps } from \"./FilterHeading\";\nimport testIds from \"./testIds\";\nimport { eventName } from \"../../contexts/Analytics\";\n\nexport interface RadioFilterProps extends FilterHeadingProps {\n \"data-testid\"?: string;\n value?: string;\n onValueChange: (value: string) => void;\n options: {\n display: string;\n value: string;\n }[];\n}\n\nexport const RadioFilter: FunctionComponent<RadioFilterProps> = ({\n \"data-testid\": dataTestid,\n value: checkedValue,\n onValueChange,\n options,\n name,\n hint,\n}) => {\n return (\n <Stack data-testid={dataTestid} spacing={1}>\n <FilterHeading hint={hint} name={name} />\n <RadioGroup onChange={onValueChange} value={checkedValue}>\n <Stack spacing={1}>\n {options.map(({ display, value }) => {\n const dataEvent = eventName(\n SEARCH_ANALYTICS.FILTERS,\n name,\n \"Filter\",\n display\n );\n return (\n <Radio data-event={dataEvent} key={value} value={value}>\n <Text\n color=\"textTertiary\"\n data-event={dataEvent}\n data-testid={testIds.filterItem}\n data-value={value}\n isTruncated\n >\n {display}\n </Text>\n </Radio>\n );\n })}\n </Stack>\n </RadioGroup>\n </Stack>\n );\n};\n","import { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { CDKType } from \"../../constants/constructs\";\nimport { Language } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\n\nexport const toNum = (val: string) => {\n const result = parseInt(val);\n\n if (`${result}` === \"NaN\") {\n return 0;\n }\n\n return result;\n};\n\nexport const parseQueryArray = <T extends string>(\n queryString: string | null\n) => {\n if (!queryString) return [];\n\n return decodeURIComponent(queryString).split(\",\") as T[];\n};\n\nconst getParamFromUrl = (key: string) => {\n if (typeof window === \"undefined\") return null;\n const queryParams = new URL(window.location.href).searchParams;\n return queryParams.get(key);\n};\n\nexport const getSearchUrlParams = () => {\n return {\n query: getParamFromUrl(QUERY_PARAMS.SEARCH_QUERY) ?? \"\",\n keywords: parseQueryArray(getParamFromUrl(QUERY_PARAMS.KEYWORDS)),\n cdkType: (getParamFromUrl(QUERY_PARAMS.CDK_TYPE) as CDKType) ?? undefined,\n cdkMajor: (() => {\n const cdkMajorParam = getParamFromUrl(QUERY_PARAMS.CDK_MAJOR);\n return cdkMajorParam ? toNum(cdkMajorParam) : undefined;\n })(),\n languages: parseQueryArray(\n getParamFromUrl(QUERY_PARAMS.LANGUAGES)\n ) as Language[],\n offset: toNum(getParamFromUrl(QUERY_PARAMS.OFFSET) ?? \"\"),\n sort:\n (getParamFromUrl(QUERY_PARAMS.SORT) as CatalogSearchSort) ?? undefined,\n tags: parseQueryArray(getParamFromUrl(QUERY_PARAMS.TAGS)),\n };\n};\n","import { useMemo } from \"react\";\nimport { parseQueryArray, toNum } from \"./util\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { CDKType } from \"../../constants/constructs\";\nimport { Language } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\n\nconst useSearchParam = <T = string | null>(\n key: string,\n transform?: (param: string | null) => T\n): T => {\n const queryParams = useQueryParams();\n const qp = queryParams.get(key);\n\n return useMemo(\n () => (transform ? transform(qp) : (qp as unknown as T)),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [qp]\n );\n};\n\nexport const useCdkType = () => {\n const cdkType: CDKType | undefined =\n useSearchParam(QUERY_PARAMS.CDK_TYPE) ?? undefined;\n\n return cdkType;\n};\n\nexport const useCdkMajor = () => {\n const cdkMajor: number | undefined = useSearchParam(\n QUERY_PARAMS.CDK_MAJOR,\n (p) => (p ? toNum(p) : undefined)\n );\n\n return cdkMajor;\n};\n\nexport const useKeywords = () => {\n const keywords: string[] = useSearchParam(\n QUERY_PARAMS.KEYWORDS,\n parseQueryArray\n );\n\n return keywords;\n};\n\nexport const useLanguages = () => {\n const languages: Language[] = useSearchParam(\n QUERY_PARAMS.LANGUAGES,\n parseQueryArray\n ) as Language[];\n\n return languages;\n};\n\nexport const useOffset = () => {\n const offset = useSearchParam(QUERY_PARAMS.OFFSET, (o) => toNum(o ?? \"\"));\n return offset;\n};\n\nexport const useSearchQuery = () => {\n const query: string = useSearchParam(QUERY_PARAMS.SEARCH_QUERY) ?? \"\";\n return query;\n};\n\nexport const useSort = () => {\n const sort: CatalogSearchSort | undefined =\n useSearchParam(QUERY_PARAMS.SORT) ?? undefined;\n return sort;\n};\n\nexport const useTags = () => {\n const tags: string[] = useSearchParam(QUERY_PARAMS.TAGS, parseQueryArray);\n return tags;\n};\n","import { useCallback } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { getSearchUrlParams } from \"./util\";\nimport { getSearchPath } from \"../../util/url\";\n\nexport const useUpdateSearchParam = () => {\n const { push } = useHistory();\n\n return useCallback(\n (p?: Partial<Parameters<typeof getSearchPath>[0]>) => {\n const { offset, ...params } = p ?? {};\n\n push(\n getSearchPath({\n ...getSearchUrlParams(),\n ...params,\n offset: offset ?? 0,\n })\n );\n },\n [push]\n );\n};\n","import { FunctionComponent, useMemo } from \"react\";\nimport { RadioFilter } from \"./RadioFilter\";\nimport testIds from \"./testIds\";\nimport { useCdkMajor, useCdkType } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { CatalogConstructFrameworkMeta } from \"../../api/catalog-search\";\nimport { CDKType, CDKTYPE_NAME_MAP } from \"../../constants/constructs\";\nimport { useSearchContext } from \"../../contexts/Search\";\n\ntype CDKOptions = Partial<{\n [key in CDKType]: CatalogConstructFrameworkMeta & {\n display: string;\n value: key;\n };\n}>;\n\nexport const CDKFilter: FunctionComponent = () => {\n const cdkType = useCdkType();\n const cdkMajor = useCdkMajor();\n\n const updateSearch = useUpdateSearchParam();\n\n const searchAPI = useSearchContext()!;\n\n // Options with less than one package will be omitted\n const cdkOptions = useMemo(() => {\n const cdkTypes = searchAPI.constructFrameworks;\n const options = Object.entries(cdkTypes).reduce((opts, [name, meta]) => {\n if (meta.pkgCount < 1) {\n return opts;\n }\n\n return {\n ...opts,\n [name]: {\n display: CDKTYPE_NAME_MAP[name as CDKType],\n value: name,\n ...meta,\n },\n };\n }, {});\n\n return Object.keys(options).length ? (options as CDKOptions) : undefined;\n }, [searchAPI]);\n\n const majorsOptions = useMemo(() => {\n if (!cdkOptions || !cdkType) return undefined;\n const majorVersions = cdkOptions[cdkType]?.majorVersions;\n\n if (!majorVersions) return undefined;\n\n return [...majorVersions]\n .sort((a, b) => a - b)\n .map((value) => ({\n value: value.toString(),\n display: `${CDKTYPE_NAME_MAP[cdkType]} v${value}`,\n }));\n }, [cdkOptions, cdkType]);\n\n if (!cdkOptions) {\n return null;\n }\n\n const onCdkTypeChange = (type: string) => {\n const cdk = type as CDKType;\n updateSearch({ cdkType: type ? cdk : undefined, cdkMajor: undefined });\n };\n\n const onCdkMajorChange = (major: string) => {\n let majorNum: number | undefined = undefined;\n\n if (major) {\n majorNum = parseInt(major, 10);\n }\n\n updateSearch({ cdkMajor: majorNum });\n };\n\n return (\n <>\n <RadioFilter\n data-testid={testIds.cdkTypeFilter}\n hint=\"Choose the right CDK for your IaC technology: AWS CDK for AWS CloudFormation, CDKTF for Terraform, or CDK8s for Kubernetes.\"\n name=\"CDK Type\"\n onValueChange={onCdkTypeChange}\n options={[\n { display: \"Any CDK Type\", value: \"\" },\n ...Object.values(cdkOptions),\n ]}\n value={cdkType ?? \"\"}\n />\n {/* No point in showing major versions if only a single one is available */}\n {!!(majorsOptions && majorsOptions.length > 1) && (\n <RadioFilter\n data-testid={testIds.cdkVersionFilter}\n hint=\"Choose the major version of the CDK you're using to see only constructs that will work with that version.\"\n name=\"CDK Major Version\"\n onValueChange={onCdkMajorChange}\n options={[\n { display: \"Any Major Version\", value: \"\" },\n ...majorsOptions,\n ]}\n value={cdkMajor?.toString() ?? \"\"}\n />\n )}\n </>\n );\n};\n","import { ChevronDownIcon, ChevronUpIcon } from \"@chakra-ui/icons\";\nimport {\n Flex,\n Button,\n Collapse,\n Checkbox,\n Stack,\n Text,\n Tooltip,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { FilterHeading, FilterHeadingProps } from \"./FilterHeading\";\nimport testIds from \"./testIds\";\nimport { clickEvent, eventName, useAnalytics } from \"../../contexts/Analytics\";\n\ninterface CheckboxOption {\n display: string;\n value: string;\n isDisabled?: boolean;\n disabledHint?: string;\n}\n\ninterface CheckboxItemProps extends CheckboxOption {\n onChange: () => void;\n isChecked: boolean;\n}\n\nexport interface CheckboxFilterProps extends FilterHeadingProps {\n /**\n * Test ID to select checkbox in tests\n */\n \"data-testid\"?: string;\n /**\n * Number of items that can be initially shown\n */\n initialItemCount?: number;\n /**\n * Defines checkbox items\n */\n options: CheckboxOption[];\n /**\n * Selected values\n */\n values: string[];\n /**\n * Callback triggered when an item is clicked\n */\n onValueChange: (value: string) => void;\n}\n\nconst CheckboxItem: FunctionComponent<CheckboxItemProps> = ({\n display,\n value,\n isDisabled,\n disabledHint,\n isChecked,\n onChange,\n}) => (\n <Checkbox\n isChecked={isChecked}\n isDisabled={isDisabled}\n key={value}\n onChange={onChange}\n >\n <Tooltip\n hasArrow\n isDisabled={!isDisabled && !disabledHint}\n label={disabledHint}\n placement=\"right\"\n >\n <Text\n color=\"textTertiary\"\n data-testid={testIds.filterItem}\n data-value={value}\n isTruncated\n >\n {display}\n </Text>\n </Tooltip>\n </Checkbox>\n);\n\nexport const CheckboxFilter: FunctionComponent<CheckboxFilterProps> = ({\n \"data-testid\": dataTestid,\n initialItemCount,\n hint,\n name,\n options,\n values: checkedValues,\n onValueChange,\n}) => {\n const collapse = useDisclosure();\n const { trackCustomEvent } = useAnalytics();\n\n const getOnChange = (item: CheckboxOption) => () => {\n trackCustomEvent(\n clickEvent({\n name: eventName(SEARCH_ANALYTICS.FILTERS, name, \"Filter\", item.display),\n })\n );\n onValueChange(item.value);\n };\n\n let alwaysShow: typeof options = options;\n let showWhenExpanded: typeof options = [];\n\n if (initialItemCount) {\n alwaysShow = options.slice(0, initialItemCount);\n showWhenExpanded = options.slice(initialItemCount, options.length);\n }\n\n const isExpandible = showWhenExpanded.length > 0;\n\n return (\n <Flex data-testid={dataTestid} direction=\"column\">\n <FilterHeading hint={hint} name={name} />\n <Stack mt={1} spacing={1}>\n {alwaysShow.map((item) => (\n <CheckboxItem\n {...item}\n isChecked={checkedValues.includes(item.value)}\n key={item.value}\n onChange={getOnChange(item)}\n />\n ))}\n {isExpandible && (\n <Collapse animateOpacity in={collapse.isOpen} unmountOnExit>\n <Stack spacing={1}>\n {showWhenExpanded.map((item) => (\n <CheckboxItem\n {...item}\n isChecked={checkedValues.includes(item.value)}\n key={item.value}\n onChange={getOnChange(item)}\n />\n ))}\n </Stack>\n </Collapse>\n )}\n </Stack>\n {isExpandible && (\n <Flex align=\"start\" mt={1}>\n <Button\n color=\"textTertiary\"\n data-event={eventName(SEARCH_ANALYTICS.FILTERS, name, \"Show More\")}\n fontWeight=\"normal\"\n leftIcon={collapse.isOpen ? <ChevronUpIcon /> : <ChevronDownIcon />}\n onClick={collapse.onToggle}\n size=\"sm\"\n textAlign=\"left\"\n variant=\"link\"\n w=\"auto\"\n >\n {collapse.isOpen\n ? `Show fewer options (${alwaysShow.length})`\n : `Show more options (${showWhenExpanded.length})`}\n </Button>\n </Flex>\n )}\n </Flex>\n );\n};\n","import { FunctionComponent, useMemo } from \"react\";\nimport { CheckboxFilter } from \"./CheckboxFilter\";\nimport testIds from \"./testIds\";\nimport { useKeywords } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { useSearchContext } from \"../../contexts/Search\";\n\nexport const KeywordsFilter: FunctionComponent = () => {\n const keywords = useKeywords();\n const keywordMap = useSearchContext()!.keywords;\n const updateSearch = useUpdateSearchParam();\n\n const onKeywordChange = (keyword: string) => {\n updateSearch({\n keywords: keywords.includes(keyword)\n ? keywords.filter((k) => k !== keyword)\n : [...keywords, keyword],\n });\n };\n\n const keywordOptions = useMemo(() => {\n const baseOptions = [...keywordMap.entries()]\n .sort(([, count1], [, count2]) => {\n return count1 < count2 ? 1 : -1;\n })\n .filter(([keyword]) => !keywords.includes(keyword))\n .map(([keyword]) => ({\n display: keyword,\n value: keyword,\n }))\n .slice(0, 25);\n\n const keywordsNotInOptions = keywords.filter(\n (k) => !baseOptions.some((opt) => opt.value === k)\n );\n\n return [\n ...keywordsNotInOptions.map((k) => ({ display: k, value: k })),\n ...baseOptions,\n ];\n }, [keywordMap, keywords]);\n\n return (\n <CheckboxFilter\n data-testid={testIds.languagesFilter}\n hint=\"Focus the results by choosing one or more keywords reflecting the kind of construct you're looking for. Keywords are provided by construct authors.\"\n initialItemCount={5}\n name=\"Keywords\"\n onValueChange={onKeywordChange}\n options={keywordOptions}\n values={keywords}\n />\n );\n};\n","import { FunctionComponent } from \"react\";\nimport { CheckboxFilter } from \"./CheckboxFilter\";\nimport testIds from \"./testIds\";\nimport { useLanguages } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport {\n Language,\n LANGUAGE_NAME_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\n\nconst languageOptions = Object.entries(LANGUAGE_NAME_MAP)\n .map(([key, value]) => ({\n display: value,\n value: key,\n ...(TEMP_SUPPORTED_LANGUAGES.has(key as Language)\n ? { isDisabled: false }\n : {\n isDisabled: true,\n disabledHint: `${\n LANGUAGE_NAME_MAP[key as Language]\n } support is coming soon!`,\n }),\n }))\n .sort((l1, l2) => {\n // Push disabled languages to back of list\n return l1.isDisabled > l2.isDisabled ? 1 : -1;\n });\n\nexport const LanguageFilter: FunctionComponent = () => {\n const languages = useLanguages();\n\n const updateSearch = useUpdateSearchParam();\n\n const onLanguagesChange = (lang: string) => {\n const language = lang as Language;\n\n updateSearch({\n languages: languages.includes(language)\n ? languages.filter((l) => l !== language)\n : [...languages, language],\n });\n };\n\n return (\n <CheckboxFilter\n data-testid={testIds.languagesFilter}\n hint=\"Choose one or more languages. Results include constructs for use with at least one of the selected languages.\"\n name=\"Programming Language\"\n onValueChange={onLanguagesChange}\n options={languageOptions}\n values={languages}\n />\n );\n};\n","import { FunctionComponent, useCallback, useMemo } from \"react\";\nimport { CheckboxFilter } from \"./CheckboxFilter\";\nimport { RadioFilter } from \"./RadioFilter\";\nimport { useTags } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { PackageTagConfig, TagGroupConfig } from \"../../api/config\";\nimport { useConfigValue } from \"../../hooks/useConfigValue\";\n\ninterface FilterGroup extends Partial<TagGroupConfig> {\n id: string;\n tags: PackageTagConfig[];\n}\ninterface FilterGroups {\n [group: string]: FilterGroup;\n}\n\n/**\n * Creates a plain object map of FilterGroups keyed by group id\n */\nexport const mapTagsToFilterGroups = (\n packageTags: PackageTagConfig[],\n tagGroupsMap: Map<string, TagGroupConfig>\n): FilterGroups => {\n return packageTags.reduce(\n (accum: FilterGroups, tag: PackageTagConfig): FilterGroups => {\n const groupIdOrName = tag.searchFilter?.groupBy;\n const customGroup = groupIdOrName\n ? tagGroupsMap.get(groupIdOrName)\n : undefined;\n\n if (groupIdOrName && customGroup) {\n const entry = accum[groupIdOrName];\n if (entry) {\n entry.tags = [...entry.tags, tag];\n return accum;\n }\n\n return {\n ...accum,\n [groupIdOrName]: {\n ...customGroup,\n tags: [tag],\n },\n };\n }\n\n if (groupIdOrName) {\n return {\n ...accum,\n [groupIdOrName]: {\n id: groupIdOrName,\n tags: [...(accum?.[groupIdOrName]?.tags ?? []), tag],\n },\n };\n }\n return accum;\n },\n {}\n );\n};\n\nexport const TagFilter: FunctionComponent = () => {\n const packageTags = useConfigValue(\"packageTags\");\n const packageTagGroups = useConfigValue(\"packageTagGroups\");\n\n const tagFilterGroups: FilterGroups = useMemo(() => {\n const tagGroupsMap = new Map<string, TagGroupConfig>();\n packageTagGroups?.forEach((group) => {\n tagGroupsMap.set(group.id, group);\n });\n\n const filterableTags =\n packageTags?.filter((tag) => Boolean(tag.searchFilter)) ?? [];\n\n return mapTagsToFilterGroups(filterableTags, tagGroupsMap);\n }, [packageTags, packageTagGroups]);\n\n const tags = useTags();\n const updateSearch = useUpdateSearchParam();\n\n const onTagsChange = (tag: string) => {\n updateSearch({\n tags: tags.includes(tag) ? tags.filter((t) => t !== tag) : [...tags, tag],\n });\n };\n\n const getOnRadioTagChange = useCallback(\n (groupName: string) => {\n const groupTags = new Set(\n (tagFilterGroups[groupName]?.tags ?? []).map(({ id }) => id)\n );\n\n return (tag: string) => {\n const filteredTags = tags.filter((t) => !groupTags.has(t));\n\n updateSearch({\n tags: tag ? [...filteredTags, tag] : filteredTags,\n });\n };\n },\n [tagFilterGroups, tags, updateSearch]\n );\n\n return (\n <>\n {Object.values(tagFilterGroups).map(\n ({ filterType, id, label, tooltip, tags: tagItems }) => {\n const sharedProps = {\n hint: tooltip,\n name: label ?? id,\n options: tagItems.map((tag) => {\n return {\n display: tag.searchFilter!.display,\n value: tag.id,\n };\n }),\n };\n\n if (filterType === \"radio\") {\n return (\n <RadioFilter\n {...sharedProps}\n key={id}\n onValueChange={getOnRadioTagChange(id)}\n options={[\n { display: `Any ${sharedProps.name}`, value: \"\" },\n ...sharedProps.options,\n ]}\n value={tagItems.find((t) => tags.includes(t.id))?.id ?? \"\"}\n />\n );\n }\n\n return (\n <CheckboxFilter\n {...sharedProps}\n key={id}\n onValueChange={onTagsChange}\n values={tags}\n />\n );\n }\n )}\n </>\n );\n};\n","import { Heading, Stack } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { CDKFilter } from \"./CDKFilter\";\nimport { KeywordsFilter } from \"./KeywordsFilter\";\nimport { LanguageFilter } from \"./LanguageFilter\";\nimport { TagFilter } from \"./TagFilter\";\nimport testIds from \"./testIds\";\nimport { Card } from \"../../components/Card\";\n\nexport interface FilterPanelProps {}\n\n// Header height + section padding\nconst TOP_OFFSET = \"5.75rem\";\n\n/**\n * The desktop Resolution Filter Panel\n */\nexport const FilterPanel: FunctionComponent<FilterPanelProps> = () => {\n return (\n <Card\n borderRadius=\"sm\"\n data-testid={testIds.filtersPanel}\n display={{ base: \"none\", md: \"flex\" }}\n maxH={`calc(100vh - ${TOP_OFFSET} - 1.25rem)`}\n maxW=\"23rem\"\n minW=\"100%\"\n overflow=\"hidden auto\"\n p={4}\n pos=\"sticky\"\n top={TOP_OFFSET}\n zIndex=\"docked\"\n >\n <Stack color=\"textPrimary\" h=\"max-content\" spacing={4} top={4}>\n <Heading as=\"h2\" size=\"sm\">\n Filters\n </Heading>\n\n <CDKFilter />\n\n <LanguageFilter />\n\n <TagFilter />\n\n <KeywordsFilter />\n </Stack>\n </Card>\n );\n};\n","import { IconButton, IconProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport interface ArrowButtonProps {\n \"data-event\"?: string;\n \"data-testid\"?: string;\n icon: FunctionComponent<IconProps>;\n label: string;\n onClick?: () => void;\n}\n\nexport const ArrowButton: FunctionComponent<ArrowButtonProps> = ({\n \"data-event\": dataEvent,\n \"data-testid\": dataTestid,\n icon: Icon,\n label,\n onClick,\n}) => {\n const props = {\n \"aria-label\": label,\n borderRadius: \"md\",\n borderColor: \"blue.500\",\n colorScheme: \"blue\",\n \"data-event\": dataEvent,\n \"data-testid\": dataTestid,\n icon: <Icon color=\"blue.500\" h={5} w={5} />,\n mx: 2,\n h: 10,\n w: 10,\n variant: \"outline\",\n };\n\n return <IconButton {...props} disabled={!onClick} onClick={onClick} />;\n};\n","import { Flex, Input, Text } from \"@chakra-ui/react\";\nimport {\n FormEventHandler,\n FunctionComponent,\n SyntheticEvent,\n useEffect,\n useState,\n} from \"react\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { clickEvent, useAnalytics } from \"../../contexts/Analytics\";\n\nexport interface GoToPageProps {\n \"data-event\"?: string;\n \"data-testid\"?: string;\n pageLimit: number;\n offset: number;\n}\n\nexport const GoToPage: FunctionComponent<GoToPageProps> = ({\n \"data-event\": dataEvent,\n \"data-testid\": dataTestid,\n pageLimit,\n offset,\n}) => {\n const updateSearch = useUpdateSearchParam();\n const { trackCustomEvent } = useAnalytics();\n const [inputValue, setInputValue] = useState((offset + 1).toString());\n\n useEffect(() => {\n setInputValue((offset + 1).toString());\n }, [offset]);\n\n const onInputChange = (e: SyntheticEvent<HTMLInputElement>) => {\n e.preventDefault();\n setInputValue((e.target as HTMLInputElement).value);\n };\n\n const onSubmit: FormEventHandler<HTMLInputElement> = (e) => {\n e.preventDefault();\n updateSearch({ offset: parseInt(inputValue) - 1 });\n };\n\n return (\n <Flex align=\"center\" as=\"form\" mx={2} onSubmit={onSubmit}>\n <Input\n aria-label=\"Jump to page\"\n colorScheme=\"brand\"\n data-testid={dataTestid}\n h={10}\n max={pageLimit + 1}\n min={1}\n name=\"page\"\n onChange={onInputChange}\n onFocus={() => {\n if (dataEvent) {\n trackCustomEvent(clickEvent({ name: dataEvent }));\n }\n }}\n p={0}\n textAlign=\"center\"\n type=\"number\"\n value={inputValue}\n w={10}\n />\n <Text ml={2} w=\"max-content\">\n of {pageLimit + 1}\n </Text>\n </Flex>\n );\n};\n","import { ChevronLeftIcon, ChevronRightIcon } from \"@chakra-ui/icons\";\nimport { Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { ArrowButton } from \"./ArrowButton\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { GoToPage } from \"./GoToPage\";\nimport testIds from \"./testIds\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { eventName } from \"../../contexts/Analytics\";\n\nexport interface PageControlsProps {\n offset: number;\n pageLimit: number;\n}\n\nexport const PageControls: FunctionComponent<PageControlsProps> = ({\n offset,\n pageLimit,\n}) => {\n const updateSearch = useUpdateSearchParam();\n const goForward =\n offset < pageLimit ? () => updateSearch({ offset: offset + 1 }) : undefined;\n const goBack =\n offset > 0 ? () => updateSearch({ offset: offset - 1 }) : undefined;\n\n return (\n <Stack\n align=\"center\"\n direction=\"row\"\n justify=\"space-between\"\n maxW=\"18rem\"\n mx=\"auto\"\n spacing={4}\n w=\"full\"\n >\n <ArrowButton\n data-event={eventName(SEARCH_ANALYTICS.RESULTS, \"Previous Page\")}\n data-testid={testIds.prevPage}\n icon={ChevronLeftIcon}\n label=\"Previous page button\"\n onClick={goBack}\n />\n <GoToPage\n data-event={eventName(SEARCH_ANALYTICS.RESULTS, \"Go to Page\")}\n data-testid={testIds.goToPage}\n offset={offset}\n pageLimit={pageLimit}\n />\n <ArrowButton\n data-event={eventName(SEARCH_ANALYTICS.RESULTS, \"Next Page\")}\n data-testid={testIds.nextPage}\n icon={ChevronRightIcon}\n label=\"Next page button\"\n onClick={goForward}\n />\n </Stack>\n );\n};\n","import { FunctionComponent, useState } from \"react\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { useSearchQuery } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { SearchBar as SearchBarComponent } from \"../../components/SearchBar\";\n\nexport const SearchBar: FunctionComponent = () => {\n const query = useSearchQuery();\n const updateSearch = useUpdateSearchParam();\n\n const [value, setValue] = useState(query ?? \"\");\n\n return (\n <SearchBarComponent\n bg=\"bgSecondary\"\n data-event={SEARCH_ANALYTICS.SEARCH}\n onChange={(e) => setValue(e.target.value)}\n onSubmit={(e) => {\n e.preventDefault();\n\n updateSearch({\n query: value,\n sort: undefined,\n });\n }}\n value={value}\n />\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport testIds from \"./testIds\";\n\nexport interface SearchDetailsProps {\n limit: number;\n offset: number;\n count: number;\n filtered: boolean;\n query?: string;\n}\n\nconst Em: FunctionComponent = ({ children }) => (\n <Text as=\"strong\" color=\"textSecondary\">\n {children}\n </Text>\n);\n\nconst Count: FunctionComponent<{\n first: number;\n count: number;\n last: number;\n}> = ({ first, count, last }) => {\n if (!first && last >= count) {\n return (\n <>\n <Em>{count}</Em> of <Em>{count}</Em>\n </>\n );\n }\n\n return (\n <>\n <Em>\n {count ? first + 1 : count} - {last > count ? count : last}\n </Em>{\" \"}\n of <Em>{count}</Em>\n </>\n );\n};\n\nexport const SearchDetails: FunctionComponent<SearchDetailsProps> = ({\n limit,\n offset,\n count,\n filtered,\n query,\n}) => {\n const first = limit * offset;\n const last = first + limit;\n const hasResults = count > 0;\n\n return (\n <Text data-testid={testIds.searchDetails}>\n {hasResults ? (\n <>\n Displaying <Count count={count} first={first} last={last} />{\" \"}\n {filtered ? \"search results\" : \"constructs\"}\n </>\n ) : (\n <>{filtered ? \"There were no search results\" : \"No constructs found\"}</>\n )}\n {query && (\n <>\n {\" for \"}\n <Em>{query}</Em>\n </>\n )}\n .{!hasResults && filtered && <> Try a different term.</>}\n </Text>\n );\n};\n","import { FunctionComponent } from \"react\";\nimport { SORT_RENDER_MAP } from \"./constants\";\nimport { RadioFilter } from \"./RadioFilter\";\nimport { useSort } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\n\nexport const SortFilter: FunctionComponent = () => {\n const sort = useSort();\n const updateSearch = useUpdateSearchParam();\n\n const onSortChange = (newSort: string) => {\n updateSearch({\n sort: newSort ? (newSort as CatalogSearchSort) : undefined,\n });\n };\n\n return (\n <RadioFilter\n hint=\"Sets the order of search results\"\n name=\"Sorted By\"\n onValueChange={onSortChange}\n options={[\n { display: \"Relevance\", value: \"\" },\n ...Object.entries(SORT_RENDER_MAP).map(([value, display]) => ({\n display,\n value,\n })),\n ]}\n value={sort ?? \"\"}\n />\n );\n};\n","import { ChevronDownIcon } from \"@chakra-ui/icons\";\nimport {\n Button,\n Drawer,\n Stack,\n DrawerBody,\n DrawerHeader,\n DrawerOverlay,\n DrawerContent,\n DrawerCloseButton,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { CDKFilter } from \"./CDKFilter\";\nimport { KeywordsFilter } from \"./KeywordsFilter\";\nimport { LanguageFilter } from \"./LanguageFilter\";\nimport { SortFilter } from \"./SortFilter\";\nimport { TagFilter } from \"./TagFilter\";\n\n/**\n * The mobile filter Drawer (Bottomsheet in iOS terminology)\n */\nexport const SortAndFilterDrawer: FunctionComponent = () => {\n const drawer = useDisclosure();\n return (\n <>\n <Button\n colorScheme=\"brand\"\n display={{ md: \"none\" }}\n onClick={drawer.onOpen}\n rightIcon={<ChevronDownIcon />}\n variant=\"link\"\n >\n Sorting and Filters\n </Button>\n <Drawer {...drawer} placement=\"bottom\">\n <DrawerOverlay />\n\n <DrawerContent color=\"textPrimary\" maxH=\"full\">\n <DrawerHeader borderBottom=\"base\">Sorting and Filters</DrawerHeader>\n\n <DrawerCloseButton />\n\n <DrawerBody>\n <Stack color=\"textPrimary\" pb={4} spacing={4}>\n <SortFilter />\n\n <CDKFilter />\n\n <LanguageFilter />\n\n <TagFilter />\n\n <KeywordsFilter />\n </Stack>\n </DrawerBody>\n </DrawerContent>\n </Drawer>\n </>\n );\n};\n","import { ChevronDownIcon } from \"@chakra-ui/icons\";\nimport {\n Flex,\n Text,\n Menu,\n MenuButton,\n MenuList,\n MenuItem,\n Button,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { SEARCH_ANALYTICS, SORT_RENDER_MAP } from \"./constants\";\nimport testIds from \"./testIds\";\nimport { useSort } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { eventName } from \"../../contexts/Analytics\";\n\nexport const SortedBy: FunctionComponent = () => {\n const sort = useSort();\n const updateSearch = useUpdateSearchParam();\n\n const selected = sort ? SORT_RENDER_MAP[sort] : \"Relevance\";\n\n return (\n <Flex align=\"center\">\n <Text>Sorted by</Text>\n <Menu>\n <MenuButton\n as={Button}\n color=\"link\"\n data-event={eventName(SEARCH_ANALYTICS.SORT, \"Menu\")}\n data-testid={testIds.sortButton}\n ml={2}\n pl={2} // For some reason, the px shorthand doesn't work on this Button\n pr={2}\n py={1}\n rightIcon={<ChevronDownIcon />}\n variant=\"link\"\n >\n {selected}\n </MenuButton>\n <MenuList data-testid={testIds.sortDropdown} minW=\"180\" zIndex=\"sticky\">\n <MenuItem\n data-event={eventName(SEARCH_ANALYTICS.SORT, \"Option\", \"Relevance\")}\n data-testid={testIds.sortItem}\n data-value=\"\"\n key=\"Relevance\"\n onClick={() => updateSearch({ sort: undefined })}\n >\n Relevance\n </MenuItem>\n {Object.entries(SORT_RENDER_MAP).map(([value, display]) => (\n <MenuItem\n data-event={eventName(SEARCH_ANALYTICS.SORT, \"Option\", display)}\n data-testid={testIds.sortItem}\n data-value={value}\n key={value}\n onClick={() => updateSearch({ sort: value as CatalogSearchSort })}\n >\n {display}\n </MenuItem>\n ))}\n </MenuList>\n </Menu>\n </Flex>\n );\n};\n","import { Center, Spinner } from \"@chakra-ui/react\";\nimport { FunctionComponent, memo } from \"react\";\nimport { WideCardList } from \"./WideCardList\";\nimport { ExtendedCatalogPackage } from \"../../api/catalog-search\";\nimport { PackageCardType } from \"../PackageCard\";\n\nconst listViews = {\n [PackageCardType.Wide]: WideCardList,\n};\n\nexport interface PackageListViewProps {\n \"data-event\"?: string;\n items: ExtendedCatalogPackage[];\n}\n\nexport interface PackageListProps extends Partial<PackageListViewProps> {\n cardView?: PackageCardType;\n loading?: boolean;\n title?: string;\n}\n\nexport const PackageList: FunctionComponent<PackageListProps> = memo(\n ({\n \"data-event\": dataEvent,\n cardView = PackageCardType.Wide,\n items,\n loading,\n }) => {\n if (loading || !items) {\n return (\n <Center>\n <Spinner size=\"xl\" />\n </Center>\n );\n }\n\n const View = listViews[cardView];\n\n return <View data-event={dataEvent} items={items} />;\n }\n);\n\nPackageList.displayName = \"PackageList\";\n","import { Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { PackageListViewProps } from \"./PackageList\";\nimport { PackageCard, PackageCardType } from \"../PackageCard\";\n\nexport const WideCardList: FunctionComponent<PackageListViewProps> = ({\n \"data-event\": dataEvent,\n items,\n}) => {\n return (\n <Stack spacing={4}>\n {items.map((pkg) => (\n <PackageCard\n data-event={dataEvent}\n key={`${pkg.name}-${pkg.version}`}\n pkg={pkg}\n variant={PackageCardType.Wide}\n />\n ))}\n </Stack>\n );\n};\n","import { Box, Stack } from \"@chakra-ui/react\";\nimport { FunctionComponent, useEffect } from \"react\";\nimport { LIMIT, SEARCH_ANALYTICS } from \"./constants\";\nimport { PageControls } from \"./PageControls\";\nimport { SearchBar } from \"./SearchBar\";\nimport { SearchDetails } from \"./SearchDetails\";\nimport { SortAndFilterDrawer } from \"./SortAndFilterDrawer\";\nimport { SortedBy } from \"./SortedBy\";\nimport {\n useCdkType,\n useCdkMajor,\n useKeywords,\n useLanguages,\n useOffset,\n useSearchQuery,\n useSort,\n useTags,\n} from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { PackageList } from \"../../components/PackageList\";\nimport { Page } from \"../../components/Page\";\nimport { useCatalogResults } from \"../../hooks/useCatalogResults\";\n\nexport const SearchResults: FunctionComponent = () => {\n const updateSearch = useUpdateSearchParam();\n\n const offset = useOffset();\n const query = useSearchQuery();\n const keywords = useKeywords();\n const languages = useLanguages();\n const cdkMajor = useCdkMajor();\n const cdkType = useCdkType();\n const sort = useSort();\n const tags = useTags();\n\n const { page, pageLimit, results } = useCatalogResults({\n offset,\n limit: LIMIT,\n query,\n keywords,\n languages,\n cdkMajor,\n cdkType,\n sort,\n tags,\n });\n\n // Resets the page number to 1 if query param offset is below 0, or to the last page if offset is higher than page count\n useEffect(() => {\n // If the query has results but the page has nothing to show...\n if (results.length && (offset < 0 || offset > pageLimit)) {\n // Handle an out of bounds offset\n if (offset < 0) {\n updateSearch({ offset: 0 });\n } else {\n // Offset is too large, just take last page\n updateSearch({ offset: pageLimit });\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [results, offset, pageLimit]);\n\n // Scroll to top on page change\n useEffect(() => {\n window.scrollTo(0, 0);\n }, [page]);\n\n return (\n <Page\n meta={{\n title: query || \"Search\",\n description: query\n ? `${results.length} results for ${query} at Construct Hub`\n : \"Search reusable components for your cloud application\",\n }}\n pageName=\"search\"\n >\n <Stack direction=\"column\" maxW=\"100vw\" pb={4} px={4} spacing={4}>\n <SearchBar />\n\n <Stack\n align={{ base: \"start\", lg: \"center\" }}\n direction={{ base: \"column-reverse\", lg: \"row\" }}\n justify={{ base: \"initial\", lg: \"space-between\" }}\n spacing={4}\n >\n <SearchDetails\n count={results.length}\n filtered={!!query}\n limit={LIMIT}\n offset={offset}\n query={query}\n />\n\n <Box display={{ base: \"none\", md: \"initial\" }}>\n <SortedBy />\n </Box>\n\n <Box display={{ md: \"none\" }}>\n <SortAndFilterDrawer />\n </Box>\n </Stack>\n\n <PackageList data-event={SEARCH_ANALYTICS.RESULTS} items={page} />\n\n <Box w=\"full\">\n <PageControls offset={offset} pageLimit={pageLimit} />\n </Box>\n </Stack>\n </Page>\n );\n};\n","import { Grid } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { FilterPanel } from \"./FilterPanel\";\nimport { SearchResults } from \"./SearchResults\";\nimport testIds from \"./testIds\";\nimport { Page } from \"../../components/Page\";\n\nexport const Search: FunctionComponent = () => {\n return (\n <Page\n meta={{\n title: \"Search - Construct Hub\",\n description: \"Search Construct Libraries for AWS CDK, CDK8s, and CDKTF\",\n }}\n pageName=\"search\"\n >\n <Grid\n data-testid={testIds.page}\n gap={4}\n h=\"full\"\n maxW=\"100%\"\n px={{ base: 0, md: 6 }}\n py={6}\n templateColumns={{ base: \"1fr\", md: \"auto 1fr\" }}\n templateRows=\"1fr\"\n >\n {/* Filter Panel Desktop */}\n <FilterPanel />\n\n {/* Results, Info, and Controls */}\n <SearchResults />\n </Grid>\n </Page>\n );\n};\n"],"names":["SORT_RENDER_MAP","_SORT_RENDER_MAP","_defineProperty","CatalogSearchSort","NameAsc","NameDesc","PublishDateAsc","PublishDateDesc","DownloadsDesc","DownloadsAsc","searchEvent","_len","arguments","length","e","Array","_key","eventName","apply","concat","SEARCH_ANALYTICS","FILTERS","RESULTS","SEARCH","SORT","FilterHeading","_ref","name","hint","placement","useBreakpointValue","base","md","_jsxs","Flex","align","mb","children","_jsx","Heading","as","size","w","Popover","colorScheme","strategy","PopoverTrigger","ml","QuestionIcon","h","PopoverContent","bg","borderRadius","color","fontSize","mx","shadow","PopoverArrow","PopoverBody","Text","createTestIds","RadioFilter","dataTestid","checkedValue","value","onValueChange","options","Stack","spacing","RadioGroup","onChange","map","_ref2","display","dataEvent","Radio","testIds","filterItem","isTruncated","toNum","val","result","parseInt","parseQueryArray","queryString","decodeURIComponent","split","getParamFromUrl","key","window","URL","location","href","searchParams","get","useSearchParam","transform","qp","useQueryParams","useMemo","useCdkType","_useSearchParam","QUERY_PARAMS","CDK_TYPE","undefined","useCdkMajor","CDK_MAJOR","p","useKeywords","KEYWORDS","useLanguages","LANGUAGES","useSearchQuery","_useSearchParam2","SEARCH_QUERY","useSort","_useSearchParam3","useTags","TAGS","useUpdateSearchParam","push","useHistory","useCallback","offset","params","_objectWithoutProperties","_excluded","getSearchPath","_objectSpread","_getParamFromUrl","_getParamFromUrl2","query","keywords","cdkType","cdkMajor","cdkMajorParam","languages","OFFSET","sort","tags","getSearchUrlParams","CDKFilter","_cdkMajor$toString","updateSearch","searchAPI","useSearchContext","cdkOptions","cdkTypes","constructFrameworks","Object","entries","reduce","opts","_slicedToArray","meta","pkgCount","CDKTYPE_NAME_MAP","keys","majorsOptions","_cdkOptions$cdkType","majorVersions","_toConsumableArray","a","b","toString","_Fragment","cdkTypeFilter","type","values","cdkVersionFilter","major","majorNum","CheckboxItem","isDisabled","disabledHint","isChecked","Checkbox","Tooltip","hasArrow","label","CheckboxFilter","initialItemCount","checkedValues","collapse","useDisclosure","trackCustomEvent","useAnalytics","getOnChange","item","clickEvent","alwaysShow","showWhenExpanded","slice","isExpandible","direction","mt","_createElement","includes","Collapse","animateOpacity","in","isOpen","unmountOnExit","Button","fontWeight","leftIcon","ChevronUpIcon","ChevronDownIcon","onClick","onToggle","textAlign","variant","KeywordsFilter","keywordMap","keywordOptions","baseOptions","filter","_ref5","keyword","_ref7","keywordsNotInOptions","k","some","opt","languagesFilter","languageOptions","LANGUAGE_NAME_MAP","TEMP_SUPPORTED_LANGUAGES","has","l1","l2","LanguageFilter","lang","language","l","TagFilter","packageTags","useConfigValue","packageTagGroups","tagFilterGroups","_packageTags$filter","tagGroupsMap","Map","forEach","group","set","id","accum","tag","_tag$searchFilter","_accum$groupIdOrName$","_accum$groupIdOrName","groupIdOrName","searchFilter","groupBy","customGroup","entry","mapTagsToFilterGroups","Boolean","onTagsChange","t","getOnRadioTagChange","groupName","_tagFilterGroups$grou","_tagFilterGroups$grou2","groupTags","Set","filteredTags","_tagItems$find$id","_tagItems$find","filterType","tooltip","tagItems","sharedProps","find","TOP_OFFSET","FilterPanel","Card","filtersPanel","maxH","maxW","minW","overflow","pos","top","zIndex","ArrowButton","Icon","icon","props","borderColor","IconButton","disabled","GoToPage","pageLimit","_useState","useState","_useState2","inputValue","setInputValue","useEffect","onSubmit","preventDefault","Input","max","min","target","onFocus","PageControls","goForward","goBack","justify","prevPage","ChevronLeftIcon","goToPage","nextPage","ChevronRightIcon","SearchBar","setValue","SearchBarComponent","Em","Count","first","count","last","SearchDetails","_ref3","limit","filtered","hasResults","searchDetails","SortFilter","newSort","SortAndFilterDrawer","drawer","onOpen","rightIcon","Drawer","DrawerOverlay","DrawerContent","DrawerHeader","borderBottom","DrawerCloseButton","DrawerBody","pb","SortedBy","selected","Menu","MenuButton","sortButton","pl","pr","py","MenuList","sortDropdown","MenuItem","sortItem","listViews","PackageCardType","Wide","items","pkg","PackageCard","version","PackageList","memo","_ref$cardView","cardView","loading","Center","Spinner","View","displayName","SearchResults","o","_useCatalogResults","useCatalogResults","page","results","scrollTo","Page","title","description","pageName","px","lg","Box","Search","Grid","gap","templateColumns","templateRows"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"static/js/51.17b41704.chunk.js","mappings":"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","sources":["views/Search/constants.ts","views/Search/FilterHeading.tsx","views/Search/testIds.ts","views/Search/RadioFilter.tsx","views/Search/util.ts","views/Search/useSearchParam.ts","views/Search/useUpdateSearchParam.ts","views/Search/CDKFilter.tsx","views/Search/CheckboxFilter.tsx","views/Search/KeywordsFilter.tsx","views/Search/LanguageFilter.tsx","views/Search/TagFilter.tsx","views/Search/FilterPanel.tsx","views/Search/ArrowButton.tsx","views/Search/GoToPage.tsx","views/Search/PageControls.tsx","views/Search/SearchBar.tsx","views/Search/SearchDetails.tsx","views/Search/SortFilter.tsx","views/Search/SortAndFilterDrawer.tsx","views/Search/SortedBy.tsx","components/PackageList/PackageList.tsx","components/PackageList/WideCardList.tsx","views/Search/SearchResults.tsx","views/Search/Search.tsx"],"sourcesContent":["import { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport type { QueryParamKey } from \"../../constants/url\";\nimport { eventName } from \"../../contexts/Analytics\";\n\nconst LIMITS = [25, 50, 75, 100];\nexport const LIMIT = LIMITS[0];\n\nexport type SearchQueryParam = Extract<QueryParamKey, \"offset\" | \"q\">;\n\nexport const SORT_RENDER_MAP = {\n [CatalogSearchSort.NameAsc]: \"A-Z\",\n [CatalogSearchSort.NameDesc]: \"Z-A\",\n [CatalogSearchSort.PublishDateAsc]: \"Oldest\",\n [CatalogSearchSort.PublishDateDesc]: \"Recently updated\",\n [CatalogSearchSort.DownloadsDesc]: \"Most downloads\",\n [CatalogSearchSort.DownloadsAsc]: \"Least downloads\",\n};\n\nconst searchEvent: typeof eventName = (...e) => eventName(\"Search\", ...e);\n\nexport const SEARCH_ANALYTICS = {\n FILTERS: searchEvent(\"Filters\"),\n RESULTS: searchEvent(\"Results\"),\n SEARCH: searchEvent(\"Search\"),\n SORT: searchEvent(\"Sort\"),\n};\n","import { QuestionIcon } from \"@chakra-ui/icons\";\nimport {\n Flex,\n Heading,\n Text,\n Popover,\n PopoverTrigger,\n PopoverBody,\n PopoverArrow,\n PopoverContent,\n useBreakpointValue,\n PlacementWithLogical,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { eventName } from \"../../contexts/Analytics\";\n\nexport interface FilterHeadingProps {\n name: string;\n hint?: string;\n}\n\nexport const FilterHeading: FunctionComponent<FilterHeadingProps> = ({\n name,\n hint,\n}) => {\n const placement = useBreakpointValue<PlacementWithLogical>({\n base: \"auto\",\n md: \"right\",\n });\n\n return (\n <Flex align=\"center\" mb={1}>\n <Heading as=\"h3\" size=\"sm\" w=\"max-content\">\n {name}\n </Heading>\n {hint ? (\n <Popover colorScheme=\"dark\" placement={placement} strategy=\"fixed\">\n <PopoverTrigger>\n <Flex\n aria-label={`Hint: ${name}`}\n as=\"button\"\n data-event={eventName(SEARCH_ANALYTICS.FILTERS, name, \"Popover\")}\n ml={2}\n >\n <QuestionIcon h={3.5} w={3.5} />\n </Flex>\n </PopoverTrigger>\n <PopoverContent\n bg=\"gray.700\"\n borderRadius=\"base\"\n color=\"white\"\n fontSize=\"sm\"\n mx={{ base: \"1rem\", md: \"initial\" }}\n shadow=\"whiteAlpha.300\"\n >\n <PopoverArrow bg=\"gray.700\" />\n <PopoverBody>\n <Text>{hint}</Text>\n </PopoverBody>\n </PopoverContent>\n </Popover>\n ) : null}\n </Flex>\n );\n};\n","import { createTestIds } from \"../../util/createTestIds\";\n\nexport default createTestIds(\"searchRedesign\", [\n \"page\",\n // Results\n \"searchDetails\",\n \"nextPage\",\n \"prevPage\",\n \"goToPage\",\n // Sorting\n \"sortButton\",\n \"sortDropdown\",\n \"sortItem\",\n // Filters Panel\n \"filtersPanel\",\n \"cdkTypeFilter\",\n \"cdkVersionFilter\",\n \"filterItem\",\n \"languagesFilter\",\n] as const);\n","import { Radio, RadioGroup, Stack, Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { FilterHeading, FilterHeadingProps } from \"./FilterHeading\";\nimport testIds from \"./testIds\";\nimport { eventName } from \"../../contexts/Analytics\";\n\nexport interface RadioFilterProps extends FilterHeadingProps {\n \"data-testid\"?: string;\n value?: string;\n onValueChange: (value: string) => void;\n options: {\n display: string;\n value: string;\n }[];\n}\n\nexport const RadioFilter: FunctionComponent<RadioFilterProps> = ({\n \"data-testid\": dataTestid,\n value: checkedValue,\n onValueChange,\n options,\n name,\n hint,\n}) => {\n return (\n <Stack data-testid={dataTestid} spacing={1}>\n <FilterHeading hint={hint} name={name} />\n <RadioGroup onChange={onValueChange} value={checkedValue}>\n <Stack spacing={1}>\n {options.map(({ display, value }) => {\n const dataEvent = eventName(\n SEARCH_ANALYTICS.FILTERS,\n name,\n \"Filter\",\n display\n );\n return (\n <Radio data-event={dataEvent} key={value} value={value}>\n <Text\n color=\"textTertiary\"\n data-event={dataEvent}\n data-testid={testIds.filterItem}\n data-value={value}\n isTruncated\n >\n {display}\n </Text>\n </Radio>\n );\n })}\n </Stack>\n </RadioGroup>\n </Stack>\n );\n};\n","import { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { CDKType } from \"../../constants/constructs\";\nimport { Language } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\n\nexport const toNum = (val: string) => {\n const result = parseInt(val);\n\n if (`${result}` === \"NaN\") {\n return 0;\n }\n\n return result;\n};\n\nexport const parseQueryArray = <T extends string>(\n queryString: string | null\n) => {\n if (!queryString) return [];\n\n return decodeURIComponent(queryString).split(\",\") as T[];\n};\n\nconst getParamFromUrl = (key: string) => {\n if (typeof window === \"undefined\") return null;\n const queryParams = new URL(window.location.href).searchParams;\n return queryParams.get(key);\n};\n\nexport const getSearchUrlParams = () => {\n return {\n query: getParamFromUrl(QUERY_PARAMS.SEARCH_QUERY) ?? \"\",\n keywords: parseQueryArray(getParamFromUrl(QUERY_PARAMS.KEYWORDS)),\n cdkType: (getParamFromUrl(QUERY_PARAMS.CDK_TYPE) as CDKType) ?? undefined,\n cdkMajor: (() => {\n const cdkMajorParam = getParamFromUrl(QUERY_PARAMS.CDK_MAJOR);\n return cdkMajorParam ? toNum(cdkMajorParam) : undefined;\n })(),\n languages: parseQueryArray(\n getParamFromUrl(QUERY_PARAMS.LANGUAGES)\n ) as Language[],\n offset: toNum(getParamFromUrl(QUERY_PARAMS.OFFSET) ?? \"\"),\n sort:\n (getParamFromUrl(QUERY_PARAMS.SORT) as CatalogSearchSort) ?? undefined,\n tags: parseQueryArray(getParamFromUrl(QUERY_PARAMS.TAGS)),\n };\n};\n","import { useMemo } from \"react\";\nimport { parseQueryArray, toNum } from \"./util\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { CDKType } from \"../../constants/constructs\";\nimport { Language } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\n\nconst useSearchParam = <T = string | null>(\n key: string,\n transform?: (param: string | null) => T\n): T => {\n const queryParams = useQueryParams();\n const qp = queryParams.get(key);\n\n return useMemo(\n () => (transform ? transform(qp) : (qp as unknown as T)),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [qp]\n );\n};\n\nexport const useCdkType = () => {\n const cdkType: CDKType | undefined =\n useSearchParam(QUERY_PARAMS.CDK_TYPE) ?? undefined;\n\n return cdkType;\n};\n\nexport const useCdkMajor = () => {\n const cdkMajor: number | undefined = useSearchParam(\n QUERY_PARAMS.CDK_MAJOR,\n (p) => (p ? toNum(p) : undefined)\n );\n\n return cdkMajor;\n};\n\nexport const useKeywords = () => {\n const keywords: string[] = useSearchParam(\n QUERY_PARAMS.KEYWORDS,\n parseQueryArray\n );\n\n return keywords;\n};\n\nexport const useLanguages = () => {\n const languages: Language[] = useSearchParam(\n QUERY_PARAMS.LANGUAGES,\n parseQueryArray\n ) as Language[];\n\n return languages;\n};\n\nexport const useOffset = () => {\n const offset = useSearchParam(QUERY_PARAMS.OFFSET, (o) => toNum(o ?? \"\"));\n return offset;\n};\n\nexport const useSearchQuery = () => {\n const query: string = useSearchParam(QUERY_PARAMS.SEARCH_QUERY) ?? \"\";\n return query;\n};\n\nexport const useSort = () => {\n const sort: CatalogSearchSort | undefined =\n useSearchParam(QUERY_PARAMS.SORT) ?? undefined;\n return sort;\n};\n\nexport const useTags = () => {\n const tags: string[] = useSearchParam(QUERY_PARAMS.TAGS, parseQueryArray);\n return tags;\n};\n","import { useCallback } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { getSearchUrlParams } from \"./util\";\nimport { getSearchPath } from \"../../util/url\";\n\nexport const useUpdateSearchParam = () => {\n const { push } = useHistory();\n\n return useCallback(\n (p?: Partial<Parameters<typeof getSearchPath>[0]>) => {\n const { offset, ...params } = p ?? {};\n\n push(\n getSearchPath({\n ...getSearchUrlParams(),\n ...params,\n offset: offset ?? 0,\n })\n );\n },\n [push]\n );\n};\n","import { FunctionComponent, useMemo } from \"react\";\nimport { RadioFilter } from \"./RadioFilter\";\nimport testIds from \"./testIds\";\nimport { useCdkMajor, useCdkType } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { CatalogConstructFrameworkMeta } from \"../../api/catalog-search\";\nimport { CDKType, CDKTYPE_NAME_MAP } from \"../../constants/constructs\";\nimport { useSearchContext } from \"../../contexts/Search\";\n\ntype CDKOptions = Partial<{\n [key in CDKType]: CatalogConstructFrameworkMeta & {\n display: string;\n value: key;\n };\n}>;\n\nexport const CDKFilter: FunctionComponent = () => {\n const cdkType = useCdkType();\n const cdkMajor = useCdkMajor();\n\n const updateSearch = useUpdateSearchParam();\n\n const searchAPI = useSearchContext()!;\n\n // Options with less than one package will be omitted\n const cdkOptions = useMemo(() => {\n const cdkTypes = searchAPI.constructFrameworks;\n const options = Object.entries(cdkTypes).reduce((opts, [name, meta]) => {\n if (meta.pkgCount < 1) {\n return opts;\n }\n\n return {\n ...opts,\n [name]: {\n display: CDKTYPE_NAME_MAP[name as CDKType],\n value: name,\n ...meta,\n },\n };\n }, {});\n\n return Object.keys(options).length ? (options as CDKOptions) : undefined;\n }, [searchAPI]);\n\n const majorsOptions = useMemo(() => {\n if (!cdkOptions || !cdkType) return undefined;\n const majorVersions = cdkOptions[cdkType]?.majorVersions;\n\n if (!majorVersions) return undefined;\n\n return [...majorVersions]\n .sort((a, b) => a - b)\n .map((value) => ({\n value: value.toString(),\n display: `${CDKTYPE_NAME_MAP[cdkType]} v${value}`,\n }));\n }, [cdkOptions, cdkType]);\n\n if (!cdkOptions) {\n return null;\n }\n\n const onCdkTypeChange = (type: string) => {\n const cdk = type as CDKType;\n updateSearch({ cdkType: type ? cdk : undefined, cdkMajor: undefined });\n };\n\n const onCdkMajorChange = (major: string) => {\n let majorNum: number | undefined = undefined;\n\n if (major) {\n majorNum = parseInt(major, 10);\n }\n\n updateSearch({ cdkMajor: majorNum });\n };\n\n return (\n <>\n <RadioFilter\n data-testid={testIds.cdkTypeFilter}\n hint=\"Choose the right CDK for your IaC technology: AWS CDK for AWS CloudFormation, CDKTF for Terraform, or CDK8s for Kubernetes.\"\n name=\"CDK Type\"\n onValueChange={onCdkTypeChange}\n options={[\n { display: \"Any CDK Type\", value: \"\" },\n ...Object.values(cdkOptions),\n ]}\n value={cdkType ?? \"\"}\n />\n {/* No point in showing major versions if only a single one is available */}\n {!!(majorsOptions && majorsOptions.length > 1) && (\n <RadioFilter\n data-testid={testIds.cdkVersionFilter}\n hint=\"Choose the major version of the CDK you're using to see only constructs that will work with that version.\"\n name=\"CDK Major Version\"\n onValueChange={onCdkMajorChange}\n options={[\n { display: \"Any Major Version\", value: \"\" },\n ...majorsOptions,\n ]}\n value={cdkMajor?.toString() ?? \"\"}\n />\n )}\n </>\n );\n};\n","import { ChevronDownIcon, ChevronUpIcon } from \"@chakra-ui/icons\";\nimport {\n Flex,\n Button,\n Collapse,\n Checkbox,\n Stack,\n Text,\n Tooltip,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { FilterHeading, FilterHeadingProps } from \"./FilterHeading\";\nimport testIds from \"./testIds\";\nimport { clickEvent, eventName, useAnalytics } from \"../../contexts/Analytics\";\n\ninterface CheckboxOption {\n display: string;\n value: string;\n isDisabled?: boolean;\n disabledHint?: string;\n}\n\ninterface CheckboxItemProps extends CheckboxOption {\n onChange: () => void;\n isChecked: boolean;\n}\n\nexport interface CheckboxFilterProps extends FilterHeadingProps {\n /**\n * Test ID to select checkbox in tests\n */\n \"data-testid\"?: string;\n /**\n * Number of items that can be initially shown\n */\n initialItemCount?: number;\n /**\n * Defines checkbox items\n */\n options: CheckboxOption[];\n /**\n * Selected values\n */\n values: string[];\n /**\n * Callback triggered when an item is clicked\n */\n onValueChange: (value: string) => void;\n}\n\nconst CheckboxItem: FunctionComponent<CheckboxItemProps> = ({\n display,\n value,\n isDisabled,\n disabledHint,\n isChecked,\n onChange,\n}) => (\n <Checkbox\n isChecked={isChecked}\n isDisabled={isDisabled}\n key={value}\n onChange={onChange}\n >\n <Tooltip\n hasArrow\n isDisabled={!isDisabled && !disabledHint}\n label={disabledHint}\n placement=\"right\"\n >\n <Text\n color=\"textTertiary\"\n data-testid={testIds.filterItem}\n data-value={value}\n isTruncated\n >\n {display}\n </Text>\n </Tooltip>\n </Checkbox>\n);\n\nexport const CheckboxFilter: FunctionComponent<CheckboxFilterProps> = ({\n \"data-testid\": dataTestid,\n initialItemCount,\n hint,\n name,\n options,\n values: checkedValues,\n onValueChange,\n}) => {\n const collapse = useDisclosure();\n const { trackCustomEvent } = useAnalytics();\n\n const getOnChange = (item: CheckboxOption) => () => {\n trackCustomEvent(\n clickEvent({\n name: eventName(SEARCH_ANALYTICS.FILTERS, name, \"Filter\", item.display),\n })\n );\n onValueChange(item.value);\n };\n\n let alwaysShow: typeof options = options;\n let showWhenExpanded: typeof options = [];\n\n if (initialItemCount) {\n alwaysShow = options.slice(0, initialItemCount);\n showWhenExpanded = options.slice(initialItemCount, options.length);\n }\n\n const isExpandible = showWhenExpanded.length > 0;\n\n return (\n <Flex data-testid={dataTestid} direction=\"column\">\n <FilterHeading hint={hint} name={name} />\n <Stack mt={1} spacing={1}>\n {alwaysShow.map((item) => (\n <CheckboxItem\n {...item}\n isChecked={checkedValues.includes(item.value)}\n key={item.value}\n onChange={getOnChange(item)}\n />\n ))}\n {isExpandible && (\n <Collapse animateOpacity in={collapse.isOpen} unmountOnExit>\n <Stack spacing={1}>\n {showWhenExpanded.map((item) => (\n <CheckboxItem\n {...item}\n isChecked={checkedValues.includes(item.value)}\n key={item.value}\n onChange={getOnChange(item)}\n />\n ))}\n </Stack>\n </Collapse>\n )}\n </Stack>\n {isExpandible && (\n <Flex align=\"start\" mt={1}>\n <Button\n color=\"textTertiary\"\n data-event={eventName(SEARCH_ANALYTICS.FILTERS, name, \"Show More\")}\n fontWeight=\"normal\"\n leftIcon={collapse.isOpen ? <ChevronUpIcon /> : <ChevronDownIcon />}\n onClick={collapse.onToggle}\n size=\"sm\"\n textAlign=\"left\"\n variant=\"link\"\n w=\"auto\"\n >\n {collapse.isOpen\n ? `Show fewer options (${alwaysShow.length})`\n : `Show more options (${showWhenExpanded.length})`}\n </Button>\n </Flex>\n )}\n </Flex>\n );\n};\n","import { FunctionComponent, useMemo } from \"react\";\nimport { CheckboxFilter } from \"./CheckboxFilter\";\nimport testIds from \"./testIds\";\nimport { useKeywords } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { useSearchContext } from \"../../contexts/Search\";\n\nexport const KeywordsFilter: FunctionComponent = () => {\n const keywords = useKeywords();\n const keywordMap = useSearchContext()!.keywords;\n const updateSearch = useUpdateSearchParam();\n\n const onKeywordChange = (keyword: string) => {\n updateSearch({\n keywords: keywords.includes(keyword)\n ? keywords.filter((k) => k !== keyword)\n : [...keywords, keyword],\n });\n };\n\n const keywordOptions = useMemo(() => {\n const baseOptions = [...keywordMap.entries()]\n .sort(([, count1], [, count2]) => {\n return count1 < count2 ? 1 : -1;\n })\n .filter(([keyword]) => !keywords.includes(keyword))\n .map(([keyword]) => ({\n display: keyword,\n value: keyword,\n }))\n .slice(0, 25);\n\n const keywordsNotInOptions = keywords.filter(\n (k) => !baseOptions.some((opt) => opt.value === k)\n );\n\n return [\n ...keywordsNotInOptions.map((k) => ({ display: k, value: k })),\n ...baseOptions,\n ];\n }, [keywordMap, keywords]);\n\n return (\n <CheckboxFilter\n data-testid={testIds.languagesFilter}\n hint=\"Focus the results by choosing one or more keywords reflecting the kind of construct you're looking for. Keywords are provided by construct authors.\"\n initialItemCount={5}\n name=\"Keywords\"\n onValueChange={onKeywordChange}\n options={keywordOptions}\n values={keywords}\n />\n );\n};\n","import { FunctionComponent } from \"react\";\nimport { CheckboxFilter } from \"./CheckboxFilter\";\nimport testIds from \"./testIds\";\nimport { useLanguages } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport {\n Language,\n LANGUAGE_NAME_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\n\nconst languageOptions = Object.entries(LANGUAGE_NAME_MAP)\n .map(([key, value]) => ({\n display: value,\n value: key,\n ...(TEMP_SUPPORTED_LANGUAGES.has(key as Language)\n ? { isDisabled: false }\n : {\n isDisabled: true,\n disabledHint: `${\n LANGUAGE_NAME_MAP[key as Language]\n } support is coming soon!`,\n }),\n }))\n .sort((l1, l2) => {\n // Push disabled languages to back of list\n return l1.isDisabled > l2.isDisabled ? 1 : -1;\n });\n\nexport const LanguageFilter: FunctionComponent = () => {\n const languages = useLanguages();\n\n const updateSearch = useUpdateSearchParam();\n\n const onLanguagesChange = (lang: string) => {\n const language = lang as Language;\n\n updateSearch({\n languages: languages.includes(language)\n ? languages.filter((l) => l !== language)\n : [...languages, language],\n });\n };\n\n return (\n <CheckboxFilter\n data-testid={testIds.languagesFilter}\n hint=\"Choose one or more languages. Results include constructs for use with at least one of the selected languages.\"\n name=\"Programming Language\"\n onValueChange={onLanguagesChange}\n options={languageOptions}\n values={languages}\n />\n );\n};\n","import { FunctionComponent, useCallback, useMemo } from \"react\";\nimport { CheckboxFilter } from \"./CheckboxFilter\";\nimport { RadioFilter } from \"./RadioFilter\";\nimport { useTags } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { PackageTagConfig, TagGroupConfig } from \"../../api/config\";\nimport { useConfigValue } from \"../../hooks/useConfigValue\";\n\ninterface FilterGroup extends Partial<TagGroupConfig> {\n id: string;\n tags: PackageTagConfig[];\n}\ninterface FilterGroups {\n [group: string]: FilterGroup;\n}\n\n/**\n * Creates a plain object map of FilterGroups keyed by group id\n */\nexport const mapTagsToFilterGroups = (\n packageTags: PackageTagConfig[],\n tagGroupsMap: Map<string, TagGroupConfig>\n): FilterGroups => {\n return packageTags.reduce(\n (accum: FilterGroups, tag: PackageTagConfig): FilterGroups => {\n const groupIdOrName = tag.searchFilter?.groupBy;\n const customGroup = groupIdOrName\n ? tagGroupsMap.get(groupIdOrName)\n : undefined;\n\n if (groupIdOrName && customGroup) {\n const entry = accum[groupIdOrName];\n if (entry) {\n entry.tags = [...entry.tags, tag];\n return accum;\n }\n\n return {\n ...accum,\n [groupIdOrName]: {\n ...customGroup,\n tags: [tag],\n },\n };\n }\n\n if (groupIdOrName) {\n return {\n ...accum,\n [groupIdOrName]: {\n id: groupIdOrName,\n tags: [...(accum?.[groupIdOrName]?.tags ?? []), tag],\n },\n };\n }\n return accum;\n },\n {}\n );\n};\n\nexport const TagFilter: FunctionComponent = () => {\n const packageTags = useConfigValue(\"packageTags\");\n const packageTagGroups = useConfigValue(\"packageTagGroups\");\n\n const tagFilterGroups: FilterGroups = useMemo(() => {\n const tagGroupsMap = new Map<string, TagGroupConfig>();\n packageTagGroups?.forEach((group) => {\n tagGroupsMap.set(group.id, group);\n });\n\n const filterableTags =\n packageTags?.filter((tag) => Boolean(tag.searchFilter)) ?? [];\n\n return mapTagsToFilterGroups(filterableTags, tagGroupsMap);\n }, [packageTags, packageTagGroups]);\n\n const tags = useTags();\n const updateSearch = useUpdateSearchParam();\n\n const onTagsChange = (tag: string) => {\n updateSearch({\n tags: tags.includes(tag) ? tags.filter((t) => t !== tag) : [...tags, tag],\n });\n };\n\n const getOnRadioTagChange = useCallback(\n (groupName: string) => {\n const groupTags = new Set(\n (tagFilterGroups[groupName]?.tags ?? []).map(({ id }) => id)\n );\n\n return (tag: string) => {\n const filteredTags = tags.filter((t) => !groupTags.has(t));\n\n updateSearch({\n tags: tag ? [...filteredTags, tag] : filteredTags,\n });\n };\n },\n [tagFilterGroups, tags, updateSearch]\n );\n\n return (\n <>\n {Object.values(tagFilterGroups).map(\n ({ filterType, id, label, tooltip, tags: tagItems }) => {\n const sharedProps = {\n hint: tooltip,\n name: label ?? id,\n options: tagItems.map((tag) => {\n return {\n display: tag.searchFilter!.display,\n value: tag.id,\n };\n }),\n };\n\n if (filterType === \"radio\") {\n return (\n <RadioFilter\n {...sharedProps}\n key={id}\n onValueChange={getOnRadioTagChange(id)}\n options={[\n { display: `Any ${sharedProps.name}`, value: \"\" },\n ...sharedProps.options,\n ]}\n value={tagItems.find((t) => tags.includes(t.id))?.id ?? \"\"}\n />\n );\n }\n\n return (\n <CheckboxFilter\n {...sharedProps}\n key={id}\n onValueChange={onTagsChange}\n values={tags}\n />\n );\n }\n )}\n </>\n );\n};\n","import { Heading, Stack } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { CDKFilter } from \"./CDKFilter\";\nimport { KeywordsFilter } from \"./KeywordsFilter\";\nimport { LanguageFilter } from \"./LanguageFilter\";\nimport { TagFilter } from \"./TagFilter\";\nimport testIds from \"./testIds\";\nimport { Card } from \"../../components/Card\";\n\nexport interface FilterPanelProps {}\n\n// Header height + section padding\nconst TOP_OFFSET = \"5.75rem\";\n\n/**\n * The desktop Resolution Filter Panel\n */\nexport const FilterPanel: FunctionComponent<FilterPanelProps> = () => {\n return (\n <Card\n borderRadius=\"sm\"\n data-testid={testIds.filtersPanel}\n display={{ base: \"none\", md: \"flex\" }}\n maxH={`calc(100vh - ${TOP_OFFSET} - 1.25rem)`}\n maxW=\"23rem\"\n minW=\"100%\"\n overflow=\"hidden auto\"\n p={4}\n pos=\"sticky\"\n top={TOP_OFFSET}\n zIndex=\"docked\"\n >\n <Stack color=\"textPrimary\" h=\"max-content\" spacing={4} top={4}>\n <Heading as=\"h2\" size=\"sm\">\n Filters\n </Heading>\n\n <CDKFilter />\n\n <LanguageFilter />\n\n <TagFilter />\n\n <KeywordsFilter />\n </Stack>\n </Card>\n );\n};\n","import { IconButton, IconProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport interface ArrowButtonProps {\n \"data-event\"?: string;\n \"data-testid\"?: string;\n icon: FunctionComponent<IconProps>;\n label: string;\n onClick?: () => void;\n}\n\nexport const ArrowButton: FunctionComponent<ArrowButtonProps> = ({\n \"data-event\": dataEvent,\n \"data-testid\": dataTestid,\n icon: Icon,\n label,\n onClick,\n}) => {\n const props = {\n \"aria-label\": label,\n borderRadius: \"md\",\n borderColor: \"blue.500\",\n colorScheme: \"blue\",\n \"data-event\": dataEvent,\n \"data-testid\": dataTestid,\n icon: <Icon color=\"blue.500\" h={5} w={5} />,\n mx: 2,\n h: 10,\n w: 10,\n variant: \"outline\",\n };\n\n return <IconButton {...props} disabled={!onClick} onClick={onClick} />;\n};\n","import { Flex, Input, Text } from \"@chakra-ui/react\";\nimport {\n FormEventHandler,\n FunctionComponent,\n SyntheticEvent,\n useEffect,\n useState,\n} from \"react\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { clickEvent, useAnalytics } from \"../../contexts/Analytics\";\n\nexport interface GoToPageProps {\n \"data-event\"?: string;\n \"data-testid\"?: string;\n pageLimit: number;\n offset: number;\n}\n\nexport const GoToPage: FunctionComponent<GoToPageProps> = ({\n \"data-event\": dataEvent,\n \"data-testid\": dataTestid,\n pageLimit,\n offset,\n}) => {\n const updateSearch = useUpdateSearchParam();\n const { trackCustomEvent } = useAnalytics();\n const [inputValue, setInputValue] = useState((offset + 1).toString());\n\n useEffect(() => {\n setInputValue((offset + 1).toString());\n }, [offset]);\n\n const onInputChange = (e: SyntheticEvent<HTMLInputElement>) => {\n e.preventDefault();\n setInputValue((e.target as HTMLInputElement).value);\n };\n\n const onSubmit: FormEventHandler<HTMLInputElement> = (e) => {\n e.preventDefault();\n updateSearch({ offset: parseInt(inputValue) - 1 });\n };\n\n return (\n <Flex align=\"center\" as=\"form\" mx={2} onSubmit={onSubmit}>\n <Input\n aria-label=\"Jump to page\"\n colorScheme=\"brand\"\n data-testid={dataTestid}\n h={10}\n max={pageLimit + 1}\n min={1}\n name=\"page\"\n onChange={onInputChange}\n onFocus={() => {\n if (dataEvent) {\n trackCustomEvent(clickEvent({ name: dataEvent }));\n }\n }}\n p={0}\n textAlign=\"center\"\n type=\"number\"\n value={inputValue}\n w={10}\n />\n <Text ml={2} w=\"max-content\">\n of {pageLimit + 1}\n </Text>\n </Flex>\n );\n};\n","import { ChevronLeftIcon, ChevronRightIcon } from \"@chakra-ui/icons\";\nimport { Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { ArrowButton } from \"./ArrowButton\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { GoToPage } from \"./GoToPage\";\nimport testIds from \"./testIds\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { eventName } from \"../../contexts/Analytics\";\n\nexport interface PageControlsProps {\n offset: number;\n pageLimit: number;\n}\n\nexport const PageControls: FunctionComponent<PageControlsProps> = ({\n offset,\n pageLimit,\n}) => {\n const updateSearch = useUpdateSearchParam();\n const goForward =\n offset < pageLimit ? () => updateSearch({ offset: offset + 1 }) : undefined;\n const goBack =\n offset > 0 ? () => updateSearch({ offset: offset - 1 }) : undefined;\n\n return (\n <Stack\n align=\"center\"\n direction=\"row\"\n justify=\"space-between\"\n maxW=\"18rem\"\n mx=\"auto\"\n spacing={4}\n w=\"full\"\n >\n <ArrowButton\n data-event={eventName(SEARCH_ANALYTICS.RESULTS, \"Previous Page\")}\n data-testid={testIds.prevPage}\n icon={ChevronLeftIcon}\n label=\"Previous page button\"\n onClick={goBack}\n />\n <GoToPage\n data-event={eventName(SEARCH_ANALYTICS.RESULTS, \"Go to Page\")}\n data-testid={testIds.goToPage}\n offset={offset}\n pageLimit={pageLimit}\n />\n <ArrowButton\n data-event={eventName(SEARCH_ANALYTICS.RESULTS, \"Next Page\")}\n data-testid={testIds.nextPage}\n icon={ChevronRightIcon}\n label=\"Next page button\"\n onClick={goForward}\n />\n </Stack>\n );\n};\n","import { FunctionComponent, useState } from \"react\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { useSearchQuery } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { SearchBar as SearchBarComponent } from \"../../components/SearchBar\";\n\nexport const SearchBar: FunctionComponent = () => {\n const query = useSearchQuery();\n const updateSearch = useUpdateSearchParam();\n\n const [value, setValue] = useState(query ?? \"\");\n\n return (\n <SearchBarComponent\n bg=\"bgSecondary\"\n data-event={SEARCH_ANALYTICS.SEARCH}\n onChange={(e) => setValue(e.target.value)}\n onSubmit={(e) => {\n e.preventDefault();\n\n updateSearch({\n query: value,\n sort: undefined,\n });\n }}\n value={value}\n />\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport testIds from \"./testIds\";\n\nexport interface SearchDetailsProps {\n limit: number;\n offset: number;\n count: number;\n filtered: boolean;\n query?: string;\n}\n\nconst Em: FunctionComponent = ({ children }) => (\n <Text as=\"strong\" color=\"textSecondary\">\n {children}\n </Text>\n);\n\nconst Count: FunctionComponent<{\n first: number;\n count: number;\n last: number;\n}> = ({ first, count, last }) => {\n if (!first && last >= count) {\n return (\n <>\n <Em>{count}</Em> of <Em>{count}</Em>\n </>\n );\n }\n\n return (\n <>\n <Em>\n {count ? first + 1 : count} - {last > count ? count : last}\n </Em>{\" \"}\n of <Em>{count}</Em>\n </>\n );\n};\n\nexport const SearchDetails: FunctionComponent<SearchDetailsProps> = ({\n limit,\n offset,\n count,\n filtered,\n query,\n}) => {\n const first = limit * offset;\n const last = first + limit;\n const hasResults = count > 0;\n\n return (\n <Text data-testid={testIds.searchDetails}>\n {hasResults ? (\n <>\n Displaying <Count count={count} first={first} last={last} />{\" \"}\n {filtered ? \"search results\" : \"constructs\"}\n </>\n ) : (\n <>{filtered ? \"There were no search results\" : \"No constructs found\"}</>\n )}\n {query && (\n <>\n {\" for \"}\n <Em>{query}</Em>\n </>\n )}\n .{!hasResults && filtered && <> Try a different term.</>}\n </Text>\n );\n};\n","import { FunctionComponent } from \"react\";\nimport { SORT_RENDER_MAP } from \"./constants\";\nimport { RadioFilter } from \"./RadioFilter\";\nimport { useSort } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\n\nexport const SortFilter: FunctionComponent = () => {\n const sort = useSort();\n const updateSearch = useUpdateSearchParam();\n\n const onSortChange = (newSort: string) => {\n updateSearch({\n sort: newSort ? (newSort as CatalogSearchSort) : undefined,\n });\n };\n\n return (\n <RadioFilter\n hint=\"Sets the order of search results\"\n name=\"Sorted By\"\n onValueChange={onSortChange}\n options={[\n { display: \"Relevance\", value: \"\" },\n ...Object.entries(SORT_RENDER_MAP).map(([value, display]) => ({\n display,\n value,\n })),\n ]}\n value={sort ?? \"\"}\n />\n );\n};\n","import { ChevronDownIcon } from \"@chakra-ui/icons\";\nimport {\n Button,\n Drawer,\n Stack,\n DrawerBody,\n DrawerHeader,\n DrawerOverlay,\n DrawerContent,\n DrawerCloseButton,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { CDKFilter } from \"./CDKFilter\";\nimport { KeywordsFilter } from \"./KeywordsFilter\";\nimport { LanguageFilter } from \"./LanguageFilter\";\nimport { SortFilter } from \"./SortFilter\";\nimport { TagFilter } from \"./TagFilter\";\n\n/**\n * The mobile filter Drawer (Bottomsheet in iOS terminology)\n */\nexport const SortAndFilterDrawer: FunctionComponent = () => {\n const drawer = useDisclosure();\n return (\n <>\n <Button\n colorScheme=\"brand\"\n display={{ md: \"none\" }}\n onClick={drawer.onOpen}\n rightIcon={<ChevronDownIcon />}\n variant=\"link\"\n >\n Sorting and Filters\n </Button>\n <Drawer {...drawer} placement=\"bottom\">\n <DrawerOverlay />\n\n <DrawerContent color=\"textPrimary\" maxH=\"full\">\n <DrawerHeader borderBottom=\"base\">Sorting and Filters</DrawerHeader>\n\n <DrawerCloseButton />\n\n <DrawerBody>\n <Stack color=\"textPrimary\" pb={4} spacing={4}>\n <SortFilter />\n\n <CDKFilter />\n\n <LanguageFilter />\n\n <TagFilter />\n\n <KeywordsFilter />\n </Stack>\n </DrawerBody>\n </DrawerContent>\n </Drawer>\n </>\n );\n};\n","import { ChevronDownIcon } from \"@chakra-ui/icons\";\nimport {\n Flex,\n Text,\n Menu,\n MenuButton,\n MenuList,\n MenuItem,\n Button,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { SEARCH_ANALYTICS, SORT_RENDER_MAP } from \"./constants\";\nimport testIds from \"./testIds\";\nimport { useSort } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { eventName } from \"../../contexts/Analytics\";\n\nexport const SortedBy: FunctionComponent = () => {\n const sort = useSort();\n const updateSearch = useUpdateSearchParam();\n\n const selected = sort ? SORT_RENDER_MAP[sort] : \"Relevance\";\n\n return (\n <Flex align=\"center\">\n <Text>Sorted by</Text>\n <Menu>\n <MenuButton\n as={Button}\n color=\"link\"\n data-event={eventName(SEARCH_ANALYTICS.SORT, \"Menu\")}\n data-testid={testIds.sortButton}\n ml={2}\n pl={2} // For some reason, the px shorthand doesn't work on this Button\n pr={2}\n py={1}\n rightIcon={<ChevronDownIcon />}\n variant=\"link\"\n >\n {selected}\n </MenuButton>\n <MenuList data-testid={testIds.sortDropdown} minW=\"180\" zIndex=\"sticky\">\n <MenuItem\n data-event={eventName(SEARCH_ANALYTICS.SORT, \"Option\", \"Relevance\")}\n data-testid={testIds.sortItem}\n data-value=\"\"\n key=\"Relevance\"\n onClick={() => updateSearch({ sort: undefined })}\n >\n Relevance\n </MenuItem>\n {Object.entries(SORT_RENDER_MAP).map(([value, display]) => (\n <MenuItem\n data-event={eventName(SEARCH_ANALYTICS.SORT, \"Option\", display)}\n data-testid={testIds.sortItem}\n data-value={value}\n key={value}\n onClick={() => updateSearch({ sort: value as CatalogSearchSort })}\n >\n {display}\n </MenuItem>\n ))}\n </MenuList>\n </Menu>\n </Flex>\n );\n};\n","import { Center, Spinner } from \"@chakra-ui/react\";\nimport { FunctionComponent, memo } from \"react\";\nimport { WideCardList } from \"./WideCardList\";\nimport { ExtendedCatalogPackage } from \"../../api/catalog-search\";\nimport { PackageCardType } from \"../PackageCard\";\n\nconst listViews = {\n [PackageCardType.Wide]: WideCardList,\n};\n\nexport interface PackageListViewProps {\n \"data-event\"?: string;\n items: ExtendedCatalogPackage[];\n}\n\nexport interface PackageListProps extends Partial<PackageListViewProps> {\n cardView?: PackageCardType;\n loading?: boolean;\n title?: string;\n}\n\nexport const PackageList: FunctionComponent<PackageListProps> = memo(\n ({\n \"data-event\": dataEvent,\n cardView = PackageCardType.Wide,\n items,\n loading,\n }) => {\n if (loading || !items) {\n return (\n <Center>\n <Spinner size=\"xl\" />\n </Center>\n );\n }\n\n const View = listViews[cardView];\n\n return <View data-event={dataEvent} items={items} />;\n }\n);\n\nPackageList.displayName = \"PackageList\";\n","import { Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { PackageListViewProps } from \"./PackageList\";\nimport { PackageCard, PackageCardType } from \"../PackageCard\";\n\nexport const WideCardList: FunctionComponent<PackageListViewProps> = ({\n \"data-event\": dataEvent,\n items,\n}) => {\n return (\n <Stack spacing={4}>\n {items.map((pkg) => (\n <PackageCard\n data-event={dataEvent}\n key={`${pkg.name}-${pkg.version}`}\n pkg={pkg}\n variant={PackageCardType.Wide}\n />\n ))}\n </Stack>\n );\n};\n","import { Box, Stack } from \"@chakra-ui/react\";\nimport { FunctionComponent, useEffect } from \"react\";\nimport { LIMIT, SEARCH_ANALYTICS } from \"./constants\";\nimport { PageControls } from \"./PageControls\";\nimport { SearchBar } from \"./SearchBar\";\nimport { SearchDetails } from \"./SearchDetails\";\nimport { SortAndFilterDrawer } from \"./SortAndFilterDrawer\";\nimport { SortedBy } from \"./SortedBy\";\nimport {\n useCdkType,\n useCdkMajor,\n useKeywords,\n useLanguages,\n useOffset,\n useSearchQuery,\n useSort,\n useTags,\n} from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { PackageList } from \"../../components/PackageList\";\nimport { Page } from \"../../components/Page\";\nimport { useCatalogResults } from \"../../hooks/useCatalogResults\";\n\nexport const SearchResults: FunctionComponent = () => {\n const updateSearch = useUpdateSearchParam();\n\n const offset = useOffset();\n const query = useSearchQuery();\n const keywords = useKeywords();\n const languages = useLanguages();\n const cdkMajor = useCdkMajor();\n const cdkType = useCdkType();\n const sort = useSort();\n const tags = useTags();\n\n const { page, pageLimit, results } = useCatalogResults({\n offset,\n limit: LIMIT,\n query,\n keywords,\n languages,\n cdkMajor,\n cdkType,\n sort,\n tags,\n });\n\n // Resets the page number to 1 if query param offset is below 0, or to the last page if offset is higher than page count\n useEffect(() => {\n // If the query has results but the page has nothing to show...\n if (results.length && (offset < 0 || offset > pageLimit)) {\n // Handle an out of bounds offset\n if (offset < 0) {\n updateSearch({ offset: 0 });\n } else {\n // Offset is too large, just take last page\n updateSearch({ offset: pageLimit });\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [results, offset, pageLimit]);\n\n // Scroll to top on page change\n useEffect(() => {\n window.scrollTo(0, 0);\n }, [page]);\n\n return (\n <Page\n meta={{\n title: query || \"Search\",\n description: query\n ? `${results.length} results for ${query} at Construct Hub`\n : \"Search reusable components for your cloud application\",\n }}\n pageName=\"search\"\n >\n <Stack direction=\"column\" maxW=\"100vw\" pb={4} px={4} spacing={4}>\n <SearchBar />\n\n <Stack\n align={{ base: \"start\", lg: \"center\" }}\n direction={{ base: \"column-reverse\", lg: \"row\" }}\n justify={{ base: \"initial\", lg: \"space-between\" }}\n spacing={4}\n >\n <SearchDetails\n count={results.length}\n filtered={!!query}\n limit={LIMIT}\n offset={offset}\n query={query}\n />\n\n <Box display={{ base: \"none\", md: \"initial\" }}>\n <SortedBy />\n </Box>\n\n <Box display={{ md: \"none\" }}>\n <SortAndFilterDrawer />\n </Box>\n </Stack>\n\n <PackageList data-event={SEARCH_ANALYTICS.RESULTS} items={page} />\n\n <Box w=\"full\">\n <PageControls offset={offset} pageLimit={pageLimit} />\n </Box>\n </Stack>\n </Page>\n );\n};\n","import { Grid } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { FilterPanel } from \"./FilterPanel\";\nimport { SearchResults } from \"./SearchResults\";\nimport testIds from \"./testIds\";\nimport { Page } from \"../../components/Page\";\n\nexport const Search: FunctionComponent = () => {\n return (\n <Page\n meta={{\n title: \"Search - Construct Hub\",\n description: \"Search Construct Libraries for AWS CDK, CDK8s, and CDKTF\",\n }}\n pageName=\"search\"\n >\n <Grid\n data-testid={testIds.page}\n gap={4}\n h=\"full\"\n maxW=\"100%\"\n px={{ base: 0, md: 6 }}\n py={6}\n templateColumns={{ base: \"1fr\", md: \"auto 1fr\" }}\n templateRows=\"1fr\"\n >\n {/* Filter Panel Desktop */}\n <FilterPanel />\n\n {/* Results, Info, and Controls */}\n <SearchResults />\n </Grid>\n </Page>\n );\n};\n"],"names":["SORT_RENDER_MAP","_SORT_RENDER_MAP","_defineProperty","CatalogSearchSort","NameAsc","NameDesc","PublishDateAsc","PublishDateDesc","DownloadsDesc","DownloadsAsc","searchEvent","_len","arguments","length","e","Array","_key","eventName","apply","concat","SEARCH_ANALYTICS","FILTERS","RESULTS","SEARCH","SORT","FilterHeading","_ref","name","hint","placement","useBreakpointValue","base","md","_jsxs","Flex","align","mb","children","_jsx","Heading","as","size","w","Popover","colorScheme","strategy","PopoverTrigger","ml","QuestionIcon","h","PopoverContent","bg","borderRadius","color","fontSize","mx","shadow","PopoverArrow","PopoverBody","Text","createTestIds","RadioFilter","dataTestid","checkedValue","value","onValueChange","options","Stack","spacing","RadioGroup","onChange","map","_ref2","display","dataEvent","Radio","testIds","filterItem","isTruncated","toNum","val","result","parseInt","parseQueryArray","queryString","decodeURIComponent","split","getParamFromUrl","key","window","URL","location","href","searchParams","get","useSearchParam","transform","qp","useQueryParams","useMemo","useCdkType","_useSearchParam","QUERY_PARAMS","CDK_TYPE","undefined","useCdkMajor","CDK_MAJOR","p","useKeywords","KEYWORDS","useLanguages","LANGUAGES","useSearchQuery","_useSearchParam2","SEARCH_QUERY","useSort","_useSearchParam3","useTags","TAGS","useUpdateSearchParam","push","useHistory","useCallback","offset","params","_objectWithoutProperties","_excluded","getSearchPath","_objectSpread","_getParamFromUrl","_getParamFromUrl2","query","keywords","cdkType","cdkMajor","cdkMajorParam","languages","OFFSET","sort","tags","getSearchUrlParams","CDKFilter","_cdkMajor$toString","updateSearch","searchAPI","useSearchContext","cdkOptions","cdkTypes","constructFrameworks","Object","entries","reduce","opts","_slicedToArray","meta","pkgCount","CDKTYPE_NAME_MAP","keys","majorsOptions","_cdkOptions$cdkType","majorVersions","_toConsumableArray","a","b","toString","_Fragment","cdkTypeFilter","type","values","cdkVersionFilter","major","majorNum","CheckboxItem","isDisabled","disabledHint","isChecked","Checkbox","Tooltip","hasArrow","label","CheckboxFilter","initialItemCount","checkedValues","collapse","useDisclosure","trackCustomEvent","useAnalytics","getOnChange","item","clickEvent","alwaysShow","showWhenExpanded","slice","isExpandible","direction","mt","_createElement","includes","Collapse","animateOpacity","in","isOpen","unmountOnExit","Button","fontWeight","leftIcon","ChevronUpIcon","ChevronDownIcon","onClick","onToggle","textAlign","variant","KeywordsFilter","keywordMap","keywordOptions","baseOptions","filter","_ref5","keyword","_ref7","keywordsNotInOptions","k","some","opt","languagesFilter","languageOptions","LANGUAGE_NAME_MAP","TEMP_SUPPORTED_LANGUAGES","has","l1","l2","LanguageFilter","lang","language","l","TagFilter","packageTags","useConfigValue","packageTagGroups","tagFilterGroups","_packageTags$filter","tagGroupsMap","Map","forEach","group","set","id","accum","tag","_tag$searchFilter","_accum$groupIdOrName$","_accum$groupIdOrName","groupIdOrName","searchFilter","groupBy","customGroup","entry","mapTagsToFilterGroups","Boolean","onTagsChange","t","getOnRadioTagChange","groupName","_tagFilterGroups$grou","_tagFilterGroups$grou2","groupTags","Set","filteredTags","_tagItems$find$id","_tagItems$find","filterType","tooltip","tagItems","sharedProps","find","TOP_OFFSET","FilterPanel","Card","filtersPanel","maxH","maxW","minW","overflow","pos","top","zIndex","ArrowButton","Icon","icon","props","borderColor","IconButton","disabled","GoToPage","pageLimit","_useState","useState","_useState2","inputValue","setInputValue","useEffect","onSubmit","preventDefault","Input","max","min","target","onFocus","PageControls","goForward","goBack","justify","prevPage","ChevronLeftIcon","goToPage","nextPage","ChevronRightIcon","SearchBar","setValue","SearchBarComponent","Em","Count","first","count","last","SearchDetails","_ref3","limit","filtered","hasResults","searchDetails","SortFilter","newSort","SortAndFilterDrawer","drawer","onOpen","rightIcon","Drawer","DrawerOverlay","DrawerContent","DrawerHeader","borderBottom","DrawerCloseButton","DrawerBody","pb","SortedBy","selected","Menu","MenuButton","sortButton","pl","pr","py","MenuList","sortDropdown","MenuItem","sortItem","listViews","PackageCardType","Wide","items","pkg","PackageCard","version","PackageList","memo","_ref$cardView","cardView","loading","Center","Spinner","View","displayName","SearchResults","o","_useCatalogResults","useCatalogResults","page","results","scrollTo","Page","title","description","pageName","px","lg","Box","Search","Grid","gap","templateColumns","templateRows"],"sourceRoot":""}
|