Merge branch 'develop' into importexport

This commit is contained in:
Samuel Georges 2015-07-19 10:14:45 +10:00
commit f99f838faf
16 changed files with 537 additions and 57 deletions

View File

@ -166,8 +166,8 @@
.control-filelist ul{padding:0;margin:0}
.control-filelist ul li{font-weight:300;line-height:150%;position:relative;list-style:none}
.control-filelist ul li a:hover{background:#dddddd}
.control-filelist ul li.active a{background:#dddddd;position:relative}
.control-filelist ul li.active a:after{position:absolute;height:100%;width:4px;left:0;top:0;background:#e67e22;display:block;content:' '}
.control-filelist ul li.active > a{background:#dddddd;position:relative}
.control-filelist ul li.active > a:after{position:absolute;height:100%;width:4px;left:0;top:0;background:#e67e22;display:block;content:' '}
.control-filelist ul li a{display:block;padding:10px 40px 10px 20px;outline:none}
.control-filelist ul li a:hover,.control-filelist ul li a:focus,.control-filelist ul li a:active{text-decoration:none}
.control-filelist ul li a span{display:block}
@ -197,11 +197,14 @@
.control-filelist ul li .checkbox{position:absolute;top:13px;right:17px}
.control-filelist ul li .checkbox label{margin-right:0}
.control-filelist ul li .checkbox label:before{border-color:#cccccc}
.control-filelist.single-line ul li a span.title{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}
.control-filelist.hero ul li{background:#ffffff;border-bottom:none}
.control-filelist.hero ul li > a{padding:16px 45px 15px 50px;font-size:13px;border-bottom:1px solid #ecf0f1}
.control-filelist.hero ul li > a span.title{font-size:13px;font-weight:600;color:#2b3e50}
.control-filelist.hero ul li > a .list-icon{position:absolute;left:14px;top:20px;font-size:22px;color:#b7c0c2}
.control-filelist.hero ul li > a:hover{background:#58b6f7;border-bottom:1px solid #58b6f7 !important}
.control-filelist.hero ul li > a:hover span.title,.control-filelist.hero ul li > a:hover span.description{color:#ffffff !important}
.control-filelist.hero ul li > a:hover .list-icon{color:#ffffff !important}
.control-filelist.hero ul li .checkbox{top:17px;right:17px}
.control-filelist.hero ul li.active > a{border-bottom:1px solid #dddddd}
.control-filelist.hero ul li.active > a:after{top:-1px;bottom:-1px;height:auto}
@ -209,7 +212,15 @@
.control-filelist.hero ul li.active > a > span.borders:before{top:-1px}
.control-filelist.hero ul li.active > a:hover > span.borders:before{background-color:#58b6f7}
.control-filelist.hero ul li > h4{padding-top:7px;padding-bottom:6px;border-bottom:1px solid #ecf0f1}
.control-filelist.hero ul li > div.controls{display:none;position:absolute;right:16px;top:15px}
.control-filelist.hero ul li > div.controls > a.control{width:16px;height:23px;background:transparent;overflow:hidden;display:inline-block;color:#ffffff !important;padding:0}
.control-filelist.hero ul li > div.controls > a.control:before{font-size:17px}
.control-filelist.hero ul li:hover > div.controls{display:block}
.control-filelist.hero ul > li.group > ul > li > a{padding-left:66px}
.control-filelist.hero.single-level ul li:hover{background:#58b6f7}
.control-filelist.hero.single-level ul li:hover > a{background:#58b6f7;border-bottom:1px solid #58b6f7 !important}
.control-filelist.hero.single-level ul li:hover > a span.title,.control-filelist.hero.single-level ul li:hover > a span.description{color:#ffffff !important}
.control-filelist.hero.single-level ul li:hover > a .list-icon{color:#ffffff !important}
.touch .control-filelist li:not(.active) a:hover{background:transparent}
.control-scrollpanel{position:relative;background:#ecf0f1}
.control-scrollpanel .control-scrollbar.vertical > .scrollbar-scrollbar{right:0}
@ -1629,7 +1640,7 @@ ul.status-list li span.status.info{background:#5bc0de}
.control-toolbar .toolbar-item .btn-group .dropdown.last > .btn{border-bottom-right-radius:2px !important;border-top-right-radius:2px !important}
.control-toolbar input.form-control[type=text]{height:auto;padding:8px 10px}
[data-control=toolbar]{white-space:nowrap;width:100%;overflow:hidden}
#layout-side-panel .control-toolbar{padding:20px 0 20px 20px}
#layout-side-panel .control-toolbar,.panel-contents .control-toolbar{padding:20px 0 20px 20px}
div.scoreboard{position:relative;padding:0}
div.scoreboard:after,div.scoreboard:before{display:none;position:absolute;top:50%;margin-top:-7px;height:9px;font-size:10px;color:#bbbbbb}
div.scoreboard:before{left:-6px;font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;content:"\f104"}
@ -3194,6 +3205,10 @@ body.mainmenu-open .mainmenu-collapsed ul{position:fixed;left:0;top:10px;bottom:
#layout-side-panel .fix-button{position:absolute;right:2px;top:1px;display:block;width:20px;height:20px;font-size:13px}
#layout-side-panel .fix-button i{display:block;text-align:center;margin-top:5px;color:#aaaaaa}
#layout-side-panel .fix-button:hover{text-decoration:none;opacity:1 !important;filter:alpha(opacity=100) !important}
#layout-side-panel .fix-button-content-header .fix-button{top:9px;right:7px}
#layout-side-panel .fix-button-content-header .fix-button i{color:#eeeeee}
#layout-side-panel .sidepanel-content-header{background:#95a5a6;color:white;font-size:14px;padding:10px 15px;position:relative}
#layout-side-panel .sidepanel-content-header:after{content:'';display:block;width:0;height:0;border-left:7.5px solid transparent;border-right:7.5px solid transparent;border-top:8px solid #95a5a6;border-bottom-width:0;position:absolute;left:14px;bottom:-8px}
body.side-panel-not-fixed #layout-side-panel{display:none}
body.side-panel-not-fixed #layout-side-panel .fix-button{opacity:0.5;filter:alpha(opacity=50)}
body.display-side-panel #layout-side-panel{display:block;position:absolute;z-index:500;width:300px;-webkit-box-shadow:2px 0px 2px 0 rgba(0,0,0,0.3);box-shadow:2px 0px 2px 0 rgba(0,0,0,0.3)}
@ -3342,6 +3357,13 @@ html.csstransitions body.outer.preload .outer-form-container{-webkit-transform:s
.fancy-layout .field-richeditor{border:none;border-left:1px solid #e0e0e0 !important}
.fancy-layout .field-richeditor,.fancy-layout .field-richeditor .redactor_box,.fancy-layout .field-richeditor .redactor_toolbar{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border-top-right-radius:0;border-top-left-radius:0}
.fancy-layout .field-richeditor .redactor-box textarea{background:white;padding:20px !important;color:#333333;font-size:14px}
.fancy-layout .secondary-content-tabs .field-richeditor .redactor-box .redactor-toolbar{margin:20px 20px 0 20px!important;-webkit-border-radius:3px !important;-moz-border-radius:3px !important;border-radius:3px !important}
.fancy-layout .secondary-content-tabs .field-richeditor .redactor-box .redactor-toolbar{margin:20px 20px 0 20px !important;-webkit-border-radius:3px !important;-moz-border-radius:3px !important;border-radius:3px !important}
body.side-panel-not-fixed .fancy-layout .field-richeditor{border-left:none}
html.cssanimations .fancy-layout .form-tabless-fields .loading-indicator-container .loading-indicator > span{-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite;background-image:url(../../../../../modules/system/assets/ui/images/loader-white.svg);background-size:20px 20px}
html.cssanimations .fancy-layout .form-tabless-fields .loading-indicator-container .loading-indicator > span{-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite;background-image:url('../../../system/assets/ui/images/loader-white.svg');background-size:20px 20px}
.flyout-container > .flyout{overflow:hidden;width:0;left:0 !important;-webkit-transition:width 0.1s;transition:width 0.1s}
.flyout-overlay{width:100%;height:100%;top:0;z-index:5000;position:absolute;background-color:rgba(0,0,0,0);-webkit-transition:background-color 0.3s;transition:background-color 0.3s}
.flyout-toggle{position:absolute;top:20px;left:0;width:23px;height:25px;background:#2b3e50;cursor:pointer;border-bottom-right-radius:4px;border-top-right-radius:4px;color:#bdc3c7;font-size:10px}
.flyout-toggle i{margin:7px 0 0 6px;display:inline-block}
.flyout-toggle:hover i{color:#ffffff}
body.flyout-visible{overflow:hidden}
body.flyout-visible .flyout-overlay{background-color:rgba(0,0,0,0.3)}

View File

@ -4083,7 +4083,10 @@ this.$src=$(options.inputPreset,parent),this.$src.on('keyup',function(){if(self.
return
$el.val(prefix+self.formatValue())})
this.$el.on('change',function(){self.cancelled=true})}
InputPreset.prototype.formatValue=function(){if(this.options.inputPresetType=='camel')
InputPreset.prototype.formatNamespace=function(){var value=toCamel(this.$src.val())
return value.substr(0,1).toUpperCase()+value.substr(1)}
InputPreset.prototype.formatValue=function(){if(this.options.inputPresetType=='namespace'){return this.formatNamespace()}
if(this.options.inputPresetType=='camel')
var value=toCamel(this.$src.val())
else{var value=slugify(this.$src.val())}
if(this.options.inputPresetType=='url')
@ -4368,8 +4371,12 @@ this.init()}
Sortable.prototype=Object.create(BaseProto)
Sortable.prototype.constructor=Sortable
Sortable.prototype.init=function(){this.$el.one('dispose-control',this.proxy(this.dispose))
var sortableOptions={onDragStart:this.proxy(this.onDragStart),onDrag:this.proxy(this.onDrag),onDrop:this.proxy(this.onDrop)}
this.$el.jqSortable($.extend(sortableOptions,this.options))}
var
self=this,sortableOverrides={},sortableDefaults={onDragStart:this.proxy(this.onDragStart),onDrag:this.proxy(this.onDrag),onDrop:this.proxy(this.onDrop)}
if(this.options.onDragStart){sortableOverrides.onDragStart=function($item,container,_super,event){self.options.onDragStart($item,container,sortableDefaults.onDragStart,event)}}
if(this.options.onDrag){sortableOverrides.onDrag=function($item,position,_super,event){self.options.onDrag($item,position,sortableDefaults.onDrag,event)}}
if(this.options.onDrop){sortableOverrides.onDrop=function($item,container,_super,event){self.options.onDrop($item,container,sortableDefaults.onDrop,event)}}
this.$el.jqSortable($.extend({},sortableDefaults,this.options,sortableOverrides))}
Sortable.prototype.dispose=function(){this.$el.jqSortable('destroy')
this.$el.off('dispose-control',this.proxy(this.dispose))
this.$el.removeData('oc.sortable')
@ -4377,8 +4384,6 @@ this.$el=null
this.options=null
this.cursorAdjustment=null
BaseProto.dispose.call(this)}
Sortable.prototype.onDrag=function($item,position,_super,event){if(this.cursorAdjustment){$item.css({left:position.left-this.cursorAdjustment.left,top:position.top-this.cursorAdjustment.top})}
else{$item.css(position)}}
Sortable.prototype.onDragStart=function($item,container,_super,event){var offset=$item.offset(),pointer=container.rootGroup.pointer
if(pointer){this.cursorAdjustment={left:pointer.left-offset.left,top:pointer.top-offset.top}}
else{this.cursorAdjustment=null}
@ -4388,6 +4393,8 @@ $item.addClass('dragged')
$('body').addClass('dragging')
if(this.options.useAnimation){$item.data('oc.animated',true)}
if(this.options.usePlaceholderClone){$(container.rootGroup.placeholder).html($item.html())}}
Sortable.prototype.onDrag=function($item,position,_super,event){if(this.cursorAdjustment){$item.css({left:position.left-this.cursorAdjustment.left,top:position.top-this.cursorAdjustment.top})}
else{$item.css(position)}}
Sortable.prototype.onDrop=function($item,container,_super,event){$item.removeClass('dragged').removeAttr('style')
$('body').removeClass('dragging')
if($item.data('oc.animated')){$item.hide().slideDown(200)}}
@ -4953,12 +4960,12 @@ return this}
$(document).render(function(){$('[data-control=scrollbar]').scrollbar()})}(window.jQuery);+function($){"use strict";var FileList=function(element,options){this.options=options
this.$el=$(element)
this.init();}
FileList.DEFAULTS={}
FileList.DEFAULTS={ignoreItemClick:false}
FileList.prototype.init=function(){var self=this
this.$el.on('click','li.group > h4 > a, li.group > div.group',function(){self.toggleGroup($(this).closest('li'))
return false;});this.$el.on('click','li.item > a',function(event){var e=$.Event('open.oc.list',{relatedTarget:$(this).parent().get(0),clickEvent:event})
return false;});if(!this.options.ignoreItemClick){this.$el.on('click','li.item > a',function(event){var e=$.Event('open.oc.list',{relatedTarget:$(this).parent().get(0),clickEvent:event})
self.$el.trigger(e,this)
return false})
return false})}
this.$el.on('ajaxUpdate',$.proxy(this.update,this))}
FileList.prototype.toggleGroup=function(group){var $group=$(group);$group.attr('data-status')=='expanded'?this.collapseGroup($group):this.expandGroup($group)}
FileList.prototype.collapseGroup=function(group){var

View File

@ -30,7 +30,7 @@
}
FileList.DEFAULTS = {
ignoreItemClick: false
}
FileList.prototype.init = function (){
@ -42,12 +42,14 @@
return false;
});
this.$el.on('click', 'li.item > a', function(event) {
var e = $.Event('open.oc.list', {relatedTarget: $(this).parent().get(0), clickEvent: event})
self.$el.trigger(e, this)
if (!this.options.ignoreItemClick) {
this.$el.on('click', 'li.item > a', function(event) {
var e = $.Event('open.oc.list', {relatedTarget: $(this).parent().get(0), clickEvent: event})
self.$el.trigger(e, this)
return false
})
return false
})
}
this.$el.on('ajaxUpdate', $.proxy(this.update, this))
}

View File

@ -0,0 +1,222 @@
/*
* Flyout plugin.
*/
+function ($) { "use strict";
var Base = $.oc.foundation.base,
BaseProto = Base.prototype
// SCROLLPAD CLASS DEFINITION
// ============================
var Flyout = function(element, options) {
this.$el = $(element)
this.$overlay = null
this.options = options
Base.call(this)
this.init()
}
Flyout.prototype = Object.create(BaseProto)
Flyout.prototype.constructor = Flyout
Flyout.prototype.dispose = function() {
this.removeOverlay()
this.$el.removeData('oc.flyout')
this.$el = null
if (this.options.flyoutToggle) {
this.removeToggle()
}
BaseProto.dispose.call(this)
}
Flyout.prototype.show = function() {
var $cells = this.$el.find('> .layout-cell'),
$flyout = this.$el.find('> .flyout')
this.removeOverlay()
for (var i = 0; i < $cells.length; i++) {
var $cell = $($cells[i]),
width = $cell.width()
$cell.css('width', width)
}
this.createOverlay()
window.setTimeout(this.proxy(this.setBodyClass), 1)
$flyout.css('width', this.options.flyoutWidth)
this.hideToggle()
}
Flyout.prototype.hide = function() {
var $cells = this.$el.find('> .layout-cell'),
$flyout = this.$el.find('> .flyout')
for (var i = 0; i < $cells.length; i++) {
var $cell = $($cells[i])
$cell.css('width', '')
}
$flyout.css('width', 0)
window.setTimeout(this.proxy(this.removeBodyClass), 1)
window.setTimeout(this.proxy(this.removeOverlayAndShowToggle), 300)
}
// FLYOUT INTERNAL METHODS
// ============================
Flyout.prototype.init = function() {
this.build()
}
Flyout.prototype.build = function() {
if (this.options.flyoutToggle) {
this.buildToggle()
}
}
Flyout.prototype.buildToggle = function() {
var $toggleContainer = $(this.options.flyoutToggle),
$toggle = $('<div class="flyout-toggle"><i class="icon-chevron-right"></i></div>')
$toggle.on('click', this.proxy(this.show))
$toggleContainer.append($toggle)
}
Flyout.prototype.removeToggle = function() {
var $toggle = this.getToggle()
$toggle.off('click', this.proxy(this.show))
$toggle.remove()
}
Flyout.prototype.hideToggle = function() {
if (!this.options.flyoutToggle) {
return
}
this.getToggle().hide()
}
Flyout.prototype.showToggle = function() {
if (!this.options.flyoutToggle) {
return
}
this.getToggle().show()
}
Flyout.prototype.getToggle = function() {
var $toggleContainer = $(this.options.flyoutToggle)
return $toggleContainer.find('.flyout-toggle')
}
Flyout.prototype.setBodyClass = function() {
$(document.body).addClass('flyout-visible')
}
Flyout.prototype.removeBodyClass = function() {
$(document.body).removeClass('flyout-visible')
}
Flyout.prototype.createOverlay = function() {
this.$overlay = $('<div class="flyout-overlay"/>')
var position = this.$el.offset()
this.$overlay.css({
top: position.top,
left: this.options.flyoutWidth
})
this.$overlay.on('click', this.proxy(this.onOverlayClick))
$(document.body).on('keydown', this.proxy(this.onDocumentKeydown))
$(document.body).append(this.$overlay)
}
Flyout.prototype.removeOverlay = function() {
if (!this.$overlay) {
return
}
this.$overlay.off('click', this.proxy(this.onOverlayClick))
$(document.body).off('keydown', this.proxy(this.onDocumentKeydown))
this.$overlay.remove()
this.$overlay = null
}
Flyout.prototype.removeOverlayAndShowToggle = function() {
this.removeOverlay()
this.showToggle()
}
// EVENT HANDLERS
// ============================
Flyout.prototype.onOverlayClick = function() {
this.hide()
}
Flyout.prototype.onDocumentKeydown = function(ev) {
if (ev.which == 27) {
this.hide();
}
}
// FLYOUT PLUGIN DEFINITION
// ============================
Flyout.DEFAULTS = {
flyoutWidth: 400,
flyoutToggle: null
}
var old = $.fn.flyout
$.fn.flyout = function (option) {
var args = Array.prototype.slice.call(arguments, 1),
result = undefined
this.each(function () {
var $this = $(this)
var data = $this.data('oc.flyout')
var options = $.extend({}, Flyout.DEFAULTS, $this.data(), typeof option == 'object' && option)
if (!data) $this.data('oc.flyout', (data = new Flyout(this, options)))
if (typeof option == 'string') result = data[option].apply(data, args)
if (typeof result != 'undefined') return false
})
return result ? result : this
}
$.fn.flyout.Constructor = Flyout
// FLYOUT NO CONFLICT
// =================
$.fn.flyout.noConflict = function () {
$.fn.flyout = old
return this
}
// FLYOUT DATA-API
// ===============
// Currently flyouts don't use the document render event
// and can't be created dynamically (performance considerations).
$(document).on('ready', function(){
$('div[data-control=flyout]').flyout()
})
}(window.jQuery);

View File

@ -41,7 +41,7 @@
background: @color-list-hover;
}
&.active a {
&.active > a {
background: @color-list-active;
position: relative;
&:after {
@ -167,7 +167,29 @@
}
}
&.single-line {
ul {
li a span.title {
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
}
}
&.hero {
.a-hover() {
background: @color-filelist-hero-hover-bg;
border-bottom: 1px solid @color-filelist-hero-hover-bg!important;
span.title, span.description {
color: @color-filelist-hero-hover-text!important;
}
.list-icon {
color: @color-filelist-hero-hover-text!important;
}
}
ul {
li {
background: @color-filelist-hero-item-bg;
@ -184,12 +206,16 @@
color: @color-filelist-title-hero;
}
.list-icon {
position: absolute;
left: 14px;
top: 20px;
font-size: 22px;
color: #b7c0c2;
}
&:hover {
background: @color-filelist-hero-hover-bg;
border-bottom: 1px solid @color-filelist-hero-hover-bg!important;
span.title, span.description {
color: @color-filelist-hero-hover-text!important;
}
.a-hover();
}
}
@ -233,6 +259,31 @@
padding-bottom: 6px;
border-bottom: 1px solid @color-panel-light;
}
> div.controls {
display: none;
position: absolute;
right: 16px;
top: 15px;
> a.control {
width: 16px;
height: 23px;
background: transparent;
overflow: hidden;
display: inline-block;
color: @color-filelist-hero-hover-text!important;
padding: 0;
&:before {
font-size: 17px;
}
}
}
&:hover > div.controls {
display: block;
}
}
> li.group {
@ -241,6 +292,16 @@
}
}
}
&.single-level {
ul li:hover {
background: @color-filelist-hero-hover-bg;
> a {
.a-hover();
}
}
}
}
}

View File

@ -72,6 +72,7 @@
@color-scrollbar-thumb: #aaa;
@color-scrollpanel-border: #efefef;
@color-scrollpanel-fix-button: #aaaaaa;
@color-scrollpanel-fix-button-light: #eeeeee;
@color-scroll-indicator: #bbbbbb;
@color-richeditor-toolbar: #dddddd;

View File

@ -544,7 +544,7 @@
.field-richeditor {
border: none;
border-left: 1px solid @color-form-field-border!important;
border-left: 1px solid @color-form-field-border !important;
&, .redactor_box, .redactor_toolbar {
.border-radius(0);
@ -553,7 +553,7 @@
.redactor-box textarea {
background: white;
padding: 20px!important;
padding: 20px !important;
color: #333333;
font-size: 14px;
}
@ -561,8 +561,8 @@
.secondary-content-tabs .field-richeditor {
.redactor-box .redactor-toolbar {
margin: 20px 20px 0 20px!important;
.border-radius(3px)!important;
margin: 20px 20px 0 20px !important;
.border-radius(3px) !important;
}
}
}
@ -581,7 +581,7 @@ html.cssanimations {
.loading-indicator-container {
.loading-indicator > span {
.animation(spin 1s linear infinite);
background-image: url(../../../../../modules/system/assets/ui/images/loader-white.svg);
background-image: url('../../../system/assets/ui/images/loader-white.svg');
background-size: 20px 20px;
}
}

View File

@ -0,0 +1,48 @@
.flyout-container {
> .flyout {
overflow: hidden;
width: 0;
left: 0!important;
.transition(width 0.1s);
}
}
.flyout-overlay {
width: 100%;
height: 100%;
top: 0;
z-index: 5000;
position: absolute;
background-color: rgba(0,0,0,0);
.transition(background-color 0.3s);
}
.flyout-toggle {
position: absolute;
top: 20px;
left: 0;
width: 23px;
height: 25px;
background: #2b3e50;
cursor: pointer;
.border-right-radius(4px);
color: #bdc3c7;
font-size: 10px;
i {
margin: 7px 0 0 6px;
display: inline-block;
}
&:hover i {
color: #ffffff;
}
}
body.flyout-visible {
overflow: hidden;
.flyout-overlay {
background-color: rgba(0,0,0,0.3);
}
}

View File

@ -24,6 +24,30 @@
.opacity(1)!important;
}
}
.fix-button-content-header .fix-button {
top: 9px;
right: 7px;
i {
color: @color-scrollpanel-fix-button-light;
}
}
.sidepanel-content-header {
background: #95a5a6;
color: white;
font-size: 14px;
padding: 10px 15px;
position: relative;
&:after {
.triangle(down, 15px, 8px, #95a5a6);
position: absolute;
left: 14px;
bottom: -8px;
}
}
}
body.side-panel-not-fixed {

View File

@ -59,4 +59,5 @@
@import "layout/footer.less";
@import "layout/outerlayout.less";
@import "layout/fancylayout.less";
@import "layout/flyout.less";

View File

@ -14,6 +14,8 @@
<script src="<?= Backend::skinAsset('assets/js/october-min.js') ?>?v<?= System\Models\Parameters::get('system::core.build', 1) ?>"></script>
<script src="<?= URL::asset('modules/cms/widgets/mediamanager/assets/js/mediamanager-global-min.js') ?>"></script>
<script src="<?= Backend::skinAsset('assets/js/october.flyout.js') ?>"></script>
<?= $this->makeAssets() ?>
<?= Block::placeholder('head') ?>
<?= $this->makeLayoutPartial('custom_styles') ?>

View File

@ -12,8 +12,19 @@
<?= $this->makeLayoutPartial('mainmenu') ?>
</div>
<?php $flyoutContent = Block::placeholder('sidepanel-flyout') ?>
<div class="layout-row">
<div class="layout">
<div class="layout flyout-container"
<?php if ($flyoutContent): ?>
data-control="flyout"
data-flyout-width="400"
data-flyout-toggle="#layout-sidenav"
<?php endif ?>
>
<?php if ($flyoutContent): ?>
<div class="layout-cell flyout"> <?= $flyoutContent ?></div>
<?php endif ?>
<!-- Side Navigation -->
<?= $this->makeLayoutPartial('sidenav') ?>

View File

@ -28,13 +28,37 @@
Sortable.prototype.init = function() {
this.$el.one('dispose-control', this.proxy(this.dispose))
var sortableOptions = {
onDragStart: this.proxy(this.onDragStart),
onDrag: this.proxy(this.onDrag),
onDrop: this.proxy(this.onDrop)
var
self = this,
sortableOverrides = {},
sortableDefaults = {
onDragStart: this.proxy(this.onDragStart),
onDrag: this.proxy(this.onDrag),
onDrop: this.proxy(this.onDrop)
}
/*
* Override _super object for each option/event
*/
if (this.options.onDragStart) {
sortableOverrides.onDragStart = function ($item, container, _super, event) {
self.options.onDragStart($item, container, sortableDefaults.onDragStart, event)
}
}
this.$el.jqSortable($.extend(sortableOptions, this.options))
if (this.options.onDrag) {
sortableOverrides.onDrag = function ($item, position, _super, event) {
self.options.onDrag($item, position, sortableDefaults.onDrag, event)
}
}
if (this.options.onDrop) {
sortableOverrides.onDrop = function ($item, container, _super, event) {
self.options.onDrop($item, container, sortableDefaults.onDrop, event)
}
}
this.$el.jqSortable($.extend({}, sortableDefaults, this.options, sortableOverrides))
}
Sortable.prototype.dispose = function() {
@ -47,24 +71,6 @@
BaseProto.dispose.call(this)
}
Sortable.prototype.onDrag = function ($item, position, _super, event) {
if (this.cursorAdjustment) {
/*
* Relative cursor position
*/
$item.css({
left: position.left - this.cursorAdjustment.left,
top: position.top - this.cursorAdjustment.top
})
}
else {
/*
* Default behavior
*/
$item.css(position)
}
}
Sortable.prototype.onDragStart = function ($item, container, _super, event) {
/*
* Relative cursor position
@ -109,6 +115,24 @@
}
}
Sortable.prototype.onDrag = function ($item, position, _super, event) {
if (this.cursorAdjustment) {
/*
* Relative cursor position
*/
$item.css({
left: position.left - this.cursorAdjustment.left,
top: position.top - this.cursorAdjustment.top
})
}
else {
/*
* Default behavior
*/
$item.css(position)
}
}
Sortable.prototype.onDrop = function ($item, container, _super, event) {
$item.removeClass('dragged').removeAttr('style')
$('body').removeClass('dragging')

View File

@ -225,7 +225,17 @@
})
}
InputPreset.prototype.formatNamespace = function() {
var value = toCamel(this.$src.val())
return value.substr(0, 1).toUpperCase() + value.substr(1)
}
InputPreset.prototype.formatValue = function() {
if (this.options.inputPresetType == 'namespace') {
return this.formatNamespace()
}
if (this.options.inputPresetType == 'camel')
var value = toCamel(this.$src.val())
else {

View File

@ -104,7 +104,7 @@
overflow: hidden;
}
#layout-side-panel {
#layout-side-panel, .panel-contents {
.control-toolbar {
padding: 20px 0 20px 20px;
}

View File

@ -1,6 +1,9 @@
<?php namespace System\Classes;
use Illuminate\Support\ServiceProvider as ServiceProviderBase;
use ReflectionClass;
use SystemException;
use Yaml;
/**
* Plugin base class
@ -8,8 +11,10 @@ use Illuminate\Support\ServiceProvider as ServiceProviderBase;
* @package october\system
* @author Alexey Bobkov, Samuel Georges
*/
abstract class PluginBase extends ServiceProviderBase
class PluginBase extends ServiceProviderBase
{
protected $loadedYamlConfigration = false;
/**
* @var array Plugin dependencies
*/
@ -28,7 +33,20 @@ abstract class PluginBase extends ServiceProviderBase
/**
* Returns information about this plugin, including plugin name and developer name.
*/
abstract public function pluginDetails();
public function pluginDetails()
{
$thisClass = get_class($this);
$configuration = $this->getConfigurationFromYaml(sprintf('Plugin configuration file plugin.yaml is not '.
'found for the plugin class %s. Create the file or override pluginDetails() '.
'method in the plugin class.', $thisClass));
if (!array_key_exists('plugin', $configuration)) {
throw new SystemException('The plugin configuration file plugin.yaml should contain the "plugin" section: %s.', $thisClass);
}
return $configuration['plugin'];
}
/**
* Register method, called when the plugin is first registered.
@ -147,4 +165,31 @@ abstract class PluginBase extends ServiceProviderBase
$this->commands($key);
}
protected function getConfigurationFromYaml($exceptionMessage = null)
{
if ($this->loadedYamlConfigration !== false) {
return $this->loadedYamlConfigration;
}
$reflection = new ReflectionClass(get_class($this));
$yamlFilePath = dirname($reflection->getFileName()).'/plugin.yaml';
if (!file_exists($yamlFilePath)) {
if ($exceptionMessage) {
throw new SystemException($exceptionMessage);
}
else {
$this->loadedYamlConfigration = [];
}
}
else {
$this->loadedYamlConfigration = Yaml::parse(file_get_contents($yamlFilePath));
if (!is_array($this->loadedYamlConfigration)) {
throw new SystemException('Invalid format of the plugin configuration file: %s. The file should define an array.', $filePath);
}
}
return $this->loadedYamlConfigration;
}
}