Spaces:
Running
Running
File size: 8,207 Bytes
d65e306 c0c37aa d65e306 c0c37aa d65e306 c0c37aa d65e306 8b57c34 d65e306 8b57c34 c0c37aa d65e306 c0c37aa d65e306 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 |
"""Contains custom components used within a dashboard."""
from typing import List, Literal
import black
import dash_bootstrap_components as dbc
import vizro.models as vm
from dash import dcc, html
from pydantic import PrivateAttr
from vizro.models import Action
from vizro.models._action._actions_chain import _action_validator_factory
from vizro.models._models_utils import _log_call
class UserPromptTextArea(vm.VizroBaseModel):
"""Input component `UserPromptTextArea`.
Based on the underlying [`dcc.Input`](https://dash.plotly.com/dash-core-components/input).
Args:
type (Literal["user_input"]): Defaults to `"user_text_area"`.
title (str): Title to be displayed. Defaults to `""`.
placeholder (str): Default text to display in input field. Defaults to `""`.
actions (Optional[List[Action]]): Defaults to `[]`.
"""
type: Literal["user_text_area"] = "user_text_area"
actions: List[Action] = [] # noqa: RUF012
_set_actions = _action_validator_factory("value")
@_log_call
def build(self):
"""Returns the text area component to display vizro-ai code output."""
return html.Div(
children=[
dcc.Textarea(
id=self.id,
placeholder="Describe the chart you want to create, e.g. "
"'Visualize the life expectancy per continent.'",
)
]
)
class UserUpload(vm.VizroBaseModel):
"""Component enabling data upload.
Args:
type (Literal["upload"]): Defaults to `"upload"`.
title (str): Title to be displayed.
actions (List[Action]): See [`Action`][vizro.models.Action]. Defaults to `[]`.
"""
type: Literal["upload"] = "upload"
actions: List[Action] = [] # noqa: RUF012
# 'contents' property is input to custom action callback
_input_property: str = PrivateAttr("contents")
# change in 'contents' property of Upload component triggers the actions
_set_actions = _action_validator_factory("contents")
def build(self):
"""Returns the upload component for data upload."""
return html.Div(
[
dcc.Upload(
id=self.id,
children=html.Div(
["Drag and Drop or ", html.A("Select Files")], style={"fontColor": "rgba(255, 255, 255, 0.6)"}
),
),
]
)
class CodeClipboard(vm.VizroBaseModel):
"""Code snippet with a copy to clipboard button."""
type: Literal["code_clipboard"] = "code_clipboard"
code: str = ""
language: str = "python"
def build(self):
"""Returns the code clipboard component inside a output text area."""
code = black.format_str(self.code, mode=black.Mode(line_length=120))
code = code.strip("'\"")
markdown_code = "\n".join(["```python", code, "```"])
return html.Div(
[
dcc.Clipboard(target_id=f"{self.id}-code-markdown", className="code-clipboard"),
dcc.Markdown(markdown_code, id=f"{self.id}-code-markdown"),
],
className="code-clipboard-container",
)
class MyDropdown(vm.Dropdown):
"""Custom dropdown component."""
type: Literal["my_dropdown"] = "my_dropdown"
def build(self):
"""Returns custom dropdown component that cannot be cleared."""
dropdown_build_obj = super().build()
dropdown_build_obj.id = f"{self.id}_outer_div"
dropdown_build_obj.children[1].clearable = False
return dropdown_build_obj
class Modal(vm.VizroBaseModel):
"""Modal to convey warning message"""
type: Literal["modal"] = "modal"
def build(self):
"""Returns the modal component."""
return dbc.Modal(
# id=self.id,
children=[
dbc.ModalHeader(children=dcc.Markdown("""# Warning""")),
dbc.ModalBody(
children=dcc.Markdown(
"""### Do NOT upload any sensitive or personally identifying data.
#### Reasoning:
This space is hosted publicly running one server in a single container. Further this UI executes dynamically created code on the server. It thus
cannot guarantee the security of your data. In addition it sends the user query and the data to the chosen LLM vendor API. This is not an exhaustive list.
#### Alternatives:
If sending your query and data to a LLM is acceptable, you can [pull and run this image locally](?docker=true). This will avoid sharing
an instance with others.
Always exercise caution when sharing data online and understand your responsibilities regarding data privacy and security.
"""
)
),
],
size="l",
is_open=True,
)
class OffCanvas(vm.VizroBaseModel):
"""OffCanvas component for settings."""
type: Literal["offcanvas"] = "offcanvas"
options: List[str]
value: str
def build(self):
"""Returns the off canvas component for settings."""
input_groups = html.Div(
[
dbc.InputGroup(
[
dbc.InputGroupText("API Key"),
dbc.Input(placeholder="API key", type="password", id=f"{self.id}-api-key"),
html.Div(
dbc.Checklist(
id=f"{self.id}-api-key-toggle",
options=[{"label": "", "value": False}],
switch=True,
inline=True,
),
id="toggle-div-api-key",
),
],
className="mb-3",
),
dbc.InputGroup(
[
dbc.InputGroupText("API base"),
dbc.Input(placeholder="(optional) API base", type="password", id=f"{self.id}-api-base"),
html.Div(
dbc.Checklist(
id=f"{self.id}-api-base-toggle",
options=[{"label": "", "value": False}],
switch=True,
inline=True,
),
id="toggle-div-api-base",
),
],
className="mb-3",
),
dbc.InputGroup(
[
dbc.InputGroupText("Choose your vendor"),
dbc.Select(options=self.options, value=self.value, id=f"{self.id}-dropdown"),
],
className="mb-3",
),
],
className="mb-3",
)
offcanvas = dbc.Offcanvas(
id=self.id,
children=[
html.Div(
children=[
input_groups,
]
)
],
title="Settings",
is_open=True,
)
return offcanvas
class MyPage(vm.Page):
"""Custom page."""
type: Literal["my_page"] = "my_page"
def pre_build(self):
"""Overwriting pre_build."""
pass
class Icon(vm.VizroBaseModel):
"""Icon component for settings."""
type: Literal["icon"] = "icon"
def build(self):
"""Returns the icon for api settings."""
return html.Div(
children=[html.Span("settings", className="material-symbols-outlined", id=self.id)],
className="settings-div",
)
class CustomDashboard(vm.Dashboard):
"""Custom Dashboard model."""
def build(self):
"""Returns custom dashboard."""
dashboard_build_obj = super().build()
dashboard_build_obj.children.append(dcc.Store(id="data-store-id", storage_type="session"))
dashboard_build_obj.children.append(dcc.Store(id="outputs-store-id", storage_type="session"))
return dashboard_build_obj
|