Dashboard now supports reset and make default

Added the new widgets to the add widget screen
System Parameters can now be reset
This commit is contained in:
Samuel Georges 2016-05-28 14:17:45 +10:00
parent b171407382
commit bb769db223
13 changed files with 224 additions and 59 deletions

View File

@ -29,6 +29,7 @@ class ServiceProvider extends ModuleServiceProvider
*/ */
if (App::runningInBackend()) { if (App::runningInBackend()) {
$this->registerBackendNavigation(); $this->registerBackendNavigation();
$this->registerBackendReportWidgets();
$this->registerBackendWidgets(); $this->registerBackendWidgets();
$this->registerBackendPermissions(); $this->registerBackendPermissions();
$this->registerBackendSettings(); $this->registerBackendSettings();
@ -100,6 +101,19 @@ class ServiceProvider extends ModuleServiceProvider
}); });
} }
/*
* Register report widgets
*/
protected function registerBackendReportWidgets()
{
WidgetManager::instance()->registerReportWidgets(function ($manager) {
$manager->registerReportWidget('Backend\ReportWidgets\Welcome', [
'label' => 'backend::lang.dashboard.welcome.widget_title_default',
'context' => 'dashboard'
]);
});
}
/* /*
* Register permissions * Register permissions
*/ */

View File

@ -54,6 +54,7 @@ return [
'widget_label' => 'Widget', 'widget_label' => 'Widget',
'widget_width' => 'Width', 'widget_width' => 'Width',
'full_width' => 'full width', 'full_width' => 'full width',
'manage_widgets' => 'Manage widgets',
'add_widget' => 'Add widget', 'add_widget' => 'Add widget',
'widget_inspector_title' => 'Widget configuration', 'widget_inspector_title' => 'Widget configuration',
'widget_inspector_description' => 'Configure the report widget', 'widget_inspector_description' => 'Configure the report widget',
@ -65,6 +66,12 @@ return [
'widget_new_row_description' => 'Put the widget in a new row.', 'widget_new_row_description' => 'Put the widget in a new row.',
'widget_title_label' => 'Widget title', 'widget_title_label' => 'Widget title',
'widget_title_error' => 'The Widget Title is required.', 'widget_title_error' => 'The Widget Title is required.',
'reset_layout' => 'Reset layout',
'reset_layout_confirm' => 'Reset layout back to default?',
'reset_layout_success' => 'Layout has been reset',
'make_default' => 'Make default',
'make_default_confirm' => 'Set the current layout as the default?',
'make_default_success' => 'Current layout is now the default',
'status' => [ 'status' => [
'widget_title_default' => 'System status', 'widget_title_default' => 'System status',
'update_available' => '{0} updates available!|{1} update available!|[2,Inf] updates available!', 'update_available' => '{0} updates available!|{1} update available!|[2,Inf] updates available!',
@ -89,7 +96,6 @@ return [
'nice_message' => 'Have a great day!', 'nice_message' => 'Have a great day!',
] ]
], ],
'user' => [ 'user' => [
'name' => 'Administrator', 'name' => 'Administrator',
'menu_label' => 'Administrators', 'menu_label' => 'Administrators',

View File

@ -2,10 +2,12 @@
use File; use File;
use Lang; use Lang;
use Flash;
use Request; use Request;
use Backend\Classes\WidgetBase; use Backend\Classes\WidgetBase;
use Backend\Classes\WidgetManager; use Backend\Classes\WidgetManager;
use Backend\Models\UserPreference; use Backend\Models\UserPreference;
use System\Models\Parameters as SystemParameters;
use ApplicationException; use ApplicationException;
/** /**
@ -130,6 +132,26 @@ class ReportContainer extends WidgetBase
// Event handlers // Event handlers
// //
public function onResetWidgets()
{
$this->resetWidgets();
$this->vars['widgets'] = $this->reportWidgets;
Flash::success(Lang::get('backend::lang.dashboard.reset_layout_success'));
return ['#'.$this->getId('container-list') => $this->makePartial('widget_list')];
}
public function onMakeLayoutDefault()
{
$widgets = $this->getWidgetsFromUserPreferences();
SystemParameters::set($this->getSystemParametersKey(), $widgets);
Flash::success(Lang::get('backend::lang.dashboard.make_default_success'));
}
public function onUpdateWidget() public function onUpdateWidget()
{ {
$alias = Request::input('alias'); $alias = Request::input('alias');
@ -196,6 +218,10 @@ class ReportContainer extends WidgetBase
public function addWidget($widget, $size) public function addWidget($widget, $size)
{ {
if (!$this->canAddAndDelete) {
throw new ApplicationException('Access denied.');
}
$widgets = $this->getWidgetsFromUserPreferences(); $widgets = $this->getWidgetsFromUserPreferences();
$num = count($widgets); $num = count($widgets);
@ -259,7 +285,7 @@ class ReportContainer extends WidgetBase
} }
// //
// Methods for the internal use // Methods for internal use
// //
/** /**
@ -315,35 +341,21 @@ class ReportContainer extends WidgetBase
return ['widget' => $widget, 'sortOrder' => $widgetInfo['sortOrder']]; return ['widget' => $widget, 'sortOrder' => $widgetInfo['sortOrder']];
} }
protected function getWidgetsFromUserPreferences() protected function resetWidgets()
{ {
$widgets = UserPreference::forUser() $this->resetWidgetsUserPreferences();
->get($this->getUserPreferencesKey(), $this->defaultWidgets);
if (!is_array($widgets)) { $this->reportsDefined = false;
return [];
}
return $widgets;
}
protected function setWidgetsToUserPreferences($widgets) $this->defineReportWidgets();
{
UserPreference::forUser()->set($this->getUserPreferencesKey(), $widgets);
}
protected function saveWidgetProperties($alias, $properties)
{
$widgets = $this->getWidgetsFromUserPreferences();
if (isset($widgets[$alias])) {
$widgets[$alias]['configuration'] = $properties;
$this->setWidgetsToUserPreferences($widgets);
}
} }
protected function removeWidget($alias) protected function removeWidget($alias)
{ {
if (!$this->canAddAndDelete) {
throw new ApplicationException('Access denied.');
}
$widgets = $this->getWidgetsFromUserPreferences(); $widgets = $this->getWidgetsFromUserPreferences();
if (isset($widgets[$alias])) { if (isset($widgets[$alias])) {
@ -436,8 +448,52 @@ class ReportContainer extends WidgetBase
return json_encode($result); return json_encode($result);
} }
//
// User and system value storage
//
protected function getWidgetsFromUserPreferences()
{
$defaultWidgets = SystemParameters::get($this->getSystemParametersKey(), $this->defaultWidgets);
$widgets = UserPreference::forUser()
->get($this->getUserPreferencesKey(), $defaultWidgets);
if (!is_array($widgets)) {
return [];
}
return $widgets;
}
protected function setWidgetsToUserPreferences($widgets)
{
UserPreference::forUser()->set($this->getUserPreferencesKey(), $widgets);
}
protected function resetWidgetsUserPreferences()
{
UserPreference::forUser()->reset($this->getUserPreferencesKey());
}
protected function saveWidgetProperties($alias, $properties)
{
$widgets = $this->getWidgetsFromUserPreferences();
if (isset($widgets[$alias])) {
$widgets[$alias]['configuration'] = $properties;
$this->setWidgetsToUserPreferences($widgets);
}
}
protected function getUserPreferencesKey() protected function getUserPreferencesKey()
{ {
return 'backend::reportwidgets.'.$this->context; return 'backend::reportwidgets.'.$this->context;
} }
protected function getSystemParametersKey()
{
return 'backend::reportwidgets.default.'.$this->context;
}
} }

View File

@ -1,6 +1,3 @@
.report-container {
/**** Isotope CSS3 transitions ****/
}
.report-container > ul { .report-container > ul {
list-style: none; list-style: none;
padding: 0; padding: 0;
@ -142,25 +139,31 @@
right: 30px; right: 30px;
} }
.report-container > ul.wrapped .item { .report-container > ul.wrapped .item {
width: 100%!important; width: 100% !important;
} }
.report-container .add-widget { .report-container .manage-widgets {
display: inline-block; display: inline-block;
color: #bcc3c7; color: #bcc3c7;
padding: 10px 15px; padding: 10px 15px;
font-size: 14px; font-size: 14px;
font-weight: 400; font-weight: 400;
border: 1px dashed #bcc3c7; border: 1px dashed #bcc3c7;
-webkit-border-radius: 2px; -webkit-border-radius: 3px;
-moz-border-radius: 2px; -moz-border-radius: 3px;
border-radius: 2px; border-radius: 3px;
margin-left: 5px; margin-left: 5px;
margin-bottom: 15px; margin-bottom: 15px;
} }
.report-container .add-widget i { .report-container .manage-widgets i {
margin-right: 5px; margin-right: 5px;
} }
.report-container .add-widget:hover { .report-container .manage-widgets:hover {
text-decoration: none;
background-color: #0181b9;
color: white;
border: 1px solid #0181b9;
}
.report-container .dropdown.open .manage-widgets {
text-decoration: none; text-decoration: none;
background-color: #0181b9; background-color: #0181b9;
color: white; color: white;

View File

@ -92,15 +92,20 @@
}) })
}) })
$(window).on('oc.report-widget-added', function(){ $(window).on('oc.reportWidgetAdded', function(){
self.redraw() self.redraw()
self.setSortOrders() self.setSortOrders()
}) })
$(window).on('oc.reportWidgetRefresh', function(){
self.redraw()
})
window.setTimeout(function(){ window.setTimeout(function(){
self.updateWidth() self.updateWidth()
self.redraw() self.redraw()
}, 200) }, 200)
this.setSortOrders() this.setSortOrders()
} }

View File

@ -122,7 +122,7 @@
} }
&.separator { &.separator {
width: 100%!important; width: 100% !important;
} }
} }
@ -132,12 +132,12 @@
&.wrapped { &.wrapped {
.item { .item {
width: 100%!important; width: 100% !important;
} }
} }
} }
.add-widget { .manage-widgets {
display: inline-block; display: inline-block;
color: #bcc3c7; color: #bcc3c7;
padding: 10px 15px; padding: 10px 15px;
@ -160,7 +160,16 @@
} }
} }
/**** Isotope CSS3 transitions ****/ .dropdown.open .manage-widgets {
text-decoration: none;
background-color: @link-color;
color: white;
border: 1px solid @link-color;
}
//
// Isotope CSS3 transitions
//
&.isotope, &.isotope,
&.isotope .isotope-item { &.isotope .isotope-item {

View File

@ -1,26 +1,14 @@
<div class="report-container"> <div class="report-container">
<input type="hidden" value="<?= $this->alias ?>" data-container-alias />
<ul <ul
id="<?= $this->getId('container-list') ?>" id="<?= $this->getId('container-list') ?>"
class="<?= $this->canAddAndDelete ? 'add-delete' : null ?>" class="<?= $this->canAddAndDelete ? 'add-delete' : null ?>"
data-control="report-container"> data-control="report-container">
<?= $this->makePartial('widget_list') ?>
<?php foreach ($widgets as $widgetAlias=>$widgetInfo): ?>
<?= $this->makePartial('widget', [
'widgetAlias' => $widgetAlias,
'widget' => $widgetInfo['widget'],
'sortOrder' => $widgetInfo['sortOrder']
]) ?>
<?php endforeach ?>
</ul> </ul>
<input type="hidden" value="<?= $this->alias ?>" data-container-alias />
<?php if ($this->canAddAndDelete): ?> <?php if ($this->canAddAndDelete): ?>
<a <?= $this->makePartial('widget_toolbar') ?>
href="javascript:;"
class="add-widget"
data-control="popup"
data-handler="<?= $this->getEventHandler('onLoadAddPopup') ?>">
<i class="icon-plus"></i> <?= e(trans('backend::lang.dashboard.add_widget')) ?>
</a>
<?php endif ?> <?php endif ?>
</div> </div>

View File

@ -1,6 +1,6 @@
<?= Form::open([ <?= Form::open([
'data-request' => $this->getEventHandler('onAddWidget'), 'data-request' => $this->getEventHandler('onAddWidget'),
'data-request-success' => "\$(this).trigger('close.oc.popup'); \$(window).trigger('oc.report-widget-added')", 'data-request-success' => "\$(this).trigger('close.oc.popup'); \$(window).trigger('oc.reportWidgetAdded')",
'data-popup-load-indicator' => 1 'data-popup-load-indicator' => 1
]) ?> ]) ?>
<div class="modal-header"> <div class="modal-header">

View File

@ -0,0 +1,7 @@
<?php foreach ($widgets as $widgetAlias => $widgetInfo): ?>
<?= $this->makePartial('widget', [
'widgetAlias' => $widgetAlias,
'widget' => $widgetInfo['widget'],
'sortOrder' => $widgetInfo['sortOrder']
]) ?>
<?php endforeach ?>

View File

@ -0,0 +1,46 @@
<div class="dropdown dropup">
<a
href="javascript:;"
class="manage-widgets"
data-toggle="dropdown">
<i class="icon-cogs"></i> <?= e(trans('backend::lang.dashboard.manage_widgets')) ?>
</a>
<ul class="dropdown-menu" role="menu" data-dropdown-title="Manage dashboard">
<li role="presentation">
<a
role="menuitem"
href="javascript:;"
data-control="popup"
data-handler="<?= $this->getEventHandler('onLoadAddPopup') ?>"
class="oc-icon-plus"
tabindex="-1">
<?= e(trans('backend::lang.dashboard.add_widget')) ?>
</a>
</li>
<li role="separator" class="divider"></li>
<li role="presentation">
<a
role="menuitem"
href="javascript:;"
class="oc-icon-floppy-o"
data-request="<?= $this->getEventHandler('onMakeLayoutDefault') ?>"
data-request-confirm="<?= e(trans('backend::lang.dashboard.make_default_confirm')) ?>"
tabindex="-1">
<?= e(trans('backend::lang.dashboard.make_default')) ?>
</a>
</li>
<li role="presentation">
<a
role="menuitem"
href="javascript:;"
data-request-success="$(window).trigger('oc.reportWidgetRefresh')"
data-request="<?= $this->getEventHandler('onResetWidgets') ?>"
data-request-confirm="<?= e(trans('backend::lang.dashboard.reset_layout_confirm')) ?>"
class="oc-icon-repeat"
tabindex="-1">
<?= e(trans('backend::lang.dashboard.reset_layout')) ?>
</a>
</li>
</ul>
</div>

View File

@ -33,6 +33,7 @@ class ServiceProvider extends ModuleServiceProvider
*/ */
if (App::runningInBackend()) { if (App::runningInBackend()) {
$this->registerBackendNavigation(); $this->registerBackendNavigation();
$this->registerBackendReportWidgets();
$this->registerBackendPermissions(); $this->registerBackendPermissions();
$this->registerBackendWidgets(); $this->registerBackendWidgets();
$this->registerBackendSettings(); $this->registerBackendSettings();
@ -153,6 +154,19 @@ class ServiceProvider extends ModuleServiceProvider
}); });
} }
/*
* Register report widgets
*/
protected function registerBackendReportWidgets()
{
WidgetManager::instance()->registerReportWidgets(function ($manager) {
$manager->registerReportWidget('Cms\ReportWidgets\ActiveTheme', [
'label' => 'cms::lang.dashboard.active_theme.widget_title_default',
'context' => 'dashboard'
]);
});
}
/* /*
* Register permissions * Register permissions
*/ */

View File

@ -337,7 +337,6 @@ class ServiceProvider extends ModuleServiceProvider
'context' => 'dashboard' 'context' => 'dashboard'
]); ]);
}); });
} }
/* /*

View File

@ -88,6 +88,24 @@ class Parameters extends Model
return true; return true;
} }
/**
* Resets a setting value by deleting the record.
* @param string $key Specifies the setting key value.
* @return bool
*/
public function reset($key)
{
$record = static::findRecord($key);
if (!$record) {
return false;
}
$record->delete();
unset(static::$cache[$key]);
return true;
}
/** /**
* Returns a record (cached) * Returns a record (cached)
* @return self * @return self