Merge branch 'develop' into feature/admin-gpm-dependencies

This commit is contained in:
Flavio Copes
2016-03-16 11:46:51 +01:00
18 changed files with 111 additions and 42 deletions

View File

@@ -261,7 +261,7 @@ class Admin
* @return Data\Data|null * @return Data\Data|null
* @throws \RuntimeException * @throws \RuntimeException
*/ */
public function data($type, $post = array()) public function data($type, array $post = [])
{ {
static $data = []; static $data = [];
@@ -270,7 +270,7 @@ class Admin
} }
if (!$post) { if (!$post) {
$post = isset($_POST) ? $_POST : []; $post = isset($_POST['data']) ? $_POST['data'] : [];
} }
switch ($type) { switch ($type) {

View File

@@ -52,6 +52,11 @@ class AdminController
*/ */
public $post; public $post;
/**
* @var array|null
*/
public $data;
/** /**
* @var Admin * @var Admin
*/ */
@@ -79,6 +84,10 @@ class AdminController
$this->grav = $grav; $this->grav = $grav;
$this->view = $view; $this->view = $view;
$this->task = $task ? $task : 'display'; $this->task = $task ? $task : 'display';
if (isset($post['data'])) {
$this->data = $this->getPost($post['data']);
unset($post['data']);
}
$this->post = $this->getPost($post); $this->post = $this->getPost($post);
$this->route = $route; $this->route = $route;
$this->admin = $this->grav['admin']; $this->admin = $this->grav['admin'];
@@ -1015,7 +1024,7 @@ class AdminController
// Filter value and save it. // Filter value and save it.
$this->post = ['enabled' => true]; $this->post = ['enabled' => true];
$obj = $this->prepareData(); $obj = $this->prepareData($this->post);
$obj->save(); $obj->save();
$this->post = ['_redirect' => 'plugins']; $this->post = ['_redirect' => 'plugins'];
@@ -1041,7 +1050,7 @@ class AdminController
// Filter value and save it. // Filter value and save it.
$this->post = ['enabled' => false]; $this->post = ['enabled' => false];
$obj = $this->prepareData(); $obj = $this->prepareData($this->post);
$obj->save(); $obj->save();
$this->post = ['_redirect' => 'plugins']; $this->post = ['_redirect' => 'plugins'];
@@ -1266,7 +1275,7 @@ class AdminController
return false; return false;
} }
$data = $this->post; $data = (array) $this->data;
if ($data['route'] == '/') { if ($data['route'] == '/') {
$path = $this->grav['locator']->findResource('page://'); $path = $this->grav['locator']->findResource('page://');
@@ -1345,7 +1354,7 @@ class AdminController
return false; return false;
} }
$data = $this->post; $data = (array) $this->data;
$config = $this->grav['config']; $config = $this->grav['config'];
@@ -1417,7 +1426,7 @@ class AdminController
} else { } else {
// Handle standard data types. // Handle standard data types.
$obj = $this->prepareData(); $obj = $this->prepareData($data);
$obj = $this->processFiles($obj); $obj = $this->processFiles($obj);
$obj->validate(); $obj->validate();
$obj->filter(); $obj->filter();
@@ -1501,7 +1510,7 @@ class AdminController
return false; return false;
} }
$data = $this->post; $data = (array) $this->data;
$route = $data['route'] != '/' ? $data['route'] : ''; $route = $data['route'] != '/' ? $data['route'] : '';
$folder = ltrim($data['folder'], '_'); $folder = ltrim($data['folder'], '_');
if (!empty($data['modular'])) { if (!empty($data['modular'])) {
@@ -1684,7 +1693,7 @@ class AdminController
return false; return false;
} }
$data = $this->post; $data = (array) $this->data;
$language = $data['lang']; $language = $data['lang'];
if ($language) { if ($language) {
@@ -1824,7 +1833,7 @@ class AdminController
* *
* @return array * @return array
*/ */
protected function &getPost($post) protected function getPost($post)
{ {
unset($post['task']); unset($post['task']);
@@ -1874,10 +1883,10 @@ class AdminController
* *
* @return object * @return object
*/ */
protected function prepareData() protected function prepareData(array $data)
{ {
$type = trim("{$this->view}/{$this->admin->route}", '/'); $type = trim("{$this->view}/{$this->admin->route}", '/');
$data = $this->admin->data($type, $this->post); $data = $this->admin->data($type, $data);
return $data; return $data;
} }
@@ -1927,7 +1936,7 @@ class AdminController
*/ */
protected function preparePage(Page $page, $clean_header = false, $language = '') protected function preparePage(Page $page, $clean_header = false, $language = '')
{ {
$input = $this->post; $input = (array) $this->data;
if (isset($input['order'])) { if (isset($input['order'])) {
$order = max(0, (int)isset($input['order']) ? $input['order'] : $page->value('order')); $order = max(0, (int)isset($input['order']) ? $input['order'] : $page->value('order'));

View File

@@ -29,9 +29,12 @@ export default class ColorpickerField {
} }
let target = field.closest(this.options.update); let target = field.closest(this.options.update);
if (!target.lenght) { if (!target.length) {
target = field.siblings(this.options.update); target = field.siblings(this.options.update);
} }
if (!target.length) {
target = field.parent('.g-colorpicker').find(this.options.update);
}
target.css({ backgroundColor }); target.css({ backgroundColor });
}); });
@@ -40,7 +43,7 @@ export default class ColorpickerField {
attach() { attach() {
body.on(FOCUSIN, this.selector, (event) => this.show(event, event.currentTarget)); body.on(FOCUSIN, this.selector, (event) => this.show(event, event.currentTarget));
body.on(MOUSEDOWN, '.g-colorpicker i', this.bound('iconClick')); body.on(MOUSEDOWN, '.g-colorpicker, .g-colorpicker i', this.bound('iconClick'));
body.on('keydown', this.selector, (event) => { body.on('keydown', this.selector, (event) => {
switch (event.keyCode) { switch (event.keyCode) {
case 9: // tab case 9: // tab
@@ -155,13 +158,11 @@ export default class ColorpickerField {
}); });
} }
iconClick(event, element) { iconClick(event) {
event && event.preventDefault(); event && event.preventDefault();
let input = $(event.currentTarget).siblings('input'); let input = $(event.currentTarget).find('input');
input.focus(); setTimeout(() => input.focus(), 50);
this.show(event, input);
} }
bodyMove(event) { bodyMove(event) {

View File

@@ -20,13 +20,6 @@ export default class Form {
} }
}); */ }); */
// clear out any `noform` field from its name
this.form.on('submit', () => {
$('.no-form').attr('name', null);
return true;
});
this._attachShortcuts(); this._attachShortcuts();
this._attachToggleables(); this._attachToggleables();
this._attachDisabledFields(); this._attachDisabledFields();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -11,11 +11,32 @@
i { i {
position: absolute; position: absolute;
top: 10px; top: 15px;
right: 10px; right: 10px;
z-index: 2; z-index: 2;
} }
.g-colorpicker-preview-wrap {
cursor: default;
position: absolute;
top: 0;
right: 0;
width: 43px;
height: 43px;
border-radius: 0 3px 3px 0;
border: 1px solid rgba(0, 0, 0, 0.2);
}
.g-colorpicker-preview {
position: absolute;
top: -1px;
right: -1px;
bottom: -1px;
left: -1px;
border-radius: 0 3px 3px 0;
}
&.light-text { &.light-text {
input, i { input, i {
color: $white; color: $white;
@@ -31,7 +52,7 @@
.cp-wrapper { .cp-wrapper {
position: absolute; position: absolute;
width: 173px; width: 173px;
height: 205px; height: 208px;
background: white; background: white;
border: solid 1px #CCC; border: solid 1px #CCC;
box-shadow: 0 0 20px rgba(0, 0, 0, .2); box-shadow: 0 0 20px rgba(0, 0, 0, .2);
@@ -234,3 +255,7 @@
border-top-left-radius: 0; border-top-left-radius: 0;
border-bottom-left-radius: 0; border-bottom-left-radius: 0;
} }
.g-colorpicker-preview-wrap {
background-image: url(data:image/jpeg;base64,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);
}

View File

@@ -13,7 +13,7 @@
{% block contents %} {% block contents %}
<div class="form-label{% if not vertical %} block size-1-3{% endif %}"> <div class="form-label{% if not vertical %} block size-1-3{% endif %}">
{% if field.toggleable %} {% if field.toggleable %}
<span class="checkboxes toggleable" data-grav-field="toggleable" data-grav-field-name="{{ field.name|fieldName }}"> <span class="checkboxes toggleable" data-grav-field="toggleable" data-grav-field-name="{{ (scope ~ field.name)|fieldName }}">
<input type="checkbox" <input type="checkbox"
id="toggleable_{{ field.name }}" id="toggleable_{{ field.name }}"
{% if toggleableChecked %}value="1"{% endif %} {% if toggleableChecked %}value="1"{% endif %}

View File

@@ -1,13 +1,13 @@
{% extends "forms/field.html.twig" %} {% extends "forms/field.html.twig" %}
{% block global_attributes %} {% block global_attributes %}
data-grav-array-name="{{ field.name|fieldName }}" data-grav-array-name="{{ (scope ~ field.name)|fieldName }}"
data-grav-array-keyname="{{ field.placeholder_key|e|tu }}" data-grav-array-keyname="{{ field.placeholder_key|e|tu }}"
data-grav-array-valuename="{{ field.placeholder_value|e|tu }}" data-grav-array-valuename="{{ field.placeholder_value|e|tu }}"
{{ parent() }} {{ parent() }}
{% endblock %} {% endblock %}
{% macro renderer(key, text, field) %} {% macro renderer(key, text, field, scope) %}
<div class="form-row{% if field.value_only %} array-field-value_only{% endif %}" <div class="form-row{% if field.value_only %} array-field-value_only{% endif %}"
data-grav-array-type="row"> data-grav-array-type="row">
{% if field.value_only != true %} {% if field.value_only != true %}
@@ -25,7 +25,7 @@
<input <input
data-grav-array-type="value" data-grav-array-type="value"
type="text" type="text"
name="{{ (field.name|fieldName) ~ '[' ~ key ~ ']' }}" name="{{ ((scope ~ field.name)|fieldName) ~ '[' ~ key ~ ']' }}"
placeholder="{{ field.placeholder_value|e|tu }}" placeholder="{{ field.placeholder_value|e|tu }}"
{% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %} {% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}
value={% if text == 'true' %}true{% elseif text == 'false' %}false{% else %}"{{ text|join(', ')|e }}"{% endif %} /> value={% if text == 'true' %}true{% elseif text == 'false' %}false{% else %}"{{ text|join(', ')|e }}"{% endif %} />
@@ -41,11 +41,11 @@
{% if value|length %} {% if value|length %}
{% for key, text in value -%} {% for key, text in value -%}
{% if text is not iterable %} {% if text is not iterable %}
{{ array_field.renderer(key, text, field) }} {{ array_field.renderer(key, text, field, scope) }}
{% else %} {% else %}
{# Backward compatibility for nested arrays (metas) which are not supported anymore #} {# Backward compatibility for nested arrays (metas) which are not supported anymore #}
{% for subkey, subtext in text -%} {% for subkey, subtext in text -%}
{{ array_field.renderer(key ~ ':' ~ subkey, subtext, field) }} {{ array_field.renderer(key ~ ':' ~ subkey, subtext, field, scope) }}
{% endfor %} {% endfor %}
{% endif %} {% endif %}
{% endfor %} {% endfor %}
@@ -60,7 +60,7 @@
<input <input
data-grav-array-type="value" data-grav-array-type="value"
type="text" type="text"
name="{{ field.name|fieldName }}" name="{{ (scope ~ field.name)|fieldName }}"
{% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %} {% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}
placeholder="{{ field.placeholder_value|e|tu }}" /> placeholder="{{ field.placeholder_value|e|tu }}" />
<span data-grav-array-action="rem" class="fa fa-minus"></span> <span data-grav-array-action="rem" class="fa fa-minus"></span>

View File

@@ -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]+)|[01])\\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|e('html_attr')|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 %}

View File

@@ -1,5 +1,5 @@
{% set value = (value is null ? field.default : value) %} {% set value = (value is null ? field.default : value) %}
{% set name = scope ~ field.name %} {% set name = field.name %}
{% set btnLabel = field.btnLabel is defined ? field.btnLabel : "PLUGIN_ADMIN.ADD_ITEM" %} {% set btnLabel = field.btnLabel is defined ? field.btnLabel : "PLUGIN_ADMIN.ADD_ITEM" %}

View File

@@ -12,7 +12,7 @@
{% block global_attributes %} {% block global_attributes %}
{{ parent() }} {{ parent() }}
data-grav-field-name="{{ field.name|fieldName }}" data-grav-field-name="{{ (scope ~ field.name)|fieldName }}"
{% endblock %} {% endblock %}
{% macro spanToggle(input, length) %} {% macro spanToggle(input, length) %}

View File

@@ -1,4 +1,5 @@
{% set form_id = form_id ? form_id : 'blueprints' %} {% set form_id = form_id ? form_id : 'blueprints' %}
{% set scope = scope ?: 'data.' %}
<form id="{{ form_id }}" method="post" data-grav-form="{{ form_id }}" data-grav-keepalive="true"> <form id="{{ form_id }}" method="post" data-grav-form="{{ form_id }}" data-grav-keepalive="true">
{% for field in blueprints.fields %} {% for field in blueprints.fields %}

View File

@@ -1,4 +1,5 @@
{% set form_id = form_id ? form_id : 'blueprints' %} {% set form_id = form_id ? form_id : 'blueprints' %}
{% set scope = scope ?: 'data.' %}
<form id="{{ form_id }}" method="post" data-grav-form="{{ form_id }}" data-grav-keepalive="true"> <form id="{{ form_id }}" method="post" data-grav-form="{{ form_id }}" data-grav-keepalive="true">
{% for field in blueprints.fields %} {% for field in blueprints.fields %}

View File

@@ -1,4 +1,5 @@
{% set form_id = form_id ? form_id : 'blueprints' %} {% set form_id = form_id ? form_id : 'blueprints' %}
{% set scope = scope ?: 'data.' %}
<form id="{{ form_id }}" method="post" data-grav-form="{{ form_id }}" data-grav-keepalive="true"> <form id="{{ form_id }}" method="post" data-grav-form="{{ form_id }}" data-grav-keepalive="true">
{% for field in blueprints.fields %} {% for field in blueprints.fields %}

View File

@@ -1,4 +1,5 @@
{% set form_id = form_id ? form_id : 'blueprints' %} {% set form_id = form_id ? form_id : 'blueprints' %}
{% set scope = scope ?: 'data.' %}
{% set multipart = '' %} {% set multipart = '' %}
{% for field in blueprints.fields %} {% for field in blueprints.fields %}