<commit_before>{% extends "forms/field.html.twig" %}

{% macro bytesToSize(bytes) -%}
    {% spaceless %}
        {% set kilobyte = 1024 %}
        {% set megabyte = kilobyte * 1024 %}
        {% set gigabyte = megabyte * 1024 %}
        {% set terabyte = gigabyte * 1024 %}

        {% if bytes < kilobyte %}
            {{ bytes ~ ' B' }}
        {% elseif bytes < megabyte %}
            {{ (bytes / kilobyte)|number_format(2, '.') ~ ' KB' }}
        {% elseif bytes < gigabyte %}
            {{ (bytes / megabyte)|number_format(2, '.') ~ ' MB' }}
        {% elseif bytes < terabyte %}
            {{ (bytes / gigabyte)|number_format(2, '.') ~ ' GB' }}
        {% else %}
            {{ (bytes / terabyte)|number_format(2, '.') ~ ' TB' }}
        {% endif %}
    {% endspaceless %}
{%- endmacro %}

{% macro preview(path, value, global) %}
    {% if value %}
        {% set uri = global.grav.uri %}
        {% set files = global.files %}
        {% set config = global.grav.config %}
        {% set route = global.context.route() %}

        {% set type = global.blueprint_type ? global.blueprint_type : global.admin.location ? global.admin.location : 'config' %}

        {% set blueprint_name = global.blueprints.getFilename %}
        {% if type == 'pages' %}
            {% set blueprint_name = type ~ '/' ~ blueprint_name %}
        {% endif %}
        {% set blueprint = base64_encode(blueprint_name) %}
        {% set real_path = value.thumb ?? global.context.media[path].relativePath ?? global.form.getPagePathFromToken(path) ?? global.admin.getPagePathFromToken(path) %}

        {% set remove = remove ?: uri.addNonce(
            global.file_url_remove ~
            '/media.json' ~
            '/route' ~ config.system.param_sep ~ base64_encode(global.base_path ~ '/' ~ real_path) ~
            '/task' ~ config.system.param_sep ~ 'removeFileFromBlueprint' ~
            '/proute' ~ config.system.param_sep ~ base64_encode(route) ~
            '/blueprint' ~ config.system.param_sep ~ blueprint ~
            '/type' ~ config.system.param_sep ~ type ~
            '/field' ~ config.system.param_sep ~ files.name ~
            '/path' ~ config.system.param_sep ~ base64_encode(value.path), 'admin-form', 'admin-nonce') %}

        {% set file = value|merge({remove: remove, path: value.thumb_url ?? (uri.rootUrl == '/' ? '/' : uri.rootUrl ~ '/' ~ real_path) }) %}
        <div class="hidden" data-file="{{ file|json_encode|e('html_attr') }}"></div>
    {% endif %}
{% endmacro %}

{% import _self as macro %}

{% set defaults = config.plugins.form %}
{% set files = defaults.files|merge(field|default([])) %}
{% set limit = not field.multiple ? 1 : files.limit %}

{% block input %}
    {% set form_max_filesize = form_max_filesize ?: config.system.media.upload_limit  / 1024 / 1024 %}
    {% set page_can_upload = exists or (type == 'page' and not exists and not (field.destination starts with '@self' or field.destination starts with 'self@')) %}
    {% if form or (type is not defined or page_can_upload) %}

    {% block prepend %}{% endblock %}
    {% set settings = {name: field.name, paramName: (scope ~ field.name)|fieldName ~ (files.multiple ? '[]' : ''), limit: limit, filesize: form_max_filesize, accept: files.accept, resolution: files.resolution, resizeWidth: files.resizeWidth, resizeHeight: files.resizeHeight, resizeQuality: files.resizeQuality } %}
    {% set dropzoneSettings = field.dropzone %}
    {% if form.getMediaTaskRoute() %}
        {% set file_url_add = base_url_relative ~ form.getMediaTaskRoute({}, 'json') %}
        {% set file_task_add = {task: 'media.upload', name: field.name, '__form-name__': form.name, '__unique_form_id__': form.uniqueid} %}

        {% set file_url_remove = base_url_relative ~ form.getMediaTaskRoute({}, 'json') %}
        {% set file_task_remove = {task: 'media.delete', name: field.name, '__form-name__': form.name, '__unique_form_id__': form.uniqueid} %}
    {% else %}
        {% set file_url_remove = file_url_remove ?: base_url_relative %}
    {% endif %}

    <div class="{{ form_field_wrapper_classes ?: 'form-input-wrapper' }} {{ field.classes }} dropzone files-upload {% if field.fancy is not same as(false) %}form-input-file{% endif %} {{ field.size }}"
         data-grav-file-settings="{{ settings|json_encode|e('html_attr') }}"
         data-dropzone-options="{{ dropzoneSettings|json_encode|e('html_attr') }}"
         {% if file_task_add %}
             data-file-post-add="{{ file_task_add|json_encode|e('html_attr') }}"
             data-file-post-remove="{{ file_task_remove|json_encode|e('html_attr') }}"
         {% endif %}
         {% if file_url_add %}data-file-url-add="{{ file_url_add }}"{% endif %}
         {% if file_url_remove %}data-file-url-remove="{{ file_url_remove }}"{% endif %}
    >

    {% block file_extras %}{% endblock %}
    <input
            {# required attribute structures #}
            {% block input_attributes %}
                type="file"
                {% if files.multiple %}multiple="multiple"{% endif %}
                {% if files.accept %}accept="{{ files.accept|join(',') }}"{% endif %}
                {% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}
                {% if field.random_name %}random="true"{% endif %}
                {% if required %}required="required"{% endif %}
                {{ parent() }}
            {% endblock %}
    />

    {% for path, file in value %}
        {{ macro.preview(path, file, _context) }}
    {% endfor %}
    {% include 'forms/fields/hidden/hidden.html.twig' with {field: {name: '_json.' ~ field.name}, value: value|json_encode} %}
    </div>

    {% else %}
        <span class="note">{{ "PLUGIN_ADMIN.CANNOT_ADD_FILES_PAGE_NOT_SAVED"|tu|raw }}</span>
    {% endif %}
{% endblock %}
<commit_msg>Minor cleanup on file field<commit_after>{% extends "forms/field.html.twig" %}

{% macro bytesToSize(bytes) -%}
    {% spaceless %}
        {% set kilobyte = 1024 %}
        {% set megabyte = kilobyte * 1024 %}
        {% set gigabyte = megabyte * 1024 %}
        {% set terabyte = gigabyte * 1024 %}

        {% if bytes < kilobyte %}
            {{ bytes ~ ' B' }}
        {% elseif bytes < megabyte %}
            {{ (bytes / kilobyte)|number_format(2, '.') ~ ' KB' }}
        {% elseif bytes < gigabyte %}
            {{ (bytes / megabyte)|number_format(2, '.') ~ ' MB' }}
        {% elseif bytes < terabyte %}
            {{ (bytes / gigabyte)|number_format(2, '.') ~ ' GB' }}
        {% else %}
            {{ (bytes / terabyte)|number_format(2, '.') ~ ' TB' }}
        {% endif %}
    {% endspaceless %}
{%- endmacro %}

{% macro preview(path, value, global) %}
    {% if value %}
        {% set uri = global.grav.uri %}
        {% set files = global.files %}
        {% set config = global.grav.config %}
        {% set route = global.context.route() %}

        {% set type = global.blueprint_type ? global.blueprint_type : global.admin.location ? global.admin.location : 'config' %}

        {% set blueprint_name = global.blueprints.getFilename %}
        {% if type == 'pages' %}
            {% set blueprint_name = type ~ '/' ~ blueprint_name %}
        {% endif %}
        {% set blueprint = base64_encode(blueprint_name) %}
        {% set real_path = value.thumb ?? global.context.media[path].relativePath ?? global.form.getPagePathFromToken(path) ?? global.admin.getPagePathFromToken(path) %}

        {% set remove = global.file_task_remove ? global.file_url_remove : uri.addNonce(
            global.file_url_remove ~
            '/media.json' ~
            '/route' ~ config.system.param_sep ~ base64_encode(global.base_path ~ '/' ~ real_path) ~
            '/task' ~ config.system.param_sep ~ 'removeFileFromBlueprint' ~
            '/proute' ~ config.system.param_sep ~ base64_encode(route) ~
            '/blueprint' ~ config.system.param_sep ~ blueprint ~
            '/type' ~ config.system.param_sep ~ type ~
            '/field' ~ config.system.param_sep ~ files.name ~
            '/path' ~ config.system.param_sep ~ base64_encode(value.path), 'admin-form', 'admin-nonce') %}

        {% set file = value|merge({remove: remove, path: value.thumb_url ?? (uri.rootUrl == '/' ? '/' : uri.rootUrl ~ '/' ~ real_path) }) %}
        <div class="hidden" data-file="{{ file|json_encode|e('html_attr') }}"></div>
    {% endif %}
{% endmacro %}

{% import _self as macro %}

{% set defaults = config.plugins.form %}
{% set files = defaults.files|merge(field|default([])) %}
{% set limit = not field.multiple ? 1 : files.limit %}

{% block input %}
    {% set form_max_filesize = form_max_filesize ?: config.system.media.upload_limit  / 1024 / 1024 %}
    {% set page_can_upload = exists or (type == 'page' and not exists and not (field.destination starts with '@self' or field.destination starts with 'self@')) %}
    {% if form or (type is not defined or page_can_upload) %}

    {% block prepend %}{% endblock %}
    {% set settings = {name: field.name, paramName: (scope ~ field.name)|fieldName ~ (files.multiple ? '[]' : ''), limit: limit, filesize: form_max_filesize, accept: files.accept, resolution: files.resolution, resizeWidth: files.resizeWidth, resizeHeight: files.resizeHeight, resizeQuality: files.resizeQuality } %}
    {% set dropzoneSettings = field.dropzone %}
    {% if form.getMediaTaskRoute() %}
        {% set file_url_add = base_url_relative ~ form.getMediaTaskRoute({}, 'json') %}
        {% set file_task_add = {task: 'media.upload', name: field.name, '__form-name__': form.name, '__unique_form_id__': form.uniqueid} %}

        {% set file_url_remove = base_url_relative ~ form.getMediaTaskRoute({}, 'json') %}
        {% set file_task_remove = {task: 'media.delete', name: field.name, '__form-name__': form.name, '__unique_form_id__': form.uniqueid} %}
    {% else %}
        {% set file_url_remove = file_url_remove ?: base_url_relative %}
    {% endif %}

    <div class="{{ form_field_wrapper_classes ?: 'form-input-wrapper' }} {{ field.classes }} dropzone files-upload {% if field.fancy is not same as(false) %}form-input-file{% endif %} {{ field.size }}"
         data-grav-file-settings="{{ settings|json_encode|e('html_attr') }}"
         data-dropzone-options="{{ dropzoneSettings|json_encode|e('html_attr') }}"
         {% if file_task_add and file_task_remove %}
             data-file-post-add="{{ file_task_add|json_encode|e('html_attr') }}"
             data-file-post-remove="{{ file_task_remove|json_encode|e('html_attr') }}"
             data-file-url-add="{{ file_url_add }}"
             data-file-url-remove="{{ file_url_remove }}"
         {% else %}
             {% if file_url_add %}data-file-url-add="{{ file_url_add }}"{% endif %}
             {% if file_url_remove %}data-file-url-remove="{{ file_url_remove }}"{% endif %}
         {% endif %}
    >

    {% block file_extras %}{% endblock %}
    <input
            {# required attribute structures #}
            {% block input_attributes %}
                type="file"
                {% if files.multiple %}multiple="multiple"{% endif %}
                {% if files.accept %}accept="{{ files.accept|join(',') }}"{% endif %}
                {% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}
                {% if field.random_name %}random="true"{% endif %}
                {% if required %}required="required"{% endif %}
                {{ parent() }}
            {% endblock %}
    />

    {% for path, file in value %}
        {{ macro.preview(path, file, _context) }}
    {% endfor %}
    {% include 'forms/fields/hidden/hidden.html.twig' with {field: {name: '_json.' ~ field.name}, value: value|json_encode} %}
    </div>

    {% else %}
        <span class="note">{{ "PLUGIN_ADMIN.CANNOT_ADD_FILES_PAGE_NOT_SAVED"|tu|raw }}</span>
    {% endif %}
{% endblock %}

{'fraction_non_alphanumeric': 0.17126417329497376, 'fraction_numerical': 0.006261634794381452, 'mean_word_length': 2.7061774851050484, 'pattern_counts': {'":': 0, '<': 25, '<?xml version=': 0, '>': 17, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4935813', 'n_tokens_mistral': 4016, 'n_tokens_neox': 3573, 'n_words': 730}