diff --git a/examples/mysite/title_page/subpage/water/science/generate_science_page.py b/examples/mysite/title_page/subpage/water/science/generate_science_page.py index bf41cdc5..f3f91992 100644 --- a/examples/mysite/title_page/subpage/water/science/generate_science_page.py +++ b/examples/mysite/title_page/subpage/water/science/generate_science_page.py @@ -125,7 +125,8 @@ grid_area="markdown", background_color="rgba(240, 240, 240, 0.7)", border_radius="10px", - padding="10px" + padding="10px", + show_element_name=False ) dashboard.add_geocoder_block( diff --git a/examples/mysite/title_page/subpage/water/science/index.html b/examples/mysite/title_page/subpage/water/science/index.html index 8c7f3999..083df093 100644 --- a/examples/mysite/title_page/subpage/water/science/index.html +++ b/examples/mysite/title_page/subpage/water/science/index.html @@ -604,7 +604,7 @@ /* Navigation Menu Styles */ .sivo-nav-btn { - position: absolute; + position: fixed; background: #ffffff; border: 1px solid #e2e8f0; border-radius: 8px; @@ -624,7 +624,7 @@ transform: translateY(-1px); } .sivo-nav-menu { - position: absolute; + position: fixed; background: #ffffff; border: 1px solid #e2e8f0; border-radius: 8px; @@ -818,7 +818,7 @@ .sivo-nav-btn { - position: absolute; + position: fixed; background: #ffffff; border: 1px solid #e2e8f0; border-radius: 8px; @@ -841,7 +841,7 @@ transform: translateY(-1px); } .sivo-nav-menu { - position: absolute; + position: fixed; background: #ffffff; border: 1px solid #e2e8f0; border-radius: 8px; @@ -1052,7 +1052,7 @@ -
+

# Water Science @@ -1674,20 +1674,24 @@

// Do NOT update in-grid Details panels if we opened a sidebar (OR behavior) detailsPanels.forEach(panel => { + const showName = panel.getAttribute('data-show-name') !== 'false'; const container = panel.querySelector('.sivo-details-content'); var safeName = window.DOMPurify ? window.DOMPurify.sanitize(params.name) : String(params.name || "").replace(//g, ">"); - container.innerHTML = `

${safeName}

Details opened in sidebar overlay.

`; + var headerHtml = showName ? `

${safeName}

` : ''; + container.innerHTML = `${headerHtml}

Details opened in sidebar overlay.

`; }); } else { // Update in-grid Details Panels detailsPanels.forEach(panel => { + const showName = panel.getAttribute('data-show-name') !== 'false'; const container = panel.querySelector('.sivo-details-content'); var safeName = window.DOMPurify ? window.DOMPurify.sanitize(params.name) : String(params.name || "").replace(//g, ">"); + var headerHtml = showName ? `

${safeName}

` : ''; if (tooltipContent) { var safeTooltip = window.DOMPurify ? window.DOMPurify.sanitize(tooltipContent) : tooltipContent; - container.innerHTML = `

${safeName}

${safeTooltip}`; + container.innerHTML = `${headerHtml}${safeTooltip}`; } else { - container.innerHTML = `

${safeName}

No additional details mapped.

`; + container.innerHTML = `${headerHtml}

No additional details mapped.

`; } }); } diff --git a/src/sivo/core/dashboard.py b/src/sivo/core/dashboard.py index e849ce93..730b82c2 100644 --- a/src/sivo/core/dashboard.py +++ b/src/sivo/core/dashboard.py @@ -142,7 +142,7 @@ def add_text_block(self, block_id: str, text: str, font_family: str = "Arial, sa self.add_html_block(block_id, html_content, col_span=col_span, slot=slot, grid_area=grid_area, overflow_visible=overflow_visible, min_height=min_height) - def add_details_panel(self, block_id: str, title: str = "Details", placeholder: str = "Select an item to view details.", col_span: int = 1, slot: str = "main", grid_area: Optional[str] = None, overflow_visible: bool = False, min_height: Optional[str] = None, background_color: Optional[str] = None, border_radius: Optional[str] = None, padding: Optional[str] = None): + def add_details_panel(self, block_id: str, title: str = "Details", placeholder: str = "Select an item to view details.", col_span: int = 1, slot: str = "main", grid_area: Optional[str] = None, overflow_visible: bool = False, min_height: Optional[str] = None, background_color: Optional[str] = None, border_radius: Optional[str] = None, padding: Optional[str] = None, show_element_name: bool = True): """ Adds a pre-built panel that automatically listens to SIVO canvas clicks and renders the clicked element's `html` (tooltip content) mapping. @@ -152,7 +152,8 @@ def add_details_panel(self, block_id: str, title: str = "Details", placeholder: "placeholder": placeholder, "background_color": background_color, "border_radius": border_radius, - "padding": padding + "padding": padding, + "show_element_name": show_element_name } self.layout_order.append({"type": "details", "id": block_id, "col_span": col_span, "slot": slot, "grid_area": grid_area, "overflow_visible": overflow_visible, "min_height": min_height}) diff --git a/src/sivo/runtime/templates/dashboard_blocks.html b/src/sivo/runtime/templates/dashboard_blocks.html index 009fa945..2554faa7 100644 --- a/src/sivo/runtime/templates/dashboard_blocks.html +++ b/src/sivo/runtime/templates/dashboard_blocks.html @@ -1043,7 +1043,7 @@

{{ title }}

{% elif block.type == "details" %} -
+
{{ details_panels[block.id].title }}

{{ details_panels[block.id].placeholder }}

@@ -1634,20 +1634,24 @@ // Do NOT update in-grid Details panels if we opened a sidebar (OR behavior) detailsPanels.forEach(panel => { + const showName = panel.getAttribute('data-show-name') !== 'false'; const container = panel.querySelector('.sivo-details-content'); var safeName = window.DOMPurify ? window.DOMPurify.sanitize(params.name) : String(params.name || "").replace(//g, ">"); - container.innerHTML = `

${safeName}

Details opened in sidebar overlay.

`; + var headerHtml = showName ? `

${safeName}

` : ''; + container.innerHTML = `${headerHtml}

Details opened in sidebar overlay.

`; }); } else { // Update in-grid Details Panels detailsPanels.forEach(panel => { + const showName = panel.getAttribute('data-show-name') !== 'false'; const container = panel.querySelector('.sivo-details-content'); var safeName = window.DOMPurify ? window.DOMPurify.sanitize(params.name) : String(params.name || "").replace(//g, ">"); + var headerHtml = showName ? `

${safeName}

` : ''; if (tooltipContent) { var safeTooltip = window.DOMPurify ? window.DOMPurify.sanitize(tooltipContent) : tooltipContent; - container.innerHTML = `

${safeName}

${safeTooltip}`; + container.innerHTML = `${headerHtml}${safeTooltip}`; } else { - container.innerHTML = `

${safeName}

No additional details mapped.

`; + container.innerHTML = `${headerHtml}

No additional details mapped.

`; } }); } diff --git a/src/sivo/templates/dashboards/analytics_dashboard.html b/src/sivo/templates/dashboards/analytics_dashboard.html index 74406e1b..affdb35a 100644 --- a/src/sivo/templates/dashboards/analytics_dashboard.html +++ b/src/sivo/templates/dashboards/analytics_dashboard.html @@ -301,7 +301,7 @@

{{ title }}

{% elif block.type == "metrics" %} -
+
{{ metrics_panels[block.id].title }}
{% for metric in metrics_panels[block.id].metrics %} @@ -340,7 +340,7 @@

{{ title }}

{% elif block.type == "details" %} -
+
{{ details_panels[block.id].title }}
@@ -349,7 +349,7 @@

{{ title }}

{% elif block.type == "metrics" %} -
+
{{ metrics_panels[block.id].title }}
{% for metric in metrics_panels[block.id].metrics %} diff --git a/src/sivo/templates/dashboards/bento_box.html b/src/sivo/templates/dashboards/bento_box.html index 277cb6b7..b9c5dfb4 100644 --- a/src/sivo/templates/dashboards/bento_box.html +++ b/src/sivo/templates/dashboards/bento_box.html @@ -275,7 +275,7 @@

{{ title }}

{% elif block.type == "details" %} -
+
{{ details_panels[block.id].title }}
@@ -284,7 +284,7 @@

{{ title }}

{% elif block.type == "metrics" %} -
+
{{ metrics_panels[block.id].title }}
{% for metric in metrics_panels[block.id].metrics %} diff --git a/src/sivo/templates/dashboards/cards_layout.html b/src/sivo/templates/dashboards/cards_layout.html index bfd2995b..156b2fad 100644 --- a/src/sivo/templates/dashboards/cards_layout.html +++ b/src/sivo/templates/dashboards/cards_layout.html @@ -205,7 +205,7 @@

{{ title }}

{% elif block.type == "details" %} -
+
{{ details_panels[block.id].title }}
@@ -214,7 +214,7 @@

{{ title }}

{% elif block.type == "metrics" %} -
+
{{ metrics_panels[block.id].title }}
{% for metric in metrics_panels[block.id].metrics %} diff --git a/src/sivo/templates/dashboards/dark_grid.html b/src/sivo/templates/dashboards/dark_grid.html index 009704d9..4a68f9dc 100644 --- a/src/sivo/templates/dashboards/dark_grid.html +++ b/src/sivo/templates/dashboards/dark_grid.html @@ -266,14 +266,14 @@

{{ title }}

{% elif block.type == "details" %} -
+
{{ details_panels[block.id].title }}

{{ details_panels[block.id].placeholder }}

{% elif block.type == "metrics" %} -
+
{{ metrics_panels[block.id].title }}
{% for metric in metrics_panels[block.id].metrics %} diff --git a/src/sivo/templates/dashboards/hero_and_four.html b/src/sivo/templates/dashboards/hero_and_four.html index d3f618bf..cc514be0 100644 --- a/src/sivo/templates/dashboards/hero_and_four.html +++ b/src/sivo/templates/dashboards/hero_and_four.html @@ -255,7 +255,7 @@

{{ title }}

{% elif block.type == "details" %} -
+
{{ details_panels[block.id].title }}
@@ -264,7 +264,7 @@

{{ title }}

{% elif block.type == "metrics" %} -
+
{{ metrics_panels[block.id].title }}
{% for metric in metrics_panels[block.id].metrics %} @@ -297,7 +297,7 @@

{{ title }}

{% elif block.type == "details" %} -
+
{{ details_panels[block.id].title }}
@@ -306,7 +306,7 @@

{{ title }}

{% elif block.type == "metrics" %} -
+
{{ metrics_panels[block.id].title }}
{% for metric in metrics_panels[block.id].metrics %} diff --git a/src/sivo/templates/dashboards/hero_top.html b/src/sivo/templates/dashboards/hero_top.html index 08baf6d1..f3f25b00 100644 --- a/src/sivo/templates/dashboards/hero_top.html +++ b/src/sivo/templates/dashboards/hero_top.html @@ -193,14 +193,14 @@

{{ title }}

{% elif block.type == "details" %} -
+
{{ details_panels[block.id].title }}

{{ details_panels[block.id].placeholder }}

{% elif block.type == "metrics" %} -
+
{{ metrics_panels[block.id].title }}
@@ -234,14 +234,14 @@

{{ title }}

{% elif block.type == "details" %} -
+
{{ details_panels[block.id].title }}

{{ details_panels[block.id].placeholder }}

{% elif block.type == "metrics" %} -
+
{{ metrics_panels[block.id].title }}
diff --git a/src/sivo/templates/dashboards/kanban_board.html b/src/sivo/templates/dashboards/kanban_board.html index 67af0963..64eb2335 100644 --- a/src/sivo/templates/dashboards/kanban_board.html +++ b/src/sivo/templates/dashboards/kanban_board.html @@ -236,14 +236,14 @@

{{ title }}

{% elif block.type == "details" %} -
+
{{ details_panels[block.id].title }}

{{ details_panels[block.id].placeholder }}

{% elif block.type == "metrics" %} -
+
{{ metrics_panels[block.id].title }}
{% for metric in metrics_panels[block.id].metrics %} diff --git a/src/sivo/templates/dashboards/minimal_grid.html b/src/sivo/templates/dashboards/minimal_grid.html index 079f9881..7c45b8ad 100644 --- a/src/sivo/templates/dashboards/minimal_grid.html +++ b/src/sivo/templates/dashboards/minimal_grid.html @@ -280,7 +280,7 @@

{{ title }}

{% elif block.type == "details" %} -
+
{{ details_panels[block.id].title }}
@@ -289,7 +289,7 @@

{{ title }}

{% elif block.type == "metrics" %} -
+
{{ metrics_panels[block.id].title }}
{% for metric in metrics_panels[block.id].metrics %} diff --git a/src/sivo/templates/dashboards/modern_glass.html b/src/sivo/templates/dashboards/modern_glass.html index d6660d74..615cb57a 100644 --- a/src/sivo/templates/dashboards/modern_glass.html +++ b/src/sivo/templates/dashboards/modern_glass.html @@ -274,7 +274,7 @@

{{ title }}

{% elif block.type == "details" %} -
+
{{ details_panels[block.id].title }}
@@ -283,7 +283,7 @@

{{ title }}

{% elif block.type == "metrics" %} -
+
{{ metrics_panels[block.id].title }}
{% for metric in metrics_panels[block.id].metrics %} diff --git a/src/sivo/templates/dashboards/quad_grid.html b/src/sivo/templates/dashboards/quad_grid.html index 58f3ac8e..3684f7fe 100644 --- a/src/sivo/templates/dashboards/quad_grid.html +++ b/src/sivo/templates/dashboards/quad_grid.html @@ -225,7 +225,7 @@

{{ title }}

{% elif block.type == "details" %} -
+
{{ details_panels[block.id].title }}
@@ -234,7 +234,7 @@

{{ title }}

{% elif block.type == "metrics" %} -
+
{{ metrics_panels[block.id].title }}
{% for metric in metrics_panels[block.id].metrics %} @@ -545,16 +545,20 @@ document.getElementById('sivo-sliding-sidebar').classList.add('active'); detailsPanels.forEach(panel => { + const showName = panel.getAttribute('data-show-name') !== 'false'; + const headerHtml = showName ? `

${params.name}

` : ''; const container = panel.querySelector('.sivo-details-content'); - container.innerHTML = `

${params.name}

Details opened in sidebar overlay.

`; + container.innerHTML = `${headerHtml}

Details opened in sidebar overlay.

`; }); } else { detailsPanels.forEach(panel => { + const showName = panel.getAttribute('data-show-name') !== 'false'; + const headerHtml = showName ? `

${params.name}

` : ''; const container = panel.querySelector('.sivo-details-content'); if (tooltipContent) { - container.innerHTML = `

${params.name}

${tooltipContent}`; + container.innerHTML = `${headerHtml}${tooltipContent}`; } else { - container.innerHTML = `

${params.name}

No additional details mapped.

`; + container.innerHTML = `${headerHtml}

No additional details mapped.

`; } }); } diff --git a/src/sivo/templates/dashboards/sidebar_left.html b/src/sivo/templates/dashboards/sidebar_left.html index f72fbc28..44c3faad 100644 --- a/src/sivo/templates/dashboards/sidebar_left.html +++ b/src/sivo/templates/dashboards/sidebar_left.html @@ -226,14 +226,14 @@

{{ title }}

{% elif block.type == "details" %} -
+
{{ details_panels[block.id].title }}

{{ details_panels[block.id].placeholder }}

{% elif block.type == "metrics" %} -
+
{{ metrics_panels[block.id].title }}
@@ -268,14 +268,14 @@

{{ title }}

{% elif block.type == "details" %} -
+
{{ details_panels[block.id].title }}

{{ details_panels[block.id].placeholder }}

{% elif block.type == "metrics" %} -
+
{{ metrics_panels[block.id].title }}
diff --git a/src/sivo/templates/dashboards/sidebar_right.html b/src/sivo/templates/dashboards/sidebar_right.html index 4197bfc3..82081458 100644 --- a/src/sivo/templates/dashboards/sidebar_right.html +++ b/src/sivo/templates/dashboards/sidebar_right.html @@ -226,14 +226,14 @@

{{ title }}

{% elif block.type == "details" %} -
+
{{ details_panels[block.id].title }}

{{ details_panels[block.id].placeholder }}

{% elif block.type == "metrics" %} -
+
{{ metrics_panels[block.id].title }}
@@ -268,14 +268,14 @@

{{ title }}

{% elif block.type == "details" %} -
+
{{ details_panels[block.id].title }}

{{ details_panels[block.id].placeholder }}

{% elif block.type == "metrics" %} -
+
{{ metrics_panels[block.id].title }}
diff --git a/src/sivo/templates/dashboards/split_screen.html b/src/sivo/templates/dashboards/split_screen.html index 79f5869f..dde2196c 100644 --- a/src/sivo/templates/dashboards/split_screen.html +++ b/src/sivo/templates/dashboards/split_screen.html @@ -232,14 +232,14 @@

{{ title }}

{% elif block.type == "details" %} -
+
{{ details_panels[block.id].title }}

{{ details_panels[block.id].placeholder }}

{% elif block.type == "metrics" %} -
+
{{ metrics_panels[block.id].title }}
{% for metric in metrics_panels[block.id].metrics %} @@ -271,14 +271,14 @@

{{ title }}

{% elif block.type == "details" %} -
+
{{ details_panels[block.id].title }}

{{ details_panels[block.id].placeholder }}

{% elif block.type == "metrics" %} -
+
{{ metrics_panels[block.id].title }}
{% for metric in metrics_panels[block.id].metrics %}