add plugins
This commit is contained in:
@@ -0,0 +1,114 @@
|
||||
{% if not field.validate.ignore %}
|
||||
|
||||
{% if not blueprints or (blueprints.schema.type(field.type)['input@'] ?? true) is same as(true) %}
|
||||
{% set originalValue = originalValue is defined ? originalValue : value %}
|
||||
{% set toggleableChecked = field.toggleable and (originalValue is not null and originalValue is not empty) %}
|
||||
{% set isDisabledToggleable = field.toggleable and not toggleableChecked %}
|
||||
{% set value = (value is null ? field.default : value) %}
|
||||
|
||||
{% if (field.yaml or field.validate.type == 'yaml') and value is iterable%}
|
||||
{% set value = value|toYaml %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% set vertical = field.style == 'vertical' %}
|
||||
{% set field_name = (scope ~ field.name)|fieldName %}
|
||||
|
||||
{% block field %}
|
||||
<div class="form-field grid{% if vertical %} vertical{% endif %}{% if field.toggleable %} form-field-toggleable{% endif %} {{ field.outerclasses }} {{ field.field_classes }}">
|
||||
{% block contents %}
|
||||
<div class="form-label{% if not vertical %} block size-1-3{% endif %}">
|
||||
{% if field.toggleable %}
|
||||
<span class="checkboxes toggleable" data-grav-field="toggleable" data-grav-field-name="{{ field_name }}">
|
||||
<input type="checkbox"
|
||||
id="toggleable_{{ field.name }}"
|
||||
{% if toggleableChecked %}value="1"{% endif %}
|
||||
name="toggleable_{{ field_name }}"
|
||||
{% if toggleableChecked %}checked="checked"{% endif %}
|
||||
>
|
||||
<label for="toggleable_{{ field.name }}"></label>
|
||||
</span>
|
||||
{% endif %}
|
||||
<label{{ (field.toggleable ? ' class="toggleable" for="toggleable_' ~ field.name ~ '"')|raw }}>
|
||||
{% block label %}
|
||||
{% if field.help %}
|
||||
{% if field.markdown %}
|
||||
<span class="hint--bottom" data-hint="{{ field.help|tu|markdown(false)|e('html') }}">{{ field.label|tu|markdown(false)|raw }}</span>
|
||||
{% else %}
|
||||
<span class="hint--bottom" data-hint="{{ field.help|tu|e('html') }}">{{ field.label|tu|raw }}</span>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{% if field.markdown %}
|
||||
{{ field.label|tu|markdown(false)|raw }}
|
||||
{% else %}
|
||||
{{ field.label|tu|raw }}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{{ field.validate.required in ['on', 'true', 1] ? '<span class="required">*</span>' }}
|
||||
{% endblock %}
|
||||
</label>
|
||||
{% if field.sublabel %}
|
||||
<div class="form-sublabel">
|
||||
{% if field.markdown %}
|
||||
{{ field.sublabel|tu|markdown(false)|raw }}
|
||||
{% else %}
|
||||
{{ field.sublabel|tu|raw }}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="form-data{% if not vertical %} block size-2-3{% endif %}"
|
||||
{% block global_attributes %}
|
||||
data-grav-field="{{ field.type }}"
|
||||
data-grav-disabled="{{ toggleableChecked }}"
|
||||
data-grav-default="{{ field.default|json_encode|e('html_attr') }}"
|
||||
{% endblock %}
|
||||
>
|
||||
{% block group %}
|
||||
{% block input %}
|
||||
<div class="form-input-wrapper {{ field.size }} {{ field.wrapper_classes }}">
|
||||
{% block prepend %}{% endblock prepend %}
|
||||
<input
|
||||
{# required attribute structures #}
|
||||
name="{{ field_name }}"
|
||||
value="{{ value|join(',') }}"
|
||||
{% if field.key %}
|
||||
data-key-observe="{{ (scope ~ field_name)|fieldName }}"
|
||||
{% endif %}
|
||||
{# input attribute structures #}
|
||||
{% block input_attributes %}
|
||||
{% if field.classes is defined %}class="{{ field.classes }}" {% endif %}
|
||||
{% if field.id is defined %}id="{{ field.id|e }}" {% endif %}
|
||||
{% if field.style is defined %}style="{{ field.style|e }}" {% endif %}
|
||||
{% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}
|
||||
{% if field.placeholder %}placeholder="{{ field.placeholder|tu }}"{% endif %}
|
||||
{% if field.autofocus in ['on', 'true', 1] %}autofocus="autofocus"{% endif %}
|
||||
{% if field.novalidate in ['on', 'true', 1] %}novalidate="novalidate"{% endif %}
|
||||
{% if field.readonly in ['on', 'true', 1] %}readonly="readonly"{% endif %}
|
||||
{% if field.autocomplete is defined %}autocomplete="{{ field.autocomplete }}"{% endif %}
|
||||
{% if field.validate.required in ['on', 'true', 1] %}required="required"{% endif %}
|
||||
{% if field.validate.pattern %}pattern="{{ field.validate.pattern }}"{% endif %}
|
||||
{% if field.validate.message %}title="{{ field.validate.message|e|tu }}"
|
||||
{% elseif field.title is defined %}title="{{ field.title|e|tu }}" {% endif %}
|
||||
{% endblock %}
|
||||
/>
|
||||
{% block append %}{% endblock append %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% endblock %}
|
||||
{% if field.description %}
|
||||
<div class="form-extra-wrapper {{ field.wrapper_classes }}">
|
||||
<span class="form-description">
|
||||
{% if field.markdown %}
|
||||
{{ field.description|tu|markdown(false)|raw }}
|
||||
{% else %}
|
||||
{{ field.description|tu|raw }}
|
||||
{% endif %}
|
||||
</span>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% endif %}
|
||||
@@ -0,0 +1,96 @@
|
||||
{% extends "forms/field.html.twig" %}
|
||||
|
||||
{% macro renderer(key, text, field, scope) %}
|
||||
|
||||
{% if text is not iterable %}
|
||||
<div class="form-row{% if field.value_only %} array-field-value_only{% endif %}"
|
||||
data-grav-array-type="row">
|
||||
<span data-grav-array-action="sort" class="fa fa-bars"></span>
|
||||
{% if field.value_only != true %}
|
||||
{% if key == '0' and text == '' %}
|
||||
{% set key = '' %}
|
||||
{% endif %}
|
||||
|
||||
<input
|
||||
data-grav-array-type="key"
|
||||
type="text" value="{{ key }}"
|
||||
{% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}
|
||||
placeholder="{{ field.placeholder_key|e|tu }}" />
|
||||
{% endif %}
|
||||
|
||||
{% if field.value_type == 'textarea' %}
|
||||
<textarea
|
||||
data-grav-array-type="value"
|
||||
name="{{ ((scope ~ field.name)|fieldName) ~ '[' ~ key ~ ']' }}"
|
||||
placeholder="{{ field.placeholder_value|e|tu }}"
|
||||
{% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}>{{ text }}</textarea>
|
||||
{% else %}
|
||||
<input
|
||||
data-grav-array-type="value"
|
||||
type="text"
|
||||
name="{{ ((scope ~ field.name)|fieldName) ~ '[' ~ key ~ ']' }}"
|
||||
placeholder="{{ field.placeholder_value|e|tu }}"
|
||||
{% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}
|
||||
value={% if text == 'true' %}true{% elseif text == 'false' %}false{% else %}"{{ text|join(', ')|e }}"{% endif %} />
|
||||
{% endif %}
|
||||
|
||||
<span data-grav-array-action="rem" class="fa fa-minus"></span>
|
||||
<span data-grav-array-action="add" class="fa fa-plus"></span>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endmacro %}
|
||||
|
||||
{% import _self as array_field %}
|
||||
|
||||
{% block global_attributes %}
|
||||
data-grav-array-name="{{ (scope ~ field.name)|fieldName }}"
|
||||
data-grav-array-keyname="{{ field.placeholder_key|e|tu }}"
|
||||
data-grav-array-valuename="{{ field.placeholder_value|e|tu }}"
|
||||
data-grav-array-textarea="{{ field.value_type == 'textarea' }}"
|
||||
{{ parent() }}
|
||||
{% endblock %}
|
||||
|
||||
{% block input %}
|
||||
<div class="{{ field.size }}" data-grav-array-type="container"{% if field.value_only %} data-grav-array-mode="value_only"{% endif %}{{ value|length <= 1 ? ' class="one-child"' : '' }}>
|
||||
{% if value|length %}
|
||||
{% for key, text in value -%}
|
||||
{% if text is not iterable %}
|
||||
{{ array_field.renderer(key, text, field, scope) }}
|
||||
{% else %}
|
||||
{# Backward compatibility for nested arrays (metas) which are not supported anymore #}
|
||||
{% for subkey, subtext in text -%}
|
||||
{{ array_field.renderer(key ~ '[' ~ subkey ~ ']', subtext, field, scope) }}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{%- else -%}
|
||||
{# Empty value, mock the entry field#}
|
||||
<div class="form-row" data-grav-array-type="row">
|
||||
<span data-grav-array-action="sort" class="fa fa-bars"></span>
|
||||
{% if field.value_only != true %}
|
||||
<input
|
||||
data-grav-array-type="key"
|
||||
type="text"
|
||||
{% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}
|
||||
placeholder="{{ field.placeholder_key|e|tu }}" />
|
||||
{% endif %}
|
||||
{% if field.value_type == 'textarea' %}
|
||||
<textarea
|
||||
data-grav-array-type="value"
|
||||
name="{{ (scope ~ field.name)|fieldName }}"
|
||||
{% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}
|
||||
placeholder="{{ field.placeholder_value|e|tu }}"></textarea>
|
||||
{% else %}
|
||||
<input
|
||||
data-grav-array-type="value"
|
||||
type="text"
|
||||
name="{{ (scope ~ field.name)|fieldName }}"
|
||||
{% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}
|
||||
placeholder="{{ field.placeholder_value|e|tu }}" />
|
||||
{% endif %}
|
||||
<span data-grav-array-action="rem" class="fa fa-minus"></span>
|
||||
<span data-grav-array-action="add" class="fa fa-plus"></span>
|
||||
</div>
|
||||
{%- endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
{% set delete_url = uri.addNonce(base_url_relative ~ "/backup.json/backup:%BACKUP_FILE/task" ~ config.system.param_sep ~ 'backupDelete', 'admin-form', 'admin-nonce') %}
|
||||
<table class="backups-history noflex">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th>{{ "PLUGIN_ADMIN.BACKUP_DATE"|tu }}</th>
|
||||
<th>{{ "PLUGIN_ADMIN.NAME"|tu }}</th>
|
||||
<th class="right pad">{{ "PLUGIN_ADMIN.SIZE"|tu }}</th>
|
||||
<th class="right pad">{{ "PLUGIN_ADMIN.ACTION"|tu }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for backup in backups|default([]) %}
|
||||
{% set encoded_name = backup.filename|base64_encode|url_encode %}
|
||||
{% set backup_delete = delete_url|replace({'%BACKUP_FILE': encoded_name}) %}
|
||||
<tr>
|
||||
<td>{{ loop.index }}</td>
|
||||
<td> <i class="fa fa-clock-o"></i> {{ backup.date|date }}</td>
|
||||
<td>{{ backup.title }}</td>
|
||||
<td class="right pad">{{ backup.size|nicefilesize }}</td>
|
||||
<td class="right pad nowrap" >
|
||||
<a class="button button-small hint--bottom" href="{{ grav.backups.getBackupDownloadUrl(backup.path, admin.base) }}" data-hint="Download"><i class="fa fa-download"></i></a>
|
||||
<span class="button button-small danger hint--bottom" data-hint="Delete" data-backup data-ajax="{{ backup_delete }}"><i class="fa fa-close"></i></span>
|
||||
</td>
|
||||
</tr>
|
||||
{% else %}
|
||||
<tr>
|
||||
<td colspan="5" class="error" style="text-align: center;">{{ "PLUGIN_ADMIN.BACKUPS_NOT_GENERATED"|tu }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -0,0 +1,12 @@
|
||||
{% extends "forms/field.html.twig" %}
|
||||
|
||||
{% block field %}
|
||||
<input
|
||||
data-grav-field="hidden"
|
||||
data-grav-disabled="false"
|
||||
type="hidden"
|
||||
class="input"
|
||||
{% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}
|
||||
name="{{ (scope ~ field.name)|fieldName }}"
|
||||
value="{{ blueprints.name }}" />
|
||||
{% endblock %}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
{% extends "forms/field.html.twig" %}
|
||||
{% set originalValue = originalValue is defined ? originalValue : value %}
|
||||
{% set value = (value is null ? field.default : value) %}
|
||||
{% set pattern = '^#([a-fA-F0-9]{6})|(rgba\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*((0.[0-9]+)|(1.00)|1.0|1)\\s*\\))$' %}
|
||||
|
||||
{% block input %}
|
||||
<div class="form-list-wrapper {{ field.size }}" data-type="collection">
|
||||
<div class="g-colorpicker">
|
||||
<input
|
||||
data-grav-colorpicker="{{ {update: '.g-colorpicker-preview-wrap .g-colorpicker-preview'}|json_encode|e('html_attr') }}"
|
||||
{# required attribute structures #}
|
||||
name="{{ (scope ~ field.name)|fieldName }}"
|
||||
value="{{ value|raw|join(', ') }}"
|
||||
type="text"
|
||||
{# input attribute structures #}
|
||||
{% block input_attributes %}
|
||||
{% if field.classes is defined %}class="{{ field.classes }}" {% endif %}
|
||||
{% if field.id is defined %}id="{{ field.id|e }}" {% endif %}
|
||||
{% if field.style is defined %}style="{{ field.style|e }}" {% endif %}
|
||||
{% if field.disabled %}disabled="disabled"{% endif %}
|
||||
{% if field.placeholder %}placeholder="{{ field.placeholder }}"{% endif %}
|
||||
{% if field.autofocus in ['on', 'true', 1] %}autofocus="autofocus"{% endif %}
|
||||
{% if field.novalidate in ['on', 'true', 1] %}novalidate="novalidate"{% endif %}
|
||||
{% if field.readonly in ['on', 'true', 1] %}readonly="readonly"{% endif %}
|
||||
{% if field.autocomplete in ['on', 'off'] %}autocomplete="{{ field.autocomplete }}"{% endif %}
|
||||
{% if field.validate.required in ['on', 'true', 1] %}required="required"{% endif %}
|
||||
pattern="{{ field.validate.pattern|default(pattern)|raw }}"
|
||||
{% if field.validate.message %}title="{{ field.validate.message|e|t }}"
|
||||
{% elseif field.title is defined %}title="{{ field.title|e|t }}" {% endif %}
|
||||
{% endblock %}
|
||||
/>
|
||||
<div class="g-colorpicker-preview-wrap">
|
||||
<div class="g-colorpicker-preview" style="background-color: {{ value|e }}"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
{% extends "forms/field.html.twig" %}
|
||||
|
||||
{% block field %}
|
||||
{% if field.fields %}
|
||||
<div class="form-column block pure-u-1-{{ cols }}">
|
||||
{% for child in field.fields %}
|
||||
{% if child.type and not child.validate.ignore %}
|
||||
{% set value = child.name ? data.value(child.name) : data.toArray %}
|
||||
{% include ["forms/fields/#{child.type}/#{child.type}.html.twig", 'forms/fields/text/text.html.twig'] with {field: child} %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,12 @@
|
||||
{% extends "forms/field.html.twig" %}
|
||||
|
||||
{% block field %}
|
||||
<div class="form-columns grid pure-g">
|
||||
{% if field.fields %}
|
||||
{% set cols = field.fields|length %}
|
||||
{% for child in field.fields %}
|
||||
{% include ["forms/fields/#{child.type}/#{child.type}.html.twig", 'forms/fields/column/column.html.twig'] with {field: child, cols: cols} %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,6 @@
|
||||
{% extends "forms/field.html.twig" %}
|
||||
|
||||
{% block input %}
|
||||
<input type="hidden" class="input" name="{{ (scope ~ field.name)|fieldName }}" value="{{ value|join(', ') }}" />
|
||||
<div class="cron-selector"></div>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,71 @@
|
||||
{% set jobs = grav.scheduler.getAllJobs() %}
|
||||
{% set job_states = grav.scheduler.getJobStates().content() %}
|
||||
|
||||
<table class="cron-status noflex">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="flex:3;">Job ID</th>
|
||||
<th style="flex:3;">Run</th>
|
||||
<th>Status</th>
|
||||
<th class="right pad">State</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for job in jobs %}
|
||||
{% set job_status = attribute(data.status,job.id) %}
|
||||
{% set job_enabled = job_status is defined and job_status == 'disabled' ? 0 : 1 %}
|
||||
{% set job_id = job.id %}
|
||||
{% set job_id_md5 = job_id|md5 %}
|
||||
{% set job_state = attribute(job_states, job_id) %}
|
||||
{% set job_at = job.getAt|default('* * * * *') %}
|
||||
{% set job_backlink = job.backlink %}
|
||||
<tr>
|
||||
<td style="flex:3;overflow:hidden;">
|
||||
{% if job_backlink %}
|
||||
<a href="{{ base_url_relative ~ job_backlink }}"><kbd>{{ job.id }}</kbd></a>
|
||||
{% else %}
|
||||
<kbd>{{ job.id }}</kbd>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td style="flex:3;" class="cron-at">
|
||||
{% if job_enabled %}
|
||||
<span class="hint--bottom" data-hint="next run: {{ cron(job_at).getNextRunDate()|date(config.date_format.default) }}">{{ job_at|nicecron }}</span>
|
||||
{% else %}
|
||||
{{ job_at|nicecron }}
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{% if job_state.state == 'failure' %}
|
||||
{% set run_type = 'error' %}
|
||||
{% set run_hint = job_state.error %}
|
||||
{% set run_text = "<i class=\"fa fa-warning\"></i> Failure" %}
|
||||
{% else %}
|
||||
{% set run_type = 'info' %}
|
||||
{% if job_state.state is not defined %}
|
||||
{% set run_hint = "not run yet" %}
|
||||
{% set run_text = "<i class=\"fa fa-check\"></i> Ready" %}
|
||||
{% else %}
|
||||
{% set run_hint = "last run: " ~ attribute(job_state,'last-run')|date(config.date_format.default) %}
|
||||
{% set run_text = "<i class=\"fa fa-check\"></i> Success" %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
<span class="hint--bottom" data-hint="{{ run_hint }}">
|
||||
<span class="badge {{ run_type }}">{{ run_text|raw }}</span>
|
||||
</span>
|
||||
</td>
|
||||
<td class="right pad">
|
||||
<div class="form-data" data-grav-field="toggle" data-grav-disabled="" data-grav-default="null" data-grav-field-name="data[status][{{ job_id }}]">
|
||||
<div class="switch-toggle switch-grav switch-2 ">
|
||||
<input type="radio" value="enabled" id="toggle_status.{{ job_id_md5 }}1" name="data[status][{{ job_id }}]" class="highlight" {% if job_enabled %}checked="checked"{% endif %}>
|
||||
<label for="toggle_status.{{ job_id_md5 }}1">Enabled</label>
|
||||
|
||||
<input type="radio" value="disabled" id="toggle_status.{{ job_id_md5 }}0" name="data[status][{{ job_id }}]" class="" {% if not job_enabled %}checked="checked"{% endif %}>
|
||||
<label for="toggle_status.{{ job_id_md5 }}0">Disabled</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -0,0 +1,24 @@
|
||||
{% extends "forms/field.html.twig" %}
|
||||
|
||||
{% block global_attributes %}
|
||||
data-grav-selectize="{{ (field.selectize is defined ? field.selectize : {})|json_encode()|e('html_attr') }}"
|
||||
data-grav-field="select"
|
||||
{{ parent() }}
|
||||
{% endblock %}
|
||||
|
||||
{% block input %}
|
||||
<div class="form-select-wrapper {{ field.size }}">
|
||||
<select class="{{ field.classes }}" name="{{ (scope ~ field.name)|fieldName ~ (field.multiple ? '[]' : '') }}"
|
||||
{% if field.autofocus in ['on', 'true', 1] %}autofocus="autofocus"{% endif %}
|
||||
{% if field.novalidate in ['on', 'true', 1] %}novalidate="novalidate"{% endif %}
|
||||
{% if field.validate.required in ['on', 'true', 1] %}required="required"{% endif %}
|
||||
{% if field.multiple in ['on', 'true', 1] %}multiple="multiple"{% endif %}
|
||||
{% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}
|
||||
{% if field.form %}form="{{ field.form }}"{% endif %}
|
||||
>
|
||||
{% for key, text in field.options %}
|
||||
<option {% if key == value or text in value %}selected="selected"{% endif %} value="{{ field.multiple ? text : key }}">{{ key is empty ? text : "now"|date(key)|e }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,26 @@
|
||||
{% extends "forms/field.html.twig" %}
|
||||
|
||||
{% set value = (value is null ? field.default : value) %}
|
||||
{% set default_php_dateformat = admin.guessDateFormat(value) %}
|
||||
{% set php_dateformat = field.format ?: admin.page.dateformat ?: config.system.pages.dateformat.default ?: default_php_dateformat %}
|
||||
{% set js_dateformat = admin.dateformatToMomentJS(php_dateformat) %}
|
||||
{% set value = (value is null ? value : value|date(php_dateformat)) %}
|
||||
|
||||
{% block input %}
|
||||
<div class="form-input-wrapper datetime-picker-wrapper {{ field.size }}">
|
||||
<input
|
||||
name="{{ (scope ~ field.name)|fieldName }}"
|
||||
value="{{ value|raw|join(', ') }}"
|
||||
{% block input_attributes %}
|
||||
type="text"
|
||||
data-grav-datetime="{{ {'format': js_dateformat} | json_encode | e('html_attr') }}"
|
||||
{% if field.validate.min %}min="{{ (field.validate.min is null ? field.validate.min : field.validate.min|date(php_dateformat)) }}"{% endif %}
|
||||
{% if field.validate.max %}max="{{ (field.validate.max is null ? field.validate.max : field.validate.max|date(php_dateformat)) }}"{% endif %}
|
||||
{{ parent() }}
|
||||
{% endblock %}
|
||||
/>
|
||||
<span class="field-icons">
|
||||
<i class="fa fa-fw fa-calendar"></i>
|
||||
</span>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,50 @@
|
||||
{% extends "forms/field.html.twig" %}
|
||||
|
||||
{% set value = (value is null ? field.default|tu : value) %}
|
||||
{% if not codemirrorOptions %}
|
||||
{% set codemirrorOptions = {'mode': 'gfm', 'ignore': ['code', 'preview']}|merge(field.codemirror|default({})) %}
|
||||
{% endif %}
|
||||
|
||||
{% block field %}
|
||||
{% block label %}
|
||||
{% if field.label %}
|
||||
{% if field.help %}
|
||||
{% set hint = 'data-hint="' ~ field.help|tu|raw ~ '"' %}
|
||||
{% endif %}
|
||||
<div class="form-label form-field hint--bottom" {{ hint|raw }}>{{ field.label|tu|raw }}</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
<div class="form-field {{ field.classes|default('') }}">
|
||||
<div class="form-data grav-editor">
|
||||
<div class="grav-editor-content is-active">
|
||||
<textarea
|
||||
data-grav-editor="{{ {'codemirror': codemirrorOptions} | json_encode|e('html_attr') }}"
|
||||
data-grav-editor-mode="editor"
|
||||
name="{{ (scope ~ field.name)|fieldName }}"
|
||||
{% if field.classes is defined %}class="{{ field.classes }}" {% endif %}
|
||||
{% if field.id is defined %}id="{{ field.id|e }}" {% endif %}
|
||||
{% if field.style is defined %}style="{{ field.style|e }}" {% endif %}
|
||||
{% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}
|
||||
{% if field.placeholder %}placeholder="{{ field.placeholder|tu }}"{% endif %}
|
||||
{% if field.autofocus in ['on', 'true', 1] %}autofocus="autofocus"{% endif %}
|
||||
{% if field.novalidate in ['on', 'true', 1] %}novalidate="novalidate"{% endif %}
|
||||
{% if field.readonly in ['on', 'true', 1] %}readonly="readonly"{% endif %}
|
||||
{% if field.validate.required in ['on', 'true', 1] %}required="required"{% endif %}
|
||||
{% if 'preview' not in codemirrorOptions.ignore %}data-grav-urlpreview="{{ base_url }}/media/{{ admin.route|trim('/') }}.json"{% endif %}
|
||||
>{{ value|join("\n")|e('html') }}</textarea>
|
||||
</div>
|
||||
{% if field.resizer is not defined or field.resizer not in ['off', 'false', 0] %}<div class="grav-editor-resizer"></div>{% endif %}
|
||||
{% if field.description %}
|
||||
<div class="form-extra-wrapper {{ field.size }} {{ field.wrapper_classes }}">
|
||||
<span class="form-description">
|
||||
{% if field.markdown %}
|
||||
{{ field.description|tu|markdown(false)|raw }}
|
||||
{% else %}
|
||||
{{ field.description|tu|raw }}
|
||||
{% endif %}
|
||||
</span>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,96 @@
|
||||
{% extends "forms/field.html.twig" %}
|
||||
|
||||
{% block field %}
|
||||
<div class="form-fieldset{% if vertical %} vertical{% endif %}{% if field.classes is defined %} {{ field.classes }}{% endif %}">
|
||||
{% block contents %}
|
||||
<input type="checkbox" class="hidden" id="fieldset_collapsible_{{ field.name }}"{% if not field.collapsible or not field.collapsed %} checked="checked"{% endif %} />
|
||||
|
||||
<div class="form-label form-fieldset--label">
|
||||
<h2>
|
||||
<label{% if field.collapsible %} for="fieldset_collapsible_{{ field.name }}" class="form-fieldset--cursor"{% endif %}>
|
||||
{% if field.help %}
|
||||
<span class="hint--bottom" data-hint="{{ field.help|e|tu }}">
|
||||
{% endif %}
|
||||
{% block label %}
|
||||
{% if field.icon %}
|
||||
<i class="fa fa-fw fa-{{ field.icon }}"></i>
|
||||
{% endif %}
|
||||
{{ field.title|tu }}
|
||||
{{ field.validate.required in ['on', 'true', 1] ? '<span class="required">*</span>' }}
|
||||
{% if field.info %}
|
||||
<span class="form-fieldset--info">{{ field.info|tu }}</span>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{% if field.help %}
|
||||
</span>
|
||||
{% endif %}
|
||||
|
||||
{# Actions panel #}
|
||||
<span class="actions">
|
||||
{% block actions %}
|
||||
{% if field.collapsible %}
|
||||
<span class="form-fieldset--collapsible">
|
||||
<i class="fa fa-chevron-down open"></i>
|
||||
<i class="fa fa-chevron-up close"></i>
|
||||
</span>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
</span>
|
||||
</label>
|
||||
</h2>
|
||||
</div>
|
||||
<div class="form-data"
|
||||
{#{% block global_attributes %}
|
||||
data-grav-field="{{ field.type }}"
|
||||
data-grav-disabled="{{ originalValue is null ? 'true' : 'false' }}"
|
||||
data-grav-default="{{ field.default|json_encode()|e('html_attr') }}"
|
||||
{% endblock %}#}
|
||||
>
|
||||
|
||||
{% block group %}
|
||||
{% if field.text %}
|
||||
<p>{% if grav.twig.twig.filters['tu'] is defined %}{{ field.text|tu }}{% else %}{{ field.text|t }}{% endif %}
|
||||
<p>
|
||||
{% endif %}
|
||||
|
||||
{% if field.fields %}
|
||||
{% for childName, child in field.fields %}
|
||||
{%- if childName == 'value' -%}
|
||||
{% set childKey = '' %}
|
||||
{% set childName = itemName -%}
|
||||
{%- elseif childName starts with '.' -%}
|
||||
{% set childKey = childName|trim('.') %}
|
||||
{% set childName = itemName ~ childName %}
|
||||
{% else %}
|
||||
{% set childKey = childName %}
|
||||
{% set childName = childName|replace({'*': key}) %}
|
||||
{% endif %}
|
||||
{% set child = child|merge({ name: childName }) %}
|
||||
|
||||
{% if child.type == 'key' %}
|
||||
{%
|
||||
include 'forms/fields/key/key.html.twig'
|
||||
with { field: child, value: key }
|
||||
%}
|
||||
{% elseif child.key == true %}
|
||||
{% include [
|
||||
"forms/fields/#{child.type}/#{child.type}.html.twig",
|
||||
'forms/fields/key/key.html.twig'
|
||||
] with { field: child, value: key }
|
||||
%}
|
||||
{% elseif child.type %}
|
||||
{% set originalValue = data.value(child.name) %}
|
||||
{%
|
||||
include [
|
||||
"forms/fields/#{child.type}/#{child.type}.html.twig",
|
||||
'forms/fields/text/text.html.twig'
|
||||
] with { field: child, value: data.value(child.name) }
|
||||
%}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,116 @@
|
||||
{% 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 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 %}
|
||||
@@ -0,0 +1,17 @@
|
||||
{% embed "forms/fields/select/select.html.twig" %}
|
||||
|
||||
{% block input %}
|
||||
{% if not field.options and value %}
|
||||
{% set field = field|merge({options: {(value): value}}) %}
|
||||
{% endif %}
|
||||
{{ parent() }}
|
||||
{% endblock %}
|
||||
|
||||
{% block global_attributes %}
|
||||
data-grav-filepicker
|
||||
data-name="{{field.name}}"
|
||||
{% if field.preview_images %}data-preview-images{% endif %}
|
||||
data-value="{{value}}"
|
||||
{{ parent() }}
|
||||
{% endblock %}
|
||||
{% endembed %}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
{# Deprecated field. Alias to editor/editor.html.twig #}
|
||||
|
||||
{% extends "forms/fields/editor/editor.html.twig" %}
|
||||
{% set codemirrorOptions = {'mode': 'yaml', 'indentUnit': 4, ignore: ['code'], 'autofocus': true, 'indentWithTabs': false, 'lineNumbers': true, 'gutters': ["CodeMirror-lint-markers"]}|merge(field.codemirror|default({})) %}
|
||||
|
||||
{# backward compatibility #}
|
||||
{% if field.showPreview %}
|
||||
{% set codemirrorOptions = codemirrorOptions|merge({'ignore': []}) %}
|
||||
{% endif %}
|
||||
{# end backward compatibility #}
|
||||
@@ -0,0 +1,45 @@
|
||||
{% extends "forms/field.html.twig" %}
|
||||
{% set originalValue = originalValue is defined ? originalValue : value %}
|
||||
{% set value = (value is null ? field.default : value) %}
|
||||
|
||||
{% block global_attributes %}
|
||||
data-grav-iconpicker
|
||||
data-name="{{field.name}}"
|
||||
data-value="{{value}}"
|
||||
{{ parent() }}
|
||||
{% endblock %}
|
||||
|
||||
{% block input %}
|
||||
<div class="form-list-wrapper {{ field.size }}" data-type="collection">
|
||||
<div class="icon-picker" data-pickerid="fa" data-iconsets='{"fa":"FontAwesome Icons"}'>
|
||||
<input
|
||||
{# required attribute structures #}
|
||||
name="{{ (scope ~ field.name)|fieldName }}"
|
||||
data-format="{{ field.format == 'short' ? 'short' : 'long' }}"
|
||||
value="{{ value|raw|join(', ') }}"
|
||||
type="text"
|
||||
{# input attribute structures #}
|
||||
{% block input_attributes %}
|
||||
{% if field.classes is defined %}class="{{ field.classes }}" {% endif %}
|
||||
{% if field.id is defined %}id="{{ field.id|e }}" {% endif %}
|
||||
{% if field.style is defined %}style="{{ field.style|e }}" {% endif %}
|
||||
{% if field.disabled %}disabled="disabled"{% endif %}
|
||||
{% if field.placeholder %}placeholder="{{ field.placeholder }}"{% endif %}
|
||||
{% if field.autofocus in ['on', 'true', 1] %}autofocus="autofocus"{% endif %}
|
||||
{% if field.novalidate in ['on', 'true', 1] %}novalidate="novalidate"{% endif %}
|
||||
{% if field.readonly in ['on', 'true', 1] %}readonly="readonly"{% endif %}
|
||||
{% if field.autocomplete in ['on', 'off'] %}autocomplete="{{ field.autocomplete }}"{% endif %}
|
||||
{% if field.validate.required in ['on', 'true', 1] %}required="required"{% endif %}
|
||||
{% endblock %}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="fa-set icon-set">
|
||||
<ul>
|
||||
{% for icon in fa_icons %}
|
||||
<li data-code="{{icon.unicode}}" data-class="fa fa-{{icon.id}}" class="fa fa-{{icon.id}}"></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,195 @@
|
||||
{% extends "forms/field.html.twig" %}
|
||||
|
||||
{% set value = (value is null ? field.default : value) %}
|
||||
{% set name = field.name %}
|
||||
{% set btnLabel = field.btnLabel is defined ? field.btnLabel : "PLUGIN_ADMIN.ADD_ITEM" %}
|
||||
{% set btnSortLabel = field.btnSortLabel is defined ? field.btnSortLabel : "PLUGIN_ADMIN.SORT_BY" %}
|
||||
{% set fieldControls = field.controls|default('bottom') %}
|
||||
|
||||
{% block contents %}
|
||||
<div class="form-label{% if not vertical %} block size-1-3 pure-u-1-3{% endif %}">
|
||||
{% if field.toggleable %}
|
||||
<span class="checkboxes toggleable" data-grav-field="toggleable" data-grav-field-name="{{ (scope ~ field.name)|fieldName }}">
|
||||
<input type="checkbox"
|
||||
id="toggleable_{{ field.name }}"
|
||||
{% if toggleableChecked %}value="1"{% endif %}
|
||||
name="toggleable_{{ (scope ~ field.name)|fieldName }}"
|
||||
{% if toggleableChecked %}checked="checked"{% endif %}
|
||||
>
|
||||
<label for="toggleable_{{ field.name }}"></label>
|
||||
</span>
|
||||
{% endif %}
|
||||
<label{{ (field.toggleable ? ' class="toggleable" for="toggleable_' ~ field.name ~ '"')|raw }}>
|
||||
{% if field.help %}
|
||||
<span class="hint--bottom" data-hint="{{ field.help|e|tu }}">{{ field.label|tu }}</span>
|
||||
{% else %}
|
||||
{{ field.label|tu }}
|
||||
{% endif %}
|
||||
{{ field.validate.required in ['on', 'true', 1] ? '<span class="required">*</span>' }}
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-data{% if not vertical %} block size-2-3 pure-u-2-3{% endif %}"
|
||||
{% block global_attributes %}
|
||||
data-grav-field="{{ field.type }}"
|
||||
data-grav-disabled="{{ toggleableChecked }}"
|
||||
data-grav-default="{{ field.default|json_encode|e('html_attr') }}"
|
||||
{% endblock %}
|
||||
>
|
||||
|
||||
<div class="form-list-wrapper {{ field.size }}" data-type="collection"
|
||||
{% if field.selectunique %}
|
||||
data-select-unique="{{ field.selectunique|json_encode|e('html_attr') }}"
|
||||
data-max="{{ field.selectunique|length }}"
|
||||
{% endif %}
|
||||
{% if field.min is defined %}data-min="{{ field.min }}"{% endif %}
|
||||
{% if field.max is defined and not field.selectunique %}data-max="{{ field.max }}"{% endif %}
|
||||
>
|
||||
{% if fieldControls in ['top', 'both'] %}
|
||||
<div class="collection-actions">
|
||||
{% if collapsible %}
|
||||
<button class="button" type="button" data-action="expand_all"
|
||||
{% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}><i class="fa fa-chevron-circle-down"></i> {{ "PLUGIN_ADMIN.EXPAND_ALL"|e|tu }}</button>
|
||||
<button class="button" type="button" data-action="collapse_all"
|
||||
{% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}><i class="fa fa-chevron-circle-right"></i> {{ "PLUGIN_ADMIN.COLLAPSE_ALL"|e|tu }}</button>
|
||||
{% endif %}
|
||||
{% if field.sortby %}
|
||||
<button class="button{{ not value|length ? ' hidden' : '' }}" type="button" data-action="sort" data-action-sort="{{ field.sortby }}" data-action-sort-dir="{{ field.sortby_dir|default('asc') }}"
|
||||
{% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}><i class="fa fa-sort-amount-{{ field.sortby_dir|default('asc') }}"></i> {{ btnSortLabel|e|tu }} '{{ field.sortby }}'</button>
|
||||
{% endif %}
|
||||
<button class="button" type="button" data-action="add" data-action-add="bottom"
|
||||
{% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}><i class="fa fa-plus"></i> {{ btnLabel|e|tu }}</button>
|
||||
</div>
|
||||
{% endif %}
|
||||
<ul {% if field.classes is defined %}class="{{ field.classes }}"{% endif %} data-collection-holder="{{ name }}"
|
||||
{% if field.sort is same as(false) %}
|
||||
data-collection-nosort
|
||||
{% endif %}>
|
||||
{% if field.fields %}
|
||||
{% set collapsible = field.fields|length > 1 and (field.collapsible is not defined or field.collapsible) %}
|
||||
{% for key, val in value %}
|
||||
{% set itemName = name ? name ~ '.' ~ key : key %}
|
||||
<li data-collection-item="{{ itemName }}" data-collection-key="{{ key }}" class="{{ collapsible and field.collapsed ? 'collection-collapsed' : '' }}">
|
||||
<div class="collection-sort"><i class="fa fa-fw fa-bars"></i></div>
|
||||
{% for childName, child in field.fields %}
|
||||
{% set child = child|merge({ '_list_index': itemName }) %}
|
||||
{%- if childName == 'value' -%}
|
||||
{% set childKey = '' %}
|
||||
{% set childValue = val %}
|
||||
{% set childName = itemName -%}
|
||||
{%- elseif childName starts with '.' -%}
|
||||
{% set childKey = childName|trim('.') %}
|
||||
{% set childValue = val|nested(childName) %}
|
||||
{% set childName = itemName ~ childName %}
|
||||
{% else %}
|
||||
{% set childKey = childName %}
|
||||
{% set childValue = data.value(scope ~ childName) %}
|
||||
{% set childName = childName|replace({'*': key}) %}
|
||||
{% endif %}
|
||||
{% set child = child|merge({ name: childName }) %}
|
||||
|
||||
{% if child.type == 'key' %}
|
||||
{%
|
||||
include 'forms/fields/key/key.html.twig'
|
||||
with { field: child, value: key }
|
||||
%}
|
||||
{% elseif child.key == true and child.type != 'list' %}
|
||||
{% include [
|
||||
"forms/fields/#{child.type}/#{child.type}.html.twig",
|
||||
'forms/fields/key/key.html.twig'
|
||||
] with { field: child, value: key }
|
||||
%}
|
||||
{% elseif child.type %}
|
||||
{% set originalValue = childValue %}
|
||||
{%
|
||||
include [
|
||||
"forms/fields/#{child.type}/#{child.type}.html.twig",
|
||||
'forms/fields/text/text.html.twig'
|
||||
] with { field: child, value: childValue }
|
||||
%}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
<div class="item-actions">
|
||||
{% if collapsible %}
|
||||
<i class="fa fa-chevron-circle-{{ field.collapsed ? 'right' : 'down' }}" data-action="{{ field.collapsed ? 'expand' : 'collapse' }}"></i>
|
||||
<br />
|
||||
{% endif %}
|
||||
<i class="fa fa-trash-o" data-action="delete"></i>
|
||||
</div>
|
||||
</li>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</ul>
|
||||
{% if fieldControls in ['bottom', 'both'] %}
|
||||
<div class="collection-actions">
|
||||
{% if collapsible %}
|
||||
<button class="button" type="button" data-action="expand_all"
|
||||
{% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}><i class="fa fa-chevron-circle-down"></i> {{ "PLUGIN_ADMIN.EXPAND_ALL"|e|tu }}</button>
|
||||
<button class="button" type="button" data-action="collapse_all"
|
||||
{% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}><i class="fa fa-chevron-circle-right"></i> {{ "PLUGIN_ADMIN.COLLAPSE_ALL"|e|tu }}</button>
|
||||
{% endif %}
|
||||
{% if field.sortby %}
|
||||
<button class="button{{ not value|length ? ' hidden' : '' }}" type="button" data-action="sort" data-action-sort="{{ field.sortby }}" data-action-sort-dir="{{ field.sortby_dir|default('asc') }}"
|
||||
{% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}><i class="fa fa-sort-amount-{{ field.sortby_dir|default('asc') }}"></i> {{ btnSortLabel|e|tu }} '{{ field.sortby }}'</button>
|
||||
{% endif %}
|
||||
<button class="button" type="button" data-action="add" data-action-add="bottom"
|
||||
{% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}><i class="fa fa-plus"></i> {{ btnLabel|e|tu }}</button>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{%- set itemName = name ? name ~ '.*' : '*' -%}
|
||||
<div style="display: none;" data-collection-template="new" data-collection-template-html="{%- filter replace({' ': ' ', '\n': ' '})|e('html_attr') -%}
|
||||
<li data-collection-item="{{ itemName }}">
|
||||
{% if field.sort is not same as(false) %}
|
||||
<div class="collection-sort"><i class="fa fa-fw fa-bars"></i></div>
|
||||
{% endif %}
|
||||
{%- if field.fields -%}
|
||||
{%- for childName, child in field.fields -%}
|
||||
{%- if childName == 'value' -%}
|
||||
{%- set childKey = '' -%}
|
||||
{%- set childName = itemName -%}
|
||||
{%- elseif childName starts with '.' -%}
|
||||
{%- set childKey = childName|trim('.') -%}
|
||||
{%- set childName = itemName ~ childName -%}
|
||||
{%- else %}
|
||||
{%- set childKey = childName -%}
|
||||
{%- set childName = childName|replace({'*': key}) -%}
|
||||
{%- endif %}
|
||||
{%- set child = child|merge({ name: childName }) -%}
|
||||
|
||||
{%- if child.type == 'key' -%}
|
||||
{%-
|
||||
include 'forms/fields/key/key.html.twig'
|
||||
with { field: child, value: null }
|
||||
-%}
|
||||
{%- elseif child.key == true -%}
|
||||
{%-
|
||||
include [
|
||||
"forms/fields/#{child.type}/#{child.type}.html.twig",
|
||||
'forms/fields/key/key.html.twig'
|
||||
] with { field: child, value: null }
|
||||
-%}
|
||||
{%- elseif child.type -%}
|
||||
{%-
|
||||
include [
|
||||
"forms/fields/#{child.type}/#{child.type}.html.twig",
|
||||
'forms/fields/text/text.html.twig'
|
||||
] with { field: child, value: null }
|
||||
-%}
|
||||
{%- endif -%}
|
||||
{%- endfor %}
|
||||
<div class="item-actions">
|
||||
{% if collapsible %}
|
||||
<i class="fa fa-chevron-circle-down" data-action="collapse"></i>
|
||||
<br />
|
||||
{% endif %}
|
||||
<i class="fa fa-trash-o" data-action="delete"></i>
|
||||
</div>
|
||||
{%- endif -%}
|
||||
</li>
|
||||
{%- endfilter -%}"></div>
|
||||
|
||||
<div style="display: none;" data-collection-config="{{ name }}"></div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
{# Deprecated field. Alias to editor/editor.html.twig #}
|
||||
|
||||
{% extends "forms/fields/editor/editor.html.twig" %}
|
||||
{% set codemirrorOptions = {'mode': 'gfm', 'ignore': []}|merge(field.codemirror|default({})) %}
|
||||
|
||||
{# backward compatibility #}
|
||||
{% if field.showPreview %}
|
||||
{% set codemirrorOptions = codemirrorOptions|merge({'ignore': []}) %}
|
||||
{% endif %}
|
||||
{# end backward compatibility #}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
{% extends "forms/fields/text/text.html.twig" %}
|
||||
|
||||
{% set originalValue = value %}
|
||||
{% set value = (value is null ? field.default : value) %}
|
||||
|
||||
{% set unique_identifier = random_string() %}
|
||||
|
||||
{% block global_attributes %}
|
||||
{{ parent() }}
|
||||
data-mediapicker-modal-trigger
|
||||
data-grav-mediapicker-unique-identifier="{{ unique_identifier }}"
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block contents %}
|
||||
{{ parent() }}
|
||||
<div class="remodal remodal-mediapicker" data-remodal-mediapicker data-remodal-unique-identifier="{{ unique_identifier }}" data-remodal-options="hashTracking: false">
|
||||
{% include 'partials/media-list-wrapper.html.twig' with { is_modal: true } %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
+120
@@ -0,0 +1,120 @@
|
||||
{% extends "forms/field.html.twig" %}
|
||||
|
||||
{% macro renderer(key, content, field, scope, level, parent_key, up_level) %}
|
||||
{% import _self as self %}
|
||||
|
||||
{% macro field(value, key, level, globalvars, disable_name, hidden) %}
|
||||
{% set name = 'data[' ~ globalvars.field.name|replace({'.': ']['}) ~ ']' ~ key %}
|
||||
<div class="form-row array-field-value_only js__multilevel-field {{ level == 0 ? 'top' : '' }}"
|
||||
data-grav-array-type="row" {% if (hidden|default(false) == true) %}style="display: none"{% endif %}>
|
||||
<input
|
||||
type="text"
|
||||
{% if (disable_name != true) %}name="{{ name }}"{% endif %}
|
||||
data-attr-name="{{ name }}"
|
||||
placeholder="{{ field.placeholder_value|e|tu }}"
|
||||
style="margin-left: {{ level * 50 }}px"
|
||||
value="{{ value }}" />
|
||||
|
||||
<span class="fa fa-minus js__remove-item"></span>
|
||||
<span class="fa fa-plus js__add-sibling hidden" data-level="{{level}}"></span>
|
||||
<span class="fa fa-plus-circle js__add-children hidden" data-level="{{level}}"></span>
|
||||
</div>
|
||||
{% endmacro %}
|
||||
|
||||
{% if level == 0 %}
|
||||
|
||||
{{ self.field(key, '', level, _context, true, (is_numeric(key) ? true : false)) }}
|
||||
|
||||
{% if content is not iterable %}
|
||||
{% set level2 = level + 1 %}
|
||||
|
||||
<div class="children-wrapper">
|
||||
<div class="element-wrapper">
|
||||
{{ self.field(content, '[' ~ key ~ ']', level2, _context) }}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
{% if up_level %}
|
||||
{% set level = level + 1 %}
|
||||
{% endif %}
|
||||
<div class="children-wrapper">
|
||||
{% set unique_child = (is_array(content) and content.length > 1) ? true : false %}
|
||||
|
||||
{% for inner_key, inner_content in content -%}
|
||||
<div class="element-wrapper">
|
||||
{% if not is_numeric(inner_key) %}
|
||||
{% if (content|length > 1) %}
|
||||
{{ self.field(inner_key, parent_key, level, _context, true) }}
|
||||
{% else %}
|
||||
{{ self.field(inner_key, parent_key, level, _context) }}
|
||||
{% endif %}
|
||||
{% set level2 = level + 1 %}
|
||||
{% set up_level = true %}
|
||||
{% else %}
|
||||
{% set up_level = false %}
|
||||
{% set level2 = level %}
|
||||
{% endif %}
|
||||
|
||||
{% if inner_content is not iterable %}
|
||||
|
||||
{% if not is_numeric(inner_key) %}
|
||||
<div class="children-wrapper">
|
||||
<div class="element-wrapper">
|
||||
{% endif %}
|
||||
|
||||
{% set last_key = (is_numeric(inner_key)) ? '' : inner_key %}
|
||||
{{ self.field(inner_content, parent_key ~ '[' ~ inner_key ~ ']', level2, _context) }}
|
||||
|
||||
{% if not is_numeric(inner_key) %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
|
||||
{% set inner_parent_key = parent_key ~ '[' ~ inner_key ~ ']' %}
|
||||
{{ self.renderer(inner_key, inner_content, field, scope, level, inner_parent_key, up_level) }}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endmacro %}
|
||||
|
||||
{% import _self as macro %}
|
||||
|
||||
{% block global_attributes %}
|
||||
data-grav-array-name="{{ (scope ~ field.name)|fieldName }}"
|
||||
data-grav-array-keyname="{{ field.placeholder_key|e|tu }}"
|
||||
data-grav-array-valuename="{{ field.placeholder_value|e|tu }}"
|
||||
{{ parent() }}
|
||||
{% endblock %}
|
||||
|
||||
{% block input %}
|
||||
<div data-id="{{random_string()}}" data-grav-multilevel-field data-grav-array-type="container" data-grav-array-mode="value_only"{{ value|length <= 1 ? ' class="one-child"' : '' }}>
|
||||
{% if value|length %}
|
||||
{% for key, content in value -%}
|
||||
<div class="element-wrapper">
|
||||
{{ macro.renderer(key, content, field, scope, 0, '[' ~ key ~ ']', true) }}
|
||||
</div>
|
||||
{% endfor %}
|
||||
{%- else -%}
|
||||
{# Empty value, mock the entry field#}
|
||||
<div class="element-wrapper">
|
||||
<div class="form-row array-field-value_only js__multilevel-field"
|
||||
data-grav-array-type="row">
|
||||
|
||||
<input
|
||||
type="text"
|
||||
name="{{ (scope ~ field.name)|fieldName }}"
|
||||
placeholder="Enter value"
|
||||
value="" />
|
||||
|
||||
<span class="fa fa-minus js__remove-item"></span>
|
||||
<span class="fa fa-plus js__add-sibling hidden" data-level="0" ></span>
|
||||
<span class="fa fa-plus-circle js__add-children hidden" data-level="0"></span>
|
||||
</div>
|
||||
</div>
|
||||
{%- endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,55 @@
|
||||
{% extends "forms/field.html.twig" %}
|
||||
|
||||
{% set value = (value is null ? field.default : value) %}
|
||||
{% set siblings = context.parent.children %}
|
||||
{% set canOrder = context.order %}
|
||||
{% set vertical = field.style == 'vertical' %}
|
||||
|
||||
{% block field %}
|
||||
<div class="form-field grid pure-g{% if vertical %} vertical{% endif %}">
|
||||
<div class="form-label{% if not vertical %} block size-1-3 pure-u-1-3{% endif %}">
|
||||
<label>
|
||||
{% if field.help %}
|
||||
<span class="tooltip" data-asTooltip-position="w" title="{{ field.help|e|tu }}">{{ field.label|tu }}</span>
|
||||
{% else %}
|
||||
{{ field.label|tu }}
|
||||
{% endif %}
|
||||
{{ field.validate.required in ['on', 'true', 1] ? '<span class="required">*</span>' }}
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-data{% if not vertical %} block size-2-3 pure-u-2-3{% endif %}">
|
||||
<div class="form-order-wrapper {{ field.size }}">
|
||||
|
||||
<input
|
||||
type="hidden"
|
||||
data-order
|
||||
{% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}
|
||||
name="{{ (scope ~ field.name)|fieldName }}"
|
||||
value="" />
|
||||
{% if not canOrder %}
|
||||
<div class="notice">{{ "PLUGIN_ADMIN.ORDERING_DISABLED_BECAUSE_PAGE_NO_PREFIX"|tu|raw }}</div>
|
||||
{% endif %}
|
||||
|
||||
{% if siblings|length < 200 %}
|
||||
{% set sortable_count = 0 %}
|
||||
<ul id="ordering" class="orderable {{ field.classes }}">
|
||||
{% for page in siblings if page.order %}
|
||||
<li class="drag-handle" data-id="{{ page.slug }}" {{ page.slug == data.slug ? 'data-active-id' : ''}}><span class="page-order">{{ page.order }}</span> {{ page.title|e }} <a href="{{ getPageUrl(page) }}"><i class="fa fa-external-link"></i></a></li>
|
||||
{% set sortable_count = loop.index %}
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% if sortable_count < siblings|length %}
|
||||
<label>{{ "PLUGIN_ADMIN.UNSORTABLE_PAGES"|tu }}</label>
|
||||
<ul class="orderable disabled">
|
||||
{% for page in siblings if not page.order %}
|
||||
<li {{ page.slug == data.slug ? 'data-active-id' : ''}}>{{ page.title|e }} <a href="{{ getPageUrl(page) }}"><i class="fa fa-external-link"></i></a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<div class="notice">{{ "PLUGIN_ADMIN.ORDERING_DISABLED_BECAUSE_TOO_MANY_SIBLINGS"|tu }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,58 @@
|
||||
{% extends "forms/field.html.twig" %}
|
||||
|
||||
{% set value = (value is null ? field.default : value) %}
|
||||
|
||||
{% block field %}
|
||||
{% if context.folderExists %}
|
||||
{% set pagemedia = config.get('plugins.admin.pagemedia') %}
|
||||
{% set pagemedia_settings = {
|
||||
resolution: {
|
||||
min: {
|
||||
width: pagemedia.res_min_width ?: null,
|
||||
height: pagemedia.res_min_height ?: null
|
||||
},
|
||||
max: {
|
||||
width: pagemedia.res_max_width ?: null,
|
||||
height: pagemedia.res_max_height ?: null
|
||||
}
|
||||
},
|
||||
resizeWidth: pagemedia.resize_width ?: null,
|
||||
resizeHeight: pagemedia.resize_height ?: null,
|
||||
resizeQuality: pagemedia.resize_quality ?: 0.8
|
||||
} %}
|
||||
|
||||
{% set media_url = form.getMediaTaskRoute() ?: '/media/' ~ admin.route|trim('/') ~ '.json' %}
|
||||
{% set media_local = form.getMediaRoute() ?: base_url_relative_frontend|rtrim('/') ~ '/' ~ admin.route|trim('/') %}
|
||||
{% set media_path = url(context.relativePagePath) %}
|
||||
{% set media_uri = context.mediaUri() %}
|
||||
{% set dropzone_settings = { maxFilesize: form_max_filesize }|merge(pagemedia_settings) %}
|
||||
|
||||
<div class="form-field grid vertical {% if field.classes is defined %}{{ field.classes }}{% endif %}">
|
||||
<div class="form-label">
|
||||
<label>{{ field.label|tu }}</label>
|
||||
</div>
|
||||
<div class="form-data form-uploads-wrapper">
|
||||
<div id="grav-dropzone"
|
||||
class="dropzone"
|
||||
data-media-url="{{ (base_url ~ media_url)|e('html_attr') }}"
|
||||
data-media-local="{{ media_local|e('html_attr') }}"
|
||||
data-media-path="{{ media_path|e('html_attr') }}"
|
||||
data-media-uri="{{ media_uri|e('html_attr') }}"
|
||||
data-dropzone-options="{{ dropzone_settings|json_encode|e('html_attr') }}"
|
||||
data-dropzone-field="{{ (scope ~ field.name)|fieldName }}"></div>
|
||||
|
||||
{% if admin.session.expert == '0' %}
|
||||
<input type="hidden" name="{{ (scope ~ field.name)|fieldName }}" value="{{ value|e }}" />
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="form-tab">
|
||||
<div class="form-field">
|
||||
<div class="form-label">
|
||||
{{ "PLUGIN_ADMIN.CANNOT_ADD_MEDIA_FILES_PAGE_NOT_SAVED"|tu }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
{% extends "forms/fields/filepicker/filepicker.html.twig" %}
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
{% extends "forms/field.html.twig" %}
|
||||
|
||||
{% macro page_options(globals, pages_list) %}
|
||||
{% set field = globals.field %}
|
||||
{% set value = globals.value %}
|
||||
{% if field.options and depth == 0 %}
|
||||
{% for key, value in field.options %}
|
||||
<option value="{{ key|e('html_attr') }}">{{ value|t }}</option>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
{% for page_route, option in pages_list %}
|
||||
<option {% if page_route == value or (field.multiple and page_route in value) %}selected="selected"{% endif %} value="{{ page_route }}">{{ option|raw }}</option>
|
||||
{% endfor %}
|
||||
{% endmacro %}
|
||||
|
||||
{% import _self as macro %}
|
||||
|
||||
{% block global_attributes %}
|
||||
data-grav-selectize="{{ (field.selectize is defined ? field.selectize : {})|json_encode|e('html_attr') }}"
|
||||
data-grav-field="select"
|
||||
data-grav-disabled="{{ originalValue is null ? 'true' : 'false' }}"
|
||||
data-grav-default="{{ field.default|json_encode|e('html_attr') }}"
|
||||
{% endblock %}
|
||||
|
||||
{% block input %}
|
||||
|
||||
{% set start_page = field.start_route ? pages.find(field.start_route) : null %}
|
||||
{% set show_all = field.show_all is same as(false) ? false : true %}
|
||||
{% set show_fullpath = field.show_fullpath is same as(true) ? true : false %}
|
||||
{% set show_slug = field.show_slug is same as(true) ? true : false %}
|
||||
{% set show_modular = field.show_modular is same as(true) ? true : false %}
|
||||
{% set limit_levels = field.limit_levels ?: false %}
|
||||
|
||||
{% set page_list = grav.pages.getList(start_page, 0, true, show_all, show_fullpath, show_slug, show_modular, limit_levels) %}
|
||||
|
||||
<div class="form-select-wrapper {{ field.size }}">
|
||||
<select class="{{ field.classes }}" name="{{ (scope ~ field.name)|fieldName ~ (field.multiple ? '[]' : '') }}"
|
||||
{% if field.autofocus in ['on', 'true', 1] %}autofocus="autofocus"{% endif %}
|
||||
{% if field.novalidate in ['on', 'true', 1] %}novalidate="novalidate"{% endif %}
|
||||
{% if field.validate.required in ['on', 'true', 1] %}required="required"{% endif %}
|
||||
{% if field.multiple in ['on', 'true', 1] %}multiple="multiple"{% endif %}
|
||||
{% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}
|
||||
>
|
||||
{% if field.show_root %}
|
||||
<option value="/">/ (root)</option>
|
||||
{% endif %}
|
||||
{{ macro.page_options(_context, page_list) }}
|
||||
</select>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
{% extends "forms/fields/pages/pages.html.twig" %}
|
||||
|
||||
{% block input %}
|
||||
{% set last_page_route = admin.page.getLastPageRoute %}
|
||||
{% set show_slug_val = true %}
|
||||
{% set show_fullpath_val = false %}
|
||||
{% set show_all_val = true %}
|
||||
|
||||
{% set show_parents = config.get('plugins.admin.pages.show_parents') %}
|
||||
{% if show_parents == 'folder' %}
|
||||
{% set show_slug_val = false %}
|
||||
{% elseif show_parents == 'fullpath' %}
|
||||
{% set show_fullpath_val = true %}
|
||||
{% endif %}
|
||||
|
||||
{% set limit_levels_val = config.get('plugins.admin.pages.parents_levels') %}
|
||||
|
||||
{% set show_modular_val = config.get('plugins.admin.pages.show_modular', true) %}
|
||||
{% if show_modular_val == false %}
|
||||
{% set show_all_val = false %}
|
||||
{% endif %}
|
||||
|
||||
{% set defaults = {show_root:true, show_all:show_all_val, show_modular:show_modular_val, show_slug:show_slug_val, show_fullpath:show_fullpath_val, default:last_page_route, limit_levels:limit_levels_val} %}
|
||||
{% set field = field|merge(defaults) %}
|
||||
{{ parent() }}
|
||||
{% endblock %}
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
{% extends "forms/field.html.twig" %}
|
||||
|
||||
{% macro spanToggle(input, length) %}
|
||||
{% set space = repeat(' ', (length - input|length) / 2) %}
|
||||
{{ (space ~ input ~ space)|raw }}
|
||||
{% endmacro %}
|
||||
|
||||
{% import _self as macro %}
|
||||
|
||||
{% set value = (value is null ? field.default : value) %}
|
||||
{% set value = (value is same as(false) ? 0 : value) %}
|
||||
|
||||
{% block global_attributes %}
|
||||
data-grav-disabled="{{ originalValue is null ? 'true' : 'false' }}"
|
||||
data-grav-default="{{ field.default|json_encode()|e('html_attr') }}"
|
||||
{% endblock %}
|
||||
|
||||
{% block input %}
|
||||
<div class="permissions-container">
|
||||
{% set permissions = admin.getPermissions %}
|
||||
{% for index_existing_permission, value_existing_permission in value %}
|
||||
{% for index_segment1, value_segment1 in value_existing_permission %}
|
||||
{% set permissions = permissions|merge({ (index_existing_permission ~ "." ~ index_segment1): "boolean"}) %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
|
||||
{% for permission, type in permissions %}
|
||||
<div class="permission-container">
|
||||
{% set permission_segments = permission|split('.') %}
|
||||
{% set permission_value = value[permission_segments[0]][permission_segments[1]] %}
|
||||
{% if permission_value in ['on', 'true', 1] %}
|
||||
{% set permission_value = 'true' %}
|
||||
{% endif %}
|
||||
|
||||
<input type="text" class="medium permission-value" value="{{ permission }}" />
|
||||
|
||||
<div class="switch-toggle switch-grav medium switch-3">
|
||||
{% set options = { true: 'PLUGIN_ADMIN.YES', false: 'PLUGIN_ADMIN.NO', '': 'PLUGIN_ADMIN.NOT_SET' } %}
|
||||
|
||||
{% set maxLen = 0 %}
|
||||
{% for value, text in options %}
|
||||
{% set translation = grav.twig.twig.filters['tu'] is defined ? text|tu : text|t %}
|
||||
{% set maxLen = max(translation|length, maxLen) %}
|
||||
{% endfor %}
|
||||
|
||||
{% for key, text in options %}
|
||||
{% set id = "toggle_" ~ field.name ~ "." ~ permission ~ key %}
|
||||
{% set translation = (grav.twig.twig.filters['tu'] is defined ? text|tu : text|t)|trim %}
|
||||
|
||||
<input type="radio"
|
||||
value="{{ key }}"
|
||||
id="{{ id }}"
|
||||
name="{{ (scope ~ field.name ~ "." ~ permission)|fieldName }}"
|
||||
class="{{ 'true' == '' ~ key ? 'highlight' : '' }}"
|
||||
{% if key|fieldName == '' ~ permission_value|fieldName %}
|
||||
checked="checked"
|
||||
{% endif %}
|
||||
{% if field.validate.required in ['on', 'true', 1] %}required="required"{% endif %}
|
||||
/>
|
||||
|
||||
<label for="{{ id }}">{{ (macro.spanToggle(translation, maxLen)|trim)|raw }}</label>
|
||||
{% endfor %}
|
||||
<a></a>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
{% extends "forms/field.html.twig" %}
|
||||
|
||||
{% block input_attributes %}
|
||||
type="range"
|
||||
class="rangefield {% if field.classes is defined %}{{ field.classes }} {% endif %}"
|
||||
{% if field.validate.min %}min="{{ field.validate.min }}"{% endif %}
|
||||
{% if field.validate.max %}max="{{ field.validate.max }}"{% endif %}
|
||||
{% if field.validate.step %}step="{{ field.validate.step }}"{% endif %}
|
||||
{% if field.id is defined %}
|
||||
id="range_{{ field.id|e|replace({'.': '_'}) }}"
|
||||
oninput="number_{{ field.id|e|replace({'.': '_'}) }}_output.value = this.value"
|
||||
{% else %}
|
||||
id="range_{{ field.name|e|replace({'.': '_'}) }}"
|
||||
oninput="number_{{ field.name|e|replace({'.': '_'}) }}_output.value = this.value"
|
||||
{% endif %}
|
||||
{{ parent() }}
|
||||
{% endblock %}
|
||||
{% block append %}
|
||||
<input
|
||||
type="number"
|
||||
class="rangefield {% if field.classes is defined %}{{ field.classes }} {% endif %}"
|
||||
{% if field.validate.min %}min="{{ field.validate.min }}"{% endif %}
|
||||
{% if field.validate.max %}max="{{ field.validate.max }}"{% endif %}
|
||||
{% if field.validate.step %}step="{{ field.validate.step }}"{% endif %}
|
||||
{% if value %}
|
||||
value="{{ value }}"
|
||||
{% elseif field.default %}
|
||||
value="{{ field.default }}"
|
||||
{% else %}
|
||||
value="0"
|
||||
{% endif %}
|
||||
{% if field.id is defined %}
|
||||
id="number_{{ field.id|e|replace({'.': '_'}) }}_output"
|
||||
oninput="range_{{ field.id|e|replace({'.': '_'}) }}.value = this.value"
|
||||
{% else %}
|
||||
id="number_{{ field.name|e|replace({'.': '_'}) }}_output"
|
||||
oninput="range_{{ field.name|e|replace({'.': '_'}) }}.value = this.value"
|
||||
{% endif %}
|
||||
/>
|
||||
<span class="range-append">{{ field.append }}</span>
|
||||
|
||||
{% endblock append %}
|
||||
@@ -0,0 +1,26 @@
|
||||
{% extends "forms/field.html.twig" %}
|
||||
|
||||
{% block field %}
|
||||
{% if field.security is empty or authorize(array(field.security)) %}
|
||||
|
||||
{% if field.title or field.underline %}
|
||||
<h1 class="{{ field.classes }} {{ field.underline ?: 'no_underline' }}">{% if grav.twig.twig.filters['tu'] is defined %}{{ field.title|tu }}{% else %}{{ field.title|t }}{% endif %}</h1>
|
||||
{% endif %}
|
||||
|
||||
{% if field.text %}
|
||||
<p>{% if grav.twig.twig.filters['tu'] is defined %}{{ field.text|tu|raw }}{% else %}{{ field.text|t|raw }}{% endif %}</p>
|
||||
{% endif %}
|
||||
|
||||
{% if field.fields %}
|
||||
<div class="form-section {{ field.field_classes }} {{ field.outer_classes }}">
|
||||
{% for field in field.fields %}
|
||||
{% if field.type %}
|
||||
{% set value = field.name ? data.value(field.name) : data.toArray %}
|
||||
{% include ["forms/fields/#{field.type}/#{field.type}.html.twig", 'forms/fields/text/text.html.twig'] %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,19 @@
|
||||
{% extends "forms/field.html.twig" %}
|
||||
|
||||
{% block global_attributes %}
|
||||
{% if field.selectize is defined %}
|
||||
{% set fieldSelectize = field.selectize|merge({'create': true}) %}
|
||||
{% if field.merge_items %}
|
||||
{% set fieldSelectize = fieldSelectize|merge({'items':value}) %}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{% set fieldSelectize = {'create': true} %}
|
||||
{% endif %}
|
||||
data-grav-selectize="{{ fieldSelectize|json_encode()|e('html_attr') }}"
|
||||
{{ parent() }}
|
||||
{% endblock %}
|
||||
|
||||
{% block input_attributes %}
|
||||
type="text"
|
||||
{{ parent() }}
|
||||
{% endblock %}
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
{% extends "forms/field.html.twig" %}
|
||||
|
||||
{% block global_attributes %}
|
||||
data-grav-selectize="{{ (field.selectize is defined ? field.selectize : {})|json_encode()|e('html_attr') }}"
|
||||
data-grav-field="select"
|
||||
{{ parent() }}
|
||||
{% endblock %}
|
||||
|
||||
{% block input %}
|
||||
<div class="form-input-wrapper {{ field.size }}">
|
||||
<select
|
||||
value="{{ value|raw|join(', ') }}"
|
||||
name="{{ (scope ~ field.name)|fieldName }}"
|
||||
data-select-observe
|
||||
{% block input_attributes %}
|
||||
{% if field.classes is defined %}class="{{ field.classes }}" {% endif %}
|
||||
{% if field.id is defined %}id="{{ field.id|e }}" {% endif %}
|
||||
{% if field.style is defined %}style="{{ field.style|e }}" {% endif %}
|
||||
{% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}
|
||||
{% if field.placeholder %}placeholder="{{ field.placeholder }}"{% endif %}
|
||||
{% if field.autofocus in ['on', 'true', 1] %}autofocus="autofocus"{% endif %}
|
||||
{% if field.novalidate in ['on', 'true', 1] %}novalidate="novalidate"{% endif %}
|
||||
{% if field.readonly in ['on', 'true', 1] %}readonly="readonly"{% endif %}
|
||||
{% if field.autocomplete in ['on', 'off'] %}autocomplete="{{ field.autocomplete }}"{% endif %}
|
||||
{% if field.validate.required in ['on', 'true', 1] %}required="required"{% endif %}
|
||||
{% if field.validate.pattern %}pattern="{{ field.validate.pattern }}"{% endif %}
|
||||
{% if field.validate.message %}title="{{ field.validate.message|e|t }}"
|
||||
{% elseif field.title is defined %}title="{{ field.title|e|t }}" {% endif %}
|
||||
{% endblock %}
|
||||
>
|
||||
{% if field.placeholder %}<option value="" disabled selected>{% if grav.twig.twig.filters['tu'] is defined %}{{ field.placeholder|tu|raw }}{% else %}{{ field.placeholder|t|raw }}{% endif %}</option>{% endif %}
|
||||
|
||||
{% if value is defined %}
|
||||
<option selected="selected" value="{{ value }}">{{ value }}</option>
|
||||
{% endif %}
|
||||
</select>
|
||||
|
||||
{% if field.default %}
|
||||
<div><p class="notice warning">It is advised not to use a <strong>default</strong> option with the selectunique field. Currently default value set to `{{ field.default }}`</p></div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,30 @@
|
||||
{% extends "forms/field.html.twig" %}
|
||||
|
||||
{% block field %}
|
||||
{% set taxonomies = (taxonomies is null ? (field.taxonomies ? field.taxonomies : admin.data('config/site').taxonomies) : taxonomies) %}
|
||||
{% set parentname = field.name %}
|
||||
{% set options = field.options %}
|
||||
{% set default = field.default %}
|
||||
|
||||
{% for name in taxonomies %}
|
||||
|
||||
{% set value = array(data.value('header.taxonomy.' ~ name)|default(default[name] ?? [])) %}
|
||||
{% set sub_taxonomies = attribute(grav.taxonomy.taxonomy, name)|default([])|keys %}
|
||||
{% set list = (options[name] ?? [])|merge(sub_taxonomies)|merge(value)|array_unique %}
|
||||
|
||||
{% set field = {
|
||||
type: 'select',
|
||||
classes: 'fancy create',
|
||||
label: name|capitalize,
|
||||
name: parentname ~ '.' ~ name,
|
||||
multiple: true,
|
||||
options: list,
|
||||
style: field.style,
|
||||
selectize: {
|
||||
create: true
|
||||
}
|
||||
} %}
|
||||
|
||||
{% include ['forms/fields/select/select.html.twig'] %}
|
||||
{% endfor %}
|
||||
{% endblock %}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
{% extends "forms/field.html.twig" %}
|
||||
|
||||
{% set options = {} %}
|
||||
{% for slug, package in admin.themes %}
|
||||
{% set option = {(slug): package.toArray().name} %}
|
||||
{% set options = options|merge(option) %}
|
||||
{% endfor %}
|
||||
|
||||
{% block global_attributes %}
|
||||
data-grav-selectize="{{ (field.selectize is defined ? field.selectize : {})|json_encode()|e('html_attr') }}"
|
||||
data-grav-field="select"
|
||||
data-grav-disabled="{{ originalValue is null ? 'true' : 'false' }}"
|
||||
data-grav-default="{{ field.default|json_encode()|e('html_attr') }}"
|
||||
{% endblock %}
|
||||
|
||||
{% block input %}
|
||||
<div class="form-select-wrapper {{ field.size }}">
|
||||
<select class="{{ field.classes }}" name="{{ (scope ~ field.name)|fieldName ~ (field.multiple ? '[]' : '') }}"
|
||||
{% if field.autofocus in ['on', 'true', 1] %}autofocus="autofocus"{% endif %}
|
||||
{% if field.novalidate in ['on', 'true', 1] %}novalidate="novalidate"{% endif %}
|
||||
{% if field.validate.required in ['on', 'true', 1] %}required="required"{% endif %}
|
||||
{% if field.multiple in ['on', 'true', 1] %}multiple="multiple"{% endif %}
|
||||
{% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}>
|
||||
{% for key, text in options %}
|
||||
<option {% if key == value or text in value %}selected="selected"{% endif %} value="{{ field.multiple ? text : key }}">{{ text }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
{% extends "forms/field.html.twig" %}
|
||||
|
||||
{% block field %}
|
||||
<div class="form-field grid user-details">
|
||||
<div class="form-label block size-1-3">
|
||||
{% include 'partials/userinfo-avatar.html.twig' %}
|
||||
</div>
|
||||
<div class="form-data block size-2-3">
|
||||
<h2>{{ data.fullname }}</h2>
|
||||
<h5>
|
||||
<a href="mailto:{{ data.email }}">{{ data.email }}</a>
|
||||
{% if data.title %}
|
||||
- {{ data.title }}
|
||||
{% endif %}
|
||||
</h5>
|
||||
{% include 'partials/userinfo-avatar-credit.html.twig' %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,6 @@
|
||||
{% set xss_header = data.value('header')|array %}
|
||||
{% set xss_content = data.value('content') %}
|
||||
{% set xss_status = xss({header: xss_header, content: xss_content}) %}
|
||||
{% if xss_status is not empty %}
|
||||
<div class="notice alert">{{ "PLUGIN_ADMIN.XSS_ISSUE"|tu([xss_status])|raw }}</div>
|
||||
{% endif %}
|
||||
Reference in New Issue
Block a user