iatoolkit 0.63.1__py3-none-any.whl → 0.67.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.

Files changed (78) hide show
  1. iatoolkit/__init__.py +2 -0
  2. iatoolkit/base_company.py +1 -20
  3. iatoolkit/common/routes.py +11 -2
  4. iatoolkit/common/session_manager.py +2 -0
  5. iatoolkit/common/util.py +17 -0
  6. iatoolkit/company_registry.py +1 -2
  7. iatoolkit/iatoolkit.py +41 -5
  8. iatoolkit/locales/en.yaml +167 -0
  9. iatoolkit/locales/es.yaml +163 -0
  10. iatoolkit/repositories/database_manager.py +3 -3
  11. iatoolkit/repositories/document_repo.py +1 -1
  12. iatoolkit/repositories/models.py +2 -3
  13. iatoolkit/repositories/profile_repo.py +0 -4
  14. iatoolkit/services/auth_service.py +14 -9
  15. iatoolkit/services/branding_service.py +32 -22
  16. iatoolkit/services/configuration_service.py +140 -0
  17. iatoolkit/services/dispatcher_service.py +20 -18
  18. iatoolkit/services/document_service.py +5 -2
  19. iatoolkit/services/excel_service.py +15 -11
  20. iatoolkit/services/file_processor_service.py +4 -12
  21. iatoolkit/services/history_service.py +8 -7
  22. iatoolkit/services/i18n_service.py +104 -0
  23. iatoolkit/services/jwt_service.py +7 -9
  24. iatoolkit/services/language_service.py +79 -0
  25. iatoolkit/services/load_documents_service.py +4 -4
  26. iatoolkit/services/mail_service.py +9 -4
  27. iatoolkit/services/onboarding_service.py +10 -4
  28. iatoolkit/services/profile_service.py +58 -38
  29. iatoolkit/services/prompt_manager_service.py +20 -16
  30. iatoolkit/services/query_service.py +15 -14
  31. iatoolkit/services/sql_service.py +6 -2
  32. iatoolkit/services/user_feedback_service.py +16 -14
  33. iatoolkit/static/js/chat_feedback_button.js +57 -87
  34. iatoolkit/static/js/chat_help_content.js +124 -0
  35. iatoolkit/static/js/chat_history_button.js +48 -65
  36. iatoolkit/static/js/chat_main.js +27 -24
  37. iatoolkit/static/js/chat_reload_button.js +28 -45
  38. iatoolkit/static/styles/chat_iatoolkit.css +223 -315
  39. iatoolkit/static/styles/chat_modal.css +63 -97
  40. iatoolkit/static/styles/chat_public.css +107 -0
  41. iatoolkit/static/styles/landing_page.css +0 -1
  42. iatoolkit/templates/_company_header.html +6 -2
  43. iatoolkit/templates/_login_widget.html +42 -0
  44. iatoolkit/templates/base.html +34 -19
  45. iatoolkit/templates/change_password.html +22 -20
  46. iatoolkit/templates/chat.html +58 -27
  47. iatoolkit/templates/chat_modals.html +113 -74
  48. iatoolkit/templates/error.html +12 -13
  49. iatoolkit/templates/forgot_password.html +11 -7
  50. iatoolkit/templates/index.html +8 -3
  51. iatoolkit/templates/login_simulation.html +16 -5
  52. iatoolkit/templates/onboarding_shell.html +0 -1
  53. iatoolkit/templates/signup.html +14 -14
  54. iatoolkit/views/base_login_view.py +12 -1
  55. iatoolkit/views/change_password_view.py +49 -33
  56. iatoolkit/views/forgot_password_view.py +20 -19
  57. iatoolkit/views/help_content_api_view.py +54 -0
  58. iatoolkit/views/history_api_view.py +13 -9
  59. iatoolkit/views/home_view.py +30 -38
  60. iatoolkit/views/init_context_api_view.py +16 -11
  61. iatoolkit/views/llmquery_api_view.py +38 -26
  62. iatoolkit/views/login_simulation_view.py +14 -2
  63. iatoolkit/views/login_view.py +47 -35
  64. iatoolkit/views/logout_api_view.py +26 -22
  65. iatoolkit/views/profile_api_view.py +46 -0
  66. iatoolkit/views/prompt_api_view.py +6 -6
  67. iatoolkit/views/signup_view.py +26 -24
  68. iatoolkit/views/user_feedback_api_view.py +19 -18
  69. iatoolkit/views/verify_user_view.py +30 -29
  70. {iatoolkit-0.63.1.dist-info → iatoolkit-0.67.0.dist-info}/METADATA +40 -22
  71. iatoolkit-0.67.0.dist-info/RECORD +120 -0
  72. iatoolkit-0.67.0.dist-info/licenses/LICENSE +21 -0
  73. iatoolkit/static/styles/chat_info.css +0 -53
  74. iatoolkit/templates/header.html +0 -31
  75. iatoolkit/templates/test.html +0 -9
  76. iatoolkit-0.63.1.dist-info/RECORD +0 -112
  77. {iatoolkit-0.63.1.dist-info → iatoolkit-0.67.0.dist-info}/WHEEL +0 -0
  78. {iatoolkit-0.63.1.dist-info → iatoolkit-0.67.0.dist-info}/top_level.txt +0 -0
@@ -1,18 +1,16 @@
1
1
  {% extends "base.html" %}
2
2
 
3
- {% block title %}IAToolkit{% endblock %}
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="Historial con mis consultas" style="color: {{ branding.header_text_color }};">
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="Forzar Recarga de Contexto"
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" title="Tu feedback es muy importante" style="color: {{ branding.header_text_color }};">
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" title="Ver onboarding"
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" title="Cerrar sesión"
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
- style="overflow-y: auto;">
84
- <!-- Mensaje de bienvenida estático -->
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
- ¡Hola! en que te puedo ayudar hoy?
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" class="btn btn-light border dropdown-toggle w-100 text-start" data-bs-toggle="dropdown" aria-expanded="false">
106
- Prompts disponibles ....
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" id="clear-selection-button" class="btn clear-specific-data-button" style="display: none;"><i class="bi bi-x-circle-fill"></i></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" title="Usar Asistente de Prompts">
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" title="Adjuntar archivos">
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" title="Ver archivos adjuntos">
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="Escribe tu consulta aquí..." class="form-control chat-textarea" style="resize: none;" rows="1"></textarea>
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" title="Enviar">
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" title="Detener">
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/chat_main.js', _external=True) }}"></script>
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
 
@@ -1,37 +1,69 @@
1
- <!-- Modal para mostrar archivos cargados -->
2
- <div class="modal fade" id="uploadedFilesModal" tabindex="-1" aria-labelledby="uploadedFilesModalLabel" aria-hidden="true">
3
- <div class="modal-dialog">
4
- <div class="modal-content">
5
- <div class="modal-header branded">
6
- <h5 class="modal-title" id="uploadedFilesModalLabel">Archivos Cargados</h5>
7
- <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
8
- </div>
9
- <div class="modal-body">
10
- <ul id="uploaded-files-list" class="list-group">
11
- <!-- Los nombres de los archivos se agregarán aquí por JS -->
12
- </ul>
13
- </div>
14
- <div class="modal-footer">
15
- <button type="button" class="btn btn-branded-secondary" data-bs-dismiss="modal">Cerrar</button>
16
- </div>
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>Tu Opinión es Importante
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>¿Qué tan útil fue la respuesta del asistente?</strong></p>
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">Tu comentario nos ayuda a mejorar:</label>
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="Escribe aquí tu opinión, sugerencias o comentarios..."
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>Cancelar
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>Enviar
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
- Bienvenido a {{ branding.name }}
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>
@@ -137,9 +124,61 @@
137
124
 
138
125
  <div class="modal-footer">
139
126
  <button id="ob-close" type="button" class="btn btn-branded-primary" data-bs-dismiss="modal">
140
- Cerrar
127
+ {{ t('ui.buttons.cancel') }}
141
128
  </button>
142
129
  </div>
143
130
  </div>
144
131
  </div>
132
+ </div>
133
+
134
+ <!-- Modal de Guía de Uso / Ayuda -->
135
+ <div class="modal fade" id="helpModal" tabindex="-1" aria-labelledby="helpModalLabel" aria-hidden="true">
136
+ <div class="modal-dialog modal-lg modal-dialog-scrollable">
137
+ <div class="modal-content">
138
+ <div class="modal-header branded">
139
+ <h5 class="modal-title" id="helpModalLabel">
140
+ <i class="bi bi-info-circle me-2"></i>
141
+ {{ t('ui.modals.help_title') }}
142
+ </h5>
143
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
144
+ </div>
145
+ <div class="modal-body">
146
+ <!-- El acordeón con el contenido de ayuda se inyectará aquí dinámicamente -->
147
+ <div id="help-spinner" class="text-center p-5" style="display: none;">
148
+ <div class="spinner-border text-primary" role="status">
149
+ <span class="visually-hidden">Cargando...</span>
150
+ </div>
151
+ </div>
152
+ <div class="accordion" id="help-accordion-container">
153
+ <!-- Contenido generado por JS -->
154
+ </div>
155
+ </div>
156
+ <div class="modal-footer">
157
+ <button type="button" class="btn btn-branded-secondary"
158
+ data-bs-dismiss="modal">
159
+ {{ t('ui.buttons.cancel') }}
160
+ </button>
161
+ </div>
162
+ </div>
163
+ </div>
164
+ </div>
165
+
166
+ <!-- Modal para mostrar archivos cargados -->
167
+ <div class="modal fade" id="uploadedFilesModal" tabindex="-1" aria-labelledby="uploadedFilesModalLabel" aria-hidden="true">
168
+ <div class="modal-dialog">
169
+ <div class="modal-content">
170
+ <div class="modal-header branded">
171
+ <h5 class="modal-title" id="uploadedFilesModalLabel">Archivos Cargados</h5>
172
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
173
+ </div>
174
+ <div class="modal-body">
175
+ <ul id="uploaded-files-list" class="list-group">
176
+ <!-- Los nombres de los archivos se agregarán aquí por JS -->
177
+ </ul>
178
+ </div>
179
+ <div class="modal-footer">
180
+ <button type="button" class="btn btn-branded-secondary" data-bs-dismiss="modal">Cerrar</button>
181
+ </div>
182
+ </div>
183
+ </div>
145
184
  </div>
@@ -1,23 +1,24 @@
1
1
  {% extends "base.html" %}
2
2
 
3
- {% block title %}Error - {{ company.name }}{% endblock %}
3
+ {% block title %}Error {% endblock %}
4
4
 
5
5
  {% block styles %}
6
- {# Carga las variables de CSS y los estilos principales de la marca #}
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
- <link rel="stylesheet" href="{{ url_for('static', filename='styles/chat_iatoolkit.css') }}">
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
- {# 2. Contenedor principal para el mensaje de error #}
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
- <h2 class="card-title mt-4">Ha Ocurrido un Error</h2>
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
- {# Botón para volver a la página de inicio de la empresa #}
40
- <a href="{{ url_for('home', company_short_name=company_short_name) }}"
41
- class="btn btn-branded-primary px-4">
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 %}Recuperar Contraseña - {{ branding.name }}{% endblock %}
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/chat_iatoolkit.css') }}">
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">Recuperar Contraseña</h4>
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
- Ingresa tu correo electrónico y te enviaremos un enlace para restablecer tu contraseña.
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">Correo Electrónico</label>
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">Enviar Enlace</button>
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>Volver al inicio
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 %}
@@ -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 text-center mb-4">
33
- Encontraras una demo de IAToolkit con una empresa ficticia que te permitira probar la plataforma.
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
  &copy; 2024 IAToolkit - Proyecto Open Source
138
142
  </div>
139
143
  </footer>
144
+ </div>
140
145
  {% endblock %}