first commit

This commit is contained in:
2026-05-21 08:40:24 -04:00
commit b084545275
711 changed files with 3659856 additions and 0 deletions

View File

@@ -0,0 +1,15 @@
[theme]
base = "light"
[logger]
level = "debug"
[server]
address = "0.0.0.0"
enableCORS = true
corsAllowedOrigins = ["https://app.pasbdc.org", "http://app.pasbdc.org", "localhost", "172.104.24.127"]
enableXsrfProtection = false
[browser]
serverAddress = "app.pasbdc.org"
serverPort = 8502

View File

@@ -0,0 +1 @@
f70c5fc7-4820-4844-bfd3-79c1f49c387e

View File

@@ -0,0 +1,61 @@
# Streamlit Dashboard Documentation
This project uses [Sphinx](https://www.sphinx-doc.org/) to generate its technical documentation from docstrings in the source code.
## Prerequisites
Before building the documentation, ensure you have activated the virtual environment located in the parent directory, as it contains all the necessary dependencies (including Sphinx, Streamlit, etc.).
### Activating the Virtual Environment
* **On Linux/macOS:**
```bash
source ../venv/bin/activate
```
*(Note: Replace `venv` with the actual name of the virtual environment folder if it differs, e.g., `.venv` or `env`.)*
* **On Windows:**
```bash
..\venv\Scripts\activate
```
Once activated, verify Sphinx is available:
```bash
sphinx-build --version
```
## Building the Documentation
To build the HTML documentation, follow these steps:
1. Navigate to the `docs` directory:
```bash
cd docs
```
2. Run the make command for HTML:
* **On Linux/macOS:**
```bash
make html
```
* **On Windows:**
```bash
.\make.bat html
```
## Viewing the Documentation
Once the build is complete, you can find the generated HTML files in the `docs/_build/html` directory.
To view the documentation, open `docs/_build/html/index.html` in your web browser.
## Updating the Documentation
If you add new modules or packages to the project, you may need to regenerate the `.rst` files using `sphinx-apidoc`. From the project root, you can run:
```bash
sphinx-apidoc -o docs/ .
```
After updating the `.rst` files, rebuild the HTML documentation as described above.

View File

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

View File

@@ -0,0 +1,20 @@
import yaml
from streamlit_authenticator import Authenticate
from yaml.loader import SafeLoader
import streamlit_authenticator as stauth
def load_auth_config(config_path) -> Authenticate:
try:
with open(config_path) as file:
config = yaml.load(file, Loader=SafeLoader)
authenticator = stauth.Authenticate(
config['credentials'],
config['cookie']['name'],
config['cookie']['key'],
config['cookie']['expiry_days'],
auto_hash = True
)
return authenticator
except FileNotFoundError:
return None #pyright:ignore

View File

@@ -0,0 +1,104 @@
from typing import List, Tuple
import pandas as pd
import streamlit as st
from constants_module import OUT_COLUMNS, NEOSERRA_COLUMNS
from section_1_datasets_module import generate_client_list_dataset, get_pa_naics_data, get_bls_naics11_data, get_bls_naics92_data, create_naics_census_percentage_table, make_county_naics_dataset
from shared_tools_module import csv_url_to_dataframe
from cached_function_wrappers.shared import cached_csv_url_to_dataframe
from pasbdc_data_cleaning import clean_center_name, remove_duplicate_client_records, remove_api_testing_clients
@st.cache_data
def cached_get_pa_naics_source_data(census_year:str) -> pd.DataFrame:
return get_pa_naics_data(census_year)
@st.cache_data
def cached_get_bls_naics11_data(usda_api_key:str, census_year:str) -> pd.DataFrame:
return get_bls_naics11_data(api_key=usda_api_key, year=census_year)
@st.cache_data
def cached_get_bls_naics92_data(census_year:str) -> pd.DataFrame:
return get_bls_naics92_data(year=census_year)
@st.cache_data
def filter_df_by_naics_codes(in_df:pd.DataFrame, naics_codes: List[int]) -> pd.DataFrame:
return in_df[
in_df[OUT_COLUMNS.naics_2].isin(naics_codes)
]
def cached_create_naics_census_percentage_table(usda_api_key:str, census_year:str):
df_naics_census = cached_get_pa_naics_source_data(census_year=census_year)
df_naics_11 = cached_get_bls_naics11_data(usda_api_key=usda_api_key, census_year=census_year)
df_naics_92 = cached_get_bls_naics92_data(census_year=census_year)
census_table = create_naics_census_percentage_table(
df_naics_census=df_naics_census,
df_naics_11=df_naics_11,
df_naics_92=df_naics_92,
col_bls_industry = OUT_COLUMNS.bls_industry,
col_bls_estab = OUT_COLUMNS.bls_estab,
col_usda_value = OUT_COLUMNS.usda_value,
col_unified_naics = OUT_COLUMNS.unified_naics,
col_census_estab = OUT_COLUMNS.census_estab,
col_census_pct = OUT_COLUMNS.census_pct,
col_naics_label = OUT_COLUMNS.naics_label,
col_census_naics = OUT_COLUMNS.census_naics
)
return census_table
@st.cache_data
def cached_generate_client_naics_dataset(export_module_url, usda_api_key, census_year, centers) -> pd.DataFrame:
raw_client_df = cached_csv_url_to_dataframe(export_module_url).copy()
clean_center_name(raw_client_df)
raw_client_df = raw_client_df[raw_client_df[NEOSERRA_COLUMNS.center].isin(centers)]
naics_df = cached_create_naics_census_percentage_table(usda_api_key, census_year)
client_list_df = generate_client_list_dataset(
naics_df=naics_df,
df_client_list=raw_client_df,
col_unified_naics=OUT_COLUMNS.unified_naics,
col_census_pct=OUT_COLUMNS.census_pct,
col_naics_2=OUT_COLUMNS.naics_2,
col_pa_naics_pct=OUT_COLUMNS.pa_naics_pct,
col_pasbdc_pct=OUT_COLUMNS.pasbdc_pct,
col_neo_primary_naics=NEOSERRA_COLUMNS.primary_naics,
col_neo_naics=NEOSERRA_COLUMNS.naics,
# This tells the functions that there is no NAICs column, only a primary NAICs one
# Neoserra in their infinite wisdom does not allow you to see this column
# in the export module output
bypass_secondary_naics_list=True
)
client_list_df = remove_duplicate_client_records(client_list_df)
client_list_df = remove_api_testing_clients(client_list_df)
return client_list_df
@st.cache_data
def cached_get_county_dataset(client_list_export_module_url:str, usda_api_key:str, census_year:str, centers:List[str]) -> pd.DataFrame:
client_list_df = cached_generate_client_naics_dataset(
client_list_export_module_url,
usda_api_key,
census_year,
centers
)
county_df = make_county_naics_dataset(
client_list_df,
col_out_county=OUT_COLUMNS.county,
col_out_fips=OUT_COLUMNS.fips,
col_out_unique=OUT_COLUMNS.unique_valid_naics,
col_out_missing=OUT_COLUMNS.missing_naics,
col_out_total=OUT_COLUMNS.total_clients,
col_out_pct_missing=OUT_COLUMNS.pct_missing_naics,
col_neo_county=NEOSERRA_COLUMNS.physical_address_county,
col_naics_2=OUT_COLUMNS.naics_2,
col_out_of_state=OUT_COLUMNS.county_out_of_state
)
return county_df

View File

@@ -0,0 +1,29 @@
from typing import List
import streamlit as st
from .shared import cached_csv_url_to_dataframe, remove_duplicate_client_records
from milestone_attribution_dataset_module import sanitize_funding_data
from constants_module import NEOSERRA_COLUMNS, OUT_COLUMNS
@st.cache_data
def cached_sanitize_funding_data(export_url:str, reportable_only:bool, allowed_centers:List[str] | None = None):
funding_df = cached_csv_url_to_dataframe(export_url)
funding_df = sanitize_funding_data(
funding_df,
col_neo_attribution_source=NEOSERRA_COLUMNS.milestone_attribution_source,
col_neo_affirmation=NEOSERRA_COLUMNS.milestone_affirmation,
col_out_documentation_level=OUT_COLUMNS.milestone_documentation_level,
col_neo_center=NEOSERRA_COLUMNS.center
)
funding_df = remove_duplicate_client_records(funding_df)
if allowed_centers is not None:
funding_df = funding_df[funding_df[NEOSERRA_COLUMNS.center].isin(allowed_centers)]
if reportable_only:
funding_df = funding_df[funding_df[NEOSERRA_COLUMNS.reportable] == 1]
return funding_df

View File

@@ -0,0 +1,38 @@
from typing import List
import streamlit as st
from constants_module import NEOSERRA_COLUMNS, OUT_COLUMNS
from milestone_attribution_dataset_module import sanitize_nbs_data
from cached_function_wrappers.shared import cached_csv_url_to_dataframe
from pasbdc_data_cleaning import remove_duplicate_client_records
@st.cache_data
def cached_get_nbs_data(export_url:str, reportable_only:bool, allowed_centers:List[str] | None = None):
nbs_df = cached_csv_url_to_dataframe(export_url)
nbs_df = sanitize_nbs_data(
nbs_df,
col_neo_center=NEOSERRA_COLUMNS.center,
col_neo_client_id=NEOSERRA_COLUMNS.client_id,
col_neo_milestone_date=NEOSERRA_COLUMNS.milestone_date,
col_neo_attribution_date=NEOSERRA_COLUMNS.attribution_date,
col_neo_attribution_source=NEOSERRA_COLUMNS.milestone_attribution_source,
col_neo_affirmation=NEOSERRA_COLUMNS.milestone_affirmation,
col_neo_milestone_type=NEOSERRA_COLUMNS.milestone_type_name,
col_out_documentation_level=OUT_COLUMNS.milestone_documentation_level,
col_neo_reportable=NEOSERRA_COLUMNS.reportable,
business_start_impact_val=NEOSERRA_COLUMNS.business_start_impact_val,
business_established_val=NEOSERRA_COLUMNS.business_established_val
)
nbs_df = remove_duplicate_client_records(nbs_df)
if allowed_centers is not None:
nbs_df = nbs_df[nbs_df[NEOSERRA_COLUMNS.center].isin(allowed_centers)]
if reportable_only:
nbs_df = nbs_df[nbs_df[NEOSERRA_COLUMNS.reportable] == 1]
return nbs_df

View File

@@ -0,0 +1,20 @@
import streamlit as st
import pandas as pd
from shared_tools_module import csv_url_to_dataframe
from pasbdc_data_cleaning import clean_center_name, remove_duplicate_client_records, remove_api_testing_clients
from constants_module import NEOSERRA_COLUMNS, OUT_COLUMNS
@st.cache_data
def cached_csv_url_to_dataframe(export_module_url) -> pd.DataFrame:
return csv_url_to_dataframe(export_module_url)
@st.cache_data
def get_df_centers(export_module_url:str) -> pd.DataFrame:
raw_client_df = csv_url_to_dataframe(export_module_url).copy()
clean_center_name(raw_client_df)
raw_client_df = remove_duplicate_client_records(raw_client_df)
raw_client_df = remove_api_testing_clients(raw_client_df)
return raw_client_df[NEOSERRA_COLUMNS.center].unique()

View File

@@ -0,0 +1,61 @@
from typing import List
import datetime
from .shared import cached_csv_url_to_dataframe
from section_1_datasets_module import generate_cleaned_trainings_dataset, generate_center_trainings_count_statistics
from constants_module import NEOSERRA_COLUMNS, OUT_COLUMNS, Constants
import pandas as pd
import streamlit as st
@st.cache_data
def cached_generate_center_trainings_count_statistics(export_url:str, reportable_only:bool, include_future_events:bool, include_on_demand:bool, allowed_centers:List[str] | None = None):
trainings_df = cached_generate_cleaned_trainings_dataset(export_url,
reportable_only=reportable_only,
allowed_centers=allowed_centers,
include_future_events=include_future_events,
include_on_demand=include_on_demand
)
attendees_numeric = pd.to_numeric(trainings_df[NEOSERRA_COLUMNS.attendees_total], errors='coerce').fillna(0)
stats_df = generate_center_trainings_count_statistics(
full_df=trainings_df,
filtered_df=trainings_df[attendees_numeric == 0],
funding_source_group=['Core Services', 'LEXNET', 'PDA', 'NAP'],
col_primary_topic=NEOSERRA_COLUMNS.primary_training_topic,
col_center=NEOSERRA_COLUMNS.center,
col_funding_source=NEOSERRA_COLUMNS.funding_source,
col_attendees_total=NEOSERRA_COLUMNS.attendees_total,
col_is_preplanning=OUT_COLUMNS.is_preplanning
)
return stats_df
@st.cache_data
def cached_generate_cleaned_trainings_dataset(export_url:str, reportable_only:bool, include_future_events:bool, include_on_demand:bool, allowed_centers:List[str] | None = None):
trainings_df = cached_csv_url_to_dataframe(export_url)
trainings_df = generate_cleaned_trainings_dataset(
trainings_df,
col_neo_event_title=NEOSERRA_COLUMNS.event_title,
col_neo_primary_topic=NEOSERRA_COLUMNS.primary_training_topic,
col_neo_training_topics=NEOSERRA_COLUMNS.training_topics,
col_neo_center=NEOSERRA_COLUMNS.center,
col_is_preplanning=OUT_COLUMNS.is_preplanning,
col_neo_attendees_total=NEOSERRA_COLUMNS.attendees_total,
col_out_attendees_range=OUT_COLUMNS.attendees_range
)
if allowed_centers is not None:
trainings_df = trainings_df[trainings_df[NEOSERRA_COLUMNS.center].isin(allowed_centers)]
if reportable_only:
trainings_df = trainings_df[trainings_df[NEOSERRA_COLUMNS.reportable] == 1]
# Convert the start date to an actual date object, then filter out all future events if they are not desired by the user
trainings_df[NEOSERRA_COLUMNS.start_date] = pd.to_datetime(trainings_df[NEOSERRA_COLUMNS.start_date], format="%m/%d/%Y")
if not include_future_events:
trainings_df = trainings_df[trainings_df[NEOSERRA_COLUMNS.start_date].dt.date < datetime.date.today()]
if not include_on_demand:
trainings_df = trainings_df[trainings_df[NEOSERRA_COLUMNS.program_format] != Constants.ON_DEMAND_VALUE.value]
return trainings_df

View File

@@ -0,0 +1,78 @@
from streamlit.delta_generator import DeltaGenerator
from utility_classes.base_report_page import Renderable
class NeoserraExportLinkGrabber(Renderable):
"""
Reusable UI component for capturing paired API endpoint URLs.
This class encapsulates the state and presentation logic for modifying external data
endpoints. By grouping the current and previous fiscal period URLs into a single
renderable object, it standardizes the visual layout across the Admin Panel and
isolates the input-capture logic from the parent page's batch validation pipeline.
:param grabber_title: The unique display name for this URL grouping (e.g., 'Client List').
:type grabber_title: str
:param prev_fy_initial_value: The existing configuration URL for the previous fiscal period.
:type prev_fy_initial_value: str
:param current_fy_initial_value: The existing configuration URL for the current fiscal period.
:type current_fy_initial_value: str
"""
def __init__(self, grabber_title:str, prev_fy_initial_value:str, current_fy_initial_value:str):
"""
Initializes the component's state with existing configuration values.
Pre-populates the internal state with the currently loaded external data endpoints.
This ensures that when the component is rendered, administrators can audit or slightly
modify the existing configuration rather than re-entering complex URLs from scratch.
:param grabber_title: The unique title acting as the instance ID.
:type grabber_title: str
:param prev_fy_initial_value: The starting string value for the previous fiscal period input.
:type prev_fy_initial_value: str
:param current_fy_initial_value: The starting string value for the current fiscal period input.
:type current_fy_initial_value: str
"""
super().__init__(grabber_title)
self.prev_fy_url = prev_fy_initial_value
self.current_fy_url = current_fy_initial_value
self.title = grabber_title
def render(self, container: DeltaGenerator):
"""
Maps the URL capture inputs to the provided Streamlit layout container.
Constructs a visually distinct, bordered container to group the paired fiscal period
endpoints together. It binds the text input widgets to the component's internal state,
allowing the parent orchestrator to extract the modified strings during the form
submission phase.
:param container: The Streamlit layout container (typically a form) to draw the widgets onto.
:type container: DeltaGenerator
"""
selector_container = container.container(border=True, key=self.get_widget_key("neoserra_export_url_selector_container"))
selector_container.caption(self.title)
prev_fy_url = selector_container.text_input("Previous Fiscal Year Export Module URL", key=self.get_widget_key("prev_fy_url_text_input"), value=self.prev_fy_url)
current_fy_url = selector_container.text_input("Current Fiscal Year Export Module URL", key=self.get_widget_key("current_fy_url_text_input"), value=self.current_fy_url)
self.prev_fy_url = prev_fy_url
self.current_fy_url = current_fy_url
def get_widget_key(self, widget_unique_id: str) -> str:
"""
Generates globally unique identifiers for the component's internal Streamlit widgets.
Because the Admin Panel renders multiple instances of this exact class on the same page,
this method prevents Streamlit `DuplicateWidgetID` execution crashes by prefixing the
local widget ID (e.g., 'prev_fy_url_text_input') with the instance's unique title.
:param widget_unique_id: The local identifier for the specific text input widget.
:type widget_unique_id: str
:return: A concatenated, globally unique string key.
:rtype: str
"""
return f'{self.instance_id}_{widget_unique_id}'

View File

@@ -0,0 +1,35 @@
cookie:
expiry_days: 30
key: tn$h5jfjp#DyZQ5DwA
name: QNF5w!WdKRsnQb!(FMC
credentials:
usernames:
vazar:
email: vincent@vtallen.com
failed_login_attempts: 0 # Will be managed automatically
first_name: Vivian
last_name: Azar
logged_in: False # Will be managed automatically
password: "$Wgj%hdaQ@am1c2kFvbX"
roles:
- admin
- viewer
vtallen:
email: vincent@vtallen.com
failed_login_attempts: 0 # Will be managed automatically
first_name: Vincent
last_name: Allen
logged_in: False # Will be managed automatically
password: "pianoPotato17225-/"
roles:
- admin
- viewer
pasbdcviewer:
email: vtallen@protonmail.com
failed_login_attempts: 0 # Will be managed automatically
first_name: PASBDC
last_name: Viewer
logged_in: False # Will be managed automatically
password: "Kq#F&YGJm4XT6UBHk5"
roles:
- viewer

View File

View File

@@ -0,0 +1,23 @@
census:
year: '2022'
errors:
contact_method: bkelly@kutztown.edu
contact_name: Brian Kelly
export_module_urls:
capital_funding:
current_fy: https://pasbdc.neoserra.com/api/export?userid=6694&appid=188&appkey=1a37972c-8757-4447-b301-59e7ca65f7ea
prev_fy: https://pasbdc.neoserra.com/api/export?userid=6694&appid=183&appkey=08515f8b-8d52-4eb5-a85c-5c3b49261b4b
clients_list:
current_fy: https://pasbdc.neoserra.com/api/export?userid=6694&appid=186&appkey=f0e90ceb-8063-44c2-8cc9-4949ca89763a
prev_fy: https://pasbdc.neoserra.com/api/export?userid=6694&appid=184&appkey=72de7830-d65f-4ce3-9b0e-ab872d1bd41e
new_business_starts:
current_fy: https://pasbdc.neoserra.com/api/export?userid=6694&appid=205&appkey=a3f8a48d-023d-4740-b2c1-5646d8a8bc9f
prev_fy: https://pasbdc.neoserra.com/api/export?userid=6694&appid=182&appkey=9b47f8c2-1ad5-4499-812c-742eddf149b9
trainings:
current_fy: https://pasbdc.neoserra.com/api/export?userid=6694&appid=189&appkey=e4c003ea-2216-48ae-ba76-2ebdef30848b
prev_fy: https://pasbdc.neoserra.com/api/export?userid=6694&appid=181&appkey=bc03174a-f36c-45a6-a933-0f6e28062e9c
logging:
file: dashboard_log.log
level: WARNING
usda_api:
key: 72A4453A-E4CB-3D1C-BF42-03B6FAF9E7E6

View File

@@ -0,0 +1,27 @@
export_module_urls:
# These are all the export module URLS needed for the reports in this dashboard. See the documentation for the meaning of each
# and how to set them up in Neoserra
clients_list:
current_fy: "https://pasbdc.neoserra.com/api/export?userid=6694&appid=186&appkey=f0e90ceb-8063-44c2-8cc9-4949ca89763a"
prev_fy: "https://pasbdc.neoserra.com/api/export?userid=6694&appid=184&appkey=72de7830-d65f-4ce3-9b0e-ab872d1bd41e"
new_business_starts:
current_fy: "https://pasbdc.neoserra.com/api/export?userid=6694&appid=187&appkey=1ebb99d3-551c-44f1-803f-f8cd09c8286f"
prev_fy: "https://pasbdc.neoserra.com/api/export?userid=6694&appid=182&appkey=9b47f8c2-1ad5-4499-812c-742eddf149b9"
capital_funding:
current_fy: "https://pasbdc.neoserra.com/api/export?userid=6694&appid=188&appkey=1a37972c-8757-4447-b301-59e7ca65f7ea"
prev_fy: "https://pasbdc.neoserra.com/api/export?userid=6694&appid=183&appkey=08515f8b-8d52-4eb5-a85c-5c3b49261b4b"
trainings:
current_fy: "https://pasbdc.neoserra.com/api/export?userid=6694&appid=189&appkey=e4c003ea-2216-48ae-ba76-2ebdef30848b"
prev_fy: "https://pasbdc.neoserra.com/api/export?userid=6694&appid=181&appkey=bc03174a-f36c-45a6-a933-0f6e28062e9c"
logging:
# Accepts all debug level values found here: https://docs.python.org/3/howto/logging.html
level: "DEBUG"
# The file path and name to write the log file to, log files are automatically split by size by python
file: "dashboard_log.log"
errors:
contact_name: "Brian Kelly"
contact_method: "bkelly@kutztown.edu"
usda_api:
key: "72A4453A-E4CB-3D1C-BF42-03B6FAF9E7E6"
census:
year: "2022"

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,100 @@
[2026-05-21 07:23:27,232][ERROR][/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/training_attendee_ranges_page_class.py][page_classes.training_attendee_ranges_page_class]: Failed to fetch the dataset for this page: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
Traceback (most recent call last):
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/training_attendee_ranges_page_class.py", line 122, in render_controls
all_centers = get_df_centers(export_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 281, in __call__
return self._get_or_create_cached_value(args, kwargs, spinner_message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 326, in _get_or_create_cached_value
return self._handle_cache_miss(cache, value_key, func_args, func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 385, in _handle_cache_miss
computed_value = self._info.func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/cached_function_wrappers/shared.py", line 14, in get_df_centers
raw_client_df = csv_url_to_dataframe(export_module_url).copy()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/shared_tools_module/shared_tools_module/export_module.py", line 13, in csv_url_to_dataframe
raise Exception(
Exception: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
[2026-05-21 07:23:30,493][ERROR][/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/training_event_count_attendee_comparison_page_class.py][page_classes.training_event_count_attendee_comparison_page_class]: Failed to fetch the dataset for this page: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
Traceback (most recent call last):
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/training_event_count_attendee_comparison_page_class.py", line 125, in render_controls
all_centers = get_df_centers(export_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 281, in __call__
return self._get_or_create_cached_value(args, kwargs, spinner_message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 326, in _get_or_create_cached_value
return self._handle_cache_miss(cache, value_key, func_args, func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 385, in _handle_cache_miss
computed_value = self._info.func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/cached_function_wrappers/shared.py", line 14, in get_df_centers
raw_client_df = csv_url_to_dataframe(export_module_url).copy()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/shared_tools_module/shared_tools_module/export_module.py", line 13, in csv_url_to_dataframe
raise Exception(
Exception: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
[2026-05-21 07:28:47,087][ERROR][/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py][utility_classes.base_report_page]: Failed to fetch the dataset for this page: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
Traceback (most recent call last):
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py", line 117, in render_controls
all_centers = get_df_centers(export_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 281, in __call__
return self._get_or_create_cached_value(args, kwargs, spinner_message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 326, in _get_or_create_cached_value
return self._handle_cache_miss(cache, value_key, func_args, func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 385, in _handle_cache_miss
computed_value = self._info.func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/cached_function_wrappers/shared.py", line 14, in get_df_centers
raw_client_df = csv_url_to_dataframe(export_module_url).copy()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/shared_tools_module/shared_tools_module/export_module.py", line 13, in csv_url_to_dataframe
raise Exception(
Exception: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
[2026-05-21 07:31:29,420][ERROR][/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py][utility_classes.base_report_page]: Failed to fetch the dataset for this page: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
Traceback (most recent call last):
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py", line 117, in render_controls
all_centers = get_df_centers(export_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 281, in __call__
return self._get_or_create_cached_value(args, kwargs, spinner_message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 326, in _get_or_create_cached_value
return self._handle_cache_miss(cache, value_key, func_args, func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 385, in _handle_cache_miss
computed_value = self._info.func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/cached_function_wrappers/shared.py", line 14, in get_df_centers
raw_client_df = csv_url_to_dataframe(export_module_url).copy()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/shared_tools_module/shared_tools_module/export_module.py", line 13, in csv_url_to_dataframe
raise Exception(
Exception: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
[2026-05-21 07:33:27,706][ERROR][/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py][utility_classes.base_report_page]: Failed to fetch the dataset for this page: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
Traceback (most recent call last):
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py", line 117, in render_controls
all_centers = get_df_centers(export_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 281, in __call__
return self._get_or_create_cached_value(args, kwargs, spinner_message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 326, in _get_or_create_cached_value
return self._handle_cache_miss(cache, value_key, func_args, func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 385, in _handle_cache_miss
computed_value = self._info.func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/cached_function_wrappers/shared.py", line 14, in get_df_centers
raw_client_df = csv_url_to_dataframe(export_module_url).copy()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/shared_tools_module/shared_tools_module/export_module.py", line 13, in csv_url_to_dataframe
raise Exception(
Exception: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.

View File

@@ -0,0 +1,100 @@
[2026-05-21 07:23:27,232][ERROR][/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/training_attendee_ranges_page_class.py][page_classes.training_attendee_ranges_page_class]: Failed to fetch the dataset for this page: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
Traceback (most recent call last):
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/training_attendee_ranges_page_class.py", line 122, in render_controls
all_centers = get_df_centers(export_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 281, in __call__
return self._get_or_create_cached_value(args, kwargs, spinner_message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 326, in _get_or_create_cached_value
return self._handle_cache_miss(cache, value_key, func_args, func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 385, in _handle_cache_miss
computed_value = self._info.func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/cached_function_wrappers/shared.py", line 14, in get_df_centers
raw_client_df = csv_url_to_dataframe(export_module_url).copy()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/shared_tools_module/shared_tools_module/export_module.py", line 13, in csv_url_to_dataframe
raise Exception(
Exception: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
[2026-05-21 07:23:30,493][ERROR][/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/training_event_count_attendee_comparison_page_class.py][page_classes.training_event_count_attendee_comparison_page_class]: Failed to fetch the dataset for this page: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
Traceback (most recent call last):
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/training_event_count_attendee_comparison_page_class.py", line 125, in render_controls
all_centers = get_df_centers(export_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 281, in __call__
return self._get_or_create_cached_value(args, kwargs, spinner_message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 326, in _get_or_create_cached_value
return self._handle_cache_miss(cache, value_key, func_args, func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 385, in _handle_cache_miss
computed_value = self._info.func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/cached_function_wrappers/shared.py", line 14, in get_df_centers
raw_client_df = csv_url_to_dataframe(export_module_url).copy()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/shared_tools_module/shared_tools_module/export_module.py", line 13, in csv_url_to_dataframe
raise Exception(
Exception: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
[2026-05-21 07:28:47,087][ERROR][/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py][utility_classes.base_report_page]: Failed to fetch the dataset for this page: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
Traceback (most recent call last):
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py", line 117, in render_controls
all_centers = get_df_centers(export_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 281, in __call__
return self._get_or_create_cached_value(args, kwargs, spinner_message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 326, in _get_or_create_cached_value
return self._handle_cache_miss(cache, value_key, func_args, func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 385, in _handle_cache_miss
computed_value = self._info.func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/cached_function_wrappers/shared.py", line 14, in get_df_centers
raw_client_df = csv_url_to_dataframe(export_module_url).copy()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/shared_tools_module/shared_tools_module/export_module.py", line 13, in csv_url_to_dataframe
raise Exception(
Exception: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
[2026-05-21 07:31:29,420][ERROR][/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py][utility_classes.base_report_page]: Failed to fetch the dataset for this page: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
Traceback (most recent call last):
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py", line 117, in render_controls
all_centers = get_df_centers(export_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 281, in __call__
return self._get_or_create_cached_value(args, kwargs, spinner_message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 326, in _get_or_create_cached_value
return self._handle_cache_miss(cache, value_key, func_args, func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 385, in _handle_cache_miss
computed_value = self._info.func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/cached_function_wrappers/shared.py", line 14, in get_df_centers
raw_client_df = csv_url_to_dataframe(export_module_url).copy()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/shared_tools_module/shared_tools_module/export_module.py", line 13, in csv_url_to_dataframe
raise Exception(
Exception: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
[2026-05-21 07:33:27,706][ERROR][/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py][utility_classes.base_report_page]: Failed to fetch the dataset for this page: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
Traceback (most recent call last):
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py", line 117, in render_controls
all_centers = get_df_centers(export_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 281, in __call__
return self._get_or_create_cached_value(args, kwargs, spinner_message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 326, in _get_or_create_cached_value
return self._handle_cache_miss(cache, value_key, func_args, func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 385, in _handle_cache_miss
computed_value = self._info.func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/cached_function_wrappers/shared.py", line 14, in get_df_centers
raw_client_df = csv_url_to_dataframe(export_module_url).copy()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/shared_tools_module/shared_tools_module/export_module.py", line 13, in csv_url_to_dataframe
raise Exception(
Exception: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.

View File

@@ -0,0 +1,100 @@
[2026-05-21 07:23:27,232][ERROR][/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/training_attendee_ranges_page_class.py][page_classes.training_attendee_ranges_page_class]: Failed to fetch the dataset for this page: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
Traceback (most recent call last):
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/training_attendee_ranges_page_class.py", line 122, in render_controls
all_centers = get_df_centers(export_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 281, in __call__
return self._get_or_create_cached_value(args, kwargs, spinner_message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 326, in _get_or_create_cached_value
return self._handle_cache_miss(cache, value_key, func_args, func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 385, in _handle_cache_miss
computed_value = self._info.func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/cached_function_wrappers/shared.py", line 14, in get_df_centers
raw_client_df = csv_url_to_dataframe(export_module_url).copy()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/shared_tools_module/shared_tools_module/export_module.py", line 13, in csv_url_to_dataframe
raise Exception(
Exception: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
[2026-05-21 07:23:30,493][ERROR][/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/training_event_count_attendee_comparison_page_class.py][page_classes.training_event_count_attendee_comparison_page_class]: Failed to fetch the dataset for this page: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
Traceback (most recent call last):
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/training_event_count_attendee_comparison_page_class.py", line 125, in render_controls
all_centers = get_df_centers(export_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 281, in __call__
return self._get_or_create_cached_value(args, kwargs, spinner_message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 326, in _get_or_create_cached_value
return self._handle_cache_miss(cache, value_key, func_args, func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 385, in _handle_cache_miss
computed_value = self._info.func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/cached_function_wrappers/shared.py", line 14, in get_df_centers
raw_client_df = csv_url_to_dataframe(export_module_url).copy()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/shared_tools_module/shared_tools_module/export_module.py", line 13, in csv_url_to_dataframe
raise Exception(
Exception: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
[2026-05-21 07:28:47,087][ERROR][/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py][utility_classes.base_report_page]: Failed to fetch the dataset for this page: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
Traceback (most recent call last):
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py", line 117, in render_controls
all_centers = get_df_centers(export_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 281, in __call__
return self._get_or_create_cached_value(args, kwargs, spinner_message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 326, in _get_or_create_cached_value
return self._handle_cache_miss(cache, value_key, func_args, func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 385, in _handle_cache_miss
computed_value = self._info.func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/cached_function_wrappers/shared.py", line 14, in get_df_centers
raw_client_df = csv_url_to_dataframe(export_module_url).copy()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/shared_tools_module/shared_tools_module/export_module.py", line 13, in csv_url_to_dataframe
raise Exception(
Exception: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
[2026-05-21 07:31:29,420][ERROR][/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py][utility_classes.base_report_page]: Failed to fetch the dataset for this page: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
Traceback (most recent call last):
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py", line 117, in render_controls
all_centers = get_df_centers(export_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 281, in __call__
return self._get_or_create_cached_value(args, kwargs, spinner_message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 326, in _get_or_create_cached_value
return self._handle_cache_miss(cache, value_key, func_args, func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 385, in _handle_cache_miss
computed_value = self._info.func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/cached_function_wrappers/shared.py", line 14, in get_df_centers
raw_client_df = csv_url_to_dataframe(export_module_url).copy()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/shared_tools_module/shared_tools_module/export_module.py", line 13, in csv_url_to_dataframe
raise Exception(
Exception: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
[2026-05-21 07:33:27,706][ERROR][/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py][utility_classes.base_report_page]: Failed to fetch the dataset for this page: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
Traceback (most recent call last):
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py", line 117, in render_controls
all_centers = get_df_centers(export_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 281, in __call__
return self._get_or_create_cached_value(args, kwargs, spinner_message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 326, in _get_or_create_cached_value
return self._handle_cache_miss(cache, value_key, func_args, func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 385, in _handle_cache_miss
computed_value = self._info.func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/cached_function_wrappers/shared.py", line 14, in get_df_centers
raw_client_df = csv_url_to_dataframe(export_module_url).copy()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/shared_tools_module/shared_tools_module/export_module.py", line 13, in csv_url_to_dataframe
raise Exception(
Exception: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.

View File

@@ -0,0 +1,100 @@
[2026-05-21 07:23:27,232][ERROR][/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/training_attendee_ranges_page_class.py][page_classes.training_attendee_ranges_page_class]: Failed to fetch the dataset for this page: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
Traceback (most recent call last):
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/training_attendee_ranges_page_class.py", line 122, in render_controls
all_centers = get_df_centers(export_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 281, in __call__
return self._get_or_create_cached_value(args, kwargs, spinner_message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 326, in _get_or_create_cached_value
return self._handle_cache_miss(cache, value_key, func_args, func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 385, in _handle_cache_miss
computed_value = self._info.func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/cached_function_wrappers/shared.py", line 14, in get_df_centers
raw_client_df = csv_url_to_dataframe(export_module_url).copy()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/shared_tools_module/shared_tools_module/export_module.py", line 13, in csv_url_to_dataframe
raise Exception(
Exception: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
[2026-05-21 07:23:30,493][ERROR][/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/training_event_count_attendee_comparison_page_class.py][page_classes.training_event_count_attendee_comparison_page_class]: Failed to fetch the dataset for this page: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
Traceback (most recent call last):
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/training_event_count_attendee_comparison_page_class.py", line 125, in render_controls
all_centers = get_df_centers(export_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 281, in __call__
return self._get_or_create_cached_value(args, kwargs, spinner_message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 326, in _get_or_create_cached_value
return self._handle_cache_miss(cache, value_key, func_args, func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 385, in _handle_cache_miss
computed_value = self._info.func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/cached_function_wrappers/shared.py", line 14, in get_df_centers
raw_client_df = csv_url_to_dataframe(export_module_url).copy()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/shared_tools_module/shared_tools_module/export_module.py", line 13, in csv_url_to_dataframe
raise Exception(
Exception: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
[2026-05-21 07:28:47,087][ERROR][/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py][utility_classes.base_report_page]: Failed to fetch the dataset for this page: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
Traceback (most recent call last):
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py", line 117, in render_controls
all_centers = get_df_centers(export_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 281, in __call__
return self._get_or_create_cached_value(args, kwargs, spinner_message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 326, in _get_or_create_cached_value
return self._handle_cache_miss(cache, value_key, func_args, func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 385, in _handle_cache_miss
computed_value = self._info.func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/cached_function_wrappers/shared.py", line 14, in get_df_centers
raw_client_df = csv_url_to_dataframe(export_module_url).copy()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/shared_tools_module/shared_tools_module/export_module.py", line 13, in csv_url_to_dataframe
raise Exception(
Exception: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
[2026-05-21 07:31:29,420][ERROR][/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py][utility_classes.base_report_page]: Failed to fetch the dataset for this page: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
Traceback (most recent call last):
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py", line 117, in render_controls
all_centers = get_df_centers(export_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 281, in __call__
return self._get_or_create_cached_value(args, kwargs, spinner_message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 326, in _get_or_create_cached_value
return self._handle_cache_miss(cache, value_key, func_args, func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 385, in _handle_cache_miss
computed_value = self._info.func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/cached_function_wrappers/shared.py", line 14, in get_df_centers
raw_client_df = csv_url_to_dataframe(export_module_url).copy()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/shared_tools_module/shared_tools_module/export_module.py", line 13, in csv_url_to_dataframe
raise Exception(
Exception: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
[2026-05-21 07:33:27,706][ERROR][/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py][utility_classes.base_report_page]: Failed to fetch the dataset for this page: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
Traceback (most recent call last):
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py", line 117, in render_controls
all_centers = get_df_centers(export_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 281, in __call__
return self._get_or_create_cached_value(args, kwargs, spinner_message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 326, in _get_or_create_cached_value
return self._handle_cache_miss(cache, value_key, func_args, func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 385, in _handle_cache_miss
computed_value = self._info.func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/cached_function_wrappers/shared.py", line 14, in get_df_centers
raw_client_df = csv_url_to_dataframe(export_module_url).copy()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/shared_tools_module/shared_tools_module/export_module.py", line 13, in csv_url_to_dataframe
raise Exception(
Exception: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.

View File

@@ -0,0 +1,100 @@
[2026-05-21 07:23:27,232][ERROR][/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/training_attendee_ranges_page_class.py][page_classes.training_attendee_ranges_page_class]: Failed to fetch the dataset for this page: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
Traceback (most recent call last):
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/training_attendee_ranges_page_class.py", line 122, in render_controls
all_centers = get_df_centers(export_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 281, in __call__
return self._get_or_create_cached_value(args, kwargs, spinner_message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 326, in _get_or_create_cached_value
return self._handle_cache_miss(cache, value_key, func_args, func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 385, in _handle_cache_miss
computed_value = self._info.func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/cached_function_wrappers/shared.py", line 14, in get_df_centers
raw_client_df = csv_url_to_dataframe(export_module_url).copy()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/shared_tools_module/shared_tools_module/export_module.py", line 13, in csv_url_to_dataframe
raise Exception(
Exception: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
[2026-05-21 07:23:30,493][ERROR][/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/training_event_count_attendee_comparison_page_class.py][page_classes.training_event_count_attendee_comparison_page_class]: Failed to fetch the dataset for this page: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
Traceback (most recent call last):
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/training_event_count_attendee_comparison_page_class.py", line 125, in render_controls
all_centers = get_df_centers(export_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 281, in __call__
return self._get_or_create_cached_value(args, kwargs, spinner_message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 326, in _get_or_create_cached_value
return self._handle_cache_miss(cache, value_key, func_args, func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 385, in _handle_cache_miss
computed_value = self._info.func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/cached_function_wrappers/shared.py", line 14, in get_df_centers
raw_client_df = csv_url_to_dataframe(export_module_url).copy()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/shared_tools_module/shared_tools_module/export_module.py", line 13, in csv_url_to_dataframe
raise Exception(
Exception: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
[2026-05-21 07:28:47,087][ERROR][/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py][utility_classes.base_report_page]: Failed to fetch the dataset for this page: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
Traceback (most recent call last):
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py", line 117, in render_controls
all_centers = get_df_centers(export_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 281, in __call__
return self._get_or_create_cached_value(args, kwargs, spinner_message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 326, in _get_or_create_cached_value
return self._handle_cache_miss(cache, value_key, func_args, func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 385, in _handle_cache_miss
computed_value = self._info.func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/cached_function_wrappers/shared.py", line 14, in get_df_centers
raw_client_df = csv_url_to_dataframe(export_module_url).copy()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/shared_tools_module/shared_tools_module/export_module.py", line 13, in csv_url_to_dataframe
raise Exception(
Exception: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
[2026-05-21 07:31:29,420][ERROR][/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py][utility_classes.base_report_page]: Failed to fetch the dataset for this page: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
Traceback (most recent call last):
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py", line 117, in render_controls
all_centers = get_df_centers(export_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 281, in __call__
return self._get_or_create_cached_value(args, kwargs, spinner_message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 326, in _get_or_create_cached_value
return self._handle_cache_miss(cache, value_key, func_args, func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 385, in _handle_cache_miss
computed_value = self._info.func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/cached_function_wrappers/shared.py", line 14, in get_df_centers
raw_client_df = csv_url_to_dataframe(export_module_url).copy()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/shared_tools_module/shared_tools_module/export_module.py", line 13, in csv_url_to_dataframe
raise Exception(
Exception: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
[2026-05-21 07:33:27,706][ERROR][/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py][utility_classes.base_report_page]: Failed to fetch the dataset for this page: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.
Traceback (most recent call last):
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/page_classes/nbs_milestones_page_class.py", line 117, in render_controls
all_centers = get_df_centers(export_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 281, in __call__
return self._get_or_create_cached_value(args, kwargs, spinner_message)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 326, in _get_or_create_cached_value
return self._handle_cache_miss(cache, value_key, func_args, func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/.venv/lib/python3.12/site-packages/streamlit/runtime/caching/cache_utils.py", line 385, in _handle_cache_miss
computed_value = self._info.func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/streamlit_dashboard/cached_function_wrappers/shared.py", line 14, in get_df_centers
raw_client_df = csv_url_to_dataframe(export_module_url).copy()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/valle276/pasbdc_streamlit_dashboard/shared_tools_module/shared_tools_module/export_module.py", line 13, in csv_url_to_dataframe
raise Exception(
Exception: Public ip not whitelisted in Neoserra export module. Find your public IP address and update your Neoserra preferences accordingly.

View File

@@ -0,0 +1,20 @@
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS ?=
SPHINXBUILD ?= sphinx-build
SOURCEDIR = .
BUILDDIR = _build
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

BIN
streamlit_dashboard/docs/_build/html.zip vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1,4 @@
# Sphinx build info version 1
# This file records the configuration used when building these files. When it is not found, a full rebuild will be done.
config: f4cb7426e956939be96b663f5a18a2d3
tags: 645f666f9bcd5a90fca523b33c5a78b7

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,7 @@
auth\_config\_loader module
===========================
.. automodule:: auth_config_loader
:members:
:show-inheritance:
:undoc-members:

View File

@@ -0,0 +1,19 @@
.. Streamlit Dashboard documentation master file, created by
sphinx-quickstart on Mon Apr 20 13:21:01 2026.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Streamlit Dashboard documentation
=================================
Add your content using ``reStructuredText`` syntax. See the
`reStructuredText <https://www.sphinx-doc.org/en/master/usage/restructuredtext/index.html>`_
documentation for details.
.. toctree::
:maxdepth: 2
:caption: Contents:
modules

View File

@@ -0,0 +1,7 @@
main module
===========
.. automodule:: main
:members:
:show-inheritance:
:undoc-members:

View File

@@ -0,0 +1,7 @@
streamlit_dashboard
===================
.. toctree::
:maxdepth: 4
streamlit_dashboard

View File

@@ -0,0 +1,7 @@
streamlit\_constants module
===========================
.. automodule:: streamlit_constants
:members:
:show-inheritance:
:undoc-members:

View File

@@ -0,0 +1,47 @@
streamlit\_dashboard.cached\_function\_wrappers namespace
=========================================================
.. py:module:: streamlit_dashboard.cached_function_wrappers
Submodules
----------
streamlit\_dashboard.cached\_function\_wrappers.client\_list\_cached\_functions module
--------------------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.cached_function_wrappers.client_list_cached_functions
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.cached\_function\_wrappers.funding\_milestones\_cached\_functions module
---------------------------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.cached_function_wrappers.funding_milestones_cached_functions
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.cached\_function\_wrappers.nbs\_cached\_functions module
-----------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.cached_function_wrappers.nbs_cached_functions
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.cached\_function\_wrappers.shared module
-------------------------------------------------------------
.. automodule:: streamlit_dashboard.cached_function_wrappers.shared
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.cached\_function\_wrappers.trainings\_cached\_functions module
-----------------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.cached_function_wrappers.trainings_cached_functions
:members:
:show-inheritance:
:undoc-members:

View File

@@ -0,0 +1,15 @@
streamlit\_dashboard.components namespace
=========================================
.. py:module:: streamlit_dashboard.components
Submodules
----------
streamlit\_dashboard.components.neoserra\_export\_link\_grabber module
----------------------------------------------------------------------
.. automodule:: streamlit_dashboard.components.neoserra_export_link_grabber
:members:
:show-inheritance:
:undoc-members:

View File

@@ -0,0 +1,119 @@
streamlit\_dashboard.page\_classes namespace
============================================
.. py:module:: streamlit_dashboard.page_classes
Submodules
----------
streamlit\_dashboard.page\_classes.admin\_panel\_page\_class module
-------------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.admin_panel_page_class
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.page\_classes.authentication\_page\_wrapper module
-----------------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.authentication_page_wrapper
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.page\_classes.center\_milestones\_page\_class module
-------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.center_milestones_page_class
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.page\_classes.funding\_milestones\_page\_class module
--------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.funding_milestones_page_class
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.page\_classes.naics\_report\_page\_class module
--------------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.naics_report_page_class
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.page\_classes.nbs\_milestones\_page\_class module
----------------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.nbs_milestones_page_class
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.page\_classes.page\_class\_constants module
----------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.page_class_constants
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.page\_classes.report\_comparer\_page\_class module
-----------------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.report_comparer_page_class
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.page\_classes.training\_attendee\_counts\_class module
---------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.training_attendee_counts_class
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.page\_classes.training\_attendee\_ranges\_page\_class module
---------------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.training_attendee_ranges_page_class
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.page\_classes.training\_count\_statistics\_page\_class module
----------------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.training_count_statistics_page_class
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.page\_classes.training\_event\_count\_attendee\_comparison\_page\_class module
---------------------------------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.training_event_count_attendee_comparison_page_class
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.page\_classes.training\_event\_count\_page\_class module
-----------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.training_event_count_page_class
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.page\_classes.training\_primary\_topics\_page\_class module
--------------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.training_primary_topics_page_class
:members:
:show-inheritance:
:undoc-members:

View File

@@ -0,0 +1,43 @@
streamlit\_dashboard namespace
==============================
.. py:module:: streamlit_dashboard
Subpackages
-----------
.. toctree::
:maxdepth: 4
streamlit_dashboard.cached_function_wrappers
streamlit_dashboard.components
streamlit_dashboard.page_classes
streamlit_dashboard.streamlit_pages
streamlit_dashboard.utility_classes
Submodules
----------
streamlit\_dashboard.auth\_config\_loader module
------------------------------------------------
.. automodule:: streamlit_dashboard.auth_config_loader
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.main module
--------------------------------
.. automodule:: streamlit_dashboard.main
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.streamlit\_constants module
------------------------------------------------
.. automodule:: streamlit_dashboard.streamlit_constants
:members:
:show-inheritance:
:undoc-members:

View File

@@ -0,0 +1,103 @@
streamlit\_dashboard.streamlit\_pages namespace
===============================================
.. py:module:: streamlit_dashboard.streamlit_pages
Submodules
----------
streamlit\_dashboard.streamlit\_pages.admin\_streamlit\_page module
-------------------------------------------------------------------
.. automodule:: streamlit_dashboard.streamlit_pages.admin_streamlit_page
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.streamlit\_pages.center\_streamlit\_page module
--------------------------------------------------------------------
.. automodule:: streamlit_dashboard.streamlit_pages.center_streamlit_page
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.streamlit\_pages.comparer\_streamlit\_page module
----------------------------------------------------------------------
.. automodule:: streamlit_dashboard.streamlit_pages.comparer_streamlit_page
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.streamlit\_pages.funding\_streamlit\_page module
---------------------------------------------------------------------
.. automodule:: streamlit_dashboard.streamlit_pages.funding_streamlit_page
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.streamlit\_pages.naics\_streamlit\_page module
-------------------------------------------------------------------
.. automodule:: streamlit_dashboard.streamlit_pages.naics_streamlit_page
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.streamlit\_pages.nbs\_streamlit\_page module
-----------------------------------------------------------------
.. automodule:: streamlit_dashboard.streamlit_pages.nbs_streamlit_page
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.streamlit\_pages.training\_attendee\_ranges\_page module
-----------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.streamlit_pages.training_attendee_ranges_page
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.streamlit\_pages.trainings\_attendees\_count\_page module
------------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.streamlit_pages.trainings_attendees_count_page
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.streamlit\_pages.trainings\_count\_statistics\_page module
-------------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.streamlit_pages.trainings_count_statistics_page
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.streamlit\_pages.trainings\_event\_attendee\_comparison\_page module
-----------------------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.streamlit_pages.trainings_event_attendee_comparison_page
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.streamlit\_pages.trainings\_event\_count\_page module
--------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.streamlit_pages.trainings_event_count_page
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.streamlit\_pages.trainings\_primary\_topic\_page module
----------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.streamlit_pages.trainings_primary_topic_page
:members:
:show-inheritance:
:undoc-members:

View File

@@ -0,0 +1,31 @@
streamlit\_dashboard.utility\_classes namespace
===============================================
.. py:module:: streamlit_dashboard.utility_classes
Submodules
----------
streamlit\_dashboard.utility\_classes.base\_report\_page module
---------------------------------------------------------------
.. automodule:: streamlit_dashboard.utility_classes.base_report_page
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.utility\_classes.dashboard\_config\_parser module
----------------------------------------------------------------------
.. automodule:: streamlit_dashboard.utility_classes.dashboard_config_parser
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.utility\_classes.figure\_with\_max\_y module
-----------------------------------------------------------------
.. automodule:: streamlit_dashboard.utility_classes.figure_with_max_y
:members:
:show-inheritance:
:undoc-members:

View File

@@ -0,0 +1,663 @@
/* -- page layout ----------------------------------------------------------- */
body {
font-family: Georgia, serif;
font-size: 17px;
background-color: #fff;
color: #000;
margin: 0;
padding: 0;
}
div.document {
width: 940px;
margin: 30px auto 0 auto;
}
div.documentwrapper {
float: left;
width: 100%;
}
div.bodywrapper {
margin: 0 0 0 220px;
}
div.sphinxsidebar {
width: 220px;
font-size: 14px;
line-height: 1.5;
}
hr {
border: 1px solid #B1B4B6;
}
div.body {
background-color: #fff;
color: #3E4349;
padding: 0 30px 0 30px;
}
div.body > .section {
text-align: left;
}
div.footer {
width: 940px;
margin: 20px auto 30px auto;
font-size: 14px;
color: #888;
text-align: right;
}
div.footer a {
color: #888;
}
p.caption {
font-family: inherit;
font-size: inherit;
}
div.relations {
display: none;
}
div.sphinxsidebar {
max-height: 100%;
overflow-y: auto;
}
div.sphinxsidebar a {
color: #444;
text-decoration: none;
border-bottom: 1px dotted #999;
}
div.sphinxsidebar a:hover {
border-bottom: 1px solid #999;
}
div.sphinxsidebarwrapper {
padding: 18px 10px;
}
div.sphinxsidebarwrapper p.logo {
padding: 0;
margin: -10px 0 0 0px;
text-align: center;
}
div.sphinxsidebarwrapper h1.logo {
margin-top: -10px;
text-align: center;
margin-bottom: 5px;
text-align: left;
}
div.sphinxsidebarwrapper h1.logo-name {
margin-top: 0px;
}
div.sphinxsidebarwrapper p.blurb {
margin-top: 0;
font-style: normal;
}
div.sphinxsidebar h3,
div.sphinxsidebar h4 {
font-family: Georgia, serif;
color: #444;
font-size: 24px;
font-weight: normal;
margin: 0 0 5px 0;
padding: 0;
}
div.sphinxsidebar h4 {
font-size: 20px;
}
div.sphinxsidebar h3 a {
color: #444;
}
div.sphinxsidebar p.logo a,
div.sphinxsidebar h3 a,
div.sphinxsidebar p.logo a:hover,
div.sphinxsidebar h3 a:hover {
border: none;
}
div.sphinxsidebar p {
color: #555;
margin: 10px 0;
}
div.sphinxsidebar ul {
margin: 10px 0;
padding: 0;
color: #000;
}
div.sphinxsidebar ul li.toctree-l1 > a {
font-size: 120%;
}
div.sphinxsidebar ul li.toctree-l2 > a {
font-size: 110%;
}
div.sphinxsidebar input {
border: 1px solid #CCC;
font-family: Georgia, serif;
font-size: 1em;
}
div.sphinxsidebar #searchbox {
margin: 1em 0;
}
div.sphinxsidebar .search > div {
display: table-cell;
}
div.sphinxsidebar hr {
border: none;
height: 1px;
color: #AAA;
background: #AAA;
text-align: left;
margin-left: 0;
width: 50%;
}
div.sphinxsidebar .badge {
border-bottom: none;
}
div.sphinxsidebar .badge:hover {
border-bottom: none;
}
/* To address an issue with donation coming after search */
div.sphinxsidebar h3.donation {
margin-top: 10px;
}
/* -- body styles ----------------------------------------------------------- */
a {
color: #004B6B;
text-decoration: underline;
}
a:hover {
color: #6D4100;
text-decoration: underline;
}
div.body h1,
div.body h2,
div.body h3,
div.body h4,
div.body h5,
div.body h6 {
font-family: Georgia, serif;
font-weight: normal;
margin: 30px 0px 10px 0px;
padding: 0;
}
div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; }
div.body h2 { font-size: 180%; }
div.body h3 { font-size: 150%; }
div.body h4 { font-size: 130%; }
div.body h5 { font-size: 100%; }
div.body h6 { font-size: 100%; }
a.headerlink {
color: #DDD;
padding: 0 4px;
text-decoration: none;
}
a.headerlink:hover {
color: #444;
background: #EAEAEA;
}
div.body p, div.body dd, div.body li {
line-height: 1.4em;
}
div.admonition {
margin: 20px 0px;
padding: 10px 30px;
background-color: #EEE;
border: 1px solid #CCC;
}
div.admonition tt.xref, div.admonition code.xref, div.admonition a tt {
background-color: #FBFBFB;
border-bottom: 1px solid #fafafa;
}
div.admonition p.admonition-title {
font-family: Georgia, serif;
font-weight: normal;
font-size: 24px;
margin: 0 0 10px 0;
padding: 0;
line-height: 1;
}
div.admonition p.last {
margin-bottom: 0;
}
dt:target, .highlight {
background: #FAF3E8;
}
div.warning {
background-color: #FCC;
border: 1px solid #FAA;
}
div.danger {
background-color: #FCC;
border: 1px solid #FAA;
-moz-box-shadow: 2px 2px 4px #D52C2C;
-webkit-box-shadow: 2px 2px 4px #D52C2C;
box-shadow: 2px 2px 4px #D52C2C;
}
div.error {
background-color: #FCC;
border: 1px solid #FAA;
-moz-box-shadow: 2px 2px 4px #D52C2C;
-webkit-box-shadow: 2px 2px 4px #D52C2C;
box-shadow: 2px 2px 4px #D52C2C;
}
div.caution {
background-color: #FCC;
border: 1px solid #FAA;
}
div.attention {
background-color: #FCC;
border: 1px solid #FAA;
}
div.important {
background-color: #EEE;
border: 1px solid #CCC;
}
div.note {
background-color: #EEE;
border: 1px solid #CCC;
}
div.tip {
background-color: #EEE;
border: 1px solid #CCC;
}
div.hint {
background-color: #EEE;
border: 1px solid #CCC;
}
div.seealso {
background-color: #EEE;
border: 1px solid #CCC;
}
div.topic {
background-color: #EEE;
}
p.admonition-title {
display: inline;
}
p.admonition-title:after {
content: ":";
}
pre, tt, code {
font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
font-size: 0.9em;
}
.hll {
background-color: #FFC;
margin: 0 -12px;
padding: 0 12px;
display: block;
}
img.screenshot {
}
tt.descname, tt.descclassname, code.descname, code.descclassname {
font-size: 0.95em;
}
tt.descname, code.descname {
padding-right: 0.08em;
}
img.screenshot {
-moz-box-shadow: 2px 2px 4px #EEE;
-webkit-box-shadow: 2px 2px 4px #EEE;
box-shadow: 2px 2px 4px #EEE;
}
table.docutils {
border: 1px solid #888;
-moz-box-shadow: 2px 2px 4px #EEE;
-webkit-box-shadow: 2px 2px 4px #EEE;
box-shadow: 2px 2px 4px #EEE;
}
table.docutils td, table.docutils th {
border: 1px solid #888;
padding: 0.25em 0.7em;
}
table.field-list, table.footnote {
border: none;
-moz-box-shadow: none;
-webkit-box-shadow: none;
box-shadow: none;
}
table.footnote {
margin: 15px 0;
width: 100%;
border: 1px solid #EEE;
background: #FDFDFD;
font-size: 0.9em;
}
table.footnote + table.footnote {
margin-top: -15px;
border-top: none;
}
table.field-list th {
padding: 0 0.8em 0 0;
}
table.field-list td {
padding: 0;
}
table.field-list p {
margin-bottom: 0.8em;
}
/* Cloned from
* https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68
*/
.field-name {
-moz-hyphens: manual;
-ms-hyphens: manual;
-webkit-hyphens: manual;
hyphens: manual;
}
table.footnote td.label {
width: .1px;
padding: 0.3em 0 0.3em 0.5em;
}
table.footnote td {
padding: 0.3em 0.5em;
}
dl {
margin-left: 0;
margin-right: 0;
margin-top: 0;
padding: 0;
}
dl dd {
margin-left: 30px;
}
blockquote {
margin: 0 0 0 30px;
padding: 0;
}
ul, ol {
/* Matches the 30px from the narrow-screen "li > ul" selector below */
margin: 10px 0 10px 30px;
padding: 0;
}
pre {
background: unset;
padding: 7px 30px;
margin: 15px 0px;
line-height: 1.3em;
}
div.viewcode-block:target {
background: #ffd;
}
dl pre, blockquote pre, li pre {
margin-left: 0;
padding-left: 30px;
}
tt, code {
background-color: #ecf0f3;
color: #222;
/* padding: 1px 2px; */
}
tt.xref, code.xref, a tt {
background-color: #FBFBFB;
border-bottom: 1px solid #fff;
}
a.reference {
text-decoration: none;
border-bottom: 1px dotted #004B6B;
}
a.reference:hover {
border-bottom: 1px solid #6D4100;
}
/* Don't put an underline on images */
a.image-reference, a.image-reference:hover {
border-bottom: none;
}
a.footnote-reference {
text-decoration: none;
font-size: 0.7em;
vertical-align: top;
border-bottom: 1px dotted #004B6B;
}
a.footnote-reference:hover {
border-bottom: 1px solid #6D4100;
}
a:hover tt, a:hover code {
background: #EEE;
}
@media screen and (max-width: 940px) {
body {
margin: 0;
padding: 20px 30px;
}
div.documentwrapper {
float: none;
background: #fff;
margin-left: 0;
margin-top: 0;
margin-right: 0;
margin-bottom: 0;
}
div.sphinxsidebar {
display: block;
float: none;
width: unset;
margin: 50px -30px -20px -30px;
padding: 10px 20px;
background: #333;
color: #FFF;
}
div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p,
div.sphinxsidebar h3 a {
color: #fff;
}
div.sphinxsidebar a {
color: #AAA;
}
div.sphinxsidebar p.logo {
display: none;
}
div.document {
width: 100%;
margin: 0;
}
div.footer {
display: none;
}
div.bodywrapper {
margin: 0;
}
div.body {
min-height: 0;
min-width: auto; /* fixes width on small screens, breaks .hll */
padding: 0;
}
.hll {
/* "fixes" the breakage */
width: max-content;
}
.rtd_doc_footer {
display: none;
}
.document {
width: auto;
}
.footer {
width: auto;
}
.github {
display: none;
}
ul {
margin-left: 0;
}
li > ul {
/* Matches the 30px from the "ul, ol" selector above */
margin-left: 30px;
}
}
/* misc. */
.revsys-inline {
display: none!important;
}
/* Hide ugly table cell borders in ..bibliography:: directive output */
table.docutils.citation, table.docutils.citation td, table.docutils.citation th {
border: none;
/* Below needed in some edge cases; if not applied, bottom shadows appear */
-moz-box-shadow: none;
-webkit-box-shadow: none;
box-shadow: none;
}
/* relbar */
.related {
line-height: 30px;
width: 100%;
font-size: 0.9rem;
}
.related.top {
border-bottom: 1px solid #EEE;
margin-bottom: 20px;
}
.related.bottom {
border-top: 1px solid #EEE;
}
.related ul {
padding: 0;
margin: 0;
list-style: none;
}
.related li {
display: inline;
}
nav#rellinks {
float: right;
}
nav#rellinks li+li:before {
content: "|";
}
nav#breadcrumbs li+li:before {
content: "\00BB";
}
/* Hide certain items when printing */
@media print {
div.related {
display: none;
}
}
img.github {
position: absolute;
top: 0;
border: 0;
right: 0;
}

View File

@@ -0,0 +1,476 @@
// @ts-check
/**@constructor*/
BaseStemmer = function() {
/** @protected */
this.current = '';
this.cursor = 0;
this.limit = 0;
this.limit_backward = 0;
this.bra = 0;
this.ket = 0;
/**
* @param {string} value
*/
this.setCurrent = function(value) {
this.current = value;
this.cursor = 0;
this.limit = this.current.length;
this.limit_backward = 0;
this.bra = this.cursor;
this.ket = this.limit;
};
/**
* @return {string}
*/
this.getCurrent = function() {
return this.current;
};
/**
* @param {BaseStemmer} other
*/
this.copy_from = function(other) {
/** @protected */
this.current = other.current;
this.cursor = other.cursor;
this.limit = other.limit;
this.limit_backward = other.limit_backward;
this.bra = other.bra;
this.ket = other.ket;
};
/**
* @param {number[]} s
* @param {number} min
* @param {number} max
* @return {boolean}
*/
this.in_grouping = function(s, min, max) {
/** @protected */
if (this.cursor >= this.limit) return false;
var ch = this.current.charCodeAt(this.cursor);
if (ch > max || ch < min) return false;
ch -= min;
if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) return false;
this.cursor++;
return true;
};
/**
* @param {number[]} s
* @param {number} min
* @param {number} max
* @return {boolean}
*/
this.go_in_grouping = function(s, min, max) {
/** @protected */
while (this.cursor < this.limit) {
var ch = this.current.charCodeAt(this.cursor);
if (ch > max || ch < min)
return true;
ch -= min;
if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0)
return true;
this.cursor++;
}
return false;
};
/**
* @param {number[]} s
* @param {number} min
* @param {number} max
* @return {boolean}
*/
this.in_grouping_b = function(s, min, max) {
/** @protected */
if (this.cursor <= this.limit_backward) return false;
var ch = this.current.charCodeAt(this.cursor - 1);
if (ch > max || ch < min) return false;
ch -= min;
if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) return false;
this.cursor--;
return true;
};
/**
* @param {number[]} s
* @param {number} min
* @param {number} max
* @return {boolean}
*/
this.go_in_grouping_b = function(s, min, max) {
/** @protected */
while (this.cursor > this.limit_backward) {
var ch = this.current.charCodeAt(this.cursor - 1);
if (ch > max || ch < min) return true;
ch -= min;
if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) return true;
this.cursor--;
}
return false;
};
/**
* @param {number[]} s
* @param {number} min
* @param {number} max
* @return {boolean}
*/
this.out_grouping = function(s, min, max) {
/** @protected */
if (this.cursor >= this.limit) return false;
var ch = this.current.charCodeAt(this.cursor);
if (ch > max || ch < min) {
this.cursor++;
return true;
}
ch -= min;
if ((s[ch >>> 3] & (0X1 << (ch & 0x7))) == 0) {
this.cursor++;
return true;
}
return false;
};
/**
* @param {number[]} s
* @param {number} min
* @param {number} max
* @return {boolean}
*/
this.go_out_grouping = function(s, min, max) {
/** @protected */
while (this.cursor < this.limit) {
var ch = this.current.charCodeAt(this.cursor);
if (ch <= max && ch >= min) {
ch -= min;
if ((s[ch >>> 3] & (0X1 << (ch & 0x7))) != 0) {
return true;
}
}
this.cursor++;
}
return false;
};
/**
* @param {number[]} s
* @param {number} min
* @param {number} max
* @return {boolean}
*/
this.out_grouping_b = function(s, min, max) {
/** @protected */
if (this.cursor <= this.limit_backward) return false;
var ch = this.current.charCodeAt(this.cursor - 1);
if (ch > max || ch < min) {
this.cursor--;
return true;
}
ch -= min;
if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) {
this.cursor--;
return true;
}
return false;
};
/**
* @param {number[]} s
* @param {number} min
* @param {number} max
* @return {boolean}
*/
this.go_out_grouping_b = function(s, min, max) {
/** @protected */
while (this.cursor > this.limit_backward) {
var ch = this.current.charCodeAt(this.cursor - 1);
if (ch <= max && ch >= min) {
ch -= min;
if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) != 0) {
return true;
}
}
this.cursor--;
}
return false;
};
/**
* @param {string} s
* @return {boolean}
*/
this.eq_s = function(s)
{
/** @protected */
if (this.limit - this.cursor < s.length) return false;
if (this.current.slice(this.cursor, this.cursor + s.length) != s)
{
return false;
}
this.cursor += s.length;
return true;
};
/**
* @param {string} s
* @return {boolean}
*/
this.eq_s_b = function(s)
{
/** @protected */
if (this.cursor - this.limit_backward < s.length) return false;
if (this.current.slice(this.cursor - s.length, this.cursor) != s)
{
return false;
}
this.cursor -= s.length;
return true;
};
/**
* @param {Among[]} v
* @return {number}
*/
this.find_among = function(v)
{
/** @protected */
var i = 0;
var j = v.length;
var c = this.cursor;
var l = this.limit;
var common_i = 0;
var common_j = 0;
var first_key_inspected = false;
while (true)
{
var k = i + ((j - i) >>> 1);
var diff = 0;
var common = common_i < common_j ? common_i : common_j; // smaller
// w[0]: string, w[1]: substring_i, w[2]: result, w[3]: function (optional)
var w = v[k];
var i2;
for (i2 = common; i2 < w[0].length; i2++)
{
if (c + common == l)
{
diff = -1;
break;
}
diff = this.current.charCodeAt(c + common) - w[0].charCodeAt(i2);
if (diff != 0) break;
common++;
}
if (diff < 0)
{
j = k;
common_j = common;
}
else
{
i = k;
common_i = common;
}
if (j - i <= 1)
{
if (i > 0) break; // v->s has been inspected
if (j == i) break; // only one item in v
// - but now we need to go round once more to get
// v->s inspected. This looks messy, but is actually
// the optimal approach.
if (first_key_inspected) break;
first_key_inspected = true;
}
}
do {
var w = v[i];
if (common_i >= w[0].length)
{
this.cursor = c + w[0].length;
if (w.length < 4) return w[2];
var res = w[3](this);
this.cursor = c + w[0].length;
if (res) return w[2];
}
i = w[1];
} while (i >= 0);
return 0;
};
// find_among_b is for backwards processing. Same comments apply
/**
* @param {Among[]} v
* @return {number}
*/
this.find_among_b = function(v)
{
/** @protected */
var i = 0;
var j = v.length
var c = this.cursor;
var lb = this.limit_backward;
var common_i = 0;
var common_j = 0;
var first_key_inspected = false;
while (true)
{
var k = i + ((j - i) >> 1);
var diff = 0;
var common = common_i < common_j ? common_i : common_j;
var w = v[k];
var i2;
for (i2 = w[0].length - 1 - common; i2 >= 0; i2--)
{
if (c - common == lb)
{
diff = -1;
break;
}
diff = this.current.charCodeAt(c - 1 - common) - w[0].charCodeAt(i2);
if (diff != 0) break;
common++;
}
if (diff < 0)
{
j = k;
common_j = common;
}
else
{
i = k;
common_i = common;
}
if (j - i <= 1)
{
if (i > 0) break;
if (j == i) break;
if (first_key_inspected) break;
first_key_inspected = true;
}
}
do {
var w = v[i];
if (common_i >= w[0].length)
{
this.cursor = c - w[0].length;
if (w.length < 4) return w[2];
var res = w[3](this);
this.cursor = c - w[0].length;
if (res) return w[2];
}
i = w[1];
} while (i >= 0);
return 0;
};
/* to replace chars between c_bra and c_ket in this.current by the
* chars in s.
*/
/**
* @param {number} c_bra
* @param {number} c_ket
* @param {string} s
* @return {number}
*/
this.replace_s = function(c_bra, c_ket, s)
{
/** @protected */
var adjustment = s.length - (c_ket - c_bra);
this.current = this.current.slice(0, c_bra) + s + this.current.slice(c_ket);
this.limit += adjustment;
if (this.cursor >= c_ket) this.cursor += adjustment;
else if (this.cursor > c_bra) this.cursor = c_bra;
return adjustment;
};
/**
* @return {boolean}
*/
this.slice_check = function()
{
/** @protected */
if (this.bra < 0 ||
this.bra > this.ket ||
this.ket > this.limit ||
this.limit > this.current.length)
{
return false;
}
return true;
};
/**
* @param {number} c_bra
* @return {boolean}
*/
this.slice_from = function(s)
{
/** @protected */
var result = false;
if (this.slice_check())
{
this.replace_s(this.bra, this.ket, s);
result = true;
}
return result;
};
/**
* @return {boolean}
*/
this.slice_del = function()
{
/** @protected */
return this.slice_from("");
};
/**
* @param {number} c_bra
* @param {number} c_ket
* @param {string} s
*/
this.insert = function(c_bra, c_ket, s)
{
/** @protected */
var adjustment = this.replace_s(c_bra, c_ket, s);
if (c_bra <= this.bra) this.bra += adjustment;
if (c_bra <= this.ket) this.ket += adjustment;
};
/**
* @return {string}
*/
this.slice_to = function()
{
/** @protected */
var result = '';
if (this.slice_check())
{
result = this.current.slice(this.bra, this.ket);
}
return result;
};
/**
* @return {string}
*/
this.assign_to = function()
{
/** @protected */
return this.current.slice(0, this.limit);
};
};

View File

@@ -0,0 +1,906 @@
/*
* Sphinx stylesheet -- basic theme.
*/
/* -- main layout ----------------------------------------------------------- */
div.clearer {
clear: both;
}
div.section::after {
display: block;
content: '';
clear: left;
}
/* -- relbar ---------------------------------------------------------------- */
div.related {
width: 100%;
font-size: 90%;
}
div.related h3 {
display: none;
}
div.related ul {
margin: 0;
padding: 0 0 0 10px;
list-style: none;
}
div.related li {
display: inline;
}
div.related li.right {
float: right;
margin-right: 5px;
}
/* -- sidebar --------------------------------------------------------------- */
div.sphinxsidebarwrapper {
padding: 10px 5px 0 10px;
}
div.sphinxsidebar {
float: left;
width: 230px;
margin-left: -100%;
font-size: 90%;
word-wrap: break-word;
overflow-wrap : break-word;
}
div.sphinxsidebar ul {
list-style: none;
}
div.sphinxsidebar ul ul,
div.sphinxsidebar ul.want-points {
margin-left: 20px;
list-style: square;
}
div.sphinxsidebar ul ul {
margin-top: 0;
margin-bottom: 0;
}
div.sphinxsidebar form {
margin-top: 10px;
}
div.sphinxsidebar input {
border: 1px solid #98dbcc;
font-family: sans-serif;
font-size: 1em;
}
div.sphinxsidebar #searchbox form.search {
overflow: hidden;
}
div.sphinxsidebar #searchbox input[type="text"] {
float: left;
width: 80%;
padding: 0.25em;
box-sizing: border-box;
}
div.sphinxsidebar #searchbox input[type="submit"] {
float: left;
width: 20%;
border-left: none;
padding: 0.25em;
box-sizing: border-box;
}
img {
border: 0;
max-width: 100%;
}
/* -- search page ----------------------------------------------------------- */
ul.search {
margin-top: 10px;
}
ul.search li {
padding: 5px 0;
}
ul.search li a {
font-weight: bold;
}
ul.search li p.context {
color: #888;
margin: 2px 0 0 30px;
text-align: left;
}
ul.keywordmatches li.goodmatch a {
font-weight: bold;
}
/* -- index page ------------------------------------------------------------ */
table.contentstable {
width: 90%;
margin-left: auto;
margin-right: auto;
}
table.contentstable p.biglink {
line-height: 150%;
}
a.biglink {
font-size: 1.3em;
}
span.linkdescr {
font-style: italic;
padding-top: 5px;
font-size: 90%;
}
/* -- general index --------------------------------------------------------- */
table.indextable {
width: 100%;
}
table.indextable td {
text-align: left;
vertical-align: top;
}
table.indextable ul {
margin-top: 0;
margin-bottom: 0;
list-style-type: none;
}
table.indextable > tbody > tr > td > ul {
padding-left: 0em;
}
table.indextable tr.pcap {
height: 10px;
}
table.indextable tr.cap {
margin-top: 10px;
background-color: #f2f2f2;
}
img.toggler {
margin-right: 3px;
margin-top: 3px;
cursor: pointer;
}
div.modindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
div.genindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
/* -- domain module index --------------------------------------------------- */
table.modindextable td {
padding: 2px;
border-collapse: collapse;
}
/* -- general body styles --------------------------------------------------- */
div.body {
min-width: inherit;
max-width: 800px;
}
div.body p, div.body dd, div.body li, div.body blockquote {
-moz-hyphens: auto;
-ms-hyphens: auto;
-webkit-hyphens: auto;
hyphens: auto;
}
a.headerlink {
visibility: hidden;
}
a:visited {
color: #551A8B;
}
h1:hover > a.headerlink,
h2:hover > a.headerlink,
h3:hover > a.headerlink,
h4:hover > a.headerlink,
h5:hover > a.headerlink,
h6:hover > a.headerlink,
dt:hover > a.headerlink,
caption:hover > a.headerlink,
p.caption:hover > a.headerlink,
div.code-block-caption:hover > a.headerlink {
visibility: visible;
}
div.body p.caption {
text-align: inherit;
}
div.body td {
text-align: left;
}
.first {
margin-top: 0 !important;
}
p.rubric {
margin-top: 30px;
font-weight: bold;
}
img.align-left, figure.align-left, .figure.align-left, object.align-left {
clear: left;
float: left;
margin-right: 1em;
}
img.align-right, figure.align-right, .figure.align-right, object.align-right {
clear: right;
float: right;
margin-left: 1em;
}
img.align-center, figure.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
img.align-default, figure.align-default, .figure.align-default {
display: block;
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left;
}
.align-center {
text-align: center;
}
.align-default {
text-align: center;
}
.align-right {
text-align: right;
}
/* -- sidebars -------------------------------------------------------------- */
div.sidebar,
aside.sidebar {
margin: 0 0 0.5em 1em;
border: 1px solid #ddb;
padding: 7px;
background-color: #ffe;
width: 40%;
float: right;
clear: right;
overflow-x: auto;
}
p.sidebar-title {
font-weight: bold;
}
nav.contents,
aside.topic,
div.admonition, div.topic, blockquote {
clear: left;
}
/* -- topics ---------------------------------------------------------------- */
nav.contents,
aside.topic,
div.topic {
border: 1px solid #ccc;
padding: 7px;
margin: 10px 0 10px 0;
}
p.topic-title {
font-size: 1.1em;
font-weight: bold;
margin-top: 10px;
}
/* -- admonitions ----------------------------------------------------------- */
div.admonition {
margin-top: 10px;
margin-bottom: 10px;
padding: 7px;
}
div.admonition dt {
font-weight: bold;
}
p.admonition-title {
margin: 0px 10px 5px 0px;
font-weight: bold;
}
div.body p.centered {
text-align: center;
margin-top: 25px;
}
/* -- content of sidebars/topics/admonitions -------------------------------- */
div.sidebar > :last-child,
aside.sidebar > :last-child,
nav.contents > :last-child,
aside.topic > :last-child,
div.topic > :last-child,
div.admonition > :last-child {
margin-bottom: 0;
}
div.sidebar::after,
aside.sidebar::after,
nav.contents::after,
aside.topic::after,
div.topic::after,
div.admonition::after,
blockquote::after {
display: block;
content: '';
clear: both;
}
/* -- tables ---------------------------------------------------------------- */
table.docutils {
margin-top: 10px;
margin-bottom: 10px;
border: 0;
border-collapse: collapse;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
table.align-default {
margin-left: auto;
margin-right: auto;
}
table caption span.caption-number {
font-style: italic;
}
table caption span.caption-text {
}
table.docutils td, table.docutils th {
padding: 1px 8px 1px 5px;
border-top: 0;
border-left: 0;
border-right: 0;
border-bottom: 1px solid #aaa;
}
th {
text-align: left;
padding-right: 5px;
}
table.citation {
border-left: solid 1px gray;
margin-left: 1px;
}
table.citation td {
border-bottom: none;
}
th > :first-child,
td > :first-child {
margin-top: 0px;
}
th > :last-child,
td > :last-child {
margin-bottom: 0px;
}
/* -- figures --------------------------------------------------------------- */
div.figure, figure {
margin: 0.5em;
padding: 0.5em;
}
div.figure p.caption, figcaption {
padding: 0.3em;
}
div.figure p.caption span.caption-number,
figcaption span.caption-number {
font-style: italic;
}
div.figure p.caption span.caption-text,
figcaption span.caption-text {
}
/* -- field list styles ----------------------------------------------------- */
table.field-list td, table.field-list th {
border: 0 !important;
}
.field-list ul {
margin: 0;
padding-left: 1em;
}
.field-list p {
margin: 0;
}
.field-name {
-moz-hyphens: manual;
-ms-hyphens: manual;
-webkit-hyphens: manual;
hyphens: manual;
}
/* -- hlist styles ---------------------------------------------------------- */
table.hlist {
margin: 1em 0;
}
table.hlist td {
vertical-align: top;
}
/* -- object description styles --------------------------------------------- */
.sig {
font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
}
.sig-name, code.descname {
background-color: transparent;
font-weight: bold;
}
.sig-name {
font-size: 1.1em;
}
code.descname {
font-size: 1.2em;
}
.sig-prename, code.descclassname {
background-color: transparent;
}
.optional {
font-size: 1.3em;
}
.sig-paren {
font-size: larger;
}
.sig-param.n {
font-style: italic;
}
/* C++ specific styling */
.sig-inline.c-texpr,
.sig-inline.cpp-texpr {
font-family: unset;
}
.sig.c .k, .sig.c .kt,
.sig.cpp .k, .sig.cpp .kt {
color: #0033B3;
}
.sig.c .m,
.sig.cpp .m {
color: #1750EB;
}
.sig.c .s, .sig.c .sc,
.sig.cpp .s, .sig.cpp .sc {
color: #067D17;
}
/* -- other body styles ----------------------------------------------------- */
ol.arabic {
list-style: decimal;
}
ol.loweralpha {
list-style: lower-alpha;
}
ol.upperalpha {
list-style: upper-alpha;
}
ol.lowerroman {
list-style: lower-roman;
}
ol.upperroman {
list-style: upper-roman;
}
:not(li) > ol > li:first-child > :first-child,
:not(li) > ul > li:first-child > :first-child {
margin-top: 0px;
}
:not(li) > ol > li:last-child > :last-child,
:not(li) > ul > li:last-child > :last-child {
margin-bottom: 0px;
}
ol.simple ol p,
ol.simple ul p,
ul.simple ol p,
ul.simple ul p {
margin-top: 0;
}
ol.simple > li:not(:first-child) > p,
ul.simple > li:not(:first-child) > p {
margin-top: 0;
}
ol.simple p,
ul.simple p {
margin-bottom: 0;
}
aside.footnote > span,
div.citation > span {
float: left;
}
aside.footnote > span:last-of-type,
div.citation > span:last-of-type {
padding-right: 0.5em;
}
aside.footnote > p {
margin-left: 2em;
}
div.citation > p {
margin-left: 4em;
}
aside.footnote > p:last-of-type,
div.citation > p:last-of-type {
margin-bottom: 0em;
}
aside.footnote > p:last-of-type:after,
div.citation > p:last-of-type:after {
content: "";
clear: both;
}
dl.field-list {
display: grid;
grid-template-columns: fit-content(30%) auto;
}
dl.field-list > dt {
font-weight: bold;
word-break: break-word;
padding-left: 0.5em;
padding-right: 5px;
}
dl.field-list > dd {
padding-left: 0.5em;
margin-top: 0em;
margin-left: 0em;
margin-bottom: 0em;
}
dl {
margin-bottom: 15px;
}
dd > :first-child {
margin-top: 0px;
}
dd ul, dd table {
margin-bottom: 10px;
}
dd {
margin-top: 3px;
margin-bottom: 10px;
margin-left: 30px;
}
.sig dd {
margin-top: 0px;
margin-bottom: 0px;
}
.sig dl {
margin-top: 0px;
margin-bottom: 0px;
}
dl > dd:last-child,
dl > dd:last-child > :last-child {
margin-bottom: 0;
}
dt:target, span.highlighted {
background-color: #fbe54e;
}
rect.highlighted {
fill: #fbe54e;
}
dl.glossary dt {
font-weight: bold;
font-size: 1.1em;
}
.versionmodified {
font-style: italic;
}
.system-message {
background-color: #fda;
padding: 5px;
border: 3px solid red;
}
.footnote:target {
background-color: #ffa;
}
.line-block {
display: block;
margin-top: 1em;
margin-bottom: 1em;
}
.line-block .line-block {
margin-top: 0;
margin-bottom: 0;
margin-left: 1.5em;
}
.guilabel, .menuselection {
font-family: sans-serif;
}
.accelerator {
text-decoration: underline;
}
.classifier {
font-style: oblique;
}
.classifier:before {
font-style: normal;
margin: 0 0.5em;
content: ":";
display: inline-block;
}
abbr, acronym {
border-bottom: dotted 1px;
cursor: help;
}
/* -- code displays --------------------------------------------------------- */
pre {
overflow: auto;
overflow-y: hidden; /* fixes display issues on Chrome browsers */
}
pre, div[class*="highlight-"] {
clear: both;
}
span.pre {
-moz-hyphens: none;
-ms-hyphens: none;
-webkit-hyphens: none;
hyphens: none;
white-space: nowrap;
}
div[class*="highlight-"] {
margin: 1em 0;
}
td.linenos pre {
border: 0;
background-color: transparent;
color: #aaa;
}
table.highlighttable {
display: block;
}
table.highlighttable tbody {
display: block;
}
table.highlighttable tr {
display: flex;
}
table.highlighttable td {
margin: 0;
padding: 0;
}
table.highlighttable td.linenos {
padding-right: 0.5em;
}
table.highlighttable td.code {
flex: 1;
overflow: hidden;
}
.highlight .hll {
display: block;
}
div.highlight pre,
table.highlighttable pre {
margin: 0;
}
div.code-block-caption + div {
margin-top: 0;
}
div.code-block-caption {
margin-top: 1em;
padding: 2px 5px;
font-size: small;
}
div.code-block-caption code {
background-color: transparent;
}
table.highlighttable td.linenos,
span.linenos,
div.highlight span.gp { /* gp: Generic.Prompt */
user-select: none;
-webkit-user-select: text; /* Safari fallback only */
-webkit-user-select: none; /* Chrome/Safari */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* IE10+ */
}
div.code-block-caption span.caption-number {
padding: 0.1em 0.3em;
font-style: italic;
}
div.code-block-caption span.caption-text {
}
div.literal-block-wrapper {
margin: 1em 0;
}
code.xref, a code {
background-color: transparent;
font-weight: bold;
}
h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
background-color: transparent;
}
.viewcode-link {
float: right;
}
.viewcode-back {
float: right;
font-family: sans-serif;
}
div.viewcode-block:target {
margin: -1px -10px;
padding: 0 10px;
}
/* -- math display ---------------------------------------------------------- */
img.math {
vertical-align: middle;
}
div.body div.math p {
text-align: center;
}
span.eqno {
float: right;
}
span.eqno a.headerlink {
position: absolute;
z-index: 1;
}
div.math:hover a.headerlink {
visibility: visible;
}
/* -- printout stylesheet --------------------------------------------------- */
@media print {
div.document,
div.documentwrapper,
div.bodywrapper {
margin: 0 !important;
width: 100%;
}
div.sphinxsidebar,
div.related,
div.footer,
#top-link {
display: none;
}
}

View File

@@ -0,0 +1 @@
/* This file intentionally left blank. */

View File

@@ -0,0 +1,150 @@
/*
* Base JavaScript utilities for all Sphinx HTML documentation.
*/
"use strict";
const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([
"TEXTAREA",
"INPUT",
"SELECT",
"BUTTON",
]);
const _ready = (callback) => {
if (document.readyState !== "loading") {
callback();
} else {
document.addEventListener("DOMContentLoaded", callback);
}
};
/**
* Small JavaScript module for the documentation.
*/
const Documentation = {
init: () => {
Documentation.initDomainIndexTable();
Documentation.initOnKeyListeners();
},
/**
* i18n support
*/
TRANSLATIONS: {},
PLURAL_EXPR: (n) => (n === 1 ? 0 : 1),
LOCALE: "unknown",
// gettext and ngettext don't access this so that the functions
// can safely bound to a different name (_ = Documentation.gettext)
gettext: (string) => {
const translated = Documentation.TRANSLATIONS[string];
switch (typeof translated) {
case "undefined":
return string; // no translation
case "string":
return translated; // translation exists
default:
return translated[0]; // (singular, plural) translation tuple exists
}
},
ngettext: (singular, plural, n) => {
const translated = Documentation.TRANSLATIONS[singular];
if (typeof translated !== "undefined")
return translated[Documentation.PLURAL_EXPR(n)];
return n === 1 ? singular : plural;
},
addTranslations: (catalog) => {
Object.assign(Documentation.TRANSLATIONS, catalog.messages);
Documentation.PLURAL_EXPR = new Function(
"n",
`return (${catalog.plural_expr})`,
);
Documentation.LOCALE = catalog.locale;
},
/**
* helper function to focus on search bar
*/
focusSearchBar: () => {
document.querySelectorAll("input[name=q]")[0]?.focus();
},
/**
* Initialise the domain index toggle buttons
*/
initDomainIndexTable: () => {
const toggler = (el) => {
const idNumber = el.id.substr(7);
const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`);
if (el.src.substr(-9) === "minus.png") {
el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`;
toggledRows.forEach((el) => (el.style.display = "none"));
} else {
el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`;
toggledRows.forEach((el) => (el.style.display = ""));
}
};
const togglerElements = document.querySelectorAll("img.toggler");
togglerElements.forEach((el) =>
el.addEventListener("click", (event) => toggler(event.currentTarget)),
);
togglerElements.forEach((el) => (el.style.display = ""));
if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler);
},
initOnKeyListeners: () => {
// only install a listener if it is really needed
if (
!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS
&& !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS
)
return;
document.addEventListener("keydown", (event) => {
// bail for input elements
if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName))
return;
// bail with special keys
if (event.altKey || event.ctrlKey || event.metaKey) return;
if (!event.shiftKey) {
switch (event.key) {
case "ArrowLeft":
if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
const prevLink = document.querySelector('link[rel="prev"]');
if (prevLink && prevLink.href) {
window.location.href = prevLink.href;
event.preventDefault();
}
break;
case "ArrowRight":
if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
const nextLink = document.querySelector('link[rel="next"]');
if (nextLink && nextLink.href) {
window.location.href = nextLink.href;
event.preventDefault();
}
break;
}
}
// some keyboard layouts may need Shift to get /
switch (event.key) {
case "/":
if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break;
Documentation.focusSearchBar();
event.preventDefault();
}
});
},
};
// quick alias for translations
const _ = Documentation.gettext;
_ready(Documentation.init);

View File

@@ -0,0 +1,13 @@
const DOCUMENTATION_OPTIONS = {
VERSION: '1.0',
LANGUAGE: 'en',
COLLAPSE_INDEX: false,
BUILDER: 'html',
FILE_SUFFIX: '.html',
LINK_SUFFIX: '.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt',
NAVIGATION_WITH_KEYS: false,
SHOW_SEARCH_SUMMARY: true,
ENABLE_SEARCH_SHORTCUTS: true,
};

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 B

View File

@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" width="80" height="80" viewBox="0 0 250 250" fill="#fff">
<path d="M0 0l115 115h15l12 27 108 108V0z" fill="#151513"/>
<path d="M128 109c-15-9-9-19-9-19 3-7 2-11 2-11-1-7 3-2 3-2 4 5 2 11 2 11-3 10 5 15 9 16"/>
<path d="M115 115s4 2 5 0l14-14c3-2 6-3 8-3-8-11-15-24 2-41 5-5 10-7 16-7 1-2 3-7 12-11 0 0 5 3 7 16 4 2 8 5 12 9s7 8 9 12c14 3 17 7 17 7-4 8-9 11-11 11 0 6-2 11-7 16-16 16-30 10-41 2 0 3-1 7-5 11l-12 11c-1 1 1 5 1 5z"/>
</svg>

After

Width:  |  Height:  |  Size: 490 B

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 B

View File

@@ -0,0 +1,84 @@
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #f8f8f8; }
.highlight .c { color: #8F5902; font-style: italic } /* Comment */
.highlight .err { color: #A40000; border: 1px solid #EF2929 } /* Error */
.highlight .g { color: #000 } /* Generic */
.highlight .k { color: #004461; font-weight: bold } /* Keyword */
.highlight .l { color: #000 } /* Literal */
.highlight .n { color: #000 } /* Name */
.highlight .o { color: #582800 } /* Operator */
.highlight .x { color: #000 } /* Other */
.highlight .p { color: #000; font-weight: bold } /* Punctuation */
.highlight .ch { color: #8F5902; font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: #8F5902; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #8F5902 } /* Comment.Preproc */
.highlight .cpf { color: #8F5902; font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: #8F5902; font-style: italic } /* Comment.Single */
.highlight .cs { color: #8F5902; font-style: italic } /* Comment.Special */
.highlight .gd { color: #A40000 } /* Generic.Deleted */
.highlight .ge { color: #000; font-style: italic } /* Generic.Emph */
.highlight .ges { color: #000 } /* Generic.EmphStrong */
.highlight .gr { color: #EF2929 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #00A000 } /* Generic.Inserted */
.highlight .go { color: #888 } /* Generic.Output */
.highlight .gp { color: #745334 } /* Generic.Prompt */
.highlight .gs { color: #000; font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #A40000; font-weight: bold } /* Generic.Traceback */
.highlight .kc { color: #004461; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #004461; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #004461; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #004461; font-weight: bold } /* Keyword.Pseudo */
.highlight .kr { color: #004461; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #004461; font-weight: bold } /* Keyword.Type */
.highlight .ld { color: #000 } /* Literal.Date */
.highlight .m { color: #900 } /* Literal.Number */
.highlight .s { color: #4E9A06 } /* Literal.String */
.highlight .na { color: #C4A000 } /* Name.Attribute */
.highlight .nb { color: #004461 } /* Name.Builtin */
.highlight .nc { color: #000 } /* Name.Class */
.highlight .no { color: #000 } /* Name.Constant */
.highlight .nd { color: #888 } /* Name.Decorator */
.highlight .ni { color: #CE5C00 } /* Name.Entity */
.highlight .ne { color: #C00; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #000 } /* Name.Function */
.highlight .nl { color: #F57900 } /* Name.Label */
.highlight .nn { color: #000 } /* Name.Namespace */
.highlight .nx { color: #000 } /* Name.Other */
.highlight .py { color: #000 } /* Name.Property */
.highlight .nt { color: #004461; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #000 } /* Name.Variable */
.highlight .ow { color: #004461; font-weight: bold } /* Operator.Word */
.highlight .pm { color: #000; font-weight: bold } /* Punctuation.Marker */
.highlight .w { color: #F8F8F8 } /* Text.Whitespace */
.highlight .mb { color: #900 } /* Literal.Number.Bin */
.highlight .mf { color: #900 } /* Literal.Number.Float */
.highlight .mh { color: #900 } /* Literal.Number.Hex */
.highlight .mi { color: #900 } /* Literal.Number.Integer */
.highlight .mo { color: #900 } /* Literal.Number.Oct */
.highlight .sa { color: #4E9A06 } /* Literal.String.Affix */
.highlight .sb { color: #4E9A06 } /* Literal.String.Backtick */
.highlight .sc { color: #4E9A06 } /* Literal.String.Char */
.highlight .dl { color: #4E9A06 } /* Literal.String.Delimiter */
.highlight .sd { color: #8F5902; font-style: italic } /* Literal.String.Doc */
.highlight .s2 { color: #4E9A06 } /* Literal.String.Double */
.highlight .se { color: #4E9A06 } /* Literal.String.Escape */
.highlight .sh { color: #4E9A06 } /* Literal.String.Heredoc */
.highlight .si { color: #4E9A06 } /* Literal.String.Interpol */
.highlight .sx { color: #4E9A06 } /* Literal.String.Other */
.highlight .sr { color: #4E9A06 } /* Literal.String.Regex */
.highlight .s1 { color: #4E9A06 } /* Literal.String.Single */
.highlight .ss { color: #4E9A06 } /* Literal.String.Symbol */
.highlight .bp { color: #3465A4 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #000 } /* Name.Function.Magic */
.highlight .vc { color: #000 } /* Name.Variable.Class */
.highlight .vg { color: #000 } /* Name.Variable.Global */
.highlight .vi { color: #000 } /* Name.Variable.Instance */
.highlight .vm { color: #000 } /* Name.Variable.Magic */
.highlight .il { color: #900 } /* Literal.Number.Integer.Long */

View File

@@ -0,0 +1,693 @@
/*
* Sphinx JavaScript utilities for the full-text search.
*/
"use strict";
/**
* Simple result scoring code.
*/
if (typeof Scorer === "undefined") {
var Scorer = {
// Implement the following function to further tweak the score for each result
// The function takes a result array [docname, title, anchor, descr, score, filename]
// and returns the new score.
/*
score: result => {
const [docname, title, anchor, descr, score, filename, kind] = result
return score
},
*/
// query matches the full name of an object
objNameMatch: 11,
// or matches in the last dotted part of the object name
objPartialMatch: 6,
// Additive scores depending on the priority of the object
objPrio: {
0: 15, // used to be importantResults
1: 5, // used to be objectResults
2: -5, // used to be unimportantResults
},
// Used when the priority is not in the mapping.
objPrioDefault: 0,
// query found in title
title: 15,
partialTitle: 7,
// query found in terms
term: 5,
partialTerm: 2,
};
}
// Global search result kind enum, used by themes to style search results.
// prettier-ignore
class SearchResultKind {
static get index() { return "index"; }
static get object() { return "object"; }
static get text() { return "text"; }
static get title() { return "title"; }
}
const _removeChildren = (element) => {
while (element && element.lastChild) element.removeChild(element.lastChild);
};
/**
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping
*/
const _escapeRegExp = (string) =>
string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
const _escapeHTML = (text) => {
return text
.replaceAll("&", "&amp;")
.replaceAll("<", "&lt;")
.replaceAll(">", "&gt;")
.replaceAll('"', "&quot;")
.replaceAll("'", "&apos;");
};
const _displayItem = (item, searchTerms, highlightTerms) => {
const docBuilder = DOCUMENTATION_OPTIONS.BUILDER;
const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX;
const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX;
const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY;
const contentRoot = document.documentElement.dataset.content_root;
const [docName, title, anchor, descr, score, _filename, kind] = item;
let listItem = document.createElement("li");
// Add a class representing the item's type:
// can be used by a theme's CSS selector for styling
// See SearchResultKind for the class names.
listItem.classList.add(`kind-${kind}`);
let requestUrl;
let linkUrl;
if (docBuilder === "dirhtml") {
// dirhtml builder
let dirname = docName + "/";
if (dirname.match(/\/index\/$/))
dirname = dirname.substring(0, dirname.length - 6);
else if (dirname === "index/") dirname = "";
requestUrl = contentRoot + dirname;
linkUrl = requestUrl;
} else {
// normal html builders
requestUrl = contentRoot + docName + docFileSuffix;
linkUrl = docName + docLinkSuffix;
}
let linkEl = listItem.appendChild(document.createElement("a"));
linkEl.href = linkUrl + anchor;
linkEl.dataset.score = score;
linkEl.innerHTML = _escapeHTML(title);
if (descr) {
listItem.appendChild(document.createElement("span")).innerHTML =
` (${_escapeHTML(descr)})`;
// highlight search terms in the description
if (SPHINX_HIGHLIGHT_ENABLED)
// SPHINX_HIGHLIGHT_ENABLED is set in sphinx_highlight.js
highlightTerms.forEach((term) =>
_highlightText(listItem, term, "highlighted"),
);
} else if (showSearchSummary)
fetch(requestUrl)
.then((responseData) => responseData.text())
.then((data) => {
if (data)
listItem.appendChild(
Search.makeSearchSummary(data, searchTerms, anchor),
);
// highlight search terms in the summary
if (SPHINX_HIGHLIGHT_ENABLED)
// SPHINX_HIGHLIGHT_ENABLED is set in sphinx_highlight.js
highlightTerms.forEach((term) =>
_highlightText(listItem, term, "highlighted"),
);
});
Search.output.appendChild(listItem);
};
const _finishSearch = (resultCount) => {
Search.stopPulse();
Search.title.innerText = _("Search Results");
if (!resultCount)
Search.status.innerText = Documentation.gettext(
"Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.",
);
else
Search.status.innerText = Documentation.ngettext(
"Search finished, found one page matching the search query.",
"Search finished, found ${resultCount} pages matching the search query.",
resultCount,
).replace("${resultCount}", resultCount);
};
const _displayNextItem = (
results,
resultCount,
searchTerms,
highlightTerms,
) => {
// results left, load the summary and display it
// this is intended to be dynamic (don't sub resultsCount)
if (results.length) {
_displayItem(results.pop(), searchTerms, highlightTerms);
setTimeout(
() => _displayNextItem(results, resultCount, searchTerms, highlightTerms),
5,
);
}
// search finished, update title and status message
else _finishSearch(resultCount);
};
// Helper function used by query() to order search results.
// Each input is an array of [docname, title, anchor, descr, score, filename, kind].
// Order the results by score (in opposite order of appearance, since the
// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically.
const _orderResultsByScoreThenName = (a, b) => {
const leftScore = a[4];
const rightScore = b[4];
if (leftScore === rightScore) {
// same score: sort alphabetically
const leftTitle = a[1].toLowerCase();
const rightTitle = b[1].toLowerCase();
if (leftTitle === rightTitle) return 0;
return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
}
return leftScore > rightScore ? 1 : -1;
};
/**
* Default splitQuery function. Can be overridden in ``sphinx.search`` with a
* custom function per language.
*
* The regular expression works by splitting the string on consecutive characters
* that are not Unicode letters, numbers, underscores, or emoji characters.
* This is the same as ``\W+`` in Python, preserving the surrogate pair area.
*/
if (typeof splitQuery === "undefined") {
var splitQuery = (query) =>
query
.split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu)
.filter((term) => term); // remove remaining empty strings
}
/**
* Search Module
*/
const Search = {
_index: null,
_queued_query: null,
_pulse_status: -1,
htmlToText: (htmlString, anchor) => {
const htmlElement = new DOMParser().parseFromString(
htmlString,
"text/html",
);
for (const removalQuery of [".headerlink", "script", "style"]) {
htmlElement.querySelectorAll(removalQuery).forEach((el) => {
el.remove();
});
}
if (anchor) {
const anchorContent = htmlElement.querySelector(
`[role="main"] ${anchor}`,
);
if (anchorContent) return anchorContent.textContent;
console.warn(
`Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.`,
);
}
// if anchor not specified or not found, fall back to main content
const docContent = htmlElement.querySelector('[role="main"]');
if (docContent) return docContent.textContent;
console.warn(
"Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template.",
);
return "";
},
init: () => {
const query = new URLSearchParams(window.location.search).get("q");
document
.querySelectorAll('input[name="q"]')
.forEach((el) => (el.value = query));
if (query) Search.performSearch(query);
},
loadIndex: (url) =>
(document.body.appendChild(document.createElement("script")).src = url),
setIndex: (index) => {
Search._index = index;
if (Search._queued_query !== null) {
const query = Search._queued_query;
Search._queued_query = null;
Search.query(query);
}
},
hasIndex: () => Search._index !== null,
deferQuery: (query) => (Search._queued_query = query),
stopPulse: () => (Search._pulse_status = -1),
startPulse: () => {
if (Search._pulse_status >= 0) return;
const pulse = () => {
Search._pulse_status = (Search._pulse_status + 1) % 4;
Search.dots.innerText = ".".repeat(Search._pulse_status);
if (Search._pulse_status >= 0) window.setTimeout(pulse, 500);
};
pulse();
},
/**
* perform a search for something (or wait until index is loaded)
*/
performSearch: (query) => {
// create the required interface elements
const searchText = document.createElement("h2");
searchText.textContent = _("Searching");
const searchSummary = document.createElement("p");
searchSummary.classList.add("search-summary");
searchSummary.innerText = "";
const searchList = document.createElement("ul");
searchList.setAttribute("role", "list");
searchList.classList.add("search");
const out = document.getElementById("search-results");
Search.title = out.appendChild(searchText);
Search.dots = Search.title.appendChild(document.createElement("span"));
Search.status = out.appendChild(searchSummary);
Search.output = out.appendChild(searchList);
const searchProgress = document.getElementById("search-progress");
// Some themes don't use the search progress node
if (searchProgress) {
searchProgress.innerText = _("Preparing search...");
}
Search.startPulse();
// index already loaded, the browser was quick!
if (Search.hasIndex()) Search.query(query);
else Search.deferQuery(query);
},
_parseQuery: (query) => {
// stem the search terms and add them to the correct list
const stemmer = new Stemmer();
const searchTerms = new Set();
const excludedTerms = new Set();
const highlightTerms = new Set();
const objectTerms = new Set(splitQuery(query.toLowerCase().trim()));
splitQuery(query.trim()).forEach((queryTerm) => {
const queryTermLower = queryTerm.toLowerCase();
// maybe skip this "word"
// stopwords set is from language_data.js
if (stopwords.has(queryTermLower) || queryTerm.match(/^\d+$/)) return;
// stem the word
let word = stemmer.stemWord(queryTermLower);
// select the correct list
if (word[0] === "-") excludedTerms.add(word.substr(1));
else {
searchTerms.add(word);
highlightTerms.add(queryTermLower);
}
});
if (SPHINX_HIGHLIGHT_ENABLED) {
// SPHINX_HIGHLIGHT_ENABLED is set in sphinx_highlight.js
localStorage.setItem(
"sphinx_highlight_terms",
[...highlightTerms].join(" "),
);
}
// console.debug("SEARCH: searching for:");
// console.info("required: ", [...searchTerms]);
// console.info("excluded: ", [...excludedTerms]);
return [query, searchTerms, excludedTerms, highlightTerms, objectTerms];
},
/**
* execute search (requires search index to be loaded)
*/
_performSearch: (
query,
searchTerms,
excludedTerms,
highlightTerms,
objectTerms,
) => {
const filenames = Search._index.filenames;
const docNames = Search._index.docnames;
const titles = Search._index.titles;
const allTitles = Search._index.alltitles;
const indexEntries = Search._index.indexentries;
// Collect multiple result groups to be sorted separately and then ordered.
// Each is an array of [docname, title, anchor, descr, score, filename, kind].
const normalResults = [];
const nonMainIndexResults = [];
_removeChildren(document.getElementById("search-progress"));
const queryLower = query.toLowerCase().trim();
for (const [title, foundTitles] of Object.entries(allTitles)) {
if (
title.toLowerCase().trim().includes(queryLower)
&& queryLower.length >= title.length / 2
) {
for (const [file, id] of foundTitles) {
const score = Math.round(
(Scorer.title * queryLower.length) / title.length,
);
const boost = titles[file] === title ? 1 : 0; // add a boost for document titles
normalResults.push([
docNames[file],
titles[file] !== title ? `${titles[file]} > ${title}` : title,
id !== null ? "#" + id : "",
null,
score + boost,
filenames[file],
SearchResultKind.title,
]);
}
}
}
// search for explicit entries in index directives
for (const [entry, foundEntries] of Object.entries(indexEntries)) {
if (entry.includes(queryLower) && queryLower.length >= entry.length / 2) {
for (const [file, id, isMain] of foundEntries) {
const score = Math.round((100 * queryLower.length) / entry.length);
const result = [
docNames[file],
titles[file],
id ? "#" + id : "",
null,
score,
filenames[file],
SearchResultKind.index,
];
if (isMain) {
normalResults.push(result);
} else {
nonMainIndexResults.push(result);
}
}
}
}
// lookup as object
objectTerms.forEach((term) =>
normalResults.push(...Search.performObjectSearch(term, objectTerms)),
);
// lookup as search terms in fulltext
normalResults.push(
...Search.performTermsSearch(searchTerms, excludedTerms),
);
// let the scorer override scores with a custom scoring function
if (Scorer.score) {
normalResults.forEach((item) => (item[4] = Scorer.score(item)));
nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item)));
}
// Sort each group of results by score and then alphabetically by name.
normalResults.sort(_orderResultsByScoreThenName);
nonMainIndexResults.sort(_orderResultsByScoreThenName);
// Combine the result groups in (reverse) order.
// Non-main index entries are typically arbitrary cross-references,
// so display them after other results.
let results = [...nonMainIndexResults, ...normalResults];
// remove duplicate search results
// note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
let seen = new Set();
results = results.reverse().reduce((acc, result) => {
let resultStr = result
.slice(0, 4)
.concat([result[5]])
.map((v) => String(v))
.join(",");
if (!seen.has(resultStr)) {
acc.push(result);
seen.add(resultStr);
}
return acc;
}, []);
return results.reverse();
},
query: (query) => {
const [
searchQuery,
searchTerms,
excludedTerms,
highlightTerms,
objectTerms,
] = Search._parseQuery(query);
const results = Search._performSearch(
searchQuery,
searchTerms,
excludedTerms,
highlightTerms,
objectTerms,
);
// for debugging
//Search.lastresults = results.slice(); // a copy
// console.info("search results:", Search.lastresults);
// print the results
_displayNextItem(results, results.length, searchTerms, highlightTerms);
},
/**
* search for object names
*/
performObjectSearch: (object, objectTerms) => {
const filenames = Search._index.filenames;
const docNames = Search._index.docnames;
const objects = Search._index.objects;
const objNames = Search._index.objnames;
const titles = Search._index.titles;
const results = [];
const objectSearchCallback = (prefix, match) => {
const name = match[4];
const fullname = (prefix ? prefix + "." : "") + name;
const fullnameLower = fullname.toLowerCase();
if (fullnameLower.indexOf(object) < 0) return;
let score = 0;
const parts = fullnameLower.split(".");
// check for different match types: exact matches of full name or
// "last name" (i.e. last dotted part)
if (fullnameLower === object || parts.slice(-1)[0] === object)
score += Scorer.objNameMatch;
else if (parts.slice(-1)[0].indexOf(object) > -1)
score += Scorer.objPartialMatch; // matches in last name
const objName = objNames[match[1]][2];
const title = titles[match[0]];
// If more than one term searched for, we require other words to be
// found in the name/title/description
const otherTerms = new Set(objectTerms);
otherTerms.delete(object);
if (otherTerms.size > 0) {
const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase();
if (
[...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0)
)
return;
}
let anchor = match[3];
if (anchor === "") anchor = fullname;
else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname;
const descr = objName + _(", in ") + title;
// add custom score for some objects according to scorer
if (Scorer.objPrio.hasOwnProperty(match[2]))
score += Scorer.objPrio[match[2]];
else score += Scorer.objPrioDefault;
results.push([
docNames[match[0]],
fullname,
"#" + anchor,
descr,
score,
filenames[match[0]],
SearchResultKind.object,
]);
};
Object.keys(objects).forEach((prefix) =>
objects[prefix].forEach((array) => objectSearchCallback(prefix, array)),
);
return results;
},
/**
* search for full-text terms in the index
*/
performTermsSearch: (searchTerms, excludedTerms) => {
// prepare search
const terms = Search._index.terms;
const titleTerms = Search._index.titleterms;
const filenames = Search._index.filenames;
const docNames = Search._index.docnames;
const titles = Search._index.titles;
const scoreMap = new Map();
const fileMap = new Map();
// perform the search on the required terms
searchTerms.forEach((word) => {
const files = [];
// find documents, if any, containing the query word in their text/title term indices
// use Object.hasOwnProperty to avoid mismatching against prototype properties
const arr = [
{
files: terms.hasOwnProperty(word) ? terms[word] : undefined,
score: Scorer.term,
},
{
files: titleTerms.hasOwnProperty(word) ? titleTerms[word] : undefined,
score: Scorer.title,
},
];
// add support for partial matches
if (word.length > 2) {
const escapedWord = _escapeRegExp(word);
if (!terms.hasOwnProperty(word)) {
Object.keys(terms).forEach((term) => {
if (term.match(escapedWord))
arr.push({ files: terms[term], score: Scorer.partialTerm });
});
}
if (!titleTerms.hasOwnProperty(word)) {
Object.keys(titleTerms).forEach((term) => {
if (term.match(escapedWord))
arr.push({ files: titleTerms[term], score: Scorer.partialTitle });
});
}
}
// no match but word was a required one
if (arr.every((record) => record.files === undefined)) return;
// found search word in contents
arr.forEach((record) => {
if (record.files === undefined) return;
let recordFiles = record.files;
if (recordFiles.length === undefined) recordFiles = [recordFiles];
files.push(...recordFiles);
// set score for the word in each file
recordFiles.forEach((file) => {
if (!scoreMap.has(file)) scoreMap.set(file, new Map());
const fileScores = scoreMap.get(file);
fileScores.set(word, record.score);
});
});
// create the mapping
files.forEach((file) => {
if (!fileMap.has(file)) fileMap.set(file, [word]);
else if (fileMap.get(file).indexOf(word) === -1)
fileMap.get(file).push(word);
});
});
// now check if the files don't contain excluded terms
const results = [];
for (const [file, wordList] of fileMap) {
// check if all requirements are matched
// as search terms with length < 3 are discarded
const filteredTermCount = [...searchTerms].filter(
(term) => term.length > 2,
).length;
if (
wordList.length !== searchTerms.size
&& wordList.length !== filteredTermCount
)
continue;
// ensure that none of the excluded terms is in the search result
if (
[...excludedTerms].some(
(term) =>
terms[term] === file
|| titleTerms[term] === file
|| (terms[term] || []).includes(file)
|| (titleTerms[term] || []).includes(file),
)
)
break;
// select one (max) score for the file.
const score = Math.max(...wordList.map((w) => scoreMap.get(file).get(w)));
// add result to the result list
results.push([
docNames[file],
titles[file],
"",
null,
score,
filenames[file],
SearchResultKind.text,
]);
}
return results;
},
/**
* helper function to return a node containing the
* search summary for a given text. keywords is a list
* of stemmed words.
*/
makeSearchSummary: (htmlText, keywords, anchor) => {
const text = Search.htmlToText(htmlText, anchor);
if (text === "") return null;
const textLower = text.toLowerCase();
const actualStartPosition = [...keywords]
.map((k) => textLower.indexOf(k.toLowerCase()))
.filter((i) => i > -1)
.slice(-1)[0];
const startWithContext = Math.max(actualStartPosition - 120, 0);
const top = startWithContext === 0 ? "" : "...";
const tail = startWithContext + 240 < text.length ? "..." : "";
let summary = document.createElement("p");
summary.classList.add("context");
summary.textContent =
top + text.substr(startWithContext, 240).trim() + tail;
return summary;
},
};
_ready(Search.init);

View File

@@ -0,0 +1,159 @@
/* Highlighting utilities for Sphinx HTML documentation. */
"use strict";
const SPHINX_HIGHLIGHT_ENABLED = true;
/**
* highlight a given string on a node by wrapping it in
* span elements with the given class name.
*/
const _highlight = (node, addItems, text, className) => {
if (node.nodeType === Node.TEXT_NODE) {
const val = node.nodeValue;
const parent = node.parentNode;
const pos = val.toLowerCase().indexOf(text);
if (
pos >= 0
&& !parent.classList.contains(className)
&& !parent.classList.contains("nohighlight")
) {
let span;
const closestNode = parent.closest("body, svg, foreignObject");
const isInSVG = closestNode && closestNode.matches("svg");
if (isInSVG) {
span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
} else {
span = document.createElement("span");
span.classList.add(className);
}
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
const rest = document.createTextNode(val.substr(pos + text.length));
parent.insertBefore(span, parent.insertBefore(rest, node.nextSibling));
node.nodeValue = val.substr(0, pos);
/* There may be more occurrences of search term in this node. So call this
* function recursively on the remaining fragment.
*/
_highlight(rest, addItems, text, className);
if (isInSVG) {
const rect = document.createElementNS(
"http://www.w3.org/2000/svg",
"rect",
);
const bbox = parent.getBBox();
rect.x.baseVal.value = bbox.x;
rect.y.baseVal.value = bbox.y;
rect.width.baseVal.value = bbox.width;
rect.height.baseVal.value = bbox.height;
rect.setAttribute("class", className);
addItems.push({ parent: parent, target: rect });
}
}
} else if (node.matches && !node.matches("button, select, textarea")) {
node.childNodes.forEach((el) => _highlight(el, addItems, text, className));
}
};
const _highlightText = (thisNode, text, className) => {
let addItems = [];
_highlight(thisNode, addItems, text, className);
addItems.forEach((obj) =>
obj.parent.insertAdjacentElement("beforebegin", obj.target),
);
};
/**
* Small JavaScript module for the documentation.
*/
const SphinxHighlight = {
/**
* highlight the search words provided in localstorage in the text
*/
highlightSearchWords: () => {
if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight
// get and clear terms from localstorage
const url = new URL(window.location);
const highlight =
localStorage.getItem("sphinx_highlight_terms")
|| url.searchParams.get("highlight")
|| "";
localStorage.removeItem("sphinx_highlight_terms");
// Update history only if '?highlight' is present; otherwise it
// clears text fragments (not set in window.location by the browser)
if (url.searchParams.has("highlight")) {
url.searchParams.delete("highlight");
window.history.replaceState({}, "", url);
}
// get individual terms from highlight string
const terms = highlight
.toLowerCase()
.split(/\s+/)
.filter((x) => x);
if (terms.length === 0) return; // nothing to do
// There should never be more than one element matching "div.body"
const divBody = document.querySelectorAll("div.body");
const body = divBody.length ? divBody[0] : document.querySelector("body");
window.setTimeout(() => {
terms.forEach((term) => _highlightText(body, term, "highlighted"));
}, 10);
const searchBox = document.getElementById("searchbox");
if (searchBox === null) return;
searchBox.appendChild(
document
.createRange()
.createContextualFragment(
'<p class="highlight-link">'
+ '<a href="javascript:SphinxHighlight.hideSearchWords()">'
+ _("Hide Search Matches")
+ "</a></p>",
),
);
},
/**
* helper function to hide the search marks again
*/
hideSearchWords: () => {
document
.querySelectorAll("#searchbox .highlight-link")
.forEach((el) => el.remove());
document
.querySelectorAll("span.highlighted")
.forEach((el) => el.classList.remove("highlighted"));
localStorage.removeItem("sphinx_highlight_terms");
},
initEscapeListener: () => {
// only install a listener if it is really needed
if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return;
document.addEventListener("keydown", (event) => {
// bail for input elements
if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName))
return;
// bail with special keys
if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey)
return;
if (
DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS
&& event.key === "Escape"
) {
SphinxHighlight.hideSearchWords();
event.preventDefault();
}
});
},
};
_ready(() => {
/* Do not call highlightSearchWords() when we are on the search page.
* It will highlight words from the *previous* search query.
*/
if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords();
SphinxHighlight.initEscapeListener();
});

View File

@@ -0,0 +1,109 @@
<!DOCTYPE html>
<html lang="en" data-content_root="./">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<title>auth_config_loader module &#8212; Streamlit Dashboard 1.0 documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=5ecbeea2" />
<link rel="stylesheet" type="text/css" href="_static/basic.css?v=b08954a9" />
<link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=27fed22d" />
<script src="_static/documentation_options.js?v=f2a433a1"></script>
<script src="_static/doctools.js?v=fd6eb6e6"></script>
<script src="_static/sphinx_highlight.js?v=6ffebe34"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="module-auth_config_loader">
<span id="auth-config-loader-module"></span><h1>auth_config_loader module<a class="headerlink" href="#module-auth_config_loader" title="Link to this heading"></a></h1>
<dl class="py function">
<dt class="sig sig-object py" id="auth_config_loader.load_auth_config">
<span class="sig-prename descclassname"><span class="pre">auth_config_loader.</span></span><span class="sig-name descname"><span class="pre">load_auth_config</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">config_path</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Authenticate</span></span></span><a class="headerlink" href="#auth_config_loader.load_auth_config" title="Link to this definition"></a></dt>
<dd></dd></dl>
</section>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="Main">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">Streamlit Dashboard</a></h1>
<search id="searchbox" style="display: none" role="search">
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search"/>
<input type="submit" value="Go" />
</form>
</div>
</search>
<script>document.getElementById('searchbox').style.display = "block"</script><h3>Navigation</h3>
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="modules.html">streamlit_dashboard</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
</ul></li>
</ul>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&#169;2026, SBDC Team.
|
Powered by <a href="https://www.sphinx-doc.org/">Sphinx 9.1.0</a>
&amp; <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
|
<a href="_sources/auth_config_loader.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

View File

@@ -0,0 +1,480 @@
<!DOCTYPE html>
<html lang="en" data-content_root="./">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Index &#8212; Streamlit Dashboard 1.0 documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=5ecbeea2" />
<link rel="stylesheet" type="text/css" href="_static/basic.css?v=b08954a9" />
<link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=27fed22d" />
<script src="_static/documentation_options.js?v=f2a433a1"></script>
<script src="_static/doctools.js?v=fd6eb6e6"></script>
<script src="_static/sphinx_highlight.js?v=6ffebe34"></script>
<link rel="index" title="Index" href="#" />
<link rel="search" title="Search" href="search.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1 id="index">Index</h1>
<div class="genindex-jumpbox">
<a href="#A"><strong>A</strong></a>
| <a href="#B"><strong>B</strong></a>
| <a href="#C"><strong>C</strong></a>
| <a href="#D"><strong>D</strong></a>
| <a href="#E"><strong>E</strong></a>
| <a href="#F"><strong>F</strong></a>
| <a href="#G"><strong>G</strong></a>
| <a href="#I"><strong>I</strong></a>
| <a href="#L"><strong>L</strong></a>
| <a href="#M"><strong>M</strong></a>
| <a href="#N"><strong>N</strong></a>
| <a href="#P"><strong>P</strong></a>
| <a href="#R"><strong>R</strong></a>
| <a href="#S"><strong>S</strong></a>
| <a href="#W"><strong>W</strong></a>
</div>
<h2 id="A">A</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage">AdminPanelPage (class in streamlit_dashboard.page_classes.admin_panel_page_class)</a>
</li>
</ul></td>
</tr></table>
<h2 id="B">B</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.base_report_page.BaseReportPage">BaseReportPage (class in streamlit_dashboard.utility_classes.base_report_page)</a>
</li>
</ul></td>
</tr></table>
<h2 id="C">C</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.report_comparer_page_class.ComparerColumn">ComparerColumn (class in streamlit_dashboard.page_classes.report_comparer_page_class)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.report_comparer_page_class.ComparerPage">ComparerPage (class in streamlit_dashboard.page_classes.report_comparer_page_class)</a>
</li>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair.current_fy">current_fy (streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair attribute)</a>
</li>
</ul></td>
</tr></table>
<h2 id="D">D</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig">DashboardConfig (class in streamlit_dashboard.utility_classes.dashboard_config_parser)</a>
</li>
</ul></td>
</tr></table>
<h2 id="E">E</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair">ExportModulePair (class in streamlit_dashboard.utility_classes.dashboard_config_parser)</a>
</li>
</ul></td>
</tr></table>
<h2 id="F">F</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.figure_with_max_y.FigureWithMaxY.figure">figure (streamlit_dashboard.utility_classes.figure_with_max_y.FigureWithMaxY attribute)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.figure_with_max_y.FigureWithMaxY">FigureWithMaxY (class in streamlit_dashboard.utility_classes.figure_with_max_y)</a>
</li>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.figure_with_max_y.find_fig_max_y_and_generate_wrapper">find_fig_max_y_and_generate_wrapper() (in module streamlit_dashboard.utility_classes.figure_with_max_y)</a>
</li>
</ul></td>
</tr></table>
<h2 id="G">G</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.generate_figures">generate_figures() (streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage method)</a>
<ul>
<li><a href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.report_comparer_page_class.ComparerColumn.generate_figures">(streamlit_dashboard.page_classes.report_comparer_page_class.ComparerColumn method)</a>
</li>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.base_report_page.BaseReportPage.generate_figures">(streamlit_dashboard.utility_classes.base_report_page.BaseReportPage method)</a>
</li>
</ul></li>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.get_clients_list_urls">get_clients_list_urls() (streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig method)</a>
</li>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.get_funding_milestones_urls">get_funding_milestones_urls() (streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig method)</a>
</li>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.get_log_level">get_log_level() (streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig method)</a>
</li>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.get_log_path">get_log_path() (streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig method)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.get_nbs_milestones_urls">get_nbs_milestones_urls() (streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig method)</a>
</li>
<li><a href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.get_page_name">get_page_name() (streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage static method)</a>
<ul>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.base_report_page.BaseReportPage.get_page_name">(streamlit_dashboard.utility_classes.base_report_page.BaseReportPage static method)</a>
</li>
</ul></li>
<li><a href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.get_syncable_figure_keys">get_syncable_figure_keys() (streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage method)</a>
<ul>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.base_report_page.BaseReportPage.get_syncable_figure_keys">(streamlit_dashboard.utility_classes.base_report_page.BaseReportPage method)</a>
</li>
</ul></li>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.get_trainings_urls">get_trainings_urls() (streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig method)</a>
</li>
<li><a href="streamlit_dashboard.components.html#streamlit_dashboard.components.neoserra_export_link_grabber.NeoserraExportLinkGrabber.get_widget_key">get_widget_key() (streamlit_dashboard.components.neoserra_export_link_grabber.NeoserraExportLinkGrabber method)</a>
<ul>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.base_report_page.Renderable.get_widget_key">(streamlit_dashboard.utility_classes.base_report_page.Renderable method)</a>
</li>
</ul></li>
</ul></td>
</tr></table>
<h2 id="I">I</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.is_valid_neoserra_url">is_valid_neoserra_url() (streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage method)</a>
</li>
</ul></td>
</tr></table>
<h2 id="L">L</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.load">load() (streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig method)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="streamlit_dashboard.html#streamlit_dashboard.auth_config_loader.load_auth_config">load_auth_config() (in module streamlit_dashboard.auth_config_loader)</a>
</li>
</ul></td>
</tr></table>
<h2 id="M">M</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.figure_with_max_y.FigureWithMaxY.max_y">max_y (streamlit_dashboard.utility_classes.figure_with_max_y.FigureWithMaxY attribute)</a>
</li>
<li>
module
<ul>
<li><a href="streamlit_dashboard.html#module-streamlit_dashboard">streamlit_dashboard</a>
</li>
<li><a href="streamlit_dashboard.html#module-streamlit_dashboard.auth_config_loader">streamlit_dashboard.auth_config_loader</a>
</li>
<li><a href="streamlit_dashboard.cached_function_wrappers.html#module-streamlit_dashboard.cached_function_wrappers">streamlit_dashboard.cached_function_wrappers</a>
</li>
<li><a href="streamlit_dashboard.components.html#module-streamlit_dashboard.components">streamlit_dashboard.components</a>
</li>
<li><a href="streamlit_dashboard.components.html#module-streamlit_dashboard.components.neoserra_export_link_grabber">streamlit_dashboard.components.neoserra_export_link_grabber</a>
</li>
<li><a href="streamlit_dashboard.html#module-streamlit_dashboard.main">streamlit_dashboard.main</a>
</li>
<li><a href="streamlit_dashboard.page_classes.html#module-streamlit_dashboard.page_classes">streamlit_dashboard.page_classes</a>
</li>
<li><a href="streamlit_dashboard.page_classes.html#module-streamlit_dashboard.page_classes.admin_panel_page_class">streamlit_dashboard.page_classes.admin_panel_page_class</a>
</li>
<li><a href="streamlit_dashboard.page_classes.html#module-streamlit_dashboard.page_classes.report_comparer_page_class">streamlit_dashboard.page_classes.report_comparer_page_class</a>
</li>
<li><a href="streamlit_dashboard.html#module-streamlit_dashboard.streamlit_constants">streamlit_dashboard.streamlit_constants</a>
</li>
<li><a href="streamlit_dashboard.streamlit_pages.html#module-streamlit_dashboard.streamlit_pages">streamlit_dashboard.streamlit_pages</a>
</li>
<li><a href="streamlit_dashboard.utility_classes.html#module-streamlit_dashboard.utility_classes">streamlit_dashboard.utility_classes</a>
</li>
<li><a href="streamlit_dashboard.utility_classes.html#module-streamlit_dashboard.utility_classes.base_report_page">streamlit_dashboard.utility_classes.base_report_page</a>
</li>
<li><a href="streamlit_dashboard.utility_classes.html#module-streamlit_dashboard.utility_classes.dashboard_config_parser">streamlit_dashboard.utility_classes.dashboard_config_parser</a>
</li>
<li><a href="streamlit_dashboard.utility_classes.html#module-streamlit_dashboard.utility_classes.figure_with_max_y">streamlit_dashboard.utility_classes.figure_with_max_y</a>
</li>
</ul></li>
</ul></td>
</tr></table>
<h2 id="N">N</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="streamlit_dashboard.components.html#streamlit_dashboard.components.neoserra_export_link_grabber.NeoserraExportLinkGrabber">NeoserraExportLinkGrabber (class in streamlit_dashboard.components.neoserra_export_link_grabber)</a>
</li>
</ul></td>
</tr></table>
<h2 id="P">P</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair.prev_fy">prev_fy (streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair attribute)</a>
</li>
</ul></td>
</tr></table>
<h2 id="R">R</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="streamlit_dashboard.components.html#streamlit_dashboard.components.neoserra_export_link_grabber.NeoserraExportLinkGrabber.render">render() (streamlit_dashboard.components.neoserra_export_link_grabber.NeoserraExportLinkGrabber method)</a>
<ul>
<li><a href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.report_comparer_page_class.ComparerPage.render">(streamlit_dashboard.page_classes.report_comparer_page_class.ComparerPage method)</a>
</li>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.base_report_page.BaseReportPage.render">(streamlit_dashboard.utility_classes.base_report_page.BaseReportPage method)</a>
</li>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.base_report_page.Renderable.render">(streamlit_dashboard.utility_classes.base_report_page.Renderable method)</a>
</li>
</ul></li>
<li><a href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.render_controls">render_controls() (streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage method)</a>
<ul>
<li><a href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.report_comparer_page_class.ComparerColumn.render_controls">(streamlit_dashboard.page_classes.report_comparer_page_class.ComparerColumn method)</a>
</li>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.base_report_page.BaseReportPage.render_controls">(streamlit_dashboard.utility_classes.base_report_page.BaseReportPage method)</a>
</li>
</ul></li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.render_figures">render_figures() (streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage method)</a>
<ul>
<li><a href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.report_comparer_page_class.ComparerColumn.render_figures">(streamlit_dashboard.page_classes.report_comparer_page_class.ComparerColumn method)</a>
</li>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.base_report_page.BaseReportPage.render_figures">(streamlit_dashboard.utility_classes.base_report_page.BaseReportPage method)</a>
</li>
</ul></li>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.base_report_page.Renderable">Renderable (class in streamlit_dashboard.utility_classes.base_report_page)</a>
</li>
</ul></td>
</tr></table>
<h2 id="S">S</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.save">save() (streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig method)</a>
</li>
<li><a href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.save_settings">save_settings() (streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage method)</a>
</li>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_clients_list_current_fy_url">set_clients_list_current_fy_url() (streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig method)</a>
</li>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_clients_list_prev_fy_url">set_clients_list_prev_fy_url() (streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig method)</a>
</li>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_funding_milestones_current_fy_url">set_funding_milestones_current_fy_url() (streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig method)</a>
</li>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_funding_milestones_prev_fy_url">set_funding_milestones_prev_fy_url() (streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig method)</a>
</li>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_nbs_milestones_current_fy_url">set_nbs_milestones_current_fy_url() (streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig method)</a>
</li>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_nbs_milestones_prev_fy_url">set_nbs_milestones_prev_fy_url() (streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig method)</a>
</li>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_trainings_current_fy_url">set_trainings_current_fy_url() (streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig method)</a>
</li>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_trainings_prev_fy_url">set_trainings_prev_fy_url() (streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig method)</a>
</li>
<li>
streamlit_dashboard
<ul>
<li><a href="streamlit_dashboard.html#module-streamlit_dashboard">module</a>
</li>
</ul></li>
<li>
streamlit_dashboard.auth_config_loader
<ul>
<li><a href="streamlit_dashboard.html#module-streamlit_dashboard.auth_config_loader">module</a>
</li>
</ul></li>
<li>
streamlit_dashboard.cached_function_wrappers
<ul>
<li><a href="streamlit_dashboard.cached_function_wrappers.html#module-streamlit_dashboard.cached_function_wrappers">module</a>
</li>
</ul></li>
<li>
streamlit_dashboard.components
<ul>
<li><a href="streamlit_dashboard.components.html#module-streamlit_dashboard.components">module</a>
</li>
</ul></li>
<li>
streamlit_dashboard.components.neoserra_export_link_grabber
<ul>
<li><a href="streamlit_dashboard.components.html#module-streamlit_dashboard.components.neoserra_export_link_grabber">module</a>
</li>
</ul></li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li>
streamlit_dashboard.main
<ul>
<li><a href="streamlit_dashboard.html#module-streamlit_dashboard.main">module</a>
</li>
</ul></li>
<li>
streamlit_dashboard.page_classes
<ul>
<li><a href="streamlit_dashboard.page_classes.html#module-streamlit_dashboard.page_classes">module</a>
</li>
</ul></li>
<li>
streamlit_dashboard.page_classes.admin_panel_page_class
<ul>
<li><a href="streamlit_dashboard.page_classes.html#module-streamlit_dashboard.page_classes.admin_panel_page_class">module</a>
</li>
</ul></li>
<li>
streamlit_dashboard.page_classes.report_comparer_page_class
<ul>
<li><a href="streamlit_dashboard.page_classes.html#module-streamlit_dashboard.page_classes.report_comparer_page_class">module</a>
</li>
</ul></li>
<li>
streamlit_dashboard.streamlit_constants
<ul>
<li><a href="streamlit_dashboard.html#module-streamlit_dashboard.streamlit_constants">module</a>
</li>
</ul></li>
<li>
streamlit_dashboard.streamlit_pages
<ul>
<li><a href="streamlit_dashboard.streamlit_pages.html#module-streamlit_dashboard.streamlit_pages">module</a>
</li>
</ul></li>
<li>
streamlit_dashboard.utility_classes
<ul>
<li><a href="streamlit_dashboard.utility_classes.html#module-streamlit_dashboard.utility_classes">module</a>
</li>
</ul></li>
<li>
streamlit_dashboard.utility_classes.base_report_page
<ul>
<li><a href="streamlit_dashboard.utility_classes.html#module-streamlit_dashboard.utility_classes.base_report_page">module</a>
</li>
</ul></li>
<li>
streamlit_dashboard.utility_classes.dashboard_config_parser
<ul>
<li><a href="streamlit_dashboard.utility_classes.html#module-streamlit_dashboard.utility_classes.dashboard_config_parser">module</a>
</li>
</ul></li>
<li>
streamlit_dashboard.utility_classes.figure_with_max_y
<ul>
<li><a href="streamlit_dashboard.utility_classes.html#module-streamlit_dashboard.utility_classes.figure_with_max_y">module</a>
</li>
</ul></li>
</ul></td>
</tr></table>
<h2 id="W">W</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.write_template">write_template() (streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig static method)</a>
</li>
</ul></td>
</tr></table>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="Main">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">Streamlit Dashboard</a></h1>
<search id="searchbox" style="display: none" role="search">
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search"/>
<input type="submit" value="Go" />
</form>
</div>
</search>
<script>document.getElementById('searchbox').style.display = "block"</script><h3>Navigation</h3>
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="modules.html">streamlit_dashboard</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
</ul></li>
</ul>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&#169;2026, SBDC Team.
|
Powered by <a href="https://www.sphinx-doc.org/">Sphinx 9.1.0</a>
&amp; <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
</div>
</body>
</html>

View File

@@ -0,0 +1,118 @@
<!DOCTYPE html>
<html lang="en" data-content_root="./">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Streamlit Dashboard documentation &#8212; Streamlit Dashboard 1.0 documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=5ecbeea2" />
<link rel="stylesheet" type="text/css" href="_static/basic.css?v=b08954a9" />
<link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=27fed22d" />
<script src="_static/documentation_options.js?v=f2a433a1"></script>
<script src="_static/doctools.js?v=fd6eb6e6"></script>
<script src="_static/sphinx_highlight.js?v=6ffebe34"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="streamlit_dashboard" href="modules.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="streamlit-dashboard-documentation">
<h1>Streamlit Dashboard documentation<a class="headerlink" href="#streamlit-dashboard-documentation" title="Link to this heading"></a></h1>
<p>Add your content using <code class="docutils literal notranslate"><span class="pre">reStructuredText</span></code> syntax. See the
<a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/index.html">reStructuredText</a>
documentation for details.</p>
<div class="toctree-wrapper compound">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="modules.html">streamlit_dashboard</a><ul>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.html">streamlit_dashboard namespace</a></li>
</ul>
</li>
</ul>
</div>
</section>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="Main">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="#">Streamlit Dashboard</a></h1>
<search id="searchbox" style="display: none" role="search">
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search"/>
<input type="submit" value="Go" />
</form>
</div>
</search>
<script>document.getElementById('searchbox').style.display = "block"</script><h3>Navigation</h3>
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="modules.html">streamlit_dashboard</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="#">Documentation overview</a><ul>
<li>Next: <a href="modules.html" title="next chapter">streamlit_dashboard</a></li>
</ul></li>
</ul>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&#169;2026, SBDC Team.
|
Powered by <a href="https://www.sphinx-doc.org/">Sphinx 9.1.0</a>
&amp; <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
|
<a href="_sources/index.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

View File

@@ -0,0 +1,104 @@
<!DOCTYPE html>
<html lang="en" data-content_root="./">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<title>main module &#8212; Streamlit Dashboard 1.0 documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=5ecbeea2" />
<link rel="stylesheet" type="text/css" href="_static/basic.css?v=b08954a9" />
<link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=27fed22d" />
<script src="_static/documentation_options.js?v=f2a433a1"></script>
<script src="_static/doctools.js?v=fd6eb6e6"></script>
<script src="_static/sphinx_highlight.js?v=6ffebe34"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="main-module">
<h1>main module<a class="headerlink" href="#main-module" title="Link to this heading"></a></h1>
</section>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="Main">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">Streamlit Dashboard</a></h1>
<search id="searchbox" style="display: none" role="search">
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search"/>
<input type="submit" value="Go" />
</form>
</div>
</search>
<script>document.getElementById('searchbox').style.display = "block"</script><h3>Navigation</h3>
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="modules.html">streamlit_dashboard</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
</ul></li>
</ul>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&#169;2026, SBDC Team.
|
Powered by <a href="https://www.sphinx-doc.org/">Sphinx 9.1.0</a>
&amp; <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
|
<a href="_sources/main.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

View File

@@ -0,0 +1,183 @@
<!DOCTYPE html>
<html lang="en" data-content_root="./">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<title>streamlit_dashboard &#8212; Streamlit Dashboard 1.0 documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=5ecbeea2" />
<link rel="stylesheet" type="text/css" href="_static/basic.css?v=b08954a9" />
<link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=27fed22d" />
<script src="_static/documentation_options.js?v=f2a433a1"></script>
<script src="_static/doctools.js?v=fd6eb6e6"></script>
<script src="_static/sphinx_highlight.js?v=6ffebe34"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="streamlit_dashboard namespace" href="streamlit_dashboard.html" />
<link rel="prev" title="Streamlit Dashboard documentation" href="index.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="streamlit-dashboard">
<h1>streamlit_dashboard<a class="headerlink" href="#streamlit-dashboard" title="Link to this heading"></a></h1>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="streamlit_dashboard.html">streamlit_dashboard namespace</a><ul>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.html#subpackages">Subpackages</a><ul>
<li class="toctree-l3"><a class="reference internal" href="streamlit_dashboard.cached_function_wrappers.html">streamlit_dashboard.cached_function_wrappers namespace</a><ul>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.cached_function_wrappers.html#submodules">Submodules</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.cached_function_wrappers.html#streamlit-dashboard-cached-function-wrappers-client-list-cached-functions-module">streamlit_dashboard.cached_function_wrappers.client_list_cached_functions module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.cached_function_wrappers.html#streamlit-dashboard-cached-function-wrappers-funding-milestones-cached-functions-module">streamlit_dashboard.cached_function_wrappers.funding_milestones_cached_functions module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.cached_function_wrappers.html#streamlit-dashboard-cached-function-wrappers-nbs-cached-functions-module">streamlit_dashboard.cached_function_wrappers.nbs_cached_functions module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.cached_function_wrappers.html#streamlit-dashboard-cached-function-wrappers-shared-module">streamlit_dashboard.cached_function_wrappers.shared module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.cached_function_wrappers.html#streamlit-dashboard-cached-function-wrappers-trainings-cached-functions-module">streamlit_dashboard.cached_function_wrappers.trainings_cached_functions module</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="streamlit_dashboard.components.html">streamlit_dashboard.components namespace</a><ul>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.components.html#submodules">Submodules</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.components.html#module-streamlit_dashboard.components.neoserra_export_link_grabber">streamlit_dashboard.components.neoserra_export_link_grabber module</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="streamlit_dashboard.page_classes.html">streamlit_dashboard.page_classes namespace</a><ul>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.page_classes.html#submodules">Submodules</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.page_classes.html#module-streamlit_dashboard.page_classes.admin_panel_page_class">streamlit_dashboard.page_classes.admin_panel_page_class module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit-dashboard-page-classes-authentication-page-wrapper-module">streamlit_dashboard.page_classes.authentication_page_wrapper module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit-dashboard-page-classes-center-milestones-page-class-module">streamlit_dashboard.page_classes.center_milestones_page_class module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit-dashboard-page-classes-funding-milestones-page-class-module">streamlit_dashboard.page_classes.funding_milestones_page_class module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit-dashboard-page-classes-naics-report-page-class-module">streamlit_dashboard.page_classes.naics_report_page_class module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit-dashboard-page-classes-nbs-milestones-page-class-module">streamlit_dashboard.page_classes.nbs_milestones_page_class module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit-dashboard-page-classes-page-class-constants-module">streamlit_dashboard.page_classes.page_class_constants module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.page_classes.html#module-streamlit_dashboard.page_classes.report_comparer_page_class">streamlit_dashboard.page_classes.report_comparer_page_class module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit-dashboard-page-classes-training-attendee-counts-class-module">streamlit_dashboard.page_classes.training_attendee_counts_class module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit-dashboard-page-classes-training-attendee-ranges-page-class-module">streamlit_dashboard.page_classes.training_attendee_ranges_page_class module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit-dashboard-page-classes-training-count-statistics-page-class-module">streamlit_dashboard.page_classes.training_count_statistics_page_class module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit-dashboard-page-classes-training-event-count-attendee-comparison-page-class-module">streamlit_dashboard.page_classes.training_event_count_attendee_comparison_page_class module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit-dashboard-page-classes-training-event-count-page-class-module">streamlit_dashboard.page_classes.training_event_count_page_class module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit-dashboard-page-classes-training-primary-topics-page-class-module">streamlit_dashboard.page_classes.training_primary_topics_page_class module</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html">streamlit_dashboard.streamlit_pages namespace</a><ul>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html#submodules">Submodules</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html#streamlit-dashboard-streamlit-pages-admin-streamlit-page-module">streamlit_dashboard.streamlit_pages.admin_streamlit_page module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html#streamlit-dashboard-streamlit-pages-center-streamlit-page-module">streamlit_dashboard.streamlit_pages.center_streamlit_page module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html#streamlit-dashboard-streamlit-pages-comparer-streamlit-page-module">streamlit_dashboard.streamlit_pages.comparer_streamlit_page module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html#streamlit-dashboard-streamlit-pages-funding-streamlit-page-module">streamlit_dashboard.streamlit_pages.funding_streamlit_page module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html#streamlit-dashboard-streamlit-pages-naics-streamlit-page-module">streamlit_dashboard.streamlit_pages.naics_streamlit_page module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html#streamlit-dashboard-streamlit-pages-nbs-streamlit-page-module">streamlit_dashboard.streamlit_pages.nbs_streamlit_page module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html#streamlit-dashboard-streamlit-pages-training-attendee-ranges-page-module">streamlit_dashboard.streamlit_pages.training_attendee_ranges_page module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html#streamlit-dashboard-streamlit-pages-trainings-attendees-count-page-module">streamlit_dashboard.streamlit_pages.trainings_attendees_count_page module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html#streamlit-dashboard-streamlit-pages-trainings-count-statistics-page-module">streamlit_dashboard.streamlit_pages.trainings_count_statistics_page module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html#streamlit-dashboard-streamlit-pages-trainings-event-attendee-comparison-page-module">streamlit_dashboard.streamlit_pages.trainings_event_attendee_comparison_page module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html#streamlit-dashboard-streamlit-pages-trainings-event-count-page-module">streamlit_dashboard.streamlit_pages.trainings_event_count_page module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html#streamlit-dashboard-streamlit-pages-trainings-primary-topic-page-module">streamlit_dashboard.streamlit_pages.trainings_primary_topic_page module</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="streamlit_dashboard.utility_classes.html">streamlit_dashboard.utility_classes namespace</a><ul>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#submodules">Submodules</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#module-streamlit_dashboard.utility_classes.base_report_page">streamlit_dashboard.utility_classes.base_report_page module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#module-streamlit_dashboard.utility_classes.dashboard_config_parser">streamlit_dashboard.utility_classes.dashboard_config_parser module</a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#module-streamlit_dashboard.utility_classes.figure_with_max_y">streamlit_dashboard.utility_classes.figure_with_max_y module</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.html#submodules">Submodules</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.html#module-streamlit_dashboard.auth_config_loader">streamlit_dashboard.auth_config_loader module</a><ul>
<li class="toctree-l3"><a class="reference internal" href="streamlit_dashboard.html#streamlit_dashboard.auth_config_loader.load_auth_config"><code class="docutils literal notranslate"><span class="pre">load_auth_config()</span></code></a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.html#module-streamlit_dashboard.main">streamlit_dashboard.main module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.html#module-streamlit_dashboard.streamlit_constants">streamlit_dashboard.streamlit_constants module</a></li>
</ul>
</li>
</ul>
</div>
</section>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="Main">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">Streamlit Dashboard</a></h1>
<search id="searchbox" style="display: none" role="search">
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search"/>
<input type="submit" value="Go" />
</form>
</div>
</search>
<script>document.getElementById('searchbox').style.display = "block"</script><h3>Navigation</h3>
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="current reference internal" href="#">streamlit_dashboard</a><ul>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.html">streamlit_dashboard namespace</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
<li>Previous: <a href="index.html" title="previous chapter">Streamlit Dashboard documentation</a></li>
<li>Next: <a href="streamlit_dashboard.html" title="next chapter">streamlit_dashboard namespace</a></li>
</ul></li>
</ul>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&#169;2026, SBDC Team.
|
Powered by <a href="https://www.sphinx-doc.org/">Sphinx 9.1.0</a>
&amp; <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
|
<a href="_sources/modules.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

Binary file not shown.

View File

@@ -0,0 +1,188 @@
<!DOCTYPE html>
<html lang="en" data-content_root="./">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Python Module Index &#8212; Streamlit Dashboard 1.0 documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=5ecbeea2" />
<link rel="stylesheet" type="text/css" href="_static/basic.css?v=b08954a9" />
<link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=27fed22d" />
<script src="_static/documentation_options.js?v=f2a433a1"></script>
<script src="_static/doctools.js?v=fd6eb6e6"></script>
<script src="_static/sphinx_highlight.js?v=6ffebe34"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Python Module Index</h1>
<div class="modindex-jumpbox">
<a href="#cap-s"><strong>s</strong></a>
</div>
<table class="indextable modindextable">
<tr class="pcap"><td></td><td>&#160;</td><td></td></tr>
<tr class="cap" id="cap-s"><td></td><td>
<strong>s</strong></td><td></td></tr>
<tr>
<td><img src="_static/minus.png" class="toggler"
id="toggle-1" style="display: none" alt="-" /></td>
<td>
<a href="streamlit_dashboard.html#module-streamlit_dashboard"><code class="xref">streamlit_dashboard</code></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="streamlit_dashboard.html#module-streamlit_dashboard.auth_config_loader"><code class="xref">streamlit_dashboard.auth_config_loader</code></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="streamlit_dashboard.cached_function_wrappers.html#module-streamlit_dashboard.cached_function_wrappers"><code class="xref">streamlit_dashboard.cached_function_wrappers</code></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="streamlit_dashboard.components.html#module-streamlit_dashboard.components"><code class="xref">streamlit_dashboard.components</code></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="streamlit_dashboard.components.html#module-streamlit_dashboard.components.neoserra_export_link_grabber"><code class="xref">streamlit_dashboard.components.neoserra_export_link_grabber</code></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="streamlit_dashboard.html#module-streamlit_dashboard.main"><code class="xref">streamlit_dashboard.main</code></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="streamlit_dashboard.page_classes.html#module-streamlit_dashboard.page_classes"><code class="xref">streamlit_dashboard.page_classes</code></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="streamlit_dashboard.page_classes.html#module-streamlit_dashboard.page_classes.admin_panel_page_class"><code class="xref">streamlit_dashboard.page_classes.admin_panel_page_class</code></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="streamlit_dashboard.page_classes.html#module-streamlit_dashboard.page_classes.report_comparer_page_class"><code class="xref">streamlit_dashboard.page_classes.report_comparer_page_class</code></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="streamlit_dashboard.html#module-streamlit_dashboard.streamlit_constants"><code class="xref">streamlit_dashboard.streamlit_constants</code></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="streamlit_dashboard.streamlit_pages.html#module-streamlit_dashboard.streamlit_pages"><code class="xref">streamlit_dashboard.streamlit_pages</code></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="streamlit_dashboard.utility_classes.html#module-streamlit_dashboard.utility_classes"><code class="xref">streamlit_dashboard.utility_classes</code></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="streamlit_dashboard.utility_classes.html#module-streamlit_dashboard.utility_classes.base_report_page"><code class="xref">streamlit_dashboard.utility_classes.base_report_page</code></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="streamlit_dashboard.utility_classes.html#module-streamlit_dashboard.utility_classes.dashboard_config_parser"><code class="xref">streamlit_dashboard.utility_classes.dashboard_config_parser</code></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="streamlit_dashboard.utility_classes.html#module-streamlit_dashboard.utility_classes.figure_with_max_y"><code class="xref">streamlit_dashboard.utility_classes.figure_with_max_y</code></a></td><td>
<em></em></td></tr>
</table>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="Main">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">Streamlit Dashboard</a></h1>
<search id="searchbox" style="display: none" role="search">
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search"/>
<input type="submit" value="Go" />
</form>
</div>
</search>
<script>document.getElementById('searchbox').style.display = "block"</script><h3>Navigation</h3>
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="modules.html">streamlit_dashboard</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
</ul></li>
</ul>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&#169;2026, SBDC Team.
|
Powered by <a href="https://www.sphinx-doc.org/">Sphinx 9.1.0</a>
&amp; <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
</div>
</body>
</html>

View File

@@ -0,0 +1,121 @@
<!DOCTYPE html>
<html lang="en" data-content_root="./">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Search &#8212; Streamlit Dashboard 1.0 documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=5ecbeea2" />
<link rel="stylesheet" type="text/css" href="_static/basic.css?v=b08954a9" />
<link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=27fed22d" />
<script src="_static/documentation_options.js?v=f2a433a1"></script>
<script src="_static/doctools.js?v=fd6eb6e6"></script>
<script src="_static/sphinx_highlight.js?v=6ffebe34"></script>
<script src="_static/searchtools.js"></script>
<script src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="#" />
<script src="searchindex.js" defer="defer"></script>
<meta name="robots" content="noindex" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1 id="search-documentation">Search</h1>
<noscript>
<div class="admonition warning">
<p>
Please activate JavaScript to enable the search
functionality.
</p>
</div>
</noscript>
<p>
Searching for multiple words only shows matches that contain
all words.
</p>
<form action="" method="get">
<input type="text" name="q" aria-labelledby="search-documentation" value="" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="search" />
<span id="search-progress" style="padding-left: 10px"></span>
</form>
<div id="search-results"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="Main">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">Streamlit Dashboard</a></h1>
<h3>Navigation</h3>
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="modules.html">streamlit_dashboard</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
</ul></li>
</ul>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&#169;2026, SBDC Team.
|
Powered by <a href="https://www.sphinx-doc.org/">Sphinx 9.1.0</a>
&amp; <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
</div>
</body>
</html>

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,104 @@
<!DOCTYPE html>
<html lang="en" data-content_root="./">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<title>streamlit_constants module &#8212; Streamlit Dashboard 1.0 documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=5ecbeea2" />
<link rel="stylesheet" type="text/css" href="_static/basic.css?v=b08954a9" />
<link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=27fed22d" />
<script src="_static/documentation_options.js?v=f2a433a1"></script>
<script src="_static/doctools.js?v=fd6eb6e6"></script>
<script src="_static/sphinx_highlight.js?v=6ffebe34"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="module-streamlit_constants">
<span id="streamlit-constants-module"></span><h1>streamlit_constants module<a class="headerlink" href="#module-streamlit_constants" title="Link to this heading"></a></h1>
</section>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="Main">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">Streamlit Dashboard</a></h1>
<search id="searchbox" style="display: none" role="search">
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search"/>
<input type="submit" value="Go" />
</form>
</div>
</search>
<script>document.getElementById('searchbox').style.display = "block"</script><h3>Navigation</h3>
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="modules.html">streamlit_dashboard</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
</ul></li>
</ul>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&#169;2026, SBDC Team.
|
Powered by <a href="https://www.sphinx-doc.org/">Sphinx 9.1.0</a>
&amp; <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
|
<a href="_sources/streamlit_constants.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

View File

@@ -0,0 +1,133 @@
<!DOCTYPE html>
<html lang="en" data-content_root="./">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<title>streamlit_dashboard.cached_function_wrappers namespace &#8212; Streamlit Dashboard 1.0 documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=5ecbeea2" />
<link rel="stylesheet" type="text/css" href="_static/basic.css?v=b08954a9" />
<link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=27fed22d" />
<script src="_static/documentation_options.js?v=f2a433a1"></script>
<script src="_static/doctools.js?v=fd6eb6e6"></script>
<script src="_static/sphinx_highlight.js?v=6ffebe34"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="streamlit_dashboard.components namespace" href="streamlit_dashboard.components.html" />
<link rel="prev" title="streamlit_dashboard namespace" href="streamlit_dashboard.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="module-streamlit_dashboard.cached_function_wrappers">
<span id="streamlit-dashboard-cached-function-wrappers-namespace"></span><h1>streamlit_dashboard.cached_function_wrappers namespace<a class="headerlink" href="#module-streamlit_dashboard.cached_function_wrappers" title="Link to this heading"></a></h1>
<section id="submodules">
<h2>Submodules<a class="headerlink" href="#submodules" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-cached-function-wrappers-client-list-cached-functions-module">
<h2>streamlit_dashboard.cached_function_wrappers.client_list_cached_functions module<a class="headerlink" href="#streamlit-dashboard-cached-function-wrappers-client-list-cached-functions-module" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-cached-function-wrappers-funding-milestones-cached-functions-module">
<h2>streamlit_dashboard.cached_function_wrappers.funding_milestones_cached_functions module<a class="headerlink" href="#streamlit-dashboard-cached-function-wrappers-funding-milestones-cached-functions-module" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-cached-function-wrappers-nbs-cached-functions-module">
<h2>streamlit_dashboard.cached_function_wrappers.nbs_cached_functions module<a class="headerlink" href="#streamlit-dashboard-cached-function-wrappers-nbs-cached-functions-module" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-cached-function-wrappers-shared-module">
<h2>streamlit_dashboard.cached_function_wrappers.shared module<a class="headerlink" href="#streamlit-dashboard-cached-function-wrappers-shared-module" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-cached-function-wrappers-trainings-cached-functions-module">
<h2>streamlit_dashboard.cached_function_wrappers.trainings_cached_functions module<a class="headerlink" href="#streamlit-dashboard-cached-function-wrappers-trainings-cached-functions-module" title="Link to this heading"></a></h2>
</section>
</section>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="Main">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">Streamlit Dashboard</a></h1>
<search id="searchbox" style="display: none" role="search">
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search"/>
<input type="submit" value="Go" />
</form>
</div>
</search>
<script>document.getElementById('searchbox').style.display = "block"</script><h3>Navigation</h3>
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal" href="modules.html">streamlit_dashboard</a><ul class="current">
<li class="toctree-l2 current"><a class="reference internal" href="streamlit_dashboard.html">streamlit_dashboard namespace</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
<li><a href="modules.html">streamlit_dashboard</a><ul>
<li><a href="streamlit_dashboard.html">streamlit_dashboard namespace</a><ul>
<li>Previous: <a href="streamlit_dashboard.html" title="previous chapter">streamlit_dashboard namespace</a></li>
<li>Next: <a href="streamlit_dashboard.components.html" title="next chapter">streamlit_dashboard.components namespace</a></li>
</ul></li>
</ul></li>
</ul></li>
</ul>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&#169;2026, SBDC Team.
|
Powered by <a href="https://www.sphinx-doc.org/">Sphinx 9.1.0</a>
&amp; <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
|
<a href="_sources/streamlit_dashboard.cached_function_wrappers.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

View File

@@ -0,0 +1,176 @@
<!DOCTYPE html>
<html lang="en" data-content_root="./">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<title>streamlit_dashboard.components namespace &#8212; Streamlit Dashboard 1.0 documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=5ecbeea2" />
<link rel="stylesheet" type="text/css" href="_static/basic.css?v=b08954a9" />
<link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=27fed22d" />
<script src="_static/documentation_options.js?v=f2a433a1"></script>
<script src="_static/doctools.js?v=fd6eb6e6"></script>
<script src="_static/sphinx_highlight.js?v=6ffebe34"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="streamlit_dashboard.page_classes namespace" href="streamlit_dashboard.page_classes.html" />
<link rel="prev" title="streamlit_dashboard.cached_function_wrappers namespace" href="streamlit_dashboard.cached_function_wrappers.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="module-streamlit_dashboard.components">
<span id="streamlit-dashboard-components-namespace"></span><h1>streamlit_dashboard.components namespace<a class="headerlink" href="#module-streamlit_dashboard.components" title="Link to this heading"></a></h1>
<section id="submodules">
<h2>Submodules<a class="headerlink" href="#submodules" title="Link to this heading"></a></h2>
</section>
<section id="module-streamlit_dashboard.components.neoserra_export_link_grabber">
<span id="streamlit-dashboard-components-neoserra-export-link-grabber-module"></span><h2>streamlit_dashboard.components.neoserra_export_link_grabber module<a class="headerlink" href="#module-streamlit_dashboard.components.neoserra_export_link_grabber" title="Link to this heading"></a></h2>
<dl class="py class">
<dt class="sig sig-object py" id="streamlit_dashboard.components.neoserra_export_link_grabber.NeoserraExportLinkGrabber">
<span class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></span><span class="sig-prename descclassname"><span class="pre">streamlit_dashboard.components.neoserra_export_link_grabber.</span></span><span class="sig-name descname"><span class="pre">NeoserraExportLinkGrabber</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">grabber_title</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prev_fy_initial_value</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">current_fy_initial_value</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.components.neoserra_export_link_grabber.NeoserraExportLinkGrabber" title="Link to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">Renderable</span></code></p>
<p>Reusable UI component for capturing paired API endpoint URLs.</p>
<p>This class encapsulates the state and presentation logic for modifying external data
endpoints. By grouping the current and previous fiscal period URLs into a single
renderable object, it standardizes the visual layout across the Admin Panel and
isolates the input-capture logic from the parent pages batch validation pipeline.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>grabber_title</strong> (<em>str</em>) The unique display name for this URL grouping (e.g., Client List).</p></li>
<li><p><strong>prev_fy_initial_value</strong> (<em>str</em>) The existing configuration URL for the previous fiscal period.</p></li>
<li><p><strong>current_fy_initial_value</strong> (<em>str</em>) The existing configuration URL for the current fiscal period.</p></li>
</ul>
</dd>
</dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.components.neoserra_export_link_grabber.NeoserraExportLinkGrabber.get_widget_key">
<span class="sig-name descname"><span class="pre">get_widget_key</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">widget_unique_id</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">str</span></span></span><a class="headerlink" href="#streamlit_dashboard.components.neoserra_export_link_grabber.NeoserraExportLinkGrabber.get_widget_key" title="Link to this definition"></a></dt>
<dd><p>Generates globally unique identifiers for the components internal Streamlit widgets.</p>
<p>Because the Admin Panel renders multiple instances of this exact class on the same page,
this method prevents Streamlit <cite>DuplicateWidgetID</cite> execution crashes by prefixing the
local widget ID (e.g., prev_fy_url_text_input) with the instances unique title.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>widget_unique_id</strong> (<em>str</em>) The local identifier for the specific text input widget.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>A concatenated, globally unique string key.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>str</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.components.neoserra_export_link_grabber.NeoserraExportLinkGrabber.render">
<span class="sig-name descname"><span class="pre">render</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">container</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">DeltaGenerator</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.components.neoserra_export_link_grabber.NeoserraExportLinkGrabber.render" title="Link to this definition"></a></dt>
<dd><p>Maps the URL capture inputs to the provided Streamlit layout container.</p>
<p>Constructs a visually distinct, bordered container to group the paired fiscal period
endpoints together. It binds the text input widgets to the components internal state,
allowing the parent orchestrator to extract the modified strings during the form
submission phase.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>container</strong> (<em>DeltaGenerator</em>) The Streamlit layout container (typically a form) to draw the widgets onto.</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
</section>
</section>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="Main">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">Streamlit Dashboard</a></h1>
<search id="searchbox" style="display: none" role="search">
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search"/>
<input type="submit" value="Go" />
</form>
</div>
</search>
<script>document.getElementById('searchbox').style.display = "block"</script><h3>Navigation</h3>
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal" href="modules.html">streamlit_dashboard</a><ul class="current">
<li class="toctree-l2 current"><a class="reference internal" href="streamlit_dashboard.html">streamlit_dashboard namespace</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
<li><a href="modules.html">streamlit_dashboard</a><ul>
<li><a href="streamlit_dashboard.html">streamlit_dashboard namespace</a><ul>
<li>Previous: <a href="streamlit_dashboard.cached_function_wrappers.html" title="previous chapter">streamlit_dashboard.cached_function_wrappers namespace</a></li>
<li>Next: <a href="streamlit_dashboard.page_classes.html" title="next chapter">streamlit_dashboard.page_classes namespace</a></li>
</ul></li>
</ul></li>
</ul></li>
</ul>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&#169;2026, SBDC Team.
|
Powered by <a href="https://www.sphinx-doc.org/">Sphinx 9.1.0</a>
&amp; <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
|
<a href="_sources/streamlit_dashboard.components.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

View File

@@ -0,0 +1,291 @@
<!DOCTYPE html>
<html lang="en" data-content_root="./">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<title>streamlit_dashboard namespace &#8212; Streamlit Dashboard 1.0 documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=5ecbeea2" />
<link rel="stylesheet" type="text/css" href="_static/basic.css?v=b08954a9" />
<link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=27fed22d" />
<script src="_static/documentation_options.js?v=f2a433a1"></script>
<script src="_static/doctools.js?v=fd6eb6e6"></script>
<script src="_static/sphinx_highlight.js?v=6ffebe34"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="streamlit_dashboard.cached_function_wrappers namespace" href="streamlit_dashboard.cached_function_wrappers.html" />
<link rel="prev" title="streamlit_dashboard" href="modules.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="module-streamlit_dashboard">
<span id="streamlit-dashboard-namespace"></span><h1>streamlit_dashboard namespace<a class="headerlink" href="#module-streamlit_dashboard" title="Link to this heading"></a></h1>
<section id="subpackages">
<h2>Subpackages<a class="headerlink" href="#subpackages" title="Link to this heading"></a></h2>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="streamlit_dashboard.cached_function_wrappers.html">streamlit_dashboard.cached_function_wrappers namespace</a><ul>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.cached_function_wrappers.html#submodules">Submodules</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.cached_function_wrappers.html#streamlit-dashboard-cached-function-wrappers-client-list-cached-functions-module">streamlit_dashboard.cached_function_wrappers.client_list_cached_functions module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.cached_function_wrappers.html#streamlit-dashboard-cached-function-wrappers-funding-milestones-cached-functions-module">streamlit_dashboard.cached_function_wrappers.funding_milestones_cached_functions module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.cached_function_wrappers.html#streamlit-dashboard-cached-function-wrappers-nbs-cached-functions-module">streamlit_dashboard.cached_function_wrappers.nbs_cached_functions module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.cached_function_wrappers.html#streamlit-dashboard-cached-function-wrappers-shared-module">streamlit_dashboard.cached_function_wrappers.shared module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.cached_function_wrappers.html#streamlit-dashboard-cached-function-wrappers-trainings-cached-functions-module">streamlit_dashboard.cached_function_wrappers.trainings_cached_functions module</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="streamlit_dashboard.components.html">streamlit_dashboard.components namespace</a><ul>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.components.html#submodules">Submodules</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.components.html#module-streamlit_dashboard.components.neoserra_export_link_grabber">streamlit_dashboard.components.neoserra_export_link_grabber module</a><ul>
<li class="toctree-l3"><a class="reference internal" href="streamlit_dashboard.components.html#streamlit_dashboard.components.neoserra_export_link_grabber.NeoserraExportLinkGrabber"><code class="docutils literal notranslate"><span class="pre">NeoserraExportLinkGrabber</span></code></a><ul>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.components.html#streamlit_dashboard.components.neoserra_export_link_grabber.NeoserraExportLinkGrabber.get_widget_key"><code class="docutils literal notranslate"><span class="pre">NeoserraExportLinkGrabber.get_widget_key()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.components.html#streamlit_dashboard.components.neoserra_export_link_grabber.NeoserraExportLinkGrabber.render"><code class="docutils literal notranslate"><span class="pre">NeoserraExportLinkGrabber.render()</span></code></a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="streamlit_dashboard.page_classes.html">streamlit_dashboard.page_classes namespace</a><ul>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.page_classes.html#submodules">Submodules</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.page_classes.html#module-streamlit_dashboard.page_classes.admin_panel_page_class">streamlit_dashboard.page_classes.admin_panel_page_class module</a><ul>
<li class="toctree-l3"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage"><code class="docutils literal notranslate"><span class="pre">AdminPanelPage</span></code></a><ul>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.generate_figures"><code class="docutils literal notranslate"><span class="pre">AdminPanelPage.generate_figures()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.get_page_name"><code class="docutils literal notranslate"><span class="pre">AdminPanelPage.get_page_name()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.get_syncable_figure_keys"><code class="docutils literal notranslate"><span class="pre">AdminPanelPage.get_syncable_figure_keys()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.is_valid_neoserra_url"><code class="docutils literal notranslate"><span class="pre">AdminPanelPage.is_valid_neoserra_url()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.render_controls"><code class="docutils literal notranslate"><span class="pre">AdminPanelPage.render_controls()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.render_figures"><code class="docutils literal notranslate"><span class="pre">AdminPanelPage.render_figures()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.save_settings"><code class="docutils literal notranslate"><span class="pre">AdminPanelPage.save_settings()</span></code></a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit-dashboard-page-classes-authentication-page-wrapper-module">streamlit_dashboard.page_classes.authentication_page_wrapper module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit-dashboard-page-classes-center-milestones-page-class-module">streamlit_dashboard.page_classes.center_milestones_page_class module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit-dashboard-page-classes-funding-milestones-page-class-module">streamlit_dashboard.page_classes.funding_milestones_page_class module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit-dashboard-page-classes-naics-report-page-class-module">streamlit_dashboard.page_classes.naics_report_page_class module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit-dashboard-page-classes-nbs-milestones-page-class-module">streamlit_dashboard.page_classes.nbs_milestones_page_class module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit-dashboard-page-classes-page-class-constants-module">streamlit_dashboard.page_classes.page_class_constants module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.page_classes.html#module-streamlit_dashboard.page_classes.report_comparer_page_class">streamlit_dashboard.page_classes.report_comparer_page_class module</a><ul>
<li class="toctree-l3"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.report_comparer_page_class.ComparerColumn"><code class="docutils literal notranslate"><span class="pre">ComparerColumn</span></code></a><ul>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.report_comparer_page_class.ComparerColumn.generate_figures"><code class="docutils literal notranslate"><span class="pre">ComparerColumn.generate_figures()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.report_comparer_page_class.ComparerColumn.render_controls"><code class="docutils literal notranslate"><span class="pre">ComparerColumn.render_controls()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.report_comparer_page_class.ComparerColumn.render_figures"><code class="docutils literal notranslate"><span class="pre">ComparerColumn.render_figures()</span></code></a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.report_comparer_page_class.ComparerPage"><code class="docutils literal notranslate"><span class="pre">ComparerPage</span></code></a><ul>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit_dashboard.page_classes.report_comparer_page_class.ComparerPage.render"><code class="docutils literal notranslate"><span class="pre">ComparerPage.render()</span></code></a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit-dashboard-page-classes-training-attendee-counts-class-module">streamlit_dashboard.page_classes.training_attendee_counts_class module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit-dashboard-page-classes-training-attendee-ranges-page-class-module">streamlit_dashboard.page_classes.training_attendee_ranges_page_class module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit-dashboard-page-classes-training-count-statistics-page-class-module">streamlit_dashboard.page_classes.training_count_statistics_page_class module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit-dashboard-page-classes-training-event-count-attendee-comparison-page-class-module">streamlit_dashboard.page_classes.training_event_count_attendee_comparison_page_class module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit-dashboard-page-classes-training-event-count-page-class-module">streamlit_dashboard.page_classes.training_event_count_page_class module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.page_classes.html#streamlit-dashboard-page-classes-training-primary-topics-page-class-module">streamlit_dashboard.page_classes.training_primary_topics_page_class module</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html">streamlit_dashboard.streamlit_pages namespace</a><ul>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html#submodules">Submodules</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html#streamlit-dashboard-streamlit-pages-admin-streamlit-page-module">streamlit_dashboard.streamlit_pages.admin_streamlit_page module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html#streamlit-dashboard-streamlit-pages-center-streamlit-page-module">streamlit_dashboard.streamlit_pages.center_streamlit_page module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html#streamlit-dashboard-streamlit-pages-comparer-streamlit-page-module">streamlit_dashboard.streamlit_pages.comparer_streamlit_page module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html#streamlit-dashboard-streamlit-pages-funding-streamlit-page-module">streamlit_dashboard.streamlit_pages.funding_streamlit_page module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html#streamlit-dashboard-streamlit-pages-naics-streamlit-page-module">streamlit_dashboard.streamlit_pages.naics_streamlit_page module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html#streamlit-dashboard-streamlit-pages-nbs-streamlit-page-module">streamlit_dashboard.streamlit_pages.nbs_streamlit_page module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html#streamlit-dashboard-streamlit-pages-training-attendee-ranges-page-module">streamlit_dashboard.streamlit_pages.training_attendee_ranges_page module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html#streamlit-dashboard-streamlit-pages-trainings-attendees-count-page-module">streamlit_dashboard.streamlit_pages.trainings_attendees_count_page module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html#streamlit-dashboard-streamlit-pages-trainings-count-statistics-page-module">streamlit_dashboard.streamlit_pages.trainings_count_statistics_page module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html#streamlit-dashboard-streamlit-pages-trainings-event-attendee-comparison-page-module">streamlit_dashboard.streamlit_pages.trainings_event_attendee_comparison_page module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html#streamlit-dashboard-streamlit-pages-trainings-event-count-page-module">streamlit_dashboard.streamlit_pages.trainings_event_count_page module</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.streamlit_pages.html#streamlit-dashboard-streamlit-pages-trainings-primary-topic-page-module">streamlit_dashboard.streamlit_pages.trainings_primary_topic_page module</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="streamlit_dashboard.utility_classes.html">streamlit_dashboard.utility_classes namespace</a><ul>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#submodules">Submodules</a></li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#module-streamlit_dashboard.utility_classes.base_report_page">streamlit_dashboard.utility_classes.base_report_page module</a><ul>
<li class="toctree-l3"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.base_report_page.BaseReportPage"><code class="docutils literal notranslate"><span class="pre">BaseReportPage</span></code></a><ul>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.base_report_page.BaseReportPage.generate_figures"><code class="docutils literal notranslate"><span class="pre">BaseReportPage.generate_figures()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.base_report_page.BaseReportPage.get_page_name"><code class="docutils literal notranslate"><span class="pre">BaseReportPage.get_page_name()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.base_report_page.BaseReportPage.get_syncable_figure_keys"><code class="docutils literal notranslate"><span class="pre">BaseReportPage.get_syncable_figure_keys()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.base_report_page.BaseReportPage.render"><code class="docutils literal notranslate"><span class="pre">BaseReportPage.render()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.base_report_page.BaseReportPage.render_controls"><code class="docutils literal notranslate"><span class="pre">BaseReportPage.render_controls()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.base_report_page.BaseReportPage.render_figures"><code class="docutils literal notranslate"><span class="pre">BaseReportPage.render_figures()</span></code></a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.base_report_page.Renderable"><code class="docutils literal notranslate"><span class="pre">Renderable</span></code></a><ul>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.base_report_page.Renderable.get_widget_key"><code class="docutils literal notranslate"><span class="pre">Renderable.get_widget_key()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.base_report_page.Renderable.render"><code class="docutils literal notranslate"><span class="pre">Renderable.render()</span></code></a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#module-streamlit_dashboard.utility_classes.dashboard_config_parser">streamlit_dashboard.utility_classes.dashboard_config_parser module</a><ul>
<li class="toctree-l3"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig"><code class="docutils literal notranslate"><span class="pre">DashboardConfig</span></code></a><ul>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.get_clients_list_urls"><code class="docutils literal notranslate"><span class="pre">DashboardConfig.get_clients_list_urls()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.get_funding_milestones_urls"><code class="docutils literal notranslate"><span class="pre">DashboardConfig.get_funding_milestones_urls()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.get_log_level"><code class="docutils literal notranslate"><span class="pre">DashboardConfig.get_log_level()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.get_log_path"><code class="docutils literal notranslate"><span class="pre">DashboardConfig.get_log_path()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.get_nbs_milestones_urls"><code class="docutils literal notranslate"><span class="pre">DashboardConfig.get_nbs_milestones_urls()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.get_trainings_urls"><code class="docutils literal notranslate"><span class="pre">DashboardConfig.get_trainings_urls()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.load"><code class="docutils literal notranslate"><span class="pre">DashboardConfig.load()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.save"><code class="docutils literal notranslate"><span class="pre">DashboardConfig.save()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_clients_list_current_fy_url"><code class="docutils literal notranslate"><span class="pre">DashboardConfig.set_clients_list_current_fy_url()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_clients_list_prev_fy_url"><code class="docutils literal notranslate"><span class="pre">DashboardConfig.set_clients_list_prev_fy_url()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_funding_milestones_current_fy_url"><code class="docutils literal notranslate"><span class="pre">DashboardConfig.set_funding_milestones_current_fy_url()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_funding_milestones_prev_fy_url"><code class="docutils literal notranslate"><span class="pre">DashboardConfig.set_funding_milestones_prev_fy_url()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_nbs_milestones_current_fy_url"><code class="docutils literal notranslate"><span class="pre">DashboardConfig.set_nbs_milestones_current_fy_url()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_nbs_milestones_prev_fy_url"><code class="docutils literal notranslate"><span class="pre">DashboardConfig.set_nbs_milestones_prev_fy_url()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_trainings_current_fy_url"><code class="docutils literal notranslate"><span class="pre">DashboardConfig.set_trainings_current_fy_url()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_trainings_prev_fy_url"><code class="docutils literal notranslate"><span class="pre">DashboardConfig.set_trainings_prev_fy_url()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.write_template"><code class="docutils literal notranslate"><span class="pre">DashboardConfig.write_template()</span></code></a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair"><code class="docutils literal notranslate"><span class="pre">ExportModulePair</span></code></a><ul>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair.current_fy"><code class="docutils literal notranslate"><span class="pre">ExportModulePair.current_fy</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair.prev_fy"><code class="docutils literal notranslate"><span class="pre">ExportModulePair.prev_fy</span></code></a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#module-streamlit_dashboard.utility_classes.figure_with_max_y">streamlit_dashboard.utility_classes.figure_with_max_y module</a><ul>
<li class="toctree-l3"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.figure_with_max_y.FigureWithMaxY"><code class="docutils literal notranslate"><span class="pre">FigureWithMaxY</span></code></a><ul>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.figure_with_max_y.FigureWithMaxY.figure"><code class="docutils literal notranslate"><span class="pre">FigureWithMaxY.figure</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.figure_with_max_y.FigureWithMaxY.max_y"><code class="docutils literal notranslate"><span class="pre">FigureWithMaxY.max_y</span></code></a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="streamlit_dashboard.utility_classes.html#streamlit_dashboard.utility_classes.figure_with_max_y.find_fig_max_y_and_generate_wrapper"><code class="docutils literal notranslate"><span class="pre">find_fig_max_y_and_generate_wrapper()</span></code></a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</section>
<section id="submodules">
<h2>Submodules<a class="headerlink" href="#submodules" title="Link to this heading"></a></h2>
</section>
<section id="module-streamlit_dashboard.auth_config_loader">
<span id="streamlit-dashboard-auth-config-loader-module"></span><h2>streamlit_dashboard.auth_config_loader module<a class="headerlink" href="#module-streamlit_dashboard.auth_config_loader" title="Link to this heading"></a></h2>
<dl class="py function">
<dt class="sig sig-object py" id="streamlit_dashboard.auth_config_loader.load_auth_config">
<span class="sig-prename descclassname"><span class="pre">streamlit_dashboard.auth_config_loader.</span></span><span class="sig-name descname"><span class="pre">load_auth_config</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">config_path</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Authenticate</span></span></span><a class="headerlink" href="#streamlit_dashboard.auth_config_loader.load_auth_config" title="Link to this definition"></a></dt>
<dd></dd></dl>
</section>
<section id="module-streamlit_dashboard.main">
<span id="streamlit-dashboard-main-module"></span><h2>streamlit_dashboard.main module<a class="headerlink" href="#module-streamlit_dashboard.main" title="Link to this heading"></a></h2>
<p>Entry point and primary orchestrator for the Streamlit dashboard application.</p>
<p>This script establishes the global execution environment before rendering any specialized
report components. It acts as the central dependency provider, executing three critical
initialization phases to ensure child classes operate within a safe, predictable state:</p>
<ol class="arabic simple">
<li><p>Security &amp; Access Control: Initializes the session state with user credentials and roles.
It establishes the login UI and conditionally injects restricted routes (like the
<cite>AdminPanelPage</cite>) into the navigation tree based on specific role-based permissions.</p></li>
<li><p>Configuration State Management: Loads and strictly validates the <cite>DashboardConfig</cite>
YAML file, injecting it into the Streamlit session state. This fail-fast initialization
guarantees that all downstream report classes (e.g., <cite>NaicsReportPage</cite>, <cite>TrainingsEventCountsPage</cite>)
can reliably resolve their required Neoserra data endpoints based on user-selected fiscal
periods without performing redundant file I/O.</p></li>
<li><p>Global Telemetry: Configures a centralized rotating file and console logging architecture.
By defining this at the root level, any initialization or rendering errors caught within
the isolated execution boundaries of individual report pages are captured consistently.</p></li>
</ol>
</section>
<section id="module-streamlit_dashboard.streamlit_constants">
<span id="streamlit-dashboard-streamlit-constants-module"></span><h2>streamlit_dashboard.streamlit_constants module<a class="headerlink" href="#module-streamlit_dashboard.streamlit_constants" title="Link to this heading"></a></h2>
</section>
</section>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="Main">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">Streamlit Dashboard</a></h1>
<search id="searchbox" style="display: none" role="search">
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search"/>
<input type="submit" value="Go" />
</form>
</div>
</search>
<script>document.getElementById('searchbox').style.display = "block"</script><h3>Navigation</h3>
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal" href="modules.html">streamlit_dashboard</a><ul class="current">
<li class="toctree-l2 current"><a class="current reference internal" href="#">streamlit_dashboard namespace</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
<li><a href="modules.html">streamlit_dashboard</a><ul>
<li>Previous: <a href="modules.html" title="previous chapter">streamlit_dashboard</a></li>
<li>Next: <a href="streamlit_dashboard.cached_function_wrappers.html" title="next chapter">streamlit_dashboard.cached_function_wrappers namespace</a></li>
</ul></li>
</ul></li>
</ul>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&#169;2026, SBDC Team.
|
Powered by <a href="https://www.sphinx-doc.org/">Sphinx 9.1.0</a>
&amp; <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
|
<a href="_sources/streamlit_dashboard.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

View File

@@ -0,0 +1,380 @@
<!DOCTYPE html>
<html lang="en" data-content_root="./">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<title>streamlit_dashboard.page_classes namespace &#8212; Streamlit Dashboard 1.0 documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=5ecbeea2" />
<link rel="stylesheet" type="text/css" href="_static/basic.css?v=b08954a9" />
<link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=27fed22d" />
<script src="_static/documentation_options.js?v=f2a433a1"></script>
<script src="_static/doctools.js?v=fd6eb6e6"></script>
<script src="_static/sphinx_highlight.js?v=6ffebe34"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="streamlit_dashboard.streamlit_pages namespace" href="streamlit_dashboard.streamlit_pages.html" />
<link rel="prev" title="streamlit_dashboard.components namespace" href="streamlit_dashboard.components.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="module-streamlit_dashboard.page_classes">
<span id="streamlit-dashboard-page-classes-namespace"></span><h1>streamlit_dashboard.page_classes namespace<a class="headerlink" href="#module-streamlit_dashboard.page_classes" title="Link to this heading"></a></h1>
<section id="submodules">
<h2>Submodules<a class="headerlink" href="#submodules" title="Link to this heading"></a></h2>
</section>
<section id="module-streamlit_dashboard.page_classes.admin_panel_page_class">
<span id="streamlit-dashboard-page-classes-admin-panel-page-class-module"></span><h2>streamlit_dashboard.page_classes.admin_panel_page_class module<a class="headerlink" href="#module-streamlit_dashboard.page_classes.admin_panel_page_class" title="Link to this heading"></a></h2>
<dl class="py class">
<dt class="sig sig-object py" id="streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage">
<span class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></span><span class="sig-prename descclassname"><span class="pre">streamlit_dashboard.page_classes.admin_panel_page_class.</span></span><span class="sig-name descname"><span class="pre">AdminPanelPage</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage" title="Link to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">BaseReportPage</span></code></p>
<p>Provides a centralized administrative interface for configuring dashboard data sources.</p>
<p>Unlike standard report pages, this class does not generate or render data visualizations.
Instead, it hooks into the standard BaseReportPage lifecycle to render a configuration
form. It manages the retrieval, validation, and updating of Neoserra API export URLs
stored within the global DashboardConfig session state.</p>
<p>It employs strict regex validation to ensure data pipeline integrity, while also
providing a deliberate bypass mechanism to future-proof against external API changes.</p>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.generate_figures">
<span class="sig-name descname"><span class="pre">generate_figures</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">parameters</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.generate_figures" title="Link to this definition"></a></dt>
<dd><p>Overrides the standard data generation step as a no-op.</p>
<p>Because this page is strictly for configuration management, it circumvents
the data processing phase of the BaseReportPage lifecycle.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>parameters</strong> (<em>Dict</em><em>[</em><em>str</em><em>, </em><em>Any</em><em>]</em>) The parameter dictionary (empty from render_controls).</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>An empty dictionary representing no figure data.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Dict[str, Any]</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.get_page_name">
<span class="property"><span class="k"><span class="pre">static</span></span><span class="w"> </span></span><span class="sig-name descname"><span class="pre">get_page_name</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.get_page_name" title="Link to this definition"></a></dt>
<dd><p>Retrieves the human-readable name of the admin panel for UI navigation.</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>The static display name “Admin Panel”.</p>
</dd>
<dt class="field-even">Return type<span class="colon">:</span></dt>
<dd class="field-even"><p>str</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.get_syncable_figure_keys">
<span class="sig-name descname"><span class="pre">get_syncable_figure_keys</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span></span><a class="headerlink" href="#streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.get_syncable_figure_keys" title="Link to this definition"></a></dt>
<dd><p>Declares that this page has no visual figures requiring axis synchronization.</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>An empty list.</p>
</dd>
<dt class="field-even">Return type<span class="colon">:</span></dt>
<dd class="field-even"><p>List[str]</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.is_valid_neoserra_url">
<span class="sig-name descname"><span class="pre">is_valid_neoserra_url</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">url</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.is_valid_neoserra_url" title="Link to this definition"></a></dt>
<dd><p>Validates a given URL against the expected Neoserra export API format.</p>
<p>Used as a gatekeeper during form submission to prevent malformed URLs from breaking
the dashboards data ingestion pipeline.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>url</strong> (<em>str</em>) The raw URL string to validate.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>True if the URL matches the expected Neoserra API pattern, False otherwise.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.render_controls">
<span class="sig-name descname"><span class="pre">render_controls</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">container</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">DeltaGenerator</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span></span></span><a class="headerlink" href="#streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.render_controls" title="Link to this definition"></a></dt>
<dd><p>Builds the administrative form and handles the validation/submission pipeline.</p>
<p>This method constructs a unified Streamlit form containing URL grabber widgets for
various data modules (Clients, Trainings, NBS, Funding). By wrapping the inputs
in a single form, it ensures that configuration updates are processed as a single
batch rather than triggering piecemeal app reruns.</p>
<p>During submission, it utilizes an “all-or-nothing” validation strategy. If any link
fails regex validation (and the manual bypass is not checked), the entire save
operation is aborted to prevent partial configuration states.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>container</strong> (<em>DeltaGenerator</em>) The Streamlit container to draw the administrative form onto.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>An empty dictionary, as this page does not pass parameters to generate_figures.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Dict[str, Any]</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.render_figures">
<span class="sig-name descname"><span class="pre">render_figures</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">container</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">DeltaGenerator</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">output_data</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.render_figures" title="Link to this definition"></a></dt>
<dd><p>Overrides the standard figure rendering step as a no-op.</p>
<p>Does nothing, as there are no visual charts or graphs to draw for the Admin Panel.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>container</strong> (<em>DeltaGenerator</em>) The Streamlit container.</p></li>
<li><p><strong>output_data</strong> (<em>Dict</em><em>[</em><em>str</em><em>, </em><em>Any</em><em>]</em>) The empty output data from generate_figures.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.save_settings">
<span class="sig-name descname"><span class="pre">save_settings</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.page_classes.admin_panel_page_class.AdminPanelPage.save_settings" title="Link to this definition"></a></dt>
<dd><p>Commits the current configuration state to persistent storage.</p>
<p>Extracts the DashboardConfig object from the Streamlit session state and triggers
its internal save mechanism, providing visual feedback to the user upon completion.</p>
</dd></dl>
</dd></dl>
</section>
<section id="streamlit-dashboard-page-classes-authentication-page-wrapper-module">
<h2>streamlit_dashboard.page_classes.authentication_page_wrapper module<a class="headerlink" href="#streamlit-dashboard-page-classes-authentication-page-wrapper-module" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-page-classes-center-milestones-page-class-module">
<h2>streamlit_dashboard.page_classes.center_milestones_page_class module<a class="headerlink" href="#streamlit-dashboard-page-classes-center-milestones-page-class-module" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-page-classes-funding-milestones-page-class-module">
<h2>streamlit_dashboard.page_classes.funding_milestones_page_class module<a class="headerlink" href="#streamlit-dashboard-page-classes-funding-milestones-page-class-module" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-page-classes-naics-report-page-class-module">
<h2>streamlit_dashboard.page_classes.naics_report_page_class module<a class="headerlink" href="#streamlit-dashboard-page-classes-naics-report-page-class-module" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-page-classes-nbs-milestones-page-class-module">
<h2>streamlit_dashboard.page_classes.nbs_milestones_page_class module<a class="headerlink" href="#streamlit-dashboard-page-classes-nbs-milestones-page-class-module" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-page-classes-page-class-constants-module">
<h2>streamlit_dashboard.page_classes.page_class_constants module<a class="headerlink" href="#streamlit-dashboard-page-classes-page-class-constants-module" title="Link to this heading"></a></h2>
</section>
<section id="module-streamlit_dashboard.page_classes.report_comparer_page_class">
<span id="streamlit-dashboard-page-classes-report-comparer-page-class-module"></span><h2>streamlit_dashboard.page_classes.report_comparer_page_class module<a class="headerlink" href="#module-streamlit_dashboard.page_classes.report_comparer_page_class" title="Link to this heading"></a></h2>
<dl class="py class">
<dt class="sig sig-object py" id="streamlit_dashboard.page_classes.report_comparer_page_class.ComparerColumn">
<span class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></span><span class="sig-prename descclassname"><span class="pre">streamlit_dashboard.page_classes.report_comparer_page_class.</span></span><span class="sig-name descname"><span class="pre">ComparerColumn</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">report_name_map</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">dict</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">report_configs</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">dict</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">column_id</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.page_classes.report_comparer_page_class.ComparerColumn" title="Link to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">BaseReportPage</span></code></p>
<p>Acts as an interactive proxy wrapper for a single report within a comparison layout.</p>
<p>Handles dynamic instantiation of a user-selected report and forcibly overrides its
instance ID. This guarantees that Streamlit widget keys remain completely unique
even if the user selects the exact same report class in both comparison columns.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>report_name_map</strong> (<em>dict</em>) Dictionary mapping UI display names to BaseReportPage classes.</p></li>
<li><p><strong>report_configs</strong> (<em>dict</em>) Dictionary mapping classes to their config keyword arguments.</p></li>
<li><p><strong>column_id</strong> (<em>str</em>) An identifier (e.g., left, right) prepended to prevent widget collisions.</p></li>
</ul>
</dd>
</dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.page_classes.report_comparer_page_class.ComparerColumn.generate_figures">
<span class="sig-name descname"><span class="pre">generate_figures</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">parameters</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span></span></span><a class="headerlink" href="#streamlit_dashboard.page_classes.report_comparer_page_class.ComparerColumn.generate_figures" title="Link to this definition"></a></dt>
<dd><p>Delegates figure generation to the currently instantiated report.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>parameters</strong> (<em>Dict</em><em>[</em><em>str</em><em>, </em><em>Any</em><em>]</em>) User inputs specific to the selected report.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>The output data payload from the selected report.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Dict[str, Any]</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.page_classes.report_comparer_page_class.ComparerColumn.render_controls">
<span class="sig-name descname"><span class="pre">render_controls</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">container</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">DeltaGenerator</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span></span></span><a class="headerlink" href="#streamlit_dashboard.page_classes.report_comparer_page_class.ComparerColumn.render_controls" title="Link to this definition"></a></dt>
<dd><p>Draws a selection menu to instantiate the desired report, then renders its specific controls.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>container</strong> (<em>DeltaGenerator</em>) The Streamlit column container.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>The parameters generated by the selected reports controls.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Dict[str, Any]</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.page_classes.report_comparer_page_class.ComparerColumn.render_figures">
<span class="sig-name descname"><span class="pre">render_figures</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">container</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">DeltaGenerator</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">output_data</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.page_classes.report_comparer_page_class.ComparerColumn.render_figures" title="Link to this definition"></a></dt>
<dd><p>Delegates the final drawing phase to the currently instantiated report.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>container</strong> (<em>DeltaGenerator</em>) The Streamlit column container.</p></li>
<li><p><strong>output_data</strong> (<em>Dict</em><em>[</em><em>str</em><em>, </em><em>Any</em><em>]</em>) The display data, potentially mutated by the parent ComparerPage.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="streamlit_dashboard.page_classes.report_comparer_page_class.ComparerPage">
<span class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></span><span class="sig-prename descclassname"><span class="pre">streamlit_dashboard.page_classes.report_comparer_page_class.</span></span><span class="sig-name descname"><span class="pre">ComparerPage</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">report_configs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.page_classes.report_comparer_page_class.ComparerPage" title="Link to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">BaseReportPage</span></code></p>
<p>Orchestrates a dual-column layout to allow dynamic side-by-side report comparison.</p>
<p>Leverages the BaseReportPage lifecycle to intercept data generation between two
child columns. If identical report types are selected, it extracts their max values
and synchronizes their Y-axes globally before allowing the final rendering phase,
ensuring an accurate visual comparison.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>report_configs</strong> (<em>dict</em>) Mapping of report page classes to their respective instantiation arguments.</p>
</dd>
</dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.page_classes.report_comparer_page_class.ComparerPage.render">
<span class="sig-name descname"><span class="pre">render</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">container</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">DeltaGenerator</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.page_classes.report_comparer_page_class.ComparerPage.render" title="Link to this definition"></a></dt>
<dd><p>Splits the layout and manages the synchronization pipeline for both child reports.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>container</strong> (<em>DeltaGenerator</em>) The main Streamlit container allocated for the comparer.</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
</section>
<section id="streamlit-dashboard-page-classes-training-attendee-counts-class-module">
<h2>streamlit_dashboard.page_classes.training_attendee_counts_class module<a class="headerlink" href="#streamlit-dashboard-page-classes-training-attendee-counts-class-module" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-page-classes-training-attendee-ranges-page-class-module">
<h2>streamlit_dashboard.page_classes.training_attendee_ranges_page_class module<a class="headerlink" href="#streamlit-dashboard-page-classes-training-attendee-ranges-page-class-module" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-page-classes-training-count-statistics-page-class-module">
<h2>streamlit_dashboard.page_classes.training_count_statistics_page_class module<a class="headerlink" href="#streamlit-dashboard-page-classes-training-count-statistics-page-class-module" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-page-classes-training-event-count-attendee-comparison-page-class-module">
<h2>streamlit_dashboard.page_classes.training_event_count_attendee_comparison_page_class module<a class="headerlink" href="#streamlit-dashboard-page-classes-training-event-count-attendee-comparison-page-class-module" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-page-classes-training-event-count-page-class-module">
<h2>streamlit_dashboard.page_classes.training_event_count_page_class module<a class="headerlink" href="#streamlit-dashboard-page-classes-training-event-count-page-class-module" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-page-classes-training-primary-topics-page-class-module">
<h2>streamlit_dashboard.page_classes.training_primary_topics_page_class module<a class="headerlink" href="#streamlit-dashboard-page-classes-training-primary-topics-page-class-module" title="Link to this heading"></a></h2>
</section>
</section>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="Main">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">Streamlit Dashboard</a></h1>
<search id="searchbox" style="display: none" role="search">
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search"/>
<input type="submit" value="Go" />
</form>
</div>
</search>
<script>document.getElementById('searchbox').style.display = "block"</script><h3>Navigation</h3>
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal" href="modules.html">streamlit_dashboard</a><ul class="current">
<li class="toctree-l2 current"><a class="reference internal" href="streamlit_dashboard.html">streamlit_dashboard namespace</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
<li><a href="modules.html">streamlit_dashboard</a><ul>
<li><a href="streamlit_dashboard.html">streamlit_dashboard namespace</a><ul>
<li>Previous: <a href="streamlit_dashboard.components.html" title="previous chapter">streamlit_dashboard.components namespace</a></li>
<li>Next: <a href="streamlit_dashboard.streamlit_pages.html" title="next chapter">streamlit_dashboard.streamlit_pages namespace</a></li>
</ul></li>
</ul></li>
</ul></li>
</ul>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&#169;2026, SBDC Team.
|
Powered by <a href="https://www.sphinx-doc.org/">Sphinx 9.1.0</a>
&amp; <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
|
<a href="_sources/streamlit_dashboard.page_classes.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

View File

@@ -0,0 +1,154 @@
<!DOCTYPE html>
<html lang="en" data-content_root="./">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<title>streamlit_dashboard.streamlit_pages namespace &#8212; Streamlit Dashboard 1.0 documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=5ecbeea2" />
<link rel="stylesheet" type="text/css" href="_static/basic.css?v=b08954a9" />
<link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=27fed22d" />
<script src="_static/documentation_options.js?v=f2a433a1"></script>
<script src="_static/doctools.js?v=fd6eb6e6"></script>
<script src="_static/sphinx_highlight.js?v=6ffebe34"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="streamlit_dashboard.utility_classes namespace" href="streamlit_dashboard.utility_classes.html" />
<link rel="prev" title="streamlit_dashboard.page_classes namespace" href="streamlit_dashboard.page_classes.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="module-streamlit_dashboard.streamlit_pages">
<span id="streamlit-dashboard-streamlit-pages-namespace"></span><h1>streamlit_dashboard.streamlit_pages namespace<a class="headerlink" href="#module-streamlit_dashboard.streamlit_pages" title="Link to this heading"></a></h1>
<section id="submodules">
<h2>Submodules<a class="headerlink" href="#submodules" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-streamlit-pages-admin-streamlit-page-module">
<h2>streamlit_dashboard.streamlit_pages.admin_streamlit_page module<a class="headerlink" href="#streamlit-dashboard-streamlit-pages-admin-streamlit-page-module" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-streamlit-pages-center-streamlit-page-module">
<h2>streamlit_dashboard.streamlit_pages.center_streamlit_page module<a class="headerlink" href="#streamlit-dashboard-streamlit-pages-center-streamlit-page-module" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-streamlit-pages-comparer-streamlit-page-module">
<h2>streamlit_dashboard.streamlit_pages.comparer_streamlit_page module<a class="headerlink" href="#streamlit-dashboard-streamlit-pages-comparer-streamlit-page-module" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-streamlit-pages-funding-streamlit-page-module">
<h2>streamlit_dashboard.streamlit_pages.funding_streamlit_page module<a class="headerlink" href="#streamlit-dashboard-streamlit-pages-funding-streamlit-page-module" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-streamlit-pages-naics-streamlit-page-module">
<h2>streamlit_dashboard.streamlit_pages.naics_streamlit_page module<a class="headerlink" href="#streamlit-dashboard-streamlit-pages-naics-streamlit-page-module" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-streamlit-pages-nbs-streamlit-page-module">
<h2>streamlit_dashboard.streamlit_pages.nbs_streamlit_page module<a class="headerlink" href="#streamlit-dashboard-streamlit-pages-nbs-streamlit-page-module" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-streamlit-pages-training-attendee-ranges-page-module">
<h2>streamlit_dashboard.streamlit_pages.training_attendee_ranges_page module<a class="headerlink" href="#streamlit-dashboard-streamlit-pages-training-attendee-ranges-page-module" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-streamlit-pages-trainings-attendees-count-page-module">
<h2>streamlit_dashboard.streamlit_pages.trainings_attendees_count_page module<a class="headerlink" href="#streamlit-dashboard-streamlit-pages-trainings-attendees-count-page-module" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-streamlit-pages-trainings-count-statistics-page-module">
<h2>streamlit_dashboard.streamlit_pages.trainings_count_statistics_page module<a class="headerlink" href="#streamlit-dashboard-streamlit-pages-trainings-count-statistics-page-module" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-streamlit-pages-trainings-event-attendee-comparison-page-module">
<h2>streamlit_dashboard.streamlit_pages.trainings_event_attendee_comparison_page module<a class="headerlink" href="#streamlit-dashboard-streamlit-pages-trainings-event-attendee-comparison-page-module" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-streamlit-pages-trainings-event-count-page-module">
<h2>streamlit_dashboard.streamlit_pages.trainings_event_count_page module<a class="headerlink" href="#streamlit-dashboard-streamlit-pages-trainings-event-count-page-module" title="Link to this heading"></a></h2>
</section>
<section id="streamlit-dashboard-streamlit-pages-trainings-primary-topic-page-module">
<h2>streamlit_dashboard.streamlit_pages.trainings_primary_topic_page module<a class="headerlink" href="#streamlit-dashboard-streamlit-pages-trainings-primary-topic-page-module" title="Link to this heading"></a></h2>
</section>
</section>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="Main">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">Streamlit Dashboard</a></h1>
<search id="searchbox" style="display: none" role="search">
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search"/>
<input type="submit" value="Go" />
</form>
</div>
</search>
<script>document.getElementById('searchbox').style.display = "block"</script><h3>Navigation</h3>
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal" href="modules.html">streamlit_dashboard</a><ul class="current">
<li class="toctree-l2 current"><a class="reference internal" href="streamlit_dashboard.html">streamlit_dashboard namespace</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
<li><a href="modules.html">streamlit_dashboard</a><ul>
<li><a href="streamlit_dashboard.html">streamlit_dashboard namespace</a><ul>
<li>Previous: <a href="streamlit_dashboard.page_classes.html" title="previous chapter">streamlit_dashboard.page_classes namespace</a></li>
<li>Next: <a href="streamlit_dashboard.utility_classes.html" title="next chapter">streamlit_dashboard.utility_classes namespace</a></li>
</ul></li>
</ul></li>
</ul></li>
</ul>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&#169;2026, SBDC Team.
|
Powered by <a href="https://www.sphinx-doc.org/">Sphinx 9.1.0</a>
&amp; <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
|
<a href="_sources/streamlit_dashboard.streamlit_pages.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

View File

@@ -0,0 +1,504 @@
<!DOCTYPE html>
<html lang="en" data-content_root="./">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<title>streamlit_dashboard.utility_classes namespace &#8212; Streamlit Dashboard 1.0 documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=5ecbeea2" />
<link rel="stylesheet" type="text/css" href="_static/basic.css?v=b08954a9" />
<link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=27fed22d" />
<script src="_static/documentation_options.js?v=f2a433a1"></script>
<script src="_static/doctools.js?v=fd6eb6e6"></script>
<script src="_static/sphinx_highlight.js?v=6ffebe34"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="prev" title="streamlit_dashboard.streamlit_pages namespace" href="streamlit_dashboard.streamlit_pages.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="module-streamlit_dashboard.utility_classes">
<span id="streamlit-dashboard-utility-classes-namespace"></span><h1>streamlit_dashboard.utility_classes namespace<a class="headerlink" href="#module-streamlit_dashboard.utility_classes" title="Link to this heading"></a></h1>
<section id="submodules">
<h2>Submodules<a class="headerlink" href="#submodules" title="Link to this heading"></a></h2>
</section>
<section id="module-streamlit_dashboard.utility_classes.base_report_page">
<span id="streamlit-dashboard-utility-classes-base-report-page-module"></span><h2>streamlit_dashboard.utility_classes.base_report_page module<a class="headerlink" href="#module-streamlit_dashboard.utility_classes.base_report_page" title="Link to this heading"></a></h2>
<dl class="py class">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.base_report_page.BaseReportPage">
<span class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></span><span class="sig-prename descclassname"><span class="pre">streamlit_dashboard.utility_classes.base_report_page.</span></span><span class="sig-name descname"><span class="pre">BaseReportPage</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">title</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.utility_classes.base_report_page.BaseReportPage" title="Link to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#streamlit_dashboard.utility_classes.base_report_page.Renderable" title="streamlit_dashboard.utility_classes.base_report_page.Renderable"><code class="xref py py-class docutils literal notranslate"><span class="pre">Renderable</span></code></a></p>
<p>Standardizes the rendering pipeline for all analytical report pages.</p>
<p>This class breaks down UI generation into a predictable, synchronous lifecycle:
1. Render controls (capture inputs).
2. Generate figures (process data).
3. Render figures (display outputs).
This strict pipeline allows higher-level orchestrators to intercept the process
mid-cycle (e.g., to mutate generated figures before they are drawn).</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>title</strong> (<em>str</em>) The title of the page, acting as its base instance ID.</p>
</dd>
</dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.base_report_page.BaseReportPage.generate_figures">
<span class="sig-name descname"><span class="pre">generate_figures</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">parameters</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.utility_classes.base_report_page.BaseReportPage.generate_figures" title="Link to this definition"></a></dt>
<dd><p>Processes parameters and generates the underlying data/figures for the report.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>parameters</strong> (<em>Dict</em><em>[</em><em>str</em><em>, </em><em>Any</em><em>]</em>) The dictionary of user inputs captured from render_controls.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>A dictionary of computed outputs or Plotly figures.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Dict[str, Any]</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.base_report_page.BaseReportPage.get_page_name">
<span class="property"><span class="k"><span class="pre">static</span></span><span class="w"> </span></span><span class="sig-name descname"><span class="pre">get_page_name</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.utility_classes.base_report_page.BaseReportPage.get_page_name" title="Link to this definition"></a></dt>
<dd><p>Retrieves the human-readable name of the report for UI selection menus.</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>The display name of the report.</p>
</dd>
<dt class="field-even">Return type<span class="colon">:</span></dt>
<dd class="field-even"><p>str</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.base_report_page.BaseReportPage.get_syncable_figure_keys">
<span class="sig-name descname"><span class="pre">get_syncable_figure_keys</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span></span><a class="headerlink" href="#streamlit_dashboard.utility_classes.base_report_page.BaseReportPage.get_syncable_figure_keys" title="Link to this definition"></a></dt>
<dd><p>Identifies which generated figures support external axis synchronization for when
two of the same report are displayed side by side.</p>
<p>This should really only be used for graphs for which axis synchronization makes sense
(like bar charts that show quantities not percentages)</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>A list of dictionary keys corresponding to figures in output_data
that can have their Y-axes scaled dynamically by a parent orchestrator.</p>
</dd>
<dt class="field-even">Return type<span class="colon">:</span></dt>
<dd class="field-even"><p>List[str]</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.base_report_page.BaseReportPage.render">
<span class="sig-name descname"><span class="pre">render</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">container</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">DeltaGenerator</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.utility_classes.base_report_page.BaseReportPage.render" title="Link to this definition"></a></dt>
<dd><p>Executes the standardized report lifecycle.</p>
<p>Sequentially chains control rendering, data generation, and figure drawing,
passing state safely between each phase and halting if user parameters are missing.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>container</strong> (<em>DeltaGenerator</em>) The Streamlit layout container for the entire report.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.base_report_page.BaseReportPage.render_controls">
<span class="sig-name descname"><span class="pre">render_controls</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">container</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">DeltaGenerator</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span></span></span><a class="headerlink" href="#streamlit_dashboard.utility_classes.base_report_page.BaseReportPage.render_controls" title="Link to this definition"></a></dt>
<dd><p>Renders the input widgets required to parameterize the report.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>container</strong> (<em>DeltaGenerator</em>) The Streamlit container to draw the widgets onto.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>A dictionary of user-selected parameters, or None if inputs are invalid.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Dict[str, Any]</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.base_report_page.BaseReportPage.render_figures">
<span class="sig-name descname"><span class="pre">render_figures</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">container</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">DeltaGenerator</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">output_data</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.utility_classes.base_report_page.BaseReportPage.render_figures" title="Link to this definition"></a></dt>
<dd><p>Draws the previously generated figures and data onto the screen.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>container</strong> (<em>DeltaGenerator</em>) The Streamlit container to draw the visuals onto.</p></li>
<li><p><strong>output_data</strong> (<em>Dict</em><em>[</em><em>str</em><em>, </em><em>Any</em><em>]</em>) The computed results returned by generate_figures.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.base_report_page.Renderable">
<span class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></span><span class="sig-prename descclassname"><span class="pre">streamlit_dashboard.utility_classes.base_report_page.</span></span><span class="sig-name descname"><span class="pre">Renderable</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">instance_id</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.utility_classes.base_report_page.Renderable" title="Link to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">ABC</span></code></p>
<p>Abstract base class for UI components drawn to a Streamlit container.</p>
<p>Provides a strict contract for rendering and manages unique identifier generation.
This structure is critical in Streamlit to prevent widget state collisions
when multiple instances of the same UI component are rendered simultaneously.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>instance_id</strong> (<em>str</em>) A unique identifier for this specific rendered instance.</p>
</dd>
</dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.base_report_page.Renderable.get_widget_key">
<span class="sig-name descname"><span class="pre">get_widget_key</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">widget_unique_id</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">str</span></span></span><a class="headerlink" href="#streamlit_dashboard.utility_classes.base_report_page.Renderable.get_widget_key" title="Link to this definition"></a></dt>
<dd><p>Generates a globally unique Streamlit widget key for this specific instance.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>widget_unique_id</strong> (<em>str</em>) The local identifier for the specific widget.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>A concatenated string combining the instance ID and widget ID.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>str</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.base_report_page.Renderable.render">
<span class="property"><span class="k"><span class="pre">abstractmethod</span></span><span class="w"> </span></span><span class="sig-name descname"><span class="pre">render</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">container</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">DeltaGenerator</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.utility_classes.base_report_page.Renderable.render" title="Link to this definition"></a></dt>
<dd><p>Renders the components UI elements onto the specified Streamlit container.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>container</strong> (<em>DeltaGenerator</em>) The Streamlit layout element where this component will be drawn.</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
</section>
<section id="module-streamlit_dashboard.utility_classes.dashboard_config_parser">
<span id="streamlit-dashboard-utility-classes-dashboard-config-parser-module"></span><h2>streamlit_dashboard.utility_classes.dashboard_config_parser module<a class="headerlink" href="#module-streamlit_dashboard.utility_classes.dashboard_config_parser" title="Link to this heading"></a></h2>
<dl class="py class">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig">
<span class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></span><span class="sig-prename descclassname"><span class="pre">streamlit_dashboard.utility_classes.dashboard_config_parser.</span></span><span class="sig-name descname"><span class="pre">DashboardConfig</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">filename</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig" title="Link to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>Central manager for application configuration state and schema validation.</p>
<p>This class handles the serialization, parsing, and strict validation of the YAML
configuration file. It acts as the single source of truth for all external Neoserra
data endpoints and logging behaviors, abstracting the dictionary traversal away from
the reporting classes.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>filename</strong> (<em>str</em>) The filepath to the target YAML configuration file.</p>
</dd>
</dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.get_clients_list_urls">
<span class="sig-name descname"><span class="pre">get_clients_list_urls</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair" title="streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair"><span class="pre">ExportModulePair</span></a></span></span><a class="headerlink" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.get_clients_list_urls" title="Link to this definition"></a></dt>
<dd><p>Retrieves the paired endpoints for the client list dataset.</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>An object containing the current and previous fiscal period URLs.</p>
</dd>
<dt class="field-even">Return type<span class="colon">:</span></dt>
<dd class="field-even"><p><a class="reference internal" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair" title="streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair">ExportModulePair</a></p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.get_funding_milestones_urls">
<span class="sig-name descname"><span class="pre">get_funding_milestones_urls</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair" title="streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair"><span class="pre">ExportModulePair</span></a></span></span><a class="headerlink" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.get_funding_milestones_urls" title="Link to this definition"></a></dt>
<dd><p>Retrieves the paired endpoints for the funding milestones dataset.</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>An object containing the current and previous fiscal period URLs.</p>
</dd>
<dt class="field-even">Return type<span class="colon">:</span></dt>
<dd class="field-even"><p><a class="reference internal" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair" title="streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair">ExportModulePair</a></p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.get_log_level">
<span class="sig-name descname"><span class="pre">get_log_level</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">int</span></span></span><a class="headerlink" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.get_log_level" title="Link to this definition"></a></dt>
<dd><p>Translates the human-readable logging level from the configuration file into system constants.</p>
<p>Maps string values (e.g., “DEBUG”, “WARNING”) to their corresponding integer values
required by the native Python <cite>logging</cite> module.</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>The integer constant representing the logging severity level.</p>
</dd>
<dt class="field-even">Return type<span class="colon">:</span></dt>
<dd class="field-even"><p>int</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.get_log_path">
<span class="sig-name descname"><span class="pre">get_log_path</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">str</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span></span><a class="headerlink" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.get_log_path" title="Link to this definition"></a></dt>
<dd><p>Retrieves the configured file path for the applications rotating file logger.</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>The target filepath, or None if the configuration is missing.</p>
</dd>
<dt class="field-even">Return type<span class="colon">:</span></dt>
<dd class="field-even"><p>str | None</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.get_nbs_milestones_urls">
<span class="sig-name descname"><span class="pre">get_nbs_milestones_urls</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair" title="streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair"><span class="pre">ExportModulePair</span></a></span></span><a class="headerlink" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.get_nbs_milestones_urls" title="Link to this definition"></a></dt>
<dd><p>Retrieves the paired endpoints for the New Business Starts dataset.</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>An object containing the current and previous fiscal period URLs.</p>
</dd>
<dt class="field-even">Return type<span class="colon">:</span></dt>
<dd class="field-even"><p><a class="reference internal" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair" title="streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair">ExportModulePair</a></p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.get_trainings_urls">
<span class="sig-name descname"><span class="pre">get_trainings_urls</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair" title="streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair"><span class="pre">ExportModulePair</span></a></span></span><a class="headerlink" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.get_trainings_urls" title="Link to this definition"></a></dt>
<dd><p>Retrieves the paired endpoints for the training events dataset.</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>An object containing the current and previous fiscal period URLs.</p>
</dd>
<dt class="field-even">Return type<span class="colon">:</span></dt>
<dd class="field-even"><p><a class="reference internal" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair" title="streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair">ExportModulePair</a></p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.load">
<span class="sig-name descname"><span class="pre">load</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.load" title="Link to this definition"></a></dt>
<dd><p>Reads the configuration file from disk and enforces strict schema validation.</p>
<p>Acts as a fail-fast gateway for the application environment. It manually verifies the
existence of every required organizational key (export modules, fiscal periods, and logging
parameters). If the YAML file is structurally malformed or missing endpoints, it immediately
raises explicit KeyErrors to halt application boot, preventing cascading fetch failures later.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.save">
<span class="sig-name descname"><span class="pre">save</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.save" title="Link to this definition"></a></dt>
<dd><p>Serializes the current in-memory configuration state to the YAML file on disk.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_clients_list_current_fy_url">
<span class="sig-name descname"><span class="pre">set_clients_list_current_fy_url</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">current_fy_url</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_clients_list_current_fy_url" title="Link to this definition"></a></dt>
<dd><p>Updates the in-memory endpoint URL for the current fiscal periods client dataset.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_clients_list_prev_fy_url">
<span class="sig-name descname"><span class="pre">set_clients_list_prev_fy_url</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">prev_fy_url</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_clients_list_prev_fy_url" title="Link to this definition"></a></dt>
<dd><p>Updates the in-memory endpoint URL for the previous fiscal periods client dataset.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_funding_milestones_current_fy_url">
<span class="sig-name descname"><span class="pre">set_funding_milestones_current_fy_url</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">current_fy_url</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_funding_milestones_current_fy_url" title="Link to this definition"></a></dt>
<dd><p>Updates the in-memory endpoint URL for the current fiscal periods funding milestones dataset.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_funding_milestones_prev_fy_url">
<span class="sig-name descname"><span class="pre">set_funding_milestones_prev_fy_url</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">prev_fy_url</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_funding_milestones_prev_fy_url" title="Link to this definition"></a></dt>
<dd><p>Updates the in-memory endpoint URL for the previous fiscal periods funding milestones dataset.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_nbs_milestones_current_fy_url">
<span class="sig-name descname"><span class="pre">set_nbs_milestones_current_fy_url</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">current_fy_url</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_nbs_milestones_current_fy_url" title="Link to this definition"></a></dt>
<dd><p>Updates the in-memory endpoint URL for the current fiscal periods New Business Starts dataset.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_nbs_milestones_prev_fy_url">
<span class="sig-name descname"><span class="pre">set_nbs_milestones_prev_fy_url</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">prev_fy_url</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_nbs_milestones_prev_fy_url" title="Link to this definition"></a></dt>
<dd><p>Updates the in-memory endpoint URL for the previous fiscal periods New Business Starts dataset.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_trainings_current_fy_url">
<span class="sig-name descname"><span class="pre">set_trainings_current_fy_url</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">current_fy_url</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_trainings_current_fy_url" title="Link to this definition"></a></dt>
<dd><p>Updates the in-memory endpoint URL for the current fiscal periods training events dataset.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_trainings_prev_fy_url">
<span class="sig-name descname"><span class="pre">set_trainings_prev_fy_url</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">prev_fy_url</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.set_trainings_prev_fy_url" title="Link to this definition"></a></dt>
<dd><p>Updates the in-memory endpoint URL for the previous fiscal periods training events dataset.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.write_template">
<span class="property"><span class="k"><span class="pre">static</span></span><span class="w"> </span></span><span class="sig-name descname"><span class="pre">write_template</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">filename</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.DashboardConfig.write_template" title="Link to this definition"></a></dt>
<dd><p>Bootstraps a new environment by generating a default configuration file on disk.</p>
<p>Writes the hardcoded <cite>TEMPLATE_DICT</cite> schema to the specified path to ensure administrators
have the correct structural format when deploying the dashboard for the first time.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>filename</strong> (<em>str</em>) The target filepath for the generated YAML file.</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair">
<span class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></span><span class="sig-prename descclassname"><span class="pre">streamlit_dashboard.utility_classes.dashboard_config_parser.</span></span><span class="sig-name descname"><span class="pre">ExportModulePair</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">current_fy</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prev_fy</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair" title="Link to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>Data structure pairing data export endpoints across adjacent fiscal periods.</p>
<p>This class groups the URLs for the current and previous fiscal years, allowing
the application to easily pass paired historical and active data sources to
downstream report pipelines.</p>
<dl class="py attribute">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair.current_fy">
<span class="sig-name descname"><span class="pre">current_fy</span></span><span class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="pre">str</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">None</span></span><a class="headerlink" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair.current_fy" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair.prev_fy">
<span class="sig-name descname"><span class="pre">prev_fy</span></span><span class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="pre">str</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">None</span></span><a class="headerlink" href="#streamlit_dashboard.utility_classes.dashboard_config_parser.ExportModulePair.prev_fy" title="Link to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
</section>
<section id="module-streamlit_dashboard.utility_classes.figure_with_max_y">
<span id="streamlit-dashboard-utility-classes-figure-with-max-y-module"></span><h2>streamlit_dashboard.utility_classes.figure_with_max_y module<a class="headerlink" href="#module-streamlit_dashboard.utility_classes.figure_with_max_y" title="Link to this heading"></a></h2>
<dl class="py class">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.figure_with_max_y.FigureWithMaxY">
<span class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></span><span class="sig-prename descclassname"><span class="pre">streamlit_dashboard.utility_classes.figure_with_max_y.</span></span><span class="sig-name descname"><span class="pre">FigureWithMaxY</span></span><a class="headerlink" href="#streamlit_dashboard.utility_classes.figure_with_max_y.FigureWithMaxY" title="Link to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">TypedDict</span></code></p>
<p>A helper container class that gets used by report pages to encapsulate
Plotly figures along with the maximum y value represented on the figures.</p>
<p>This aids in axis synchronization when two of the same report are shown side by side</p>
<dl class="py attribute">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.figure_with_max_y.FigureWithMaxY.figure">
<span class="sig-name descname"><span class="pre">figure</span></span><span class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="pre">Figure</span></span><a class="headerlink" href="#streamlit_dashboard.utility_classes.figure_with_max_y.FigureWithMaxY.figure" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.figure_with_max_y.FigureWithMaxY.max_y">
<span class="sig-name descname"><span class="pre">max_y</span></span><span class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="pre">float</span></span><a class="headerlink" href="#streamlit_dashboard.utility_classes.figure_with_max_y.FigureWithMaxY.max_y" title="Link to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
<dl class="py function">
<dt class="sig sig-object py" id="streamlit_dashboard.utility_classes.figure_with_max_y.find_fig_max_y_and_generate_wrapper">
<span class="sig-prename descclassname"><span class="pre">streamlit_dashboard.utility_classes.figure_with_max_y.</span></span><span class="sig-name descname"><span class="pre">find_fig_max_y_and_generate_wrapper</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">fig</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Figure</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="#streamlit_dashboard.utility_classes.figure_with_max_y.FigureWithMaxY" title="streamlit_dashboard.utility_classes.figure_with_max_y.FigureWithMaxY"><span class="pre">FigureWithMaxY</span></a></span></span><a class="headerlink" href="#streamlit_dashboard.utility_classes.figure_with_max_y.find_fig_max_y_and_generate_wrapper" title="Link to this definition"></a></dt>
<dd><p>Helper to automatically extract the max Y value from a Plotly figure
and wrap it in the FigureWithMaxY utility class.</p>
</dd></dl>
</section>
</section>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="Main">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">Streamlit Dashboard</a></h1>
<search id="searchbox" style="display: none" role="search">
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search"/>
<input type="submit" value="Go" />
</form>
</div>
</search>
<script>document.getElementById('searchbox').style.display = "block"</script><h3>Navigation</h3>
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal" href="modules.html">streamlit_dashboard</a><ul class="current">
<li class="toctree-l2 current"><a class="reference internal" href="streamlit_dashboard.html">streamlit_dashboard namespace</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
<li><a href="modules.html">streamlit_dashboard</a><ul>
<li><a href="streamlit_dashboard.html">streamlit_dashboard namespace</a><ul>
<li>Previous: <a href="streamlit_dashboard.streamlit_pages.html" title="previous chapter">streamlit_dashboard.streamlit_pages namespace</a></li>
</ul></li>
</ul></li>
</ul></li>
</ul>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&#169;2026, SBDC Team.
|
Powered by <a href="https://www.sphinx-doc.org/">Sphinx 9.1.0</a>
&amp; <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
|
<a href="_sources/streamlit_dashboard.utility_classes.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

View File

@@ -0,0 +1,37 @@
# Configuration file for the Sphinx documentation builder.
#
# For the full list of built-in configuration values, see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html
import os
import sys
sys.path.insert(0, os.path.abspath('../..'))
sys.path.insert(0, os.path.abspath('..'))
# -- Project information -----------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
project = 'Streamlit Dashboard'
copyright = '2026, SBDC Team'
author = 'SBDC Team'
version = '1.0'
release = '1.0'
# -- General configuration ---------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
extensions = [
'sphinx.ext.autodoc',
]
templates_path = ['_templates']
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
# -- Options for HTML output -------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
html_theme = 'alabaster'
html_static_path = ['_static']

View File

@@ -0,0 +1,19 @@
.. Streamlit Dashboard documentation master file, created by
sphinx-quickstart on Mon Apr 20 13:21:01 2026.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Streamlit Dashboard documentation
=================================
Add your content using ``reStructuredText`` syntax. See the
`reStructuredText <https://www.sphinx-doc.org/en/master/usage/restructuredtext/index.html>`_
documentation for details.
.. toctree::
:maxdepth: 2
:caption: Contents:
modules

View File

@@ -0,0 +1,35 @@
@ECHO OFF
pushd %~dp0
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
set SOURCEDIR=.
set BUILDDIR=_build
%SPHINXBUILD% >NUL 2>NUL
if errorlevel 9009 (
echo.
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
echo.installed, then set the SPHINXBUILD environment variable to point
echo.to the full path of the 'sphinx-build' executable. Alternatively you
echo.may add the Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.https://www.sphinx-doc.org/
exit /b 1
)
if "%1" == "" goto help
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
goto end
:help
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
:end
popd

View File

@@ -0,0 +1,7 @@
streamlit_dashboard
===================
.. toctree::
:maxdepth: 4
streamlit_dashboard

View File

@@ -0,0 +1,47 @@
streamlit\_dashboard.cached\_function\_wrappers namespace
=========================================================
.. py:module:: streamlit_dashboard.cached_function_wrappers
Submodules
----------
streamlit\_dashboard.cached\_function\_wrappers.client\_list\_cached\_functions module
--------------------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.cached_function_wrappers.client_list_cached_functions
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.cached\_function\_wrappers.funding\_milestones\_cached\_functions module
---------------------------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.cached_function_wrappers.funding_milestones_cached_functions
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.cached\_function\_wrappers.nbs\_cached\_functions module
-----------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.cached_function_wrappers.nbs_cached_functions
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.cached\_function\_wrappers.shared module
-------------------------------------------------------------
.. automodule:: streamlit_dashboard.cached_function_wrappers.shared
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.cached\_function\_wrappers.trainings\_cached\_functions module
-----------------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.cached_function_wrappers.trainings_cached_functions
:members:
:show-inheritance:
:undoc-members:

View File

@@ -0,0 +1,15 @@
streamlit\_dashboard.components namespace
=========================================
.. py:module:: streamlit_dashboard.components
Submodules
----------
streamlit\_dashboard.components.neoserra\_export\_link\_grabber module
----------------------------------------------------------------------
.. automodule:: streamlit_dashboard.components.neoserra_export_link_grabber
:members:
:show-inheritance:
:undoc-members:

View File

@@ -0,0 +1,119 @@
streamlit\_dashboard.page\_classes namespace
============================================
.. py:module:: streamlit_dashboard.page_classes
Submodules
----------
streamlit\_dashboard.page\_classes.admin\_panel\_page\_class module
-------------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.admin_panel_page_class
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.page\_classes.authentication\_page\_wrapper module
-----------------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.authentication_page_wrapper
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.page\_classes.center\_milestones\_page\_class module
-------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.center_milestones_page_class
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.page\_classes.funding\_milestones\_page\_class module
--------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.funding_milestones_page_class
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.page\_classes.naics\_report\_page\_class module
--------------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.naics_report_page_class
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.page\_classes.nbs\_milestones\_page\_class module
----------------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.nbs_milestones_page_class
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.page\_classes.page\_class\_constants module
----------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.page_class_constants
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.page\_classes.report\_comparer\_page\_class module
-----------------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.report_comparer_page_class
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.page\_classes.training\_attendee\_counts\_class module
---------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.training_attendee_counts_class
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.page\_classes.training\_attendee\_ranges\_page\_class module
---------------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.training_attendee_ranges_page_class
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.page\_classes.training\_count\_statistics\_page\_class module
----------------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.training_count_statistics_page_class
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.page\_classes.training\_event\_count\_attendee\_comparison\_page\_class module
---------------------------------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.training_event_count_attendee_comparison_page_class
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.page\_classes.training\_event\_count\_page\_class module
-----------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.training_event_count_page_class
:members:
:show-inheritance:
:undoc-members:
streamlit\_dashboard.page\_classes.training\_primary\_topics\_page\_class module
--------------------------------------------------------------------------------
.. automodule:: streamlit_dashboard.page_classes.training_primary_topics_page_class
:members:
:show-inheritance:
:undoc-members:

Some files were not shown because too many files have changed in this diff Show More