Spaces:
Paused
Paused
Update app.py via AI Editor
Browse files
app.py
CHANGED
@@ -269,6 +269,9 @@ def get_left_col_content():
|
|
269 |
|
270 |
def get_right_col_content(selected_type, store_data):
|
271 |
controls = []
|
|
|
|
|
|
|
272 |
controls.append(dcc.Loading(
|
273 |
id="loading-indicator",
|
274 |
type="dot",
|
@@ -342,7 +345,6 @@ def get_right_col_content(selected_type, store_data):
|
|
342 |
},
|
343 |
multiple=False
|
344 |
),
|
345 |
-
# Only the 'shred' one is present in layout, so don't add for others
|
346 |
dbc.RadioItems(
|
347 |
id={'type': 'radio-doc-source', 'subtype': src, 'index': selected_type},
|
348 |
options=[
|
@@ -414,7 +416,10 @@ app.layout = dbc.Container([
|
|
414 |
width=3
|
415 |
),
|
416 |
dbc.Col(
|
417 |
-
html.Div(
|
|
|
|
|
|
|
418 |
width=9
|
419 |
)
|
420 |
])
|
@@ -525,7 +530,6 @@ def unified_handler(contents_lists, n_clicks_generate_list, n_clicks_download, s
|
|
525 |
preview = dash.no_update
|
526 |
generated_doc = dash.no_update
|
527 |
download_data = dash.no_update
|
528 |
-
progress = dash.no_update
|
529 |
|
530 |
ctx = callback_context
|
531 |
trigger = ctx.triggered[0]['prop_id'] if ctx.triggered else ""
|
@@ -542,7 +546,8 @@ def unified_handler(contents_lists, n_clicks_generate_list, n_clicks_download, s
|
|
542 |
"virtual_board": 8
|
543 |
}
|
544 |
|
545 |
-
#
|
|
|
546 |
if "upload-doc-type" in trigger:
|
547 |
for i, (contents, filenames) in enumerate(zip(contents_lists, filenames_lists)):
|
548 |
if contents and filenames:
|
@@ -571,7 +576,6 @@ def unified_handler(contents_lists, n_clicks_generate_list, n_clicks_download, s
|
|
571 |
], id={'type': 'file-row', 'index': name}, align="center", className="mb-1")
|
572 |
]
|
573 |
uploaded_doc_name_shred = name
|
574 |
-
progress = "progress"
|
575 |
# Set preview for this upload
|
576 |
if subtype == "shred":
|
577 |
preview = markdown_table_preview(file_text)
|
@@ -583,7 +587,6 @@ def unified_handler(contents_lists, n_clicks_generate_list, n_clicks_download, s
|
|
583 |
download_data = dash.no_update
|
584 |
return stores + [file_list, uploaded_doc_name_shred, preview, generated_doc, download_data, progress]
|
585 |
|
586 |
-
# Handle Generate
|
587 |
if any(n_clicks_generate_list):
|
588 |
logging.info(f"Generating document for type: {selected_type}")
|
589 |
inputs = {
|
@@ -620,15 +623,14 @@ def unified_handler(contents_lists, n_clicks_generate_list, n_clicks_download, s
|
|
620 |
t.join(timeout=60)
|
621 |
generated_doc = result_holder.get('result', 'Error: No document generated.')
|
622 |
set_generated_doc(selected_type, generated_doc)
|
|
|
623 |
if selected_type in spreadsheet_types:
|
624 |
preview = markdown_table_preview(generated_doc)
|
625 |
else:
|
626 |
preview = markdown_narrative_preview(generated_doc)
|
627 |
-
progress = "progress"
|
628 |
download_data = dash.no_update
|
629 |
return stores + [file_list, uploaded_doc_name_shred, preview, generated_doc, download_data, progress]
|
630 |
|
631 |
-
# Handle Download
|
632 |
if "btn-download" in trigger:
|
633 |
doc = prev_generated
|
634 |
if not doc:
|
@@ -654,21 +656,18 @@ def unified_handler(contents_lists, n_clicks_generate_list, n_clicks_download, s
|
|
654 |
doc = stores[8]
|
655 |
if not doc:
|
656 |
logging.warning("No generated document to download.")
|
657 |
-
return stores + [file_list, uploaded_doc_name_shred, dash.no_update, dash.no_update, dash.no_update,
|
658 |
if selected_type in spreadsheet_types:
|
659 |
xlsx_io = markdown_tables_to_xlsx(doc)
|
660 |
logging.info("Spreadsheet document prepared for download.")
|
661 |
download_data = dcc.send_bytes(xlsx_io.getvalue(), filename=f"{selected_type}_output.xlsx")
|
662 |
-
progress = "progress"
|
663 |
return stores + [file_list, uploaded_doc_name_shred, dash.no_update, dash.no_update, download_data, progress]
|
664 |
else:
|
665 |
content = doc.encode('utf-8')
|
666 |
logging.info("Narrative document prepared for download.")
|
667 |
download_data = dcc.send_bytes(content, filename=f"{selected_type}_output.md")
|
668 |
-
progress = "progress"
|
669 |
return stores + [file_list, uploaded_doc_name_shred, dash.no_update, dash.no_update, download_data, progress]
|
670 |
|
671 |
-
# Handle Doc Type Change/Preview
|
672 |
doc = get_generated_doc(selected_type)
|
673 |
if not doc:
|
674 |
if selected_type == "Shred" and stores[0]:
|
@@ -693,18 +692,29 @@ def unified_handler(contents_lists, n_clicks_generate_list, n_clicks_download, s
|
|
693 |
preview = markdown_narrative_preview(doc)
|
694 |
else:
|
695 |
preview = html.Div("No document loaded.")
|
696 |
-
return stores + [file_list, uploaded_doc_name_shred, preview, dash.no_update, dash.no_update,
|
697 |
if selected_type in spreadsheet_types:
|
698 |
preview = markdown_table_preview(doc)
|
699 |
else:
|
700 |
preview = markdown_narrative_preview(doc)
|
701 |
-
return stores + [file_list, uploaded_doc_name_shred, preview, doc, dash.no_update,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
702 |
|
703 |
@app.callback(
|
704 |
Output("main-progress-dot-output", "children"),
|
705 |
Input('progress-dot-store', 'data')
|
706 |
)
|
707 |
def update_main_progress_dot(progress):
|
|
|
|
|
708 |
return ""
|
709 |
|
710 |
if __name__ == '__main__':
|
|
|
269 |
|
270 |
def get_right_col_content(selected_type, store_data):
|
271 |
controls = []
|
272 |
+
controls.append(
|
273 |
+
html.Div(id='progress-dot-area', style={'textAlign': 'center', 'marginBottom': '8px'})
|
274 |
+
)
|
275 |
controls.append(dcc.Loading(
|
276 |
id="loading-indicator",
|
277 |
type="dot",
|
|
|
345 |
},
|
346 |
multiple=False
|
347 |
),
|
|
|
348 |
dbc.RadioItems(
|
349 |
id={'type': 'radio-doc-source', 'subtype': src, 'index': selected_type},
|
350 |
options=[
|
|
|
416 |
width=3
|
417 |
),
|
418 |
dbc.Col(
|
419 |
+
html.Div([
|
420 |
+
html.Div(id='progress-dot-area', style={'textAlign': 'center', 'marginBottom': '8px'}),
|
421 |
+
html.Div(id='right-col-content')
|
422 |
+
]),
|
423 |
width=9
|
424 |
)
|
425 |
])
|
|
|
530 |
preview = dash.no_update
|
531 |
generated_doc = dash.no_update
|
532 |
download_data = dash.no_update
|
|
|
533 |
|
534 |
ctx = callback_context
|
535 |
trigger = ctx.triggered[0]['prop_id'] if ctx.triggered else ""
|
|
|
546 |
"virtual_board": 8
|
547 |
}
|
548 |
|
549 |
+
# Show progress dot as soon as action is triggered
|
550 |
+
progress = "progress"
|
551 |
if "upload-doc-type" in trigger:
|
552 |
for i, (contents, filenames) in enumerate(zip(contents_lists, filenames_lists)):
|
553 |
if contents and filenames:
|
|
|
576 |
], id={'type': 'file-row', 'index': name}, align="center", className="mb-1")
|
577 |
]
|
578 |
uploaded_doc_name_shred = name
|
|
|
579 |
# Set preview for this upload
|
580 |
if subtype == "shred":
|
581 |
preview = markdown_table_preview(file_text)
|
|
|
587 |
download_data = dash.no_update
|
588 |
return stores + [file_list, uploaded_doc_name_shred, preview, generated_doc, download_data, progress]
|
589 |
|
|
|
590 |
if any(n_clicks_generate_list):
|
591 |
logging.info(f"Generating document for type: {selected_type}")
|
592 |
inputs = {
|
|
|
623 |
t.join(timeout=60)
|
624 |
generated_doc = result_holder.get('result', 'Error: No document generated.')
|
625 |
set_generated_doc(selected_type, generated_doc)
|
626 |
+
# Always show preview after generation
|
627 |
if selected_type in spreadsheet_types:
|
628 |
preview = markdown_table_preview(generated_doc)
|
629 |
else:
|
630 |
preview = markdown_narrative_preview(generated_doc)
|
|
|
631 |
download_data = dash.no_update
|
632 |
return stores + [file_list, uploaded_doc_name_shred, preview, generated_doc, download_data, progress]
|
633 |
|
|
|
634 |
if "btn-download" in trigger:
|
635 |
doc = prev_generated
|
636 |
if not doc:
|
|
|
656 |
doc = stores[8]
|
657 |
if not doc:
|
658 |
logging.warning("No generated document to download.")
|
659 |
+
return stores + [file_list, uploaded_doc_name_shred, dash.no_update, dash.no_update, dash.no_update, None]
|
660 |
if selected_type in spreadsheet_types:
|
661 |
xlsx_io = markdown_tables_to_xlsx(doc)
|
662 |
logging.info("Spreadsheet document prepared for download.")
|
663 |
download_data = dcc.send_bytes(xlsx_io.getvalue(), filename=f"{selected_type}_output.xlsx")
|
|
|
664 |
return stores + [file_list, uploaded_doc_name_shred, dash.no_update, dash.no_update, download_data, progress]
|
665 |
else:
|
666 |
content = doc.encode('utf-8')
|
667 |
logging.info("Narrative document prepared for download.")
|
668 |
download_data = dcc.send_bytes(content, filename=f"{selected_type}_output.md")
|
|
|
669 |
return stores + [file_list, uploaded_doc_name_shred, dash.no_update, dash.no_update, download_data, progress]
|
670 |
|
|
|
671 |
doc = get_generated_doc(selected_type)
|
672 |
if not doc:
|
673 |
if selected_type == "Shred" and stores[0]:
|
|
|
692 |
preview = markdown_narrative_preview(doc)
|
693 |
else:
|
694 |
preview = html.Div("No document loaded.")
|
695 |
+
return stores + [file_list, uploaded_doc_name_shred, preview, dash.no_update, dash.no_update, None]
|
696 |
if selected_type in spreadsheet_types:
|
697 |
preview = markdown_table_preview(doc)
|
698 |
else:
|
699 |
preview = markdown_narrative_preview(doc)
|
700 |
+
return stores + [file_list, uploaded_doc_name_shred, preview, doc, dash.no_update, None]
|
701 |
+
|
702 |
+
@app.callback(
|
703 |
+
Output("progress-dot-area", "children"),
|
704 |
+
Input('progress-dot-store', 'data')
|
705 |
+
)
|
706 |
+
def update_right_progress_dot(progress):
|
707 |
+
if progress == "progress":
|
708 |
+
return html.Div("...", id="progress-blinker", style={'fontSize': '2rem', 'letterSpacing': '0.5rem', 'animation': 'blink 1s infinite'})
|
709 |
+
return ""
|
710 |
|
711 |
@app.callback(
|
712 |
Output("main-progress-dot-output", "children"),
|
713 |
Input('progress-dot-store', 'data')
|
714 |
)
|
715 |
def update_main_progress_dot(progress):
|
716 |
+
if progress == "progress":
|
717 |
+
return html.Div("...", style={'fontSize': '2rem', 'letterSpacing': '0.5rem', 'animation': 'blink 1s infinite'})
|
718 |
return ""
|
719 |
|
720 |
if __name__ == '__main__':
|