digitalfabrik/integreat-cms

View on GitHub
integreat_cms/cms/templates/regions/region_form.html

Summary

Maintainability
Test Coverage
{% extends "_base.html" %}
{% load l10n %}
{% load i18n %}
{% load static %}
{% load humanize %}
{% load widget_tweaks %}
{% block content %}
    <form enctype="multipart/form-data" method="post" data-unsaved-warning>
        {% csrf_token %}
        <div class="flex flex-wrap justify-between mb-4">
            <h1 class="heading overflow-hidden text-ellipsis">
                {% if form.initial %}
                    {% with form.name.value as region_name %}
                        {% blocktranslate trimmed %}
                            Edit region "{{ region_name }}"
                        {% endblocktranslate %}
                    {% endwith %}
                {% else %}
                    {% translate "Create new region" %}
                {% endif %}
            </h1>
            {% if perms.cms.change_region %}
                <button class="btn ml-auto mr-0">
                    {% translate "Save" %}
                </button>
            {% endif %}
        </div>
        <div class="grid xl:grid-cols-2 2xl:grid-cols-3 gap-4">
            <div class="rounded border border-solid border-blue-500 shadow-2xl bg-white">
                <div class="p-4 rounded bg-water-500">
                    <h3 class="heading font-bold text-black">
                        <i icon-name="map" class="mr-2"></i> {% translate "General Settings" %}
                    </h3>
                </div>
                <div class="px-4 pb-4 divide-y divide-gray-200 space-y-4">
                    <div>
                        <!-- Options related to the region's administrative division -->
                        <label for="{{ form.administrative_division.id_for_label }}">
                            {{ form.administrative_division.label }}
                        </label>
                        {% render_field form.administrative_division|add_error_class:"border-red-500" %}
                        <!-- Option for including/excluding administrative division from region name -->
                        {% render_field form.administrative_division_included %}
                        <label for="{{ form.administrative_division_included.id_for_label }}"
                               class="secondary">
                            {{ form.administrative_division_included.label }}
                        </label>
                        <div class="help-text">
                            {{ form.administrative_division_included.help_text }}
                        </div>
                    </div>
                    <div>
                        <!-- Option for including custom prefix before region name -->
                        <label for="{{ form.custom_prefix.id_for_label }}">
                            {{ form.custom_prefix.label }}
                        </label>
                        {% render_field form.custom_prefix|add_error_class:"border-red-500" %}
                        <div class="help-text">
                            {{ form.custom_prefix.help_text }}
                        </div>
                    </div>
                    <div>
                        <!-- General Options for region management -->
                        <label for="{{ form.name.id_for_label }}">
                            {{ form.name.label }}
                        </label>
                        {% render_field form.name|add_error_class:"border-red-500" %}
                    </div>
                    <div>
                        <label for="{{ form.slug.id_for_label }}">
                            {{ form.slug.label }}
                        </label>
                        <div class="help-text">
                            {{ form.slug.help_text }}
                        </div>
                        <div class="slug-field">
                            <label for="{{ form.slug.id_for_label }}">
                                https://integreat.app/
                            </label>
                            {% render_field form.slug %}
                        </div>
                    </div>
                    <div>
                        <!-- Options related to coordinates for localization -->
                        <label for="{{ form.postal_code.id_for_label }}">
                            {{ form.postal_code.label }}
                        </label>
                        {% render_field form.postal_code|add_error_class:"border-red-500" %}
                    </div>
                    <div>
                        <label for="{{ form.admin_mail.id_for_label }}">
                            {{ form.admin_mail.label }}
                        </label>
                        {% render_field form.admin_mail|add_error_class:"border-red-500" %}
                    </div>
                    <div>
                        <!-- Options related to region status -->
                        <label for="{{ form.status.id_for_label }}">
                            {{ form.status.label }}
                        </label>
                        {% render_field form.status|add_error_class:"border-red-500" %}
                    </div>
                </div>
            </div>
            <div class="rounded border border-solid border-blue-500 shadow-2xl bg-white">
                <div class="p-4 rounded bg-water-500">
                    <h3 class="heading font-bold text-black">
                        <i icon-name="settings" class="mr-2"></i> {% translate "Extended Settings" %}
                    </h3>
                </div>
                <div class="px-4 pb-4 divide-y divide-gray-200 space-y-2">
                    <div>
                        <label for="{{ form.common_id.id_for_label }}">
                            {{ form.common_id.label }}
                        </label>
                        <div class="help-text">
                            {{ form.common_id.help_text }}
                        </div>
                        {% render_field form.common_id|add_error_class:"border-red-500" %}
                    </div>
                    <div>
                        <!-- Options related to Timezones -->
                        <label for="{{ form.timezone_area.id_for_label }}">
                            {{ form.timezone_area.label }}
                        </label>
                        {% render_field form.timezone_area %}
                        <div class="help-text">
                            {{ form.timezone_area.help_text }}
                        </div>
                        <label for="{{ form.timezone.id_for_label }}">
                            {{ form.timezone.label }}
                        </label>
                        {% render_field form.timezone %}
                        <div class="help-text">
                            {{ form.timezone.help_text }}
                        </div>
                    </div>
                    <div>
                        <div class="flex justify-between">
                            <label>
                                {% translate "Center of the region" %}
                            </label>
                            {% if form.instance.id %}
                                {% localize off %}
                                <label>
                                    <a href="https://www.openstreetmap.org/?mlat={{ form.instance.latitude }}&mlon={{ form.instance.longitude }}"
                                       class="text-blue-500 hover:underline"
                                       target="_blank"
                                       rel="noopener noreferrer">
                                        <i icon-name="map" class="mr-2"></i>
                                        {% translate "Preview on map" %}
                                    </a>
                                </label>
                            {% endlocalize %}
                        {% endif %}
                    </div>
                    <div class="help-text">
                        {% translate "If you leave these fields blank, they are automatically derived from the name, administrative division and community identification number." %}
                    </div>
                    <label for="{{ form.latitude.id_for_label }}" class="secondary">
                        {{ form.latitude.label }}
                    </label>
                    {% render_field form.latitude|add_error_class:"border-red-500" %}
                    <div class="help-text">
                        {{ form.latitude.help_text }}
                    </div>
                    <label for="{{ form.longitude.id_for_label }}" class="secondary">
                        {{ form.longitude.label }}
                    </label>
                    {% render_field form.longitude|add_error_class:"border-red-500" %}
                    <div class="help-text">
                        {{ form.longitude.help_text }}
                    </div>
                </div>
                <div>
                    <div class="flex justify-between">
                        <label>
                            {% translate "Bounding box" %}
                        </label>
                        {% if form.instance.has_bounding_box %}
                            {% localize off %}
                            <label>
                                <a href="https://www.openstreetmap.org/?minlon={{ form.instance.longitude_min }}&minlat={{ form.instance.latitude_min }}&maxlon={{ form.instance.longitude_max }}&maxlat={{ form.instance.latitude_max }}&box=yes"
                                   class="text-blue-500 hover:underline"
                                   target="_blank"
                                   rel="noopener noreferrer">
                                    <i icon-name="map" class="mr-2"></i>
                                    {% translate "Preview on map" %}
                                </a>
                            </label>
                        {% endlocalize %}
                    {% endif %}
                </div>
                <div class="help-text">
                    {% translate "The boundaries of the region." %}
                    {% translate "If you leave these fields blank, they are automatically derived from the name and postal code." %}
                </div>
                <label for="{{ form.longitude_min.id_for_label }}" class="secondary">
                    {{ form.longitude_min.label }}
                </label>
                {% render_field form.longitude_min|add_error_class:"border-red-500" %}
                <div class="help-text">
                    {{ form.longitude_min.help_text }}
                </div>
                <label for="{{ form.latitude_min.id_for_label }}" class="secondary">
                    {{ form.latitude_min.label }}
                </label>
                {% render_field form.latitude_min|add_error_class:"border-red-500" %}
                <div class="help-text">
                    {{ form.latitude_min.help_text }}
                </div>
                <label for="{{ form.longitude_max.id_for_label }}" class="secondary">
                    {{ form.longitude_max.label }}
                </label>
                {% render_field form.longitude_max|add_error_class:"border-red-500" %}
                <div class="help-text">
                    {{ form.longitude_max.help_text }}
                </div>
                <label for="{{ form.latitude_max.id_for_label }}" class="secondary">
                    {{ form.latitude_max.label }}
                </label>
                {% render_field form.latitude_max|add_error_class:"border-red-500" %}
                <div class="help-text">
                    {{ form.latitude_max.help_text }}
                </div>
            </div>
            <div>
                <label for="{{ form.aliases.id_for_label }}">
                    {{ form.aliases.label }}
                </label>
                <div class="help-text">
                    {{ form.aliases.help_text }}
                </div>
                {% render_field form.aliases|add_error_class:"border-red-500" %}
            </div>
        </div>
    </div>
    <div class="grid gap-4">
        <div class="rounded border border-solid border-blue-500 shadow-2xl bg-white">
            <div class="p-4 rounded bg-water-500">
                <h3 class="heading font-bold text-black">
                    <i icon-name="star" class="mr-2"></i> {% translate "Features" %}
                </h3>
            </div>
            <div class="px-4 pb-4 divide-y divide-gray-200 space-y-2">
                <div>
                    <!-- Options related to Events -->
                    {% render_field form.events_enabled %}
                    <label for="{{ form.events_enabled.id_for_label }}">
                        {{ form.events_enabled.label }}
                    </label>
                    <div class="help-text">
                        {{ form.events_enabled.help_text }}
                    </div>
                </div>
                <div>
                    <!-- Options related to locations -->
                    {% render_field form.locations_enabled %}
                    <label for="{{ form.locations_enabled.id_for_label }}">
                        {{ form.locations_enabled.label }}
                    </label>
                    <div class="help-text">
                        {{ form.locations_enabled.help_text }}
                    </div>
                </div>
                <div class="pt-2">
                    <!-- Options related to Fallback language -->
                    {% render_field form.fallback_translations_enabled class+="inline-block" %}
                    <label for="{{ form.fallback_translations_enabled.id_for_label }}"
                           class="!inline">
                        {{ form.fallback_translations_enabled.label }}
                    </label>
                    <div class="help-text">
                        {{ form.fallback_translations_enabled.help_text }}
                    </div>
                </div>
                <div class="pt-2">
                    <!-- Options related to SUMM.AI -->
                    {% render_field form.summ_ai_enabled class+="inline-block" %}
                    <label for="{{ form.summ_ai_enabled.id_for_label }}" class="!inline">
                        {{ form.summ_ai_enabled.label }}
                    </label>
                    <div class="help-text">
                        {{ form.summ_ai_enabled.help_text }}
                    </div>
                    {% if form.summ_ai_enabled.field.disabled %}
                        <div class="bg-yellow-100 border-l-4 border-yellow-500 text-orange-700  px-4 py-3"
                             role="alert">
                            <p>
                                {% translate "Currently SUMM.AI is globally deactivated" %}
                            </p>
                        </div>
                    {% endif %}
                </div>
                <div>
                    <!-- Options related to HIX text analysis -->
                    {% render_field form.hix_enabled %}
                    <label for="{{ form.hix_enabled.id_for_label }}">
                        {{ form.hix_enabled.label }}
                    </label>
                    <div class="help-text">
                        {{ form.hix_enabled.help_text }}
                    </div>
                    {% if form.hix_enabled.field.disabled %}
                        <div class="bg-yellow-100 border-l-4 border-yellow-500 text-orange-700  px-4 py-3"
                             role="alert">
                            <p>
                                {% translate "Currently HIX is globally deactivated" %}
                            </p>
                        </div>
                    {% endif %}
                </div>
                <div>
                    <!-- Options related to foreign language machine translation -->
                    <label>
                        {% trans "Foreign language machine translation" %}
                    </label>
                    {% if form.instance.id %}
                        <div class="max-w-xs">
                            <div class="flex flex-wrap justify-between">
                                <label class="secondary m-0">
                                    {% trans "Current total budget" %}:
                                </label>
                                <p>
                                    {{ form.instance.mt_budget|intcomma }}
                                </p>
                            </div>
                            <div class="flex flex-wrap justify-between">
                                <label class="secondary m-0">
                                    {% trans "Already consumed" %}:
                                </label>
                                <p>
                                    {{ form.instance.mt_budget_used|intcomma }}
                                </p>
                            </div>
                            <div class="flex flex-wrap justify-between">
                                <label class="secondary m-0">
                                    {% trans "Remaining words" %}:
                                </label>
                                <p>
                                    {{ form.instance.mt_budget_remaining|intcomma }}
                                </p>
                            </div>
                        </div>
                    {% endif %}
                    <label for="{{ form.mt_renewal_month.id_for_label }}" class="secondary">
                        {{ form.mt_renewal_month.label }}
                    </label>
                    {% render_field form.mt_renewal_month %}
                    <div class="help-text">
                        {{ form.mt_renewal_month.help_text }}
                    </div>
                    {% render_field form.mt_addon_booked %}
                    <label for="{{ form.mt_addon_booked.id_for_label }}" class="secondary">
                        {{ form.mt_addon_booked.label }}
                    </label>
                    <div class="help-text">
                        {{ form.mt_addon_booked.help_text }}
                    </div>
                    <div id="mt-toggle-div"
                         {% if not form.instance.mt_addon_booked %}class="hidden"{% endif %}>
                        {% render_field form.mt_midyear_start_enabled %}
                        <label for="{{ form.mt_midyear_start_enabled.id_for_label }}"
                               class="secondary">
                            {{ form.mt_midyear_start_enabled.label }}
                        </label>
                        <div class="help-text">
                            {{ form.mt_midyear_start_enabled.help_text }}
                        </div>
                        <div id="mt-renewal-toggle-div"
                             {% if not form.instance.mt_midyear_start_enabled %}class="hidden"{% endif %}>
                            <label for="{{ form.mt_midyear_start_month.id_for_label }}"
                                   class="secondary">
                                {{ form.mt_midyear_start_month.label }}
                            </label>
                            {% render_field form.mt_midyear_start_month %}
                            <div class="help-text">
                                {{ form.mt_midyear_start_month.help_text }}
                            </div>
                        </div>
                    </div>
                </div>
                <div>
                    <!-- Options related to external news provider -->
                    {% render_field form.external_news_enabled %}
                    <label for="{{ form.external_news_enabled.id_for_label }}">
                        {{ form.external_news_enabled.label }}
                    </label>
                    <div class="help-text">
                        {{ form.external_news_enabled.help_text }}
                    </div>
                </div>
                <div>
                    <!-- Options related to Author chat -->
                    {% render_field form.chat_enabled %}
                    <label for="{{ form.chat_enabled.id_for_label }}">
                        {{ form.chat_enabled.label }}
                    </label>
                    <div class="help-text">
                        {{ form.chat_enabled.help_text }}
                    </div>
                </div>
                <div>
                    <!-- Options related to Push Notifications -->
                    {% render_field form.push_notifications_enabled %}
                    <label for="{{ form.push_notifications_enabled.id_for_label }}">
                        {{ form.push_notifications_enabled.label }}
                    </label>
                    <div class="help-text">
                        {{ form.push_notifications_enabled.help_text }}
                    </div>
                </div>
                <div class="pt-2">
                    <!-- Options related to page-instance-specific permissions -->
                    {% render_field form.page_permissions_enabled class+="inline-block" %}
                    <label for="{{ form.page_permissions_enabled.id_for_label }}"
                           class="!inline">
                        {{ form.page_permissions_enabled.label }}
                    </label>
                    <div class="help-text">
                        {{ form.page_permissions_enabled.help_text }}
                    </div>
                </div>
                <div>
                    <!-- Options related to URL conventions -->
                    {% render_field form.short_urls_enabled %}
                    <label for="{{ form.short_urls_enabled.id_for_label }}">
                        {{ form.short_urls_enabled.label }}
                    </label>
                    <div class="help-text">
                        {{ form.short_urls_enabled.help_text }}
                    </div>
                </div>
                <div>
                    <!-- Options related to SEO section -->
                    {% render_field form.seo_enabled %}
                    <label for="{{ form.seo_enabled.id_for_label }}">
                        {{ form.seo_enabled.label }}
                    </label>
                    <div class="help-text">
                        {{ form.seo_enabled.help_text }}
                    </div>
                </div>
                <div>
                    <!-- Options related to Tracking -->
                    <label>
                        {% translate "Statistics" %}
                    </label>
                    {% render_field form.statistics_enabled %}
                    <label for="{{ form.statistics_enabled.id_for_label }}" class="secondary">
                        {{ form.statistics_enabled.label }}
                    </label>
                    <div id="statistics-toggle-div"
                         {% if not form.instance.statistics_enabled %}class="hidden"{% endif %}>
                        <label for="{{ form.matomo_token.id_for_label }}" class="secondary">
                            {{ form.matomo_token.label }}
                        </label>
                        <div class="help-text">
                            {{ form.matomo_token.help_text }}
                        </div>
                        {% render_field form.matomo_token %}
                        <label for="{{ form.matomo_id.id_for_label }}" class="secondary">
                            {{ form.matomo_id.label }}
                        </label>
                        <div class="help-text">
                            {{ form.matomo_id.help_text }}
                        </div>
                        {% render_field form.matomo_id disabled="disabled" %}
                    </div>
                </div>
                <div>
                    <!-- Options related to Zammad and the Chat API -->
                    {% render_field form.integreat_chat_enabled %}
                    <label for="{{ form.integreat_chat_enabled.id_for_label }}">
                        {{ form.integreat_chat_enabled.label }}
                    </label>
                    <div class="help-text">
                        {{ form.integreat_chat_enabled.help_text }}
                    </div>
                    <label for="{{ form.zammad_url.id_for_label }}">
                        {{ form.zammad_url.label }}
                    </label>
                    {% render_field form.zammad_url %}
                    <div class="help-text">
                        {{ form.zammad_url.help_text }}
                    </div>
                    <label for="{{ form.zammad_access_token.id_for_label }}">
                        {{ form.zammad_access_token.label }}
                    </label>
                    {% render_field form.zammad_access_token %}
                    {% if region.zammad_access_token %}
                        <span class="flex items-center my-2"><i icon-name="shield-alert" class="text-black"></i> {% translate "An access token for this region exists, but is not shown here for security reasons." %}</span>
                    {% endif %}
                    <div class="help-text">
                        {{ form.zammad_access_token.help_text }} "{{ USER_CHAT_TICKET_GROUP }}"
                    </div>
                    <label for="{{ form.zammad_chat_handlers.id_for_label }}">
                        {{ form.zammad_chat_handlers.label }}
                    </label>
                    {% render_field form.zammad_chat_handlers %}
                    <div class="help-text">
                        {{ form.zammad_chat_handlers.help_text }} "{{ USER_CHAT_TICKET_GROUP }}"
                    </div>
                    <label for="{{ form.chat_beta_tester_percentage.id_for_label }}">
                        {{ form.chat_beta_tester_percentage.label }}
                    </label>
                    {% render_field form.chat_beta_tester_percentage %}
                    <div class="help-text">
                        {{ form.chat_beta_tester_percentage.help_text }}
                    </div>
                </div>
                <div>
                    {% if form.zammad_offers.field.choices %}
                        <div id="zammad-offers-wrapper">
                            <label for="{{ form.zammad_offers.id_for_zammad_offers }}">
                                {{ form.zammad_offers.label }}
                            </label>
                            {% render_field form.zammad_offers %}
                            <div class="help-text">
                                {{ form.zammad_offers.help_text }}
                            </div>
                        </div>
                    {% endif %}
                    <label for="{{ form.offers.id_for_offers }}">
                        {{ form.offers.label }}
                    </label>
                    {% render_field form.offers %}
                    <div class="help-text">
                        {{ form.offers.help_text }}
                    </div>
                </div>
            </div>
        </div>
        <div class="rounded border border-solid border-blue-500 shadow-2xl bg-white">
            <div class="p-4 rounded bg-water-500">
                <h3 class="heading font-bold text-black">
                    <i icon-name="image" class="mr-2"></i> {{ form.icon.label }}
                </h3>
            </div>
            <div class="p-4">
                {% render_field form.icon label=form.icon.label %}
            </div>
        </div>
        {% if not form.instance.id %}
            <div class="rounded border border-solid border-blue-500 shadow-2xl bg-white">
                <div class="p-4 rounded bg-water-500">
                    <h3 class="heading font-bold text-black">
                        <i icon-name="copy" class="mr-2"></i> {% translate "Duplicate content of another region" %}
                    </h3>
                </div>
                <div class="px-4 pb-4">
                    <label for="{{ form.duplicated_region.id_for_label }}">
                        {{ form.duplicated_region.label }}
                    </label>
                    {% render_field form.duplicated_region %}
                    {% render_field form.duplication_keep_status %}
                    <label for="{{ form.duplication_keep_status.id_for_label }}">
                        {{ form.duplication_keep_status.label }}
                    </label>
                    <div class="help-text">
                        {{ form.duplication_keep_status.help_text }}
                    </div>
                    <label for="{{ form.duplication_pbo_behavior.id_for_label }}">
                        {{ form.duplication_pbo_behavior.label }}
                    </label>
                    {% render_field form.duplication_pbo_behavior %}
                    <div class="help-text">
                        {{ form.duplication_pbo_behavior.help_text }}
                    </div>
                </div>
            </div>
        {% endif %}
    </div>
</div>
{% if form.instance.id and perms.cms.delete_region %}
    <div class="pt-2 pb-4">
        <button title="{% translate "Delete region" %}"
                class="btn confirmation-button btn-red"
                data-confirmation-title="{% translate "Please confirm that you really want to delete this region." %}"
                data-confirmation-text="{% translate "This can not be reversed." %} {% translate "All pages, events and locations of this region will also be deleted." %} {% translate "Users, who only have access to this region, will be removed as well." %}"
                data-confirmation-subject="{{ form.name.value }}"
                data-action="{% url 'delete_region' slug=form.instance.slug %}">
            <i icon-name="trash-2"></i>
            {% translate "Delete this region" %}
        </button>
    </div>
{% endif %}
</form>
{{ media_config_data|json_script:"media_config_data" }}
{% include "../generic_confirmation_dialog.html" %}
{% endblock content %}