bluenevus commited on
Commit
7e236fd
·
1 Parent(s): c1813c1

Update app.py via AI Editor

Browse files
Files changed (1) hide show
  1. app.py +128 -134
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 handle_doc_upload(contents_lists, filenames_lists,
522
- shred, pink, pink_review, red, red_review, gold, gold_review, loe, virtual_board):
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
- triggered = callback_context.triggered
529
- if not triggered or not contents_lists:
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
- for i, (contents, filenames) in enumerate(zip(contents_lists, filenames_lists)):
545
- if contents and filenames:
546
- id_dict = callback_context.inputs_list[0][i]['id']
547
- subtype = id_dict['subtype']
548
- idx, doc_name_idx = subtype_map[subtype]
549
- if isinstance(contents, str):
550
- contents = [contents]
551
- filenames = [filenames]
552
- content = contents[-1]
553
- name = filenames[-1]
554
- file_text = process_document(content, name)
555
- set_uploaded_doc(subtype, file_text, name)
556
- stores[idx] = file_text
557
- doc_names[doc_name_idx] = name
558
- if subtype == "shred":
559
- file_list = [
560
- dbc.Row([
561
- dbc.Col(
562
- html.Button('×', id={'type': 'remove-file', 'index': name}, style={'marginRight': '5px', 'fontSize': '10px'}),
563
- width=1
564
- ),
565
- dbc.Col(
566
- html.Span(name, style={'wordBreak': 'break-all'}),
567
- width=11
568
- )
569
- ], id={'type': 'file-row', 'index': name}, align="center", className="mb-1")
570
- ]
571
- progress = "progress"
572
- break
573
-
574
- return stores + [file_list] + doc_names + [progress]
575
-
576
- @app.callback(
577
- [
578
- Output('document-preview', 'children'),
579
- Output('store-generated-doc', 'data'),
580
- Output('download-document', 'data'),
581
- Output('progress-dot-store', 'data')
582
- ],
583
- [
584
- Input({'type': 'btn-generate-doc', 'index': ALL}, 'n_clicks'),
585
- Input("btn-download", "n_clicks"),
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": shred,
649
- "pink": pink,
650
- "pink_review": pink_review,
651
- "red": red,
652
- "red_review": red_review,
653
- "gold": gold,
654
- "gold_review": gold_review,
655
- "loe": loe,
656
- "virtual_board": 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
- logging.info("Document preview updated.")
686
- return preview, generated_doc, dash.no_update, "progress"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
687
 
688
- # Preview logic (selected type changed)
689
  doc = get_generated_doc(selected_type)
690
  if not doc:
691
- if selected_type == "Shred" and shred:
692
- return markdown_table_preview(shred), dash.no_update, dash.no_update, dash.no_update
693
  elif selected_type in spreadsheet_types:
694
  doc_store = {
695
- "Pink Review": pink_review,
696
- "Red Review": red_review,
697
- "Gold Review": gold_review,
698
- "Virtual Board": virtual_board,
699
- "LOE": loe
700
  }
701
  doc = doc_store.get(selected_type, "")
702
- return markdown_table_preview(doc), dash.no_update, dash.no_update, dash.no_update
703
  elif selected_type in narrative_types:
704
  doc_store = {
705
- "Pink": pink,
706
- "Red": red,
707
- "Gold": gold
708
  }
709
  doc = doc_store.get(selected_type, "")
710
- return markdown_narrative_preview(doc), dash.no_update, dash.no_update, dash.no_update
711
- return html.Div("No document loaded."), dash.no_update, dash.no_update, dash.no_update
 
 
712
  if selected_type in spreadsheet_types:
713
- return markdown_table_preview(doc), doc, dash.no_update, dash.no_update
714
  else:
715
- return markdown_narrative_preview(doc), doc, dash.no_update, dash.no_update
 
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"),