Skip to content

Commit 286207c

Browse files
authored
Share Files (#57)
* remove fallback removal * move example data * share cache and input files * add display name to file manager * allow renaming on download page * add option to get all files * download all files, relevant for tnt * update flashtnt download section * use display name in viewers
1 parent 510fa8d commit 286207c

File tree

346 files changed

+277
-709965
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

346 files changed

+277
-709965
lines changed

content/FLASHDeconv/FLASHDeconvDownload.py

Lines changed: 57 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
file_manager = FileManager(
1616
st.session_state["workspace"],
17-
Path(st.session_state['workspace'], 'flashdeconv', 'cache')
17+
Path(st.session_state['workspace'], 'cache')
1818
)
1919

2020
targets = [
@@ -30,18 +30,64 @@
3030
st.error('No results to show yet. Please run a workflow first!')
3131
else:
3232
# Table Header
33-
columns = st.columns(3)
34-
columns[0].write('**Run**')
33+
columns = st.columns([1.1, 1, 1])
34+
columns[0].write('**Name**')
3535
columns[1].write('**Download**')
3636
columns[2].write('**Delete Result Set**')
3737

3838
# Table Body
3939
for i, experiment in enumerate(experiments):
4040
st.divider()
41-
columns = st.columns(3)
42-
columns[0].empty().write(experiment)
41+
columns = st.columns([0.1, 1, 1, 1])
42+
current_name = file_manager.get_display_name(experiment)
4343

44+
# Initialize edit mode session state for this experiment
45+
edit_mode_key = f"edit_mode_{experiment}"
46+
if edit_mode_key not in st.session_state:
47+
st.session_state[edit_mode_key] = False
48+
49+
# Display Name or Edit Input
4450
with columns[1]:
51+
if st.session_state[edit_mode_key]:
52+
# Edit mode: Show text input with current display name
53+
new_name = st.text_input(
54+
"New name",
55+
value=current_name,
56+
key=f"input_{experiment}",
57+
label_visibility="collapsed"
58+
)
59+
else:
60+
st.write(current_name)
61+
62+
# Edit/Save Button
63+
with columns[0]:
64+
if st.session_state[edit_mode_key]:
65+
# Show save button in edit mode
66+
if st.button("💾", key=f"save_{experiment}", help="Save new name", use_container_width=True):
67+
new_name = st.session_state.get(f"input_{experiment}", "").strip()
68+
69+
# Validate input
70+
if not new_name:
71+
st.error("Name cannot be empty")
72+
elif len(new_name) > 100:
73+
st.error("Name is too long (max 100 characters)")
74+
else:
75+
# Attempt to rename
76+
success = file_manager.rename_dataset(experiment, new_name)
77+
if success:
78+
st.success(f"Renamed to: {new_name}")
79+
st.session_state[edit_mode_key] = False
80+
st.rerun()
81+
else:
82+
st.error("Failed to rename dataset")
83+
else:
84+
# Show edit button in normal mode
85+
if st.button("✏️", key=f"edit_{experiment}", help="Edit name", use_container_width=True):
86+
st.session_state[edit_mode_key] = True
87+
st.rerun()
88+
89+
# Download
90+
with columns[2]:
4591
button_placeholder = st.empty()
4692

4793
# Show placeholder button before download is prepared
@@ -55,8 +101,8 @@
55101
):
56102
zip_buffer = BytesIO()
57103
with ZipFile(zip_buffer, 'w', ZIP_DEFLATED) as f:
58-
for filepath in file_manager.get_results(
59-
experiment, targets, partial=True
104+
for filepath in file_manager.get_all_files_except(
105+
experiment, ['download_archive']
60106
).values():
61107
f.write(filepath, arcname=Path(filepath).name)
62108
zip_buffer.seek(0)
@@ -71,11 +117,12 @@
71117
with open(out_zip, 'rb') as f:
72118
button_placeholder.download_button(
73119
"Download ⬇️", f,
74-
file_name = f'{experiment}.zip',
120+
file_name = f'{current_name}.zip',
75121
use_container_width=True
76122
)
77123

78-
with columns[2]:
79-
if st.button(f"🗑️ {experiment}", use_container_width=True):
124+
# Delete
125+
with columns[3]:
126+
if st.button(f"🗑️ {current_name}", use_container_width=True):
80127
file_manager.remove_results(experiment)
81128
st.rerun()

content/FLASHDeconv/FLASHDeconvSequenceInput.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
# Setup cache access
1111
file_manager = FileManager(
1212
st.session_state["workspace"],
13-
Path(st.session_state['workspace'], 'flashdeconv', 'cache')
13+
Path(st.session_state['workspace'], 'cache')
1414
)
1515

1616
def set_sequence(input_sequence, fixed_mod_cysteine=None, fixed_mod_methionine=None):

content/FLASHDeconv/FLASHDeconvViewer.py

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,22 @@
1010
['anno_spectrum', 'deconv_spectrum'], ['3D_SN_plot']]
1111

1212
def select_experiment():
13-
st.session_state.selected_experiment0 = st.session_state.selected_experiment_dropdown
13+
# Map display name back to experiment ID
14+
st.session_state.selected_experiment0 = display_name_to_id[st.session_state.selected_experiment_dropdown]
1415
if len(layout) > 1:
1516
for exp_index in range(1, len(layout)):
1617
if st.session_state[f'selected_experiment_dropdown_{exp_index}'] is None:
1718
continue
18-
st.session_state[f"selected_experiment{exp_index}"] = st.session_state[f'selected_experiment_dropdown_{exp_index}']
19+
st.session_state[f"selected_experiment{exp_index}"] = display_name_to_id[st.session_state[f'selected_experiment_dropdown_{exp_index}']]
1920

2021
def validate_selected_index(file_manager, selected_experiment):
2122
results = file_manager.get_results_list(['deconv_dfs', 'anno_dfs'])
2223
if selected_experiment in st.session_state:
2324
if st.session_state[selected_experiment] in results:
24-
return name_to_index[st.session_state[selected_experiment]]
25+
# Map experiment ID to display name for the dropdown index
26+
exp_id = st.session_state[selected_experiment]
27+
display_name = file_manager.get_display_name(exp_id)
28+
return display_name_to_index[display_name]
2529
else:
2630
del st.session_state[selected_experiment]
2731
return None
@@ -32,7 +36,7 @@ def validate_selected_index(file_manager, selected_experiment):
3236
# Get available results
3337
file_manager = FileManager(
3438
st.session_state["workspace"],
35-
Path(st.session_state['workspace'], 'flashdeconv', 'cache')
39+
Path(st.session_state['workspace'], 'cache')
3640
)
3741

3842
def get_sequence():
@@ -47,7 +51,7 @@ def get_sequence():
4751
if get_sequence() is not None:
4852
DEFAULT_LAYOUT = DEFAULT_LAYOUT + [['sequence_view']]
4953

50-
results = file_manager.get_results_list(['deconv_dfs', 'anno_dfs'])
54+
results = file_manager.get_results_list(['threedim_SN_plot'])
5155

5256
if file_manager.result_exists('layout', 'layout'):
5357
layout = file_manager.get_results('layout', 'layout')['layout']
@@ -63,15 +67,19 @@ def get_sequence():
6367
st.error('No results to show yet. Please run a workflow first!')
6468
st.stop()
6569

66-
# Map names to index
70+
# Create display names and mappings
71+
display_names = [file_manager.get_display_name(exp_id) for exp_id in results]
72+
display_name_to_id = {file_manager.get_display_name(exp_id): exp_id for exp_id in results}
73+
display_name_to_index = {n : i for i, n in enumerate(display_names)}
74+
# Keep backward compatibility mapping for experiment IDs
6775
name_to_index = {n : i for i, n in enumerate(results)}
6876

6977
if len(layout) == 2 and side_by_side:
7078
c1, c2 = st.columns(2)
7179
with c1:
7280
st.selectbox(
73-
"choose experiment", results,
74-
key="selected_experiment_dropdown",
81+
"choose experiment", display_names,
82+
key="selected_experiment_dropdown",
7583
index=validate_selected_index(file_manager, 'selected_experiment0'),
7684
on_change=select_experiment
7785
)
@@ -82,7 +90,7 @@ def get_sequence():
8290
)
8391
with c2:
8492
st.selectbox(
85-
"choose experiment", results,
93+
"choose experiment", display_names,
8694
key=f'selected_experiment_dropdown_1',
8795
index=validate_selected_index(file_manager, 'selected_experiment1'),
8896
on_change=select_experiment
@@ -98,8 +106,8 @@ def get_sequence():
98106
else:
99107
### for only single experiment on one view
100108
st.selectbox(
101-
"choose experiment", results,
102-
key="selected_experiment_dropdown",
109+
"choose experiment", display_names,
110+
key="selected_experiment_dropdown",
103111
index=validate_selected_index(file_manager, 'selected_experiment0'),
104112
on_change=select_experiment
105113
)
@@ -120,7 +128,7 @@ def get_sequence():
120128
st.divider() # horizontal line
121129

122130
st.selectbox(
123-
"choose experiment", results,
131+
"choose experiment", display_names,
124132
key=f'selected_experiment_dropdown_{exp_index}',
125133
index=validate_selected_index(file_manager, f'selected_experiment{exp_index}'),
126134
on_change=select_experiment

content/FLASHTnT/FLASHTnTDownload.py

Lines changed: 58 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,11 @@
1414

1515
file_manager = FileManager(
1616
st.session_state["workspace"],
17-
Path(st.session_state['workspace'], 'flashtnt', 'cache')
17+
Path(st.session_state['workspace'], 'cache')
1818
)
1919

2020
targets = [
21-
'out_tsv', 'spec1_tsv', 'spec2_tsv', 'spec3_tsv', 'spec4_tsv', 'quant_tsv',
22-
'toppic_ms1_msalign', 'toppic_ms1_feature', 'toppic_ms2_msalign',
23-
'toppic_ms2_feature', 'out_deconv_mzML', 'anno_annotated_mzML',
24-
'FD_parameters_json', 'FTnT_parameters_json', 'tags_tsv', 'protein_tsv'
21+
'FTnT_parameters_json', 'tags_tsv', 'protein_tsv'
2522
]
2623
experiments = file_manager.get_results_list(targets, partial=True)
2724

@@ -30,18 +27,64 @@
3027
st.error('No results to show yet. Please run a workflow first!')
3128
else:
3229
# Table Header
33-
columns = st.columns(3)
34-
columns[0].write('**Run**')
30+
columns = st.columns([1.1, 1, 1])
31+
columns[0].write('**Name**')
3532
columns[1].write('**Download**')
3633
columns[2].write('**Delete Result Set**')
3734

3835
# Table Body
3936
for i, experiment in enumerate(experiments):
4037
st.divider()
41-
columns = st.columns(3)
42-
columns[0].empty().write(experiment)
38+
columns = st.columns([0.1, 1, 1, 1])
39+
current_name = file_manager.get_display_name(experiment)
4340

41+
# Initialize edit mode session state for this experiment
42+
edit_mode_key = f"edit_mode_{experiment}"
43+
if edit_mode_key not in st.session_state:
44+
st.session_state[edit_mode_key] = False
45+
46+
# Display Name or Edit Input
4447
with columns[1]:
48+
if st.session_state[edit_mode_key]:
49+
# Edit mode: Show text input with current display name
50+
new_name = st.text_input(
51+
"New name",
52+
value=current_name,
53+
key=f"input_{experiment}",
54+
label_visibility="collapsed"
55+
)
56+
else:
57+
st.write(current_name)
58+
59+
# Edit/Save Button
60+
with columns[0]:
61+
if st.session_state[edit_mode_key]:
62+
# Show save button in edit mode
63+
if st.button("💾", key=f"save_{experiment}", help="Save new name", use_container_width=True):
64+
new_name = st.session_state.get(f"input_{experiment}", "").strip()
65+
66+
# Validate input
67+
if not new_name:
68+
st.error("Name cannot be empty")
69+
elif len(new_name) > 100:
70+
st.error("Name is too long (max 100 characters)")
71+
else:
72+
# Attempt to rename
73+
success = file_manager.rename_dataset(experiment, new_name)
74+
if success:
75+
st.success(f"Renamed to: {new_name}")
76+
st.session_state[edit_mode_key] = False
77+
st.rerun()
78+
else:
79+
st.error("Failed to rename dataset")
80+
else:
81+
# Show edit button in normal mode
82+
if st.button("✏️", key=f"edit_{experiment}", help="Edit name", use_container_width=True):
83+
st.session_state[edit_mode_key] = True
84+
st.rerun()
85+
86+
# Download
87+
with columns[2]:
4588
button_placeholder = st.empty()
4689

4790
# Show placeholder button before download is prepared
@@ -55,8 +98,8 @@
5598
):
5699
zip_buffer = BytesIO()
57100
with ZipFile(zip_buffer, 'w', ZIP_DEFLATED) as f:
58-
for filepath in file_manager.get_results(
59-
experiment, targets, partial=True
101+
for filepath in file_manager.get_all_files_except(
102+
experiment, ['download_archive']
60103
).values():
61104
f.write(filepath, arcname=Path(filepath).name)
62105
zip_buffer.seek(0)
@@ -71,11 +114,12 @@
71114
with open(out_zip, 'rb') as f:
72115
button_placeholder.download_button(
73116
"Download ⬇️", f,
74-
file_name = f'{experiment}.zip',
117+
file_name = f'{current_name}.zip',
75118
use_container_width=True
76119
)
77120

78-
with columns[2]:
79-
if st.button(f"🗑️ {experiment}", use_container_width=True):
121+
# Delete
122+
with columns[3]:
123+
if st.button(f"🗑️ {current_name}", use_container_width=True):
80124
file_manager.remove_results(experiment)
81125
st.rerun()

0 commit comments

Comments
 (0)