{% extends "scitex_app/app_shell.html" %} {% load i18n scitex_static %} {% comment %} Storage organize tabs (Usage / Duplicates / Move), leaf-owned. The Backup tab is still served by the upstream scitex-storage view; this template covers only the three tabs dispatched to storage_app.organize. Reuses the upstream .stx-storage-* classes so the three tabs feel like one app. {% endcomment %} {% block extra_css %} {% endblock %} {% block scitex_app_content %}

{% translate "Storage" %}

{% translate "Organize your storage: see usage, resolve duplication, move between tiers." %}

{% if tab == "usage" %}

{% translate "Where your bytes live" %}

{% if fleet_segments %}
{% for seg in fleet_segments %} {{ seg.label }} — {{ seg.value|filesizeformat }} ({% widthratio seg.fraction 1 100 %}%) {% endfor %} {{ fleet_total|filesizeformat }} {% translate "across volumes" %}
    {% for seg in fleet_segments %}
  • {{ seg.label }} {{ seg.value|filesizeformat }} · {% widthratio seg.fraction 1 100 %}%
  • {% endfor %}

{% translate "Used + available excludes blocks the filesystem reserves for root, which the per-volume totals include." %}

{% else %}

{% translate "No reachable volumes with measurable capacity yet." %}

{% endif %}

{% translate "Fleet visualizations" %}

{% translate "Fleet-wide capacity views rendered from the periodic fleet snapshot (Codecov-style sunburst, bubbles, table). When no snapshot has been gathered yet the page names the gather command." %}

{% translate "Sunburst" %} · {% translate "Bubbles" %} · {% translate "Fleet table" %}

{% for v in statuses %}

{{ v.volume.label }}

{% if v.volume.tier %}

{% translate "Tier" %}: {{ v.volume.tier }}

{% endif %} {% if v.status == reachable %}

{% blocktranslate with used=v.used|filesizeformat total=v.total|filesizeformat free=v.free|filesizeformat pct=v.used_pct %}{{ used }} of {{ total }} used ({{ pct }}%) · {{ free }} free{% endblocktranslate %}

{% else %}

{% translate "This volume is not reachable from here." %}

{% endif %}
{% empty %}

{% translate "No storage is assigned to your account yet." %}

{% endfor %}

{% translate "Per-folder breakdown" %}

{% for v in statuses %} {% if v.status == reachable %} {{ v.volume.label }} {% endif %} {% endfor %}
{% if folder_note %}

{{ folder_note }}

{% endif %} {% if folder_segments and folder_volume %}
{% for seg in folder_segments %} {{ seg.label }} — {{ seg.value|filesizeformat }} ({% widthratio seg.fraction 1 100 %}%) {% endfor %} {{ folder_total|filesizeformat }} {{ folder_volume.label }}
    {% for seg in folder_segments %}
  • {{ seg.label }} {{ seg.value|filesizeformat }} · {% widthratio seg.fraction 1 100 %}%
  • {% endfor %}
{% endif %}
{% elif tab == "duplicates" %}
{% translate "Read-only report." %} {% translate "Duplicate detection only ever lists groups — it never deletes, moves, or links anything. Resolving a group (keeping one copy, removing the rest) is a deliberate manual step, never automatic." %}
{% if unavailable_reason %}

{% translate "Duplicates unavailable" %}

{{ unavailable_reason }}

{% translate "On a host with the binary, run:" %}scitex-storage find-duplicates ~/proj --depth 4

{% else %}

{% blocktranslate with n=group_total %}{{ n }} duplicate groups{% endblocktranslate %}

{% if reclaimable %}

{% blocktranslate with size=reclaimable|filesizeformat %}Keeping one copy per group would reclaim {{ size }}.{% endblocktranslate %}

{% endif %} {% if not groups %}

{% translate "No byte-identical duplicates found in the scanned volumes." %}

{% endif %}
{% endif %} {% elif tab == "move" %}

{% translate "Your tiers" %}

{% for tier_name, tier_statuses in tiers %}

{{ tier_name }}

    {% for v in tier_statuses %}
  • {{ v.volume.label }} {% if v.status == reachable %} {{ v.used|filesizeformat }} / {{ v.total|filesizeformat }} {% else %} {% translate "unreachable" %} {% endif %}
  • {% endfor %}
{% empty %}

{% translate "No storage is assigned to your account yet." %}

{% endfor %}
{% if destinations %}

{% translate "Cold archive tiers:" %} {{ destinations|join:", " }}

{% endif %}

{% translate "Plan a move to cold storage" %}

{% translate "Planning is read-only: it measures the folder and shows where it would go. Nothing moves until an operator confirms." %}

{% if plan_error %}

{{ plan_error }}

{% endif %} {% if plan %}
{% translate "Move plan (not executed)." %} {% blocktranslate with size=plan.size_bytes|filesizeformat count=plan.file_count src=plan.source dest=plan.destination remote=plan.remote_path %}{{ size }} in {{ count }} files: {{ src }} → {{ dest }}:{{ remote }}{% endblocktranslate %}
{% endif %}
{% translate "Applying a move is disabled in the browser." %}

{% translate "The archive removes the local copy only after the remote copy verifies, and it always needs an explicit confirm — so it runs from the command line, never from a click:" %} scitex-storage archive <folder> --to <tier> --yes

{% endif %}
{% endblock %} {% block extra_js %}{% endblock %}