Skip to content

Commit 2fb8255

Browse files
densumeshskeptrunedev
authored andcommitted
bugfix: fix the demo page w/ serp
1 parent 8f46046 commit 2fb8255

5 files changed

Lines changed: 186 additions & 154 deletions

File tree

clients/ts-sdk/openapi.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20926,6 +20926,10 @@
2092620926
"SingleProductOptions": {
2092720927
"type": "object",
2092820928
"properties": {
20929+
"enabled": {
20930+
"type": "boolean",
20931+
"nullable": true
20932+
},
2092920933
"groupTrackingId": {
2093020934
"type": "string",
2093120935
"nullable": true

clients/ts-sdk/src/types.gen.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4174,6 +4174,7 @@ export type SidebarFilters = {
41744174
};
41754175

41764176
export type SingleProductOptions = {
4177+
enabled?: (boolean) | null;
41774178
groupTrackingId?: (string) | null;
41784179
productDescriptionHtml?: (string) | null;
41794180
productName?: (string) | null;

frontends/dashboard/src/pages/dataset/PublicPageSettings.tsx

Lines changed: 178 additions & 152 deletions
Original file line numberDiff line numberDiff line change
@@ -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,

server/src/handlers/page_handler.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ pub struct ButtonTrigger {
149149
#[derive(Serialize, Deserialize, Debug, Clone, ToSchema, Default)]
150150
#[serde(rename_all = "camelCase")]
151151
pub struct SingleProductOptions {
152+
enabled: Option<bool>,
152153
product_tracking_id: Option<String>,
153154
group_tracking_id: Option<String>,
154155
product_name: Option<String>,

0 commit comments

Comments
 (0)