Even more widget fixes/improvements (#9561)

* Device Summary: don't count deleted ports

* General: prevent widget refresh while in settings (synchronize "show_settings" between frontend and backend)

* General: reduce reload flicker by delaying clearing of old content until the backend is complete.

* Port Select: exclude deleted and orphaned ports
This commit is contained in:
Tony Murray
2018-12-18 02:02:18 -06:00
committed by Neil Lathwood
parent 5d20686d34
commit ce9790539f
4 changed files with 38 additions and 17 deletions

View File

@@ -62,6 +62,8 @@ class PortController extends SelectController
{ {
/** @var \Illuminate\Database\Eloquent\Builder $query */ /** @var \Illuminate\Database\Eloquent\Builder $query */
$query = Port::hasAccess($request->user()) $query = Port::hasAccess($request->user())
->isNotDeleted()
->has('device')
->with(['device' => function ($query) { ->with(['device' => function ($query) {
$query->select('device_id', 'hostname', 'sysName'); $query->select('device_id', 'hostname', 'sysName');
}]) }])

View File

@@ -65,12 +65,12 @@ abstract class DeviceSummaryController extends WidgetController
]; ];
$data['ports'] = [ $data['ports'] = [
'count' => Port::hasAccess($user)->count(), 'count' => Port::hasAccess($user)->isNotDeleted()->count(),
'up' => Port::hasAccess($user)->isUp()->count(), 'up' => Port::hasAccess($user)->isNotDeleted()->isUp()->count(),
'down' => Port::hasAccess($user)->isDown()->count(), 'down' => Port::hasAccess($user)->isNotDeleted()->isDown()->count(),
'ignored' => Port::hasAccess($user)->isIgnored()->count(), 'ignored' => Port::hasAccess($user)->isNotDeleted()->isIgnored()->count(),
'shutdown' => Port::hasAccess($user)->isShutdown()->count(), 'shutdown' => Port::hasAccess($user)->isNotDeleted()->isShutdown()->count(),
'errored' => $data['summary_errors'] ? Port::hasAccess($user)->hasErrors()->count() : -1, 'errored' => $data['summary_errors'] ? Port::hasAccess($user)->isNotDeleted()->hasErrors()->count() : -1,
]; ];
if ($data['show_services']) { if ($data['show_services']) {

View File

@@ -93,12 +93,28 @@ abstract class WidgetController extends Controller
return $this->settings; return $this->settings;
} }
/**
* @param View|string $view
* @param string $title
* @param array $settings
* @param string $status
* @return \Illuminate\Http\JsonResponse
*/
private function formatResponse($view, $title, $settings, $status = 'ok') private function formatResponse($view, $title, $settings, $status = 'ok')
{ {
if ($view instanceof View) {
$html = $view->__toString();
$show_settings = (int)starts_with($view->getName(), 'widgets.settings.');
} else {
$html = (string)$view;
$show_settings = (int)$this->show_settings;
}
return response()->json([ return response()->json([
'status' => $status, 'status' => $status,
'title' => __($title), 'title' => __($title),
'html' => is_string($view) ? $view : $view->__toString(), 'html' => $html,
'show_settings' => $show_settings,
'settings' => $settings, 'settings' => $settings,
]); ]);
} }

View File

@@ -634,8 +634,8 @@ if (empty($vars['bare']) || $vars['bare'] == "no") {
function widget_reload(id,data_type) { function widget_reload(id,data_type) {
$("#widget_body_"+id+" .bootgrid-table").bootgrid("destroy"); $("#widget_body_"+id+" .bootgrid-table").bootgrid("destroy");
$("#widget_body_"+id+" *").off(); $("#widget_body_"+id+" *").off();
$("#widget_body_"+id).empty(); var $widget_body = $("#widget_body_"+id);
if( $("#widget_body_"+id).parent().data('settings') == 1 ) { if ($widget_body.parent().data('settings') == 1 ) {
settings = 1; settings = 1;
} else { } else {
settings = 0; settings = 0;
@@ -645,24 +645,27 @@ if (empty($vars['bare']) || $vars['bare'] == "no") {
url: 'ajax/dash/' + data_type, url: 'ajax/dash/' + data_type,
data: { data: {
id: id, id: id,
dimensions: {x:$("#widget_body_"+id).width(), y:$("#widget_body_"+id).height()}, dimensions: {x:$widget_body.width(), y:$widget_body.height()},
settings:settings settings:settings
}, },
dataType: "json", dataType: "json",
success: function (data) { success: function (data) {
if (data.status == 'ok') { var $widget_body = $("#widget_body_"+id);
$widget_body.empty();
if (data.status === 'ok') {
$("#widget_title_"+id).html(data.title); $("#widget_title_"+id).html(data.title);
$("#widget_body_"+id).html(data.html); $widget_body.html(data.html).parent().data('settings', data.show_settings);
} } else {
else { $widget_body.html('<div class="alert alert-info">' + data.message + '</div>');
$("#widget_body_"+id).html('<div class="alert alert-info">' + data.message + '</div>');
} }
}, },
error: function (data) { error: function (data) {
var $widget_body = $("#widget_body_"+id);
$widget_body.empty();
if (data.responseJSON.error) { if (data.responseJSON.error) {
$("#widget_body_"+id).html('<div class="alert alert-info">' + data.responseJSON.error + '</div>'); $widget_body.html('<div class="alert alert-info">' + data.responseJSON.error + '</div>');
} else { } else {
$("#widget_body_"+id).html('<div class="alert alert-info"><?php echo __('Problem with backend'); ?></div>'); $widget_body.html('<div class="alert alert-info"><?php echo __('Problem with backend'); ?></div>');
} }
} }
}); });