pg_reports 0.8.2 → 0.9.1

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.
@@ -2,11 +2,14 @@
2
2
 
3
3
  <div class="report-page">
4
4
  <nav class="breadcrumb">
5
- <%= link_to t("pg_reports.ui.navigation.dashboard"), root_path %>
6
- <span>/</span>
5
+ <%= link_to root_path, class: "breadcrumb-back", title: t("pg_reports.ui.navigation.back") do %>
6
+ <svg class="icon" aria-hidden="true"><use href="#i-arrow-left"></use></svg>
7
+ <span><%= t("pg_reports.ui.navigation.dashboard") %></span>
8
+ <% end %>
9
+ <span class="breadcrumb-sep">/</span>
7
10
  <span><%= @categories[@category][:name] %></span>
8
- <span>/</span>
9
- <span><%= @report_info[:name] %></span>
11
+ <span class="breadcrumb-sep">/</span>
12
+ <span class="breadcrumb-current"><%= @report_info[:name] %></span>
10
13
 
11
14
  <span class="breadcrumb-spacer"></span>
12
15
  <%= render "target_selector" %>
@@ -35,7 +38,7 @@
35
38
  <a href="#" onclick="downloadReport('json'); return false;"><%= t("pg_reports.ui.actions.download_json") %></a>
36
39
  <% if @documentation && @documentation[:ai_prompt].present? %>
37
40
  <div class="dropdown-divider"></div>
38
- <a href="#" id="ai-prompt-btn" onclick="copyAiPrompt(this); return false;"><span class="ai-icon">AI</span> <%= t("pg_reports.ui.actions.copy_ai_prompt") %></a>
41
+ <a href="#" id="ai-prompt-btn" onclick="copyAiPrompt(this); return false;"><span class="ai-icon">AI</span><%= t("pg_reports.ui.actions.copy_ai_prompt") %></a>
39
42
  <% end %>
40
43
  </div>
41
44
  </div>
@@ -45,10 +48,9 @@
45
48
  <%= t("pg_reports.ui.actions.send_telegram") %>
46
49
  </button>
47
50
  <% end %>
48
- <button class="btn btn-icon" onclick="showIdeSettingsModal()" title="<%= t("pg_reports.ui.actions.ide_settings_button_title") %>">
49
- ⚙️
51
+ <button type="button" class="btn-icon" onclick="showSettingsModal()" title="<%= t("pg_reports.ui.actions.settings_button_title") %>" aria-label="<%= t("pg_reports.ui.actions.settings_button_title") %>">
52
+ <svg class="icon icon-lg"><use href="#i-settings"></use></svg>
50
53
  </button>
51
- <%= link_to t("pg_reports.ui.navigation.back"), root_path, class: "btn btn-secondary" %>
52
54
  </div>
53
55
  </div>
54
56
 
@@ -63,7 +65,7 @@
63
65
  <% if @documentation && @documentation[:what].present? %>
64
66
  <details class="documentation-section">
65
67
  <summary class="documentation-toggle">
66
- <span class="toggle-icon">▶</span>
68
+ <svg class="icon toggle-icon" aria-hidden="true"><use href="#i-chevron-right"></use></svg>
67
69
  <span><%= t("pg_reports.ui.documentation.toggle_title") %></span>
68
70
  </summary>
69
71
  <div class="documentation-content">
@@ -118,7 +120,7 @@
118
120
  <div class="filter-section">
119
121
  <details class="filter-details">
120
122
  <summary class="filter-toggle">
121
- <span class="toggle-icon">▶</span>
123
+ <svg class="icon toggle-icon" aria-hidden="true"><use href="#i-chevron-right"></use></svg>
122
124
  <span><%= t("pg_reports.ui.filters.title") %></span>
123
125
  </summary>
124
126
  <div class="filter-content">
@@ -176,7 +178,7 @@
176
178
  </div>
177
179
 
178
180
  <div id="empty-state" class="empty-state" style="display: none;">
179
- <div class="empty-state-icon">✓</div>
181
+ <svg class="icon empty-state-icon" aria-hidden="true"><use href="#i-check"></use></svg>
180
182
  <p><%= t("pg_reports.ui.results.empty_message") %></p>
181
183
  </div>
182
184
 
@@ -23,6 +23,29 @@
23
23
  ],
24
24
  "note": "Reviewed & accepted: user-query execution feature (execute_query count). Gated by config.allow_raw_query_execution; the query is fetched by hash from an internal registry (retrieve_query_by_hash), parameters are validated/substituted, and SecurityError checks reject dangerous input. Not arbitrary attacker-controlled SQL."
25
25
  },
26
+ {
27
+ "warning_type": "SQL Injection",
28
+ "warning_code": 0,
29
+ "fingerprint": "52294539b2a9666f9a79f7ad52cdd1dc531a3b71e487e5134174029cd5138571",
30
+ "check_name": "SQL",
31
+ "message": "Possible SQL injection",
32
+ "file": "app/controllers/pg_reports/dashboard_controller.rb",
33
+ "line": 440,
34
+ "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
35
+ "code": "ActiveRecord::Base.connection.execute(\"SELECT COUNT(*) FROM (#{params[:query].to_s}) AS count_query\")",
36
+ "render_path": null,
37
+ "location": {
38
+ "type": "method",
39
+ "class": "PgReports::DashboardController",
40
+ "method": "run_query"
41
+ },
42
+ "user_input": "params[:query]",
43
+ "confidence": "High",
44
+ "cwe_id": [
45
+ 89
46
+ ],
47
+ "note": "Reviewed & accepted: SQL Console (run_query count). Gated by config.allow_raw_query_execution; the client-typed query passes enforce_select_only! (SELECT-only, no semicolons, keyword denylist) and runs under a bounded statement_timeout. Intentional DBA tooling; same risk profile as execute_query/explain_analyze."
48
+ },
26
49
  {
27
50
  "warning_type": "Cross-Site Request Forgery",
28
51
  "warning_code": 7,
@@ -69,6 +92,6 @@
69
92
  "note": "Reviewed & accepted: EXPLAIN ANALYZE feature. Same safeguards as execute_query - query resolved by hash from internal registry, params validated, SecurityError guards. Intentional DBA tooling."
70
93
  }
71
94
  ],
72
- "updated": "2026-07-04 20:27:49 +0300",
95
+ "updated": "2026-07-10 19:15:00 +0300",
73
96
  "brakeman_version": "8.0.5"
74
97
  }
@@ -589,9 +589,12 @@ en:
589
589
  title: "PgReports"
590
590
  subtitle: "PostgreSQL Analysis Dashboard"
591
591
  page_title: "PgReports Dashboard"
592
+ language:
593
+ label: "Language"
594
+ name: "English"
592
595
  navigation:
593
596
  dashboard: "Dashboard"
594
- back: "Back"
597
+ back: "Back"
595
598
  database_selector:
596
599
  label: "Database"
597
600
  target_selector:
@@ -599,40 +602,41 @@ en:
599
602
  actions:
600
603
  cancel: "Cancel"
601
604
  retry: "Retry"
602
- copy: "📋 Copy"
603
- copy_query: "📋 Copy Query"
604
- copy_code: "📋 Copy Code"
605
+ copy: "Copy"
606
+ copy_query: "Copy Query"
607
+ copy_code: "Copy Code"
605
608
  copy_to_clipboard_title: "Copy to clipboard"
606
- copied_feedback: "Copied!"
609
+ copied_feedback: "Copied!"
607
610
  clear_all: "Clear All"
608
- run_report: "Run Report"
609
- export: "Export"
610
- download_text: "📄 Text (.txt)"
611
- download_csv: "📊 CSV (.csv)"
612
- download_json: "📋 JSON (.json)"
613
- download: "📥 Download"
611
+ run_report: "Run Report"
612
+ export: "Export"
613
+ download_text: "Text (.txt)"
614
+ download_csv: "CSV (.csv)"
615
+ download_json: "JSON (.json)"
616
+ download: "Download"
614
617
  copy_ai_prompt: "Copy Prompt"
615
- send_telegram: "📨 Telegram"
618
+ send_telegram: "Telegram"
616
619
  sending: "Sending..."
617
- reset_statistics: "🗑️ Reset Statistics"
620
+ reset_statistics: "Reset Statistics"
618
621
  resetting: "Resetting..."
619
622
  confirm_reset: "Yes, Reset"
620
- create_extension: "Create Extension"
623
+ create_extension: "Create Extension"
621
624
  creating: "Creating..."
622
- ide_settings_button_title: "IDE Settings"
623
- explain_analyze: "📊 EXPLAIN ANALYZE"
624
- execute_query: "Execute Query"
625
+ settings_button_title: "Settings"
626
+ explain_analyze: "EXPLAIN ANALYZE"
627
+ execute_query: "Execute Query"
625
628
  run_query: "SQL Console"
626
- create_migration_file: "📁 Create File & Open in IDE"
627
- start_monitoring: "Start Monitoring"
628
- stop_monitoring: "Stop Monitoring"
629
+ create_migration_file: "Create File & Open in IDE"
630
+ start_monitoring: "Start Monitoring"
631
+ stop_monitoring: "Stop Monitoring"
629
632
  starting: "Starting..."
630
633
  stopping: "Stopping..."
631
- load_history: "📜 Load History (50)"
634
+ load_history: "Load History"
635
+ load_history_unavailable_title: "No stored history — set config.query_monitor_log_file to keep captured queries across restarts"
632
636
  loading: "Loading..."
633
637
  running: "Running..."
634
- save_for_comparison: "📌 Save for Comparison"
635
- saved_marker: "📌 Saved"
638
+ save_for_comparison: "Save for Comparison"
639
+ saved_marker: "Saved"
636
640
  status:
637
641
  pg_stat_ready: "Active"
638
642
  not_preloaded: "Preload required"
@@ -650,25 +654,26 @@ en:
650
654
  create_extension_title: "Create pg_stat_statements extension"
651
655
  create_extension_intro: "The pg_stat_statements extension isn't created in this database yet. Click below to create it:"
652
656
  create_extension_note: "If the library isn't preloaded, you'll also need to add it to shared_preload_libraries and restart PostgreSQL."
653
- reset_stats_title: "⚠️ Reset Statistics"
657
+ reset_stats_title: "Reset Statistics"
654
658
  reset_stats_confirm: "Are you sure you want to reset pg_stat_statements statistics?"
655
659
  reset_stats_warning: "This action will clear all collected query statistics and cannot be undone."
656
- ide_settings_title: "⚙️ IDE Settings"
657
- problem_detected_title: "⚠️ Problem Detected"
658
- query_analyzer_title: "📊 Query Analyzer"
660
+ settings_title: "Settings"
661
+ problem_detected_title: "Problem Detected"
662
+ query_analyzer_title: "Query Analyzer"
659
663
  query_label: "Query:"
660
664
  parameters_label: "Parameters:"
661
- migration_title: "🗑️ Drop Index Migration"
665
+ migration_title: "Drop Index Migration"
662
666
  migration_subtitle: "Generated migration to remove the index:"
663
667
  migration_warning: "Creating a migration will generate a migration file in your project. Running this migration will drop the index from the database, which may significantly impact application performance."
664
668
  migration_warning_dev_only: "This operation should only be performed in a local development environment."
665
- query_execution_disabled_title: "⚠️ Query execution is disabled"
669
+ query_execution_disabled_title: "Query execution is disabled"
670
+ migration_disabled_title: "Migration creation is disabled"
666
671
  query_execution_disabled_intro: "To enable this feature, add to your configuration:"
667
672
  query_execution_disabled_env_note: "...or set the following environment variable instead:"
668
673
  run_query_title: "SQL Console"
669
674
  run_query_placeholder: "SELECT * FROM users LIMIT 10;"
670
675
  settings:
671
- default_ide_label: "Default IDE for source links:"
676
+ default_ide_label: "Default IDE for source links"
672
677
  ide_show_menu: "Show menu (default)"
673
678
  ide_vscode_wsl: "VS Code (WSL)"
674
679
  ide_vscode: "VS Code"
@@ -705,25 +710,27 @@ en:
705
710
  waiting_for_locks: "waiting for locks"
706
711
  percent_used_suffix: "% used"
707
712
  categories:
708
- requires_pg_stat: "🔒 Requires pg_stat_statements"
713
+ requires_pg_stat: "Requires pg_stat_statements"
714
+ pg_stat_missing_reason: "Requires pg_stat_statements, which is not installed on \"%{database}\". Create the extension there, or switch to a database that has it."
715
+ pg_stat_not_preloaded_reason: "Requires pg_stat_statements. The extension exists on \"%{database}\" but is not in shared_preload_libraries, so it returns no data until PostgreSQL is restarted with it preloaded."
709
716
  reports_count_suffix: "reports"
710
- primary_only_reason: "🔒 This category only runs on the primary database — it inspects the host application's models. Switch back to the default database to use it."
711
- standalone_no_host_app_reason: "🔒 Not available in standalone mode — this category inspects the host application's models, and there is no host app when running the dashboard on its own."
717
+ primary_only_reason: "This category only runs on the primary database — it inspects the host application's models. Switch back to the default database to use it."
718
+ standalone_no_host_app_reason: "Not available in standalone mode — this category inspects the host application's models, and there is no host app when running the dashboard on its own."
712
719
  documentation:
713
- toggle_title: "📖 What does this report show?"
714
- what_section: "📋 What"
715
- why_section: "Why It Matters"
716
- nuances_section: "⚠️ Nuances"
717
- thresholds_section: "📊 Thresholds"
718
- threshold_warning_label: "⚠️ Warning:"
719
- threshold_critical_label: "🔴 Critical:"
720
+ toggle_title: "What does this report show?"
721
+ what_section: "What"
722
+ why_section: "Why It Matters"
723
+ nuances_section: "Nuances"
724
+ thresholds_section: "Thresholds"
725
+ threshold_warning_label: "Warning:"
726
+ threshold_critical_label: "Critical:"
720
727
  threshold_inverted_note: "(lower is worse)"
721
728
  filters:
722
- title: "🔍 Filter Parameters"
729
+ title: "Filter Parameters"
723
730
  current_value: "current"
724
731
  saved:
725
- title: "📌 Saved for Comparison"
726
- saved_at_prefix: "Saved:"
732
+ title: "Saved for Comparison"
733
+ saved_at_prefix: "Saved:"
727
734
  click_to_expand: "Click to expand"
728
735
  confirm_clear_all: "Remove all saved records for this report?"
729
736
  remove_title: "Remove"
@@ -737,9 +744,9 @@ en:
737
744
  execution_time_label: "Execution time:"
738
745
  null_placeholder: "<null>"
739
746
  sections:
740
- recommendation: "💡 Recommendation"
741
- detected_issues: "⚠️ Detected Issues"
742
- execution_plan: "📊 Execution Plan"
747
+ recommendation: "Recommendation"
748
+ detected_issues: "Detected Issues"
749
+ execution_plan: "Execution Plan"
743
750
  line_label: "Line"
744
751
  current_label: "Current:"
745
752
  threshold_label: "Threshold:"
@@ -747,8 +754,8 @@ en:
747
754
  warning_eq: "warning"
748
755
  critical_eq: "critical"
749
756
  levels:
750
- critical: "🔴 Critical"
751
- warning: "⚠️ Warning"
757
+ critical: "Critical"
758
+ warning: "Warning"
752
759
  errors:
753
760
  error_prefix: "Error:"
754
761
  unable_fetch_metrics: "Unable to fetch database statistics."
@@ -776,8 +783,9 @@ en:
776
783
  run_query_failed: "Failed to run query"
777
784
  query_required: "Please enter a query"
778
785
  create_migration_failed: "Failed to create migration"
779
- explain_disabled_toast: "⚠️ EXPLAIN ANALYZE is disabled. Enable in configuration: config.allow_raw_query_execution = true"
780
- execute_disabled_toast: "⚠️ Query execution is disabled. Enable in configuration: config.allow_raw_query_execution = true"
786
+ explain_disabled_toast: "EXPLAIN ANALYZE is disabled. Enable in configuration: config.allow_raw_query_execution = true"
787
+ execute_disabled_toast: "Query execution is disabled. Enable in configuration: config.allow_raw_query_execution = true"
788
+ migration_disabled_toast: "Migration creation is disabled. Enable in configuration: config.allow_raw_query_execution = true"
781
789
  query_monitoring_error: "Query monitoring error"
782
790
  query_hash_required: "Query hash is required"
783
791
  query_execution_disabled: "Query execution from dashboard is disabled. Enable it in configuration with 'config.allow_raw_query_execution = true'"
@@ -554,9 +554,12 @@ ru:
554
554
  title: "PgReports"
555
555
  subtitle: "Дашборд анализа PostgreSQL"
556
556
  page_title: "PgReports — Дашборд"
557
+ language:
558
+ label: "Язык"
559
+ name: "Русский"
557
560
  navigation:
558
561
  dashboard: "Дашборд"
559
- back: "Назад"
562
+ back: "Назад"
560
563
  database_selector:
561
564
  label: "База данных"
562
565
  target_selector:
@@ -564,40 +567,41 @@ ru:
564
567
  actions:
565
568
  cancel: "Отмена"
566
569
  retry: "Повторить"
567
- copy: "📋 Копировать"
568
- copy_query: "📋 Копировать запрос"
569
- copy_code: "📋 Копировать код"
570
+ copy: "Копировать"
571
+ copy_query: "Копировать запрос"
572
+ copy_code: "Копировать код"
570
573
  copy_to_clipboard_title: "Скопировать в буфер обмена"
571
- copied_feedback: "Скопировано!"
574
+ copied_feedback: "Скопировано!"
572
575
  clear_all: "Очистить всё"
573
- run_report: "Запустить отчёт"
574
- export: "Экспорт"
575
- download_text: "📄 Текст (.txt)"
576
- download_csv: "📊 CSV (.csv)"
577
- download_json: "📋 JSON (.json)"
578
- download: "📥 Скачать"
576
+ run_report: "Запустить отчёт"
577
+ export: "Экспорт"
578
+ download_text: "Текст (.txt)"
579
+ download_csv: "CSV (.csv)"
580
+ download_json: "JSON (.json)"
581
+ download: "Скачать"
579
582
  copy_ai_prompt: "Копировать промпт"
580
- send_telegram: "📨 Telegram"
583
+ send_telegram: "Telegram"
581
584
  sending: "Отправка..."
582
- reset_statistics: "🗑️ Сбросить статистику"
585
+ reset_statistics: "Сбросить статистику"
583
586
  resetting: "Сброс..."
584
587
  confirm_reset: "Да, сбросить"
585
- create_extension: "Создать расширение"
588
+ create_extension: "Создать расширение"
586
589
  creating: "Создание..."
587
- ide_settings_button_title: "Настройки IDE"
588
- explain_analyze: "📊 EXPLAIN ANALYZE"
589
- execute_query: "Выполнить запрос"
590
+ settings_button_title: "Настройки"
591
+ explain_analyze: "EXPLAIN ANALYZE"
592
+ execute_query: "Выполнить запрос"
590
593
  run_query: "SQL-консоль"
591
- create_migration_file: "📁 Создать файл и открыть в IDE"
592
- start_monitoring: "Запустить мониторинг"
593
- stop_monitoring: "Остановить мониторинг"
594
+ create_migration_file: "Создать файл и открыть в IDE"
595
+ start_monitoring: "Запустить мониторинг"
596
+ stop_monitoring: "Остановить мониторинг"
594
597
  starting: "Запуск..."
595
598
  stopping: "Остановка..."
596
- load_history: "📜 Загрузить историю (50)"
599
+ load_history: "Загрузить историю"
600
+ load_history_unavailable_title: "Сохранённой истории нет — задайте config.query_monitor_log_file, чтобы запросы сохранялись между перезапусками"
597
601
  loading: "Загрузка..."
598
602
  running: "Выполнение..."
599
- save_for_comparison: "📌 Сохранить для сравнения"
600
- saved_marker: "📌 Сохранено"
603
+ save_for_comparison: "Сохранить для сравнения"
604
+ saved_marker: "Сохранено"
601
605
  status:
602
606
  pg_stat_ready: "Активно"
603
607
  not_preloaded: "Требуется предзагрузка"
@@ -615,25 +619,26 @@ ru:
615
619
  create_extension_title: "Создание расширения pg_stat_statements"
616
620
  create_extension_intro: "Расширение pg_stat_statements ещё не создано в этой базе данных. Нажмите, чтобы создать его:"
617
621
  create_extension_note: "Если библиотека не предзагружена, её также нужно добавить в shared_preload_libraries и перезапустить PostgreSQL."
618
- reset_stats_title: "⚠️ Сброс статистики"
622
+ reset_stats_title: "Сброс статистики"
619
623
  reset_stats_confirm: "Вы уверены, что хотите сбросить статистику pg_stat_statements?"
620
624
  reset_stats_warning: "Это действие очистит всю собранную статистику запросов и не может быть отменено."
621
- ide_settings_title: "⚙️ Настройки IDE"
622
- problem_detected_title: "⚠️ Обнаружена проблема"
623
- query_analyzer_title: "📊 Анализатор запроса"
625
+ settings_title: "Настройки"
626
+ problem_detected_title: "Обнаружена проблема"
627
+ query_analyzer_title: "Анализатор запроса"
624
628
  query_label: "Запрос:"
625
629
  parameters_label: "Параметры:"
626
- migration_title: "🗑️ Миграция удаления индекса"
630
+ migration_title: "Миграция удаления индекса"
627
631
  migration_subtitle: "Сгенерированная миграция для удаления индекса:"
628
632
  migration_warning: "Создание миграции сгенерирует файл миграции в вашем проекте. Запуск этой миграции удалит индекс из БД, что может значительно повлиять на производительность приложения."
629
633
  migration_warning_dev_only: "Эту операцию следует выполнять только в локальном dev-окружении."
630
- query_execution_disabled_title: "⚠️ Выполнение запросов отключено"
634
+ query_execution_disabled_title: "Выполнение запросов отключено"
635
+ migration_disabled_title: "Создание миграций отключено"
631
636
  query_execution_disabled_intro: "Чтобы включить эту функцию, добавьте в конфигурацию:"
632
637
  query_execution_disabled_env_note: "...или вместо этого установите переменную окружения:"
633
638
  run_query_title: "SQL-консоль"
634
639
  run_query_placeholder: "SELECT * FROM users LIMIT 10;"
635
640
  settings:
636
- default_ide_label: "IDE по умолчанию для ссылок на исходники:"
641
+ default_ide_label: "IDE по умолчанию для ссылок на исходники"
637
642
  ide_show_menu: "Показывать меню (по умолчанию)"
638
643
  ide_vscode_wsl: "VS Code (WSL)"
639
644
  ide_vscode: "VS Code"
@@ -670,25 +675,27 @@ ru:
670
675
  waiting_for_locks: "ждут блокировок"
671
676
  percent_used_suffix: "% использовано"
672
677
  categories:
673
- requires_pg_stat: "🔒 Требуется pg_stat_statements"
678
+ requires_pg_stat: "Требуется pg_stat_statements"
679
+ pg_stat_missing_reason: "Требуется pg_stat_statements, но расширение не установлено в базе «%{database}». Создайте его там или переключитесь на базу, где оно есть."
680
+ pg_stat_not_preloaded_reason: "Требуется pg_stat_statements. Расширение есть в базе «%{database}», но отсутствует в shared_preload_libraries — данных не будет, пока PostgreSQL не перезапустят с ним."
674
681
  reports_count_suffix: "отчётов"
675
- primary_only_reason: "🔒 Эта категория работает только на первичной базе — она проверяет модели хост-приложения. Чтобы пользоваться, переключитесь обратно на базу по умолчанию."
676
- standalone_no_host_app_reason: "🔒 Недоступно в автономном режиме — эта категория проверяет модели хост-приложения, а при самостоятельном запуске дашборда хост-приложения нет."
682
+ primary_only_reason: "Эта категория работает только на первичной базе — она проверяет модели хост-приложения. Чтобы пользоваться, переключитесь обратно на базу по умолчанию."
683
+ standalone_no_host_app_reason: "Недоступно в автономном режиме — эта категория проверяет модели хост-приложения, а при самостоятельном запуске дашборда хост-приложения нет."
677
684
  documentation:
678
- toggle_title: "📖 Что показывает этот отчёт?"
679
- what_section: "📋 Что"
680
- why_section: "Почему это важно"
681
- nuances_section: "⚠️ Нюансы"
682
- thresholds_section: "📊 Пороги"
683
- threshold_warning_label: "⚠️ Warning:"
684
- threshold_critical_label: "🔴 Critical:"
685
+ toggle_title: "Что показывает этот отчёт?"
686
+ what_section: "Что"
687
+ why_section: "Почему это важно"
688
+ nuances_section: "Нюансы"
689
+ thresholds_section: "Пороги"
690
+ threshold_warning_label: "Warning:"
691
+ threshold_critical_label: "Critical:"
685
692
  threshold_inverted_note: "(меньше — хуже)"
686
693
  filters:
687
- title: "🔍 Параметры фильтрации"
694
+ title: "Параметры фильтрации"
688
695
  current_value: "сейчас"
689
696
  saved:
690
- title: "📌 Сохранено для сравнения"
691
- saved_at_prefix: "Сохранено:"
697
+ title: "Сохранено для сравнения"
698
+ saved_at_prefix: "Сохранено:"
692
699
  click_to_expand: "Нажмите, чтобы развернуть"
693
700
  confirm_clear_all: "Удалить все сохранённые записи для этого отчёта?"
694
701
  remove_title: "Удалить"
@@ -702,9 +709,9 @@ ru:
702
709
  execution_time_label: "Время выполнения:"
703
710
  null_placeholder: "<null>"
704
711
  sections:
705
- recommendation: "💡 Рекомендация"
706
- detected_issues: "⚠️ Обнаруженные проблемы"
707
- execution_plan: "📊 План выполнения"
712
+ recommendation: "Рекомендация"
713
+ detected_issues: "Обнаруженные проблемы"
714
+ execution_plan: "План выполнения"
708
715
  line_label: "Строка"
709
716
  current_label: "Текущее:"
710
717
  threshold_label: "Порог:"
@@ -712,8 +719,8 @@ ru:
712
719
  warning_eq: "warning"
713
720
  critical_eq: "critical"
714
721
  levels:
715
- critical: "🔴 Критично"
716
- warning: "⚠️ Внимание"
722
+ critical: "Критично"
723
+ warning: "Внимание"
717
724
  errors:
718
725
  error_prefix: "Ошибка:"
719
726
  unable_fetch_metrics: "Не удалось получить статистику БД."
@@ -741,8 +748,9 @@ ru:
741
748
  run_query_failed: "Не удалось выполнить запрос"
742
749
  query_required: "Введите запрос"
743
750
  create_migration_failed: "Не удалось создать миграцию"
744
- explain_disabled_toast: "⚠️ EXPLAIN ANALYZE отключен. Включите в конфигурации: config.allow_raw_query_execution = true"
745
- execute_disabled_toast: "⚠️ Выполнение запросов отключено. Включите в конфигурации: config.allow_raw_query_execution = true"
751
+ explain_disabled_toast: "EXPLAIN ANALYZE отключен. Включите в конфигурации: config.allow_raw_query_execution = true"
752
+ execute_disabled_toast: "Выполнение запросов отключено. Включите в конфигурации: config.allow_raw_query_execution = true"
753
+ migration_disabled_toast: "Создание миграций отключено. Включите в конфигурации: config.allow_raw_query_execution = true"
746
754
  query_monitoring_error: "Ошибка мониторинга запросов"
747
755
  query_hash_required: "Требуется хэш запроса"
748
756
  query_execution_disabled: "Выполнение запросов из дашборда отключено. Включите в конфигурации: 'config.allow_raw_query_execution = true'"