Skip to content

Commit aa041e3

Browse files
committed
Merge remote-tracking branch 'origin/develop'
# Conflicts: # public/js/dist/all.js # public/js/dist/all.js.map # public/mix-manifest.json
2 parents 723abca + 9f6a73b commit aa041e3

File tree

11 files changed

+195
-60
lines changed

11 files changed

+195
-60
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

app/Models/Labels/Tapes/Brother/TZe_24mm_E.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
44

55
class TZe_24mm_E extends TZe_24mm
66
{
7-
private const BARCODE_MARGIN = 1.50;
7+
private const BARCODE_MARGIN = 1.75;
88
private const TAG_SIZE = 2.00;
99
private const TITLE_SIZE = 2.80;
1010
private const TITLE_MARGIN = 0.50;
1111
private const LABEL_SIZE = 2.00;
12-
private const LABEL_MARGIN = - 0.35;
12+
private const LABEL_MARGIN = - 0.75;
1313
private const FIELD_SIZE = 2.80;
1414
private const FIELD_MARGIN = 0.15;
15-
private const BARCODE1D_SIZE = - 1.00;
15+
private const BARCODE1D_SIZE = - 2.25;
1616

1717
public function getUnit() { return 'mm'; }
1818
public function getWidth() { return 45.0; }

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: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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=6ffdb46d7dcfceb395f453e15cfbc4be",
2+
"/js/dist/all.js": "/js/dist/all.js?id=a84550e1cfe57870332e6a2e1b605707",
33
"/css/dist/skins/skin-black-dark.css": "/css/dist/skins/skin-black-dark.css?id=bf1a348eae3e60c62b8879953f7df14c",
44
"/css/dist/skins/_all-skins.css": "/css/dist/skins/_all-skins.css?id=f712d11cfca345b58c1d8a35df03d38d",
55
"/css/build/overrides.css": "/css/build/overrides.css?id=dee88c73824aa75c0a01ecdc744b3095",

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:',

resources/views/groups/edit.blade.php

Lines changed: 57 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
'updateText' => trans('admin/groups/titles.update'),
44
'item' => $group,
55
'formAction' => ($group !== null && $group->id !== null) ? route('groups.update', ['group' => $group->id]) : route('groups.store'),
6-
'container_classes' => 'col-lg-6 col-lg-offset-3 col-md-10 col-md-offset-1 col-sm-12 col-sm-offset-0',
76
'topSubmit' => 'true',
87
])
98
@section('content')
@@ -41,40 +40,67 @@
4140
</div>
4241

4342

44-
<div class="form-group{{ $errors->has('associated_users') ? ' has-error' : '' }}">
45-
46-
<label for="associated_users[]" class="col-md-3 control-label">
47-
{{ trans('general.users') }}
48-
</label>
49-
50-
<div class="col-md-7">
51-
<select class="js-data-ajax"
52-
data-endpoint="users"
53-
data-placeholder="{{ trans('general.select_user') }}"
54-
name="associated_users[]"
55-
style="width: 100%"
56-
id="associated_users[]"
57-
aria-label="associated_users[]" multiple>
58-
59-
<option value="" role="option">{{ trans('general.select_user') }}</option>
60-
@if(isset($associated_users))
61-
@foreach($associated_users as $associated_user)
62-
<option value="{{ $associated_user->id }}" selected="selected" role="option" aria-selected="true"
63-
role="option">
64-
{{ $associated_user->present()->fullName }} ({{ $associated_user->username }})
65-
</option>
66-
@endforeach
67-
@endif
68-
</select>
43+
<fieldset>
44+
<x-form-legend help_text="{{ trans('general.add_users_to_group_help') }}">
45+
{{ trans('general.add_users_to_group') }}
46+
</x-form-legend>
47+
48+
<!-- this is a temp fix for the select2 not working inside modals -->
49+
50+
51+
<div class="form-group">
52+
<div class="col-md-12">
53+
54+
<!-- 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 -->
55+
<input type="hidden" name="users_to_sync" id="hidden_ids_box" class="form-control" value="{{ ($associated_users && is_array($associated_users)) ? implode(",", $associated_users->pluck('id')->toArray()) : '' }}"/>
56+
57+
<div class="addremove-multiselect">
58+
<div class="col-lg-5 col-sm-5 col-xs-12">
59+
<h4>{{ trans('general.available_users') }}</h4>
60+
<select id="available-select" class="multiselect available form-control" size="8" multiple="multiple">
61+
@foreach($unselected_users as $unselected_user)
62+
<option value="{{ $unselected_user->id }}" role="option">
63+
{{ $unselected_user->present()->fullName }} ({{ $unselected_user->username }})
64+
</option>
65+
@endforeach
66+
</select>
67+
<p class="help-block text-right">
68+
<x-icon type="users" />
69+
<span id="count_unselected_box">{{ count($unselected_users) }}</span>
70+
</p>
71+
</div>
72+
73+
<div class="multiselect-controls col-lg-2 col-sm-2 col-xs-12">
74+
<br><br>
75+
<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>
76+
<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>
77+
<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>
78+
<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>
79+
</div>
80+
81+
<div class="col-lg-5 col-sm-5 col-xs-12">
82+
<h4>{{ trans('general.users_to_add_to_group') }}</h4>
83+
<select id="selected-select" class="multiselect selected form-control" size="8" multiple="multiple">
84+
@foreach($associated_users as $associated_user)
85+
<option value="{{ $associated_user->id }}" aria-selected="true" selected="selected" role="option">
86+
{{ $associated_user->present()->fullName }} ({{ $associated_user->username }})
87+
</option>
88+
@endforeach
89+
</select>
90+
<p class="help-block text-right">
91+
<x-icon type="users" />
92+
<span id="count_selected_box"> {{ count($associated_users) }}</span>
93+
</p>
94+
95+
</div>
96+
97+
</div>
6998
</div>
70-
71-
{!! $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>') !!}
72-
7399
</div>
74-
100+
</fieldset>
75101

76102
<div class="col-md-12">
77103
@include ('partials.forms.edit.permissions-base', ['use_inherit' => false])
78104
</div>
79-
80105
@stop
106+

0 commit comments

Comments
 (0)