diff --git a/module/block/css/dashboard.css b/module/block/css/dashboard.css index 883cb23d1e..8ddace7740 100644 --- a/module/block/css/dashboard.css +++ b/module/block/css/dashboard.css @@ -1,5 +1,19 @@ .block-statistic .nav-stacked {overflow: auto; max-height: 220px;} .nav > li > .btn {padding: 0 5px; line-height: 24px; margin: 3px; color: #3C4353;} -.dashboard .panel-body {max-height: 400px; overflow: auto;} -.dashboard .panel-actions {padding-top: 7px;} -.dashboard .panel.table-scrolled .table-header-fixed {border-bottom: 1px solid #ddd; box-shadow: 0 1px 1px rgba(0,0,0,.05), 0 2px 4px 0 rgba(0,0,0,0.025);} +#dashboard .panel-body {max-height: 400px; overflow: auto;} +#dashboard .panel-actions {padding-top: 7px;} +#dashboard .panel.table-scrolled .table-header-fixed {border-bottom: 1px solid #ddd; box-shadow: 0 1px 1px rgba(0,0,0,.05), 0 2px 4px 0 rgba(0,0,0,0.025);} +@media (min-width: 992px) +{ + #dashboard > .row {display: table; width: 100%; margin: 0;} + #dashboard > .row > .col-main, + #dashboard > .row > .col-side {display: table-cell; float: none; padding: 0;} + #dashboard > .row > .col-main {padding-right: 10px } + #dashboard > .row > .col-side {padding-left: 10px } +} +#dashboard.sortable-sorting .panel {box-shadow: 0 1px 1px rgba(0,0,0,.075), 0 2px 6px 0 rgba(0,0,0,.075)} +#dashboard.sortable-sorting .panel > * {display: none;} +#dashboard.sortable-sorting .panel:before {display: block; content: attr(data-name); padding: 12px 20px; font-weight: bold; font-size: 14px;} +#dashboard.sortable-sorting .panel.dragging {visibility: visible; background: transparent; background: rgba(0,0,0,.075); box-shadow: inset 0 2px 6px rgba(0,0,0,.075);} +#dashboard.sortable-sorting .panel.dragging:before {color: #bbb;} +#dashboard.sortable-sorting .panel.drag-shadow {box-shadow: 0 1px 3px rgba(0,0,0,.175), 0 3px 8px 0 rgba(0,0,0,.175)} \ No newline at end of file diff --git a/module/block/js/dashboard.js b/module/block/js/dashboard.js index 93ea49509f..a5c8e56a18 100644 --- a/module/block/js/dashboard.js +++ b/module/block/js/dashboard.js @@ -27,39 +27,67 @@ function deleteBlock(index) /** * Sort blocks. * - * @param object $orders format is {'block2' : 1, 'block1' : 2, oldOrder : newOrder} + * @param array $orders format is {'blockid' : 1, 'block1' : 2} + * @param function $callback * @access public * @return void */ -function sortBlocks(orders) +function sortBlocks(newOrders, callback) { - - var ordersMap = []; - $.each(orders, function(blockId, order) {ordersMap.push({id: blockId, order: order});}); - ordersMap.sort(function(a, b) {return a.order - b.order;}); - var newOrders = $.map(ordersMap, function(order, idx) {return order.id}); - - $.getJSON(createLink('block', 'sort', 'orders=' + newOrders.join(',') + '&module=' + module), function(data) - { - // if(data.result == 'success') $.zui.messager.success(config.ordersSaved); - }); + $.getJSON(createLink('block', 'sort', 'orders=' + newOrders.join(',') + '&module=' + module), callback); } /** * Resize block - * @param object $event + * @param string $blockId + * @param function $callback * @access public * @return void */ -function resizeBlock(event) +function resizeBlock(blockID, width, callback) { - var blockID = event.element.find('.panel').data('id'); - var data = event.type == 'vertical' ? event.height : event.grid; - $.getJSON(createLink('block', 'resize', 'id=' + blockID + '&type=' + event.type + '&data=' + data), function(data) + $.getJSON(createLink('block', 'resize', 'id=' + blockID + '&type=horizontal&data=' + width), function(data) { - if(data.result !== 'success') event.revert(); + callback(); + }); + refreshBlock($('#block' + blockID)); +} + +function refreshBlock($panel, afterRefresh) +{ + var url = $panel.data('url'); + $panel.addClass('load-indicator loading'); + $.ajax({url: url, dataType: 'html'}).done(function(data) + { + var $data = $(data); + if($data.hasClass('panel')) $panel.empty().append($data.children()); + else $panel.find('.panel-body').replaceWith($data); + if($.isFunction(afterRefresh)) + { + afterRefresh.call(this, + { + result: true, + data: data, + $panel: $panel + }); + } + $panel.find('.tablesorter').sortTable(); + initTableHeader(); + }).fail(function() + { + $panel.addClass('panel-error'); + if($.isFunction(afterRefresh)) + { + afterRefresh.call(this, + { + result: false, + $panel: $panel + }); + } + }).always(function() + { + $panel.removeClass('loading'); }); - initTableHeader(); } /** @@ -170,29 +198,32 @@ function hiddenBlock(index) $(function() { -// var $dashboard = $('#dashboard').dashboard( -// { -// height : 240, -// draggable : !useGuest, -// shadowType : false, -// afterOrdered : sortBlocks, -// afterPanelRemoved : deleteBlock, -// sensitive : true, -// panelRemovingTip : config.confirmRemoveBlock, -// resizable : !useGuest, -// onResize : resizeBlock, -// afterRefresh : function(e) -// { -// var $sortTable = e.$panel.find('.tablesorter'); -// if($sortTable.length) $sortTable.sortTable(); -// initTableHeader(); -// } -// }); -// -// // $dashboard.find('ul.dashboard-actions').addClass('hide').children('li').addClass('right').appendTo($('#modulemenu > .nav')); -// $dashboard.find('[data-toggle=tooltip]').tooltip({container: 'body'}); + initTableHeader(); - initTableHeader(); + // Init dashboard + $('#dashboard').sortable( + { + selector: '.panel', + trigger: '.panel-heading', + finish: function(e) + { + var newOrders = []; + var isSideCol = e.element.parent().is('.col-side'); + e.list.each(function(params) + { + newOrders.push($(this).data('id')); + }); + sortBlocks(newOrders, function() + { + resizeBlock(e.element.data('id'), isSideCol ? 4 : 8); + }); + + e.element.toggleClass('block-sm', isSideCol); + } + }).on('click', '.refresh-panel', function() + { + refreshBlock($(this).closest('.panel')); + }); }); diff --git a/module/block/view/dashboard.html.php b/module/block/view/dashboard.html.php index bc8b5efd41..eff303fbf4 100644 --- a/module/block/view/dashboard.html.php +++ b/module/block/view/dashboard.html.php @@ -22,78 +22,72 @@ $useGuest = $this->app->user->account == 'guest';
$block):?> block->closed) and strpos(",{$config->block->closed},", ",{$block->source}|{$block->block},") !== false) continue;?> -
-
-
params->color;?>' id='blockid?>' data-id='id?>' data-name='title?>'> - block != 'welcome');?> - -
-
title;?>
- - - -
- - fetch('block', 'printBlock', "id=$block->id&module=$module")?> -
+
params->color;?>' id='blockid?>' data-id='id?>' data-name='title?>' data-order='order?>' data-url='blockLink?>'> + block != 'welcome');?> + +
+
title;?>
+ + +
+ + fetch('block', 'printBlock', "id=$block->id&module=$module")?>
$block):?> block->closed) and strpos(",{$config->block->closed},", ",{$block->source}|{$block->block},") !== false) continue;?> -
-
-
params->color;?>' id='blockid?>' data-id='id?>' data-name='title?>'> - block != 'welcome');?> - -
-
title;?>
- - - -
- - fetch('block', 'printBlock', "id=$block->id&module=$module")?> -
+
params->color;?>' id='blockid?>' data-id='id?>' data-name='title?>' data-order='order?>' data-url='blockLink?>'> + block != 'welcome');?> + +
+
title;?>
+ + +
+ + fetch('block', 'printBlock', "id=$block->id&module=$module")?>
diff --git a/module/block/view/productblock.html.php b/module/block/view/productblock.html.php index a57a074a6f..d9841e40e6 100644 --- a/module/block/view/productblock.html.php +++ b/module/block/view/productblock.html.php @@ -19,7 +19,7 @@ product->name;?> - product->currentProject;?> + product->currentProject;?> product->plans;?> product->releases;?> @@ -36,7 +36,7 @@ > name?> - id, '');?> + id, '');?> plans?> releases?> diff --git a/module/block/view/storyblock.html.php b/module/block/view/storyblock.html.php index e052ee3cf8..fef6bd6249 100644 --- a/module/block/view/storyblock.html.php +++ b/module/block/view/storyblock.html.php @@ -13,7 +13,7 @@