Merge pull request #688 from christianlouis/copilot/localize-admin-files-page
feat(i18n): localize admin files page
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}File Manager – Admin{% endblock %}
|
||||
{% block title %}{{ _("admin_files.page_title") }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container mx-auto px-4 py-8">
|
||||
@@ -8,9 +8,9 @@
|
||||
<div class="mb-6 flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3">
|
||||
<div>
|
||||
<h1 class="text-3xl font-bold text-gray-900 flex items-center gap-2">
|
||||
<i class="fas fa-folder-open text-blue-500"></i>
|
||||
File Manager
|
||||
<span class="text-xs font-semibold text-red-600 bg-red-50 border border-red-200 rounded px-2 py-0.5 ml-1">Admin Only</span>
|
||||
<i class="fas fa-folder-open text-blue-500" aria-hidden="true"></i>
|
||||
{{ _("admin_files.heading") }}
|
||||
<span class="text-xs font-semibold text-red-600 bg-red-50 border border-red-200 rounded px-2 py-0.5 ml-1">{{ _("admin_files.admin_only_badge") }}</span>
|
||||
</h1>
|
||||
<p class="text-gray-400 text-sm mt-1">
|
||||
<code class="bg-gray-100 rounded px-1 text-xs">{{ workdir }}</code>
|
||||
@@ -19,15 +19,15 @@
|
||||
<!-- Summary badges -->
|
||||
<div class="flex gap-3 text-sm flex-wrap">
|
||||
<span class="inline-flex items-center gap-1.5 bg-blue-50 border border-blue-200 text-blue-700 rounded-full px-3 py-1">
|
||||
<i class="fas fa-hdd text-xs"></i>
|
||||
{% if total_disk is none %}…{% else %}{{ total_disk }}{% endif %} on disk
|
||||
<i class="fas fa-hdd text-xs" aria-hidden="true"></i>
|
||||
{% if total_disk is none %}…{% else %}{{ total_disk }}{% endif %} {{ _("admin_files.badge_on_disk") }}
|
||||
</span>
|
||||
<span class="inline-flex items-center gap-1.5 bg-green-50 border border-green-200 text-green-700 rounded-full px-3 py-1">
|
||||
<i class="fas fa-database text-xs"></i> {{ total_db }} in DB
|
||||
<i class="fas fa-database text-xs" aria-hidden="true"></i> {{ total_db }} {{ _("admin_files.badge_in_db") }}
|
||||
</span>
|
||||
{% if total_disk is not none and total_disk != total_db %}
|
||||
<span class="inline-flex items-center gap-1.5 bg-amber-50 border border-amber-300 text-amber-700 rounded-full px-3 py-1 font-medium">
|
||||
<i class="fas fa-triangle-exclamation text-xs"></i> Delta detected
|
||||
<i class="fas fa-triangle-exclamation text-xs" aria-hidden="true"></i> {{ _("admin_files.badge_delta_detected") }}
|
||||
</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
@@ -38,17 +38,17 @@
|
||||
<a href="?view=filesystem"
|
||||
class="tab-link px-5 py-2.5 text-sm font-medium rounded-t border-b-2 transition
|
||||
{% if view == 'filesystem' %}border-blue-600 text-blue-600 bg-blue-50{% else %}border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300{% endif %}">
|
||||
<i class="fas fa-folder-tree mr-1.5"></i>Filesystem
|
||||
<i class="fas fa-folder-tree mr-1.5" aria-hidden="true"></i>{{ _("admin_files.tab_filesystem") }}
|
||||
</a>
|
||||
<a href="?view=database"
|
||||
class="tab-link px-5 py-2.5 text-sm font-medium rounded-t border-b-2 transition
|
||||
{% if view == 'database' %}border-green-600 text-green-600 bg-green-50{% else %}border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300{% endif %}">
|
||||
<i class="fas fa-database mr-1.5"></i>Database Records
|
||||
<i class="fas fa-database mr-1.5" aria-hidden="true"></i>{{ _("admin_files.tab_database") }}
|
||||
</a>
|
||||
<a href="?view=reconcile"
|
||||
class="tab-link px-5 py-2.5 text-sm font-medium rounded-t border-b-2 transition
|
||||
{% if view == 'reconcile' %}border-amber-500 text-amber-600 bg-amber-50{% else %}border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300{% endif %}">
|
||||
<i class="fas fa-code-compare mr-1.5"></i>Reconcile
|
||||
<i class="fas fa-code-compare mr-1.5" aria-hidden="true"></i>{{ _("admin_files.tab_reconcile") }}
|
||||
{% if total_disk != total_db %}
|
||||
<span class="ml-1 bg-amber-500 text-white rounded-full text-xs px-1.5 py-0.5">!</span>
|
||||
{% endif %}
|
||||
@@ -62,21 +62,21 @@
|
||||
|
||||
<!-- Legend -->
|
||||
<div class="flex flex-wrap gap-4 text-xs text-gray-500 mb-4">
|
||||
<span class="flex items-center gap-1"><span class="h-2.5 w-2.5 rounded-full bg-green-400 inline-block"></span> Found in DB</span>
|
||||
<span class="flex items-center gap-1"><span class="h-2.5 w-2.5 rounded-full bg-amber-400 inline-block"></span> Not in DB (orphan)</span>
|
||||
<span class="flex items-center gap-1"><span class="h-2.5 w-2.5 rounded-full bg-green-400 inline-block"></span> {{ _("admin_files.legend_found_in_db") }}</span>
|
||||
<span class="flex items-center gap-1"><span class="h-2.5 w-2.5 rounded-full bg-amber-400 inline-block"></span> {{ _("admin_files.legend_not_in_db") }}</span>
|
||||
</div>
|
||||
|
||||
<!-- Breadcrumb -->
|
||||
<nav class="flex mb-4 text-sm" aria-label="Breadcrumb">
|
||||
<nav class="flex mb-4 text-sm" aria-label="{{ _("admin_files.aria_breadcrumb") }}">
|
||||
<ol class="inline-flex items-center space-x-1 flex-wrap">
|
||||
<li>
|
||||
<a href="?view=filesystem" class="text-blue-600 hover:underline flex items-center gap-1">
|
||||
<i class="fas fa-home"></i> workdir
|
||||
<i class="fas fa-home" aria-hidden="true"></i> {{ _("admin_files.breadcrumb_workdir") }}
|
||||
</a>
|
||||
</li>
|
||||
{% for crumb in breadcrumbs %}
|
||||
<li class="flex items-center">
|
||||
<i class="fas fa-chevron-right text-gray-300 mx-1 text-xs"></i>
|
||||
<i class="fas fa-chevron-right text-gray-300 mx-1 text-xs" aria-hidden="true"></i>
|
||||
{% if loop.last %}
|
||||
<span class="text-gray-700 font-medium">{{ crumb.name }}</span>
|
||||
{% else %}
|
||||
@@ -93,22 +93,22 @@
|
||||
<thead class="bg-gray-50">
|
||||
<tr>
|
||||
<th class="px-4 py-3 text-left w-8"></th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-600 uppercase tracking-wider text-xs">Name</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-600 uppercase tracking-wider text-xs hidden sm:table-cell">Size</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-600 uppercase tracking-wider text-xs hidden md:table-cell">Modified</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-600 uppercase tracking-wider text-xs">DB</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-600 uppercase tracking-wider text-xs">Actions</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-600 uppercase tracking-wider text-xs">{{ _("admin_files.col_name") }}</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-600 uppercase tracking-wider text-xs hidden sm:table-cell">{{ _("admin_files.col_size") }}</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-600 uppercase tracking-wider text-xs hidden md:table-cell">{{ _("admin_files.col_modified") }}</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-600 uppercase tracking-wider text-xs">{{ _("admin_files.col_db") }}</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-600 uppercase tracking-wider text-xs">{{ _("admin_files.col_actions") }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="divide-y divide-gray-100">
|
||||
|
||||
{% if current_path %}
|
||||
<tr class="hover:bg-gray-50">
|
||||
<td class="px-4 py-3 text-yellow-400"><i class="fas fa-folder"></i></td>
|
||||
<td class="px-4 py-3 text-yellow-400"><i class="fas fa-folder" aria-hidden="true"></i></td>
|
||||
<td class="px-4 py-3 font-medium text-gray-900" colspan="4">
|
||||
<a href="?view=filesystem{% if parent_path %}&path={{ parent_path | urlencode }}{% endif %}"
|
||||
class="text-blue-600 hover:underline flex items-center gap-1">
|
||||
<i class="fas fa-level-up-alt text-xs"></i> ..
|
||||
<i class="fas fa-level-up-alt text-xs" aria-hidden="true"></i> ..
|
||||
</a>
|
||||
</td>
|
||||
<td></td>
|
||||
@@ -118,7 +118,7 @@
|
||||
{% if fs_entries %}
|
||||
{% for entry in fs_entries %}
|
||||
<tr class="hover:bg-gray-50 {% if entry.db_status == 'orphan' %}bg-amber-50{% endif %}">
|
||||
<td class="px-4 py-3"><i class="{{ entry.icon }}"></i></td>
|
||||
<td class="px-4 py-3"><i class="{{ entry.icon }}" aria-hidden="true"></i></td>
|
||||
<td class="px-4 py-3 font-medium text-gray-900 max-w-xs truncate">
|
||||
{% if entry.is_dir %}
|
||||
<a href="?view=filesystem&path={{ entry.rel_path | urlencode }}" class="text-blue-600 hover:underline">
|
||||
@@ -133,11 +133,11 @@
|
||||
<td class="px-4 py-3">
|
||||
{% if entry.db_status == 'in_db' %}
|
||||
<span class="inline-flex items-center gap-1 text-xs text-green-700 bg-green-50 border border-green-200 rounded-full px-2 py-0.5">
|
||||
<span class="h-1.5 w-1.5 rounded-full bg-green-500"></span> In DB
|
||||
<span class="h-1.5 w-1.5 rounded-full bg-green-500"></span> {{ _("admin_files.status_in_db") }}
|
||||
</span>
|
||||
{% elif entry.db_status == 'orphan' %}
|
||||
<span class="inline-flex items-center gap-1 text-xs text-amber-700 bg-amber-50 border border-amber-200 rounded-full px-2 py-0.5">
|
||||
<span class="h-1.5 w-1.5 rounded-full bg-amber-500"></span> Orphan
|
||||
<span class="h-1.5 w-1.5 rounded-full bg-amber-500"></span> {{ _("admin_files.status_orphan") }}
|
||||
</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
@@ -145,7 +145,7 @@
|
||||
{% if not entry.is_dir %}
|
||||
<a href="/admin/files/download?path={{ entry.rel_path | urlencode }}"
|
||||
class="inline-flex items-center gap-1 px-2.5 py-1 border border-gray-200 text-xs font-medium rounded text-gray-600 bg-white hover:bg-gray-50">
|
||||
<i class="fas fa-download text-xs"></i> Download
|
||||
<i class="fas fa-download text-xs" aria-hidden="true"></i> {{ _("admin_files.btn_download") }}
|
||||
</a>
|
||||
{% endif %}
|
||||
</td>
|
||||
@@ -154,8 +154,8 @@
|
||||
{% else %}
|
||||
<tr>
|
||||
<td colspan="6" class="px-6 py-10 text-center text-sm text-gray-400">
|
||||
<i class="fas fa-folder-open text-gray-200 text-3xl mb-2 block"></i>
|
||||
This directory is empty.
|
||||
<i class="fas fa-folder-open text-gray-200 text-3xl mb-2 block" aria-hidden="true"></i>
|
||||
{{ _("admin_files.empty_directory") }}
|
||||
</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
@@ -171,9 +171,9 @@
|
||||
|
||||
<!-- Legend -->
|
||||
<div class="flex flex-wrap gap-4 text-xs text-gray-500 mb-4">
|
||||
<span class="flex items-center gap-1"><span class="h-2.5 w-2.5 rounded-full bg-green-400 inline-block"></span> File exists on disk</span>
|
||||
<span class="flex items-center gap-1"><span class="h-2.5 w-2.5 rounded-full bg-red-400 inline-block"></span> File missing from disk</span>
|
||||
<span class="flex items-center gap-1"><span class="h-2.5 w-2.5 rounded-full bg-gray-300 inline-block"></span> Path not set</span>
|
||||
<span class="flex items-center gap-1"><span class="h-2.5 w-2.5 rounded-full bg-green-400 inline-block"></span> {{ _("admin_files.legend_file_exists") }}</span>
|
||||
<span class="flex items-center gap-1"><span class="h-2.5 w-2.5 rounded-full bg-red-400 inline-block"></span> {{ _("admin_files.legend_file_missing") }}</span>
|
||||
<span class="flex items-center gap-1"><span class="h-2.5 w-2.5 rounded-full bg-gray-300 inline-block"></span> {{ _("admin_files.legend_path_not_set") }}</span>
|
||||
</div>
|
||||
|
||||
{% if db_records %}
|
||||
@@ -181,14 +181,14 @@
|
||||
<table class="min-w-full divide-y divide-gray-200 text-sm">
|
||||
<thead class="bg-gray-50">
|
||||
<tr>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs">ID</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs">Original Filename</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs hidden md:table-cell">Size</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs hidden lg:table-cell">Ingested</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs">local_filename</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs">original_file_path</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs">processed_file_path</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs">Health</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs">{{ _("admin_files.col_id") }}</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs">{{ _("admin_files.col_original_filename") }}</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs hidden md:table-cell">{{ _("admin_files.col_size") }}</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs hidden lg:table-cell">{{ _("admin_files.col_ingested") }}</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs">{{ _("admin_files.col_local_filename") }}</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs">{{ _("admin_files.col_original_file_path") }}</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs">{{ _("admin_files.col_processed_file_path") }}</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs">{{ _("admin_files.col_health") }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="divide-y divide-gray-100">
|
||||
@@ -197,7 +197,7 @@
|
||||
<td class="px-4 py-3 text-gray-400 font-mono text-xs">{{ rec.id }}</td>
|
||||
<td class="px-4 py-3 font-medium text-gray-800 max-w-xs truncate" title="{{ rec.original_filename }}">
|
||||
{% if rec.is_duplicate %}
|
||||
<span class="text-xs text-purple-600 bg-purple-50 border border-purple-200 rounded px-1 mr-1">dup</span>
|
||||
<span class="text-xs text-purple-600 bg-purple-50 border border-purple-200 rounded px-1 mr-1">{{ _("admin_files.badge_duplicate") }}</span>
|
||||
{% endif %}
|
||||
{{ rec.original_filename }}
|
||||
</td>
|
||||
@@ -226,11 +226,11 @@
|
||||
<td class="px-4 py-3">
|
||||
{% if rec.health == 'ok' %}
|
||||
<span class="inline-flex items-center gap-1 text-xs text-green-700 bg-green-50 border border-green-200 rounded-full px-2 py-0.5">
|
||||
<i class="fas fa-check text-xs"></i> OK
|
||||
<i class="fas fa-check text-xs" aria-hidden="true"></i> {{ _("admin_files.health_ok") }}
|
||||
</span>
|
||||
{% else %}
|
||||
<span class="inline-flex items-center gap-1 text-xs text-red-700 bg-red-50 border border-red-200 rounded-full px-2 py-0.5">
|
||||
<i class="fas fa-triangle-exclamation text-xs"></i> Missing
|
||||
<i class="fas fa-triangle-exclamation text-xs" aria-hidden="true"></i> {{ _("admin_files.health_missing") }}
|
||||
</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
@@ -241,8 +241,8 @@
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="bg-white rounded-lg shadow p-10 text-center text-gray-400">
|
||||
<i class="fas fa-database text-4xl mb-3 block text-gray-200"></i>
|
||||
No file records found in the database.
|
||||
<i class="fas fa-database text-4xl mb-3 block text-gray-200" aria-hidden="true"></i>
|
||||
{{ _("admin_files.empty_database") }}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
@@ -254,17 +254,16 @@
|
||||
|
||||
{% if orphan_files or ghost_records %}
|
||||
<div class="bg-amber-50 border border-amber-300 rounded-lg px-5 py-4 mb-6 flex items-start gap-3">
|
||||
<i class="fas fa-triangle-exclamation text-amber-500 mt-0.5"></i>
|
||||
<i class="fas fa-triangle-exclamation text-amber-500 mt-0.5" aria-hidden="true"></i>
|
||||
<div class="text-sm text-amber-800">
|
||||
<strong>Delta detected.</strong>
|
||||
Found <strong>{{ orphan_files | length }}</strong> orphan file(s) on disk with no DB record,
|
||||
and <strong>{{ ghost_records | length }}</strong> DB record(s) with missing files on disk.
|
||||
<strong>{{ _("admin_files.delta_detected_title") }}</strong>
|
||||
{{ _("admin_files.delta_detected_detail", orphan_count=(orphan_files | length), ghost_count=(ghost_records | length)) }}
|
||||
</div>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="bg-green-50 border border-green-300 rounded-lg px-5 py-4 mb-6 flex items-center gap-3">
|
||||
<i class="fas fa-circle-check text-green-500"></i>
|
||||
<span class="text-sm text-green-800 font-medium">No delta found — filesystem and database are in sync.</span>
|
||||
<i class="fas fa-circle-check text-green-500" aria-hidden="true"></i>
|
||||
<span class="text-sm text-green-800 font-medium">{{ _("admin_files.no_delta") }}</span>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
@@ -272,7 +271,7 @@
|
||||
<div class="mb-8">
|
||||
<h2 class="text-base font-semibold text-gray-800 mb-3 flex items-center gap-2">
|
||||
<span class="h-3 w-3 rounded-full bg-amber-400 inline-block"></span>
|
||||
Orphan files <span class="text-gray-400 font-normal text-sm ml-1">(on disk, no DB record)</span>
|
||||
{{ _("admin_files.orphan_files_heading") }} <span class="text-gray-400 font-normal text-sm ml-1">{{ _("admin_files.orphan_files_desc") }}</span>
|
||||
<span class="text-xs bg-amber-100 text-amber-700 border border-amber-200 rounded-full px-2 py-0.5 ml-auto">{{ orphan_files | length }}</span>
|
||||
</h2>
|
||||
{% if orphan_files %}
|
||||
@@ -281,23 +280,23 @@
|
||||
<thead class="bg-amber-50">
|
||||
<tr>
|
||||
<th class="px-4 py-3 text-left w-8"></th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs">Path (relative to workdir)</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs hidden sm:table-cell">Size</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs hidden md:table-cell">Modified</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs">Actions</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs">{{ _("admin_files.col_path_relative") }}</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs hidden sm:table-cell">{{ _("admin_files.col_size") }}</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs hidden md:table-cell">{{ _("admin_files.col_modified") }}</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs">{{ _("admin_files.col_actions") }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="divide-y divide-gray-100">
|
||||
{% for f in orphan_files %}
|
||||
<tr class="hover:bg-amber-50">
|
||||
<td class="px-4 py-3"><i class="{{ f.icon }}"></i></td>
|
||||
<td class="px-4 py-3"><i class="{{ f.icon }}" aria-hidden="true"></i></td>
|
||||
<td class="px-4 py-3 font-mono text-xs text-amber-800 max-w-xs truncate" title="{{ f.rel_path }}">{{ f.rel_path }}</td>
|
||||
<td class="px-4 py-3 text-gray-500 hidden sm:table-cell">{{ f.size }}</td>
|
||||
<td class="px-4 py-3 text-gray-400 text-xs hidden md:table-cell">{{ f.modified }}</td>
|
||||
<td class="px-4 py-3">
|
||||
<a href="/admin/files/download?path={{ f.rel_path | urlencode }}"
|
||||
class="inline-flex items-center gap-1 px-2.5 py-1 border border-gray-200 text-xs font-medium rounded text-gray-600 bg-white hover:bg-gray-50">
|
||||
<i class="fas fa-download text-xs"></i> Download
|
||||
<i class="fas fa-download text-xs" aria-hidden="true"></i> {{ _("admin_files.btn_download") }}
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -306,7 +305,7 @@
|
||||
</table>
|
||||
</div>
|
||||
{% else %}
|
||||
<p class="text-sm text-gray-400 italic">No orphan files found.</p>
|
||||
<p class="text-sm text-gray-400 italic">{{ _("admin_files.no_orphan_files") }}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
@@ -314,7 +313,7 @@
|
||||
<div>
|
||||
<h2 class="text-base font-semibold text-gray-800 mb-3 flex items-center gap-2">
|
||||
<span class="h-3 w-3 rounded-full bg-red-400 inline-block"></span>
|
||||
Ghost records <span class="text-gray-400 font-normal text-sm ml-1">(in DB, file(s) missing on disk)</span>
|
||||
{{ _("admin_files.ghost_records_heading") }} <span class="text-gray-400 font-normal text-sm ml-1">{{ _("admin_files.ghost_records_desc") }}</span>
|
||||
<span class="text-xs bg-red-100 text-red-700 border border-red-200 rounded-full px-2 py-0.5 ml-auto">{{ ghost_records | length }}</span>
|
||||
</h2>
|
||||
{% if ghost_records %}
|
||||
@@ -322,10 +321,10 @@
|
||||
<table class="min-w-full divide-y divide-gray-200 text-sm">
|
||||
<thead class="bg-red-50">
|
||||
<tr>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs">ID</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs">Original Filename</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs hidden md:table-cell">Ingested</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs">Missing paths</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs">{{ _("admin_files.col_id") }}</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs">{{ _("admin_files.col_original_filename") }}</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs hidden md:table-cell">{{ _("admin_files.col_ingested") }}</th>
|
||||
<th class="px-4 py-3 text-left font-semibold text-gray-500 uppercase tracking-wider text-xs">{{ _("admin_files.col_missing_paths") }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="divide-y divide-gray-100">
|
||||
@@ -352,7 +351,7 @@
|
||||
</table>
|
||||
</div>
|
||||
{% else %}
|
||||
<p class="text-sm text-gray-400 italic">No ghost records found.</p>
|
||||
<p class="text-sm text-gray-400 italic">{{ _("admin_files.no_ghost_records") }}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
@@ -149,6 +149,53 @@
|
||||
"admin_plans.stripe_wizard_text": "Stripe Setup Wizard",
|
||||
"admin_plans.subheading": "Manage subscription plans shown on the public pricing page.",
|
||||
"admin_plans.table_aria_label": "Subscription plans",
|
||||
"admin_files.admin_only_badge": "Admin Only",
|
||||
"admin_files.aria_breadcrumb": "Breadcrumb",
|
||||
"admin_files.badge_delta_detected": "Delta detected",
|
||||
"admin_files.badge_duplicate": "dup",
|
||||
"admin_files.badge_in_db": "in DB",
|
||||
"admin_files.badge_on_disk": "on disk",
|
||||
"admin_files.breadcrumb_workdir": "workdir",
|
||||
"admin_files.btn_download": "Download",
|
||||
"admin_files.col_actions": "Actions",
|
||||
"admin_files.col_db": "DB",
|
||||
"admin_files.col_health": "Health",
|
||||
"admin_files.col_id": "ID",
|
||||
"admin_files.col_ingested": "Ingested",
|
||||
"admin_files.col_local_filename": "local_filename",
|
||||
"admin_files.col_missing_paths": "Missing paths",
|
||||
"admin_files.col_modified": "Modified",
|
||||
"admin_files.col_name": "Name",
|
||||
"admin_files.col_original_file_path": "original_file_path",
|
||||
"admin_files.col_original_filename": "Original Filename",
|
||||
"admin_files.col_path_relative": "Path (relative to workdir)",
|
||||
"admin_files.col_processed_file_path": "processed_file_path",
|
||||
"admin_files.col_size": "Size",
|
||||
"admin_files.delta_detected_detail": "Found {orphan_count} orphan file(s) on disk with no DB record, and {ghost_count} DB record(s) with missing files on disk.",
|
||||
"admin_files.delta_detected_title": "Delta detected.",
|
||||
"admin_files.empty_database": "No file records found in the database.",
|
||||
"admin_files.empty_directory": "This directory is empty.",
|
||||
"admin_files.ghost_records_desc": "(in DB, file(s) missing on disk)",
|
||||
"admin_files.ghost_records_heading": "Ghost records",
|
||||
"admin_files.heading": "File Manager",
|
||||
"admin_files.health_missing": "Missing",
|
||||
"admin_files.health_ok": "OK",
|
||||
"admin_files.legend_file_exists": "File exists on disk",
|
||||
"admin_files.legend_file_missing": "File missing from disk",
|
||||
"admin_files.legend_found_in_db": "Found in DB",
|
||||
"admin_files.legend_not_in_db": "Not in DB (orphan)",
|
||||
"admin_files.legend_path_not_set": "Path not set",
|
||||
"admin_files.no_delta": "No delta found \u2014 filesystem and database are in sync.",
|
||||
"admin_files.no_ghost_records": "No ghost records found.",
|
||||
"admin_files.no_orphan_files": "No orphan files found.",
|
||||
"admin_files.orphan_files_desc": "(on disk, no DB record)",
|
||||
"admin_files.orphan_files_heading": "Orphan files",
|
||||
"admin_files.page_title": "File Manager \u2013 Admin",
|
||||
"admin_files.status_in_db": "In DB",
|
||||
"admin_files.status_orphan": "Orphan",
|
||||
"admin_files.tab_database": "Database Records",
|
||||
"admin_files.tab_filesystem": "Filesystem",
|
||||
"admin_files.tab_reconcile": "Reconcile",
|
||||
"admin_users.add_user_profile_btn": "Add User Profile",
|
||||
"admin_users.admin_only_badge": "Admin Only",
|
||||
"admin_users.btn_password": "Password",
|
||||
|
||||
Reference in New Issue
Block a user