diff --git a/app/Http/Controllers/Form/CopyDashboardController.inc.php b/app/Http/Controllers/Form/CopyDashboardController.inc.php new file mode 100644 index 0000000000..a4602f711a --- /dev/null +++ b/app/Http/Controllers/Form/CopyDashboardController.inc.php @@ -0,0 +1,81 @@ +. + * + * @link http://librenms.org + * @copyright 2020 Thomas Berberich + * @author Thomas Berberich + */ + +namespace App\Http\Controllers\Form; + +use App\Http\Controllers\Controller; +use App\Models\Dashboard; +use App\Models\UserWidget; +use Auth; +use Illuminate\Http\Request; + +class CopyDashboardController extends Controller +{ + public function store(Request $request) + { + $target_user_id = $request->get('target_user_id'); + $dashboard_id = $request->get('dashboard_id'); + + $dashboard = Dashboard::where(['dashboard_id' => $dashboard_id, 'user_id' => Auth::id()])->first(); + + $success = true; + + if ((empty($dashboard)) || (empty($target_user_id))) { + $success = false; + } + + if ($success) { + $dashboard_copy = $dashboard->replicate()->fill([ + 'user_id' => $target_user_id, + 'dashboard_name' => $dashboard['dashboard_name'] .= '_' . Auth::user()->username, + ]); + $success = $dashboard_copy->save(); + } + + if ($success) { + $widgets = UserWidget::where(['dashboard_id' => $dashboard_id, 'user_id' => Auth::id()])->get(); + + foreach ($widgets as $widget) { + $widget_copy = $widget->replicate()->fill([ + 'user_id' => $target_user_id, + 'dashboard_id' => $dashboard_copy->dashboard_id, + ]); + $success &= $widget_copy->save(); + } + } + + if ($success) { + $status = 'ok'; + $message = 'Dashboard copied'; + } else { + $status = 'error'; + $message = 'ERROR: Could not copy Dashboard'; + } + + return response()->json([ + 'status' => $status, + 'message' => $message, + ]); + } +} diff --git a/app/Http/Controllers/OverviewController.php b/app/Http/Controllers/OverviewController.php index c3d775b266..e0771aaeb3 100644 --- a/app/Http/Controllers/OverviewController.php +++ b/app/Http/Controllers/OverviewController.php @@ -8,6 +8,7 @@ use App\Models\Device; use App\Models\Port; use App\Models\Service; use App\Models\Syslog; +use App\Models\User; use App\Models\UserPref; use App\Models\Widget; use Auth; @@ -105,7 +106,15 @@ class OverviewController extends Controller $hide_dashboard_editor = UserPref::getPref($user, 'hide_dashboard_editor'); $widgets = Widget::select('widget_id', 'widget_title')->orderBy('widget_title')->get(); - return view('overview.default', compact('bare', 'dash_config', 'dashboard', 'hide_dashboard_editor', 'user_dashboards', 'shared_dashboards', 'widgets')); + $user_list = []; + if ($user->can('manage', User::class)) { + $user_list = User::select(['username', 'user_id']) + ->where('user_id', '!=', $user->user_id) + ->orderBy('username') + ->get(); + } + + return view('overview.default', compact('bare', 'dash_config', 'dashboard', 'hide_dashboard_editor', 'user_dashboards', 'shared_dashboards', 'widgets', 'user_list')); } public function simple(Request $request) diff --git a/resources/views/overview/default.blade.php b/resources/views/overview/default.blade.php index 3cdf6ac9e0..66ed3ab3e6 100644 --- a/resources/views/overview/default.blade.php +++ b/resources/views/overview/default.blade.php @@ -94,6 +94,19 @@ + @if (count($user_list) and auth()->user()->isAdmin()) +
+
+ +
+ +
+ @endif @@ -473,6 +486,49 @@ }); } +@if (auth()->user()->isAdmin()) + function dashboard_copy_user_select() { + var button_disabled = true; + if (document.getElementById("dashboard_copy_target").value > 0) { + button_disabled = false; + } + $("#do_copy_dashboard").prop('disabled', button_disabled); + } + + function dashboard_copy(data) { + var target_user_id = document.getElementById("dashboard_copy_target").value; + var dashboard_id = {{ $dashboard->dashboard_id }}; + var username = $("#dashboard_copy_target option:selected").text().trim(); + + if (target_user_id == -1) { + toastr.warning('No target selected to copy Dashboard to'); + } else { + if (! confirm("Do you really want to copy this Dashboard to User '" + username + "'?")) { + return; + } + + $.ajax({ + type: 'POST', + url: '{{ url('/ajax/form/copy-dashboard') }}', + data: {target_user_id: target_user_id, dashboard_id: dashboard_id}, + dataType: "json", + success: function (data) { + if( data.status == "ok" ) { + toastr.success(data.message); + } else { + toastr.error(data.message); + } + }, + error: function(data) { + toastr.error(data.message); + } + }); + $("#dashboard_copy_target option:eq(-1)").prop('selected', true); + dashboard_copy_user_select(); + } + } +@endif + function widget_dom(data) { dom = '
  • '+ '
    '+data.title+ @@ -610,6 +666,5 @@ $('#dashboard_name').val('Default'); dashboard_add($('#add_form')); @endif - @endpush diff --git a/routes/web.php b/routes/web.php index d6bdf25618..607214566c 100644 --- a/routes/web.php +++ b/routes/web.php @@ -90,6 +90,7 @@ Route::group(['middleware' => ['auth'], 'guard' => 'auth'], function () { // form ajax handlers, perhaps should just be page controllers Route::group(['prefix' => 'form', 'namespace' => 'Form'], function () { Route::resource('widget-settings', 'WidgetSettingsController'); + Route::post('copy-dashboard', 'CopyDashboardController@store'); }); // js select2 data controllers