Shim workaround to avoid max_input_vars and max_multipart_body_parts limits

max_input_vars = 2000
max_multipart_body_parts = 2048
This commit is contained in:
snipe
2025-11-06 18:17:40 +00:00
parent dea399398a
commit 90fc48d959
8 changed files with 226 additions and 34 deletions

View File

@@ -85,14 +85,19 @@ class GroupsController extends Controller
$permissions = config('permissions');
$groupPermissions = $group->decodePermissions();
// dd(config('permissions'));
if ((!is_array($groupPermissions)) || (!$groupPermissions)) {
$groupPermissions = [];
}
$selected_array = Helper::selectedPermissionsArray($permissions, $groupPermissions);
$associated_users = $group->users()->get();
//dd($associated_users->toArray());
return view('groups.edit', compact('group', 'permissions', 'selected_array', 'groupPermissions'))->with('associated_users', $associated_users);
// Get the unselected users
$users = \App\Models\User::get();
$unselected_users = $users->diffKeys($associated_users);
return view('groups.edit', compact('group', 'permissions', 'selected_array', 'groupPermissions'))->with('associated_users', $associated_users)->with('unselected_users', $unselected_users);
}
/**
@@ -106,13 +111,23 @@ class GroupsController extends Controller
public function update(Request $request, Group $group) : RedirectResponse
{
$group->name = $request->input('name');
$group->permissions = json_encode($request->input('permission'));
\Log::error(print_r($_POST, true));
if ($request->filled('permission')) {
$group->permissions = json_encode($request->array('permission'));
} else {
$group->permissions = null;
}
$group->notes = $request->input('notes');
if (! config('app.lock_passwords')) {
if ($group->save()) {
$group->users()->sync($request->input('associated_users'));
$associated_users = explode(',',$request->input('users_to_add'));
$group->users()->sync($associated_users);
return redirect()->route('groups.index')->with('success', trans('admin/groups/message.success.update'));
}

View File

@@ -68,7 +68,7 @@ class UserSeeder extends Seeder
]))
->create();
User::factory()->count(50)->viewAssets()
User::factory()->count(2000)->viewAssets()
->state(new Sequence(fn($sequence) => [
'company_id' => $companyIds->random(),
'department_id' => $departmentIds->random(),

67
public/js/dist/all.js vendored
View File

@@ -52902,6 +52902,73 @@ $(".admin").change(function () {
}
});
// Handle the select/deselect of the select boxes with the button from right to left
$(function () {
function moveItems(origin, dest) {
$(origin).find(':selected').appendTo(dest);
$(dest).attr('selected', true);
$(dest).sort_select_box();
// $('#user_id_box').val($('#selected-select').val());
}
function moveAllItems(origin, dest) {
$(origin).children("option:visible").appendTo(dest);
$(dest).attr('selected', true);
$(dest).sort_select_box();
// $('#user_id_box').val($('#selected-select').val());
}
$('.left').on('click', function () {
var container = $(this).closest('.addremove-multiselect');
moveItems($(container).find('select.multiselect.selected'), $(container).find('select.multiselect.available'));
});
$('.right').on('click', function () {
var container = $(this).closest('.addremove-multiselect');
moveItems($(container).find('select.multiselect.available'), $(container).find('select.multiselect.selected'));
});
$('.leftall').on('click', function () {
var container = $(this).closest('.addremove-multiselect');
moveAllItems($(container).find('select.multiselect.selected'), $(container).find('select.multiselect.available'));
// $('#user_id_box').val($('#selected-select').val());
});
$('.rightall').on('click', function () {
var container = $(this).closest('.addremove-multiselect');
moveAllItems($(container).find('select.multiselect.available'), $(container).find('select.multiselect.selected'));
// $('#user_id_box').val($('#selected-select').val());
});
$('select.multiselect.selected').on('dblclick keyup', function (e) {
if (e.which == 13 || e.type == 'dblclick') {
var container = $(this).closest('.addremove-multiselect');
moveItems($(container).find('select.multiselect.selected'), $(container).find('select.multiselect.available'));
// $('#user_id_box').val($('#selected-select').val());
}
});
$('select.multiselect.available').on('dblclick keyup', function (e) {
if (e.which == 13 || e.type == 'dblclick') {
var container = $(this).closest('.addremove-multiselect');
moveItems($(container).find('select.multiselect.available'), $(container).find('select.multiselect.selected'));
$('#user_id_box').val($('#selected-select').val());
}
});
});
$.fn.sort_select_box = function () {
// Get options from select box
var selected_options = $(this).children('option');
// sort alphabetically
selected_options.sort(function (a, b) {
if (a.text > b.text) return 1;else if (a.text < b.text) return -1;else return 0;
});
//replace with sorted my_options;
$(this).empty().append(selected_options);
var selected_in_box = $('#selected-select').children("option:selected").val();
var not_selected_in_box = $('#selected-select option').not(':selected').val();
$('#user_id_box').empty().append(selected_in_box).append(not_selected_in_box);
$('#user_count_selected_box').html($('#selected-select option').length);
$('#user_count_unselected_box').html($('#available-select option').length);
// clearing any selections
$("#" + this.attr('id') + " option").attr('selected', true);
};
/***/ }),
/***/ "./resources/assets/js/snipeit_modals.js":

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
{
"/js/dist/all.js": "/js/dist/all.js?id=e78128438f0b07a393dc7947ef453b5f",
"/js/dist/all.js": "/js/dist/all.js?id=3c3ff12f52c1cec46ad05c9665793b81",
"/css/dist/skins/skin-black-dark.css": "/css/dist/skins/skin-black-dark.css?id=42f97cd5b9ee7521b04a448e7fc16ac9",
"/css/dist/skins/_all-skins.css": "/css/dist/skins/_all-skins.css?id=3e8b8221c159b829a0edd562eb717563",
"/css/build/overrides.css": "/css/build/overrides.css?id=31f0c9a27245a3b3a37a7d08ba914311",

View File

@@ -625,6 +625,7 @@ $('.header-row input:radio').change(function() {
// Generic toggleable callouts with remember state
$(".remember-toggle").on("click",function(){
var toggleable_callout_id = $(this).attr('id');
var toggle_content_class = 'toggle-content-'+$(this).attr('id');
var toggle_arrow = '#toggle-arrow-' + toggleable_callout_id;
@@ -714,3 +715,87 @@ $(".admin").change(function() {
}
});
// Handle the select/deselect of the select boxes with the button from right to left
$(function () {
function moveItems(origin, dest) {
$(origin).find(':selected').appendTo(dest);
$(dest).attr('selected', true);
$(dest).sort_select_box();
// $('#user_id_box').val($('#selected-select').val());
}
function moveAllItems(origin, dest) {
$(origin).children("option:visible").appendTo(dest);
$(dest).attr('selected', true);
$(dest).sort_select_box();
// $('#user_id_box').val($('#selected-select').val());
}
$('.left').on('click', function () {
var container = $(this).closest('.addremove-multiselect');
moveItems($(container).find('select.multiselect.selected'), $(container).find('select.multiselect.available'));
});
$('.right').on('click', function () {
var container = $(this).closest('.addremove-multiselect');
moveItems($(container).find('select.multiselect.available'), $(container).find('select.multiselect.selected'));
});
$('.leftall').on('click', function () {
var container = $(this).closest('.addremove-multiselect');
moveAllItems($(container).find('select.multiselect.selected'), $(container).find('select.multiselect.available'));
// $('#user_id_box').val($('#selected-select').val());
});
$('.rightall').on('click', function () {
var container = $(this).closest('.addremove-multiselect');
moveAllItems($(container).find('select.multiselect.available'), $(container).find('select.multiselect.selected'));
// $('#user_id_box').val($('#selected-select').val());
});
$('select.multiselect.selected').on('dblclick keyup',function(e){
if(e.which == 13 || e.type == 'dblclick') {
var container = $(this).closest('.addremove-multiselect');
moveItems($(container).find('select.multiselect.selected'), $(container).find('select.multiselect.available'));
// $('#user_id_box').val($('#selected-select').val());
}
});
$('select.multiselect.available').on('dblclick keyup',function(e){
if(e.which == 13 || e.type == 'dblclick') {
var container = $(this).closest('.addremove-multiselect');
moveItems($(container).find('select.multiselect.available'), $(container).find('select.multiselect.selected'));
$('#user_id_box').val($('#selected-select').val());
}
});
});
$.fn.sort_select_box = function(){
// Get options from select box
var selected_options = $(this).children('option');
// sort alphabetically
selected_options.sort(function(a,b) {
if (a.text > b.text) return 1;
else if (a.text < b.text) return -1;
else return 0
})
//replace with sorted my_options;
$(this).empty().append(selected_options);
var selected_in_box = $('#selected-select').children("option:selected").val();
var not_selected_in_box = $('#selected-select option').not(':selected').val();
$('#user_id_box').empty().append(selected_in_box).append(not_selected_in_box);
$('#user_count_selected_box').html($('#selected-select option').length);
$('#user_count_unselected_box').html($('#available-select option').length);
// clearing any selections
$("#"+this.attr('id')+" option").attr('selected', true);
}

View File

@@ -41,40 +41,65 @@
</div>
<div class="form-group{{ $errors->has('associated_users') ? ' has-error' : '' }}">
<div class="callout callout-legend col-md-12">
<h4>{{ trans('general.users') }}</h4>
</div>
<label for="associated_users[]" class="col-md-3 control-label">
{{ trans('general.users') }}
</label>
<!-- this is a temp fix for the select2 not working inside modals -->
<div class="col-md-7">
<select class="js-data-ajax"
data-endpoint="users"
data-placeholder="{{ trans('general.select_user') }}"
name="associated_users[]"
style="width: 100%"
id="associated_users[]"
aria-label="associated_users[]" multiple>
<option value="" role="option">{{ trans('general.select_user') }}</option>
@if(isset($associated_users))
@foreach($associated_users as $associated_user)
<option value="{{ $associated_user->id }}" selected="selected" role="option" aria-selected="true"
role="option">
{{ $associated_user->present()->fullName }} ({{ $associated_user->username }})
</option>
@endforeach
@endif
</select>
<div class="form-group">
<div class="col-md-12">
<!-- This hidden input will store the selected user IDs as a comma-separated string to avoid max_input_vars and max_multipart_body_parts php.ini issues -->
<input type="text" name="users_to_add" id="user_id_box" class="form-control" value="{{ implode(",", $associated_users->pluck('id')->toArray()) }}"/>
<div class="row addremove-multiselect">
<div class="col-lg-5 col-sm-5 col-xs-12">
<h4>Available</h4>
<select id="available-select" class="multiselect available form-control" size="8" multiple="multiple">
@foreach($unselected_users as $unselected_user)
<option value="{{ $unselected_user->id }}" role="option">
ID: {{ $unselected_user->id }}
{{ $unselected_user->present()->fullName }} ({{ $unselected_user->username }})
</option>
@endforeach
</select>
<p class="help-block"><span id="user_count_unselected_box">{{ count($unselected_users) }}</span> users </p>
</div>
<div class="multiselect-controls col-lg-2 col-sm-2 col-xs-12">
<br><br>
<button type="button" id="rightall" class="rightall btn btn-block">Add All <i class="fa-solid fa-angles-right"></i></button>
<button type="button" id="right" class="right btn btn-block">Add <i class="fa-solid fa-angle-right"></i></button>
<button type="button" id="left" class="left btn btn-block"><i class="fa-solid fa-angle-left"></i> Remove</button>
<button type="button" id="leftall" class="leftall btn btn-block"><i class="fa-solid fa-angles-left"></i> Remove All</button>
</div>
<div class="col-lg-5 col-sm-5 col-xs-12">
<h4>In Group</h4>
<select id="selected-select" class="multiselect selected form-control" size="8" multiple="multiple">
@foreach($associated_users as $associated_user)
<option value="{{ $associated_user->id }}" aria-selected="true" selected="selected" role="option">
ID: {{ $associated_user->id }}
{{ $associated_user->present()->fullName }} ({{ $associated_user->username }})
</option>
@endforeach
</select>
<p class="help-block"><span id="user_count_selected_box">{{ count($associated_users) }}</span> in this group</p>
</div>
</div>
</div>
{!! $errors->first('associated_users', '<div class="col-md-8 col-md-offset-3"><span class="alert-msg" aria-hidden="true"><i class="fas fa-times" aria-hidden="true"></i> :message</span></div>') !!}
</div>
<div class="col-md-12">
@include ('partials.forms.edit.permissions-base', ['use_inherit' => false])
</div>
@stop

View File

@@ -26,7 +26,7 @@
<!-- col-md-8 -->
<div class="{{ isset($container_classes) ? $container_classes : 'col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1 col-sm-12 col-sm-offset-0'}}">
<form id="create-form" class="form-horizontal" method="post" action="{{ (isset($formAction)) ? $formAction : \Request::url() }}" autocomplete="off" role="form" enctype="multipart/form-data">
<form id="create-form" class="form-horizontal" method="post" action="{{ (isset($formAction)) ? $formAction : \Request::url() }}" autocomplete="off" role="form">
<!-- box -->
<div class="box box-default">