Skip to content

Commit 897b323

Browse files
authored
Edit static device groups from device (librenms#18240)
1 parent 5db1364 commit 897b323

File tree

4 files changed

+34
-12
lines changed

4 files changed

+34
-12
lines changed

app/Http/Controllers/Device/EditDeviceController.php

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
use App\Facades\Rrd;
3131
use App\Http\Requests\UpdateDeviceRequest;
3232
use App\Models\Device;
33+
use App\Models\DeviceGroup;
3334
use App\Models\PollerGroup;
3435
use Illuminate\Contracts\View\View;
3536
use Illuminate\Http\RedirectResponse;
@@ -65,12 +66,17 @@ public function index(Device $device): View
6566
});
6667
$exclusive_schedule_id = $exclusiveSchedules->count() === 1 ? $exclusiveSchedules->first()->schedule_id : 0;
6768

69+
[$static_show, $static_groups] = DeviceGroup::where('type', 'static')->exists()
70+
? [true, $device->groups()->where('type', 'static')->pluck('name', 'id')]
71+
: [false, []];
72+
6873
return view('device.edit.device', [
6974
'device' => $device,
75+
'show_static_groups' => $static_show,
76+
'static_groups' => $static_groups,
7077
'types' => $types,
7178
'default_type' => LibrenmsConfig::getOsSetting($device->os, 'type'),
72-
'parents' => $device->parents()->pluck('device_id'),
73-
'devices' => Device::orderBy('hostname')->whereNot('device_id', $device->device_id)->select(['device_id', 'hostname', 'sysName'])->get(),
79+
'parents' => $device->parents()->pluck('hostname', 'device_id'),
7480
'poller_groups' => PollerGroup::orderBy('group_name')->pluck('group_name', 'id'),
7581
'default_poller_group' => LibrenmsConfig::get('distributed_poller_group'),
7682
'override_sysContact_bool' => $device->getAttrib('override_sysContact_bool'),
@@ -89,6 +95,10 @@ public function update(UpdateDeviceRequest $request, Device $device): RedirectRe
8995

9096
$device->parents()->sync($request->get('parent_id', [])); // TODO avoid loops!
9197

98+
// sync groups without removing dynamic groups
99+
$dynamic_groups = $device->groups()->where('type', 'dynamic')->pluck('id')->toArray();
100+
$device->groups()->sync(array_merge($dynamic_groups, $request->get('static_groups', [])));
101+
92102
// handle sysLocation update
93103
if ($device->override_sysLocation) {
94104
$device->setLocation($request->get('sysLocation'), true, true);

app/Http/Controllers/Select/DeviceController.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ protected function rules()
3838
'access' => 'nullable|in:normal,inverted',
3939
'user' => 'nullable|int',
4040
'id' => 'nullable|in:device_id,hostname',
41+
'exclude' => 'nullable|int',
4142
];
4243
}
4344

@@ -54,7 +55,7 @@ protected function baseQuery($request)
5455
// list devices the user does not have access to
5556
if ($request->get('access') == 'inverted' && $user_id && $request->user()->isAdmin()) {
5657
return Device::query()
57-
->select('device_id', 'hostname', 'sysName', 'display', 'icon')
58+
->select(['device_id', 'hostname', 'sysName', 'display', 'icon'])
5859
->whereNotIn('device_id', function ($query) use ($user_id) {
5960
$query->select('device_id')
6061
->from('devices_perms')
@@ -64,7 +65,8 @@ protected function baseQuery($request)
6465
}
6566

6667
return Device::hasAccess($request->user())
67-
->select('device_id', 'hostname', 'sysName', 'display', 'icon')
68+
->when($request->get('exclude'), fn ($query, $exclude) => $query->where('device_id', '!=', $exclude))
69+
->select(['device_id', 'hostname', 'sysName', 'display', 'icon'])
6870
->orderBy('hostname');
6971
}
7072

lang/en/device.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434

3535
'description' => 'Description',
3636
'type' => 'Type',
37+
'static_groups' => 'Static Groups',
3738

3839
'override_sysLocation' => 'Override sysLocation',
3940
'coordinates_title' => 'To set coordinates, include [latitude,longitude]',

resources/views/device/edit/device.blade.php

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,19 @@ class="btn btn-primary" name="rediscover" title="{{ __('device.edit.rediscover_t
7979
</div>
8080
</div>
8181

82+
@if($show_static_groups)
83+
<div class="form-group">
84+
<label for="static_groups" class="col-sm-2 control-label">{{ __('device.edit.static_groups') }}</label>
85+
<div class="col-sm-6">
86+
<select id="static_groups" name="static_groups[]" class="form-control" multiple style="width: 100%">
87+
@foreach($static_groups as $group_id => $group_name)
88+
<option value="{{ $group_id }}" selected>{{ $group_name }}</option>
89+
@endforeach
90+
</select>
91+
</div>
92+
</div>
93+
@endif
94+
8295
<div class="form-group">
8396
<label for="sysLocation" class="col-sm-2 control-label">{{ __('device.edit.override_sysLocation') }}</label>
8497
<div class="col-sm-6">
@@ -123,11 +136,8 @@ class="btn btn-primary" name="rediscover" title="{{ __('device.edit.rediscover_t
123136
<label for="parent_id" class="col-sm-2 control-label">{{ __('device.edit.depends_on') }}</label>
124137
<div class="col-sm-6">
125138
<select multiple name="parent_id[]" id="parent_id" class="form-control" style="width: 100%">
126-
<option value="0" {{ empty($parents) ? 'selected' : '' }}>{{ __('device.edit.none') }}</option>
127-
@foreach ($devices as $dev)
128-
<option value="{{ $dev->device_id }}" {{ $parents->contains($dev->device_id) ? 'selected' : '' }}>
129-
{{ $dev->hostname }} ({{ $dev->sysName }})
130-
</option>
139+
@foreach ($parents as $parent_id => $parent_hostname)
140+
<option value="{{ $parent_id }}" selected>{{ $parent_hostname }}</option>
131141
@endforeach
132142
</select>
133143
</div>
@@ -220,6 +230,8 @@ class="btn btn-primary" name="rediscover" title="{{ __('device.edit.rediscover_t
220230

221231
@push('scripts')
222232
<script>
233+
init_select2('#parent_id', 'device', {exclude: {{ $device->device_id }}}, null, '{{ __('device.edit.none') }}');
234+
init_select2('#static_groups', 'device-group', {type: 'static'}, null, '{{ __('device.edit.none') }}');
223235
const defaultType = '{{ $default_type }}';
224236
function templateTypeSelection(option) {
225237
if (!option.id) { // placeholder
@@ -281,9 +293,6 @@ class: `fa-solid fa-${iconClass} fa-fw fa-lg`
281293
function toggleHostnameEdit() {
282294
document.getElementById('edit-hostname-input').disabled = ! document.getElementById('edit-hostname-input').disabled;
283295
}
284-
$('#parent_id').select2({
285-
width: 'resolve'
286-
});
287296
</script>
288297
@vuei18n
289298
@endpush

0 commit comments

Comments
 (0)