175 lines
6.7 KiB
Python
175 lines
6.7 KiB
Python
from dash import dcc, html
|
||
from pkg.config import interval_options, days_options, render_data
|
||
|
||
|
||
def layout_config(app):
|
||
# Dash app layout (unchanged except default days value)
|
||
app.layout = html.Div([
|
||
# Left sidebar with clock button and tooltip (unchanged)
|
||
html.Div(
|
||
id='clock-container',
|
||
children=[
|
||
html.Div(
|
||
id='clock-button',
|
||
children='🕒',
|
||
style={
|
||
'fontSize': '24px',
|
||
'cursor': 'pointer',
|
||
'padding': '5px',
|
||
}
|
||
),
|
||
html.Div(
|
||
id='clock-tooltip',
|
||
children=[
|
||
html.Div(id='pst-clock')
|
||
],
|
||
style={
|
||
'position': 'absolute',
|
||
'left': '35px',
|
||
'top': '0px',
|
||
'backgroundColor': 'rgba(0, 0, 0, 0.8)',
|
||
'color': 'white',
|
||
'padding': '10px',
|
||
'borderRadius': '5px',
|
||
'fontSize': '14px',
|
||
'display': 'none',
|
||
'whiteSpace': 'nowrap'
|
||
}
|
||
),
|
||
html.Div(
|
||
id='play-button',
|
||
children='▶️',
|
||
n_clicks=0,
|
||
style={
|
||
'fontSize': '24px',
|
||
'cursor': 'pointer',
|
||
'padding': '5px',
|
||
'marginTop': '10px'
|
||
}
|
||
),
|
||
html.Div(
|
||
id='play-tooltip',
|
||
children=[],
|
||
style={
|
||
'position': 'absolute',
|
||
'left': '35px',
|
||
'top': '40px',
|
||
'backgroundColor': 'rgba(0, 0, 0, 0.8)',
|
||
'color': 'white',
|
||
'padding': '10px',
|
||
'borderRadius': '5px',
|
||
'fontSize': '14px',
|
||
'display': 'none',
|
||
'whiteSpace': 'nowrap'
|
||
}
|
||
),
|
||
# 新增按钮和提示框
|
||
html.Div(
|
||
id='info-button',
|
||
children='ℹ️',
|
||
style={
|
||
'fontSize': '24px',
|
||
'cursor': 'pointer',
|
||
'padding': '5px',
|
||
'marginTop': '10px'
|
||
}
|
||
),
|
||
html.Div(
|
||
id='info-tooltip',
|
||
children='这是一个信息按钮示例', # 默认显示的信息
|
||
style={
|
||
'position': 'absolute',
|
||
'left': '35px',
|
||
'top': '80px', # 调整位置,避免与其他 tooltip 重叠
|
||
'backgroundColor': 'rgba(0, 0, 0, 0.8)',
|
||
'color': 'white',
|
||
'padding': '10px',
|
||
'borderRadius': '5px',
|
||
'fontSize': '14px',
|
||
'display': 'none',
|
||
'whiteSpace': 'nowrap'
|
||
}
|
||
),
|
||
html.A(
|
||
href='https://x.com/elonmusk',
|
||
target='_blank',
|
||
children=[
|
||
html.Img(
|
||
src='https://pbs.twimg.com/profile_images/1893803697185910784/Na5lOWi5_400x400.jpg',
|
||
style={
|
||
'height': '24px', # Matches fontSize of other buttons
|
||
'width': '24px',
|
||
'cursor': 'pointer',
|
||
'padding': '5px',
|
||
'marginTop': '10px'
|
||
}
|
||
)
|
||
]
|
||
)
|
||
],
|
||
style={
|
||
'position': 'fixed',
|
||
'left': '10px',
|
||
'top': '50%',
|
||
'transform': 'translateY(-50%)',
|
||
'zIndex': 1000
|
||
}
|
||
),
|
||
# Main content
|
||
html.Div([
|
||
html.H1("Elon Musk Tweet Time Analysis (EST)"),
|
||
html.Div(id='date-picker-container', children=[
|
||
dcc.Dropdown(
|
||
id='multi-date-picker',
|
||
options=[{'label': str(date), 'value': str(date)} for date in render_data.all_dates],
|
||
value=render_data.default_date,
|
||
multi=True,
|
||
searchable=True,
|
||
placeholder="Search and select dates (YYYY-MM-DD)",
|
||
style={'width': '100%'}
|
||
)
|
||
]),
|
||
dcc.Dropdown(
|
||
id='multi-interval-picker',
|
||
options=interval_options,
|
||
value=10,
|
||
style={'width': '50%', 'marginTop': '10px'}
|
||
),
|
||
html.Div(id='days-display-container', style={'display': 'none'}, children=[
|
||
dcc.Dropdown(
|
||
id='days-display-picker',
|
||
options=days_options,
|
||
value=30, # Default changed to 30 since 1 is removed
|
||
style={'width': '50%', 'marginTop': '10px'}
|
||
)
|
||
]),
|
||
html.Div(id='multi-day-warning', style={'color': 'red', 'margin': '10px'}),
|
||
dcc.Checklist(
|
||
id='time-zone-checklist',
|
||
options=[
|
||
{'label': 'California Time (PST)', 'value': 'PST'},
|
||
{'label': 'Texas Time (CST)', 'value': 'CST'}
|
||
],
|
||
value=['PST'],
|
||
style={'margin': '10px'}
|
||
),
|
||
html.Div(id='multi-tweet-summary', style={'fontSize': '20px', 'margin': '10px'}),
|
||
dcc.Tabs(id='tabs', value='line', children=[
|
||
dcc.Tab(label='Line', value='line'),
|
||
dcc.Tab(label='Heatmap', value='heatmap'),
|
||
dcc.Tab(label='Heatmap(1-day)', value='one_day_heatmap'),
|
||
]),
|
||
html.Div(id='tabs-content'),
|
||
dcc.Input(
|
||
id='target-input',
|
||
type='number',
|
||
placeholder='输入 Target 值',
|
||
value=None,
|
||
style={'marginTop': '10px', 'width': '50%'}
|
||
),
|
||
], style={'marginLeft': '50px'}),
|
||
|
||
dcc.Interval(id='clock-interval', interval=1000, n_intervals=0)
|
||
])
|
||
return app
|