Files
stand/stand/table.py
T

108 lines
2.9 KiB
Python

import logging
from nicegui import APIRouter, app, ui
from aggridx import aggridx
from state import grids, adb
from utils.annotations import PGroup
OPTIONS = {
":getRowId": "(params) => params.data.run", # set row ID to index column
"context": {
"beamline": None,
"pgroup": None
},
"defaultColDef": {
"filter": True,
"editable": True,
"sortable": True,
"resizable": True
},
"pagination": True,
"paginationAutoPageSize": True,
"theme": "balham"
}
log = logging.getLogger(__name__)
router = APIRouter()
@router.page("/tables/{pgroup}")
def table(pgroup: PGroup):
pgroups = app.storage.user.get("pgroups", {})
if pgroup in pgroups:
beamline = pgroups[pgroup]
table_show(pgroup, beamline)
else:
table_deny(pgroup)
def table_show(pgroup, beamline):
# with ui.left_drawer(value=False) as ld:
# dark = ui.dark_mode(value=True)
# ui.switch("dark mode").bind_value(dark)
# with ui.page_sticky(position="left", x_offset=-12.5):
# def cb():
# ld.toggle()
# btn.icon = "sym_o_left_panel_close" if ld.value else "sym_o_left_panel_open"
# btn = ui.button(icon="sym_o_left_panel_open", on_click=cb).props("flat dense")
df = adb.get(beamline).get_data(pgroup).reset_index()
options = OPTIONS.copy()
options["context"].update(
beamline=beamline,
pgroup=pgroup
)
grid = aggridx.from_pandas(df, options=options)
grid.classes("h-[calc(100vh-2rem)]") # full height minus padding
grid.on("cellValueChanged", update_adb)
grid.on("cellValueChanged", update_grids)
grids[pgroup].add(grid)
def table_deny(pgroup):
username = app.storage.user.get("username", "unknown user")
log.error(f'access to pgroup {pgroup} denied for user "{username}"')
with ui.column().classes("absolute-center items-center gap-8"):
ui.icon("sym_o_front_hand", size="xl")
ui.label(f"access to {pgroup} denied").classes("text-2xl")
def update_adb(evt):
if evt.args.get("source") != "edit":
# ignore event if it was no direct edit
return
beamline = evt.args["context"]["beamline"]
pgroup = evt.args["context"]["pgroup"]
row_id = evt.args["rowId"]
col_id = evt.args["colId"]
new_val = evt.args["newValue"]
row_id = int(row_id)
adb.get(beamline).set_cell(pgroup, row_id, col_id, new_val)
def update_grids(evt):
sender = evt.sender
pgroup = evt.args["context"]["pgroup"]
row_index = evt.args["rowIndex"]
row_id = evt.args["rowId"]
col_id = evt.args["colId"]
new_val = evt.args["newValue"]
for grid in grids[pgroup]:
grid.set_cell_server(row_index, col_id, new_val)
if grid == sender:
# the sender is already up-to-date
continue
grid.set_cell_client(row_id, col_id, new_val)