Skip to content

Commit aac1864

Browse files
committed
Merge remote-tracking branch 'origin/develop'
2 parents e3477f3 + 170a515 commit aac1864

File tree

10 files changed

+133
-33
lines changed

10 files changed

+133
-33
lines changed

app/Http/Controllers/Accessories/AccessoriesController.php

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,18 @@ public function store(ImageUploadRequest $request) : RedirectResponse
7777
$accessory->supplier_id = request('supplier_id');
7878
$accessory->notes = request('notes');
7979

80-
$accessory = $request->handleImages($accessory);
80+
if ($request->has('use_cloned_image')) {
81+
$cloned_model_img = Accessory::select('image')->find($request->input('clone_image_from_id'));
82+
if ($cloned_model_img) {
83+
$new_image_name = 'clone-'.date('U').'-'.$cloned_model_img->image;
84+
$new_image = 'accessories/'.$new_image_name;
85+
Storage::disk('public')->copy('accessories/'.$cloned_model_img->image, $new_image);
86+
$accessory->image = $new_image_name;
87+
}
88+
89+
} else {
90+
$accessory = $request->handleImages($accessory);
91+
}
8192

8293
session()->put(['redirect_option' => $request->get('redirect_option')]);
8394
// Was the accessory created?
@@ -114,11 +125,12 @@ public function getClone(Accessory $accessory) : View | RedirectResponse
114125

115126
$this->authorize('create', Accessory::class);
116127
$cloned = clone $accessory;
128+
$accessory_to_clone = $accessory;
117129
$cloned->id = null;
118130
$cloned->deleted_at = '';
119-
$cloned->location_id = null;
120131

121132
return view('accessories/edit')
133+
->with('cloned_model', $accessory_to_clone)
122134
->with('item', $cloned);
123135

124136
}

app/Http/Controllers/AssetModelsController.php

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,20 @@ public function store(StoreAssetModelRequest $request) : RedirectResponse
8787
$model->fieldset_id = $request->input('fieldset_id');
8888
}
8989

90-
$model = $request->handleImages($model);
90+
if ($request->has('use_cloned_image')) {
91+
$cloned_model_img = AssetModel::select('image')->find($request->input('clone_image_from_id'));
92+
if ($cloned_model_img) {
93+
$new_image_name = 'clone-'.date('U').'-'.$cloned_model_img->image;
94+
$new_image = 'models/'.$new_image_name;
95+
Storage::disk('public')->copy('models/'.$cloned_model_img->image, $new_image);
96+
$model->image = $new_image_name;
97+
}
98+
99+
} else {
100+
$model = $request->handleImages($model);
101+
}
102+
103+
91104

92105
if ($model->save()) {
93106
if ($this->shouldAddDefaultValues($request->input())) {
@@ -271,7 +284,7 @@ public function getClone(AssetModel $model) : View | RedirectResponse
271284
->with('depreciation_list', Helper::depreciationList())
272285
->with('item', $model)
273286
->with('model_id', $model->id)
274-
->with('clone_model', $cloned_model);
287+
->with('cloned_model', $cloned_model);
275288
}
276289

277290

app/Http/Controllers/Assets/AssetsController.php

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,16 @@ public function store(ImageUploadRequest $request) : RedirectResponse
157157
$asset->location_id = $request->input('rtd_location_id', null);
158158
}
159159

160-
// Create the image (if one was chosen.)
161-
if ($request->has('image')) {
160+
if ($request->has('use_cloned_image')) {
161+
$cloned_model_img = Asset::select('image')->find($request->input('clone_image_from_id'));
162+
if ($cloned_model_img) {
163+
$new_image_name = 'clone-'.date('U').'-'.$cloned_model_img->image;
164+
$new_image = 'assets/'.$new_image_name;
165+
Storage::disk('public')->copy('assets/'.$cloned_model_img->image, $new_image);
166+
$asset->image = $new_image_name;
167+
}
168+
169+
} else {
162170
$asset = $request->handleImages($asset);
163171
}
164172

@@ -644,8 +652,9 @@ public function getLabel($assetId = null)
644652
*/
645653
public function getClone(Asset $asset)
646654
{
647-
$this->authorize('create', $asset);
655+
$this->authorize('create', Asset::class);
648656
$cloned = clone $asset;
657+
$cloned_model = $asset;
649658
$cloned->id = null;
650659
$cloned->asset_tag = '';
651660
$cloned->serial = '';
@@ -655,6 +664,7 @@ public function getClone(Asset $asset)
655664
return view('hardware/edit')
656665
->with('statuslabel_list', Helper::statusLabelList())
657666
->with('statuslabel_types', Helper::statusTypeList())
667+
->with('cloned_model', $cloned_model)
658668
->with('item', $cloned);
659669
}
660670

app/Http/Controllers/Consumables/ConsumablesController.php

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
use App\Http\Requests\ImageUploadRequest;
88
use App\Models\Company;
99
use App\Models\Consumable;
10-
use Illuminate\Support\Facades\Auth;
10+
use Illuminate\Support\Facades\Storage;
1111
use Illuminate\Support\Facades\Validator;
1212
use Illuminate\Http\RedirectResponse;
1313
use \Illuminate\Contracts\View\View;
@@ -81,11 +81,22 @@ public function store(StoreConsumableRequest $request)
8181
$consumable->purchase_date = $request->input('purchase_date');
8282
$consumable->purchase_cost = $request->input('purchase_cost');
8383
$consumable->qty = $request->input('qty');
84-
$consumable->created_by = auth()->id();
84+
$consumable->created_by = auth()->id();
8585
$consumable->notes = $request->input('notes');
8686

8787

88-
$consumable = $request->handleImages($consumable);
88+
if ($request->has('use_cloned_image')) {
89+
$cloned_model_img = Consumable::select('image')->find($request->input('clone_image_from_id'));
90+
if ($cloned_model_img) {
91+
$new_image_name = 'clone-'.date('U').'-'.$cloned_model_img->image;
92+
$new_image = 'consumables/'.$new_image_name;
93+
Storage::disk('public')->copy('consumables/'.$cloned_model_img->image, $new_image);
94+
$consumable->image = $new_image_name;
95+
}
96+
97+
} else {
98+
$consumable = $request->handleImages($consumable);
99+
}
89100

90101
session()->put(['redirect_option' => $request->get('redirect_option')]);
91102

@@ -213,9 +224,10 @@ public function clone(Consumable $consumable) : View
213224
$consumable_to_close = $consumable;
214225
$consumable = clone $consumable_to_close;
215226
$consumable->id = null;
216-
$consumable->image = null;
217227
$consumable->created_by = null;
218228

219-
return view('consumables/edit')->with('item', $consumable);
229+
return view('consumables/edit')
230+
->with('cloned_model', $consumable_to_close)
231+
->with('item', $consumable);
220232
}
221233
}

app/Http/Controllers/LocationsController.php

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,18 @@ public function store(ImageUploadRequest $request) : RedirectResponse
9696
$location->company_id = $request->input('company_id');
9797
}
9898

99-
$location = $request->handleImages($location);
99+
if ($request->has('use_cloned_image')) {
100+
$cloned_model_img = Location::select('image')->find($request->input('clone_image_from_id'));
101+
if ($cloned_model_img) {
102+
$new_image_name = 'clone-'.date('U').'-'.$cloned_model_img->image;
103+
$new_image = 'locations/'.$new_image_name;
104+
Storage::disk('public')->copy('locations/'.$cloned_model_img->image, $new_image);
105+
$location->image = $new_image_name;
106+
}
107+
108+
} else {
109+
$location = $request->handleImages($location);
110+
}
100111

101112
if ($location->save()) {
102113
return redirect()->route('locations.index')->with('success', trans('admin/locations/message.create.success'));
@@ -275,9 +286,9 @@ public function getClone($locationId = null) : View | RedirectResponse
275286

276287
// unset these values
277288
$location->id = null;
278-
$location->image = null;
279289

280290
return view('locations/edit')
291+
->with('cloned_model', $location_to_clone)
281292
->with('item', $location);
282293
}
283294

app/Http/Controllers/Users/UsersController.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -432,7 +432,7 @@ public function getClone(Request $request, User $user)
432432
app('request')->request->set('permissions', $permissions);
433433

434434

435-
$user_to_clone = User::with('assets', 'assets.model', 'consumables', 'accessories', 'licenses', 'userloc')->withTrashed()->find($user->id);
435+
$user_to_clone = User::with('userloc')->withTrashed()->find($user->id);
436436
// Make sure they can view this particular user
437437
$this->authorize('view', $user_to_clone);
438438

@@ -447,6 +447,8 @@ public function getClone(Request $request, User $user)
447447
$user->last_name = '';
448448
$user->email = substr($user->email, ($pos = strpos($user->email, '@')) !== false ? $pos : 0);
449449
$user->id = null;
450+
$user->username = null;
451+
$user->avatar = null;
450452

451453
// Get this user's groups
452454
$userGroups = $user_to_clone->groups()->pluck('name', 'id');
@@ -462,7 +464,7 @@ public function getClone(Request $request, User $user)
462464
->with('user', $user)
463465
->with('groups', Group::pluck('name', 'id'))
464466
->with('userGroups', $userGroups)
465-
->with('clone_user', $user_to_clone)
467+
->with('cloned_model', $user_to_clone)
466468
->with('item', $user);
467469
}
468470

resources/lang/en-US/general.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,9 @@
598598
'by' => 'By',
599599
'version' => 'Version',
600600
'build' => 'build',
601+
'use_cloned_image' => 'Clone image from original',
602+
'use_cloned_image_help' => 'You may clone the original image or you can upload a new one using the upload field below.',
603+
'use_cloned_no_image_help' => 'This item does not have an associated image and instead inherits from the model or category it belongs to. If you would like to use a specific image for this item, you can upload a new one below.',
601604
'footer_credit' => '<a target="_blank" href="https://snipeitapp.com" rel="noopener">Snipe-IT</a> is open source software, made with <i class="fa fa-heart" aria-hidden="true" style="color: #a94442; font-size: 10px" /></i><span class="sr-only">love</span> by <a href="https://bsky.app/profile/snipeitapp.com" rel="noopener">@snipeitapp.com</a>.',
602605
'set_password' => 'Set a Password',
603606

resources/views/layouts/default.blade.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1154,6 +1154,19 @@ function showHideEncValue(e) {
11541154
11551155
$(function () {
11561156
1157+
// This handles the show/hide for cloned items
1158+
$('#use_cloned_image').click(function() {
1159+
if ($('#use_cloned_image').is(':checked')) {
1160+
$('#image_delete').prop('checked', false);
1161+
$('#image-upload').hide();
1162+
$('#existing-image').show();
1163+
} else {
1164+
$('#image-upload').show();
1165+
$('#existing-image').hide();
1166+
}
1167+
//$('#image-upload').hide();
1168+
});
1169+
11571170
// Invoke Bootstrap 3's tooltip
11581171
$('[data-tooltip="true"]').tooltip({
11591172
container: 'body',

resources/views/models/edit.blade.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
{{-- Page content --}}
1111
@section('inputFields')
12-
1312
@include ('partials.forms.edit.name', ['translated_name' => trans('admin/models/table.name'), 'required' => 'true'])
1413
@include ('partials.forms.edit.category-select', ['translated_name' => trans('admin/categories/general.category_name'), 'fieldname' => 'category_id', 'required' => 'true', 'category_type' => 'asset'])
1514
@include ('partials.forms.edit.manufacturer-select', ['translated_name' => trans('general.manufacturer'), 'fieldname' => 'manufacturer_id'])
@@ -43,4 +42,4 @@
4342
@include ('partials.forms.edit.image-upload', ['image_path' => app('models_upload_path')])
4443

4544

46-
@stop
45+
@stop
Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,53 @@
11
<!-- Image stuff - kept in /resources/views/partials/forms/edit/image-upload.blade.php -->
2-
<!-- Image Delete -->
32
@if (isset($image_path))
43
@if (isset($item) && ($item->{($fieldname ?? 'image')}))
54
<div class="form-group{{ $errors->has('image_delete') ? ' has-error' : '' }}">
65
<div class="col-md-9 col-md-offset-3">
7-
<label class="form-control">
8-
<input type="checkbox" name="image_delete" value="1" @checked(old('image_delete')) aria-label="image_delete">
9-
{{ trans('general.image_delete') }}
10-
{!! $errors->first('image_delete', '<span class="alert-msg">:message</span>') !!}
11-
</label>
6+
7+
@if ((isset($cloned_model)) && ($cloned_model->image!=''))
8+
<!-- We are cloning a model. Use the cloned image if the user has checked that box -->
9+
<input type="hidden" name="clone_image_from_id" value="{{ $cloned_model->id }}" />
10+
<label class="form-control">
11+
<input type="checkbox" name="use_cloned_image" value="1" @checked(old('use_cloned_image')) aria-label="use_cloned_image" id="use_cloned_image">
12+
{{ trans('general.use_cloned_image') }}
13+
</label>
14+
<p class="help-block">
15+
{{ trans('general.use_cloned_image_help') }}
16+
</p>
17+
18+
{!! $errors->first('use_cloned_image', '<span class="alert-msg">:message</span>') !!}
19+
@else
20+
<!-- Image Delete -->
21+
<label class="form-control">
22+
<input type="checkbox" name="image_delete" value="1" @checked(old('image_delete')) aria-label="image_delete" id="image_delete">
23+
{{ trans('general.image_delete') }}
24+
{!! $errors->first('image_delete', '<span class="alert-msg">:message</span>') !!}
25+
</label>
26+
@endif
27+
1228
</div>
29+
</div>
30+
31+
<!-- existing image -->
32+
<div class="form-group" id="existing-image">
33+
<div class="col-md-8 col-md-offset-3">
34+
<img src="{{ Storage::disk('public')->url($image_path.e($item->{($fieldname ?? 'image')})) }}" class="img-responsive">
35+
{!! $errors->first('image_delete', '<span class="alert-msg">:message</span>') !!}
1336
</div>
37+
</div>
38+
@elseif (isset($item) && (isset($item->model)) && ($item->model->image != ''))
1439
<div class="form-group">
1540
<div class="col-md-8 col-md-offset-3">
16-
<img src="{{ Storage::disk('public')->url($image_path.e($item->{($fieldname ?? 'image')})) }}" class="img-responsive">
17-
{!! $errors->first('image_delete', '<span class="alert-msg">:message</span>') !!}
41+
<p class="text-info">
42+
<x-icon type="info-circle" /> {{ trans('general.use_cloned_no_image_help') }}
43+
</p>
1844
</div>
1945
</div>
20-
@endif
46+
@endif
2147
@endif
2248
<!-- Image Upload and preview -->
2349

24-
<div class="form-group {{ $errors->has((isset($fieldname) ? $fieldname : 'image')) ? 'has-error' : '' }}">
50+
<div class="form-group {{ $errors->has((isset($fieldname) ? $fieldname : 'image')) ? 'has-error' : '' }}" id="image-upload">
2551
<label class="col-md-3 control-label" for="{{ (isset($fieldname) ? $fieldname : 'image') }}">{{ trans('general.image_upload') }}</label>
2652
<div class="col-md-8">
2753

@@ -31,16 +57,15 @@
3157
{{ trans('button.select_file') }}
3258
<input type="file" name="{{ (isset($fieldname) ? $fieldname : 'image') }}" class="js-uploadFile" id="uploadFile" data-maxsize="{{ Helper::file_upload_max_size() }}" accept="image/gif,image/jpeg,image/webp,image/png,image/svg,image/svg+xml,image/avif" style="display:none; max-width: 90%" aria-label="{{ (isset($fieldname) ? $fieldname : 'image') }}" aria-hidden="true">
3359
</label>
60+
3461
<span class='label label-default' id="uploadFile-info"></span>
3562

3663
<p class="help-block" id="uploadFile-status">{{ trans('general.image_filetypes_help', ['size' => Helper::file_upload_max_size_readable()]) }} {{ $help_text ?? '' }}</p>
3764

38-
39-
4065
{!! $errors->first('image', '<span class="alert-msg" aria-hidden="true">:message</span>') !!}
4166
</div>
42-
<div class="col-md-4 col-md-offset-3" aria-hidden="true">
43-
<img id="uploadFile-imagePreview" style="max-width: 300px; display: none;" alt="{{ trans('general.alt_uploaded_image_thumbnail') }}">
44-
</div>
67+
<div class="col-md-4 col-md-offset-3" aria-hidden="true">
68+
<img id="uploadFile-imagePreview" style="max-width: 300px; display: none;" alt="{{ trans('general.alt_uploaded_image_thumbnail') }}">
69+
</div>
4570
</div>
4671

0 commit comments

Comments
 (0)