Spaces:
Paused
Paused
Update app.py via AI Editor
Browse files
app.py
CHANGED
@@ -499,10 +499,16 @@ def update_right_col(selected_type):
|
|
499 |
Output('uploaded-doc-name-gold_review', 'children'),
|
500 |
Output('uploaded-doc-name-loe', 'children'),
|
501 |
Output('uploaded-doc-name-virtual_board', 'children'),
|
|
|
|
|
|
|
502 |
Output('progress-dot-store', 'data')
|
503 |
],
|
504 |
[
|
505 |
Input({'type': 'upload-doc-type', 'subtype': ALL, 'index': ALL}, 'contents'),
|
|
|
|
|
|
|
506 |
],
|
507 |
[
|
508 |
State({'type': 'upload-doc-type', 'subtype': ALL, 'index': ALL}, 'filename'),
|
@@ -514,20 +520,23 @@ def update_right_col(selected_type):
|
|
514 |
State('store-gold', 'data'),
|
515 |
State('store-gold-review', 'data'),
|
516 |
State('store-loe', 'data'),
|
517 |
-
State('store-virtual-board', 'data')
|
|
|
518 |
],
|
519 |
prevent_initial_call=True
|
520 |
)
|
521 |
-
def
|
522 |
-
|
523 |
stores = [shred, pink, pink_review, red, red_review, gold, gold_review, loe, virtual_board]
|
524 |
file_list = []
|
525 |
doc_names = [None]*9
|
|
|
|
|
|
|
526 |
progress = dash.no_update
|
527 |
|
528 |
-
|
529 |
-
|
530 |
-
return [dash.no_update]*19 + [dash.no_update]
|
531 |
|
532 |
subtype_map = {
|
533 |
"shred": (0, 0),
|
@@ -541,119 +550,60 @@ def handle_doc_upload(contents_lists, filenames_lists,
|
|
541 |
"virtual_board": (8, 8)
|
542 |
}
|
543 |
|
544 |
-
|
545 |
-
|
546 |
-
|
547 |
-
|
548 |
-
|
549 |
-
|
550 |
-
|
551 |
-
|
552 |
-
|
553 |
-
|
554 |
-
|
555 |
-
|
556 |
-
|
557 |
-
|
558 |
-
|
559 |
-
|
560 |
-
|
561 |
-
|
562 |
-
|
563 |
-
|
564 |
-
|
565 |
-
|
566 |
-
|
567 |
-
|
568 |
-
|
569 |
-
|
570 |
-
|
571 |
-
|
572 |
-
|
573 |
-
|
574 |
-
|
575 |
-
|
576 |
-
|
577 |
-
|
578 |
-
|
579 |
-
|
580 |
-
|
581 |
-
|
582 |
-
|
583 |
-
|
584 |
-
|
585 |
-
|
586 |
-
Input('selected-doc-type', 'data')
|
587 |
-
],
|
588 |
-
[
|
589 |
-
State('store-shred', 'data'),
|
590 |
-
State('store-pink', 'data'),
|
591 |
-
State('store-pink-review', 'data'),
|
592 |
-
State('store-red', 'data'),
|
593 |
-
State('store-red-review', 'data'),
|
594 |
-
State('store-gold', 'data'),
|
595 |
-
State('store-gold-review', 'data'),
|
596 |
-
State('store-loe', 'data'),
|
597 |
-
State('store-virtual-board', 'data'),
|
598 |
-
State('store-generated-doc', 'data')
|
599 |
-
],
|
600 |
-
prevent_initial_call=True
|
601 |
-
)
|
602 |
-
def handle_preview_generate_download(n_clicks_generate_list, n_clicks_download, selected_type,
|
603 |
-
shred, pink, pink_review, red, red_review, gold, gold_review, loe, virtual_board, prev_generated):
|
604 |
-
ctx = callback_context
|
605 |
-
trigger = ctx.triggered[0]['prop_id'] if ctx.triggered else ""
|
606 |
-
logging.info(f"Unified preview/generate/download trigger: {trigger}")
|
607 |
-
|
608 |
-
# Download logic
|
609 |
-
if "btn-download" in trigger:
|
610 |
-
doc = prev_generated
|
611 |
-
if not doc:
|
612 |
-
doc = get_generated_doc(selected_type)
|
613 |
-
if not doc:
|
614 |
-
if selected_type == "Shred":
|
615 |
-
doc = shred
|
616 |
-
elif selected_type == "Pink":
|
617 |
-
doc = pink
|
618 |
-
elif selected_type == "Pink Review":
|
619 |
-
doc = pink_review
|
620 |
-
elif selected_type == "Red":
|
621 |
-
doc = red
|
622 |
-
elif selected_type == "Red Review":
|
623 |
-
doc = red_review
|
624 |
-
elif selected_type == "Gold":
|
625 |
-
doc = gold
|
626 |
-
elif selected_type == "Gold Review":
|
627 |
-
doc = gold_review
|
628 |
-
elif selected_type == "LOE":
|
629 |
-
doc = loe
|
630 |
-
elif selected_type == "Virtual Board":
|
631 |
-
doc = virtual_board
|
632 |
-
if not doc:
|
633 |
-
logging.warning("No generated document to download.")
|
634 |
-
return dash.no_update, dash.no_update, dash.no_update, dash.no_update
|
635 |
-
if selected_type in spreadsheet_types:
|
636 |
-
xlsx_io = markdown_tables_to_xlsx(doc)
|
637 |
-
logging.info("Spreadsheet document prepared for download.")
|
638 |
-
return dash.no_update, dash.no_update, dcc.send_bytes(xlsx_io.getvalue(), filename=f"{selected_type}_output.xlsx"), "progress"
|
639 |
-
else:
|
640 |
-
content = doc.encode('utf-8')
|
641 |
-
logging.info("Narrative document prepared for download.")
|
642 |
-
return dash.no_update, dash.no_update, dcc.send_bytes(content, filename=f"{selected_type}_output.md"), "progress"
|
643 |
-
|
644 |
-
# Generate logic
|
645 |
if any(n_clicks_generate_list):
|
646 |
logging.info(f"Generating document for type: {selected_type}")
|
647 |
inputs = {
|
648 |
-
"shred":
|
649 |
-
"pink":
|
650 |
-
"pink_review":
|
651 |
-
"red":
|
652 |
-
"red_review":
|
653 |
-
"gold":
|
654 |
-
"gold_review":
|
655 |
-
"loe":
|
656 |
-
"virtual_board":
|
657 |
}
|
658 |
prompt = document_types.get(selected_type, "")
|
659 |
context = ""
|
@@ -682,37 +632,81 @@ def handle_preview_generate_download(n_clicks_generate_list, n_clicks_download,
|
|
682 |
preview = markdown_table_preview(generated_doc)
|
683 |
else:
|
684 |
preview = markdown_narrative_preview(generated_doc)
|
685 |
-
|
686 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
687 |
|
688 |
-
#
|
689 |
doc = get_generated_doc(selected_type)
|
690 |
if not doc:
|
691 |
-
if selected_type == "Shred" and
|
692 |
-
|
693 |
elif selected_type in spreadsheet_types:
|
694 |
doc_store = {
|
695 |
-
"Pink Review":
|
696 |
-
"Red Review":
|
697 |
-
"Gold Review":
|
698 |
-
"Virtual Board":
|
699 |
-
"LOE":
|
700 |
}
|
701 |
doc = doc_store.get(selected_type, "")
|
702 |
-
|
703 |
elif selected_type in narrative_types:
|
704 |
doc_store = {
|
705 |
-
"Pink":
|
706 |
-
"Red":
|
707 |
-
"Gold":
|
708 |
}
|
709 |
doc = doc_store.get(selected_type, "")
|
710 |
-
|
711 |
-
|
|
|
|
|
712 |
if selected_type in spreadsheet_types:
|
713 |
-
|
714 |
else:
|
715 |
-
|
|
|
716 |
|
717 |
@app.callback(
|
718 |
Output("main-progress-dot-output", "children"),
|
|
|
499 |
Output('uploaded-doc-name-gold_review', 'children'),
|
500 |
Output('uploaded-doc-name-loe', 'children'),
|
501 |
Output('uploaded-doc-name-virtual_board', 'children'),
|
502 |
+
Output('document-preview', 'children'),
|
503 |
+
Output('store-generated-doc', 'data'),
|
504 |
+
Output('download-document', 'data'),
|
505 |
Output('progress-dot-store', 'data')
|
506 |
],
|
507 |
[
|
508 |
Input({'type': 'upload-doc-type', 'subtype': ALL, 'index': ALL}, 'contents'),
|
509 |
+
Input({'type': 'btn-generate-doc', 'index': ALL}, 'n_clicks'),
|
510 |
+
Input("btn-download", "n_clicks"),
|
511 |
+
Input('selected-doc-type', 'data')
|
512 |
],
|
513 |
[
|
514 |
State({'type': 'upload-doc-type', 'subtype': ALL, 'index': ALL}, 'filename'),
|
|
|
520 |
State('store-gold', 'data'),
|
521 |
State('store-gold-review', 'data'),
|
522 |
State('store-loe', 'data'),
|
523 |
+
State('store-virtual-board', 'data'),
|
524 |
+
State('store-generated-doc', 'data')
|
525 |
],
|
526 |
prevent_initial_call=True
|
527 |
)
|
528 |
+
def unified_handler(contents_lists, n_clicks_generate_list, n_clicks_download, selected_type,
|
529 |
+
filenames_lists, shred, pink, pink_review, red, red_review, gold, gold_review, loe, virtual_board, prev_generated):
|
530 |
stores = [shred, pink, pink_review, red, red_review, gold, gold_review, loe, virtual_board]
|
531 |
file_list = []
|
532 |
doc_names = [None]*9
|
533 |
+
preview = dash.no_update
|
534 |
+
generated_doc = dash.no_update
|
535 |
+
download_data = dash.no_update
|
536 |
progress = dash.no_update
|
537 |
|
538 |
+
ctx = callback_context
|
539 |
+
trigger = ctx.triggered[0]['prop_id'] if ctx.triggered else ""
|
|
|
540 |
|
541 |
subtype_map = {
|
542 |
"shred": (0, 0),
|
|
|
550 |
"virtual_board": (8, 8)
|
551 |
}
|
552 |
|
553 |
+
# Handle upload
|
554 |
+
if "upload-doc-type" in trigger:
|
555 |
+
for i, (contents, filenames) in enumerate(zip(contents_lists, filenames_lists)):
|
556 |
+
if contents and filenames:
|
557 |
+
id_dict = ctx.inputs_list[0][i]['id']
|
558 |
+
subtype = id_dict['subtype']
|
559 |
+
idx, doc_name_idx = subtype_map[subtype]
|
560 |
+
if isinstance(contents, str):
|
561 |
+
contents = [contents]
|
562 |
+
filenames = [filenames]
|
563 |
+
content = contents[-1]
|
564 |
+
name = filenames[-1]
|
565 |
+
file_text = process_document(content, name)
|
566 |
+
set_uploaded_doc(subtype, file_text, name)
|
567 |
+
stores[idx] = file_text
|
568 |
+
doc_names[doc_name_idx] = name
|
569 |
+
if subtype == "shred":
|
570 |
+
file_list = [
|
571 |
+
dbc.Row([
|
572 |
+
dbc.Col(
|
573 |
+
html.Button('×', id={'type': 'remove-file', 'index': name}, style={'marginRight': '5px', 'fontSize': '10px'}),
|
574 |
+
width=1
|
575 |
+
),
|
576 |
+
dbc.Col(
|
577 |
+
html.Span(name, style={'wordBreak': 'break-all'}),
|
578 |
+
width=11
|
579 |
+
)
|
580 |
+
], id={'type': 'file-row', 'index': name}, align="center", className="mb-1")
|
581 |
+
]
|
582 |
+
progress = "progress"
|
583 |
+
# Set preview for this upload
|
584 |
+
if subtype == "shred":
|
585 |
+
preview = markdown_table_preview(file_text)
|
586 |
+
elif subtype in ["pink", "red", "gold"]:
|
587 |
+
preview = markdown_narrative_preview(file_text)
|
588 |
+
else:
|
589 |
+
preview = markdown_table_preview(file_text)
|
590 |
+
generated_doc = dash.no_update
|
591 |
+
download_data = dash.no_update
|
592 |
+
return stores + [file_list] + doc_names + [preview, generated_doc, download_data, progress]
|
593 |
+
|
594 |
+
# Handle Generate
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
595 |
if any(n_clicks_generate_list):
|
596 |
logging.info(f"Generating document for type: {selected_type}")
|
597 |
inputs = {
|
598 |
+
"shred": stores[0],
|
599 |
+
"pink": stores[1],
|
600 |
+
"pink_review": stores[2],
|
601 |
+
"red": stores[3],
|
602 |
+
"red_review": stores[4],
|
603 |
+
"gold": stores[5],
|
604 |
+
"gold_review": stores[6],
|
605 |
+
"loe": stores[7],
|
606 |
+
"virtual_board": stores[8]
|
607 |
}
|
608 |
prompt = document_types.get(selected_type, "")
|
609 |
context = ""
|
|
|
632 |
preview = markdown_table_preview(generated_doc)
|
633 |
else:
|
634 |
preview = markdown_narrative_preview(generated_doc)
|
635 |
+
progress = "progress"
|
636 |
+
download_data = dash.no_update
|
637 |
+
return stores + [file_list] + doc_names + [preview, generated_doc, download_data, progress]
|
638 |
+
|
639 |
+
# Handle Download
|
640 |
+
if "btn-download" in trigger:
|
641 |
+
doc = prev_generated
|
642 |
+
if not doc:
|
643 |
+
doc = get_generated_doc(selected_type)
|
644 |
+
if not doc:
|
645 |
+
if selected_type == "Shred":
|
646 |
+
doc = stores[0]
|
647 |
+
elif selected_type == "Pink":
|
648 |
+
doc = stores[1]
|
649 |
+
elif selected_type == "Pink Review":
|
650 |
+
doc = stores[2]
|
651 |
+
elif selected_type == "Red":
|
652 |
+
doc = stores[3]
|
653 |
+
elif selected_type == "Red Review":
|
654 |
+
doc = stores[4]
|
655 |
+
elif selected_type == "Gold":
|
656 |
+
doc = stores[5]
|
657 |
+
elif selected_type == "Gold Review":
|
658 |
+
doc = stores[6]
|
659 |
+
elif selected_type == "LOE":
|
660 |
+
doc = stores[7]
|
661 |
+
elif selected_type == "Virtual Board":
|
662 |
+
doc = stores[8]
|
663 |
+
if not doc:
|
664 |
+
logging.warning("No generated document to download.")
|
665 |
+
return stores + [file_list] + doc_names + [dash.no_update, dash.no_update, dash.no_update, dash.no_update]
|
666 |
+
if selected_type in spreadsheet_types:
|
667 |
+
xlsx_io = markdown_tables_to_xlsx(doc)
|
668 |
+
logging.info("Spreadsheet document prepared for download.")
|
669 |
+
download_data = dcc.send_bytes(xlsx_io.getvalue(), filename=f"{selected_type}_output.xlsx")
|
670 |
+
progress = "progress"
|
671 |
+
return stores + [file_list] + doc_names + [dash.no_update, dash.no_update, download_data, progress]
|
672 |
+
else:
|
673 |
+
content = doc.encode('utf-8')
|
674 |
+
logging.info("Narrative document prepared for download.")
|
675 |
+
download_data = dcc.send_bytes(content, filename=f"{selected_type}_output.md")
|
676 |
+
progress = "progress"
|
677 |
+
return stores + [file_list] + doc_names + [dash.no_update, dash.no_update, download_data, progress]
|
678 |
|
679 |
+
# Handle Doc Type Change/Preview
|
680 |
doc = get_generated_doc(selected_type)
|
681 |
if not doc:
|
682 |
+
if selected_type == "Shred" and stores[0]:
|
683 |
+
preview = markdown_table_preview(stores[0])
|
684 |
elif selected_type in spreadsheet_types:
|
685 |
doc_store = {
|
686 |
+
"Pink Review": stores[2],
|
687 |
+
"Red Review": stores[4],
|
688 |
+
"Gold Review": stores[6],
|
689 |
+
"Virtual Board": stores[8],
|
690 |
+
"LOE": stores[7]
|
691 |
}
|
692 |
doc = doc_store.get(selected_type, "")
|
693 |
+
preview = markdown_table_preview(doc)
|
694 |
elif selected_type in narrative_types:
|
695 |
doc_store = {
|
696 |
+
"Pink": stores[1],
|
697 |
+
"Red": stores[3],
|
698 |
+
"Gold": stores[5]
|
699 |
}
|
700 |
doc = doc_store.get(selected_type, "")
|
701 |
+
preview = markdown_narrative_preview(doc)
|
702 |
+
else:
|
703 |
+
preview = html.Div("No document loaded.")
|
704 |
+
return stores + [file_list] + doc_names + [preview, dash.no_update, dash.no_update, dash.no_update]
|
705 |
if selected_type in spreadsheet_types:
|
706 |
+
preview = markdown_table_preview(doc)
|
707 |
else:
|
708 |
+
preview = markdown_narrative_preview(doc)
|
709 |
+
return stores + [file_list] + doc_names + [preview, doc, dash.no_update, dash.no_update]
|
710 |
|
711 |
@app.callback(
|
712 |
Output("main-progress-dot-output", "children"),
|