File size: 5,218 Bytes
cafd04f
57ce7cd
abb433d
 
883500e
abb433d
3c7ad8d
57ce7cd
 
abb433d
57ce7cd
883500e
abb433d
3c7ad8d
57ce7cd
 
abb433d
57ce7cd
883500e
 
3c7ad8d
57ce7cd
5b6f62b
abb433d
883500e
 
abb433d
3c7ad8d
5b6f62b
883500e
 
b5f5f47
d7cbe0f
 
 
883500e
 
 
 
 
 
 
 
 
 
 
 
 
57ce7cd
0753b64
843507f
 
 
 
 
0753b64
843507f
0753b64
843507f
0753b64
843507f
0753b64
 
3c7ad8d
68d783a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d7cbe0f
3c7ad8d
68d783a
 
 
 
 
ee455e6
68d783a
6a567d7
 
68d783a
 
cafd04f
 
 
883500e
 
0753b64
18dc1de
 
c5ef5f5
fef3320
 
 
 
 
 
 
 
 
 
ac87c7a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import gradio as gr
from interface.rebalancing_interface import (
    input as rebalancing_inputs, 
    output as rebalancing_output,     
    update_output as rebalancing_update_output,
    examples as rebalancing_examples, 
    component_rows as rebalancing_component_rows,
)
from interface.share_price_trend_interface import (
    input as share_price_trend_inputs, 
    output as share_price_trend_output, 
    update_output as share_price_trend_update_output,
    examples as share_price_trend_examples, 
    component_rows as share_price_trend_component_rows,
)
from interface.dollar_cost_averaging_interface import (
    input as dollar_cost_averaging_inputs, 
    output as dollar_cost_averaging_output, 
    update_output as dollar_cost_averaging_update_output,
    examples as dollar_cost_averaging_examples,
    component_rows as dollar_cost_averaging_component_rows,
)
from interface.retirement_planning_interface import (
    input as retirement_planning_inputs, 
    output as retirement_planning_output,
    update_output as retirement_update_output,
    examples as retirement_planning_examples,  
    component_rows as retirement_planning_component_rows, 
)

tabs_configuration = [
    ("πŸ’Έ Dividend-Based Retirement Planning", retirement_planning_inputs, retirement_planning_output, retirement_update_output, retirement_planning_examples, retirement_planning_component_rows),
    ("πŸš€ Re-Balancing Calculator", rebalancing_inputs, rebalancing_output, rebalancing_update_output, rebalancing_examples, rebalancing_component_rows),
    ("πŸ“ˆ Share Price Trend", share_price_trend_inputs, share_price_trend_output, share_price_trend_update_output, share_price_trend_examples, share_price_trend_component_rows),
    ("πŸ“‰ Dollar Cost Averaging Calculator", dollar_cost_averaging_inputs, dollar_cost_averaging_output, dollar_cost_averaging_update_output, dollar_cost_averaging_examples, dollar_cost_averaging_component_rows),
]

def initial_load(*args):
    idx = 0
    rebalancing_results = rebalancing_update_output(*args[idx:idx+len(rebalancing_inputs)])
    idx += len(rebalancing_inputs)
    share_price_trend_results = share_price_trend_update_output(*args[idx:idx+len(share_price_trend_inputs)])
    idx += len(share_price_trend_inputs)
    dollar_cost_averaging_results = dollar_cost_averaging_update_output(*args[idx:idx+len(dollar_cost_averaging_inputs)])
    idx += len(dollar_cost_averaging_inputs)
    retirement_results = retirement_update_output(*args[idx:])
    
    return (rebalancing_results, share_price_trend_results, dollar_cost_averaging_results, retirement_results)

MARKDOWN = ("""
---

**If you find this tool useful and would like to support its development, please consider making a donation. Your support is greatly appreciated!**

- [Donate with KakaoPay](https://qr.kakaopay.com/Ej7jF6o7B)

---

For any questions or feedback, reach us at: πŸ“§ [cryman38@daum.net](mailto:cryman38@daum.net)

---

""")

# Helper function to add buttons
def clear_buttons(inputs):
    clear_button = gr.ClearButton(value="Clear")
    clear_button.click(
        fn=lambda: [None] * len(inputs),
        inputs=[],
        outputs=inputs
    )
    return clear_button

def submit_buttons(inputs, update_fn, output):    
    submit_button = gr.Button(value="Run", variant="primary")
    submit_button.click(
        fn=update_fn,
        inputs=inputs,
        outputs=output
    )
    return submit_button

def on_change(inputs, update_ouutput, outputs):
    for input_component in inputs:
        input_component.change(
            fn=update_ouutput,
            inputs=inputs,
            outputs=outputs
        )

def render_components(component_rows):
    for row in component_rows:
        if isinstance(row, list):
            with gr.Row():
                for component in row:
                    component.render()
        else:
            row.render()

def create_tab(tab_name, inputs, outputs, update_fn, examples, component_rows):
    with gr.Tab(tab_name):
        with gr.Row():
            with gr.Column(elem_classes="input", scale=1):
                render_components(component_rows)
                clear_buttons(inputs)
                submit_buttons(inputs, update_fn, outputs)
            with gr.Column(scale=3):
                outputs.render()
        with gr.Accordion("πŸ‘€ Examples", open=False):            
            gr.Examples(examples=examples, cache_examples=False, inputs=inputs)
        on_change(inputs, update_fn, outputs)

with gr.Blocks(css='style.css') as demo:
    with gr.Column(elem_id="col-container"):
        with gr.Tabs():
            for tab in tabs_configuration:
                create_tab(*tab)
            # render_about_tab()  # "Support Us" νƒ­ μΆ”κ°€
    with gr.Accordion("🀝 DONATE", open=True):
        gr.Markdown(MARKDOWN, elem_id="col-container")

    demo.load(
        initial_load, 
        inputs=rebalancing_inputs + share_price_trend_inputs + dollar_cost_averaging_inputs + retirement_planning_inputs,
        outputs=[
            rebalancing_output,
            share_price_trend_output,
            dollar_cost_averaging_output,
            retirement_planning_output
        ]
    )
demo.launch(share=True)