Implemented the view bag. Minor UX fix.

This commit is contained in:
alekseybobkov 2014-08-06 22:42:09 +11:00
parent 268f693d81
commit 2018215c44
9 changed files with 98 additions and 22 deletions

View File

@ -7753,7 +7753,7 @@ nav#layout-mainmenu.navbar ul li.preview i {
}
nav#layout-mainmenu.navbar ul li.power-off a,
nav#layout-mainmenu.navbar ul li.preview a {
padding: 20px;
padding: 22px 20px 20px 20px;
}
nav#layout-mainmenu.navbar ul li.account {
margin-right: 0;

View File

@ -56,7 +56,7 @@ nav#layout-mainmenu.navbar {
&.power-off, &.preview {
i {font-size: 20px;}
a {padding: 20px;}
a {padding: 22px 20px 20px 20px;}
}
&.account {

View File

@ -7,6 +7,7 @@ use BackendAuth;
use Backend\Classes\WidgetManager;
use October\Rain\Support\ModuleServiceProvider;
use System\Classes\SettingsManager;
use Cms\Classes\ComponentManager;
class ServiceProvider extends ModuleServiceProvider
{
@ -116,6 +117,13 @@ class ServiceProvider extends ModuleServiceProvider
]
]);
});
/*
* Register components
*/
ComponentManager::instance()->registerComponents(function($manager){
$manager->registerComponent('Cms\Classes\ViewBag', 'viewBag');
});
}
/**

View File

@ -367,7 +367,7 @@
var $componentList = $('.control-componentlist', pane),
$primaryPanel = $('.control-tabs.primary', pane),
$primaryTabContainer = $('.nav-tabs', $primaryPanel),
hasComponents = $('.layout', $componentList).children().length > 0
hasComponents = $('.layout', $componentList).children(':not(.hidden)').length > 0
$primaryTabContainer.toggleClass('component-area', hasComponents)
$componentList.toggleClass('has-components', hasComponents)

View File

@ -34,6 +34,11 @@ abstract class ComponentBase extends Extendable
*/
public $name;
/**
* @var boolean Determines whether the component is hidden in the back-end UI.
*/
public $isHidden = false;
/**
* @var string Icon of the plugin that defines the component.
* This field is used by the CMS internally.

View File

@ -100,6 +100,9 @@ class ComponentManager
if (!$code)
$code = Str::getClassId($className);
if ($code == 'viewBag' && $className != 'Cms\Classes\ViewBag')
throw new SystemException(sprintf('The component code viewBag is reserved. Please use another code for the component class %s.', $className));
$className = Str::normalizeClassName($className);
$this->codeMap[$code] = $className;
$this->classMap[$className] = $code;

View File

@ -0,0 +1,50 @@
<?php namespace Cms\Classes;
use Cms\Classes\ComponentBase;
/**
* The view bag stores custom template properties.
* This is a hidden component ignored by the back-end UI.
*
* @package october\cms
* @author Alexey Bobkov, Samuel Georges
*/
class ViewBag extends ComponentBase
{
public $isHidden = true;
public function componentDetails()
{
return [
'name' => 'viewBag',
'description' => 'Stores custom template properties.'
];
}
public function validateProperties(array $properties)
{
return $properties;
}
public function __call($method, $parameters)
{
if (array_key_exists($method, $this->properties) && !method_exists($this, $method))
return $this->properties[$method];
return parent::__call($method, $parameters);
}
public function defineProperties()
{
$result = [];
foreach ($this->properties as $name=>$value) {
$result[$name] = [
'title' => $name,
'type' => 'string'
];
}
return $result;
}
}

View File

@ -0,0 +1,17 @@
<div class="layout-cell <?= e($component->componentCssClass) ?> <?= $component->isHidden ? 'hidden' : null ?>">
<div
class="<?= 'oc-'.$component->pluginIcon ?> layout-relative"
<?php if ($component->inspectorEnabled): ?>data-inspectable<?php endif ?>
data-inspector-title="<?= $name = e($this->getComponentName($component)) ?>"
data-inspector-description="<?= $description = e($this->getComponentDescription($component)) ?>"
data-inspector-config="<?= e($this->getComponentsPropertyConfig($component)) ?>"
data-inspector-class="<?= get_class($component) ?>">
<span class="name"><?= $name ?></span>
<span class="description"><?= $description ?></span>
<span class="alias oc-icon-code"><?= e($component->alias) ?></span>
<input type="hidden" name="component_properties[]" data-inspector-values value="<?= e($this->getComponentPropertyValues($component)) ?>"/>
<input type="hidden" name="component_names[]" value="<?= e($component->name) ?>"></input>
<input type="hidden" name="component_aliases[]" value="<?= e($component->alias) ?>"></input>
<a href="#" class="remove">&times;</a>
</div>
</div>

View File

@ -1,25 +1,18 @@
<div class="control-componentlist">
<?php
foreach ($components as $component) {
if ($component->isHidden)
echo $this->makePartial('component', ['component'=>$component]);
}
?>
<div class="components" data-control="toolbar">
<div class="layout">
<?php foreach ($components as $component): ?>
<div class="layout-cell <?= e($component->componentCssClass) ?>">
<div
class="<?= 'oc-'.$component->pluginIcon ?> layout-relative"
<?php if ($component->inspectorEnabled): ?>data-inspectable<?php endif ?>
data-inspector-title="<?= $name = e($this->getComponentName($component)) ?>"
data-inspector-description="<?= $description = e($this->getComponentDescription($component)) ?>"
data-inspector-config="<?= e($this->getComponentsPropertyConfig($component)) ?>"
data-inspector-class="<?= get_class($component) ?>">
<span class="name"><?= $name ?></span>
<span class="description"><?= $description ?></span>
<span class="alias oc-icon-code"><?= e($component->alias) ?></span>
<input type="hidden" name="component_properties[]" data-inspector-values value="<?= e($this->getComponentPropertyValues($component)) ?>"/>
<input type="hidden" name="component_names[]" value="<?= e($component->name) ?>"></input>
<input type="hidden" name="component_aliases[]" value="<?= e($component->alias) ?>"></input>
<a href="#" class="remove">&times;</a>
</div>
</div>
<?php endforeach ?>
<?php
foreach ($components as $component) {
if (!$component->isHidden)
echo $this->makePartial('component', ['component'=>$component]);
}
?>
</div>
</div>
</div>