integreat_cms/cms/templates/pages/page_tree.html
{% extends "_base.html" %}
{% load i18n %}
{% load static %}
{% load content_filters %}
{% load page_filters %}
{% load rules %}
{% block content %}
{% has_perm 'cms.change_page_object' request.user as can_edit_pages %}
{% with filter_form.filters_visible as filters_visible %}
<div class="table-header">
<div class="flex flex-wrap justify-between gap-4">
<h1 class="heading">
{% translate "Page Tree" %}
<button data-show-tutorial="page-tree" class="hover:text-blue-500">
<i icon-name="help-circle" class="align-baseline"></i>
</button>
</h1>
<a href="{% url 'archived_pages' region_slug=request.region.slug language_slug=language.slug %}"
class="font-bold text-sm text-gray-800 flex items-center gap-1 mb-2 hover:underline">
<span><i icon-name="archive" class="align-top h-5"></i> {% translate "Archived pages" %}</span>
</a>
</div>
<div class="flex flex-wrap justify-between gap-4">
<div class="flex flex-wrap gap-4">
{% include "generic_language_switcher.html" with target="pages" %}
{% include "_search_input.html" with object_type="page" related_form="page-filter-form" search_query=filter_form.cleaned_data.query %}
</div>
<div class="flex flex-wrap gap-4">
{% if request.user.expert_mode %}
<button id="filter-toggle" class="btn btn-ghost">
<span class="filter-toggle-text {% if filters_visible %}hidden{% endif %}">{% translate "Show filters" %}</span>
<span class="filter-toggle-text {% if not filters_visible %}hidden{% endif %}">{% translate "Hide filters" %}</span>
</button>
{% endif %}
{% if can_edit_pages %}
{% if request.region.default_language == language %}
<a href="{% url 'new_page' region_slug=request.region.slug language_slug=language.slug %}"
class="btn">
{% translate "Create page" %}
</a>
{% else %}
{% blocktranslate trimmed asvar disabled_button_title with request.region.default_language.translated_name as default_language %}
You can only create pages in the default language ({{ default_language }}).
{% endblocktranslate %}
<button title="{{ disabled_button_title }}" class="btn" disabled>
{% translate "Create page" %}
</button>
{% endif %}
{% endif %}
</div>
</div>
</div>
<div id="filter-form-container"
class="{% if not filters_visible %}hidden{% endif %} w-full mt-4 rounded border border-solid border-gray-200 shadow bg-white">
{% include "pages/_page_filter_form.html" %}
</div>
{% endwith %}
<form method="post" id="bulk-action-form" class="table-listing">
{% csrf_token %}
<div class="overflow-x-auto">
<table {% if not filter_form.is_enabled %} data-delay-event-handlers data-activate-tree-drag-drop data-descendants-url={% url 'get_page_tree_ajax' region_slug=request.region.slug language_slug=language.slug %}{% endif %}
class="w-full mt-4 rounded border-2 border-solid border-gray-200 shadow bg-white table-auto">
<thead>
<tr class="border-b border-solid border-gray-200">
<th class="text-sm text-left uppercase py-3 pl-4 pr-2 min">
<input type="checkbox" id="bulk-select-all" class="cursor-wait" />
</th>
{% if not filter_form.is_enabled %}
<th class="text-sm text-left uppercase py-3 pl-2 pr-2 min">
{% translate "Hierarchy" %}
</th>
{% endif %}
<th class="text-sm text-left uppercase py-3 pl-2 pr-2">
{% translate "Title in" %} {{ language.translated_name }}
</th>
{% get_current_language as LANGUAGE_CODE %}
{% get_language LANGUAGE_CODE as backend_language %}
{% if backend_language and backend_language != language %}
<th class="text-sm text-left uppercase py-3 px-2">
{% translate "Title in" %} {{ backend_language.translated_name }}
</th>
{% endif %}
<th class="text-sm text-center uppercase py-3 pr-6 min">
{% translate "Tags" %}
</th>
<th class="text-sm text-left uppercase py-3 px-2">
<div class="lang-grid flags whitespace-nowrap">
{% spaceless %}
{% for lang in languages %}
{% if lang != request.region.default_language %}
<a href="{% url 'pages' region_slug=request.region.slug language_slug=lang.slug %}">
<span class="fp fp-rounded fp-{{ lang.primary_country_code }}"
title="{{ lang.translated_name }}"></span>
</a>
{% endif %}
{% endfor %}
{% endspaceless %}
</div>
</th>
<th class="text-sm text-left uppercase py-3 pl-2 pr-2">
{% translate "Publication status" %}
</th>
<th class="text-sm text-left uppercase py-3 pl-2">
{% translate "Last updated" %}
</th>
<th class="text-sm text-right uppercase py-3 pl-2 pr-4 min">
{% translate "Options" %}
</th>
</tr>
</thead>
<tbody>
{% for page in pages %}
{% include "pages/page_tree_node.html" %}
{% if forloop.last %}
<tr data-drop-id="{% if page.is_root %}{{ page.id }}{% else %}{{ page.get_cached_ancestors.0.id }}{% endif %}"
data-drop-position="right"
class="drop drop-between h-3 hidden"
title="test">
<td colspan="9">
<div>
{# djlint:off H020 #}
<span></span>
{# djlint:on #}
</div>
</td>
</tr>
{% endif %}
{% empty %}
<tr>
<td>
</td>
<td colspan="8" class="px-2 py-3">
{% if filter_form.is_enabled %}
{% translate "No pages found with these filters." %}
{% else %}
{% translate "No pages available yet." %}
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% if pages %}
<div class="pt-2 px-2">
{% if not filter_form.is_enabled %}
<a id="expand-all-pages" class="text-blue-500 !cursor-wait">
{% spaceless %}
<i icon-name="chevron-down"
class="align-sub h-5 rounded-full group-hover:bg-blue-500 group-hover:text-white"></i>
{% translate "Expand all" %}
{% endspaceless %}
</a>
<span class="text-gray-600 font-default">|</span>
<a id="collapse-all-pages" class="text-blue-500 !cursor-wait">
{% spaceless %}
<i icon-name="chevron-up"
class="align-sub h-5 rounded-full group-hover:bg-blue-500 group-hover:text-white"></i>
{% translate "Collapse all" %}
{% endspaceless %}
</a> <span class="text-gray-600 font-default">|</span>
{% endif %}
<div class="inline">
<span class="text-gray-800 font-bold" data-list-selection-count>0</span> <span class="text-gray-600">{% translate "Pages selected" %}</span>
</div>
</div>
{% endif %}
<div class="flex flex-wrap gap-2 mt-2">
<select id="bulk-action" class="w-auto max-w-full">
<option>
{% translate "Select bulk action" %}
</option>
{% if can_edit_pages %}
<option data-bulk-action="{% url 'bulk_archive_pages' region_slug=request.region.slug language_slug=language.slug %}">
{% translate "Archive pages" %}
</option>
{% endif %}
{% if MT_PERMITTED %}
{% translate "pages" as content_type %}
{% if MT_PROVIDER %}
<option id="machine-translation-option"
data-mt-provider="{{ MT_PROVIDER.name }}"
data-url="{% url 'word_count' region_slug=request.region.slug language_slug=language.slug model_type='page' %}"
data-bulk-action="{% url 'machine_translation_pages' region_slug=request.region.slug language_slug=language.slug %}">
{% blocktranslate trimmed with provider=MT_PROVIDER.name %}
Machine translate {{ content_type }} via {{ provider }} to {{ language }}
{% endblocktranslate %}
</option>
{% else %}
<option disabled
title="{% translate "This language is not supported by any available machine translation provider." %}">
{% blocktranslate trimmed %}
Machine translate {{ content_type }} to {{ language }}
{% endblocktranslate %}
</option>
{% endif %}
{% endif %}
{% if language.can_be_pdf_exported %}
<option id="pdf-export-option"
data-bulk-action="{% url 'export_pdf' region_slug=request.region.slug language_slug=language.slug %}"
data-target="_blank"
data-language-slug="{{ language.slug }}">
{% translate "Export published pages as PDF" %}
</option>
{% else %}
<option disabled
title="{% translate "Currently PDF-Export is not available in this language." %}">
{% translate "Export published pages as PDF" %}
</option>
{% endif %}
{% if request.user.expert_mode %}
{% with language_translated_name=language.translated_name %}
{% blocktranslate trimmed asvar xliff_export_public %}
Export published pages for {{ language_translated_name }} translation
{% endblocktranslate %}
{% blocktranslate trimmed asvar xliff_export_all %}
Export unpublished (⚠️) and published pages for {{ language_translated_name }} translation
{% endblocktranslate %}
{% if language == request.region.default_language %}
{% blocktranslate trimmed asvar xliff_export_disabled %}
You cannot export XLIFF files for the default language
{% endblocktranslate %}
<option disabled title="{{ xliff_export_disabled }}">
{{ xliff_export_public }} ({{ XLIFF_EXPORT_VERSION|upper }})
</option>
<option disabled title="{{ xliff_export_disabled }}">
{{ xliff_export_all }} ({{ XLIFF_EXPORT_VERSION|upper }})
</option>
{% else %}
<option data-bulk-action="{% url 'download_xliff_only_public' region_slug=request.region.slug language_slug=language.slug %}">
{{ xliff_export_public }} ({{ XLIFF_EXPORT_VERSION|upper }})
</option>
<option data-bulk-action="{% url 'download_xliff' region_slug=request.region.slug language_slug=language.slug %}">
{{ xliff_export_all }} ({{ XLIFF_EXPORT_VERSION|upper }})
</option>
{% endif %}
{% endwith %}
{% endif %}
{% if request.user.is_superuser or request.user.is_staff %}
<option id="xliff-multiple-languages-option"
data-show-xliff-export-overlay
data-bulk-action="{% url 'download_xliff_multiple_languages' region_slug=request.region.slug language_slug=language.slug %}">
{% translate "Export selected pages for multilingual translation" %} ({{ XLIFF_EXPORT_VERSION|upper }})
</option>
{% translate "pages" as content_type %}
<option data-bulk-action="{% url 'publish_multiple_pages' region_slug=request.region.slug language_slug=language.slug %}">
{% blocktranslate trimmed %}
Publish {{ content_type }}
{% endblocktranslate %}
</option>
<option data-bulk-action="{% url 'draft_multiple_pages' region_slug=request.region.slug language_slug=language.slug %}">
{% blocktranslate trimmed %}
Draft {{ content_type }}
{% endblocktranslate %}
</option>
{% endif %}
{% if has_pages_in_translation %}
<option data-bulk-action="{% url 'cancel_translation_process' region_slug=request.region.slug language_slug=language.slug %}">
{% translate "Cancel translation process" %}
</option>
{% endif %}
</select>
<button id="bulk-action-execute" class="btn" disabled>
{% translate "Execute" %}
</button>
</div>
</form>
{% if request.user.expert_mode and can_edit_pages %}
<div class="flex-wrap relative w-auto mt-12">
<h3 class="font-bold text-xl">
{% translate "Import XLIFF files" %}
</h3>
<div class="my-2 text-s text-gray-600">
{% translate "Supported file extensions" %}: .zip, .xlf, .xliff
</div>
<form class="flex flex-wrap h-full mt-2 gap-2"
method="post"
enctype="multipart/form-data"
action="{% url 'upload_xliff' region_slug=request.region.slug language_slug=language.slug %}">
<label id="xliff_file_label"
for="xliff_file"
class="inline-block cursor-pointer bg-blue-500 hover:bg-blue-600 text-white font-bold py-2 px-4 m-0 rounded">
<i icon-name="upload" class="inline-block pr-1"></i>
{% translate "Select files" %}
</label>
<span id="xliff_file_label_multiple" class="hidden">{% translate "and {} other files" %}</span>
<input id="xliff_file"
type="file"
name="xliff_file"
class="hidden"
accept=".zip, .xlf, .xliff"
multiple />
{% csrf_token %}
<button id="xliff_file_submit" class="btn" disabled>
{% translate "Import" %}
</button>
</form>
</div>
{% endif %}
{% include "../generic_confirmation_dialog.html" %}
{% include "../tutorials/page_tree.html" with tutorial_id="page-tree" hidden=request.user.page_tree_tutorial_seen %}
{% include "pages/_page_preview_overlay.html" %}
{% include "pages/_page_xliff_export_overlay.html" %}
{% include "_machine_translation_overlay.html" %}
{% endblock content %}