| from shared import app_dir |
| from utils import create_nav_button |
| from shiny import App, ui |
| import shinyswatch |
| from server import create_server, q1, q2, q3, q4 |
| import numpy as np |
| from shinywidgets import output_widget, render_widget |
|
|
| app_ui = ui.page_fluid( |
| ui.tags.style(""" |
| .big-table { |
| font-size: 22px; /* Increase font size */ |
| padding: 25px; /* Add padding for spacing */ |
| width: 100%; /* Make the card take full width */ |
| overflow-x: auto; /* Enable horizontal scrolling if needed */ |
| } |
| .big-table table { |
| width: 100%; /* Make table take full width within card */ |
| } |
| .title-logo-container { |
| display: flex; |
| align-items: center; |
| gap: 15px; /* Add some space between the logo and title */ |
| } |
| .title-logo-container img { |
| max-height: 50px; /* Adjust logo size */ |
| height: auto; |
| } |
| .title-logo-container h1 { |
| margin: 0; |
| font-size: 28px; /* Adjust title font size */ |
| font-weight: bold; /* Make it bold */ |
| } |
| """), |
| ui.page_fillable( |
| ui.page_sidebar( |
| ui.sidebar( |
| ui.div( |
| ui.output_image("clientlogo"), |
| style="display: inline-block; overflow: hidden; max-height: 75px; width: 90%;" |
| ), |
| ui.card( |
| create_nav_button( |
| button_icon="house", |
| button_label_text="Homepage", |
| button_link="https://rsginc-nvtbs.hf.space", |
| |
| ), |
| |
| create_nav_button( |
| button_icon = "route", |
| button_label_text = "Origin-Destination", |
| button_link = "https://rsginc-nvtbsod.hf.space", |
| button_cls="btn btn-secondary" |
| ), |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| create_nav_button( |
| button_icon = "house-laptop", |
| button_label_text = "Home-Work Location", |
| button_link = "https://rsginc-nvtbsdwell.hf.space", |
| |
| ), |
| |
| |
| |
| |
| |
| |
| |
| create_nav_button( |
| button_icon = "clipboard-question", |
| button_label_text = "Survey", |
| button_link = "https://rsginc-nvtbssurvey.hf.space" |
| ) |
| ), |
| ui.div( |
| ui.output_image("rsglogo"), |
| style="display: inline-block; overflow: hidden; max-height: 40px; width: 50%;" |
| ), |
| open="desktop", |
| ), |
| ui.include_css(app_dir / "styles.css"), |
| ui.div( |
| ui.tags.div( |
| ui.h1("NAPA Valley Travels", style="margin: 0; font-size: 28px; font-weight: bold;"), |
| class_="title-logo-container" |
| ), |
| style="padding-bottom: 20px;" |
| ), |
| |
| ui.card( |
| ui.tags.h5("Travel Trends in NAPA Valley", style="text-align: center; font-weight: bold; margin-bottom: 15px;"), |
| ui.navset_card_underline( |
| ui.nav_panel( |
| "OD Map", |
| ui.tags.div( |
| ui.HTML(""" |
| <div class='tableauPlaceholder' id='viz1737474527739' style='position: relative'> |
| <noscript> |
| <a href='#'> |
| <img alt='OD ' src='https://public.tableau.com/static/images/QK/QKbdPUgUZcnPzx2zlYiGlcG_DpGX6bB/OD/1_rss.png' style='border: none' /> |
| </a> |
| </noscript> |
| <object class='tableauViz' style='display:none;'> |
| <param name='host_url' value='https%3A%2F%2Fpublic.tableau.com%2F' /> |
| <param name='embed_code_version' value='3' /> |
| <param name='site_root' value='' /> |
| <param name='name' value='QKbdPUgUZcnPzx2zlYiGlcG_DpGX6bB/OD' /> |
| <param name='tabs' value='no' /> |
| <param name='toolbar' value='yes' /> |
| <param name='static_image' value='https://public.tableau.com/static/images/QK/QKbdPUgUZcnPzx2zlYiGlcG_DpGX6bB/OD/1.png' /> |
| <param name='animate_transition' value='yes' /> |
| <param name='display_static_image' value='yes' /> |
| <param name='display_spinner' value='yes' /> |
| <param name='display_overlay' value='yes' /> |
| <param name='display_count' value='yes' /> |
| <param name='language' value='en-US' /> |
| <param name='filter' value='publish=yes' /> |
| </object> |
| </div> |
| <script type='text/javascript'> |
| var divElement = document.getElementById('viz1737474527739'); |
| var vizElement = divElement.getElementsByTagName('object')[0]; |
| if (divElement.offsetWidth > 800) { |
| vizElement.style.width='1366px';vizElement.style.height='795px'; |
| } else if (divElement.offsetWidth > 500) { |
| vizElement.style.width='1366px';vizElement.style.height='795px'; |
| } else { |
| vizElement.style.width='100%';vizElement.style.height='727px'; |
| } |
| var scriptElement = document.createElement('script'); |
| scriptElement.src = 'https://public.tableau.com/javascripts/api/viz_v1.js'; |
| vizElement.parentNode.insertBefore(scriptElement, vizElement); |
| </script> |
| """ |
| ), |
| ) |
| ), |
| ui.nav_panel( |
| "Trip distribution", |
| ui.tags.div( |
| ui.HTML(""" |
| <div class='tableauPlaceholder' id='viz1737489104795' style='position: relative'><noscript><a href='#'><img alt='ALL ' src='https://public.tableau.com/static/images/jL/jLOgmDzZqy_TqH2SEbAnEk_4pfd8Y7_ALL/ALL/1_rss.png' style='border: none' /></a></noscript><object class='tableauViz' style='display:none;'><param name='host_url' value='https%3A%2F%2Fpublic.tableau.com%2F' /> <param name='embed_code_version' value='3' /> <param name='site_root' value='' /><param name='name' value='jLOgmDzZqy_TqH2SEbAnEk_4pfd8Y7_ALL/ALL' /><param name='tabs' value='no' /><param name='toolbar' value='yes' /><param name='static_image' value='https://public.tableau.com/static/images/jL/jLOgmDzZqy_TqH2SEbAnEk_4pfd8Y7_ALL/ALL/1.png' /> <param name='animate_transition' value='yes' /><param name='display_static_image' value='yes' /><param name='display_spinner' value='yes' /><param name='display_overlay' value='yes' /><param name='display_count' value='yes' /><param name='language' value='en-US' /><param name='filter' value='publish=yes' /></object></div> <script type='text/javascript'> var divElement = document.getElementById('viz1737489104795'); var vizElement = divElement.getElementsByTagName('object')[0]; if ( divElement.offsetWidth > 800 ) { vizElement.style.width='1366px';vizElement.style.height='795px';} else if ( divElement.offsetWidth > 500 ) { vizElement.style.width='1366px';vizElement.style.height='795px';} else { vizElement.style.width='100%';vizElement.style.height='1577px';} var scriptElement = document.createElement('script'); scriptElement.src = 'https://public.tableau.com/javascripts/api/viz_v1.js'; vizElement.parentNode.insertBefore(scriptElement, vizElement); </script> |
| """ |
| ), |
| ), |
| ), |
| ui.nav_panel( |
| "School Trips", |
| ui.tags.div( |
| ui.HTML(""" |
| <div class='tableauPlaceholder' id='viz1737489301212' style='position: relative'><noscript><a href='#'><img alt='School ' src='https://public.tableau.com/static/images/jL/jLOgmDzZqy_TqH2SEbAnEk_4pfd8Y7_School/School/1_rss.png' style='border: none' /></a></noscript><object class='tableauViz' style='display:none;'><param name='host_url' value='https%3A%2F%2Fpublic.tableau.com%2F' /> <param name='embed_code_version' value='3' /> <param name='site_root' value='' /><param name='name' value='jLOgmDzZqy_TqH2SEbAnEk_4pfd8Y7_School/School' /><param name='tabs' value='no' /><param name='toolbar' value='yes' /><param name='static_image' value='https://public.tableau.com/static/images/jL/jLOgmDzZqy_TqH2SEbAnEk_4pfd8Y7_School/School/1.png' /> <param name='animate_transition' value='yes' /><param name='display_static_image' value='yes' /><param name='display_spinner' value='yes' /><param name='display_overlay' value='yes' /><param name='display_count' value='yes' /><param name='language' value='en-US' /><param name='filter' value='publish=yes' /></object></div> <script type='text/javascript'> var divElement = document.getElementById('viz1737489301212'); var vizElement = divElement.getElementsByTagName('object')[0]; if ( divElement.offsetWidth > 800 ) { vizElement.style.width='1366px';vizElement.style.height='795px';} else if ( divElement.offsetWidth > 500 ) { vizElement.style.width='1366px';vizElement.style.height='795px';} else { vizElement.style.width='100%';vizElement.style.height='1627px';} var scriptElement = document.createElement('script'); scriptElement.src = 'https://public.tableau.com/javascripts/api/viz_v1.js'; vizElement.parentNode.insertBefore(scriptElement, vizElement); </script> |
| """ |
| ), |
| ), |
| ), |
| ui.nav_panel( |
| "Winery Trips", |
| ui.tags.div( |
| ui.HTML(""" |
| <div class='tableauPlaceholder' id='viz1737489606286' style='position: relative'><noscript><a href='#'><img alt='Winery ' src='https://public.tableau.com/static/images/jL/jLOgmDzZqy_TqH2SEbAnEk_4pfd8Y7_Winery/Winery/1_rss.png' style='border: none' /></a></noscript><object class='tableauViz' style='display:none;'><param name='host_url' value='https%3A%2F%2Fpublic.tableau.com%2F' /> <param name='embed_code_version' value='3' /> <param name='site_root' value='' /><param name='name' value='jLOgmDzZqy_TqH2SEbAnEk_4pfd8Y7_Winery/Winery' /><param name='tabs' value='no' /><param name='toolbar' value='yes' /><param name='static_image' value='https://public.tableau.com/static/images/jL/jLOgmDzZqy_TqH2SEbAnEk_4pfd8Y7_Winery/Winery/1.png' /> <param name='animate_transition' value='yes' /><param name='display_static_image' value='yes' /><param name='display_spinner' value='yes' /><param name='display_overlay' value='yes' /><param name='display_count' value='yes' /><param name='language' value='en-US' /><param name='filter' value='publish=yes' /></object></div> <script type='text/javascript'> var divElement = document.getElementById('viz1737489606286'); var vizElement = divElement.getElementsByTagName('object')[0]; if ( divElement.offsetWidth > 800 ) { vizElement.style.width='1366px';vizElement.style.height='795px';} else if ( divElement.offsetWidth > 500 ) { vizElement.style.width='1366px';vizElement.style.height='795px';} else { vizElement.style.width='100%';vizElement.style.height='1577px';} var scriptElement = document.createElement('script'); scriptElement.src = 'https://public.tableau.com/javascripts/api/viz_v1.js'; vizElement.parentNode.insertBefore(scriptElement, vizElement); </script> |
| """ |
| ), |
| ), |
| ), |
| ui.nav_panel( |
| "Travel Patterns", |
| ui.tags.h3("Select a Question to View Travel Patterns", style="text-align: center;"), |
| |
| ui.input_radio_buttons( |
| "data_year_selector1", |
| label="Select Data Year:", |
| choices=["Fall 2014", "Fall 2018", "Fall 2024"], |
| selected="Fall 2024", |
| inline=True |
| ), |
| ui.tags.br(), |
| |
| ui.input_select( |
| "question_selector1", |
| label="Select a Question:", |
| choices=list(q1.keys()), |
| selected="What types of trips are occurring within Napa County?", |
| ), |
| ui.tags.br(), |
| |
| |
| |
| |
| |
| |
| |
| ui.output_table("table_title1"), |
| ui.output_table("trip_table1"), |
| ), |
| ui.nav_panel( |
| "Travel Characteristics", |
| ui.tags.h3("Select a Question to View Travel Characteristics", style="text-align: center;"), |
| |
| ui.input_radio_buttons( |
| "data_year_selector2", |
| label="Select Data Year:", |
| choices=["Fall 2014", "Fall 2018", "Fall 2024"], |
| selected="Fall 2024", |
| inline=True |
| ), |
| ui.tags.br(), |
| |
| ui.input_select( |
| "question_selector2", |
| label="Select a Question:", |
| choices=list(q2.keys()), |
| selected="What types of trips are occurring within Napa County?", |
| ), |
| ui.tags.br(), |
| |
| |
| |
| |
| |
| |
| |
| ui.output_table("table_title2"), |
| ui.output_table("trip_table2"), |
| ), |
| ui.nav_panel( |
| "Roadway Segments", |
| ui.tags.h3("Select a Question to View Travel Characteristics for Roadway Segments", style="text-align: center;"), |
| |
| ui.input_radio_buttons( |
| "data_year_selector3", |
| label="Select Data Year:", |
| choices=["Fall 2014", "Fall 2018", "Fall 2024"], |
| selected="Fall 2024", |
| inline=True |
| ), |
| ui.tags.br(), |
| |
| ui.input_select( |
| "question_selector3", |
| label="Select a Question:", |
| choices=list(q3.keys()), |
| selected="What types of trips are occurring within Napa County?", |
| ), |
| ui.tags.br(), |
| |
| |
| |
| |
| |
| |
| |
| ui.output_table("table_title3"), |
| ui.output_table("trip_table3"), |
| ), |
| ui.nav_panel( |
| "Commercial Vehicle Travel Characteristics", |
| ui.tags.h3("Select a Question to View Travel Characteristics for Commercial Vehicle", style="text-align: center;"), |
| |
| ui.input_radio_buttons( |
| "data_year_selector4", |
| label="Select Data Year:", |
| choices=["Fall 2014", "Fall 2018", "Fall 2024"], |
| selected="Fall 2024", |
| inline=True |
| ), |
| ui.tags.br(), |
| |
| ui.input_select( |
| "question_selector4", |
| label="Select a Question:", |
| choices=list(q4.keys()), |
| selected="What types of trips are occurring within Napa County?", |
| ), |
| ui.tags.br(), |
| |
| |
| |
| |
| |
| |
| |
| ui.output_table("table_title4"), |
| ui.output_table("trip_table4"), |
| ), |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| ), |
| style="padding: 10px; margin-top: 20px;", |
| class_="tabbed-card", |
| ), |
| ) |
| ), |
| theme=shinyswatch.theme.spacelab, |
| ) |
|
|
|
|
| app = App(app_ui, create_server(app_dir)) |
|
|
| if __name__ == "__main__": |
| import asyncio |
|
|
| try: |
| app.run() |
| except RuntimeError as e: |
| if "asyncio.run()" in str(e): |
| asyncio.run(app.start()) |
|
|