croissant-editor / core /query_params.py
marcenacp's picture
Deploy (see actual commits on https://github.com/mlcommons/croissant).
993d03b
raw
history blame contribute delete
No virus
2.53 kB
"""Module to manipulate query params."""
from typing import Any
import streamlit as st
from core.state import CurrentProject
from core.state import RecordSet
class QueryParams:
"""Possible URL query params."""
OPEN_PROJECT = "project"
OPEN_RECORD_SET = "recordSet"
def _has_query_params() -> bool:
"""Returns whether `query_params` is available, which depends on the streamlit
version. If not, st.experimental_get_query_params() and
st.experimental_set_query_params() should be used."""
return hasattr(st, "query_params")
def _get_query_param(name: str) -> str | None:
"""Gets query param with the name `name`."""
if _has_query_params():
param = st.query_params.get_all(name)
else:
params = st.experimental_get_query_params()
if not name in params:
return None
param = params[name]
if isinstance(param, list) and len(param) > 0:
return param[0]
return None
def _set_query_param(param: str, new_value: str) -> str | None:
"""Sets query param with the name `name` to `new_value`."""
if _has_query_params():
params = st.query_params
if params.get_all(param) == [new_value]:
# The value already exists in the query params.
return
params[param] = new_value
else:
params = st.experimental_get_query_params()
if params.get(param) == [new_value]:
# The value already exists in the query params.
return
new_params = {k: v for k, v in params.items() if k != param}
new_params[param] = new_value
st.experimental_set_query_params(**new_params)
def is_record_set_expanded(record_set: RecordSet) -> bool:
open_record_set_name = _get_query_param(QueryParams.OPEN_RECORD_SET)
if open_record_set_name:
return open_record_set_name == record_set.name
return False
def expand_record_set(record_set: RecordSet) -> None:
_set_query_param(QueryParams.OPEN_RECORD_SET, record_set.name)
def get_project_timestamp() -> str | None:
return _get_query_param(QueryParams.OPEN_PROJECT)
def get_state() -> str | None:
return _get_query_param("state")
def get_code():
return _get_query_param("code")
def set_project(project: CurrentProject):
_set_query_param(QueryParams.OPEN_PROJECT, project.path.name)
def clear_query_params():
"""Clears query params."""
if _has_query_params():
st.query_params.clear()
else:
st.experimental_set_query_params()