Skip to content

Commit 9f6a73b

Browse files
authored
Merge pull request #18170 from grokability/fix-for-groups
Fixed #18157 - only partial information stored on group save if lower `max_input_vars` and/or `max_multipart_body_parts`
2 parents dea3993 + 4d38bd1 commit 9f6a73b

File tree

10 files changed

+257
-66
lines changed

10 files changed

+257
-66
lines changed

app/Http/Controllers/Api/GroupsController.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public function index(Request $request) : JsonResponse | array
2424

2525
$this->authorize('view', Group::class);
2626

27-
$groups = Group::select('id', 'name', 'permissions', 'notes', 'created_at', 'updated_at', 'created_by')->with('adminuser')->withCount('users as users_count');
27+
$groups = Group::select(['id', 'name', 'permissions', 'notes', 'created_at', 'updated_at', 'created_by'])->with('adminuser')->withCount('users as users_count');
2828

2929
if ($request->filled('search')) {
3030
$groups = $groups->TextSearch($request->input('search'));
@@ -50,6 +50,7 @@ public function index(Request $request) : JsonResponse | array
5050
'id',
5151
'name',
5252
'created_at',
53+
'updated_at',
5354
'users_count',
5455
];
5556

app/Http/Controllers/GroupsController.php

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,12 @@ public function create(Request $request) : View
4343
$permissions = config('permissions');
4444
$groupPermissions = Helper::selectedPermissionsArray($permissions, $permissions);
4545
$selectedPermissions = $request->old('permissions', $groupPermissions);
46-
46+
$users = \App\Models\User::orderBy('first_name', 'asc')->orderBy('last_name', 'asc')->get();
4747
// Show the page
48-
return view('groups/edit', compact('permissions', 'selectedPermissions', 'groupPermissions'))->with('group', $group);
48+
return view('groups/edit', compact('permissions', 'selectedPermissions', 'groupPermissions'))
49+
->with('group', $group)
50+
->with('associated_users', [])
51+
->with('unselected_users', $users);
4952
}
5053

5154
/**
@@ -60,12 +63,23 @@ public function store(Request $request) : RedirectResponse
6063
// create a new group instance
6164
$group = new Group();
6265
$group->name = $request->input('name');
66+
67+
if ($request->filled('permission')) {
68+
$group->permissions = json_encode($request->array('permission'));
69+
} else {
70+
$group->permissions = null;
71+
}
72+
6373
$group->permissions = json_encode($request->input('permission'));
6474
$group->created_by = auth()->id();
6575
$group->notes = $request->input('notes');
6676

6777
if ($group->save()) {
68-
$group->users()->sync($request->input('associated_users'));
78+
79+
if ($request->filled('users_to_sync')) {
80+
$associated_users = explode(',',$request->input('users_to_sync'));
81+
$group->users()->sync($associated_users);
82+
}
6983
return redirect()->route('groups.index')->with('success', trans('admin/groups/message.success.create'));
7084
}
7185

@@ -89,10 +103,12 @@ public function edit(Group $group) : View | RedirectResponse
89103
$groupPermissions = [];
90104
}
91105
$selected_array = Helper::selectedPermissionsArray($permissions, $groupPermissions);
92-
$associated_users = $group->users()->get();
106+
$associated_users = $group->users()->orderBy('first_name', 'asc')->orderBy('last_name', 'asc')->get();
107+
108+
// Get the unselected users
109+
$unselected_users = \App\Models\User::whereNotIn('id', $associated_users->pluck('id')->toArray())->orderBy('first_name', 'asc')->orderBy('last_name', 'asc')->get();
93110

94-
//dd($associated_users->toArray());
95-
return view('groups.edit', compact('group', 'permissions', 'selected_array', 'groupPermissions'))->with('associated_users', $associated_users);
111+
return view('groups.edit', compact('group', 'permissions', 'selected_array', 'groupPermissions'))->with('associated_users', $associated_users)->with('unselected_users', $unselected_users);
96112
}
97113

98114
/**
@@ -106,13 +122,24 @@ public function edit(Group $group) : View | RedirectResponse
106122
public function update(Request $request, Group $group) : RedirectResponse
107123
{
108124
$group->name = $request->input('name');
109-
$group->permissions = json_encode($request->input('permission'));
125+
126+
if ($request->filled('permission')) {
127+
$group->permissions = json_encode($request->array('permission'));
128+
} else {
129+
$group->permissions = null;
130+
}
131+
110132
$group->notes = $request->input('notes');
111133

112134

113135
if (! config('app.lock_passwords')) {
114136
if ($group->save()) {
115-
$group->users()->sync($request->input('associated_users'));
137+
138+
if ($request->filled('users_to_sync')) {
139+
$associated_users = explode(',',$request->input('users_to_sync'));
140+
$group->users()->sync($associated_users);
141+
}
142+
116143
return redirect()->route('groups.index')->with('success', trans('admin/groups/message.success.update'));
117144
}
118145

database/seeders/UserSeeder.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public function run()
6868
]))
6969
->create();
7070

71-
User::factory()->count(50)->viewAssets()
71+
User::factory()->count(2000)->viewAssets()
7272
->state(new Sequence(fn($sequence) => [
7373
'company_id' => $companyIds->random(),
7474
'department_id' => $departmentIds->random(),

public/js/dist/all.js

Lines changed: 66 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52833,27 +52833,20 @@ $(".remember-toggle").on("click", function () {
5283352833
var toggle_content_class = 'toggle-content-' + $(this).attr('id');
5283452834
var toggle_arrow = '#toggle-arrow-' + toggleable_callout_id;
5283552835
var toggle_cookie_name = 'toggle_state_' + toggleable_callout_id;
52836-
console.log('Callout ID: ' + toggleable_callout_id);
52837-
console.log('Content ID: ' + toggle_content_class);
52838-
console.log('Arrow ID: ' + toggle_arrow);
52839-
console.log('Cookie Name: ' + toggle_cookie_name);
5284052836
$('.' + toggle_content_class).fadeToggle(100);
5284152837
$(toggle_arrow).toggleClass('fa-caret-right fa-caret-down');
5284252838
var toggle_open = $(toggle_arrow).hasClass('fa-caret-down');
52843-
console.log('Cookie will set open state to: ' + toggle_open);
5284452839
document.cookie = toggle_cookie_name + "=" + toggle_open + ';path=/';
5284552840
});
5284652841
var all_cookies = document.cookie.split(';');
5284752842
for (var i in all_cookies) {
5284852843
var trimmed_cookie = all_cookies[i].trim(' ');
52849-
elems = all_cookies[i].split('=', 2);
52844+
elems = trimmed_cookie.split('=', 2);
5285052845

5285152846
// We have to do more here since we don't know the name of the selector
5285252847
if (trimmed_cookie.startsWith('toggle_state_')) {
52853-
console.log(trimmed_cookie + ' matches toggle_state_');
52854-
var toggle_selector_name = elems[0].replace(' toggle_state_', '');
52855-
if (elems[1] == 'true') {
52856-
console.log('Selector name for cookie click trigger: ' + toggle_selector_name);
52848+
var toggle_selector_name = elems[0].replace('toggle_state_', '');
52849+
if (elems[1] != "true") {
5285752850
$('#' + toggle_selector_name + '.remember-toggle').trigger('click');
5285852851
}
5285952852
}
@@ -52902,6 +52895,69 @@ $(".admin").change(function () {
5290252895
}
5290352896
});
5290452897

52898+
// Handle the select/deselect of the select boxes with the button from right to left
52899+
52900+
$(function () {
52901+
function moveItems(origin, dest) {
52902+
$(origin).find(':selected').appendTo(dest);
52903+
$(dest).attr('selected', true);
52904+
$(dest).sort_select_box();
52905+
}
52906+
function moveAllItems(origin, dest) {
52907+
$(origin).children("option:visible").appendTo(dest);
52908+
$(dest).attr('selected', true);
52909+
$(dest).sort_select_box();
52910+
}
52911+
$('.left').on('click', function () {
52912+
var container = $(this).closest('.addremove-multiselect');
52913+
moveItems($(container).find('select.multiselect.selected'), $(container).find('select.multiselect.available'));
52914+
});
52915+
$('.right').on('click', function () {
52916+
var container = $(this).closest('.addremove-multiselect');
52917+
moveItems($(container).find('select.multiselect.available'), $(container).find('select.multiselect.selected'));
52918+
});
52919+
$('.leftall').on('click', function () {
52920+
var container = $(this).closest('.addremove-multiselect');
52921+
moveAllItems($(container).find('select.multiselect.selected'), $(container).find('select.multiselect.available'));
52922+
});
52923+
$('.rightall').on('click', function () {
52924+
var container = $(this).closest('.addremove-multiselect');
52925+
moveAllItems($(container).find('select.multiselect.available'), $(container).find('select.multiselect.selected'));
52926+
});
52927+
$('select.multiselect.selected').on('dblclick keyup', function (e) {
52928+
if (e.which == 13 || e.type == 'dblclick') {
52929+
var container = $(this).closest('.addremove-multiselect');
52930+
moveItems($(container).find('select.multiselect.selected'), $(container).find('select.multiselect.available'));
52931+
}
52932+
});
52933+
$('select.multiselect.available').on('dblclick keyup', function (e) {
52934+
if (e.which == 13 || e.type == 'dblclick') {
52935+
var container = $(this).closest('.addremove-multiselect');
52936+
moveItems($(container).find('select.multiselect.available'), $(container).find('select.multiselect.selected'));
52937+
$('#hidden_ids_box').val($('#selected-select').val());
52938+
}
52939+
});
52940+
});
52941+
$.fn.sort_select_box = function () {
52942+
// Get options from select box
52943+
var selected_options = $(this).children('option');
52944+
// sort alphabetically
52945+
selected_options.sort(function (a, b) {
52946+
if (a.text > b.text) return 1;else if (a.text < b.text) return -1;else return 0;
52947+
});
52948+
//replace with sorted my_options;
52949+
$(this).empty().append(selected_options);
52950+
var selected_in_box = $('#selected-select option').toArray().map(function (item) {
52951+
return item.value;
52952+
}).join();
52953+
$('#hidden_ids_box').empty().val(selected_in_box);
52954+
$('#count_selected_box').html($('#selected-select option').length);
52955+
$('#count_unselected_box').html($('#available-select option').length);
52956+
52957+
// clearing any selections
52958+
$("#" + this.attr('id') + " option").attr('selected', true);
52959+
};
52960+
5290552961
/***/ }),
5290652962

5290752963
/***/ "./resources/assets/js/snipeit_modals.js":

public/js/dist/all.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

public/mix-manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"/js/dist/all.js": "/js/dist/all.js?id=e78128438f0b07a393dc7947ef453b5f",
2+
"/js/dist/all.js": "/js/dist/all.js?id=525664c0ec56444ba1c48c125346918a",
33
"/css/dist/skins/skin-black-dark.css": "/css/dist/skins/skin-black-dark.css?id=42f97cd5b9ee7521b04a448e7fc16ac9",
44
"/css/dist/skins/_all-skins.css": "/css/dist/skins/_all-skins.css?id=3e8b8221c159b829a0edd562eb717563",
55
"/css/build/overrides.css": "/css/build/overrides.css?id=31f0c9a27245a3b3a37a7d08ba914311",

resources/assets/js/snipeit.js

Lines changed: 83 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -625,35 +625,29 @@ $('.header-row input:radio').change(function() {
625625

626626
// Generic toggleable callouts with remember state
627627
$(".remember-toggle").on("click",function(){
628+
628629
var toggleable_callout_id = $(this).attr('id');
629630
var toggle_content_class = 'toggle-content-'+$(this).attr('id');
630631
var toggle_arrow = '#toggle-arrow-' + toggleable_callout_id;
631632
var toggle_cookie_name='toggle_state_'+toggleable_callout_id;
632633

633-
console.log('Callout ID: ' + toggleable_callout_id);
634-
console.log('Content ID: '+toggle_content_class);
635-
console.log('Arrow ID: '+toggle_arrow);
636-
console.log('Cookie Name: '+toggle_cookie_name);
637-
638634
$('.'+toggle_content_class).fadeToggle(100);
639635
$(toggle_arrow).toggleClass('fa-caret-right fa-caret-down');
640636
var toggle_open = $(toggle_arrow).hasClass('fa-caret-down');
641-
console.log('Cookie will set open state to: '+toggle_open);
642637
document.cookie=toggle_cookie_name+"="+toggle_open+';path=/';
643638
});
644639

645640
var all_cookies = document.cookie.split(';')
646641
for (var i in all_cookies) {
647642
var trimmed_cookie = all_cookies[i].trim(' ')
648-
elems = all_cookies[i].split('=', 2);
649-
643+
elems = trimmed_cookie.split('=', 2);
650644

651645
// We have to do more here since we don't know the name of the selector
652646
if (trimmed_cookie.startsWith('toggle_state_')) {
653-
console.log(trimmed_cookie + ' matches toggle_state_');
654-
var toggle_selector_name = elems[0].replace(' toggle_state_','');
655-
if (elems[1] == 'true') {
656-
console.log('Selector name for cookie click trigger: '+toggle_selector_name);
647+
648+
var toggle_selector_name = elems[0].replace('toggle_state_','');
649+
650+
if (elems[1] != "true") {
657651
$('#'+toggle_selector_name+'.remember-toggle').trigger('click')
658652
}
659653
}
@@ -714,3 +708,80 @@ $(".admin").change(function() {
714708
}
715709
});
716710

711+
// Handle the select/deselect of the select boxes with the button from right to left
712+
713+
$(function () {
714+
715+
function moveItems(origin, dest) {
716+
$(origin).find(':selected').appendTo(dest);
717+
$(dest).attr('selected', true);
718+
$(dest).sort_select_box();
719+
}
720+
721+
function moveAllItems(origin, dest) {
722+
$(origin).children("option:visible").appendTo(dest);
723+
$(dest).attr('selected', true);
724+
$(dest).sort_select_box();
725+
}
726+
727+
$('.left').on('click', function () {
728+
var container = $(this).closest('.addremove-multiselect');
729+
moveItems($(container).find('select.multiselect.selected'), $(container).find('select.multiselect.available'));
730+
});
731+
732+
$('.right').on('click', function () {
733+
var container = $(this).closest('.addremove-multiselect');
734+
moveItems($(container).find('select.multiselect.available'), $(container).find('select.multiselect.selected'));
735+
736+
});
737+
738+
$('.leftall').on('click', function () {
739+
var container = $(this).closest('.addremove-multiselect');
740+
moveAllItems($(container).find('select.multiselect.selected'), $(container).find('select.multiselect.available'));
741+
});
742+
743+
$('.rightall').on('click', function () {
744+
var container = $(this).closest('.addremove-multiselect');
745+
moveAllItems($(container).find('select.multiselect.available'), $(container).find('select.multiselect.selected'));
746+
});
747+
748+
$('select.multiselect.selected').on('dblclick keyup',function(e){
749+
if(e.which == 13 || e.type == 'dblclick') {
750+
var container = $(this).closest('.addremove-multiselect');
751+
moveItems($(container).find('select.multiselect.selected'), $(container).find('select.multiselect.available'));
752+
}
753+
});
754+
755+
$('select.multiselect.available').on('dblclick keyup',function(e){
756+
if(e.which == 13 || e.type == 'dblclick') {
757+
var container = $(this).closest('.addremove-multiselect');
758+
moveItems($(container).find('select.multiselect.available'), $(container).find('select.multiselect.selected'));
759+
$('#hidden_ids_box').val($('#selected-select').val());
760+
}
761+
});
762+
763+
764+
});
765+
766+
$.fn.sort_select_box = function(){
767+
// Get options from select box
768+
var selected_options = $(this).children('option');
769+
// sort alphabetically
770+
selected_options.sort(function(a,b) {
771+
if (a.text > b.text) return 1;
772+
else if (a.text < b.text) return -1;
773+
else return 0
774+
})
775+
//replace with sorted my_options;
776+
$(this).empty().append(selected_options);
777+
778+
var selected_in_box = $('#selected-select option').toArray().map(item => item.value).join();
779+
780+
$('#hidden_ids_box').empty().val(selected_in_box);
781+
782+
$('#count_selected_box').html($('#selected-select option').length);
783+
$('#count_unselected_box').html($('#available-select option').length);
784+
785+
// clearing any selections
786+
$("#"+this.attr('id')+" option").attr('selected', true);
787+
}

resources/lang/en-US/general.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,14 @@
384384
'bulk_edit_about_to' => 'You are about to edit the following: ',
385385
'checked_out' => 'Checked Out',
386386
'checked_out_to' => 'Checked out to',
387+
'available_users' => 'Available Users to Add',
388+
'add_users_to_group' => 'Add Users to Group',
389+
'users_to_add_to_group' => 'Users to Add',
390+
'add_all_users_to_group' => 'Add all users to group',
391+
'add_selected_users_to_group' => 'Add selected users to group',
392+
'remove_selected_users_from_group' => 'Remove selected users from group',
393+
'remove_all_users_from_group' => 'Remove all users from group',
394+
'add_users_to_group_help' => 'Use the arrows to add or remove users from this group. You can select multiple users by holding down the Ctrl (Windows) or Command (Mac) key while clicking.',
387395
'fields' => 'Fields',
388396
'last_checkout' => 'Last Checkout',
389397
'due_to_checkin' => 'The following :count items are due to be checked in soon:',

0 commit comments

Comments
 (0)