iatoolkit 0.63.1__py3-none-any.whl → 0.69.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of iatoolkit might be problematic. Click here for more details.
- iatoolkit/__init__.py +0 -2
- iatoolkit/base_company.py +1 -26
- iatoolkit/common/routes.py +11 -2
- iatoolkit/common/session_manager.py +2 -0
- iatoolkit/common/util.py +17 -0
- iatoolkit/company_registry.py +1 -2
- iatoolkit/iatoolkit.py +39 -6
- iatoolkit/locales/en.yaml +167 -0
- iatoolkit/locales/es.yaml +163 -0
- iatoolkit/repositories/database_manager.py +8 -3
- iatoolkit/repositories/document_repo.py +1 -1
- iatoolkit/repositories/models.py +1 -4
- iatoolkit/repositories/profile_repo.py +0 -4
- iatoolkit/services/auth_service.py +14 -9
- iatoolkit/services/branding_service.py +36 -24
- iatoolkit/services/company_context_service.py +145 -0
- iatoolkit/services/configuration_service.py +133 -0
- iatoolkit/services/dispatcher_service.py +51 -48
- iatoolkit/services/document_service.py +5 -2
- iatoolkit/services/excel_service.py +15 -11
- iatoolkit/services/file_processor_service.py +4 -12
- iatoolkit/services/history_service.py +8 -7
- iatoolkit/services/i18n_service.py +104 -0
- iatoolkit/services/jwt_service.py +7 -9
- iatoolkit/services/language_service.py +83 -0
- iatoolkit/services/load_documents_service.py +4 -4
- iatoolkit/services/mail_service.py +9 -4
- iatoolkit/services/profile_service.py +61 -38
- iatoolkit/services/prompt_manager_service.py +20 -16
- iatoolkit/services/query_service.py +19 -15
- iatoolkit/services/search_service.py +11 -4
- iatoolkit/services/sql_service.py +55 -25
- iatoolkit/services/user_feedback_service.py +16 -14
- iatoolkit/static/js/chat_feedback_button.js +57 -87
- iatoolkit/static/js/chat_help_content.js +124 -0
- iatoolkit/static/js/chat_history_button.js +48 -65
- iatoolkit/static/js/chat_main.js +27 -24
- iatoolkit/static/js/chat_onboarding_button.js +6 -0
- iatoolkit/static/js/chat_reload_button.js +28 -45
- iatoolkit/static/styles/chat_iatoolkit.css +223 -315
- iatoolkit/static/styles/chat_modal.css +63 -97
- iatoolkit/static/styles/chat_public.css +107 -0
- iatoolkit/static/styles/landing_page.css +0 -1
- iatoolkit/static/styles/onboarding.css +7 -0
- iatoolkit/templates/_company_header.html +6 -2
- iatoolkit/templates/_login_widget.html +42 -0
- iatoolkit/templates/base.html +34 -19
- iatoolkit/templates/change_password.html +22 -20
- iatoolkit/templates/chat.html +59 -27
- iatoolkit/templates/chat_modals.html +114 -74
- iatoolkit/templates/error.html +12 -13
- iatoolkit/templates/forgot_password.html +11 -7
- iatoolkit/templates/index.html +8 -3
- iatoolkit/templates/login_simulation.html +17 -6
- iatoolkit/templates/onboarding_shell.html +4 -2
- iatoolkit/templates/signup.html +14 -14
- iatoolkit/views/base_login_view.py +19 -9
- iatoolkit/views/change_password_view.py +50 -35
- iatoolkit/views/external_login_view.py +1 -1
- iatoolkit/views/forgot_password_view.py +21 -22
- iatoolkit/views/help_content_api_view.py +54 -0
- iatoolkit/views/history_api_view.py +13 -9
- iatoolkit/views/home_view.py +30 -39
- iatoolkit/views/init_context_api_view.py +16 -11
- iatoolkit/views/llmquery_api_view.py +38 -26
- iatoolkit/views/login_simulation_view.py +14 -2
- iatoolkit/views/login_view.py +52 -40
- iatoolkit/views/logout_api_view.py +26 -22
- iatoolkit/views/profile_api_view.py +46 -0
- iatoolkit/views/prompt_api_view.py +6 -6
- iatoolkit/views/signup_view.py +27 -27
- iatoolkit/views/user_feedback_api_view.py +19 -18
- iatoolkit/views/verify_user_view.py +29 -30
- {iatoolkit-0.63.1.dist-info → iatoolkit-0.69.0.dist-info}/METADATA +40 -22
- iatoolkit-0.69.0.dist-info/RECORD +120 -0
- iatoolkit-0.69.0.dist-info/licenses/LICENSE +21 -0
- iatoolkit/services/onboarding_service.py +0 -43
- iatoolkit/static/styles/chat_info.css +0 -53
- iatoolkit/templates/header.html +0 -31
- iatoolkit/templates/test.html +0 -9
- iatoolkit-0.63.1.dist-info/RECORD +0 -112
- {iatoolkit-0.63.1.dist-info → iatoolkit-0.69.0.dist-info}/WHEEL +0 -0
- {iatoolkit-0.63.1.dist-info → iatoolkit-0.69.0.dist-info}/top_level.txt +0 -0
iatoolkit/templates/chat.html
CHANGED
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
{% extends "base.html" %}
|
|
2
2
|
|
|
3
|
-
{% block title %}
|
|
3
|
+
{% block title %}{{ branding.name }} IA{% endblock %}
|
|
4
4
|
|
|
5
5
|
{% block content %}
|
|
6
|
-
|
|
6
|
+
<div class="chat-layout-container container">
|
|
7
7
|
{% block styles %}
|
|
8
8
|
{# Movemos los estilos y los links aquí para que se rendericen en el <head> #}
|
|
9
9
|
<style>
|
|
10
10
|
{{ branding.css_variables | safe }}
|
|
11
11
|
</style>
|
|
12
|
-
<link rel="stylesheet" href="{{ url_for('static', filename='styles/onboarding.css', _external=True) }}">
|
|
13
12
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
|
|
14
13
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
|
|
15
|
-
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.css">
|
|
16
14
|
|
|
17
15
|
{% endblock %}
|
|
18
16
|
|
|
@@ -47,30 +45,43 @@
|
|
|
47
45
|
<div class="d-flex align-items-center">
|
|
48
46
|
<a href="javascript:void(0);"
|
|
49
47
|
id="history-button"
|
|
50
|
-
class="action-icon-style" title="
|
|
48
|
+
class="action-icon-style" title="{{ t('ui.tooltips.history') }}"
|
|
49
|
+
style="color: {{ branding.header_text_color }};">
|
|
51
50
|
<i class="bi bi-clock-history"></i>
|
|
52
51
|
</a>
|
|
53
52
|
<a href="javascript:void(0);"
|
|
54
53
|
id="force-reload-button"
|
|
55
54
|
class="ms-3 action-icon-style"
|
|
56
|
-
title="
|
|
55
|
+
title="{{ t('ui.tooltips.reload_context') }}"
|
|
57
56
|
style="color: {{ branding.header_text_color }};">
|
|
58
57
|
<i class="bi bi-arrow-clockwise"></i>
|
|
59
58
|
</a>
|
|
60
59
|
<a href="javascript:void(0);"
|
|
61
60
|
id="send-feedback-button"
|
|
62
|
-
class="ms-3 action-icon-style"
|
|
61
|
+
class="ms-3 action-icon-style"
|
|
62
|
+
title="{{ t('ui.tooltips.feedback') }}"
|
|
63
|
+
style="color: {{ branding.header_text_color }};">
|
|
63
64
|
<i class="bi bi-emoji-smile"></i>
|
|
64
65
|
</a>
|
|
66
|
+
|
|
65
67
|
<a href="javascript:void(0);"
|
|
66
68
|
id="onboarding-button"
|
|
67
|
-
class="ms-3 action-icon-style"
|
|
69
|
+
class="ms-3 action-icon-style"
|
|
70
|
+
title="{{ t('ui.tooltips.onboarding') }}"
|
|
68
71
|
style="color: {{ branding.header_text_color }};">
|
|
69
72
|
<i class="bi bi-lightbulb"></i>
|
|
70
73
|
</a>
|
|
74
|
+
<a href="javascript:void(0);"
|
|
75
|
+
id="open-help-button"
|
|
76
|
+
class="ms-3 action-icon-style"
|
|
77
|
+
title="{{ t('ui.tooltips.usage_guide') }}"
|
|
78
|
+
style="color: {{ branding.header_text_color }};">
|
|
79
|
+
<i class="bi bi-question-circle-fill"></i>
|
|
80
|
+
</a>
|
|
71
81
|
<a href="javascript:void(0);"
|
|
72
82
|
id="logout-button"
|
|
73
|
-
class="ms-3 action-icon-style"
|
|
83
|
+
class="ms-3 action-icon-style"
|
|
84
|
+
title="{{ t('ui.tooltips.logout') }}"
|
|
74
85
|
style="color: {{ branding.header_text_color }}; !important;">
|
|
75
86
|
<i class="bi bi-box-arrow-right"></i>
|
|
76
87
|
</a>
|
|
@@ -79,11 +90,11 @@
|
|
|
79
90
|
</div>
|
|
80
91
|
|
|
81
92
|
<div id="chat-container"
|
|
82
|
-
class="chat-block mt-2 flex-grow-1"
|
|
83
|
-
|
|
84
|
-
<!-- Mensaje de bienvenida
|
|
93
|
+
class="chat-block mt-2 flex-grow-1" style="overflow-y: auto;">
|
|
94
|
+
|
|
95
|
+
<!-- Mensaje de bienvenida -->
|
|
85
96
|
<div class="answer-section">
|
|
86
|
-
|
|
97
|
+
{{ t('ui.chat.welcome_message') }}
|
|
87
98
|
</div>
|
|
88
99
|
</div>
|
|
89
100
|
|
|
@@ -102,8 +113,11 @@
|
|
|
102
113
|
<div class="{{ prompt_col_class }}">
|
|
103
114
|
<div class="position-relative h-100">
|
|
104
115
|
<div class="input-group dropup h-100">
|
|
105
|
-
<button type="button" id="prompt-select-button"
|
|
106
|
-
|
|
116
|
+
<button type="button" id="prompt-select-button"
|
|
117
|
+
class="btn prompt-select-button border dropdown-toggle w-100 text-start"
|
|
118
|
+
data-bs-toggle="dropdown"
|
|
119
|
+
aria-expanded="false">
|
|
120
|
+
{{ t('ui.chat.prompts_available') }} ....
|
|
107
121
|
</button>
|
|
108
122
|
<ul class="dropdown-menu dropdown-menu-soft w-100">
|
|
109
123
|
{% if prompts and prompts.message %}
|
|
@@ -126,7 +140,11 @@
|
|
|
126
140
|
{% endif %}
|
|
127
141
|
</ul>
|
|
128
142
|
</div>
|
|
129
|
-
<button type="button"
|
|
143
|
+
<button type="button"
|
|
144
|
+
id="clear-selection-button"
|
|
145
|
+
class="btn clear-specific-data-button position-absolute end-0 me-1" style="display: none;">
|
|
146
|
+
<i class="bi bi-x-circle-fill"></i>
|
|
147
|
+
</button>
|
|
130
148
|
</div>
|
|
131
149
|
<input type="hidden" id="prompt-select-value" name="prompt_select_value">
|
|
132
150
|
<input type="hidden" id="prompt-select-description" name="prompt-select-description">
|
|
@@ -145,33 +163,39 @@
|
|
|
145
163
|
<div class="d-flex align-items-center">
|
|
146
164
|
<!-- varita magica -->
|
|
147
165
|
<a class="p-2" href="#prompt-assistant-collapse" data-bs-toggle="collapse" role="button"
|
|
148
|
-
aria-expanded="false" aria-controls="prompt-assistant-collapse"
|
|
166
|
+
aria-expanded="false" aria-controls="prompt-assistant-collapse"
|
|
167
|
+
title="{{ t('ui.tooltips.use_prompt_assistant') }}">
|
|
149
168
|
<i class="bi bi-magic"></i>
|
|
150
169
|
</a>
|
|
151
|
-
<a class="p-2" href="javascript:void(0);" id="paperclip-button"
|
|
170
|
+
<a class="p-2" href="javascript:void(0);" id="paperclip-button"
|
|
171
|
+
title="{{ t('ui.tooltips.attach_files') }}">
|
|
152
172
|
<i class="bi bi-plus-circle"></i>
|
|
153
173
|
</a>
|
|
154
174
|
<div id="view-files-button-container" style="display: none;">
|
|
155
|
-
<a class="p-2" href="javascript:void(0);" id="view-files-button"
|
|
175
|
+
<a class="p-2" href="javascript:void(0);" id="view-files-button"
|
|
176
|
+
title="{{ t('ui.tooltips.view_attached_files') }}">
|
|
156
177
|
<i class="bi bi-file-earmark-text"></i>
|
|
157
178
|
</a>
|
|
158
179
|
</div>
|
|
159
180
|
</div>
|
|
160
181
|
|
|
161
182
|
<!-- Textarea Central -->
|
|
162
|
-
<textarea id="question" placeholder="
|
|
183
|
+
<textarea id="question" placeholder="{{ t('ui.chat.input_placeholder') }}"
|
|
184
|
+
class="form-control chat-textarea" style="resize: none;" rows="1"></textarea>
|
|
163
185
|
|
|
164
186
|
<!-- Botón de Enviar a la derecha -->
|
|
165
187
|
<div class="d-flex align-items-center">
|
|
166
188
|
<div id="send-button-container">
|
|
167
189
|
<a href="javascript:void(0);" id="send-button"
|
|
168
|
-
class="p-2 send-button-icon"
|
|
190
|
+
class="p-2 send-button-icon"
|
|
191
|
+
title="{{ t('ui.buttons.send') }}">
|
|
169
192
|
<i class="bi bi-arrow-up-circle-fill"></i>
|
|
170
193
|
</a>
|
|
171
194
|
</div>
|
|
172
195
|
<div id="stop-button-container" style="display: none;">
|
|
173
196
|
<a href="javascript:void(0);" id="stop-button"
|
|
174
|
-
class="p-2 text-danger"
|
|
197
|
+
class="p-2 text-danger"
|
|
198
|
+
title="{{ t('ui.buttons.stop') }}">
|
|
175
199
|
<i class="bi bi-stop-circle-fill"></i>
|
|
176
200
|
</a>
|
|
177
201
|
</div>
|
|
@@ -182,6 +206,7 @@
|
|
|
182
206
|
<!-- Incluir los modales desde un archivo externo -->
|
|
183
207
|
{% include 'chat_modals.html' %}
|
|
184
208
|
|
|
209
|
+
</div>
|
|
185
210
|
{% endblock %}
|
|
186
211
|
|
|
187
212
|
{% block scripts %}
|
|
@@ -195,21 +220,27 @@
|
|
|
195
220
|
window.onboardingCards = {{ onboarding_cards | tojson }};
|
|
196
221
|
window.sendButtonColor = "{{ branding.send_button_color }}";
|
|
197
222
|
|
|
223
|
+
// JS translations helper
|
|
224
|
+
window.i18n = {{ js_translations | tojson }};
|
|
225
|
+
function t_js(key) {
|
|
226
|
+
return window.i18n[key] || key;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
|
|
198
230
|
</script>
|
|
199
231
|
|
|
200
232
|
<!-- Carga de los scripts JS externos después de definir las variables globales -->
|
|
201
|
-
<script src="{{ url_for('static', filename='js/chat_onboarding_button.js', _external=True) }}"></script>
|
|
202
|
-
<script src="{{ url_for('static', filename='js/chat_filepond.js', _external=True) }}"></script>
|
|
203
233
|
<script src="{{ url_for('static', filename='js/chat_history_button.js', _external=True) }}"></script>
|
|
204
|
-
<script src="{{ url_for('static', filename='js/chat_feedback_button.js', _external=True) }}"></script>
|
|
205
234
|
<script src="{{ url_for('static', filename='js/chat_reload_button.js', _external=True) }}"></script>
|
|
206
|
-
<script src="{{ url_for('static', filename='js/
|
|
235
|
+
<script src="{{ url_for('static', filename='js/chat_feedback_button.js', _external=True) }}"></script>
|
|
236
|
+
<script src="{{ url_for('static', filename='js/chat_help_content.js', _external=True) }}"></script>
|
|
237
|
+
<script src="{{ url_for('static', filename='js/chat_onboarding_button.js', _external=True) }}"></script>
|
|
207
238
|
<script src="{{ url_for('static', filename='js/chat_logout_button.js', _external=True) }}"></script>
|
|
208
239
|
<script src="{{ url_for('static', filename='js/chat_prompt_manager.js', _external=True) }}"></script>
|
|
240
|
+
<script src="{{ url_for('static', filename='js/chat_filepond.js', _external=True) }}"></script>
|
|
209
241
|
<script src="{{ url_for('static', filename='js/chat_main.js', _external=True) }}"></script>
|
|
210
242
|
|
|
211
243
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
|
|
212
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.js"></script>
|
|
213
244
|
|
|
214
245
|
<script>
|
|
215
246
|
|
|
@@ -241,6 +272,7 @@ document.addEventListener('DOMContentLoaded', function () {
|
|
|
241
272
|
icon: '#ob-icon',
|
|
242
273
|
title: '#ob-title',
|
|
243
274
|
text: '#ob-text',
|
|
275
|
+
example: '#ob-example',
|
|
244
276
|
dots: '#ob-dots',
|
|
245
277
|
prev: '#ob-prev',
|
|
246
278
|
next: '#ob-next'
|
|
@@ -1,37 +1,69 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
<
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
<!-- Modal para historial -->
|
|
4
|
+
<div class="modal fade" id="historyModal" tabindex="-1" aria-labelledby="historyModalLabel" aria-hidden="true">
|
|
5
|
+
<div class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable">
|
|
6
|
+
<div class="modal-content">
|
|
7
|
+
<div class="modal-header branded">
|
|
8
|
+
<h5 class="modal-title" id="historyModalLabel">
|
|
9
|
+
<i class="bi bi-clock-history me-3"></i>
|
|
10
|
+
{{ t('ui.modals.history_title') }}
|
|
11
|
+
</h5>
|
|
12
|
+
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
13
|
+
</div>
|
|
14
|
+
<div class="modal-body">
|
|
15
|
+
<div id="history-loading" style="display: none;" class="text-center p-4">
|
|
16
|
+
<div class="spinner-border text-primary" role="status">
|
|
17
|
+
<span class="visually-hidden">Cargando...</span>
|
|
18
|
+
</div>
|
|
19
|
+
<p class="mt-2">{{ t('ui.modals.loading_history') }}</p>
|
|
20
|
+
</div>
|
|
21
|
+
|
|
22
|
+
<div id="history-content" style="display: none;">
|
|
23
|
+
<div class="table-responsive">
|
|
24
|
+
<table class="table table-striped table-hover">
|
|
25
|
+
<thead class="thead-branded">
|
|
26
|
+
<tr>
|
|
27
|
+
<th scope="col">{{ t('ui.modals.history_table_date') }}</th>
|
|
28
|
+
<th scope="col">{{ t('ui.modals.history_table_query') }}</th>
|
|
29
|
+
<th scope="col" class="col-icon"></th>
|
|
30
|
+
</tr>
|
|
31
|
+
</thead>
|
|
32
|
+
<tbody id="history-table-body">
|
|
33
|
+
<!-- Los datos se cargarán aquí -->
|
|
34
|
+
</tbody>
|
|
35
|
+
</table>
|
|
36
|
+
</div>
|
|
37
|
+
<div id="no-history-message" style="display: none;">
|
|
38
|
+
{{ t('js_messages.no_history_found') }}
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="modal-footer">
|
|
43
|
+
<button type="button" class="btn btn-branded-secondary" data-bs-dismiss="modal">
|
|
44
|
+
<i class="bi bi-x-circle me-1"></i>
|
|
45
|
+
{{ t('ui.buttons.cancel') }}
|
|
46
|
+
</button>
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
17
49
|
</div>
|
|
18
|
-
</div>
|
|
19
50
|
</div>
|
|
20
51
|
|
|
52
|
+
|
|
21
53
|
<!-- Modal para feedback -->
|
|
22
54
|
<div class="modal fade" id="feedbackModal" tabindex="-1" aria-labelledby="feedbackModalLabel" aria-hidden="true">
|
|
23
55
|
<div class="modal-dialog modal-dialog-centered">
|
|
24
56
|
<div class="modal-content">
|
|
25
57
|
<div class="modal-header branded">
|
|
26
58
|
<h5 class="modal-title" id="feedbackModalLabel">
|
|
27
|
-
<i class="bi bi-chat-dots me-3"></i>
|
|
59
|
+
<i class="bi bi-chat-dots me-3"></i>
|
|
60
|
+
{{ t('ui.modals.feedback_title') }}
|
|
28
61
|
</h5>
|
|
29
62
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
30
63
|
</div>
|
|
31
64
|
<div class="modal-body">
|
|
32
|
-
<p class="text-center mb-2"><strong
|
|
65
|
+
<p class="text-center mb-2"><strong>{{ t('ui.modals.feedback_prompt') }}</strong></p>
|
|
33
66
|
|
|
34
|
-
<!-- ▼▼▼ ESTE ES EL BLOQUE DE HTML QUE FALTABA ▼▼▼ -->
|
|
35
67
|
<div class="rating-stars mb-4">
|
|
36
68
|
<span class="star" data-rating="1" onclick="gfg(1)"></span>
|
|
37
69
|
<span class="star" data-rating="2" onclick="gfg(2)"></span>
|
|
@@ -39,77 +71,32 @@
|
|
|
39
71
|
<span class="star" data-rating="4" onclick="gfg(4)"></span>
|
|
40
72
|
<span class="star" data-rating="5" onclick="gfg(5)"></span>
|
|
41
73
|
</div>
|
|
42
|
-
<!-- ▲▲▲ FIN DEL BLOQUE DE HTML QUE FALTABA ▲▲▲ -->
|
|
43
74
|
|
|
44
75
|
<div class="form-group">
|
|
45
|
-
<label for="feedback-text" class="form-label text-muted">
|
|
76
|
+
<label for="feedback-text" class="form-label text-muted">
|
|
77
|
+
{{ t('ui.modals.feedback_comment_label') }}</label>
|
|
46
78
|
<textarea
|
|
47
79
|
class="form-control feedback-text"
|
|
48
80
|
id="feedback-text"
|
|
49
81
|
rows="4"
|
|
50
|
-
placeholder="
|
|
82
|
+
placeholder="{{ t('ui.modals.feedback_comment_placeholder') }}"
|
|
51
83
|
style="resize: vertical; min-height: 100px;"></textarea>
|
|
52
84
|
</div>
|
|
53
85
|
</div>
|
|
54
86
|
<div class="modal-footer">
|
|
55
87
|
<button type="button" class="btn btn-branded-secondary" data-bs-dismiss="modal">
|
|
56
|
-
<i class="bi bi-x-circle me-1"></i>
|
|
88
|
+
<i class="bi bi-x-circle me-1"></i>
|
|
89
|
+
{{ t('ui.buttons.cancel') }}
|
|
57
90
|
</button>
|
|
58
91
|
<button type="button" class="btn btn-branded-primary" id="submit-feedback">
|
|
59
|
-
<i class="bi bi-send me-1"></i>
|
|
92
|
+
<i class="bi bi-send me-1"></i>
|
|
93
|
+
{{ t('ui.buttons.send') }}
|
|
60
94
|
</button>
|
|
61
95
|
</div>
|
|
62
96
|
</div>
|
|
63
97
|
</div>
|
|
64
98
|
</div>
|
|
65
99
|
|
|
66
|
-
<!-- Modal para historial -->
|
|
67
|
-
<div class="modal fade" id="historyModal" tabindex="-1" aria-labelledby="historyModalLabel" aria-hidden="true">
|
|
68
|
-
<div class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable">
|
|
69
|
-
<div class="modal-content">
|
|
70
|
-
<div class="modal-header branded">
|
|
71
|
-
<h5 class="modal-title" id="historyModalLabel">
|
|
72
|
-
<i class="bi bi-clock-history me-3"></i>Historial de Consultas
|
|
73
|
-
</h5>
|
|
74
|
-
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
75
|
-
</div>
|
|
76
|
-
<div class="modal-body">
|
|
77
|
-
<div id="history-loading" style="display: none;" class="text-center p-4">
|
|
78
|
-
<div class="spinner-border text-primary" role="status">
|
|
79
|
-
<span class="visually-hidden">Cargando...</span>
|
|
80
|
-
</div>
|
|
81
|
-
<p class="mt-2">Cargando historial...</p>
|
|
82
|
-
</div>
|
|
83
|
-
<div id="history-error" style="display: none;">
|
|
84
|
-
<!-- Los errores se mostrarán aquí -->
|
|
85
|
-
</div>
|
|
86
|
-
<div id="history-content" style="display: none;">
|
|
87
|
-
|
|
88
|
-
<div class="table-responsive">
|
|
89
|
-
<table class="table table-striped table-hover">
|
|
90
|
-
<thead class="thead-branded">
|
|
91
|
-
<tr>
|
|
92
|
-
<th scope="col" style="width: 5%;">#</th>
|
|
93
|
-
<th scope="col">Fecha</th>
|
|
94
|
-
<th scope="col">Consulta</th>
|
|
95
|
-
<th scope="col" style="width: 5%;"></th>
|
|
96
|
-
</tr>
|
|
97
|
-
</thead>
|
|
98
|
-
<tbody id="history-table-body">
|
|
99
|
-
<!-- Los datos se cargarán aquí -->
|
|
100
|
-
</tbody>
|
|
101
|
-
</table>
|
|
102
|
-
</div>
|
|
103
|
-
</div>
|
|
104
|
-
</div>
|
|
105
|
-
<div class="modal-footer">
|
|
106
|
-
<button type="button" class="btn btn-branded-secondary" data-bs-dismiss="modal">
|
|
107
|
-
<i class="bi bi-x-circle me-1"></i>Cerrar
|
|
108
|
-
</button>
|
|
109
|
-
</div>
|
|
110
|
-
</div>
|
|
111
|
-
</div>
|
|
112
|
-
</div>
|
|
113
100
|
|
|
114
101
|
<!-- Modal de Onboarding -->
|
|
115
102
|
<div class="modal fade" id="onboardingModal" tabindex="-1" aria-labelledby="onboardingModalLabel" aria-hidden="true">
|
|
@@ -117,7 +104,7 @@
|
|
|
117
104
|
<div class="modal-content" style="border-radius:12px;">
|
|
118
105
|
<div class="modal-header">
|
|
119
106
|
<h5 class="modal-title w-100 text-center" id="onboardingModalLabel" style="color: var(--brand-primary-color, #FF5100);">
|
|
120
|
-
|
|
107
|
+
{{ branding.name }}
|
|
121
108
|
</h5>
|
|
122
109
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Cerrar"></button>
|
|
123
110
|
</div>
|
|
@@ -127,6 +114,7 @@
|
|
|
127
114
|
<div id="ob-icon" class="ob-icon"><i class="bi bi-lightbulb"></i></div>
|
|
128
115
|
<h6 id="ob-title" class="ob-title"></h6>
|
|
129
116
|
<div id="ob-text" class="ob-text"></div>
|
|
117
|
+
<div id="ob-example" class="ob-example"></div>
|
|
130
118
|
<div class="ob-nav">
|
|
131
119
|
<button id="ob-prev" class="ob-btn" aria-label="Anterior"><i class="bi bi-chevron-left"></i></button>
|
|
132
120
|
<div id="ob-dots" class="ob-dots"></div>
|
|
@@ -137,9 +125,61 @@
|
|
|
137
125
|
|
|
138
126
|
<div class="modal-footer">
|
|
139
127
|
<button id="ob-close" type="button" class="btn btn-branded-primary" data-bs-dismiss="modal">
|
|
140
|
-
|
|
128
|
+
{{ t('ui.buttons.cancel') }}
|
|
141
129
|
</button>
|
|
142
130
|
</div>
|
|
143
131
|
</div>
|
|
144
132
|
</div>
|
|
133
|
+
</div>
|
|
134
|
+
|
|
135
|
+
<!-- Modal de Guía de Uso / Ayuda -->
|
|
136
|
+
<div class="modal fade" id="helpModal" tabindex="-1" aria-labelledby="helpModalLabel" aria-hidden="true">
|
|
137
|
+
<div class="modal-dialog modal-lg modal-dialog-scrollable">
|
|
138
|
+
<div class="modal-content">
|
|
139
|
+
<div class="modal-header branded">
|
|
140
|
+
<h5 class="modal-title" id="helpModalLabel">
|
|
141
|
+
<i class="bi bi-info-circle me-2"></i>
|
|
142
|
+
{{ t('ui.modals.help_title') }}
|
|
143
|
+
</h5>
|
|
144
|
+
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
145
|
+
</div>
|
|
146
|
+
<div class="modal-body">
|
|
147
|
+
<!-- El acordeón con el contenido de ayuda se inyectará aquí dinámicamente -->
|
|
148
|
+
<div id="help-spinner" class="text-center p-5" style="display: none;">
|
|
149
|
+
<div class="spinner-border text-primary" role="status">
|
|
150
|
+
<span class="visually-hidden">Cargando...</span>
|
|
151
|
+
</div>
|
|
152
|
+
</div>
|
|
153
|
+
<div class="accordion" id="help-accordion-container">
|
|
154
|
+
<!-- Contenido generado por JS -->
|
|
155
|
+
</div>
|
|
156
|
+
</div>
|
|
157
|
+
<div class="modal-footer">
|
|
158
|
+
<button type="button" class="btn btn-branded-secondary"
|
|
159
|
+
data-bs-dismiss="modal">
|
|
160
|
+
{{ t('ui.buttons.cancel') }}
|
|
161
|
+
</button>
|
|
162
|
+
</div>
|
|
163
|
+
</div>
|
|
164
|
+
</div>
|
|
165
|
+
</div>
|
|
166
|
+
|
|
167
|
+
<!-- Modal para mostrar archivos cargados -->
|
|
168
|
+
<div class="modal fade" id="uploadedFilesModal" tabindex="-1" aria-labelledby="uploadedFilesModalLabel" aria-hidden="true">
|
|
169
|
+
<div class="modal-dialog">
|
|
170
|
+
<div class="modal-content">
|
|
171
|
+
<div class="modal-header branded">
|
|
172
|
+
<h5 class="modal-title" id="uploadedFilesModalLabel">Archivos Cargados</h5>
|
|
173
|
+
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
174
|
+
</div>
|
|
175
|
+
<div class="modal-body">
|
|
176
|
+
<ul id="uploaded-files-list" class="list-group">
|
|
177
|
+
<!-- Los nombres de los archivos se agregarán aquí por JS -->
|
|
178
|
+
</ul>
|
|
179
|
+
</div>
|
|
180
|
+
<div class="modal-footer">
|
|
181
|
+
<button type="button" class="btn btn-branded-secondary" data-bs-dismiss="modal">Cerrar</button>
|
|
182
|
+
</div>
|
|
183
|
+
</div>
|
|
184
|
+
</div>
|
|
145
185
|
</div>
|
iatoolkit/templates/error.html
CHANGED
|
@@ -1,23 +1,24 @@
|
|
|
1
1
|
{% extends "base.html" %}
|
|
2
2
|
|
|
3
|
-
{% block title %}Error
|
|
3
|
+
{% block title %}Error {% endblock %}
|
|
4
4
|
|
|
5
5
|
{% block styles %}
|
|
6
|
-
|
|
6
|
+
{# Carga las variables de CSS personalizadas de la empresa #}
|
|
7
|
+
{% if branding %}
|
|
7
8
|
<style>
|
|
8
9
|
{{ branding.css_variables | safe }}
|
|
9
10
|
</style>
|
|
10
|
-
|
|
11
|
+
{% endif %}
|
|
11
12
|
{# Enlace a los iconos de Bootstrap para el icono de error #}
|
|
12
13
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
|
|
13
14
|
{% endblock %}
|
|
14
15
|
|
|
15
16
|
{% block content %}
|
|
17
|
+
<div class="container mt-4">
|
|
16
18
|
|
|
17
|
-
{# 1. Incluimos el encabezado reutilizable de la empresa #}
|
|
18
19
|
{% include '_company_header.html' %}
|
|
19
20
|
|
|
20
|
-
{#
|
|
21
|
+
{# Contenedor principal para el mensaje de error #}
|
|
21
22
|
<div class="container mt-5">
|
|
22
23
|
<div class="row justify-content-center">
|
|
23
24
|
<div class="col-md-8 col-lg-6">
|
|
@@ -29,24 +30,22 @@
|
|
|
29
30
|
{# Icono de error grande y visible #}
|
|
30
31
|
<i class="bi bi-exclamation-triangle-fill text-danger" style="font-size: 4rem;"></i>
|
|
31
32
|
|
|
32
|
-
<
|
|
33
|
+
<h4 class="card-title mt-4">Ha Ocurrido un Error</h4>
|
|
34
|
+
<h5 class="card-title mt-4">Empresa: {{ company_short_name }} </h5>
|
|
33
35
|
|
|
34
36
|
{# El mensaje de error dinámico que se pasa desde la vista #}
|
|
35
37
|
<p class="text-muted mt-3 mb-4">
|
|
36
38
|
{{ message | default('Lo sentimos, algo salió mal. Por favor, inténtalo de nuevo más tarde.') }}
|
|
37
39
|
</p>
|
|
38
40
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
Volver al Inicio
|
|
41
|
+
<a href="javascript:history.back()"
|
|
42
|
+
class="btn btn-branded-primary px-4">
|
|
43
|
+
Volver
|
|
43
44
|
</a>
|
|
44
|
-
|
|
45
45
|
</div>
|
|
46
46
|
</div>
|
|
47
|
-
|
|
48
47
|
</div>
|
|
49
48
|
</div>
|
|
50
49
|
</div>
|
|
51
|
-
|
|
50
|
+
</div>
|
|
52
51
|
{% endblock %}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
{% extends "base.html" %}
|
|
2
2
|
|
|
3
|
-
{% block title %}
|
|
3
|
+
{% block title %}{{ t('ui.forgot_password.title') }} - {{ branding.name }}{% endblock %}
|
|
4
4
|
|
|
5
5
|
{% block styles %}
|
|
6
6
|
<style>{{ branding.css_variables | safe }}</style>
|
|
7
|
-
<link rel="stylesheet" href="{{ url_for('static', filename='styles/
|
|
7
|
+
<link rel="stylesheet" href="{{ url_for('static', filename='styles/chat_public.css') }}">
|
|
8
8
|
{% endblock %}
|
|
9
9
|
|
|
10
10
|
{% block content %}
|
|
11
|
+
<div class="container mt-4">
|
|
12
|
+
|
|
11
13
|
{% include '_company_header.html' %}
|
|
12
14
|
|
|
13
15
|
<!-- 3. Sección contenedora para centrar el contenido -->
|
|
@@ -16,26 +18,26 @@
|
|
|
16
18
|
<div class="row justify-content-center">
|
|
17
19
|
<div class="col-lg-6 col-md-8">
|
|
18
20
|
<div class="branded-form-container">
|
|
19
|
-
<h4 class="branded-form-title">
|
|
21
|
+
<h4 class="branded-form-title">{{ t('ui.forgot_password.title') }}</h4>
|
|
20
22
|
|
|
21
23
|
<p class="text-muted text-center mb-4">
|
|
22
|
-
|
|
24
|
+
{{ t('ui.forgot_password.subtitle') }}
|
|
23
25
|
</p>
|
|
24
26
|
|
|
25
27
|
<form action="{{ url_for('forgot_password', company_short_name=company_short_name) }}" method="post">
|
|
26
28
|
<div class="mb-3">
|
|
27
|
-
<label for="email" class="form-label text-secondary">
|
|
29
|
+
<label for="email" class="form-label text-secondary">{{ t('ui.signup.email_label') }}</label>
|
|
28
30
|
<input type="email" id="email" name="email"
|
|
29
31
|
class="form-control"
|
|
30
32
|
required value="{{ form_data.email if form_data else '' }}">
|
|
31
33
|
</div>
|
|
32
34
|
|
|
33
|
-
<button type="submit" class="btn btn-branded-primary w-100 fw-bold py-2 mt-3">
|
|
35
|
+
<button type="submit" class="btn btn-branded-primary w-100 fw-bold py-2 mt-3">{{ t('ui.forgot_password.submit_button') }}</button>
|
|
34
36
|
</form>
|
|
35
37
|
|
|
36
38
|
<div class="text-center mt-4 pt-3" style="border-top: 1px solid #e0e0e0;">
|
|
37
39
|
<a href="{{ url_for('home', company_short_name=company_short_name) }}" class="text-muted text-decoration-none fw-semibold">
|
|
38
|
-
<i class="bi bi-arrow-left me-1"></i>
|
|
40
|
+
<i class="bi bi-arrow-left me-1"></i>{{ t('ui.forgot_password.back_to_login') }}
|
|
39
41
|
</a>
|
|
40
42
|
</div>
|
|
41
43
|
</div>
|
|
@@ -43,4 +45,6 @@
|
|
|
43
45
|
</div>
|
|
44
46
|
</div>
|
|
45
47
|
</section>
|
|
48
|
+
</div>
|
|
49
|
+
|
|
46
50
|
{% endblock %}
|
iatoolkit/templates/index.html
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{% extends "base.html" %}
|
|
2
2
|
|
|
3
|
-
{% block title %}IAToolkit{% endblock %}
|
|
3
|
+
{% block title %}IAToolkit - Framework de IA{% endblock %}
|
|
4
4
|
|
|
5
5
|
{% block styles %}
|
|
6
6
|
{# Enlazamos la hoja de estilos del website y los iconos de Bootstrap #}
|
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
{% block content %}
|
|
13
|
+
<div class="container mt-4">
|
|
14
|
+
|
|
13
15
|
<!-- 1. Encabezado con una clase 100% propia y única -->
|
|
14
16
|
<header class="website-header container">
|
|
15
17
|
<span class="website-brand">IAToolkit</span>
|
|
@@ -29,12 +31,14 @@
|
|
|
29
31
|
<div class="col-lg-5">
|
|
30
32
|
<div class="border rounded-3 p-4 p-md-5 shadow-sm bg-light">
|
|
31
33
|
<h3 class="fw-bold text-center mb-3">Prueba la Plataforma</h3>
|
|
32
|
-
<p class="text-muted
|
|
33
|
-
|
|
34
|
+
<p class="text-muted mb-4">
|
|
35
|
+
Descubre nuestra demo interactiva, configurada con datos de una empresa de muestra. Explora las funcionalidades de la plataforma en un entorno práctico.<br>
|
|
34
36
|
</p>
|
|
35
37
|
<div class="d-grid">
|
|
36
38
|
{# Este botón usa la clase .btn-primary, que es estilizada por .hero-section .btn-primary en el CSS #}
|
|
37
39
|
<a href="{{ url_for('home', company_short_name='sample_company') }}"
|
|
40
|
+
target="_blank"
|
|
41
|
+
rel="noopener noreferrer"
|
|
38
42
|
class="btn btn-primary btn-lg fw-bold">
|
|
39
43
|
Acceder
|
|
40
44
|
</a>
|
|
@@ -137,4 +141,5 @@
|
|
|
137
141
|
© 2024 IAToolkit - Proyecto Open Source
|
|
138
142
|
</div>
|
|
139
143
|
</footer>
|
|
144
|
+
</div>
|
|
140
145
|
{% endblock %}
|