Spaces:
Sleeping
Sleeping
import streamlit as st | |
import json | |
import pandas as pd | |
from tools import agstyler | |
from tools.agstyler import PINLEFT | |
from toolbar import component_toolbar_buttons | |
class Setup: | |
class Model: | |
header1 = "Labels" | |
header2 = "Groups" | |
labels_file = "docs/labels.json" | |
groups_file = "docs/groups.json" | |
def view(self, model): | |
tab = st.radio("Select", ["Labels", "Groups"], horizontal=True, label_visibility="collapsed") | |
if tab == "Labels": | |
st.title(model.header1) | |
self.setup_labels(model) | |
elif tab == "Groups": | |
st.title(model.header2) | |
self.setup_groups(model) | |
def setup_labels(self, model): | |
self.action_event = False | |
if 'action' not in st.session_state: | |
st.session_state['action'] = None | |
with open(model.labels_file, "r") as f: | |
labels_json = json.load(f) | |
labels = labels_json["labels"] | |
data = [] | |
for label in labels: | |
data.append({'id': label['id'], 'name': label['name'], 'description': label['description']}) | |
self.df = pd.DataFrame(data) | |
formatter = { | |
'id': ('ID', {'hide': True}), | |
'name': ('Label', {**PINLEFT, 'editable': True}), | |
'description': ('Description', {**PINLEFT, 'editable': True}) | |
} | |
def run_component(props): | |
value = component_toolbar_buttons(key='toolbar_buttons_labels', **props) | |
return value | |
def handle_event(value): | |
if value is not None: | |
if 'action_timestamp' not in st.session_state: | |
self.action_event = True | |
st.session_state['action_timestamp'] = value['timestamp'] | |
else: | |
if st.session_state['action_timestamp'] != value['timestamp']: | |
self.action_event = True | |
st.session_state['action_timestamp'] = value['timestamp'] | |
else: | |
self.action_event = False | |
if value is not None and value['action'] == 'create' and self.action_event: | |
if st.session_state['action'] != 'delete': | |
max_id = self.df['id'].max() | |
self.df.loc[-1] = [max_id + 1, '', ''] # adding a row | |
self.df.index = self.df.index + 1 # shifting index | |
self.df.sort_index(inplace=True) | |
st.session_state['action'] = 'create' | |
elif value is not None and value['action'] == 'delete' and self.action_event: | |
if st.session_state['action'] != 'delete' and st.session_state['action'] != 'create': | |
rows = st.session_state['selected_rows'] | |
if len(rows) > 0: | |
idx = rows[0]['_selectedRowNodeInfo']['nodeRowIndex'] | |
self.df.drop(self.df.index[idx], inplace=True) | |
self.df.reset_index(drop=True, inplace=True) | |
st.session_state['action'] = 'delete' | |
elif value is not None and value['action'] == 'save' and self.action_event: | |
st.session_state['action'] = 'save' | |
props = { | |
'buttons': { | |
'create': False, | |
'delete': False, | |
'save': False, | |
} | |
} | |
handle_event(run_component(props)) | |
if st.session_state['action'] == 'save' and 'response' in st.session_state: | |
if st.session_state['response'] is not None: | |
self.df = st.session_state['response'] | |
st.session_state['response'] = None | |
if st.session_state['action'] == 'create' and 'response' in st.session_state: | |
if st.session_state['response'] is not None: | |
self.df = st.session_state['response'] | |
if st.session_state['action'] == 'delete' and 'response' in st.session_state: | |
if st.session_state['response'] is not None: | |
self.df = st.session_state['response'] | |
response = agstyler.draw_grid( | |
self.df, | |
formatter=formatter, | |
fit_columns=True, | |
pagination_size=10, | |
selection="single", | |
use_checkbox=False | |
) | |
rows = response['selected_rows'] | |
st.session_state['selected_rows'] = rows | |
if st.session_state['action'] == 'create' and self.action_event: | |
st.session_state['response'] = response['data'] | |
elif st.session_state['action'] == 'delete' and self.action_event: | |
st.session_state['response'] = response['data'] | |
elif st.session_state['action'] == 'save' and self.action_event: | |
data = response['data'].values.tolist() | |
rows = [] | |
for row in data: | |
rows.append({'id': row[0], 'name': row[1], 'description': row[2]}) | |
labels_json['labels'] = rows | |
with open(model.labels_file, "w") as f: | |
json.dump(labels_json, f, indent=2) | |
def setup_groups(self, model): | |
self.action_event = False | |
if 'action' not in st.session_state: | |
st.session_state['action'] = None | |
with open(model.groups_file, "r") as f: | |
groups_json = json.load(f) | |
groups = groups_json["groups"] | |
data = [] | |
for group in groups: | |
data.append({'id': group['id'], 'name': group['name'], 'description': group['description']}) | |
self.df = pd.DataFrame(data) | |
formatter = { | |
'id': ('ID', {'hide': True}), | |
'name': ('Group', {**PINLEFT, 'editable': True}), | |
'description': ('Description', {**PINLEFT, 'editable': True}) | |
} | |
def run_component(props): | |
value = component_toolbar_buttons(key='toolbar_buttons_groups', **props) | |
return value | |
def handle_event(value): | |
if value is not None: | |
if 'action_timestamp' not in st.session_state: | |
self.action_event = True | |
st.session_state['action_timestamp'] = value['timestamp'] | |
else: | |
if st.session_state['action_timestamp'] != value['timestamp']: | |
self.action_event = True | |
st.session_state['action_timestamp'] = value['timestamp'] | |
else: | |
self.action_event = False | |
if value is not None and value['action'] == 'create' and self.action_event: | |
if st.session_state['action'] != 'delete': | |
max_id = self.df['id'].max() | |
self.df.loc[-1] = [max_id + 1, '', ''] # adding a row | |
self.df.index = self.df.index + 1 # shifting index | |
self.df.sort_index(inplace=True) | |
st.session_state['action'] = 'create' | |
elif value is not None and value['action'] == 'delete' and self.action_event: | |
if st.session_state['action'] != 'delete' and st.session_state['action'] != 'create': | |
rows = st.session_state['selected_rows'] | |
if len(rows) > 0: | |
idx = rows[0]['_selectedRowNodeInfo']['nodeRowIndex'] | |
self.df.drop(self.df.index[idx], inplace=True) | |
self.df.reset_index(drop=True, inplace=True) | |
st.session_state['action'] = 'delete' | |
elif value is not None and value['action'] == 'save' and self.action_event: | |
st.session_state['action'] = 'save' | |
props = { | |
'buttons': { | |
'create': False, | |
'delete': False, | |
'save': False, | |
} | |
} | |
handle_event(run_component(props)) | |
if st.session_state['action'] == 'save' and 'response' in st.session_state: | |
if st.session_state['response'] is not None: | |
self.df = st.session_state['response'] | |
st.session_state['response'] = None | |
if st.session_state['action'] == 'create' and 'response' in st.session_state: | |
if st.session_state['response'] is not None: | |
self.df = st.session_state['response'] | |
if st.session_state['action'] == 'delete' and 'response' in st.session_state: | |
if st.session_state['response'] is not None: | |
self.df = st.session_state['response'] | |
response = agstyler.draw_grid( | |
self.df, | |
formatter=formatter, | |
fit_columns=True, | |
pagination_size=10, | |
selection="single", | |
use_checkbox=False | |
) | |
rows = response['selected_rows'] | |
st.session_state['selected_rows'] = rows | |
if st.session_state['action'] == 'create' and self.action_event: | |
st.session_state['response'] = response['data'] | |
elif st.session_state['action'] == 'delete' and self.action_event: | |
st.session_state['response'] = response['data'] | |
elif st.session_state['action'] == 'save' and self.action_event: | |
data = response['data'].values.tolist() | |
rows = [] | |
for row in data: | |
rows.append({'id': row[0], 'name': row[1], 'description': row[2]}) | |
groups_json['groups'] = rows | |
with open(model.groups_file, "w") as f: | |
json.dump(groups_json, f, indent=2) | |