Mash the ids into a string, fixed disclosure arrows

This commit is contained in:
snipe
2025-11-06 20:12:25 +00:00
parent 90fc48d959
commit c39c92d0d7
9 changed files with 57 additions and 74 deletions

View File

@@ -24,7 +24,7 @@ class GroupsController extends Controller
$this->authorize('view', Group::class);
$groups = Group::select('id', 'name', 'permissions', 'notes', 'created_at', 'updated_at', 'created_by')->with('adminuser')->withCount('users as users_count');
$groups = Group::select(['id', 'name', 'permissions', 'notes', 'created_at', 'updated_at', 'created_by'])->with('adminuser')->withCount('users as users_count');
if ($request->filled('search')) {
$groups = $groups->TextSearch($request->input('search'));
@@ -50,6 +50,7 @@ class GroupsController extends Controller
'id',
'name',
'created_at',
'updated_at',
'users_count',
];

View File

@@ -85,8 +85,6 @@ class GroupsController extends Controller
$permissions = config('permissions');
$groupPermissions = $group->decodePermissions();
// dd(config('permissions'));
if ((!is_array($groupPermissions)) || (!$groupPermissions)) {
$groupPermissions = [];
}
@@ -111,8 +109,6 @@ class GroupsController extends Controller
public function update(Request $request, Group $group) : RedirectResponse
{
$group->name = $request->input('name');
\Log::error(print_r($_POST, true));
if ($request->filled('permission')) {
$group->permissions = json_encode($request->array('permission'));

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

@@ -52833,27 +52833,20 @@ $(".remember-toggle").on("click", function () {
var toggle_content_class = 'toggle-content-' + $(this).attr('id');
var toggle_arrow = '#toggle-arrow-' + toggleable_callout_id;
var toggle_cookie_name = 'toggle_state_' + toggleable_callout_id;
console.log('Callout ID: ' + toggleable_callout_id);
console.log('Content ID: ' + toggle_content_class);
console.log('Arrow ID: ' + toggle_arrow);
console.log('Cookie Name: ' + toggle_cookie_name);
$('.' + toggle_content_class).fadeToggle(100);
$(toggle_arrow).toggleClass('fa-caret-right fa-caret-down');
var toggle_open = $(toggle_arrow).hasClass('fa-caret-down');
console.log('Cookie will set open state to: ' + toggle_open);
document.cookie = toggle_cookie_name + "=" + toggle_open + ';path=/';
});
var all_cookies = document.cookie.split(';');
for (var i in all_cookies) {
var trimmed_cookie = all_cookies[i].trim(' ');
elems = all_cookies[i].split('=', 2);
elems = trimmed_cookie.split('=', 2);
// We have to do more here since we don't know the name of the selector
if (trimmed_cookie.startsWith('toggle_state_')) {
console.log(trimmed_cookie + ' matches toggle_state_');
var toggle_selector_name = elems[0].replace(' toggle_state_', '');
if (elems[1] == 'true') {
console.log('Selector name for cookie click trigger: ' + toggle_selector_name);
var toggle_selector_name = elems[0].replace('toggle_state_', '');
if (elems[1] != "true") {
$('#' + toggle_selector_name + '.remember-toggle').trigger('click');
}
}
@@ -52909,13 +52902,11 @@ $(function () {
$(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');
@@ -52928,25 +52919,22 @@ $(function () {
$('.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());
$('#hidden_ids_box').val($('#selected-select').val());
}
});
});
@@ -52959,11 +52947,12 @@ $.fn.sort_select_box = function () {
});
//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);
var selected_in_box = $('#selected-select option').toArray().map(function (item) {
return item.value;
}).join();
$('#hidden_ids_box').empty().val(selected_in_box);
$('#count_selected_box').html($('#selected-select option').length);
$('#count_unselected_box').html($('#available-select option').length);
// clearing any selections
$("#" + this.attr('id') + " option").attr('selected', true);

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=3c3ff12f52c1cec46ad05c9665793b81",
"/js/dist/all.js": "/js/dist/all.js?id=525664c0ec56444ba1c48c125346918a",
"/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

@@ -631,30 +631,23 @@ $(".remember-toggle").on("click",function(){
var toggle_arrow = '#toggle-arrow-' + toggleable_callout_id;
var toggle_cookie_name='toggle_state_'+toggleable_callout_id;
console.log('Callout ID: ' + toggleable_callout_id);
console.log('Content ID: '+toggle_content_class);
console.log('Arrow ID: '+toggle_arrow);
console.log('Cookie Name: '+toggle_cookie_name);
$('.'+toggle_content_class).fadeToggle(100);
$(toggle_arrow).toggleClass('fa-caret-right fa-caret-down');
var toggle_open = $(toggle_arrow).hasClass('fa-caret-down');
console.log('Cookie will set open state to: '+toggle_open);
document.cookie=toggle_cookie_name+"="+toggle_open+';path=/';
});
var all_cookies = document.cookie.split(';')
for (var i in all_cookies) {
var trimmed_cookie = all_cookies[i].trim(' ')
elems = all_cookies[i].split('=', 2);
elems = trimmed_cookie.split('=', 2);
// We have to do more here since we don't know the name of the selector
if (trimmed_cookie.startsWith('toggle_state_')) {
console.log(trimmed_cookie + ' matches toggle_state_');
var toggle_selector_name = elems[0].replace(' toggle_state_','');
if (elems[1] == 'true') {
console.log('Selector name for cookie click trigger: '+toggle_selector_name);
var toggle_selector_name = elems[0].replace('toggle_state_','');
if (elems[1] != "true") {
$('#'+toggle_selector_name+'.remember-toggle').trigger('click')
}
}
@@ -723,14 +716,12 @@ $(function () {
$(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 () {
@@ -747,20 +738,17 @@ $(function () {
$('.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());
}
});
@@ -768,7 +756,7 @@ $(function () {
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());
$('#hidden_ids_box').val($('#selected-select').val());
}
});
@@ -787,15 +775,13 @@ $.fn.sort_select_box = function(){
//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();
var selected_in_box = $('#selected-select option').toArray().map(item => item.value).join();
$('#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);
$('#hidden_ids_box').empty().val(selected_in_box);
$('#count_selected_box').html($('#selected-select option').length);
$('#count_unselected_box').html($('#available-select option').length);
// clearing any selections
$("#"+this.attr('id')+" option").attr('selected', true);
}
}

View File

@@ -384,6 +384,14 @@ return [
'bulk_edit_about_to' => 'You are about to edit the following: ',
'checked_out' => 'Checked Out',
'checked_out_to' => 'Checked out to',
'available_users' => 'Available Users to Add',
'add_users_to_group' => 'Add Users to Group',
'users_to_add_to_group' => 'Users to Add',
'add_all_users_to_group' => 'Add all users to group',
'add_selected_users_to_group' => 'Add selected users to group',
'remove_selected_users_from_group' => 'Remove selected users from group',
'remove_all_users_from_group' => 'Remove all users from group',
'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.',
'fields' => 'Fields',
'last_checkout' => 'Last Checkout',
'due_to_checkin' => 'The following :count items are due to be checked in soon:',

View File

@@ -3,7 +3,6 @@
'updateText' => trans('admin/groups/titles.update'),
'item' => $group,
'formAction' => ($group !== null && $group->id !== null) ? route('groups.update', ['group' => $group->id]) : route('groups.store'),
'container_classes' => 'col-lg-6 col-lg-offset-3 col-md-10 col-md-offset-1 col-sm-12 col-sm-offset-0',
'topSubmit' => 'true',
])
@section('content')
@@ -41,9 +40,10 @@
</div>
<div class="callout callout-legend col-md-12">
<h4>{{ trans('general.users') }}</h4>
</div>
<fieldset>
<x-form-legend help_text="{{ trans('general.add_users_to_group_help') }}">
{{ trans('general.add_users_to_group') }}
</x-form-legend>
<!-- this is a temp fix for the select2 not working inside modals -->
@@ -52,51 +52,52 @@
<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()) }}"/>
<input type="hidden" name="users_to_add" id="hidden_ids_box" class="form-control" value="{{ implode(",", $associated_users->pluck('id')->toArray()) }}"/>
<div class="row addremove-multiselect">
<div class="addremove-multiselect">
<div class="col-lg-5 col-sm-5 col-xs-12">
<h4>Available</h4>
<h4>{{ trans('general.available_users') }}</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>
<p class="help-block text-right">
<x-icon type="users" />
<span id="count_unselected_box">{{ count($unselected_users) }}</span>
</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>
<button type="button" id="rightall" class="rightall btn btn-sm btn-block btn-default" data-tooltip="true" title="{{ trans('general.add_all_users_to_group') }}"><i class="fa-solid fa-angles-right"></i></button>
<button type="button" id="right" class="right btn btn-sm btn-block btn-default" data-tooltip="true" title="{{ trans('general.add_selected_users_to_group') }}"><i class="fa-solid fa-angle-right"></i></button>
<button type="button" id="left" class="left btn btn-block btn-sm btn-default" data-tooltip="true" title="{{ trans('general.remove_selected_users_from_group') }}"><i class="fa-solid fa-angle-left"></i></button>
<button type="button" id="leftall" class="leftall btn btn-sm btn-block btn-default" data-tooltip="true" title="{{ trans('general.remove_all_users_from_group') }}"><i class="fa-solid fa-angles-left"></i></button>
</div>
<div class="col-lg-5 col-sm-5 col-xs-12">
<h4>In Group</h4>
<h4>{{ trans('general.users_to_add_to_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>
<p class="help-block text-right">
<x-icon type="users" />
<span id="count_selected_box"> {{ count($associated_users) }}</span>
</p>
</div>
</div>
</div>
</div>
</fieldset>
<div class="col-md-12">
@include ('partials.forms.edit.permissions-base', ['use_inherit' => false])

View File

@@ -42,7 +42,9 @@
<th data-switchable="true" data-sortable="true" data-field="notes" data-visible="true">{{ trans('general.notes') }}</th>
<th data-switchable="true" data-sortable="true" data-field="created_at" data-visible="true" data-formatter="dateDisplayFormatter">{{ trans('general.created_at') }}</th>
<th data-switchable="false" data-searchable="false" data-sortable="true" data-field="created_by" data-formatter="usersLinkObjFormatter">{{ trans('general.created_by') }}</th>
<th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions" data-formatter="groupsActionsFormatter">{{ trans('table.actions') }}</th>
<th data-switchable="false" data-searchable="false" data-sortable="true" data-field="created_at" data-formatter="dateDisplayFormatter">{{ trans('general.created_at') }}</th>
<th data-switchable="false" data-searchable="false" data-sortable="true" data-field="updated_at" data-formatter="dateDisplayFormatter">{{ trans('general.updated_at') }}</th>
<th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions" data-formatter="groupsActionsFormatter">{{ trans('table.actions') }}</th>
</tr>
</thead>