File size: 5,046 Bytes
4ad5efa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import logging
from datetime import datetime
from pathlib import Path
import matplotlib.pyplot as plt

logger = logging.getLogger("jira_assistant_interface")

def on_viz_generate_clicked(viz_type, limit, groupby_text, app):
    """
    Обробник для кнопки "Генерувати".
    """
    groupby_map = {"день": "day", "тиждень": "week", "місяць": "month"}
    groupby = groupby_map.get(groupby_text, "day")

    if not hasattr(app, 'current_data') or app.current_data is None:
        return gr.Plot.update(value=None), "Спочатку завантажте та проаналізуйте дані"

    fig = app.generate_visualization(viz_type, limit=limit, groupby=groupby)
    if fig:
        return fig, None
    else:
        return None, f"Не вдалося згенерувати візуалізацію типу '{viz_type}'"

def save_visualization(viz_type, limit, groupby_text, filename, app):
    """
    Зберігає згенеровану візуалізацію у файл.
    """
    try:
        groupby_map = {"день": "day", "тиждень": "week", "місяць": "month"}
        groupby = groupby_map.get(groupby_text, "day")

        fig = app.generate_visualization(viz_type, limit=limit, groupby=groupby)
        if fig is None:
            return "Помилка: не вдалося створити візуалізацію"

        if not filename:
            timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
            viz_type_clean = viz_type.lower().replace(' ', '_').replace(':', '_')
            filename = f"viz_{viz_type_clean}_{timestamp}.png"

        if not any(filename.lower().endswith(ext) for ext in ['.png', '.jpg', '.svg', '.pdf']):
            filename += '.png'

        reports_dir = Path("reports/visualizations")
        reports_dir.mkdir(parents=True, exist_ok=True)

        filepath = reports_dir / filename
        fig.savefig(filepath, dpi=300, bbox_inches='tight')
        plt.close(fig)

        return f"✅ Візуалізацію збережено: {filepath}"
    except Exception as e:
        import traceback
        error_msg = f"Помилка збереження візуалізації: {str(e)}\n\n{traceback.format_exc()}"
        logger.error(error_msg)
        return error_msg

def create_visualizations_tab(app):
    """
    Створює вкладку 'Візуалізації' у Gradio інтерфейсі.
    """
    with gr.Tab("Візуалізації"):
        gr.Markdown("## Типи візуалізацій")

        with gr.Row():
            viz_type = gr.Dropdown(
                choices=[
                    "Статуси", "Пріоритети", "Типи тікетів", "Призначені користувачі",
                    "Активність створення", "Активність оновлення", "Кумулятивне створення",
                    "Неактивні тікети", "Теплова карта: Типи/Статуси",
                    "Часова шкала проекту", "Склад статусів з часом"
                ],
                value="Статуси",
                label="Тип візуалізації"
            )
            viz_generate_btn = gr.Button("Генерувати", variant="primary")

        with gr.Accordion("Параметри візуалізації", open=False):
            with gr.Row():
                viz_param_limit = gr.Slider(minimum=5, maximum=20, value=10, step=1,
                                            label="Ліміт для топ-візуалізацій")
                viz_param_groupby = gr.Dropdown(
                    choices=["день", "тиждень", "місяць"],
                    value="день",
                    label="Групування для часових діаграм"
                )

        with gr.Row():
            viz_plot = gr.Plot(label="Візуалізація")
            viz_status = gr.Textbox(label="Статус", visible=False)

        with gr.Row():
            viz_filename = gr.Textbox(
                label="Ім'я файлу (опціонально)",
                placeholder="Залиште порожнім для автоматичного імені"
            )
            viz_save_btn = gr.Button("Зберегти візуалізацію", variant="secondary")
            viz_save_status = gr.Textbox(label="Статус збереження")

        # Прив'язка подій
        viz_generate_btn.click(
            lambda t, l, g: on_viz_generate_clicked(t, l, g, app),
            inputs=[viz_type, viz_param_limit, viz_param_groupby],
            outputs=[viz_plot, viz_status]
        )

        viz_save_btn.click(
            lambda t, l, g, f: save_visualization(t, l, g, f, app),
            inputs=[viz_type, viz_param_limit, viz_param_groupby, viz_filename],
            outputs=[viz_save_status]
        )