diff --git a/clients/ts-sdk/openapi.json b/clients/ts-sdk/openapi.json
index 7a0018663a..f7dfa56869 100644
--- a/clients/ts-sdk/openapi.json
+++ b/clients/ts-sdk/openapi.json
@@ -11513,6 +11513,23 @@
}
]
},
+ "OpenGraphMetadata": {
+ "type": "object",
+ "properties": {
+ "description": {
+ "type": "string",
+ "nullable": true
+ },
+ "image": {
+ "type": "string",
+ "nullable": true
+ },
+ "title": {
+ "type": "string",
+ "nullable": true
+ }
+ }
+ },
"Organization": {
"type": "object",
"required": [
@@ -11820,6 +11837,18 @@
],
"nullable": true
},
+ "navLogoImgSrcUrl": {
+ "type": "string",
+ "nullable": true
+ },
+ "openGraphMetadata": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/OpenGraphMetadata"
+ }
+ ],
+ "nullable": true
+ },
"placeholder": {
"type": "string",
"nullable": true
diff --git a/clients/ts-sdk/src/types.gen.ts b/clients/ts-sdk/src/types.gen.ts
index 5da1649fa4..60b4eb0959 100644
--- a/clients/ts-sdk/src/types.gen.ts
+++ b/clients/ts-sdk/src/types.gen.ts
@@ -1824,6 +1824,12 @@ export type MultiQuery = {
export type NewChunkMetadataTypes = SlimChunkMetadataWithArrayTagSet | ChunkMetadata | ContentChunkMetadata;
+export type OpenGraphMetadata = {
+ description?: (string) | null;
+ image?: (string) | null;
+ title?: (string) | null;
+};
+
export type Organization = {
created_at: string;
deleted: number;
@@ -1885,6 +1891,8 @@ export type PublicPageParameters = {
defaultSearchMode?: (string) | null;
defaultSearchQueries?: Array<(string)> | null;
heroPattern?: ((HeroPattern) | null);
+ navLogoImgSrcUrl?: (string) | null;
+ openGraphMetadata?: ((OpenGraphMetadata) | null);
placeholder?: (string) | null;
problemLink?: (string) | null;
responsive?: (boolean) | null;
diff --git a/frontends/dashboard/src/pages/dataset/PublicPageSettings.tsx b/frontends/dashboard/src/pages/dataset/PublicPageSettings.tsx
index eed20f8c8d..aa105e02c7 100644
--- a/frontends/dashboard/src/pages/dataset/PublicPageSettings.tsx
+++ b/frontends/dashboard/src/pages/dataset/PublicPageSettings.tsx
@@ -78,25 +78,6 @@ const PublicPageControls = () => {
-
-
-
- }
- />
-
-
{
- setExtraParams("brandLogoImgSrcUrl", e.currentTarget.value);
- }}
- 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"
- />
-
+
+
+
+ }
+ />
+
+
{
+ setExtraParams("problemLink", e.currentTarget.value);
+ }}
+ 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"
+ />
+
-
-
+
+
}
/>
-
{
- setExtraParams("problemLink", e.currentTarget.value);
- }}
- 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"
- />
+
+
{
+ setExtraParams("brandLogoImgSrcUrl", e.currentTarget.value);
+ }}
+ class="block w-full grow 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"
+ />
+
+ {(url) => (
+
+
})
+
+ )}
+
+
+
+
+
+
+ }
+ />
+
+
+
{
+ setExtraParams("navLogoImgSrcUrl", e.currentTarget.value);
+ }}
+ class="block w-full grow 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"
+ />
+
+ {(url) => (
+
+
})
+
+ )}
+
+
-
+
+
-
+
Advanced Settings
@@ -604,6 +650,8 @@ const PublicPageControls = () => {
+
+
@@ -726,7 +774,7 @@ export const TabOptions = () => {
};
return (
-
0}>
+ 0}>
Tab Messages
@@ -845,3 +893,65 @@ const HtmlEditor = (props: {
/>
);
};
+
+export const OgOptions = () => {
+ const { extraParams, setExtraParams } = usePublicPage();
+ const [defaultDetailOpen] = createSignal(
+ !!extraParams.openGraphMetadata?.title ||
+ !!extraParams.openGraphMetadata?.image ||
+ !!extraParams.openGraphMetadata?.description,
+ );
+
+ return (
+
+ Open Graph
+
+
+
+ );
+};
diff --git a/server/src/data/models.rs b/server/src/data/models.rs
index 8fec7eb6f5..a899a5fef3 100644
--- a/server/src/data/models.rs
+++ b/server/src/data/models.rs
@@ -3000,6 +3000,9 @@ impl DatasetConfigurationDTO {
brand_logo_img_src_url: page_parameters_self
.brand_logo_img_src_url
.or(page_parameters_curr.brand_logo_img_src_url),
+ nav_logo_img_src_url: page_parameters_self
+ .nav_logo_img_src_url
+ .or(page_parameters_curr.nav_logo_img_src_url),
problem_link: page_parameters_self
.problem_link
.or(page_parameters_curr.problem_link),
@@ -3042,6 +3045,9 @@ impl DatasetConfigurationDTO {
tab_messages: page_parameters_self
.tab_messages
.or(page_parameters_curr.tab_messages),
+ open_graph_metadata: page_parameters_self
+ .open_graph_metadata
+ .or(page_parameters_curr.open_graph_metadata),
}),
},
}
diff --git a/server/src/handlers/page_handler.rs b/server/src/handlers/page_handler.rs
index 6c6dc10664..9b4a8ca7d9 100644
--- a/server/src/handlers/page_handler.rs
+++ b/server/src/handlers/page_handler.rs
@@ -126,6 +126,14 @@ pub struct PublicPageTabMessage {
show_component_code: bool,
}
+#[derive(Serialize, Deserialize, Debug, Clone, ToSchema, Default)]
+#[serde(rename_all = "camelCase")]
+pub struct OpenGraphMetadata {
+ title: Option,
+ image: Option,
+ description: Option,
+}
+
#[derive(Serialize, Deserialize, Debug, Clone, ToSchema, Default)]
#[serde(rename_all = "camelCase")]
pub struct PublicPageParameters {
@@ -155,6 +163,8 @@ pub struct PublicPageParameters {
#[serde(skip_serializing_if = "Option::is_none")]
pub brand_logo_img_src_url: Option,
#[serde(skip_serializing_if = "Option::is_none")]
+ pub nav_logo_img_src_url: Option,
+ #[serde(skip_serializing_if = "Option::is_none")]
pub problem_link: Option,
#[serde(skip_serializing_if = "Option::is_none")]
pub brand_color: Option,
@@ -180,6 +190,8 @@ pub struct PublicPageParameters {
pub hero_pattern: Option,
#[serde(skip_serializing_if = "Option::is_none")]
pub tab_messages: Option>,
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub open_graph_metadata: Option,
}
#[utoipa::path(
diff --git a/server/src/lib.rs b/server/src/lib.rs
index 64dbbd8d79..b743c47415 100644
--- a/server/src/lib.rs
+++ b/server/src/lib.rs
@@ -395,6 +395,7 @@ impl Modify for SecurityAddon {
operators::chunk_operator::HighlightStrategy,
handlers::stripe_handler::CreateSetupCheckoutSessionResPayload,
handlers::page_handler::PublicPageSearchOptions,
+ handlers::page_handler::OpenGraphMetadata,
data::models::DateRange,
data::models::FieldCondition,
data::models::Range,
diff --git a/server/src/public/navbar.html b/server/src/public/navbar.html
index 7da05ac1a4..290c60fbfe 100644
--- a/server/src/public/navbar.html
+++ b/server/src/public/navbar.html
@@ -5,7 +5,7 @@
+
+ {% if params.openGraphMetadata %}
+ {% if params.openGraphMetadata.title %}
+
+ {% endif %}
+
+
+ {% if params.openGraphMetadata.image %}
+
+ {% endif %}
+ {% if params.openGraphMetadata.description %}
+
+ {% endif %}
+ {% endif %}
+
diff --git a/server/static/output.css b/server/static/output.css
index e5fe021ba8..2315eb5f7e 100644
--- a/server/static/output.css
+++ b/server/static/output.css
@@ -584,10 +584,6 @@ video {
display: flex;
}
-.hidden {
- display: none;
-}
-
.w-full {
width: 100%;
}
@@ -620,22 +616,18 @@ video {
justify-content: center;
}
-.justify-between {
- justify-content: space-between;
-}
-
.gap-1 {
gap: 0.25rem;
}
-.gap-4 {
- gap: 1rem;
-}
-
.gap-2 {
gap: 0.5rem;
}
+.gap-4 {
+ gap: 1rem;
+}
+
.border {
border-width: 1px;
}