diff --git a/modules/backend/ServiceProvider.php b/modules/backend/ServiceProvider.php index 7a35b9195..1e4a99a8a 100644 --- a/modules/backend/ServiceProvider.php +++ b/modules/backend/ServiceProvider.php @@ -29,6 +29,7 @@ class ServiceProvider extends ModuleServiceProvider */ if (App::runningInBackend()) { $this->registerBackendNavigation(); + $this->registerBackendReportWidgets(); $this->registerBackendWidgets(); $this->registerBackendPermissions(); $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 */ diff --git a/modules/backend/lang/en/lang.php b/modules/backend/lang/en/lang.php index b30e3830e..f8a3ac5c0 100644 --- a/modules/backend/lang/en/lang.php +++ b/modules/backend/lang/en/lang.php @@ -54,6 +54,7 @@ return [ 'widget_label' => 'Widget', 'widget_width' => 'Width', 'full_width' => 'full width', + 'manage_widgets' => 'Manage widgets', 'add_widget' => 'Add widget', 'widget_inspector_title' => 'Widget configuration', 'widget_inspector_description' => 'Configure the report widget', @@ -65,6 +66,12 @@ return [ 'widget_new_row_description' => 'Put the widget in a new row.', 'widget_title_label' => 'Widget title', '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' => [ 'widget_title_default' => 'System status', 'update_available' => '{0} updates available!|{1} update available!|[2,Inf] updates available!', @@ -89,7 +96,6 @@ return [ 'nice_message' => 'Have a great day!', ] ], - 'user' => [ 'name' => 'Administrator', 'menu_label' => 'Administrators', diff --git a/modules/backend/widgets/ReportContainer.php b/modules/backend/widgets/ReportContainer.php index a671f4571..dc02d47bc 100644 --- a/modules/backend/widgets/ReportContainer.php +++ b/modules/backend/widgets/ReportContainer.php @@ -2,10 +2,12 @@ use File; use Lang; +use Flash; use Request; use Backend\Classes\WidgetBase; use Backend\Classes\WidgetManager; use Backend\Models\UserPreference; +use System\Models\Parameters as SystemParameters; use ApplicationException; /** @@ -130,6 +132,26 @@ class ReportContainer extends WidgetBase // 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() { $alias = Request::input('alias'); @@ -196,6 +218,10 @@ class ReportContainer extends WidgetBase public function addWidget($widget, $size) { + if (!$this->canAddAndDelete) { + throw new ApplicationException('Access denied.'); + } + $widgets = $this->getWidgetsFromUserPreferences(); $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']]; } - protected function getWidgetsFromUserPreferences() + protected function resetWidgets() { - $widgets = UserPreference::forUser() - ->get($this->getUserPreferencesKey(), $this->defaultWidgets); + $this->resetWidgetsUserPreferences(); - if (!is_array($widgets)) { - return []; - } - return $widgets; - } + $this->reportsDefined = false; - protected function setWidgetsToUserPreferences($widgets) - { - 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); - } + $this->defineReportWidgets(); } protected function removeWidget($alias) { + if (!$this->canAddAndDelete) { + throw new ApplicationException('Access denied.'); + } + $widgets = $this->getWidgetsFromUserPreferences(); if (isset($widgets[$alias])) { @@ -436,8 +448,52 @@ class ReportContainer extends WidgetBase 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() { return 'backend::reportwidgets.'.$this->context; } + + protected function getSystemParametersKey() + { + return 'backend::reportwidgets.default.'.$this->context; + } } diff --git a/modules/backend/widgets/reportcontainer/assets/css/reportcontainer.css b/modules/backend/widgets/reportcontainer/assets/css/reportcontainer.css index 9a524c5b9..a1e1c9bb6 100644 --- a/modules/backend/widgets/reportcontainer/assets/css/reportcontainer.css +++ b/modules/backend/widgets/reportcontainer/assets/css/reportcontainer.css @@ -1,6 +1,3 @@ -.report-container { - /**** Isotope CSS3 transitions ****/ -} .report-container > ul { list-style: none; padding: 0; @@ -142,25 +139,31 @@ right: 30px; } .report-container > ul.wrapped .item { - width: 100%!important; + width: 100% !important; } -.report-container .add-widget { +.report-container .manage-widgets { display: inline-block; color: #bcc3c7; padding: 10px 15px; font-size: 14px; font-weight: 400; border: 1px dashed #bcc3c7; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; margin-left: 5px; margin-bottom: 15px; } -.report-container .add-widget i { +.report-container .manage-widgets i { 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; background-color: #0181b9; color: white; diff --git a/modules/backend/widgets/reportcontainer/assets/js/reportcontainer.js b/modules/backend/widgets/reportcontainer/assets/js/reportcontainer.js index 9f32e7616..ad08f9a7b 100644 --- a/modules/backend/widgets/reportcontainer/assets/js/reportcontainer.js +++ b/modules/backend/widgets/reportcontainer/assets/js/reportcontainer.js @@ -92,15 +92,20 @@ }) }) - $(window).on('oc.report-widget-added', function(){ + $(window).on('oc.reportWidgetAdded', function(){ self.redraw() self.setSortOrders() }) + $(window).on('oc.reportWidgetRefresh', function(){ + self.redraw() + }) + window.setTimeout(function(){ self.updateWidth() self.redraw() }, 200) + this.setSortOrders() } diff --git a/modules/backend/widgets/reportcontainer/assets/less/reportcontainer.less b/modules/backend/widgets/reportcontainer/assets/less/reportcontainer.less index 348d32f49..57da0595f 100644 --- a/modules/backend/widgets/reportcontainer/assets/less/reportcontainer.less +++ b/modules/backend/widgets/reportcontainer/assets/less/reportcontainer.less @@ -122,7 +122,7 @@ } &.separator { - width: 100%!important; + width: 100% !important; } } @@ -132,12 +132,12 @@ &.wrapped { .item { - width: 100%!important; + width: 100% !important; } } } - .add-widget { + .manage-widgets { display: inline-block; color: #bcc3c7; 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-item { diff --git a/modules/backend/widgets/reportcontainer/partials/_container.htm b/modules/backend/widgets/reportcontainer/partials/_container.htm index 53291193c..4e67b37cf 100644 --- a/modules/backend/widgets/reportcontainer/partials/_container.htm +++ b/modules/backend/widgets/reportcontainer/partials/_container.htm @@ -1,26 +1,14 @@