@@ -1666,178 +1666,205 @@ export const SingleProductOptions = () => {
16661666 const datasetContext = useContext ( DatasetContext ) ;
16671667 const trieve = useTrieve ( ) ;
16681668
1669+ const toggleEnableSingleProductView = ( checked : boolean ) => {
1670+ setExtraParams ( "singleProductOptions" , {
1671+ ...extraParams . singleProductOptions ,
1672+ enabled : checked ,
1673+ } ) ;
1674+
1675+ if ( checked ) {
1676+ setExtraParams ( "inline" , true ) ;
1677+ if ( extraParams . type !== "ecommerce" ) {
1678+ setExtraParams ( "type" , "ecommerce" ) ;
1679+ }
1680+ }
1681+ } ;
1682+
16691683 return (
16701684 < details class = "my-4" >
16711685 < summary class = "cursor-pointer text-sm font-medium" >
16721686 Single Product View
16731687 </ summary >
1674- < div class = "flex gap-4 pt-2" >
1675- < div class = "grow" >
1676- < label class = "block" > Product Tracking ID</ label >
1677- < input
1678- placeholder = "Tracking ID of the product to display"
1679- value = { extraParams . singleProductOptions ?. productTrackingId || "" }
1680- onInput = { ( e ) => {
1681- setExtraParams ( "singleProductOptions" , {
1682- ...extraParams . singleProductOptions ,
1683- productTrackingId : e . currentTarget . value ,
1684- } ) ;
1685- } }
1686- class = "block w-full rounded border border-neutral-300 px-3 py-1.5 shadow-sm placeholder:text-neutral-400 focus:outline-magenta-500 sm:text-sm sm:leading-6"
1687- />
1688- </ div >
1689- < div class = "grow" >
1690- < label class = "block" > Product Image URL</ label >
1691- < input
1692- placeholder = "URL of the product image to display"
1693- value = {
1694- extraParams . singleProductOptions ?. productPrimaryImageUrl || ""
1695- }
1696- onInput = { ( e ) => {
1697- setExtraParams ( "singleProductOptions" , {
1698- ...extraParams . singleProductOptions ,
1699- productPrimaryImageUrl : e . currentTarget . value ,
1700- } ) ;
1701- } }
1702- class = "block w-full rounded border border-neutral-300 px-3 py-1.5 shadow-sm placeholder:text-neutral-400 focus:outline-magenta-500 sm:text-sm sm:leading-6"
1703- />
1704- </ div >
1705- < div class = "grow" >
1706- < label class = "block" > Product Name</ label >
1707- < div class = "flex items-center gap-2" >
1688+ < div class = "flex items-center gap-2 py-2" >
1689+ < input
1690+ type = "checkbox"
1691+ checked = { extraParams . singleProductOptions ?. enabled || false }
1692+ onChange = { ( e ) => {
1693+ toggleEnableSingleProductView ( e . currentTarget . checked ) ;
1694+ } }
1695+ class = "block h-4 w-4 rounded border border-neutral-300 shadow-sm focus:outline-magenta-500"
1696+ />
1697+ < label class = "block" > Enable Single Product View</ label >
1698+ </ div >
1699+ < Show when = { extraParams . singleProductOptions ?. enabled } >
1700+ < div class = "flex gap-4 pt-2" >
1701+ < div class = "grow" >
1702+ < label class = "block" > Product Tracking ID</ label >
17081703 < input
1709- placeholder = "Name of the product to display"
1710- value = { extraParams . singleProductOptions ?. productName || "" }
1704+ placeholder = "Tracking ID of the product to display"
1705+ value = { extraParams . singleProductOptions ?. productTrackingId || "" }
17111706 onInput = { ( e ) => {
17121707 setExtraParams ( "singleProductOptions" , {
17131708 ...extraParams . singleProductOptions ,
1714- productName : e . currentTarget . value ,
1709+ productTrackingId : e . currentTarget . value ,
17151710 } ) ;
17161711 } }
17171712 class = "block w-full rounded border border-neutral-300 px-3 py-1.5 shadow-sm placeholder:text-neutral-400 focus:outline-magenta-500 sm:text-sm sm:leading-6"
17181713 />
1719- < button
1720- onClick = { ( ) => {
1721- setLoadingAutoFill ( true ) ;
1722- void trieve
1723- . fetch ( "/api/chunk_group/group_oriented_search" , "post" , {
1724- data : {
1725- query :
1726- extraParams . singleProductOptions ?. productName || "" ,
1727- page_size : 10 ,
1728- search_type : "fulltext" ,
1729- } ,
1730- datasetId : datasetContext . datasetId ( ) ,
1731- } )
1732- . then ( ( res ) => {
1733- const typedRes : SearchOverGroupsResponseBody =
1734- res as SearchOverGroupsResponseBody ;
1735- const firstGroup = typedRes . results ?. length
1736- ? typedRes . results [ 0 ]
1737- : null ;
1738- const firstChunk = firstGroup ?. chunks ?. length
1739- ? firstGroup . chunks [ 0 ]
1740- : null ;
1741- if ( ! firstGroup || ! firstChunk ) {
1742- return ;
1743- }
1744- setExtraParams ( "singleProductOptions" , {
1745- groupTrackingId : firstGroup . group . tracking_id ,
1746- productTrackingId : firstChunk . chunk . tracking_id ,
1747- productPrimaryImageUrl : firstChunk . chunk . image_urls
1748- ?. length
1749- ? firstChunk . chunk . image_urls [ 0 ]
1750- : "" ,
1751- productDescriptionHtml : (
1752- firstChunk . chunk as ChunkMetadata
1753- ) . chunk_html ,
1754- } ) ;
1755- setLoadingAutoFill ( false ) ;
1756- } ) ;
1714+ </ div >
1715+ < div class = "grow" >
1716+ < label class = "block" > Product Image URL</ label >
1717+ < input
1718+ placeholder = "URL of the product image to display"
1719+ value = {
1720+ extraParams . singleProductOptions ?. productPrimaryImageUrl || ""
1721+ }
1722+ onInput = { ( e ) => {
1723+ setExtraParams ( "singleProductOptions" , {
1724+ ...extraParams . singleProductOptions ,
1725+ productPrimaryImageUrl : e . currentTarget . value ,
1726+ } ) ;
17571727 } }
1758- disabled = { loadingAutoFill ( ) }
1759- class = "inline-flex min-w-[130px] justify-center rounded-md bg-magenta-500 px-3 py-2 text-sm font-semibold text-white shadow-sm hover:bg-magenta-700 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-magenta-900 disabled:animate-pulse"
1760- >
1761- { loadingAutoFill ( ) ? "Loading..." : "Auto Fill" }
1762- </ button >
1728+ class = "block w-full rounded border border-neutral-300 px-3 py-1.5 shadow-sm placeholder:text-neutral-400 focus:outline-magenta-500 sm:text-sm sm:leading-6"
1729+ />
1730+ </ div >
1731+ < div class = "grow" >
1732+ < label class = "block" > Product Name</ label >
1733+ < div class = "flex items-center gap-2" >
1734+ < input
1735+ placeholder = "Name of the product to display"
1736+ value = { extraParams . singleProductOptions ?. productName || "" }
1737+ onInput = { ( e ) => {
1738+ setExtraParams ( "singleProductOptions" , {
1739+ ...extraParams . singleProductOptions ,
1740+ productName : e . currentTarget . value ,
1741+ } ) ;
1742+ } }
1743+ class = "block w-full rounded border border-neutral-300 px-3 py-1.5 shadow-sm placeholder:text-neutral-400 focus:outline-magenta-500 sm:text-sm sm:leading-6"
1744+ />
1745+ < button
1746+ onClick = { ( ) => {
1747+ setLoadingAutoFill ( true ) ;
1748+ void trieve
1749+ . fetch ( "/api/chunk_group/group_oriented_search" , "post" , {
1750+ data : {
1751+ query :
1752+ extraParams . singleProductOptions ?. productName || "" ,
1753+ page_size : 10 ,
1754+ search_type : "fulltext" ,
1755+ } ,
1756+ datasetId : datasetContext . datasetId ( ) ,
1757+ } )
1758+ . then ( ( res ) => {
1759+ const typedRes : SearchOverGroupsResponseBody =
1760+ res as SearchOverGroupsResponseBody ;
1761+ const firstGroup = typedRes . results ?. length
1762+ ? typedRes . results [ 0 ]
1763+ : null ;
1764+ const firstChunk = firstGroup ?. chunks ?. length
1765+ ? firstGroup . chunks [ 0 ]
1766+ : null ;
1767+ if ( ! firstGroup || ! firstChunk ) {
1768+ return ;
1769+ }
1770+ setExtraParams ( "singleProductOptions" , {
1771+ groupTrackingId : firstGroup . group . tracking_id ,
1772+ productTrackingId : firstChunk . chunk . tracking_id ,
1773+ productPrimaryImageUrl : firstChunk . chunk . image_urls
1774+ ?. length
1775+ ? firstChunk . chunk . image_urls [ 0 ]
1776+ : "" ,
1777+ productDescriptionHtml : (
1778+ firstChunk . chunk as ChunkMetadata
1779+ ) . chunk_html ,
1780+ } ) ;
1781+ setLoadingAutoFill ( false ) ;
1782+ } ) ;
1783+ } }
1784+ disabled = { loadingAutoFill ( ) }
1785+ class = "inline-flex min-w-[130px] justify-center rounded-md bg-magenta-500 px-3 py-2 text-sm font-semibold text-white shadow-sm hover:bg-magenta-700 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-magenta-900 disabled:animate-pulse"
1786+ >
1787+ { loadingAutoFill ( ) ? "Loading..." : "Auto Fill" }
1788+ </ button >
1789+ </ div >
17631790 </ div >
17641791 </ div >
1765- </ div >
1766- < div class = "flex gap-4 pb-2 pt-2" >
1767- < div class = "grow" >
1768- < label class = "block" > Group Tracking ID</ label >
1769- < input
1770- placeholder = "Tracking ID of the product to display"
1771- value = { extraParams . singleProductOptions ?. groupTrackingId || "" }
1772- onInput = { ( e ) => {
1773- setExtraParams ( "singleProductOptions" , {
1774- ...extraParams . singleProductOptions ,
1775- groupTrackingId : e . currentTarget . value ,
1776- } ) ;
1777- } }
1778- class = "block w-full rounded border border-neutral-300 px-3 py-1.5 shadow-sm placeholder:text-neutral-400 focus:outline-magenta-500 sm:text-sm sm:leading-6"
1779- />
1780- </ div >
1781- < div class = "grow" >
1782- < div class = "flex items-center gap-1" >
1783- < label class = "block" for = "" >
1784- Product Questions
1785- </ label >
1786- < Tooltip
1787- tooltipText = "Example AI questions which may be asked about the product"
1788- body = { < FaRegularCircleQuestion class = "h-3 w-3 text-black" /> }
1792+ < div class = "flex gap-4 pb-2 pt-2" >
1793+ < div class = "grow" >
1794+ < label class = "block" > Group Tracking ID</ label >
1795+ < input
1796+ placeholder = "Tracking ID of the product to display"
1797+ value = { extraParams . singleProductOptions ?. groupTrackingId || "" }
1798+ onInput = { ( e ) => {
1799+ setExtraParams ( "singleProductOptions" , {
1800+ ...extraParams . singleProductOptions ,
1801+ groupTrackingId : e . currentTarget . value ,
1802+ } ) ;
1803+ } }
1804+ class = "block w-full rounded border border-neutral-300 px-3 py-1.5 shadow-sm placeholder:text-neutral-400 focus:outline-magenta-500 sm:text-sm sm:leading-6"
1805+ />
1806+ </ div >
1807+ < div class = "grow" >
1808+ < div class = "flex items-center gap-1" >
1809+ < label class = "block" for = "" >
1810+ Product Questions
1811+ </ label >
1812+ < Tooltip
1813+ tooltipText = "Example AI questions which may be asked about the product"
1814+ body = { < FaRegularCircleQuestion class = "h-3 w-3 text-black" /> }
1815+ />
1816+ </ div >
1817+ < MultiStringInput
1818+ placeholder = "What does it do?..."
1819+ value = { extraParams . singleProductOptions ?. productQuestions || [ ] }
1820+ onChange = { ( e ) => {
1821+ setExtraParams ( "singleProductOptions" , {
1822+ productQuestions : e ,
1823+ } ) ;
1824+ } }
1825+ addLabel = "Add Product Question"
1826+ addClass = "text-sm"
1827+ inputClass = "block w-full rounded border border-neutral-300 px-3 py-1.5 shadow-sm placeholder:text-neutral-400 focus:outline-magenta-500 sm:text-sm sm:leading-6"
17891828 />
17901829 </ div >
1791- < MultiStringInput
1792- placeholder = "What does it do?..."
1793- value = { extraParams . singleProductOptions ?. productQuestions || [ ] }
1794- onChange = { ( e ) => {
1795- setExtraParams ( "singleProductOptions" , {
1796- productQuestions : e ,
1797- } ) ;
1798- } }
1799- addLabel = "Add Product Question"
1800- addClass = "text-sm"
1801- inputClass = "block w-full rounded border border-neutral-300 px-3 py-1.5 shadow-sm placeholder:text-neutral-400 focus:outline-magenta-500 sm:text-sm sm:leading-6"
1802- />
18031830 </ div >
1804- </ div >
1805- < div class = "flex gap-4 pb-2 pt-2 " >
1806- < div class = "grow" >
1807- < label class = "block" > Product Description HTML </ label >
1808- < textarea
1809- cols = { 2 }
1810- placeholder = "Description of the page"
1811- value = {
1812- extraParams . singleProductOptions ?. productDescriptionHtml || ""
1813- }
1814- onInput = { ( e ) => {
1815- setExtraParams ( " singleProductOptions" , {
1816- ... extraParams . singleProductOptions ,
1817- productDescriptionHtml : e . currentTarget . value ,
1818- } ) ;
1819- setExtraParams ( "inline" , ! ! e . currentTarget . value ) ;
1820- } }
1821- class = "block w-full rounded border border-neutral-300 px-3 py-1.5 shadow-sm placeholder:text-neutral-400 focus:outline-magenta-500 sm:text-sm sm:leading-6"
1822- / >
1831+ < div class = "flex gap-4 pb-2 pt-2" >
1832+ < div class = "grow " >
1833+ < label class = "block" > Product Description HTML </ label >
1834+ < textarea
1835+ cols = { 2 }
1836+ placeholder = "Description of the page"
1837+ value = {
1838+ extraParams . singleProductOptions ?. productDescriptionHtml || ""
1839+ }
1840+ onInput = { ( e ) => {
1841+ setExtraParams ( "singleProductOptions" , {
1842+ ... extraParams . singleProductOptions ,
1843+ productDescriptionHtml : e . currentTarget . value ,
1844+ } ) ;
1845+ setExtraParams ( "inline" , ! ! e . currentTarget . value ) ;
1846+ } }
1847+ class = "block w-full rounded border border-neutral-300 px-3 py-1.5 shadow-sm placeholder:text-neutral-400 focus:outline-magenta-500 sm:text-sm sm:leading-6"
1848+ />
1849+ </ div >
18231850 </ div >
1824- </ div >
1825- < div class = "flex gap-4 pb-2 pt-2 " >
1826- < div class = "grow" >
1827- < label class = "block" > Recommendation Search Query </ label >
1828- < input
1829- placeholder = "Search query to use for recommendations"
1830- value = { extraParams . singleProductOptions ?. recSearchQuery || "" }
1831- onInput = { ( e ) => {
1832- setExtraParams ( " singleProductOptions" , {
1833- ... extraParams . singleProductOptions ,
1834- recSearchQuery : e . currentTarget . value ,
1835- } ) ;
1836- } }
1837- class = "block w-full rounded border border-neutral-300 px-3 py-1.5 shadow-sm placeholder:text-neutral-400 focus:outline-magenta-500 sm:text-sm sm:leading-6"
1838- / >
1851+ < div class = "flex gap-4 pb-2 pt-2" >
1852+ < div class = "grow " >
1853+ < label class = "block" > Recommendation Search Query </ label >
1854+ < input
1855+ placeholder = "Search query to use for recommendations"
1856+ value = { extraParams . singleProductOptions ?. recSearchQuery || "" }
1857+ onInput = { ( e ) => {
1858+ setExtraParams ( "singleProductOptions" , {
1859+ ... extraParams . singleProductOptions ,
1860+ recSearchQuery : e . currentTarget . value ,
1861+ } ) ;
1862+ } }
1863+ class = "block w-full rounded border border-neutral-300 px-3 py-1.5 shadow-sm placeholder:text-neutral-400 focus:outline-magenta-500 sm:text-sm sm:leading-6"
1864+ />
1865+ </ div >
18391866 </ div >
1840- </ div >
1867+ </ Show >
18411868 </ details >
18421869 ) ;
18431870} ;
@@ -2168,7 +2195,6 @@ export const SerpPageOptions = () => {
21682195 display : checked ,
21692196 } ) ;
21702197
2171- setExtraParams ( "inline" , checked ) ;
21722198 setExtraParams (
21732199 "defaultSearchMode" ,
21742200 checked ? "search" : extraParams . defaultSearchMode ,
0 commit comments