Compare commits

...

4139 Commits

Author SHA1 Message Date
snipe
276950072f This may be more work than we want to do here tbh
Signed-off-by: snipe <snipe@snipe.net>
2024-07-18 14:14:40 +01:00
snipe
52344c5574 Better
Signed-off-by: snipe <snipe@snipe.net>
2024-07-18 13:02:22 +01:00
snipe
8cfca8bff7 Ack
Signed-off-by: snipe <snipe@snipe.net>
2024-07-18 12:56:28 +01:00
snipe
f400b38c9c First stab
Signed-off-by: snipe <snipe@snipe.net>
2024-07-18 11:53:30 +01:00
snipe
ee589ca112 Merge pull request #15088 from mauro-miatello/develop
Added EULAs in print user's assets
2024-07-18 09:09:34 +01:00
snipe
1eb16cdb02 Merge pull request #15111 from marcusmoore/fixes/optimize-test
Undo `optimize` command in test after it is completed
2024-07-17 21:03:01 +01:00
Marcus Moore
a56f3f85f8 Clear the config and route caching done by optimize command after test 2024-07-17 12:21:46 -07:00
snipe
239824681d Merge pull request #15075 from akemidx/checkintranslation
FIXED: Missing Translation on a Tooltip
2024-07-17 18:16:02 +01:00
snipe
0ac82fbbe1 Merge pull request #15084 from snipe/fixes_ldap_sync_locale
Fixes #15067 - updated ldap sync locale to use `app()->getLocale()`
2024-07-17 18:15:32 +01:00
snipe
8c5a9fa38f Merge pull request #15089 from snipe/dependabot/github_actions/develop/codacy/codacy-analysis-cli-action-4.4.5
Bump codacy/codacy-analysis-cli-action from 4.4.1 to 4.4.5
2024-07-17 16:47:28 +01:00
snipe
65dcb2a9bd Merge pull request #15085 from snipe/small_tweaks_to_oauth_page
Small layout tweaks to oauth page
2024-07-16 21:36:17 +01:00
snipe
a0d461d3e2 Merge pull request #15099 from snipe/fixes/15094_wrong_translation_string
Fixed #15094 - wrong translation string for model on checkout
2024-07-16 17:23:46 +01:00
snipe
eb9e276ba7 Fixed #15094 - wrong translation string for model on checkout
Signed-off-by: snipe <snipe@snipe.net>
2024-07-16 17:14:13 +01:00
snipe
35160f88e0 Corrected return type
Signed-off-by: snipe <snipe@snipe.net>
2024-07-16 16:09:08 +01:00
dependabot[bot]
0ddb447c4c Bump codacy/codacy-analysis-cli-action from 4.4.1 to 4.4.5
Bumps [codacy/codacy-analysis-cli-action](https://github.com/codacy/codacy-analysis-cli-action) from 4.4.1 to 4.4.5.
- [Release notes](https://github.com/codacy/codacy-analysis-cli-action/releases)
- [Commits](https://github.com/codacy/codacy-analysis-cli-action/compare/v4.4.1...v4.4.5)

---
updated-dependencies:
- dependency-name: codacy/codacy-analysis-cli-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-15 08:39:24 +00:00
MrM
e49c96a35e Added EULAs in print user's assets
Added EULAs when we want to print all assets assigned to a users and ask him/her to sign.
2024-07-14 19:10:33 +02:00
snipe
2d1aeca949 Re-use existing string
Signed-off-by: snipe <snipe@snipe.net>
2024-07-13 18:24:56 +01:00
snipe
e06e4db4b7 Small layout tweaks to oauth page
Signed-off-by: snipe <snipe@snipe.net>
2024-07-13 18:16:03 +01:00
snipe
51242fcbb2 Merge branch 'develop' of https://github.com/snipe/snipe-it into develop 2024-07-13 16:09:03 +01:00
snipe
99be9ddb47 Add @dbakan as a contributor 2024-07-13 16:08:56 +01:00
snipe
be4317361d Merge pull request #15082 from dbakan/fix/optimize-command
Fixed #10224: fix route names for optimize command
2024-07-13 16:08:32 +01:00
Daniel Albertsen
a175b6a38b fix routes and tests 2024-07-13 16:36:14 +02:00
Daniel Albertsen
431da6c903 add test to ensure artisan optimize works 2024-07-13 16:36:14 +02:00
snipe
ab6b8f520e Fixed field name
Signed-off-by: snipe <snipe@snipe.net>
2024-07-13 15:25:37 +01:00
snipe
24e58d1455 Do not update users who already exist since that locale may have been overirrden manually
Signed-off-by: snipe <snipe@snipe.net>
2024-07-13 15:20:04 +01:00
snipe
f91ad6b2db Use app()->getLocale() to determine imported user’s language
Signed-off-by: snipe <snipe@snipe.net>
2024-07-13 15:15:44 +01:00
snipe
eed253bd2f Use app helped instead of facade
Signed-off-by: snipe <snipe@snipe.net>
2024-07-13 15:15:18 +01:00
snipe
b68fcf1de5 Added unaccepted asset test
Signed-off-by: snipe <snipe@snipe.net>
2024-07-12 12:19:40 +01:00
snipe
d21ebc6f0d Fixed return type
Signed-off-by: snipe <snipe@snipe.net>
2024-07-12 11:04:56 +01:00
akemidx
ad818cf886 missing translation 2024-07-11 17:13:47 -04:00
snipe
fb7d533ff7 Merge pull request #15073 from marcusmoore/feature/livewire-url-prefix
Allow setting a prefix for Livewire's update and asset urls
2024-07-11 21:04:50 +01:00
Marcus Moore
9dd3827222 Allow setting a prefix for Livewire's update and asset urls 2024-07-11 12:43:29 -07:00
snipe
5697370dfe Merge pull request #14722 from Godmartinz/unaccepted_reminder_command
Adds a command to resend acceptance emails
2024-07-11 20:37:04 +01:00
snipe
5132aa0254 Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 19:07:30 +01:00
snipe
aebe96913a Add @FlorentDotMe as a contributor 2024-07-11 17:31:20 +01:00
snipe
78d24eb451 Merge pull request #15069 from TelecomsSansFrontieres/fix_print-all-assets
Fixed inconsistent attributes order in Print All Assigned report
2024-07-11 17:30:41 +01:00
snipe
c5c5ac58e5 Merge pull request #15071 from snipe/fixes/small_consumables_optimizations
Small consumables optimizations
2024-07-11 17:27:41 +01:00
snipe
1527679f4b Handle deletions on the observer
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 17:26:43 +01:00
snipe
c2fe3b5459 Use the observer to delete associated files and detach users
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 17:00:38 +01:00
snipe
d4a66f9b6c Use better icon for deleting
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 17:00:12 +01:00
snipe
23f1489b2b Added history tab
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 16:46:49 +01:00
snipe
5108b1f3ed Capture the log meta for what was changed
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 16:35:16 +01:00
snipe
58bc84436c Fixed incorrect jquery validation class
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 16:23:05 +01:00
snipe
2415408a50 Prevent ludicrious amount of min_qty
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 16:22:41 +01:00
snipe
00d7b36c36 Eager load suppliers
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 16:22:22 +01:00
snipe
67d6f7119d Prevent a ludicrous amount of consumables
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 16:22:04 +01:00
snipe
42dbc894e0 Better handle numRemaining for consumables
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 16:21:45 +01:00
snipe
94bfe7d9c8 Require the user exists
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 16:18:42 +01:00
snipe
d9a114090b Added buttons
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 16:18:33 +01:00
snipe
b10441c928 Detach associated pivot records
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 16:01:18 +01:00
snipe
e123eeea9e Added error message if category type is invalid
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 16:00:20 +01:00
snipe
9676d934d2 Drop the with users on the create checkout screen
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 16:00:08 +01:00
snipe
759bb822ff Make sure the user exists
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 15:59:18 +01:00
snipe
abd79219dd Use form request to check for valid category
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 15:26:24 +01:00
snipe
2b5463475c Added test
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 15:25:26 +01:00
snipe
a7a1a377da Added form request for consumables
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 15:25:07 +01:00
snipe
a6b2f5df1d Added tests
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 15:24:56 +01:00
snipe
da2b64c96d Added string
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 15:24:08 +01:00
snipe
9e9b07f10f Removed duplicate status check
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 15:23:59 +01:00
snipe
82743abadc Cleans up the consumables index controller
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 14:15:18 +01:00
snipe
498a443230 Derp
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 12:01:06 +01:00
snipe
34b49ef079 Fixed typo
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 11:59:47 +01:00
Florent Bervas
d9a53460ff Fix design inconsistency between assets and assigned assets in Print All Assigned report 2024-07-11 09:41:58 +00:00
snipe
5364838fc0 Merge branch 'develop' of https://github.com/snipe/snipe-it into develop 2024-07-11 10:08:10 +01:00
snipe
8be44f9cf2 Check for time until depreciated
Signed-off-by: snipe <snipe@snipe.net>
2024-07-11 10:07:58 +01:00
snipe
68136ea217 Merge pull request #15052 from snipe/jerm/handle-windows-ca-jank-in-upgrade-script
upgrade.php: If we're on windows, make sure we can load intermediate certificates
2024-07-11 09:11:37 +01:00
snipe
ec063b4af5 Updated PHP min version
Signed-off-by: snipe <snipe@snipe.net>
2024-07-10 17:07:44 +01:00
snipe
bfa42ff84a Merge pull request #15051 from snipe/jerm/add-upgrade-script-debugging
upgrade.php: More helpful output when we can't read .upgrade_requirements.json
2024-07-10 16:51:30 +01:00
snipe
22aca1af53 Fixed typo
Signed-off-by: snipe <snipe@snipe.net>
2024-07-10 16:12:20 +01:00
snipe
71a5d07698 Fixes #15056 - only try to load avatars if one exists or default is set
Signed-off-by: snipe <snipe@snipe.net>
2024-07-10 08:56:14 +01:00
snipe
fb10c1439a Merge pull request #15057 from spencerrlongg/bug/sc-23212-2
Fixes Potential Exception
2024-07-10 08:27:59 +01:00
snipe
c58c592fb0 Merge pull request #15059 from Godmartinz/export_options
Fixed missing print user assigned filter
2024-07-10 08:25:24 +01:00
spencerrlongg
6932a63217 make some naming a little clearer 2024-07-09 16:32:44 -05:00
snipe
1a1ccd6bdc Type constrains one more time - who thought this was a good idea?
Signed-off-by: snipe <snipe@snipe.net>
2024-07-09 19:50:58 +01:00
Godfrey M
624632d0ca removed push and endpush 2024-07-09 11:41:31 -07:00
spencerrlongg
66255291da test working 2024-07-09 11:13:06 -05:00
spencerrlongg
33b2c7b78a push so i can do something else 2024-07-09 10:35:16 -05:00
snipe
34e1ff88db Added StreamedResponse
Signed-off-by: snipe <snipe@snipe.net>
2024-07-09 13:41:50 +01:00
snipe
f4ffbcf76e Fixed wonky layout on accessory files
Signed-off-by: snipe <snipe@snipe.net>
2024-07-09 13:38:50 +01:00
snipe
8a547dab20 Fixed type constraint
Signed-off-by: snipe <snipe@snipe.net>
2024-07-09 13:35:57 +01:00
snipe
14fa5d778d Merge pull request #15055 from snipe/more_translations
Fixed API key missing translations
2024-07-09 13:19:46 +01:00
snipe
5597992d63 Fixed API key missing translations
Signed-off-by: snipe <snipe@snipe.net>
2024-07-09 13:17:46 +01:00
snipe
595408d21f On more binaryfile response
Signed-off-by: snipe <snipe@snipe.net>
2024-07-09 11:54:07 +01:00
snipe
491a0f3959 One more typehint
Signed-off-by: snipe <snipe@snipe.net>
2024-07-09 11:47:53 +01:00
Jeremy Price
c8fe002688 upgrade.php: If we're on windows, make sure we can load intermediate certificates
According to https://github.com/curl/curl/issues/12155 and 2d6333101a

Some corporate Windows proxy (mis)configurations don't pass along
intermediate certificates in their TLS handshakes, breaking lots of
things that don't work around it.

This creates a problem in our curl calls when checking for
.upgrade_requirements.json, and seems to be the source of errors for a
few of our users: https://github.com/snipe/snipe-it/issues/14826#issuecomment-2197611342

In this change, we detect when running on windows environments and load
the curl option that works around this.
2024-07-08 22:13:14 -07:00
Jeremy Price
25fabcc1be More helpful output when we can't read .upgrade_requirements.json
Handle json decode errors and display the raw output in such cases, to
better understand what's happening and help debugging
2024-07-08 22:12:09 -07:00
snipe
09cc9b92d1 Fixed #15050 - erroneous deleted remark
Signed-off-by: snipe <snipe@snipe.net>
2024-07-08 22:13:07 +01:00
snipe
bf060d43a7 Fixed typehint on assets controller
Signed-off-by: snipe <snipe@snipe.net>
2024-07-08 22:02:11 +01:00
snipe
9b838cedd1 Fixed typehint on asset model files
Signed-off-by: snipe <snipe@snipe.net>
2024-07-08 22:00:45 +01:00
snipe
abf194fbcf Added default avatar into repo
Signed-off-by: snipe <snipe@snipe.net>
2024-07-08 21:38:25 +01:00
snipe
211f98e971 Revert
Signed-off-by: snipe <snipe@snipe.net>
2024-07-08 21:38:03 +01:00
snipe
7f1931af9c Grr
Signed-off-by: snipe <snipe@snipe.net>
2024-07-08 21:37:17 +01:00
snipe
7dcb45d7f3 Skip default.png as default
Signed-off-by: snipe <snipe@snipe.net>
2024-07-08 21:33:56 +01:00
spencerrlongg
8650923b01 new branch cuz test merge 2024-07-08 12:55:59 -05:00
snipe
9c304f238a Merge pull request #15029 from snipe/fixes/small_docblock_fixes
General cleanup - Docblock fixes, adding type hinting, added tests, added asset model form validator
2024-07-08 17:43:50 +01:00
snipe
202f5077de Removed return
Signed-off-by: snipe <snipe@snipe.net>
2024-07-08 17:41:20 +01:00
snipe
4c19b4d831 Added aria-hidden="true" to error icon for accessibility
Signed-off-by: snipe <snipe@snipe.net>
2024-07-08 17:39:38 +01:00
snipe
f3bf74a540 Updated language files
Signed-off-by: snipe <snipe@snipe.net>
2024-07-08 15:51:19 +01:00
snipe
de6a230838 Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2024-07-08 15:35:35 +01:00
snipe
cf92dde1ca Merge pull request #15046 from snipe/localize_bootstrap_table
Added localization for bootstrap-tables
2024-07-08 15:20:39 +01:00
snipe
86c0a3ecad Added localization for bootstrap-tables
Signed-off-by: snipe <snipe@snipe.net>
2024-07-08 15:12:37 +01:00
snipe
3b3a7e2757 Added more PHP in pgsql tests
Signed-off-by: snipe <snipe@snipe.net>
2024-07-08 14:58:26 +01:00
snipe
c72b36b84a Upgraded acorn from 8.11.3 to 8.12.0
Signed-off-by: snipe <snipe@snipe.net>
2024-07-08 14:40:26 +01:00
snipe
ee1afc63f9 Merge pull request #15045 from snipe/snyk/upgrade-jquery_validation
Snyk - Updated jquery validation
2024-07-08 14:38:14 +01:00
snipe
8438652e7d Updated jquery validation
Signed-off-by: snipe <snipe@snipe.net>
2024-07-08 14:30:06 +01:00
snipe
ac9df2fc08 Merge pull request #15043 from snipe/fixes/custom_fields_on_audit
Fixed #15037 - Removed custom fieldsets on auditing - it’s not used (yet)
2024-07-08 13:20:59 +01:00
snipe
eba24b9242 Removed custom fieldsets on auditing - it’s not used
Signed-off-by: snipe <snipe@snipe.net>
2024-07-08 13:19:05 +01:00
snipe
8c6ecd35ec Added more basic tests
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 11:56:24 +01:00
snipe
e98823f7fa Added 403 to sad panda page
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 11:54:49 +01:00
snipe
a8ddb2f44a Added non-circular tests
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 11:29:30 +01:00
snipe
f32bf35c22 Fixed another rename :-/
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 10:50:03 +01:00
snipe
978a0272a5 Sigh. Renamed again
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 08:37:31 +01:00
snipe
283f24b213 Derp. Renamed file
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 08:34:17 +01:00
snipe
97775fb790 Location test additions
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 08:29:00 +01:00
snipe
7455bf329d Added more locations tests
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 08:21:31 +01:00
snipe
24ad74f136 Updated factories
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 08:21:18 +01:00
snipe
16d65631aa Removed duplicate tests
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 07:54:22 +01:00
snipe
0a7e053985 Added basic Department UI tests
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 07:53:02 +01:00
snipe
1d65781d8d More type-hinting
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 07:07:20 +01:00
snipe
0d6fd2643d More tweaks to the form request
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 05:59:39 +01:00
snipe
b3cc7b1578 More tests
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 05:59:28 +01:00
snipe
2a796fdc09 Format error
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 03:23:48 +01:00
snipe
a0914ccb28 Fleshed out tests
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 03:22:56 +01:00
snipe
efb9d107cf Removed debugging
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 03:22:03 +01:00
snipe
34bde52f74 Fixed typos
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 03:21:34 +01:00
snipe
75da626c85 Check for category ID
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 03:21:24 +01:00
snipe
1d45e0df79 Added model create test
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 03:20:54 +01:00
snipe
5ebcc3b1a0 More type hinting
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 02:36:55 +01:00
snipe
6da6411f3b Added location API index test
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 01:46:36 +01:00
snipe
4089b4cd68 Added category tests
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 01:46:09 +01:00
snipe
96d1aea54a More cleanup
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 00:54:50 +01:00
snipe
8baef8d7c5 Derp. Fixed typo
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 00:26:28 +01:00
snipe
7215746d7a Prevent users from editing category types if there are still items
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 00:23:02 +01:00
snipe
6761ff44cc Removed parens
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 00:22:46 +01:00
snipe
1f28bf14c1 Added category tests
Signed-off-by: snipe <snipe@snipe.net>
2024-07-05 00:21:58 +01:00
snipe
d3b62aa918 Few more
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 22:52:49 +01:00
snipe
a1eafc108d Moar typehinting
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 22:37:58 +01:00
snipe
7330bf5832 Check for invalid
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 21:52:47 +01:00
snipe
d834ef5104 Updated string
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 21:52:37 +01:00
snipe
ef56f599d2 Use asset model request
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 21:52:29 +01:00
snipe
0f43b3f8f9 Added another test
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 21:52:16 +01:00
snipe
c570759370 Fixed tests
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 21:14:58 +01:00
snipe
066ec8e26e Added (failing) tests
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 20:50:18 +01:00
snipe
cc6f1cd585 Added asset model request :(
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 20:50:11 +01:00
snipe
ae9085b11f Modernize use statements, switch to auth()
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 20:49:22 +01:00
snipe
e98284fff5 Modernized helpers and use statements
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 20:48:35 +01:00
snipe
89f01d75d7 Updated test names, added tests
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 19:59:10 +01:00
snipe
edd61705dc Merge pull request #15027 from snipe/feature/sc-26112/allow_default_avatar
Added #15015 - ability for admins to select default avatar
2024-07-04 17:10:10 +01:00
snipe
3f20e29901 Moved gthe settings for remote loading to the branding section
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 16:55:47 +01:00
snipe
36ae162626 Changed my mind :)
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 16:48:05 +01:00
snipe
00f7cb9dbb Reverse the order for default gravatar
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 16:46:12 +01:00
snipe
1ca3dc26eb Removed extra debugging
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 16:36:48 +01:00
snipe
2f3be267b3 Added some logic around deleting images
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 16:33:22 +01:00
snipe
5b8f6910fb Marked tests as incomplete :(
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 16:33:08 +01:00
snipe
9fe26ba814 Reverted the validation - might have an impact on quickstart setup
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 13:25:39 +01:00
snipe
5e97ed1c7e Added migration
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 13:24:11 +01:00
snipe
947fb7af7a Added tests
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 13:24:03 +01:00
snipe
44bcc157e5 Updated icon
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 13:23:46 +01:00
snipe
278bf3da13 Updated language
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 13:23:38 +01:00
snipe
446bc81d3a Updated presenter to use new avatar
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 13:23:31 +01:00
snipe
9527aac242 Make site name required at the model
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 13:23:17 +01:00
snipe
c57f1f9d7d Use null coalescence
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 13:22:56 +01:00
snipe
e372527d13 Added default_avatar to settings
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 13:22:36 +01:00
snipe
96be1e1275 Removed duplicate locale directive
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 02:14:10 +01:00
snipe
8ce17d0585 Merge pull request #15025 from snipe/security/upgrade_webpack
Upgrade webpack from 5.91.0 to 5.92.0 #15008
2024-07-04 01:08:17 +01:00
snipe
6af1eaa4e4 Updated webpack to 5.92
Signed-off-by: snipe <snipe@snipe.net>
2024-07-04 01:07:26 +01:00
snipe
da01487301 Merge pull request #15023 from snipe/improvements/optimize_queries_for_user_bulk_actions
Added files column to bulk user delete, optimized queries
2024-07-03 23:45:09 +01:00
snipe
708d7b5fc5 Use icons for consistency
Signed-off-by: snipe <snipe@snipe.net>
2024-07-03 23:43:44 +01:00
snipe
62b5a159a9 Added files column
Signed-off-by: snipe <snipe@snipe.net>
2024-07-03 23:31:09 +01:00
snipe
a6d04509a5 Merge pull request #15016 from snipe/improved_user_merge
Fixed #15005 - Improvements  on user merge
2024-07-03 23:19:50 +01:00
snipe
0071596274 Added upload count
Signed-off-by: snipe <snipe@snipe.net>
2024-07-03 23:18:43 +01:00
snipe
59f66051f8 More eager loading
Signed-off-by: snipe <snipe@snipe.net>
2024-07-03 23:18:37 +01:00
snipe
9f1e59cf78 Marcus’ nitpicks
Signed-off-by: snipe <snipe@snipe.net>
2024-07-03 23:01:41 +01:00
snipe
f1f68b8ef6 Merge pull request #15022 from spencerrlongg/livewire-delete-button
Resolved Potential Issue when Deleting Personal Access Tokens
2024-07-03 22:24:25 +01:00
snipe
f22c3cdda9 Merge pull request #15021 from snipe/fixes/removed_non_counts
Removed non-counts from allowed array
2024-07-03 22:21:17 +01:00
snipe
5e15cc3bbe Added markIncompleteIfSqlite() method
Signed-off-by: snipe <snipe@snipe.net>
2024-07-03 22:18:31 +01:00
spencerrlongg
a6690493b0 resolved 2024-07-03 16:12:55 -05:00
snipe
17a6335d13 Added test
Signed-off-by: snipe <snipe@snipe.net>
2024-07-03 22:12:06 +01:00
akemidx
ca57f6de85 adding in item=>asset, missed in first commit 2024-07-03 17:07:50 -04:00
snipe
aefaabdb1a Removed non-counts from allowed array
Signed-off-by: snipe <snipe@snipe.net>
2024-07-03 21:40:43 +01:00
snipe
9211c8d3b1 Fixed test
Signed-off-by: snipe <snipe@snipe.net>
2024-07-03 20:57:21 +01:00
snipe
eff1980df5 Added console test
Signed-off-by: snipe <snipe@snipe.net>
2024-07-03 20:52:22 +01:00
snipe
1553ba5630 Added null coalescence for admin id in case via cli
Signed-off-by: snipe <snipe@snipe.net>
2024-07-03 20:52:12 +01:00
snipe
ec24120d2a Allow admin to be nullable (for cli)
Signed-off-by: snipe <snipe@snipe.net>
2024-07-03 20:50:35 +01:00
snipe
50df750202 Add merge event
Signed-off-by: snipe <snipe@snipe.net>
2024-07-03 20:50:23 +01:00
snipe
dab4aced48 Renamed test
Signed-off-by: snipe <snipe@snipe.net>
2024-07-03 20:50:09 +01:00
snipe
1774952312 Added additional assertions
Signed-off-by: snipe <snipe@snipe.net>
2024-07-03 20:19:12 +01:00
snipe
d66d6e70a6 Added checkedOutToUser factory for consumables
Signed-off-by: snipe <snipe@snipe.net>
2024-07-03 20:18:53 +01:00
snipe
4635e9269d Added user update log factory
Signed-off-by: snipe <snipe@snipe.net>
2024-07-03 20:18:34 +01:00
snipe
574867536d Standardize query for merging
Signed-off-by: snipe <snipe@snipe.net>
2024-07-03 19:41:34 +01:00
snipe
5488a4d118 One more test
Signed-off-by: snipe <snipe@snipe.net>
2024-07-03 14:36:27 +01:00
snipe
e34f3c7c2c Fixed typo
Signed-off-by: snipe <snipe@snipe.net>
2024-07-03 14:32:41 +01:00
snipe
ceaff7b645 Added tests
Signed-off-by: snipe <snipe@snipe.net>
2024-07-03 14:30:11 +01:00
snipe
d27a025347 Added factories
Signed-off-by: snipe <snipe@snipe.net>
2024-07-03 14:30:06 +01:00
snipe
2b2853a183 Added acceptance model
Signed-off-by: snipe <snipe@snipe.net>
2024-07-03 14:29:58 +01:00
snipe
a25263f868 Transfer files and acceptances on merge
Signed-off-by: snipe <snipe@snipe.net>
2024-07-03 14:29:49 +01:00
snipe
4b9727067b Merge pull request #15010 from snipe/fixes/translation_strings
Added missing translations
2024-07-03 12:43:50 +01:00
snipe
00fc392a12 Added missing traslations
Signed-off-by: snipe <snipe@snipe.net>
2024-07-03 12:41:04 +01:00
snipe
1da90fe1ec Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2024-07-02 09:37:05 +01:00
snipe
25ba50d6f7 Merge pull request #14870 from Galaxy102/feature/rotate-labels
Add Label Template: Use with endless 62mm Brother printer rolls
2024-07-02 08:45:42 +01:00
snipe
f22e99aec8 Merge pull request #14983 from snipe/fixes/use_more_modern_request_syntax_in_blades
Use more modern reference for input text
2024-07-02 08:43:34 +01:00
snipe
f027fd5f21 Merge pull request #14986 from marcusmoore/bug/sc-25926
Fixed extension requirement checking in upgrade script
2024-07-02 08:42:45 +01:00
snipe
37a038c24f Merge pull request #15001 from marcusmoore/features/link-user-table-counts-to-section
Added links on user table to tabs on show user page
2024-07-02 08:37:05 +01:00
Marcus Moore
3a8f825de5 Link user table counts to section in user show 2024-07-01 14:06:05 -07:00
snipe
d2df83cf2f Merge pull request #14999 from marcusmoore/fixes/hide-edit-profile-button
Removed "Edit Your Profile" button from View Assets page if user is not able to edit their profile
2024-07-01 18:15:47 +01:00
Marcus Moore
d481850d4c Add @can around Edit Your Profile button on view assets page 2024-07-01 10:11:27 -07:00
Konstantin Köhring
6c55e2bd9d Add a Brother compatible 62mm wide label.
Tested with QL-600. Set print mode to landscape.
2024-06-28 09:49:53 +02:00
Konstantin Köhring
2fd357c346 Add rotation attribute to Label class to allow rotation of the generated label PDF.
This is necessary when printing labels with width = label width.
2024-06-28 09:49:53 +02:00
Marcus Moore
0a5e58201a Correctly account for "or" dependent extensions in upgrade script 2024-06-27 12:38:50 -07:00
snipe
d687b20467 Use more modern reference for input text
Signed-off-by: snipe <snipe@snipe.net>
2024-06-27 15:05:47 +01:00
snipe
7dbcedad40 Merge pull request #14981 from uberbrady/fix_backup_translations
Fixed #14976, #14975, #14973 - Translation strings aren't always working
2024-06-27 14:36:52 +01:00
snipe
b6e8d28ed3 Merge pull request #14982 from snipe/fixes/check_for_user_on_patch_api
Check that the user exists before trying to fill the request
2024-06-27 14:36:21 +01:00
snipe
85ce47f5bb Updated tests
Signed-off-by: snipe <snipe@snipe.net>
2024-06-27 14:21:27 +01:00
snipe
55c98cc27a Check that the user exists before trying to fill the request
Signed-off-by: snipe <snipe@snipe.net>
2024-06-27 14:05:28 +01:00
snipe
422f3ec81e Updated assets
Signed-off-by: snipe <snipe@snipe.net>
2024-06-27 13:53:38 +01:00
snipe
54fb91c03b Merge pull request #14831 from marcusmoore/chore/sc-23725/livewire3
Updated Livewire to v3
2024-06-27 13:21:52 +01:00
Brady Wetherington
6df9742664 Built a workaround for backup notification translations 2024-06-27 13:17:16 +01:00
snipe
f23a221750 Merge pull request #14942 from snipe/updates/start_moving_from_collective_forms
WIP - First start at switching to regular html labels
2024-06-27 13:12:29 +01:00
snipe
4637accb51 Built assets, bumped version
Signed-off-by: snipe <snipe@snipe.net>
2024-06-26 13:35:24 +01:00
snipe
74f067d893 Merge pull request #14974 from uberbrady/improve_saml_behind_proxy
Fixed #14895 and #14919 - set SAML baseurl to a sensible default for docker users and users behind a reverse proxy
2024-06-26 13:34:18 +01:00
snipe
43773954cd Merge pull request #14966 from Godmartinz/css_issue
Fixed importer table background color
2024-06-26 13:33:14 +01:00
Brady Wetherington
30cafef9f2 Add a reasonable-looking SAML baseurl, mosty for users behind proxies 2024-06-26 13:25:11 +01:00
snipe
251f2d82b3 Updated language strings
Signed-off-by: snipe <snipe@snipe.net>
2024-06-26 12:53:03 +01:00
snipe
e905550778 Merge pull request #14971 from snipe/fixes/updated_translation_string
Fixes #14968 - translate forbidden page
2024-06-26 11:25:51 +01:00
snipe
adee99db34 Fixes #14968 - translate forbidden page
Signed-off-by: snipe <snipe@snipe.net>
2024-06-26 11:21:56 +01:00
Godfrey M
eda2eb2283 fixes all dark modes 2024-06-25 10:24:35 -07:00
Godfrey M
a7123a04ba fixes importer background color 2024-06-25 10:19:18 -07:00
Marcus Moore
8a562f1d15 Bump Livewire to 3.5.1 2024-06-25 10:16:44 -07:00
Marcus Moore
d4861a74df Merge branch 'develop' into chore/sc-23725/livewire3
# Conflicts:
#	composer.lock
2024-06-25 10:15:50 -07:00
snipe
8971cc4b8b Merge pull request #14963 from snipe/fixes/updated_translation_string
Added avif to translation string
2024-06-25 13:45:10 +01:00
snipe
bca6dd41d2 Added avif to translation string
Signed-off-by: snipe <snipe@snipe.net>
2024-06-25 13:39:36 +01:00
snipe
221c4eeb0c Dev assets
Signed-off-by: snipe <snipe@snipe.net>
2024-06-24 21:59:27 +01:00
snipe
bbb1fbfbe8 Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2024-06-24 21:59:09 +01:00
snipe
5a874a90ac Merge pull request #14951 from snipe/features/disallow_profile_editing
Added ability to disallow profile editing
2024-06-24 14:11:48 +01:00
snipe
1c14c2fdef Added gates to controller
Signed-off-by: snipe <snipe@snipe.net>
2024-06-24 14:05:21 +01:00
snipe
73a038afd4 Save new setting
Signed-off-by: snipe <snipe@snipe.net>
2024-06-24 14:03:01 +01:00
snipe
4d55765e28 Added checkbox to settings
Signed-off-by: snipe <snipe@snipe.net>
2024-06-24 14:02:53 +01:00
snipe
2b43f3cb84 Added gate to auth service provider
Signed-off-by: snipe <snipe@snipe.net>
2024-06-24 14:02:40 +01:00
snipe
52c4885335 Added method for checking if the user can edit their own profile
Signed-off-by: snipe <snipe@snipe.net>
2024-06-24 14:02:17 +01:00
snipe
aa5fe52e89 Added gate in blade
Signed-off-by: snipe <snipe@snipe.net>
2024-06-24 14:01:56 +01:00
snipe
ce107dd688 New strings
Signed-off-by: snipe <snipe@snipe.net>
2024-06-24 14:01:39 +01:00
snipe
72affd7a5b Added migration
Signed-off-by: snipe <snipe@snipe.net>
2024-06-24 14:01:31 +01:00
snipe
ba4c51dd68 Removed duplicate key
Signed-off-by: snipe <snipe@snipe.net>
2024-06-24 14:01:25 +01:00
snipe
294fb1f774 Merge pull request #14925 from snipe/fixes/added_2fa_string
Additional translation strings
2024-06-24 12:11:45 +01:00
snipe
a846afe733 Merge pull request #14950 from snipe/localization/updated_strings_20240621
Updated translations
2024-06-24 11:44:06 +01:00
snipe
5fb3cea0bb Updated translations
Signed-off-by: snipe <snipe@snipe.net>
2024-06-24 11:41:20 +01:00
snipe
4ae89c23cd Merge pull request #14947 from snipe/dependabot/github_actions/develop/docker/build-push-action-6
Bump docker/build-push-action from 5 to 6
2024-06-24 11:27:04 +01:00
snipe
3d32fe662b Merge pull request #14949 from snipe/fixes/depreciation_format
Check that there is a depreciation date before formatting
2024-06-24 11:11:43 +01:00
snipe
468674a517 Check that there is a depreciation date before formatting
Signed-off-by: snipe <snipe@snipe.net>
2024-06-24 11:07:41 +01:00
dependabot[bot]
ebe4354a85 Bump docker/build-push-action from 5 to 6
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 5 to 6.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v5...v6)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-24 08:14:34 +00:00
snipe
f47bc5ea7d Updated hardware checkin
Signed-off-by: snipe <snipe@snipe.net>
2024-06-23 19:40:52 +01:00
snipe
427615f627 Fiest start at switching to regular html labels
Signed-off-by: snipe <snipe@snipe.net>
2024-06-23 18:24:23 +01:00
snipe
829b560794 Merge pull request #14941 from snipe/updates/updated_phpunit
Updated PHPunit
2024-06-23 17:43:29 +01:00
snipe
f97a15c5c3 Updated PHPunit
Signed-off-by: snipe <snipe@snipe.net>
2024-06-23 17:33:01 +01:00
snipe
25fcf523e3 Merge pull request #14937 from snipe/fixes/user_improvements
Fixed #14935 - improvements and more tests around user deletion
2024-06-22 21:41:07 +01:00
snipe
c1be94c4ad Added another base test
Signed-off-by: snipe <snipe@snipe.net>
2024-06-22 20:37:49 +01:00
snipe
3a05d72124 Based restore API test
Signed-off-by: snipe <snipe@snipe.net>
2024-06-22 20:35:40 +01:00
snipe
7ec44e46ce Added ability check for restoring users at all
Signed-off-by: snipe <snipe@snipe.net>
2024-06-22 20:35:28 +01:00
snipe
060b17df01 Pulled duplicated test
Signed-off-by: snipe <snipe@snipe.net>
2024-06-22 20:34:49 +01:00
snipe
74c78d7577 Added back in commented out test
Signed-off-by: snipe <snipe@snipe.net>
2024-06-22 20:09:04 +01:00
snipe
1ef0c1adac Fixed tests! And added more!!
Signed-off-by: snipe <snipe@snipe.net>
2024-06-22 20:07:46 +01:00
snipe
c2e649e2bf Fixed small permissions issue
Signed-off-by: snipe <snipe@snipe.net>
2024-06-22 20:07:37 +01:00
snipe
196db9718e Use class name instead
Signed-off-by: snipe <snipe@snipe.net>
2024-06-22 19:55:58 +01:00
snipe
9f5b264e04 Normalize the tests between UI and API
Signed-off-by: snipe <snipe@snipe.net>
2024-06-22 19:51:56 +01:00
snipe
3825f5fb61 Added more permissions tests to user delete UI
Signed-off-by: snipe <snipe@snipe.net>
2024-06-22 19:47:59 +01:00
snipe
e60dbc883c Removed test code
Signed-off-by: snipe <snipe@snipe.net>
2024-06-22 19:42:34 +01:00
snipe
bbbfa91db9 Fixed wonky rule
Signed-off-by: snipe <snipe@snipe.net>
2024-06-22 19:40:26 +01:00
snipe
5ec8e2da66 Breaking tests :(
Signed-off-by: snipe <snipe@snipe.net>
2024-06-22 19:33:44 +01:00
snipe
9e59bd5687 Cleaned up controller code a bit
Signed-off-by: snipe <snipe@snipe.net>
2024-06-22 19:33:36 +01:00
snipe
1d26ccac4e Check for the additional auth for that user
Signed-off-by: snipe <snipe@snipe.net>
2024-06-22 19:33:06 +01:00
snipe
0e2526f627 Removed comment
Signed-off-by: snipe <snipe@snipe.net>
2024-06-22 19:32:49 +01:00
snipe
dd9e9c7a6d Fixed return types
Signed-off-by: snipe <snipe@snipe.net>
2024-06-22 18:49:49 +01:00
snipe
e19922abd0 Cleaned up UI controller
Signed-off-by: snipe <snipe@snipe.net>
2024-06-22 18:49:35 +01:00
snipe
d27bde6047 Added deleted factory for tests
Signed-off-by: snipe <snipe@snipe.net>
2024-06-22 18:36:24 +01:00
snipe
61f76dedc6 Added test
Signed-off-by: snipe <snipe@snipe.net>
2024-06-22 18:36:08 +01:00
snipe
06737f45ad Added test
Signed-off-by: snipe <snipe@snipe.net>
2024-06-22 18:36:02 +01:00
snipe
65e8765bdd Added tests
Signed-off-by: snipe <snipe@snipe.net>
2024-06-22 17:45:42 +01:00
snipe
c6a0212384 Merge remote-tracking branch 'origin/master' into develop 2024-06-22 17:33:12 +01:00
snipe
e03614d91b Added withtrashed back in
Signed-off-by: snipe <snipe@snipe.net>
2024-06-22 16:40:32 +01:00
snipe
b82770d0a8 One more small fix
Signed-off-by: snipe <snipe@snipe.net>
2024-06-22 16:38:29 +01:00
snipe
55e1326164 Fixed #14935 - user does not exist
Signed-off-by: snipe <snipe@snipe.net>
2024-06-22 16:24:18 +01:00
snipe
b0aff68c8b Merge pull request #14934 from snipe/tests/added_workflow_for_php_8_3
Added php 8.3 test
2024-06-21 22:04:05 +01:00
snipe
6a99855c8c Added php 8.3 test
Signed-off-by: snipe <snipe@snipe.net>
2024-06-21 21:47:40 +01:00
snipe
665aa6eb23 Merge pull request #14924 from snipe/fixes/possible_nicer_handling_for_defaultStatusLabel
Possible fix for #14915 - error on import when status label is not provided and no deployable statuses can be found
2024-06-21 21:37:22 +01:00
snipe
42caacbaf9 Merge pull request #14932 from snipe/fixes/small_deprecations
Fixed small deprecation warnings for PHP8.2
2024-06-21 21:26:16 +01:00
snipe
3531256c3f Fixed deprecations
Signed-off-by: snipe <snipe@snipe.net>
2024-06-21 21:06:43 +01:00
snipe
9a0db72eb4 More strings
Signed-off-by: snipe <snipe@snipe.net>
2024-06-20 15:40:38 +01:00
snipe
e11a42cf68 Re-use login string
Signed-off-by: snipe <snipe@snipe.net>
2024-06-20 15:32:00 +01:00
snipe
114769c2d9 Made requestable items more generic in translations
Signed-off-by: snipe <snipe@snipe.net>
2024-06-20 15:26:45 +01:00
snipe
9594596b8a Fixed another hard-coded string
Signed-off-by: snipe <snipe@snipe.net>
2024-06-20 15:22:27 +01:00
snipe
69cf697aa3 Added 2fa translation string
Signed-off-by: snipe <snipe@snipe.net>
2024-06-20 15:20:52 +01:00
snipe
45dbe5cb77 Return the id, not the entire status label
Signed-off-by: snipe <snipe@snipe.net>
2024-06-20 15:05:38 +01:00
snipe
a1ff35f6ce Possible fix for #14915
Signed-off-by: snipe <snipe@snipe.net>
2024-06-20 14:47:46 +01:00
snipe
077a6949e2 docs: add @Tyree as a contributor 2024-06-20 14:42:19 +01:00
snipe
44022f07ca docs: update @bryanlopezinc as a contributor 2024-06-20 14:41:22 +01:00
snipe
30c1e1e86a Merge remote-tracking branch 'origin/develop' 2024-06-20 14:32:46 +01:00
snipe
9a90813877 Merge pull request #14923 from snipe/localizations/updated_strings
Updated language strings
2024-06-20 14:29:13 +01:00
snipe
1113218c6c Updated strings
Signed-off-by: snipe <snipe@snipe.net>
2024-06-20 14:23:15 +01:00
snipe
2556c80250 Merge pull request #14922 from snipe/fixes/incorrect_translation_path
Fixed incorrect translation path
2024-06-20 14:10:32 +01:00
snipe
8f8a5c639b Updated profile translation string path
Signed-off-by: snipe <snipe@snipe.net>
2024-06-20 14:09:25 +01:00
snipe
9e9c37c1e8 Fixed weird linebreaks
Signed-off-by: snipe <snipe@snipe.net>
2024-06-20 14:09:11 +01:00
snipe
6cbdbcb1f1 Merge pull request #14791 from Godmartinz/label-option-limit
Added some  style changes in label field selector for the `DefaultLabel` template
2024-06-20 13:51:49 +01:00
snipe
c8835bf5db Merge remote-tracking branch 'origin/develop' 2024-06-20 13:40:37 +01:00
snipe
6dfedac7a7 Merge pull request #14912 from bryanlopezinc/addIsWritableTest
Add storage path permissions test
2024-06-20 13:38:56 +01:00
snipe
83794eaf33 Merge pull request #14921 from snipe/fixes/14918_added_lastname_dot_firstname
Added lastname.firstname as email format
2024-06-20 13:38:30 +01:00
snipe
bd1f43f9ee Added lastname.firstname as email format
Signed-off-by: snipe <snipe@snipe.net>
2024-06-20 13:36:48 +01:00
snipe
66ffe21ce2 Merge remote-tracking branch 'origin/develop' 2024-06-20 13:09:54 +01:00
snipe
f2e86b7d30 Merge pull request #14920 from snipe/fixes/backup_notifications
Fixed backup notification translations
2024-06-20 13:09:26 +01:00
snipe
5251e6787d Use two-letter fallback code
Ugh, I hate this

Signed-off-by: snipe <snipe@snipe.net>
2024-06-20 12:58:00 +01:00
snipe
856aee0a72 Updated laravel-backup
Signed-off-by: snipe <snipe@snipe.net>
2024-06-20 12:57:35 +01:00
snipe
6b4c71f966 Updated config
Signed-off-by: snipe <snipe@snipe.net>
2024-06-20 12:57:25 +01:00
snipe
dd6d040da5 Added translations
Signed-off-by: snipe <snipe@snipe.net>
2024-06-20 12:56:43 +01:00
bryanlopezinc
203b60383f Added storage path permissions test for SettingsController@getSetupIndex 2024-06-19 17:46:59 +01:00
snipe
61ced0b221 Merge remote-tracking branch 'origin/develop' 2024-06-19 11:41:11 +01:00
snipe
ae7675fee0 Added audit date validation back in
Signed-off-by: snipe <snipe@snipe.net>
2024-06-19 11:37:15 +01:00
snipe
66ed26fbf9 Merge remote-tracking branch 'origin/develop' 2024-06-19 11:13:47 +01:00
snipe
98662c2a77 Merge pull request #14908 from snipe/fixes/importer_audit_date
Fixes/importer audit date
2024-06-19 11:12:12 +01:00
snipe
7099358985 Added accessor/mutator
Signed-off-by: snipe <snipe@snipe.net>
2024-06-19 11:11:50 +01:00
snipe
9a706b3e3e Removed datetime validation
Signed-off-by: snipe <snipe@snipe.net>
2024-06-19 11:05:31 +01:00
snipe
71c9b03779 Fixed incorrect field name
Signed-off-by: snipe <snipe@snipe.net>
2024-06-19 11:05:22 +01:00
snipe
dc7b9315b5 Merge remote-tracking branch 'origin/develop' 2024-06-19 10:35:54 +01:00
snipe
6c17b141db Removed duplicate locations_id search
Signed-off-by: snipe <snipe@snipe.net>
2024-06-19 10:35:21 +01:00
snipe
5d2cca855e Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
2024-06-19 10:31:04 +01:00
snipe
61e10be04d Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2024-06-19 10:29:50 +01:00
snipe
20d5587851 Merge remote-tracking branch 'origin/develop' 2024-06-19 10:23:18 +01:00
snipe
d8eccf03f1 Merge pull request #14896 from snipe/fixes/tls_loading
Possible fix for proxy/reverse proxy
2024-06-19 10:22:36 +01:00
snipe
6e40b58dc5 Merge remote-tracking branch 'origin/develop' 2024-06-19 01:21:52 +01:00
Marcus Moore
30dd8bcf2b Update Livewire 2024-06-18 15:10:59 -07:00
Marcus Moore
f0a11be0b8 Merge branch 'develop' into chore/sc-23725/livewire3
# Conflicts:
#	composer.lock
2024-06-18 15:10:46 -07:00
snipe
b8882fa00e Merge pull request #14900 from marcusmoore/fixes/81-install
Fixed unable to install on PHP 8.1
2024-06-18 21:53:30 +01:00
Marcus Moore
af337b7018 Move debugbar back to dev dependencies but without updating other packages 2024-06-18 09:46:08 -07:00
Marcus Moore
f60267d208 Revert "Reverted debugbar back into require vs require-dev"
This reverts commit ce338c632d.
2024-06-18 09:42:21 -07:00
snipe
a0c844f4f6 Merge remote-tracking branch 'origin/develop' 2024-06-18 16:12:20 +01:00
snipe
7b84b92e72 Merge pull request #14899 from snipe/fixes/revert_debugbar_dev
Fixed #14898 - (regression) Reverted debugbar back into require vs require-dev
2024-06-18 16:09:51 +01:00
snipe
ce338c632d Reverted debugbar back into require vs require-dev
Signed-off-by: snipe <snipe@snipe.net>
2024-06-18 16:06:38 +01:00
snipe
d9f70c16f7 Possible fix proxy/reverse proxy
Signed-off-by: snipe <snipe@snipe.net>
2024-06-18 14:44:35 +01:00
snipe
d0299de898 Merge remote-tracking branch 'origin/develop' 2024-06-18 11:25:55 +01:00
snipe
9380c9ec81 Merge pull request #14894 from snipe/fixes/14882_archived_scoping_on_models
Fixed #14882 - Properly scope archived based on settings
2024-06-18 11:24:55 +01:00
snipe
941582ac2a Properly scope archived based on settings
Signed-off-by: snipe <snipe@snipe.net>
2024-06-18 10:27:11 +01:00
snipe
04560b4475 Merge remote-tracking branch 'origin/develop' 2024-06-18 10:13:57 +01:00
snipe
0b30ad0da2 Removed test file - #14890
Signed-off-by: snipe <snipe@snipe.net>
2024-06-18 10:12:57 +01:00
snipe
cb6ea2c6fb Merge remote-tracking branch 'origin/develop' 2024-06-18 09:59:43 +01:00
snipe
89a5bbb10e Merge pull request #14893 from snipe/fixes/rb_3792_ambiguous_query
Prefaced fields with “users” for clarity
2024-06-18 09:58:44 +01:00
snipe
2f59bb74cd Prefaced fields with “users” for clarity
Signed-off-by: snipe <snipe@snipe.net>
2024-06-18 09:52:41 +01:00
snipe
6c6a3649ea Production assets
Signed-off-by: snipe <snipe@snipe.net>
2024-06-18 09:33:07 +01:00
snipe
05b97db747 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
2024-06-18 09:32:30 +01:00
snipe
543e4c0666 Bumped version file
Signed-off-by: snipe <snipe@snipe.net>
2024-06-18 09:31:49 +01:00
snipe
e28619f769 Bumped papaparse library
Signed-off-by: snipe <snipe@snipe.net>
2024-06-18 09:30:24 +01:00
snipe
4d8c2d3f4e Merge pull request #14886 from marcusmoore/fixes/debugbar
Bumped debugbar from v3.13.0 to v3.13.5 to fix issue with session messages
2024-06-18 09:22:18 +01:00
snipe
f53eeb8b33 Merge pull request #14887 from marcusmoore/fixes/fix-test-namespace
Fixed namespace for ViewUserTest
2024-06-18 09:20:58 +01:00
snipe
aba6d9b338 Merge pull request #14885 from marcusmoore/tests/asset-model-test-improvements
Added more tests around Asset Model
2024-06-18 09:20:45 +01:00
snipe
cd5bef414c Merge pull request #14884 from marcusmoore/fix/actionlogcontroller-fix
Fixed missing `}`
2024-06-18 09:20:26 +01:00
Marcus Moore
4f2d2ae4b8 Fix namespace for ViewUserTest 2024-06-17 16:37:24 -07:00
Marcus Moore
1bd0ab7389 Move barryvdh/laravel-debugbar from require to require-dev 2024-06-17 16:28:08 -07:00
Marcus Moore
8799276c6e Bump debugbar from v3.13.0 to v3.13.5 2024-06-17 16:25:39 -07:00
Marcus Moore
672aabf4ac Add more tests for Asset Model index and store methods 2024-06-17 14:51:59 -07:00
Marcus Moore
796d6909d5 Add missing } 2024-06-17 14:40:06 -07:00
Marcus Moore
a3dea99bbb Fix category edit form component 2024-06-17 14:24:16 -07:00
Marcus Moore
fc351a1896 Remove .live from oauth clients 2024-06-17 13:03:27 -07:00
Marcus Moore
d9164281ab Merge branch 'develop' into chore/sc-23725/livewire3
# Conflicts:
#	resources/views/livewire/oauth-clients.blade.php
2024-06-17 12:57:04 -07:00
snipe
cbb5b6e846 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
2024-06-17 15:58:27 +01:00
snipe
08bd39dbba Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2024-06-17 15:57:32 +01:00
snipe
430808e180 Merge remote-tracking branch 'origin/develop' 2024-06-17 15:52:13 +01:00
snipe
6976dc2b26 Merge pull request #14879 from snipe/fixes/better_ui_for_oauth
Fixed weird layout in admin oauth [sc-25673]
2024-06-17 15:51:11 +01:00
snipe
27063d5bae Fix weird layout in admin oauth [sc-25673]
Signed-off-by: snipe <snipe@snipe.net>
2024-06-17 15:44:07 +01:00
snipe
5be86b9dbb Merge remote-tracking branch 'origin/develop' 2024-06-17 13:43:45 +01:00
snipe
afc78524fc Merge pull request #14877 from snipe/fixes/spatie-backup-config
Updated config
2024-06-17 13:42:02 +01:00
snipe
eb33a2451f Updated config
Signed-off-by: snipe <snipe@snipe.net>
2024-06-17 13:36:52 +01:00
snipe
891a0a0965 Merge branch 'develop' of https://github.com/snipe/snipe-it into develop 2024-06-17 13:05:31 +01:00
snipe
50f0797850 Added aria hidden to icon
Signed-off-by: snipe <snipe@snipe.net>
2024-06-17 13:05:27 +01:00
snipe
36cdf0e0be Merge pull request #14876 from snipe/fixes/small_footer_issues
Fixed small footer issues
2024-06-17 12:53:52 +01:00
snipe
d9cc3c3ec7 Removed extra divs
Signed-off-by: snipe <snipe@snipe.net>
2024-06-17 12:52:23 +01:00
snipe
069a1608de Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
2024-06-17 12:10:13 +01:00
snipe
60accfd601 Bumped version file
Signed-off-by: snipe <snipe@snipe.net>
2024-06-17 12:09:30 +01:00
snipe
b1f2051b43 Merge remote-tracking branch 'origin/develop' 2024-06-17 11:58:11 +01:00
snipe
233e4af7f8 Added base asset models test
Signed-off-by: snipe <snipe@snipe.net>
2024-06-17 11:57:30 +01:00
snipe
dc1b808a28 Fixed static request
Signed-off-by: snipe <snipe@snipe.net>
2024-06-17 11:47:21 +01:00
snipe
91a423e60e Bumped php max version
Signed-off-by: snipe <snipe@snipe.net>
2024-06-17 11:27:55 +01:00
snipe
bd03a6d206 Production assets
Signed-off-by: snipe <snipe@snipe.net>
2024-06-17 11:18:44 +01:00
snipe
d87da78eb5 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	app/Http/Controllers/Users/UsersController.php
#	config/version.php
#	public/css/build/AdminLTE.css
#	public/css/build/app.css
#	public/css/build/overrides.css
#	public/css/dist/all.css
#	public/css/dist/bootstrap-table.css
#	public/js/build/app.js
#	public/js/build/vendor.js
#	public/js/dist/all-defer.js
#	public/js/dist/all.js
#	public/js/dist/bootstrap-table.js
#	public/mix-manifest.json
2024-06-17 11:18:33 +01:00
snipe
f3e82c2c80 Updated languages
Signed-off-by: snipe <snipe@snipe.net>
2024-06-17 10:59:17 +01:00
snipe
569f05a99e Built prod assets
Signed-off-by: snipe <snipe@snipe.net>
2024-06-17 10:45:04 +01:00
snipe
ece7c22df9 Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2024-06-17 10:44:20 +01:00
snipe
4eefd39172 Bumped requirements
Signed-off-by: snipe <snipe@snipe.net>
2024-06-17 10:42:59 +01:00
snipe
daae5d6859 Merge pull request #14724 from phil-flip/develop
Added Proper Docker Compose and .env.docker-setup files
2024-06-16 15:49:15 +01:00
snipe
df76769a29 Merge pull request #14871 from marcusmoore/chore/move-test
Moved `AssetFilesTest`
2024-06-13 23:10:36 +01:00
Marcus Moore
fe72639925 Move AssetFilesTest 2024-06-13 14:25:25 -07:00
Marcus Moore
c3e6e1144f Merge branch 'develop' into chore/sc-23725/livewire3 2024-06-12 15:12:40 -07:00
snipe
cacb5d62dc Merge pull request #14800 from snipe/fixes/importer_tweaks
Importer tweaks
2024-06-12 12:51:11 +01:00
snipe
a8b47a55bc Merge pull request #14801 from snipe/fixes/companyable_trait_on_users
Allow CompanyableTrait trait on users
2024-06-12 12:42:56 +01:00
snipe
3159fdec9f FFS
Signed-off-by: snipe <snipe@snipe.net>
2024-06-12 12:40:43 +01:00
snipe
ea990a5381 Fixed tests
Signed-off-by: snipe <snipe@snipe.net>
2024-06-12 12:31:41 +01:00
snipe
134183ef16 Shuffled tests around again
Signed-off-by: snipe <snipe@snipe.net>
2024-06-12 12:12:15 +01:00
snipe
67ab2536bc Updated test names
Signed-off-by: snipe <snipe@snipe.net>
2024-06-12 12:03:33 +01:00
snipe
756a2ac25c Added API tests
Signed-off-by: snipe <snipe@snipe.net>
2024-06-12 11:58:12 +01:00
snipe
acaceb4103 Moved tests
Signed-off-by: snipe <snipe@snipe.net>
2024-06-12 11:57:50 +01:00
snipe
7e3d66ec53 Merge branch 'develop' into fixes/companyable_trait_on_users 2024-06-12 11:27:26 +01:00
snipe
1ca9bb5aa8 Merge pull request #14698 from Scarzy/features/asset_file_upload_from_api
Added #9413: Asset file upload from API
2024-06-12 11:18:06 +01:00
snipe
c641b733e1 Merge pull request #14834 from bryanlopezinc/AddAppUrlTest
Added test for app url config
2024-06-12 11:14:17 +01:00
snipe
16cf6bc852 Merge pull request #14843 from marcusmoore/chore/sc-25767
Added GitHub workflow for tests in Postgres
2024-06-12 09:53:55 +01:00
Marcus Moore
c51b7d7104 Inline variable 2024-06-10 12:22:23 -07:00
Marcus Moore
5c0ca92fd7 Switch to using workflow_dispatch for PostgreSQL tests 2024-06-10 10:24:10 -07:00
snipe
241e9bc253 Merge pull request #14847 from uberbrady/users_index_api_optimization
Optimization for listings of large numbers of users
2024-06-10 13:57:49 +01:00
Brady Wetherington
c8820adb56 Add two new 'with()' relationships to Users API index query 2024-06-10 13:29:53 +01:00
snipe
0f4c6dd5b0 Merge pull request #14830 from snipe/chore/sc-25756/better_validation_for_relations_on_delete
Better validation for relations on delete
2024-06-07 18:10:41 +01:00
snipe
f8ab9f62f6 Merge pull request #14842 from Godmartinz/adjust-preview-window
Fixed label preview window position
2024-06-07 18:09:56 +01:00
Phil
217ed03b8e add DB_PORT 2024-06-07 12:04:10 +02:00
Godfrey M
77e6058e4c remembers chosen label 2024-06-06 13:55:15 -07:00
Godfrey M
4a60026162 moves preview down by field definitions 2024-06-06 13:42:06 -07:00
Godfrey M
3621292a0e removes unnecessary height 2024-06-06 13:28:05 -07:00
Marcus Moore
6c296ccf8e Use "postgres" instead of "postgres:14" 2024-06-06 13:27:39 -07:00
Godfrey M
6df1c36011 oops 2024-06-06 13:24:02 -07:00
Marcus Moore
924da00f3e Add Postgres GitHub workflow for tests 2024-06-06 13:21:00 -07:00
Godfrey M
44dae22a3c adjust label preview window 2024-06-06 13:18:19 -07:00
bryanlopezinc
d35e251d6e Added test for app url config 2024-06-05 21:46:43 +01:00
snipe
e19d2d6ec9 Merge pull request #14832 from snipe/fixes/added_consumables_to_inventory_email
Fixed #14812 - added consumables to individual inventory report
2024-06-05 20:42:35 +01:00
snipe
871255f28c Fixed #14812 - added consumables to individual inventory report
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 20:40:45 +01:00
Marcus Moore
9044aa4ed9 Import class 2024-06-05 11:48:47 -07:00
Marcus Moore
60c7efae3c Remove commented code 2024-06-05 11:48:10 -07:00
Marcus Moore
48fc6ca60e Remove commented code 2024-06-05 11:46:57 -07:00
snipe
7ac315e1eb Fixed tests
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 14:50:45 +01:00
snipe
374c6845d6 Added test if user has assets
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 14:16:28 +01:00
snipe
c5cbe37007 Added view permissions for the redirects
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 14:13:51 +01:00
snipe
a2346e4666 Changed numbers
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 14:09:57 +01:00
snipe
2479ccc4c6 Fixed accessory assignment
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 14:07:18 +01:00
snipe
64dd8f5d65 Missed a use statement
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 14:03:33 +01:00
snipe
47420a802a More (failing) tests
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 14:02:04 +01:00
snipe
5cdb2b7163 Check that the user was not aready deleted
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 14:00:35 +01:00
snipe
d4c080c7e4 Use the form request on the UI controller
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 13:40:32 +01:00
snipe
065a47a446 Use the DeleteUser request
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 13:28:44 +01:00
snipe
5bd9ecb8df Created DeleteUser request
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 13:28:37 +01:00
snipe
1cdec61be6 Use more modern mutator/accessory syntax
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 10:56:54 +01:00
snipe
b0ddb26e73 Fixed variable name, $field
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 10:28:35 +01:00
snipe
181bafd012 Fixed tests
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 10:28:35 +01:00
snipe
e054fc1ef1 Removed noisy import debugging, made nicer output
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 10:28:35 +01:00
snipe
9d9ad86dd5 Added mutators and accessors for dates
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 10:28:35 +01:00
snipe
afe4e5d62e Added date parser
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 10:28:35 +01:00
snipe
52950f1322 Refactored date parsing
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 10:28:35 +01:00
snipe
026c80992e Pull the log reference
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 10:28:35 +01:00
snipe
0ee2b74ff3 Added date parsers for new date fields
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 10:28:35 +01:00
snipe
3a0f7eca54 Put asset EOL date back in the Item Importer
I have no idea why this is necessary

Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 10:28:35 +01:00
snipe
f4d530b4b1 Removed filename column since it’s never worked
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 10:28:35 +01:00
snipe
4ccbfb56a4 Make sure the status label is deployable
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 10:28:35 +01:00
snipe
d02904c9a3 Added new fields
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 10:28:35 +01:00
snipe
c8279c0b99 Moved asset-only date stuff into the asset importer
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 10:28:35 +01:00
snipe
f4f184e115 Removed noisy debugging
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 10:28:35 +01:00
snipe
b2a86e312b Added last_checkout and last_checkin as fillable
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 10:28:35 +01:00
snipe
9d56617caf Moved expected checkin date on view
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 10:28:35 +01:00
snipe
de7b8940fe Merge pull request #14828 from fe80/fix/controller-signature-s3
fix(ActionlogController): add missin class Illuminate\Support\Facades…
2024-06-05 09:58:03 +01:00
snipe
09e94ec176 Reordered withTrashed() and find()
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 09:57:24 +01:00
snipe
832ceeba56 Fixed missing endpush
Signed-off-by: snipe <snipe@snipe.net>
2024-06-05 09:57:10 +01:00
fe80
ea7c3c8485 fix(ActionlogController): add missing class Illuminate\Support\Facades\Storage 2024-06-05 10:55:27 +02:00
snipe
bc36c8074e Merge pull request #14807 from bryanlopezinc/AddTestToCheckEnvVisibility
Added test for .env visibility for setup page
2024-06-05 09:50:54 +01:00
snipe
9fccafa3ac Merge pull request #14816 from uberbrady/hotfix_autoincrement_workaround
Don't save next autoincrement base if it's going to fail, next
2024-06-05 09:47:40 +01:00
snipe
fa083098fc Merge pull request #14819 from snipe/localization/new_strings_2024_06_03
Updated strings
2024-06-05 09:46:41 +01:00
snipe
7688c437c0 Merge pull request #14824 from Godmartinz/select-2-redirect-fix
Fixed select 2 Behavior
2024-06-05 09:46:25 +01:00
snipe
697ac83040 Merge pull request #14825 from marcusmoore/chore/test-organization
Re-organized test suite
2024-06-05 09:46:08 +01:00
snipe
a742105c21 Merge pull request #14827 from fe80/fix/controller-signature-s3
fix(ActionlogController): correct signature image for s3 bucket
2024-06-05 09:40:21 +01:00
fe80
7a76ec9e02 fix(ActionlogController): correct signature image for s3 bucket 2024-06-05 10:08:15 +02:00
Marcus Moore
b2a0e7958b Inject alpine on label engine page 2024-06-04 17:03:36 -07:00
Marcus Moore
99439f0a5c Define property 2024-06-04 16:14:07 -07:00
Marcus Moore
ef91c8123e Remove unneeded re-render of select2 2024-06-04 15:49:57 -07:00
Marcus Moore
5eb5742b3d Define property 2024-06-04 15:49:39 -07:00
Marcus Moore
296cf3e34b Update OauthClients component 2024-06-04 15:37:41 -07:00
Marcus Moore
e98c3f92c1 Update domain name 2024-06-04 10:49:29 -07:00
Marcus Moore
d202dfc225 Organize API tests into domains 2024-06-04 10:48:53 -07:00
Godfrey M
6202f6157a fix select2 behavior 2024-06-04 08:41:00 -07:00
Marcus Moore
b1e8e5389b Make most test names singular 2024-06-03 16:54:59 -07:00
Marcus Moore
95f6381da4 Update tests names to VerbNounTest 2024-06-03 16:53:15 -07:00
Marcus Moore
b07e3b4a91 Remove API from test class name 2024-06-03 16:50:56 -07:00
Marcus Moore
86bd9a2674 Move test method to existing test 2024-06-03 16:49:44 -07:00
Marcus Moore
29a36839aa Move existing API checkin and checkout tests under domain directory 2024-06-03 16:29:53 -07:00
snipe
85cb7c92e7 Updated strings
Signed-off-by: snipe <snipe@snipe.net>
2024-06-03 20:44:40 +01:00
Brady Wetherington
e827bc9a07 Tests on asset tags that are maximum integers and *almost* maximum... 2024-06-03 17:31:56 +01:00
snipe
a6f19a1657 docs: add @U-H-T as a contributor 2024-06-03 17:06:43 +01:00
snipe
6229d0c616 Merge pull request #14758 from U-H-T/features/add_logo_support_for_Brother_TZe24
add logo support for Brother TZe24mm labels
2024-06-03 17:02:18 +01:00
snipe
bc6c969f21 Merge pull request #14814 from snipe/dependabot/github_actions/develop/crowdin/github-action-2
Bump crowdin/github-action from 1 to 2
2024-06-03 16:58:10 +01:00
snipe
8f4ede7785 Merge pull request #14817 from snipe/fixes/hotfix_for_14815
Fixes #14815 - Fixed translation string
2024-06-03 16:48:54 +01:00
snipe
877adb082c Fixed translation string
Signed-off-by: snipe <snipe@snipe.net>
2024-06-03 16:40:52 +01:00
Brady Wetherington
90818bb147 Don't save next autoincrement base if it's going to fail, next 2024-06-03 15:58:57 +01:00
dependabot[bot]
f767a94c84 Bump crowdin/github-action from 1 to 2
Bumps [crowdin/github-action](https://github.com/crowdin/github-action) from 1 to 2.
- [Release notes](https://github.com/crowdin/github-action/releases)
- [Commits](https://github.com/crowdin/github-action/compare/v1...v2)

---
updated-dependencies:
- dependency-name: crowdin/github-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-03 08:18:51 +00:00
bryanlopezinc
89e50b94d3 Fix Failing sqlite test 2024-06-03 08:09:05 +01:00
snipe
c4d97d095f Merge pull request #14809 from snipe/features/more_tests
Added a few more tests
2024-06-01 04:25:19 +01:00
snipe
67fb3f10d5 Tightened up tests with better checks
Signed-off-by: snipe <snipe@snipe.net>
2024-06-01 04:24:47 +01:00
snipe
ea8d390596 MOAR TESTS
Signed-off-by: snipe <snipe@snipe.net>
2024-06-01 04:01:09 +01:00
snipe
cff382605c Fixed some missing strings and checks
Signed-off-by: snipe <snipe@snipe.net>
2024-06-01 04:01:04 +01:00
snipe
52af8afac2 Added company scoping test
Signed-off-by: snipe <snipe@snipe.net>
2024-06-01 03:10:29 +01:00
snipe
03b0268dc2 Fixed typo
Signed-off-by: snipe <snipe@snipe.net>
2024-06-01 03:00:45 +01:00
snipe
c09e93e288 Updated delete users API tests, moved non-API tests
Signed-off-by: snipe <snipe@snipe.net>
2024-06-01 02:59:04 +01:00
snipe
694e3b7f3a Fixed typo
Signed-off-by: snipe <snipe@snipe.net>
2024-06-01 00:42:16 +01:00
snipe
32c367090b Updated test names
Signed-off-by: snipe <snipe@snipe.net>
2024-05-31 23:13:27 +01:00
snipe
abcfe2b757 Derp. Spelling.
Signed-off-by: snipe <snipe@snipe.net>
2024-05-31 23:12:13 +01:00
snipe
f7687008b7 Added more tests
Signed-off-by: snipe <snipe@snipe.net>
2024-05-31 23:10:59 +01:00
snipe
b156264684 Tidied up scoping to be better for testing
Signed-off-by: snipe <snipe@snipe.net>
2024-05-31 23:10:53 +01:00
snipe
3f9a80942e Removed manual companyable from non-API views
Signed-off-by: snipe <snipe@snipe.net>
2024-05-31 23:10:23 +01:00
snipe
dc62e393c3 Hotfix for user permissions
Signed-off-by: snipe <snipe@snipe.net>
2024-05-31 21:22:21 +01:00
snipe
46be0f6610 Merge pull request #14808 from snipe/fixes/small_redirect_tweaks
Small UI tweaks and redirects when asset model is invalid
2024-05-31 20:46:07 +01:00
snipe
dd0a16c3d5 Added tests
Signed-off-by: snipe <snipe@snipe.net>
2024-05-31 20:42:32 +01:00
snipe
a15ed6eaee Wrap disabled <a> links in a span for tooltips
Signed-off-by: snipe <snipe@snipe.net>
2024-05-31 19:29:29 +01:00
snipe
3005565bba Slight tweak to language
Signed-off-by: snipe <snipe@snipe.net>
2024-05-31 19:29:12 +01:00
snipe
cf45e7536f Redirect with error if model is invalid
Signed-off-by: snipe <snipe@snipe.net>
2024-05-31 18:51:58 +01:00
snipe
1d97d95c10 UI and styling tweaks
Signed-off-by: snipe <snipe@snipe.net>
2024-05-31 18:48:34 +01:00
snipe
4a1b1675cb Use storage helper
Signed-off-by: snipe <snipe@snipe.net>
2024-05-31 18:48:09 +01:00
snipe
8c5249ba4b Disable buttons on view page if model is invalid
Signed-off-by: snipe <snipe@snipe.net>
2024-05-31 18:47:53 +01:00
snipe
b936591240 Warn and disable on checkout if model is invalid
Signed-off-by: snipe <snipe@snipe.net>
2024-05-31 18:47:34 +01:00
snipe
76e664d647 Warn and disable the checkout button if model is invalid
Signed-off-by: snipe <snipe@snipe.net>
2024-05-31 18:47:18 +01:00
snipe
0253c2a756 Lauout tweaks, warn and disable button if model is invalid
Signed-off-by: snipe <snipe@snipe.net>
2024-05-31 18:46:57 +01:00
snipe
d27613f55c Updated strings
Signed-off-by: snipe <snipe@snipe.net>
2024-05-31 18:46:41 +01:00
snipe
ca8d478e87 Redirect if model is invalid
Signed-off-by: snipe <snipe@snipe.net>
2024-05-31 18:46:32 +01:00
bryanlopezinc
c63c17d49f Added test for .env visibility for setup page 2024-05-31 17:33:57 +01:00
snipe
801e58d52e Removed manual scoping
Signed-off-by: snipe <snipe@snipe.net>
2024-05-31 06:58:15 +01:00
snipe
06e9625c64 Use hasUser() to avoid table collisions and infinite loop
Signed-off-by: snipe <snipe@snipe.net>
2024-05-31 06:58:07 +01:00
snipe
5800e8d8e9 Added companyable trait
Signed-off-by: snipe <snipe@snipe.net>
2024-05-31 06:57:34 +01:00
snipe
623aa58163 Removed unused statement
Signed-off-by: snipe <snipe@snipe.net>
2024-05-31 06:57:25 +01:00
snipe
45cfec5b29 Merge pull request #14797 from bryanlopezinc/AddTestsForSettings
Added test for setup page
2024-05-31 02:31:35 +01:00
Marcus Moore
5a9a231359 Remove alpinejs 2024-05-30 16:57:20 -07:00
Marcus Moore
1736bf5510 Merge branch 'develop' into chore/sc-23725/livewire3
# Conflicts:
#	app/Livewire/LoginForm.php
#	package.json
#	resources/views/livewire/login-form.blade.php
2024-05-30 16:56:50 -07:00
snipe
ee8931f886 Merge pull request #14799 from marcusmoore/chore/remove-unused-component
Removed unused Livewire component
2024-05-31 00:54:43 +01:00
Marcus Moore
1a1b891309 Remove unused Login Livewire component 2024-05-30 16:49:05 -07:00
Marcus Moore
2eaac3d381 Fix select2 re-renders 2024-05-30 16:20:04 -07:00
Marcus Moore
f03249898a Update id syntax in custom fields component 2024-05-30 16:12:52 -07:00
snipe
0981cfa902 Built assets
Signed-off-by: snipe <snipe@snipe.net>
2024-05-30 20:22:50 +01:00
snipe
37fbcfa22b Merge pull request #14798 from Godmartinz/redirect_back_to_asset_fix
Fixed checkin option from appearing
2024-05-30 19:41:02 +01:00
Godfrey M
0ee441a976 adds hidden as well 2024-05-30 11:19:06 -07:00
Godfrey M
cf8de3baa9 fix checkin option from appearing 2024-05-30 11:11:35 -07:00
bryanlopezinc
404ee238a3 Added test for setup page 2024-05-30 14:37:24 +01:00
snipe
5a5d171ba2 Put session facade back - derp
Signed-off-by: snipe <snipe@snipe.net>
2024-05-30 14:15:08 +01:00
snipe
aadee068b3 Merge pull request #14740 from Godmartinz/redirect_back_to_asset
Added Redirect options to asset check in/out
2024-05-30 14:14:04 +01:00
snipe
a46e2ebfd8 Small tweaks to user export, user view translations
Signed-off-by: snipe <snipe@snipe.net>
2024-05-30 13:59:00 +01:00
snipe
f710b1aac3 Merge pull request #14614 from akemidx/feature/sc-19796
ADDED: Export User Permissions (Superuser & Admin)
2024-05-30 13:41:26 +01:00
snipe
f6fe6e70b9 Merge branch 'develop' into redirect_back_to_asset 2024-05-30 13:38:11 +01:00
snipe
bed8861179 Merge pull request #14796 from snipe/chore/sc-25715/axios
Upgraded axios
2024-05-30 13:17:23 +01:00
snipe
180d7b1b5b Upgraded axios
Signed-off-by: snipe <snipe@snipe.net>
2024-05-30 13:13:25 +01:00
snipe
386416ee5d Merge pull request #14795 from snipe/bug/sc-25687/papaparse
Upgraded papaparse
2024-05-30 13:04:00 +01:00
snipe
6b5aa91f3d Upgraded papaparse
Signed-off-by: snipe <snipe@snipe.net>
2024-05-30 13:00:57 +01:00
Marcus Moore
e80b80f5d1 Remove manual livewire tags 2024-05-29 16:04:05 -07:00
Marcus Moore
9e35441281 Importer fixes 2024-05-29 15:50:42 -07:00
Godfrey M
e28ad50bec fixes the color change 2024-05-29 15:34:08 -07:00
Scarzy
f48c5ee252 Fix an error message 2024-05-29 22:32:45 +01:00
Scarzy
98a94dec29 Change some errors to be 404
The asset or file was not found, so 500 wasn't the best choice of error
code
2024-05-29 22:17:36 +01:00
Marcus Moore
7d95e7765d Add a few .prevents 2024-05-29 14:13:29 -07:00
Marcus Moore
ee75b30683 Enable legacy_model_binding 2024-05-29 14:06:27 -07:00
Scarzy
ca9d4e3155 Get the tests for download and delete working 2024-05-29 22:01:49 +01:00
Scarzy
633bcbb6c4 Get the file upload test working
Added the upload functionality to the get and delete tests, but I
currently don't seem to be able to reference the correct file ID
2024-05-29 22:01:49 +01:00
Scarzy
2d4af61e6c Begin to add some tests
There is currently only really a test for listing, and only for the
empty list response
2024-05-29 22:01:49 +01:00
Scarzy
45329912e6 Give a better response to listing no files on an asset
HTTP500 was never a good choice. Now it sends back an empty array
2024-05-29 22:01:49 +01:00
Scarzy
b9d56a8ecc Fix some routes
Names of some of the routes overlapped with others in an incompatible
way. This makes the names more distinct
2024-05-29 22:01:48 +01:00
Scarzy
91c1e53e52 Fix the test file location 2024-05-29 22:01:48 +01:00
Scarzy
73a87a8ea8 Add the framework of a test 2024-05-29 22:01:48 +01:00
Scarzy
bb0a614c39 Update some comments 2024-05-29 22:01:48 +01:00
Scarzy
f11ea79406 Add some sanity checks that the asset actually exists 2024-05-29 22:01:48 +01:00
Scarzy
e817b20840 Fix some responses to be more appropriate
Error/success was mixed up
2024-05-29 22:01:48 +01:00
Scarzy
516f766a44 Remove some debug code 2024-05-29 22:01:48 +01:00
Scarzy
f5791c79a5 Change the returns to be API appropriate 2024-05-29 22:01:48 +01:00
Scarzy
f6a1a76095 Add an endpoint for deleting a file 2024-05-29 22:01:48 +01:00
Scarzy
bbb9145744 Add an API endpoint to download files 2024-05-29 22:01:48 +01:00
Scarzy
194853d860 Remove a redundant line 2024-05-29 22:01:48 +01:00
Scarzy
92670d5711 Add the ability to list files for an asset 2024-05-29 22:01:48 +01:00
Scarzy
8a2ea971e1 Add an API assets files controller
Based heavily on the Assets assets files controller.
Added errors related to to the files management.
Added the API endpoints for file upload and show, but only upload is
currently tested/works.
2024-05-29 22:01:48 +01:00
Marcus Moore
8d924b60d7 Replace references to @this in importer 2024-05-29 13:51:57 -07:00
Marcus Moore
34595c266d Update script tag 2024-05-29 13:16:30 -07:00
Marcus Moore
638ae9bdd5 Use new id method 2024-05-29 13:15:59 -07:00
Godfrey M
713ce7836f add some css in label field selector 2024-05-29 13:07:33 -07:00
Marcus Moore
093c6652a8 Update select2 snippet for Livewire 3 2024-05-29 12:58:24 -07:00
Marcus Moore
17f0ac1eae Set view correctly 2024-05-29 12:57:43 -07:00
Marcus Moore
43616d1874 Remove alpine reference from webpack 2024-05-29 12:30:20 -07:00
Marcus Moore
9dc4f2ca80 Migrate config 2024-05-29 12:24:17 -07:00
Marcus Moore
73e3ac7dd8 Migrate to $dispatch 2024-05-29 12:18:31 -07:00
Marcus Moore
8ff639913d Migrate away from dispatchBrowserEvent() 2024-05-29 12:17:36 -07:00
Marcus Moore
45419586fe Migrate away from wire:model.prevent 2024-05-29 12:11:33 -07:00
Marcus Moore
d8a480b2a8 Migrate to wire:model.blur 2024-05-29 12:11:02 -07:00
Marcus Moore
29d87246a2 Migrate away from wire:model.defer 2024-05-29 12:10:46 -07:00
Marcus Moore
58e638d3cb Migrate to wire:model.live 2024-05-29 12:08:25 -07:00
Marcus Moore
b52380f376 Migrate to new namespace 2024-05-29 12:07:48 -07:00
Marcus Moore
4ae74fb7f6 Remove alpinejs from package.json 2024-05-29 12:06:54 -07:00
Marcus Moore
7d1acd3d79 Update Livewire via composer 2024-05-29 12:04:06 -07:00
snipe
12e107a71b Merge pull request #13062 from ak-piracha/feature/snipe-12892-bulk-consumable-checkout
Bulk Consumable Checkout
2024-05-29 19:42:25 +01:00
snipe
fba72e1e8d Merge pull request #14789 from snipe/fixes/14781_broken_wrench_icon
Fixed #14781 - Fixed broken wrench icon on some browsers in manufacturer section
2024-05-29 19:23:21 +01:00
snipe
7bbee053c6 Updated fa icon call
Signed-off-by: snipe <snipe@snipe.net>
2024-05-29 19:19:45 +01:00
snipe
6ea1a3bacf Merge pull request #14788 from snipe/security/Snyk-Upgrade-jquery-ui-from-1.13.2-to-1.13.3-#14735
Updated jquery-UI
2024-05-29 18:47:39 +01:00
snipe
603afe4466 Updated jquery-UI
Signed-off-by: snipe <snipe@snipe.net>
2024-05-29 18:44:39 +01:00
snipe
037ee8c07a Merge pull request #14787 from snipe/fixes/return_redirect_fixes_for_docblock
Fixes path for redirect response
2024-05-29 18:28:00 +01:00
snipe
df1cef59d5 Fixes path for redirect response
Signed-off-by: snipe <snipe@snipe.net>
2024-05-29 18:01:40 +01:00
snipe
3fcd196c04 Merge pull request #14786 from snipe/security/upgrade_bs_tables
#14743 - Upgrade bootstrap-table from 1.22.3 to 1.22.5
2024-05-29 13:12:07 +01:00
snipe
8ee5e7cd0a #14743 - Upgrade bootstrap-table from 1.22.3 to 1.22.5
Signed-off-by: snipe <snipe@snipe.net>
2024-05-29 13:10:46 +01:00
snipe
1ec85063ee Merge pull request #14785 from snipe/fixes/updates_facade_paths
Fixed/updated facade paths
2024-05-29 13:03:13 +01:00
snipe
92ba889cae Updated/removed facades
Signed-off-by: snipe <snipe@snipe.net>
2024-05-29 12:53:51 +01:00
snipe
f17162c2e2 Use artisan facade
Signed-off-by: snipe <snipe@snipe.net>
2024-05-29 12:40:05 +01:00
snipe
fb233c0aa4 Cleaned up facade names and references
Signed-off-by: snipe <snipe@snipe.net>
2024-05-29 12:38:15 +01:00
snipe
369c819a27 Merge pull request #14754 from Godmartinz/footer_user_bug
Removed extra div from User Details.
2024-05-29 11:29:02 +01:00
snipe
f1eb4bd3a5 Merge pull request #14349 from snipe/jerm/update-mailer-configs
Update mailer configurations for Symfony mailer
2024-05-29 11:25:55 +01:00
snipe
2f828683da Merge pull request #14783 from snipe/fixes/fixed_category_test_depreciation_warning
Fixed deprecation warning on category test
2024-05-29 11:19:31 +01:00
snipe
13db151297 Fixed deprecation warning on category test
Signed-off-by: snipe <snipe@snipe.net>
2024-05-29 11:06:51 +01:00
snipe
bb95c231e5 Merge branch 'develop' of https://github.com/snipe/snipe-it into develop 2024-05-29 10:55:12 +01:00
snipe
dcea14fb99 Merge pull request #14778 from uberbrady/fix_8_3_compat
Allows Snipe-ITv7 to install on PHPv8.1-8.3
2024-05-29 10:55:02 +01:00
snipe
282fed27da Add @bryanlopezinc as a contributor 2024-05-29 10:46:59 +01:00
snipe
cf3ffe9c74 Merge pull request #14782 from bryanlopezinc/ReduceIDeErrors
Reduce IDE errors in App\Http\Controllers\SettingsController
2024-05-29 10:46:03 +01:00
bryanlopezinc
5d01a06245 Reduce IDE errors in App\Http\Controllers\SettingsController 2024-05-29 08:07:49 +01:00
snipe
02cdda56e2 Merge branch 'develop' of https://github.com/snipe/snipe-it into develop 2024-05-29 02:00:25 +01:00
snipe
ffecd97665 Bumped laravel in readme
Signed-off-by: snipe <snipe@snipe.net>
2024-05-29 02:00:21 +01:00
snipe
779cf9418e Merge pull request #14780 from marcusmoore/fixes/sqlite-tests-in-gh
Fixed sqlite tests in GitHub Actions
2024-05-29 01:59:12 +01:00
Marcus Moore
34b4452645 Skip "migrating" and run passport:keys for sqlite testing in GH 2024-05-28 17:41:01 -07:00
snipe
da1c4c23e6 Merge branch 'develop' of https://github.com/snipe/snipe-it into develop 2024-05-29 00:26:37 +01:00
snipe
a5d0a21757 Fixed string path
Signed-off-by: snipe <snipe@snipe.net>
2024-05-29 00:26:33 +01:00
snipe
29454f7288 Merge pull request #14779 from marcusmoore/fixes/fix-group-create-endpoint
Fixed Array to string conversion exception in group create api endpoint
2024-05-28 23:26:34 +01:00
Brady Wetherington
e271711c5b Added the clock-lts repo which allows use on php8.1-8.3 2024-05-28 22:50:09 +01:00
Marcus Moore
4c78da3bbf Re-add json encoding of permissions 2024-05-28 13:03:09 -07:00
Marcus Moore
71bab2c315 Improve test case 2024-05-28 13:02:44 -07:00
snipe
fceba13b03 Merge pull request #14777 from snipe/fixes/reportscontroller_optimizations
Reports controller query optimizations
2024-05-28 18:08:27 +01:00
snipe
8ac3937bf4 Commented model loading on asset model
Signed-off-by: snipe <snipe@snipe.net>
2024-05-28 18:03:19 +01:00
snipe
1c1729854e Use statics for location, supplier, etc
Signed-off-by: snipe <snipe@snipe.net>
2024-05-28 18:02:22 +01:00
snipe
14c78d9065 Use static for custom fields
Signed-off-by: snipe <snipe@snipe.net>
2024-05-28 18:02:09 +01:00
snipe
b1cb9259da Re-use total to avoid duplicate count
Signed-off-by: snipe <snipe@snipe.net>
2024-05-28 18:01:47 +01:00
snipe
7d2af61989 Merge pull request #14775 from snipe/bug/sc-25676/groups_api
Fixed #14771: improvements to groups API
2024-05-28 15:33:36 +01:00
snipe
03b5c2e246 Fixed bad translation string
Signed-off-by: snipe <snipe@snipe.net>
2024-05-28 15:21:28 +01:00
snipe
33d5d5e24f Added tests
Signed-off-by: snipe <snipe@snipe.net>
2024-05-28 15:21:13 +01:00
snipe
3df2a4a70b Removed debugging
Signed-off-by: snipe <snipe@snipe.net>
2024-05-28 15:16:44 +01:00
snipe
6b41970e97 Check that selected is an array
Signed-off-by: snipe <snipe@snipe.net>
2024-05-28 15:15:31 +01:00
snipe
92eb6eb1b6 Add unique constraint to name
Signed-off-by: snipe <snipe@snipe.net>
2024-05-28 15:09:31 +01:00
snipe
206238e83f Merge pull request #14773 from snipe/bug/sc-25674/location_currency_on_edit
Pass accessory's currency if set by location
2024-05-28 10:29:20 +01:00
snipe
df882bbcbc Pass item’s currency if set by location
Signed-off-by: snipe <snipe@snipe.net>
2024-05-28 10:24:10 +01:00
snipe
6c1c3a99dd Bumped current_snipeit_version
Signed-off-by: snipe <snipe@snipe.net>
2024-05-27 19:22:24 +01:00
snipe
54067ec449 Fixed pre-version in version.php
Signed-off-by: snipe <snipe@snipe.net>
2024-05-27 18:21:46 +01:00
snipe
4c11e97922 Bumped version to dev, bumped hash
Signed-off-by: snipe <snipe@snipe.net>
2024-05-27 18:20:32 +01:00
Brady Wetherington
8df9007a8e Merge branch 'snipeit_v7_laravel10' into develop 2024-05-27 18:08:27 +01:00
snipe
702b944698 Merge remote-tracking branch 'origin/develop' 2024-05-27 15:46:07 +01:00
snipe
172d24fd3c Merge pull request #14770 from uberbrady/add_locations_parent_index
Add index to 'parent_id' for users with large number of locations
2024-05-27 15:43:49 +01:00
Brady Wetherington
28b450fd3c Add index to 'parent_id' for users with large number of locations 2024-05-27 15:38:42 +01:00
snipe
485caf1d92 Merge pull request #14755 from marcusmoore/chore/sc-25103/add-tests-around-asset-checkout
Added tests around asset checkout
2024-05-25 11:33:33 +01:00
snipe
29cd75a6d2 Merge pull request #14766 from snipe/chore/sc-25656/minus_icon_for_fieldsets
Changed icon, added translation
2024-05-25 11:19:56 +01:00
snipe
b3fe10baa8 Merge branch 'snipeit_v7_laravel10' into chore/sc-25656/minus_icon_for_fieldsets 2024-05-25 11:19:43 +01:00
snipe
093cc9faf0 Merge pull request #14767 from snipe/chore/sc-25657/improved-translations
Improved translations
2024-05-25 11:19:14 +01:00
snipe
be4e809254 Merge pull request #14762 from marcusmoore/chore/update-v7-test
Fixed test by removing non-existent trait
2024-05-25 11:18:54 +01:00
snipe
dc5e15f919 Added translation for external link
Signed-off-by: snipe <snipe@snipe.net>
2024-05-25 11:02:07 +01:00
snipe
ad7b291062 Added translations
Signed-off-by: snipe <snipe@snipe.net>
2024-05-25 10:55:48 +01:00
snipe
b54c1caa74 Improved translation
Signed-off-by: snipe <snipe@snipe.net>
2024-05-25 10:43:28 +01:00
snipe
c3cf123189 Better translation for custom fields
Signed-off-by: snipe <snipe@snipe.net>
2024-05-25 10:39:47 +01:00
snipe
3a2900621c Changed icon, added translation
Signed-off-by: snipe <snipe@snipe.net>
2024-05-25 10:20:52 +01:00
Godfrey M
442903ea5e trying to get link to work, fixed up markup and url 2024-05-23 16:08:18 -07:00
Marcus Moore
639cbf6d53 Remove passport:install command 2024-05-23 15:56:58 -07:00
Marcus Moore
e03b5754a8 Combine steps 2024-05-23 15:54:32 -07:00
Marcus Moore
4ce86a061f Set DB_CONNECTION 2024-05-23 15:43:59 -07:00
Marcus Moore
fa6e170feb Install passport 2024-05-23 14:01:06 -07:00
Marcus Moore
51f72daba1 Debugging step 2024-05-23 13:55:03 -07:00
Godfrey M
d3ab152d30 adds reminder notification constructor and updates markdown 2024-05-23 12:47:02 -07:00
Marcus Moore
a130033480 Revert "Add Install Passport step"
This reverts commit ef95ede833.
2024-05-23 12:45:38 -07:00
Marcus Moore
ef95ede833 Add Install Passport step 2024-05-23 12:32:34 -07:00
Marcus Moore
d06e5f25b0 Remove old trait from test 2024-05-23 11:51:08 -07:00
U-H-T
2777ac96cc add logo support for Brother TZe24mm labels 2024-05-23 11:10:23 +02:00
snipe
fd42f1ef24 Merge remote-tracking branch 'origin/develop' 2024-05-23 08:39:31 +01:00
snipe
8b3ff5a82d Handle potentially deleted admin users in license export
Signed-off-by: snipe <snipe@snipe.net>
2024-05-23 08:39:15 +01:00
Marcus Moore
482ebfbb68 Implement test 2024-05-22 17:21:29 -07:00
Marcus Moore
67c4fa2966 Improve event assertions 2024-05-22 17:14:10 -07:00
Marcus Moore
a3389a31cd Update test name and add todo 2024-05-22 17:10:16 -07:00
Marcus Moore
8d74a976a1 Merge branch 'develop' into chore/sc-25103/add-tests-around-asset-checkout 2024-05-22 16:09:27 -07:00
Marcus Moore
6d104251b3 Remove todo 2024-05-22 15:40:54 -07:00
Marcus Moore
f16c79bb9a Improve event assertions 2024-05-22 15:38:23 -07:00
Marcus Moore
1fe22e4b7b Re-order scenarios 2024-05-22 13:33:41 -07:00
Marcus Moore
c7fa2c04ad Add scenario 2024-05-22 13:33:12 -07:00
Marcus Moore
8ca882d1c8 Complete a scenario 2024-05-22 13:23:49 -07:00
Marcus Moore
5d368990dc Fix assertion 2024-05-22 13:15:51 -07:00
Brady Wetherington
4adbd7af4c Merge branch 'develop' into snipeit_v7_laravel10 2024-05-22 21:02:11 +01:00
Marcus Moore
1935a4aca3 Improve scenario naming 2024-05-22 12:47:33 -07:00
Godfrey M
c4d96f6ea3 removed extra div 2024-05-22 12:35:32 -07:00
snipe
986d5641f6 Merge remote-tracking branch 'origin/develop' 2024-05-22 18:39:25 +01:00
snipe
e163d5cfc7 Merge pull request #14753 from snipe/chore/sc-24895/add_exif_to_upgrade_php_file
Added exif to required extensions
2024-05-22 18:31:47 +01:00
snipe
b1e7c772ae Added exif to required extensions
Signed-off-by: snipe <snipe@snipe.net>
2024-05-22 18:27:52 +01:00
snipe
dce1854ac4 Merge remote-tracking branch 'origin/develop' 2024-05-22 18:04:53 +01:00
snipe
c4b4923ff8 Add @LeePorte as a contributor 2024-05-22 18:04:24 +01:00
snipe
c20d10d4f2 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
2024-05-22 17:50:14 +01:00
snipe
b0479d543d Merge branch 'develop' of https://github.com/snipe/snipe-it into develop 2024-05-22 17:49:33 +01:00
snipe
81704c1d40 Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2024-05-22 17:49:29 +01:00
snipe
d3798bf251 Merge pull request #14752 from snipe/fixes/better_handle_data_file_mismatch_in_user_files
Nicer handling of erroring when filename+log do not match
2024-05-22 17:47:39 +01:00
snipe
4bb7c1701f Fiddled with storage facade a little more
Signed-off-by: snipe <snipe@snipe.net>
2024-05-22 17:44:49 +01:00
snipe
5fd0f56258 Use proper storage facade for checking if the file exists
Signed-off-by: snipe <snipe@snipe.net>
2024-05-22 17:38:49 +01:00
snipe
37d7e89e93 Fixed error message
Signed-off-by: snipe <snipe@snipe.net>
2024-05-22 17:29:43 +01:00
snipe
3ab197075a Nicer handling of erroring when filename+log do not match
Signed-off-by: snipe <snipe@snipe.net>
2024-05-22 17:20:03 +01:00
Brady Wetherington
12e8ac8b41 Merge pull request #14751 from uberbrady/docker-permissions-fix-rebased
Fixed #12299: permissions on storage dir in Docker (rebased)
2024-05-22 16:57:35 +01:00
Lee Porte
6783dc1312 Fixed #12299: permissions on storage dir in Docker
Fixes #12299, where currently there is no recursive permissions set on
/var/www/html/storage/ during build time. As a result this requires
users to run an exec into the container and change the permissions
before they are able to initiate the setup. Without this a 500 error is
thrown and little is evident in the docker logs as to what the issue
is.
2024-05-22 16:54:07 +01:00
snipe
b489c71fa2 Removed generated file
Signed-off-by: snipe <snipe@snipe.net>
2024-05-22 13:09:02 +01:00
snipe
cf5f6f9b13 Created by OWASP Threat Dragon 2024-05-22 13:06:32 +01:00
snipe
860432acc5 Merge remote-tracking branch 'origin/develop' 2024-05-22 12:45:26 +01:00
snipe
c9f7847fb3 Merge pull request #14745 from snipe/fixes/self_api_endpoint
Refactor group syncing on user edit API endpoint
2024-05-22 12:43:22 +01:00
snipe
6fad085a7d Removed debug in test
Signed-off-by: snipe <snipe@snipe.net>
2024-05-22 12:37:49 +01:00
snipe
4b23ef4021 Added new test
Signed-off-by: snipe <snipe@snipe.net>
2024-05-22 12:35:03 +01:00
snipe
bb96a190fd Moved validator
Signed-off-by: snipe <snipe@snipe.net>
2024-05-22 12:34:48 +01:00
snipe
e1eb457f3d Update tests/Feature/Api/Users/UpdateUserApiTest.php
Co-authored-by: Marcus Moore <contact@marcusmoore.io>
2024-05-22 11:03:46 +01:00
snipe
51025aad57 Update tests/Feature/Api/Users/UpdateUserApiTest.php
Co-authored-by: Marcus Moore <contact@marcusmoore.io>
2024-05-22 11:03:38 +01:00
snipe
14c4765be2 Update tests/Feature/Api/Users/UpdateUserApiTest.php
Co-authored-by: Marcus Moore <contact@marcusmoore.io>
2024-05-22 11:00:52 +01:00
snipe
3afe996755 Update tests/Feature/Api/Users/UpdateUserApiTest.php
Co-authored-by: Marcus Moore <contact@marcusmoore.io>
2024-05-22 11:00:47 +01:00
snipe
0891bd747a Update tests/Feature/Api/Users/UpdateUserApiTest.php
Co-authored-by: Marcus Moore <contact@marcusmoore.io>
2024-05-22 11:00:31 +01:00
Godfrey M
f2693ee957 conditionally fixed redirect select option 2024-05-21 14:08:35 -07:00
Godfrey M
0327e71f0f made message the keys, cleaned up array 2024-05-21 13:26:29 -07:00
Godfrey M
69c2cf2c4f fixed assetcheckin test, created redirect option test 2024-05-21 13:13:25 -07:00
Godfrey M
9f02be0823 removed extra div 2024-05-21 10:15:18 -07:00
Godfrey M
b5553af8ed rename variable 2024-05-21 10:11:53 -07:00
Godfrey M
4d6f4303f5 fixed partial up 2024-05-21 10:11:01 -07:00
Godfrey M
8a0afae90f fixed query, fixed no email logic, needs new markdown 2024-05-21 09:42:00 -07:00
snipe
34f1ea1c0e Re-order gating and refactor group syncing
Signed-off-by: snipe <snipe@snipe.net>
2024-05-21 10:00:49 +01:00
snipe
e3561ad38e Added tests
Signed-off-by: snipe <snipe@snipe.net>
2024-05-21 09:56:57 +01:00
snipe
a7ccf0efff Added translation
Signed-off-by: snipe <snipe@snipe.net>
2024-05-21 09:56:51 +01:00
snipe
f422c2ecad Merge pull request #14741 from Godmartinz/footer-issue
removed extra div tags
2024-05-20 20:44:27 +01:00
Godfrey M
db9c435ae0 removed extra div tags 2024-05-20 10:48:57 -07:00
Godfrey M
a53f89cd2c remove license checkout changes p2 2024-05-20 10:26:45 -07:00
Godfrey M
280c03dcad remove license checkout changes 2024-05-20 10:25:59 -07:00
Godfrey M
e70fb42f87 remove license redirects 2024-05-20 10:22:01 -07:00
Brady Wetherington
f633dbba64 Merge branch 'develop' into snipeit_v7_laravel10 2024-05-20 12:55:29 +01:00
snipe
cc0f2d7074 Merge remote-tracking branch 'origin/develop' 2024-05-20 11:22:34 +01:00
snipe
a820f248c8 Merge pull request #14736 from snipe/fixes/small_translation_additions
Fixes/small translation additions
2024-05-20 11:21:47 +01:00
snipe
6a6272ace3 Translate no records found message
Signed-off-by: snipe <snipe@snipe.net>
2024-05-20 11:19:47 +01:00
snipe
bcb747f886 Added string
Signed-off-by: snipe <snipe@snipe.net>
2024-05-20 11:19:37 +01:00
snipe
771c85e347 Translated account save message
Signed-off-by: snipe <snipe@snipe.net>
2024-05-20 11:19:31 +01:00
snipe
e5c358a1fe Merge pull request #14731 from snipe/features/csp_env
Fixed #14664 - allow additional urls in env for CSP
2024-05-16 22:25:11 +01:00
snipe
52c906f6b8 Added to env.example
Signed-off-by: snipe <snipe@snipe.net>
2024-05-16 22:21:52 +01:00
snipe
ca1555d962 Fixed #14664 - allow additional urls in env for CSP
Signed-off-by: snipe <snipe@snipe.net>
2024-05-16 22:19:18 +01:00
snipe
0d4f13219b Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
2024-05-16 22:00:07 +01:00
snipe
7fdbbc846e Bumped hash
Signed-off-by: snipe <snipe@snipe.net>
2024-05-16 21:59:38 +01:00
snipe
dbbbb103a0 Merge pull request #14730 from snipe/localizations/updated_strings
Updated translations
2024-05-16 21:58:24 +01:00
snipe
2182ea1ce8 Updated translations
Signed-off-by: snipe <snipe@snipe.net>
2024-05-16 21:57:19 +01:00
snipe
f2cc9ec1dd Merge remote-tracking branch 'origin/develop' 2024-05-16 19:57:46 +01:00
snipe
54b24434e1 Set file name variable
Signed-off-by: snipe <snipe@snipe.net>
2024-05-16 19:56:58 +01:00
snipe
653ad562a4 Updated codacy link
Signed-off-by: snipe <snipe@snipe.net>
2024-05-16 18:56:44 +01:00
snipe
7743b03129 Merge remote-tracking branch 'origin/develop' 2024-05-16 18:51:27 +01:00
snipe
84a601f364 Merge pull request #14729 from snipe/fixes/attribute_for_purchase_date
Sets purchase date as date (versus datetime) in labels
2024-05-16 18:49:49 +01:00
snipe
88d131666c Sets purchase date as date (versus datetime) in labels
Signed-off-by: snipe <snipe@snipe.net>
2024-05-16 18:40:49 +01:00
snipe
d691f3b315 Merge remote-tracking branch 'origin/develop' 2024-05-16 16:37:47 +01:00
snipe
00a9d5f33e Merge pull request #14719 from snipe/fixes/add_next_audit_date_to_assets_form
Added next audit date to assets form
2024-05-16 16:33:49 +01:00
snipe
eb0fd2f519 Removed stricter validation :(
Signed-off-by: snipe <snipe@snipe.net>
2024-05-16 16:29:11 +01:00
snipe
81efaa7481 Merge branch 'develop' into fixes/add_next_audit_date_to_assets_form 2024-05-16 16:13:21 +01:00
snipe
2539c9e697 Updated assets
Signed-off-by: snipe <snipe@snipe.net>
2024-05-16 16:01:41 +01:00
snipe
3dfd471fa4 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/js/dist/all-defer.js
#	public/mix-manifest.json
2024-05-16 15:33:50 +01:00
snipe
4119526889 Merge pull request #14728 from snipe/fixes/smarter_decryption_in_activity
Only attempt to decrypt custom fields in activity log if the value is not empty
2024-05-16 15:31:18 +01:00
snipe
6b3346d90c Only attempt to decrypt if there is a value
Signed-off-by: snipe <snipe@snipe.net>
2024-05-16 15:28:25 +01:00
snipe
312ce51de6 Removed more debugging
Signed-off-by: snipe <snipe@snipe.net>
2024-05-16 15:25:57 +01:00
snipe
09914f508f Removed more debugging
Signed-off-by: snipe <snipe@snipe.net>
2024-05-16 15:16:52 +01:00
snipe
45eda0f611 Removed debug lines
Signed-off-by: snipe <snipe@snipe.net>
2024-05-16 15:09:27 +01:00
snipe
de088d452f Merge pull request #14451 from Godmartinz/add_decline_note_to_acceptance
Adds a note text area to asset acceptances/declines
2024-05-16 15:06:05 +01:00
snipe
2f18430ce4 Merge pull request #14725 from snipe/features/added_security_dot_txt
Added security.txt file
2024-05-16 09:59:46 +01:00
snipe
8d67e02d63 Added security.txt file
Signed-off-by: snipe <snipe@snipe.net>
2024-05-16 09:56:11 +01:00
Phil
1b85eea28e added new compose and env files 2024-05-16 02:13:31 +02:00
Godfrey M
fb9a5f928f removed license changes 2024-05-15 16:39:26 -07:00
Phil
4459483862 moved env. to own dev-file 2024-05-16 01:06:47 +02:00
Phil
a0cf7ecc98 moved file to dev-specific naming-scheme 2024-05-16 00:05:59 +02:00
Godfrey M
c658a0fcb4 fixes description 2024-05-15 13:20:05 -07:00
Godfrey M
f40284c413 adds acceptance reminder command 2024-05-15 13:04:58 -07:00
snipe
8e35a56386 Updated dev assets
Signed-off-by: snipe <snipe@snipe.net>
2024-05-15 20:01:04 +01:00
snipe
30f738646e Merge pull request #14700 from marcusmoore/chore/sc-25471
Updated alpine to the latest version (3.13.10)
2024-05-15 19:59:51 +01:00
snipe
55281313d8 Merge pull request #14474 from Godmartinz/asset-location-update-bug
Fixed user assets not updating when a user changes location
2024-05-15 19:20:14 +01:00
Godfrey M
786799225c remove dd 2024-05-15 10:37:07 -07:00
snipe
c137fafa97 Updated language
Signed-off-by: snipe <snipe@snipe.net>
2024-05-15 18:10:43 +01:00
snipe
cb22a3d556 Updated comments again :-/
Signed-off-by: snipe <snipe@snipe.net>
2024-05-15 17:52:50 +01:00
snipe
c7accb4599 Added comments
Signed-off-by: snipe <snipe@snipe.net>
2024-05-15 17:38:42 +01:00
snipe
72c85f93b6 Fixed test
Signed-off-by: snipe <snipe@snipe.net>
2024-05-15 16:47:45 +01:00
snipe
c1d5b8713b Removed debugging
Signed-off-by: snipe <snipe@snipe.net>
2024-05-15 16:33:48 +01:00
snipe
8310b91e00 Use UploadFileRequest for audit files
Signed-off-by: snipe <snipe@snipe.net>
2024-05-15 16:33:48 +01:00
snipe
71b5bf2eef Added visual on the hardware view screen
Signed-off-by: snipe <snipe@snipe.net>
2024-05-15 16:33:48 +01:00
snipe
ab8b40745e Added next audit date to create/edit asset screen
Signed-off-by: snipe <snipe@snipe.net>
2024-05-15 16:33:48 +01:00
snipe
16ec47573b Added help text to bulk edit blade
Signed-off-by: snipe <snipe@snipe.net>
2024-05-15 16:33:48 +01:00
snipe
556d0b44a3 Added asset
Signed-off-by: snipe <snipe@snipe.net>
2024-05-15 16:33:48 +01:00
snipe
0734d5b0b6 Added help text
Signed-off-by: snipe <snipe@snipe.net>
2024-05-15 16:33:48 +01:00
snipe
f158a369a4 Added/updated string
Signed-off-by: snipe <snipe@snipe.net>
2024-05-15 16:33:47 +01:00
snipe
bdbfb0f2a1 Added accessor and mutator for next_audit_date
Signed-off-by: snipe <snipe@snipe.net>
2024-05-15 16:33:47 +01:00
snipe
e5653eaa93 Save new data
Signed-off-by: snipe <snipe@snipe.net>
2024-05-15 16:33:47 +01:00
snipe
3c4098038d Fail early if no tag
Signed-off-by: snipe <snipe@snipe.net>
2024-05-15 16:33:47 +01:00
snipe
8841e21dc9 Removed quickscan header
Signed-off-by: snipe <snipe@snipe.net>
2024-05-15 16:33:47 +01:00
snipe
f5e03b264f Show additional help text if help text is given
Signed-off-by: snipe <snipe@snipe.net>
2024-05-15 16:33:47 +01:00
snipe
eb09a99eb0 Merge pull request #14707 from spencerrlongg/bug/sc-24912
Bulk Edit Tests and Tweaks
2024-05-15 11:22:31 +01:00
Godfrey M
dc418a7033 need to make variables names uniform 2024-05-14 14:09:54 -07:00
Godfrey M
15cc4345ab adds dynamic redirects to Assets 2024-05-14 13:25:52 -07:00
Godfrey Martinez
5272824d85 Merge branch 'develop' into asset-location-update-bug 2024-05-13 10:47:25 -07:00
snipe
9bce0f2ff7 Format fix
Signed-off-by: snipe <snipe@snipe.net>
2024-05-13 18:19:14 +01:00
snipe
d2e7e11dca Removed debug line
Signed-off-by: snipe <snipe@snipe.net>
2024-05-13 12:48:28 +01:00
snipe
6823aabf92 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
2024-05-13 10:53:07 +01:00
snipe
f2dddc1226 Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2024-05-13 10:51:44 +01:00
snipe
957becabb9 Merge pull request #14715 from snipe/dependabot/github_actions/develop/codacy/codacy-analysis-cli-action-4.4.1
Bump codacy/codacy-analysis-cli-action from 4.4.0 to 4.4.1
2024-05-13 10:26:33 +01:00
dependabot[bot]
7df03722ee Bump codacy/codacy-analysis-cli-action from 4.4.0 to 4.4.1
Bumps [codacy/codacy-analysis-cli-action](https://github.com/codacy/codacy-analysis-cli-action) from 4.4.0 to 4.4.1.
- [Release notes](https://github.com/codacy/codacy-analysis-cli-action/releases)
- [Commits](https://github.com/codacy/codacy-analysis-cli-action/compare/v4.4.0...v4.4.1)

---
updated-dependencies:
- dependency-name: codacy/codacy-analysis-cli-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-13 08:53:06 +00:00
snipe
4642f50d6b Merge remote-tracking branch 'origin/develop' 2024-05-11 15:14:57 +01:00
snipe
2decc3d6d3 Merge pull request #14711 from snipe/jerm/fix-all-query-in-sidebar-middleware
Fix memory-hog query in AssetCountForSidebar middleware
2024-05-11 01:35:09 +01:00
Jeremy Price
2adc4ffa96 Fix memory-hog query in AssetCountForSidebar middleware
https://github.com/snipe/snipe-it/pull/14702/files introduced a bug
where instead of doing a quick `select count(*)` of assets, it did a `select *` of
assets, moving the count from the database to the PHP process.

This caused OOM issues in memory-constrained environments with lots of
assets, and also presented a speed issue even when memory limited were
increased.

Additionally, given this populates the sidebar, this was likely an issue
on every page load that included the sidebar.

The fix is simply removing the `all()->`, ending up with Asset::count(),
which yields the desired `select count(*)` DB query.
2024-05-10 12:54:40 -07:00
snipe
c8fbf7640c Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/css/build/app.css
#	public/css/build/overrides.css
#	public/css/dist/all.css
#	public/mix-manifest.json
2024-05-08 12:16:17 +01:00
snipe
46779ca865 Merge pull request #14697 from snipe/bug/sc-25502/disable_delete_if_not_deletable_user
Fixed UI where delete button was not disabled even if the user couldn't be deleted
2024-05-08 12:06:33 +01:00
snipe
86661e79d1 Merge pull request #14702 from Toreg87/fixes/total_asset_count
Fixes #14701 - wrong total asset count
2024-05-08 11:52:46 +01:00
Tobias Regnery
b2a5d86e30 Fixes #14701 - wrong total asset count
The total asset count in the sidenav shows the ready to deploy count instead of the total count.
Fix this by adjusting the query to all assets. Also respect the setting for archived assets.
Add a default value for total assets, since we are now using the settings-variable, which is not available during the setup process.

While at it, move the block for total assets before the ready to deploy assets to match the ordering of the sidenav.

Signed-off-by: Tobias Regnery <tobias.regnery@gmail.com>
2024-05-08 09:34:35 +02:00
Marcus Moore
d7f0ee49b7 Update Alpine to 3.13.10
Includes fix to new label engine.
2024-05-07 17:08:05 -07:00
spencerrlongg
5b86ee7291 a couple more tests 2024-05-07 17:19:00 -05:00
spencerrlongg
ad2ba252ee two new test 2024-05-07 15:11:33 -05:00
spencerrlongg
17ef20ea92 alright, in a working place 2024-05-07 14:08:47 -05:00
snipe
8c327e6523 Handle user not found properly
Signed-off-by: snipe <snipe@snipe.net>
2024-05-07 19:16:56 +01:00
snipe
386b2839e8 Added tests
Signed-off-by: snipe <snipe@snipe.net>
2024-05-07 18:59:24 +01:00
snipe
934593e0b6 Updated icon
Signed-off-by: snipe <snipe@snipe.net>
2024-05-07 18:09:55 +01:00
snipe
a7aa178f24 Used localized strings
Signed-off-by: snipe <snipe@snipe.net>
2024-05-07 17:56:07 +01:00
snipe
69122034e7 Fixed icon table headers
Signed-off-by: snipe <snipe@snipe.net>
2024-05-07 17:55:33 +01:00
snipe
1117f4289d Added string
Signed-off-by: snipe <snipe@snipe.net>
2024-05-07 17:55:10 +01:00
snipe
97bc4a092f Removed debugging
Signed-off-by: snipe <snipe@snipe.net>
2024-05-07 17:40:48 +01:00
snipe
d942b8f1fb Fixed alias names
Signed-off-by: snipe <snipe@snipe.net>
2024-05-07 17:40:35 +01:00
snipe
49dc9767b6 Added debugging :(
Signed-off-by: snipe <snipe@snipe.net>
2024-05-07 15:54:43 +01:00
snipe
482965197d Added users, locations to presenter, transformer
Signed-off-by: snipe <snipe@snipe.net>
2024-05-07 12:07:41 +01:00
snipe
410b547f3c Added users and locatipon count to API
Signed-off-by: snipe <snipe@snipe.net>
2024-05-07 12:07:28 +01:00
snipe
f769e8247f Added ManagedUsers method, additional checks in isDeletable()
Signed-off-by: snipe <snipe@snipe.net>
2024-05-07 12:07:15 +01:00
snipe
2b4a536f85 Added CSS for users, locations
Signed-off-by: snipe <snipe@snipe.net>
2024-05-07 12:06:54 +01:00
snipe
92ae069629 Disable button in UI if user cannot be deleted
Signed-off-by: snipe <snipe@snipe.net>
2024-05-07 12:06:35 +01:00
snipe
6f40b21986 Merge remote-tracking branch 'origin/develop' 2024-05-07 08:38:09 +01:00
snipe
3084521521 Merge pull request #14693 from snipe/fixes/14692_view_share_undefined
Fixes #14692 - set default variables for sidebar totals
2024-05-07 08:37:10 +01:00
snipe
4f12c86e74 Fixes #14692 - set default variables for sidebar totals
Signed-off-by: snipe <snipe@snipe.net>
2024-05-07 08:34:22 +01:00
snipe
204de99a64 Merge remote-tracking branch 'origin/develop' 2024-05-07 08:12:31 +01:00
snipe
fd929f5dd9 Merge pull request #14690 from marcusmoore/import-settings-properly
Load settings in `SendUpcomingAuditReport` command
2024-05-07 07:42:34 +01:00
Marcus Moore
7e9c8ba290 Remove duplicate settings call 2024-05-06 17:08:16 -07:00
Marcus Moore
6f639f7bf0 Load settings properly in SendUpcomingAuditReport command 2024-05-06 16:44:14 -07:00
snipe
3594ed67d1 Removed back buttons on settings index
Signed-off-by: snipe <snipe@snipe.net>
2024-05-06 20:48:32 +01:00
snipe
d36a06d8e1 Merge remote-tracking branch 'origin/develop' 2024-05-06 20:34:49 +01:00
snipe
c816b960b5 Fixed stray closing paren
Signed-off-by: snipe <snipe@snipe.net>
2024-05-06 20:34:36 +01:00
Brady Wetherington
5b02a43957 Merge branch 'develop' into snipeit_v7_laravel10 2024-05-06 18:44:03 +01:00
snipe
4913e56086 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
2024-05-06 18:43:48 +01:00
snipe
4d00bb98d1 Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2024-05-06 18:39:55 +01:00
snipe
db2baae758 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/css/dist/all.css
#	public/js/dist/bootstrap-table.js
#	public/mix-manifest.json
2024-05-06 18:37:52 +01:00
snipe
fdecdf4b15 Merge pull request #14689 from KorvinSzanto/develop
Capitalize `N` instead of `y` since no is default
2024-05-06 17:48:16 +01:00
Korvin Szanto
5c1d4aff23 Capitalize N instead of y since no is default 2024-05-06 09:00:33 -07:00
snipe
bf0edcb92e docs: add @gitgrimbo as a contributor 2024-05-06 12:59:26 +01:00
snipe
39fa8ef3c0 docs: add @chandanchowdhury as a contributor 2024-05-06 12:55:47 +01:00
snipe
9e8a369bc8 docs: add @PP-JN-RL as a contributor 2024-05-06 12:54:35 +01:00
snipe
3f3fe8935f docs: add @jeffclay as a contributor 2024-05-06 12:54:20 +01:00
snipe
82387630c7 docs: add @squintfox as a contributor 2024-05-06 12:54:06 +01:00
snipe
16c5033514 docs: add @Q4kK as a contributor 2024-05-06 12:53:34 +01:00
snipe
46ffaee1e4 docs: add @franceslui as a contributor 2024-05-06 12:53:06 +01:00
snipe
d936f92a7d docs: add @mustafa-online as a contributor 2024-05-06 12:52:46 +01:00
snipe
b424ddf42d docs: add @koiakoia as a contributor 2024-05-06 12:51:40 +01:00
snipe
b3d5a893fc Fixed text
via (@koiakoia )

Signed-off-by: snipe <snipe@snipe.net>
2024-05-06 12:49:54 +01:00
snipe
69ea6eebae Merge pull request #14688 from snipe/security/Upgrade-tableexport.jquery.plugin-from-1.28.0-to-1.30.0
[Snyk] Upgrade tableexport.jquery.plugin from 1.28.0 to 1.30.0 #14656
2024-05-06 12:47:01 +01:00
snipe
0892c34125 [Snyk] Upgrade tableexport.jquery.plugin from 1.28.0 to 1.30.0 #14656
Signed-off-by: snipe <snipe@snipe.net>
2024-05-06 12:45:33 +01:00
snipe
52e14d501f Merge pull request #14687 from snipe/security/upgrade_fontawesome_from-6.5.1-to-6.5.2
Upgrade fontawesome from 6.5.1 to 6.5.2
2024-05-06 12:22:50 +01:00
snipe
4d093160fc Upgrade @fortawesome/fontawesome-free from 6.5.1 to 6.5.2 #14647
Signed-off-by: snipe <snipe@snipe.net>
2024-05-06 12:21:34 +01:00
snipe
0bcca99573 Merge pull request #14686 from snipe/security/upgrade_alpine_to_3.13.8
[Snyk] Upgrade alpinejs from 3.13.5 to 3.13.8 #14646
2024-05-06 12:16:00 +01:00
snipe
63516c4a4f [Snyk] Upgrade alpinejs from 3.13.5 to 3.13.8 #14646
Signed-off-by: snipe <snipe@snipe.net>
2024-05-06 12:12:59 +01:00
snipe
19fb79ffff Merge pull request #14661 from ubc-cpsc/bugfix/CVE-2024-32489
Upgrade tecnickcom/tcpdf from version 6.7.4 to 6.7.5 to address the security vulnerability CVE-2024-22640
2024-05-06 11:58:31 +01:00
snipe
02835de13d Merge pull request #14679 from mustafa-online/develop
Improve RTL support
2024-05-04 15:47:14 +01:00
Mustafa Online
55b004d53d Improve RTL support 2024-05-04 13:32:42 +02:00
Mustafa Online
c1b72a8ce6 Revert "Improve RTL support"
This reverts commit fa0bea87e6.
2024-05-04 13:31:52 +02:00
Mustafa Online
fa0bea87e6 Improve RTL support
I'm starting to make some improvements to RTL support, more PR's to come to address other parts.
2024-05-04 13:17:48 +02:00
Godfrey M
c94a7613ca dropdown redirect options, helper function and session variable added 2024-05-02 12:16:20 -07:00
snipe
d146426dd8 Updated prod assets
Signed-off-by: snipe <snipe@snipe.net>
2024-05-02 14:02:53 +01:00
snipe
1e1782c232 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/css/build/app.css
#	public/css/build/overrides.css
#	public/css/dist/all.css
#	public/mix-manifest.json
2024-05-02 14:02:36 +01:00
snipe
dab5874fd7 Merge pull request #14391 from snipe/features/add_Brother_188mm_tape_label
Added Brother 18mm label type
2024-05-02 13:14:04 +01:00
snipe
4850227c04 Merge pull request #14655 from snipe/feature/sc-25381/simpler_overdue_endpoints
Refactored due/overdue for audit, added due/overdue for checkin API endpoint and GUI
2024-05-02 13:11:51 +01:00
snipe
eb9a654cc3 Moved settings call higher
Signed-off-by: snipe <snipe@snipe.net>
2024-05-02 12:37:41 +01:00
snipe
4224bc0c43 Removed extra settings param
Signed-off-by: snipe <snipe@snipe.net>
2024-05-02 12:36:57 +01:00
snipe
f893b23129 Refactored title blade areas
Signed-off-by: snipe <snipe@snipe.net>
2024-05-02 12:35:52 +01:00
snipe
8c65880504 Changed badge to span in default blade
Signed-off-by: snipe <snipe@snipe.net>
2024-05-02 12:35:41 +01:00
snipe
53cadf80fa Removed assertions for factories
Signed-off-by: snipe <snipe@snipe.net>
2024-05-02 12:24:31 +01:00
spencerrlongg
e177993bcc notes and some playing around, push for eod 2024-05-01 16:57:11 -05:00
spencerrlongg
6a7f3ecc2e new test not quite working, almost there 2024-05-01 16:12:56 -05:00
spencerrlongg
39cc99c89b all initial attributes set in test 2024-04-30 22:22:59 -05:00
spencerrlongg
25480293dc change keys to values, add test 2024-04-30 18:03:26 -05:00
Frances Lui
8b3bfc6bc9 Fixes CVE-2024-32489 2024-04-29 16:33:00 -07:00
snipe
19cff25300 Merge pull request #14651 from marcusmoore/bug/sc-25402
Fixed `purchase_cost` not being allowed to be a string when creating asset via api
2024-04-27 03:39:10 +01:00
snipe
848e1fe1f6 Refactored audit alerts
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 21:26:00 +01:00
snipe
fe147adec3 Refactor checkin alert
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 21:10:54 +01:00
snipe
103809b65f Removed debugging
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 21:01:43 +01:00
snipe
a398496dd4 Added comments
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 21:01:27 +01:00
snipe
839db8ef44 Refactored due-or-overdue methods
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 20:59:27 +01:00
snipe
bfd0530597 Fixed notification
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 20:59:13 +01:00
snipe
494ec5cd9c Added tests for due-or-overdue
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 20:59:04 +01:00
snipe
fc61a4b88d Fixed badge HTML
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 19:50:58 +01:00
snipe
50d8b02f8b Removed unused scope
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 19:23:27 +01:00
snipe
860764a436 Use totals for sidebar
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 19:12:21 +01:00
snipe
52d6a8990a Check that the asset is not already checked in
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 19:06:46 +01:00
snipe
87de67e4a9 Fixed test for checkin
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 19:06:26 +01:00
snipe
8356b57fb4 Added translations
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 19:01:34 +01:00
snipe
3f04afee5c Removed unused method
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 19:01:26 +01:00
snipe
2117f61e8c More view sharing for sidebar
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 19:01:15 +01:00
snipe
d40604b574 Removed debugging, added date cast
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 19:01:05 +01:00
snipe
76129e9011 Use trans_choice for title
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 18:59:13 +01:00
snipe
9c8411c7ff Added checkin due blade
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 18:58:56 +01:00
snipe
c661d732b3 Refactored sidenav links for audit
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 18:58:44 +01:00
snipe
fbe9daace6 Use pattern in API route
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 18:58:29 +01:00
snipe
651001bf6e Removed duplicate routes
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 18:58:15 +01:00
snipe
9167f8a3ba Cleaned up tests
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 18:57:07 +01:00
snipe
6dc9ccffcd Refactor api for handling audit/expected checkins
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 18:56:57 +01:00
snipe
4b4e3badb7 Removed hardware audit overdue blade
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 18:53:36 +01:00
snipe
fe4dd23d39 Removed “all” text
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 15:49:12 +01:00
snipe
de6d71cc3b Use plural api endpoints in blades
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 15:47:19 +01:00
snipe
9e44052709 Switch to plural route name for API endpoint
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 15:46:58 +01:00
snipe
2d112f227a Call the asset factory directly
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 15:44:37 +01:00
snipe
bd8737d986 Changed sidenav badge class
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 15:44:21 +01:00
snipe
4b6d236eb7 Added class for sidebar menu badges
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 15:44:06 +01:00
snipe
bf058bd5c6 Use updated scopes
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 14:02:56 +01:00
snipe
dfaf01e8aa Updated asset counters
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 14:02:47 +01:00
snipe
2888dd6fd8 Added translation
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 14:02:37 +01:00
snipe
2e92ee8eee Switch to whereBetween so tests run on sqlite
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 14:02:23 +01:00
snipe
14b6a75507 Updated routes
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 14:01:38 +01:00
snipe
2484a9db2c Added tests
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 14:01:29 +01:00
snipe
bfc30794c5 Updated badge styling
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 14:01:22 +01:00
snipe
27bc7a847b Updated routes
Signed-off-by: snipe <snipe@snipe.net>
2024-04-26 14:01:11 +01:00
Marcus Moore
2a71877bec Add additional condition 2024-04-25 17:04:07 -07:00
Marcus Moore
30bd920497 Add conditional 2024-04-25 16:24:12 -07:00
Marcus Moore
1d5b48b88d Add comment and improve method 2024-04-25 16:22:15 -07:00
Marcus Moore
4295bad12f Separate test cases 2024-04-25 14:07:56 -07:00
Marcus Moore
3a2eeaea7a WIP: Future-proof rules being converted to array syntax 2024-04-24 17:40:40 -07:00
Marcus Moore
12418ae91b WIP: allow EU style purchase cost via api 2024-04-24 17:18:29 -07:00
Marcus Moore
783a24eb68 Add test for ParseCurrencyMethod 2024-04-24 17:17:42 -07:00
Brady Wetherington
3f5c5cbe82 Merge branch 'develop' into snipeit_v7_laravel10 2024-04-24 16:24:43 +01:00
snipe
2439758ef3 Merge pull request #14587 from Godmartinz/License-export-button
Added a License Export function and button
2024-04-24 04:42:56 +01:00
akemidx
ac4aa97103 develop reheading 2024-04-23 17:05:50 -04:00
akemidx
0bc93c6a1e space 2024-04-23 15:31:37 -04:00
snipe
685f1cbfb8 Merge pull request #14499 from Godmartinz/remove_encrpyt_from_labels
Removed encrypted fields from label options
2024-04-23 13:31:38 +01:00
snipe
e2d1e6b0c5 Merge pull request #14608 from akemidx/bug/sc-25232
Left Sidebar Was Not Respecting Theme
2024-04-23 12:32:48 +01:00
snipe
56cb9a0f4e Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
#	public/css/dist/skins/skin-black-dark.css
#	public/css/dist/skins/skin-black-dark.min.css
#	public/css/dist/skins/skin-blue-dark.css
#	public/css/dist/skins/skin-blue-dark.min.css
#	public/css/dist/skins/skin-green-dark.css
#	public/css/dist/skins/skin-green-dark.min.css
#	public/css/dist/skins/skin-orange-dark.css
#	public/css/dist/skins/skin-orange-dark.min.css
#	public/css/dist/skins/skin-purple-dark.css
#	public/css/dist/skins/skin-purple-dark.min.css
#	public/css/dist/skins/skin-red-dark.css
#	public/css/dist/skins/skin-red-dark.min.css
#	public/css/dist/skins/skin-yellow-dark.css
#	public/css/dist/skins/skin-yellow-dark.min.css
#	public/mix-manifest.json
2024-04-23 10:28:50 +01:00
snipe
c8c81a360c Dev assets
Signed-off-by: snipe <snipe@snipe.net>
2024-04-23 10:26:43 +01:00
snipe
bdd43b7134 Merge pull request #14602 from uberbrady/fix_saving_encrypted_custom_fields
Re-enabled updating encrypted custom fields via API [sc-41465]
2024-04-23 10:20:55 +01:00
snipe
c50d5a678a Merge pull request #14616 from akemidx/bug/sc-25235
REMOVED: Dark Theme Button Text Coloring
2024-04-23 09:20:57 +01:00
Godfrey M
96b3af7cbc fixed view from sending all custom fields 2024-04-22 18:27:34 -07:00
Godfrey Martinez
9e7bbc968d Merge pull request #15 from Godmartinz/License-export-button_p2
adds licenses available, updated teranslations
2024-04-22 17:59:52 -07:00
Godfrey M
5fc6771543 adds licenses available, updated teranslations 2024-04-22 17:58:49 -07:00
akemidx
0d049a0be7 conflict resolution 2024-04-22 20:09:40 -04:00
akemidx
01c24ab4cd translating text 2024-04-22 19:16:14 -04:00
Marcus Moore
155f5f35cd Remove todo 2024-04-22 15:47:05 -07:00
snipe
7ad6caf30a Merge pull request #14632 from marcusmoore/bug/sc-25384
Added "select" option to top of data sources in new label engine
2024-04-22 20:40:31 +01:00
Marcus Moore
ac8aab0043 Add default "select an option" to data source options 2024-04-22 12:22:10 -07:00
Godfrey M
14ddf36d46 removed two duplicate translations 2024-04-22 10:43:11 -07:00
Godfrey M
25f1167c9d adds company scoping to license export 2024-04-22 10:38:55 -07:00
Godfrey M
420225c2d5 Merge branch 'refs/heads/develop' into License-export-button 2024-04-22 10:33:30 -07:00
Marcus Moore
45f5eaac5b Extract CanSkipTests trait 2024-04-22 10:32:37 -07:00
snipe
5229dd65ce Merge remote-tracking branch 'origin/develop' 2024-04-22 15:02:51 +01:00
snipe
cfe39afc11 Merge pull request #14630 from snipe/bug/sc-25377/double_encoding_assets_and_model_notes_on_upload
Removed escaping on notes for file uploads
2024-04-22 14:59:55 +01:00
snipe
2aa3ce15bd Removed escaping on notes for file uploads
Signed-off-by: snipe <snipe@snipe.net>
2024-04-22 14:55:02 +01:00
snipe
c9873da732 Merge pull request #14628 from snipe/bug/sc-25375/icon_mimetype_validation_fix
Added `ico`, `image/x-icon`, `image/vnd.microsoft.icon` to favicon validation
2024-04-22 13:58:08 +01:00
snipe
8dd71f99cc Added ico, image/x-icon,image/vnd.microsoft.icon to favicon validation
Signed-off-by: snipe <snipe@snipe.net>
2024-04-22 13:54:19 +01:00
Brady Wetherington
ab45975883 Mark custom fields tests as 'incomplete' if the DB is mysql 2024-04-22 13:11:36 +01:00
snipe
7f38ca239e Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/css/build/app.css
#	public/css/build/overrides.css
#	public/css/dist/all.css
#	public/mix-manifest.json
2024-04-19 16:24:32 +01:00
snipe
c3b982e759 Merge pull request #14622 from snipe/bug/sc-25363/z-index-bs-table-check-boxes-fix
Reeduced z-index of bs table override
2024-04-19 16:11:21 +01:00
snipe
e330e80c46 Reeduced z-index of bs table override
Signed-off-by: snipe <snipe@snipe.net>
2024-04-19 16:06:43 +01:00
akemidx
f0836d4d3a changes for button hover, removing text color changes. also added in a border for yellow and black themes 2024-04-18 19:36:35 -04:00
akemidx
1289920217 black button border 2024-04-18 19:29:56 -04:00
snipe
a6a58094c9 Merge remote-tracking branch 'origin/develop' 2024-04-18 14:26:53 +01:00
snipe
424cbd3248 Removed noisy debug
Signed-off-by: snipe <snipe@snipe.net>
2024-04-18 14:25:54 +01:00
snipe
e59b9627c7 Merge pull request #14511 from jeffclay/features/14508_pdo_ssl_verify
Fixed #14508: Added PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT options to database.php …
2024-04-18 14:23:00 +01:00
snipe
f080c0cdcd Merge pull request #14578 from Q4kK/features/add_no_interactive
Feat: add no-interactive flag for `upgrade.php`
2024-04-18 14:19:38 +01:00
snipe
29bda2ef7d Merge pull request #14613 from marcusmoore/additional-test-cases
Added test cases around modifying user groups via api
2024-04-18 13:53:03 +01:00
akemidx
e8d9701a26 array key existing 2024-04-17 19:16:25 -04:00
Marcus Moore
1d64692fd6 Add two test cases 2024-04-17 15:23:26 -07:00
snipe
6f195cb8ec Merge pull request #14591 from snipe/bug/sc-25258/naive_fix_for_user_scoping
First fix for user FMCS scoping
2024-04-17 21:49:53 +01:00
snipe
4c02a63acc Removed activated attribute on test users
Signed-off-by: snipe <snipe@snipe.net>
2024-04-17 20:29:51 +01:00
snipe
0fc9fc7516 Minor updates to tests
Signed-off-by: snipe <snipe@snipe.net>
2024-04-17 20:29:01 +01:00
snipe
4450351b75 Only sync groups if API user is superadmin
Signed-off-by: snipe <snipe@snipe.net>
2024-04-17 11:06:50 +01:00
snipe
9bb15aaf1b Added individual gates to keep response consistent with other company-ed things
Signed-off-by: snipe <snipe@snipe.net>
2024-04-17 10:57:49 +01:00
snipe
65dd729e19 Additional gates
Signed-off-by: snipe <snipe@snipe.net>
2024-04-17 10:57:20 +01:00
snipe
c21142605d Added strings
Signed-off-by: snipe <snipe@snipe.net>
2024-04-17 10:47:56 +01:00
snipe
86e274faa3 Added API tests
Signed-off-by: snipe <snipe@snipe.net>
2024-04-17 10:47:48 +01:00
snipe
5e8c129c7f Revert accidental commit
Signed-off-by: snipe <snipe@snipe.net>
2024-04-17 09:26:50 +01:00
snipe
ab3b5ca4ef Fixed tests
Signed-off-by: snipe <snipe@snipe.net>
2024-04-17 09:26:07 +01:00
Marcus Moore
60a5afd752 Merge branch 'factory-refactors' into fix_saving_encrypted_custom_fields 2024-04-16 17:15:22 -07:00
Marcus Moore
9d0ea857fe Import facade 2024-04-16 17:14:17 -07:00
Marcus Moore
f763aea4fc Update tests to send post request 2024-04-16 17:13:18 -07:00
Marcus Moore
e16c04250e Improve model factories 2024-04-16 16:58:28 -07:00
Marcus Moore
ad99aa460b Remove unneeded imports 2024-04-16 15:09:49 -07:00
Marcus Moore
e47f64f62d Separate test methods 2024-04-16 15:03:05 -07:00
Marcus Moore
c6d9da1571 Remove unneeded fields in factory state 2024-04-16 12:36:41 -07:00
Marcus Moore
ab561d1ce8 Simplify factory state 2024-04-16 12:36:13 -07:00
akemidx
f39ba0136c errant carraige return 2024-04-16 14:26:18 -04:00
akemidx
df60045bfe sidebar hover fix 2024-04-16 14:21:47 -04:00
akemidx
5e122f780f sidebar_hover_color 2024-04-16 14:00:20 -04:00
Marcus Moore
eefe377159 Correct order of arguments 2024-04-16 10:51:33 -07:00
q4kK
20920c262d Feat: add no-interactive flag for upgrade.php
Having a no-interactive flag is useful because attempting
to automate snipe-it upgrades is currently extremely janky.
You have to either:
  a) read the prompts and pass in the input (the "correct" way)
  b) pipe in input, e.g. `yes` and hope no new prompts
  are added.

With the `no-interactive` flag, this can be fixed by both
allowing new prompts to be added without conflict
to user prompts, but also allowing automated upgrades (you could
choose to crash, or assign defaults).
2024-04-16 11:54:50 -05:00
Brady Wetherington
870612be1c Break 'update' API statements into its own test file. Split tests up 2024-04-16 15:34:28 +01:00
Brady Wetherington
266424ff0e Some simple renames for better readability as suggested by Marcus 2024-04-16 15:17:02 +01:00
snipe
a8d48b758e Merge pull request #14594 from marcusmoore/bug/sc-25314/multiple-label-fields-on-one-row
Fixed label fields only showing first option
2024-04-15 18:53:03 +01:00
Brady Wetherington
67a8e0b5c6 This re-enables the ability to update encrypted custom fields via the API 2024-04-15 18:46:11 +01:00
snipe
7b7d424962 Merge pull request #13880 from Godmartinz/department-validation-bug
Fixed department validation to allow updates
2024-04-12 10:50:26 +01:00
Marcus Moore
a4e959818a Add comment 2024-04-11 17:23:28 -07:00
Marcus Moore
c3a71cc182 Improve variable names and add comment 2024-04-11 16:44:13 -07:00
Marcus Moore
da03cfdbe5 Formatting 2024-04-11 16:39:29 -07:00
Marcus Moore
2b137d76fa Trim string to avoid leading whitespace if label is empty 2024-04-11 16:38:22 -07:00
Marcus Moore
81b8c111ca Allow multiple fields to be displayed in one row 2024-04-11 15:00:14 -07:00
snipe
fce98b9ca4 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/css/dist/skins/skin-black-dark.css
#	public/css/dist/skins/skin-black-dark.min.css
#	public/css/dist/skins/skin-blue-dark.css
#	public/css/dist/skins/skin-blue-dark.min.css
#	public/css/dist/skins/skin-green-dark.css
#	public/css/dist/skins/skin-green-dark.min.css
#	public/css/dist/skins/skin-orange-dark.css
#	public/css/dist/skins/skin-orange-dark.min.css
#	public/css/dist/skins/skin-purple-dark.css
#	public/css/dist/skins/skin-purple-dark.min.css
#	public/css/dist/skins/skin-red-dark.css
#	public/css/dist/skins/skin-red-dark.min.css
#	public/css/dist/skins/skin-yellow-dark.css
#	public/css/dist/skins/skin-yellow-dark.min.css
#	public/mix-manifest.json
2024-04-11 18:58:50 +01:00
snipe
c0dcae16f7 Updated dev assets
Signed-off-by: snipe <snipe@snipe.net>
2024-04-11 18:57:06 +01:00
snipe
c604f08749 Small tweaks for troubleshooting :(
Signed-off-by: snipe <snipe@snipe.net>
2024-04-11 18:47:55 +01:00
snipe
da21424416 Merge pull request #14581 from marcusmoore/bug/sc-25237
Fixed assigned to field in new label engine
2024-04-11 15:36:18 +01:00
snipe
b5c83721ad Merge pull request #14577 from Godmartinz/signature_pad_upgrade
Upgraded Signature-pad.js  && Fixed Resizing Canvas on mobile
2024-04-11 15:35:47 +01:00
snipe
9b21fca1a0 Merge pull request #14558 from akemidx/bug/sc-25192
Fixed: Header Dropdown Menus had no hover coloring in dark themes
2024-04-11 15:35:33 +01:00
snipe
af94b07771 Merge pull request #14582 from akemidx/feature/sc-25288
Reduce Extra Space in Header Dropdown
2024-04-11 15:35:11 +01:00
snipe
0d23d28a65 Added comments
Signed-off-by: snipe <snipe@snipe.net>
2024-04-11 15:15:56 +01:00
snipe
710370ac24 Added scoping for destroy
Signed-off-by: snipe <snipe@snipe.net>
2024-04-11 14:58:25 +01:00
snipe
ed0a441e4d Refactor destroy method
Signed-off-by: snipe <snipe@snipe.net>
2024-04-11 14:52:03 +01:00
snipe
24e87cc0bb Updated comment
Signed-off-by: snipe <snipe@snipe.net>
2024-04-11 14:51:49 +01:00
snipe
460693c153 Added comment
Signed-off-by: snipe <snipe@snipe.net>
2024-04-11 14:40:13 +01:00
snipe
f54a94bd4c Refactorered methods
Signed-off-by: snipe <snipe@snipe.net>
2024-04-11 14:40:00 +01:00
snipe
a19b86add0 Re-ordered scoping for admins, added comments
Signed-off-by: snipe <snipe@snipe.net>
2024-04-11 14:39:37 +01:00
snipe
570944a48b Updated translation
Signed-off-by: snipe <snipe@snipe.net>
2024-04-11 14:38:52 +01:00
snipe
5829b02323 Added translation
Signed-off-by: snipe <snipe@snipe.net>
2024-04-11 14:38:47 +01:00
Marcus Moore
5567a1e9ac Formatting 2024-04-10 17:37:11 -07:00
Marcus Moore
fa5016713f Implement test 2024-04-10 17:29:44 -07:00
Marcus Moore
f28a82de71 Implement some tests, scaffold others 2024-04-10 17:27:07 -07:00
Marcus Moore
7c2fae7b9d Scaffold api test cases 2024-04-10 17:08:45 -07:00
Marcus Moore
70934e54cf Remove unneeded comment 2024-04-10 16:34:14 -07:00
Marcus Moore
f6ad275030 Clean ups 2024-04-10 16:28:48 -07:00
Marcus Moore
6666a78936 Organization 2024-04-10 16:19:04 -07:00
Marcus Moore
bbb2cdcceb Add note 2024-04-10 16:15:43 -07:00
Marcus Moore
6b6e18695f Account for null asset in factory state 2024-04-10 16:12:47 -07:00
Marcus Moore
b63962e90b Add additional assertions 2024-04-10 16:01:15 -07:00
Marcus Moore
4434de6241 Add test case 2024-04-10 15:47:26 -07:00
Godfrey M
a2bca0e358 fixed comments 2024-04-10 15:05:21 -07:00
Marcus Moore
6d572424ac Add validation around dates 2024-04-10 14:02:25 -07:00
Marcus Moore
d371d14c1f Implement test 2024-04-10 13:49:07 -07:00
Marcus Moore
72eda1e909 Improve naming 2024-04-10 13:29:31 -07:00
Marcus Moore
7dbf8a8a8e Add tests for asset and location check out 2024-04-10 13:28:52 -07:00
Godfrey M
133fdd7a37 fix conditional 2024-04-10 12:31:04 -07:00
Godfrey M
0849262243 fixed notes 2024-04-10 12:19:34 -07:00
Godfrey M
17095feb33 fix typo 2024-04-10 12:15:48 -07:00
Godfrey M
f42ae46338 exports all licenses 2024-04-10 12:14:44 -07:00
Marcus Moore
37ebf1827f Organization 2024-04-10 12:12:44 -07:00
Marcus Moore
e65252725a Add simple test for LogListener 2024-04-10 11:52:59 -07:00
Marcus Moore
6f53f2ac64 Finish implementing test case 2024-04-10 11:43:50 -07:00
Godfrey M
e2679852ce added export button, half the logic for export method 2024-04-10 11:31:30 -07:00
Marcus Moore
deaba46e1c Merge branch 'develop' into chore/sc-25103/add-tests-around-asset-checkout 2024-04-10 11:01:35 -07:00
snipe
989dab6259 Moved company scoping methods to group them together
Signed-off-by: snipe <snipe@snipe.net>
2024-04-10 14:35:13 +01:00
snipe
adacdc038d Apply company scoping for users
Signed-off-by: snipe <snipe@snipe.net>
2024-04-10 12:34:32 +01:00
akemidx
f0aefaac42 padding fix 2024-04-09 17:51:42 -04:00
Marcus Moore
1aeaa0094a Fix assigned to in labels 2024-04-09 13:52:54 -07:00
akemidx
6d3fa12f37 white texty for dropdown lists 2024-04-09 14:52:43 -04:00
Godfrey M
052f1eedd0 fixes signature canvas refresh on mobile 2024-04-09 10:30:33 -07:00
Godfrey M
858da800be attempting to lock screen orientation 2024-04-09 09:40:39 -07:00
snipe
954cac3af7 Merge remote-tracking branch 'origin/develop' 2024-04-08 10:56:04 +01:00
snipe
d0f171ebc6 Merge pull request #14567 from snipe/bug/sc-25257
Remove city as required field on location modal
2024-04-08 10:54:09 +01:00
snipe
90cf612ac7 Remove city as required field on location modal
Signed-off-by: snipe <snipe@snipe.net>
2024-04-08 10:50:52 +01:00
snipe
802b5863ab Merge remote-tracking branch 'origin/develop' 2024-04-08 08:49:54 +01:00
snipe
4baa949a99 Merge pull request #14557 from Godmartinz/add-audit-date-to-labels
Added audit dates to label options
2024-04-08 04:59:53 +01:00
snipe
3bed04a6d3 Merge pull request #14559 from Godmartinz/ldap_location_bug
Fixed  ldap location syncing incorrect locations for users.
2024-04-08 04:59:27 +01:00
Godfrey M
d548b800d5 nullifies location after ldap user sync 2024-04-04 15:43:33 -07:00
akemidx
f7f199d929 black hover bg for dark yellow theme 2024-04-04 15:51:46 -04:00
akemidx
5519fddb78 new clean branch for color change 2024-04-04 15:50:30 -04:00
Godfrey M
a9ed748fb2 adds audit dates to label options 2024-04-04 11:39:49 -07:00
snipe
dcba2bfd25 Merge pull request #14529 from mauro-miatello/develop
Hide/Show encrypted values in hardware list
2024-04-04 15:07:58 +01:00
snipe
72c91ead8b Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/css/build/app.css
#	public/css/build/overrides.css
#	public/css/dist/all.css
#	public/mix-manifest.json
2024-04-04 15:06:37 +01:00
snipe
774d0aa90c Updated dev assets
Signed-off-by: snipe <snipe@snipe.net>
2024-04-04 15:05:35 +01:00
snipe
2eea67ce34 Merge pull request #14547 from Godmartinz/user-dropdown-media-change
Fixed alignment of dropdown menu for user in nav bar
2024-04-04 15:04:36 +01:00
snipe
db1c44f921 Merge pull request #14552 from snipe/bug/sc-25229/redirect_if_already_checked_in
Redirect on checkin if the asset is already checked in
2024-04-04 15:01:43 +01:00
snipe
e11287ec25 Redirect on checkin if the asset is already checked in
Signed-off-by: snipe <snipe@snipe.net>
2024-04-04 15:00:55 +01:00
snipe
4f10adfb76 Merge remote-tracking branch 'origin/develop' 2024-04-04 14:27:35 +01:00
snipe
f22803c59f Merge pull request #14551 from snipe/bug/sc-25221/ambiguous_id_in_custom_report
Fixed ambiguous id clause in custom report
2024-04-04 14:25:43 +01:00
snipe
a72d4e5dc1 Fixed ambiguous id clause in custom report
Signed-off-by: snipe <snipe@snipe.net>
2024-04-04 14:23:58 +01:00
Godfrey M
08f9aae8ae adds note to log listener and checkout accept notif 2024-04-03 11:59:47 -07:00
Godfrey M
43c32fa1bf fix class name in migration 2024-04-03 11:47:08 -07:00
Godfrey M
5afe024644 changed translation on asset acceptancen blade 2024-04-03 11:40:48 -07:00
Godfrey M
c01bdb42fc renamed migration 2024-04-03 11:39:17 -07:00
Godfrey M
e3ef8d295f Merge remote-tracking branch 'origin/add_decline_note_to_acceptance' into add_decline_note_to_acceptance 2024-04-03 11:37:05 -07:00
Godfrey M
ce1d677cdc adds note to acceptance 2024-04-03 11:36:03 -07:00
Godfrey M
df5cacf8a2 removed front end if statement 2024-04-03 11:06:05 -07:00
Godfrey M
bb2c73348d only grabs custom Fields that are not encrpyted 2024-04-03 11:03:58 -07:00
Godfrey M
4327653d70 remove db cleaner for encrypted selections 2024-04-03 10:57:41 -07:00
Godfrey M
5f7f4c9b91 aligns dropdown menu for user in nav 2024-04-03 10:41:50 -07:00
snipe
d44202e55b Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/css/build/app.css
#	public/css/build/overrides.css
#	public/css/dist/all.css
#	public/mix-manifest.json
2024-04-03 13:09:48 +01:00
snipe
df95447ea4 New dev assets
Signed-off-by: snipe <snipe@snipe.net>
2024-04-03 13:08:08 +01:00
snipe
01852c7188 Merge pull request #14520 from Godmartinz/loading_overlap_bug
fixes z-index of table load
2024-04-03 13:07:14 +01:00
snipe
79c5697042 Fixed dev - take 2!
Signed-off-by: snipe <snipe@snipe.net>
2024-04-03 13:06:49 +01:00
Brady Wetherington
65e21faa3e Merge branch 'develop' into snipeit_v7_laravel10
Hopefully, last merge?
2024-04-02 20:34:04 +01:00
MrM
658ba092e2 Hide encrypted values in hardware list
Encrypted values are now hidden also in hardware list, clicking on them show the decrypted value
2024-03-31 18:55:58 +02:00
MrM
b221d99e7b Encrypted values enhancement
Show asterisks instead of the value, respecting the length of the field
2024-03-31 12:27:35 +02:00
snipe
b7af049589 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
2024-03-29 13:20:22 +00:00
snipe
c2d863da99 Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2024-03-29 13:19:22 +00:00
snipe
6f9ba6ede4 Merge remote-tracking branch 'origin/develop' 2024-03-29 12:49:22 +00:00
snipe
df4e6a0023 Fixed typo in Polish
I will fix this in CrowdIn shortly

Signed-off-by: snipe <snipe@snipe.net>
2024-03-29 12:47:43 +00:00
snipe
d60fa65f85 Merge remote-tracking branch 'origin/develop' 2024-03-28 21:59:36 +00:00
snipe
8081a82fe4 Merge branch 'develop' of https://github.com/snipe/snipe-it into develop 2024-03-28 21:58:58 +00:00
snipe
f42e5d5292 Reverting the store/update asset API responses for now
This currently breaks the Jamf integration - need a better longer term plan.

Signed-off-by: snipe <snipe@snipe.net>
2024-03-28 21:58:49 +00:00
snipe
5a3f5b03d0 Merge pull request #14456 from akemidx/feature/sc-25079/legacy-locations
Default Locale value changed to en-US
2024-03-28 21:47:40 +00:00
akemidx
721902c2d4 committed for later 2024-03-28 16:44:44 -04:00
Godfrey M
a450530c74 fixes z-index of table load 2024-03-28 11:44:55 -07:00
snipe
2b4886f37f Commented out Heroic deploy for now 2024-03-28 17:43:18 +00:00
snipe
b45de3e17f Update README.md
Added alert notations
2024-03-28 17:41:46 +00:00
snipe
b2eea3e5a5 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/js/dist/all-defer.js
#	public/mix-manifest.json
2024-03-28 13:02:51 +00:00
snipe
f411c0fdd8 Merge pull request #14518 from snipe/fixes/downgrade_alpine
Downgrade alpine to 3.13.5
2024-03-28 12:59:52 +00:00
snipe
74d8431d01 Downgrade alpine to 3.13.5
Signed-off-by: snipe <snipe@snipe.net>
2024-03-28 12:58:43 +00:00
snipe
3ea0cd75a5 Merge remote-tracking branch 'origin/develop' 2024-03-28 12:27:24 +00:00
snipe
5f6c746d25 Merge pull request #14517 from snipe/bug/sc-25186/label_index
Check that the array key exists in the label engine
2024-03-28 12:26:20 +00:00
snipe
1f2d30ebf4 Check that the array key exists
Signed-off-by: snipe <snipe@snipe.net>
2024-03-28 12:25:29 +00:00
akemidx
e6b366020a lots of attempts and syntax, but no go 2024-03-27 19:05:59 -04:00
snipe
6dd6b45829 Merge remote-tracking branch 'origin/develop' 2024-03-27 20:43:34 +00:00
snipe
e5800a2dac Merge pull request #14516 from snipe/fixes/fixed_sorting_on_last_checkin_assets_api
Fixes/fixed sorting on last checkin assets api
2024-03-27 20:39:12 +00:00
snipe
0d3d172108 Make last_checkin searchable and fillable
Signed-off-by: snipe <snipe@snipe.net>
2024-03-27 20:37:40 +00:00
snipe
86677b5f13 Make last_checkin sortable
Signed-off-by: snipe <snipe@snipe.net>
2024-03-27 20:37:25 +00:00
snipe
3f5b94f8ad Merge remote-tracking branch 'origin/develop' 2024-03-27 19:52:23 +00:00
snipe
cf8cb8521b Merge pull request #14515 from squintfox/fixes-results-not-limited-by-api-params
Fixes #14289: /reports/activity API endpoint returns too many results due to orwhere
2024-03-27 19:51:58 +00:00
Robert Spadaro
ccd00caa70 Wrap where logic in additional where statement to protect appended params 2024-03-27 15:36:00 -04:00
snipe
57010b4c23 Merge pull request #14500 from Godmartinz/add-accessory-signature-to-print-all
Added signature to user print report for Accessories and Consumables
2024-03-27 19:02:59 +00:00
snipe
545a185614 Merge pull request #14262 from akemidx/bug/sc-24812
Last Checkin Date added to Hardware View and Index
2024-03-27 19:02:25 +00:00
snipe
1572e339f9 Merge pull request #14514 from snipe/localizations/new_translations_march_224
Updated translations
2024-03-27 19:01:23 +00:00
snipe
7782e5cc93 Updated translations
Signed-off-by: snipe <snipe@snipe.net>
2024-03-27 18:59:28 +00:00
Godfrey Martinez
bcdda551b3 Merge pull request #12 from Godmartinz/remove_jquery
removes jquery and updates translation
2024-03-27 11:58:11 -07:00
Godfrey M
bc66c0f223 removes jquery and updates translation 2024-03-27 11:56:47 -07:00
Jeff Clay
1b8c7ff4ec Added PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT options to database.php and updated .env files to provide value for the new option. 2024-03-27 11:38:13 -05:00
snipe
3bb81d1e4d Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/js/dist/all-defer.js
#	public/mix-manifest.json
2024-03-27 16:18:28 +00:00
snipe
756c44fcba Merge pull request #14510 from snipe/snyk/Upgrade-alpinejs-from-3.13.5-to-3.13.6
[Snyk] Upgrade alpinejs from 3.13.5 to 3.13.6
2024-03-27 16:14:53 +00:00
snipe
befa4428d0 Merge pull request #14509 from snipe/feature/sc-25173/filter_assigned_user_assets_by_category_id
Added ability to filter in user's assigned assets by category ID and model ID
2024-03-27 16:13:51 +00:00
snipe
60c678680a [Snyk] Upgrade alpinejs from 3.13.5 to 3.13.6
Signed-off-by: snipe <snipe@snipe.net>
2024-03-27 16:12:57 +00:00
snipe
8bc9688d71 Added ability to filter on category ID and model ID from user’s asset API
Signed-off-by: snipe <snipe@snipe.net>
2024-03-27 16:04:00 +00:00
Godfrey M
aa8af2220c trying to remove an encrypted field but not all fields 2024-03-26 16:10:08 -07:00
akemidx
b124b9af4d adding in change to settings table 2024-03-26 16:50:39 -04:00
snipe
ae403da8c1 Merge pull request #14502 from marcusmoore/bug/sc-25004/pwd_secure_complexity-validation
Added validation around `pwd_secure_complexity`
2024-03-26 20:05:04 +00:00
Marcus Moore
b5b8777c94 Extract translation string 2024-03-26 12:23:57 -07:00
snipe
850f85ff59 Merge pull request #14369 from spencerrlongg/bug/sc-24343
Add new validator for custom field checkboxes and fix asset model default updates
2024-03-26 19:22:29 +00:00
Godfrey M
84cc88831d adds signature for components 2024-03-26 12:18:10 -07:00
Godfrey M
f4f9b165a7 moves signature check inside of td 2024-03-26 11:24:34 -07:00
Godfrey M
3222d4c8df adds signature check 2024-03-26 09:18:34 -07:00
Godfrey M
3173ead2e7 adds accessory signature to user print report 2024-03-26 09:11:54 -07:00
Godfrey M
040f826c52 removes encrypted fields as a selectable option for labels 2024-03-26 08:57:18 -07:00
snipe
89d733d442 Merge remote-tracking branch 'origin/develop' 2024-03-26 14:53:24 +00:00
snipe
df49e8350f Merge pull request #14498 from snipe/features/limit_report_by_admin
Fixed #14495 - Allow user_id to be passed to limit to only specific admins
2024-03-26 14:52:03 +00:00
snipe
3ced85080a Fixed #14495 - Allow user_id to be passed to limit to only specific admins
Signed-off-by: snipe <snipe@snipe.net>
2024-03-26 14:45:20 +00:00
snipe
0611ab9b4c Merge remote-tracking branch 'origin/develop' 2024-03-26 12:29:39 +00:00
snipe
f450cafe3e Fixed missing div
Signed-off-by: snipe <snipe@snipe.net>
2024-03-26 12:29:25 +00:00
snipe
1f29eb1875 Merge pull request #14494 from snipe/features/add_supplier_address_to_licenses
Added supplier details to license view
2024-03-26 12:20:57 +00:00
snipe
a4e5ae0938 Removed duplicates
Signed-off-by: snipe <snipe@snipe.net>
2024-03-26 12:20:27 +00:00
snipe
77dacfcc30 Show if deleted supplier
Signed-off-by: snipe <snipe@snipe.net>
2024-03-26 12:19:29 +00:00
snipe
0d9b6eaf71 Added supplier details to license view
Signed-off-by: snipe <snipe@snipe.net>
2024-03-26 12:18:04 +00:00
snipe
7060ffaf34 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
#	public/js/dist/bootstrap-table.js
#	public/mix-manifest.json
2024-03-26 11:17:07 +00:00
snipe
02a37e2f89 Bumped hash
Signed-off-by: snipe <snipe@snipe.net>
2024-03-26 10:16:46 +00:00
snipe
9c1b1bc2b5 Removed fre-order columns - it’s not currently used
Signed-off-by: snipe <snipe@snipe.net>
2024-03-26 10:15:46 +00:00
snipe
b34156ca25 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/js/dist/bootstrap-table.js
#	public/mix-manifest.json
2024-03-26 09:58:35 +00:00
snipe
61bdb57b5d Merge pull request #14492 from snipe/feature/sc-25142/deeplink_search_urls
Fixed #14483 - adds deeplinking to search/sort/pagination
2024-03-26 09:55:50 +00:00
snipe
9df84e235c Check for config variable
Signed-off-by: snipe <snipe@snipe.net>
2024-03-26 09:54:40 +00:00
snipe
566ba4783e Fixed #14483 - adds deeplinking to search/sort/pagination
Signed-off-by: snipe <snipe@snipe.net>
2024-03-26 09:50:01 +00:00
snipe
b41b4b1732 Merge remote-tracking branch 'origin/develop' 2024-03-26 08:48:44 +00:00
snipe
ccf9457c45 Merge pull request #14491 from PP-JN-RL/patch-1
Added Dymo Labelwriter 1933081
2024-03-26 08:46:03 +00:00
snipe
53aabdab66 Merge remote-tracking branch 'origin/develop' 2024-03-26 08:33:40 +00:00
snipe
8ff85c952e Fixed labelwriter 2112283 namespace
Signed-off-by: snipe <snipe@snipe.net>
2024-03-26 08:33:30 +00:00
Phil J R
afe1cb8234 Create LabelWriter_1933081.php
Added a longer version of the existing label (25 x 54mm vs. 25 x 89mm) due to better availability and to support longer asset names.
2024-03-26 08:29:47 +00:00
snipe
bd42505799 Merge remote-tracking branch 'origin/develop' 2024-03-26 08:23:40 +00:00
snipe
6c735c97c6 Merge pull request #14490 from snipe/bug/sc-25141/bad_method_call_model_restore_from_view
Fixed #14482 - bad method call model restore from view
2024-03-26 08:21:27 +00:00
snipe
31a57cdf14 Fixed #14482 - bad method call on restore from view
Signed-off-by: snipe <snipe@snipe.net>
2024-03-26 08:18:59 +00:00
snipe
7ebbef25e7 Standardize button styling
Signed-off-by: snipe <snipe@snipe.net>
2024-03-26 08:18:36 +00:00
Phil J R
f836342194 Rename Label_Writer_2112283.php to LabelWriter_2112283.php
Fix the name of LabelWWriter_2112283 to be consistent with the existing one.
2024-03-26 08:16:00 +00:00
spencerrlongg
5cf1a6c300 new validator for radio buttons 2024-03-25 21:03:13 -05:00
Marcus Moore
bd506820b7 Display error message 2024-03-25 17:59:39 -07:00
Marcus Moore
5815607924 Add validation for pwd_secure_complexity 2024-03-25 17:45:41 -07:00
spencerrlongg
9b40c9788f rm commented tests 2024-03-25 18:58:49 -05:00
snipe
67b5e9093e Merge pull request #14488 from marcusmoore/bug/pass-last-audit-date-through-for-validation
Handle badly formatted `last_audit_date` in `StoreAssetRequest`
2024-03-25 20:57:20 +00:00
Marcus Moore
57d1c036ec Improve method name 2024-03-25 13:53:30 -07:00
Marcus Moore
71722b753d Little bit of clean up 2024-03-25 13:49:03 -07:00
Marcus Moore
a2625c889a Improve comment 2024-03-25 13:48:32 -07:00
Marcus Moore
c98b9da612 Pass last_audit_date through for model level validation if not a date 2024-03-25 13:47:24 -07:00
Marcus Moore
675717ff82 Add failing test 2024-03-25 13:46:22 -07:00
snipe
83ef7c6fe8 Merge pull request #14486 from marcusmoore/bug/sc-25139
Fixes `last_audit_date` not being stored via API correctly
2024-03-25 19:49:54 +00:00
Marcus Moore
5f4c964309 Account for last_audit_date not being provided 2024-03-25 12:45:11 -07:00
Marcus Moore
66ba96d531 Set last_audit_date to valid format in StoreAssetRequest 2024-03-25 12:38:12 -07:00
snipe
d67b2da064 Merge pull request #14485 from PP-JN-RL/patch-1
Created Dymo LabelWriter Label 2112283
2024-03-25 16:50:10 +00:00
Phil J R
e45fd4088f Created Dymo LabelWriter Label 2112283
I have added the layout for the Dymo LabelWriter 2112283 Labels.
They are: DYMO 2112283 DURABLE SMALL MULTI PURPOSE LABELS (160 LABELS) - 25 X 54MM
2024-03-25 16:31:20 +00:00
spencerrlongg
7e4a0eedf0 rm dumb note 2024-03-25 10:46:26 -05:00
snipe
3f812f696d Merge pull request #14472 from snipe/fixes/last_audit_date_via_api
Added validation for last_audit_date and next_audit_date
2024-03-25 14:35:42 +00:00
Godfrey M
633249b08a user assets get updated when a user changes location 2024-03-21 15:15:40 -07:00
Godfrey M
21c3b1fbd2 rename declined message to note, increased width of textarea 2024-03-21 14:03:25 -07:00
snipe
e9e6f925bf Updated validation
Signed-off-by: snipe <snipe@snipe.net>
2024-03-21 18:34:39 +00:00
snipe
828b84084d Added validation for last_audit_date and next_audit_date
Signed-off-by: snipe <snipe@snipe.net>
2024-03-21 18:29:38 +00:00
snipe
a6a0bfacc2 Merge remote-tracking branch 'origin/develop' 2024-03-21 18:03:19 +00:00
snipe
c4b7e77498 Merge pull request #14089 from spencerrlongg/bug/escaped_quotes_in_listbox
Use `htmlentities()` instead of `htmlspecialcharacters()` on Custom Field Listbox Values
2024-03-21 12:55:25 +00:00
snipe
91c7180bfd Merge pull request #14469 from snipe/feature/sc-19515/2fa_reset_log
Added 2FA reset log entry
2024-03-21 12:52:22 +00:00
Marcus Moore
b368acf941 Implement test case 2024-03-20 17:46:09 -07:00
snipe
7c39f516b9 Merge pull request #14421 from marcusmoore/fixes/add-minimal-validation-around-asset-tags
Adds a minimal amount of validation around asset_tags in AssetsController
2024-03-21 00:04:44 +00:00
snipe
ce1ddcfcee Merge pull request #14438 from marcusmoore/chore/sc-25071
Removed the need to add `InteractsWithSettings` to each test case
2024-03-21 00:03:34 +00:00
snipe
945e8b402f Only offer the 2FA reset if the user already has 2FA set up
Signed-off-by: snipe <snipe@snipe.net>
2024-03-20 23:52:51 +00:00
snipe
5ed2bd0fb7 Skip the normal edit observer
Signed-off-by: snipe <snipe@snipe.net>
2024-03-20 23:52:22 +00:00
snipe
bc908b854d Added icon
Signed-off-by: snipe <snipe@snipe.net>
2024-03-20 23:44:47 +00:00
snipe
2067b1138a Added the log item
Signed-off-by: snipe <snipe@snipe.net>
2024-03-20 23:43:58 +00:00
snipe
1ffbdee156 Updated 2FA text to not be google authenticator specific
Signed-off-by: snipe <snipe@snipe.net>
2024-03-20 23:43:30 +00:00
snipe
bd2812cac1 Added new string
Signed-off-by: snipe <snipe@snipe.net>
2024-03-20 23:43:12 +00:00
snipe
f2a5eac256 Tightened up 2FA text
Signed-off-by: snipe <snipe@snipe.net>
2024-03-20 23:43:05 +00:00
snipe
b4e647dbd1 Merge remote-tracking branch 'origin/develop' 2024-03-20 21:31:04 +00:00
Marcus Moore
530291f81c Implement some tests 2024-03-20 14:28:27 -07:00
snipe
de18e449a6 Merge pull request #14464 from snipe/features/toggle_all_columns
Added "toggle all" to column selector
2024-03-20 21:26:23 +00:00
snipe
dce19e0bea Set names and actions to switchable = false
Signed-off-by: snipe <snipe@snipe.net>
2024-03-20 21:25:50 +00:00
snipe
1f586d3102 Removed data-show-columns-toggle-all data attribute
Signed-off-by: snipe <snipe@snipe.net>
2024-03-20 21:25:16 +00:00
snipe
e5d01170d2 Fixed locale, added showColumnsToggleAll and minimumCountColumns
Signed-off-by: snipe <snipe@snipe.net>
2024-03-20 21:24:59 +00:00
Marcus Moore
393dc51167 Add assertions around the event dispatch 2024-03-20 13:44:26 -07:00
Marcus Moore
984cc7a4f2 Scaffold tests around asset checkout via web 2024-03-20 13:29:25 -07:00
snipe
0f11963127 Merge remote-tracking branch 'origin/develop' 2024-03-20 19:01:03 +00:00
snipe
d8378f2a10 Merge pull request #14468 from snipe/features/added_default_location_to_print_all_assigned
Added default location to print all assigned
2024-03-20 18:57:01 +00:00
snipe
a0a5480c97 Added default location to print all assigned
Signed-off-by: snipe <snipe@snipe.net>
2024-03-20 18:55:47 +00:00
snipe
3391108551 Merge remote-tracking branch 'origin/develop' 2024-03-20 12:57:30 +00:00
snipe
52551dad0f Merge pull request #14465 from snipe/features/14460_add_avif_format
Added #14460 add avif format
2024-03-20 12:39:14 +00:00
snipe
321414f6e3 Updated comment
Signed-off-by: snipe <snipe@snipe.net>
2024-03-20 12:38:48 +00:00
snipe
7787fe42c8 Added avif to helpers
Signed-off-by: snipe <snipe@snipe.net>
2024-03-20 12:30:28 +00:00
snipe
3b66912742 Fixed #14460 - added support for avif
Signed-off-by: snipe <snipe@snipe.net>
2024-03-20 12:25:02 +00:00
snipe
278a25c63b Added toggle all to column selector
Signed-off-by: snipe <snipe@snipe.net>
2024-03-20 12:14:41 +00:00
snipe
0d124bb5a1 Fixed indent
Signed-off-by: snipe <snipe@snipe.net>
2024-03-20 12:08:35 +00:00
snipe
417caae589 Added translation
Signed-off-by: snipe <snipe@snipe.net>
2024-03-20 12:07:18 +00:00
snipe
3d306aacc5 Fixed mismatched HTML tag
Signed-off-by: snipe <snipe@snipe.net>
2024-03-20 11:52:51 +00:00
snipe
ea4ecaea03 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/css/dist/all.css
#	public/css/dist/bootstrap-table.css
#	public/js/dist/bootstrap-table.js
#	public/mix-manifest.json
2024-03-20 11:04:34 +00:00
snipe
6c90f9e395 Merge pull request #14462 from snipe/fixes/small_ui_tweaks_for_country_dropdown
Wider country dropdown
2024-03-20 11:01:39 +00:00
snipe
ddf81ba135 Wider country dropdown
Signed-off-by: snipe <snipe@snipe.net>
2024-03-20 11:00:06 +00:00
snipe
8ebb41caa6 Merge pull request #14461 from snipe/security/update_bs_tables
[Snyk] Upgrade bootstrap-table from 1.22.2 to 1.22.3 #14455
2024-03-20 10:39:05 +00:00
snipe
faf48b1684 [Snyk] Upgrade bootstrap-table from 1.22.2 to 1.22.3 #14455
Signed-off-by: snipe <snipe@snipe.net>
2024-03-20 10:37:53 +00:00
snipe
b8232d205b Merge pull request #14457 from Godmartinz/bulk_delete_locations_bug
Fixed Bulk delete locations bug
2024-03-20 10:35:45 +00:00
Godfrey M
62745923cf fixes API location delete 2024-03-19 15:25:28 -07:00
Godfrey M
090466123f add withCount to query instead 2024-03-19 15:18:18 -07:00
Godfrey M
38a3e36cd6 fixes translation usage 2024-03-19 14:32:21 -07:00
Godfrey M
e8dc634a40 fixes translation usage 2024-03-19 14:30:53 -07:00
Godfrey M
0d0984a400 Bulk Delete Locations does not work [sc-25100] 2024-03-19 14:26:40 -07:00
akemidx
8640cad033 was using lcoations and not locale. fixed 2024-03-19 16:11:32 -04:00
akemidx
dc29717623 fixing default 2024-03-19 15:51:05 -04:00
snipe
814914924f Merge remote-tracking branch 'origin/develop' 2024-03-19 15:51:07 +00:00
snipe
c7083488b2 Merge pull request #14447 from snipe/feature/sc-25020_better_print_view
Add additional options to print all assigned view
2024-03-19 15:01:50 +00:00
snipe
4b4d383509 Removed - it’s for another PR
Signed-off-by: snipe <snipe@snipe.net>
2024-03-19 15:00:26 +00:00
Godfrey M
b9986033cc removed abbr. of variable, changed variable types in migration 2024-03-18 16:03:40 -07:00
akemidx
3680e04817 migration to set legacy locations to an standardized format 2024-03-18 18:29:59 -04:00
snipe
21e23baa37 Fixed ternary
Signed-off-by: snipe <snipe@snipe.net>
2024-03-18 21:28:46 +00:00
snipe
fcd130ae15 Layout improvements
Signed-off-by: snipe <snipe@snipe.net>
2024-03-18 21:17:46 +00:00
Godfrey M
8b52d5da85 fixed typos, reordered jquery, fixed migrations 2024-03-18 12:36:54 -07:00
Marcus Moore
d1dffb84dc Remove InteractsWithSettings trait for remaining tests 2024-03-18 12:33:45 -07:00
Marcus Moore
541350916d Merge branch 'develop' into chore/sc-25071
# Conflicts:
#	tests/Feature/Api/Users/UpdateUserApiTest.php
#	tests/Feature/Notifications/AccessoryWebhookTest.php
#	tests/Feature/Notifications/AssetWebhookTest.php
#	tests/Feature/Notifications/ComponentWebhookTest.php
#	tests/Feature/Notifications/ConsumableWebhookTest.php
#	tests/Feature/Notifications/LicenseWebhookTest.php
2024-03-18 12:33:31 -07:00
Godfrey M
01afa9a749 declined notes are reflected in the action logs 2024-03-18 10:50:15 -07:00
Godfrey M
57f5d4a570 deleted_msg saves to db 2024-03-18 10:45:47 -07:00
Godfrey M
4588393b76 adds declined msg to mail notif, updates lang files and checkout acceptance controller 2024-03-18 10:25:55 -07:00
Godfrey M
0fd99d410e adds a text field and jquery to show/hide text field 2024-03-18 09:36:09 -07:00
snipe
002fd4ce30 Nicer formatting for signoff
Signed-off-by: snipe <snipe@snipe.net>
2024-03-18 13:44:51 +00:00
snipe
7b4ecb275f Use trans choice for language
Signed-off-by: snipe <snipe@snipe.net>
2024-03-18 13:29:01 +00:00
snipe
2df5d3a8ff Fixed column selector
Signed-off-by: snipe <snipe@snipe.net>
2024-03-18 13:06:08 +00:00
snipe
7070bad53b Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/css/build/app.css
#	public/css/build/overrides.css
#	public/css/dist/all.css
#	public/mix-manifest.json
2024-03-18 12:32:22 +00:00
snipe
da62d6af26 Merge pull request #14445 from snipe/fixes/check_for_valid_license_category_on_view_assets
Make sure the category is still valid before displaying on view assets
2024-03-18 12:30:15 +00:00
snipe
d0d4d14787 Make sure the category is still valid before displaying on view assets
Signed-off-by: snipe <snipe@snipe.net>
2024-03-18 12:29:00 +00:00
snipe
09d69b214b Merge pull request #14436 from marcusmoore/chore/sc-24901
Organized notification test cases
2024-03-18 12:20:23 +00:00
snipe
0e2aaebda4 Merge pull request #14406 from mauro-miatello/develop
Hide/Show ecnrypted values when click on the lock icon
2024-03-18 12:19:54 +00:00
snipe
ec2c58163f Merge pull request #14437 from marcusmoore/chore/sc-25070
Removed dead test code
2024-03-18 12:19:35 +00:00
Marcus Moore
a28bee86ba Extract method 2024-03-14 16:33:49 -07:00
Marcus Moore
fb64892971 Re-order 2024-03-14 16:26:27 -07:00
Marcus Moore
95ff692b14 Improve InteractsWithSettings name 2024-03-14 15:06:52 -07:00
Marcus Moore
8003615b1f Move InteractsWithSettings to TestCase 2024-03-14 14:15:11 -07:00
Marcus Moore
948dc3c974 Remove duplicate trait 2024-03-14 13:11:53 -07:00
Marcus Moore
1afb724606 Remove commented (and old) test cases 2024-03-14 13:11:43 -07:00
Marcus Moore
451281d833 Delete test cases with only commented code 2024-03-14 13:11:27 -07:00
Marcus Moore
485f11c945 Move trait usage to parent TestCase 2024-03-14 12:56:49 -07:00
Marcus Moore
dbc79655b0 Cleanup 2024-03-14 12:02:56 -07:00
Marcus Moore
02f6aa6161 Add group tag for new test case 2024-03-14 11:19:36 -07:00
Marcus Moore
07c5264b41 Organize email check in notifications test 2024-03-14 11:17:47 -07:00
Marcus Moore
7c178a6a78 Merge branch 'develop' into chore/sc-24901
# Conflicts:
#	tests/Feature/Notifications/AssetWebhookTest.php
2024-03-14 11:13:14 -07:00
snipe
f56d53d7c1 Prod assets
Signed-off-by: snipe <snipe@snipe.net>
2024-03-14 17:14:33 +00:00
snipe
4cd4a936d8 Updated dev assets
Signed-off-by: snipe <snipe@snipe.net>
2024-03-14 15:43:47 +00:00
snipe
7bae4c39c6 Merge pull request #14401 from uberbrady/fix_locale_warning
Fix [sc-25008] - correct and improve legacy language warnings
2024-03-14 15:42:28 +00:00
snipe
d55d95bbea Merge pull request #14415 from Godmartinz/date_picker_z_order
Fixed z-index of date-picker
2024-03-14 15:39:11 +00:00
snipe
5e48d56561 Merge pull request #14427 from marcusmoore/bug/sc-25014
Removes the unused `mediconesystems/livewire-datatables` package
2024-03-14 15:35:53 +00:00
snipe
6a5098fb0c Merge remote-tracking branch 'origin/develop' 2024-03-14 13:26:38 +00:00
snipe
4e835e1772 Merge pull request #14430 from snipe/bug/sc-25066/fixed_requestable_search
Move requestable scope below sorting, etc
2024-03-14 13:25:44 +00:00
snipe
cce8cb4f5e Move requestable scope below sorting, etc
Signed-off-by: snipe <snipe@snipe.net>
2024-03-14 13:24:22 +00:00
Marcus Moore
8aed26aab1 Remove unneeded test cases 2024-03-13 16:56:54 -07:00
Marcus Moore
01d5d4c2c8 Improve data provider name 2024-03-13 16:37:50 -07:00
Marcus Moore
592385cb07 Remove mediconesystems/livewire-datatables package 2024-03-13 11:58:03 -07:00
snipe
85123b3e66 Rework print page
Still seeing a weird error tho, not done yet

Signed-off-by: snipe <snipe@snipe.net>
2024-03-13 12:36:17 +00:00
Marcus Moore
0fcf223960 Add minimal validation for asset_tags 2024-03-12 12:00:10 -07:00
Godfrey M
bf0bd06f20 put important back 2024-03-11 15:56:53 -07:00
Godfrey M
f07b0b6bd7 removed important 2024-03-11 15:54:59 -07:00
Godfrey M
717b26c834 fixes z-index of date-picker 2024-03-11 15:53:59 -07:00
snipe
8bb8eab69b Merge remote-tracking branch 'origin/develop' 2024-03-11 15:00:38 +00:00
snipe
693d1c9452 Merge pull request #14413 from snipe/fixes/deprecation_on_strtoupper
Fixed deprecation warning on `strtoupper()`
2024-03-11 14:59:55 +00:00
snipe
b049bb1d5c Check for null on select
Signed-off-by: snipe <snipe@snipe.net>
2024-03-11 14:55:49 +00:00
snipe
c5c6b3bbc6 Starting the revised print page
Signed-off-by: snipe <snipe@snipe.net>
2024-03-11 14:23:25 +00:00
snipe
1df56a7cab Merge pull request #14407 from snipe/bug/sc-25019_added_created_at_pivot
Added created_at to license pivot
2024-03-10 16:40:56 +00:00
snipe
3f5cc2507d Used updated_at instead
Signed-off-by: snipe <snipe@snipe.net>
2024-03-10 16:39:49 +00:00
snipe
5a85424295 Added created_at to license pivot
Signed-off-by: snipe <snipe@snipe.net>
2024-03-10 16:33:04 +00:00
snipe
a53a8cca74 Merge remote-tracking branch 'origin/develop' 2024-03-10 14:40:41 +00:00
snipe
3fdee881f9 Merge pull request #14404 from snipe/fixes/Uninitialized-string-offset-0-in-labels
Fixed uninitialized offset in labels in new label engine
2024-03-10 14:40:12 +00:00
snipe
a289dfaf88 Cleanup
Signed-off-by: snipe <snipe@snipe.net>
2024-03-10 14:33:53 +00:00
MrM
8abd359b5b Script to hide / show encrypted values in web ui
added a function to show/hide encrypted values with a simple trick because ClipboardJS can't copy display:none element's value
2024-03-10 15:18:54 +01:00
MrM
9359809b4f Hide / Show encrypted values in web ui
added a span element to hide encrypted values
2024-03-10 15:09:46 +01:00
snipe
cde5502f94 Handle blank labels on asset label fields
Signed-off-by: snipe <snipe@snipe.net>
2024-03-10 14:03:21 +00:00
spencerrlongg
04e0a9d4a5 commented tests for now 2024-03-08 13:14:59 -06:00
snipe
28ec0b8ebb Removed debugging console lines
Signed-off-by: snipe <snipe@snipe.net>
2024-03-08 17:19:31 +00:00
snipe
37dfecf098 Fixed uninitialized offset in labels
Signed-off-by: snipe <snipe@snipe.net>
2024-03-08 16:46:56 +00:00
snipe
9d8ce872a4 Merge remote-tracking branch 'origin/develop' 2024-03-08 14:56:21 +00:00
snipe
07880dfe50 Merge pull request #14400 from snipe/localizations/updated_strings
Updated language strings, added Somali
2024-03-08 14:07:32 +00:00
snipe
7eed9f8542 Added Somali
Signed-off-by: snipe <snipe@snipe.net>
2024-03-08 14:06:21 +00:00
Brady Wetherington
a2e70dd6b2 Fix [sc-25008] - correct and improve legacy language warnings
The legacy language warning was misfiring when a user's language
didn't match the APP_LOCALE from .env.

Additionally, we weren't properly warning when the legacy-language
came from Settings or from the user themselves. Both of which should
be impossible but still probably not a bad idea to warn on it, anyways
2024-03-08 14:04:21 +00:00
snipe
b9aeded957 Updated strings
Signed-off-by: snipe <snipe@snipe.net>
2024-03-08 14:01:34 +00:00
snipe
027361f079 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
2024-03-08 10:01:21 +00:00
snipe
ff10d1540f Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2024-03-08 10:00:00 +00:00
snipe
0f63fa23e0 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	package-lock.json
2024-03-08 09:08:29 +00:00
snipe
22ef569e5e Merge branch 'security/snyc_Upgrade-webpack-from-5.90.1-to-5.90.2_14395' into develop 2024-03-08 08:50:26 +00:00
snipe
f3663f0983 [Snyk] Upgrade webpack from 5.90.1 to 5.90.2 #14395
Signed-off-by: snipe <snipe@snipe.net>
2024-03-08 08:45:49 +00:00
snipe
112ddaf55b Merge pull request #14394 from marcusmoore/fixes/check-endpoint-is-set-for-checkout-in-notifications
Ensure Chat and Teams endpoints are not blank before attempting to send webhook on checkout and check in
2024-03-08 08:44:52 +00:00
snipe
bda6fdf09c Merge pull request #14395 from snipe/snyk-upgrade-9e465161f7c9fd096a214ca3ad2fae7b
[Snyk] Upgrade webpack from 5.90.1 to 5.90.2
2024-03-08 08:44:07 +00:00
snyk-bot
a62198f33f fix: upgrade webpack from 5.90.1 to 5.90.2
Snyk has created this PR to upgrade webpack from 5.90.1 to 5.90.2.

See this package in npm:
https://www.npmjs.com/package/webpack

See this project in Snyk:
https://app.snyk.io/org/snipe/project/3d53e1dd-b8bf-46b5-ba61-18ce26933166?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-08 06:20:14 +00:00
Marcus Moore
4b0bfc52b4 Ensure webhook endpoint is set before attempting to send to google or microsoft 2024-03-07 18:10:10 -08:00
snipe
78868813b1 Merge remote-tracking branch 'origin/develop' 2024-03-08 01:05:07 +00:00
snipe
e8be178ac7 Merge pull request #14393 from marcusmoore/bug/sc-24862
Guard against checking require acceptance on non-existent relationship in accessory model
2024-03-08 01:04:26 +00:00
Marcus Moore
695428cd44 Guard against unrelated category 2024-03-07 16:59:01 -08:00
snipe
9ae779e442 Merge remote-tracking branch 'origin/develop' 2024-03-07 23:44:30 +00:00
snipe
db92febdc7 Merge pull request #14392 from snipe/fixes/removed_unneeded_starts_with_validation_string
Removed unneeded validation message
2024-03-07 23:42:58 +00:00
snipe
5cf10cec34 Remloved unneeded validation message
Signed-off-by: snipe <snipe@snipe.net>
2024-03-07 23:40:30 +00:00
snipe
7939c691f7 Added Brother 18mm label type
Signed-off-by: snipe <snipe@snipe.net>
2024-03-07 22:04:12 +00:00
snipe
ea2d54b0f7 Merge remote-tracking branch 'origin/develop' 2024-03-07 21:22:01 +00:00
snipe
c66267a0f9 Merge pull request #14389 from Godmartinz/remove-pdf-for-old-labels
old engine works as intended
2024-03-07 21:06:57 +00:00
snipe
f1d2f24534 Merge pull request #14388 from marcusmoore/bug/sc-25001
Fixed attempting to run bulk actions on an empty asset collection
2024-03-07 21:03:45 +00:00
Godfrey M
d83974e07f old engine works as intended 2024-03-07 13:03:10 -08:00
Marcus Moore
f270f30728 Redirect if no assets are returned from query 2024-03-07 12:30:08 -08:00
snipe
55c237913c Merge remote-tracking branch 'origin/develop' 2024-03-07 15:11:33 +00:00
snipe
806671df7c Merge pull request #14385 from snipe/feature/sc-24971_convert_unencrypted_custom_fields
Added console command to encrypt previously unencrypted fields
2024-03-07 15:08:19 +00:00
snipe
d64ee42ec3 Wrapped in a transaction
Signed-off-by: snipe <snipe@snipe.net>
2024-03-07 15:04:08 +00:00
snipe
fe08f39900 Fixed typo
Signed-off-by: snipe <snipe@snipe.net>
2024-03-07 14:43:06 +00:00
snipe
5123ab57c9 Added console command to encrypt previously unencrypted fields
Signed-off-by: snipe <snipe@snipe.net>
2024-03-07 14:40:52 +00:00
snipe
313b327cd7 Bumped hash for master
Signed-off-by: snipe <snipe@snipe.net>
2024-03-07 11:34:38 +00:00
snipe
855d922a3e Merge remote-tracking branch 'origin/develop' 2024-03-07 11:31:38 +00:00
snipe
cbe07ad23b Bumped hash
Signed-off-by: snipe <snipe@snipe.net>
2024-03-07 11:30:54 +00:00
snipe
b3aba4ad99 Merge pull request #14379 from chandanchowdhury/master
Fix #13515: Cannot restore backup
2024-03-07 11:30:06 +00:00
snipe
21ad7f549d Merge remote-tracking branch 'origin/develop' 2024-03-07 10:34:30 +00:00
snipe
4b13fa45c5 Merge pull request #14320 from Godmartinz/default_label_bug
Default label setup with custom fields
2024-03-07 10:33:43 +00:00
snipe
485d40c752 Merge remote-tracking branch 'origin/develop' 2024-03-07 10:30:31 +00:00
snipe
8346ae8235 Merge pull request #14370 from ubc-cpsc/bugfix/CVE-2024-27354
Fixes CVE-2024-27354 and CVE-2024-27355 in phpseclib/phpseclib
2024-03-07 10:28:31 +00:00
snipe
109c0f202a Merge remote-tracking branch 'origin/develop' 2024-03-07 10:19:06 +00:00
snipe
4231058aa1 Merge pull request #14371 from Godmartinz/RB17900_notification_bug
Adds User email check when sending Asset acceptance reminder
2024-03-07 10:18:19 +00:00
snipe
6156d67e4a Merge remote-tracking branch 'origin/develop' 2024-03-07 10:17:05 +00:00
snipe
58bf036f52 Merge pull request #14380 from Godmartinz/1dbarcode_unselected_bug
Fixed 1dbarcodes to populate based on settings
2024-03-07 10:16:37 +00:00
Godfrey M
ff7d25c0f2 simplified 1dbarcode logic 2024-03-06 15:30:53 -08:00
Godfrey M
5f0b7f328c if statement order change 2024-03-06 15:24:03 -08:00
Godfrey M
6559581bad conditions 1dbarcode to populate based on settings 2024-03-06 15:10:42 -08:00
Godfrey M
d78262f52b resolved merge conflicts 2024-03-06 14:48:47 -08:00
snipe
bd566324ed Updated assets
Signed-off-by: snipe <snipe@snipe.net>
2024-03-06 20:20:23 +00:00
chandanchowdhury
b65bf5082d Fix #13515: create directories expected by RestoreFromBackup.php 2024-03-06 15:11:41 -05:00
snipe
939e4cba3e Updated prod assets
Signed-off-by: snipe <snipe@snipe.net>
2024-03-06 20:05:16 +00:00
snipe
015a8763a0 Merge remote-tracking branch 'origin/develop' 2024-03-06 20:04:48 +00:00
snipe
02862d80eb Updated dev assets
Signed-off-by: snipe <snipe@snipe.net>
2024-03-06 20:04:31 +00:00
snipe
7b0a3fc6d3 Merge remote-tracking branch 'origin/develop' 2024-03-06 20:01:23 +00:00
snipe
b40b31b7b1 Merge pull request #14378 from snipe/security/snyk_Upgrade-jspdf-autotable-from-3.8.1-to-3.8.2-14365
Upgrade jspdf-autotable from 3.8.1 to 3.8.2 #14365
2024-03-06 19:55:59 +00:00
snipe
149d3d13d1 Upgrade jspdf-autotable from 3.8.1 to 3.8.2 #14365
Signed-off-by: snipe <snipe@snipe.net>
2024-03-06 19:55:19 +00:00
snipe
0f64d66cd8 Merge remote-tracking branch 'origin/develop' 2024-03-06 19:48:55 +00:00
snipe
a85e2f7aad Merge pull request #14372 from snipe/bug/sc-24158
Added route parameter
2024-03-06 19:45:33 +00:00
snipe
4f883b1264 Merge pull request #14375 from Godmartinz/Label-info_fix
Fixed Labels: bulk actions are handled before sorting
2024-03-06 19:44:59 +00:00
Godfrey M
feb78d00cf conditionally shows label fields if on old label engine only 2024-03-06 11:25:49 -08:00
Godfrey M
c9d54baa10 bulk actions are handled before sorting 2024-03-05 15:47:52 -08:00
Godfrey M
940f54dab1 revert some changes 2024-03-05 15:45:35 -08:00
Godfrey M
d83827a44e bulk actions are handled before sorting 2024-03-05 15:43:41 -08:00
spencerrlongg
3a0a13d06d tests written but something not working... 2024-03-05 16:35:06 -06:00
snipe
23f8e35716 Added route parameter
Signed-off-by: snipe <snipe@snipe.net>
2024-03-05 20:39:56 +00:00
spencerrlongg
a251e61d73 rm commented code and add comment 2024-03-05 13:40:44 -06:00
spencerrlongg
af06b1cd06 hide encryption option for checkbox and radio 2024-03-05 13:37:30 -06:00
Brady Wetherington
5b9120ba6c Merge branch 'develop' into snipeit_v7_laravel10 2024-03-05 19:22:37 +00:00
snipe
7769a93a10 Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2024-03-05 19:07:40 +00:00
snipe
95a6c7058f Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2024-03-05 19:06:55 +00:00
Godfrey M
6c3a668400 checks to see if a user has an email before sending them a reminder email. 2024-03-05 10:30:24 -08:00
spencerrlongg
ad0f873ece rm validation stuff 2024-03-05 11:58:00 -06:00
Joël Pittet
3008a4ed7a Fixes CVE-2024-27354 and CVE-2024-27355 2024-03-05 09:55:56 -08:00
Godfrey M
95ef3a336b Merge branch 'develop' into default_label_bug 2024-03-04 12:03:54 -08:00
snipe
9a5c1b8126 Merge pull request #14362 from Godmartinz/labels-not-generating-properly
Fixes inconsistencies with generating labels
2024-03-04 18:49:44 +00:00
Godfrey M
e926db76a0 fixes inconsistencies with generating labels 2024-03-04 10:26:38 -08:00
snipe
9419c7fdeb Fixed contributing link
Signed-off-by: snipe <snipe@snipe.net>
2024-03-01 12:42:26 +00:00
snipe
9dbb4abe7e Fixed tests
Signed-off-by: snipe <snipe@snipe.net>
2024-03-01 12:30:05 +00:00
snipe
19e0fb7955 Reverting CSP change
Signed-off-by: snipe <snipe@snipe.net>
2024-03-01 12:25:14 +00:00
snipe
5b9b21a7d1 Merge pull request #14357 from snipe/fixes/stricter_csp_rules
Removed unsafe-inline and unsafe-eval
2024-03-01 11:48:51 +00:00
snipe
93e69ab0c6 Removed unsafe-inline and unsafe-eval
Signed-off-by: snipe <snipe@snipe.net>
2024-03-01 11:44:49 +00:00
snipe
bc5c559413 Merge pull request #14356 from snipe/fixes/set_csp_rule_to_true_by_default
Set CSP headers to true by default
2024-03-01 11:37:53 +00:00
snipe
9b2fcbff08 Set CSP headers to true by default
Signed-off-by: snipe <snipe@snipe.net>
2024-03-01 11:36:37 +00:00
snipe
ad2674d20b Merge pull request #14355 from snipe/localization/new_strings
Updated language strings
2024-03-01 11:18:12 +00:00
snipe
10ac2c830f Updated language strings
Signed-off-by: snipe <snipe@snipe.net>
2024-03-01 11:17:02 +00:00
snipe
df3053eafb Merge pull request #14354 from snipe/bug/sc-24911
Use SVG cleaner on favicons
2024-03-01 10:19:59 +00:00
snipe
aaae952acb Use SVG cleaner on favicons
Signed-off-by: snipe <snipe@snipe.net>
2024-03-01 10:17:57 +00:00
Jeremy Price
8ace30ee23 Update mailer configurations for Symfony mailer
Newer Laravel uses Symfony mailer instead of SwiftMailer, and that means
that some configs and functionality have changed

In this change, we update config/mail.php with the new config layout and
name/functionality changes

of note:

* New configuration layout supporting lots of new/different mailers
* MAIL_DRIVER has become MAIL_MAILER, though we'll support both
* MAIL_ENCRYPTION is mostly useless, and we mark it as such -- symfony
  mailer detects which type of encryption to use automagically.
* MAIL_TLS_VERIFY_PEER is now available in case of self-signed
  certificates on the mail server, of if you want to access it by a
  different name, or by IP

Accordingly, we also update the .env examples, docker configs, and
the .env builder in the snipeit.sh installation script with the above
changes
2024-02-28 23:37:52 -08:00
akemidx
eb0657c953 Merge branch 'develop' into bug/sc-24812 2024-02-28 17:22:16 -05:00
snipe
b1cd44341b Merge pull request #14347 from snipe/feature/sc-24856_requestable_page
Dynamically show models/assets on requestable page
2024-02-28 15:04:48 +00:00
snipe
3da47cdacd Removed header for consistency
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 15:03:34 +00:00
snipe
658dda916c Changed operator
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 15:01:00 +00:00
snipe
7c3d8b896b Updated asset transformers/presenters to display requestable status
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 14:59:55 +00:00
snipe
1ce9df7998 New translation
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 14:59:27 +00:00
snipe
a0cbf66c81 Only show tabs if there are requestable assets/models
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 14:59:20 +00:00
snipe
a4941031cb Merge pull request #14260 from marcusmoore/chore/sc-24808
Added tests around asset check in and added missing actions to the api controller action
2024-02-28 13:34:12 +00:00
snipe
9fd6aea325 Merge pull request #14281 from Godmartinz/preview-label-fields
Added better label previews with the new label engine
2024-02-28 11:48:05 +00:00
snipe
a52181c995 Merge pull request #14283 from akemidx/bug/sc-24788
FIXED: Checked in Assets Did Not Show in Custom Report when Selecting a Valid Checked Out Date
2024-02-28 11:47:46 +00:00
snipe
ee75df0f0a Merge pull request #14346 from snipe/feature/sc-18728
Added `min_amt` functionality to licenses
2024-02-28 11:26:25 +00:00
snipe
92eff653f1 Removed logging
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 11:26:03 +00:00
snipe
1e66985a78 Merge pull request #14344 from snipe/features/added_created_by_to_groups
Added created_by to groups table
2024-02-28 11:19:52 +00:00
snipe
a059a42799 Added use Auth to API controller
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 11:14:48 +00:00
snipe
b5603fbfe9 Added min amt to license blade
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 11:09:07 +00:00
snipe
a0423a9cc3 Added translations
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 11:08:56 +00:00
snipe
4ab7112988 Added validation and fillable attributes for min_amt
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 11:08:47 +00:00
snipe
767cf96010 Added min_amt to form
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 11:08:33 +00:00
snipe
4ffb7790df Added min_amt to API transformer/presenter
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 11:07:18 +00:00
snipe
3ccc55a78f Added license min amt formatter for BS table
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 11:06:50 +00:00
snipe
d0d29e03db Migration for min_amt on licenses
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 11:06:01 +00:00
snipe
92b7c4b5ec Allow sorting on min_amt
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 11:05:13 +00:00
snipe
dff7c43aed Added minimum account check for licenses
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 11:05:02 +00:00
snipe
9efbcbbd5e Added min_amt to licenses
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 11:04:42 +00:00
snipe
31fa0a7044 Removed logging
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 11:04:32 +00:00
snipe
fcb2bf7fea Merge pull request #14335 from mauro-miatello/develop
Copy encrypted custom fields
2024-02-28 09:04:11 +00:00
snipe
0bd27d61b0 Added created_by to groups table
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 08:15:59 +00:00
snipe
369ecfa490 Merge pull request #14341 from marcusmoore/chore/sc-24900
Generate unique department names in factory
2024-02-28 07:07:45 +00:00
Marcus Moore
551354b1bb Add group annotation for tests 2024-02-27 18:05:18 -08:00
Marcus Moore
03b7891edc Remove unneeded factory states 2024-02-27 18:03:53 -08:00
Marcus Moore
8978dff054 Consolidate helpers into trait 2024-02-27 18:01:08 -08:00
Marcus Moore
d20844fefa Improve readability by extracting additional helpers 2024-02-27 17:57:12 -08:00
Marcus Moore
cd579a04dd Improve readability by extracting fireCheckOutEvent method 2024-02-27 17:52:18 -08:00
Marcus Moore
15b8140bff Fix test helper 2024-02-27 17:48:17 -08:00
Marcus Moore
9a93ad2e06 Remove unneeded factory state 2024-02-27 17:46:27 -08:00
Marcus Moore
bd4d3aa52b Improve readability by extracting additional helpers 2024-02-27 17:44:19 -08:00
Marcus Moore
bf32ab177f Improve readability by extracting fireCheckInEvent method 2024-02-27 17:37:07 -08:00
Marcus Moore
2ea883aa15 Move Notification::fake() to setUp method 2024-02-27 17:23:30 -08:00
Marcus Moore
43cc296582 Consolidate additional tests 2024-02-27 17:14:35 -08:00
Marcus Moore
4c1aadd74e Improve naming and inline helper 2024-02-27 17:09:22 -08:00
Marcus Moore
7d3719bf70 Consolidate some slack notification tests 2024-02-27 17:07:40 -08:00
Marcus Moore
c08164d864 Update test names 2024-02-27 16:48:17 -08:00
Marcus Moore
b156aa74a5 Update helper name 2024-02-27 16:45:49 -08:00
Marcus Moore
87ba2cb407 Generate unique names for departments 2024-02-27 12:47:56 -08:00
Marcus Moore
5084e5d3ef Improve variable type 2024-02-27 12:23:26 -08:00
Marcus Moore
a5516e3511 Improve trait name 2024-02-27 12:06:29 -08:00
Marcus Moore
0e460baf82 Improve readability 2024-02-27 12:03:36 -08:00
Godfrey M
ef52777ffb removed conditional 2024-02-27 11:33:00 -08:00
Godfrey M
b67ceab849 fields appear in preview, but not bulk generate labels 2024-02-27 11:29:19 -08:00
Marcus Moore
69022bb8b6 Implement test 2024-02-27 11:12:35 -08:00
akemidx
5ffade663a unstash 2024-02-26 18:41:58 -05:00
Marcus Moore
29d729171c Align test with actual values passed from the web 2024-02-26 11:13:39 -08:00
MrM
9475871edb Fix multiple tooltip issue
If there are multiple tooltips, they all report the message "copied" because there is no element selection. This fix resolves the issue.
2024-02-25 14:48:05 +01:00
MrM
b69364d5ff Add copy of encrypted custom fields
Encrypted custom fields may contain sensitive or important information, and it may be useful to have the ability to copy them.
2024-02-25 14:47:06 +01:00
snipe
10dad8e6e6 Merge pull request #14327 from snipe/fixes/better_ui_for_history_importer
Nicer UI for history importer
2024-02-23 11:43:15 +00:00
snipe
a184b4e67c Nicer UI for history importer
Signed-off-by: snipe <snipe@snipe.net>
2024-02-23 11:40:10 +00:00
snipe
8cd0a90ecd Merge pull request #14325 from snipe/fixes/RB-17890
Check for valid supplier in license view
2024-02-23 10:49:56 +00:00
snipe
4a37632ef3 Check for valid supplier in license view
Signed-off-by: snipe <snipe@snipe.net>
2024-02-23 10:48:53 +00:00
snipe
3271d020e9 Merge pull request #14319 from snipe/fixes/RB-17889
Check for activeFile before trying to get header on import
2024-02-23 08:19:21 +00:00
snipe
e494a2670f Merge pull request #14321 from akemidx/accessory_pdf_dl_link
Adding in PDF download to Accesories/Asset/License Histories
2024-02-23 08:18:55 +00:00
snipe
d3a0a337b9 Merge pull request #14323 from ubc-cpsc/bugfix/CVE-2024-25117
Fixes CVE-2024-25117 php-svg-lib lacks path validation on font through SVG inline styles
2024-02-23 08:05:03 +00:00
Joël Pittet
3951ee746d Fixes CVE-2024-25117, no other dependencies 2024-02-22 16:49:02 -08:00
Joël Pittet
84e4257e75 Fixes CVE-2024-25117 2024-02-22 16:40:08 -08:00
Marcus Moore
c401c88702 Scope event fake 2024-02-22 16:19:33 -08:00
Godfrey M
550f9e2afa removes visibility checkmarks for certain fields when in new label engine 2024-02-22 16:19:28 -08:00
Marcus Moore
b55a19cebb Add assertion event is dispatched with correct timestamp 2024-02-22 13:50:46 -08:00
Marcus Moore
4caadcfa19 Clear pending checkout acceptances when checking in asset via api 2024-02-22 13:33:16 -08:00
Marcus Moore
dba837b1d2 Move location migration logic to trait 2024-02-22 13:21:52 -08:00
Marcus Moore
714fc63050 Have legacy locations updated upon api asset checkin 2024-02-22 13:14:30 -08:00
spencerrlongg
b6fa6cba22 note before switching tasks 2024-02-22 15:01:14 -06:00
Marcus Moore
2df026bcb5 Allow updating asset default location when checking in asset via api 2024-02-22 12:40:14 -08:00
Godfrey M
6ee24a7527 remove unnecessary code reformat 2024-02-22 12:36:27 -08:00
Godfrey M
e2dcee1959 cleans up dead code 2024-02-22 12:26:57 -08:00
Godfrey M
4fbea9512f puts textY inside of the forloop 2024-02-22 12:08:47 -08:00
Godfrey M
b7850ab839 puts textY outside of the forloop 2024-02-22 12:08:04 -08:00
Godfrey M
c0215baca5 minor changes 2024-02-22 11:41:04 -08:00
Godfrey M
c62758c5b5 adds custom field select to default label view 2024-02-22 11:36:39 -08:00
spencerrlongg
14358651e4 pushing to test other branches 2024-02-22 13:28:23 -06:00
snipe
f04aeb9f2b Fixed spacing
Signed-off-by: snipe <snipe@snipe.net>
2024-02-22 18:31:02 +00:00
snipe
dc902e7a5a Fixed return type
Signed-off-by: snipe <snipe@snipe.net>
2024-02-22 18:30:23 +00:00
snipe
4fc66e19bb Check for activeFile before trying to get header
Signed-off-by: snipe <snipe@snipe.net>
2024-02-22 18:28:01 +00:00
snipe
e12d2b2a42 Merge pull request #14317 from snipe/fixes/make_website_searchable_on_users_list
Made website searchable on users table
2024-02-22 17:01:58 +00:00
snipe
cb78451d6c Made website searchable on users table
Signed-off-by: snipe <snipe@snipe.net>
2024-02-22 16:13:54 +00:00
snipe
7979bc63ae Merge pull request #14316 from snipe/feature/sc-24871
Added email, phone icons
2024-02-22 14:50:46 +00:00
snipe
e8ad8a7448 Added email, phone icons
Signed-off-by: snipe <snipe@snipe.net>
2024-02-22 14:48:01 +00:00
snipe
eb61f5aa9e Merge pull request #14315 from snipe/fixes/rb-3565
Only send notification if the item is assigned to a person
2024-02-22 12:05:59 +00:00
snipe
3351998efd Only send notification if the item is assigned to a person
Signed-off-by: snipe <snipe@snipe.net>
2024-02-22 12:03:07 +00:00
spencerrlongg
20dbacd22f store good, update needs work 2024-02-21 21:33:34 -06:00
akemidx
0f3be4fdf8 adding in eula pdf dl link. mimics activity log 2024-02-21 17:45:10 -05:00
Marcus Moore
3ae8adfbf9 Remove incomplete flag on test case 2024-02-21 12:33:32 -08:00
Marcus Moore
aa2632fe46 Merge branch 'develop' into chore/sc-24808 2024-02-21 12:33:06 -08:00
Brady Wetherington
8f2843bfcf Merge branch 'develop' into snipeit_v7_laravel10
Had to re-generate composer.lock, and re-do package.json and rebuild assets as well.
2024-02-21 20:22:28 +00:00
Godfrey M
14c86d447b added filter to collectifunction 2024-02-21 11:38:03 -08:00
Godfrey M
bee016e0be keeps example values in the example preview, fixes indent 2024-02-21 09:31:01 -08:00
snipe
54552fc95c Merge pull request #14192 from inietov/fixes/api_issue_checkin_licenses
Fixed #14183  API /hardware/:id/checkin doesn't return Licenses
2024-02-21 11:35:06 +00:00
akemidx
9397372f87 permissions, but they are now all in their own column because reasons??? 2024-02-20 18:48:17 -05:00
akemidx
8bbf6da052 user block, trying to pick out ONLY permissions we wanna see 2024-02-20 18:25:41 -05:00
snipe
ffa7d25fc0 Merge pull request #14308 from snipe/fixes/eager_load_relations_on_locations
Eager load relations to determine deletability on locations
2024-02-20 22:28:39 +00:00
snipe
a37d3b00d0 Merge pull request #14307 from marcusmoore/bug/sc-24867
Fixed title not appearing in new label engine
2024-02-20 22:25:45 +00:00
snipe
04891c7c61 Eager load relations to determine
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 22:25:00 +00:00
spencerrlongg
d67ff54f4b temporary decrypt, almost there 2024-02-20 16:20:03 -06:00
Marcus Moore
ccec190985 Set label title properly 2024-02-20 13:59:50 -08:00
spencerrlongg
26728a85ad this seems to work for patches 2024-02-20 13:18:40 -06:00
spencerrlongg
c6d85a1b0b allows arrays on checkbox values 2024-02-20 12:23:24 -06:00
snipe
71610fb20f Merge pull request #14304 from snipe/feature/sc-24018
Added ability to bulk delete locations
2024-02-20 18:14:51 +00:00
snipe
cb0f9024b1 Fixed gate
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 17:56:40 +00:00
snipe
1797480128 Few more translations
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 17:27:56 +00:00
snipe
972b198248 Removed debugging
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 17:27:16 +00:00
snipe
9010b7acd0 Use isDeletable instead of asset count
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 17:27:10 +00:00
snipe
b57b68571e Added blade views
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:44:45 +00:00
snipe
1ca9420baa Fixed incorrect gate
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:44:29 +00:00
snipe
0383938536 API-ify the managed locations tab in user view
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:44:20 +00:00
snipe
50b841d54d Added table data-dash attributes to make the checkbox stuff work
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:43:57 +00:00
snipe
8f71460fa1 Formatting changes only
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:43:27 +00:00
snipe
d5324bce6a Added more generic bulk translations for trans_choice
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:43:07 +00:00
snipe
660f3ccba1 Removed duplicate key
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:42:28 +00:00
snipe
bc8db3deab Added bulk delete routes
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:42:14 +00:00
snipe
b2c8fbf349 Removed debugging
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:42:04 +00:00
snipe
c3f21d9292 Removed new checkbox selectability on users and assets - more complicated work to be done
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:41:58 +00:00
snipe
9b146ae1d2 Formatting for API response
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:40:51 +00:00
snipe
a32c679519 Removed debugging
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:40:31 +00:00
snipe
1e602793b2 Added manager ID to filter
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:40:23 +00:00
snipe
a6a65b7523 Fixed locations isDeletable check
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:40:09 +00:00
snipe
04c1d9cbff Merge pull request #14302 from uberbrady/fix_uploaded_file_extensions
Clean up the file extension on image file uploads
2024-02-19 16:53:47 +00:00
Brady Wetherington
a6dfd67cd7 Clean up the file extension on image file uploads 2024-02-19 16:51:23 +00:00
snipe
7d178da61c Merge pull request #14301 from snipe/bug/sc-24375
Disallow branding uploads in demo mode
2024-02-19 16:27:20 +00:00
snipe
30f9acfcf3 Disallow uploads in demo mode
Signed-off-by: snipe <snipe@snipe.net>
2024-02-19 16:11:17 +00:00
snipe
1e351b4d63 Merge pull request #14299 from snipe/fixes/fix_crash_on_purged_models_in_activity_report
Check that the model exists before trying to access properties
2024-02-19 15:36:44 +00:00
snipe
cb5b691ec1 Check that the model exists before trying to access properties
Signed-off-by: snipe <snipe@snipe.net>
2024-02-19 15:34:57 +00:00
snipe
b47b401245 Merge pull request #14298 from uberbrady/docker_fix_alpine_exif
Add missing EXIF PHP library for Alpine Docker image
2024-02-19 15:09:02 +00:00
Brady Wetherington
119e79e248 Add missing EXIF PHP library for Alpine Docker image 2024-02-19 15:00:13 +00:00
snipe
d7254053b6 Merge pull request #14297 from snipe/feature/sc-24855
Added `/backups/latest` to API endpoint
2024-02-19 14:40:13 +00:00
snipe
8f8edd4126 Added /backups/latest endpoint
Signed-off-by: snipe <snipe@snipe.net>
2024-02-19 14:35:09 +00:00
snipe
10bb844087 Added comment
Signed-off-by: snipe <snipe@snipe.net>
2024-02-19 14:34:51 +00:00
snipe
ba3baabb50 Fixed @return
Signed-off-by: snipe <snipe@snipe.net>
2024-02-19 14:34:36 +00:00
snipe
c76fbe4edb Return 404 if download file isn’t found
Signed-off-by: snipe <snipe@snipe.net>
2024-02-19 13:05:44 +00:00
snipe
cae2de4fc9 Merge remote-tracking branch 'origin/develop' 2024-02-19 12:25:26 +00:00
snipe
7c346d977a Merge pull request #14296 from snipe/fixes/return_download_for_backup_api
Better handle large downloads on backup API
2024-02-19 12:22:49 +00:00
snipe
9847934de9 Better handle large downloads on backup API
Signed-off-by: snipe <snipe@snipe.net>
2024-02-19 12:20:37 +00:00
snipe
db73f80058 Starting off
Signed-off-by: snipe <snipe@snipe.net>
2024-02-16 18:57:50 +00:00
akemidx
4dd479dad7 formatting 2024-02-15 19:59:26 -05:00
akemidx
d01e1e8eeb query works, but still only shows the asset once even if it's been checked out multiple times 2024-02-15 19:56:08 -05:00
akemidx
e3ef737ac4 query first go 2024-02-15 19:15:27 -05:00
Godfrey M
69317fb403 Marcus is a beast and condensed everything into 4 lines 2024-02-15 13:26:47 -08:00
Godfrey M
1b80c8938a removed unnecessary if statement 2024-02-15 13:04:00 -08:00
Godfrey M
dc77c01fd3 removes spacing 2024-02-15 13:00:38 -08:00
Godfrey M
83474d6e59 moves the array manipulation up the page where it should be 2024-02-15 12:59:47 -08:00
Godfrey M
529310c93a fixed typo in comment 2024-02-15 12:41:31 -08:00
Godfrey M
70f26f33a5 does a collect and map instead of a for loop for the array solution 2024-02-15 12:34:09 -08:00
Godfrey M
414bc10c40 removes the double for loop with a better solution 2024-02-15 12:02:08 -08:00
Godfrey M
250b0a7afb gives a better example with custom fields in label preview 2024-02-15 11:50:41 -08:00
snipe
e5355db672 Merge remote-tracking branch 'origin/develop' 2024-02-15 18:39:57 +00:00
snipe
aef45a90b2 Merge pull request #14278 from uberbrady/allowlist_and_db_prefix_for_restore
Allowlist and db prefix for restore
2024-02-15 14:50:44 +00:00
snipe
9221641bba Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
2024-02-15 14:50:37 +00:00
snipe
6bca1e3b22 Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2024-02-15 14:48:07 +00:00
snipe
00cea3eb3c Merge remote-tracking branch 'origin/develop' 2024-02-15 14:45:30 +00:00
snipe
19b52a2f24 Merge pull request #14279 from snipe/fixes/clearer_ui_for_fieldsets
Improved UI for fieldsets
2024-02-15 14:19:34 +00:00
snipe
6237f6192c Added fieldset button
Signed-off-by: snipe <snipe@snipe.net>
2024-02-15 14:14:18 +00:00
snipe
cc58d4c3ad Nicer form UI
Signed-off-by: snipe <snipe@snipe.net>
2024-02-15 14:08:06 +00:00
Brady Wetherington
6a78706a3e New 'sanitize' version of backup-restore tool. Optional. 2024-02-15 13:27:18 +00:00
snipe
060c59bf9d Merge remote-tracking branch 'origin/develop' 2024-02-15 12:30:22 +00:00
snipe
6fd3c494be Merge pull request #14277 from snipe/fixes/change_log_level_to_info
Lower log level to warning on webhook failure
2024-02-15 12:28:57 +00:00
snipe
8adfa8dd83 Change exceptions to warnings
Signed-off-by: snipe <snipe@snipe.net>
2024-02-15 12:28:12 +00:00
snipe
6c9001df09 Changed log level in checkoutable listener to info
Signed-off-by: snipe <snipe@snipe.net>
2024-02-15 12:20:14 +00:00
snipe
d6159d8cb5 Merge remote-tracking branch 'origin/develop' 2024-02-15 09:59:23 +00:00
snipe
81b9753b79 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/js/dist/all-defer.js
#	public/mix-manifest.json
2024-02-15 09:58:09 +00:00
snipe
d8b1eec91b Merge pull request #14197 from inietov/fixes/component_licenses_checkouts_not_displayed_in_asset_history
Fixes #14010 Adds Components and Licenses logs to Assets history view
2024-02-15 09:57:46 +00:00
snipe
b871813cfd Merge pull request #14172 from spencerrlongg/bug/sc-23514
Resolve Duplicate Activity Logs for Imports
2024-02-15 09:54:43 +00:00
snipe
6f7dce53cc Merge pull request #14276 from snipe/bug/sc-24828
Fixed ambiguous query on supplier_id in maintenances
2024-02-15 09:52:23 +00:00
snipe
13d2af2155 Fixed ambiguous query on supplier_id in maintenances
Signed-off-by: snipe <snipe@snipe.net>
2024-02-15 09:51:14 +00:00
snipe
bf3794822c Updated assets
Signed-off-by: snipe <snipe@snipe.net>
2024-02-15 09:47:45 +00:00
snipe
1fa8fba5fe Merge pull request #14268 from Godmartinz/checked-out-notif-fix
Fixed the notification listener
2024-02-15 08:29:15 +00:00
snipe
3d7697da6f Merge pull request #14275 from snipe/snyk/14270
Upgrade webpack from 5.89.0 to 5.90.0
2024-02-15 08:28:26 +00:00
snipe
42cf17d3bf Upgrade webpack from 5.89.0 to 5.90.0
Signed-off-by: snipe <snipe@snipe.net>
2024-02-15 08:27:52 +00:00
snipe
783e37f06d Merge pull request #14274 from snipe/snyk/14269
Upgrade alpinejs from 3.13.3 to 3.13.5
2024-02-15 08:21:58 +00:00
snipe
9a4cda0bf6 Upgrade alpinejs from 3.13.3 to 3.13.5
Signed-off-by: snipe <snipe@snipe.net>
2024-02-15 08:21:19 +00:00
snipe
b6279af1d8 Merge pull request #14272 from marcusmoore/testing/update-state-helper-name
Updated testing helper name
2024-02-15 08:19:40 +00:00
Marcus Moore
bc0a7542ac Change enableWebhook to enableSlackWebhook 2024-02-14 18:17:34 -08:00
akemidx
232fad0145 query and progress notes 2024-02-14 20:00:23 -05:00
Godfrey M
5cbcac28b1 adds custom fields as an example in label settings 2024-02-14 16:53:38 -08:00
Marcus Moore
aec59f2da6 Update assertion to be more correct 2024-02-14 12:27:42 -08:00
Marcus Moore
905df5ec25 Consolidate test cases 2024-02-14 12:14:27 -08:00
Marcus Moore
bacfdc5049 Scaffold additional tests 2024-02-14 11:33:03 -08:00
Marcus Moore
3cc72021b6 Move notification test to notifications test suite 2024-02-14 11:16:31 -08:00
spencerrlongg
115e0fc119 implode submitted arrays to save 2024-02-14 13:15:23 -06:00
Marcus Moore
4354e126b1 Scaffold tests 2024-02-14 11:11:08 -08:00
Marcus Moore
02f39472f9 Remove duplicate test 2024-02-14 11:10:59 -08:00
Marcus Moore
d7aed2edc9 Remove unneeded code 2024-02-14 11:10:45 -08:00
Marcus Moore
af513946a2 Implement test 2024-02-14 10:48:49 -08:00
Marcus Moore
7bfd02054b Remove duplicate authorization check 2024-02-14 10:48:41 -08:00
spencerrlongg
1ceb703129 rm var 2024-02-14 12:44:09 -06:00
spencerrlongg
fb28882f65 trim potential spaces 2024-02-14 11:59:14 -06:00
spencerrlongg
d9c61fdb02 validation msg 2024-02-14 11:52:25 -06:00
spencerrlongg
72c118a70f cleanup 2024-02-14 11:41:46 -06:00
Godfrey M
b136e9e29d fix the listener to fire when checking in 2024-02-14 09:16:20 -08:00
snipe
50c910461a Merge remote-tracking branch 'origin/develop' 2024-02-14 11:36:28 +00:00
snipe
88a84e9350 Merge pull request #14264 from snipe/feature/sc-24816
Added serial and status label to asset maintenances page and API
2024-02-14 10:37:01 +00:00
snipe
43bb8ae0a8 Added string
Signed-off-by: snipe <snipe@snipe.net>
2024-02-14 10:14:44 +00:00
snipe
638071dadd Check the asset is not deleted when creating the permissions array
Signed-off-by: snipe <snipe@snipe.net>
2024-02-14 10:14:38 +00:00
snipe
8a4c90ade8 Check that the asset is not deleted
Signed-off-by: snipe <snipe@snipe.net>
2024-02-14 10:14:25 +00:00
snipe
1dfa1da0ee Disable the edit button if permission is not allowed
Signed-off-by: snipe <snipe@snipe.net>
2024-02-14 10:14:10 +00:00
snipe
71ebade641 Added serial and status to searchable relations
Signed-off-by: snipe <snipe@snipe.net>
2024-02-14 09:59:10 +00:00
snipe
b86b05c4fc Added serial and status fields to presenter
Signed-off-by: snipe <snipe@snipe.net>
2024-02-14 09:58:55 +00:00
snipe
35a70988cb Added sorting by status label
Signed-off-by: snipe <snipe@snipe.net>
2024-02-14 09:58:39 +00:00
snipe
56ba26eb45 Disallow editing of deleted assets
Signed-off-by: snipe <snipe@snipe.net>
2024-02-14 09:58:07 +00:00
snipe
adb8be9345 Added bootstrap formatting to show deleted assets more clearly
Signed-off-by: snipe <snipe@snipe.net>
2024-02-14 09:57:57 +00:00
snipe
abc9ee22c6 Added serial and status to transformer
Signed-off-by: snipe <snipe@snipe.net>
2024-02-14 09:48:02 +00:00
snipe
e5ee9760c0 I don’t think we use these anyore because of the modifiers on date
Signed-off-by: snipe <snipe@snipe.net>
2024-02-14 09:47:33 +00:00
snipe
7868a8c174 Added serial for API controller
Signed-off-by: snipe <snipe@snipe.net>
2024-02-14 09:47:13 +00:00
snipe
03df4cec45 Fixed typo
Signed-off-by: snipe <snipe@snipe.net>
2024-02-14 09:46:43 +00:00
spencerrlongg
25241542d2 progress, going to sleep 2024-02-14 02:12:31 -06:00
spencerrlongg
57a75e68b9 maybe i do the inverse here? 2024-02-14 00:52:50 -06:00
Marcus Moore
ad1846fed6 Implement tests 2024-02-13 17:50:26 -08:00
spencerrlongg
dcf2168454 initial stuff, need to switch branches 2024-02-13 19:35:37 -06:00
Marcus Moore
9ab56fe9ca Implement tests 2024-02-13 17:04:53 -08:00
Marcus Moore
f708b8b299 Implement test 2024-02-13 14:30:26 -08:00
akemidx
c5e8d1c276 custom report tinker 2024-02-13 17:09:51 -05:00
akemidx
4093327b7f adding in Last Checkin Date to Hardware view and index 2024-02-13 16:52:12 -05:00
Marcus Moore
391b832613 Implement test 2024-02-13 13:34:55 -08:00
Marcus Moore
b653d19579 Implement test 2024-02-13 13:29:54 -08:00
akemidx
4a57cfaf3e commenting out the nulling of last checkout date on checkin page and API 2024-02-13 16:21:18 -05:00
Marcus Moore
31a75bd252 Add some assertions 2024-02-13 13:17:02 -08:00
snipe
e2c3386c33 Merge remote-tracking branch 'origin/develop' 2024-02-13 20:37:17 +00:00
Marcus Moore
0506f3bef9 Scaffold additional tests 2024-02-13 12:35:31 -08:00
snipe
a866d6b16e Merge pull request #14261 from snipe/fixed/missing_location_string
Fixed incorrect string for location not existing
2024-02-13 20:29:32 +00:00
snipe
a76a69d085 Fixed incorrect string for location not existing
Signed-off-by: snipe <snipe@snipe.net>
2024-02-13 20:23:32 +00:00
Marcus Moore
852b0b3f11 Scaffold additional tests 2024-02-13 12:15:59 -08:00
Marcus Moore
307b39bd38 Implement tests around asset check in 2024-02-13 12:03:27 -08:00
spencerrlongg
d55358652b cleanup for pr 2024-02-13 13:45:56 -06:00
Brady Wetherington
955f75f733 Fixes for the prefix-guessing and sanitizing. 2024-02-13 16:45:24 +00:00
snipe
280e778749 Merge remote-tracking branch 'origin/develop' 2024-02-13 13:46:52 +00:00
snipe
60ba898167 Merge pull request #14255 from marcusmoore/chore/sc-24805
Added LDAP group tag to LDAP tests
2024-02-13 13:42:51 +00:00
snipe
2c9d5b9ea3 Merge pull request #14247 from ubc-cpsc/bugfix/CVE-2023-37260
Fixes CVE-2023-37260 upgrading league/oauth2-server
2024-02-13 13:40:53 +00:00
snipe
eb6e2636b5 Merge pull request #14246 from ubc-cpsc/bugfix/CVE-2022-24894
Fixes CVE-2022-24894 by upgrading symfony/http-kernel
2024-02-13 13:40:33 +00:00
snipe
4c1964d509 Merge pull request #14245 from ubc-cpsc/bugfix/CVE-2024-24821
Fixes CVE-2024-24821 by upgrading composer/composer
2024-02-13 13:39:16 +00:00
snipe
7547277352 Merge pull request #14236 from snipe/jerm/upgrade-script-enhancements
Change how we check forward-looking upgrade requirements
2024-02-13 13:38:35 +00:00
snipe
3e00bc49fd Merge pull request #14250 from mauro-miatello/develop
Cleaned up navbar-custom-menu
2024-02-13 13:33:03 +00:00
snipe
99e0b65de7 Merge pull request #14256 from marcusmoore/bug/sc-24790
Fixed accessory check in emails being sent when setting disabled
2024-02-13 13:32:42 +00:00
Brady Wetherington
70ef904951 Actually got this pretty close to being able to do a restore 2024-02-13 12:16:15 +00:00
Brady Wetherington
fcf023e3d2 WIP: trying to get prefixing and sanitization working 2024-02-13 12:16:15 +00:00
Brady Wetherington
8c882ddead Starting to abstract out the SQL Streaming logic into its own class 2024-02-13 12:16:15 +00:00
Brady Wetherington
7d136f9970 Initial rough stabs at prefix removal and SQL sanitization 2024-02-13 12:16:15 +00:00
Jeremy Price
f4c1460c2b remove help text options until i put together the help text 2024-02-12 19:18:26 -08:00
Jeremy Price
bb2e1de0a8 Change how we check forward-looking upgrade requirements
In https://github.com/snipe/snipe-it/pull/14128 we added the capability
for the upgrade.php script to check version requirements _before_
downloading the new source, to help keep from breaking installations.

Turns out, `file_get_contents()` isn't a reliable way to grab a url, because
some systems have `allow_url_fopen` turned off in their PHP
configurations.

In this iteration, we swap that out for a curl function, while also
adding more error handling, the ability to entirely skip the
PHP version checks if for some reason you Just Can't query the upgrade
json correctly, as well as adding a lot of helpful text around the whole
issue.

Additionally, I've added some error checking around DB backups and
initial artisan down-ing, since shell_exec would happily march right
past any errors.
2024-02-12 19:18:26 -08:00
Marcus Moore
c81bc1d2ee Scaffold tests around asset check in 2024-02-12 17:54:22 -08:00
Marcus Moore
7154d23759 Pass the correct variable to the route helper 2024-02-12 16:45:18 -08:00
Marcus Moore
df23fd0dee Remove usused import 2024-02-12 16:35:54 -08:00
Marcus Moore
adfb8895df Improve factory state name 2024-02-12 16:31:32 -08:00
Marcus Moore
c8e12ddb5c Remove bug in factory state 2024-02-12 16:30:09 -08:00
Marcus Moore
5b181ecea7 Remove old comment 2024-02-12 16:29:34 -08:00
Marcus Moore
728aaaab20 Ensure accessory check in emails are not sent when the setting is disabled 2024-02-12 16:22:59 -08:00
akemidx
f7d0cecdac permissions query starto 2024-02-12 19:01:06 -05:00
Marcus Moore
095a7d9b34 Scaffold tests around accessory check in 2024-02-12 12:54:48 -08:00
Marcus Moore
cf53f2778f Add LDAP test cases to group 2024-02-12 12:28:27 -08:00
snipe
65e20282b6 Merge pull request #14251 from snipe/dependabot/github_actions/develop/codacy/codacy-analysis-cli-action-4.4.0
Bump codacy/codacy-analysis-cli-action from 4.3.0 to 4.4.0
2024-02-12 08:35:30 +00:00
dependabot[bot]
405c5b5ad0 Bump codacy/codacy-analysis-cli-action from 4.3.0 to 4.4.0
Bumps [codacy/codacy-analysis-cli-action](https://github.com/codacy/codacy-analysis-cli-action) from 4.3.0 to 4.4.0.
- [Release notes](https://github.com/codacy/codacy-analysis-cli-action/releases)
- [Commits](https://github.com/codacy/codacy-analysis-cli-action/compare/v4.3.0...v4.4.0)

---
updated-dependencies:
- dependency-name: codacy/codacy-analysis-cli-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-12 08:33:17 +00:00
MrM
6f0fe16b87 Update default.blade.php
removed some repeated attributes
2024-02-11 18:45:37 +01:00
snipe
111daffc17 Merge pull request #14188 from spencerrlongg/bug/14146
Fixes Default Location Being Set During Asset Creation and Checkout
2024-02-10 11:47:46 +00:00
Joël Pittet
b8a478f558 Fixes by CVE-2023-37260 upgrading league/oauth2-server 2024-02-09 17:24:07 -08:00
Joël Pittet
9f7084d077 Revert "Fixes by CVE-2022-24894 upgrading league/oauth2-server"
This reverts commit 0840cd3df3.
2024-02-09 17:22:36 -08:00
Joël Pittet
0840cd3df3 Fixes by CVE-2022-24894 upgrading league/oauth2-server 2024-02-09 17:21:24 -08:00
Joël Pittet
cefdaf9a9b Fixes CVE-2022-24894 2024-02-09 17:17:44 -08:00
Joël Pittet
13335b19e9 Fixes CVE-2024-24821 2024-02-09 17:04:34 -08:00
snipe
6e471a27e7 Merge remote-tracking branch 'origin/develop' 2024-02-09 21:10:27 +00:00
snipe
513ea67e7d Merge pull request #14244 from snipe/fixes/null_barcode_if_hard_deleted
Return null if asset was hard-deleted/purged
2024-02-09 21:09:17 +00:00
snipe
3868e711f4 Return null if asset was hard-deleted/purged
Signed-off-by: snipe <snipe@snipe.net>
2024-02-09 21:08:07 +00:00
snipe
f33f712de7 Merge remote-tracking branch 'origin/develop' 2024-02-09 21:00:16 +00:00
snipe
c12e1f6d6c Merge pull request #14243 from snipe/fixes/reports_controller_when_item_is_deleted
Fixed ReportsController to not try to return a serial if the item doesn’t exist
2024-02-09 20:54:37 +00:00
snipe
479abd5231 Do not try to return a serial if the item doesn’t exist
Signed-off-by: snipe <snipe@snipe.net>
2024-02-09 20:53:33 +00:00
snipe
a60a24a4a8 Merge remote-tracking branch 'origin/develop' 2024-02-09 20:42:48 +00:00
snipe
55b3050ca8 Re-applied previous withTrashed PR
Signed-off-by: snipe <snipe@snipe.net>
2024-02-09 20:37:18 +00:00
snipe
2c996a8508 Merge pull request #14241 from snipe/revert-14240-feature/sc-24786
Revert "Fixed barcodes crashing if asset was deleted"
2024-02-09 20:36:02 +00:00
snipe
84f8eee869 Revert "Fixed barcodes crashing if asset was deleted" 2024-02-09 20:35:45 +00:00
snipe
590c19dbd7 Merge pull request #14240 from snipe/feature/sc-24786
Feature/sc 24786
2024-02-09 20:28:31 +00:00
snipe
fa47707974 Use withTrashed() to get the barcode on deleted assets
Signed-off-by: snipe <snipe@snipe.net>
2024-02-09 20:26:49 +00:00
snipe
ca62481083 Added button and route
Signed-off-by: snipe <snipe@snipe.net>
2024-02-09 20:23:13 +00:00
snipe
1c3306046c Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/js/build/app.js
#	public/js/dist/all.js
#	public/mix-manifest.json
2024-02-08 23:14:54 +00:00
snipe
f4fc845375 Updated dev assets
Signed-off-by: snipe <snipe@snipe.net>
2024-02-08 23:06:47 +00:00
snipe
a7af987322 Merge pull request #14229 from Godmartinz/select2-target-fix
Fixed select inputs un-select2-ifying on mobile
2024-02-08 23:04:55 +00:00
Godfrey M
c4eaae923a removed vue comments since they do not apply anymore 2024-02-08 15:02:47 -08:00
snipe
849ba02516 Merge pull request #14187 from Godmartinz/general-hook_fix
Fixed the general webhook not notifying anymore
2024-02-08 23:01:36 +00:00
Godfrey Martinez
9dcd14a712 Merge branch 'develop' into general-hook_fix 2024-02-08 14:59:25 -08:00
snipe
3412b4dc5a Merge remote-tracking branch 'origin/develop' 2024-02-08 14:58:24 +00:00
snipe
a3b96aff1f Merge pull request #14233 from uberbrady/prevent_svg_injection_with_fake_extensions_rebased
Fixes file upload XSS vulnerability [sc-24156]
2024-02-08 14:56:59 +00:00
Brady Wetherington
9bb191f29f Fixes file upload XSS vulnerability [sc-24156] 2024-02-08 14:30:40 +00:00
snipe
4a43ccfa92 Merge pull request #14228 from akemidx/bug/sc-23516
Fixed: 404 Error on Importer When Uploading a .csv Under Certain Circumstance
2024-02-08 13:43:07 +00:00
spencerrlongg
bcfa913450 condition makes this work, needs more testing 2024-02-07 20:03:37 -06:00
spencerrlongg
43d8474caa a note to remember this tomorrow 2024-02-06 17:45:46 -06:00
Godfrey M
b73e8642d3 removed unnecessary changes 2024-02-06 13:06:21 -08:00
Godfrey M
cfe2277a64 forgot to remove comment line 2024-02-06 13:05:04 -08:00
akemidx
e776c2cffa formatting the button tag 2024-02-06 15:51:04 -05:00
Godfrey M
ca59bc3c9c removes if statement that prevents select2-ifying inputs 2024-02-06 12:46:17 -08:00
akemidx
575362f4dc adding in line to null out the active file on click of button 2024-02-06 15:38:07 -05:00
snipe
f0139c5e41 Merge remote-tracking branch 'origin/develop' 2024-02-06 18:25:19 +00:00
snipe
5f8ac66036 Merge pull request #14223 from Godmartinz/user-bulk-edit
Fixed Select2 functionality in User bulk check-in Delete User
2024-02-06 18:22:46 +00:00
snipe
a49e66c689 Merge remote-tracking branch 'origin/develop' 2024-02-06 16:42:16 +00:00
snipe
1630e4bc2f Merge pull request #14227 from snipe/fixes/bulk_update_by_audit_interval
Switch to bulk updating to handle audit interval updates
2024-02-06 16:06:08 +00:00
snipe
bf674a0f4d Removed backticks
Signed-off-by: snipe <snipe@snipe.net>
2024-02-06 15:58:36 +00:00
snipe
b170755c3d Switch to bulk updating to handle audit interval updates
Signed-off-by: snipe <snipe@snipe.net>
2024-02-06 15:52:46 +00:00
snipe
b25612bbac Merge remote-tracking branch 'origin/develop' 2024-02-06 09:09:39 +00:00
snipe
a43183ff96 Increased chunk
Signed-off-by: snipe <snipe@snipe.net>
2024-02-06 09:09:27 +00:00
Godfrey M
5aa34695a1 z 2024-02-05 16:41:29 -08:00
snipe
3b36372a66 Merge pull request #14222 from marcusmoore/tests/company-get-id-for-current-user
Added tests around getIdForCurrentUser method
2024-02-05 22:04:08 +00:00
snipe
e763693829 Merge remote-tracking branch 'origin/develop' 2024-02-05 20:51:37 +00:00
snipe
e08d60ed18 Merge pull request #14221 from snipe/bug/sc-24749
Chunk data to reduce memory on large datasets when updating `next_audit_date`
2024-02-05 20:50:41 +00:00
Marcus Moore
9e6e2de71e Add docblock 2024-02-05 12:49:29 -08:00
snipe
b49935701b Chunk data to reduce memory on large datasets when updating next_audit_date
Signed-off-by: snipe <snipe@snipe.net>
2024-02-05 20:48:24 +00:00
Marcus Moore
76cc5995d9 Write tests around getIdForCurrentUser method [sc-24748] 2024-02-05 12:38:33 -08:00
snipe
c0fbf106ed Merge remote-tracking branch 'origin/develop' 2024-02-05 19:13:17 +00:00
snipe
7b4020c5e9 Updated string paths for URL
Signed-off-by: snipe <snipe@snipe.net>
2024-02-05 19:09:16 +00:00
snipe
383e3829e5 Merge remote-tracking branch 'origin/develop' 2024-02-05 19:04:40 +00:00
snipe
91356af838 Merge pull request #14220 from snipe/bug/sc-24740
Removed loading of assets for label count
2024-02-05 19:02:10 +00:00
snipe
4c967a43a7 Removed loading of assets for label count
Signed-off-by: snipe <snipe@snipe.net>
2024-02-05 18:56:51 +00:00
snipe
deca842eb0 Merge remote-tracking branch 'origin/develop' 2024-02-05 18:35:56 +00:00
snipe
44366746dd Merge pull request #14219 from snipe/fixes/resurface_load_remote
Fixed #14185 - Resurfaced `load_remote` in admin
2024-02-05 18:33:11 +00:00
snipe
3806cec10e Updated language
Signed-off-by: snipe <snipe@snipe.net>
2024-02-05 18:28:05 +00:00
snipe
a800fa07f9 Removed duplicate string
Signed-off-by: snipe <snipe@snipe.net>
2024-02-05 18:27:58 +00:00
snipe
32c360f032 Re-added UI for load_remote
Signed-off-by: snipe <snipe@snipe.net>
2024-02-05 18:23:52 +00:00
snipe
25f1445afc Merge branch 'master' of https://github.com/snipe/snipe-it 2024-02-05 17:26:54 +00:00
snipe
0042359e5f Prod assets
Signed-off-by: snipe <snipe@snipe.net>
2024-02-05 17:23:30 +00:00
snipe
cf2e2bfbc1 Updated prod assets
Signed-off-by: snipe <snipe@snipe.net>
2024-02-05 17:23:21 +00:00
snipe
60f9a8be9a Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/css/dist/all.css
#	public/css/dist/bootstrap-table.css
#	public/js/dist/bootstrap-table.js
#	public/mix-manifest.json
2024-02-05 17:22:58 +00:00
snipe
8316db9702 Merge pull request #13805 from gitgrimbo/more_line_based_markdown
Use parseEscapedMarkedownInline for more views
2024-02-05 17:19:41 +00:00
snipe
1a480435de Merge pull request #14190 from marcusmoore/bug/sc-24685
Fixed consumable checkout via API not sending notification
2024-02-05 17:16:57 +00:00
snipe
ebc373744a Merge pull request #14218 from snipe/security/alpine_3_18_6
Security upgrade alpine from 3.18.5 to 3.18.6 #14178
2024-02-05 17:16:18 +00:00
snipe
650aa25659 Merge pull request #14191 from Godmartinz/googlechat_webhook
Added support for Google Chat notifications
2024-02-05 17:10:54 +00:00
snipe
212dd06948 Security upgrade alpine from 3.18.5 to 3.18.6 #14178
Signed-off-by: snipe <snipe@snipe.net>
2024-02-05 17:07:31 +00:00
snipe
b6eea2e170 Merge pull request #14217 from snipe/security/snyk_bs_table_14199
Upgrade bootstrap-table from 1.22.1 to 1.22.2 #14199
2024-02-05 16:59:51 +00:00
snipe
688017bd8a Upgrade bootstrap-table from 1.22.1 to 1.22.2
Signed-off-by: snipe <snipe@snipe.net>
2024-02-05 16:59:01 +00:00
snipe
58a9c27342 Merge remote-tracking branch 'origin/develop' 2024-02-05 16:31:32 +00:00
snipe
f52b00256d Merge pull request #14213 from snipe/fixes/orientate_on_exif
Fixed FD-40296 - mobile uploads sometimes uploading with incorrect orientation
2024-02-05 16:22:03 +00:00
snipe
2d48d96b3c Merge remote-tracking branch 'origin/develop' 2024-02-05 16:10:54 +00:00
snipe
abd13a1140 Merge pull request #14216 from snipe/bug/sc-24727
Fixed company asset counts for dashboard widget
2024-02-05 16:07:40 +00:00
snipe
5882d71f9b Fix company asset counts for dashboard widget
Signed-off-by: snipe <snipe@snipe.net>
2024-02-05 15:55:53 +00:00
snipe
dc92bbf61e Merge pull request #14215 from snipe/bug/sc-24726
Removed initial check for assets, licenses, etc
2024-02-05 15:54:45 +00:00
snipe
e6fdeb0e8a Removed initial check for assets, licenses, etc
Signed-off-by: snipe <snipe@snipe.net>
2024-02-05 15:30:18 +00:00
snipe
3b948c7b7e Add orientate to image upload
Signed-off-by: snipe <snipe@snipe.net>
2024-02-05 14:29:43 +00:00
snipe
d965fe759a Fixed #14211 - duplicate array key ldap_emp_num
Signed-off-by: snipe <snipe@snipe.net>
2024-02-05 12:28:24 +00:00
Ivan Nieto Vivanco
5e4a3379a9 Adds Components and Licenses logs to Assets history view 2024-02-01 01:35:25 -06:00
Godfrey M
9dc428b720 ran composer update on the package since the version was explicitized 2024-01-31 17:30:56 -08:00
Godfrey M
8a5b469ff8 adds # to webhook channel trigger 2024-01-31 12:54:30 -08:00
Godfrey M
ed06f32a7a adds # to webhook channel trigger 2024-01-31 12:53:56 -08:00
Godfrey M
a876703f8f spacing 2024-01-31 10:48:48 -08:00
Godfrey M
01bb8d8c9a spacing 2024-01-31 10:48:23 -08:00
Godfrey M
f452204d62 applies a conditional to have the the integration test button function properly 2024-01-31 10:47:25 -08:00
Ivan Nieto Vivanco
51ae485f20 When asset is checked-in the assigned licenses also are taken from the user 2024-01-30 19:44:38 -06:00
Godfrey M
0eabb147b2 adds google notif to consumable check out 2024-01-30 13:19:28 -08:00
Marcus Moore
2e0e39ccc8 Ensure notification is sent when consumable is checked out via api 2024-01-30 13:19:20 -08:00
spencerrlongg
63e733f0d6 changes from a note to a source 2024-01-30 15:14:59 -06:00
Godfrey M
2406d2cfdb adds google notifs to license seats check in and out 2024-01-30 13:14:24 -08:00
Godfrey M
e074ca0bf9 adds google notifs to accessories check in and out 2024-01-30 12:57:45 -08:00
Marcus Moore
13c37e708f Implement tests around consumable checkout 2024-01-30 12:43:20 -08:00
Marcus Moore
3f76d65b95 Improve test method name 2024-01-30 12:43:07 -08:00
Godfrey M
87bce0c097 adds google notifs for asset check in and out 2024-01-30 12:38:17 -08:00
Marcus Moore
6d41c8cf67 Merge branch 'develop' into bug/sc-24685 2024-01-30 11:44:36 -08:00
Godfrey M
22385a8e35 fix for general webhook not notifiying anymore 2024-01-30 10:47:18 -08:00
snipe
77fa213ccd Merge pull request #14181 from marcusmoore/bug/sc-24671
Fixed accessory checkout via API not sending notification and not adhering to qty limit
2024-01-30 14:24:42 +00:00
spencerrlongg
d0a82adc3f changed condition 2024-01-29 20:44:26 -06:00
Marcus Moore
de2aa903c5 Scaffold tests 2024-01-29 17:56:55 -08:00
Marcus Moore
42ec2548c9 Fire event when accessory checked out via API
Brings behavior in line with GUI controller
2024-01-29 17:03:19 -08:00
Marcus Moore
a2cba67f4e Improve assertion 2024-01-29 16:59:57 -08:00
Marcus Moore
7d45cfff2c Ensure accessory available when checking out via api 2024-01-29 16:49:09 -08:00
Marcus Moore
f1ab8253f0 Implement tests included two currently failing tests 2024-01-29 16:48:40 -08:00
Marcus Moore
e5d3df7d24 Scaffold accessory checkout tests for api 2024-01-29 15:59:23 -08:00
Marcus Moore
987676df08 Implement additional tests 2024-01-29 15:56:18 -08:00
Marcus Moore
f16f62f76c Scaffold and implement some tests around accessory checkout 2024-01-29 14:21:30 -08:00
Brady Wetherington
8a2f3405d5 Merge branch 'develop' into snipeit_v7_laravel10
A lot of changes here, but hopefully this works?
2024-01-29 22:12:58 +00:00
Godfrey M
dfa33f651a webhook test works 2024-01-29 12:58:09 -08:00
Godfrey M
30c2927987 merged develope 2024-01-29 11:21:00 -08:00
Godfrey M
e8159d97fa changes 2024-01-29 11:12:25 -08:00
snipe
86c625ed8f Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
2024-01-27 15:12:03 +00:00
snipe
3da7876631 Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2024-01-27 15:08:52 +00:00
spencerrlongg
1248260df3 i don't think the output needs to separately escaped, the entire statement is already wrapped in {{}} 2024-01-26 12:33:35 -06:00
spencerrlongg
4cb804cf03 get rid of e() on store and update 2024-01-26 11:56:02 -06:00
spencerrlongg
2b0dd8851c probably needs more testing... but should work 2024-01-26 11:47:09 -06:00
snipe
9136415bb2 Merge remote-tracking branch 'origin/develop' 2024-01-26 15:58:21 +00:00
snipe
c0241a8421 Merge pull request #14175 from uberbrady/rebased_snipe_translator
Fixed #14173: Use new SnipeTranslator to handle pluralized localizations
2024-01-26 15:54:11 +00:00
Brady Wetherington
401e1842ee Fixed pluralization bug due to dashed-locale names instead of underscored
Our locale directories are named things like 'en-US'. But the pluralization
code used by Laravel (through Symfony) requires locale names to be
in the format en_US. This change introduces a new Translator,
SnipeTranslator, which is a tiny set of changes against the built-in
one. It additionally adds a SnipeTranslationServiceProvider, which
loads up the new Translator.
2024-01-26 15:40:55 +00:00
snipe
ad2e0cc7f3 Fixed typo
Signed-off-by: snipe <snipe@snipe.net>
2024-01-26 15:17:59 +00:00
spencerrlongg
2deba17d91 that's all of 'em 2024-01-25 20:04:02 -06:00
spencerrlongg
3574ef5bb9 a few more imports, component sample 2024-01-25 19:54:53 -06:00
spencerrlongg
abf13f1619 revert spacing 2024-01-25 19:37:59 -06:00
spencerrlongg
4a7df470f0 this works 2024-01-25 19:34:41 -06:00
spencerrlongg
c9101f4d97 initial work, not working yet 2024-01-25 18:18:24 -06:00
snipe
14db425725 Merge remote-tracking branch 'origin/develop' 2024-01-25 21:45:49 +00:00
snipe
b39d11cc06 Merge pull request #14171 from snipe/fixes/fd-39934
Removed attribute assigning blank EOL as 0
2024-01-25 21:41:18 +00:00
snipe
d6c61e1429 Removed attribute assigning blank EOL as 0
Signed-off-by: snipe <snipe@snipe.net>
2024-01-25 21:34:20 +00:00
snipe
aa14d5e6b6 Merge remote-tracking branch 'origin/develop' 2024-01-25 20:18:36 +00:00
snipe
85a158eaef Merge pull request #14170 from uberbrady/saml_nonce_storage
Enforce SAML assertion ID uniqueness and notValidOnOrAfter attribute [FD-37019]
2024-01-25 20:14:40 +00:00
Brady Wetherington
d3815ddce7 Remove commented-out timestamps on the saml_nonces table 2024-01-25 20:13:49 +00:00
Brady Wetherington
b39b575fec Add table-check; add command-description for Artisan command 2024-01-25 20:07:18 +00:00
Brady Wetherington
81b8243e1d Enforce SAML assertion ID uniqueness and notValidOnOrAfter attribute 2024-01-25 19:53:24 +00:00
Jeremy Price
43c8e98ec7 Set v6 upgrade requirements in .upgrade_requirements.json -- REVERT FOR v7
This was originally created on the v7 branch, and had v7 requirements,
but we're backporting it so that people have it in-hand before v7 launches.
Since v7 hasn't launched yet, and people can use it for upgrading to new
v6's potentially, we'll make it v6 happy for now.
2024-01-25 10:12:08 -08:00
snipe
9d1abb0aa7 Merge pull request #14127 from snipe/jerm/upgrade-deps-file
Add php version requirements file for future-proofing upgrades
2024-01-25 10:09:35 -08:00
snipe
4e59b83885 Merge pull request #14128 from snipe/jerm/upgrade-dot-php
Add remote requirements checking to upgrade.php
2024-01-25 10:09:03 -08:00
snipe
d8a9d93b1d Merge remote-tracking branch 'origin/develop' 2024-01-25 08:30:56 +00:00
snipe
ab926f2e33 Merge pull request #14153 from Godmartinz/ms_teams_webhook
Added support for Microsoft Teams Notifications
2024-01-25 08:27:17 +00:00
snipe
b76500e32d Merge remote-tracking branch 'origin/develop' 2024-01-25 00:22:18 +00:00
snipe
45b253a57d Merge pull request #14164 from marcusmoore/bug/sc-20686
Avoid unnecessarily hydrating models on asset show page
2024-01-25 00:20:30 +00:00
Marcus Moore
f5dafc477a Avoid unnecessary model hydration on asset model show page 2024-01-24 16:14:51 -08:00
Godfrey M
6e9a46e582 working on Chat integration test 2024-01-24 15:50:36 -08:00
Godfrey M
c65b32bcdb removed translation fixed via method 2024-01-24 14:49:42 -08:00
Godfrey M
1d3124f89f adding a test variable for test methods 2024-01-24 14:38:45 -08:00
snipe
57a8630e99 Merge pull request #14162 from snipe/bug/sc-24511
Fixed #14114 - correctly sort related fields for labels
2024-01-24 21:37:20 +00:00
snipe
105d4899f5 Removed debug line
Signed-off-by: snipe <snipe@snipe.net>
2024-01-24 20:33:13 +00:00
snipe
0715f68c0e Merge remote-tracking branch 'origin/develop' 2024-01-24 20:18:43 +00:00
snipe
5909654fd4 Merge pull request #14163 from Godmartinz/ldap_test_table_fix
Added overflow scroll to ldap test table
2024-01-24 20:18:08 +00:00
Godfrey M
e175cdbfd7 adds table overflow scroll 2024-01-24 12:13:40 -08:00
snipe
896b16d4d5 Merge remote-tracking branch 'origin/develop' 2024-01-24 19:49:50 +00:00
snipe
5f8e63717d Merge pull request #14058 from Godmartinz/ldap_test_table_fix
Fixed Ldap sync test table and table data from overflowing
2024-01-24 19:31:04 +00:00
Godfrey M
ada1a593a4 add google placeholder 2024-01-24 11:29:32 -08:00
snipe
2c7bbfa637 Added additional sort/order hidden fields
Signed-off-by: snipe <snipe@snipe.net>
2024-01-24 19:09:20 +00:00
snipe
ba680126bc Properly sort the results based on non-asset fields
Signed-off-by: snipe <snipe@snipe.net>
2024-01-24 19:09:06 +00:00
snipe
dd3b2da670 Updated variable names for clarity, remove the concat of order and sort
Signed-off-by: snipe <snipe@snipe.net>
2024-01-24 19:08:47 +00:00
Godfrey M
00f07ac2ce add translations, brush up code 2024-01-24 10:38:06 -08:00
snipe
165f9545ac Merge pull request #13924 from snipe/bug/sc-20167
Set qty mutators
2024-01-24 18:21:06 +00:00
snipe
fff21416be Merge pull request #14051 from akemidx/email_in_license_table
Email in License Seat Table
2024-01-24 15:37:43 +00:00
snipe
f760397837 Merge remote-tracking branch 'origin/develop' 2024-01-24 15:36:45 +00:00
snipe
dc84e0f3ae Merge pull request #14161 from snipe/localizations/updated_with_new_strings
Updated language strings
2024-01-24 15:31:09 +00:00
snipe
8ca4c51186 Updated strings
Signed-off-by: snipe <snipe@snipe.net>
2024-01-24 15:29:39 +00:00
snipe
f247661f07 Merge pull request #14159 from snipe/fixes/not_array_typo
Fixed english and attribute placeholder
2024-01-24 14:59:57 +00:00
snipe
f73a55f9ab Fixed english and attribute placeholder
Signed-off-by: snipe <snipe@snipe.net>
2024-01-24 14:58:06 +00:00
snipe
7668a6767d Merge pull request #14102 from Godmartinz/seat-id-is-zero
Fixed license seats id turning to zero when sorting by department
2024-01-24 14:49:33 +00:00
snipe
684264dac7 Merge pull request #14158 from snipe/fixes/moved_url_string_again
Moved URL string to general
2024-01-24 14:48:26 +00:00
snipe
e6f94cfebf Missed one
Signed-off-by: snipe <snipe@snipe.net>
2024-01-24 14:47:54 +00:00
snipe
c54eb22754 Moved URL string to general
Signed-off-by: snipe <snipe@snipe.net>
2024-01-24 14:46:52 +00:00
snipe
661cc2b460 Merge pull request #14131 from Godmartinz/label_engine_translations
Adds translations for Label example
2024-01-24 13:36:40 +00:00
snipe
36f8311204 Merge remote-tracking branch 'origin/develop' 2024-01-24 13:35:04 +00:00
snipe
25db35e41e Merge pull request #14128 from snipe/jerm/upgrade-dot-php
Add remote requirements checking to upgrade.php
2024-01-24 13:23:10 +00:00
snipe
49dc1dd37a Merge pull request #14132 from marcusmoore/chore/sc-24501
Improved radio button values in custom report form
2024-01-24 13:22:48 +00:00
snipe
bfc9be6b97 Merge pull request #14149 from snipe/dependabot/github_actions/develop/actions/cache-4
Bump actions/cache from 3 to 4
2024-01-24 13:22:08 +00:00
snipe
1b7885677a Merge pull request #14155 from uberbrady/ldap_location_fixes
Fix for LDAP syncing with base_dn and location_id and location [FD-39651]
2024-01-24 13:21:46 +00:00
Brady Wetherington
3bc1b9038d Fix for LDAP syncing with base_dn and location_id and location 2024-01-24 11:54:29 +00:00
Godfrey M
49021d277c if not location add default location 2024-01-23 13:33:57 -08:00
Godfrey M
f270672a3d added a location check, to prevent notif blowing up 2024-01-23 13:05:39 -08:00
Godfrey Martinez
b797795d37 Merge pull request #11 from Godmartinz/license_checkable
adds consumable checkout  ms notification
2024-01-23 11:22:02 -08:00
Godfrey M
7c529df49b adds consumable checkout ms notification 2024-01-23 11:21:20 -08:00
Godfrey Martinez
81e92228f3 Merge pull request #10 from Godmartinz/license_checkable
adds licenses ms notifications
2024-01-23 11:12:02 -08:00
Godfrey M
e969f8808c adds licenses ms notifications 2024-01-23 11:10:04 -08:00
Godfrey M
5a46ef5d5b adds Accessory Check in out Notifcations, 2024-01-22 15:30:15 -08:00
Godfrey M
f049cf5b06 adds Asset Check Out Notification 2024-01-22 10:57:22 -08:00
dependabot[bot]
a1ccea4e34 Bump actions/cache from 3 to 4
Bumps [actions/cache](https://github.com/actions/cache) from 3 to 4.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-22 08:50:37 +00:00
snipe
2fa5eb4365 Merge pull request #14144 from snipe/fixes/updated_apple_url
Updated URL for apple manufacturer
2024-01-18 11:53:28 +00:00
snipe
aceb072a1b Updated URL for apple manufacturer
Signed-off-by: snipe <snipe@snipe.net>
2024-01-18 11:49:30 +00:00
snipe
0fbf154187 Merge remote-tracking branch 'origin/develop' 2024-01-18 10:50:12 +00:00
snipe
2a7be4dfd5 Merge pull request #14143 from fe80/feat/redis-database
feat(config): add REDIS_DATABASE support
2024-01-18 10:49:32 +00:00
fe80
f52b17cca6 feat(config): add REDIS_DATABASE support
Add the possibility to set the redis database to use.
The default value is still 0
2024-01-18 11:32:51 +01:00
Godfrey M
befab608f2 cha cha cha changes 2024-01-17 17:59:20 -08:00
Godfrey M
cdcd868162 formats check in message for MS Teams 2024-01-17 17:31:23 -08:00
Godfrey M
ce02e43ab2 fixed integration link, added some conditionals 2024-01-17 16:30:27 -08:00
Godfrey M
9f2af40ef2 adds MS teams integration test 2024-01-17 13:41:45 -08:00
Godfrey M
93ef8317e8 added payload, new MS webhook test method 2024-01-17 11:49:31 -08:00
snipe
99000fada1 Merge pull request #14127 from snipe/jerm/upgrade-deps-file
Add php version requirements file for future-proofing upgrades
2024-01-17 13:15:56 +00:00
Marcus Moore
8aa5cf530b Improve radio button values in custom report form 2024-01-16 12:33:16 -08:00
Godfrey M
6be8c063a9 added moar translations 2024-01-16 12:05:09 -08:00
Godfrey M
74dc17b4b9 adds translations for Label example 2024-01-16 10:47:45 -08:00
snipe
2ae5029bc4 Merge remote-tracking branch 'origin/develop' 2024-01-15 16:11:59 +00:00
snipe
adba2d5b6c Remove 7 day padding for expected assets
Signed-off-by: snipe <snipe@snipe.net>
2024-01-15 16:11:31 +00:00
Jeremy Price
58b2f8ca17 typo 2024-01-11 19:12:24 -08:00
Jeremy Price
8be3c1aaf2 Quit the script when we hit hard errors
a found a few other points where we talk about exiting and re-running
the script once fixed, but never actually exit. So i'm adding-in the
missing exits, and updating any existing exits to make sure we return a
failing return code to the shell
2024-01-11 18:20:09 -08:00
Jeremy Price
2ee8639eaf Check to make sure there's a .env file
While i was testing this, i noticed that it ran right by the .env check,
even though i don't have a .env file at all. The script checks for a
_bad_ .env, but not a missing one.

Now it does
2024-01-11 18:18:41 -08:00
Jeremy Price
32605578dd Add remote requirements checking to upgrade.php
quoted from https://github.com/snipe/snipe-it/pull/14127
    There is a race condition in the upgrade.php file where it can't
    currently know the hard requirements for the version it's upgrading to
    until it does a git pull. By that time, it will have pulled new source
    code that possibly relies on an incompatible version of php, leaving you
    with a broken installation.

    Example: You're running v6.2.x on PHP 7.4, which is fine. v7 requires
    PHP 8.1 or 8.2, but we couldn't know that when we released v6. or v5 for
    that matter. We could change the requirements in the most-recent v6
    version of upgrade.php, but that doesn't help anyone who doesn't upgrade
    first to the most recent v6.

With this change, we implement fetching and incorporating the
requirements data from the remote file.

It's just fetching/decoding a couple of json values that replace the
hard-coded version requirements.

We move the branch checking higher than the php version checking so that
we can use the defined/overridden $branch to decide what branch to pull
the requirements from.
2024-01-11 18:13:59 -08:00
Jeremy Price
fe0bba6df6 rename upgrade requirements file and add snipeit version differentiation
the latter mostly for testing and san checking.. but it doesn't really
matter because it's just json.. if we don't use it we don't use it
2024-01-11 16:52:39 -08:00
Jeremy Price
5fdcd6298f rename php_max_major, because it's not.. it's major_minor, even if it sounds ridiculous 2024-01-11 16:50:16 -08:00
Jeremy Price
55943dbff6 add comments and php_max_wontwork because that's what we use rigth now and MVP, dammit 2024-01-11 16:47:47 -08:00
Jeremy Price
d12e571b20 undoing versioning.. doesn't make sense 2024-01-11 16:32:17 -08:00
Jeremy Price
0c15f05316 Initial upgrade_requirements.json file
for fetching before upgrades, to check major prereqs -- mainly php -- before
pulling down new, possibly breaking, code.
2024-01-11 16:27:03 -08:00
snipe
73ddc0f669 Merge remote-tracking branch 'origin/develop' 2024-01-11 21:46:20 +00:00
snipe
66c24e152f Merge pull request #14114 from uberbrady/preserve_sort_in_label_generation
Fixed [FD-39640]: preserve sort order when generating asset labels
2024-01-11 21:46:01 +00:00
snipe
f610afb1b8 Merge pull request #14121 from Godmartinz/checkout_bug_fix
Fixed multiple click checkouts for consumables, accessories and components
2024-01-11 11:15:48 +00:00
Godfrey M
1f7f9717c5 fixes checkout bug 2024-01-10 11:35:32 -08:00
snipe
5beeaa237b Merge remote-tracking branch 'origin/develop' 2024-01-10 13:20:36 +00:00
snipe
f151de2adc Merge pull request #14118 from snipe/fixes/_supplier_searchable_on_maintenances
Search on supplier name attached to maintenance
2024-01-10 13:18:47 +00:00
snipe
b94aaad9b5 Search on supplier name attached to maintenance
Signed-off-by: snipe <snipe@snipe.net>
2024-01-10 13:16:07 +00:00
snipe
9c9af12e83 Merge remote-tracking branch 'origin/develop' 2024-01-10 13:06:38 +00:00
snipe
1a48790dfe Merge pull request #14116 from marcusmoore/bug/sc-24475
Guard against passing non-integer for company_id when creating asset
2024-01-09 19:08:14 +00:00
Marcus Moore
423b636db9 Guard against non-integers being passed for company_id 2024-01-09 10:57:43 -08:00
snipe
be32152394 Merge remote-tracking branch 'origin/develop' 2024-01-09 17:44:19 +00:00
snipe
824c3e6ecf Merge pull request #14087 from ubc-cpsc/bugfix/CVE-2023-51651
Fixes CVE-2023-51651 Potential URI resolution path traversal in the AWS SDK for PHP
2024-01-09 17:44:04 +00:00
snipe
4053b75f49 Merge branch 'develop' of https://github.com/snipe/snipe-it into develop 2024-01-09 17:43:11 +00:00
snipe
ea4a0c2293 docs: add @mauro-miatello as a contributor 2024-01-09 17:43:03 +00:00
snipe
10ee6ee5c4 Merge pull request #14115 from mauro-miatello/develop
Added license expiration date in "view asset"
2024-01-09 17:38:51 +00:00
MrM
9d16eacad5 Added license expiration date in "view asset"
I've added the expiration date of the license associated with an asset in hardware/ID#software, it is useful to see all of them on the asset page instead of having to open the license details page. I've also fixed a space formatting issue.
2024-01-09 18:30:51 +01:00
Brady Wetherington
4b90f85372 Fixed [FD-39640]: preserve sort order when generating asset labels 2024-01-09 16:37:33 +00:00
snipe
8001ed8436 Merge remote-tracking branch 'origin/develop' 2024-01-08 22:30:05 +00:00
snipe
eaf6d56253 Merge pull request #14109 from marcusmoore/chore/sc-24397
Moved contributors to dedicated file
2024-01-08 22:28:52 +00:00
snipe
8541a342cb Merge pull request #14108 from Godmartinz/asset_maintenance_scope
Added supplier name as a searchable relation on the asset maintenance report
2024-01-08 22:25:55 +00:00
Godfrey M
4184b271f7 adds Supplier as a searchable relation on the asset maintenance report 2024-01-08 14:22:35 -08:00
Marcus Moore
6b105ba8f0 Move link 2024-01-08 14:17:42 -08:00
Marcus Moore
348ed1e555 Add link to contributors file 2024-01-08 14:16:15 -08:00
Marcus Moore
8314047bfb Add newline to start of contributors file 2024-01-08 14:02:09 -08:00
Marcus Moore
1bd4b3827d Add missing comma 2024-01-08 13:47:43 -08:00
Marcus Moore
a2463c2a71 Reference correct file 2024-01-08 13:43:26 -08:00
Marcus Moore
f4d568bf89 Add missing config key 2024-01-08 13:40:57 -08:00
Marcus Moore
eb862c27b8 Add config keys 2024-01-08 13:31:30 -08:00
Marcus Moore
18f79ad924 Move contributors from readme to dedicated files 2024-01-08 13:29:18 -08:00
Marcus Moore
afb396ed65 Add contributor commands to package.json 2024-01-08 13:26:58 -08:00
Marcus Moore
8ea15fc6aa Run generate command to migrate to new style
(from markdown style tables and images to html style)

./node_modules/.bin/all-contributors generate
2024-01-08 12:42:45 -08:00
Marcus Moore
064ec1c22d Add missing markers 2024-01-08 12:39:40 -08:00
Marcus Moore
2f47217003 Add all-contributors-cli as dev dependency 2024-01-08 12:26:52 -08:00
Jermops
25c9f8e038 Merge pull request #14105 from snipe/jerm/snipeit-sh
Update snipeit.sh for v7 Requirements
2024-01-08 11:48:21 -08:00
Jeremy Price
a3811371cc remove removal of installation scripts 2024-01-08 11:41:30 -08:00
Brady Wetherington
f734e196e5 Merge branch 'develop' into snipeit_v7_laravel10 2024-01-08 18:57:55 +00:00
Jeremy Price
6129f4722f Oops! Don't checkout my custom branch
using master until we make the switch to main. As master will keep
working after we switch branches, main will _not_ work _until_ we switch, and if
for some reason we have to delay the branch migration, this will remain
broken until we fix it.
2024-01-08 10:08:52 -08:00
snipe
d71a04e489 Merge remote-tracking branch 'origin/develop' 2024-01-08 17:24:47 +00:00
snipe
4f8defb67d Merge pull request #14107 from snipe/bug/sc-24471
Check that the asset exists before trying to get properties
2024-01-08 12:43:13 +00:00
snipe
2707c399ea Check that the asset exists before trying to get properties
Signed-off-by: snipe <snipe@snipe.net>
2024-01-08 12:42:05 +00:00
Jeremy Price
585d7d0b87 replace some tabs with spaces. don't @ me 2024-01-05 12:09:03 -08:00
snipe
012fe57ca1 Updated assets
Signed-off-by: snipe <snipe@snipe.net>
2024-01-05 15:16:14 +00:00
snipe
f5960388f1 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/css/build/app.css
#	public/css/build/overrides.css
#	public/css/dist/all.css
#	public/mix-manifest.json
2024-01-05 15:05:22 +00:00
snipe
6ebbd2dc30 Merge pull request #14104 from snipe/feature/google_login_more_prominent
Move Google Login prompt higher, made it bigger
2024-01-05 15:03:12 +00:00
snipe
7c5d29ccd9 Move Google Login prompt higher, made it bigger
Signed-off-by: snipe <snipe@snipe.net>
2024-01-05 14:56:34 +00:00
snipe
93712ec417 Merge pull request #14103 from snipe/bug/user_api_limit_offset_order
Moved limit and offset in user API to after additional qualifiers
2024-01-05 12:02:18 +00:00
snipe
f8a21bdb2d Moved limit and offset to after additional qualifiers
Signed-off-by: snipe <snipe@snipe.net>
2024-01-05 11:59:31 +00:00
Jeremy Price
cdfc198f28 update changelog 2024-01-05 00:09:06 -08:00
Jeremy Price
6fcb3d3d5e re-add missing progress bar to ensure correct command ordering 2024-01-05 00:09:06 -08:00
Jeremy Price
358d9ec06d fix enterprise linux version in remi repo for v9 distros 2024-01-05 00:09:06 -08:00
Jeremy Price
322c8c1cf3 install php-sodium on al2. fix snipeit database name 2024-01-05 00:09:06 -08:00
Jeremy Price
47eb0c34a2 remove fedora surpport, add amazon and alma 2024-01-05 00:09:06 -08:00
Jeremy Price
4a290a85e6 awsl2 support, php8.2 support in centos/alma, new mysql user creation code 2024-01-05 00:09:06 -08:00
Jeremy Price
5489c50cc0 remove remaining 8.2 references in Ubuntu 23* block
different vim config confusion made my regex misbehave :-/
2024-01-05 00:09:06 -08:00
Jeremy Price
066e40dada update Ubuntu versions comment in code block 2024-01-05 00:09:06 -08:00
Jeremy Price
123d04ff7b split-out ubuntu 23* versions
since 2023 didn't produce and LTS ubuntu versions

the Ondrej repo we use for installing arbitrary PHP versions doesn't
(easily) support non-LTS versions of ubuntu, which means that 23.04 and
23.10 are problematic using the repo

However, these versions ship with  php8.1 and php8.2 (respectively), so
we don't even need the Ondrej repo for these, so we'll remove it

In general, we'll only support LTS Ubuntu repos because of this, but if
they happen to ship with our preferred PHP versions and otherwise work
w/o heroics, we'll include nominal support in the script
2024-01-05 00:09:06 -08:00
Jeremy Price
d5881736cf stop quoting run_as_app_user args
because "$@" splits positional parameters, but quoting the args makes
them one arg, which doesn't work
2024-01-05 00:09:06 -08:00
Jeremy Price
5e539da3da Debian 12 2024-01-05 00:09:06 -08:00
Jeremy Price
ba58ca9d5c fix up ondrej repo 2024-01-05 00:09:06 -08:00
Jeremy Price
117007dfa1 add new ubuntu/debian versions, change php to 8.2 2024-01-05 00:09:06 -08:00
snipe
10ef47fe87 Merge remote-tracking branch 'origin/develop' 2024-01-04 23:37:36 +00:00
snipe
d29b3633d1 Merge pull request #14063 from marcusmoore/chore/sc-24353
Removed unused files in assets directory
2024-01-04 22:41:49 +00:00
snipe
98ef687e9c Merge pull request #14090 from marcusmoore/chore/sc-24386
Run sqlite tests in GitHub action
2024-01-04 22:41:37 +00:00
snipe
432f05586e Merge pull request #14100 from Godmartinz/fix-license-seat-department-link
fixed `departmentNameLinkFormatter` url
2024-01-04 22:40:24 +00:00
snipe
dbcf7e3fd1 Merge pull request #14101 from marcusmoore/bug/sc-24398
Fixes creating invalid query with null values
2024-01-04 22:36:46 +00:00
Godfrey M
43737263d4 removed that clause 2024-01-04 14:32:03 -08:00
Godfrey M
07eeaea3bf adds an additional clause 2024-01-04 14:30:59 -08:00
Godfrey M
249ff868e5 removes empty seats when sorting by department 2024-01-04 14:26:07 -08:00
Marcus Moore
742e183b02 Add guard against adding null values to query
Since $request->filled(null) returns true
2024-01-04 14:04:00 -08:00
Godfrey M
a110b5fcca ugh 2024-01-04 12:37:53 -08:00
Godfrey M
1f1e58eb1e remove unintentional change 2024-01-04 12:36:57 -08:00
Godfrey M
32b34ca9b9 departmentNameLinkFormatter had a bad url 2024-01-04 12:33:33 -08:00
snipe
3a6d626aa1 Merge remote-tracking branch 'origin/develop' 2024-01-04 00:36:50 +00:00
snipe
0c6611d6bd Merge pull request #14097 from spencerrlongg/hotfix/migration_model_issue
Use Query Builder instead of Model for Update to Skip Observer
2024-01-04 00:36:30 +00:00
spencerrlongg
0d853f931d use query builder instead of model for update to skip observer 2024-01-03 18:32:13 -06:00
snipe
c8816354ae Updated assets for master
Signed-off-by: snipe <snipe@snipe.net>
2024-01-03 23:28:54 +00:00
snipe
42d35174b2 Updated hash
Signed-off-by: snipe <snipe@snipe.net>
2024-01-03 23:25:56 +00:00
snipe
00718d7a4b Merge pull request #14096 from snipe/security/snyk_14075
Upgrade jspdf-autotable from 3.5.31 to 3.8.0
2024-01-03 23:23:10 +00:00
snipe
ab32c42ac8 Upgrade jspdf-autotable from 3.5.31 to 3.8.0
Signed-off-by: snipe <snipe@snipe.net>
2024-01-03 23:21:27 +00:00
snipe
bbdc8383e1 Updated assets
Signed-off-by: snipe <snipe@snipe.net>
2024-01-03 23:17:44 +00:00
snipe
e711d68de1 Merge pull request #14095 from snipe/security/snyk_14066_Upgrade_fortawesome/fontawesome-free
Upgrade @fortawesome/fontawesome-free from 6.4.0 to 6.5.0
2024-01-03 23:16:39 +00:00
snipe
b29df4a610 Upgrade @fortawesome/fontawesome-free from 6.4.0 to 6.5.0
Signed-off-by: snipe <snipe@snipe.net>
2024-01-03 23:15:49 +00:00
snipe
93273d301a Merge pull request #14094 from snipe/localizations/updated_strings
Updated language strings
2024-01-03 23:13:15 +00:00
snipe
50eb257cec Updated language strings
Signed-off-by: snipe <snipe@snipe.net>
2024-01-03 23:12:29 +00:00
snipe
b23ce6cfc6 Merge pull request #14093 from marcusmoore/bug/sc-24389
Fixes language source directory for crowdin
2024-01-03 22:11:20 +00:00
Marcus Moore
08c16b4435 Fix language source directory 2024-01-03 14:02:36 -08:00
snipe
0d697629aa Merge pull request #14092 from marcusmoore/chore/sc-24383
Syncs readme to DockerHub description
2024-01-03 21:36:34 +00:00
Marcus Moore
1f7e7b20e9 Sync readme to dockerhub 2024-01-03 13:26:49 -08:00
Marcus Moore
4894f524a0 Update action name 2024-01-03 12:30:10 -08:00
Marcus Moore
f819e1469a Run sqlite tests in GitHub action 2024-01-03 12:27:13 -08:00
snipe
cce9540316 Merge pull request #13964 from spencerrlongg/refactor/store_asset_form_request
Tests For API Asset Store + Refactor For Auto Increment & Form Requests
2024-01-03 19:26:11 +00:00
spencerrlongg
41e0275c95 htmlentities() 2024-01-03 12:42:36 -06:00
Joël Pittet
771e3ad0ad Fixes CVE-2023-51651 aws/aws-sdk-php with depdendencies 2024-01-02 17:31:10 -08:00
Joël Pittet
7ce37d0ffb Fixes CVE-2023-51651 aws/aws-sdk-php 2024-01-02 17:22:22 -08:00
spencerrlongg
901b1b83d0 rm code, was probably fixed through rules at some point 2024-01-02 18:27:17 -06:00
spencerrlongg
9e84521098 fix auto-increment settings for test settings 2024-01-02 18:10:59 -06:00
Spencer Long
8546407083 Merge branch 'develop' into refactor/store_asset_form_request 2024-01-02 18:05:15 -06:00
spencerrlongg
7c30261ec8 add marcus' migration changes to branch 2024-01-02 17:28:41 -06:00
snipe
8bc5f08da5 Fixed a few more small localization issues
Signed-off-by: snipe <snipe@snipe.net>
2023-12-24 20:14:49 +00:00
snipe
38bd530fae Update en defaults for controllers
Signed-off-by: snipe <snipe@snipe.net>
2023-12-24 19:44:20 +00:00
snipe
02d35449d2 Updated seeder with en to en-US
Signed-off-by: snipe <snipe@snipe.net>
2023-12-24 19:41:48 +00:00
snipe
eead7b49e3 Fixed language code
Signed-off-by: snipe <snipe@snipe.net>
2023-12-24 19:07:11 +00:00
snipe
a31bef7b9e Merge pull request #14072 from snipe/fixes/also_update_settings_console_command
Update ResetSettings command to en-US vs en
2023-12-24 18:33:23 +00:00
snipe
ed9473c8ff Update ResetSettings command to en-US vs en
Signed-off-by: snipe <snipe@snipe.net>
2023-12-24 18:32:21 +00:00
snipe
780269850a Merge pull request #14064 from snipe/bug/set_fallback_locale_to_new_locale_code
Bug/set fallback locale to new locale code
2023-12-20 01:04:43 +00:00
snipe
2a4eff2e90 Remove env var option for config on fallback
Signed-off-by: snipe <snipe@snipe.net>
2023-12-20 01:03:11 +00:00
snipe
a0553f4c33 Update fallback locale to new locale code
Signed-off-by: snipe <snipe@snipe.net>
2023-12-20 01:01:59 +00:00
snipe
4ee5ba4496 Merge pull request #14059 from snipe/localizations/new_strings_pre-6.3.0
Normalize language codes, updated strings
2023-12-20 00:02:47 +00:00
snipe
97ba023152 Moved return
Signed-off-by: snipe <snipe@snipe.net>
2023-12-19 20:47:06 +00:00
snipe
a5947b8109 Added warning in middleware
Signed-off-by: snipe <snipe@snipe.net>
2023-12-19 20:34:45 +00:00
snipe
4a0d4f5862 Moved static var up above
Signed-off-by: snipe <snipe@snipe.net>
2023-12-19 20:27:11 +00:00
snipe
5e0128c9dc Include trashed per @marcusmoore
Signed-off-by: snipe <snipe@snipe.net>
2023-12-19 20:23:19 +00:00
snipe
1a0e1b5f6c Added default to helper per @marcusmoore
Signed-off-by: snipe <snipe@snipe.net>
2023-12-19 20:23:11 +00:00
snipe
493ffc10c1 Defaulted to en-US on quickstart
Signed-off-by: snipe <snipe@snipe.net>
2023-12-19 20:16:00 +00:00
snipe
de62e2775e Merge pull request #14062 from uberbrady/add_down_migration_for_new_localization_refactor
Added back-migration for Big Locale Refactoring
2023-12-19 20:08:27 +00:00
Brady Wetherington
12ed8800d1 Changed some spacing and added a comment as per Snipe 2023-12-19 20:06:48 +00:00
Brady Wetherington
82dd601661 Added back-migration for Big Locale Refactoring 2023-12-19 19:54:04 +00:00
snipe
70b8b7e4be Check for a value for settings (this mostly matters in tests)
Signed-off-by: snipe <snipe@snipe.net>
2023-12-19 19:00:11 +00:00
snipe
1b3a4617b7 Merge pull request #14060 from snipe/bug/fix_bad_migration_namespace
Fixed bad migration namespace
2023-12-19 18:49:24 +00:00
snipe
9dbc38e2ca Drop the down()
Signed-off-by: snipe <snipe@snipe.net>
2023-12-19 18:25:21 +00:00
snipe
ab2c85778a Fixed migration namespace :(
Signed-off-by: snipe <snipe@snipe.net>
2023-12-19 18:22:06 +00:00
snipe
98e6f7e14c Updated form marco with new locale codes
Signed-off-by: snipe <snipe@snipe.net>
2023-12-19 18:12:02 +00:00
snipe
02f24d3332 WTF
Signed-off-by: snipe <snipe@snipe.net>
2023-12-19 17:57:17 +00:00
Godfrey M
4b071745fa prevents tables and table data from overflowing 2023-12-19 09:49:40 -08:00
snipe
6801caaa0d Added backl vendors directory
Signed-off-by: snipe <snipe@snipe.net>
2023-12-19 17:49:10 +00:00
snipe
db138479aa Updated locale middleware for mapping
Signed-off-by: snipe <snipe@snipe.net>
2023-12-19 17:43:22 +00:00
snipe
081bd69d5a Added helper method to map values
Signed-off-by: snipe <snipe@snipe.net>
2023-12-19 17:43:05 +00:00
snipe
c306ba550c Migration to update what we can for locales
Signed-off-by: snipe <snipe@snipe.net>
2023-12-19 17:42:56 +00:00
snipe
b9a877d92d Fixed donked dir tree
Signed-off-by: snipe <snipe@snipe.net>
2023-12-19 17:42:39 +00:00
snipe
3a6f26f241 Update example envs to use correct code for language
Signed-off-by: snipe <snipe@snipe.net>
2023-12-19 17:36:21 +00:00
Godfrey M
c0dba95426 testing ldap test table fix 2023-12-19 09:32:26 -08:00
snipe
026ea41dee Use correct language codes, updated strings
Signed-off-by: snipe <snipe@snipe.net>
2023-12-19 17:23:16 +00:00
snipe
b07133a008 Add @coach1988 as a contributor 2023-12-19 14:05:54 +00:00
snipe
f07ae45fc0 Merge pull request #14056 from snipe/bug/retarget_of_13987_dymo_fix
Implement 1D barcode for label "Tapes\Dymo\LabelWriter_30252" #13987
2023-12-19 14:05:22 +00:00
snipe
2226bd2cd7 Implement 1D barcode for label "Tapes\Dymo\LabelWriter_30252" #13987
Signed-off-by: snipe <snipe@snipe.net>
2023-12-19 14:03:55 +00:00
snipe
aca51d992b Merge pull request #14038 from ubc-cpsc/bugfix/CVE-2023-50251
Fixes CVE-2023-50251 and CVE-2023-50262 DoS on parsing SVG
2023-12-19 14:00:13 +00:00
snipe
fee0956832 Merge pull request #14039 from ubc-cpsc/bugfix/CVE-2023-43655
Fixes CVE-2023-43655 Composer Remote Code Execution vulnerability public composer.phar
2023-12-19 13:59:48 +00:00
snipe
36a76084da Merge remote-tracking branch 'origin/master' into develop 2023-12-19 13:31:10 +00:00
snipe
fe51d0ef79 Merge pull request #14055 from snipe/bug/disallow_arrays_for_model_id_in_api_hardware_update
Make sure we're getting an object instead of a collection on Asset API for model_id
2023-12-19 13:30:54 +00:00
snipe
f9139e0f10 Changed to use instanceof
Signed-off-by: snipe <snipe@snipe.net>
2023-12-19 13:25:32 +00:00
snipe
1063dcfb7b Merge pull request #13994 from Godmartinz/add_license_to_info_for_activation
Added licensed to name and email in user profile license view
2023-12-19 13:16:34 +00:00
snipe
79ad598673 Merge pull request #14050 from marcusmoore/add-logging-to-checking-alerts-command
Added log message for who is being sent expected checkin notifications
2023-12-19 13:14:04 +00:00
snipe
f13c1a53ef Get an object instead of a collection
Signed-off-by: snipe <snipe@snipe.net>
2023-12-19 12:51:35 +00:00
snipe
aef95e2218 Merge remote-tracking branch 'origin/develop' 2023-12-19 12:32:19 +00:00
snipe
f08ce34036 Fixed translation string in JSON
Signed-off-by: snipe <snipe@snipe.net>
2023-12-19 12:31:55 +00:00
Marcus Moore
7cf4baa92a Remove unused vendor less from resources directory 2023-12-18 17:58:47 -08:00
Marcus Moore
6c3dfdfe6d Remove unused vendor css files 2023-12-18 17:48:52 -08:00
akemidx
85bfbf8bc4 email in table, shows in export 2023-12-18 20:15:06 -05:00
Marcus Moore
1708897726 Add log message for who is being sent expected checkin notifications 2023-12-18 17:14:03 -08:00
akemidx
3fe3697a29 adding column, needs table join 2023-12-18 18:26:47 -05:00
snipe
ac8926abc2 Merge pull request #14047 from snipe/dependabot/github_actions/develop/github/codeql-action-3
Bump github/codeql-action from 2 to 3
2023-12-18 22:57:10 +00:00
snipe
e1d2fdcfb7 Merge pull request #14001 from Godmartinz/feature/sc-18577
Added Status Label names to Asset history/ Action log
2023-12-18 22:41:02 +00:00
Marcus Moore
149d159c05 Remove unused bootstrap resources 2023-12-18 11:49:52 -08:00
Marcus Moore
c0ad16f497 Remove unused vendor js files 2023-12-18 11:48:28 -08:00
dependabot[bot]
2305224221 Bump github/codeql-action from 2 to 3
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2 to 3.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-18 08:13:48 +00:00
snipe
ea8181d3ec Merge remote-tracking branch 'origin/develop' 2023-12-15 16:41:55 +00:00
snipe
05bc9f117c Merge pull request #14042 from snipe/bug/sc-24356
Fixed #14037 - record current time on accessory checkin
2023-12-15 16:41:42 +00:00
snipe
444c41bedb Fixed #14037 - record current time on accessory checkin
Signed-off-by: snipe <snipe@snipe.net>
2023-12-15 16:39:18 +00:00
snipe
ec3c4674de Updated prod assets
Signed-off-by: snipe <snipe@snipe.net>
2023-12-15 13:58:45 +00:00
snipe
61a1fed0a2 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/css/dist/all.css
#	public/js/build/vendor.js
#	public/js/dist/all.js
#	public/mix-manifest.json
2023-12-15 13:58:25 +00:00
snipe
2427cb787b Updated assets
Signed-off-by: snipe <snipe@snipe.net>
2023-12-15 13:57:37 +00:00
snipe
e3d6d48e04 Merge pull request #13966 from marcusmoore/feature/sc-24120
Removed jquery-ui-bundle
2023-12-15 13:55:56 +00:00
snipe
0bb5abd24d Merge remote-tracking branch 'origin/develop' 2023-12-15 13:45:02 +00:00
snipe
130be26820 Merge pull request #14031 from snipe/bug/ldap_undefined_search_base
Fixed undefined $search_base
2023-12-15 13:33:34 +00:00
snipe
2d85eeface Added indexes for reports
Signed-off-by: snipe <snipe@snipe.net>
2023-12-15 13:24:01 +00:00
snipe
56f9c7f2f5 Merge pull request #14036 from snipe/feature/sc-24355
Added user agent, remote_ip, action_source to action_logs
2023-12-15 11:18:46 +00:00
snipe
421802893e Added new fields to action report
Signed-off-by: snipe <snipe@snipe.net>
2023-12-15 10:45:22 +00:00
Joël Pittet
32aedabfe5 Force update with PHP 7.4.3 platform requirement and update lock 2023-12-14 09:59:11 -08:00
Joël Pittet
b746c7d371 Fixes CVE-2023-43655 Composer Remote Code Execution vulnerability via web-accessible composer.phar 2023-12-14 09:34:25 -08:00
Joël Pittet
0a5eca53db Fixes CVE-2023-50251 and CVE-2023-50262 DoS on parsing SVG 2023-12-14 09:28:21 -08:00
snipe
7aabf94a35 Added comments
Signed-off-by: snipe <snipe@snipe.net>
2023-12-14 14:43:38 +00:00
snipe
e71080ef37 Make action date sortable on asset history view
Signed-off-by: snipe <snipe@snipe.net>
2023-12-14 14:41:15 +00:00
snipe
14c70ee6c4 Removed BS th classes
Signed-off-by: snipe <snipe@snipe.net>
2023-12-14 14:37:47 +00:00
snipe
8fc470c978 Added fields to activity report
Signed-off-by: snipe <snipe@snipe.net>
2023-12-14 14:34:44 +00:00
snipe
f5f136b9b5 Added fields to history views
Signed-off-by: snipe <snipe@snipe.net>
2023-12-14 14:34:31 +00:00
snipe
a90b04c905 Allowed sorting on user_agent, etc
Signed-off-by: snipe <snipe@snipe.net>
2023-12-14 14:34:08 +00:00
snipe
93c7108eda Added action source to translations
Signed-off-by: snipe <snipe@snipe.net>
2023-12-14 14:33:49 +00:00
snipe
40052e99a7 Added user agent to log method
Signed-off-by: snipe <snipe@snipe.net>
2023-12-14 14:33:39 +00:00
snipe
70303c2b2d Added searchable fields, improved formatting
Signed-off-by: snipe <snipe@snipe.net>
2023-12-14 14:33:25 +00:00
snipe
4dac3712a6 Added DB migration for remote_ip, action_source, user_agent in logs
Signed-off-by: snipe <snipe@snipe.net>
2023-12-14 14:32:26 +00:00
Brady Wetherington
430f1b0212 Merge branch 'develop' into feature/sc-24120 2023-12-14 13:28:17 +00:00
snipe
5df6575c37 Fixed undefinted $search_base
Signed-off-by: snipe <snipe@snipe.net>
2023-12-14 00:11:02 +00:00
snipe
cb18606b2e Merge remote-tracking branch 'origin/develop' 2023-12-13 17:55:57 +00:00
snipe
6b4bc9723c Added logo to readme
Signed-off-by: snipe <snipe@snipe.net>
2023-12-13 17:55:46 +00:00
spencerrlongg
e028145ad9 Add new asset tests for archive, depreciate, and physical fields 2023-12-13 09:16:08 -06:00
snipe
547d58cf14 Merge remote-tracking branch 'origin/develop' 2023-12-13 14:15:36 +00:00
snipe
b92906b071 Merge pull request #14028 from snipe/security/snyk_14013
[Snyk] Upgrade alpinejs from 3.12.3 to 3.13.3 #14013
2023-12-13 14:15:07 +00:00
snipe
b1d4d89b19 [Snyk] Upgrade alpinejs from 3.12.3 to 3.13.3 #14013
Signed-off-by: snipe <snipe@snipe.net>
2023-12-13 14:14:04 +00:00
snipe
4f56c2e9d6 Added radio to seeder for custom fields
Signed-off-by: snipe <snipe@snipe.net>
2023-12-13 14:03:13 +00:00
snipe
70250191ed Merge pull request #14026 from snipe/bug/sc-23599
Fixed checkbox/radio button display on models edit for default fields
2023-12-13 14:00:27 +00:00
snipe
337d863330 Missed closing label on radio buttons
Signed-off-by: snipe <snipe@snipe.net>
2023-12-13 13:52:31 +00:00
snipe
7b85a30b64 Fixed checkbox seeder
Signed-off-by: snipe <snipe@snipe.net>
2023-12-13 13:16:45 +00:00
snipe
ac96bad4a1 Merge pull request #14014 from Godmartinz/requested_assets_table_missing_header
added a missing table header on requested table for checkout
2023-12-13 12:57:20 +00:00
snipe
3834221589 Fixed radio button display
Signed-off-by: snipe <snipe@snipe.net>
2023-12-13 06:30:08 +00:00
snipe
016ca1adc1 Fixed HTML for checkboxes
Signed-off-by: snipe <snipe@snipe.net>
2023-12-13 06:27:50 +00:00
snipe
9edb631d52 Merge pull request #14024 from spencerrlongg/chore/last_vue_component
Last Vue Components
2023-12-13 04:35:35 +00:00
spencerrlongg
58d2f0a41e quick note 2023-12-12 15:49:57 -06:00
spencerrlongg
255d9427b6 make edit a button 2023-12-12 15:41:29 -06:00
spencerrlongg
d29f4489de fix 2023-12-12 14:09:12 -06:00
spencerrlongg
4367fc54bf remove vue from webpack steps 2023-12-12 13:43:05 -06:00
spencerrlongg
b89116eb55 submit on enter for edit 2023-12-12 13:33:51 -06:00
spencerrlongg
9430e9c8e2 autofocus, package-lock.json 2023-12-12 13:28:04 -06:00
snipe
7743b3a0fa Merge remote-tracking branch 'origin/develop' 2023-12-12 14:02:18 +00:00
snipe
8d4a4ccdab Merge pull request #14022 from snipe/chore/sc-24329
Added GH test action status badge
2023-12-12 14:01:56 +00:00
snipe
c5c3000a38 Added GH test action status badge
Signed-off-by: snipe <snipe@snipe.net>
2023-12-12 13:59:45 +00:00
snipe
46c0d38c6d Removed huntr.dev badge
They refocused their company to only AI now :(

Signed-off-by: snipe <snipe@snipe.net>
2023-12-12 13:44:11 +00:00
snipe
f9697887e8 Removed extraneous test
Signed-off-by: snipe <snipe@snipe.net>
2023-12-12 13:41:35 +00:00
snipe
c2896c034d Merge remote-tracking branch 'origin/develop' 2023-12-12 13:33:50 +00:00
snipe
0241e66f2d Merge pull request #14021 from snipe/bug/sc-24328
Fixed HTML double-encoded on checkout emails.
2023-12-12 13:31:41 +00:00
snipe
b53a4c366e Removed escaping on notes on checkout
Signed-off-by: snipe <snipe@snipe.net>
2023-12-12 13:26:41 +00:00
snipe
1572d5c3cc Merge remote-tracking branch 'origin/develop' 2023-12-12 12:27:15 +00:00
snipe
6bb842f52c Merge pull request #14020 from snipe/bug/sc-24326
Added $user->created_at to API user create method
2023-12-12 12:26:58 +00:00
snipe
e894138fd4 Added $user->created_at to API user create method
Signed-off-by: snipe <snipe@snipe.net>
2023-12-12 12:26:02 +00:00
snipe
f8a56f6dc2 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/css/build/app.css
#	public/css/build/overrides.css
#	public/css/dist/all.css
#	public/mix-manifest.json
2023-12-12 04:33:04 +00:00
snipe
068f64a78e Merge pull request #14018 from snipe/features/more_info_in_quickscan
Added model name and number to quickscan
2023-12-12 04:30:11 +00:00
snipe
631dd58de1 Added model name and number to quickscan
Signed-off-by: snipe <snipe@snipe.net>
2023-12-12 04:23:04 +00:00
snipe
bbe5c7c6e8 Merge pull request #14017 from snipe/bug/sc-24323
Smaller icon size for activity reports, other action icons
2023-12-12 01:02:45 +00:00
snipe
41f1c5c1e3 Smaller icon size for activity reports, other action icons
Signed-off-by: snipe <snipe@snipe.net>
2023-12-12 00:58:20 +00:00
spencerrlongg
b01d53a247 one more 2023-12-11 18:43:46 -06:00
snipe
8100f11a36 Merge pull request #14016 from snipe/feature/sc-24184
Set default sorting on backups to latest first
2023-12-12 00:36:28 +00:00
snipe
65dae836c6 Set default sorting on backups to latest first
Signed-off-by: snipe <snipe@snipe.net>
2023-12-12 00:35:08 +00:00
snipe
1689c7f9b6 Merge remote-tracking branch 'origin/develop' 2023-12-12 00:15:35 +00:00
snipe
1084382654 Merge pull request #14015 from snipe/bug/sc-24322
Updated importer icons
2023-12-12 00:15:15 +00:00
snipe
456e6979f0 Updated import icons
Signed-off-by: snipe <snipe@snipe.net>
2023-12-12 00:12:06 +00:00
spencerrlongg
65cbba3c2e completely kill vue 2023-12-11 18:09:22 -06:00
Godfrey M
5eb08d9568 added a missing table header for checkout 2023-12-11 11:14:55 -08:00
snipe
e7a9c7ec99 Merge pull request #14008 from akemidx/sc20532_change_log_level
Change log level on status label colors above 256
2023-12-08 09:01:28 +00:00
snipe
cf242d8b86 Merge remote-tracking branch 'origin/develop' 2023-12-08 08:59:17 +00:00
snipe
aa4aaf69b0 Fixed typo
Signed-off-by: snipe <snipe@snipe.net>
2023-12-08 08:58:45 +00:00
akemidx
f112e31b46 changing log level from ERROR to LOG 2023-12-07 17:56:10 -05:00
akemidx
dc83689553 changing log level from ERROR to LOG 2023-12-07 17:50:25 -05:00
snipe
16ea459eca Merge remote-tracking branch 'origin/develop' 2023-12-07 19:49:25 +00:00
snipe
e483e910fe Merge pull request #14007 from snipe/bug/sc-24315
Fixed maintenances patch endpoint
2023-12-07 19:48:43 +00:00
snipe
778e45c9fd Fixed maintenances patch endpoint
Signed-off-by: snipe <snipe@snipe.net>
2023-12-07 19:36:12 +00:00
snipe
4e96c8d05d Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	Dockerfile.alpine
2023-12-07 14:12:56 +00:00
snipe
2c5c97fd7e Merge pull request #14005 from uberbrady/restore_more_directories
Improve backup directory array
2023-12-07 14:12:04 +00:00
Brady Wetherington
6bd351c5d8 Whoops, didn't even add changes - duh 2023-12-07 14:08:15 +00:00
spencerrlongg
f93e7b91ff that's all folks 2023-12-06 16:20:30 -06:00
spencerrlongg
04069bab82 remove comment 2023-12-05 20:50:07 -06:00
spencerrlongg
3106035ef9 delete, comment 2023-12-05 20:41:34 -06:00
spencerrlongg
18720b3302 safety stuff 2023-12-05 20:36:59 -06:00
spencerrlongg
12e546e63a everything working, cleanup 2023-12-05 20:22:20 -06:00
spencerrlongg
c28936fefb almost there... problem with update button 2023-12-05 17:39:35 -06:00
spencerrlongg
080d196138 buttons work now after style tags removed 2023-12-05 16:41:25 -06:00
spencerrlongg
d3967b37cd this is a start, buttons not working? 2023-12-05 14:52:14 -06:00
Godfrey M
b90cfba796 adds status label id to line change 2023-12-05 11:56:54 -08:00
Godfrey M
49342a4542 added status names to asset history 2023-12-05 11:50:43 -08:00
Godfrey M
a95f0b8862 remove column sizes 2023-12-05 11:07:52 -08:00
Godfrey M
7a1d5e11cc Merge remote-tracking branch 'origin/add_license_to_info_for_activation' into add_license_to_info_for_activation 2023-12-05 11:07:34 -08:00
Godfrey M
15af64a355 fixed the bootstrap column sizes 2023-12-05 10:07:58 -08:00
snipe
0089ea2321 Merge pull request #13882 from marcusmoore/fixes/jquery-validation
Fix client side validation in the v7 branch
2023-12-05 17:26:48 +00:00
snipe
3f35124838 Merge pull request #13888 from spencerrlongg/chore/sc-16907
Convert Vue Personal Access Tokens to Livewire
2023-12-05 16:45:16 +00:00
spencerrlongg
6ca5fb6b20 remove token scope html 2023-12-05 09:44:03 -06:00
snipe
34bf6818ca Merge pull request #13999 from snipe/security/alpine
Updated to alpine 3.18.5 (PR to #13989)
2023-12-05 15:01:07 +00:00
snipe
a0de9eb343 Updated to alpine 3.18.5
Signed-off-by: snipe <snipe@snipe.net>
2023-12-05 15:00:04 +00:00
snipe
b4d747550c Merge pull request #13998 from snipe/feature/add_help_text_for_rtd
Added help text to RTD location field
2023-12-05 14:42:07 +00:00
snipe
7258af20fc Added help text to RTD location field
Signed-off-by: snipe <snipe@snipe.net>
2023-12-05 14:40:49 +00:00
Marcus Moore
a3b0273445 Remove comment 2023-12-04 15:21:04 -08:00
Godfrey Martinez
dd68182d08 Merge branch 'develop' into add_license_to_info_for_activation 2023-12-04 11:17:07 -08:00
Godfrey M
0e9e31f68b adds info needed for license self activation 2023-12-04 11:12:30 -08:00
snipe
174a3398d1 Merge pull request #13993 from Godmartinz/license_product_key_serial_swap
Fixed the Column header Serial to Product Key on a User View
2023-12-04 19:09:03 +00:00
Godfrey M
4fd43799b4 missed one view 2023-12-04 10:56:03 -08:00
spencerrlongg
cef1c5d4d2 cleanup test 2023-12-04 12:47:46 -06:00
snipe
09ec8d1d5c Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/css/dist/skins/skin-black-dark.css
#	public/css/dist/skins/skin-black-dark.min.css
#	public/mix-manifest.json
2023-12-04 15:42:58 +00:00
snipe
5d60be97af Merge pull request #13992 from snipe/bug/sc-24182
Added eula-pdfs to allow-list on restore
2023-12-04 15:35:34 +00:00
snipe
1e46ecc2ee Added eula-pdfs to allow-list
Signed-off-by: snipe <snipe@snipe.net>
2023-12-04 15:33:56 +00:00
spencerrlongg
2d57b9399c more cleanup 2023-11-30 16:20:48 -06:00
spencerrlongg
ca8765e1d7 cleaned up 2023-11-30 16:18:50 -06:00
spencerrlongg
6e5f296a13 gets rid of depreciate 2023-11-30 16:08:49 -06:00
spencerrlongg
68d85385a2 get rid of physical 2023-11-30 16:03:30 -06:00
spencerrlongg
88b6a541ee removed references to archived 2023-11-30 15:59:03 -06:00
spencerrlongg
133c469e36 organization 2023-11-30 14:25:58 -06:00
snipe
5730518fc6 Merge pull request #13978 from uberbrady/test_ldap
Test ldap
2023-11-30 19:23:29 +00:00
snipe
fb1965331c Merge pull request #13981 from Godmartinz/license-table-header-fix
Fixed the Column header Serial to Product Key for Licenses
2023-11-30 18:51:42 +00:00
Godfrey M
fdaa44654d changes the table header Serial to Product Key 2023-11-30 10:46:18 -08:00
snipe
1455331a90 Updated dev assets
Signed-off-by: snipe <snipe@snipe.net>
2023-11-30 18:25:38 +00:00
spencerrlongg
7e780c1187 cleanup rules formatting 2023-11-30 12:20:02 -06:00
spencerrlongg
df954a3af2 return types 2023-11-30 12:06:58 -06:00
spencerrlongg
135b7bde7d added some more check out assertions 2023-11-30 11:53:26 -06:00
snipe
42109dc1eb Merge pull request #13976 from Godmartinz/sc-24144_final
Fixed black dark theme, contrast issues etc
2023-11-30 16:23:13 +00:00
snipe
47c8ae000a Merge pull request #13975 from ubc-cpsc/bugfix/CVE-2023-49316
Fixes CVE-2023-49316 by upgrading phpseclib/phpseclib
2023-11-30 16:22:08 +00:00
Brady Wetherington
5a60df55d1 Add more LDAP tests - including pagination(!) 2023-11-30 16:09:37 +00:00
Brady Wetherington
16da994e28 Add LDAP as 'recommended' requirement; flesh out LDAP tests 2023-11-30 14:00:20 +00:00
Brady Wetherington
2a00dc2d28 Merge branch 'develop' into test_ldap 2023-11-30 12:04:43 +00:00
spencerrlongg
151ceb5fbe get rid of firsts and find by responses id 2023-11-29 17:14:46 -06:00
spencerrlongg
d794608a09 note 2023-11-29 15:04:52 -06:00
spencerrlongg
c3492f1699 fixed eol, add calculated eol/eol explicit tests 2023-11-29 14:57:31 -06:00
Godfrey M
4a19f23e7c fixes for black dark theme 2023-11-29 11:30:02 -08:00
spencerrlongg
9d8433bd6d a couple quick things 2023-11-29 13:15:41 -06:00
Joël Pittet
5b4d6b346b Update for CVE-2023-49316 by upgrading phpseclib/phpseclib (3.0.14 => 3.0.34) 2023-11-29 11:03:12 -08:00
spencerrlongg
65ca24f6ae asset assigned to asset works now 2023-11-29 11:37:52 -06:00
snipe
f004007c47 Merge remote-tracking branch 'origin/develop' 2023-11-29 10:09:27 +00:00
snipe
96210e9498 Merge pull request #13970 from snipe/bug/sc-24149
Created mutator for requestable attribute
2023-11-29 10:08:41 +00:00
snipe
3152df2c48 Created mutator for requestable attribute
Signed-off-by: snipe <snipe@snipe.net>
2023-11-29 10:07:47 +00:00
snipe
df2b52c537 Merge remote-tracking branch 'origin/develop' 2023-11-29 09:41:05 +00:00
snipe
189c90e9e5 Merge pull request #13954 from Godmartinz/feature/sc-23756
Fixed user total asset cost to appear conditionally
2023-11-29 09:40:39 +00:00
snipe
c35d234cde Merge pull request #13959 from snipe/fixes/rebased_bulk_edit_fix
Fixed status and model in bulk edit
2023-11-29 09:40:03 +00:00
snipe
80fafeaebe Merge pull request #13965 from akemidx/no_group_notice_trans
Translation of No Group notice on User edit page
2023-11-29 09:39:28 +00:00
spencerrlongg
b17078fffd a couple notes 2023-11-28 22:15:13 -06:00
spencerrlongg
c886fb555b checkout on store tests almost done 2023-11-28 22:11:20 -06:00
spencerrlongg
15d11f7f4e test checkout to user on store 2023-11-28 21:46:03 -06:00
spencerrlongg
cba5f869c0 standardize some of the validation rules, fix int/string issue 2023-11-28 21:19:19 -06:00
spencerrlongg
4aae82fa38 cleanup validation rules a little 2023-11-28 17:28:17 -06:00
spencerrlongg
5b77e66d28 get rid of deleted_at as it doesn't do anything 2023-11-28 17:16:17 -06:00
Marcus Moore
4a975ebe29 Remove jquery-ui-dist 2023-11-28 15:01:41 -08:00
akemidx
2a54797dce permission level proof of formatting 2023-11-28 17:58:37 -05:00
akemidx
63065bab5d adding in icons for clarity, since there are two places called settings 2023-11-28 17:51:43 -05:00
akemidx
9770016eec beginning of permission groups export 2023-11-28 17:47:36 -05:00
Marcus Moore
810abb5c30 Replace jquery-ui-bundle with jquery-ui-dist 2023-11-28 14:24:21 -08:00
akemidx
108658520d translating no group message on user edit page 2023-11-28 17:15:51 -05:00
spencerrlongg
75ac7f80b9 some refactor + tests 2023-11-28 15:17:46 -06:00
Godfrey M
9e59550b79 removes the row instead of just the optional values 2023-11-28 10:08:32 -08:00
snipe
899890b224 Use update array nomenclature
Signed-off-by: snipe <snipe@snipe.net>
2023-11-28 16:25:35 +00:00
snipe
7ac3341b4f Merge pull request #13955 from marcusmoore/bug/sc-24137
Fixed sqlite exception in migration
2023-11-28 16:13:10 +00:00
snipe
d4fb7ac403 Merge remote-tracking branch 'origin/develop' 2023-11-28 16:11:01 +00:00
snipe
9d5ceb685d Merge pull request #13958 from uberbrady/encryption_key_rotator
Modified re-crypter to also work when given a CLI old-key
2023-11-28 16:10:45 +00:00
snipe
601ebcc1e6 Removed table header contraint
Signed-off-by: snipe <snipe@snipe.net>
2023-11-28 16:00:42 +00:00
snipe
2247be77d8 Fixed translation
Signed-off-by: snipe <snipe@snipe.net>
2023-11-28 15:56:20 +00:00
snipe
2d4a14d4bb Fixed from rebase :(
Signed-off-by: snipe <snipe@snipe.net>
2023-11-28 15:55:41 +00:00
snipe
3b9f069627 Switched back to old version
Signed-off-by: snipe <snipe@snipe.net>
2023-11-28 15:54:42 +00:00
snipe
2c6b957fbe Removed unused query
Signed-off-by: snipe <snipe@snipe.net>
2023-11-28 15:28:37 +00:00
snipe
6ae03a204b Added the model info back in
Signed-off-by: snipe <snipe@snipe.net>
2023-11-28 15:21:14 +00:00
snipe
187d3abeb4 Use translation string
Signed-off-by: snipe <snipe@snipe.net>
2023-11-28 15:15:07 +00:00
snipe
c91713e20a Removed debugging
Signed-off-by: snipe <snipe@snipe.net>
2023-11-28 15:14:55 +00:00
snipe
fa1176ce14 Added translation
Signed-off-by: snipe <snipe@snipe.net>
2023-11-28 15:14:12 +00:00
Brady Wetherington
c71726c83e Whoops, left in some debug lines 2023-11-28 13:52:07 +00:00
Brady Wetherington
ca430ec9b3 Modified re-crypter to also work when given a CLI old-key 2023-11-28 13:49:58 +00:00
snipe
9d786d9386 Removed unused method
Signed-off-by: snipe <snipe@snipe.net>
2023-11-28 13:43:33 +00:00
snipe
4723cfd4ba More refactoring
Signed-off-by: snipe <snipe@snipe.net>
2023-11-28 13:33:32 +00:00
snipe
f9d5c451bc Committing this for now - not done
Signed-off-by: snipe <snipe@snipe.net>
2023-11-28 13:33:32 +00:00
snipe
5574218966 More FAFO - cleanup needed, but model_id works now
Signed-off-by: snipe <snipe@snipe.net>
2023-11-28 13:33:32 +00:00
snipe
c997ae44c2 FAFO troubleshooting
Signed-off-by: snipe <snipe@snipe.net>
2023-11-28 13:33:32 +00:00
Marcus Moore
77ceac5747 Update docblock 2023-11-27 16:36:51 -08:00
Marcus Moore
990358750b Add migration for postgres 2023-11-27 16:33:57 -08:00
Marcus Moore
72dbe95168 Add table prefix 2023-11-27 15:55:33 -08:00
Marcus Moore
37bd297094 Fix typo 2023-11-27 14:05:38 -08:00
Marcus Moore
5d32956070 Allow for migrating data when using sqlite 2023-11-27 12:35:13 -08:00
Godfrey M
45e9d0597a makes user total asset cost appear conditionally 2023-11-27 11:36:47 -08:00
snipe
121b86b3e8 Merge remote-tracking branch 'origin/develop' 2023-11-27 15:49:26 +00:00
Brady Wetherington
8e8b1068ff Beginnings of LDAP test suite 2023-11-27 14:50:43 +00:00
snipe
c72950166f Merge remote-tracking branch 'origin/develop' 2023-11-27 14:46:37 +00:00
snipe
8c7edcb357 Merge pull request #13953 from snipe/localizations/new_strings
Updated language strings
2023-11-27 14:44:01 +00:00
snipe
dbb6002f9f Updated language strings
Signed-off-by: snipe <snipe@snipe.net>
2023-11-27 14:43:16 +00:00
snipe
776c91934b Updated dir name for Khmer
Signed-off-by: snipe <snipe@snipe.net>
2023-11-27 14:39:13 +00:00
Brady Wetherington
6210716199 Merge branch 'develop' into snipeit_v7_laravel10 2023-11-27 13:04:39 +00:00
snipe
77ab5eb875 Merge pull request #13909 from akemidx/bug/sc-23999
Hiding Order Column in Custom Fieldsets
2023-11-24 19:10:42 +00:00
snipe
d80c8ff25b Merge remote-tracking branch 'origin/develop' 2023-11-24 10:10:45 +00:00
snipe
eca13d0593 Merge pull request #13950 from snipe/fixes/array_key_in_import
Check for the array key in $activeFile->first_row
2023-11-24 10:10:08 +00:00
snipe
9607567b75 Check for the array key in $activeFile->first_row
Signed-off-by: snipe <snipe@snipe.net>
2023-11-24 10:08:35 +00:00
snipe
6cec1bd3b9 Merge remote-tracking branch 'origin/develop' 2023-11-23 17:00:32 +00:00
snipe
1217bff4b6 Merge pull request #13947 from snipe/fixes/refactor_checkout_with_bad_category
Refactored checkout for items with bad or missing category
2023-11-23 16:59:51 +00:00
snipe
84d26fe7fa Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
#	package-lock.json
#	public/css/dist/skins/skin-green-dark.css
#	public/css/dist/skins/skin-green-dark.min.css
#	public/js/dist/all-defer.js
#	public/mix-manifest.json
2023-11-23 16:53:13 +00:00
snipe
ea55daf913 Bumped hash
Signed-off-by: snipe <snipe@snipe.net>
2023-11-23 16:51:39 +00:00
snipe
0ff99f0479 Merge pull request #13948 from uberbrady/scim_active_flag
SCIM active flag must be a boolean
2023-11-23 16:44:22 +00:00
Brady Wetherington
8916c976e1 Merge branch 'develop' into scim_active_flag 2023-11-23 16:36:17 +00:00
Brady Wetherington
7b12d511f8 Force active flag to be returned as true or false 2023-11-23 16:34:03 +00:00
snipe
81b2273c37 Refactored checkout screen to redirect if invalid category
Signed-off-by: snipe <snipe@snipe.net>
2023-11-23 16:18:28 +00:00
snipe
978bbeccc5 Added strings
Signed-off-by: snipe <snipe@snipe.net>
2023-11-23 16:18:09 +00:00
snipe
accfbc1b99 Show number of remaining seats and category in form
Signed-off-by: snipe <snipe@snipe.net>
2023-11-23 16:18:03 +00:00
snipe
cf3608ae10 Add @bilias as a contributor 2023-11-23 15:33:08 +00:00
snipe
aaa6a31eb3 Merge pull request #13945 from snipe/fixes/green_skin_fix_13915_to_develop
Higher contrast on green dark skin (#13915 for develop)
2023-11-23 15:30:00 +00:00
snipe
88cc234cbd Higher contrast for green dark skin
Applies #13915 to develop

Signed-off-by: snipe <snipe@snipe.net>
2023-11-23 15:28:43 +00:00
snipe
94eeca7429 Merge pull request #13944 from snipe/security/snyk_13937
Upgrade jspdf-autotable from 3.5.31 to 3.7.1 #13937
2023-11-23 15:24:33 +00:00
snipe
e0e11845bb Upgrade jspdf-autotable from 3.5.31 to 3.7.1 #13937
Signed-off-by: snipe <snipe@snipe.net>
2023-11-23 15:23:13 +00:00
snipe
a7f98ea2a5 Merge pull request #13943 from snipe/security/snyk_13936
Upgrade alpinejs from 3.12.3 to 3.13.2 #13936
2023-11-23 15:20:47 +00:00
snipe
8e3657d62e Upgrade alpinejs from 3.12.3 to 3.13.2 #13936
Signed-off-by: snipe <snipe@snipe.net>
2023-11-23 15:19:59 +00:00
snipe
ddd7f206d3 Merge pull request #13942 from snipe/security/snyk_13935
Updated acorn to 8.11.2
2023-11-23 15:17:34 +00:00
snipe
81cf08adf5 Updated acorn to 8.11.2
Signed-off-by: snipe <snipe@snipe.net>
2023-11-23 15:16:40 +00:00
snipe
1b77632ecb Merge pull request #13941 from snipe/security/snyk_13938
Upgraded webpack to 5.89.0
2023-11-23 15:15:08 +00:00
snipe
d4bdaf16e7 Upgraded webpack to 5.89.0
Signed-off-by: snipe <snipe@snipe.net>
2023-11-23 15:13:13 +00:00
snipe
e3a8952f4b Merge pull request #13940 from snipe/features/add_location_to_user_view_assets
Added location to user view assets
2023-11-23 15:02:23 +00:00
snipe
ad6b286e10 Added default location to view-assets view
Signed-off-by: snipe <snipe@snipe.net>
2023-11-23 15:01:39 +00:00
snipe
7f94b7df32 Removed refresh from asset view table
Signed-off-by: snipe <snipe@snipe.net>
2023-11-23 15:01:24 +00:00
snipe
776b16d379 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
2023-11-22 23:41:31 +00:00
snipe
6409018b08 Bumped hash and moved to pre version
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 23:41:03 +00:00
snipe
780279a620 Merge remote-tracking branch 'origin/develop' 2023-11-22 23:22:46 +00:00
snipe
31f429e1c4 Merge pull request #13934 from snipe/fixes/escaped_asset_tag_in_return_msg
Escape the asset tag before passing it to the view
2023-11-22 23:21:54 +00:00
snipe
3a0b994443 Merge pull request #13933 from snipe/fixes/removed_extra_return
Removed extra return statement in consumables API checkout method
2023-11-22 23:21:06 +00:00
snipe
1307ef19cf Escape the asset tag before passing it to the view
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 23:20:47 +00:00
snipe
aed6b531cb Derp. Extra return statement
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 23:05:38 +00:00
snipe
43db3b13ef Merge remote-tracking branch 'origin/develop' 2023-11-22 23:02:20 +00:00
snipe
bb0ba0bebe Merge pull request #13932 from snipe/features/use_allowlist_for_user_logging
Use allowlist for user observer logging
2023-11-22 23:01:52 +00:00
snipe
ba127be344 Use saveQuietly to prevent double entries
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 23:00:30 +00:00
snipe
c6178bd619 Added translation for success password save
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 22:59:59 +00:00
snipe
3929c8f260 Nicer alert layout
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 22:57:54 +00:00
snipe
f922d0518e Added allow list - quiet the observer down for magical laravel things
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 22:35:34 +00:00
snipe
45d9119733 Removed debugging/comments
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 22:32:34 +00:00
snipe
e269415fec Removed debugging
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 21:55:44 +00:00
snipe
996caafa80 Merge remote-tracking branch 'origin/develop' 2023-11-22 21:42:32 +00:00
snipe
8481768c3d Save quietly for login methods
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 21:42:21 +00:00
snipe
91c36730e7 Merge remote-tracking branch 'origin/develop' 2023-11-22 21:39:47 +00:00
snipe
d3175b2ca4 Removed remember token from changed
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 21:39:06 +00:00
snipe
dfabf9082b Merge remote-tracking branch 'origin/develop' 2023-11-22 21:37:35 +00:00
snipe
a8123db4fb Fixed comments
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 21:35:12 +00:00
snipe
b1e782d2f0 Small nits picked to make Brady happy
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 21:34:39 +00:00
snipe
60517f811e Merge pull request #13931 from snipe/features/nicer_icons_for_activity_report
Use updated icons for activity report
2023-11-22 21:10:22 +00:00
snipe
58679a13eb Use updated icons for activity report
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 21:07:07 +00:00
snipe
3d9a9c7fe8 Merge pull request #13930 from snipe/features/added_user_observer
Added user observer
2023-11-22 20:51:27 +00:00
snipe
22246dd099 Unset the specific arrays we don’t want to keep
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 20:50:46 +00:00
snipe
a7f76f9860 Hide certain fields from changelog
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 20:28:58 +00:00
snipe
8b79a8afdf Added user observer
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 20:22:05 +00:00
snipe
299db76009 Merge pull request #13928 from snipe/fixes/double_logging_on_asset_restore
Fixes double logging on asset restore
2023-11-22 20:10:45 +00:00
snipe
20c0f687e9 Added restored to asset observer, removed manual logging
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 20:09:10 +00:00
snipe
d06cfe6502 Changed verb to “restore” from “restored”
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 20:08:41 +00:00
snipe
534ac5ac53 Merge pull request #13926 from snipe/bug/sc-24106
Fixed issue where delete then restore could result in duplicate asset tags
2023-11-22 18:33:17 +00:00
snipe
e2d0136336 Fixed goofy translation
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 18:14:44 +00:00
snipe
6a3ab526de Refactorer API controller restore methods
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 18:04:24 +00:00
snipe
19877244cd Added/refactorerd isDeletable()
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 18:03:26 +00:00
snipe
f7ccef16e7 Refactorer controller restore methods
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 18:02:47 +00:00
snipe
0e51a0935d Added language strings
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 17:41:12 +00:00
snipe
ffc1266d0e UI fix - don’t show the trash can icon on things that can be restored
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 17:41:06 +00:00
snipe
2972c31a11 Added restore endpoints for manufacturers and asset models API
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 17:40:47 +00:00
snipe
2353c8199c Set qty mutators
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 15:25:22 +00:00
snipe
e10258804d Merge remote-tracking branch 'origin/develop' 2023-11-22 13:48:35 +00:00
snipe
0d29ac9856 Fixded gate return
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 13:48:20 +00:00
snipe
10d867ccc9 Merge remote-tracking branch 'origin/develop' 2023-11-22 12:28:42 +00:00
snipe
eae98d3f35 Merge pull request #13923 from snipe/bug/sc-24098
Quick revert for #13830
2023-11-22 12:28:25 +00:00
snipe
a08dcbdfdb Quick revert for #13830
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 12:25:42 +00:00
snipe
9c4fbbe915 Merge pull request #13922 from snipe/bug/sc-24097
Created mutator on category checkin_email
2023-11-22 12:16:07 +00:00
snipe
d6a337a584 English hard
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 11:23:17 +00:00
snipe
83ee07cca1 Created mutator on category checkin_email
Signed-off-by: snipe <snipe@snipe.net>
2023-11-22 11:14:04 +00:00
snipe
f12efcf5b2 Merge remote-tracking branch 'origin/develop' 2023-11-21 15:45:13 +00:00
snipe
9502525a41 Merge pull request #13914 from snipe/bug/sc-24073
Fixed missing translation string for `validation.two_column_unique_undeleted`
2023-11-21 15:44:56 +00:00
snipe
68ac1aaae0 Additional comments
Signed-off-by: snipe <snipe@snipe.net>
2023-11-21 15:36:11 +00:00
snipe
6a2ab2cfb2 Removed line break
Signed-off-by: snipe <snipe@snipe.net>
2023-11-21 15:10:19 +00:00
snipe
fb125af0df Tweaked language
Signed-off-by: snipe <snipe@snipe.net>
2023-11-21 15:09:50 +00:00
snipe
590cd0c71f Added Validator::replace() for friendlier interpretation of validation string
Signed-off-by: snipe <snipe@snipe.net>
2023-11-21 15:03:59 +00:00
snipe
0ae91d305d Add the two_column_unique_undeleted translation
Signed-off-by: snipe <snipe@snipe.net>
2023-11-21 15:03:03 +00:00
snipe
0a1eef2e5b Merge remote-tracking branch 'origin/develop' 2023-11-21 14:12:50 +00:00
snipe
9347af0970 Merge pull request #13913 from snipe/bug/sc-24071
Fixed #13905 - Use `unique_undeleted` instead of `unique_serial`
2023-11-21 14:12:15 +00:00
snipe
766eee78b2 Removed debugging
Signed-off-by: snipe <snipe@snipe.net>
2023-11-21 13:47:49 +00:00
snipe
2b9e4110bc Removed debugging
Signed-off-by: snipe <snipe@snipe.net>
2023-11-21 13:37:56 +00:00
snipe
4eb435e148 Use unique_undeleted instead of unique_serial
Signed-off-by: snipe <snipe@snipe.net>
2023-11-21 12:36:11 +00:00
akemidx
e5a4214b8b hiding all order stuff 2023-11-20 20:32:14 -05:00
snipe
6573ea6da6 Merge remote-tracking branch 'origin/develop' 2023-11-20 15:41:55 +00:00
snipe
a203189724 Add @Azooz2014 as a contributor 2023-11-20 15:41:36 +00:00
snipe
b02c60c2ce Merge pull request #13898 from Azooz2014/develop
Fixed #13850: Too few arguments to function in App\Importer\UserImporter::fetchManager()
2023-11-20 15:41:04 +00:00
snipe
c14b3d9780 Merge pull request #13904 from snipe/fixes/redirect_to_consumable_on_invalid_category
Redirect back to the specific consumable for correction
2023-11-20 15:40:40 +00:00
snipe
01fec1d6bb Redirect back to the specific consumable for correction
Signed-off-by: snipe <snipe@snipe.net>
2023-11-20 15:39:39 +00:00
snipe
9907da0aae Merge remote-tracking branch 'origin/develop' 2023-11-20 15:32:21 +00:00
snipe
01740b7969 Merge pull request #13903 from snipe/fixes/redirect_if_category_invalid
Redirect if category is missing or invalid
2023-11-20 15:31:58 +00:00
snipe
7c88601066 Grab the API
Signed-off-by: snipe <snipe@snipe.net>
2023-11-20 15:31:39 +00:00
snipe
fe2cfa0d38 Redirect if category is missing or invalid
Signed-off-by: snipe <snipe@snipe.net>
2023-11-20 15:28:44 +00:00
Abdelaziz Faki
2c62a7e78d Fixing #13850 UserImporter bug 2023-11-19 19:59:01 +03:00
snipe
7baf8e36c0 Merge remote-tracking branch 'origin/develop' 2023-11-19 07:16:34 +00:00
snipe
e41a16dbf3 Merge pull request #13879 from Godmartinz/location_search_bug
added user location scope
2023-11-19 07:01:59 +00:00
snipe
ad6822875d Merge pull request #13892 from Godmartinz/ldap_sync_bug
added a `empty()` around location_id to fix  ldap sync bug
2023-11-19 06:58:38 +00:00
Godfrey M
01f4aa018f fixed query 2023-11-16 11:20:14 -08:00
Godfrey M
f9baeefbaf allows to search full name 2023-11-16 11:14:42 -08:00
Godfrey Martinez
5569c2ba4a Merge branch 'develop' into ldap_sync_bug 2023-11-16 10:02:56 -08:00
Godfrey M
2f12a9cfe2 add a conditional around location_id to fix bug 2023-11-16 09:52:44 -08:00
spencerrlongg
af3417d6cc add return type 2023-11-16 11:42:37 -06:00
spencerrlongg
17bf8d0124 fix string 2023-11-16 11:31:00 -06:00
spencerrlongg
c3e02286d3 i can't blame this on livewire - animations or something? 2023-11-16 11:24:54 -06:00
spencerrlongg
a9d82bf157 enter working 2023-11-16 10:54:32 -06:00
snipe
617f58e046 Merge remote-tracking branch 'origin/develop' 2023-11-16 15:28:13 +00:00
snipe
81583207a9 Merge pull request #13887 from spencerrlongg/bug/sc-24024
Fix for Unique Serial
2023-11-16 15:27:55 +00:00
spencerrlongg
e097df912e a little cleanup 2023-11-15 22:35:20 -06:00
spencerrlongg
477bb6165f rm log 2023-11-15 20:45:04 -06:00
Spencer Long
19850e8c5a Merge branch 'snipeit_v7_laravel10' into chore/sc-16907 2023-11-15 20:37:15 -06:00
spencerrlongg
12dcf76da9 more cleanup 2023-11-15 20:33:44 -06:00
spencerrlongg
36aac328e4 delete vue component 2023-11-15 20:32:22 -06:00
spencerrlongg
9cf81c7ad4 cleanup, validation 2023-11-15 20:29:14 -06:00
spencerrlongg
6c6417e595 ok, maybe i do like livewire 2023-11-15 20:19:03 -06:00
spencerrlongg
efa8ba5965 nice, just need frontend work now 2023-11-15 17:24:54 -06:00
spencerrlongg
fd02385c22 deleted components i've already rebuilt in livewire 2023-11-15 17:14:09 -06:00
spencerrlongg
713b21de14 note 2023-11-15 16:56:08 -06:00
spencerrlongg
af144a5184 cleanup 2023-11-15 16:55:21 -06:00
spencerrlongg
9b31ae3146 create mostly working 2023-11-15 16:51:09 -06:00
spencerrlongg
4cb0012872 cleanup 2023-11-15 16:33:16 -06:00
spencerrlongg
eaa68327f7 SINGLE QUOTES 2023-11-15 16:27:01 -06:00
spencerrlongg
b1f75a3bb3 remove unused import 2023-11-15 13:20:17 -06:00
spencerrlongg
c7f90ad86d tested, working 2023-11-15 12:50:40 -06:00
spencerrlongg
0924a53789 quick fix 2023-11-15 12:28:30 -06:00
Marcus Moore
68ef618028 Run validation on blur 2023-11-14 16:30:29 -08:00
Marcus Moore
3ecdafa685 Add class to error placement check 2023-11-14 16:12:47 -08:00
Marcus Moore
20ae9dea19 Fix placement of error message 2023-11-14 15:55:15 -08:00
Godfrey M
c9d46856a3 added name back 2023-11-14 15:00:11 -08:00
Godfrey M
6d65f6646f allows validation to ignore self and update 2023-11-14 14:55:51 -08:00
Marcus Moore
34cd106357 Apply validation 2023-11-14 12:25:18 -08:00
Marcus Moore
714fce7e59 Add site name validation test 2023-11-14 12:23:58 -08:00
Marcus Moore
08e4ea384e Update additional partials for validation 2023-11-14 12:23:46 -08:00
Marcus Moore
fe0f9743d3 Update additional partials for validation 2023-11-14 12:07:37 -08:00
Godfrey M
57019e170f adds user location scope, still needs fine tuning 2023-11-14 11:49:00 -08:00
spencerrlongg
9f303cc116 playing around with livewire 2023-11-14 11:50:27 -06:00
spencerrlongg
e504b20235 couple small changes 2023-11-14 11:01:38 -06:00
snipe
0da3ef70d9 Merge remote-tracking branch 'origin/develop' 2023-11-14 16:16:30 +00:00
snipe
eb87720661 Merge pull request #13878 from snipe/fixes/clearer_error_text_on_import
Clarified upload error text
2023-11-14 16:16:16 +00:00
snipe
9316ecb8d6 CLarified upload error text
Signed-off-by: snipe <snipe@snipe.net>
2023-11-14 16:14:39 +00:00
Brady Wetherington
f64b0d3818 Merge branch 'develop' into snipeit_v7_laravel10 2023-11-14 16:00:29 +00:00
snipe
ec83b733f1 Merge remote-tracking branch 'origin/develop' 2023-11-14 14:40:21 +00:00
snipe
a81e2be6da Merge pull request #13876 from snipe/fixes/added_fieldmap_back_for_cli_import
Added default map back to the importer
2023-11-14 14:40:08 +00:00
snipe
73ebd9017f Added default map back to the importer
Signed-off-by: snipe <snipe@snipe.net>
2023-11-14 14:37:48 +00:00
Marcus Moore
1a26ea0911 Update a couple more fields for new validation 2023-11-13 19:18:04 -08:00
Marcus Moore
7098ab6509 Match styling of existing error messages 2023-11-13 18:54:51 -08:00
Marcus Moore
0d3589ca24 Update create asset page to use new validation library 2023-11-13 18:17:39 -08:00
Marcus Moore
f02ff62a08 Install jquery-validation package 2023-11-13 18:15:18 -08:00
spencerrlongg
fbfc817c5f just some cleanup 2023-11-13 19:47:03 -06:00
snipe
a48eb60f87 Merge remote-tracking branch 'origin/develop' 2023-11-13 20:40:05 +00:00
snipe
13601031cb Merge pull request #13764 from Godmartinz/expiring-alerts-fix
Fixed the `getExpiringLicenses` query
2023-11-13 20:39:29 +00:00
snipe
4546e87eb5 Merge pull request #13680 from marcusmoore/feature/sc-23769
Changed data source input to select in new label engine
2023-11-13 20:38:42 +00:00
snipe
9dc9834bcb Merge pull request #13859 from inietov/fixes/attempt_to_read_id_on_boolean
Fixed ErrorExemption: Attempt to read property "id" on bool [sc-23945]
2023-11-13 20:22:52 +00:00
snipe
4ecce51b57 Merge pull request #13831 from Godmartinz/multi-sync-ldap-locations
Added multi location sync for ldap
2023-11-13 20:20:45 +00:00
snipe
000a28d648 Merge pull request #13830 from spencerrlongg/bug/sc-23921
Resolves Exceptions When An Array is Submitted and Exception Occurs Before Validation
2023-11-13 20:19:44 +00:00
snipe
f3d6de316b Merge branch 'master' of https://github.com/snipe/snipe-it 2023-11-13 16:41:18 +00:00
snipe
1f17c6e4f4 Merge remote-tracking branch 'origin/develop' 2023-11-13 16:41:07 +00:00
snipe
495df737fc Unfixed indenting :(
Signed-off-by: snipe <snipe@snipe.net>
2023-11-13 16:39:35 +00:00
snipe
0bae1a1f5e Merge pull request #13853 from snipe/features/link_back_to_asset_on_create
Link back to asset on create
2023-11-13 16:37:35 +00:00
snipe
442cad69a7 Merge pull request #13864 from marcusmoore/chore/sc-24012
Fixed GitHub Action tests for v7
2023-11-13 16:34:35 +00:00
snipe
5dde7cb439 Merge pull request #13871 from snipe/snyk-fix-bdea9ba7648f6c20aef5ce312ee450cd
[Snyk] Security upgrade alpine from 3.17.3 to 3.17.5
2023-11-13 16:34:08 +00:00
snyk-bot
6acff575e6 fix: Dockerfile.alpine to reduce vulnerabilities
The following vulnerabilities are fixed with an upgrade:
- https://snyk.io/vuln/SNYK-ALPINE317-OPENSSL-5438697
- https://snyk.io/vuln/SNYK-ALPINE317-OPENSSL-5788365
- https://snyk.io/vuln/SNYK-ALPINE317-OPENSSL-5821141
- https://snyk.io/vuln/SNYK-ALPINE317-OPENSSL-6032385
- https://snyk.io/vuln/SNYK-ALPINE317-OPENSSL-6032385
2023-11-13 04:03:04 +00:00
Marcus Moore
be6545a366 Merge Laravel setup steps 2023-11-09 15:55:04 -08:00
Marcus Moore
32fdd36802 Run migrations 2023-11-09 15:51:30 -08:00
Marcus Moore
fbc54526ed Set variables for Passport install step 2023-11-09 15:47:52 -08:00
Marcus Moore
a3306e4a81 Install Passport during test setup process specifying the environment 2023-11-09 15:41:22 -08:00
Marcus Moore
3d858b21fa Revert "Install Passport during test setup process"
This reverts commit 690a5119f4.
2023-11-09 15:29:31 -08:00
Marcus Moore
62b557f82c Revert "Add database migration step"
This reverts commit 65e3696029.
2023-11-09 15:29:19 -08:00
Marcus Moore
158c82ff5f Revert "Be explicit about database host"
This reverts commit fd410c0281.
2023-11-09 15:26:50 -08:00
Marcus Moore
fd410c0281 Be explicit about database host 2023-11-09 15:20:41 -08:00
Marcus Moore
65e3696029 Add database migration step 2023-11-09 14:56:32 -08:00
Marcus Moore
690a5119f4 Install Passport during test setup process 2023-11-09 14:49:56 -08:00
Marcus Moore
cc0653c68a Update GitHub test action to run on PHP 8.1 and 8.2 2023-11-09 14:42:47 -08:00
Marcus Moore
042a15d294 Set minimum PHP version to 8.1 2023-11-09 14:41:13 -08:00
snipe
9bff2d0bbf Fixed indenting?
Signed-off-by: snipe <snipe@snipe.net>
2023-11-09 21:47:29 +00:00
snipe
9e1cfac995 Merge pull request #13857 from akemidx/bug/sc-20532
Bug Fix:  Undefined array key 266
2023-11-09 09:39:04 +00:00
spencerrlongg
8e4c0f60a1 return format 2023-11-08 17:36:54 -06:00
spencerrlongg
5615fc09e6 add view modal 2023-11-08 16:55:29 -06:00
spencerrlongg
d68f1e4cfa initial display work done 2023-11-08 16:48:20 -06:00
spencerrlongg
0c4901487d delete component class (for now) 2023-11-08 16:12:01 -06:00
spencerrlongg
7f4b2d6e42 modal and initial stuff working 2023-11-08 16:10:09 -06:00
Ivan Nieto Vivanco
7d30001ff8 Ignore the importer checkout if user is not found 2023-11-08 15:32:33 -06:00
Marcus Moore
49136a4d67 Add tests for color helper 2023-11-08 12:35:42 -08:00
akemidx
4382adce85 typo in error log message 2023-11-08 15:29:29 -05:00
spencerrlongg
715a49d9fe update php in composer.json 2023-11-08 14:29:06 -06:00
akemidx
2051ac785d adding in error logging and code comments 2023-11-08 13:44:46 -05:00
akemidx
9cc89911f7 possibilitieeeeeeeeessss 2023-11-08 13:29:32 -05:00
akemidx
495521b70e adjusting for less than 0 possibility 2023-11-08 12:51:51 -05:00
snipe
6da0671143 Added comment
Signed-off-by: snipe <snipe@snipe.net>
2023-11-08 14:44:09 +00:00
snipe
a24d21e683 Added new unescaped alert box
Signed-off-by: snipe <snipe@snipe.net>
2023-11-08 14:41:05 +00:00
snipe
d2bf71327b Redirect /asset_tag/view to /asset_tag
Signed-off-by: snipe <snipe@snipe.net>
2023-11-08 14:40:56 +00:00
snipe
ef10f2e50e Use more correct route in redirect
Signed-off-by: snipe <snipe@snipe.net>
2023-11-08 14:40:38 +00:00
snipe
08153d418f Use new alert box and linked string
Signed-off-by: snipe <snipe@snipe.net>
2023-11-08 14:40:18 +00:00
snipe
3f8b63e053 Add linked text
Signed-off-by: snipe <snipe@snipe.net>
2023-11-08 14:40:02 +00:00
snipe
8a61803963 Merge remote-tracking branch 'origin/develop' 2023-11-08 11:39:46 +00:00
snipe
d2bfa9a3b6 Merge pull request #13852 from snipe/bug/sc-23959
Fixed URL to favicon on default blade (used in 404 messages)
2023-11-08 11:39:24 +00:00
snipe
26311e46b8 Fixed URL to favicon on default blade (used in 404 messages)
Signed-off-by: snipe <snipe@snipe.net>
2023-11-08 11:38:48 +00:00
snipe
b3a6cc633b Merge pull request #13769 from Godmartinz/location-dropdown-duplication
clarifies an address column under locations
2023-11-08 08:59:07 +00:00
snipe
749b87cbbd Merge remote-tracking branch 'origin/develop' 2023-11-08 08:58:12 +00:00
snipe
bc9545ca96 Merge pull request #13823 from spencerrlongg/chore/sc-23922
New Translation Strings for Custom Asset Export
2023-11-08 08:57:20 +00:00
snipe
cf42eca198 Merge pull request #13814 from ntbutler-nbcs/feature-location-history
Added #13754 - asset history tab to locations view
2023-11-08 08:55:07 +00:00
snipe
44d064f094 Merge pull request #13842 from marcusmoore/bug/sc-23932
Fixed notes not saving to action log when licenses are checked in/out
2023-11-08 08:53:00 +00:00
snipe
3fb913669b Merge pull request #13847 from spencerrlongg/bug/sc-23914
Removed Refresh Button on Client Tables
2023-11-08 08:52:40 +00:00
snipe
1171141904 Merge pull request #13848 from marcusmoore/bug/sc-23949
Fixed missing import
2023-11-08 08:50:31 +00:00
Marcus Moore
eceb69122c Add missing import 2023-11-07 16:03:28 -08:00
akemidx
154e71de74 shifting wrap around logic back into 0-265 2023-11-07 17:43:51 -05:00
spencerrlongg
93101d36b8 removed refresh button on client tables 2023-11-07 15:07:24 -06:00
Marcus Moore
4fb349e326 Remove extra assertions 2023-11-06 14:04:52 -08:00
Marcus Moore
4d2790c3f4 Add tests for license checkout notes 2023-11-06 13:54:36 -08:00
Marcus Moore
a08e0bd547 Ensure notes are saved to the action log when licenses are checked in and out 2023-11-06 12:20:13 -08:00
snipe
9143b7a1b7 Merge remote-tracking branch 'origin/develop' 2023-11-03 20:10:38 +00:00
snipe
92c7de3fb5 Merge pull request #13837 from snipe/features/add_employee_number_to_user_merge
Added employee number to user merge screen
2023-11-03 20:10:05 +00:00
snipe
d0cc42a068 Added employee number to user merge screeb
Signed-off-by: snipe <snipe@snipe.net>
2023-11-03 20:09:11 +00:00
snipe
39c06802aa Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
2023-11-03 14:07:46 +00:00
snipe
8c316e0bd3 Bumped hash
Signed-off-by: snipe <snipe@snipe.net>
2023-11-03 14:07:15 +00:00
snipe
7a638e4a65 RB-17457 - Object of class Illuminate\Database\Eloquent\Collection could not be converted to int
Signed-off-by: snipe <snipe@snipe.net>
2023-11-03 14:06:27 +00:00
Godfrey M
3b6a0d6525 allows multi location sync for ldap 2023-11-02 16:50:19 -07:00
snipe
b47e734b37 Merge remote-tracking branch 'origin/develop' 2023-11-02 14:50:55 +00:00
snipe
4d65d09306 Removed trim on manager ID
Signed-off-by: snipe <snipe@snipe.net>
2023-11-02 14:50:40 +00:00
snipe
c5e1cdbcee Merge pull request #13828 from Godmartinz/ldap_location_sync
fixed ldap location sync
2023-11-02 12:20:01 +00:00
spencerrlongg
75532d9662 adds permission test 2023-11-01 16:49:59 -05:00
Godfrey M
13d3f85c62 fixes ldap location sync 2023-11-01 12:26:58 -07:00
spencerrlongg
938ec75aa7 clarifying note 2023-11-01 14:09:03 -05:00
spencerrlongg
c9604b896a nevermind 2023-11-01 13:46:32 -05:00
spencerrlongg
d167ec6dc0 unique undeleted recreated with laravel rule 2023-11-01 13:36:35 -05:00
spencerrlongg
e05af5216e formatting 2023-11-01 12:14:46 -05:00
spencerrlongg
3f834cb88f authorization tested in request 2023-11-01 11:43:53 -05:00
spencerrlongg
d971172cf3 rm unnecessary import 2023-11-01 11:34:15 -05:00
spencerrlongg
53bd5626c9 this works, need to write up pr 2023-11-01 11:33:29 -05:00
spencerrlongg
8f75bb8706 fix translation strings 2023-10-31 21:38:52 -05:00
spencerrlongg
b67b00dd82 this is a start, something up with asset_tag unique rule 2023-10-31 21:06:44 -05:00
spencerrlongg
d4b9f6a2a4 add not_array (not ready, doesn't catch for specific exception) 2023-10-31 21:00:22 -05:00
snipe
e43051a1f7 Merge remote-tracking branch 'origin/develop' 2023-10-31 17:11:38 +00:00
snipe
5073c3389f Merge pull request #13821 from snipe/bug/rb-17462
More graceful failure if ldap_results JSON decode isn’t set
2023-10-31 17:11:14 +00:00
snipe
f822f8b186 More graceful failure if ldap_results JSON decode isn’t set
Signed-off-by: snipe <snipe@snipe.net>
2023-10-31 17:09:18 +00:00
snipe
e381bf978f Merge pull request #13816 from snipe/bug/sc-23900
Fixed datetime displayed on license edit for fields that should be date
2023-10-31 16:59:12 +00:00
snipe
db8a7c5ad9 Merge remote-tracking branch 'origin/develop' 2023-10-31 16:30:22 +00:00
snipe
95e9002cd0 Merge pull request #13820 from inietov/fixes/attempt_to_read_property_fields
Fixed Attempt to read property fields on null [sc-23903]
2023-10-31 16:30:07 +00:00
snipe
60088403b9 Merge remote-tracking branch 'origin/develop' 2023-10-31 16:04:29 +00:00
snipe
22996895d8 Check for valid model
Signed-off-by: snipe <snipe@snipe.net>
2023-10-31 16:04:19 +00:00
Ivan Nieto Vivanco
9f9f8c173b Add condition to only run trough custom fields if a custom fieldset exist 2023-10-31 10:00:36 -06:00
snipe
96be0c25c4 Merge remote-tracking branch 'origin/develop' 2023-10-31 16:00:27 +00:00
snipe
e6810e8db9 Merge pull request #13819 from snipe/bug/check_for_valid_category_on_print
Check that the category exists on user print page
2023-10-31 15:59:54 +00:00
snipe
28641493ca Check that the category exists
Signed-off-by: snipe <snipe@snipe.net>
2023-10-31 15:58:59 +00:00
snipe
e703bfaa21 Merge remote-tracking branch 'origin/develop' 2023-10-31 15:33:50 +00:00
snipe
9a7e7bddcc Merge pull request #13818 from snipe/bug/sc-23902
Fixed validation handling on backup uploads
2023-10-31 15:33:26 +00:00
snipe
aa2a25dc19 Display the form errors correctly
Signed-off-by: snipe <snipe@snipe.net>
2023-10-31 15:30:49 +00:00
snipe
57372fc82a Correctly call the validator in the response if it fails
Signed-off-by: snipe <snipe@snipe.net>
2023-10-31 15:30:38 +00:00
snipe
e862fe1056 Merge remote-tracking branch 'origin/develop' 2023-10-31 12:55:04 +00:00
snipe
ae90f9defa Merge pull request #13817 from snipe/feature/sc-23901
Added checkboxes to intentionally remove field values in bulk user edit
2023-10-31 12:54:07 +00:00
snipe
3495652827 Added checkboxes to intentionally remove field values in bulk user edit
Signed-off-by: snipe <snipe@snipe.net>
2023-10-31 12:52:53 +00:00
snipe
5779a63221 Undoing that thing I just did :(
Signed-off-by: snipe <snipe@snipe.net>
2023-10-31 12:28:57 +00:00
snipe
209627e2cc Force format if dates are given
Signed-off-by: snipe <snipe@snipe.net>
2023-10-31 12:25:00 +00:00
snipe
9fc1cbd7ae Change cast to include format
https://laravel.com/docs/8.x/eloquent-mutators#date-casting - this doesn’t seem to work tho?
Signed-off-by: snipe <snipe@snipe.net>
2023-10-31 12:24:48 +00:00
snipe
e3e887f02e Merge remote-tracking branch 'origin/develop' 2023-10-31 09:46:30 +00:00
snipe
e405e27643 Merge pull request #13815 from snipe/feature/sc-23898
Add additional fields to Download All in Activity Report
2023-10-31 09:45:12 +00:00
snipe
96211cf73c Add additional fields to Download All in Activity Report
Signed-off-by: snipe <snipe@snipe.net>
2023-10-31 09:43:47 +00:00
Nathan Butler
79f380cbe7 Added asset history tab to locations view 2023-10-31 10:28:54 +11:00
snipe
5236ca3332 Merge remote-tracking branch 'origin/develop' 2023-10-30 21:05:33 +00:00
snipe
518c43680d Merge pull request #13812 from snipe/bug/sc-23897
Handle redirect from after POST request from backup restore
2023-10-30 20:21:29 +00:00
snipe
e554a80589 Handle redirect from after POST request from backup restore
Signed-off-by: snipe <snipe@snipe.net>
2023-10-30 20:01:01 +00:00
snipe
f47a8664f9 Merge pull request #13811 from Godmartinz/missing_translation_string
add missing translation string
2023-10-30 19:40:51 +00:00
Godfrey M
97953ae082 add missing translation string 2023-10-30 12:17:55 -07:00
snipe
8e20071254 Merge pull request #13731 from snipe/improvements/trim_on_import
Added trim to import values
2023-10-30 14:17:37 +00:00
snipe
316c90c144 Update app/Importer/ItemImporter.php
Co-authored-by: Marcus Moore <contact@marcusmoore.io>
2023-10-30 14:17:27 +00:00
snipe
a8e8fe7447 Merge remote-tracking branch 'origin/develop' 2023-10-30 14:12:54 +00:00
snipe
462d2d329a Merge branch 'develop' of https://github.com/snipe/snipe-it into develop 2023-10-30 14:12:38 +00:00
snipe
a6b713ae21 Add @mmanjos as a contributor 2023-10-30 14:12:23 +00:00
snipe
0d67ae27c2 Merge pull request #13810 from mmanjos/develop
Fixed #11179: APP_FORCE_TLS is missing from the example .env.docker
2023-10-30 14:11:54 +00:00
Matthew Manjos
bd894677ef add missing variable APP_FORCE_TLS to .env.docker 2023-10-30 10:09:44 -04:00
snipe
2fd2d9431e Merge remote-tracking branch 'origin/develop' 2023-10-30 13:21:19 +00:00
snipe
d404452f5a Merge pull request #13809 from snipe/bug/sc-23893
Added min_amt value to model detail page
2023-10-30 13:21:00 +00:00
snipe
8c46f4ef69 Added min_amt value to model detaul page
Signed-off-by: snipe <snipe@snipe.net>
2023-10-30 13:19:59 +00:00
snipe
1da6b6a4d5 Merge remote-tracking branch 'origin/develop' 2023-10-30 13:06:50 +00:00
snipe
740569791f Merge pull request #13803 from spencerrlongg/feature/13789-feature-request-add-user-phone-and-address-to-custom-asset-report
Added User Phone & Address Fields to Custom Asset Report
2023-10-30 12:43:20 +00:00
gitgrimbo
d556f0d275 Use parseEscapedMarkedownInline for more views 2023-10-27 15:37:56 +01:00
spencerrlongg
90eb3b86cf added user phone & address fields 2023-10-26 19:10:53 -05:00
snipe
b58dea07a7 Merge remote-tracking branch 'origin/develop' 2023-10-26 21:46:45 +01:00
snipe
10abecc5a6 Merge pull request #13802 from spencerrlongg/bug/13531-custom-asset-report-does-not-correct-report-eol-date
Fixes EOL on Custom Report
2023-10-26 21:43:13 +01:00
spencerrlongg
f12d44509e asset_eol_date should always be filled now 2023-10-26 14:39:02 -05:00
spencerrlongg
91b53bffa1 resolved 2023-10-26 14:23:31 -05:00
snipe
98423e4dd9 Merge remote-tracking branch 'origin/develop' 2023-10-26 17:57:17 +01:00
snipe
a2ba39c837 Removed required custom field from seeder
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 17:57:05 +01:00
snipe
38f10e0b21 Merge remote-tracking branch 'origin/develop' 2023-10-26 16:00:22 +01:00
snipe
aab7eb4a85 Merge pull request #13800 from snipe/fixes/bulk_edit_assets
Fixed FD-38641 - Bulk asset edit unable to update model_id, misc other bugs
2023-10-26 15:56:47 +01:00
snipe
7b2f49644e Use nothing instead of null to make it consistent
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 14:44:17 +01:00
snipe
305cd9b0b8 Use null instead of blank
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 14:42:49 +01:00
snipe
9bba0b764a Added clearer comments
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 14:38:39 +01:00
snipe
1ce95b6eac Removed debugging
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 14:34:27 +01:00
snipe
9c90f03142 Updated comment
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 14:34:18 +01:00
snipe
b4d3f51414 Merge pull request #13776 from Robert-Azelis/Robert-Azelis-EOL_fix_improvements
[FIX and improvements] EOL rate and EOL date
2023-10-26 13:36:25 +01:00
snipe
64219da0b4 Merge branch 'develop' into Robert-Azelis-EOL_fix_improvements 2023-10-26 13:36:18 +01:00
snipe
7b9259274c Merge pull request #13799 from inietov/fixes/unlogged_checkin_from_importer
Fixed #13795 Unlogged checkin action post updating the username of an asset through the CSV import
2023-10-26 13:33:51 +01:00
snipe
d40a03b4c5 Merge remote-tracking branch 'origin/develop' 2023-10-26 13:09:38 +01:00
snipe
c1213e0abc Nicer handling for empty custom fields
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 09:41:44 +01:00
snipe
05de8a5731 Re-added missing break
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 09:21:27 +01:00
snipe
ff72c4fbaa Added nicer formatting for fields in log meta
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 09:17:28 +01:00
snipe
9d887484c8 Added encrypted custom field to seeder
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 07:41:25 +01:00
snipe
c4c47f2e8d Updated comment
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 06:51:14 +01:00
snipe
0cebccac95 Removed extra logging
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 06:51:07 +01:00
snipe
c3b3aa4de6 Set one field to encrypted in the seeder
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 06:25:51 +01:00
snipe
3717d60170 Added two more custom fields/fieldsets to seeder
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 05:04:30 +01:00
snipe
6c996ac8fa Changed the seeder order to accomodate actionlog factory
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 05:03:59 +01:00
snipe
7042260871 More style polishing on custom fields in bulk edit
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 04:23:11 +01:00
snipe
2695576968 Removed debugging
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 04:21:20 +01:00
snipe
f25ddee857 Removed debugging, use new model rules if model has changed
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 04:21:14 +01:00
snipe
541ba0c0ba Removed conditional add for model_id
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 04:20:52 +01:00
snipe
77d141d19c Don’t check the delete expected checkin by detault
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 03:56:02 +01:00
snipe
436192b836 Fixed seeder
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 02:56:34 +01:00
snipe
522aa96fcc Changed error variable name
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 02:36:18 +01:00
snipe
b87879f8e7 Removed debugging
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 02:35:53 +01:00
snipe
60e0e899bc Added show_in_requestable_list to factory
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 02:35:33 +01:00
snipe
6ebc01ca50 Bulk edit refactor
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 01:49:23 +01:00
snipe
4b6b36c639 Removed semicolon
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 01:49:14 +01:00
snipe
4a759f0a20 Added fingerprint icon for unique
Signed-off-by: snipe <snipe@snipe.net>
2023-10-26 01:49:01 +01:00
Ivan Nieto Vivanco
ca1845efd7 Only log checkin event if the assigned_to property is not empty 2023-10-25 16:41:31 -06:00
Ivan Nieto Vivanco
7ed58a177b Evaluate if the asset was assigned to a different user than current target to log a checkin event 2023-10-25 16:31:23 -06:00
snipe
d8a3081128 Merge remote-tracking branch 'origin/develop' 2023-10-25 21:05:28 +01:00
snipe
d93e399295 Merge pull request #13797 from Godmartinz/employeeid_search_add
adds employee number as a searchable field to the asset table
2023-10-25 21:04:54 +01:00
Godfrey M
1b614c13fb ugh 2023-10-25 13:03:42 -07:00
Godfrey M
56fd41eee4 removed erroneous code 2023-10-25 13:03:12 -07:00
Godfrey M
33b45898b1 adds to advancedsearch 2023-10-25 12:59:58 -07:00
snipe
eabc7479e3 Merge remote-tracking branch 'origin/develop' 2023-10-25 20:58:13 +01:00
snipe
7509d57bf6 Merge pull request #13796 from snipe/feature/sc-23880
Added optional custom fields to requestable assets page
2023-10-25 20:57:54 +01:00
snipe
da08f0e26f Merge pull request #13584 from Godmartinz/Bulk_location_edit_fix_gh-13572
added an option to bulk edit location & fixed location bug
2023-10-25 20:57:18 +01:00
snipe
0feb56d931 Removed period
Signed-off-by: snipe <snipe@snipe.net>
2023-10-25 20:39:15 +01:00
snipe
a0cae77278 Fixed weird layout quirk on smaller screens
Signed-off-by: snipe <snipe@snipe.net>
2023-10-25 20:21:07 +01:00
snipe
0f97c0601b Nicer show/hide if encrypted, warn if already encrypted
Signed-off-by: snipe <snipe@snipe.net>
2023-10-25 20:11:06 +01:00
snipe
3916bac95f Added warning translation for encrypted fields
Signed-off-by: snipe <snipe@snipe.net>
2023-10-25 20:10:46 +01:00
snipe
6264d90459 Removed ending period for consistency
Signed-off-by: snipe <snipe@snipe.net>
2023-10-25 19:45:11 +01:00
snipe
57d3b2d2ef Check for encryption
Signed-off-by: snipe <snipe@snipe.net>
2023-10-25 19:44:10 +01:00
snipe
a202bf81fa Removed column widths, check for encryption and showable
Signed-off-by: snipe <snipe@snipe.net>
2023-10-25 19:44:02 +01:00
snipe
43da292d60 Used short translation for sr-only text
Signed-off-by: snipe <snipe@snipe.net>
2023-10-25 19:43:34 +01:00
snipe
ab3edae0b6 Reverted buttons (this re-introduces the n+1 problem.)
Signed-off-by: snipe <snipe@snipe.net>
2023-10-25 19:43:09 +01:00
snipe
887d013a39 Added listable fields in profile -> requested assets
Signed-off-by: snipe <snipe@snipe.net>
2023-10-25 19:42:33 +01:00
snipe
eb82bc290d Clarified translation
Signed-off-by: snipe <snipe@snipe.net>
2023-10-25 19:42:07 +01:00
snipe
8b9b46c562 Removed comment
Signed-off-by: snipe <snipe@snipe.net>
2023-10-25 19:41:59 +01:00
snipe
307f84dff8 Removed extraneous method
Signed-off-by: snipe <snipe@snipe.net>
2023-10-25 19:41:53 +01:00
snipe
3c6b79e807 Added new fields to blades
Signed-off-by: snipe <snipe@snipe.net>
2023-10-25 17:28:55 +01:00
snipe
e5bd78a722 Added show_in_requestable_list validation, casting
Signed-off-by: snipe <snipe@snipe.net>
2023-10-25 17:28:35 +01:00
snipe
23a6547ada Added custom fields, fixed n+1
Signed-off-by: snipe <snipe@snipe.net>
2023-10-25 17:28:14 +01:00
snipe
63a86c5622 Added field to controller
Signed-off-by: snipe <snipe@snipe.net>
2023-10-25 17:27:36 +01:00
snipe
933ce61efd Removed eager loading for defaultLoc, added requests loading, sorting
Signed-off-by: snipe <snipe@snipe.net>
2023-10-25 17:26:51 +01:00
snipe
88661a58a7 Make field nullable
Signed-off-by: snipe <snipe@snipe.net>
2023-10-25 17:26:31 +01:00
snipe
08693f09b0 Added requests() method on Assets
Signed-off-by: snipe <snipe@snipe.net>
2023-10-25 17:22:12 +01:00
snipe
3a37b80251 Added translations
Signed-off-by: snipe <snipe@snipe.net>
2023-10-25 17:21:58 +01:00
snipe
e7ef7f04f0 Removed periods for consistency
Signed-off-by: snipe <snipe@snipe.net>
2023-10-25 17:21:48 +01:00
snipe
c4adc3ccc8 Migration to add show_in_requestable_list boolean
Signed-off-by: snipe <snipe@snipe.net>
2023-10-25 17:18:37 +01:00
snipe
96f7f49b68 Fixed response docblock
Signed-off-by: snipe <snipe@snipe.net>
2023-10-25 16:40:49 +01:00
snipe
8c93e79397 Merge pull request #13787 from inietov/fixes/errorexception_undefined_array_key
Fixed ErrorException: Undefined array key in importer blade [sc-23864]
2023-10-25 07:47:48 +01:00
snipe
4d345168d6 Merge pull request #13786 from svpernova09/map-docker-logs-to-storage
Map Snipe-IT logs to storage logs folder
2023-10-25 07:20:22 +01:00
Ivan Nieto Vivanco
f2f3931fa9 Formatting correctly 2023-10-24 11:26:37 -06:00
Joe Ferguson
c919cd31fa Map Snipe-IT logs to storage logs folder
For docker-compose.yml usage to prevent error messages.
2023-10-24 11:31:02 -05:00
snipe
4f136920a9 Merge remote-tracking branch 'origin/develop' 2023-10-24 17:03:50 +01:00
snipe
9d2d13bb59 Merge pull request #13784 from snipe/fixes/fixed_accessory_not_found_string
Fixed accessory not found string
2023-10-24 17:03:13 +01:00
snipe
944520bc5d Fixed notification formatting
Signed-off-by: snipe <snipe@snipe.net>
2023-10-24 17:02:16 +01:00
snipe
aae289e150 Added missing string
Signed-off-by: snipe <snipe@snipe.net>
2023-10-24 17:02:07 +01:00
snipe
c756849497 Removed debug line
Signed-off-by: snipe <snipe@snipe.net>
2023-10-24 17:01:51 +01:00
snipe
ec878202f7 Merge remote-tracking branch 'origin/develop' 2023-10-24 11:53:00 +01:00
snipe
29f438123e Merge pull request #13777 from Robert-Azelis/Robert-Azelis-Cutom_Report_FIX
[FIX] Custom report - date fields error
2023-10-24 10:27:58 +01:00
Ivan Nieto Vivanco
0c5d54dfde Create the language string to show in the importer GUI indicating the file is empty 2023-10-23 22:09:17 -06:00
Ivan Nieto Vivanco
49f6eef9df Places a text indicating that the file is empty and display it as an info text 2023-10-23 21:57:35 -06:00
Ivan Nieto Vivanco
8f8e5cb723 Adds condition to only process CSV if is not empty 2023-10-23 21:47:10 -06:00
snipe
d5598b3322 Merge pull request #13778 from Robert-Azelis/Robert-Azelis-Dashboard_impr
[Improvement] Dashboard
2023-10-23 18:00:00 +01:00
Robert-Azelis
309f30f630 Update view.blade.php
display marker if date of EOL is expired and show real EOL rate as diff between purchase date and eol date
2023-10-22 18:38:59 +02:00
Robert-Azelis
04a867d12b Update eol_date.blade.php
read EOL date from database instead calculate on the base model EOL rate
2023-10-22 18:32:20 +02:00
Robert-Azelis
e62636b3a5 Update AssetModelPresenter.php
display name 'EOL rate' instead of 'EOL'
2023-10-22 18:27:53 +02:00
Robert-Azelis
4e20a241ce Update AssetPresenter.php
display name 'EOL rate' instead of 'EOL'
2023-10-22 18:26:19 +02:00
Robert-Azelis
30cc498a16 Update AssetObserver.php
update exlicit marker depends if model EOL > 0 , EOL = 0
2023-10-22 18:23:30 +02:00
Robert-Azelis
5ae09b791f Update AssetsTransformer.php
on list of assets display EOL rate in months if purchase date and eol date are set, otherwise null (not display anything)
2023-10-22 18:16:49 +02:00
Robert-Azelis
bd195a6911 Update AssetsController.php
when asset is updated control EOL date change sand set explicit marker depends to setup of model EOL rate
2023-10-22 18:11:19 +02:00
Robert-Azelis
58062ff9f5 Update AssetModelsController.php
if EOL of model has been changed and value is >0 assets will be updates with new EOL rate, date
if EOL of model has been changes and value is null or 0 then assets will be updates by null EOL rate, date
*asset with set expilicity market will not be updated
2023-10-22 17:56:38 +02:00
Robert-Azelis
7571d45d44 [Improvement[ Dashboard
If multicompany option is enabled much more important for admin is to see on dashboard list of companies instead of locations.  
In other way if multicompanies option is disabled then locations are displayed.
2023-10-22 17:41:33 +02:00
Robert-Azelis
47186b0abe [FIX] Custom report - date fields error
Custom report in v6.2.3 give Error if selected are fields:
Purchase Date, Checkout Date, Last Checkin Date, Expected Checkin Date
Reason is: date field format
2023-10-22 16:28:44 +02:00
Godfrey M
e0a4387b10 clarifies an address column under locations 2023-10-19 10:01:08 -07:00
Godfrey M
b98c1a0627 fixes getExpiringLicenses query 2023-10-18 13:25:34 -07:00
snipe
bcce282ef9 Merge remote-tracking branch 'origin/develop' 2023-10-18 19:16:55 +01:00
snipe
38066bf162 Merge pull request #13758 from inietov/fixes/array_to_string_conversion_rb17355
Fixed ErrorException: Array to String Conversion rb17355
2023-10-18 19:09:13 +01:00
spencerrlongg
6b745930b5 what typo? 2023-10-18 13:00:13 -05:00
snipe
da30292d84 Merge pull request #13763 from Godmartinz/snipeit_v7_laravel10
fixed the bulk edit button on Asset tab
2023-10-18 18:51:41 +01:00
Godfrey M
7bda5c06de fixes the bulk edit button on Asset tab 2023-10-18 10:46:47 -07:00
spencerrlongg
38de69b3da new validation rule 2023-10-18 12:41:24 -05:00
snipe
41e96ad0ab Merge remote-tracking branch 'origin/develop' 2023-10-18 14:37:37 +01:00
snipe
bc6f014fff Merge pull request #13762 from snipe/fixes/make_sure_order_number_is_not_array
Make sure order number is not an array
2023-10-18 14:37:18 +01:00
snipe
1be503b21a Make sure order number is not an array
Signed-off-by: snipe <snipe@snipe.net>
2023-10-18 14:36:16 +01:00
snipe
997664f489 Merge remote-tracking branch 'origin/develop' 2023-10-18 14:18:49 +01:00
snipe
825c800d32 Merge pull request #13761 from snipe/fixes/check_for_valid_date_in_custom_report
Check for valid date in custom report
2023-10-18 14:18:27 +01:00
snipe
0c86b67ed6 Added error reporting to UI
Signed-off-by: snipe <snipe@snipe.net>
2023-10-18 14:13:35 +01:00
snipe
4d841dbc79 Use custom report validator
Signed-off-by: snipe <snipe@snipe.net>
2023-10-18 14:13:25 +01:00
snipe
f2fb5b43e3 Added custom report validator
Signed-off-by: snipe <snipe@snipe.net>
2023-10-18 14:12:52 +01:00
snipe
14a0c9b5db Merge remote-tracking branch 'origin/develop' 2023-10-18 13:06:21 +01:00
snipe
3747165f25 Merge pull request #13759 from snipe/fixes/better_handle_deleted_variables_in_api_call
Check for true/false explicitly on api table view
2023-10-18 13:05:57 +01:00
snipe
787a64d313 Check for true/false explicitly on api table view
Signed-off-by: snipe <snipe@snipe.net>
2023-10-18 13:05:06 +01:00
spencerrlongg
f7bb911b99 clean up 2023-10-17 19:06:53 -05:00
spencerrlongg
388e4c10c4 catch custom fields that are arrays 2023-10-17 19:03:58 -05:00
Ivan Nieto Vivanco
74ed32903f Adds condition to check if parameter is of the proper type 2023-10-17 15:48:51 -06:00
snipe
a6d3886aaf Merge remote-tracking branch 'origin/develop' 2023-10-17 22:37:50 +01:00
snipe
f2bc7d6173 Merge pull request #13757 from snipe/fixes/RB-17334_user_formatted_array
Fixed RB-17334 - ErrorException: Undefined variable $user_formatted_array
2023-10-17 22:34:52 +01:00
snipe
72fe94edb3 Fixed RB-17334 - ErrorException: Undefined variable $user_formatted_array
Signed-off-by: snipe <snipe@snipe.net>
2023-10-17 22:33:56 +01:00
snipe
3e54a9d561 Merge pull request #13756 from spencerrlongg/bug/label_logo_fix
Fixed #13652 - Labels Using Wrong Logo
2023-10-17 19:45:20 +01:00
spencerrlongg
4bdd070f7b formatting 2023-10-17 13:41:31 -05:00
spencerrlongg
277608d962 this seems to work 2023-10-17 13:30:51 -05:00
Brady Wetherington
3d5847f4b3 Merge branch 'develop' into snipeit_v7_laravel10 2023-10-16 23:37:13 +01:00
snipe
82c2a46ada Commented out noisy debugging
Signed-off-by: snipe <snipe@snipe.net>
2023-10-16 23:24:03 +01:00
snipe
3f6554ee34 Use singleton for offset
Signed-off-by: snipe <snipe@snipe.net>
2023-10-16 23:23:43 +01:00
snipe
73ec84903e Merge remote-tracking branch 'origin/develop' 2023-10-16 23:15:05 +01:00
snipe
1e0512ad44 Merge pull request #13753 from snipe/fixes/check_for_valid_location
Check that the location is valid before debugging
2023-10-16 23:14:41 +01:00
snipe
23fa92f4ce Check that the location is valid before debugging
Signed-off-by: snipe <snipe@snipe.net>
2023-10-16 23:13:38 +01:00
snipe
55d0c4021d Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
2023-10-16 20:19:03 +01:00
snipe
2218cff7bc Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2023-10-16 20:18:33 +01:00
Brady Wetherington
db400dffb5 Merge branch 'develop' into snipeit_v7_laravel10
Rebuild assets and re-install from npm
2023-10-16 20:13:59 +01:00
snipe
199cdf6899 Commented out noisy debugging
Signed-off-by: snipe <snipe@snipe.net>
2023-10-16 20:05:11 +01:00
snipe
752171d5b8 Use singleton for offset
Signed-off-by: snipe <snipe@snipe.net>
2023-10-16 20:05:11 +01:00
snipe
8c4bf74f93 Commented out noisy debugging
Signed-off-by: snipe <snipe@snipe.net>
2023-10-14 20:43:18 +01:00
snipe
4e3d5707ce Use singleton for offset
Signed-off-by: snipe <snipe@snipe.net>
2023-10-14 20:39:52 +01:00
snipe
37858d870a Merge remote-tracking branch 'origin/develop' 2023-10-13 19:58:37 +01:00
snipe
b1f158ba5a Merge pull request #13749 from snipe/bug/sc-23473
Handle case where value is deleted in history
2023-10-13 19:58:19 +01:00
snipe
a92a9d7616 Removed duplicated deleted
Signed-off-by: snipe <snipe@snipe.net>
2023-10-13 19:53:11 +01:00
snipe
8f23a45cb3 Removed dummy text
Signed-off-by: snipe <snipe@snipe.net>
2023-10-13 19:49:03 +01:00
snipe
93cccf4f5f Handle case where value is deleted in history
Signed-off-by: snipe <snipe@snipe.net>
2023-10-13 19:32:09 +01:00
snipe
dcdc294135 Merge remote-tracking branch 'origin/develop' 2023-10-13 12:40:30 +01:00
snipe
04f6f39588 Merge pull request #13748 from snipe/bug/sc-23830
Fixed #13723 - race condition on asset observer for older migration
2023-10-13 12:40:14 +01:00
snipe
ca1420c9bd Added the temp column back in
Signed-off-by: snipe <snipe@snipe.net>
2023-10-13 12:39:28 +01:00
snipe
2537d0fdaf Added comments
Signed-off-by: snipe <snipe@snipe.net>
2023-10-13 12:34:46 +01:00
snipe
b2aed7feea Removed temp column
Signed-off-by: snipe <snipe@snipe.net>
2023-10-13 12:30:26 +01:00
snipe
ea960c39bb Check if the eol_explicit column exists yet, add it if not
Signed-off-by: snipe <snipe@snipe.net>
2023-10-13 12:19:32 +01:00
snipe
0b39591d88 Add the eol_explicit column earlier to accomodate the observer
Signed-off-by: snipe <snipe@snipe.net>
2023-10-13 12:18:58 +01:00
snipe
c14a01eb8b Added comments to explain the potential race condition
Signed-off-by: snipe <snipe@snipe.net>
2023-10-13 12:18:19 +01:00
snipe
2a9ed09f77 Merge remote-tracking branch 'origin/develop' 2023-10-13 10:03:18 +01:00
snipe
b96e77268a Merge pull request #13745 from spencerrlongg/bug/table_prefix_migration_fix
Resolves issue with migrations with table prefixes
2023-10-13 08:49:28 +01:00
spencerrlongg
f3bd23da3d rm whitespace 2023-10-12 14:53:17 -05:00
spencerrlongg
9b53b0fedc resolve issue with migrations with table prefixes 2023-10-12 14:50:12 -05:00
snipe
0d2f43c04f Merge remote-tracking branch 'origin/develop' 2023-10-11 12:00:54 +01:00
snipe
138ec33555 Merge pull request #13733 from marcusmoore/bug/sc-23453
Fixed notification logic to ensure check in and out emails are delivered
2023-10-11 12:00:37 +01:00
snipe
e99d307350 Merge pull request #13734 from marcusmoore/bug/sc-23661
Fixed the storing of group permissions when creating via API
2023-10-11 03:46:49 +01:00
Marcus Moore
417f9c21e4 Fix the storing of group permissions when creating via API 2023-10-10 17:51:29 -07:00
Marcus Moore
43b9e6401c Formatting 2023-10-10 15:18:55 -07:00
Marcus Moore
dae9e6d096 Improve try catch blocks 2023-10-10 15:18:37 -07:00
Marcus Moore
9ef598d07b Apply changes to exception handling for check outs to check ins 2023-10-10 15:16:12 -07:00
Marcus Moore
2a29566458 Catch all ClientExceptions on check out 2023-10-10 15:15:02 -07:00
Marcus Moore
ab3a3de59b Fire webhook notification after sending emails 2023-10-10 15:13:46 -07:00
Marcus Moore
47a77eabf2 Avoid logging error messages for webhook request failures 2023-10-10 15:06:08 -07:00
snipe
758d3aadb4 Added trim to import values
Signed-off-by: snipe <snipe@snipe.net>
2023-10-10 11:52:35 +01:00
snipe
1f0dadb58d Merge remote-tracking branch 'origin/develop' 2023-10-09 16:43:24 +01:00
snipe
f685ba01b6 Reversed order of find
Signed-off-by: snipe <snipe@snipe.net>
2023-10-09 16:43:14 +01:00
snipe
e3591dc756 Merge pull request #13728 from snipe/fixes/13725_for_dev
Fixes qty remaining requirements for component checkout via API
2023-10-09 16:34:40 +01:00
snipe
0fbe63d0cf Add @Singrity as a contributor 2023-10-09 16:33:00 +01:00
snipe
b9dc7f88d0 Fix qty requirements for Components API checkout
Signed-off-by: snipe <snipe@snipe.net>
2023-10-09 16:32:30 +01:00
snipe
f6527e0b42 Merge pull request #13727 from snipe/security/huntr_43206801-9862-48da-b379-e55e341d78bf
Set resend acceptance to POST
2023-10-09 16:15:27 +01:00
snipe
866bbe5e11 Removed extra debugging
Signed-off-by: snipe <snipe@snipe.net>
2023-10-09 16:15:14 +01:00
snipe
6d55d78280 Set resend acceptance to POST
Signed-off-by: snipe <snipe@snipe.net>
2023-10-09 16:13:41 +01:00
snipe
2789f67bb4 Merge remote-tracking branch 'origin/develop' 2023-10-09 15:19:29 +01:00
snipe
7a0d3f788f Merge pull request #13726 from snipe/fixes/tighter_checkin_on_log_match
Added tighter controls for matching log ID and item_id
2023-10-09 15:19:10 +01:00
snipe
e5f5802235 Added tighter controls for matching log ID and item_id
Signed-off-by: snipe <snipe@snipe.net>
2023-10-09 15:17:03 +01:00
snipe
a1f3a5c624 Merge remote-tracking branch 'origin/develop' 2023-10-07 11:34:49 +01:00
snipe
d2dc3253ab Cast the request limit to intval before we try to abs()
Signed-off-by: snipe <snipe@snipe.net>
2023-10-07 11:34:37 +01:00
snipe
d9a1dab827 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
#	public/css/build/app.css
#	public/css/build/overrides.css
#	public/css/dist/all.css
#	public/mix-manifest.json
2023-10-06 20:17:59 +01:00
snipe
5277f7cc5c Dev assets
Signed-off-by: snipe <snipe@snipe.net>
2023-10-06 20:14:44 +01:00
snipe
25a5507d9d Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2023-10-06 20:07:35 +01:00
snipe
a95fae0e94 Merge remote-tracking branch 'origin/develop' 2023-10-06 20:00:12 +01:00
snipe
890efb18d8 Merge pull request #13720 from snipe/security/huntr_dev_d6ed5ac1-2ad6-45fd-9492-979820bf60c8
Fixed missing escaping asset history old/new values
2023-10-06 19:59:42 +01:00
snipe
eea2eabaee Escaping asset history old/new values
Signed-off-by: snipe <snipe@snipe.net>
2023-10-06 19:45:23 +01:00
snipe
9596826259 Merge branch 'master' of https://github.com/snipe/snipe-it 2023-10-06 19:04:44 +01:00
snipe
cd3b4754e8 Merge pull request #13704 from Godmartinz/feature/sc-23571_v2
Added a check-in button on components tab of Asset view
2023-10-05 14:28:37 +01:00
snipe
1dab4b59e9 Merge pull request #13693 from Godmartinz/bug/sc-9955
added proper margin-top to sidebar menu on bigger resolutions
2023-10-05 14:27:25 +01:00
snipe
05dd2b4008 Merge pull request #13709 from spencerrlongg/eol-migration
Speed up EOL Migration
2023-10-05 14:26:47 +01:00
snipe
b809625856 Merge pull request #13713 from snipe/security/13685
[Snyk] Security upgrade css-loader from 4.3.0 to 5.0.0 #13685
2023-10-05 14:13:35 +01:00
snipe
8d921359ca [Snyk] Security upgrade css-loader from 4.3.0 to 5.0.0 #13685
Signed-off-by: snipe <snipe@snipe.net>
2023-10-05 14:12:36 +01:00
spencerrlongg
c07c0c0f74 cleanup 2023-10-04 16:55:35 -05:00
spencerrlongg
cc82e86eeb one more check 2023-10-04 16:54:56 -05:00
spencerrlongg
8c9961aba8 refactor 2023-10-04 15:40:42 -05:00
spencerrlongg
46af40bd02 ????? 2023-10-04 15:20:16 -05:00
spencerrlongg
6cda9056b8 oops 2023-10-04 14:56:18 -05:00
spencerrlongg
101bd9c404 kill transaction, try update array 2023-10-04 14:47:14 -05:00
spencerrlongg
ad6b502005 comments 2023-10-04 14:37:18 -05:00
spencerrlongg
cb10c7af27 oops 2023-10-04 14:33:35 -05:00
spencerrlongg
99d409c0a5 transaction 2023-10-04 14:32:28 -05:00
Godfrey M
37c1d6fc04 removed unnecessary changes 2023-10-03 12:45:13 -07:00
Brady Wetherington
7a5714cc85 Merge branch 'develop' into snipeit_v7_laravel10 2023-10-03 20:37:17 +01:00
Godfrey M
c69958d95d removed dead space 2023-10-03 12:32:24 -07:00
Godfrey M
92776adb93 remove unnecessary changes 2023-10-03 12:31:58 -07:00
Godfrey M
dee36fc294 adds component checkin to asset tab 2023-10-03 12:30:08 -07:00
snipe
a2773aa895 Merge pull request #13696 from marcusmoore/bug/sc-23796
Fixed potential call to a member function toArray() on null
2023-10-03 11:01:40 +01:00
Marcus Moore
e82fec2a5f Grammar fix 2023-10-02 16:19:20 -07:00
Marcus Moore
db4c86a4f4 Filter null field options before attempting to process them 2023-10-02 16:14:20 -07:00
snipe
8384786e8b Merge pull request #13695 from marcusmoore/bug/sc-23795-to-master
Log non-compliant barcode error as debug message
2023-10-02 22:22:26 +01:00
Marcus Moore
a5fd218c23 Log non-compliant barcode error as debug message 2023-10-02 14:19:52 -07:00
snipe
d2435c6f86 Merge remote-tracking branch 'origin/develop' 2023-10-02 22:14:08 +01:00
snipe
1abcc8b802 Merge pull request #13694 from marcusmoore/bug/sc-23795
Logs non-compliant barcode error as debug message
2023-10-02 22:13:19 +01:00
Marcus Moore
724c054838 Log non-compliant barcode error as debug message 2023-10-02 12:06:24 -07:00
Godfrey M
1e8f90bcf0 gives proper margin-top to sidebar menu on bigger resolutions 2023-10-02 11:46:08 -07:00
snipe
129e9b90dc Merge pull request #13585 from spencerrlongg/eol_2
Standardize Asset EOL Date
2023-10-02 16:09:22 +01:00
snipe
4e6764428e Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
2023-10-02 14:29:59 +01:00
snipe
c7b8880d69 Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2023-10-02 14:28:59 +01:00
snipe
228f21ed91 Merge pull request #13690 from snipe/localization/all
Updated language strings
2023-10-02 14:24:52 +01:00
snipe
b7c390a257 Updated language strings
Signed-off-by: snipe <snipe@snipe.net>
2023-10-02 14:23:22 +01:00
snipe
c45ede2d17 Merge remote-tracking branch 'origin/develop' 2023-09-29 19:00:27 +01:00
snipe
758d808772 Merge pull request #13683 from snipe/bug/sc-17602
Fixed consumable user view route name
2023-09-29 15:17:23 +01:00
snipe
754ec7563a Fixed consumable user view route name
Signed-off-by: snipe <snipe@snipe.net>
2023-09-29 15:15:03 +01:00
snipe
352e53a036 Merge remote-tracking branch 'origin/develop' 2023-09-29 01:51:40 +01:00
snipe
0184d25a95 Merge pull request #13681 from marcusmoore/bug/sc-23778
Fixed uncaught type error when attempting to render barcodes with invalid characters
2023-09-29 01:50:07 +01:00
Marcus Moore
bed1055c4e Catch TypeError when rendering 1d barcode 2023-09-28 17:32:16 -07:00
Marcus Moore
41eccaeae0 Set dummy asset tag to value that is valid for EAN13 2023-09-28 17:31:45 -07:00
Marcus Moore
eb2edb7475 Add more default values for label preview 2023-09-28 13:40:51 -07:00
Marcus Moore
ed77e8768c Re-order options 2023-09-28 12:33:27 -07:00
Marcus Moore
3aa256ec02 Ensure non-checked out items can be displayed 2023-09-28 12:33:20 -07:00
snipe
c1f545a523 Merge pull request #13679 from Godmartinz/bug/sc-23688
Fixed General Webhooks error messaging and validation
2023-09-28 20:24:09 +01:00
Godfrey M
8792d654b6 added translations for messages 2023-09-28 12:15:17 -07:00
Godfrey M
f8730adb11 removed unnecessary changes 2023-09-28 11:41:43 -07:00
Marcus Moore
36638feac4 Add assigned to as option 2023-09-28 11:37:02 -07:00
Marcus Moore
4675f02349 Format assigned to field 2023-09-28 11:35:20 -07:00
Godfrey M
c21586dee5 adds better error messaging 2023-09-28 11:29:46 -07:00
snipe
581e56198c Merge remote-tracking branch 'origin/develop' 2023-09-28 19:24:48 +01:00
snipe
f16e81e0e8 Merge pull request #13678 from spencerrlongg/bug/sc-23596
Fieldset Properly Sortable in Asset Models Table
2023-09-28 19:24:04 +01:00
snipe
3de656f5c6 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/js/build/app.js
#	public/js/dist/all.js
#	public/mix-manifest.json
2023-09-28 19:20:27 +01:00
snipe
3b4004ac18 Merge pull request #13677 from snipe/feature/sc-14880
Set modal focus to modal-name field
2023-09-28 19:18:16 +01:00
snipe
0bf423cda9 Set modal focus to modal-name field
Signed-off-by: snipe <snipe@snipe.net>
2023-09-28 19:16:40 +01:00
spencerrlongg
a54fab5c33 add fieldset to allowed_columns 2023-09-28 13:02:12 -05:00
snipe
96c6c93197 Merge pull request #13674 from snipe/bug/sc-23774
Fixed bug where license checkout/checkin notes were not being saved
2023-09-28 18:37:47 +01:00
spencerrlongg
4d67c72eea scope and switch case in api 2023-09-28 12:26:23 -05:00
snipe
6fa0d42bc2 Fixed bug where license checkout/checkin notes were not being saved
Signed-off-by: snipe <snipe@snipe.net>
2023-09-28 15:40:18 +01:00
snipe
cfe6b07b3a Updated prod assets
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/css/dist/all.css
#	public/css/dist/bootstrap-table.css
#	public/js/build/vendor.js
#	public/js/dist/all.js
#	public/mix-manifest.json
2023-09-28 15:15:50 +01:00
snipe
7512400b56 Merge pull request #13672 from snipe/feature/sc-23772
Fixed #13662 - added clipboard.js
2023-09-28 15:13:42 +01:00
snipe
1acb14a39f Moved dragtable css
Signed-off-by: snipe <snipe@snipe.net>
2023-09-28 15:12:44 +01:00
snipe
bb7a41628a Fixed #13662 - added clipboard.js
Signed-off-by: snipe <snipe@snipe.net>
2023-09-28 15:06:55 +01:00
snipe
68c9fac971 Merge remote-tracking branch 'origin/develop' 2023-09-28 14:25:31 +01:00
snipe
402ff58628 Merge pull request #13671 from snipe/bug/sc-23773
Fixed #13670 - order number missing from license import
2023-09-28 14:24:49 +01:00
snipe
492fb15036 Fixed #13670 - order number missing from license import
Signed-off-by: snipe <snipe@snipe.net>
2023-09-28 14:24:07 +01:00
snipe
ac7f85fea9 Merge remote-tracking branch 'origin/develop' 2023-09-28 03:32:57 +01:00
snipe
cc4cb14e9d Merge pull request #13667 from snipe/bug/sc-23771
Fixed #13658 for asset history with encrypted fields
2023-09-28 03:29:06 +01:00
snipe
ee72c92d4f Fix for asset history with enfrypted fields
Signed-off-by: snipe <snipe@snipe.net>
2023-09-28 03:00:49 +01:00
Marcus Moore
a47e36c1e5 Add custom fields as options 2023-09-27 16:51:53 -07:00
Marcus Moore
a4a25ab9d0 Remove a couple fields 2023-09-27 16:35:44 -07:00
Marcus Moore
518ae28a37 Improve option display values 2023-09-27 16:20:26 -07:00
Marcus Moore
74a891afbb WIP: Render select box for field options in label engine 2023-09-27 15:58:01 -07:00
snipe
3aeea007b2 Merge remote-tracking branch 'origin/develop' 2023-09-26 15:26:21 +01:00
snipe
048ad57418 Merge pull request #13657 from snipe/fixes/revert_column_sorting_temp
Commented out sortable columns
2023-09-26 15:25:58 +01:00
snipe
7bcb28d8fd Commented out sortable columns
Signed-off-by: snipe <snipe@snipe.net>
2023-09-26 15:24:20 +01:00
snipe
660abeca9e Merge pull request #13638 from marcusmoore/bug/sc-20704
Fixed exception being thrown when selected import was deleted
2023-09-26 15:00:35 +01:00
snipe
0c31d5749c Merge remote-tracking branch 'origin/develop' 2023-09-26 14:47:25 +01:00
snipe
1509339b68 Merge pull request #13655 from snipe/bug/sc-23759
Fixed bug where checkout to location would throw an error if FMCS was enabled
2023-09-26 14:37:36 +01:00
snipe
81ae32d3f9 Fixed typo
Signed-off-by: snipe <snipe@snipe.net>
2023-09-26 14:33:51 +01:00
snipe
279e6c7e4f Check for null company ID
Signed-off-by: snipe <snipe@snipe.net>
2023-09-26 14:33:42 +01:00
snipe
16498fdcf8 Merge remote-tracking branch 'origin/develop' 2023-09-25 13:46:33 +01:00
snipe
81a982fd77 Merge pull request #13650 from snipe/features/more_info_in_settings
Features/more info in settings
2023-09-25 13:46:00 +01:00
snipe
619712b927 Fixed table
Signed-off-by: snipe <snipe@snipe.net>
2023-09-25 13:45:46 +01:00
snipe
359cd2a267 A few more config options
Signed-off-by: snipe <snipe@snipe.net>
2023-09-25 13:28:13 +01:00
snipe
13bee63fe9 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
2023-09-25 10:59:09 +01:00
snipe
f6317695f9 Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2023-09-25 10:58:14 +01:00
snipe
e4696138ba Merge pull request #13647 from snipe/localization/new_translations
Localization/new translations
2023-09-25 10:57:02 +01:00
snipe
bd0863d9c7 Added new translations
Signed-off-by: snipe <snipe@snipe.net>
2023-09-25 10:54:46 +01:00
snipe
28cd0085b7 Added Khmer as an available language
Signed-off-by: snipe <snipe@snipe.net>
2023-09-25 10:54:32 +01:00
snipe
456d55c3bd Added some mail settings to /settings for easier reference
Signed-off-by: snipe <snipe@snipe.net>
2023-09-21 16:14:47 +01:00
Marcus Moore
5a88a64ebd Remove unnecessary redirect 2023-09-20 17:35:34 -07:00
Marcus Moore
b1199100a0 Display error message if import file deleted before it can be selected 2023-09-20 17:22:12 -07:00
Godfrey M
b7901ae2d8 dont allow redirects, messaging applied, general webhook validation applied 2023-09-20 12:54:34 -07:00
spencerrlongg
4660a2e5b7 rm more duplicate 2023-09-20 14:37:32 -05:00
spencerrlongg
a9123754f5 remove unnecessary code 2023-09-20 14:34:42 -05:00
spencerrlongg
cbef531811 parse purchase date even though it's cast 2023-09-20 14:26:49 -05:00
spencerrlongg
7dab59c98d fix for no eol, fix for optional in view 2023-09-20 14:17:30 -05:00
spencerrlongg
c48a47936c add validation back in 2023-09-20 14:00:59 -05:00
snipe
7c908fecd9 Merge pull request #12992 from spencerrlongg/features/12853
Adds tag for docker builds
2023-09-20 19:36:22 +01:00
snipe
cdd0de15b5 Merge pull request #13634 from marcusmoore/chore/add-factories-to-autolabeler
Added factories to autolabeler action
2023-09-20 17:51:34 +01:00
snipe
46981da400 Merge pull request #13635 from marcusmoore/bug/sc-23715
Added unique() to some factory properties
2023-09-20 17:51:22 +01:00
Godfrey M
66abf8d5c0 redoing logic 2023-09-19 17:46:29 -07:00
spencerrlongg
2ace24b176 csv header 2023-09-19 19:38:59 -05:00
spencerrlongg
d65d1930e4 asset models 2023-09-19 19:24:53 -05:00
Marcus Moore
90e75a3e2c Add unique() to some factory properties 2023-09-19 17:02:18 -07:00
spencerrlongg
2d59517c35 rm !empty 2023-09-19 18:40:23 -05:00
spencerrlongg
3cb906a05f pushing to switch branches and test 2023-09-19 18:23:06 -05:00
Marcus Moore
cd538a4ad8 Add factories to autolabeler action 2023-09-19 16:07:26 -07:00
spencerrlongg
6b4f8f1813 rm duplicate fillable 2023-09-19 18:07:15 -05:00
spencerrlongg
929e107a20 rm byod from casts 2023-09-19 18:04:16 -05:00
snipe
5a5b07f5a5 Merge remote-tracking branch 'origin/develop' 2023-09-19 10:22:59 +01:00
snipe
439c2e095d Merge pull request #13629 from snipe/bug/sc-23745
Fixed #13628 - removed duplicate favicon tag
2023-09-19 10:22:36 +01:00
snipe
14c0517927 Fixed #13628 - removed duplicate favicon tag
Signed-off-by: snipe <snipe@snipe.net>
2023-09-19 10:21:38 +01:00
snipe
d84d26febf Merge remote-tracking branch 'origin/develop' 2023-09-18 22:31:41 +01:00
snipe
753a5f789e Merge pull request #13623 from snipe/fixes/dependabot_target
Made develop the target branch for dependabot
2023-09-18 22:31:11 +01:00
snipe
d7790cd16b Updated assets
Signed-off-by: snipe <snipe@snipe.net>
2023-09-18 22:24:15 +01:00
snipe
8ecc0651ed Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/css/dist/all.css
#	public/css/dist/bootstrap-table.css
#	public/js/dist/bootstrap-table.js
#	public/mix-manifest.json
2023-09-18 22:23:58 +01:00
snipe
a8b2089275 Merge pull request #13627 from snipe/fixes/dependabot_13616
Replaces #13616 - Bump docker/metadata-action from 4 to 5
2023-09-18 22:20:06 +01:00
snipe
a46a11d554 Replaces #13616 - Bump docker/metadata-action from 4 to 5
Signed-off-by: snipe <snipe@snipe.net>
2023-09-18 22:19:31 +01:00
snipe
d444b620c5 Merge pull request #13626 from snipe/fixes/dependabot_13617
Replaces #13617 - Bump docker/setup-buildx-action from 2 to 3
2023-09-18 22:18:04 +01:00
snipe
10dcd8166b Replaces #13617 - Bump docker/setup-buildx-action from 2 to 3
Signed-off-by: snipe <snipe@snipe.net>
2023-09-18 22:17:24 +01:00
snipe
00df449e0b Merge pull request #13625 from snipe/fixes/dependabot_13618
Replaces #13618 - Bump docker/build-push-action from 4 to 5
2023-09-18 22:16:08 +01:00
snipe
0cb4427a19 Bump docker/build-push-action from 4 to 5
Signed-off-by: snipe <snipe@snipe.net>
2023-09-18 22:15:18 +01:00
snipe
17fe915d2f Merge pull request #13624 from snipe/fixes/dependabot_13619
Bump docker/login-action from 2 to 3 (#13619)
2023-09-18 22:14:01 +01:00
snipe
9ad73ed09a Bump docker/login-action from 2 to 3 (#13619)
Signed-off-by: snipe <snipe@snipe.net>
2023-09-18 22:13:09 +01:00
snipe
68fa6d57ca Merge pull request #13613 from snipe/features/reorder_columns
Added column re-ordering
2023-09-18 22:10:09 +01:00
snipe
f14e3422b4 Made develop the target branch
Signed-off-by: snipe <snipe@snipe.net>
2023-09-18 22:09:43 +01:00
snipe
2a638e66f0 Added column re-ordering
Signed-off-by: snipe <snipe@snipe.net>
2023-09-15 21:53:34 +01:00
snipe
8bdecb1da9 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/js/build/app.js
#	public/js/dist/all.js
#	public/js/dist/bootstrap-table.js
#	public/mix-manifest.json
2023-09-15 20:32:05 +01:00
snipe
52f9c786be Merge pull request #13612 from snipe/fixes/re_add_sticky_header
Fixed regression that disabled sticky headers
2023-09-15 20:29:24 +01:00
snipe
3ba8b60f54 Fixed regression that disabled sticky headers
Signed-off-by: snipe <snipe@snipe.net>
2023-09-15 20:28:28 +01:00
snipe
341f711385 Merge remote-tracking branch 'origin/develop' 2023-09-15 15:43:48 +01:00
snipe
eb406547c4 Merge pull request #13610 from snipe/fixes/disallow_sorting_on_age
Fixes #13609 - disallow sorting on age
2023-09-15 15:26:55 +01:00
snipe
0b562d2f55 Fixes #13609 - disallow sorting on age
Signed-off-by: snipe <snipe@snipe.net>
2023-09-15 15:25:52 +01:00
snipe
131ccaa5b9 Merge pull request #12869 from Godmartinz/bug/sc-23134
Fixed footer sizing issue
2023-09-15 14:31:07 +01:00
snipe
9bd357e2d4 Merge remote-tracking branch 'origin/develop' 2023-09-15 12:52:59 +01:00
snipe
054d8763fb Merge pull request #13608 from snipe/bug/sc-15287
Use relative path in backups for cleaner directory structure
2023-09-15 12:51:49 +01:00
snipe
52a77f4c31 Use relative path in backups for cleaner directory structure
Signed-off-by: snipe <snipe@snipe.net>
2023-09-15 12:50:00 +01:00
snipe
cce90c6ce0 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
2023-09-15 09:43:25 +01:00
snipe
4e0e1a2c85 Bumped hash
Signed-off-by: snipe <snipe@snipe.net>
2023-09-15 09:42:27 +01:00
snipe
8a8afef81b Merge pull request #13606 from snipe/feature/sc-23705
Fixed #13592 - unable to delete model from view page
2023-09-15 01:11:49 +01:00
snipe
860e7791ff Fixed #13592 - unable to delete model from view page
Signed-off-by: snipe <snipe@snipe.net>
2023-09-14 23:35:44 +01:00
snipe
20da6cccbc Merge remote-tracking branch 'origin/develop' 2023-09-14 22:57:04 +01:00
snipe
a013ddf541 Merge pull request #13605 from snipe/bug/sc-23183
Simplify upload messaging, handle -1% error
2023-09-14 22:52:31 +01:00
spencerrlongg
1cfd7673e0 change Importer.php back 2023-09-14 16:11:24 -05:00
snipe
bbe7d9dde2 Removed stray space
Signed-off-by: snipe <snipe@snipe.net>
2023-09-14 22:08:53 +01:00
snipe
932c02cc54 Typo
Signed-off-by: snipe <snipe@snipe.net>
2023-09-14 22:08:30 +01:00
snipe
84b0ff76ed Revert large warning size
Signed-off-by: snipe <snipe@snipe.net>
2023-09-14 22:06:19 +01:00
snipe
273740b8f5 Fixed import error warning
Signed-off-by: snipe <snipe@snipe.net>
2023-09-14 22:04:23 +01:00
spencerrlongg
afe9d43139 chunk by id? 2023-09-14 16:00:35 -05:00
snipe
34c3174531 Merge pull request #13604 from marcusmoore/feature/sc-23714
Removed ChipperCI integration
2023-09-14 21:48:49 +01:00
spencerrlongg
aac627592b move logic inside of try 2023-09-14 15:43:00 -05:00
spencerrlongg
f35f9f922e safety & catch & log 2023-09-14 15:32:17 -05:00
snipe
8f4ca9da57 Simplify upload messaging
Signed-off-by: snipe <snipe@snipe.net>
2023-09-14 21:20:21 +01:00
Marcus Moore
b113411891 Remove ChipperCI 2023-09-14 13:00:38 -07:00
spencerrlongg
44441ec703 up chunk size 2023-09-14 14:25:02 -05:00
snipe
15c71439b6 Merge pull request #13602 from snipe/bug/sc-23685
Fixed checkbox formatting on quickstart
2023-09-14 18:48:50 +01:00
snipe
8e41fb7b36 Removed stray text
Signed-off-by: snipe <snipe@snipe.net>
2023-09-14 18:48:20 +01:00
snipe
d0c4910a51 Fixed checkbox formatting on quickstart
Signed-off-by: snipe <snipe@snipe.net>
2023-09-14 18:44:02 +01:00
snipe
467609e561 Merge remote-tracking branch 'origin/develop' 2023-09-14 14:32:06 +01:00
snipe
2166d6649d Merge pull request #13343 from snipe/fixes/re-scramble_password_if_ldap_pw_sync_not_enabled
Fixed #13336 - Save unhashed password if no password provided
2023-09-14 14:15:53 +01:00
snipe
dcae5503c8 Use $attributes array
Signed-off-by: snipe <snipe@snipe.net>
2023-09-14 13:52:57 +01:00
snipe
d916e20c10 Merge pull request #13415 from marcusmoore/feature/department-scoping
Added `CompanyableTrait` to `Department` model
2023-09-14 12:52:53 +01:00
snipe
b92327eb40 Merge pull request #13520 from inietov/fixes/licenses_reassignable_feature
Fixed Not reassignable Licenses shouldn't show 'Checkin All Seats' button [sc-23506]
2023-09-14 12:52:13 +01:00
snipe
c7b24821b3 Merge pull request #13549 from inietov/fixes/attempt_to_read_property_id_on_null
Fixed ErrorException: Attempt to read property "id" on null (rollbar #3541)
2023-09-14 12:50:54 +01:00
snipe
a37df8ce9d Merge pull request #13581 from snipe/updates/upgrade_checkout_actions
Upgraded actions/checkout to v4 (via #13580)
2023-09-14 12:40:34 +01:00
snipe
104219ed76 Merge pull request #13597 from marcusmoore/bug/sc-23681
Reset checkout to value when navigating away from type
2023-09-14 12:39:04 +01:00
snipe
56c7da7b06 Merge pull request #13595 from Godmartinz/correct-nullable_on_asset_model_min_qty
Fixed nullability on asset model `min qty` column
2023-09-14 08:52:33 +01:00
spencerrlongg
7c9a4ac161 immutable 2023-09-13 18:15:13 -05:00
spencerrlongg
64a9859efd cleanup 2023-09-13 17:58:33 -05:00
spencerrlongg
ef64843d2f chunk migration, needs to be tested 2023-09-13 17:41:45 -05:00
Ivan Nieto Vivanco
439e031911 Evaluate if the event properties exists before run the CheckoutAcceptance query 2023-09-13 16:35:10 -06:00
spencerrlongg
0368b9df43 viola 2023-09-13 17:16:17 -05:00
Marcus Moore
74c7f106ce Reset assigned_x values when changing check out to type 2023-09-13 13:43:35 -07:00
Godfrey M
f283a5f755 changed the down method change 2023-09-13 13:24:26 -07:00
spencerrlongg
951521dc81 push 2023-09-13 15:20:55 -05:00
Godfrey M
0c504fed49 fixed nullability of on Asset Models 2023-09-13 13:13:41 -07:00
Marcus Moore
11208ee064 Guard against attempting to send notification to model that isn't notifiable 2023-09-13 12:56:27 -07:00
spencerrlongg
70a251de55 fix up gui edit 2023-09-13 13:51:14 -05:00
spencerrlongg
e21a8b6717 fix up this file 2023-09-12 18:11:36 -05:00
spencerrlongg
7047869367 cleanup 2023-09-12 18:03:13 -05:00
spencerrlongg
53d4fd1d0b purchase_date 2023-09-12 18:01:33 -05:00
Brady Wetherington
c77f5eee8c Merge branch 'develop' into snipeit_v7_laravel10 2023-09-12 12:04:42 +01:00
snipe
f6a11ac0ed Merge pull request #13586 from inietov/fixes/call_to_member_function_checkedOutToUser
Fixed Call to a member function checkedOutToUser() on null [rollbar-3598]
2023-09-12 08:35:30 +01:00
Ivan Nieto Vivanco
9cbd2d032c Add a boolean variable and condition to handle the call to checkedOutToUser() method 2023-09-11 17:40:59 -06:00
spencerrlongg
ccf3fe40ec rm additional row 2023-09-11 17:35:13 -05:00
spencerrlongg
3a63bcab73 temporarily show on its own line 2023-09-11 17:35:13 -05:00
spencerrlongg
30dade1fba cleanup 2023-09-11 17:35:12 -05:00
spencerrlongg
97d6a34b8c some changes to sample csv 2023-09-11 17:34:05 -05:00
spencerrlongg
431af5f530 this works!!!! 2023-09-11 17:34:05 -05:00
spencerrlongg
3e3bb594ea some import stuff 2023-09-11 17:34:04 -05:00
spencerrlongg
fb001caee4 fix conflicts 2023-09-11 17:33:31 -05:00
spencerrlongg
b73f20cadf immutable when things are looping, just in case 2023-09-11 17:22:46 -05:00
spencerrlongg
3fb62874f0 quick push to check something else 2023-09-11 17:22:46 -05:00
spencerrlongg
c66804bcee a little cleanup 2023-09-11 17:22:46 -05:00
spencerrlongg
e1af69f6ae typo 2023-09-11 17:22:46 -05:00
slong753
27bea2abb9 just some more wip on the importer 2023-09-11 17:21:51 -05:00
slong753
1b18cd7fe6 added asset_eol_date and explicit to factory 2023-09-11 17:21:51 -05:00
slong753
78c400e948 fix conflicts 2023-09-11 17:21:50 -05:00
slong753
75d7e3e1a0 fix conflicts 2023-09-11 17:20:21 -05:00
slong753
5948679a4a fix purchase date update 2023-09-11 17:17:59 -05:00
slong753
774f21bb7f some more cleanup 2023-09-11 17:17:59 -05:00
slong753
20367eecc9 fix conflicts 2023-09-11 17:17:59 -05:00
slong753
cda9dd57dd asset update logic 2023-09-11 17:15:25 -05:00
slong753
41b65bd9a2 small changes 2023-09-11 17:15:25 -05:00
slong753
17a83129b9 this all needs to be tested tediously 2023-09-11 17:15:25 -05:00
slong753
0e60184e95 i think this migration makes sense 2023-09-11 17:15:25 -05:00
slong753
1ea0de8bca prevent injection, fix asset update 2023-09-11 17:15:25 -05:00
slong753
17ccfa9ada resolve some conflicts 2023-09-11 17:15:24 -05:00
slong753
c1daabef08 progress 2023-09-11 17:10:41 -05:00
slong753
dc39d2c567 notes 2023-09-11 17:10:41 -05:00
slong753
321e7c93ec carbon thing 2023-09-11 16:51:40 -05:00
slong753
8456b3ec0c wip stuff 2023-09-11 16:51:40 -05:00
Godfrey M
e73b16846e adds an option to bulk edit actual location for bulk edit and fixes update issue 2023-09-11 11:21:56 -07:00
snipe
a49d3fe131 Merge pull request #13526 from Godmartinz/asset-model-notifs
Added threshold notifications and min qty for Asset models
2023-09-11 17:55:34 +01:00
Godfrey Martinez
a26b96185b Merge branch 'develop' into asset-model-notifs 2023-09-11 09:37:22 -07:00
Godfrey M
0eb50ceb3d removes commented code 2023-09-11 09:36:38 -07:00
snipe
c2fe9d490b Upgraded actions/checkout to v4 (via #13580)
Signed-off-by: snipe <snipe@snipe.net>
2023-09-11 13:25:44 +01:00
snipe
dc74fb133f Merge pull request #13577 from marcusmoore/fixes/improve-testcase
Fixed failing test
2023-09-08 07:08:21 +01:00
Marcus Moore
093bf57448 Update assertion and add failure messages 2023-09-07 16:42:49 -07:00
snipe
9c608dd6ff Merge remote-tracking branch 'origin/develop' 2023-09-07 21:36:39 +01:00
snipe
06836663c8 Merge pull request #13575 from marcusmoore/fixes/improve-api-messaging
Added validation around department_id in API patch request
2023-09-07 21:36:20 +01:00
Marcus Moore
c6c1c64c1e Remove todo 2023-09-07 13:30:05 -07:00
Marcus Moore
4caa501996 Relax property type check 2023-09-07 13:28:32 -07:00
Marcus Moore
a7a70f6981 Test permissions update 2023-09-07 13:21:27 -07:00
Marcus Moore
39ff575ac1 Remove unused test cases 2023-09-07 13:16:08 -07:00
snipe
5b88089ffc Merge remote-tracking branch 'origin/develop' 2023-09-07 20:50:35 +01:00
snipe
02c187b0a0 Merge pull request #13566 from snipe/features/13562_add_inline_file_link
Fixed #13562 - Added inline file link
2023-09-07 20:50:13 +01:00
snipe
7f892bf5ef Merge pull request #13574 from inietov/fixes/unaccepted_assets_report_incorrect
Fixed Unaccepted Assets report has incorrect people [freshdesk-37808]
2023-09-07 20:49:40 +01:00
Marcus Moore
56e6205667 Formatting 2023-09-07 12:45:03 -07:00
Ivan Nieto Vivanco
abd2ed3b81 Filter unaccepted assets that are not assigned to users 2023-09-07 13:39:16 -06:00
Marcus Moore
899c2eb19b Implement test case 2023-09-07 12:34:50 -07:00
snipe
cf36c31eac Merge remote-tracking branch 'origin/develop' 2023-09-07 20:22:33 +01:00
snipe
894c34ff4f Update to only use relative paths
Signed-off-by: snipe <snipe@snipe.net>
2023-09-07 20:22:14 +01:00
Brady Wetherington
aacfed40f8 Switch back to our fork of laravel-scim-server 2023-09-07 20:16:03 +01:00
Brady Wetherington
ec1059e74c Merge branch 'develop' into snipeit_v7_laravel10 2023-09-07 20:11:41 +01:00
snipe
b7c2b9374c Merge pull request #13573 from snipe/upgrade_scim_server
Upgrade to new branch for our fork of laravel-scim-server
2023-09-07 20:07:59 +01:00
Brady Wetherington
3184f795c2 Upgrade to new branch for our fork of laravel-scim-server 2023-09-07 18:29:23 +01:00
snipe
67cad9c751 Merge pull request #13571 from inietov/fixes/require_acceptance_on_null
Fixed Attempt to read property require_acceptance on null [rollbar-3557]
2023-09-07 18:11:42 +01:00
snipe
ec5238ff06 Merge pull request #13548 from marcusmoore/update-testing-documentation
Updated testing documentation
2023-09-07 11:25:53 +01:00
Marcus Moore
1c3c36f2a0 Begin to implement patch test 2023-09-06 16:14:14 -07:00
Ivan Nieto Vivanco
1509c512a5 Add guard clauses around some License and LicenseSeat models functions 2023-09-06 11:54:11 -06:00
snipe
2a94fd17ee Merge remote-tracking branch 'origin/develop' 2023-09-06 09:37:35 +01:00
snipe
e920199626 Merge pull request #13567 from johnson-yi/fixes/add_default_location_to_checkin_actionlog
Add default location to tracked changes on checkin actionlog
2023-09-06 09:37:04 +01:00
johnson-yi
5897f4d6d9 Add rtd_location_id to tracked changes on checkin actionlog 2023-09-06 00:36:48 +00:00
snipe
a67888f3d3 Merge pull request #13547 from inietov/fixes/Attempt_to_read_property_asset_tag
Fixed ErrorException: Attempt to read property "asset_tag" on null (rollbar #3541)
2023-09-05 20:26:21 +01:00
Ivan Nieto Vivanco
91b1cc7121 Move the early return to the controller instead of the Label model 2023-09-05 13:23:51 -06:00
snipe
d6dd332b09 Merge pull request #13557 from johnson-yi/fixes/add_changes_to_checkinout_actionlog
Added/Fixed: track changes on asset checkin/out
2023-09-05 19:08:49 +01:00
snipe
65a76c599c Added inline=true to image preview modal
Signed-off-by: snipe <snipe@snipe.net>
2023-09-05 18:35:07 +01:00
snipe
f53db8ba75 Fixed #13562 - allow inline view for uploaded files
Signed-off-by: snipe <snipe@snipe.net>
2023-09-05 18:28:01 +01:00
snipe
32407b531b Merge remote-tracking branch 'origin/develop' 2023-09-05 16:10:30 +01:00
snipe
e486fe2794 Removed soft-delete query
Signed-off-by: snipe <snipe@snipe.net>
2023-09-05 16:10:20 +01:00
snipe
521fcd45b0 Merge remote-tracking branch 'origin/develop' 2023-09-05 16:08:17 +01:00
snipe
26452a8a29 Merge pull request #13565 from snipe/fixes/asset_history_500_on_hard_deleted_models
Account for hard-deleted models, suppliers
2023-09-05 16:06:40 +01:00
snipe
f85df6bb8c Use same method of accessing companies as others
Signed-off-by: snipe <snipe@snipe.net>
2023-09-05 16:02:28 +01:00
snipe
2acf2b880e Account for hard-deleted models, suppliers
Signed-off-by: snipe <snipe@snipe.net>
2023-09-05 15:58:21 +01:00
snipe
b17af38d8e Merge pull request #12901 from Godmartinz/user_total_cost
Added users total cost of assets to user profile
2023-09-05 13:52:34 +01:00
snipe
a62e2f092b Merge pull request #13498 from marcusmoore/feature/add-checkin-date-range-filter-to-custom-asset-report
Added last check in column and filter to custom asset report
2023-09-05 13:22:15 +01:00
Johnson Yi
09f7b3debe Track changes on asset checkin/out 2023-09-01 13:12:07 +10:00
Marcus Moore
da7d6f6f77 Merge branch 'develop' into update-testing-documentation 2023-08-31 10:36:06 -07:00
snipe
faa865fd48 Merge remote-tracking branch 'origin/develop' 2023-08-31 18:24:29 +01:00
snipe
f08cef8664 Merge pull request #13556 from snipe/feature/sc-23684
Added model name and number to dynamic url
2023-08-31 18:23:33 +01:00
snipe
e192cbbbe1 Merge pull request #13550 from marcusmoore/remove-dusk
Removed Dusk
2023-08-31 18:06:04 +01:00
snipe
83b178f5b2 Added model name and number to dynamic url
Signed-off-by: snipe <snipe@snipe.net>
2023-08-31 18:03:32 +01:00
Brady Wetherington
3500217f94 Merge branch 'develop' into snipeit_v7_laravel10 2023-08-31 13:07:06 +01:00
snipe
2a1aa53ba6 Merge remote-tracking branch 'origin/develop' 2023-08-31 13:04:56 +01:00
snipe
c51574099f Merge pull request #13507 from Godmartinz/ignore_encrypt_and_other_changes
Added eager loading for `changedinfo` and removed encrypted values from Asset history
2023-08-31 13:04:39 +01:00
snipe
821c3085f0 Merge remote-tracking branch 'origin/develop' 2023-08-31 12:01:58 +01:00
snipe
9a0f691f05 Merge pull request #13546 from snipe/fixes/make_boolean_user_fields_more_consistant
Don’t cast as boolean, do validate as boolean for User validation
2023-08-31 12:01:20 +01:00
Marcus Moore
a799659610 Scaffold tests and add context 2023-08-30 17:33:23 -07:00
Marcus Moore
999605f832 Add failing test 2023-08-30 17:10:50 -07:00
Marcus Moore
5828d29952 Remove Dusk 2023-08-30 16:43:18 -07:00
Marcus Moore
417b2c8331 Update testing documentation 2023-08-30 11:27:26 -07:00
snipe
663faffcc1 Un-cast byod, validate as boolean
Signed-off-by: snipe <snipe@snipe.net>
2023-08-30 19:13:55 +01:00
snipe
fb455be406 Added tests
Signed-off-by: snipe <snipe@snipe.net>
2023-08-30 19:13:38 +01:00
Ivan Nieto Vivanco
3cf9c1fea5 Adds a null coalescing operator to the license seat checkin notification 2023-08-30 11:57:29 -06:00
Ivan Nieto Vivanco
085a993340 Early return if no asset is found 2023-08-30 11:05:58 -06:00
Marcus Moore
07c3fe1fce Update assertions to account for type change 2023-08-30 09:42:53 -07:00
snipe
2a93c38830 Don’t cast as boolean, validate as boolean
Signed-off-by: snipe <snipe@snipe.net>
2023-08-30 16:40:28 +01:00
snipe
587a787b5d Fixed bug introduced in #13528
Signed-off-by: snipe <snipe@snipe.net>
2023-08-30 15:50:28 +01:00
snipe
305804f260 Updated assets
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
#	package-lock.json
#	public/css/dist/all.css
#	public/js/dist/all-defer.js
#	public/mix-manifest.json
2023-08-30 15:50:09 +01:00
snipe
c0cbdb1fc4 Fixed bug introduced in #13528
Signed-off-by: snipe <snipe@snipe.net>
2023-08-30 15:48:35 +01:00
snipe
5cf8c36698 Updated assets
Signed-off-by: snipe <snipe@snipe.net>
2023-08-30 15:43:06 +01:00
snipe
1bcc74f156 Upgrade @fortawesome/fontawesome-free from 6.4.0 to 6.4.2 #13527
Signed-off-by: snipe <snipe@snipe.net>
2023-08-30 15:41:11 +01:00
snipe
9ebcde4472 Upgrade less from 4.1.2 to 4.2.0 #13534
Signed-off-by: snipe <snipe@snipe.net>
2023-08-30 15:40:56 +01:00
snipe
fbc04cfd47 Bumped hash
Signed-off-by: snipe <snipe@snipe.net>
2023-08-30 15:07:38 +01:00
snipe
319cb2305d Merge remote-tracking branch 'origin/develop' 2023-08-30 15:05:46 +01:00
snipe
b109ee281a Merge pull request #13544 from marcusmoore/bug/sc-23675
Fixed user search not adhering to company scoping
2023-08-30 08:54:41 +01:00
Marcus Moore
806ab2cb9d Ensure users are scoped by company in index method 2023-08-29 16:17:29 -07:00
Marcus Moore
aafa1ab70e Add failing test 2023-08-29 16:15:13 -07:00
snipe
22d136df46 Merge pull request #13528 from inietov/fixes/cloning_model_blanks_fieldset
Fixed #12548 Cloning a model blanks fieldset of new one
2023-08-29 19:14:38 +01:00
Godfrey Martinez
0ac5d4d582 Merge pull request #8 from Godmartinz/fix-companyable
Fix companyable
2023-08-28 19:38:27 -07:00
Godfrey Martinez
d86c63cf23 Merge branch 'ignore_encrypt_and_other_changes' into fix-companyable 2023-08-28 19:38:16 -07:00
Godfrey M
74f45a4473 reworks company queries for asset history 2023-08-28 19:35:46 -07:00
Ivan Nieto Vivanco
4e4ba38038 Pass the model_id variable in the controller and get it only if we are cloning the asset model 2023-08-28 16:23:26 -06:00
snipe
18ff810d7e Reverse orderof parent
Signed-off-by: snipe <snipe@snipe.net>
2023-08-28 20:51:52 +01:00
snipe
baffcbad71 Set password property properly
Signed-off-by: snipe <snipe@snipe.net>
2023-08-28 20:47:56 +01:00
snipe
611db4c0d2 Removed stray line
Signed-off-by: snipe <snipe@snipe.net>
2023-08-28 20:46:45 +01:00
snipe
367484a766 Merge pull request #13537 from snipe/fixes/13500_prevent_autocomplete_on_ldap_password
Fixed #13500 - Try to prevent the browser from pre-filling the LDAP password
2023-08-28 20:42:58 +01:00
snipe
0f43388a2b Merge remote-tracking branch 'origin/develop' 2023-08-28 20:40:12 +01:00
snipe
81365ef911 Merge pull request #13518 from marcusmoore/chore/tests-via-github-actions
Run tests for PHP 7.4, 8.0, and 8.1.1 via GitHub Actions
2023-08-28 20:28:42 +01:00
snipe
6020927e24 Merge pull request #13538 from snipe/fixes/13516_use_int_not_string_for_port_default
Fixed #13516 - Use int not string if no DB_PORT specified
2023-08-28 19:38:41 +01:00
snipe
82981290d4 Use int not string if no DB_PORT specified
Signed-off-by: snipe <snipe@snipe.net>
2023-08-28 19:34:08 +01:00
snipe
7787ca328c Try to prevent the browser from pre-filling the LDAP password
Signed-off-by: snipe <snipe@snipe.net>
2023-08-28 18:36:06 +01:00
Godfrey Martinez
92e88a0ae2 Merge branch 'develop' into ignore_encrypt_and_other_changes 2023-08-28 10:14:41 -07:00
Brady Wetherington
427f8b1522 Merge branch 'develop' into snipeit_v7_laravel10
Upgraded composer due to lockfile conflicts
2023-08-28 16:04:21 +01:00
snipe
b93adf44c8 Merge remote-tracking branch 'origin/develop' 2023-08-28 12:41:45 +01:00
snipe
535ca0e3c0 Merge pull request #13535 from snipe/fixes/13521_make_modal_upload_button_wider
Fixed #13521 - make modal “select files” button wider
2023-08-28 12:41:27 +01:00
snipe
582cad2dc5 Fixed #13521 - make modal “select files” button wider
Signed-off-by: snipe <snipe@snipe.net>
2023-08-28 12:37:42 +01:00
snipe
a1897298dc Merge remote-tracking branch 'origin/develop' 2023-08-27 13:56:54 +01:00
snipe
e3a9c34818 Merge pull request #13533 from snipe/improvements/labels_clearer_barcode_text
Clearer labels barcode text
2023-08-26 18:08:10 +01:00
snipe
20e9f05a64 Tighter layout
Signed-off-by: snipe <snipe@snipe.net>
2023-08-26 17:43:02 +01:00
snipe
844fe0938c Added link to the help docs
Signed-off-by: snipe <snipe@snipe.net>
2023-08-26 17:42:56 +01:00
snipe
0a47706e46 Merge remote-tracking branch 'origin/develop' 2023-08-25 15:47:47 +01:00
Ivan Nieto Vivanco
a12a68e4e9 Add a variable so I dont ended rewriting the original model 2023-08-24 15:28:12 -06:00
Ivan Nieto Vivanco
950536f59f Added a condition to send correct model id when cloning one 2023-08-24 15:18:51 -06:00
Godfrey M
e56628499c fixed lost changes 2023-08-24 11:45:23 -07:00
Godfrey M
2b7a899ef8 removed unnecessary code 2023-08-24 11:43:44 -07:00
Godfrey M
0b956b2a46 revert changes of composer.lock 2023-08-24 10:45:59 -07:00
Godfrey M
18cb514a53 revert unwanted changes 2023-08-24 10:40:44 -07:00
Godfrey M
a3b6e0fbe6 adds some spacing 2023-08-24 10:36:09 -07:00
Godfrey M
34ba0c4440 adds id to history info 2023-08-24 10:36:08 -07:00
Godfrey M
739fc152c2 Adds readable asset history in the action log transformer 2023-08-24 10:36:08 -07:00
Godfrey M
011c09a3dd working on getting notifications 2023-08-24 10:35:40 -07:00
Godfrey M
38d5691b88 fix conflicts 2023-08-24 10:35:40 -07:00
Godfrey M
c26ef224f4 fixing my mess 2023-08-24 10:31:01 -07:00
Godfrey M
8ebb9afedd adds min_amt to asset model edit, index, and table 2023-08-24 10:30:07 -07:00
snipe
26dd992d3c Merge pull request #13525 from marcusmoore/bug/sc-23660
Fixed undeclared variable in ActionlogsTransformer
2023-08-24 17:09:30 +01:00
Marcus Moore
e32c07be02 Clear commented log statements 2023-08-24 08:15:40 -07:00
Marcus Moore
5a0b0522b0 Explicitly declare $clean_meta variable 2023-08-24 08:15:07 -07:00
Marcus Moore
20457bd89e Run tests for PHP 7.4, 8.0, and 8.1.1 2023-08-23 15:53:34 -07:00
Ivan Nieto Vivanco
7bfb5a0667 Disable the Checkin All Seats button if License is not reassignable 2023-08-23 16:36:06 -06:00
Ivan Nieto Vivanco
6161a0d76d Add condition in LicenseCheckinController:bulkCheckin method to evaluate if the license is reassignable 2023-08-23 16:22:40 -06:00
Godfrey Martinez
28cf533d19 Merge branch 'develop' into ignore_encrypt_and_other_changes 2023-08-23 00:42:59 -07:00
Godfrey M
0fc79ec936 fixes conflicts 2023-08-23 00:40:59 -07:00
Godfrey M
ffe1b11419 merged develop 2023-08-23 00:38:58 -07:00
Godfrey M
27488c1009 adds soft deletes to eager loading 2023-08-23 00:34:09 -07:00
Godfrey M
ce60db009c adds soft deletes to eager loading 2023-08-23 00:32:43 -07:00
snipe
9f291d7e4b Merge remote-tracking branch 'origin/develop' 2023-08-23 08:21:53 +01:00
snipe
d393bd5c97 Merge pull request #13511 from snipe/fixes/13510_no_translations_in_migrations
Fixed #13510 - do not use translations in migrations
2023-08-23 08:21:18 +01:00
snipe
ea37325806 Remove trans() from default values
Signed-off-by: snipe <snipe@snipe.net>
2023-08-23 08:19:05 +01:00
snipe
31a7758ab1 Merge pull request #13509 from marcusmoore/bug/sc-23636
Fixed asset model query in action log transformer
2023-08-23 06:58:41 +01:00
Marcus Moore
bee680683d Add withTrashed to asset model query 2023-08-22 17:05:06 -07:00
Godfrey M
92ddf8fc67 removed dead space 2023-08-22 12:38:50 -07:00
Godfrey M
1019287c76 retarget key 2023-08-22 12:36:43 -07:00
Godfrey M
9e438c3ed0 eager loaded changedInfo queries, reworked encrypted data change log changes 2023-08-22 12:34:45 -07:00
Godfrey M
c7f2acf2c6 removes encrypted info from change log, renames asset_eol_date in the change log 2023-08-22 11:39:38 -07:00
snipe
79b330f492 Merge pull request #13400 from inietov/fixes/asset_acceptance_user_error
Fixed Asset acceptance error when user company and asset company don't match
2023-08-22 15:49:56 +01:00
snipe
3da21e73e2 Merge pull request #13501 from snipe/fixes/checkbox_layout_in_settings
Small fixes to checkbox layout in general settings blade
2023-08-22 14:12:15 +01:00
snipe
da38945a53 Small fixes to checkbox layout in general settings blade
Signed-off-by: snipe <snipe@snipe.net>
2023-08-22 14:10:39 +01:00
snipe
a48762c64d Merge pull request #13496 from snipe/features/setting_for_name_order
Fixed #13495 added setting for name order
2023-08-22 12:50:58 +01:00
snipe
23237e5cd3 Removed unused translation
Signed-off-by: snipe <snipe@snipe.net>
2023-08-22 12:50:32 +01:00
snipe
aafb7668f5 Merge pull request #13453 from inietov/fixes/accessories_declined_issue
Fixed #13317 Accessories declined by user remain assigned
2023-08-22 12:42:55 +01:00
snipe
bb61134dd5 Merge remote-tracking branch 'origin/develop' 2023-08-22 12:41:27 +01:00
snipe
fea11ec7f1 Merge pull request #12761 from spencerrlongg/bulk_edit_custom_fields
Bulk Editing Custom Fields
2023-08-22 12:40:18 +01:00
snipe
303b45c9e9 Merge pull request #13485 from Godmartinz/history_info_clean_up
Added better handling of information of asset history
2023-08-22 12:25:17 +01:00
snipe
8c7925e703 Merge pull request #13436 from marcusmoore/chore/dependency-updates
Bumped dependencies
2023-08-21 22:58:52 +01:00
Marcus Moore
191c4f959f Bump guzzlehttp/psr7 to 2.4.5 2023-08-21 14:46:08 -07:00
Marcus Moore
1e10a7ee23 Bump nyholm/psr7 to 1.6.1 2023-08-21 14:45:21 -07:00
Marcus Moore
4e8537a1c7 Merge branch 'develop' into chore/dependency-updates
# Conflicts:
#	composer.lock
2023-08-21 14:44:15 -07:00
snipe
24a9deb735 Merge remote-tracking branch 'origin/develop' 2023-08-21 22:35:45 +01:00
Marcus Moore
4e2ef4f056 Default to using the current date if last check in end date is not provided 2023-08-21 14:35:15 -07:00
snipe
79a4d915db Merge pull request #13456 from marcusmoore/fixes/auto-incrementing-on-74
Fixed passing invalid argument to `strpos()`
2023-08-21 22:25:52 +01:00
Marcus Moore
c332b98456 Add last checkin options to report front end 2023-08-21 13:44:49 -07:00
Godfrey M
b54aaefefb adds some spacing 2023-08-21 13:43:06 -07:00
Godfrey M
5076b45a0d adds id to history info 2023-08-21 13:40:39 -07:00
Marcus Moore
6fc06f2ee1 Add simple tests around asset check in 2023-08-21 12:31:51 -07:00
snipe
36a343365e Switched from fullName() to getFullNameAttribute()
Signed-off-by: snipe <snipe@snipe.net>
2023-08-21 20:14:07 +01:00
snipe
c617bf89b6 Tweak layout
Signed-off-by: snipe <snipe@snipe.net>
2023-08-21 20:13:45 +01:00
snipe
ba0643f6a4 Added name display format, tweaked some
Signed-off-by: snipe <snipe@snipe.net>
2023-08-21 20:13:28 +01:00
snipe
bfd674b622 Switched to getFullNameAttribute() from fullName() in User Presenter
Signed-off-by: snipe <snipe@snipe.net>
2023-08-21 20:12:25 +01:00
snipe
d73d15b8a2 Added form macro for name format
Signed-off-by: snipe <snipe@snipe.net>
2023-08-21 20:11:59 +01:00
snipe
8660d41aa3 Changed width of locale field
Signed-off-by: snipe <snipe@snipe.net>
2023-08-21 20:11:45 +01:00
snipe
c39579b170 New strings
Signed-off-by: snipe <snipe@snipe.net>
2023-08-21 20:11:25 +01:00
snipe
354550b52e Removed getCompleteNameAttribute(), modified getFullNameAttribute()
Signed-off-by: snipe <snipe@snipe.net>
2023-08-21 20:11:17 +01:00
snipe
f3460b5a4f Switch to getFullNameAttribute() in user transformer
Signed-off-by: snipe <snipe@snipe.net>
2023-08-21 20:10:48 +01:00
snipe
474c03e3fc Added name order to settings save controller method
Signed-off-by: snipe <snipe@snipe.net>
2023-08-21 20:10:03 +01:00
snipe
749002b768 Added migration to add name order to settings
Signed-off-by: snipe <snipe@snipe.net>
2023-08-21 20:09:48 +01:00
Marcus Moore
489d30c685 Set last_checkin in ui and api controllers 2023-08-21 11:57:33 -07:00
snipe
2346bab8ed Merge pull request #13492 from snipe/features/add_dymo_labelwriter
Added Dymo labelwriter
2023-08-18 23:27:37 +01:00
snipe
45898deb1a Don’t 500 if the 1D barcode doesn’t match the format requested - log an error instead
Signed-off-by: snipe <snipe@snipe.net>
2023-08-18 22:18:38 +01:00
snipe
ffc7c4e99a use number format to constrain large number displays
Signed-off-by: snipe <snipe@snipe.net>
2023-08-18 22:18:09 +01:00
snipe
1e82c2bfad Changed example asset name
Signed-off-by: snipe <snipe@snipe.net>
2023-08-18 22:17:54 +01:00
snipe
d12f4564e1 Added Dymo Labelwriter template
Signed-off-by: snipe <snipe@snipe.net>
2023-08-18 21:44:12 +01:00
snipe
1dcca14c37 Values are not sortable, so don’t show them as sortable
Signed-off-by: snipe <snipe@snipe.net>
2023-08-18 21:21:54 +01:00
snipe
cb3db51fe0 Merge remote-tracking branch 'origin/develop' 2023-08-18 18:42:11 +01:00
snipe
63f847f125 Merge pull request #13491 from snipe/fixes/remove_border_from_default_label
Removed the black label from around the default labels
2023-08-18 18:40:45 +01:00
snipe
d56c671410 Removed the black label from around the default labels
Signed-off-by: snipe <snipe@snipe.net>
2023-08-18 18:39:00 +01:00
snipe
8e9fa613e3 Merge remote-tracking branch 'origin/develop' 2023-08-18 18:14:40 +01:00
snipe
802651a1b4 Merge pull request #13489 from snipe/fixes/override_0_cols_rows_in_default_for_new_engine
Make sure the columns and rows can never be 0
2023-08-18 18:14:01 +01:00
snipe
0cb76a049a Make sure the columns and rows can never be 0
Signed-off-by: snipe <snipe@snipe.net>
2023-08-18 18:13:16 +01:00
snipe
384428148b Merge remote-tracking branch 'origin/develop' 2023-08-18 15:32:33 +01:00
snipe
5645141f93 Merge pull request #13488 from snipe/fixes/13487_supplier_url_in_listing
Fixed #13487 - include supplier url in listing
2023-08-18 15:32:14 +01:00
snipe
da2f22d504 Fixed #13487 - include supplier url in listing
Signed-off-by: snipe <snipe@snipe.net>
2023-08-18 15:31:15 +01:00
Marcus Moore
8b2716d2b7 Fix update statement 2023-08-17 18:33:01 -07:00
Marcus Moore
56fb45f1ea WIP: Add last_checkin to assets table 2023-08-17 18:01:26 -07:00
Godfrey M
a62876d4bc Adds readable asset history in the action log transformer 2023-08-17 16:14:01 -07:00
snipe
0ee032a10d Merge pull request #13391 from Godmartinz/ldap_sync_field_clear_bug
Fixed Ldap sync field clear bug
2023-08-17 17:45:03 +01:00
snipe
03a01c02c4 Merge pull request #13483 from inietov/fixes/default_locations_advanced_search
Fixed #13359 Advanced search by Default Location does not work
2023-08-17 15:15:21 +01:00
Ivan Nieto Vivanco
b607a59875 Add query to search default locations in advanced search 2023-08-16 15:04:17 -06:00
snipe
34f2221b02 Merge pull request #13471 from inietov/fixes/components_search
Fixed #13409 Search in component detail view not working
2023-08-16 21:59:40 +01:00
snipe
b81c6825cf Merge pull request #13476 from uberbrady/accessry_checkin_fix_develop
Accessory checkin via API reported wrong target user
2023-08-16 13:05:54 +01:00
Brady Wetherington
852e9ff311 Accessory checkin via API reported wrong target user 2023-08-16 13:03:37 +01:00
Ivan Nieto Vivanco
92df32dfaa Move a couple assignation of variables inside an else to only execute once 2023-08-15 21:10:48 -06:00
snipe
8810059427 Merge remote-tracking branch 'origin/develop' 2023-08-16 01:40:06 +01:00
snipe
eacbde37e2 Merge pull request #13473 from snipe/fixes/check_for_company_on_labels
Check that there is a company before trying to get name property
2023-08-16 01:27:48 +01:00
snipe
74384f14e4 Use clearer translation (from original PR)
Signed-off-by: snipe <snipe@snipe.net>
2023-08-16 01:25:13 +01:00
snipe
027afa71f1 Check that there is a company before trying to get name property
Signed-off-by: snipe <snipe@snipe.net>
2023-08-16 01:09:22 +01:00
Ivan Nieto Vivanco
993918f47c Add query to search into the per-component view 2023-08-15 15:31:36 -06:00
Brady Wetherington
8b52bad16f Merge branch 'develop' into snipeit_v7_laravel10 2023-08-15 21:25:16 +01:00
Ivan Nieto Vivanco
25c58a8486 Fix typo in language variable name 2023-08-15 14:17:39 -06:00
snipe
7eaf3174ab Merge pull request #13457 from snipe/fixes/remove_autocomplete_off_on_login
Fixed #13365 - Added LOGIN_AUTOCOMPLETE as env var
2023-08-15 20:55:05 +01:00
snipe
2848465dd2 Merge remote-tracking branch 'origin/develop' 2023-08-15 20:42:36 +01:00
snipe
297390ae63 Merge pull request #13470 from snipe/fixes/13464_typo_in_accessories_clone
Fixed #13464 typo in accessories clone
2023-08-15 20:41:54 +01:00
snipe
01ab360ef3 Fixed accessory clone typo
Signed-off-by: snipe <snipe@snipe.net>
2023-08-15 20:39:09 +01:00
snipe
1c2f3cd552 Fixed translation typo
Signed-off-by: snipe <snipe@snipe.net>
2023-08-15 20:39:00 +01:00
snipe
06ed8b2f2d Merge remote-tracking branch 'origin/develop' 2023-08-15 20:31:00 +01:00
snipe
bc4a47421a Merge pull request #13469 from snipe/fixes/missed_one_checkbox_in_label
Fixed checkboxes for accessibility
2023-08-15 20:30:39 +01:00
snipe
0763b5135d Fixed checkboxes
Signed-off-by: snipe <snipe@snipe.net>
2023-08-15 20:28:16 +01:00
snipe
253975ce72 Updated translation
Signed-off-by: snipe <snipe@snipe.net>
2023-08-15 20:27:55 +01:00
snipe
9af850dbaa Re-apply a change that was dropped
Signed-off-by: snipe <snipe@snipe.net>
2023-08-15 20:27:47 +01:00
snipe
96b616be89 Downgraded TCPDF
Signed-off-by: snipe <snipe@snipe.net>
2023-08-15 20:11:56 +01:00
snipe
2b9f8ce4a6 Merge pull request #13467 from snipe/fixes/more_label_html_tweaks
Fixes more label html tweaks
2023-08-15 20:05:03 +01:00
snipe
fa6c8d864e Restore label engine checkbox
Signed-off-by: snipe <snipe@snipe.net>
2023-08-15 20:04:19 +01:00
snipe
c957f136aa More label tweaks
Signed-off-by: snipe <snipe@snipe.net>
2023-08-15 20:03:40 +01:00
snipe
697dc10d76 More label tweaks
Signed-off-by: snipe <snipe@snipe.net>
2023-08-15 20:03:32 +01:00
snipe
2ddf5c9a0b Merge pull request #13463 from uberbrady/fix_api_accessory_checkin
Accessory checkin via API reported wrong target user
2023-08-15 19:24:45 +01:00
snipe
949a88e560 Merge remote-tracking branch 'origin/develop' 2023-08-15 18:55:39 +01:00
snipe
d47b502d86 Merge pull request #13466 from snipe/fixes/weird_label_engine_layout
Fixes weird label engine layout
2023-08-15 18:52:54 +01:00
snipe
6b02184e99 Fixed weird layout with checkbox
Signed-off-by: snipe <snipe@snipe.net>
2023-08-15 18:48:20 +01:00
snipe
64342838fd Return the user to the labels page on save
Signed-off-by: snipe <snipe@snipe.net>
2023-08-15 18:48:12 +01:00
snipe
28b1461cb4 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/mix-manifest.json
2023-08-15 18:21:51 +01:00
snipe
346f243bc0 Merge pull request #13465 from snipe/fixes/parse_error_in_helper
Fixed unclosed brace
2023-08-15 18:14:55 +01:00
snipe
443adc50da Fixed unclosed brace
Signed-off-by: snipe <snipe@snipe.net>
2023-08-15 18:12:25 +01:00
snipe
cebf0e0de1 Add @cram42 as a contributor 2023-08-15 18:07:56 +01:00
snipe
e41368daac Merge pull request #12050 from cram42/develop
New Label Engine
2023-08-15 17:58:57 +01:00
Godfrey M
d1efca2ae1 fixes conflicts 2023-08-15 09:28:42 -07:00
Brady Wetherington
7504c0df13 Accessory checkin via API reported wrong target user 2023-08-15 14:19:36 +01:00
snipe
1c02a7d590 Merge remote-tracking branch 'origin/develop' 2023-08-15 13:26:40 +01:00
snipe
c56f664811 Merge pull request #13442 from Robert-Azelis/Robert-Azelis-patch-add_email_to_companies
Add email to companies
2023-08-15 13:26:20 +01:00
snipe
8e0b7bee41 Merge remote-tracking branch 'origin/develop' 2023-08-15 13:23:23 +01:00
snipe
6f373aed33 Merge pull request #13461 from snipe/localization/new_translations
Updated language strings from CrowdIn
2023-08-15 13:22:14 +01:00
snipe
d1ce1b6f18 Updated language strings from CrowdIn
Signed-off-by: snipe <snipe@snipe.net>
2023-08-15 13:21:35 +01:00
Ivan Nieto Vivanco
71cb16118d Change error string for a better (?) one 2023-08-14 20:52:00 -06:00
Ivan Nieto Vivanco
d365565b6d Add message in the acceptance assets view to indicate when the user can\'t accept nor deny the asset 2023-08-14 20:51:04 -06:00
snipe
24a3e0ee83 Added LOGIN_AUTOCOMPLETE as env var
Signed-off-by: snipe <snipe@snipe.net>
2023-08-15 01:56:01 +01:00
Marcus Moore
dc1a8840f1 Ensure empty string is not passed to strpos() 2023-08-14 16:40:34 -07:00
Ivan Nieto Vivanco
96440834bd Move the declinedCheckout function so it don/'t separate the class properties 2023-08-14 16:16:28 -06:00
snipe
642a09f139 Merge remote-tracking branch 'origin/develop' 2023-08-14 23:12:07 +01:00
snipe
d3fbbec92c Merge pull request #13455 from snipe/fixes/confusion_around_localization_date
Fixed #13382 - confusion around localization date
2023-08-14 22:50:30 +01:00
snipe
9820ab34d7 Use today’s date for date format selectlist
Signed-off-by: snipe <snipe@snipe.net>
2023-08-14 22:44:29 +01:00
snipe
aa333bcf0b Merge pull request #13448 from Godmartinz/status-label-translations_fix
Fixed #13446 - added translations to status label type column
2023-08-14 22:25:46 +01:00
snipe
ba56746f57 Merge pull request #13437 from marcusmoore/feature/improve-user-factory
Allowed permissions in the user factory to be chained
2023-08-14 22:23:55 +01:00
snipe
716e13e5b1 Merge remote-tracking branch 'origin/develop' 2023-08-14 22:23:06 +01:00
snipe
dcec4ba5e2 Merge pull request #13454 from snipe/fixes/13450_removed_escaping_custom_fieldsets
Fixed #13450 - remove escaping on saveing new custom fields
2023-08-14 22:22:35 +01:00
snipe
12e9d2adeb Fixed #13450 - remove escaping on saveing new custom fields
Signed-off-by: snipe <snipe@snipe.net>
2023-08-14 22:21:41 +01:00
Ivan Nieto Vivanco
8da2a8a79c Allows to save signature for declined items 2023-08-14 14:58:10 -06:00
Ivan Nieto Vivanco
4796598bb6 Add declinedCheckout method to Accessory model 2023-08-14 14:35:31 -06:00
Godfrey M
c3356ab765 fixed translation choice and color choice 2023-08-14 12:20:46 -07:00
Godfrey M
4446b2311d remove unnecessary changes 2023-08-14 12:14:15 -07:00
Godfrey M
6b94ef6adc fixes the statuslabeltypeforatter instead of the model 2023-08-14 12:13:01 -07:00
Godfrey M
a0d5774635 adds translations to status label type column 2023-08-14 10:42:17 -07:00
snipe
ec2556f991 Merge remote-tracking branch 'origin/develop' 2023-08-14 13:02:45 +01:00
snipe
291fa1cd29 Merge pull request #13445 from snipe/fixes/typo_in_formatter_for_asset_maintenances
Fixed case in BS table formatter for boolean
2023-08-14 13:02:27 +01:00
snipe
58286c9cab Fixed case in BS table formatter for boolean
Signed-off-by: snipe <snipe@snipe.net>
2023-08-14 13:01:32 +01:00
Robert-Azelis
1e43d88e06 Create 2023_08_13_172600_add_email_to_companies.php 2023-08-13 17:25:33 +02:00
Robert-Azelis
da701677c7 Update edit.blade.php 2023-08-13 17:24:17 +02:00
Robert-Azelis
30d33310ae Update CompanyPresenter.php 2023-08-13 17:23:33 +02:00
Robert-Azelis
bbb8ecfee4 Update Company.php 2023-08-13 17:21:55 +02:00
Robert-Azelis
8988a5dfc3 Update CompaniesTransformer.php 2023-08-13 17:20:15 +02:00
Robert-Azelis
ed5b4ca0a2 Update CompaniesController.php 2023-08-13 17:18:25 +02:00
Robert-Azelis
07bafa9508 Update CompaniesController.php 2023-08-13 17:15:20 +02:00
snipe
6134dfa8f2 Merge remote-tracking branch 'origin/develop' 2023-08-11 09:42:30 +01:00
snipe
a1cfa45344 Merge pull request #13439 from snipe/fixes/500_error_when_cloning_invalid_accessory
Fixed route for accessory index
2023-08-11 09:42:00 +01:00
snipe
df8f6a8d2b Correctly call the route for accessory index
Signed-off-by: snipe <snipe@snipe.net>
2023-08-11 09:40:49 +01:00
Marcus Moore
5b86c02366 Set permissions to empty object in user factory 2023-08-10 16:55:44 -07:00
Marcus Moore
41479b1ec7 Allow permissions in the user factory to be chained 2023-08-10 16:35:10 -07:00
Marcus Moore
3a2b15313c Bump guzzlehttp/psr7 to 2.4.5 2023-08-10 11:53:20 -07:00
Marcus Moore
6b6bb61400 Bump nyholm/psr7 to 1.6.1 2023-08-10 11:52:42 -07:00
snipe
6adaa32286 Merge pull request #13431 from marcusmoore/feature/custom-report-scoping
Removed unneeded `Company::scopeCompanyables` from `ReportsController`
2023-08-10 09:57:53 +01:00
snipe
a599f0c923 Merge pull request #13434 from marcusmoore/chore/improve-test-stability
Improved test stability and messaging
2023-08-10 09:57:26 +01:00
snipe
4db4bf7be4 Merge pull request #13432 from marcusmoore/chore/remove-old-testing-code
Removed unused Codeception test code
2023-08-10 09:57:11 +01:00
Marcus Moore
04661d5441 Add help text to response assertion helpers 2023-08-09 17:09:31 -07:00
Marcus Moore
3a5ed031bf Escape values in response assertion helpers 2023-08-09 17:08:49 -07:00
Marcus Moore
60baaae192 Remove unused test bootstrap file 2023-08-09 16:22:58 -07:00
Marcus Moore
8508594a2f Remove old and unused Codeception test code 2023-08-09 13:32:15 -07:00
Marcus Moore
e0b464dcec Merge branch 'develop' into feature/custom-report-scoping 2023-08-09 13:03:05 -07:00
snipe
7df3be3a54 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/css/dist/all.css
#	public/css/dist/bootstrap-table.css
#	public/js/dist/bootstrap-table.js
#	public/mix-manifest.json
2023-08-09 10:54:49 +01:00
snipe
bd3ba9a5f7 Merge pull request #13428 from snipe/security/update_autotable
Updated autotable
2023-08-09 10:49:01 +01:00
snipe
a65ac1ccdf Updated autotable
Signed-off-by: snipe <snipe@snipe.net>
2023-08-09 10:47:45 +01:00
snipe
ffabc9c331 Merge pull request #13414 from marcusmoore/fixes/chipperci-config
Fixes ChipperCi Pipeline
2023-08-09 10:37:21 +01:00
snipe
a6a742d8d8 Merge pull request #13407 from marcusmoore/feature/sc-23465
Added messaging to category edit page to improve clarity around when users will be emailed
2023-08-09 10:36:19 +01:00
Marcus Moore
2e632a3d2d Improve test readability 2023-08-08 17:40:02 -07:00
Marcus Moore
c32f099053 Remove unneeded call to Company::scopeCompanyables 2023-08-08 17:22:15 -07:00
Marcus Moore
c752e1670c Add test around company scoping in custom report 2023-08-08 17:21:39 -07:00
Marcus Moore
1405e17251 Add simple test around custom asset report response 2023-08-08 17:10:36 -07:00
snipe
15122bbb55 Merge pull request #13425 from snipe/security/upgrade_webpack_snyk_13416
Updated webpack
2023-08-08 22:24:59 +01:00
snipe
c18349d75f Updated webpack
Signed-off-by: snipe <snipe@snipe.net>
2023-08-08 22:07:49 +01:00
snipe
70903f068c Merge remote-tracking branch 'origin/develop' 2023-08-08 19:01:40 +01:00
snipe
521961457d Merge pull request #13424 from snipe/bug/sc-23552
Fixed tooltip not loading on encrypted field lock icon on asset detail view
2023-08-08 19:00:56 +01:00
snipe
6a3a38b6f6 Call tooltip again on custom fields jquery
Signed-off-by: snipe <snipe@snipe.net>
2023-08-08 18:53:57 +01:00
snipe
40aca9709a Added container to the tooltip invocation
Signed-off-by: snipe <snipe@snipe.net>
2023-08-08 18:52:26 +01:00
snipe
5a43c5906f Merge remote-tracking branch 'origin/develop' 2023-08-08 17:54:17 +01:00
snipe
9e6f23c8c7 Merge pull request #13421 from uberbrady/re_add_asset_eol_date
Re-add the option for asset_eol_date as an import field
2023-08-08 17:52:05 +01:00
Brady Wetherington
6afbf1b152 Re-add the option for asset_eol_date as an import field 2023-08-08 17:45:33 +01:00
snipe
4b2bf057c7 Merge remote-tracking branch 'origin/develop' 2023-08-08 12:57:27 +01:00
snipe
af91ffb2da Merge pull request #13418 from snipe/fixes/add_mailgun_endpoint
Added mailgun endpoint option, defaulting to the US
2023-08-08 12:56:37 +01:00
snipe
94bef046b8 Added mailgun endpoint option, defaulting to the US
Signed-off-by: snipe <snipe@snipe.net>
2023-08-08 12:50:38 +01:00
snipe
3091d2cdf0 Merge remote-tracking branch 'origin/develop' 2023-08-08 08:19:15 +01:00
snipe
bd4061e023 Change text on dropdown
Signed-off-by: snipe <snipe@snipe.net>
2023-08-08 08:18:56 +01:00
snipe
5bda73f151 Ugh - messing with the blade layout
Signed-off-by: snipe <snipe@snipe.net>
2023-08-08 08:18:40 +01:00
Marcus Moore
42055bb69d Add authentication and authorization tests for department index method 2023-08-07 17:42:28 -07:00
Marcus Moore
7c5a1b376e Remove redundant Company::scopeCompanyables wrapper 2023-08-07 16:54:23 -07:00
Marcus Moore
f7b2075e9e Add CompanyableTrait to Department 2023-08-07 16:54:02 -07:00
Marcus Moore
cdfe8e459d Add simple test cases for api department index 2023-08-07 16:36:01 -07:00
Marcus Moore
b56bcd3596 Troubleshooting pipeline: create both .env and .env.testing 2023-08-07 11:59:58 -07:00
Marcus Moore
999605b591 Troubleshooting pipeline: create .env.testing in place of .env 2023-08-07 11:57:34 -07:00
Marcus Moore
d3a45f73cf Troubleshooting pipeline: re-add creating .env.testing 2023-08-07 11:48:09 -07:00
Marcus Moore
0d40979724 Troubleshooting pipeline: Remove commented commands 2023-08-07 11:36:51 -07:00
Marcus Moore
81efa7d84e Revert "Troubleshooting pipeline: use phpunit in place of artisan test"
This reverts commit a7d1657111.
2023-08-07 11:35:18 -07:00
Marcus Moore
a7d1657111 Troubleshooting pipeline: use phpunit in place of artisan test 2023-08-07 11:31:00 -07:00
Marcus Moore
8ea8ff05e5 Troubleshooting pipeline: fix filename 2023-08-07 11:26:04 -07:00
Marcus Moore
6398805fc3 Troubleshooting pipeline: use .env.testing in place of .env.example 2023-08-07 11:24:38 -07:00
Marcus Moore
119ed9c882 Troubleshooting pipeline: remove comment to trigger build 2023-08-07 11:09:10 -07:00
snipe
32d8d8c50e Merge pull request #13397 from uberbrady/fix_locationless_ldap_sync
Fixed #13372: Put guard around assigning location via LDAP
2023-08-07 17:06:58 +01:00
Marcus Moore
ae9cf1e5b6 Formatting 2023-08-02 18:24:32 -07:00
Ivan Nieto Vivanco
053d3fc9ed Prevent asset to be checked out if full company support is enabled and companies not match 2023-08-02 19:23:28 -06:00
Marcus Moore
d019e62d39 Remove lazy from eula field to avoid race condition 2023-08-02 18:22:40 -07:00
Ivan Nieto Vivanco
9ca163e8cf Stop asset acceptances from shown to user if full company support is enabled and companies not match 2023-08-02 19:22:35 -06:00
Marcus Moore
b70a5280f9 Remove unneed jquery 2023-08-02 18:04:21 -07:00
Marcus Moore
cbe5a9bc8a Persist eula text even when field is disabled 2023-08-02 18:03:09 -07:00
Marcus Moore
3fd0853fd0 Ensure eula field enabled when not using default eula 2023-08-02 18:02:56 -07:00
Marcus Moore
2e7aa01abe Pass checkin_email value to backend even when unchecked 2023-08-02 17:45:39 -07:00
Marcus Moore
896f038054 Set send email back to original value when eulas cleared 2023-08-02 17:03:56 -07:00
Marcus Moore
48979ce177 Disable send email when it should not be modified 2023-08-02 16:52:56 -07:00
Marcus Moore
e12935f7fa Disable eula textarea when using global eula 2023-08-02 16:18:57 -07:00
Marcus Moore
6400034435 Improve variable name 2023-08-02 16:06:59 -07:00
Marcus Moore
269414e4f2 Automatically check the send email to user checkbox in certain conditions 2023-08-02 16:04:01 -07:00
Marcus Moore
dee6ebf8e0 Scaffold component test 2023-08-02 12:58:07 -07:00
Marcus Moore
105c94aea9 Implement toggling message when email will be sent 2023-08-02 11:36:20 -07:00
snipe
c52a1f94dc Merge remote-tracking branch 'origin/develop' 2023-08-02 15:19:23 +01:00
Brady Wetherington
0af205dade Put guard around assigning location via LDAP 2023-08-02 15:01:14 +01:00
Marcus Moore
6349d52803 WIP: migrate to livewire 2023-08-01 17:29:23 -07:00
Marcus Moore
65de9c5e07 Extract translation strings 2023-08-01 15:21:49 -07:00
Marcus Moore
ebfc395e78 Improve messaging 2023-08-01 14:39:30 -07:00
Marcus Moore
5c8c2ca027 Improve variable names 2023-08-01 14:26:21 -07:00
snipe
924f5287f7 Merge pull request #13392 from Godmartinz/change_webhook_variable_type
Fixed `webhook_endpoint` data type from varchar to a text
2023-08-01 20:28:39 +01:00
Godfrey M
7560afb8c4 changes webhook_endpoint var to a text 2023-08-01 10:45:39 -07:00
Godfrey M
8a24a47475 removed unnecessary code 2023-08-01 09:45:48 -07:00
Godfrey M
fb52038e7c applies a check if a sync field is designated 2023-08-01 09:39:58 -07:00
Brady Wetherington
daed0b60bc Merge branch 'develop' into snipeit_v7_laravel10 2023-07-31 19:40:56 +01:00
snipe
ffb605a37c Merge pull request #13309 from inietov/fixes/checkout_range_doesnt_include_today
Fixed #13300 Custom Asset Report, Checkout date range never includes current day
2023-07-31 15:04:22 +01:00
Brady Wetherington
4654f7aa37 Porting Snipe-IT v7 to Laravel v10 2023-07-31 14:07:12 +01:00
snipe
343aacab85 Merge pull request #13386 from snipe/security/dep_updates
Updated BS table and table export plugins
2023-07-31 13:46:41 +01:00
snipe
96d69b654d Updated BS table and table export plugins
Signed-off-by: snipe <snipe@snipe.net>
2023-07-31 13:45:15 +01:00
snipe
2e1c3fb51b Merge pull request #13295 from inietov/fixes/admins_cannot_view_encrypted_fields
Fixed #11794 Admins Cannot View Encrypted Field
2023-07-31 13:08:28 +01:00
snipe
3e4b371bf4 Merge pull request #13379 from inietov/fixes/component_checkout_via_api_returns_error
Fixed #13376 Component checkout via API returns error
2023-07-31 13:07:38 +01:00
Grant Le Roux
b1464e028c Merge branch 'develop' into develop 2023-07-31 07:57:29 +08:00
Ivan Nieto Vivanco
0a841ddbb8 Change component validator to the correct asset id we're passing in the API call 2023-07-27 20:22:13 -06:00
Brady Wetherington
70e87dad1c Merge branch 'develop' into snipeit_v7 2023-07-27 16:21:31 +01:00
snipe
af86c6138d Merge pull request #13361 from Godmartinz/bug/sc-19126
Fixed custom fieldset order
2023-07-26 08:55:18 +01:00
snipe
f6545be410 Merge pull request #13363 from inietov/fixes/no_records_found_multipage_license_seats
Fixed #13298 "No records Found" when Switching between Single and Multi-Page Licenses
2023-07-26 08:48:44 +01:00
Ivan Nieto Vivanco
c015264181 Adjust the license offset if it exceeds the total of license seats 2023-07-25 16:23:33 -06:00
Godfrey M
9c6e8d57aa removes typos 2023-07-25 11:44:16 -07:00
Godfrey M
11e3487263 custom field set order starts at 1 now 2023-07-25 11:41:08 -07:00
snipe
a01cb26aac Merge pull request #12940 from akemidx/delete_asset_from_view_page
Delete button on asset view page
2023-07-25 12:11:35 +01:00
akemidx
e289e95721 no ? needed 2023-07-24 17:22:10 -04:00
akemidx
b082d27c42 removing :item 2023-07-24 17:12:12 -04:00
snipe
ff3bdebb9a Merge remote-tracking branch 'origin/develop' 2023-07-24 13:27:35 +01:00
snipe
39ea15a27a Merge pull request #13347 from snipe/fixes/custom_report_error_on_bad_model
Possible alternative to fixing #13296 - custom report failing when th…
2023-07-21 15:18:16 +01:00
snipe
f699d9680b Merge remote-tracking branch 'origin/develop' 2023-07-21 15:00:23 +01:00
snipe
4fe6632167 Merge pull request #13349 from snipe/fixes/check_for_valid_model
Fixed: tighter check for valid model
2023-07-21 14:52:00 +01:00
snipe
1a771e6ab9 Check that the model is valid before trying to chain the relationship
Signed-off-by: snipe <snipe@snipe.net>
2023-07-21 14:46:58 +01:00
snipe
7f761000b4 Use slightly less terrifying and more accurate language
Signed-off-by: snipe <snipe@snipe.net>
2023-07-21 14:46:39 +01:00
Ivan Nieto Vivanco
cb4ed92639 Use Carbon date objects instead of casting using DB::raw() 2023-07-20 16:17:06 -06:00
snipe
540b09c506 Possible alternative to fixing #13296 - custom report failing when the model is busted
Related: https://github.com/snipe/snipe-it/pull/13297
Signed-off-by: snipe <snipe@snipe.net>
2023-07-20 17:45:45 +01:00
Brady Wetherington
ba8d8a6f05 Merge branch 'develop' into snipeit_v7 2023-07-20 17:16:04 +01:00
snipe
d26bc19e3f Merge remote-tracking branch 'origin/develop' 2023-07-20 16:34:16 +01:00
snipe
0b8a3ee9a5 Merge pull request #13346 from snipe/fixes/depreciable
Check that $this->get_depreciation() returns
2023-07-20 16:33:15 +01:00
snipe
1e09320ebe Check that $this->get_depreciation() returns
Signed-off-by: snipe <snipe@snipe.net>
2023-07-20 16:30:07 +01:00
snipe
19df0b82b1 Merge remote-tracking branch 'origin/develop' 2023-07-20 14:06:45 +01:00
snipe
ee36497acf Merge pull request #13344 from snipe/fixes/added_manufacturer_to_licenses
Fixes bug/sc-23509: Added manufacturer back into license importer
2023-07-20 14:05:19 +01:00
snipe
d7ac8ef618 Added manufacturer to licenses
Signed-off-by: snipe <snipe@snipe.net>
2023-07-20 14:02:54 +01:00
snipe
244e4ec11f Added manufacturer back into license importer
Signed-off-by: snipe <snipe@snipe.net>
2023-07-20 13:48:51 +01:00
snipe
917005ceb4 Merge pull request #13342 from Loemnk/develop
Fixes #13341: Clean up correct seats on license delete
2023-07-20 13:05:31 +01:00
Tobias Franzius
90a344af0b Fixes #13341 Clean up correct seats on license delete
Before this, we checked for the `id` collumn in the `license_seats` table, insteasd of
using `license_id` for this.

This way, we ensure that we only alter seats belonging to the correct license.
2023-07-20 13:48:57 +02:00
Ivan Nieto Vivanco
ecf522243b Add the new rule to proper views and also in the Asset Transformer 2023-07-19 19:52:03 -06:00
Ivan Nieto Vivanco
705411eb4d Create the Gate that goes with the permission 2023-07-19 19:44:59 -06:00
Ivan Nieto Vivanco
3b4a2b0f5b Add permission to view and modify encrypted custom fields 2023-07-19 14:57:57 -06:00
snipe
a19a508a80 Merge pull request #13197 from akemidx/current_value_for_assets
Current value added to asset index page
2023-07-19 19:06:15 +01:00
akemidx
9e2987e680 changing book value to be NOT searchable or sortable 2023-07-19 13:44:31 -04:00
snipe
b54e7dc3ee Fixed #13336 - Save unhashed password if no password provided
Signed-off-by: snipe <snipe@snipe.net>
2023-07-19 17:44:40 +01:00
snipe
1e1aea2eb0 Merge pull request #13299 from ubc-cpsc/bugfix/CVE-2023-37260
Update league/oauth2-server for CVE-2023-3726
2023-07-19 13:14:35 +01:00
Brady Wetherington
605d267fe8 Merge branch 'develop' into snipeit_v7 2023-07-19 11:47:51 +01:00
snipe
33fd904c18 Merge pull request #13330 from akemidx/merge_users_typo
merge users page typo fix
2023-07-19 10:26:57 +01:00
snipe
74a5bcd490 Merge remote-tracking branch 'origin/develop' 2023-07-19 09:01:19 +01:00
snipe
dc20305db6 Merge pull request #13333 from snipe/fixes/strtolower_on_catgories
Added strtolower for category type
2023-07-19 09:00:55 +01:00
snipe
a0a5ca1f40 Added strtolower for category type
Signed-off-by: snipe <snipe@snipe.net>
2023-07-19 08:56:17 +01:00
akemidx
064e696521 merge users page typo fix 2023-07-18 15:33:33 -04:00
snipe
c1949ffb0d Merge pull request #13319 from marcusmoore/chore/user-search-test-cases
Added test cases around user search
2023-07-18 13:27:22 +01:00
snipe
bc91181917 Merge remote-tracking branch 'origin/develop' 2023-07-18 13:27:05 +01:00
snipe
18e2ec4dad Merge pull request #13310 from marcusmoore/bug/sc-23478
Fixed the inability to load location select when editing profile
2023-07-18 13:26:30 +01:00
snipe
92e7e79faf Merge remote-tracking branch 'origin/develop' 2023-07-18 13:25:34 +01:00
snipe
6f8c3ca167 Merge pull request #13322 from uberbrady/fix_ldap_location_3
Fix to ldap_location attribute
2023-07-18 13:24:59 +01:00
snipe
1fa703387a Merge remote-tracking branch 'origin/develop' 2023-07-18 11:30:53 +01:00
snipe
cbdce994b8 Merge pull request #13318 from inietov/fixes/employee_id_not_importing
Fixed Employee Number no longer importing [sc-23497]
2023-07-18 11:08:43 +01:00
Brady Wetherington
051830dff4 Fix to ldap_location attribute 2023-07-17 20:42:02 +01:00
Marcus Moore
2eaab6d9fb Change message to a callout 2023-07-17 12:23:31 -07:00
Marcus Moore
fa0a88289a Add tests around user search
Follow up to #13311
2023-07-17 11:29:22 -07:00
Ivan Nieto Vivanco
88c40c9c14 Change the field name to the same the model uses 2023-07-17 12:08:10 -06:00
snipe
3203f8f97c Merge remote-tracking branch 'origin/develop' 2023-07-15 10:48:09 +01:00
snipe
f15e14f905 Merge pull request #13315 from snipe/features/add_warranty_link_even_if_no_warranty_set
Moved warranty into manufactuer’s section
2023-07-15 10:47:44 +01:00
snipe
c21a7db3c1 Moved warranty into manufactuer’s section
Signed-off-by: snipe <snipe@snipe.net>
2023-07-15 10:45:36 +01:00
snipe
8bc8ecfc67 Merge remote-tracking branch 'origin/develop' 2023-07-14 09:39:26 +01:00
snipe
bb0eaf8b8d Merge pull request #13312 from snipe/features/add_show_hide_option_on_custom_fields
Added ability to show/hide custom fields in list views by default
2023-07-14 09:38:35 +01:00
snipe
3078cab7ee Added ability to show/hide custom fields in list views by default
Signed-off-by: snipe <snipe@snipe.net>
2023-07-14 09:09:43 +01:00
snipe
db8c37cd5b Merge remote-tracking branch 'origin/develop' 2023-07-14 08:26:12 +01:00
snipe
15bb943210 Merge pull request #13311 from snipe/fixes/deleted_users_showing_in_current_users
Fixed: deleted users showing in current users
2023-07-14 07:47:36 +01:00
snipe
f51dd15893 Moved deleted scope down
Signed-off-by: snipe <snipe@snipe.net>
2023-07-14 07:44:19 +01:00
Marcus Moore
346ace9444 Allow users that have permission to edit their own location to see locations in select list 2023-07-13 17:37:46 -07:00
Ivan Nieto Vivanco
ecac4718fe Add date casting to the SQL query, so the BETWEEN range doesn't care about time of day in custom report datetimes 2023-07-13 16:02:47 -06:00
snipe
4027acee46 Merge pull request #13184 from akemidx/department_in_side_bar
User department now visible in side pane of asset view page
2023-07-13 21:01:48 +01:00
snipe
43d419f051 Merge remote-tracking branch 'origin/develop' 2023-07-13 13:18:52 +01:00
snipe
5aa99a15d8 Merge pull request #13288 from snipe/fixes/line_based_markdown
Added Inline markdown method
2023-07-13 13:16:50 +01:00
snipe
016502f637 Added notesFormatter
Signed-off-by: snipe <snipe@snipe.net>
2023-07-13 13:14:10 +01:00
snipe
66875ff0dc Merge remote-tracking branch 'origin/develop' 2023-07-13 12:59:30 +01:00
snipe
5d1f294f0e Added parseEscapedMarkedownInline to accessories API
Signed-off-by: snipe <snipe@snipe.net>
2023-07-13 12:03:01 +01:00
snipe
981c3a430d Merge pull request #13301 from uberbrady/better_auto_increment_tags
Better auto increment asset-tags [FD-32892]
2023-07-13 09:49:44 +01:00
Joël Pittet
24adcdb586 Revert lock file changes for PHP 7 support 2023-07-12 17:58:52 -07:00
akemidx
1163af3c10 change to make sure department actually exists 2023-07-12 15:57:44 -04:00
snipe
232e84acf7 Merge pull request #13302 from snipe/features/env_setting_for_bs_tables
Fixed #13256 - Added option to switch to localStorage instead of cookies
2023-07-12 20:10:33 +01:00
snipe
5d60a38a0e Added comment with link
Signed-off-by: snipe <snipe@snipe.net>
2023-07-12 20:08:20 +01:00
snipe
c1c2c38995 Fixed #13256 - Added option to switch to localStorage instead of cookies
Signed-off-by: snipe <snipe@snipe.net>
2023-07-12 20:06:17 +01:00
snipe
8c74e906ef Merge remote-tracking branch 'origin/develop' 2023-07-12 19:22:49 +01:00
snipe
3a6d8ef684 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/css/dist/all.css
#	public/css/dist/bootstrap-table.css
#	public/js/dist/bootstrap-table.js
#	public/mix-manifest.json
2023-07-12 19:22:34 +01:00
snipe
44231fa52c Merge pull request #13225 from inietov/fixes/change_default_location_at_checkin
Fixed #13167 Default location not being set/updated upon check-in
2023-07-12 19:14:53 +01:00
snipe
44b8558e38 Merge pull request #13233 from Godmartinz/barcode_adjusts_if_qr_code_
fixed margin if qr_code present
2023-07-12 17:11:58 +01:00
snipe
d3c44a462e Merge pull request #13268 from inietov/fixes/license_importer_missing_dropdown_items
Fixed License importer missing Checkout to: Username and Checkout to: Email in dropdown [sc-23456]
2023-07-12 17:11:27 +01:00
snipe
a569a99e61 Used inline markdown in views
Signed-off-by: snipe <snipe@snipe.net>
2023-07-12 16:57:04 +01:00
Brady Wetherington
e648da9dc5 Also do a sanity-check that the normal asset autoincrementing works 2023-07-12 16:51:23 +01:00
Brady Wetherington
76191a09ed Improvements to asset_tag auto-incrementing, with auto-fixups for gaps 2023-07-12 16:39:45 +01:00
snipe
1b8b117f4e Merge pull request #13292 from marcusmoore/guard-against-wiping-local-db
Avoid accidentally wiping local database when running tests
2023-07-12 15:23:11 +01:00
Marcus Moore
3df175fb3e Improve variable name 2023-07-11 16:36:38 -07:00
Marcus Moore
44d8b2fd5e Handle default eula checkbox 2023-07-11 16:36:03 -07:00
Ivan Nieto Vivanco
e0df8cc4aa Add admin role to show encrypted customfield values 2023-07-11 17:21:32 -06:00
Marcus Moore
af681d8190 Display message and update checkbox depending on EULA status 2023-07-11 16:12:43 -07:00
snipe
2bc4235368 Merge pull request #13293 from marcusmoore/run-chipper-on-all-prs
Run ChipperCI on all PRs (take three)
2023-07-11 20:36:49 +01:00
Marcus Moore
5b33c00e9f Run ChipperCI on all PRs 2023-07-11 12:34:39 -07:00
Marcus Moore
48e4ec8cf5 Guard against wiping database when running tests and test specific envs are not created 2023-07-11 12:16:37 -07:00
snipe
b5695c9ab7 Test parsedown in notes
Signed-off-by: snipe <snipe@snipe.net>
2023-07-11 12:20:47 +01:00
snipe
6d3bf1e5f5 Added additional method for inline
Signed-off-by: snipe <snipe@snipe.net>
2023-07-11 11:41:58 +01:00
snipe
9b5a67e31f Use $Parsedown->line instead of $Parsedown->text
Signed-off-by: snipe <snipe@snipe.net>
2023-07-11 11:33:29 +01:00
snipe
ba37a9db8c Merge pull request #13277 from snipe/features/added_phone_fax_to_locations
Added phone, fax to departments, locations, companies
2023-07-11 11:15:13 +01:00
snipe
9dc7fc93fb Small fixes
Signed-off-by: snipe <snipe@snipe.net>
2023-07-11 11:14:19 +01:00
snipe
a5555a1c67 Merge pull request #13281 from inietov/fixes/error_showing_requested_assets
Fixed #13276 Error Showing Requested Assets
2023-07-11 11:11:33 +01:00
snipe
d76f420f4e Merge pull request #13282 from marcusmoore/fixes/allow-installing-on-74-v2
Fixes dev dependency on PHP 7.4
2023-07-11 11:10:52 +01:00
Marcus Moore
d8f22880d6 Allow installing on PHP 7.4 2023-07-10 17:35:21 -07:00
Ivan Nieto Vivanco
ec8cb1b09e Add the withTrashed() method to requestingUser() method in CheckoutRequest model, so the view of requestable assets doesn't crash 2023-07-10 16:34:00 -06:00
snipe
4845a88c68 Merge pull request #13280 from snipe/security/webpack-upgade
[Snyk] Upgrade webpack from 5.86.0 to 5.87.0 #13267
2023-07-10 20:17:44 +01:00
snipe
73c2202d94 [Snyk] Upgrade webpack from 5.86.0 to 5.87.0 #13267
Signed-off-by: snipe <snipe@snipe.net>
2023-07-10 20:16:09 +01:00
snipe
0d37d1a905 Merge pull request #13279 from snipe/security/acorn-upgrade
Upgraded acorn
2023-07-10 20:08:46 +01:00
snipe
83cf106ce5 Upgraded acorn
Signed-off-by: snipe <snipe@snipe.net>
2023-07-10 20:06:57 +01:00
snipe
7debf126d6 Dev assets
Signed-off-by: snipe <snipe@snipe.net>
2023-07-10 20:03:12 +01:00
snipe
c5c87ea0ca Merge pull request #13278 from snipe/security/bs-tables-update
Applied Snyk #13272
2023-07-10 20:01:41 +01:00
snipe
8169206943 Applied Snyk #13272
Signed-off-by: snipe <snipe@snipe.net>
2023-07-10 19:59:08 +01:00
snipe
22d9df304b Merge pull request #13265 from marcusmoore/chore/chipperci-on-prs
Have ChipperCi run on each PR
2023-07-10 19:48:40 +01:00
snipe
14c61e4c17 Added phone, fax to departments, locations, companies
Signed-off-by: snipe <snipe@snipe.net>
2023-07-10 19:44:21 +01:00
Joël Pittet
a4a676ef0b Update league/oauth2-server for CVE-2023-3726 and lcobucci/clock to semver to allow dependencies to update 2023-07-10 11:19:54 -07:00
Brady Wetherington
8f2a17585e Merge branch 'develop' into snipeit_v7
Had to do a lot of conflict work here, so this could get ugly :(
2023-07-10 16:53:35 +01:00
Ivan Nieto Vivanco
299e546021 Adds the Username and Email to License Importer dropdown 2023-07-06 18:36:13 -06:00
snipe
5a9c2925c3 Merge pull request #13264 from marcusmoore/bug/sc-23451
Fix label wrapping on category edit page
2023-07-06 19:01:36 +01:00
Marcus Moore
149184dc3c Have ChipperCI on on each PR
Following up on #13218
2023-07-06 11:00:03 -07:00
Marcus Moore
ef160b0e15 Add span tag so label is displayed properly 2023-07-06 10:49:57 -07:00
Ivan Nieto Vivanco
f4ca29b4a8 Only show radio inputs for location in checkin view 2023-07-06 11:36:55 -06:00
Ivan Nieto Vivanco
9591442f1e Evaluate the radio input to update location only or default location too 2023-07-06 10:46:21 -06:00
Ivan Nieto Vivanco
743e852998 Add radio buttons to alter asset checkin location behavior 2023-07-06 10:38:48 -06:00
snipe
2faa73f983 Merge pull request #13169 from akemidx/license_sn_check1
Making Serial Number the logic checked against for new imports
2023-07-06 16:40:27 +01:00
snipe
d37aaee4c8 Merge pull request #13257 from snipe/fixes/check_for_ceiling_in_upgrader
Check for max PHP version in upgrader
2023-07-06 16:07:10 +01:00
snipe
a9d175a396 Check for max PHP version
Signed-off-by: snipe <snipe@snipe.net>
2023-07-05 18:47:48 +01:00
snipe
a56b040143 Merge remote-tracking branch 'origin/develop' 2023-07-05 17:30:19 +01:00
snipe
35039cd590 Merge pull request #13255 from snipe/fixes/larger_field_for_idp_meta
Change settings table `saml_idp_metadata` to MEDIUMTEXT
2023-07-05 17:30:02 +01:00
snipe
c85a33be6a Change settings table saml_idp_metadata to MEDIUMTEXT
Signed-off-by: snipe <snipe@snipe.net>
2023-07-05 17:28:08 +01:00
snipe
61fd427678 Bumped version
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
2023-07-05 14:41:34 +01:00
snipe
d890d923ff Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2023-07-05 14:40:54 +01:00
snipe
32747cafde Merge remote-tracking branch 'origin/develop' 2023-07-05 14:37:53 +01:00
snipe
4b4983e550 Merge pull request #13253 from uberbrady/improve_scim_404s
Properly return SCIM Exceptions
2023-07-05 14:37:32 +01:00
Brady Wetherington
a6a89ddd6c Also log(debug) the error - could be useful for troubleshooting 2023-07-05 14:31:08 +01:00
Brady Wetherington
1f4d2f1e4a Properly return SCIM Exceptions 2023-07-05 14:27:10 +01:00
Godfrey M
d44e667697 fixed margin if qr_code present 2023-06-29 13:37:38 -07:00
snipe
e18c3e08be Merge remote-tracking branch 'origin/develop' 2023-06-29 21:23:53 +01:00
snipe
bbbeaaee2b Merge pull request #13232 from Godmartinz/labels_overlapping_issue
fixed barcode and info from overlapping
2023-06-29 21:23:31 +01:00
snipe
33b1a31ed3 Merge remote-tracking branch 'origin/develop' 2023-06-29 21:19:25 +01:00
Godfrey M
df90e924b4 prevent labels from overlapping 2023-06-29 13:18:17 -07:00
snipe
630b6496ec Merge pull request #13231 from snipe/fixes/small_fix_for_error_during_seeding
Redirect if the license can’t be found
2023-06-29 21:18:02 +01:00
snipe
7937542dcb Redirect if the license can’t be found
Signed-off-by: snipe <snipe@snipe.net>
2023-06-29 21:15:50 +01:00
snipe
1b71ab6d86 Updated prod assets
Signed-off-by: snipe <snipe@snipe.net>
2023-06-29 20:41:16 +01:00
snipe
af26ec471f Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/css/dist/skins/skin-yellow-dark.css
#	public/css/dist/skins/skin-yellow-dark.min.css
#	public/mix-manifest.json
2023-06-29 20:41:05 +01:00
akemidx
d0212d4bda formatting fix 2023-06-29 15:39:19 -04:00
snipe
e236bf412c Merge pull request #13230 from snipe/fixes/windows_backup_filename_colon_wtf_issue
Fixed windows backup filename - swapped colon in timestamp to hyphen to handle windows filesystems
2023-06-29 20:37:09 +01:00
snipe
fb9b3a5453 Switched from a colon to a hyphen to handle windows filesystems
Signed-off-by: snipe <snipe@snipe.net>
2023-06-29 20:32:20 +01:00
snipe
faf2a235fb Updated dev assets
Signed-off-by: snipe <snipe@snipe.net>
2023-06-29 20:31:13 +01:00
snipe
9f99f8275c Merge pull request #13229 from Godmartinz/status_label_color
fixed custom fields labels being unreadable
2023-06-29 20:21:46 +01:00
slong753
8cee3a8218 ok, @marcusmoore was right all along
i just didn't get it
2023-06-29 14:06:52 -05:00
Godfrey M
f83effbb85 removed unnecessary css rule 2023-06-29 11:25:40 -07:00
Godfrey M
d4cddebba5 fixes custom fields labels being unreadable 2023-06-29 11:21:21 -07:00
snipe
4dd71e0332 Merge remote-tracking branch 'origin/develop' 2023-06-29 17:14:15 +01:00
snipe
825e988dfa Merge pull request #13228 from snipe/bug/sc-23434
Use proper alias for table scope
2023-06-29 17:11:50 +01:00
snipe
bcefe73c9c Use proper alias for table scope
Signed-off-by: snipe <snipe@snipe.net>
2023-06-29 16:52:09 +01:00
slong753
826ea0ded8 move colon to blade based on a comment 2023-06-29 10:40:04 -05:00
snipe
4908082240 Merge remote-tracking branch 'origin/develop' 2023-06-29 16:23:35 +01:00
snipe
a3096e1b47 Merge pull request #13219 from inietov/features/cancel_request_asset
Cancel requested assets without checkin/out [ch-17606]
2023-06-29 16:18:13 +01:00
snipe
16ce06a3cc Merge pull request #13222 from snipe/feature/sc-23427
Fixed #13213 - Use the Helper::parseEscapedMarkedown in notes
2023-06-29 16:16:25 +01:00
snipe
8be3a6985b Merge pull request #13227 from snipe/bug/sc-23433
More reshuffling of scopes in assets API
2023-06-29 16:10:26 +01:00
snipe
ead5f039b4 Merge remote-tracking branch 'origin/develop' 2023-06-29 15:33:12 +01:00
snipe
4c3a306a6e More shuffling of scopes
Signed-off-by: snipe <snipe@snipe.net>
2023-06-29 13:35:41 +01:00
Ivan Nieto Vivanco
011726154c Set rtd_location if a location is given at checkin 2023-06-29 03:16:59 -06:00
slong753
ea61f634fb get rid of nice nullsafe 2023-06-28 16:48:52 -05:00
slong753
afe6fe207a resolved, missed adding errors in a case 2023-06-28 16:45:18 -05:00
akemidx
af03b9f140 user department clarification & translation for that phrase. will be used in a later PR 2023-06-28 17:45:13 -04:00
snipe
f7f2d799f2 Merge pull request #13223 from inietov/fixes/delete_notes_map_from_asset_importer
Delete notes column map from assets importer
2023-06-28 20:06:33 +01:00
slong753
8923206ac8 translation string 2023-06-28 13:08:34 -05:00
slong753
3b8ab2d682 clean formatting a little 2023-06-28 13:00:59 -05:00
slong753
2d27941105 added to textarea too 2023-06-28 12:59:54 -05:00
slong753
50a518e5f3 disable input when field is unique 2023-06-28 12:57:23 -05:00
Ivan Nieto Vivanco
a4b8723dcb Delete notes column map from assets importer 2023-06-28 11:38:51 -06:00
Ivan Nieto Vivanco
e2c2736a9c Delete (gulp) Form for bulk edit since is not used in this view 2023-06-28 11:23:37 -06:00
Ivan Nieto Vivanco
85e717bc4e Fix cancel button style and translate title 2023-06-28 10:38:44 -06:00
snipe
2c23c71823 Merge remote-tracking branch 'origin/develop' 2023-06-28 16:41:49 +01:00
snipe
161f4c8d83 Merge pull request #13045 from akemidx/feature/sc-23261
Checkin/out info on side bar
2023-06-28 16:41:21 +01:00
slong753
8b8e7cb5ee couple translation strings 2023-06-28 10:17:28 -05:00
snipe
e1fdfd01f6 Merge pull request #13211 from marcusmoore/company-scoping
Improve testing around company scoping
2023-06-28 16:17:07 +01:00
snipe
4278471d81 Merge pull request #13207 from Godmartinz/half_year_dep_fix
adds half_year fix from jdickerson71388
2023-06-28 15:12:30 +01:00
snipe
e3f381a1e1 Merge pull request #13212 from marcusmoore/feature/sc-23419
Allow running tests in parallel
2023-06-28 15:12:13 +01:00
snipe
8d8adc1639 Use the Helper::parseEscapedMarkedown in notes
Signed-off-by: snipe <snipe@snipe.net>
2023-06-28 15:02:32 +01:00
Brady Wetherington
51424d01a9 Merge branch 'develop' into snipeit_v7 2023-06-28 14:25:33 +01:00
snipe
a455f67d62 Merge pull request #13216 from marcusmoore/bug/sc-23420
Fix translation string in user importer
2023-06-28 07:03:11 +01:00
snipe
b6a11cde65 Merge pull request #13218 from marcusmoore/chore/sc-23424
Have ChipperCI run on each PR
2023-06-28 07:01:14 +01:00
snipe
a8d4494e68 Merge pull request #13220 from marcusmoore/bug/sc-23425
Add missing relationship check in Asset Transformer
2023-06-28 06:59:33 +01:00
Marcus Moore
ab51857854 Check to see if model relationship exists before using it 2023-06-27 19:35:55 -07:00
Ivan Nieto Vivanco
8496e64e16 Adds ternary to set a quantity when needed 2023-06-27 18:37:22 -06:00
Ivan Nieto Vivanco
b4b84f91d0 Redirect to correct page after cancel action 2023-06-27 18:25:38 -06:00
Ivan Nieto Vivanco
1c29bd37a6 Added feature to cancel requests from the Requested Assets view 2023-06-27 18:11:10 -06:00
Marcus Moore
6df7be8c13 Have ChipperCI run on each PR 2023-06-27 16:55:20 -07:00
Ivan Nieto Vivanco
eb4d764601 Refactor Requestable@cancelRequest() firm to admit a user_id so we can cancel a request of whatever user we want 2023-06-27 17:13:11 -06:00
Ivan Nieto Vivanco
b647a8fcd2 Change the inline form HTML label to the Form:: facade 2023-06-27 17:02:25 -06:00
Ivan Nieto Vivanco
62347a56ba Add button with cancel action in requested assets view 2023-06-27 16:41:30 -06:00
Marcus Moore
b0177d513a Fix translation 2023-06-27 12:37:19 -07:00
slong753
e8988bf51e add list 2023-06-26 20:22:27 -05:00
Marcus Moore
3f09e6017b Install paratest to allow for parallel test running 2023-06-26 16:22:28 -07:00
slong753
2736161909 oops, fixed translation 2023-06-26 16:37:06 -05:00
slong753
8cbff0179c translation strings 2023-06-26 16:35:53 -05:00
slong753
2a352619f7 clean up 2023-06-26 16:25:48 -05:00
Marcus Moore
2abdb8a5fd Revert unneeded changes 2023-06-26 14:01:09 -07:00
Marcus Moore
7cb22d3d49 Remove incomplete tests 2023-06-26 14:00:53 -07:00
slong753
691faf6340 ok, this kind of works - pr needs some clean up 2023-06-26 14:56:07 -05:00
Marcus Moore
3cb0920411 Merge branch 'develop' into company-scoping 2023-06-26 12:32:10 -07:00
Godfrey M
114d946437 adds half_year fix from jdickerson71388 2023-06-26 11:26:46 -07:00
snipe
4cb9c25e83 Merge remote-tracking branch 'origin/develop' 2023-06-26 08:30:35 +01:00
snipe
49b50d81ee Merge pull request #13200 from snipe/bug/sc-23417
Set table alias for model number sort scope
2023-06-26 08:29:16 +01:00
snipe
4f7b2836b5 Set table alias for model number sort scope
Signed-off-by: snipe <snipe@snipe.net>
2023-06-26 08:27:17 +01:00
Marcus Moore
acd06927ac Add helper method for authenticating with passport 2023-06-22 17:37:30 -07:00
Spencer Long
f646623a5e Merge branch 'develop' into bulk_edit_custom_fields 2023-06-22 18:00:31 -05:00
Marcus Moore
a35d83d14a Migrate to response macros for readability 2023-06-22 14:41:56 -07:00
akemidx
8df9db76bc column ordering fix 2023-06-22 17:12:40 -04:00
akemidx
8725d40f8d current value added to asset index page. translations for this in reports 2023-06-22 17:00:42 -04:00
snipe
8c6bde335e Merge pull request #13196 from inietov/fixes/default_status_labels_when_import
Fixed issue when importing Assets and no status labels exists [sc-23359]
2023-06-22 21:34:25 +01:00
snipe
b2d74f7e95 Merge pull request #13186 from snipe/bug/sc-23386
Moved logic for tighter constraints when ids are passed
2023-06-22 21:32:36 +01:00
snipe
78d8e32a22 Fixed weird order number thing
Signed-off-by: snipe <snipe@snipe.net>
2023-06-22 21:16:24 +01:00
snipe
4029efebfd Merge pull request #13159 from Godmartinz/audit_image_bug
fixed audit log image not appearing
2023-06-22 21:11:39 +01:00
Marcus Moore
8aae5beaba Add explicit select back to query 2023-06-22 13:09:08 -07:00
Marcus Moore
a8133f62e8 Add explicit select back to query 2023-06-22 13:07:49 -07:00
Ivan Nieto Vivanco
67e47a7d8b Add guard clause to obtain the default ID of imported asset's status label 2023-06-22 13:53:58 -06:00
Marcus Moore
a333d7b72f Add context to incomplete tests 2023-06-22 12:48:09 -07:00
Marcus Moore
ab5fed09db Remove scopeCompanyables call from AssetsController@requestable 2023-06-22 12:36:43 -07:00
Marcus Moore
74b072f1b5 Improve messaging in testing helper 2023-06-22 12:36:30 -07:00
Marcus Moore
0a5e1e3190 Remove scopeCompanyables call from AssetsController@selectlist 2023-06-21 17:21:36 -07:00
Marcus Moore
effd969284 Scaffold test before removing scopeCompanyables call from AssetsController@selectlist 2023-06-21 17:15:02 -07:00
Marcus Moore
fd55c99b87 Remove scopeCompanyables call from AssetsController@index 2023-06-21 16:29:44 -07:00
Marcus Moore
af77fefc61 Scaffold test before removing scopeCompanyables call from AssetsController 2023-06-21 16:19:56 -07:00
Marcus Moore
65e8e4e163 Guard against attempting to use invalid property 2023-06-21 16:18:09 -07:00
snipe
c377e0617c Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
2023-06-21 19:07:07 +01:00
snipe
17a10a4342 Bumped hash
Signed-off-by: snipe <snipe@snipe.net>
2023-06-21 19:06:21 +01:00
snipe
5d4e704fac Added a comment
Signed-off-by: snipe <snipe@snipe.net>
2023-06-21 09:26:54 +01:00
snipe
2d9ddab3f0 Moved logic for tighter constraints when ids are passed
Signed-off-by: snipe <snipe@snipe.net>
2023-06-21 09:24:17 +01:00
akemidx
4b8a08edc1 typo 2023-06-20 19:32:16 -04:00
akemidx
1a407dc05b user department now in side view of asset view page 2023-06-20 19:17:14 -04:00
snipe
2ac4449ea3 Merge remote-tracking branch 'origin/develop' 2023-06-15 20:30:07 +01:00
akemidx
00fd541963 improve logging clarity 2023-06-15 15:09:14 -04:00
snipe
f890e1f8b1 Merge pull request #13171 from snipe/features/importer/allow_update_by_user_id
Accept user ID as authoratative field for updates
2023-06-15 20:08:20 +01:00
akemidx
eda5bbf305 fix to allow empty SN 2023-06-15 14:42:34 -04:00
snipe
7a425f8a49 Merge pull request #13093 from NojoudAlshehri/features/added_asset_tag_colum_in_requestable_assets
feature: Added asset_tag column in requestable assets page
2023-06-15 19:37:18 +01:00
snipe
21a27f43a9 Merge pull request #13158 from Godmartinz/asset_maint_warranty_bug
Added warranty confirmation to asset maintenance table
2023-06-15 19:34:16 +01:00
snipe
09d65f810e Merge pull request #13124 from m4us1ne/fix_dompdf_chroot
Fixed #12434: Include Docker Specific Paths for dompdf chroot
2023-06-15 19:32:34 +01:00
snipe
004992086e Merge pull request #13098 from ak-piracha/feature/snipe-13049-status-label-chart-color
Fixed #13098: Status Label Chart Color, resets to default when editing a Status Label
2023-06-15 16:55:32 +01:00
snipe
6c684bccd0 Accept user ID as authoratative field for updates
Signed-off-by: snipe <snipe@snipe.net>
2023-06-15 10:02:05 +01:00
akemidx
df6b4ff349 tagging code 2023-06-14 15:51:14 -04:00
akemidx
efaed3d02c making serial number logic checked against for new imports 2023-06-14 15:32:47 -04:00
Godfrey M
ee50906e44 attempt to add warranty to api controller 2023-06-13 11:20:55 -07:00
snipe
83708e1be9 Merge remote-tracking branch 'origin/develop' 2023-06-13 18:36:22 +01:00
snipe
157a4341ea Merge pull request #13041 from snipe/features/refactor_importer_for_localization
Refactor importer for localization
2023-06-13 18:12:07 +01:00
snipe
f1bf7267f7 Merge pull request #13164 from snipe/localizations/updated_strings
Updated translation strings
2023-06-13 17:24:01 +01:00
snipe
0bb8cc63c5 Updated translation strings
Signed-off-by: snipe <snipe@snipe.net>
2023-06-13 17:12:01 +01:00
Godfrey M
fc86530c94 uses the trueFalseFormatter now 2023-06-13 09:10:42 -07:00
Godfrey M
6dd7181d09 fixed audit log image not appearing 2023-06-12 12:10:19 -07:00
Godfrey M
69325beddb adds warranty confirmation to asset maintenance table 2023-06-12 11:03:32 -07:00
Brady Wetherington
f5ff9b2208 Merge branch 'develop' into snipeit_v7 - 2023-06-12 2023-06-12 16:56:23 +01:00
snipe
d1ab139b0f Add @qay21 as a contributor 2023-06-12 14:05:43 +01:00
snipe
dc43985884 Applied #13143 to develop
Signed-off-by: snipe <snipe@snipe.net>
2023-06-12 14:05:26 +01:00
snipe
f552bcef78 Merge pull request #13143 from qay21/patch-1
Fixed #13129: Add missing LDAP lib required for LDAPS support
2023-06-12 14:04:05 +01:00
Quentin Aymard
fc6c5eadd7 Fix missing ldap packages
This should provide LDAPS support out of the box, and fix #13129
2023-06-09 11:14:41 +02:00
Lukas Jung
9fca8c2438 Fixed #12434: Include Docker Specific Paths for dompdf chroot 2023-06-09 11:00:46 +02:00
snipe
924d0b25e8 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
#	public/css/dist/all.css
#	public/js/build/app.js
#	public/js/build/vendor.js
#	public/js/dist/all.js
#	public/mix-manifest.json
2023-06-08 08:53:22 +01:00
snipe
c78c69700f Bumped hash
Signed-off-by: snipe <snipe@snipe.net>
2023-06-08 08:49:55 +01:00
snipe
4775eef392 Merge pull request #13140 from snipe/security/misc_libraries
Updated libraries and dev assets
2023-06-08 08:48:55 +01:00
snipe
14727700ab Updated libraries and dev assets
Signed-off-by: snipe <snipe@snipe.net>
2023-06-08 08:48:18 +01:00
snipe
a6b1320b39 Add @stefanstidlffg as a contributor 2023-06-08 08:11:34 +01:00
snipe
4672f6a699 Merge pull request #13139 from snipe/security/updated_webpack
Updated webpack, added new dev assets
2023-06-08 08:11:07 +01:00
snipe
03233465c7 Updated webpack, added new dev assets
Signed-off-by: snipe <snipe@snipe.net>
2023-06-08 08:10:12 +01:00
snipe
8a72056bfd Merge pull request #13123 from osterr-forschungsforderungsges-mbh/fix-slack-notifications
fix slack channel notifications
2023-06-08 05:51:08 +01:00
Marcus Moore
7672861b96 Scaffold test before removing scopeCompanyables call from DashboardController 2023-06-07 17:38:23 -07:00
Marcus Moore
6f5252449e Scaffold test before removing scopeCompanyables call from UsersController 2023-06-07 16:25:18 -07:00
Marcus Moore
0f6051bbe5 Inline method call 2023-06-07 16:18:02 -07:00
Marcus Moore
abaf59c990 Extract and use helper methods 2023-06-07 16:16:30 -07:00
Marcus Moore
27d4d107bb Scaffold test before removing scopeCompanyables call from DepartmentsController 2023-06-07 16:10:29 -07:00
Marcus Moore
8e6e525b47 Remove scopeCompanyables call from LicensesController 2023-06-07 16:09:45 -07:00
Marcus Moore
a18f5e7fc0 Remove scopeCompanyables call from ConsumablesController 2023-06-07 14:22:22 -07:00
snipe
adb2757532 Add @NojoudAlshehri as a contributor 2023-06-07 16:52:22 +01:00
snipe
b57730ee9d Added missing assets_fields declaration
Signed-off-by: snipe <snipe@snipe.net>
2023-06-07 15:52:18 +01:00
snipe
9335bf7033 Merge pull request #13122 from marcusmoore/fixes/increase-consumable-factory-name-length
Fixes potentially invalid name in consumable factory
2023-06-07 11:43:13 +01:00
snipe
45b76c4c75 Merge pull request #13127 from NojoudAlshehri/fixes/typo-in-a-html-tag
Fix of typo in an HTML tag
2023-06-07 09:21:51 +01:00
NojoudAlshehri
d06bdc2db4 Fix of typo in an HTML tag 2023-06-07 13:46:17 +07:00
Marcus Moore
48850f3597 Remove scopeCompanyables call from ComponentsController 2023-06-06 18:02:18 -07:00
Marcus Moore
4fb86ad2fb Get name as a string and not an array 2023-06-06 16:31:26 -07:00
Marcus Moore
42a4941ad2 Ensure consumable name is valid in factory 2023-06-06 16:31:26 -07:00
Marcus Moore
6585aa0cf0 Add unit tests for company scoping 2023-06-06 16:31:14 -07:00
Stefan Stidl
ad8c36a51a fix: slack channel 2023-06-06 10:30:01 +02:00
Marcus Moore
d3a0bacb98 Get name as a string and not an array 2023-06-05 12:57:09 -07:00
Marcus Moore
371d11305b Ensure consumable name is valid in factory 2023-06-05 12:17:44 -07:00
snipe
fc5b02e392 Merge remote-tracking branch 'origin/develop' 2023-06-01 19:51:49 +01:00
snipe
7ae260b489 More license translations
Signed-off-by: snipe <snipe@snipe.net>
2023-06-01 19:51:06 +01:00
snipe
ff480a7247 Merge pull request #13114 from inietov/fixes/broken_sorting_manufacturers
Fixed Broken order by manufacturer in Assets table [sc-23313]
2023-06-01 19:40:16 +01:00
Ivan Nieto Vivanco
f9a20bc917 Replace join with left join in pertinent eloquent query 2023-06-01 12:08:51 -06:00
ak-piracha
daf6bcb6d5 follow best practices when working with blade and javascript 2023-06-01 11:07:21 +09:30
snipe
18eda15ec1 Merge remote-tracking branch 'origin/develop' 2023-05-31 16:19:34 +01:00
snipe
e431cd5146 Merge pull request #13085 from inietov/fixes/checkboxes_not_holding_value
Fixed #12978 Custom Field Checkboxes not holding assigned values
2023-05-31 10:55:37 -04:00
snipe
35942361b6 Add @ak-piracha as a contributor 2023-05-31 15:51:39 +01:00
snipe
596b510a25 Merge pull request #13108 from ak-piracha/fixes/component_delete_showing_in_assest
Fixes: issue #13073: deleted component addearing in asset component t…
2023-05-31 10:50:34 -04:00
ak-piracha
1cdf089306 Fixes: issue #13073: deleted component addearing in asset component tab fixed 2023-05-31 00:11:11 +09:30
snipe
c05a4452bc Merge + update assets
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/css/build/app.css
#	public/css/build/overrides.css
#	public/css/dist/all.css
#	public/mix-manifest.json
2023-05-29 18:20:12 -04:00
snipe
13e8f91a59 Fixed typo
Signed-off-by: snipe <snipe@snipe.net>
2023-05-29 18:18:46 -04:00
ak-piracha
825a9a384d Fixed 2023-05-29 14:07:53 +09:30
NojoudAlshehri
980cb53efa Added asset_tag column in requestable assets page 2023-05-27 07:05:59 +07:00
snipe
60d2046b6d Updated dev assets
Signed-off-by: snipe <snipe@snipe.net>
2023-05-24 16:13:33 -07:00
snipe
67e0eb3193 Merge pull request #13046 from Godmartinz/asset_info_overflow
Added Asset info overflow-wrap
2023-05-24 16:13:01 -07:00
snipe
44cbb0c2e9 Merge branch 'develop' into asset_info_overflow 2023-05-24 16:11:34 -07:00
snipe
a3a64be19b Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/css/build/app.css
#	public/css/build/overrides.css
#	public/css/dist/all.css
#	public/mix-manifest.json
2023-05-24 16:06:26 -07:00
snipe
fb5e33c50f Updated hash
Signed-off-by: snipe <snipe@snipe.net>
2023-05-24 16:03:15 -07:00
snipe
d7f4fa146b Updated dev assets
Signed-off-by: snipe <snipe@snipe.net>
2023-05-24 16:02:28 -07:00
snipe
064dbdd3d4 Fixed missing brace from conflict
Signed-off-by: snipe <snipe@snipe.net>
2023-05-24 16:02:23 -07:00
snipe
cc07921608 Updated dev assets
Signed-off-by: snipe <snipe@snipe.net>
2023-05-24 15:59:52 -07:00
snipe
267a0ffc59 Merge pull request #13077 from Godmartinz/fix_unclickable_nav_bar_and_notifcation_block
fixes mobile nav bar and notification position
2023-05-24 15:58:27 -07:00
snipe
9086cb5310 Merge branch 'develop' into fix_unclickable_nav_bar_and_notifcation_block 2023-05-24 15:56:01 -07:00
Ivan Nieto Vivanco
f4947bfa93 Use trim() function when format the custom field values as array 2023-05-24 04:06:31 -06:00
snipe
5e96fd200f Refactor to remove general_fields
Signed-off-by: snipe <snipe@snipe.net>
2023-05-23 20:31:53 -07:00
snipe
d020825a17 Renamed import samples
Signed-off-by: snipe <snipe@snipe.net>
2023-05-23 19:31:42 -07:00
snipe
3ef081e739 Indenting
Signed-off-by: snipe <snipe@snipe.net>
2023-05-23 19:28:42 -07:00
snipe
47fa490e8a More translations
Signed-off-by: snipe <snipe@snipe.net>
2023-05-23 19:28:23 -07:00
snipe
01768bf649 Renamed sample csv
Signed-off-by: snipe <snipe@snipe.net>
2023-05-23 19:23:29 -07:00
snipe
52cf54d211 New assets CSV
Signed-off-by: snipe <snipe@snipe.net>
2023-05-23 19:22:08 -07:00
snipe
55683c29dc Removed method that does the same return
Signed-off-by: snipe <snipe@snipe.net>
2023-05-23 19:22:00 -07:00
snipe
f355a6e9e1 Added first name and last name
Signed-off-by: snipe <snipe@snipe.net>
2023-05-23 19:21:31 -07:00
snipe
3e4426c68c Clearer comments
Signed-off-by: snipe <snipe@snipe.net>
2023-05-23 19:20:52 -07:00
snipe
2e5486a62e Merge pull request #13076 from marcusmoore/fixes/allow-multi-column-search-in-sqlite
Dynamically adapt concatenation searches for MySQL and sqlite
2023-05-23 16:27:12 -07:00
Marcus Moore
0a3d46824e Automatically add table prefixes when building multi-column search string 2023-05-23 15:58:58 -07:00
snipe
f69caf77e5 Updated dev assets
Signed-off-by: snipe <snipe@snipe.net>
2023-05-23 14:57:57 -07:00
snipe
61d5bd8567 Removed comment
Signed-off-by: snipe <snipe@snipe.net>
2023-05-23 14:57:15 -07:00
snipe
80e8022c76 Merge pull request #13044 from Godmartinz/bug/sc-23260_multi_select_example_text
Bug/sc 23260 multi select example text
2023-05-23 14:45:55 -07:00
Marcus Moore
6300909fee Add test for searching for user's first and last name 2023-05-23 13:39:01 -07:00
Marcus Moore
b2b6f0cf96 Use new dynamic scope where possible 2023-05-23 13:38:50 -07:00
Marcus Moore
054d71aedc Add docblock 2023-05-23 13:37:04 -07:00
Marcus Moore
9078d4c71c Add dynamic scope for prettier multiple column search 2023-05-23 13:35:19 -07:00
snipe
d4c5a4eb2e More aliases
Signed-off-by: snipe <snipe@snipe.net>
2023-05-23 13:18:32 -07:00
snipe
35794c8ba2 More translations
Signed-off-by: snipe <snipe@snipe.net>
2023-05-23 12:57:48 -07:00
snipe
62384260bc Clarifying comment
Signed-off-by: snipe <snipe@snipe.net>
2023-05-23 12:57:40 -07:00
snipe
f2e9b41199 More user fields in asset importer
Signed-off-by: snipe <snipe@snipe.net>
2023-05-23 12:57:34 -07:00
snipe
479350ed7b Removed unneeded mapping file
Signed-off-by: snipe <snipe@snipe.net>
2023-05-23 12:57:24 -07:00
Godfrey M
68a43cb590 fixes mobile nav bar and notification position 2023-05-23 12:43:32 -07:00
snipe
809dcdc50c Updated CSVs
Signed-off-by: snipe <snipe@snipe.net>
2023-05-23 12:13:17 -07:00
snipe
d0f5a044ba More refactoring
Signed-off-by: snipe <snipe@snipe.net>
2023-05-23 12:13:06 -07:00
Marcus Moore
05a2e568d7 Add comment 2023-05-23 11:37:09 -07:00
snipe
fbed18a984 Merge pull request #13075 from inietov/fixes/api_incorrect_remaining_accessories
Fixed #13074 [API] Remaining accessories quantity not correct
2023-05-23 11:08:37 -07:00
Ivan Nieto Vivanco
086265455d Pass user count to the eloquent query 2023-05-23 11:53:09 -06:00
Marcus Moore
f40e722397 Add docblock 2023-05-22 17:44:17 -07:00
Marcus Moore
50234bc9a5 Formatting 2023-05-22 17:40:06 -07:00
Marcus Moore
9b512648a3 Update searchRelations in Searchable trait 2023-05-22 17:33:19 -07:00
Marcus Moore
64e83ed9f5 Update scopeAssignedSearch in Asset 2023-05-22 16:54:54 -07:00
snipe
0c7acd6a3b Merge pull request #13070 from inietov/fixes/accessory_image_shown_when_disabled
Fixed #12947 Accessory image in checkin email when Show images in emails is disabled
2023-05-22 15:30:14 -07:00
Ivan Nieto Vivanco
6df9a33eab Add a condition to check if images should be shown in notification 2023-05-22 16:24:16 -06:00
snipe
f9449aa81f Merge pull request #13069 from marcusmoore/fixes/add-eager-load-to-asset-model-endpoint
Add eager loading to Asset Models controller
2023-05-22 14:39:32 -07:00
Marcus Moore
a6eeae6541 Eager load fieldset default values in asset model endpoint 2023-05-22 14:19:03 -07:00
snipe
b2d922f127 New user import sample CSV
Signed-off-by: snipe <snipe@snipe.net>
2023-05-22 13:20:20 -07:00
snipe
96e86501ad Additional alias fields
Signed-off-by: snipe <snipe@snipe.net>
2023-05-22 13:20:08 -07:00
snipe
4dfe6f0a28 Added gravatar, avatar, start_date and end_date to user importer
Signed-off-by: snipe <snipe@snipe.net>
2023-05-22 13:19:57 -07:00
ak-piracha
457f4c410a add check for default consumable qty 2023-05-21 23:11:03 +09:30
ak-piracha
bb013d5c3c Bulk Consumable Checkout 2023-05-21 22:49:00 +09:30
snipe
511d83cc47 Added/fixed a few more translations
Signed-off-by: snipe <snipe@snipe.net>
2023-05-20 14:52:42 -07:00
snipe
2171d8c83c Removed requestable field in sample consumable CSV
Signed-off-by: snipe <snipe@snipe.net>
2023-05-20 14:52:28 -07:00
snipe
0ea29a0224 Updated translations
Signed-off-by: snipe <snipe@snipe.net>
2023-05-20 14:21:36 -07:00
snipe
18bedb736e Removed item number, since not everything will have it
Signed-off-by: snipe <snipe@snipe.net>
2023-05-20 14:21:29 -07:00
snipe
1396e314c4 Updated arrays with translations
Signed-off-by: snipe <snipe@snipe.net>
2023-05-20 14:21:13 -07:00
snipe
b75109dcac Added component mapping switch
Signed-off-by: snipe <snipe@snipe.net>
2023-05-20 14:20:49 -07:00
snipe
b7149d8339 Added translation
Signed-off-by: snipe <snipe@snipe.net>
2023-05-20 14:20:38 -07:00
Marcus Moore
2d86c8f030 Update advancedTextSearch methods in Asset and User models 2023-05-18 17:06:41 -07:00
Marcus Moore
3a9670930d Define required fields in Custom Field seeder so sqlite can be seeded 2023-05-18 13:17:35 -07:00
Marcus Moore
85974c7f65 Apply formatting 2023-05-18 13:16:52 -07:00
Marcus Moore
ffbde46180 Simplify sqlite query 2023-05-18 13:06:50 -07:00
Marcus Moore
d8d672c4c1 Move multiple column search function to Searchable trait 2023-05-18 13:05:40 -07:00
Marcus Moore
9cb0decf35 Adapt multiple column search based on database driver 2023-05-18 12:54:00 -07:00
Brady Wetherington
a9c7dbd17a Shift PHP version requiremeents for Snipe-IT v7 to be php 8.0-8.2 2023-05-17 17:51:02 -07:00
Brady Wetherington
09fdc946a0 Merge branch 'develop' into snipeit_v7
Had to do some asset rebuilds, and a composer update
2023-05-17 17:37:10 -07:00
Godfrey M
608d07d03c adds overflow-wrap to asset info table 2023-05-17 13:08:53 -07:00
Godfrey M
addd806653 testing overflow solutions 2023-05-17 10:47:50 -07:00
Godfrey M
fe60309dfd adds padding to multi select2 inputs 2023-05-17 10:19:25 -07:00
akemidx
deca80ba71 checkin/out info on side bar 2023-05-17 13:17:48 -04:00
Godfrey M
448472b6d3 testing input paddings 2023-05-17 09:45:45 -07:00
snipe
f1b4bba3ae Merge remote-tracking branch 'origin/develop' 2023-05-16 23:12:41 -07:00
snipe
2c4c9a16c9 Refactored the static arrays into mount arrays for translations
Signed-off-by: snipe <snipe@snipe.net>
2023-05-16 22:31:58 -07:00
snipe
d228b7f347 Remove 99% of the defaultMap stuff (might pull all of this later)
Signed-off-by: snipe <snipe@snipe.net>
2023-05-16 22:31:01 -07:00
snipe
7012018e22 Removed todo
Signed-off-by: snipe <snipe@snipe.net>
2023-05-16 22:30:17 -07:00
snipe
13c6a7f89b Merge pull request #13039 from snipe/features/add_eol_date_to_importer
Added EOL date to importer
2023-05-16 20:12:10 -07:00
snipe
3296716dfa Added EOL date to importer
Signed-off-by: snipe <snipe@snipe.net>
2023-05-16 19:06:35 -07:00
snipe
dbae01f545 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/css/dist/skins/skin-red-dark.css
#	public/css/dist/skins/skin-red-dark.min.css
#	public/mix-manifest.json
2023-05-16 17:41:39 -07:00
snipe
c4876865cf Updated dev assets
Signed-off-by: snipe <snipe@snipe.net>
2023-05-16 17:36:58 -07:00
snipe
3cbb4620c3 Merge pull request #13008 from Godmartinz/importer_happy_changes
Added standardized colors to the importer
2023-05-16 17:26:32 -07:00
snipe
5a1e6c8e29 Merge pull request #13003 from marcusmoore/chipper-config-updates
Disable browser tests in ChipperCI
2023-05-16 17:26:09 -07:00
snipe
f1575d2020 Merge pull request #13024 from Godmartinz/adds_localization_to_checkout_notif
adds translation to checkout notification
2023-05-16 17:25:50 -07:00
snipe
71234228b4 Merge pull request #13025 from Godmartinz/archived_clears_assigned_to
removes assigned_to if archived
2023-05-16 17:25:24 -07:00
snipe
5be993df8d Merge remote-tracking branch 'origin/develop' 2023-05-16 16:42:17 -07:00
snipe
4ca914d773 Merge pull request #13038 from uberbrady/fix_asset_checkout_on_update
Importer fix for non-Location imports
2023-05-16 16:41:27 -07:00
Brady Wetherington
2eb34d423f Importer fix for non-Location imports 2023-05-16 16:33:07 -07:00
snipe
37f75c5001 Merge remote-tracking branch 'origin/develop' 2023-05-16 16:29:36 -07:00
snipe
b9b9eb86d9 Merge pull request #13036 from snipe/features/multiselect_locations_custom_report
Added multi-select option for location, more to custom report
2023-05-16 16:29:13 -07:00
snipe
9e4e9cc708 Merge pull request #13037 from snipe/fixes/actions_text
Uses actions text in backups table
2023-05-16 16:06:05 -07:00
snipe
fe92667812 Use actions text in backups table
Signed-off-by: snipe <snipe@snipe.net>
2023-05-16 16:02:48 -07:00
snipe
02cacf76c6 Additional multi-select options for custom report
Signed-off-by: snipe <snipe@snipe.net>
2023-05-16 13:58:21 -07:00
Godfrey M
8e3cbdad90 removes assigned_to if archived 2023-05-15 11:52:57 -07:00
Godfrey M
46d6783fc5 adds translation to checkout notification 2023-05-15 09:01:30 -07:00
akemidx
ba4fc146e2 Merge branch 'delete_asset_from_view_page' of https://github.com/akemidx/snipe-it into delete_asset_from_view_page 2023-05-10 19:30:11 -04:00
akemidx
1916594d27 fixing translation 2023-05-10 19:16:11 -04:00
Godfrey M
763176c86b standardizes the importer colors no matter the theme 2023-05-10 14:52:08 -07:00
snipe
0f3b77ee2d Added multi-select option to custom report
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 14:45:31 -07:00
snipe
869d195b35 Merge pull request #13007 from snipe/fixes/multiselect_company
Fixed multiselect for companies
2023-05-10 13:17:36 -07:00
snipe
a49257ad4b Wrong eval
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 13:16:59 -07:00
snipe
c6eef86661 Fixed multiselect for companies
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 13:15:22 -07:00
snipe
71c7c82398 Merge pull request #13006 from snipe/fixes/12831_array_for_company_id
Fixes PR #12831 use array bracket for multi select company
2023-05-10 12:36:59 -07:00
snipe
23e3d18931 Used brackets for multiselect company
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 12:35:30 -07:00
slong753
5e34ffa2b0 wip 2023-05-10 14:08:12 -05:00
snipe
5f6e528560 Merge branch 'develop' of https://github.com/snipe/snipe-it into develop 2023-05-10 11:36:28 -07:00
snipe
9f39d71f16 Merge pull request #12831 from Godmartinz/adds_multi_select_to_custom_report
Added Multiselect of companies for custom reports
2023-05-10 11:36:21 -07:00
snipe
4c78b49b97 Add @vikaas-cyper as a contributor 2023-05-10 11:31:26 -07:00
snipe
b1fda46e11 Production assets
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 11:25:28 -07:00
snipe
6b7a7b8aee Merge remote-tracking branch 'origin/develop' 2023-05-10 11:23:29 -07:00
snipe
aca287d28c Merge pull request #13004 from snipe/security/upgrade_webpack
Updated webpack, new asset files
2023-05-10 11:23:02 -07:00
snipe
1f5e4309fa Updated webpack, new asset files
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 11:20:06 -07:00
Marcus Moore
a1a11d788f Disable browser tests in ChipperCI 2023-05-10 11:06:05 -07:00
snipe
63c660f306 Merge pull request #12999 from snipe/develop
Google Oauth Recap
2023-05-10 10:01:23 -07:00
snipe
b8a59cc2d8 Merge branch 'master' into develop 2023-05-10 09:32:26 -07:00
snipe
04aedce47e Bumped hash
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 09:29:42 -07:00
snipe
d648e9a01c Added Google test user
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 09:13:34 -07:00
snipe
7c77f4a697 Extra debugging
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 09:10:53 -07:00
akemidx
537aa04c9a Merge branch 'develop' into delete_asset_from_view_page 2023-05-10 09:30:54 -04:00
snipe
27e0484072 I lied. Missed one
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 03:12:22 -07:00
snipe
ec76de607b Final google login tweaks
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 03:08:29 -07:00
snipe
14da8934c5 Few more login page tweaks
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 02:53:11 -07:00
snipe
ed370a0104 Added translations
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 02:47:28 -07:00
snipe
b99640ecb2 Added ends_with validation message
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 02:40:55 -07:00
snipe
8bad72a80f Added validation on google client ID
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 02:40:45 -07:00
snipe
f3c977aa9d Nicer button
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 02:37:01 -07:00
snipe
788c03ef57 Hide client secret if app is locked
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 02:22:49 -07:00
snipe
3c00f68bda Added translation string for google auth failure
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 02:18:50 -07:00
snipe
7062583710 Check for http or https in avatar value
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 02:18:38 -07:00
snipe
2dd32d8785 Re-add the image update
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 02:18:27 -07:00
snipe
ff66a938c1 Clearer comments
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 02:18:15 -07:00
snipe
7f0e677908 Use normal translation style
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 02:18:05 -07:00
snipe
e8a0c7f2ce Remove avatar update, since we don’t take URLs for that
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 01:59:33 -07:00
snipe
e950cf4279 Switch to using username as match for google login
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 01:58:36 -07:00
snipe
567a800c51 Added debugging
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 01:47:52 -07:00
snipe
e5eb5932ca Create constructor to override expected config variables
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 01:37:03 -07:00
snipe
a90fc1ab59 Merge pull request #12994 from snipe/features/google_socialite
Google OAuth login
2023-05-10 01:23:37 -07:00
snipe
3612526632 Disallow saving data if app is locked
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 01:14:54 -07:00
snipe
1ef4ea6381 Very ugly login shim just to test functionality
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 01:14:31 -07:00
snipe
37bc47290c Disabled fields in demo mode
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 01:12:55 -07:00
snipe
4da40792ea Use google logo
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 01:08:28 -07:00
snipe
63bf93b786 Pulled redirect from settings
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 00:56:04 -07:00
snipe
f57e39191d Added google settings blade
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 00:55:16 -07:00
snipe
6ab214d3a6 Added google option to settings index
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 00:55:04 -07:00
snipe
3fb5188037 Removed redirect option
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 00:54:46 -07:00
snipe
aefd330e4e Added methods for google settings
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 00:54:28 -07:00
snipe
b7e8ce3064 Changed redirect
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 00:54:14 -07:00
snipe
b183e53c45 Added settings routes for google auth
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 00:34:48 -07:00
snipe
054a2ab9d4 Add validation and fillable fields
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 00:34:31 -07:00
snipe
bc9b47c46d Removed env dependency, switched to DB
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 00:27:47 -07:00
snipe
72d1c08fbc Added migration
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 00:21:17 -07:00
snipe
c52b48c383 Google oauth login
Signed-off-by: snipe <snipe@snipe.net>
2023-05-10 00:14:28 -07:00
snipe
11cd875c6d Merge remote-tracking branch 'origin/develop' 2023-05-09 22:42:45 -07:00
snipe
a1ec8cf490 Merge pull request #12993 from snipe/fixes/checkbox_layout_in_ldap
Tightened up some layout issues, checkbox issues in LDAP settings
2023-05-09 22:37:49 -07:00
snipe
0680405f4d Tightened up some layout issues, checkbox issues in LDAP settings
Signed-off-by: snipe <snipe@snipe.net>
2023-05-09 22:34:46 -07:00
slong753
9a4ba78c19 oops, pattern 2023-05-09 23:41:21 -05:00
slong753
491f670215 I think this is what they're looking for 2023-05-09 22:52:00 -05:00
snipe
cbe70c9cc1 Merge remote-tracking branch 'origin/develop' 2023-05-09 20:14:44 -07:00
snipe
6a7bab453f Made spacing more compact
Signed-off-by: snipe <snipe@snipe.net>
2023-05-09 20:14:00 -07:00
snipe
7412bc32e2 Merge pull request #12991 from snipe/fixes/accessories_view
Fixed width of columns in details
2023-05-09 20:11:36 -07:00
snipe
ec4697fd3e Merge remote-tracking branch 'origin/develop' 2023-05-09 19:45:10 -07:00
snipe
5a461d62bc Merge pull request #12990 from snipe/fixes/12881_missing_icon
Added icon field back into assets page
2023-05-09 19:44:30 -07:00
snipe
999dc3c358 Added icon field back into assets page
Signed-off-by: snipe <snipe@snipe.net>
2023-05-09 19:43:37 -07:00
snipe
a10652797f Fixed width of columns in details
Signed-off-by: snipe <snipe@snipe.net>
2023-05-09 19:42:32 -07:00
snipe
090cbab60e Merge pull request #12989 from marcusmoore/chipper-ci
Add ChipperCI configuration
2023-05-09 18:09:23 -07:00
Marcus Moore
1e7986d75b Limit ChipperCI to running on push to master or develop 2023-05-09 16:39:56 -07:00
snipe
a43dea3c04 Merge remote-tracking branch 'origin/develop' 2023-05-09 16:29:53 -07:00
Marcus Moore
1f11a8a2c1 Configure Dusk for ChipperCI 2023-05-09 14:45:18 -07:00
Marcus Moore
8d205e80e5 Add ejected pipeline configuration for ChipperCI 2023-05-09 14:44:43 -07:00
snipe
2d5da67b1e Merge pull request #12982 from akemidx/feature/sc-23214
Buttons on the Accessory View Page
2023-05-09 14:26:28 -07:00
slong753
1d2596fc54 wip 2023-05-09 14:58:59 -05:00
snipe
7dd41aa574 Removed whitespace
Signed-off-by: snipe <snipe@snipe.net>
2023-05-08 15:49:12 -07:00
snipe
c4d40cdbd4 Merge remote-tracking branch 'origin/develop' 2023-05-08 15:11:25 -07:00
snipe
b76c5206ff Merge pull request #12986 from snipe/features/import_backup_filename
Pass filename to pre-import backup
2023-05-08 15:08:59 -07:00
snipe
17efc78816 Merge pull request #12985 from snipe/fixes/increase_state_from_3_chars
Increase state from 3 chars
2023-05-08 15:08:44 -07:00
snipe
332b017dcc Pass filename for manual backups
Signed-off-by: snipe <snipe@snipe.net>
2023-05-08 15:00:02 -07:00
snipe
5960a5425d Pass filename to pre-import backup
Signed-off-by: snipe <snipe@snipe.net>
2023-05-08 14:48:26 -07:00
snipe
277618bf16 Added maxlenth to form fields
Signed-off-by: snipe <snipe@snipe.net>
2023-05-08 14:13:24 -07:00
snipe
f84f4ffe99 Migration to embiggen state fields
Signed-off-by: snipe <snipe@snipe.net>
2023-05-08 14:13:06 -07:00
snipe
f1d85c67f1 Make validation match database fields
Signed-off-by: snipe <snipe@snipe.net>
2023-05-08 14:12:54 -07:00
snipe
6cb6beb6c7 Merge remote-tracking branch 'origin/develop' 2023-05-08 13:21:43 -07:00
snipe
6486ea4fb7 Merge pull request #12976 from inietov/fixes/validate_soft-deleted_models_in_asset_model
Refactor of #12955
2023-05-08 13:14:02 -07:00
snipe
d685335aea Merge pull request #12975 from inietov/fixes/import_asset_notes
Fixed Notes field doesn't get populate when creating/updating assets via Importer [sc-23222]
2023-05-08 13:11:50 -07:00
snipe
d70e14de61 Merge pull request #12972 from marcusmoore/bug/sc-23177
Fixes user name missing in accessory acceptance notifications
2023-05-08 13:04:37 -07:00
snipe
480ef23505 Merge remote-tracking branch 'origin/develop' 2023-05-08 12:44:01 -07:00
snipe
4503815ad7 Merge pull request #12984 from snipe/features/check_for_zip_in_backup_filename
Check that the filename we pass ends in zip, add it if not
2023-05-08 12:43:34 -07:00
snipe
ba462d1e93 Check that the filename we pass ends in zip, add it if not
Signed-off-by: snipe <snipe@snipe.net>
2023-05-08 12:41:32 -07:00
snipe
3429d1f4b4 Merge remote-tracking branch 'origin/develop' 2023-05-08 12:22:22 -07:00
snipe
0f76eda4af Merge pull request #12983 from snipe/features/add_optional_filename_to_backup_artisan
Add optional filename to backup
2023-05-08 12:21:55 -07:00
snipe
85243423cf Add optional filename to backup
Signed-off-by: snipe <snipe@snipe.net>
2023-05-08 12:20:43 -07:00
snipe
a73205f228 Merge remote-tracking branch 'origin/develop' 2023-05-08 11:24:03 -07:00
snipe
06ffe64f62 Merge pull request #12981 from snipe/fixes/wonky_div_when_saml_disabled
Fixed misplaced div when saml is disabled
2023-05-08 11:22:54 -07:00
snipe
223ff5e97e Fixed misplaced div when saml is disabled
Signed-off-by: snipe <snipe@snipe.net>
2023-05-08 11:20:26 -07:00
snipe
fe40902765 Merge remote-tracking branch 'origin/develop' 2023-05-06 06:37:29 -07:00
snipe
689ef433b3 Merge pull request #12979 from snipe/fixes/added_use_for_fieldsets_controller
Added missing use statement
2023-05-06 06:37:01 -07:00
snipe
8b73fa0053 Added missing use statement
Signed-off-by: snipe <snipe@snipe.net>
2023-05-06 06:36:09 -07:00
snipe
3d345d15ac Merge remote-tracking branch 'origin/develop' 2023-05-04 11:01:15 -07:00
snipe
4efa84270a Merge pull request #12974 from snipe/fixes/show_sig_column_regardless_of_sig_status
Show signature column in asset history regardless of “require sig” state
2023-05-04 11:00:51 -07:00
snipe
60515f1262 Show signature column regardless of “require sig” state
Signed-off-by: snipe <snipe@snipe.net>
2023-05-04 10:56:35 -07:00
Ivan Nieto Vivanco
fbb7c55450 Tweak 'exist' rule in Asset->model_id field so it ignores soft-deleted models 2023-05-04 03:12:36 -06:00
Ivan Nieto Vivanco
89fbd60d97 Restore the 'Asset Notes' and 'Model Notes' in the Map Asset Import Fields form 2023-05-04 02:00:04 -06:00
Marcus Moore
96c6d8896f Add additional information to acceptance notifications for assets, accessories, and consumables 2023-05-03 17:04:01 -07:00
Marcus Moore
9efe13bb5e Capitalize "declined" in acceptance in notification 2023-05-03 17:03:22 -07:00
Marcus Moore
4a0b3efd1f Include user's name in Acceptance result notifications for accessories 2023-05-03 14:22:05 -07:00
Marcus Moore
f96d8fe674 Add CheckoutAcceptance factory 2023-05-03 14:21:13 -07:00
snipe
5950ec27ab Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	config/version.php
#	public/css/build/app.css
#	public/css/build/overrides.css
#	public/css/dist/all.css
#	public/css/dist/skins/skin-black-dark.css
#	public/css/dist/skins/skin-black-dark.min.css
#	public/css/dist/skins/skin-blue-dark.css
#	public/css/dist/skins/skin-blue-dark.min.css
#	public/css/dist/skins/skin-green-dark.css
#	public/css/dist/skins/skin-green-dark.min.css
#	public/css/dist/skins/skin-orange-dark.css
#	public/css/dist/skins/skin-orange-dark.min.css
#	public/css/dist/skins/skin-red-dark.css
#	public/css/dist/skins/skin-red-dark.min.css
#	public/css/dist/skins/skin-yellow-dark.css
#	public/css/dist/skins/skin-yellow-dark.min.css
#	public/mix-manifest.json
2023-05-03 13:49:36 -07:00
snipe
cd6f6ee8ff Bumped version to 6.1.1-pre
Signed-off-by: snipe <snipe@snipe.net>
2023-05-03 13:47:46 -07:00
akemidx
526c089424 Buttons on the accessory view page 2023-05-03 16:40:06 -04:00
akemidx
67105528d1 Buttons on the accessory view page 2023-05-03 16:31:56 -04:00
akemidx
12f0c42545 buttons added 2023-05-03 16:31:56 -04:00
slong753
815c77f943 wip 2023-05-03 14:49:31 -05:00
snipe
fe710efb40 Merge pull request #12874 from Godmartinz/feature/sc-23130
Adds a checkout range for custom asset reports
2023-05-03 11:43:44 -07:00
snipe
fc53b56481 Merge pull request #12955 from inietov/fixes/error_500_after_sign_and_accept_asset
Fixed Error 500 after sign and accept asset
2023-05-03 11:43:14 -07:00
akemidx
889be83762 replacing route. sorry! 2023-05-03 14:14:18 -04:00
snipe
b716f9f55e Merge pull request #12916 from snipe/features/auto_add_to_fieldset
Added ability to auto-add fields to new fieldsets
2023-05-03 11:04:33 -07:00
snipe
ea17fdeba5 Merge pull request #12846 from snipe/features/livewire_location_import
Location importer via Livewire Importer
2023-05-03 11:02:06 -07:00
snipe
f5cd58e9b7 Unmix return type variables
Signed-off-by: snipe <snipe@snipe.net>
2023-05-03 10:57:02 -07:00
snipe
da4841987e Use translation string
Signed-off-by: snipe <snipe@snipe.net>
2023-05-03 10:55:30 -07:00
snipe
4a643c1252 Merge pull request #12880 from Godmartinz/asset_total_cost
Added component costs to asset view
2023-05-03 10:49:03 -07:00
snipe
cdbd68012f Merge pull request #12878 from joelpittet/patch-2
Use environment variable and default to PHP's sendmail_path
2023-05-03 10:48:39 -07:00
snipe
577fff7d65 Updated dev assets
Signed-off-by: snipe <snipe@snipe.net>
2023-05-03 10:45:36 -07:00
snipe
79a27085c9 Merge branch 'develop' of https://github.com/snipe/snipe-it into develop 2023-05-03 10:43:45 -07:00
snipe
27600e1553 Snyk webpack upgrade
Signed-off-by: snipe <snipe@snipe.net>
2023-05-03 10:43:05 -07:00
snipe
914b2658cc Merge pull request #12943 from marcusmoore/fixes/avoid-loading-unused-models-for-report
Remove the loading of asset maintenances that are not used by view
2023-05-03 10:41:52 -07:00
snipe
6a12d5d9a0 Merge pull request #12964 from marcusmoore/fixes/restrict-php-version
Restrict PHP version to <8.2
2023-05-03 10:40:52 -07:00
snipe
31f1bce16b Merge pull request #12958 from uberbrady/snipeit_v7_merge_develop_05_01_2022
Snipeit v7 merge develop 05 01 2022
2023-05-03 10:40:18 -07:00
snipe
466c2fd47c Merge pull request #12966 from Godmartinz/bug/sc-23161
fixed color differences in dark themes
2023-05-03 10:38:54 -07:00
slong753
cdda4a56d8 aha, ok thisd kind of works 2023-05-02 19:11:43 -05:00
slong753
b2c2097e8b just more troubleshooting stuff, still no solution 2023-05-02 18:54:20 -05:00
Godfrey M
87d1a82e35 moar changes to red 2023-05-02 15:15:02 -07:00
Godfrey M
1d494252ef corrections for dark red 2023-05-02 14:05:29 -07:00
Godfrey M
786e8deb91 removed dead space 2023-05-02 13:54:14 -07:00
Godfrey M
0a3cb5286d fixes dark red 2023-05-02 12:37:05 -07:00
Godfrey M
f91e76e0f2 fixes dark blue and btn-warning bg 2023-05-02 12:33:40 -07:00
Godfrey M
af2f288286 fixes dark orange theme 2023-05-02 12:17:22 -07:00
Godfrey M
5de30db0a9 fixes dark green theme 2023-05-02 12:10:55 -07:00
Marcus Moore
48ef8443f5 Restrict PHP to >=7.4.3 <8.2 2023-05-02 12:01:09 -07:00
Godfrey M
47370da924 adds fixes to dark black theme 2023-05-02 11:08:37 -07:00
Brady Wetherington
2f3ddaec20 Merge branch 'develop' into snipeit_v7 2023-05-01 18:09:12 -07:00
snipe
7cd37e6e95 Merge pull request #12957 from uberbrady/fix_webpack_for_v7
Fix webpack for v7
2023-05-01 18:08:46 -07:00
Brady Wetherington
a938009074 Rebuilt assets with new Node and node_modules and package.json 2023-05-01 18:06:51 -07:00
Brady Wetherington
21d08ff742 Whoops! Forgot to commit this before 2023-05-01 18:05:06 -07:00
snipe
da8b41b12a Merge pull request #12956 from uberbrady/upgrade_node_and_packages_for_v7
Updated Node version, and various packages to more recent
2023-05-01 17:33:20 -07:00
Brady Wetherington
6e031727fa Updated Node version, and various packages to more recent 2023-05-01 17:05:10 -07:00
akemidx
2cb1545b83 removing route 2023-05-01 19:51:52 -04:00
snipe
63af17da74 Merge pull request #12954 from marcusmoore/fixes/test-suite-fixes
Clear the settings cache on app destruction
2023-05-01 16:28:47 -07:00
Godfrey M
7711938f4b fixes dark yellow 2023-05-01 16:27:21 -07:00
Marcus Moore
f7d2b62d87 Improve method name 2023-05-01 16:06:28 -07:00
Marcus Moore
da08f6ef8c Add InteractsWithSettings trait to required tests 2023-05-01 16:05:26 -07:00
Marcus Moore
6d594faae7 Clear the settings cache on app destruction 2023-05-01 16:04:43 -07:00
Ivan Nieto Vivanco
6936d76661 Prevent hard fail when retrieving acceptance data 2023-05-01 16:50:18 -06:00
Ivan Nieto Vivanco
1b2d830380 Check if model exists before create asset via API 2023-05-01 16:05:03 -06:00
akemidx
ad7a1d6c3b edits from Github comments 2023-05-01 15:50:48 -04:00
snipe
609b1646e9 Merge remote-tracking branch 'origin/develop' 2023-04-30 18:40:52 -07:00
snipe
031c9c1204 Added nobr tag to prevent external link icon and link from breaking
Signed-off-by: snipe <snipe@snipe.net>
2023-04-30 18:40:40 -07:00
snipe
77b51136cf Merge remote-tracking branch 'origin/develop' 2023-04-30 18:38:19 -07:00
snipe
0222a922a1 Added tooltip
Signed-off-by: snipe <snipe@snipe.net>
2023-04-30 18:20:23 -07:00
snipe
8ad600085a Moved external link icon into link
Signed-off-by: snipe <snipe@snipe.net>
2023-04-30 18:17:56 -07:00
snipe
7fdbc10122 Merge remote-tracking branch 'origin/develop' 2023-04-29 13:49:14 -07:00
snipe
4c27b65d45 Merge pull request #12950 from snipe/fixes/warranty_lookup_validation
Fixed  #12946 - warranty lookup url was not nullable
2023-04-29 13:48:54 -07:00
snipe
aa814cf761 Fixed #12946 - warranty lookup url was not nullable
Signed-off-by: snipe <snipe@snipe.net>
2023-04-29 13:47:52 -07:00
Marcus Moore
3cae32b236 Eager load default locations 2023-04-27 17:13:09 -07:00
Marcus Moore
429c4cb99f Remove the loading of asset maintenances that are not used by view 2023-04-27 17:12:53 -07:00
snipe
e250d4c884 Merge remote-tracking branch 'origin/develop' 2023-04-27 17:00:29 -07:00
snipe
8b476e55b6 Merge pull request #12941 from akemidx/feature/sc-23153
Created At and Updated At fields on License table view
2023-04-27 16:59:30 -07:00
snipe
b76d2973f7 Merge pull request #12928 from snipe/features/make_hashing_work_rounds_an_env
Env-ify hashing variables, setting the normal defaults
2023-04-27 16:57:45 -07:00
snipe
b001f6771d Merge remote-tracking branch 'origin/develop' 2023-04-27 16:28:42 -07:00
snipe
956bc41e48 Merge pull request #12942 from snipe/bug/sc-23197
Added missing case for licenses for item_count
2023-04-27 16:28:12 -07:00
snipe
567e19bcc0 Added missing case for licenses for item_count
Signed-off-by: snipe <snipe@snipe.net>
2023-04-27 16:26:50 -07:00
akemidx
67a2b796a4 requested edits 2023-04-27 19:19:53 -04:00
akemidx
1c60d686bd Merge remote-tracking branch 'origin/delete_asset_from_view_page' into delete_asset_from_view_page
# Conflicts:
#	resources/views/hardware/view.blade.php
2023-04-27 19:08:51 -04:00
akemidx
cd389368f7 adding in script 2023-04-27 19:00:17 -04:00
akemidx
d3675831bb snippet rewrite 2023-04-27 18:58:59 -04:00
akemidx
84134b45e6 form work 2023-04-27 18:58:59 -04:00
akemidx
b1e68be545 delete button progress 2023-04-27 18:58:59 -04:00
akemidx
d94bed3f57 push for testing 2023-04-27 18:58:59 -04:00
akemidx
aabcf22b40 commiting 2023-04-27 18:58:59 -04:00
akemidx
af549a0be9 Mock Up of the Buttons 2023-04-27 18:58:59 -04:00
Brady Wetherington
381890b578 Merge branch 'develop' into laravel_v9 2023-04-27 13:56:04 -07:00
snipe
1384ca658a Merge remote-tracking branch 'origin/develop' 2023-04-26 18:42:58 -07:00
snipe
e25dc42121 Switch to externalLinkFormatter
Signed-off-by: snipe <snipe@snipe.net>
2023-04-26 18:42:34 -07:00
snipe
dcb7eadfc7 Merge pull request #12933 from snipe/features/unlink_dynamic_urls_if_variables_used
Remove auto-link from from manufacturer warranty
2023-04-26 18:40:33 -07:00
snipe
99ef435d40 Fixed translation
Signed-off-by: snipe <snipe@snipe.net>
2023-04-26 18:32:38 -07:00
snipe
e853f8b7fd Removed SR text for exporting
Signed-off-by: snipe <snipe@snipe.net>
2023-04-26 18:23:21 -07:00
snipe
deff312381 Remove auto-link from from manufacturer warranty
Signed-off-by: snipe <snipe@snipe.net>
2023-04-26 18:16:23 -07:00
snipe
7bffe30fae Merge remote-tracking branch 'origin/develop' 2023-04-26 17:55:48 -07:00
snipe
73d45bb587 Merge pull request #12932 from snipe/features/add_warranty_url_to_mfgs
Added dynamic warranty URL to manufacturers
2023-04-26 17:55:03 -07:00
snipe
7974c172fd Switch back to “normal” url for support
Signed-off-by: snipe <snipe@snipe.net>
2023-04-26 16:48:38 -07:00
snipe
54a766c4f9 Added dynamic warranty URL to manufacturers
Signed-off-by: snipe <snipe@snipe.net>
2023-04-26 16:39:15 -07:00
snipe
27de5c62c5 Merge remote-tracking branch 'origin/develop' 2023-04-26 15:15:43 -07:00
snipe
ef69df2cdf Merge pull request #12930 from snipe/fixes/added_help_text_to_support_url
Added help text to the now-dynamic manufacturer URLS
2023-04-26 15:15:19 -07:00
snipe
7c0ef581c5 Added help text to the now-dynamic manufacturer URLS
Signed-off-by: snipe <snipe@snipe.net>
2023-04-26 15:12:36 -07:00
snipe
0c5837e4a0 Merge pull request #12929 from snipe/fixes/use_asset_tag_if_no_asset_name_given
Use the asset tag instead of asset name if no name is given
2023-04-26 14:49:38 -07:00
snipe
5eac314f4d Merge pull request #12906 from akemidx/feature/sc-20622
Dynamic warranty link for manufacturers' support urls
2023-04-26 14:49:22 -07:00
snipe
b5b335a2ca Use the asset tag instead of asset name if no name is given
Signed-off-by: snipe <snipe@snipe.net>
2023-04-26 14:41:19 -07:00
akemidx
497d17835f requested edits 2023-04-26 17:06:08 -04:00
slong753
52c9fefbe0 ok, this works except error display 2023-04-26 15:06:50 -05:00
snipe
68417a4c15 Env-ify hashing variables, setting the normal defaults
Signed-off-by: snipe <snipe@snipe.net>
2023-04-26 13:01:42 -07:00
akemidx
aab53cf683 remove regex, add in starts_with 2023-04-26 15:18:13 -04:00
snipe
75fdd0ac96 Merge remote-tracking branch 'origin/develop' 2023-04-26 09:54:44 -07:00
snipe
4c16dcf5d0 Merge pull request #12922 from snipe/fixes/12918_route_name_for_clone_locations
Fixed #12918 - wrong route for clone location
2023-04-26 09:54:18 -07:00
snipe
b6889ff399 Fixed #12918 - wrong toite for clone location
Signed-off-by: snipe <snipe@snipe.net>
2023-04-26 09:52:13 -07:00
snipe
12cc576b52 Merge remote-tracking branch 'origin/develop' 2023-04-25 23:41:45 -07:00
snipe
19554a7dc2 Merge pull request #12917 from snipe/fixes/applies_pr_12868
Applies #12868 - fixes EOL date on asset creation
2023-04-25 23:40:43 -07:00
snipe
8f0b823fb3 Applies #12868
Signed-off-by: snipe <snipe@snipe.net>
2023-04-25 23:39:32 -07:00
snipe
2299771e10 Add @zacharyfleck as a contributor 2023-04-25 22:37:17 -07:00
snipe
37b881b906 Add @dboth as a contributor 2023-04-25 22:32:45 -07:00
snipe
22d73f503a Merge pull request #12756 from dboth/develop
Fixed #8208, #8896, #8985 and #9789:  Currency issues when using non-english locales (resubmission)
2023-04-25 22:32:13 -07:00
snipe
970b5e556c Merge pull request #12903 from marcusmoore/bug/sc-15034
Fixes sending webhook notifications for checkout and checkin
2023-04-25 22:22:58 -07:00
snipe
17275cbeb8 Merge pull request #12905 from marcusmoore/fixes/checkout-via-artisan
Fixes where clause operator in artisan checkout command
2023-04-25 22:21:59 -07:00
snipe
d6ea5de5b8 Merge remote-tracking branch 'origin/develop' into features/auto_add_to_fieldset 2023-04-25 22:20:50 -07:00
snipe
42f0975414 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/css/dist/all.css
#	public/css/dist/bootstrap-table.css
#	public/js/dist/bootstrap-table.js
#	public/mix-manifest.json
2023-04-25 22:19:27 -07:00
snipe
470a36a7c9 Updated dev assets
Signed-off-by: snipe <snipe@snipe.net>
2023-04-25 22:12:56 -07:00
snipe
b7632cdbb7 Updated js packages
Signed-off-by: snipe <snipe@snipe.net>
2023-04-25 22:12:47 -07:00
snipe
9529cd8235 Merge pull request #12891 from snipe/snyk-upgrade-38ca074c3dd0aada16ad8b85f20ebaa8
[Snyk] Upgrade bootstrap-table from 1.21.3 to 1.21.4
2023-04-25 22:04:40 -07:00
snipe
fcddd0827c Merge pull request #12888 from snipe/snyk-upgrade-4c8ffc584b299eb1e71d6be555624f4e
[Snyk] Upgrade webpack from 5.76.2 to 5.77.0
2023-04-25 22:03:49 -07:00
snipe
c8c6f879d4 Merge pull request #12912 from Godmartinz/ldap_location_sync
added ldap_location to settings
2023-04-25 21:54:28 -07:00
snipe
31a3be4c6a Small refactor of HTML, added top submit button
Signed-off-by: snipe <snipe@snipe.net>
2023-04-25 21:51:59 -07:00
snipe
27477085fe Merge branch 'develop' into features/auto_add_to_fieldset 2023-04-25 21:31:50 -07:00
snipe
45f22e7561 Updated the sync to disassociate if all boxed are unchecked
Signed-off-by: snipe <snipe@snipe.net>
2023-04-25 21:31:23 -07:00
snipe
5759d2c948 Added a check to fail validation if the associated fieldsets are not value
Signed-off-by: snipe <snipe@snipe.net>
2023-04-25 21:30:47 -07:00
snipe
15dc4e4779 Added fieldset sync
Signed-off-by: snipe <snipe@snipe.net>
2023-04-25 21:29:57 -07:00
slong753
6bec9cf880 fix a couple things 2023-04-25 23:26:16 -05:00
snipe
5eeca937cb Added logic for syncing fieldset info
Signed-off-by: snipe <snipe@snipe.net>
2023-04-25 21:08:26 -07:00
snipe
662b7787a1 Updated redirect return
Signed-off-by: snipe <snipe@snipe.net>
2023-04-25 21:07:50 -07:00
snipe
28d9cec1e3 Added auto_add_to_fieldsets to API response
Signed-off-by: snipe <snipe@snipe.net>
2023-04-25 20:59:48 -07:00
snipe
67212f9d57 Changed layout, added fieldsets
Signed-off-by: snipe <snipe@snipe.net>
2023-04-25 20:59:29 -07:00
snipe
6cd3cfe1ea Added new field to factory
Signed-off-by: snipe <snipe@snipe.net>
2023-04-25 20:57:03 -07:00
snipe
4a063d23b9 We don’t actually use this test?
Signed-off-by: snipe <snipe@snipe.net>
2023-04-25 19:36:52 -07:00
snipe
705bb7375a Merge pull request #12914 from marcusmoore/fixes/fix-test-cases
Fixes state leak between tests
2023-04-25 17:22:56 -07:00
snipe
4e3ccb74bc Fixed slightly weird padding
Signed-off-by: snipe <snipe@snipe.net>
2023-04-25 15:59:19 -07:00
snipe
4954b50280 Added new strings
Signed-off-by: snipe <snipe@snipe.net>
2023-04-25 15:57:46 -07:00
snipe
07336bbc6a Added auto_add_to_fieldsets field
Signed-off-by: snipe <snipe@snipe.net>
2023-04-25 15:51:36 -07:00
snipe
0e73923c24 Merge pull request #12913 from uberbrady/fix_scim_id_string
Change from a standard Eloquent mapping for ID to a custom setRead
2023-04-25 12:02:36 -07:00
Marcus Moore
a528ebeab0 Use superuser instead of admin state 2023-04-25 11:53:47 -07:00
Brady Wetherington
3da5df0127 Change from a standard Eloquent mapping for ID to a custom setRead 2023-04-25 11:50:55 -07:00
Godfrey M
20d8ff2a4f removed a typo 2023-04-25 11:49:33 -07:00
snipe
a7e2182ec9 Merge pull request #12904 from zacharyfleck/develop
Fixed #8342: Add ARM64 architecture to Docker Builds
2023-04-25 11:45:27 -07:00
Godfrey M
cb68f41d9c added ldap_location to settings 2023-04-25 11:44:04 -07:00
Zachary Fleck
af0a0276e0 Merge branch 'snipe:develop' into develop 2023-04-25 14:43:41 -04:00
Zachary Fleck
ef07f39ccf remove space 2023-04-25 14:43:34 -04:00
Zachary Fleck
aa223359d4 remove space 2023-04-25 14:42:09 -04:00
Godfrey M
c9eb1410d7 swaps version and open source text in the footer 2023-04-25 11:03:05 -07:00
snipe
b0e342508f Merge remote-tracking branch 'origin/develop' 2023-04-25 08:09:59 -07:00
snipe
efc0929bbc Merge pull request #12910 from snipe/fixes/finer_permissions_for_bulk_assets
Added more granular permissions on bulk actions for assets
2023-04-25 08:09:30 -07:00
snipe
66ce02fc48 Added permission on restore
Signed-off-by: snipe <snipe@snipe.net>
2023-04-25 08:09:16 -07:00
snipe
6e7f0728fd Added more granular permissions on bulk actions for assets
Signed-off-by: snipe <snipe@snipe.net>
2023-04-25 08:06:45 -07:00
Marcus Moore
b4f162f316 Fix operator in where clause 2023-04-24 17:26:06 -07:00
akemidx
9cd2783185 Regex added for link instead 2023-04-24 20:07:21 -04:00
zacharyfleck
63ade327a5 add ARM64 architecture 2023-04-24 16:24:44 -04:00
Godfrey M
b8c424fca0 adds users total cost to user profile 2023-04-24 09:17:42 -07:00
snyk-bot
056790e9cd fix: upgrade bootstrap-table from 1.21.3 to 1.21.4
Snyk has created this PR to upgrade bootstrap-table from 1.21.3 to 1.21.4.

See this package in npm:
https://www.npmjs.com/package/bootstrap-table

See this project in Snyk:
https://app.snyk.io/org/snipe/project/3d53e1dd-b8bf-46b5-ba61-18ce26933166?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-04-22 14:47:28 +00:00
snipe
0c425ed0e7 Merge remote-tracking branch 'origin/develop' 2023-04-21 05:19:19 -07:00
snipe
7d9062c065 Merge pull request #12877 from joelpittet/patch-1
Allow an environment variable to set the session cookie path
2023-04-21 04:45:17 -07:00
snipe
fc721a9388 Merge pull request #12887 from marcusmoore/bug/sc-23158
Fix: Ensure users editing themselves do not deactivate their account
2023-04-21 04:42:04 -07:00
snyk-bot
6af3ab8954 fix: upgrade webpack from 5.76.2 to 5.77.0
Snyk has created this PR to upgrade webpack from 5.76.2 to 5.77.0.

See this package in npm:
https://www.npmjs.com/package/webpack

See this project in Snyk:
https://app.snyk.io/org/snipe/project/3d53e1dd-b8bf-46b5-ba61-18ce26933166?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-04-21 06:57:42 +00:00
Marcus Moore
2aba8252f3 Ensure users editing themselves do not deactivate their account 2023-04-20 21:59:55 -07:00
akemidx
16a5a883e5 new request, preparing support_url for validation 2023-04-20 16:34:25 -04:00
snipe
c3c22fae3c Merge pull request #12885 from inietov/fixes/error_call_member_function_totalSeatsByLicenseID
Fixed Call to a member function totalSeatsByLicenseID() on null
2023-04-20 10:43:28 -07:00
Ivan Nieto Vivanco
747d6cfdb4 Change the flow of the condition using an early return 2023-04-20 10:37:26 -06:00
Ivan Nieto Vivanco
ae53609b1b Declare variables only if license is found 2023-04-20 10:16:11 -06:00
Marcus Moore
c357d9f01e Update data provider name 2023-04-19 18:10:23 -07:00
Marcus Moore
645f6ed692 Remove unneeded doc block 2023-04-19 17:52:44 -07:00
Godfrey M
97df39001d adds optional breakdowns for total cost 2023-04-19 17:51:37 -07:00
Marcus Moore
dd40798c43 Remove unneeded comments 2023-04-19 17:49:31 -07:00
Godfrey M
6872f8da7b adding total cost to user view 2023-04-19 17:31:09 -07:00
Marcus Moore
e92c1e7bea Minor docblock update 2023-04-19 17:22:56 -07:00
Godfrey M
bd212b3108 adds component costs to asset view 2023-04-19 16:35:06 -07:00
Joel Pittet
608c5d037f Use environment variable and default to PHP's sendmail_path
Use sendmail_path in PHP instead of hardcoded path and options
2023-04-19 15:25:48 -07:00
Joel Pittet
351928adff Allow an environment variable to set the session cookie path 2023-04-19 15:18:50 -07:00
Marcus Moore
144382e57a Update docblock types 2023-04-19 12:31:12 -07:00
Marcus Moore
835f8876c4 Move notification sending into try catch block 2023-04-19 12:26:48 -07:00
snipe
4a5426f959 Merge pull request #12875 from Godmartinz/sidebar_undeployable_runaway_parenthesis
Fixed space from un deployable total in sidebar
2023-04-19 11:49:42 -07:00
Marcus Moore
15280c435e Merge branch 'develop' into bug/sc-15034 2023-04-19 11:45:16 -07:00
Godfrey M
0e1f50c226 adds checkout-range to jquery 2023-04-19 10:11:26 -07:00
Godfrey M
d2118ba230 removed space from un deployable total in sidebar 2023-04-19 09:46:15 -07:00
Godfrey M
8a5612d1c9 fixes comment 2023-04-19 09:13:43 -07:00
Godfrey M
bdd1045272 adds a checkout range for custom asset reports 2023-04-19 09:11:44 -07:00
snipe
fd5cb32dd9 Honor the “update” flag
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 16:34:47 -07:00
snipe
345662c5c2 Rearrange some of the user creation logic
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 16:34:10 -07:00
snipe
003cd372dd New location same CSV
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 16:23:07 -07:00
Godfrey M
0ab400f5bc removed deadspace and pull 2023-04-18 15:23:11 -07:00
Godfrey M
f15b0d8591 fix for footer 2023-04-18 15:20:38 -07:00
snipe
aedfef78d3 Update app/Importer/LocationImporter.php
Co-authored-by: Marcus Moore <contact@marcusmoore.io>
2023-04-18 13:26:23 -07:00
Marcus Moore
bad2eead4c Remove test method 2023-04-18 13:13:57 -07:00
Marcus Moore
508660b1df Skip notifications for component checkouts and checkins 2023-04-18 13:07:55 -07:00
snipe
c68563ae08 Merge remote-tracking branch 'origin/develop' 2023-04-18 13:01:37 -07:00
snipe
a84a9a8dec Merge pull request #12867 from snipe/fixes/clearer_tooltip_text_for_non_assets_undeployable
Small tooltip improvements for undeployable items in table view
2023-04-18 13:00:11 -07:00
snipe
d3bdaf7cd3 Fixed destination name
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 12:59:46 -07:00
snipe
92f516484e Small tooltip improvements for undeployable items
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 12:54:06 -07:00
snipe
b626e5a3bf Merge remote-tracking branch 'origin/develop' 2023-04-18 12:33:32 -07:00
snipe
bfda46276a Merge pull request #12849 from snipe/features/adds_license_checkin_checkout_to_all_in_gui
Added license checkin/checkout to all in license GUI
2023-04-18 12:32:30 -07:00
snipe
031586495a Small cosmetic tweaks to 2FA reset class, fixed weird layout on 2FA reset button
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 12:09:41 -07:00
snipe
d871a14687 Added fa-fw for nicer display
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 11:49:40 -07:00
snipe
00a9591c4c Added autoassign_licenses in view, added fa-fw
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 11:49:29 -07:00
snipe
4d9d75379f Improved translation string
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 11:39:16 -07:00
snipe
41358eba85 Updated label
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 11:29:28 -07:00
snipe
59f4fe67d6 Removed duplicate tooltip
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 11:28:35 -07:00
Brady Wetherington
71fa6d765f Update to Latest Livewire files 2023-04-18 11:05:35 -07:00
Brady Wetherington
9793130f6c Merge branch 'develop' into laravel_v9 2023-04-18 11:01:00 -07:00
snipe
2c5c4ab974 Nicer layout
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 04:40:06 -07:00
snipe
95767c46ac Fixed delete modal
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 04:37:13 -07:00
snipe
0eadc00f4d Removed unneeded css class
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 04:37:04 -07:00
snipe
df7b19bc1e Removed unused validations
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 04:35:06 -07:00
snipe
7aab4290c7 Updated tooltips with data-tooltip=true from old method
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 02:44:50 -07:00
snipe
3a808aa806 Updated method for available seat count
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 02:44:33 -07:00
snipe
4d09021e9c Compact tooltip for un-deletable
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 02:44:19 -07:00
snipe
beba31afbf Added tooltip for disabled delete buttons
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 02:44:09 -07:00
snipe
41490f1e3a Use “name” instead of “license” for consistency
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 02:43:59 -07:00
snipe
9da36833be Removed unused method
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 02:43:44 -07:00
snipe
dc6eb6f104 Throw a warning if there were no users affected
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 02:07:17 -07:00
snipe
a8a3ca3624 Use count on availSeats
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 02:06:42 -07:00
snipe
e84ba0c7a0 Revert back to old method name
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 02:06:32 -07:00
snipe
3e53870b37 Updated language
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 02:00:13 -07:00
snipe
8a41f37054 Persists buttons through tabs
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 02:00:06 -07:00
snipe
9f7058a128 Revert "Renamed/refactorered licenses method"
This reverts commit de78f8d41f.

Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 01:36:34 -07:00
snipe
ec0413254e Removed action menu
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 01:09:40 -07:00
snipe
f21d9c27e6 Use new translations for logs
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 01:07:26 -07:00
snipe
725adebffe Translate log message
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 01:07:12 -07:00
snipe
bfcbd9628a Refactored license controller with new counts
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 01:02:58 -07:00
snipe
220e20d208 Changed tooltip invocation
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 01:02:36 -07:00
snipe
d3b087b5da Clearer padding between buttons, added tooltips
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 01:02:19 -07:00
snipe
25a83c2915 Removed moved translations
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 01:02:01 -07:00
snipe
3f4159f058 Added translations
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 01:01:52 -07:00
snipe
de78f8d41f Renamed/refactorered licenses method
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 01:01:44 -07:00
snipe
6ab4314221 Removed unused method
Signed-off-by: snipe <snipe@snipe.net>
2023-04-18 01:01:13 -07:00
snipe
087f0e596a Fixed has to where
Signed-off-by: snipe <snipe@snipe.net>
2023-04-17 22:44:05 -07:00
snipe
0dd967cf2b Merge remote-tracking branch 'origin/develop' 2023-04-17 21:05:09 -07:00
snipe
912f6c45ee Reverted #12832
Signed-off-by: snipe <snipe@snipe.net>
2023-04-17 21:04:47 -07:00
snipe
9a73f5eca3 Updated production assets
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/css/build/app.css
#	public/css/build/overrides.css
#	public/css/dist/all.css
#	public/css/dist/skins/skin-black-dark.css
#	public/css/dist/skins/skin-black-dark.min.css
#	public/css/dist/skins/skin-blue-dark.css
#	public/css/dist/skins/skin-blue-dark.min.css
#	public/css/dist/skins/skin-green-dark.css
#	public/css/dist/skins/skin-green-dark.min.css
#	public/css/dist/skins/skin-orange-dark.css
#	public/css/dist/skins/skin-orange-dark.min.css
#	public/css/dist/skins/skin-purple-dark.css
#	public/css/dist/skins/skin-purple-dark.min.css
#	public/css/dist/skins/skin-red-dark.css
#	public/css/dist/skins/skin-red-dark.min.css
#	public/css/dist/skins/skin-yellow-dark.css
#	public/css/dist/skins/skin-yellow-dark.min.css
#	public/mix-manifest.json
2023-04-17 20:27:49 -07:00
snipe
9698c3b07b Updated dev assets
Signed-off-by: snipe <snipe@snipe.net>
2023-04-17 20:14:50 -07:00
snipe
3153013715 Fixed semicolon parse error from #12832
Signed-off-by: snipe <snipe@snipe.net>
2023-04-17 20:14:45 -07:00
snipe
c12ac9912c Merge pull request #12832 from Godmartinz/fix_footer_space
Fixed footer space when customized
2023-04-17 20:11:15 -07:00
snipe
2b10357c4e Updated dev assets
Signed-off-by: snipe <snipe@snipe.net>
2023-04-17 19:06:27 -07:00
Marcus Moore
f6cff90829 Migrate to new test settings interface 2023-04-17 17:31:12 -07:00
Marcus Moore
2d56675ade Merge branch 'develop' into bug/sc-15034
# Conflicts:
#	database/factories/SettingFactory.php
2023-04-17 17:22:55 -07:00
snipe
c70cb36c80 Merge pull request #12828 from Godmartinz/bug/sc-20783
Fixed dark themes pagination and notification drop menu
2023-04-17 16:26:36 -07:00
Godfrey M
247f47ce69 adjusts button color 2023-04-17 15:29:53 -07:00
snipe
99cecee4b5 Merge branch 'develop' into features/adds_license_checkin_checkout_to_all_in_gui 2023-04-17 14:54:30 -07:00
Godfrey M
aabd5e92a8 surrounding text aligns correctly 2023-04-17 12:44:06 -07:00
Godfrey M
247c881d87 add back casts 2023-04-17 12:10:54 -07:00
Godfrey M
1001b52c4f removes unncessary files 2023-04-17 12:01:09 -07:00
slong753
52dc99588e pushing for now, needs validation work 2023-04-17 13:57:48 -05:00
Godfrey M
0cca45d858 footer now uses flex 2023-04-17 11:57:35 -07:00
snipe
b22cad9ced Merge pull request #12855 from koelle25/fixes/last_component_checkout
Allow checkout of available components down to zero stock (fixes #12854)
2023-04-17 09:49:14 -07:00
snipe
071a620144 Merge remote-tracking branch 'origin/develop' 2023-04-17 09:36:07 -07:00
snipe
920711dd16 Merge pull request #12857 from snipe/fixes/wtf_datetime_stuff
Remove start/end dates form casts array
2023-04-17 09:35:03 -07:00
snipe
e0c53d8d09 Remove start/end dates form casts array
Signed-off-by: snipe <snipe@snipe.net>
2023-04-17 09:33:31 -07:00
Kevin Köllmann
04f3c4bf69 Fixed #12854: Allow checkout of available components down to zero stock 2023-04-17 11:45:11 +02:00
snipe
a83991041a Better placement for errors
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 16:08:06 -07:00
snipe
0afaaa4a6b Added autoassign_licenses option to create admin
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 15:28:08 -07:00
snipe
16ab2bec06 Added sorting and searching on autoassign_licenses via user API
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 15:27:39 -07:00
snipe
4b66ca6ac5 Added method to bulk checkin (much simpler than checking out)
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 15:27:15 -07:00
snipe
844ad83431 Added method to bulk checkout license seats
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 15:26:59 -07:00
snipe
9833d861d4 Added autoassign_licenses tp bulk users conditional
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 15:26:33 -07:00
snipe
03cc55cb6a Set autoassign_licenses to false if unchecked
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 15:25:52 -07:00
snipe
6a94a2f515 Return true/false for autoassign_licenses in the API
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 15:25:26 -07:00
snipe
f40bef8f9b Added autoassign_licenses to user importer
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 15:25:08 -07:00
snipe
6acce098c9 Added autoassign_licenses on user model
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 15:24:56 -07:00
snipe
73cf62e060 Added autoassign_licenses to presenter
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 15:24:00 -07:00
snipe
dd78d2fc66 Added language strings
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 15:23:51 -07:00
snipe
add9e561f9 Added buttons on license page, greyed out where appriate
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 15:23:42 -07:00
snipe
ff9af7ea74 Added genetic modal partial
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 15:23:15 -07:00
snipe
bc7c0aa80d Fixed clone tooltip
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 15:23:00 -07:00
snipe
73188df090 Added autoassign_licenses to bulk user edit
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 15:22:37 -07:00
snipe
cf7f244942 Added (clarified?) edit autoassign_licenses in user edit
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 15:19:37 -07:00
snipe
06d46a4523 Indenting change for clarity
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 15:17:55 -07:00
snipe
8e5042418a Added buttons
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 12:30:32 -07:00
snipe
79ff6a8fc2 Disallow deleting in the API view if there are things checked out
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 12:30:23 -07:00
snipe
8183b8deba Added stub method
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 12:30:02 -07:00
snipe
0210ecde88 Include confirm modal
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 12:29:55 -07:00
snipe
b2940f9915 Added confirm modal
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 12:29:48 -07:00
snipe
b093e428b3 Merge remote-tracking branch 'origin/develop' 2023-04-16 08:54:38 -07:00
snipe
144a6f28ec Added intval
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 08:54:23 -07:00
snipe
65ac877918 Merge remote-tracking branch 'origin/develop' 2023-04-16 08:50:20 -07:00
snipe
f50b958b63 Merge pull request #12848 from snipe/fixes/make_limit_into_singletons
Used a singleton to filter API limit value
2023-04-16 08:48:28 -07:00
snipe
64256351d8 Used a singleton to filter API limit value
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 08:46:39 -07:00
snipe
62edc0ab7d Merge remote-tracking branch 'origin/develop' 2023-04-16 08:02:44 -07:00
snipe
2c6d4d6b7f Merge pull request #12847 from snipe/features/moar_labels
Adds a few more auto-labels
2023-04-16 08:01:06 -07:00
snipe
2b11c96ce0 Adds a few more auto-labels
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 08:00:25 -07:00
snipe
78ec21acc4 Added location case
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 07:47:49 -07:00
snipe
5a1d03c1dc Added alias maps
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 07:47:42 -07:00
snipe
a831a34594 New field mapping
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 07:47:26 -07:00
snipe
bcf9188dcd Made default password longer
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 07:47:19 -07:00
snipe
c149885ceb Skip the magical user creation if it’s a location
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 07:47:04 -07:00
snipe
1509672463 Added location importer
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 07:46:36 -07:00
snipe
bceb0b8a47 Allowed slightly longer zip codes
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 07:46:29 -07:00
snipe
7534d27a03 Added CSV sample
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 07:46:18 -07:00
snipe
46cce0115e Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/css/dist/all.css
#	public/css/dist/bootstrap-table.css
#	public/js/dist/bootstrap-table.js
#	public/mix-manifest.json
2023-04-16 05:46:26 -07:00
snipe
485f5f3a45 Merge pull request #12845 from snipe/security/update_bs_tables
Upgrade bootstrap-table from 1.20.2 to 1.21.3 (Formerly #12733)
2023-04-16 05:44:52 -07:00
snipe
21f5d39fa1 Upgrade bootstrap-table from 1.20.2 to 1.21.3 (Formerly #12733)
Signed-off-by: snipe <snipe@snipe.net>
2023-04-16 05:43:42 -07:00
snipe
21e78bee71 Merge remote-tracking branch 'origin/develop'
Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	package-lock.json
#	public/js/dist/bootstrap-table.js
#	public/mix-manifest.json
2023-04-15 21:05:18 -07:00
snipe
2eeb7ddf58 Merge pull request #12844 from snipe/fixes/small_blade_parial_fixes
Small blade parial fixes
2023-04-15 21:04:35 -07:00
snipe
589f7fa183 Larger qty box
Signed-off-by: snipe <snipe@snipe.net>
2023-04-15 21:03:09 -07:00
snipe
9ff62c966e Check for $item (matters mostly in custom report blade)
Signed-off-by: snipe <snipe@snipe.net>
2023-04-15 21:03:00 -07:00
snipe
86b04c7294 Updated prod assets
Signed-off-by: snipe <snipe@snipe.net>
2023-04-15 20:50:36 -07:00
snipe
2d03ea943b Applied webpack change from master to develop
Signed-off-by: snipe <snipe@snipe.net>
2023-04-15 20:49:34 -07:00
snipe
20ab412e1e Updated dev assets
Signed-off-by: snipe <snipe@snipe.net>
2023-04-15 20:45:35 -07:00
snipe
513b95e8d7 Merge pull request #12768 from snipe/snyk-upgrade-291b556667d6ffe966495405775b3255
[Snyk] Upgrade tableexport.jquery.plugin from 1.26.0 to 1.27.0
2023-04-15 20:44:57 -07:00
snipe
50153717f6 Merge pull request #12798 from snipe/snyk-upgrade-cec198178187b64d2348f74ddc10c797
[Snyk] Upgrade webpack from 5.76.1 to 5.76.2
2023-04-15 20:36:48 -07:00
snipe
32030c4f71 Merge remote-tracking branch 'origin/develop' 2023-04-15 18:44:25 -07:00
snipe
955539807c Merge pull request #12830 from snipe/features/adds_supplier_id_to_components
Added supplier to components and consumables
2023-04-15 18:42:23 -07:00
snipe
8c09226b76 Merge pull request #12834 from marcusmoore/mxm/improve-test-setup
Introduced improved way to interact with settings in tests
2023-04-15 18:37:34 -07:00
snipe
b73aed2b69 Merge remote-tracking branch 'origin/develop' 2023-04-15 18:30:21 -07:00
snipe
b9a5a8a500 Merge pull request #12843 from snipe/fixes/temp_fix_seeder
Temp fix for the seeders
2023-04-15 18:30:00 -07:00
snipe
8ae14c43f3 This is a temp fix for the seeders
Signed-off-by: snipe <snipe@snipe.net>
2023-04-15 18:27:53 -07:00
snipe
fc7f1f907d Fixed variable name
Signed-off-by: snipe <snipe@snipe.net>
2023-04-15 17:37:25 -07:00
snipe
f6cfec1e49 Merge pull request #12842 from snipe/fixes/take_two_better_handling_limits
Use abs() instead of max
2023-04-15 17:33:12 -07:00
snipe
4cbb9c2409 Use abs() instead of max
Signed-off-by: snipe <snipe@snipe.net>
2023-04-15 17:28:25 -07:00
snipe
a97b2d141d Merge pull request #12827 from snipe/fixes/tighter_handling_of_offset_and_limit
Better handling for weird data passed to the API via limit and offset
2023-04-15 16:52:33 -07:00
snipe
f407a551da Merge branch 'develop' of https://github.com/snipe/snipe-it into develop 2023-04-15 16:48:07 -07:00
snipe
36665fde31 Merge pull request #12833 from svpernova09/bump-dockerfile-22-04-php81
Update Dockerfile to Ubuntu 22.04 and PHP 8.1
2023-04-14 17:16:42 -07:00
Joe Ferguson
785d2f3558 Update alpine Dockerfiles to PHP 8.1 and Snipe-IT v6.1.0 2023-04-14 13:35:36 -05:00
Joe Ferguson
1d8a4ca090 Update Dockerfile to Ubuntu 22.04 and PHP 8.1 2023-04-14 07:59:16 -05:00
Marcus Moore
473241edca Move initialization of settings to trait 2023-04-13 16:52:20 -07:00
Godfrey M
42f198ffed fixes footer space when customized 2023-04-13 12:24:59 -07:00
Godfrey M
b16c062485 fixes partial 2023-04-13 12:05:59 -07:00
snipe
b690ed97d5 Fixed unclosed parens in translation file
Signed-off-by: snipe <snipe@snipe.net>
2023-04-13 12:05:06 -07:00
Godfrey M
ab67d903b5 adds multi select to custom report for companies 2023-04-13 12:02:11 -07:00
snipe
2fe7fcecdb Added case switch for sorting on suppliers
Signed-off-by: snipe <snipe@snipe.net>
2023-04-13 11:13:45 -07:00
snipe
d2b3e251ad Added counters to API controllers
Signed-off-by: snipe <snipe@snipe.net>
2023-04-13 11:12:16 -07:00
snipe
07c0a1927b Added supplier id to controllers
Signed-off-by: snipe <snipe@snipe.net>
2023-04-13 11:12:01 -07:00
snipe
ab7c75232b Added supplier to transformers
Signed-off-by: snipe <snipe@snipe.net>
2023-04-13 11:10:51 -07:00
snipe
6e183f2ced Added counters for consumables and components
Signed-off-by: snipe <snipe@snipe.net>
2023-04-13 11:10:32 -07:00
snipe
6097d534e9 Added eloquent model relationships
Signed-off-by: snipe <snipe@snipe.net>
2023-04-13 11:10:16 -07:00
snipe
3aac8bccd2 Added presenters for suppliers
Signed-off-by: snipe <snipe@snipe.net>
2023-04-13 11:09:59 -07:00
snipe
e7c6771e73 Added supplier to components and consumables factories for seeding
Signed-off-by: snipe <snipe@snipe.net>
2023-04-13 11:07:22 -07:00
snipe
45142c6888 Migration to add supplier ID to components and consumables
Signed-off-by: snipe <snipe@snipe.net>
2023-04-13 11:06:49 -07:00
snipe
607ab3988a Added supplier to edit/creatre blade
Signed-off-by: snipe <snipe@snipe.net>
2023-04-13 11:06:07 -07:00
snipe
b6d3f2827b Switched to standardized require check
Signed-off-by: snipe <snipe@snipe.net>
2023-04-13 11:05:52 -07:00
snipe
65bb0486d4 Changed blade to use standard required check
Signed-off-by: snipe <snipe@snipe.net>
2023-04-13 11:04:29 -07:00
snipe
a40bad0972 Added consumables and components columns to supplier list
Signed-off-by: snipe <snipe@snipe.net>
2023-04-13 11:04:13 -07:00
snipe
6eed89df91 Added components and consumables tab to suppliers
Signed-off-by: snipe <snipe@snipe.net>
2023-04-13 11:03:26 -07:00
Godfrey M
d476f0de3a forgot dark blue 2023-04-13 10:34:17 -07:00
Godfrey M
bbb4032050 fixes rest of dark mode themes 2023-04-13 10:32:42 -07:00
Godfrey M
b83daea265 fixes dark orange 2023-04-13 10:27:38 -07:00
Marcus Moore
7c95e45178 Introduce trait to conditionally interact with settings 2023-04-12 17:28:47 -07:00
Godfrey M
46ff738494 fixes the notification dropdown menu 2023-04-12 16:12:48 -07:00
akemidx
0a993b2aa1 added external link icon to warranty link 2023-04-12 18:52:21 -04:00
Godfrey M
cbb25025d5 fixes pagination for rest of skins 2023-04-12 15:41:04 -07:00
Godfrey M
f3d12351a6 fixes paginiation for black-dark 2023-04-12 15:23:56 -07:00
Godfrey M
2d27f0155a targeting paginiation 2023-04-12 15:06:06 -07:00
slong753
8b9aea8874 very much WIP, but dupe queries reduced
but i think this can be cleaned up a bit more
2023-04-12 14:46:48 -05:00
snipe
112a04b108 Better handle weird data passed to the API via limit and offset
Signed-off-by: snipe <snipe@snipe.net>
2023-04-12 11:28:46 -07:00
snipe
9a37273750 Merge remote-tracking branch 'origin/develop' 2023-04-12 08:28:50 -07:00
snipe
1a7201d3d9 Merge pull request #12826 from snipe/fixes/added_invalid_parse_to_dont_report
Added invalid parse to dontReport
2023-04-12 08:28:26 -07:00
snipe
74babfa081 Added maxlength="10"
Signed-off-by: snipe <snipe@snipe.net>
2023-04-12 08:26:36 -07:00
snipe
04f83d34ff Added withInput to carry over older fields
Signed-off-by: snipe <snipe@snipe.net>
2023-04-12 08:25:03 -07:00
snipe
aac76d40fe Merge remote-tracking branch 'origin/develop' 2023-04-12 06:37:01 -07:00
snipe
14ec96cf45 Merge pull request #12825 from snipe/fixes/wrong_button_string_on_bulk_user_edit
Fixed #12822 - Missing translation on bulk edit user submit button
2023-04-12 06:36:39 -07:00
snipe
0f3702b0fc Fixed incorrect translation string for bulk user edit
Signed-off-by: snipe <snipe@snipe.net>
2023-04-12 06:35:28 -07:00
snipe
0e93a9229d Merge remote-tracking branch 'origin/develop' 2023-04-12 06:32:06 -07:00
snipe
a119484277 Merge pull request #12824 from snipe/fixes/radio_button_submit_on_merge_users
Removed iCheck code from merge users script
2023-04-12 06:31:43 -07:00
snipe
89b031d64d Removed iCheck code from merge users script
Signed-off-by: snipe <snipe@snipe.net>
2023-04-12 06:30:52 -07:00
snipe
9ae9ea7f68 Merge remote-tracking branch 'origin/develop' 2023-04-12 04:36:30 -07:00
snipe
d3d464e179 Improved commenting
Signed-off-by: snipe <snipe@snipe.net>
2023-04-12 04:36:05 -07:00
snipe
28e0891645 Merge remote-tracking branch 'origin/develop' 2023-04-11 23:36:59 -07:00
snipe
c02bd54826 Merge pull request #12818 from snipe/fixes/better_error_handling_on_dates
Check for Carbon exception
2023-04-11 23:36:42 -07:00
snipe
afd01869a5 Check for Carbon exception
Signed-off-by: snipe <snipe@snipe.net>
2023-04-11 23:35:41 -07:00
akemidx
2453913080 dynamic link w/ dynamic image 2023-04-11 14:53:44 -04:00
akemidx
71ff987e3c dynamic link w/ dynamic image 2023-04-11 14:32:11 -04:00
akemidx
a65b8025b6 push for testing 2023-04-11 13:53:56 -04:00
akemidx
968701b971 starting to implant the str lower solution 2023-04-10 17:28:19 -04:00
snipe
22336da362 Merge remote-tracking branch 'origin/develop' 2023-04-09 14:08:03 -07:00
snipe
79a8effa25 Merge pull request #12810 from snipe/fixes/maintain_checkbox_state_on_user
Maintain activated state on editing a user
2023-04-09 14:07:41 -07:00
snipe
70ce0d9ee6 Maintain activated state on editing a user
Signed-off-by: snipe <snipe@snipe.net>
2023-04-09 14:06:29 -07:00
Marcus Moore
cd0796ddda Allow Settings to be chainable 2023-04-06 18:46:29 -07:00
Marcus Moore
9561b66613 Add return types and docblock 2023-04-06 17:58:53 -07:00
Marcus Moore
95f195046d Move cache flush to testing helper 2023-04-06 17:50:24 -07:00
Marcus Moore
52c733b31d Add ability to set provided settings 2023-04-06 17:48:23 -07:00
Marcus Moore
8ac4d3aeea Move to a static constructor 2023-04-06 17:42:15 -07:00
Marcus Moore
bbfb6c338a Remove unused method 2023-04-06 17:28:16 -07:00
Marcus Moore
f767cc082f Introduce improved way to interact with settings in tests 2023-04-06 17:27:18 -07:00
akemidx
cc88a361ca commiting 2023-04-06 15:01:01 -04:00
snyk-bot
4c05da37c1 fix: upgrade webpack from 5.76.1 to 5.76.2
Snyk has created this PR to upgrade webpack from 5.76.1 to 5.76.2.

See this package in npm:
https://www.npmjs.com/package/webpack

See this project in Snyk:
https://app.snyk.io/org/snipe/project/3d53e1dd-b8bf-46b5-ba61-18ce26933166?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-04-06 14:48:49 +00:00
slong753
830e3e5594 cleanup 2023-04-05 15:27:28 -05:00
slong753
d56a4e7173 cleanup+formatting 2023-04-05 15:16:46 -05:00
Marcus Moore
5b4d5cadf4 Add tests for sending webhooks on asset and license seat checkin 2023-04-05 12:57:53 -07:00
Marcus Moore
3054d633b0 Improve comments and remove unused imports 2023-04-05 12:39:41 -07:00
Marcus Moore
3cc3662992 Send webhook notifications for accessory checkins when enabled 2023-04-05 12:36:24 -07:00
Marcus Moore
2187310abb Simplify test case names 2023-04-05 12:27:18 -07:00
Marcus Moore
b41902976b Improve test class names 2023-04-05 12:23:11 -07:00
Marcus Moore
6df8f0f35c Merge branch 'develop' into bug/sc-15034 2023-04-05 11:49:53 -07:00
slong753
3929526a57 ok, this works but needs to be tested more 2023-04-04 18:57:51 -05:00
akemidx
f5122b01b1 Mock Up of the Buttons 2023-04-04 15:51:04 -04:00
slong753
29e3d202fe checking something, quick push 2023-04-03 17:54:31 -05:00
Marcus Moore
524249d4d7 Implement tests for webhook notifications on accessory checkout 2023-03-30 16:58:16 -07:00
Marcus Moore
b2292db3c8 Implement tests for webhook notifications on consumable checkout 2023-03-30 16:40:53 -07:00
Marcus Moore
aefc53cfcf Explicitly disable webhook settings in tests 2023-03-30 16:40:21 -07:00
Marcus Moore
621d8500eb Merge branch 'develop' into bug/sc-15034 2023-03-30 16:17:42 -07:00
snyk-bot
91c67c3116 fix: upgrade tableexport.jquery.plugin from 1.26.0 to 1.27.0
Snyk has created this PR to upgrade tableexport.jquery.plugin from 1.26.0 to 1.27.0.

See this package in npm:
https://www.npmjs.com/package/tableexport.jquery.plugin

See this project in Snyk:
https://app.snyk.io/org/snipe/project/3d53e1dd-b8bf-46b5-ba61-18ce26933166?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-03-30 22:55:38 +00:00
Marcus Moore
134ab631d4 Add test to ensure notification is not sent for license checkouts if not enabled 2023-03-30 15:38:22 -07:00
Marcus Moore
158e1544cd Test the event instead of the checkout 2023-03-30 15:38:00 -07:00
slong753
b0fa298d8f delete a couple things 2023-03-29 15:14:48 -05:00
slong753
65bbecd145 this all works - could use some eyes 2023-03-29 14:46:31 -05:00
Dominik Both
3271c9dc9f Fix #8208, #8896, #8985, #9789 2023-03-29 09:56:34 +02:00
slong753
032ae4348e custom fields display, need to get saving
+some clean up
2023-03-28 21:45:31 -05:00
slong753
804a788a27 initial fetch working 2023-03-28 20:31:24 -05:00
Marcus Moore
2cbc6276f7 Implement test for license checkout notification 2023-03-27 14:09:31 -07:00
Marcus Moore
362d5b9fd4 Merge branch 'develop' into bug/sc-15034 2023-03-27 11:46:30 -07:00
Marcus Moore
fa69a580ab Start to scaffold license checkout notification test 2023-03-23 17:18:33 -07:00
Marcus Moore
fc043a35d9 Fix checkouts for licenses 2023-03-23 17:03:48 -07:00
Marcus Moore
25e859c866 Simplify test case 2023-03-23 16:42:21 -07:00
Marcus Moore
2dcf4e3d16 Standardize on sending anonymous notifications for asset checkouts 2023-03-23 16:31:40 -07:00
Marcus Moore
1f664709ba Merge branch 'develop' into bug/sc-15034
# Conflicts:
#	app/Notifications/CheckoutAssetNotification.php
2023-03-23 13:04:40 -07:00
Marcus Moore
b396f2bed3 Update test case names 2023-03-22 12:41:30 -07:00
Marcus Moore
28ced46b9d Clean up test code 2023-03-22 12:38:14 -07:00
Marcus Moore
66224765ea Use factory state for webhook settings 2023-03-22 12:31:47 -07:00
Marcus Moore
9c4a3ce56a Update slack_endpoint to webhook_endpoint in test and notification 2023-03-22 12:27:36 -07:00
Marcus Moore
f6d0dd0f93 Merge branch 'develop' into bug/sc-15034 2023-03-22 11:58:47 -07:00
Marcus Moore
e303aeadd1 Fix test name 2023-03-22 11:56:54 -07:00
Marcus Moore
315f5231cd Send slack notification for check outs to assets and locations 2023-03-21 17:03:51 -07:00
Marcus Moore
2813b7ea58 Scaffold tests for slack notification on checkout 2023-03-13 15:47:50 -07:00
Brady Wetherington
aadfa9aa9c Back out Laravel Vite stuff - we're so far away from that right now 2023-02-21 19:54:14 -08:00
Brady Wetherington
645bba96cd WIP: First stabs at getting Laravel Vite to work; no luck so far :(
Probably going to back out all the 'vite' stuff anyways :/
2023-02-21 19:35:37 -08:00
cram42
0f3c5d10ba Merge branch 'feature-label2' into develop 2023-02-01 18:01:46 +11:00
cram42
73fd0a24ca Clarify example asset variable 2023-02-01 17:58:58 +11:00
cram42
4b4c228f1a Correct parameter order 2023-02-01 17:56:23 +11:00
cram42
b72c6b7afc Fix 2D barcode defaults 2023-02-01 17:48:39 +11:00
cram42
c2c009a018 Merge branch 'develop' into develop 2023-01-24 09:53:42 +08:00
Cram42
17e81af4cd Add more Avery label sheets 2022-11-12 20:29:50 +08:00
Cram42
ffce6ec327 Need uppercase 2022-11-12 20:29:34 +08:00
Cram42
60ef5686ab Add "Pop Out" button for preview 2022-11-12 19:02:38 +08:00
Cram42
af0872dc23 Fix form refresh after bootstrap-table 2022-11-11 14:23:38 +08:00
Cram42
30a7a31724 Move label preview to alpine component 2022-11-11 14:23:02 +08:00
Cram42
67d021e457 Add alpinejs to deferred scripts 2022-11-11 11:25:41 +08:00
Cram42
7108156072 Fix button disabling 2022-11-10 19:24:02 +08:00
Cram42
a4b93d4bbd Create Field Definitions helper control 2022-11-10 19:20:18 +08:00
Cram42
f849fcca89 Change the way fields are passed 2022-11-10 18:54:02 +08:00
Cram42
fd9616683c Label preview auto-refresh 2022-11-03 10:20:12 +08:00
Cram42
3d470d6f2f Drop asset tag from default field def. 2022-11-02 22:39:08 +08:00
Cram42
53513d93fa Rework TZe labels for Asset Tag support 2022-11-02 22:38:00 +08:00
Cram42
f5fac50e91 Add preview pane 2022-11-02 19:31:34 +08:00
Cram42
36210f1c6a Allow settings to be overridden in request 2022-11-02 19:30:45 +08:00
Cram42
48fb4f2439 Add labels route for testing layouts 2022-11-02 17:23:52 +08:00
Cram42
fb467d9078 Include Asset for advanced users 2022-11-02 17:20:01 +08:00
Cram42
4fee5ece43 Support Avery L7163 2022-11-02 16:08:10 +08:00
Cram42
4bb40adfce Add Asset Tag as separate supported feature 2022-11-02 16:07:50 +08:00
Cram42
06ce40ac08 Don't add data if it's not there 2022-11-02 16:05:52 +08:00
Cram42
a8b6a4a259 Allow passing "template" param 2022-11-02 16:04:40 +08:00
Cram42
a60ee7736b Add P-touch TZe 12mm Tape Example 2022-11-02 12:22:55 +08:00
Cram42
d0eb3cfc9b Merge branch 'feature-label2' into develop 2022-11-02 10:09:46 +08:00
Cram42
19150aeb44 Add P-touch TZe 24mm Tape Example 2022-11-02 10:09:11 +08:00
Cram42
cde2ba7720 Fix: Oops 2022-11-02 09:51:02 +08:00
Cram42
6b2fe582ca Merge branch 'feature-label2' into develop 2022-11-01 20:12:28 +08:00
cram42
7e2546b31f Merge branch 'snipe:develop' into develop 2022-11-01 20:04:59 +08:00
Cram42
7b29ddd283 Tie into tag generation 2022-11-01 20:02:12 +08:00
Cram42
d37605ff18 Add localization strings 2022-11-01 20:01:18 +08:00
Cram42
6de48b4dc8 Implement settings for labels 2022-11-01 20:00:53 +08:00
Cram42
5558a005b9 Implement API for labels 2022-11-01 19:57:51 +08:00
Cram42
bb09f0168f Create Label View/Generator 2022-11-01 19:56:53 +08:00
Cram42
4ed728d954 Add template to simulate legacy label 2022-11-01 19:54:00 +08:00
Cram42
bbecdb6768 Add QR example 2022-11-01 19:53:11 +08:00
Cram42
df89406987 Create Label model and example 2022-11-01 19:52:34 +08:00
Cram42
7c355cef2d Add helper to convert between units of measurement 2022-11-01 19:49:57 +08:00
Cram42
35536b5dbd Require tecnickcom/tcpdf 2022-11-01 19:47:59 +08:00
Cram42
0e69e4248c Fix: Multiple outputs at hardware/{id}/label 2022-10-27 08:12:42 +08:00
7748 changed files with 489833 additions and 255499 deletions

View File

@@ -1,11 +1,14 @@
{
"projectName": "snipe-it",
"projectOwner": "snipe",
"repoType": "github",
"repoHost": "https://github.com",
"files": [
"README.md"
"CONTRIBUTORS.md"
],
"imageSize": 110,
"commit": true,
"commitConvention": "angular",
"contributors": [
{
"login": "snipe",
@@ -2889,6 +2892,268 @@
"avatar_url": "https://avatars.githubusercontent.com/u/570639?v=4",
"profile": "https://github.com/Mezzle",
"contributions": []
},
{
"login": "dboth",
"name": "dboth",
"avatar_url": "https://avatars.githubusercontent.com/u/5731963?v=4",
"profile": "http://dboth.de",
"contributions": [
"code"
]
},
{
"login": "zacharyfleck",
"name": "Zachary Fleck",
"avatar_url": "https://avatars.githubusercontent.com/u/87536651?v=4",
"profile": "https://github.com/zacharyfleck",
"contributions": [
"code"
]
},
{
"login": "vikaas-cyper",
"name": "VIKAAS-A",
"avatar_url": "https://avatars.githubusercontent.com/u/74609912?v=4",
"profile": "https://github.com/vikaas-cyper",
"contributions": [
"code"
]
},
{
"login": "ak-piracha",
"name": "Abdul Kareem",
"avatar_url": "https://avatars.githubusercontent.com/u/88882041?v=4",
"profile": "https://github.com/ak-piracha",
"contributions": [
"code"
]
},
{
"login": "NojoudAlshehri",
"name": "NojoudAlshehri",
"avatar_url": "https://avatars.githubusercontent.com/u/111287779?v=4",
"profile": "https://github.com/NojoudAlshehri",
"contributions": [
"code"
]
},
{
"login": "stefanstidlffg",
"name": "Stefan Stidl",
"avatar_url": "https://avatars.githubusercontent.com/u/54367449?v=4",
"profile": "https://github.com/stefanstidlffg",
"contributions": [
"code"
]
},
{
"login": "qay21",
"name": "Quentin Aymard",
"avatar_url": "https://avatars.githubusercontent.com/u/87803479?v=4",
"profile": "https://github.com/qay21",
"contributions": [
"code"
]
},
{
"login": "cram42",
"name": "Grant Le Roux",
"avatar_url": "https://avatars.githubusercontent.com/u/5396871?v=4",
"profile": "https://github.com/cram42",
"contributions": [
"code"
]
},
{
"login": "Singrity",
"name": "Bogdan",
"avatar_url": "https://avatars.githubusercontent.com/u/58479551?v=4",
"profile": "http://@singrity",
"contributions": [
"code"
]
},
{
"login": "mmanjos",
"name": "mmanjos",
"avatar_url": "https://avatars.githubusercontent.com/u/3483684?v=4",
"profile": "https://github.com/mmanjos",
"contributions": [
"code"
]
},
{
"login": "Azooz2014",
"name": "Abdelaziz Faki",
"avatar_url": "https://avatars.githubusercontent.com/u/7429229?v=4",
"profile": "https://azooz2014.github.io/",
"contributions": [
"code"
]
},
{
"login": "bilias",
"name": "bilias",
"avatar_url": "https://avatars.githubusercontent.com/u/47315739?v=4",
"profile": "https://github.com/bilias",
"contributions": [
"code"
]
},
{
"login": "coach1988",
"name": "coach1988",
"avatar_url": "https://avatars.githubusercontent.com/u/2565989?v=4",
"profile": "https://github.com/coach1988",
"contributions": [
"code"
]
},
{
"login": "mauro-miatello",
"name": "MrM",
"avatar_url": "https://avatars.githubusercontent.com/u/11910225?v=4",
"profile": "https://github.com/mauro-miatello",
"contributions": [
"code"
]
},
{
"login": "koiakoia",
"name": "koiakoia",
"avatar_url": "https://avatars.githubusercontent.com/u/60405354?v=4",
"profile": "https://github.com/koiakoia",
"contributions": [
"code"
]
},
{
"login": "mustafa-online",
"name": "Mustafa Online",
"avatar_url": "https://avatars.githubusercontent.com/u/5323832?v=4",
"profile": "https://github.com/mustafa-online",
"contributions": [
"code"
]
},
{
"login": "franceslui",
"name": "franceslui",
"avatar_url": "https://avatars.githubusercontent.com/u/104601439?v=4",
"profile": "https://github.com/franceslui",
"contributions": [
"code"
]
},
{
"login": "Q4kK",
"name": "Q4kK",
"avatar_url": "https://avatars.githubusercontent.com/u/125313163?v=4",
"profile": "https://github.com/Q4kK",
"contributions": [
"code"
]
},
{
"login": "squintfox",
"name": "squintfox",
"avatar_url": "https://avatars.githubusercontent.com/u/55590532?v=4",
"profile": "https://github.com/squintfox",
"contributions": [
"code"
]
},
{
"login": "jeffclay",
"name": "Jeff Clay",
"avatar_url": "https://avatars.githubusercontent.com/u/1380084?v=4",
"profile": "https://github.com/jeffclay",
"contributions": [
"code"
]
},
{
"login": "PP-JN-RL",
"name": "Phil J R",
"avatar_url": "https://avatars.githubusercontent.com/u/52716446?v=4",
"profile": "https://github.com/PP-JN-RL",
"contributions": [
"code"
]
},
{
"login": "chandanchowdhury",
"name": "i_virus",
"avatar_url": "https://avatars.githubusercontent.com/u/1496725?v=4",
"profile": "https://www.corelight.com/",
"contributions": [
"code"
]
},
{
"login": "gitgrimbo",
"name": "Paul Grime",
"avatar_url": "https://avatars.githubusercontent.com/u/1020541?v=4",
"profile": "https://github.com/gitgrimbo",
"contributions": [
"code"
]
},
{
"login": "LeePorte",
"name": "Lee Porte",
"avatar_url": "https://avatars.githubusercontent.com/u/922815?v=4",
"profile": "https://leeporte.co.uk",
"contributions": [
"code"
]
},
{
"login": "bryanlopezinc",
"name": "BRYAN ",
"avatar_url": "https://avatars.githubusercontent.com/u/23613427?v=4",
"profile": "https://github.com/bryanlopezinc",
"contributions": [
"code",
"test"
]
},
{
"login": "U-H-T",
"name": "U-H-T",
"avatar_url": "https://avatars.githubusercontent.com/u/64061710?v=4",
"profile": "https://github.com/U-H-T",
"contributions": [
"code"
]
},
{
"login": "Tyree",
"name": "Matt Tyree",
"avatar_url": "https://avatars.githubusercontent.com/u/5395363?v=4",
"profile": "https://github.com/Tyree",
"contributions": [
"doc"
]
},
{
"login": "FlorentDotMe",
"name": "Florent Bervas",
"avatar_url": "https://avatars.githubusercontent.com/u/292081?v=4",
"profile": "http://spoontux.net",
"contributions": [
"code"
]
},
{
"login": "dbakan",
"name": "Daniel Albertsen",
"avatar_url": "https://avatars.githubusercontent.com/u/4498077?v=4",
"profile": "https://ditscheri.com",
"contributions": [
"code"
]
}
]
}

166
.env.dev.docker Normal file
View File

@@ -0,0 +1,166 @@
# --------------------------------------------
# REQUIRED: DB SETUP
# --------------------------------------------
MYSQL_DATABASE=snipeit
MYSQL_USER=snipeit
MYSQL_PASSWORD=changeme1234
MYSQL_ROOT_PASSWORD=changeme1234
# --------------------------------------------
# REQUIRED: BASIC APP SETTINGS
# --------------------------------------------
APP_ENV=develop
APP_DEBUG=false
# please regenerate the APP_KEY value by calling `docker-compose run --rm snipeit bash` and then `php artisan key:generate --show` and then copy paste the value here
APP_KEY=base64:3ilviXqB9u6DX1NRcyWGJ+sjySF+H18CPDGb3+IVwMQ=
APP_URL=http://localhost:8000
APP_TIMEZONE='UTC'
APP_LOCALE=en
MAX_RESULTS=500
# --------------------------------------------
# REQUIRED: UPLOADED FILE STORAGE SETTINGS
# --------------------------------------------
PRIVATE_FILESYSTEM_DISK=local
PUBLIC_FILESYSTEM_DISK=local_public
# --------------------------------------------
# REQUIRED: DATABASE SETTINGS
# --------------------------------------------
DB_CONNECTION=mysql
DB_HOST=mariadb
DB_DATABASE=snipeit
DB_USERNAME=snipeit
DB_PASSWORD=changeme1234
DB_PREFIX=null
DB_DUMP_PATH='/usr/bin'
DB_CHARSET=utf8mb4
DB_COLLATION=utf8mb4_unicode_ci
# --------------------------------------------
# OPTIONAL: SSL DATABASE SETTINGS
# --------------------------------------------
DB_SSL=false
DB_SSL_IS_PAAS=false
DB_SSL_KEY_PATH=null
DB_SSL_CERT_PATH=null
DB_SSL_CA_PATH=null
DB_SSL_CIPHER=null
DB_SSL_VERIFY_SERVER=null
# --------------------------------------------
# REQUIRED: OUTGOING MAIL SERVER SETTINGS
# --------------------------------------------
MAIL_DRIVER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDR=you@example.com
MAIL_FROM_NAME='Snipe-IT'
MAIL_REPLYTO_ADDR=you@example.com
MAIL_REPLYTO_NAME='Snipe-IT'
MAIL_AUTO_EMBED_METHOD='attachment'
# --------------------------------------------
# REQUIRED: IMAGE LIBRARY
# This should be gd or imagick
# --------------------------------------------
IMAGE_LIB=gd
# --------------------------------------------
# OPTIONAL: BACKUP SETTINGS
# --------------------------------------------
MAIL_BACKUP_NOTIFICATION_DRIVER=null
MAIL_BACKUP_NOTIFICATION_ADDRESS=null
BACKUP_ENV=true
# --------------------------------------------
# OPTIONAL: SESSION SETTINGS
# --------------------------------------------
SESSION_LIFETIME=12000
EXPIRE_ON_CLOSE=false
ENCRYPT=false
COOKIE_NAME=snipeit_session
COOKIE_DOMAIN=null
SECURE_COOKIES=false
API_TOKEN_EXPIRATION_YEARS=40
# --------------------------------------------
# OPTIONAL: SECURITY HEADER SETTINGS
# --------------------------------------------
APP_TRUSTED_PROXIES=192.168.1.1,10.0.0.1
ALLOW_IFRAMING=false
REFERRER_POLICY=same-origin
ENABLE_CSP=false
CORS_ALLOWED_ORIGINS=null
ENABLE_HSTS=false
# --------------------------------------------
# OPTIONAL: CACHE SETTINGS
# --------------------------------------------
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync
CACHE_PREFIX=snipeit
# --------------------------------------------
# OPTIONAL: REDIS SETTINGS
# --------------------------------------------
REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379
# --------------------------------------------
# OPTIONAL: MEMCACHED SETTINGS
# --------------------------------------------
MEMCACHED_HOST=null
MEMCACHED_PORT=null
# --------------------------------------------
# OPTIONAL: PUBLIC S3 Settings
# --------------------------------------------
PUBLIC_AWS_SECRET_ACCESS_KEY=null
PUBLIC_AWS_ACCESS_KEY_ID=null
PUBLIC_AWS_DEFAULT_REGION=null
PUBLIC_AWS_BUCKET=null
PUBLIC_AWS_URL=null
PUBLIC_AWS_BUCKET_ROOT=null
# --------------------------------------------
# OPTIONAL: PRIVATE S3 Settings
# --------------------------------------------
PRIVATE_AWS_ACCESS_KEY_ID=null
PRIVATE_AWS_SECRET_ACCESS_KEY=null
PRIVATE_AWS_DEFAULT_REGION=null
PRIVATE_AWS_BUCKET=null
PRIVATE_AWS_URL=null
PRIVATE_AWS_BUCKET_ROOT=null
# --------------------------------------------
# OPTIONAL: AWS Settings
# --------------------------------------------
AWS_ACCESS_KEY_ID=null
AWS_SECRET_ACCESS_KEY=null
AWS_DEFAULT_REGION=null
# --------------------------------------------
# OPTIONAL: LOGIN THROTTLING
# --------------------------------------------
LOGIN_MAX_ATTEMPTS=5
LOGIN_LOCKOUT_DURATION=60
RESET_PASSWORD_LINK_EXPIRES=900
# --------------------------------------------
# OPTIONAL: MISC
# --------------------------------------------
LOG_CHANNEL=stderr
LOG_MAX_DAYS=10
APP_LOCKED=false
APP_CIPHER=AES-256-CBC
APP_FORCE_TLS=false
GOOGLE_MAPS_API=
LDAP_MEM_LIM=500M
LDAP_TIME_LIM=600

View File

@@ -1,18 +1,18 @@
# --------------------------------------------
# REQUIRED: DB SETUP
# REQUIRED: DOCKER SPECIFIC SETTINGS
# --------------------------------------------
MYSQL_DATABASE=snipeit
MYSQL_USER=snipeit
MYSQL_PASSWORD=changeme1234
MYSQL_ROOT_PASSWORD=changeme1234
APP_VERSION=v6.4.1
APP_PORT=8000
# --------------------------------------------
# REQUIRED: BASIC APP SETTINGS
# --------------------------------------------
APP_ENV=develop
APP_ENV=production
APP_DEBUG=false
# please regenerate the APP_KEY value by calling `docker-compose run --rm snipeit bash` and then `php artisan key:generate --show` and then copy paste the value here
# Please regenerate the APP_KEY value by calling `docker compose run --rm snipeit php artisan key:generate --show`. Copy paste the value here
APP_KEY=base64:3ilviXqB9u6DX1NRcyWGJ+sjySF+H18CPDGb3+IVwMQ=
APP_URL=http://localhost:8000
# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones - TZ identifier
APP_TIMEZONE='UTC'
APP_LOCALE=en
MAX_RESULTS=500
@@ -27,10 +27,12 @@ PUBLIC_FILESYSTEM_DISK=local_public
# REQUIRED: DATABASE SETTINGS
# --------------------------------------------
DB_CONNECTION=mysql
DB_HOST=mariadb
DB_HOST=db
DB_PORT='3306'
DB_DATABASE=snipeit
DB_USERNAME=snipeit
DB_PASSWORD=changeme1234
MYSQL_ROOT_PASSWORD=changeme1234
DB_PREFIX=null
DB_DUMP_PATH='/usr/bin'
DB_CHARSET=utf8mb4
@@ -45,29 +47,35 @@ DB_SSL_KEY_PATH=null
DB_SSL_CERT_PATH=null
DB_SSL_CA_PATH=null
DB_SSL_CIPHER=null
DB_SSL_VERIFY_SERVER=null
# --------------------------------------------
# REQUIRED: OUTGOING MAIL SERVER SETTINGS
# --------------------------------------------
MAIL_DRIVER=smtp
MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_TLS_VERIFY_PEER=true
MAIL_FROM_ADDR=you@example.com
MAIL_FROM_NAME='Snipe-IT'
MAIL_REPLYTO_ADDR=you@example.com
MAIL_REPLYTO_NAME='Snipe-IT'
MAIL_AUTO_EMBED_METHOD='attachment'
# --------------------------------------------
# REQUIRED: DATA PROTECTION
# --------------------------------------------
ALLOW_BACKUP_DELETE=false
ALLOW_DATA_PURGE=false
# --------------------------------------------
# REQUIRED: IMAGE LIBRARY
# This should be gd or imagick
# --------------------------------------------
IMAGE_LIB=gd
# --------------------------------------------
# OPTIONAL: BACKUP SETTINGS
# --------------------------------------------
@@ -75,7 +83,6 @@ MAIL_BACKUP_NOTIFICATION_DRIVER=null
MAIL_BACKUP_NOTIFICATION_ADDRESS=null
BACKUP_ENV=true
# --------------------------------------------
# OPTIONAL: SESSION SETTINGS
# --------------------------------------------
@@ -90,7 +97,7 @@ API_TOKEN_EXPIRATION_YEARS=40
# --------------------------------------------
# OPTIONAL: SECURITY HEADER SETTINGS
# --------------------------------------------
APP_TRUSTED_PROXIES=192.168.1.1,10.0.0.1
APP_TRUSTED_PROXIES=192.168.1.1,10.0.0.1,172.0.0.0/8
ALLOW_IFRAMING=false
REFERRER_POLICY=same-origin
ENABLE_CSP=false
@@ -108,7 +115,7 @@ CACHE_PREFIX=snipeit
# --------------------------------------------
# OPTIONAL: REDIS SETTINGS
# --------------------------------------------
REDIS_HOST=redis
REDIS_HOST=null
REDIS_PASSWORD=null
REDIS_PORT=6379
@@ -159,6 +166,7 @@ LOG_CHANNEL=stderr
LOG_MAX_DAYS=10
APP_LOCKED=false
APP_CIPHER=AES-256-CBC
APP_FORCE_TLS=false
GOOGLE_MAPS_API=
LDAP_MEM_LIM=500M
LDAP_TIME_LIM=600

View File

@@ -36,11 +36,12 @@ DB_SSL_KEY_PATH=null
DB_SSL_CERT_PATH=null
DB_SSL_CA_PATH=null
DB_SSL_CIPHER=null
DB_SSL_VERIFY_SERVER=null
# --------------------------------------------
# REQUIRED: OUTGOING MAIL SERVER SETTINGS
# --------------------------------------------
MAIL_DRIVER="log"
MAIL_MAILER="log"
# --------------------------------------------

View File

@@ -6,7 +6,7 @@ APP_DEBUG=false
APP_KEY=ChangeMe
APP_URL=null
APP_TIMEZONE='UTC'
APP_LOCALE=en
APP_LOCALE='en-US'
MAX_RESULTS=500
# --------------------------------------------
@@ -42,21 +42,26 @@ DB_SSL_KEY_PATH=null
DB_SSL_CERT_PATH=null
DB_SSL_CA_PATH=null
DB_SSL_CIPHER=null
DB_SSL_VERIFY_SERVER=null
# --------------------------------------------
# REQUIRED: OUTGOING MAIL SERVER SETTINGS
# --------------------------------------------
MAIL_DRIVER=smtp
MAIL_MAILER=smtp
MAIL_HOST=email-smtp.us-west-2.amazonaws.com
MAIL_PORT=587
MAIL_USERNAME=YOURUSERNAME
MAIL_PASSWORD=YOURPASSWORD
MAIL_ENCRYPTION=null
MAIL_FROM_ADDR=you@example.com
MAIL_FROM_NAME='Snipe-IT'
MAIL_REPLYTO_ADDR=you@example.com
MAIL_REPLYTO_NAME='Snipe-IT'
MAIL_AUTO_EMBED_METHOD='attachment'
MAIL_TLS_VERIFY_PEER=true
# MAIL_ENCRYPTION is no longer supported. SymfonyMailer will use tls if it's
# advertised, and won't if it's not. If you want to use your mail server's IP but it's failing
# because of certificate errors, set MAIL_TLS_VERIFY_PEER-true
# --------------------------------------------
# REQUIRED: IMAGE LIBRARY
@@ -85,6 +90,8 @@ COOKIE_NAME=snipeit_session
COOKIE_DOMAIN=null
SECURE_COOKIES=false
API_TOKEN_EXPIRATION_YEARS=15
BS_TABLE_STORAGE=cookieStorage
BS_TABLE_DEEPLINK=true
# --------------------------------------------
# OPTIONAL: SECURITY HEADER SETTINGS
@@ -93,6 +100,7 @@ APP_TRUSTED_PROXIES=192.168.1.1,10.0.0.1
ALLOW_IFRAMING=false
REFERRER_POLICY=same-origin
ENABLE_CSP=false
ADDITIONAL_CSP_URLS=null
CORS_ALLOWED_ORIGINS=null
ENABLE_HSTS=false
@@ -148,6 +156,7 @@ AWS_DEFAULT_REGION=null
# --------------------------------------------
LOGIN_MAX_ATTEMPTS=5
LOGIN_LOCKOUT_DURATION=60
LOGIN_AUTOCOMPLETE=false
# --------------------------------------------
# OPTIONAL: FORGOTTEN PASSWORD SETTINGS
@@ -174,6 +183,16 @@ REPORT_TIME_LIMIT=12000
REQUIRE_SAML=false
API_THROTTLE_PER_MINUTE=120
CSV_ESCAPE_FORMULAS=true
LIVEWIRE_URL_PREFIX=null
# --------------------------------------------
# OPTIONAL: HASHING
# --------------------------------------------
HASHING_DRIVER='bcrypt'
BCRYPT_ROUNDS=10
ARGON_MEMORY=1024
ARGON_THREADS=2
ARGON_TIME=2
# --------------------------------------------
# OPTIONAL: SCIM

View File

@@ -6,7 +6,7 @@ APP_DEBUG=false
APP_KEY='base64:glJpcM7BYwWiBggp3SQ/+NlRkqsBQMaGEOjemXqJzOU='
APP_URL='http://localhost:8000'
APP_TIMEZONE='US/Pacific'
APP_LOCALE=en
APP_LOCALE='en-US'
FILESYSTEM_DISK=local
# --------------------------------------------
@@ -22,7 +22,7 @@ DB_PASSWORD=null
# --------------------------------------------
# REQUIRED: OUTGOING MAIL SERVER SETTINGS
# --------------------------------------------
MAIL_DRIVER=log
MAIL_MAILER=log
# --------------------------------------------

View File

@@ -6,7 +6,7 @@ APP_DEBUG=true
APP_KEY=base64:glJpcM7BYwWiBggp3SQ/+NlRkqsBQMaGEOjemXqJzOU=
APP_URL=http://localhost:8000
APP_TIMEZONE='UTC'
APP_LOCALE=en
APP_LOCALE='en-US'
# --------------------------------------------
# REQUIRED: DATABASE SETTINGS

View File

@@ -18,6 +18,6 @@ APP_KEY=base64:tu9NRh/a6+dCXBDGvg0Gv/0TcABnFsbT4AKxrr8mwQo=
LOGIN_MAX_ATTEMPTS=1000000
LOGIN_LOCKOUT_DURATION=100000000
MAIL_DRIVER=log
MAIL_MAILER=log
MAIL_FROM_ADDR=you@example.com
MAIL_FROM_NAME=Snipe-IT

View File

@@ -15,6 +15,6 @@ APP_KEY=base64:tu9NRh/a6+dCXBDGvg0Gv/0TcABnFsbT4AKxrr8mwQo=
LOGIN_MAX_ATTEMPTS=1000000
LOGIN_LOCKOUT_DURATION=100000000
MAIL_DRIVER=log
MAIL_MAILER=log
MAIL_FROM_ADDR=you@example.com
MAIL_FROM_NAME=Snipe-IT

View File

@@ -1,18 +1,22 @@
frontend: ["*.js", "*.css", "*.vue", "*.scss", "*.less", "*.blade.*", "*livewire*"]
frontend: ["*.js", "*.css", "*.vue", "*.scss", "*.less", "*.blade.*", "resources/views/livewire/*"]
skins: ["*.js", "*.css", "*.scss", "*.less"]
css: ["*.css","*.scss", "*.less"]
backend: ["/app/*", "*.php"]
javascript: ["*.js", "package.json", "package.lock"]
backend: ["/app/*", "composer.json", "composer.lock"]
translations: ["/resources/lang"]
livewire: ["/app/Http/Livewire/*", "resources/views/livewire/*"]
backups: ["*backup*"]
restore: ["*restore*"]
saml: ["*saml*"]
scim: ["*scim*"]
custom fields: ["*fields*", "*fieldsets*"]
dependencies: ["composer.json"]
dependencies: ["composer.json", "composer.lock", "package.json", "package.lock"]
consumables: ["*consumables*"]
api: ["/app/Http/Controllers/api/*"]
api: ["/app/Http/Controllers/Api/*"]
notifications: ["/app/Notifications/*"]
importer: ["/app/Importer/*"]
importer: ["/app/Importer/*","/app/Http/Livewire/Importer.php", "resources/views/livewire/importer.php"]
cli / artisan: ["/app/Console/*"]
LDAP: ["*LDAP*", "/app/Console/Commands/Ldap*","/app/Models/Ldap.php"]
LDAP: ["*Ldap*", "/app/Console/Commands/Ldap*","/app/Models/Ldap.php"]
docker: ["*docker/*", "Dockerfile", "Dockerfile.alpine", "Dockerfile.fpm-alpine", ".dockerignore", ".env.docker"]
tests: ["/tests/*", "/database/factories/*", "/stubs"]
config: .github

View File

@@ -2,5 +2,6 @@ version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
target-branch: "develop"
schedule:
interval: "weekly"

View File

@@ -26,14 +26,14 @@ jobs:
language: [ 'javascript' ]
steps:
- name: Checkout repository
uses: actions/checkout@v3.3.0
uses: actions/checkout@v4
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
- name: Autobuild
uses: github/codeql-action/autobuild@v2
uses: github/codeql-action/autobuild@v3
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
uses: github/codeql-action/analyze@v3

View File

@@ -32,11 +32,11 @@ jobs:
steps:
# Checkout the repository to the GitHub Actions runner
- name: Checkout code
uses: actions/checkout@v3.3.0
uses: actions/checkout@v4
# Execute Codacy Analysis CLI and generate a SARIF output with the security issues identified during the analysis
- name: Run Codacy Analysis CLI
uses: codacy/codacy-analysis-cli-action@v4.3.0
uses: codacy/codacy-analysis-cli-action@v4.4.5
with:
# Check https://github.com/codacy/codacy-analysis-cli#project-token to get your project token from your Codacy repository
# You can also omit the token and run the tools that support default configurations
@@ -52,6 +52,6 @@ jobs:
# Upload the SARIF file generated in the previous step
- name: Upload SARIF results file
uses: github/codeql-action/upload-sarif@v2
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: results.sarif

View File

@@ -9,10 +9,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Crowdin push
uses: crowdin/github-action@v1
uses: crowdin/github-action@v2
with:
upload_sources: true
upload_translations: false

View File

@@ -32,6 +32,7 @@ jobs:
type=raw,value=latest,enable=${{ endsWith(github.ref, github.event.repository.default_branch) }},suffix=-alpine
type=ref,event=branch,enable=${{ !endsWith(github.ref, github.event.repository.default_branch) }},suffix=-alpine
type=ref,event=tag,suffix=-alpine
type=semver,pattern=v{{major}}-latest-alpine
# Define default tag "flavor" for docker/metadata-action per
# https://github.com/docker/metadata-action#flavor-input
# We turn off 'latest' tag by default.
@@ -41,17 +42,17 @@ jobs:
steps:
# https://github.com/actions/checkout
- name: Checkout codebase
uses: actions/checkout@v3.3.0
uses: actions/checkout@v4
# https://github.com/docker/setup-buildx-action
- name: Setup Docker Buildx
uses: docker/setup-buildx-action@v2
uses: docker/setup-buildx-action@v3
# https://github.com/docker/login-action
- name: Login to DockerHub
# Only login if not a PR, as PRs only trigger a Docker build and not a push
if: github.event_name != 'pull_request'
uses: docker/login-action@v2
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
@@ -63,7 +64,7 @@ jobs:
# Get Metadata for docker_build step below
- name: Sync metadata (tags, labels) from GitHub to Docker for 'snipe-it' image
id: meta_build
uses: docker/metadata-action@v4
uses: docker/metadata-action@v5
with:
images: snipe/snipe-it
tags: ${{ env.IMAGE_TAGS }}
@@ -72,11 +73,11 @@ jobs:
# https://github.com/docker/build-push-action
- name: Build and push 'snipe-it' image
id: docker_build
uses: docker/build-push-action@v4
uses: docker/build-push-action@v6
with:
context: .
file: ./Dockerfile.alpine
platforms: linux/amd64
platforms: linux/amd64,linux/arm64
# For pull requests, we run the Docker build (to ensure no PR changes break the build),
# but we ONLY do an image push to DockerHub if it's NOT a PR
push: ${{ github.event_name != 'pull_request' }}

View File

@@ -32,6 +32,7 @@ jobs:
type=raw,value=latest,enable=${{ endsWith(github.ref, github.event.repository.default_branch) }}
type=ref,event=branch,enable=${{ !endsWith(github.ref, github.event.repository.default_branch) }}
type=ref,event=tag
type=semver,pattern=v{{major}}-latest
# Define default tag "flavor" for docker/metadata-action per
# https://github.com/docker/metadata-action#flavor-input
# We turn off 'latest' tag by default.
@@ -41,17 +42,17 @@ jobs:
steps:
# https://github.com/actions/checkout
- name: Checkout codebase
uses: actions/checkout@v3.3.0
uses: actions/checkout@v4
# https://github.com/docker/setup-buildx-action
- name: Setup Docker Buildx
uses: docker/setup-buildx-action@v2
uses: docker/setup-buildx-action@v3
# https://github.com/docker/login-action
- name: Login to DockerHub
# Only login if not a PR, as PRs only trigger a Docker build and not a push
if: github.event_name != 'pull_request'
uses: docker/login-action@v2
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
@@ -63,7 +64,7 @@ jobs:
# Get Metadata for docker_build step below
- name: Sync metadata (tags, labels) from GitHub to Docker for 'snipe-it' image
id: meta_build
uses: docker/metadata-action@v4
uses: docker/metadata-action@v5
with:
images: snipe/snipe-it
tags: ${{ env.IMAGE_TAGS }}
@@ -72,11 +73,11 @@ jobs:
# https://github.com/docker/build-push-action
- name: Build and push 'snipe-it' image
id: docker_build
uses: docker/build-push-action@v4
uses: docker/build-push-action@v6
with:
context: .
file: ./Dockerfile
platforms: linux/amd64
platforms: linux/amd64,linux/arm64
# For pull requests, we run the Docker build (to ensure no PR changes break the build),
# but we ONLY do an image push to DockerHub if it's NOT a PR
push: ${{ github.event_name != 'pull_request' }}

View File

@@ -0,0 +1,22 @@
name: Update Docker Hub Description
on:
push:
branches:
- master
- develop
paths:
- README.md
- .github/workflows/dockerhub-description.yml
jobs:
dockerHubDescription:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Docker Hub Description
uses: grokability/dockerhub-description@7ea9d275c7cdbe2b676a093a0308c50665e3b8b4
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
repository: snipe/snipe-it
readme-filepath: ./README.md

79
.github/workflows/tests-mysql.yml vendored Normal file
View File

@@ -0,0 +1,79 @@
name: Tests in MySQL
on:
push:
branches:
- master
- develop
pull_request:
jobs:
tests:
runs-on: ubuntu-latest
services:
mysql:
image: mysql:5.7
env:
MYSQL_ALLOW_EMPTY_PASSWORD: yes
MYSQL_DATABASE: snipeit
ports:
- 33306:3306
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
strategy:
fail-fast: false
matrix:
php-version:
- "8.1"
- "8.2"
- "8.3"
name: PHP ${{ matrix.php-version }}
steps:
- uses: shivammathur/setup-php@v2
with:
php-version: "${{ matrix.php-version }}"
coverage: none
- uses: actions/checkout@v4
- name: Get Composer Cache Directory
id: composer-cache
run: |
echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
- uses: actions/cache@v4
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-${{ matrix.php-version }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-composer-
- name: Copy .env
run: |
cp -v .env.testing.example .env
cp -v .env.testing.example .env.testing
- name: Install Dependencies
run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
- name: Setup Laravel
env:
DB_CONNECTION: mysql
DB_DATABASE: snipeit
DB_PORT: ${{ job.services.mysql.ports[3306] }}
DB_USERNAME: root
run: |
php artisan key:generate
php artisan migrate --force
php artisan passport:install
chmod -R 777 storage bootstrap/cache
- name: Execute tests (Unit and Feature tests) via PHPUnit
env:
DB_CONNECTION: mysql
DB_DATABASE: snipeit
DB_PORT: ${{ job.services.mysql.ports[3306] }}
DB_USERNAME: root
run: php artisan test --parallel

77
.github/workflows/tests-postgres.yml vendored Normal file
View File

@@ -0,0 +1,77 @@
name: Tests in Postgres
on: workflow_dispatch
jobs:
tests:
runs-on: ubuntu-latest
services:
postgresql:
image: postgres
env:
POSTGRES_DB: snipeit
POSTGRES_USER: snipeit
POSTGRES_PASSWORD: password
ports:
- 5432:5432
options: --health-cmd=pg_isready --health-interval=10s --health-timeout=5s --health-retries=3
strategy:
fail-fast: false
matrix:
php-version:
- "8.1"
- "8.2"
- "8.3"
name: PHP ${{ matrix.php-version }}
steps:
- uses: shivammathur/setup-php@v2
with:
php-version: "${{ matrix.php-version }}"
coverage: none
- uses: actions/checkout@v4
- name: Get Composer Cache Directory
id: composer-cache
run: |
echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
- uses: actions/cache@v4
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-${{ matrix.php-version }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-composer-
- name: Copy .env
run: |
cp -v .env.testing.example .env
cp -v .env.testing.example .env.testing
- name: Install Dependencies
run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
- name: Setup Laravel
env:
DB_CONNECTION: pgsql
DB_DATABASE: snipeit
DB_PORT: ${{ job.services.postgresql.ports[5432] }}
DB_USERNAME: snipeit
DB_PASSWORD: password
run: |
php artisan key:generate
php artisan migrate --force
php artisan passport:install
chmod -R 777 storage bootstrap/cache
- name: Execute tests (Unit and Feature tests) via PHPUnit
env:
DB_CONNECTION: pgsql
DB_DATABASE: snipeit
DB_PORT: ${{ job.services.postgresql.ports[5432] }}
DB_USERNAME: snipeit
DB_PASSWORD: password
run: php artisan test --parallel

61
.github/workflows/tests-sqlite.yml vendored Normal file
View File

@@ -0,0 +1,61 @@
name: Tests in SQLite
on:
push:
branches:
- master
- develop
pull_request:
jobs:
tests:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
php-version:
- "8.1.1"
name: PHP ${{ matrix.php-version }}
steps:
- uses: shivammathur/setup-php@v2
with:
php-version: "${{ matrix.php-version }}"
coverage: none
- uses: actions/checkout@v4
- name: Get Composer Cache Directory
id: composer-cache
run: |
echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
- uses: actions/cache@v4
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-${{ matrix.php-version }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-composer-
- name: Copy .env
run: |
cp -v .env.testing.example .env
cp -v .env.testing.example .env.testing
- name: Install Dependencies
run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
- name: Generate key
run: php artisan key:generate
- name: Setup Passport
run: php artisan passport:keys
- name: Directory Permissions
run: chmod -R 777 storage bootstrap/cache
- name: Execute tests (Unit and Feature tests) via PHPUnit
env:
DB_CONNECTION: sqlite_testing
run: php artisan test --parallel

2
.gitignore vendored
View File

@@ -1,8 +1,6 @@
.couscous
.DS_Store
.env
.env.dusk.*
!.env.dusk.example
.env.testing
phpstan.neon
.idea

2
.nvmrc
View File

@@ -1 +1 @@
v12.22.1
v18.16.0

View File

@@ -0,0 +1,10 @@
{
"DOC1": "This file is meant to be pulled from the current HEAD of the desired branch, NOT referenced locally",
"DOC2": "In other words, what you see locally are the requirements for your _current_ install",
"DOC3": "Please don't rely on these versions for planning upgrades unless you've fetched the most recent version",
"DOC4": "You should really just ignore it and run upgrade.php. Really",
"php_min_version": "8.1.0",
"php_max_major_minor": "8.3",
"php_max_wontwork": "8.4.0",
"current_snipeit_version": "7.0"
}

57
CONTRIBUTORS.md Normal file
View File

@@ -0,0 +1,57 @@
Thanks goes to all of these wonderful people ([emoji key](https://github.com/kentcdodds/all-contributors#emoji-key)) who have helped Snipe-IT get this far:
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
| [<img src="https://avatars3.githubusercontent.com/u/197404?v=3" width="110px;"/><br /><sub>snipe</sub>](http://www.snipe.net)<br />[💻](https://github.com/snipe/snipe-it/commits?author=snipe "Code") [🚇](#infra-snipe "Infrastructure (Hosting, Build-Tools, etc)") [📖](https://github.com/snipe/snipe-it/commits?author=snipe "Documentation") [⚠️](https://github.com/snipe/snipe-it/commits?author=snipe "Tests") [🐛](https://github.com/snipe/snipe-it/issues?q=author%3Asnipe "Bug reports") [🎨](#design-snipe "Design") [👀](#review-snipe "Reviewed Pull Requests") | [<img src="https://avatars0.githubusercontent.com/u/36335?v=3" width="110px;"/><br /><sub>Brady Wetherington</sub>](http://www.uberbrady.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=uberbrady "Code") [📖](https://github.com/snipe/snipe-it/commits?author=uberbrady "Documentation") [🚇](#infra-uberbrady "Infrastructure (Hosting, Build-Tools, etc)") [👀](#review-uberbrady "Reviewed Pull Requests") | [<img src="https://avatars0.githubusercontent.com/u/3803132?v=3" width="110px;"/><br /><sub>Daniel Meltzer</sub>](https://github.com/dmeltzer)<br />[💻](https://github.com/snipe/snipe-it/commits?author=dmeltzer "Code") [⚠️](https://github.com/snipe/snipe-it/commits?author=dmeltzer "Tests") [📖](https://github.com/snipe/snipe-it/commits?author=dmeltzer "Documentation") | [<img src="https://avatars0.githubusercontent.com/u/1609106?v=3" width="110px;"/><br /><sub>Michael T</sub>](http://www.tuckertechonline.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=mtucker6784 "Code") | [<img src="https://avatars2.githubusercontent.com/u/3274937?v=3" width="110px;"/><br /><sub>madd15</sub>](https://github.com/madd15)<br />[📖](https://github.com/snipe/snipe-it/commits?author=madd15 "Documentation") [💬](#question-madd15 "Answering Questions") | [<img src="https://avatars2.githubusercontent.com/u/894126?v=3" width="110px;"/><br /><sub>Vincent Sposato</sub>](https://github.com/vsposato)<br />[💻](https://github.com/snipe/snipe-it/commits?author=vsposato "Code") | [<img src="https://avatars0.githubusercontent.com/u/1639757?v=3" width="110px;"/><br /><sub>Andrea Bergamasco</sub>](https://github.com/vjandrea)<br />[💻](https://github.com/snipe/snipe-it/commits?author=vjandrea "Code") |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| [<img src="https://avatars0.githubusercontent.com/u/10640152?v=3" width="110px;"/><br /><sub>Karol</sub>](https://github.com/kpawelski)<br />[🌍](#translation-kpawelski "Translation") [💻](https://github.com/snipe/snipe-it/commits?author=kpawelski "Code") | [<img src="https://avatars3.githubusercontent.com/u/600106?v=3" width="110px;"/><br /><sub>morph027</sub>](http://blog.morph027.de/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=morph027 "Code") | [<img src="https://avatars3.githubusercontent.com/u/22935755?v=3" width="110px;"/><br /><sub>fvleminckx</sub>](https://github.com/fvleminckx)<br />[🚇](#infra-fvleminckx "Infrastructure (Hosting, Build-Tools, etc)") | [<img src="https://avatars2.githubusercontent.com/u/15633547?v=3" width="110px;"/><br /><sub>itsupportcmsukorg</sub>](https://github.com/itsupportcmsukorg)<br />[💻](https://github.com/snipe/snipe-it/commits?author=itsupportcmsukorg "Code") [🐛](https://github.com/snipe/snipe-it/issues?q=author%3Aitsupportcmsukorg "Bug reports") | [<img src="https://avatars3.githubusercontent.com/u/12373799?v=3" width="110px;"/><br /><sub>Frank</sub>](https://override.io)<br />[💻](https://github.com/snipe/snipe-it/commits?author=base-zero "Code") | [<img src="https://avatars0.githubusercontent.com/u/10137?v=3" width="110px;"/><br /><sub>Deleted user</sub>](https://github.com/ghost)<br />[🌍](#translation-ghost "Translation") [💻](https://github.com/snipe/snipe-it/commits?author=ghost "Code") | [<img src="https://avatars1.githubusercontent.com/u/10802313?v=3" width="110px;"/><br /><sub>tiagom62</sub>](https://github.com/tiagom62)<br />[💻](https://github.com/snipe/snipe-it/commits?author=tiagom62 "Code") [🚇](#infra-tiagom62 "Infrastructure (Hosting, Build-Tools, etc)") |
| [<img src="https://avatars3.githubusercontent.com/u/2389047?v=3" width="110px;"/><br /><sub>Ryan Stafford</sub>](https://github.com/rystaf)<br />[💻](https://github.com/snipe/snipe-it/commits?author=rystaf "Code") | [<img src="https://avatars2.githubusercontent.com/u/10345935?v=3" width="110px;"/><br /><sub>Eammon Hanlon</sub>](https://github.com/ehanlon)<br />[💻](https://github.com/snipe/snipe-it/commits?author=ehanlon "Code") | [<img src="https://avatars0.githubusercontent.com/u/441924?v=3" width="110px;"/><br /><sub>zjean</sub>](https://github.com/zjean)<br />[💻](https://github.com/snipe/snipe-it/commits?author=zjean "Code") | [<img src="https://avatars0.githubusercontent.com/u/12660103?v=3" width="110px;"/><br /><sub>Matthias Frei</sub>](http://www.frei.media)<br />[💻](https://github.com/snipe/snipe-it/commits?author=FREImedia "Code") | [<img src="https://avatars0.githubusercontent.com/u/3767518?v=3" width="110px;"/><br /><sub>opsydev</sub>](https://github.com/opsydev)<br />[💻](https://github.com/snipe/snipe-it/commits?author=opsydev "Code") | [<img src="https://avatars1.githubusercontent.com/u/82290?v=3" width="110px;"/><br /><sub>Daniel Dreier</sub>](http://www.ddreier.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=ddreier "Code") | [<img src="https://avatars0.githubusercontent.com/u/23448?v=3" width="110px;"/><br /><sub>Nikolai Prokoschenko</sub>](http://rassie.org)<br />[💻](https://github.com/snipe/snipe-it/commits?author=rassie "Code") |
| [<img src="https://avatars0.githubusercontent.com/u/13452757?v=3" width="110px;"/><br /><sub>Drew</sub>](https://github.com/YetAnotherCodeMonkey)<br />[💻](https://github.com/snipe/snipe-it/commits?author=YetAnotherCodeMonkey "Code") | [<img src="https://avatars0.githubusercontent.com/u/1342320?v=3" width="110px;"/><br /><sub>Walter</sub>](https://github.com/merid14)<br />[💻](https://github.com/snipe/snipe-it/commits?author=merid14 "Code") | [<img src="https://avatars3.githubusercontent.com/u/11254614?v=3" width="110px;"/><br /><sub>Petr Baloun</sub>](https://github.com/balous)<br />[💻](https://github.com/snipe/snipe-it/commits?author=balous "Code") | [<img src="https://avatars0.githubusercontent.com/u/6117660?v=3" width="110px;"/><br /><sub>reidblomquist</sub>](https://github.com/reidblomquist)<br />[📖](https://github.com/snipe/snipe-it/commits?author=reidblomquist "Documentation") | [<img src="https://avatars0.githubusercontent.com/u/539914?v=3" width="110px;"/><br /><sub>Mathieu Kooiman</sub>](https://github.com/mathieuk)<br />[💻](https://github.com/snipe/snipe-it/commits?author=mathieuk "Code") | [<img src="https://avatars3.githubusercontent.com/u/6606421?v=3" width="110px;"/><br /><sub>csayre</sub>](https://github.com/csayre)<br />[📖](https://github.com/snipe/snipe-it/commits?author=csayre "Documentation") | [<img src="https://avatars1.githubusercontent.com/u/768488?v=3" width="110px;"/><br /><sub>Adam Dunson</sub>](https://github.com/adamdunson)<br />[💻](https://github.com/snipe/snipe-it/commits?author=adamdunson "Code") |
| [<img src="https://avatars0.githubusercontent.com/u/5547470?v=3" width="110px;"/><br /><sub>Hereward</sub>](https://github.com/thehereward)<br />[💻](https://github.com/snipe/snipe-it/commits?author=thehereward "Code") | [<img src="https://avatars0.githubusercontent.com/u/5802977?v=3" width="110px;"/><br /><sub>swoopdk</sub>](https://github.com/swoopdk)<br />[💻](https://github.com/snipe/snipe-it/commits?author=swoopdk "Code") | [<img src="https://avatars1.githubusercontent.com/u/3470403?v=3" width="110px;"/><br /><sub>Abdullah Alansari</sub>](https://linkedin.com/in/ahimta)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Ahimta "Code") | [<img src="https://avatars0.githubusercontent.com/u/796443?v=3" width="110px;"/><br /><sub>Micael Rodrigues</sub>](https://github.com/MicaelRodrigues)<br />[💻](https://github.com/snipe/snipe-it/commits?author=MicaelRodrigues "Code") | [<img src="https://avatars0.githubusercontent.com/u/614564?v=3" width="110px;"/><br /><sub>Patrick Gallagher</sub>](http://macadmincorner.com)<br />[📖](https://github.com/snipe/snipe-it/commits?author=patgmac "Documentation") | [<img src="https://avatars3.githubusercontent.com/u/7165922?v=3" width="110px;"/><br /><sub>Miliamber</sub>](https://github.com/Miliamber)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Miliamber "Code") | [<img src="https://avatars3.githubusercontent.com/u/861766?v=3" width="110px;"/><br /><sub>hawk554</sub>](https://github.com/hawk554)<br />[💻](https://github.com/snipe/snipe-it/commits?author=hawk554 "Code") |
| [<img src="https://avatars1.githubusercontent.com/u/1695622?v=3" width="110px;"/><br /><sub>Justin Kerr</sub>](http://jbirdkerr.net)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jbirdkerr "Code") | [<img src="https://avatars3.githubusercontent.com/u/11426176?v=3" width="110px;"/><br /><sub>Ira W. Snyder</sub>](http://www.irasnyder.com/devel/)<br />[📖](https://github.com/snipe/snipe-it/commits?author=irasnyd "Documentation") | [<img src="https://avatars2.githubusercontent.com/u/2475759?v=3" width="110px;"/><br /><sub>Aladin Alaily</sub>](https://github.com/aalaily)<br />[💻](https://github.com/snipe/snipe-it/commits?author=aalaily "Code") | [<img src="https://avatars0.githubusercontent.com/u/10247644?v=3" width="110px;"/><br /><sub>Chase Hansen</sub>](https://github.com/kobie-chasehansen)<br />[💻](https://github.com/snipe/snipe-it/commits?author=kobie-chasehansen "Code") [💬](#question-kobie-chasehansen "Answering Questions") [🐛](https://github.com/snipe/snipe-it/issues?q=author%3Akobie-chasehansen "Bug reports") | [<img src="https://avatars2.githubusercontent.com/u/13545400?v=3" width="110px;"/><br /><sub>IDM Helpdesk</sub>](https://github.com/IDM-Helpdesk)<br />[💻](https://github.com/snipe/snipe-it/commits?author=IDM-Helpdesk "Code") | [<img src="https://avatars2.githubusercontent.com/u/614439?v=3" width="110px;"/><br /><sub>Kai</sub>](http://balticer.de)<br />[💻](https://github.com/snipe/snipe-it/commits?author=balticer "Code") | [<img src="https://avatars1.githubusercontent.com/u/8762511?v=3" width="110px;"/><br /><sub>Michael Daniels</sub>](http://www.michaeldaniels.me)<br />[💻](https://github.com/snipe/snipe-it/commits?author=mdaniels5757 "Code") |
| [<img src="https://avatars3.githubusercontent.com/u/1532660?v=3" width="110px;"/><br /><sub>Tom Castleman</sub>](http://tomcastleman.me)<br />[💻](https://github.com/snipe/snipe-it/commits?author=tomcastleman "Code") | [<img src="https://avatars3.githubusercontent.com/u/10723243?v=3" width="110px;"/><br /><sub>Daniel Nemanic</sub>](https://github.com/DanielNemanic)<br />[💻](https://github.com/snipe/snipe-it/commits?author=DanielNemanic "Code") | [<img src="https://avatars0.githubusercontent.com/u/150648?v=3" width="110px;"/><br /><sub>SouthWolf</sub>](https://github.com/southwolf)<br />[💻](https://github.com/snipe/snipe-it/commits?author=southwolf "Code") | [<img src="https://avatars2.githubusercontent.com/u/131616?v=3" width="110px;"/><br /><sub>Ivar Nesje</sub>](https://github.com/ivarne)<br />[💻](https://github.com/snipe/snipe-it/commits?author=ivarne "Code") | [<img src="https://avatars1.githubusercontent.com/u/62333?v=3" width="110px;"/><br /><sub>Jérémy Benoist</sub>](http://www.j0k3r.net)<br />[📖](https://github.com/snipe/snipe-it/commits?author=j0k3r "Documentation") | [<img src="https://avatars2.githubusercontent.com/u/724344?v=3" width="110px;"/><br /><sub>Chris Leathley</sub>](https://github.com/cleathley)<br />[🚇](#infra-cleathley "Infrastructure (Hosting, Build-Tools, etc)") | [<img src="https://avatars0.githubusercontent.com/u/972498?v=3" width="110px;"/><br /><sub>splaer</sub>](https://github.com/splaer)<br />[🐛](https://github.com/snipe/snipe-it/issues?q=author%3Asplaer "Bug reports") [💻](https://github.com/snipe/snipe-it/commits?author=splaer "Code") |
| [<img src="https://avatars1.githubusercontent.com/u/967362?v=3" width="110px;"/><br /><sub>Joe Ferguson</sub>](http://www.joeferguson.me)<br />[💻](https://github.com/snipe/snipe-it/commits?author=svpernova09 "Code") | [<img src="https://avatars3.githubusercontent.com/u/6108682?v=3" width="110px;"/><br /><sub>diwanicki</sub>](https://github.com/diwanicki)<br />[💻](https://github.com/snipe/snipe-it/commits?author=diwanicki "Code") [📖](https://github.com/snipe/snipe-it/commits?author=diwanicki "Documentation") | [<img src="https://avatars3.githubusercontent.com/u/2527115?v=3" width="110px;"/><br /><sub>Lee Thoong Ching</sub>](https://github.com/pakkua80)<br />[📖](https://github.com/snipe/snipe-it/commits?author=pakkua80 "Documentation") [💻](https://github.com/snipe/snipe-it/commits?author=pakkua80 "Code") | [<img src="https://avatars1.githubusercontent.com/u/461491?v=3" width="110px;"/><br /><sub>Marek Šuppa</sub>](http://shu.io)<br />[💻](https://github.com/snipe/snipe-it/commits?author=mrshu "Code") | [<img src="https://avatars1.githubusercontent.com/u/8693762?v=3" width="110px;"/><br /><sub>Juan J. Martinez</sub>](https://github.com/mizar1616)<br />[🌍](#translation-mizar1616 "Translation") | [<img src="https://avatars1.githubusercontent.com/u/1458388?v=3" width="110px;"/><br /><sub>R Ryan Dial</sub>](https://github.com/rrdial)<br />[🌍](#translation-rrdial "Translation") | [<img src="https://avatars2.githubusercontent.com/u/2871745?v=3" width="110px;"/><br /><sub>Andrej Manduch</sub>](https://github.com/burlito)<br />[📖](https://github.com/snipe/snipe-it/commits?author=burlito "Documentation") |
| [<img src="https://avatars0.githubusercontent.com/u/8341172?v=3" width="110px;"/><br /><sub>Jay Richards</sub>](http://www.cordeos.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=technogenus "Code") | [<img src="https://avatars2.githubusercontent.com/u/7295127?v=3" width="110px;"/><br /><sub>Alexander Innes</sub>](https://necurity.co.uk)<br />[💻](https://github.com/snipe/snipe-it/commits?author=leostat "Code") | [<img src="https://avatars2.githubusercontent.com/u/334485?v=3" width="110px;"/><br /><sub>Danny Garcia</sub>](https://buzzedword.codes)<br />[💻](https://github.com/snipe/snipe-it/commits?author=buzzedword "Code") | [<img src="https://avatars2.githubusercontent.com/u/366855?v=3" width="110px;"/><br /><sub>archpoint</sub>](https://github.com/archpoint)<br />[💻](https://github.com/snipe/snipe-it/commits?author=archpoint "Code") | [<img src="https://avatars1.githubusercontent.com/u/67991?v=3" width="110px;"/><br /><sub>Jake McGraw</sub>](http://www.jakemcgraw.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jakemcgraw "Code") | [<img src="https://avatars1.githubusercontent.com/u/1714374?v=3" width="110px;"/><br /><sub>FleischKarussel</sub>](https://github.com/FleischKarussel)<br />[📖](https://github.com/snipe/snipe-it/commits?author=FleischKarussel "Documentation") | [<img src="https://avatars3.githubusercontent.com/u/319644?v=3" width="110px;"/><br /><sub>Dylan Yi</sub>](https://github.com/feeva)<br />[💻](https://github.com/snipe/snipe-it/commits?author=feeva "Code") |
| [<img src="https://avatars2.githubusercontent.com/u/857740?v=3" width="110px;"/><br /><sub>Gil Rutkowski</sub>](http://FlashingCursor.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=flashingcursor "Code") | [<img src="https://avatars3.githubusercontent.com/u/129360?v=3" width="110px;"/><br /><sub>Desmond Morris</sub>](http://www.desmondmorris.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=desmondmorris "Code") | [<img src="https://avatars2.githubusercontent.com/u/52936?v=3" width="110px;"/><br /><sub>Nick Peelman</sub>](http://peelman.us)<br />[💻](https://github.com/snipe/snipe-it/commits?author=peelman "Code") | [<img src="https://avatars0.githubusercontent.com/u/53161?v=3" width="110px;"/><br /><sub>Abraham Vegh</sub>](https://abrahamvegh.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=abrahamvegh "Code") | [<img src="https://avatars0.githubusercontent.com/u/2818680?v=3" width="110px;"/><br /><sub>Mohamed Rashid</sub>](https://github.com/rashivkp)<br />[📖](https://github.com/snipe/snipe-it/commits?author=rashivkp "Documentation") | [<img src="https://avatars3.githubusercontent.com/u/1509456?v=3" width="110px;"/><br /><sub>Kasey</sub>](http://hinchk.github.io)<br />[💻](https://github.com/snipe/snipe-it/commits?author=HinchK "Code") | [<img src="https://avatars2.githubusercontent.com/u/10522541?v=3" width="110px;"/><br /><sub>Brett</sub>](https://github.com/BrettFagerlund)<br />[⚠️](https://github.com/snipe/snipe-it/commits?author=BrettFagerlund "Tests") |
| [<img src="https://avatars2.githubusercontent.com/u/16108587?v=3" width="110px;"/><br /><sub>Jason Spriggs</sub>](http://jasonspriggs.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jasonspriggs "Code") | [<img src="https://avatars2.githubusercontent.com/u/1134568?v=3" width="110px;"/><br /><sub>Nate Felton</sub>](http://n8felton.wordpress.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=n8felton "Code") | [<img src="https://avatars2.githubusercontent.com/u/14036694?v=3" width="110px;"/><br /><sub>Manasses Ferreira</sub>](http://homepages.dcc.ufmg.br/~manassesferreira)<br />[💻](https://github.com/snipe/snipe-it/commits?author=manassesferreira "Code") | [<img src="https://avatars0.githubusercontent.com/u/15913949?v=3" width="110px;"/><br /><sub>Steve</sub>](https://github.com/steveelwood)<br />[⚠️](https://github.com/snipe/snipe-it/commits?author=steveelwood "Tests") | [<img src="https://avatars1.githubusercontent.com/u/3361683?v=3" width="110px;"/><br /><sub>matc</sub>](http://twitter.com/matc)<br />[⚠️](https://github.com/snipe/snipe-it/commits?author=matc "Tests") | [<img src="https://avatars3.githubusercontent.com/u/7405702?v=3" width="110px;"/><br /><sub>Cole R. Davis</sub>](http://www.davisracingteam.com)<br />[⚠️](https://github.com/snipe/snipe-it/commits?author=VanillaNinjaD "Tests") | [<img src="https://avatars2.githubusercontent.com/u/10167681?v=3" width="110px;"/><br /><sub>gibsonjoshua55</sub>](https://github.com/gibsonjoshua55)<br />[💻](https://github.com/snipe/snipe-it/commits?author=gibsonjoshua55 "Code") |
| [<img src="https://avatars2.githubusercontent.com/u/2809241?v=4" width="110px;"/><br /><sub>Robin Temme</sub>](https://github.com/zwerch)<br />[💻](https://github.com/snipe/snipe-it/commits?author=zwerch "Code") | [<img src="https://avatars0.githubusercontent.com/u/6961695?v=4" width="110px;"/><br /><sub>Iman</sub>](https://github.com/imanghafoori1)<br />[💻](https://github.com/snipe/snipe-it/commits?author=imanghafoori1 "Code") | [<img src="https://avatars1.githubusercontent.com/u/6551003?v=4" width="110px;"/><br /><sub>Richard Hofman</sub>](https://github.com/richardhofman6)<br />[💻](https://github.com/snipe/snipe-it/commits?author=richardhofman6 "Code") | [<img src="https://avatars0.githubusercontent.com/u/3697569?v=4" width="110px;"/><br /><sub>gizzmojr</sub>](https://github.com/gizzmojr)<br />[💻](https://github.com/snipe/snipe-it/commits?author=gizzmojr "Code") | [<img src="https://avatars3.githubusercontent.com/u/404729?v=4" width="110px;"/><br /><sub>Jenny Li</sub>](https://github.com/imjennyli)<br />[📖](https://github.com/snipe/snipe-it/commits?author=imjennyli "Documentation") | [<img src="https://avatars0.githubusercontent.com/u/869227?v=4" width="110px;"/><br /><sub>Geoff Young</sub>](https://github.com/GeoffYoung)<br />[💻](https://github.com/snipe/snipe-it/commits?author=GeoffYoung "Code") | [<img src="https://avatars3.githubusercontent.com/u/1068477?v=4" width="110px;"/><br /><sub>Elliot Blackburn</sub>](http://www.elliotblackburn.com)<br />[📖](https://github.com/snipe/snipe-it/commits?author=BlueHatbRit "Documentation") |
| [<img src="https://avatars1.githubusercontent.com/u/6357451?v=4" width="110px;"/><br /><sub>Tõnis Ormisson</sub>](http://andmemasin.eu)<br />[💻](https://github.com/snipe/snipe-it/commits?author=TonisOrmisson "Code") | [<img src="https://avatars0.githubusercontent.com/u/449411?v=4" width="110px;"/><br /><sub>Nicolai Essig</sub>](http://www.nicolai-essig.de)<br />[💻](https://github.com/snipe/snipe-it/commits?author=thakilla "Code") | [<img src="https://avatars1.githubusercontent.com/u/14809698?v=4" width="110px;"/><br /><sub>Danielle</sub>](https://github.com/techincolor)<br />[📖](https://github.com/snipe/snipe-it/commits?author=techincolor "Documentation") | [<img src="https://avatars1.githubusercontent.com/u/18545156?v=4" width="110px;"/><br /><sub>Lawrence</sub>](https://github.com/TheVakman)<br />[⚠️](https://github.com/snipe/snipe-it/commits?author=TheVakman "Tests") [🐛](https://github.com/snipe/snipe-it/issues?q=author%3ATheVakman "Bug reports") | [<img src="https://avatars1.githubusercontent.com/u/22473767?v=4" width="110px;"/><br /><sub>uknzaeinozpas</sub>](https://github.com/uknzaeinozpas)<br />[⚠️](https://github.com/snipe/snipe-it/commits?author=uknzaeinozpas "Tests") [💻](https://github.com/snipe/snipe-it/commits?author=uknzaeinozpas "Code") | [<img src="https://avatars3.githubusercontent.com/u/422752?v=4" width="110px;"/><br /><sub>Ryan</sub>](https://github.com/Gelob)<br />[📖](https://github.com/snipe/snipe-it/commits?author=Gelob "Documentation") | [<img src="https://avatars1.githubusercontent.com/u/10672546?v=4" width="110px;"/><br /><sub>vcordes79</sub>](https://github.com/vcordes79)<br />[💻](https://github.com/snipe/snipe-it/commits?author=vcordes79 "Code") |
| [<img src="https://avatars3.githubusercontent.com/u/27958330?v=4" width="110px;"/><br /><sub>fordster78</sub>](https://github.com/fordster78)<br />[💻](https://github.com/snipe/snipe-it/commits?author=fordster78 "Code") | [<img src="https://avatars0.githubusercontent.com/u/34064225?v=4" width="110px;"/><br /><sub>CronKz</sub>](https://github.com/CronKz)<br />[💻](https://github.com/snipe/snipe-it/commits?author=CronKz "Code") [🌍](#translation-CronKz "Translation") | [<img src="https://avatars1.githubusercontent.com/u/585486?v=4" width="110px;"/><br /><sub>Tim Bishop</sub>](https://github.com/tdb)<br />[💻](https://github.com/snipe/snipe-it/commits?author=tdb "Code") | [<img src="https://avatars2.githubusercontent.com/u/5384694?v=4" width="110px;"/><br /><sub>Sean McIlvenna</sub>](https://www.seanmcilvenna.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=seanmcilvenna "Code") | [<img src="https://avatars3.githubusercontent.com/u/36515590?v=4" width="110px;"/><br /><sub>cepacs</sub>](https://github.com/cepacs)<br />[🐛](https://github.com/snipe/snipe-it/issues?q=author%3Acepacs "Bug reports") [📖](https://github.com/snipe/snipe-it/commits?author=cepacs "Documentation") | [<img src="https://avatars2.githubusercontent.com/u/37537300?v=4" width="110px;"/><br /><sub>lea-mink</sub>](https://github.com/lea-mink)<br />[💻](https://github.com/snipe/snipe-it/commits?author=lea-mink "Code") | [<img src="https://avatars0.githubusercontent.com/u/7140719?v=4" width="110px;"/><br /><sub>Hannah Tinkler</sub>](https://github.com/hannahtinkler)<br />[💻](https://github.com/snipe/snipe-it/commits?author=hannahtinkler "Code") |
| [<img src="https://avatars1.githubusercontent.com/u/1086388?v=4" width="110px;"/><br /><sub>Doeke Zanstra</sub>](https://github.com/doekman)<br />[💻](https://github.com/snipe/snipe-it/commits?author=doekman "Code") | [<img src="https://avatars1.githubusercontent.com/u/4325936?v=4" width="110px;"/><br /><sub>Djamon Staal</sub>](https://www.sdhd.nl/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=SjamonDaal "Code") | [<img src="https://avatars3.githubusercontent.com/u/12306859?v=4" width="110px;"/><br /><sub>Earl Ramirez</sub>](https://github.com/EarlRamirez)<br />[💻](https://github.com/snipe/snipe-it/commits?author=EarlRamirez "Code") | [<img src="https://avatars2.githubusercontent.com/u/8671456?v=4" width="110px;"/><br /><sub>Richard Ray Thomas</sub>](https://github.com/RichardRay)<br />[💻](https://github.com/snipe/snipe-it/commits?author=RichardRay "Code") | [<img src="https://avatars3.githubusercontent.com/u/1852688?v=4" width="110px;"/><br /><sub>Ryan Kuba</sub>](https://www.taisun.io/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=thelamer "Code") | [<img src="https://avatars1.githubusercontent.com/u/6751928?v=4" width="110px;"/><br /><sub>Brian Monroe</sub>](https://github.com/ParadoxGuitarist)<br />[💻](https://github.com/snipe/snipe-it/commits?author=ParadoxGuitarist "Code") | [<img src="https://avatars1.githubusercontent.com/u/605167?v=4" width="110px;"/><br /><sub>plexorama</sub>](https://github.com/plexorama)<br />[💻](https://github.com/snipe/snipe-it/commits?author=plexorama "Code") |
| [<img src="https://avatars2.githubusercontent.com/u/1795149?v=4" width="110px;"/><br /><sub>Till Deeke</sub>](https://tilldeeke.de)<br />[💻](https://github.com/snipe/snipe-it/commits?author=tilldeeke "Code") | [<img src="https://avatars0.githubusercontent.com/u/12634129?v=4" width="110px;"/><br /><sub>5quirrel</sub>](https://github.com/5quirrel)<br />[💻](https://github.com/snipe/snipe-it/commits?author=5quirrel "Code") | [<img src="https://avatars1.githubusercontent.com/u/13071957?v=4" width="110px;"/><br /><sub>Jason</sub>](https://github.com/jasonlshelton)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jasonlshelton "Code") | [<img src="https://avatars3.githubusercontent.com/u/7128321?v=4" width="110px;"/><br /><sub>Antti</sub>](https://github.com/chemfy)<br />[💻](https://github.com/snipe/snipe-it/commits?author=chemfy "Code") | [<img src="https://avatars3.githubusercontent.com/u/10080364?v=4" width="110px;"/><br /><sub>DeusMaximus</sub>](https://github.com/DeusMaximus)<br />[💻](https://github.com/snipe/snipe-it/commits?author=DeusMaximus "Code") | [<img src="https://avatars2.githubusercontent.com/u/16384611?v=4" width="110px;"/><br /><sub>a-royal</sub>](https://github.com/A-ROYAL)<br />[🌍](#translation-A-ROYAL "Translation") | [<img src="https://avatars0.githubusercontent.com/u/5358208?v=4" width="110px;"/><br /><sub>Alberto Aldrigo</sub>](https://github.com/albertoaldrigo)<br />[🌍](#translation-albertoaldrigo "Translation") |
| [<img src="https://avatars0.githubusercontent.com/u/1412342?v=4" width="110px;"/><br /><sub>Alex Stanev</sub>](http://alex.stanev.org/blog)<br />[🌍](#translation-RealEnder "Translation") | [<img src="https://avatars0.githubusercontent.com/u/177295?v=4" width="110px;"/><br /><sub>Andreas Rehm</sub>](http://devel.itsolution2.de)<br />[🌍](#translation-sirrus "Translation") | [<img src="https://avatars0.githubusercontent.com/u/5080535?v=4" width="110px;"/><br /><sub>Andreas Erhard</sub>](https://github.com/xelan)<br />[🌍](#translation-xelan "Translation") | [<img src="https://avatars2.githubusercontent.com/u/142350?v=4" width="110px;"/><br /><sub>Andrés Vanegas Jiménez</sub>](https://github.com/angeldeejay)<br />[🌍](#translation-angeldeejay "Translation") | [<img src="https://avatars0.githubusercontent.com/u/3910403?v=4" width="110px;"/><br /><sub>Antonio Schiavon</sub>](https://github.com/aschiavon91)<br />[🌍](#translation-aschiavon91 "Translation") | [<img src="https://avatars0.githubusercontent.com/u/10464547?v=4" width="110px;"/><br /><sub>benunter</sub>](https://github.com/benunter)<br />[🌍](#translation-benunter "Translation") | [<img src="https://avatars1.githubusercontent.com/u/5038647?v=4" width="110px;"/><br /><sub>Borys Żmuda</sub>](http://catweb24.pl)<br />[🌍](#translation-rudashi "Translation") |
| [<img src="https://avatars0.githubusercontent.com/u/5539359?v=4" width="110px;"/><br /><sub>chibacityblues</sub>](https://github.com/chibacityblues)<br />[🌍](#translation-chibacityblues "Translation") | [<img src="https://avatars1.githubusercontent.com/u/1954830?v=4" width="110px;"/><br /><sub>Chien Wei Lin</sub>](https://github.com/cwlin0416)<br />[🌍](#translation-cwlin0416 "Translation") | [<img src="https://avatars3.githubusercontent.com/u/11700533?v=4" width="110px;"/><br /><sub>Christian Schuster</sub>](https://github.com/Againstreality)<br />[🌍](#translation-Againstreality "Translation") | [<img src="https://avatars1.githubusercontent.com/u/4308704?v=4" width="110px;"/><br /><sub>Christian Stefanus</sub>](http://chriss.webhostid.com)<br />[🌍](#translation-kopi-item "Translation") | [<img src="https://avatars3.githubusercontent.com/u/3009327?v=4" width="110px;"/><br /><sub>wxcafé</sub>](http://wxcafe.net)<br />[🌍](#translation-wxcafe "Translation") | [<img src="https://avatars3.githubusercontent.com/u/35761525?v=4" width="110px;"/><br /><sub>dpyroc</sub>](https://github.com/dpyroc)<br />[🌍](#translation-dpyroc "Translation") | [<img src="https://avatars1.githubusercontent.com/u/2153639?v=4" width="110px;"/><br /><sub>Daniel Friedlmaier</sub>](http://www.friedlmaier.net)<br />[🌍](#translation-da-friedl "Translation") |
| [<img src="https://avatars1.githubusercontent.com/u/2947640?v=4" width="110px;"/><br /><sub>Daniel Heene</sub>](https://github.com/danielheene)<br />[🌍](#translation-danielheene "Translation") | [<img src="https://avatars3.githubusercontent.com/u/319022?v=4" width="110px;"/><br /><sub>danielcb</sub>](https://github.com/danielcb)<br />[🌍](#translation-danielcb "Translation") | [<img src="https://avatars3.githubusercontent.com/u/15846537?v=4" width="110px;"/><br /><sub>Dominik Senti</sub>](https://github.com/dominiksenti)<br />[🌍](#translation-dominiksenti "Translation") | [<img src="https://avatars0.githubusercontent.com/u/25570954?v=4" width="110px;"/><br /><sub>Eric Gautheron</sub>](http://www.konectik.com)<br />[🌍](#translation-EpixFr "Translation") | [<img src="https://avatars1.githubusercontent.com/u/5732623?v=4" width="110px;"/><br /><sub>Erlend Pilø</sub>](https://erlpil.com)<br />[🌍](#translation-Erlpil "Translation") | [<img src="https://avatars0.githubusercontent.com/u/541832?v=4" width="110px;"/><br /><sub>Fabio Rapposelli</sub>](http://fabio.technology)<br />[🌍](#translation-frapposelli "Translation") | [<img src="https://avatars2.githubusercontent.com/u/3605240?v=4" width="110px;"/><br /><sub>Felipe Barros</sub>](https://github.com/fgbs)<br />[🌍](#translation-fgbs "Translation") |
| [<img src="https://avatars0.githubusercontent.com/u/257745?v=4" width="110px;"/><br /><sub>Fernando Possebon</sub>](https://github.com/possebon)<br />[🌍](#translation-possebon "Translation") | [<img src="https://avatars3.githubusercontent.com/u/2540832?v=4" width="110px;"/><br /><sub>gdraque</sub>](https://github.com/gdraque)<br />[🌍](#translation-gdraque "Translation") | [<img src="https://avatars0.githubusercontent.com/u/23440381?v=4" width="110px;"/><br /><sub>Georg Wallisch</sub>](https://github.com/georgwallisch)<br />[🌍](#translation-georgwallisch "Translation") | [<img src="https://avatars1.githubusercontent.com/u/9852832?v=4" width="110px;"/><br /><sub>Gerardo Robles</sub>](https://github.com/jgroblesr85)<br />[🌍](#translation-jgroblesr85 "Translation") | [<img src="https://avatars2.githubusercontent.com/u/11082640?v=4" width="110px;"/><br /><sub>Gluek</sub>](https://t.me/Gluek)<br />[🌍](#translation-mrgluek "Translation") | [<img src="https://avatars0.githubusercontent.com/u/6847946?v=4" width="110px;"/><br /><sub>AdnanAbuShahad</sub>](https://github.com/AdnanAbuShahad)<br />[🌍](#translation-AdnanAbuShahad "Translation") | [<img src="https://avatars1.githubusercontent.com/u/3580608?v=4" width="110px;"/><br /><sub>Hafidzi My</sub>](https://hafidzi.my)<br />[🌍](#translation-hafidzi "Translation") |
| [<img src="https://avatars2.githubusercontent.com/u/205521?v=4" width="110px;"/><br /><sub>Harim Park</sub>](https://github.com/fofwisdom)<br />[🌍](#translation-fofwisdom "Translation") | [<img src="https://avatars2.githubusercontent.com/u/3333841?v=4" width="110px;"/><br /><sub>Henrik Kentsson</sub>](http://www.kentsson.se)<br />[🌍](#translation-Kentsson "Translation") | [<img src="https://avatars0.githubusercontent.com/u/36551034?v=4" width="110px;"/><br /><sub>Husnul Yaqien</sub>](https://github.com/husnulyaqien)<br />[🌍](#translation-husnulyaqien "Translation") | [<img src="https://avatars1.githubusercontent.com/u/2372747?v=4" width="110px;"/><br /><sub>Ibrahim</sub>](http://abaalkhail.org)<br />[🌍](#translation-abaalkh "Translation") | [<img src="https://avatars0.githubusercontent.com/u/1389334?v=4" width="110px;"/><br /><sub>igolman</sub>](https://github.com/igolman)<br />[🌍](#translation-igolman "Translation") | [<img src="https://avatars1.githubusercontent.com/u/3257070?v=4" width="110px;"/><br /><sub>itangiang</sub>](https://github.com/itangiang)<br />[🌍](#translation-itangiang "Translation") | [<img src="https://avatars2.githubusercontent.com/u/14814254?v=4" width="110px;"/><br /><sub>jarby1211</sub>](https://github.com/jarby1211)<br />[🌍](#translation-jarby1211 "Translation") |
| [<img src="https://avatars3.githubusercontent.com/u/6719357?v=4" width="110px;"/><br /><sub>Jhonn Willker</sub>](http://jwillker.com)<br />[🌍](#translation-JohnWillker "Translation") | [<img src="https://avatars2.githubusercontent.com/u/10983635?v=4" width="110px;"/><br /><sub>Jose</sub>](https://github.com/joxelito94)<br />[🌍](#translation-joxelito94 "Translation") | [<img src="https://avatars0.githubusercontent.com/u/5206122?v=4" width="110px;"/><br /><sub>laopangzi</sub>](https://github.com/laopangzi)<br />[🌍](#translation-laopangzi "Translation") | [<img src="https://avatars2.githubusercontent.com/u/79707?v=4" width="110px;"/><br /><sub>Lars Strojny</sub>](http://usrportage.de)<br />[🌍](#translation-lstrojny "Translation") | [<img src="https://avatars0.githubusercontent.com/u/389801?v=4" width="110px;"/><br /><sub>MarcosBL</sub>](http://twitter.com/marcosbl)<br />[🌍](#translation-MarcosBL "Translation") | [<img src="https://avatars3.githubusercontent.com/u/35664606?v=4" width="110px;"/><br /><sub>marie joy cajes</sub>](https://github.com/mariejoyacajes)<br />[🌍](#translation-mariejoyacajes "Translation") | [<img src="https://avatars2.githubusercontent.com/u/3052816?v=4" width="110px;"/><br /><sub>Mark S. Johansen</sub>](http://www.markjohansen.dk)<br />[🌍](#translation-msjohansen "Translation") |
| [<img src="https://avatars2.githubusercontent.com/u/982885?v=4" width="110px;"/><br /><sub>Martin Stub</sub>](http://martinstub.dk)<br />[🌍](#translation-stubben "Translation") | [<img src="https://avatars2.githubusercontent.com/u/28959963?v=4" width="110px;"/><br /><sub>Meyer Flavio</sub>](https://github.com/meyerf99)<br />[🌍](#translation-meyerf99 "Translation") | [<img src="https://avatars3.githubusercontent.com/u/796443?v=4" width="110px;"/><br /><sub>Micael Rodrigues</sub>](https://github.com/MicaelRodrigues)<br />[🌍](#translation-MicaelRodrigues "Translation") | [<img src="https://avatars0.githubusercontent.com/u/10481331?v=4" width="110px;"/><br /><sub>Mikael Rasmussen</sub>](http://rubixy.com/)<br />[🌍](#translation-mikaelssen "Translation") | [<img src="https://avatars1.githubusercontent.com/u/1544552?v=4" width="110px;"/><br /><sub>IxFail</sub>](https://github.com/IxFail)<br />[🌍](#translation-IxFail "Translation") | [<img src="https://avatars3.githubusercontent.com/u/18483118?v=4" width="110px;"/><br /><sub>Mohammed Fota</sub>](http://www.mohammedfota.com)<br />[🌍](#translation-MohammedFota "Translation") | [<img src="https://avatars0.githubusercontent.com/u/227080?v=4" width="110px;"/><br /><sub>Moayad Alserihi</sub>](https://github.com/omego)<br />[🌍](#translation-omego "Translation") |
| [<img src="https://avatars0.githubusercontent.com/u/1680266?v=4" width="110px;"/><br /><sub>saymd</sub>](https://github.com/saymd)<br />[🌍](#translation-saymd "Translation") | [<img src="https://avatars0.githubusercontent.com/u/1826808?v=4" width="110px;"/><br /><sub>Patrik Larsson</sub>](https://nordsken.se)<br />[🌍](#translation-pooot "Translation") | [<img src="https://avatars1.githubusercontent.com/u/20584746?v=4" width="110px;"/><br /><sub>drcryo</sub>](https://github.com/drcryo)<br />[🌍](#translation-drcryo "Translation") | [<img src="https://avatars1.githubusercontent.com/u/19408004?v=4" width="110px;"/><br /><sub>pawel1615</sub>](https://github.com/pawel1615)<br />[🌍](#translation-pawel1615 "Translation") | [<img src="https://avatars2.githubusercontent.com/u/23340468?v=4" width="110px;"/><br /><sub>bodrovics</sub>](https://github.com/bodrovics)<br />[🌍](#translation-bodrovics "Translation") | [<img src="https://avatars0.githubusercontent.com/u/3257654?v=4" width="110px;"/><br /><sub>priatna</sub>](https://github.com/priatna)<br />[🌍](#translation-priatna "Translation") | [<img src="https://avatars1.githubusercontent.com/u/5358374?v=4" width="110px;"/><br /><sub>Fan Jiang</sub>](https://amayume.net)<br />[🌍](#translation-ProfFan "Translation") |
| [<img src="https://avatars1.githubusercontent.com/u/22555451?v=4" width="110px;"/><br /><sub>ragnarcx</sub>](https://github.com/ragnarcx)<br />[🌍](#translation-ragnarcx "Translation") | [<img src="https://avatars2.githubusercontent.com/u/18654582?v=4" width="110px;"/><br /><sub>Rein van Haaren</sub>](http://www.reinvanhaaren.nl/)<br />[🌍](#translation-reinvanhaaren "Translation") | [<img src="https://avatars1.githubusercontent.com/u/386672?v=4" width="110px;"/><br /><sub>Teguh Dwicaksana</sub>](http://dheche.songolimo.net)<br />[🌍](#translation-dheche "Translation") | [<img src="https://avatars2.githubusercontent.com/u/2572552?v=4" width="110px;"/><br /><sub>fraccie</sub>](https://github.com/FRaccie)<br />[🌍](#translation-FRaccie "Translation") | [<img src="https://avatars0.githubusercontent.com/u/35182720?v=4" width="110px;"/><br /><sub>vinzruzell</sub>](https://github.com/vinzruzell)<br />[🌍](#translation-vinzruzell "Translation") | [<img src="https://avatars1.githubusercontent.com/u/7883603?v=4" width="110px;"/><br /><sub>Kevin Austin</sub>](http://kevinaustin.com)<br />[🌍](#translation-vipsystem "Translation") | [<img src="https://avatars3.githubusercontent.com/u/3861828?v=4" width="110px;"/><br /><sub>Wira Sandy</sub>](http://azuraweb.xyz)<br />[🌍](#translation-wira-sandy "Translation") |
| [<img src="https://avatars2.githubusercontent.com/u/8663789?v=4" width="110px;"/><br /><sub>Илья</sub>](https://github.com/GrayHoax)<br />[🌍](#translation-GrayHoax "Translation") | [<img src="https://avatars3.githubusercontent.com/u/30119111?v=4" width="110px;"/><br /><sub>GodUseVPN</sub>](https://github.com/godusevpn)<br />[🌍](#translation-godusevpn "Translation") | [<img src="https://avatars1.githubusercontent.com/u/745576?v=4" width="110px;"/><br /><sub>周周</sub>](https://github.com/EngrZhou)<br />[🌍](#translation-EngrZhou "Translation") | [<img src="https://avatars3.githubusercontent.com/u/1631095?v=4" width="110px;"/><br /><sub>Sam</sub>](https://github.com/takuy)<br />[💻](https://github.com/snipe/snipe-it/commits?author=takuy "Code") | [<img src="https://avatars1.githubusercontent.com/u/264022?v=4" width="110px;"/><br /><sub>Azerothian</sub>](https://www.illisian.com.au)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Azerothian "Code") | [<img src="https://avatars1.githubusercontent.com/u/4930051?v=4" width="110px;"/><br /><sub>Wes Hulette</sub>](http://macfoo.wordpress.com/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jwhulette "Code") | [<img src="https://avatars0.githubusercontent.com/u/8134591?v=4" width="110px;"/><br /><sub>patrict</sub>](https://github.com/patrict)<br />[💻](https://github.com/snipe/snipe-it/commits?author=patrict "Code") |
| [<img src="https://avatars3.githubusercontent.com/u/2611616?v=4" width="110px;"/><br /><sub>Dmitriy Minaev</sub>](https://github.com/VELIKII-DIVAN)<br />[💻](https://github.com/snipe/snipe-it/commits?author=VELIKII-DIVAN "Code") | [<img src="https://avatars0.githubusercontent.com/u/5132245?v=4" width="110px;"/><br /><sub>liquidhorse</sub>](https://github.com/liquidhorse)<br />[💻](https://github.com/snipe/snipe-it/commits?author=liquidhorse "Code") | [<img src="https://avatars1.githubusercontent.com/u/183678?v=4" width="110px;"/><br /><sub>Jordi Boggiano</sub>](https://seld.be/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Seldaek "Code") | [<img src="https://avatars0.githubusercontent.com/u/653557?v=4" width="110px;"/><br /><sub>Ivan Nieto</sub>](https://github.com/inietov)<br />[💻](https://github.com/snipe/snipe-it/commits?author=inietov "Code") | [<img src="https://avatars2.githubusercontent.com/u/6764151?v=4" width="110px;"/><br /><sub>Ben RUBSON</sub>](https://github.com/benrubson)<br />[💻](https://github.com/snipe/snipe-it/commits?author=benrubson "Code") | [<img src="https://avatars2.githubusercontent.com/u/8554558?v=4" width="110px;"/><br /><sub>NMathar</sub>](https://github.com/NMathar)<br />[💻](https://github.com/snipe/snipe-it/commits?author=NMathar "Code") | [<img src="https://avatars1.githubusercontent.com/u/139566?v=4" width="110px;"/><br /><sub>Steffen</sub>](https://github.com/smb)<br />[💻](https://github.com/snipe/snipe-it/commits?author=smb "Code") |
| [<img src="https://avatars0.githubusercontent.com/u/6609453?v=4" width="110px;"/><br /><sub>Sxderp</sub>](https://github.com/Sxderp)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Sxderp "Code") | [<img src="https://avatars1.githubusercontent.com/u/4807843?v=4" width="110px;"/><br /><sub>fanta8897</sub>](https://github.com/fanta8897)<br />[💻](https://github.com/snipe/snipe-it/commits?author=fanta8897 "Code") | [<img src="https://avatars2.githubusercontent.com/u/2576509?v=4" width="110px;"/><br /><sub>Andrey Bolonin</sub>](https://andreybolonin.com/phpconsulting/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=andreybolonin "Code") | [<img src="https://avatars3.githubusercontent.com/u/2173307?v=4" width="110px;"/><br /><sub>shinayoshi</sub>](http://www.shinayoshi.net/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=shinayoshi "Code") | [<img src="https://avatars3.githubusercontent.com/u/2130159?v=4" width="110px;"/><br /><sub>Hubert</sub>](https://github.com/reuser)<br />[💻](https://github.com/snipe/snipe-it/commits?author=reuser "Code") | [<img src="https://avatars0.githubusercontent.com/u/6865789?v=4" width="110px;"/><br /><sub>KeenRivals</sub>](https://brashear.me)<br />[💻](https://github.com/snipe/snipe-it/commits?author=KeenRivals "Code") | [<img src="https://avatars3.githubusercontent.com/u/2902513?v=4" width="110px;"/><br /><sub>omyno</sub>](https://github.com/omyno)<br />[💻](https://github.com/snipe/snipe-it/commits?author=omyno "Code") |
| [<img src="https://avatars1.githubusercontent.com/u/6271335?v=4" width="110px;"/><br /><sub>Evgeny</sub>](https://github.com/jackka)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jackka "Code") | [<img src="https://avatars2.githubusercontent.com/u/1169963?v=4" width="110px;"/><br /><sub>Colin Campbell</sub>](https://digitalist.se)<br />[💻](https://github.com/snipe/snipe-it/commits?author=colin-campbell "Code") | [<img src="https://avatars3.githubusercontent.com/u/2872098?v=4" width="110px;"/><br /><sub>Ľubomír Kučera</sub>](https://github.com/lubo)<br />[💻](https://github.com/snipe/snipe-it/commits?author=lubo "Code") | [<img src="https://avatars3.githubusercontent.com/u/570639?v=4" width="110px;"/><br /><sub>Martin Meredith</sub>](https://www.sourceguru.net)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Mezzle "Code") | [<img src="https://avatars1.githubusercontent.com/u/7632599?v=4" width="110px;"/><br /><sub>Tim Farmer</sub>](https://github.com/timothyfarmer)<br />[💻](https://github.com/snipe/snipe-it/commits?author=timothyfarmer "Code") | [<img src="https://avatars0.githubusercontent.com/u/17459600?v=4" width="110px;"/><br /><sub>Marián Skrip</sub>](https://github.com/mskrip)<br />[💻](https://github.com/snipe/snipe-it/commits?author=mskrip "Code") | [<img src="https://avatars2.githubusercontent.com/u/47435081?v=4" width="110px;"/><br /><sub>Godfrey Martinez</sub>](https://github.com/Godmartinz)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Godmartinz "Code") |
| [<img src="https://avatars1.githubusercontent.com/u/2075128?v=4" width="110px;"/><br /><sub>bigtreeEdo</sub>](https://github.com/bigtreeEdo)<br />[💻](https://github.com/snipe/snipe-it/commits?author=bigtreeEdo "Code") | [<img src="https://avatars0.githubusercontent.com/u/5000430?v=4" width="110px;"/><br /><sub>Colin McNeil</sub>](https://colinmcneil.me/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=ColinMcNeil "Code") | [<img src="https://avatars0.githubusercontent.com/u/421625?v=4" width="110px;"/><br /><sub>JoKneeMo</sub>](https://github.com/JoKneeMo)<br />[💻](https://github.com/snipe/snipe-it/commits?author=JoKneeMo "Code") | [<img src="https://avatars0.githubusercontent.com/u/54849013?v=4" width="110px;"/><br /><sub>Joshi</sub>](http://www.redbridge.se)<br />[💻](https://github.com/snipe/snipe-it/commits?author=joshi-redbridge "Code") | [<img src="https://avatars2.githubusercontent.com/u/15731458?v=4" width="110px;"/><br /><sub>Anthony Burns</sub>](https://github.com/anthonypburns)<br />[💻](https://github.com/snipe/snipe-it/commits?author=anthonypburns "Code") | [<img src="https://avatars1.githubusercontent.com/u/63399474?v=4" width="110px;"/><br /><sub>johnson-yi</sub>](https://github.com/johnson-yi)<br />[💻](https://github.com/snipe/snipe-it/commits?author=johnson-yi "Code") | [<img src="https://avatars1.githubusercontent.com/u/1862720?v=4" width="110px;"/><br /><sub>Sanjay Govind</sub>](https://tangentmc.net)<br />[💻](https://github.com/snipe/snipe-it/commits?author=sanjay900 "Code") |
| [<img src="https://avatars0.githubusercontent.com/u/1255375?v=4" width="110px;"/><br /><sub>Peter Upfold</sub>](https://peter.upfold.org.uk/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=PeterUpfold "Code") | [<img src="https://avatars2.githubusercontent.com/u/961717?v=4" width="110px;"/><br /><sub>Jared Biel</sub>](https://github.com/jbiel)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jbiel "Code") | [<img src="https://avatars1.githubusercontent.com/u/1733625?v=4" width="110px;"/><br /><sub>Dampfklon</sub>](https://github.com/dampfklon)<br />[💻](https://github.com/snipe/snipe-it/commits?author=dampfklon "Code") | [<img src="https://avatars2.githubusercontent.com/u/52973156?v=4" width="110px;"/><br /><sub>Charles Hamilton</sub>](https://communityclosing.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=chamilton-ccn "Code") | [<img src="https://avatars.githubusercontent.com/u/551789?v=4" width="110px;"/><br /><sub>Giuseppe Iannello</sub>](https://github.com/giannello)<br />[💻](https://github.com/snipe/snipe-it/commits?author=giannello "Code") | [<img src="https://avatars.githubusercontent.com/u/3691490?v=4" width="110px;"/><br /><sub>Peter Dave Hello</sub>](https://www.peterdavehello.org/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=PeterDaveHello "Code") | [<img src="https://avatars.githubusercontent.com/u/6106332?v=4" width="110px;"/><br /><sub>sigmoidal</sub>](https://github.com/sigmoidal)<br />[💻](https://github.com/snipe/snipe-it/commits?author=sigmoidal "Code") |
| [<img src="https://avatars.githubusercontent.com/u/2082554?v=4" width="110px;"/><br /><sub>Vincent Lainé</sub>](https://github.com/phenixdotnet)<br />[💻](https://github.com/snipe/snipe-it/commits?author=phenixdotnet "Code") | [<img src="https://avatars.githubusercontent.com/u/1943040?v=4" width="110px;"/><br /><sub>Lucas Pleß</sub>](http://www.lucas-pless.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=derlucas "Code") | [<img src="https://avatars.githubusercontent.com/u/472804?v=4" width="110px;"/><br /><sub>Ian Littman</sub>](http://twitter.com/iansltx)<br />[💻](https://github.com/snipe/snipe-it/commits?author=iansltx "Code") | [<img src="https://avatars.githubusercontent.com/u/3519029?v=4" width="110px;"/><br /><sub>João Paulo</sub>](https://github.com/PauloLuna)<br />[💻](https://github.com/snipe/snipe-it/commits?author=PauloLuna "Code") | [<img src="https://avatars.githubusercontent.com/u/70443365?v=4" width="110px;"/><br /><sub>ThoBur</sub>](https://github.com/ThoBur)<br />[💻](https://github.com/snipe/snipe-it/commits?author=ThoBur "Code") | [<img src="https://avatars.githubusercontent.com/u/1972329?v=4" width="110px;"/><br /><sub>Alexander Chibrikin</sub>](http://phpprofi.ru/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=alek13 "Code") | [<img src="https://avatars.githubusercontent.com/u/438332?v=4" width="110px;"/><br /><sub>Anthony Winstanley</sub>](https://github.com/winstan)<br />[💻](https://github.com/snipe/snipe-it/commits?author=winstan "Code") |
| [<img src="https://avatars.githubusercontent.com/u/3075214?v=4" width="110px;"/><br /><sub>Folke</sub>](https://github.com/fashberg)<br />[💻](https://github.com/snipe/snipe-it/commits?author=fashberg "Code") | [<img src="https://avatars.githubusercontent.com/u/1351571?v=4" width="110px;"/><br /><sub>Bennett Blodinger</sub>](https://github.com/benwa)<br />[💻](https://github.com/snipe/snipe-it/commits?author=benwa "Code") | [<img src="https://avatars.githubusercontent.com/u/2974631?v=4" width="110px;"/><br /><sub>NMC</sub>](https://nmc.dev)<br />[💻](https://github.com/snipe/snipe-it/commits?author=ncareau "Code") | [<img src="https://avatars.githubusercontent.com/u/52182449?v=4" width="110px;"/><br /><sub>andres-baller</sub>](https://github.com/andres-baller)<br />[💻](https://github.com/snipe/snipe-it/commits?author=andres-baller "Code") | [<img src="https://avatars.githubusercontent.com/u/67109348?v=4" width="110px;"/><br /><sub>sean-borg</sub>](https://github.com/sean-borg)<br />[💻](https://github.com/snipe/snipe-it/commits?author=sean-borg "Code") | [<img src="https://avatars.githubusercontent.com/u/32170051?v=4" width="110px;"/><br /><sub>EDVLeer</sub>](https://github.com/EDVLeer)<br />[💻](https://github.com/snipe/snipe-it/commits?author=EDVLeer "Code") | [<img src="https://avatars.githubusercontent.com/u/23075196?v=4" width="110px;"/><br /><sub>Kurokat</sub>](https://github.com/Kurokat)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Kurokat "Code") |
| [<img src="https://avatars.githubusercontent.com/u/915514?v=4" width="110px;"/><br /><sub>Kevin Köllmann</sub>](https://www.kevinkoellmann.de)<br />[💻](https://github.com/snipe/snipe-it/commits?author=koelle25 "Code") | [<img src="https://avatars.githubusercontent.com/u/49025941?v=4" width="110px;"/><br /><sub>sw-mreyes</sub>](https://github.com/sw-mreyes)<br />[💻](https://github.com/snipe/snipe-it/commits?author=sw-mreyes "Code") | [<img src="https://avatars.githubusercontent.com/u/70129?v=4" width="110px;"/><br /><sub>Joel Pittet</sub>](https://pittet.ca)<br />[💻](https://github.com/snipe/snipe-it/commits?author=joelpittet "Code") | [<img src="https://avatars.githubusercontent.com/u/792695?v=4" width="110px;"/><br /><sub>Eli Young</sub>](https://elyscape.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=elyscape "Code") | [<img src="https://avatars.githubusercontent.com/u/317015?v=4" width="110px;"/><br /><sub>Raell Dottin</sub>](https://github.com/raelldottin)<br />[💻](https://github.com/snipe/snipe-it/commits?author=raelldottin "Code") | [<img src="https://avatars.githubusercontent.com/u/1446856?v=4" width="110px;"/><br /><sub>Tom Misilo</sub>](https://github.com/misilot)<br />[💻](https://github.com/snipe/snipe-it/commits?author=misilot "Code") | [<img src="https://avatars.githubusercontent.com/u/4496300?v=4" width="110px;"/><br /><sub>David Davenne</sub>](http://david.davenne.be)<br />[💻](https://github.com/snipe/snipe-it/commits?author=JuustoMestari "Code") |
| [<img src="https://avatars.githubusercontent.com/u/9255772?v=4" width="110px;"/><br /><sub>Mark Stenglein</sub>](https://markstenglein.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=ocelotsloth "Code") | [<img src="https://avatars.githubusercontent.com/u/35658596?v=4" width="110px;"/><br /><sub>ajsy</sub>](https://github.com/ajsy)<br />[💻](https://github.com/snipe/snipe-it/commits?author=ajsy "Code") | [<img src="https://avatars.githubusercontent.com/u/3628035?v=4" width="110px;"/><br /><sub>Jan Kiesewetter</sub>](https://github.com/t3easy)<br />[💻](https://github.com/snipe/snipe-it/commits?author=t3easy "Code") | [<img src="https://avatars.githubusercontent.com/u/79449630?v=4" width="110px;"/><br /><sub>Tetrachloromethane250</sub>](https://github.com/Tetrachloromethane250)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Tetrachloromethane250 "Code") | [<img src="https://avatars.githubusercontent.com/u/22004482?v=4" width="110px;"/><br /><sub>Lars Kajes</sub>](https://www.kajes.se/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=kajes "Code") | [<img src="https://avatars.githubusercontent.com/u/13993216?v=4" width="110px;"/><br /><sub>Joly0</sub>](https://github.com/Joly0)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Joly0 "Code") | [<img src="https://avatars.githubusercontent.com/u/1501022?v=4" width="110px;"/><br /><sub>theburger</sub>](https://github.com/limeless)<br />[💻](https://github.com/snipe/snipe-it/commits?author=limeless "Code") |
| [<img src="https://avatars.githubusercontent.com/u/36065681?v=4" width="110px;"/><br /><sub>David Valin Alonso</sub>](https://github.com/deivishome)<br />[💻](https://github.com/snipe/snipe-it/commits?author=deivishome "Code") | [<img src="https://avatars.githubusercontent.com/u/8290389?v=4" width="110px;"/><br /><sub>andreaci</sub>](https://github.com/andreaci)<br />[💻](https://github.com/snipe/snipe-it/commits?author=andreaci "Code") | [<img src="https://avatars.githubusercontent.com/u/1828542?v=4" width="110px;"/><br /><sub>Jelle Sebreghts</sub>](http://www.jellesebreghts.be)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Jelle-S "Code") | [<img src="https://avatars.githubusercontent.com/u/11180862?v=4" width="110px;"/><br /><sub>Michael Pietsch</sub>](https://github.com/Skywalker-11)<br /> | [<img src="https://avatars.githubusercontent.com/u/22068886?v=4" width="110px;"/><br /><sub>Masudul Haque Shihab</sub>](https://github.com/sh1hab)<br />[💻](https://github.com/snipe/snipe-it/commits?author=sh1hab "Code") | [<img src="https://avatars.githubusercontent.com/u/16099942?v=4" width="110px;"/><br /><sub>Supapong Areeprasertkul</sub>](http://www.freedomdive.com/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=zybersup "Code") | [<img src="https://avatars.githubusercontent.com/u/207358?v=4" width="110px;"/><br /><sub>Peter Sarossy</sub>](https://github.com/psarossy)<br />[💻](https://github.com/snipe/snipe-it/commits?author=psarossy "Code") |
| [<img src="https://avatars.githubusercontent.com/u/11823649?v=4" width="110px;"/><br /><sub>Renee Margaret McConahy</sub>](https://github.com/nepella)<br />[💻](https://github.com/snipe/snipe-it/commits?author=nepella "Code") | [<img src="https://avatars.githubusercontent.com/u/5553884?v=4" width="110px;"/><br /><sub>JohnnyPicnic</sub>](https://github.com/JohnnyPicnic)<br />[💻](https://github.com/snipe/snipe-it/commits?author=JohnnyPicnic "Code") | [<img src="https://avatars.githubusercontent.com/u/8799594?v=4" width="110px;"/><br /><sub>markbrule</sub>](https://github.com/markbrule)<br />[💻](https://github.com/snipe/snipe-it/commits?author=markbrule "Code") | [<img src="https://avatars.githubusercontent.com/u/1962801?v=4" width="110px;"/><br /><sub>Mike Campbell</sub>](https://github.com/mikecmpbll)<br />[💻](https://github.com/snipe/snipe-it/commits?author=mikecmpbll "Code") | [<img src="https://avatars.githubusercontent.com/u/11973217?v=4" width="110px;"/><br /><sub>tbrconnect</sub>](https://github.com/tbrconnect)<br />[💻](https://github.com/snipe/snipe-it/commits?author=tbrconnect "Code") | [<img src="https://avatars.githubusercontent.com/u/12447225?v=4" width="110px;"/><br /><sub>kcoyo</sub>](https://github.com/kcoyo)<br />[💻](https://github.com/snipe/snipe-it/commits?author=kcoyo "Code") | [<img src="https://avatars.githubusercontent.com/u/494017?v=4" width="110px;"/><br /><sub>Travis Miller</sub>](https://travismiller.com/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=travismiller "Code") |
| [<img src="https://avatars.githubusercontent.com/u/1975640?v=4" width="110px;"/><br /><sub>Evan Taylor</sub>](https://github.com/Delta5)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Delta5 "Code") | [<img src="https://avatars.githubusercontent.com/u/8735148?v=4" width="110px;"/><br /><sub>Petri Asikainen</sub>](https://github.com/PetriAsi)<br />[💻](https://github.com/snipe/snipe-it/commits?author=PetriAsi "Code") | [<img src="https://avatars.githubusercontent.com/u/11424540?v=4" width="110px;"/><br /><sub>derdeagle</sub>](https://github.com/derdeagle)<br />[💻](https://github.com/snipe/snipe-it/commits?author=derdeagle "Code") | [<img src="https://avatars.githubusercontent.com/u/176950?v=4" width="110px;"/><br /><sub>Mike Frysinger</sub>](https://wh0rd.org/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=vapier "Code") | [<img src="https://avatars.githubusercontent.com/u/22044358?v=4" width="110px;"/><br /><sub>ALPHA</sub>](https://github.com/AL4AL)<br />[💻](https://github.com/snipe/snipe-it/commits?author=AL4AL "Code") | [<img src="https://avatars.githubusercontent.com/u/1042587?v=4" width="110px;"/><br /><sub>FliegenKLATSCH</sub>](https://www.ifern.de)<br />[💻](https://github.com/snipe/snipe-it/commits?author=FliegenKLATSCH "Code") | [<img src="https://avatars.githubusercontent.com/u/442138?v=4" width="110px;"/><br /><sub>Jeremy Price</sub>](https://github.com/jerm)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jerm "Code") |
| [<img src="https://avatars.githubusercontent.com/u/84392209?v=4" width="110px;"/><br /><sub>Toreg87</sub>](https://github.com/Toreg87)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Toreg87 "Code") | [<img src="https://avatars.githubusercontent.com/u/67638596?v=4" width="110px;"/><br /><sub>Matthew Nickson</sub>](https://github.com/Computroniks)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Computroniks "Code") | [<img src="https://avatars.githubusercontent.com/u/1646397?v=4" width="110px;"/><br /><sub>Jethro Nederhof</sub>](https://jethron.id.au)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jethron "Code") | [<img src="https://avatars.githubusercontent.com/u/23289826?v=4" width="110px;"/><br /><sub>Oskar Stenberg</sub>](https://github.com/01ste02)<br />[💻](https://github.com/snipe/snipe-it/commits?author=01ste02 "Code") | [<img src="https://avatars.githubusercontent.com/u/82208283?v=4" width="110px;"/><br /><sub>Robert-Azelis</sub>](https://github.com/Robert-Azelis)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Robert-Azelis "Code") | [<img src="https://avatars.githubusercontent.com/u/60648387?v=4" width="110px;"/><br /><sub>Alexander William Smith</sub>](https://github.com/alwism)<br />[💻](https://github.com/snipe/snipe-it/commits?author=alwism "Code") | [<img src="https://avatars.githubusercontent.com/u/24418301?v=4" width="110px;"/><br /><sub>LEITWERK AG</sub>](https://www.leitwerk.de/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=leitwerk-ag "Code") |
| [<img src="https://avatars.githubusercontent.com/u/1911435?v=4" width="110px;"/><br /><sub>Adam</sub>](http://www.aboutcher.co.uk)<br />[💻](https://github.com/snipe/snipe-it/commits?author=adamboutcher "Code") | [<img src="https://avatars.githubusercontent.com/u/16104273?v=4" width="110px;"/><br /><sub>Ian</sub>](https://snksrv.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=sneak-it "Code") | [<img src="https://avatars.githubusercontent.com/u/4023909?v=4" width="110px;"/><br /><sub>Shao Yu-Lung (Allen)</sub>](http://blog.bestlong.idv.tw/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=bestlong "Code") | [<img src="https://avatars.githubusercontent.com/u/76475453?v=4" width="110px;"/><br /><sub>Haxatron</sub>](https://github.com/Haxatron)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Haxatron "Code") | [<img src="https://avatars.githubusercontent.com/u/88776392?v=4" width="110px;"/><br /><sub>PlaneNuts</sub>](https://github.com/PlaneNuts)<br />[💻](https://github.com/snipe/snipe-it/commits?author=PlaneNuts "Code") | [<img src="https://avatars.githubusercontent.com/u/3842948?v=4" width="110px;"/><br /><sub>Bradley Coudriet</sub>](http://bjcpgd.cias.rit.edu)<br />[💻](https://github.com/snipe/snipe-it/commits?author=exula "Code") | [<img src="https://avatars.githubusercontent.com/u/21966173?v=4" width="110px;"/><br /><sub>Dalton Durst</sub>](https://daltondur.st)<br />[💻](https://github.com/snipe/snipe-it/commits?author=UniversalSuperBox "Code") |
| [<img src="https://avatars.githubusercontent.com/u/38761237?v=4" width="110px;"/><br /><sub>Alex Janes</sub>](https://adagiohealth.org)<br />[💻](https://github.com/snipe/snipe-it/commits?author=adagioajanes "Code") | [<img src="https://avatars.githubusercontent.com/u/32387849?v=4" width="110px;"/><br /><sub>Nuraeil</sub>](https://github.com/nuraeil)<br />[💻](https://github.com/snipe/snipe-it/commits?author=nuraeil "Code") | [<img src="https://avatars.githubusercontent.com/u/48162670?v=4" width="110px;"/><br /><sub>TenOfTens</sub>](https://github.com/TenOfTens)<br />[💻](https://github.com/snipe/snipe-it/commits?author=TenOfTens "Code") | [<img src="https://avatars.githubusercontent.com/u/9415391?v=4" width="110px;"/><br /><sub>waffle</sub>](https://ditisjens.be/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=insert-waffle "Code") | [<img src="https://avatars.githubusercontent.com/u/19945501?v=4" width="110px;"/><br /><sub>Yevhenii Huzii</sub>](https://github.com/QveenSi)<br />[💻](https://github.com/snipe/snipe-it/commits?author=QveenSi "Code") | [<img src="https://avatars.githubusercontent.com/u/3839381?v=4" width="110px;"/><br /><sub>Achmad Fienan Rahardianto</sub>](https://github.com/veenone)<br />[💻](https://github.com/snipe/snipe-it/commits?author=veenone "Code") | [<img src="https://avatars.githubusercontent.com/u/19945501?v=4" width="110px;"/><br /><sub>Yevhenii Huzii</sub>](https://github.com/QveenSi)<br />[💻](https://github.com/snipe/snipe-it/commits?author=QveenSi "Code") |
| [<img src="https://avatars.githubusercontent.com/u/97299851?v=4" width="110px;"/><br /><sub>Christian Weirich</sub>](https://github.com/chrisweirich)<br />[💻](https://github.com/snipe/snipe-it/commits?author=chrisweirich "Code") | [<img src="https://avatars.githubusercontent.com/u/1294403?v=4" width="110px;"/><br /><sub>denzfarid</sub>](https://github.com/denzfarid)<br /> | [<img src="https://avatars.githubusercontent.com/u/94018771?v=4" width="110px;"/><br /><sub>ntbutler-nbcs</sub>](https://github.com/ntbutler-nbcs)<br />[💻](https://github.com/snipe/snipe-it/commits?author=ntbutler-nbcs "Code") | [<img src="https://avatars.githubusercontent.com/u/172697?v=4" width="110px;"/><br /><sub>Naveen</sub>](https://naveensrinivasan.dev)<br />[💻](https://github.com/snipe/snipe-it/commits?author=naveensrinivasan "Code") | [<img src="https://avatars.githubusercontent.com/u/55674383?v=4" width="110px;"/><br /><sub>Mike Roquemore</sub>](https://github.com/mikeroq)<br />[💻](https://github.com/snipe/snipe-it/commits?author=mikeroq "Code") | [<img src="https://avatars.githubusercontent.com/u/7991086?v=4" width="110px;"/><br /><sub>Daniel Reeder</sub>](https://github.com/reederda)<br />[🌍](#translation-reederda "Translation") [🌍](#translation-reederda "Translation") [💻](https://github.com/snipe/snipe-it/commits?author=reederda "Code") | [<img src="https://avatars.githubusercontent.com/u/109422491?v=4" width="110px;"/><br /><sub>vickyjaura183</sub>](https://github.com/vickyjaura183)<br />[💻](https://github.com/snipe/snipe-it/commits?author=vickyjaura183 "Code") |
| [<img src="https://avatars.githubusercontent.com/u/32363424?v=4" width="110px;"/><br /><sub>Peace</sub>](https://github.com/julian-piehl)<br />[💻](https://github.com/snipe/snipe-it/commits?author=julian-piehl "Code") | [<img src="https://avatars.githubusercontent.com/u/231528?v=4" width="110px;"/><br /><sub>Kyle Gordon</sub>](https://github.com/kylegordon)<br />[💻](https://github.com/snipe/snipe-it/commits?author=kylegordon "Code") | [<img src="https://avatars.githubusercontent.com/u/53009155?v=4" width="110px;"/><br /><sub>Katharina Drexel</sub>](http://www.bfh.ch)<br />[💻](https://github.com/snipe/snipe-it/commits?author=sunflowerbofh "Code") | [<img src="https://avatars.githubusercontent.com/u/1931963?v=4" width="110px;"/><br /><sub>David Sferruzza</sub>](https://david.sferruzza.fr/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=dsferruzza "Code") | [<img src="https://avatars.githubusercontent.com/u/19511639?v=4" width="110px;"/><br /><sub>Rick Nelson</sub>](https://github.com/rnelsonee)<br />[💻](https://github.com/snipe/snipe-it/commits?author=rnelsonee "Code") | [<img src="https://avatars.githubusercontent.com/u/94169344?v=4" width="110px;"/><br /><sub>BasO12</sub>](https://github.com/BasO12)<br />[💻](https://github.com/snipe/snipe-it/commits?author=BasO12 "Code") | [<img src="https://avatars.githubusercontent.com/u/111710123?v=4" width="110px;"/><br /><sub>Vautia</sub>](https://github.com/Vautia)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Vautia "Code") |
| [<img src="https://avatars.githubusercontent.com/u/28321?v=4" width="110px;"/><br /><sub>Chris Hartjes</sub>](http://www.littlehart.net/atthekeyboard)<br />[💻](https://github.com/snipe/snipe-it/commits?author=chartjes "Code") | [<img src="https://avatars.githubusercontent.com/u/2404584?v=4" width="110px;"/><br /><sub>geo-chen</sub>](https://github.com/geo-chen)<br />[💻](https://github.com/snipe/snipe-it/commits?author=geo-chen "Code") | [<img src="https://avatars.githubusercontent.com/u/6006620?v=4" width="110px;"/><br /><sub>Phan Nguyen</sub>](https://github.com/nh314)<br />[💻](https://github.com/snipe/snipe-it/commits?author=nh314 "Code") | [<img src="https://avatars.githubusercontent.com/u/115993812?v=4" width="110px;"/><br /><sub>Iisakki Jaakkola</sub>](https://github.com/StarlessNights)<br />[💻](https://github.com/snipe/snipe-it/commits?author=StarlessNights "Code") | [<img src="https://avatars.githubusercontent.com/u/22633385?v=4" width="110px;"/><br /><sub>Ikko Ashimine</sub>](https://bandism.net/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=eltociear "Code") | [<img src="https://avatars.githubusercontent.com/u/56871540?v=4" width="110px;"/><br /><sub>Lukas Fehling</sub>](https://github.com/lukasfehling)<br />[💻](https://github.com/snipe/snipe-it/commits?author=lukasfehling "Code") | [<img src="https://avatars.githubusercontent.com/u/1975990?v=4" width="110px;"/><br /><sub>Fernando Almeida</sub>](https://github.com/fernando-almeida)<br />[💻](https://github.com/snipe/snipe-it/commits?author=fernando-almeida "Code") |
| [<img src="https://avatars.githubusercontent.com/u/116301219?v=4" width="110px;"/><br /><sub>akemidx</sub>](https://github.com/akemidx)<br />[💻](https://github.com/snipe/snipe-it/commits?author=akemidx "Code") | [<img src="https://avatars.githubusercontent.com/u/144778?v=4" width="110px;"/><br /><sub>Oguz Bilgic</sub>](http://oguz.site)<br />[💻](https://github.com/snipe/snipe-it/commits?author=oguzbilgic "Code") | [<img src="https://avatars.githubusercontent.com/u/9262438?v=4" width="110px;"/><br /><sub>Scooter Crawford</sub>](https://github.com/scoo73r)<br />[💻](https://github.com/snipe/snipe-it/commits?author=scoo73r "Code") | [<img src="https://avatars.githubusercontent.com/u/5957345?v=4" width="110px;"/><br /><sub>subdriven</sub>](https://github.com/subdriven)<br />[💻](https://github.com/snipe/snipe-it/commits?author=subdriven "Code") | [<img src="https://avatars.githubusercontent.com/u/658865?v=4" width="110px;"/><br /><sub>Andrew Savinykh</sub>](https://github.com/AndrewSav)<br />[💻](https://github.com/snipe/snipe-it/commits?author=AndrewSav "Code") | [<img src="https://avatars.githubusercontent.com/u/1155067?v=4" width="110px;"/><br /><sub>Tadayuki Onishi</sub>](https://kenchan0130.github.io)<br />[💻](https://github.com/snipe/snipe-it/commits?author=kenchan0130 "Code") | [<img src="https://avatars.githubusercontent.com/u/112496896?v=4" width="110px;"/><br /><sub>Florian</sub>](https://github.com/floschoepfer)<br />[💻](https://github.com/snipe/snipe-it/commits?author=floschoepfer "Code") |
| [<img src="https://avatars.githubusercontent.com/u/7305753?v=4" width="110px;"/><br /><sub>Spencer Long</sub>](http://spencerlong.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=spencerrlongg "Code") | [<img src="https://avatars.githubusercontent.com/u/1141514?v=4" width="110px;"/><br /><sub>Marcus Moore</sub>](https://github.com/marcusmoore)<br />[💻](https://github.com/snipe/snipe-it/commits?author=marcusmoore "Code") | [<img src="https://avatars.githubusercontent.com/u/570639?v=4" width="110px;"/><br /><sub>Martin Meredith</sub>](https://github.com/Mezzle)<br /> | [<img src="https://avatars.githubusercontent.com/u/5731963?v=4" width="110px;"/><br /><sub>dboth</sub>](http://dboth.de)<br />[💻](https://github.com/snipe/snipe-it/commits?author=dboth "Code") | [<img src="https://avatars.githubusercontent.com/u/87536651?v=4" width="110px;"/><br /><sub>Zachary Fleck</sub>](https://github.com/zacharyfleck)<br />[💻](https://github.com/snipe/snipe-it/commits?author=zacharyfleck "Code") | [<img src="https://avatars.githubusercontent.com/u/74609912?v=4" width="110px;"/><br /><sub>VIKAAS-A</sub>](https://github.com/vikaas-cyper)<br />[💻](https://github.com/snipe/snipe-it/commits?author=vikaas-cyper "Code") | [<img src="https://avatars.githubusercontent.com/u/88882041?v=4" width="110px;"/><br /><sub>Abdul Kareem</sub>](https://github.com/ak-piracha)<br />[💻](https://github.com/snipe/snipe-it/commits?author=ak-piracha "Code") |
| [<img src="https://avatars.githubusercontent.com/u/111287779?v=4" width="110px;"/><br /><sub>NojoudAlshehri</sub>](https://github.com/NojoudAlshehri)<br />[💻](https://github.com/snipe/snipe-it/commits?author=NojoudAlshehri "Code") | [<img src="https://avatars.githubusercontent.com/u/54367449?v=4" width="110px;"/><br /><sub>Stefan Stidl</sub>](https://github.com/stefanstidlffg)<br />[💻](https://github.com/snipe/snipe-it/commits?author=stefanstidlffg "Code") | [<img src="https://avatars.githubusercontent.com/u/87803479?v=4" width="110px;"/><br /><sub>Quentin Aymard</sub>](https://github.com/qay21)<br />[💻](https://github.com/snipe/snipe-it/commits?author=qay21 "Code") | [<img src="https://avatars.githubusercontent.com/u/5396871?v=4" width="110px;"/><br /><sub>Grant Le Roux</sub>](https://github.com/cram42)<br />[💻](https://github.com/snipe/snipe-it/commits?author=cram42 "Code") | [<img src="https://avatars.githubusercontent.com/u/58479551?v=4" width="110px;"/><br /><sub>Bogdan</sub>](http://@singrity)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Singrity "Code") | [<img src="https://avatars.githubusercontent.com/u/3483684?v=4" width="110px;"/><br /><sub>mmanjos</sub>](https://github.com/mmanjos)<br />[💻](https://github.com/snipe/snipe-it/commits?author=mmanjos "Code") | [<img src="https://avatars.githubusercontent.com/u/7429229?v=4" width="110px;"/><br /><sub>Abdelaziz Faki</sub>](https://azooz2014.github.io/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Azooz2014 "Code") |
| [<img src="https://avatars.githubusercontent.com/u/47315739?v=4" width="110px;"/><br /><sub>bilias</sub>](https://github.com/bilias)<br />[💻](https://github.com/snipe/snipe-it/commits?author=bilias "Code") | [<img src="https://avatars.githubusercontent.com/u/2565989?v=4" width="110px;"/><br /><sub>coach1988</sub>](https://github.com/coach1988)<br />[💻](https://github.com/snipe/snipe-it/commits?author=coach1988 "Code") | [<img src="https://avatars.githubusercontent.com/u/11910225?v=4" width="110px;"/><br /><sub>MrM</sub>](https://github.com/mauro-miatello)<br />[💻](https://github.com/snipe/snipe-it/commits?author=mauro-miatello "Code") | [<img src="https://avatars.githubusercontent.com/u/60405354?v=4" width="110px;"/><br /><sub>koiakoia</sub>](https://github.com/koiakoia)<br />[💻](https://github.com/snipe/snipe-it/commits?author=koiakoia "Code") | [<img src="https://avatars.githubusercontent.com/u/5323832?v=4" width="110px;"/><br /><sub>Mustafa Online</sub>](https://github.com/mustafa-online)<br />[💻](https://github.com/snipe/snipe-it/commits?author=mustafa-online "Code") | [<img src="https://avatars.githubusercontent.com/u/104601439?v=4" width="110px;"/><br /><sub>franceslui</sub>](https://github.com/franceslui)<br />[💻](https://github.com/snipe/snipe-it/commits?author=franceslui "Code") | [<img src="https://avatars.githubusercontent.com/u/125313163?v=4" width="110px;"/><br /><sub>Q4kK</sub>](https://github.com/Q4kK)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Q4kK "Code") |
| [<img src="https://avatars.githubusercontent.com/u/55590532?v=4" width="110px;"/><br /><sub>squintfox</sub>](https://github.com/squintfox)<br />[💻](https://github.com/snipe/snipe-it/commits?author=squintfox "Code") | [<img src="https://avatars.githubusercontent.com/u/1380084?v=4" width="110px;"/><br /><sub>Jeff Clay</sub>](https://github.com/jeffclay)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jeffclay "Code") | [<img src="https://avatars.githubusercontent.com/u/52716446?v=4" width="110px;"/><br /><sub>Phil J R</sub>](https://github.com/PP-JN-RL)<br />[💻](https://github.com/snipe/snipe-it/commits?author=PP-JN-RL "Code") | [<img src="https://avatars.githubusercontent.com/u/1496725?v=4" width="110px;"/><br /><sub>i_virus</sub>](https://www.corelight.com/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=chandanchowdhury "Code") | [<img src="https://avatars.githubusercontent.com/u/1020541?v=4" width="110px;"/><br /><sub>Paul Grime</sub>](https://github.com/gitgrimbo)<br />[💻](https://github.com/snipe/snipe-it/commits?author=gitgrimbo "Code") | [<img src="https://avatars.githubusercontent.com/u/922815?v=4" width="110px;"/><br /><sub>Lee Porte</sub>](https://leeporte.co.uk)<br />[💻](https://github.com/snipe/snipe-it/commits?author=LeePorte "Code") | [<img src="https://avatars.githubusercontent.com/u/23613427?v=4" width="110px;"/><br /><sub>BRYAN </sub>](https://github.com/bryanlopezinc)<br />[💻](https://github.com/snipe/snipe-it/commits?author=bryanlopezinc "Code") [⚠️](https://github.com/snipe/snipe-it/commits?author=bryanlopezinc "Tests") |
| [<img src="https://avatars.githubusercontent.com/u/64061710?v=4" width="110px;"/><br /><sub>U-H-T</sub>](https://github.com/U-H-T)<br />[💻](https://github.com/snipe/snipe-it/commits?author=U-H-T "Code") | [<img src="https://avatars.githubusercontent.com/u/5395363?v=4" width="110px;"/><br /><sub>Matt Tyree</sub>](https://github.com/Tyree)<br />[📖](https://github.com/snipe/snipe-it/commits?author=Tyree "Documentation") | [<img src="https://avatars.githubusercontent.com/u/292081?v=4" width="110px;"/><br /><sub>Florent Bervas</sub>](http://spoontux.net)<br />[💻](https://github.com/snipe/snipe-it/commits?author=FlorentDotMe "Code") | [<img src="https://avatars.githubusercontent.com/u/4498077?v=4" width="110px;"/><br /><sub>Daniel Albertsen</sub>](https://ditscheri.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=dbakan "Code") |
<!-- ALL-CONTRIBUTORS-LIST:END -->
This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind welcome!

View File

@@ -1,4 +1,4 @@
FROM ubuntu:20.04
FROM ubuntu:22.04
LABEL maintainer="Brady Wetherington <bwetherington@grokability.com>"
# No need to add `apt-get clean` here, reference:
@@ -14,16 +14,16 @@ RUN export DEBIAN_FRONTEND=noninteractive; \
apt-utils \
apache2 \
apache2-bin \
libapache2-mod-php7.4 \
php7.4-curl \
php7.4-ldap \
php7.4-mysql \
php7.4-gd \
php7.4-xml \
php7.4-mbstring \
php7.4-zip \
php7.4-bcmath \
php7.4-redis \
libapache2-mod-php8.1 \
php8.1-curl \
php8.1-ldap \
php8.1-mysql \
php8.1-gd \
php8.1-xml \
php8.1-mbstring \
php8.1-zip \
php8.1-bcmath \
php8.1-redis \
php-memcached \
patch \
curl \
@@ -38,9 +38,10 @@ gcc \
make \
autoconf \
libc-dev \
libldap-common \
pkg-config \
libmcrypt-dev \
php7.4-dev \
php8.1-dev \
ca-certificates \
unzip \
dnsutils \
@@ -50,16 +51,16 @@ dnsutils \
RUN curl -L -O https://github.com/pear/pearweb_phars/raw/master/go-pear.phar
RUN php go-pear.phar
RUN pecl install mcrypt-1.0.3
RUN pecl install mcrypt
RUN bash -c "echo extension=/usr/lib/php/20190902/mcrypt.so > /etc/php/7.4/mods-available/mcrypt.ini"
RUN bash -c "echo extension=/usr/lib/php/20210902/mcrypt.so > /etc/php/8.1/mods-available/mcrypt.ini"
RUN phpenmod mcrypt
RUN phpenmod gd
RUN phpenmod bcmath
RUN sed -i 's/variables_order = .*/variables_order = "EGPCS"/' /etc/php/7.4/apache2/php.ini
RUN sed -i 's/variables_order = .*/variables_order = "EGPCS"/' /etc/php/7.4/cli/php.ini
RUN sed -i 's/variables_order = .*/variables_order = "EGPCS"/' /etc/php/8.1/apache2/php.ini
RUN sed -i 's/variables_order = .*/variables_order = "EGPCS"/' /etc/php/8.1/cli/php.ini
RUN useradd -m --uid 1000 --gid 50 docker
@@ -104,7 +105,7 @@ RUN \
&& ln -fs "/var/lib/snipeit/keys/ldap_client_tls.cert" "/var/www/html/storage/ldap_client_tls.cert" \
&& ln -fs "/var/lib/snipeit/keys/ldap_client_tls.key" "/var/www/html/storage/ldap_client_tls.key" \
&& chown docker "/var/lib/snipeit/keys/" \
&& chown -h docker "/var/www/html/storage/" \
&& chown -Rh docker "/var/www/html/storage/" \
&& chmod +x /var/www/html/artisan \
&& echo "Finished setting up application in /var/www/html"

View File

@@ -1,34 +1,35 @@
FROM alpine:3.14.2
FROM alpine:3.18.6
# Apache + PHP
RUN apk add --no-cache \
apache2 \
php7 \
php7-common \
php7-apache2 \
php7-curl \
php7-ldap \
php7-mysqli \
php7-gd \
php7-xml \
php7-mbstring \
php7-zip \
php7-ctype \
php7-tokenizer \
php7-pdo_mysql \
php7-openssl \
php7-bcmath \
php7-phar \
php7-json \
php7-iconv \
php7-fileinfo \
php7-simplexml \
php7-session \
php7-dom \
php7-xmlwriter \
php7-xmlreader \
php7-sodium \
php7-redis \
php7-pecl-memcached \
php81 \
php81-common \
php81-apache2 \
php81-curl \
php81-ldap \
php81-mysqli \
php81-gd \
php81-xml \
php81-mbstring \
php81-zip \
php81-ctype \
php81-tokenizer \
php81-pdo_mysql \
php81-openssl \
php81-bcmath \
php81-phar \
php81-json \
php81-iconv \
php81-fileinfo \
php81-simplexml \
php81-session \
php81-dom \
php81-xmlwriter \
php81-xmlreader \
php81-sodium \
php81-redis \
php81-pecl-memcached \
php81-exif \
curl \
wget \
vim \
@@ -41,7 +42,7 @@ COPY docker/column-statistics.cnf /etc/mysql/conf.d/column-statistics.cnf
# Where apache's PID lives
RUN mkdir -p /run/apache2 && chown apache:apache /run/apache2
RUN sed -i 's/variables_order = .*/variables_order = "EGPCS"/' /etc/php7/php.ini
RUN sed -i 's/variables_order = .*/variables_order = "EGPCS"/' /etc/php81/php.ini
COPY docker/000-default-2.4.conf /etc/apache2/conf.d/default.conf
# Enable mod_rewrite

View File

@@ -1,8 +1,8 @@
ARG ENVIRONMENT=production
ARG SNIPEIT_RELEASE=5.1.3
ARG PHP_VERSION=7.4.16
ARG PHP_ALPINE_VERSION=3.13
ARG COMPOSER_VERSION=2.0.11
ARG SNIPEIT_RELEASE=6.1.0
ARG PHP_VERSION=8.2
ARG PHP_ALPINE_VERSION=3.17
ARG COMPOSER_VERSION=2
# Cannot use arguments with 'COPY --from' workaround
# https://github.com/moby/moby/issues/34482#issuecomment-454716952
@@ -52,7 +52,7 @@ RUN { \
# Install php extensions inside docker containers easily
# https://github.com/mlocati/docker-php-extension-installer
COPY --from=mlocati/php-extension-installer:1.2.19 /usr/bin/install-php-extensions /usr/local/bin/
COPY --from=mlocati/php-extension-installer:2.1.15 /usr/bin/install-php-extensions /usr/local/bin/
RUN set -eux; \
install-php-extensions \
bcmath \

View File

@@ -1,15 +1,18 @@
![Build Status](https://app.chipperci.com/projects/0e5f8979-31eb-4ee6-9abf-050b76ab0383/status/master) [![Crowdin](https://d322cqt584bo4o.cloudfront.net/snipe-it/localized.svg)](https://crowdin.com/project/snipe-it) [![Docker Pulls](https://img.shields.io/docker/pulls/snipe/snipe-it.svg)](https://hub.docker.com/r/snipe/snipe-it/) [![Twitter Follow](https://img.shields.io/twitter/follow/snipeitapp.svg?style=social)](https://twitter.com/snipeitapp) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/553ce52037fc43ea99149785afcfe641)](https://www.codacy.com/app/snipe/snipe-it?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=snipe/snipe-it&amp;utm_campaign=Badge_Grade)
[![All Contributors](https://img.shields.io/badge/all_contributors-318-orange.svg?style=flat-square)](#contributors) [![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/yZFtShAcKk) [![huntr](https://cdn.huntr.dev/huntr_security_badge_mono.svg)](https://huntr.dev)
![snipe-it-by-grok](https://github.com/snipe/snipe-it/assets/197404/b515673b-c7c8-4d9a-80f5-9fa58829a602)
[![Crowdin](https://d322cqt584bo4o.cloudfront.net/snipe-it/localized.svg)](https://crowdin.com/project/snipe-it) [![Docker Pulls](https://img.shields.io/docker/pulls/snipe/snipe-it.svg)](https://hub.docker.com/r/snipe/snipe-it/) [![Twitter Follow](https://img.shields.io/twitter/follow/snipeitapp.svg?style=social)](https://twitter.com/snipeitapp) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/553ce52037fc43ea99149785afcfe641)](https://app.codacy.com/gh/snipe/snipe-it/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade) [![Tests](https://github.com/snipe/snipe-it/actions/workflows/tests.yml/badge.svg)](https://github.com/snipe/snipe-it/actions/workflows/tests.yml)
[![All Contributors](https://img.shields.io/badge/all_contributors-331-orange.svg?style=flat-square)](#contributing) [![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/yZFtShAcKk)
## Snipe-IT - Open Source Asset Management System
This is a FOSS project for asset management in IT Operations. Knowing who has which laptop, when it was purchased in order to depreciate it correctly, handling software licenses, etc.
It is built on [Laravel 8](http://laravel.com).
It is built on [Laravel 10](http://laravel.com).
Snipe-IT is actively developed and we [release quite frequently](https://github.com/snipe/snipe-it/releases). ([Check out the live demo here](https://snipeitapp.com/demo/).)
__This is web-based software__. This means there is no executable file (aka no .exe files), and it must be run on a web server and accessed through a web browser. It runs on any Mac OSX, flavor of Linux, as well as Windows, and we have a [Docker image](https://snipe-it.readme.io/docs/docker) available if that's what you're into.
> [!TIP]
> __This is web-based software__. This means there is no executable file (aka no .exe files), and it must be run on a web server and accessed through a web browser. It runs on any Mac OSX, any flavor of Linux, as well as Windows, and we have a [Docker image](https://snipe-it.readme.io/docs/docker) available if that's what you're into.
-----
@@ -19,7 +22,7 @@ For instructions on installing and configuring Snipe-IT on your server, check ou
If you're having trouble with the installation, please check the [Common Issues](https://snipe-it.readme.io/docs/common-issues) and [Getting Help](https://snipe-it.readme.io/docs/getting-help) documentation, and search this repository's open *and* closed issues for help.
[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy)
<!-- [![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy) -->
-----
### User's Manual
@@ -30,8 +33,9 @@ For help using Snipe-IT, check out the [user's manual](https://snipe-it.readme.i
Feel free to check out the [GitHub Issues for this project](https://github.com/snipe/snipe-it/issues) to open a bug report or see what open issues you can help with. Please search through existing issues (open *and* closed) to see if your question has already been answered before opening a new issue.
**PLEASE see the [Getting Help Guidelines](https://snipe-it.readme.io/docs/getting-help) and [Common Issues](https://snipe-it.readme.io/docs/common-issues) before opening a ticket, and be sure to complete all of the questions in the Github Issue template to help us to help you as quickly as possible.**
> [!IMPORTANT]
> **PLEASE see the [Getting Help Guidelines](https://snipe-it.readme.io/docs/getting-help) and [Common Issues](https://snipe-it.readme.io/docs/common-issues) before opening a ticket, and be sure to complete all of the questions in the Github Issue template to help us to help you as quickly as possible.**
>
-----
### Upgrading
@@ -55,6 +59,9 @@ Please see the [translations documentation](https://snipe-it.readme.io/docs/tran
Since the release of the JSON REST API, several third-party developers have been developing modules and libraries to work with Snipe-IT.
> [!NOTE]
> As these were created by third-parties, Snipe-IT cannot provide support for these project, and you should contact the developers directly if you need assistance. Additionally, Snipe-IT makes no guarantees as to the reliability, accuracy or maintainability of these libraries. Use at your own risk. :)
- [Python Module](https://github.com/jbloomer/SnipeIT-PythonAPI) by [@jbloomer](https://github.com/jbloomer)
- [SnipeSharp - .NET module in C#](https://github.com/barrycarey/SnipeSharp) by [@barrycarey](https://github.com/barrycarey)
- [InQRy -unmaintained-](https://github.com/Microsoft/InQRy) by [@Microsoft](https://github.com/Microsoft)
@@ -72,80 +79,21 @@ Since the release of the JSON REST API, several third-party developers have been
- [Kandji2Snipe](https://github.com/grokability/kandji2snipe) by [@briangoldstein](https://github.com/briangoldstein) - Python script that synchronizes Kandji with Snipe-IT.
- [SnipeAgent](https://github.com/ReticentRobot/SnipeAgent) by @ReticentRobot - Windows agent for Snipe-IT
As these were created by third-parties, Snipe-IT cannot provide support for these project, and you should contact the developers directly if you need assistance. Additionally, Snipe-IT makes no guarantees as to the reliability, accuracy or maintainability of these libraries. Use at your own risk. :)
-----
### Contributing
Please see the documentation on [contributing and developing for Snipe-IT](https://snipe-it.readme.io/docs/contributing-overview).
Please note that this project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms.
The ERD is available [online here](https://drawsql.app/templates/snipe-it).
[Here is a list](CONTRIBUTORS.md) of the wonderful people that have contributed to the Snipe-IT.
-----
### Security
To report a security vulnerability, please email security@snipeitapp.com instead of using the issue tracker.
-----
### Contributors
Thanks goes to all of these wonderful people ([emoji key](https://github.com/kentcdodds/all-contributors#emoji-key)) who have helped Snipe-IT get this far:
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
| [<img src="https://avatars3.githubusercontent.com/u/197404?v=3" width="110px;"/><br /><sub>snipe</sub>](http://www.snipe.net)<br />[💻](https://github.com/snipe/snipe-it/commits?author=snipe "Code") [🚇](#infra-snipe "Infrastructure (Hosting, Build-Tools, etc)") [📖](https://github.com/snipe/snipe-it/commits?author=snipe "Documentation") [⚠️](https://github.com/snipe/snipe-it/commits?author=snipe "Tests") [🐛](https://github.com/snipe/snipe-it/issues?q=author%3Asnipe "Bug reports") [🎨](#design-snipe "Design") [👀](#review-snipe "Reviewed Pull Requests") | [<img src="https://avatars0.githubusercontent.com/u/36335?v=3" width="110px;"/><br /><sub>Brady Wetherington</sub>](http://www.uberbrady.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=uberbrady "Code") [📖](https://github.com/snipe/snipe-it/commits?author=uberbrady "Documentation") [🚇](#infra-uberbrady "Infrastructure (Hosting, Build-Tools, etc)") [👀](#review-uberbrady "Reviewed Pull Requests") | [<img src="https://avatars0.githubusercontent.com/u/3803132?v=3" width="110px;"/><br /><sub>Daniel Meltzer</sub>](https://github.com/dmeltzer)<br />[💻](https://github.com/snipe/snipe-it/commits?author=dmeltzer "Code") [⚠️](https://github.com/snipe/snipe-it/commits?author=dmeltzer "Tests") [📖](https://github.com/snipe/snipe-it/commits?author=dmeltzer "Documentation") | [<img src="https://avatars0.githubusercontent.com/u/1609106?v=3" width="110px;"/><br /><sub>Michael T</sub>](http://www.tuckertechonline.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=mtucker6784 "Code") | [<img src="https://avatars2.githubusercontent.com/u/3274937?v=3" width="110px;"/><br /><sub>madd15</sub>](https://github.com/madd15)<br />[📖](https://github.com/snipe/snipe-it/commits?author=madd15 "Documentation") [💬](#question-madd15 "Answering Questions") | [<img src="https://avatars2.githubusercontent.com/u/894126?v=3" width="110px;"/><br /><sub>Vincent Sposato</sub>](https://github.com/vsposato)<br />[💻](https://github.com/snipe/snipe-it/commits?author=vsposato "Code") | [<img src="https://avatars0.githubusercontent.com/u/1639757?v=3" width="110px;"/><br /><sub>Andrea Bergamasco</sub>](https://github.com/vjandrea)<br />[💻](https://github.com/snipe/snipe-it/commits?author=vjandrea "Code") |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| [<img src="https://avatars0.githubusercontent.com/u/10640152?v=3" width="110px;"/><br /><sub>Karol</sub>](https://github.com/kpawelski)<br />[🌍](#translation-kpawelski "Translation") [💻](https://github.com/snipe/snipe-it/commits?author=kpawelski "Code") | [<img src="https://avatars3.githubusercontent.com/u/600106?v=3" width="110px;"/><br /><sub>morph027</sub>](http://blog.morph027.de/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=morph027 "Code") | [<img src="https://avatars3.githubusercontent.com/u/22935755?v=3" width="110px;"/><br /><sub>fvleminckx</sub>](https://github.com/fvleminckx)<br />[🚇](#infra-fvleminckx "Infrastructure (Hosting, Build-Tools, etc)") | [<img src="https://avatars2.githubusercontent.com/u/15633547?v=3" width="110px;"/><br /><sub>itsupportcmsukorg</sub>](https://github.com/itsupportcmsukorg)<br />[💻](https://github.com/snipe/snipe-it/commits?author=itsupportcmsukorg "Code") [🐛](https://github.com/snipe/snipe-it/issues?q=author%3Aitsupportcmsukorg "Bug reports") | [<img src="https://avatars3.githubusercontent.com/u/12373799?v=3" width="110px;"/><br /><sub>Frank</sub>](https://override.io)<br />[💻](https://github.com/snipe/snipe-it/commits?author=base-zero "Code") | [<img src="https://avatars0.githubusercontent.com/u/10137?v=3" width="110px;"/><br /><sub>Deleted user</sub>](https://github.com/ghost)<br />[🌍](#translation-ghost "Translation") [💻](https://github.com/snipe/snipe-it/commits?author=ghost "Code") | [<img src="https://avatars1.githubusercontent.com/u/10802313?v=3" width="110px;"/><br /><sub>tiagom62</sub>](https://github.com/tiagom62)<br />[💻](https://github.com/snipe/snipe-it/commits?author=tiagom62 "Code") [🚇](#infra-tiagom62 "Infrastructure (Hosting, Build-Tools, etc)") |
| [<img src="https://avatars3.githubusercontent.com/u/2389047?v=3" width="110px;"/><br /><sub>Ryan Stafford</sub>](https://github.com/rystaf)<br />[💻](https://github.com/snipe/snipe-it/commits?author=rystaf "Code") | [<img src="https://avatars2.githubusercontent.com/u/10345935?v=3" width="110px;"/><br /><sub>Eammon Hanlon</sub>](https://github.com/ehanlon)<br />[💻](https://github.com/snipe/snipe-it/commits?author=ehanlon "Code") | [<img src="https://avatars0.githubusercontent.com/u/441924?v=3" width="110px;"/><br /><sub>zjean</sub>](https://github.com/zjean)<br />[💻](https://github.com/snipe/snipe-it/commits?author=zjean "Code") | [<img src="https://avatars0.githubusercontent.com/u/12660103?v=3" width="110px;"/><br /><sub>Matthias Frei</sub>](http://www.frei.media)<br />[💻](https://github.com/snipe/snipe-it/commits?author=FREImedia "Code") | [<img src="https://avatars0.githubusercontent.com/u/3767518?v=3" width="110px;"/><br /><sub>opsydev</sub>](https://github.com/opsydev)<br />[💻](https://github.com/snipe/snipe-it/commits?author=opsydev "Code") | [<img src="https://avatars1.githubusercontent.com/u/82290?v=3" width="110px;"/><br /><sub>Daniel Dreier</sub>](http://www.ddreier.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=ddreier "Code") | [<img src="https://avatars0.githubusercontent.com/u/23448?v=3" width="110px;"/><br /><sub>Nikolai Prokoschenko</sub>](http://rassie.org)<br />[💻](https://github.com/snipe/snipe-it/commits?author=rassie "Code") |
| [<img src="https://avatars0.githubusercontent.com/u/13452757?v=3" width="110px;"/><br /><sub>Drew</sub>](https://github.com/YetAnotherCodeMonkey)<br />[💻](https://github.com/snipe/snipe-it/commits?author=YetAnotherCodeMonkey "Code") | [<img src="https://avatars0.githubusercontent.com/u/1342320?v=3" width="110px;"/><br /><sub>Walter</sub>](https://github.com/merid14)<br />[💻](https://github.com/snipe/snipe-it/commits?author=merid14 "Code") | [<img src="https://avatars3.githubusercontent.com/u/11254614?v=3" width="110px;"/><br /><sub>Petr Baloun</sub>](https://github.com/balous)<br />[💻](https://github.com/snipe/snipe-it/commits?author=balous "Code") | [<img src="https://avatars0.githubusercontent.com/u/6117660?v=3" width="110px;"/><br /><sub>reidblomquist</sub>](https://github.com/reidblomquist)<br />[📖](https://github.com/snipe/snipe-it/commits?author=reidblomquist "Documentation") | [<img src="https://avatars0.githubusercontent.com/u/539914?v=3" width="110px;"/><br /><sub>Mathieu Kooiman</sub>](https://github.com/mathieuk)<br />[💻](https://github.com/snipe/snipe-it/commits?author=mathieuk "Code") | [<img src="https://avatars3.githubusercontent.com/u/6606421?v=3" width="110px;"/><br /><sub>csayre</sub>](https://github.com/csayre)<br />[📖](https://github.com/snipe/snipe-it/commits?author=csayre "Documentation") | [<img src="https://avatars1.githubusercontent.com/u/768488?v=3" width="110px;"/><br /><sub>Adam Dunson</sub>](https://github.com/adamdunson)<br />[💻](https://github.com/snipe/snipe-it/commits?author=adamdunson "Code") |
| [<img src="https://avatars0.githubusercontent.com/u/5547470?v=3" width="110px;"/><br /><sub>Hereward</sub>](https://github.com/thehereward)<br />[💻](https://github.com/snipe/snipe-it/commits?author=thehereward "Code") | [<img src="https://avatars0.githubusercontent.com/u/5802977?v=3" width="110px;"/><br /><sub>swoopdk</sub>](https://github.com/swoopdk)<br />[💻](https://github.com/snipe/snipe-it/commits?author=swoopdk "Code") | [<img src="https://avatars1.githubusercontent.com/u/3470403?v=3" width="110px;"/><br /><sub>Abdullah Alansari</sub>](https://linkedin.com/in/ahimta)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Ahimta "Code") | [<img src="https://avatars0.githubusercontent.com/u/796443?v=3" width="110px;"/><br /><sub>Micael Rodrigues</sub>](https://github.com/MicaelRodrigues)<br />[💻](https://github.com/snipe/snipe-it/commits?author=MicaelRodrigues "Code") | [<img src="https://avatars0.githubusercontent.com/u/614564?v=3" width="110px;"/><br /><sub>Patrick Gallagher</sub>](http://macadmincorner.com)<br />[📖](https://github.com/snipe/snipe-it/commits?author=patgmac "Documentation") | [<img src="https://avatars3.githubusercontent.com/u/7165922?v=3" width="110px;"/><br /><sub>Miliamber</sub>](https://github.com/Miliamber)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Miliamber "Code") | [<img src="https://avatars3.githubusercontent.com/u/861766?v=3" width="110px;"/><br /><sub>hawk554</sub>](https://github.com/hawk554)<br />[💻](https://github.com/snipe/snipe-it/commits?author=hawk554 "Code") |
| [<img src="https://avatars1.githubusercontent.com/u/1695622?v=3" width="110px;"/><br /><sub>Justin Kerr</sub>](http://jbirdkerr.net)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jbirdkerr "Code") | [<img src="https://avatars3.githubusercontent.com/u/11426176?v=3" width="110px;"/><br /><sub>Ira W. Snyder</sub>](http://www.irasnyder.com/devel/)<br />[📖](https://github.com/snipe/snipe-it/commits?author=irasnyd "Documentation") | [<img src="https://avatars2.githubusercontent.com/u/2475759?v=3" width="110px;"/><br /><sub>Aladin Alaily</sub>](https://github.com/aalaily)<br />[💻](https://github.com/snipe/snipe-it/commits?author=aalaily "Code") | [<img src="https://avatars0.githubusercontent.com/u/10247644?v=3" width="110px;"/><br /><sub>Chase Hansen</sub>](https://github.com/kobie-chasehansen)<br />[💻](https://github.com/snipe/snipe-it/commits?author=kobie-chasehansen "Code") [💬](#question-kobie-chasehansen "Answering Questions") [🐛](https://github.com/snipe/snipe-it/issues?q=author%3Akobie-chasehansen "Bug reports") | [<img src="https://avatars2.githubusercontent.com/u/13545400?v=3" width="110px;"/><br /><sub>IDM Helpdesk</sub>](https://github.com/IDM-Helpdesk)<br />[💻](https://github.com/snipe/snipe-it/commits?author=IDM-Helpdesk "Code") | [<img src="https://avatars2.githubusercontent.com/u/614439?v=3" width="110px;"/><br /><sub>Kai</sub>](http://balticer.de)<br />[💻](https://github.com/snipe/snipe-it/commits?author=balticer "Code") | [<img src="https://avatars1.githubusercontent.com/u/8762511?v=3" width="110px;"/><br /><sub>Michael Daniels</sub>](http://www.michaeldaniels.me)<br />[💻](https://github.com/snipe/snipe-it/commits?author=mdaniels5757 "Code") |
| [<img src="https://avatars3.githubusercontent.com/u/1532660?v=3" width="110px;"/><br /><sub>Tom Castleman</sub>](http://tomcastleman.me)<br />[💻](https://github.com/snipe/snipe-it/commits?author=tomcastleman "Code") | [<img src="https://avatars3.githubusercontent.com/u/10723243?v=3" width="110px;"/><br /><sub>Daniel Nemanic</sub>](https://github.com/DanielNemanic)<br />[💻](https://github.com/snipe/snipe-it/commits?author=DanielNemanic "Code") | [<img src="https://avatars0.githubusercontent.com/u/150648?v=3" width="110px;"/><br /><sub>SouthWolf</sub>](https://github.com/southwolf)<br />[💻](https://github.com/snipe/snipe-it/commits?author=southwolf "Code") | [<img src="https://avatars2.githubusercontent.com/u/131616?v=3" width="110px;"/><br /><sub>Ivar Nesje</sub>](https://github.com/ivarne)<br />[💻](https://github.com/snipe/snipe-it/commits?author=ivarne "Code") | [<img src="https://avatars1.githubusercontent.com/u/62333?v=3" width="110px;"/><br /><sub>Jérémy Benoist</sub>](http://www.j0k3r.net)<br />[📖](https://github.com/snipe/snipe-it/commits?author=j0k3r "Documentation") | [<img src="https://avatars2.githubusercontent.com/u/724344?v=3" width="110px;"/><br /><sub>Chris Leathley</sub>](https://github.com/cleathley)<br />[🚇](#infra-cleathley "Infrastructure (Hosting, Build-Tools, etc)") | [<img src="https://avatars0.githubusercontent.com/u/972498?v=3" width="110px;"/><br /><sub>splaer</sub>](https://github.com/splaer)<br />[🐛](https://github.com/snipe/snipe-it/issues?q=author%3Asplaer "Bug reports") [💻](https://github.com/snipe/snipe-it/commits?author=splaer "Code") |
| [<img src="https://avatars1.githubusercontent.com/u/967362?v=3" width="110px;"/><br /><sub>Joe Ferguson</sub>](http://www.joeferguson.me)<br />[💻](https://github.com/snipe/snipe-it/commits?author=svpernova09 "Code") | [<img src="https://avatars3.githubusercontent.com/u/6108682?v=3" width="110px;"/><br /><sub>diwanicki</sub>](https://github.com/diwanicki)<br />[💻](https://github.com/snipe/snipe-it/commits?author=diwanicki "Code") [📖](https://github.com/snipe/snipe-it/commits?author=diwanicki "Documentation") | [<img src="https://avatars3.githubusercontent.com/u/2527115?v=3" width="110px;"/><br /><sub>Lee Thoong Ching</sub>](https://github.com/pakkua80)<br />[📖](https://github.com/snipe/snipe-it/commits?author=pakkua80 "Documentation") [💻](https://github.com/snipe/snipe-it/commits?author=pakkua80 "Code") | [<img src="https://avatars1.githubusercontent.com/u/461491?v=3" width="110px;"/><br /><sub>Marek Šuppa</sub>](http://shu.io)<br />[💻](https://github.com/snipe/snipe-it/commits?author=mrshu "Code") | [<img src="https://avatars1.githubusercontent.com/u/8693762?v=3" width="110px;"/><br /><sub>Juan J. Martinez</sub>](https://github.com/mizar1616)<br />[🌍](#translation-mizar1616 "Translation") | [<img src="https://avatars1.githubusercontent.com/u/1458388?v=3" width="110px;"/><br /><sub>R Ryan Dial</sub>](https://github.com/rrdial)<br />[🌍](#translation-rrdial "Translation") | [<img src="https://avatars2.githubusercontent.com/u/2871745?v=3" width="110px;"/><br /><sub>Andrej Manduch</sub>](https://github.com/burlito)<br />[📖](https://github.com/snipe/snipe-it/commits?author=burlito "Documentation") |
| [<img src="https://avatars0.githubusercontent.com/u/8341172?v=3" width="110px;"/><br /><sub>Jay Richards</sub>](http://www.cordeos.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=technogenus "Code") | [<img src="https://avatars2.githubusercontent.com/u/7295127?v=3" width="110px;"/><br /><sub>Alexander Innes</sub>](https://necurity.co.uk)<br />[💻](https://github.com/snipe/snipe-it/commits?author=leostat "Code") | [<img src="https://avatars2.githubusercontent.com/u/334485?v=3" width="110px;"/><br /><sub>Danny Garcia</sub>](https://buzzedword.codes)<br />[💻](https://github.com/snipe/snipe-it/commits?author=buzzedword "Code") | [<img src="https://avatars2.githubusercontent.com/u/366855?v=3" width="110px;"/><br /><sub>archpoint</sub>](https://github.com/archpoint)<br />[💻](https://github.com/snipe/snipe-it/commits?author=archpoint "Code") | [<img src="https://avatars1.githubusercontent.com/u/67991?v=3" width="110px;"/><br /><sub>Jake McGraw</sub>](http://www.jakemcgraw.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jakemcgraw "Code") | [<img src="https://avatars1.githubusercontent.com/u/1714374?v=3" width="110px;"/><br /><sub>FleischKarussel</sub>](https://github.com/FleischKarussel)<br />[📖](https://github.com/snipe/snipe-it/commits?author=FleischKarussel "Documentation") | [<img src="https://avatars3.githubusercontent.com/u/319644?v=3" width="110px;"/><br /><sub>Dylan Yi</sub>](https://github.com/feeva)<br />[💻](https://github.com/snipe/snipe-it/commits?author=feeva "Code") |
| [<img src="https://avatars2.githubusercontent.com/u/857740?v=3" width="110px;"/><br /><sub>Gil Rutkowski</sub>](http://FlashingCursor.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=flashingcursor "Code") | [<img src="https://avatars3.githubusercontent.com/u/129360?v=3" width="110px;"/><br /><sub>Desmond Morris</sub>](http://www.desmondmorris.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=desmondmorris "Code") | [<img src="https://avatars2.githubusercontent.com/u/52936?v=3" width="110px;"/><br /><sub>Nick Peelman</sub>](http://peelman.us)<br />[💻](https://github.com/snipe/snipe-it/commits?author=peelman "Code") | [<img src="https://avatars0.githubusercontent.com/u/53161?v=3" width="110px;"/><br /><sub>Abraham Vegh</sub>](https://abrahamvegh.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=abrahamvegh "Code") | [<img src="https://avatars0.githubusercontent.com/u/2818680?v=3" width="110px;"/><br /><sub>Mohamed Rashid</sub>](https://github.com/rashivkp)<br />[📖](https://github.com/snipe/snipe-it/commits?author=rashivkp "Documentation") | [<img src="https://avatars3.githubusercontent.com/u/1509456?v=3" width="110px;"/><br /><sub>Kasey</sub>](http://hinchk.github.io)<br />[💻](https://github.com/snipe/snipe-it/commits?author=HinchK "Code") | [<img src="https://avatars2.githubusercontent.com/u/10522541?v=3" width="110px;"/><br /><sub>Brett</sub>](https://github.com/BrettFagerlund)<br />[⚠️](https://github.com/snipe/snipe-it/commits?author=BrettFagerlund "Tests") |
| [<img src="https://avatars2.githubusercontent.com/u/16108587?v=3" width="110px;"/><br /><sub>Jason Spriggs</sub>](http://jasonspriggs.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jasonspriggs "Code") | [<img src="https://avatars2.githubusercontent.com/u/1134568?v=3" width="110px;"/><br /><sub>Nate Felton</sub>](http://n8felton.wordpress.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=n8felton "Code") | [<img src="https://avatars2.githubusercontent.com/u/14036694?v=3" width="110px;"/><br /><sub>Manasses Ferreira</sub>](http://homepages.dcc.ufmg.br/~manassesferreira)<br />[💻](https://github.com/snipe/snipe-it/commits?author=manassesferreira "Code") | [<img src="https://avatars0.githubusercontent.com/u/15913949?v=3" width="110px;"/><br /><sub>Steve</sub>](https://github.com/steveelwood)<br />[⚠️](https://github.com/snipe/snipe-it/commits?author=steveelwood "Tests") | [<img src="https://avatars1.githubusercontent.com/u/3361683?v=3" width="110px;"/><br /><sub>matc</sub>](http://twitter.com/matc)<br />[⚠️](https://github.com/snipe/snipe-it/commits?author=matc "Tests") | [<img src="https://avatars3.githubusercontent.com/u/7405702?v=3" width="110px;"/><br /><sub>Cole R. Davis</sub>](http://www.davisracingteam.com)<br />[⚠️](https://github.com/snipe/snipe-it/commits?author=VanillaNinjaD "Tests") | [<img src="https://avatars2.githubusercontent.com/u/10167681?v=3" width="110px;"/><br /><sub>gibsonjoshua55</sub>](https://github.com/gibsonjoshua55)<br />[💻](https://github.com/snipe/snipe-it/commits?author=gibsonjoshua55 "Code") |
| [<img src="https://avatars2.githubusercontent.com/u/2809241?v=4" width="110px;"/><br /><sub>Robin Temme</sub>](https://github.com/zwerch)<br />[💻](https://github.com/snipe/snipe-it/commits?author=zwerch "Code") | [<img src="https://avatars0.githubusercontent.com/u/6961695?v=4" width="110px;"/><br /><sub>Iman</sub>](https://github.com/imanghafoori1)<br />[💻](https://github.com/snipe/snipe-it/commits?author=imanghafoori1 "Code") | [<img src="https://avatars1.githubusercontent.com/u/6551003?v=4" width="110px;"/><br /><sub>Richard Hofman</sub>](https://github.com/richardhofman6)<br />[💻](https://github.com/snipe/snipe-it/commits?author=richardhofman6 "Code") | [<img src="https://avatars0.githubusercontent.com/u/3697569?v=4" width="110px;"/><br /><sub>gizzmojr</sub>](https://github.com/gizzmojr)<br />[💻](https://github.com/snipe/snipe-it/commits?author=gizzmojr "Code") | [<img src="https://avatars3.githubusercontent.com/u/404729?v=4" width="110px;"/><br /><sub>Jenny Li</sub>](https://github.com/imjennyli)<br />[📖](https://github.com/snipe/snipe-it/commits?author=imjennyli "Documentation") | [<img src="https://avatars0.githubusercontent.com/u/869227?v=4" width="110px;"/><br /><sub>Geoff Young</sub>](https://github.com/GeoffYoung)<br />[💻](https://github.com/snipe/snipe-it/commits?author=GeoffYoung "Code") | [<img src="https://avatars3.githubusercontent.com/u/1068477?v=4" width="110px;"/><br /><sub>Elliot Blackburn</sub>](http://www.elliotblackburn.com)<br />[📖](https://github.com/snipe/snipe-it/commits?author=BlueHatbRit "Documentation") |
| [<img src="https://avatars1.githubusercontent.com/u/6357451?v=4" width="110px;"/><br /><sub>Tõnis Ormisson</sub>](http://andmemasin.eu)<br />[💻](https://github.com/snipe/snipe-it/commits?author=TonisOrmisson "Code") | [<img src="https://avatars0.githubusercontent.com/u/449411?v=4" width="110px;"/><br /><sub>Nicolai Essig</sub>](http://www.nicolai-essig.de)<br />[💻](https://github.com/snipe/snipe-it/commits?author=thakilla "Code") | [<img src="https://avatars1.githubusercontent.com/u/14809698?v=4" width="110px;"/><br /><sub>Danielle</sub>](https://github.com/techincolor)<br />[📖](https://github.com/snipe/snipe-it/commits?author=techincolor "Documentation") | [<img src="https://avatars1.githubusercontent.com/u/18545156?v=4" width="110px;"/><br /><sub>Lawrence</sub>](https://github.com/TheVakman)<br />[⚠️](https://github.com/snipe/snipe-it/commits?author=TheVakman "Tests") [🐛](https://github.com/snipe/snipe-it/issues?q=author%3ATheVakman "Bug reports") | [<img src="https://avatars1.githubusercontent.com/u/22473767?v=4" width="110px;"/><br /><sub>uknzaeinozpas</sub>](https://github.com/uknzaeinozpas)<br />[⚠️](https://github.com/snipe/snipe-it/commits?author=uknzaeinozpas "Tests") [💻](https://github.com/snipe/snipe-it/commits?author=uknzaeinozpas "Code") | [<img src="https://avatars3.githubusercontent.com/u/422752?v=4" width="110px;"/><br /><sub>Ryan</sub>](https://github.com/Gelob)<br />[📖](https://github.com/snipe/snipe-it/commits?author=Gelob "Documentation") | [<img src="https://avatars1.githubusercontent.com/u/10672546?v=4" width="110px;"/><br /><sub>vcordes79</sub>](https://github.com/vcordes79)<br />[💻](https://github.com/snipe/snipe-it/commits?author=vcordes79 "Code") |
| [<img src="https://avatars3.githubusercontent.com/u/27958330?v=4" width="110px;"/><br /><sub>fordster78</sub>](https://github.com/fordster78)<br />[💻](https://github.com/snipe/snipe-it/commits?author=fordster78 "Code") | [<img src="https://avatars0.githubusercontent.com/u/34064225?v=4" width="110px;"/><br /><sub>CronKz</sub>](https://github.com/CronKz)<br />[💻](https://github.com/snipe/snipe-it/commits?author=CronKz "Code") [🌍](#translation-CronKz "Translation") | [<img src="https://avatars1.githubusercontent.com/u/585486?v=4" width="110px;"/><br /><sub>Tim Bishop</sub>](https://github.com/tdb)<br />[💻](https://github.com/snipe/snipe-it/commits?author=tdb "Code") | [<img src="https://avatars2.githubusercontent.com/u/5384694?v=4" width="110px;"/><br /><sub>Sean McIlvenna</sub>](https://www.seanmcilvenna.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=seanmcilvenna "Code") | [<img src="https://avatars3.githubusercontent.com/u/36515590?v=4" width="110px;"/><br /><sub>cepacs</sub>](https://github.com/cepacs)<br />[🐛](https://github.com/snipe/snipe-it/issues?q=author%3Acepacs "Bug reports") [📖](https://github.com/snipe/snipe-it/commits?author=cepacs "Documentation") | [<img src="https://avatars2.githubusercontent.com/u/37537300?v=4" width="110px;"/><br /><sub>lea-mink</sub>](https://github.com/lea-mink)<br />[💻](https://github.com/snipe/snipe-it/commits?author=lea-mink "Code") | [<img src="https://avatars0.githubusercontent.com/u/7140719?v=4" width="110px;"/><br /><sub>Hannah Tinkler</sub>](https://github.com/hannahtinkler)<br />[💻](https://github.com/snipe/snipe-it/commits?author=hannahtinkler "Code") |
| [<img src="https://avatars1.githubusercontent.com/u/1086388?v=4" width="110px;"/><br /><sub>Doeke Zanstra</sub>](https://github.com/doekman)<br />[💻](https://github.com/snipe/snipe-it/commits?author=doekman "Code") | [<img src="https://avatars1.githubusercontent.com/u/4325936?v=4" width="110px;"/><br /><sub>Djamon Staal</sub>](https://www.sdhd.nl/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=SjamonDaal "Code") | [<img src="https://avatars3.githubusercontent.com/u/12306859?v=4" width="110px;"/><br /><sub>Earl Ramirez</sub>](https://github.com/EarlRamirez)<br />[💻](https://github.com/snipe/snipe-it/commits?author=EarlRamirez "Code") | [<img src="https://avatars2.githubusercontent.com/u/8671456?v=4" width="110px;"/><br /><sub>Richard Ray Thomas</sub>](https://github.com/RichardRay)<br />[💻](https://github.com/snipe/snipe-it/commits?author=RichardRay "Code") | [<img src="https://avatars3.githubusercontent.com/u/1852688?v=4" width="110px;"/><br /><sub>Ryan Kuba</sub>](https://www.taisun.io/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=thelamer "Code") | [<img src="https://avatars1.githubusercontent.com/u/6751928?v=4" width="110px;"/><br /><sub>Brian Monroe</sub>](https://github.com/ParadoxGuitarist)<br />[💻](https://github.com/snipe/snipe-it/commits?author=ParadoxGuitarist "Code") | [<img src="https://avatars1.githubusercontent.com/u/605167?v=4" width="110px;"/><br /><sub>plexorama</sub>](https://github.com/plexorama)<br />[💻](https://github.com/snipe/snipe-it/commits?author=plexorama "Code") |
| [<img src="https://avatars2.githubusercontent.com/u/1795149?v=4" width="110px;"/><br /><sub>Till Deeke</sub>](https://tilldeeke.de)<br />[💻](https://github.com/snipe/snipe-it/commits?author=tilldeeke "Code") | [<img src="https://avatars0.githubusercontent.com/u/12634129?v=4" width="110px;"/><br /><sub>5quirrel</sub>](https://github.com/5quirrel)<br />[💻](https://github.com/snipe/snipe-it/commits?author=5quirrel "Code") | [<img src="https://avatars1.githubusercontent.com/u/13071957?v=4" width="110px;"/><br /><sub>Jason</sub>](https://github.com/jasonlshelton)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jasonlshelton "Code") | [<img src="https://avatars3.githubusercontent.com/u/7128321?v=4" width="110px;"/><br /><sub>Antti</sub>](https://github.com/chemfy)<br />[💻](https://github.com/snipe/snipe-it/commits?author=chemfy "Code") | [<img src="https://avatars3.githubusercontent.com/u/10080364?v=4" width="110px;"/><br /><sub>DeusMaximus</sub>](https://github.com/DeusMaximus)<br />[💻](https://github.com/snipe/snipe-it/commits?author=DeusMaximus "Code") | [<img src="https://avatars2.githubusercontent.com/u/16384611?v=4" width="110px;"/><br /><sub>a-royal</sub>](https://github.com/A-ROYAL)<br />[🌍](#translation-A-ROYAL "Translation") | [<img src="https://avatars0.githubusercontent.com/u/5358208?v=4" width="110px;"/><br /><sub>Alberto Aldrigo</sub>](https://github.com/albertoaldrigo)<br />[🌍](#translation-albertoaldrigo "Translation") |
| [<img src="https://avatars0.githubusercontent.com/u/1412342?v=4" width="110px;"/><br /><sub>Alex Stanev</sub>](http://alex.stanev.org/blog)<br />[🌍](#translation-RealEnder "Translation") | [<img src="https://avatars0.githubusercontent.com/u/177295?v=4" width="110px;"/><br /><sub>Andreas Rehm</sub>](http://devel.itsolution2.de)<br />[🌍](#translation-sirrus "Translation") | [<img src="https://avatars0.githubusercontent.com/u/5080535?v=4" width="110px;"/><br /><sub>Andreas Erhard</sub>](https://github.com/xelan)<br />[🌍](#translation-xelan "Translation") | [<img src="https://avatars2.githubusercontent.com/u/142350?v=4" width="110px;"/><br /><sub>Andrés Vanegas Jiménez</sub>](https://github.com/angeldeejay)<br />[🌍](#translation-angeldeejay "Translation") | [<img src="https://avatars0.githubusercontent.com/u/3910403?v=4" width="110px;"/><br /><sub>Antonio Schiavon</sub>](https://github.com/aschiavon91)<br />[🌍](#translation-aschiavon91 "Translation") | [<img src="https://avatars0.githubusercontent.com/u/10464547?v=4" width="110px;"/><br /><sub>benunter</sub>](https://github.com/benunter)<br />[🌍](#translation-benunter "Translation") | [<img src="https://avatars1.githubusercontent.com/u/5038647?v=4" width="110px;"/><br /><sub>Borys Żmuda</sub>](http://catweb24.pl)<br />[🌍](#translation-rudashi "Translation") |
| [<img src="https://avatars0.githubusercontent.com/u/5539359?v=4" width="110px;"/><br /><sub>chibacityblues</sub>](https://github.com/chibacityblues)<br />[🌍](#translation-chibacityblues "Translation") | [<img src="https://avatars1.githubusercontent.com/u/1954830?v=4" width="110px;"/><br /><sub>Chien Wei Lin</sub>](https://github.com/cwlin0416)<br />[🌍](#translation-cwlin0416 "Translation") | [<img src="https://avatars3.githubusercontent.com/u/11700533?v=4" width="110px;"/><br /><sub>Christian Schuster</sub>](https://github.com/Againstreality)<br />[🌍](#translation-Againstreality "Translation") | [<img src="https://avatars1.githubusercontent.com/u/4308704?v=4" width="110px;"/><br /><sub>Christian Stefanus</sub>](http://chriss.webhostid.com)<br />[🌍](#translation-kopi-item "Translation") | [<img src="https://avatars3.githubusercontent.com/u/3009327?v=4" width="110px;"/><br /><sub>wxcafé</sub>](http://wxcafe.net)<br />[🌍](#translation-wxcafe "Translation") | [<img src="https://avatars3.githubusercontent.com/u/35761525?v=4" width="110px;"/><br /><sub>dpyroc</sub>](https://github.com/dpyroc)<br />[🌍](#translation-dpyroc "Translation") | [<img src="https://avatars1.githubusercontent.com/u/2153639?v=4" width="110px;"/><br /><sub>Daniel Friedlmaier</sub>](http://www.friedlmaier.net)<br />[🌍](#translation-da-friedl "Translation") |
| [<img src="https://avatars1.githubusercontent.com/u/2947640?v=4" width="110px;"/><br /><sub>Daniel Heene</sub>](https://github.com/danielheene)<br />[🌍](#translation-danielheene "Translation") | [<img src="https://avatars3.githubusercontent.com/u/319022?v=4" width="110px;"/><br /><sub>danielcb</sub>](https://github.com/danielcb)<br />[🌍](#translation-danielcb "Translation") | [<img src="https://avatars3.githubusercontent.com/u/15846537?v=4" width="110px;"/><br /><sub>Dominik Senti</sub>](https://github.com/dominiksenti)<br />[🌍](#translation-dominiksenti "Translation") | [<img src="https://avatars0.githubusercontent.com/u/25570954?v=4" width="110px;"/><br /><sub>Eric Gautheron</sub>](http://www.konectik.com)<br />[🌍](#translation-EpixFr "Translation") | [<img src="https://avatars1.githubusercontent.com/u/5732623?v=4" width="110px;"/><br /><sub>Erlend Pilø</sub>](https://erlpil.com)<br />[🌍](#translation-Erlpil "Translation") | [<img src="https://avatars0.githubusercontent.com/u/541832?v=4" width="110px;"/><br /><sub>Fabio Rapposelli</sub>](http://fabio.technology)<br />[🌍](#translation-frapposelli "Translation") | [<img src="https://avatars2.githubusercontent.com/u/3605240?v=4" width="110px;"/><br /><sub>Felipe Barros</sub>](https://github.com/fgbs)<br />[🌍](#translation-fgbs "Translation") |
| [<img src="https://avatars0.githubusercontent.com/u/257745?v=4" width="110px;"/><br /><sub>Fernando Possebon</sub>](https://github.com/possebon)<br />[🌍](#translation-possebon "Translation") | [<img src="https://avatars3.githubusercontent.com/u/2540832?v=4" width="110px;"/><br /><sub>gdraque</sub>](https://github.com/gdraque)<br />[🌍](#translation-gdraque "Translation") | [<img src="https://avatars0.githubusercontent.com/u/23440381?v=4" width="110px;"/><br /><sub>Georg Wallisch</sub>](https://github.com/georgwallisch)<br />[🌍](#translation-georgwallisch "Translation") | [<img src="https://avatars1.githubusercontent.com/u/9852832?v=4" width="110px;"/><br /><sub>Gerardo Robles</sub>](https://github.com/jgroblesr85)<br />[🌍](#translation-jgroblesr85 "Translation") | [<img src="https://avatars2.githubusercontent.com/u/11082640?v=4" width="110px;"/><br /><sub>Gluek</sub>](https://t.me/Gluek)<br />[🌍](#translation-mrgluek "Translation") | [<img src="https://avatars0.githubusercontent.com/u/6847946?v=4" width="110px;"/><br /><sub>AdnanAbuShahad</sub>](https://github.com/AdnanAbuShahad)<br />[🌍](#translation-AdnanAbuShahad "Translation") | [<img src="https://avatars1.githubusercontent.com/u/3580608?v=4" width="110px;"/><br /><sub>Hafidzi My</sub>](https://hafidzi.my)<br />[🌍](#translation-hafidzi "Translation") |
| [<img src="https://avatars2.githubusercontent.com/u/205521?v=4" width="110px;"/><br /><sub>Harim Park</sub>](https://github.com/fofwisdom)<br />[🌍](#translation-fofwisdom "Translation") | [<img src="https://avatars2.githubusercontent.com/u/3333841?v=4" width="110px;"/><br /><sub>Henrik Kentsson</sub>](http://www.kentsson.se)<br />[🌍](#translation-Kentsson "Translation") | [<img src="https://avatars0.githubusercontent.com/u/36551034?v=4" width="110px;"/><br /><sub>Husnul Yaqien</sub>](https://github.com/husnulyaqien)<br />[🌍](#translation-husnulyaqien "Translation") | [<img src="https://avatars1.githubusercontent.com/u/2372747?v=4" width="110px;"/><br /><sub>Ibrahim</sub>](http://abaalkhail.org)<br />[🌍](#translation-abaalkh "Translation") | [<img src="https://avatars0.githubusercontent.com/u/1389334?v=4" width="110px;"/><br /><sub>igolman</sub>](https://github.com/igolman)<br />[🌍](#translation-igolman "Translation") | [<img src="https://avatars1.githubusercontent.com/u/3257070?v=4" width="110px;"/><br /><sub>itangiang</sub>](https://github.com/itangiang)<br />[🌍](#translation-itangiang "Translation") | [<img src="https://avatars2.githubusercontent.com/u/14814254?v=4" width="110px;"/><br /><sub>jarby1211</sub>](https://github.com/jarby1211)<br />[🌍](#translation-jarby1211 "Translation") |
| [<img src="https://avatars3.githubusercontent.com/u/6719357?v=4" width="110px;"/><br /><sub>Jhonn Willker</sub>](http://jwillker.com)<br />[🌍](#translation-JohnWillker "Translation") | [<img src="https://avatars2.githubusercontent.com/u/10983635?v=4" width="110px;"/><br /><sub>Jose</sub>](https://github.com/joxelito94)<br />[🌍](#translation-joxelito94 "Translation") | [<img src="https://avatars0.githubusercontent.com/u/5206122?v=4" width="110px;"/><br /><sub>laopangzi</sub>](https://github.com/laopangzi)<br />[🌍](#translation-laopangzi "Translation") | [<img src="https://avatars2.githubusercontent.com/u/79707?v=4" width="110px;"/><br /><sub>Lars Strojny</sub>](http://usrportage.de)<br />[🌍](#translation-lstrojny "Translation") | [<img src="https://avatars0.githubusercontent.com/u/389801?v=4" width="110px;"/><br /><sub>MarcosBL</sub>](http://twitter.com/marcosbl)<br />[🌍](#translation-MarcosBL "Translation") | [<img src="https://avatars3.githubusercontent.com/u/35664606?v=4" width="110px;"/><br /><sub>marie joy cajes</sub>](https://github.com/mariejoyacajes)<br />[🌍](#translation-mariejoyacajes "Translation") | [<img src="https://avatars2.githubusercontent.com/u/3052816?v=4" width="110px;"/><br /><sub>Mark S. Johansen</sub>](http://www.markjohansen.dk)<br />[🌍](#translation-msjohansen "Translation") |
| [<img src="https://avatars2.githubusercontent.com/u/982885?v=4" width="110px;"/><br /><sub>Martin Stub</sub>](http://martinstub.dk)<br />[🌍](#translation-stubben "Translation") | [<img src="https://avatars2.githubusercontent.com/u/28959963?v=4" width="110px;"/><br /><sub>Meyer Flavio</sub>](https://github.com/meyerf99)<br />[🌍](#translation-meyerf99 "Translation") | [<img src="https://avatars3.githubusercontent.com/u/796443?v=4" width="110px;"/><br /><sub>Micael Rodrigues</sub>](https://github.com/MicaelRodrigues)<br />[🌍](#translation-MicaelRodrigues "Translation") | [<img src="https://avatars0.githubusercontent.com/u/10481331?v=4" width="110px;"/><br /><sub>Mikael Rasmussen</sub>](http://rubixy.com/)<br />[🌍](#translation-mikaelssen "Translation") | [<img src="https://avatars1.githubusercontent.com/u/1544552?v=4" width="110px;"/><br /><sub>IxFail</sub>](https://github.com/IxFail)<br />[🌍](#translation-IxFail "Translation") | [<img src="https://avatars3.githubusercontent.com/u/18483118?v=4" width="110px;"/><br /><sub>Mohammed Fota</sub>](http://www.mohammedfota.com)<br />[🌍](#translation-MohammedFota "Translation") | [<img src="https://avatars0.githubusercontent.com/u/227080?v=4" width="110px;"/><br /><sub>Moayad Alserihi</sub>](https://github.com/omego)<br />[🌍](#translation-omego "Translation") |
| [<img src="https://avatars0.githubusercontent.com/u/1680266?v=4" width="110px;"/><br /><sub>saymd</sub>](https://github.com/saymd)<br />[🌍](#translation-saymd "Translation") | [<img src="https://avatars0.githubusercontent.com/u/1826808?v=4" width="110px;"/><br /><sub>Patrik Larsson</sub>](https://nordsken.se)<br />[🌍](#translation-pooot "Translation") | [<img src="https://avatars1.githubusercontent.com/u/20584746?v=4" width="110px;"/><br /><sub>drcryo</sub>](https://github.com/drcryo)<br />[🌍](#translation-drcryo "Translation") | [<img src="https://avatars1.githubusercontent.com/u/19408004?v=4" width="110px;"/><br /><sub>pawel1615</sub>](https://github.com/pawel1615)<br />[🌍](#translation-pawel1615 "Translation") | [<img src="https://avatars2.githubusercontent.com/u/23340468?v=4" width="110px;"/><br /><sub>bodrovics</sub>](https://github.com/bodrovics)<br />[🌍](#translation-bodrovics "Translation") | [<img src="https://avatars0.githubusercontent.com/u/3257654?v=4" width="110px;"/><br /><sub>priatna</sub>](https://github.com/priatna)<br />[🌍](#translation-priatna "Translation") | [<img src="https://avatars1.githubusercontent.com/u/5358374?v=4" width="110px;"/><br /><sub>Fan Jiang</sub>](https://amayume.net)<br />[🌍](#translation-ProfFan "Translation") |
| [<img src="https://avatars1.githubusercontent.com/u/22555451?v=4" width="110px;"/><br /><sub>ragnarcx</sub>](https://github.com/ragnarcx)<br />[🌍](#translation-ragnarcx "Translation") | [<img src="https://avatars2.githubusercontent.com/u/18654582?v=4" width="110px;"/><br /><sub>Rein van Haaren</sub>](http://www.reinvanhaaren.nl/)<br />[🌍](#translation-reinvanhaaren "Translation") | [<img src="https://avatars1.githubusercontent.com/u/386672?v=4" width="110px;"/><br /><sub>Teguh Dwicaksana</sub>](http://dheche.songolimo.net)<br />[🌍](#translation-dheche "Translation") | [<img src="https://avatars2.githubusercontent.com/u/2572552?v=4" width="110px;"/><br /><sub>fraccie</sub>](https://github.com/FRaccie)<br />[🌍](#translation-FRaccie "Translation") | [<img src="https://avatars0.githubusercontent.com/u/35182720?v=4" width="110px;"/><br /><sub>vinzruzell</sub>](https://github.com/vinzruzell)<br />[🌍](#translation-vinzruzell "Translation") | [<img src="https://avatars1.githubusercontent.com/u/7883603?v=4" width="110px;"/><br /><sub>Kevin Austin</sub>](http://kevinaustin.com)<br />[🌍](#translation-vipsystem "Translation") | [<img src="https://avatars3.githubusercontent.com/u/3861828?v=4" width="110px;"/><br /><sub>Wira Sandy</sub>](http://azuraweb.xyz)<br />[🌍](#translation-wira-sandy "Translation") |
| [<img src="https://avatars2.githubusercontent.com/u/8663789?v=4" width="110px;"/><br /><sub>Илья</sub>](https://github.com/GrayHoax)<br />[🌍](#translation-GrayHoax "Translation") | [<img src="https://avatars3.githubusercontent.com/u/30119111?v=4" width="110px;"/><br /><sub>GodUseVPN</sub>](https://github.com/godusevpn)<br />[🌍](#translation-godusevpn "Translation") | [<img src="https://avatars1.githubusercontent.com/u/745576?v=4" width="110px;"/><br /><sub>周周</sub>](https://github.com/EngrZhou)<br />[🌍](#translation-EngrZhou "Translation") | [<img src="https://avatars3.githubusercontent.com/u/1631095?v=4" width="110px;"/><br /><sub>Sam</sub>](https://github.com/takuy)<br />[💻](https://github.com/snipe/snipe-it/commits?author=takuy "Code") | [<img src="https://avatars1.githubusercontent.com/u/264022?v=4" width="110px;"/><br /><sub>Azerothian</sub>](https://www.illisian.com.au)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Azerothian "Code") | [<img src="https://avatars1.githubusercontent.com/u/4930051?v=4" width="110px;"/><br /><sub>Wes Hulette</sub>](http://macfoo.wordpress.com/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jwhulette "Code") | [<img src="https://avatars0.githubusercontent.com/u/8134591?v=4" width="110px;"/><br /><sub>patrict</sub>](https://github.com/patrict)<br />[💻](https://github.com/snipe/snipe-it/commits?author=patrict "Code") |
| [<img src="https://avatars3.githubusercontent.com/u/2611616?v=4" width="110px;"/><br /><sub>Dmitriy Minaev</sub>](https://github.com/VELIKII-DIVAN)<br />[💻](https://github.com/snipe/snipe-it/commits?author=VELIKII-DIVAN "Code") | [<img src="https://avatars0.githubusercontent.com/u/5132245?v=4" width="110px;"/><br /><sub>liquidhorse</sub>](https://github.com/liquidhorse)<br />[💻](https://github.com/snipe/snipe-it/commits?author=liquidhorse "Code") | [<img src="https://avatars1.githubusercontent.com/u/183678?v=4" width="110px;"/><br /><sub>Jordi Boggiano</sub>](https://seld.be/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Seldaek "Code") | [<img src="https://avatars0.githubusercontent.com/u/653557?v=4" width="110px;"/><br /><sub>Ivan Nieto</sub>](https://github.com/inietov)<br />[💻](https://github.com/snipe/snipe-it/commits?author=inietov "Code") | [<img src="https://avatars2.githubusercontent.com/u/6764151?v=4" width="110px;"/><br /><sub>Ben RUBSON</sub>](https://github.com/benrubson)<br />[💻](https://github.com/snipe/snipe-it/commits?author=benrubson "Code") | [<img src="https://avatars2.githubusercontent.com/u/8554558?v=4" width="110px;"/><br /><sub>NMathar</sub>](https://github.com/NMathar)<br />[💻](https://github.com/snipe/snipe-it/commits?author=NMathar "Code") | [<img src="https://avatars1.githubusercontent.com/u/139566?v=4" width="110px;"/><br /><sub>Steffen</sub>](https://github.com/smb)<br />[💻](https://github.com/snipe/snipe-it/commits?author=smb "Code") |
| [<img src="https://avatars0.githubusercontent.com/u/6609453?v=4" width="110px;"/><br /><sub>Sxderp</sub>](https://github.com/Sxderp)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Sxderp "Code") | [<img src="https://avatars1.githubusercontent.com/u/4807843?v=4" width="110px;"/><br /><sub>fanta8897</sub>](https://github.com/fanta8897)<br />[💻](https://github.com/snipe/snipe-it/commits?author=fanta8897 "Code") | [<img src="https://avatars2.githubusercontent.com/u/2576509?v=4" width="110px;"/><br /><sub>Andrey Bolonin</sub>](https://andreybolonin.com/phpconsulting/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=andreybolonin "Code") | [<img src="https://avatars3.githubusercontent.com/u/2173307?v=4" width="110px;"/><br /><sub>shinayoshi</sub>](http://www.shinayoshi.net/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=shinayoshi "Code") | [<img src="https://avatars3.githubusercontent.com/u/2130159?v=4" width="110px;"/><br /><sub>Hubert</sub>](https://github.com/reuser)<br />[💻](https://github.com/snipe/snipe-it/commits?author=reuser "Code") | [<img src="https://avatars0.githubusercontent.com/u/6865789?v=4" width="110px;"/><br /><sub>KeenRivals</sub>](https://brashear.me)<br />[💻](https://github.com/snipe/snipe-it/commits?author=KeenRivals "Code") | [<img src="https://avatars3.githubusercontent.com/u/2902513?v=4" width="110px;"/><br /><sub>omyno</sub>](https://github.com/omyno)<br />[💻](https://github.com/snipe/snipe-it/commits?author=omyno "Code") |
| [<img src="https://avatars1.githubusercontent.com/u/6271335?v=4" width="110px;"/><br /><sub>Evgeny</sub>](https://github.com/jackka)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jackka "Code") | [<img src="https://avatars2.githubusercontent.com/u/1169963?v=4" width="110px;"/><br /><sub>Colin Campbell</sub>](https://digitalist.se)<br />[💻](https://github.com/snipe/snipe-it/commits?author=colin-campbell "Code") | [<img src="https://avatars3.githubusercontent.com/u/2872098?v=4" width="110px;"/><br /><sub>Ľubomír Kučera</sub>](https://github.com/lubo)<br />[💻](https://github.com/snipe/snipe-it/commits?author=lubo "Code") | [<img src="https://avatars3.githubusercontent.com/u/570639?v=4" width="110px;"/><br /><sub>Martin Meredith</sub>](https://www.sourceguru.net)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Mezzle "Code") | [<img src="https://avatars1.githubusercontent.com/u/7632599?v=4" width="110px;"/><br /><sub>Tim Farmer</sub>](https://github.com/timothyfarmer)<br />[💻](https://github.com/snipe/snipe-it/commits?author=timothyfarmer "Code") | [<img src="https://avatars0.githubusercontent.com/u/17459600?v=4" width="110px;"/><br /><sub>Marián Skrip</sub>](https://github.com/mskrip)<br />[💻](https://github.com/snipe/snipe-it/commits?author=mskrip "Code") | [<img src="https://avatars2.githubusercontent.com/u/47435081?v=4" width="110px;"/><br /><sub>Godfrey Martinez</sub>](https://github.com/Godmartinz)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Godmartinz "Code") |
| [<img src="https://avatars1.githubusercontent.com/u/2075128?v=4" width="110px;"/><br /><sub>bigtreeEdo</sub>](https://github.com/bigtreeEdo)<br />[💻](https://github.com/snipe/snipe-it/commits?author=bigtreeEdo "Code") | [<img src="https://avatars0.githubusercontent.com/u/5000430?v=4" width="110px;"/><br /><sub>Colin McNeil</sub>](https://colinmcneil.me/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=ColinMcNeil "Code") | [<img src="https://avatars0.githubusercontent.com/u/421625?v=4" width="110px;"/><br /><sub>JoKneeMo</sub>](https://github.com/JoKneeMo)<br />[💻](https://github.com/snipe/snipe-it/commits?author=JoKneeMo "Code") | [<img src="https://avatars0.githubusercontent.com/u/54849013?v=4" width="110px;"/><br /><sub>Joshi</sub>](http://www.redbridge.se)<br />[💻](https://github.com/snipe/snipe-it/commits?author=joshi-redbridge "Code") | [<img src="https://avatars2.githubusercontent.com/u/15731458?v=4" width="110px;"/><br /><sub>Anthony Burns</sub>](https://github.com/anthonypburns)<br />[💻](https://github.com/snipe/snipe-it/commits?author=anthonypburns "Code") | [<img src="https://avatars1.githubusercontent.com/u/63399474?v=4" width="110px;"/><br /><sub>johnson-yi</sub>](https://github.com/johnson-yi)<br />[💻](https://github.com/snipe/snipe-it/commits?author=johnson-yi "Code") | [<img src="https://avatars1.githubusercontent.com/u/1862720?v=4" width="110px;"/><br /><sub>Sanjay Govind</sub>](https://tangentmc.net)<br />[💻](https://github.com/snipe/snipe-it/commits?author=sanjay900 "Code") |
| [<img src="https://avatars0.githubusercontent.com/u/1255375?v=4" width="110px;"/><br /><sub>Peter Upfold</sub>](https://peter.upfold.org.uk/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=PeterUpfold "Code") | [<img src="https://avatars2.githubusercontent.com/u/961717?v=4" width="110px;"/><br /><sub>Jared Biel</sub>](https://github.com/jbiel)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jbiel "Code") | [<img src="https://avatars1.githubusercontent.com/u/1733625?v=4" width="110px;"/><br /><sub>Dampfklon</sub>](https://github.com/dampfklon)<br />[💻](https://github.com/snipe/snipe-it/commits?author=dampfklon "Code") | [<img src="https://avatars2.githubusercontent.com/u/52973156?v=4" width="110px;"/><br /><sub>Charles Hamilton</sub>](https://communityclosing.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=chamilton-ccn "Code") | [<img src="https://avatars.githubusercontent.com/u/551789?v=4" width="110px;"/><br /><sub>Giuseppe Iannello</sub>](https://github.com/giannello)<br />[💻](https://github.com/snipe/snipe-it/commits?author=giannello "Code") | [<img src="https://avatars.githubusercontent.com/u/3691490?v=4" width="110px;"/><br /><sub>Peter Dave Hello</sub>](https://www.peterdavehello.org/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=PeterDaveHello "Code") | [<img src="https://avatars.githubusercontent.com/u/6106332?v=4" width="110px;"/><br /><sub>sigmoidal</sub>](https://github.com/sigmoidal)<br />[💻](https://github.com/snipe/snipe-it/commits?author=sigmoidal "Code") |
| [<img src="https://avatars.githubusercontent.com/u/2082554?v=4" width="110px;"/><br /><sub>Vincent Lainé</sub>](https://github.com/phenixdotnet)<br />[💻](https://github.com/snipe/snipe-it/commits?author=phenixdotnet "Code") | [<img src="https://avatars.githubusercontent.com/u/1943040?v=4" width="110px;"/><br /><sub>Lucas Pleß</sub>](http://www.lucas-pless.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=derlucas "Code") | [<img src="https://avatars.githubusercontent.com/u/472804?v=4" width="110px;"/><br /><sub>Ian Littman</sub>](http://twitter.com/iansltx)<br />[💻](https://github.com/snipe/snipe-it/commits?author=iansltx "Code") | [<img src="https://avatars.githubusercontent.com/u/3519029?v=4" width="110px;"/><br /><sub>João Paulo</sub>](https://github.com/PauloLuna)<br />[💻](https://github.com/snipe/snipe-it/commits?author=PauloLuna "Code") | [<img src="https://avatars.githubusercontent.com/u/70443365?v=4" width="110px;"/><br /><sub>ThoBur</sub>](https://github.com/ThoBur)<br />[💻](https://github.com/snipe/snipe-it/commits?author=ThoBur "Code") | [<img src="https://avatars.githubusercontent.com/u/1972329?v=4" width="110px;"/><br /><sub>Alexander Chibrikin</sub>](http://phpprofi.ru/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=alek13 "Code") | [<img src="https://avatars.githubusercontent.com/u/438332?v=4" width="110px;"/><br /><sub>Anthony Winstanley</sub>](https://github.com/winstan)<br />[💻](https://github.com/snipe/snipe-it/commits?author=winstan "Code") |
| [<img src="https://avatars.githubusercontent.com/u/3075214?v=4" width="110px;"/><br /><sub>Folke</sub>](https://github.com/fashberg)<br />[💻](https://github.com/snipe/snipe-it/commits?author=fashberg "Code") | [<img src="https://avatars.githubusercontent.com/u/1351571?v=4" width="110px;"/><br /><sub>Bennett Blodinger</sub>](https://github.com/benwa)<br />[💻](https://github.com/snipe/snipe-it/commits?author=benwa "Code") | [<img src="https://avatars.githubusercontent.com/u/2974631?v=4" width="110px;"/><br /><sub>NMC</sub>](https://nmc.dev)<br />[💻](https://github.com/snipe/snipe-it/commits?author=ncareau "Code") | [<img src="https://avatars.githubusercontent.com/u/52182449?v=4" width="110px;"/><br /><sub>andres-baller</sub>](https://github.com/andres-baller)<br />[💻](https://github.com/snipe/snipe-it/commits?author=andres-baller "Code") | [<img src="https://avatars.githubusercontent.com/u/67109348?v=4" width="110px;"/><br /><sub>sean-borg</sub>](https://github.com/sean-borg)<br />[💻](https://github.com/snipe/snipe-it/commits?author=sean-borg "Code") | [<img src="https://avatars.githubusercontent.com/u/32170051?v=4" width="110px;"/><br /><sub>EDVLeer</sub>](https://github.com/EDVLeer)<br />[💻](https://github.com/snipe/snipe-it/commits?author=EDVLeer "Code") | [<img src="https://avatars.githubusercontent.com/u/23075196?v=4" width="110px;"/><br /><sub>Kurokat</sub>](https://github.com/Kurokat)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Kurokat "Code") |
| [<img src="https://avatars.githubusercontent.com/u/915514?v=4" width="110px;"/><br /><sub>Kevin Köllmann</sub>](https://www.kevinkoellmann.de)<br />[💻](https://github.com/snipe/snipe-it/commits?author=koelle25 "Code") | [<img src="https://avatars.githubusercontent.com/u/49025941?v=4" width="110px;"/><br /><sub>sw-mreyes</sub>](https://github.com/sw-mreyes)<br />[💻](https://github.com/snipe/snipe-it/commits?author=sw-mreyes "Code") | [<img src="https://avatars.githubusercontent.com/u/70129?v=4" width="110px;"/><br /><sub>Joel Pittet</sub>](https://pittet.ca)<br />[💻](https://github.com/snipe/snipe-it/commits?author=joelpittet "Code") | [<img src="https://avatars.githubusercontent.com/u/792695?v=4" width="110px;"/><br /><sub>Eli Young</sub>](https://elyscape.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=elyscape "Code") | [<img src="https://avatars.githubusercontent.com/u/317015?v=4" width="110px;"/><br /><sub>Raell Dottin</sub>](https://github.com/raelldottin)<br />[💻](https://github.com/snipe/snipe-it/commits?author=raelldottin "Code") | [<img src="https://avatars.githubusercontent.com/u/1446856?v=4" width="110px;"/><br /><sub>Tom Misilo</sub>](https://github.com/misilot)<br />[💻](https://github.com/snipe/snipe-it/commits?author=misilot "Code") | [<img src="https://avatars.githubusercontent.com/u/4496300?v=4" width="110px;"/><br /><sub>David Davenne</sub>](http://david.davenne.be)<br />[💻](https://github.com/snipe/snipe-it/commits?author=JuustoMestari "Code") |
| [<img src="https://avatars.githubusercontent.com/u/9255772?v=4" width="110px;"/><br /><sub>Mark Stenglein</sub>](https://markstenglein.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=ocelotsloth "Code") | [<img src="https://avatars.githubusercontent.com/u/35658596?v=4" width="110px;"/><br /><sub>ajsy</sub>](https://github.com/ajsy)<br />[💻](https://github.com/snipe/snipe-it/commits?author=ajsy "Code") | [<img src="https://avatars.githubusercontent.com/u/3628035?v=4" width="110px;"/><br /><sub>Jan Kiesewetter</sub>](https://github.com/t3easy)<br />[💻](https://github.com/snipe/snipe-it/commits?author=t3easy "Code") | [<img src="https://avatars.githubusercontent.com/u/79449630?v=4" width="110px;"/><br /><sub>Tetrachloromethane250</sub>](https://github.com/Tetrachloromethane250)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Tetrachloromethane250 "Code") | [<img src="https://avatars.githubusercontent.com/u/22004482?v=4" width="110px;"/><br /><sub>Lars Kajes</sub>](https://www.kajes.se/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=kajes "Code") | [<img src="https://avatars.githubusercontent.com/u/13993216?v=4" width="110px;"/><br /><sub>Joly0</sub>](https://github.com/Joly0)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Joly0 "Code") | [<img src="https://avatars.githubusercontent.com/u/1501022?v=4" width="110px;"/><br /><sub>theburger</sub>](https://github.com/limeless)<br />[💻](https://github.com/snipe/snipe-it/commits?author=limeless "Code") |
| [<img src="https://avatars.githubusercontent.com/u/36065681?v=4" width="110px;"/><br /><sub>David Valin Alonso</sub>](https://github.com/deivishome)<br />[💻](https://github.com/snipe/snipe-it/commits?author=deivishome "Code") | [<img src="https://avatars.githubusercontent.com/u/8290389?v=4" width="110px;"/><br /><sub>andreaci</sub>](https://github.com/andreaci)<br />[💻](https://github.com/snipe/snipe-it/commits?author=andreaci "Code") | [<img src="https://avatars.githubusercontent.com/u/1828542?v=4" width="110px;"/><br /><sub>Jelle Sebreghts</sub>](http://www.jellesebreghts.be)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Jelle-S "Code") | [<img src="https://avatars.githubusercontent.com/u/11180862?v=4" width="110px;"/><br /><sub>Michael Pietsch</sub>](https://github.com/Skywalker-11)<br /> | [<img src="https://avatars.githubusercontent.com/u/22068886?v=4" width="110px;"/><br /><sub>Masudul Haque Shihab</sub>](https://github.com/sh1hab)<br />[💻](https://github.com/snipe/snipe-it/commits?author=sh1hab "Code") | [<img src="https://avatars.githubusercontent.com/u/16099942?v=4" width="110px;"/><br /><sub>Supapong Areeprasertkul</sub>](http://www.freedomdive.com/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=zybersup "Code") | [<img src="https://avatars.githubusercontent.com/u/207358?v=4" width="110px;"/><br /><sub>Peter Sarossy</sub>](https://github.com/psarossy)<br />[💻](https://github.com/snipe/snipe-it/commits?author=psarossy "Code") |
| [<img src="https://avatars.githubusercontent.com/u/11823649?v=4" width="110px;"/><br /><sub>Renee Margaret McConahy</sub>](https://github.com/nepella)<br />[💻](https://github.com/snipe/snipe-it/commits?author=nepella "Code") | [<img src="https://avatars.githubusercontent.com/u/5553884?v=4" width="110px;"/><br /><sub>JohnnyPicnic</sub>](https://github.com/JohnnyPicnic)<br />[💻](https://github.com/snipe/snipe-it/commits?author=JohnnyPicnic "Code") | [<img src="https://avatars.githubusercontent.com/u/8799594?v=4" width="110px;"/><br /><sub>markbrule</sub>](https://github.com/markbrule)<br />[💻](https://github.com/snipe/snipe-it/commits?author=markbrule "Code") | [<img src="https://avatars.githubusercontent.com/u/1962801?v=4" width="110px;"/><br /><sub>Mike Campbell</sub>](https://github.com/mikecmpbll)<br />[💻](https://github.com/snipe/snipe-it/commits?author=mikecmpbll "Code") | [<img src="https://avatars.githubusercontent.com/u/11973217?v=4" width="110px;"/><br /><sub>tbrconnect</sub>](https://github.com/tbrconnect)<br />[💻](https://github.com/snipe/snipe-it/commits?author=tbrconnect "Code") | [<img src="https://avatars.githubusercontent.com/u/12447225?v=4" width="110px;"/><br /><sub>kcoyo</sub>](https://github.com/kcoyo)<br />[💻](https://github.com/snipe/snipe-it/commits?author=kcoyo "Code") | [<img src="https://avatars.githubusercontent.com/u/494017?v=4" width="110px;"/><br /><sub>Travis Miller</sub>](https://travismiller.com/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=travismiller "Code") |
| [<img src="https://avatars.githubusercontent.com/u/1975640?v=4" width="110px;"/><br /><sub>Evan Taylor</sub>](https://github.com/Delta5)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Delta5 "Code") | [<img src="https://avatars.githubusercontent.com/u/8735148?v=4" width="110px;"/><br /><sub>Petri Asikainen</sub>](https://github.com/PetriAsi)<br />[💻](https://github.com/snipe/snipe-it/commits?author=PetriAsi "Code") | [<img src="https://avatars.githubusercontent.com/u/11424540?v=4" width="110px;"/><br /><sub>derdeagle</sub>](https://github.com/derdeagle)<br />[💻](https://github.com/snipe/snipe-it/commits?author=derdeagle "Code") | [<img src="https://avatars.githubusercontent.com/u/176950?v=4" width="110px;"/><br /><sub>Mike Frysinger</sub>](https://wh0rd.org/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=vapier "Code") | [<img src="https://avatars.githubusercontent.com/u/22044358?v=4" width="110px;"/><br /><sub>ALPHA</sub>](https://github.com/AL4AL)<br />[💻](https://github.com/snipe/snipe-it/commits?author=AL4AL "Code") | [<img src="https://avatars.githubusercontent.com/u/1042587?v=4" width="110px;"/><br /><sub>FliegenKLATSCH</sub>](https://www.ifern.de)<br />[💻](https://github.com/snipe/snipe-it/commits?author=FliegenKLATSCH "Code") | [<img src="https://avatars.githubusercontent.com/u/442138?v=4" width="110px;"/><br /><sub>Jeremy Price</sub>](https://github.com/jerm)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jerm "Code") |
| [<img src="https://avatars.githubusercontent.com/u/84392209?v=4" width="110px;"/><br /><sub>Toreg87</sub>](https://github.com/Toreg87)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Toreg87 "Code") | [<img src="https://avatars.githubusercontent.com/u/67638596?v=4" width="110px;"/><br /><sub>Matthew Nickson</sub>](https://github.com/Computroniks)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Computroniks "Code") | [<img src="https://avatars.githubusercontent.com/u/1646397?v=4" width="110px;"/><br /><sub>Jethro Nederhof</sub>](https://jethron.id.au)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jethron "Code") | [<img src="https://avatars.githubusercontent.com/u/23289826?v=4" width="110px;"/><br /><sub>Oskar Stenberg</sub>](https://github.com/01ste02)<br />[💻](https://github.com/snipe/snipe-it/commits?author=01ste02 "Code") | [<img src="https://avatars.githubusercontent.com/u/82208283?v=4" width="110px;"/><br /><sub>Robert-Azelis</sub>](https://github.com/Robert-Azelis)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Robert-Azelis "Code") | [<img src="https://avatars.githubusercontent.com/u/60648387?v=4" width="110px;"/><br /><sub>Alexander William Smith</sub>](https://github.com/alwism)<br />[💻](https://github.com/snipe/snipe-it/commits?author=alwism "Code") | [<img src="https://avatars.githubusercontent.com/u/24418301?v=4" width="110px;"/><br /><sub>LEITWERK AG</sub>](https://www.leitwerk.de/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=leitwerk-ag "Code") |
| [<img src="https://avatars.githubusercontent.com/u/1911435?v=4" width="110px;"/><br /><sub>Adam</sub>](http://www.aboutcher.co.uk)<br />[💻](https://github.com/snipe/snipe-it/commits?author=adamboutcher "Code") | [<img src="https://avatars.githubusercontent.com/u/16104273?v=4" width="110px;"/><br /><sub>Ian</sub>](https://snksrv.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=sneak-it "Code") | [<img src="https://avatars.githubusercontent.com/u/4023909?v=4" width="110px;"/><br /><sub>Shao Yu-Lung (Allen)</sub>](http://blog.bestlong.idv.tw/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=bestlong "Code") | [<img src="https://avatars.githubusercontent.com/u/76475453?v=4" width="110px;"/><br /><sub>Haxatron</sub>](https://github.com/Haxatron)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Haxatron "Code") | [<img src="https://avatars.githubusercontent.com/u/88776392?v=4" width="110px;"/><br /><sub>PlaneNuts</sub>](https://github.com/PlaneNuts)<br />[💻](https://github.com/snipe/snipe-it/commits?author=PlaneNuts "Code") | [<img src="https://avatars.githubusercontent.com/u/3842948?v=4" width="110px;"/><br /><sub>Bradley Coudriet</sub>](http://bjcpgd.cias.rit.edu)<br />[💻](https://github.com/snipe/snipe-it/commits?author=exula "Code") | [<img src="https://avatars.githubusercontent.com/u/21966173?v=4" width="110px;"/><br /><sub>Dalton Durst</sub>](https://daltondur.st)<br />[💻](https://github.com/snipe/snipe-it/commits?author=UniversalSuperBox "Code") |
| [<img src="https://avatars.githubusercontent.com/u/38761237?v=4" width="110px;"/><br /><sub>Alex Janes</sub>](https://adagiohealth.org)<br />[💻](https://github.com/snipe/snipe-it/commits?author=adagioajanes "Code") | [<img src="https://avatars.githubusercontent.com/u/32387849?v=4" width="110px;"/><br /><sub>Nuraeil</sub>](https://github.com/nuraeil)<br />[💻](https://github.com/snipe/snipe-it/commits?author=nuraeil "Code") | [<img src="https://avatars.githubusercontent.com/u/48162670?v=4" width="110px;"/><br /><sub>TenOfTens</sub>](https://github.com/TenOfTens)<br />[💻](https://github.com/snipe/snipe-it/commits?author=TenOfTens "Code") | [<img src="https://avatars.githubusercontent.com/u/9415391?v=4" width="110px;"/><br /><sub>waffle</sub>](https://ditisjens.be/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=insert-waffle "Code") | [<img src="https://avatars.githubusercontent.com/u/19945501?v=4" width="110px;"/><br /><sub>Yevhenii Huzii</sub>](https://github.com/QveenSi)<br />[💻](https://github.com/snipe/snipe-it/commits?author=QveenSi "Code") | [<img src="https://avatars.githubusercontent.com/u/3839381?v=4" width="110px;"/><br /><sub>Achmad Fienan Rahardianto</sub>](https://github.com/veenone)<br />[💻](https://github.com/snipe/snipe-it/commits?author=veenone "Code") | [<img src="https://avatars.githubusercontent.com/u/19945501?v=4" width="110px;"/><br /><sub>Yevhenii Huzii</sub>](https://github.com/QveenSi)<br />[💻](https://github.com/snipe/snipe-it/commits?author=QveenSi "Code") |
| [<img src="https://avatars.githubusercontent.com/u/97299851?v=4" width="110px;"/><br /><sub>Christian Weirich</sub>](https://github.com/chrisweirich)<br />[💻](https://github.com/snipe/snipe-it/commits?author=chrisweirich "Code") | [<img src="https://avatars.githubusercontent.com/u/1294403?v=4" width="110px;"/><br /><sub>denzfarid</sub>](https://github.com/denzfarid)<br /> | [<img src="https://avatars.githubusercontent.com/u/94018771?v=4" width="110px;"/><br /><sub>ntbutler-nbcs</sub>](https://github.com/ntbutler-nbcs)<br />[💻](https://github.com/snipe/snipe-it/commits?author=ntbutler-nbcs "Code") | [<img src="https://avatars.githubusercontent.com/u/172697?v=4" width="110px;"/><br /><sub>Naveen</sub>](https://naveensrinivasan.dev)<br />[💻](https://github.com/snipe/snipe-it/commits?author=naveensrinivasan "Code") | [<img src="https://avatars.githubusercontent.com/u/55674383?v=4" width="110px;"/><br /><sub>Mike Roquemore</sub>](https://github.com/mikeroq)<br />[💻](https://github.com/snipe/snipe-it/commits?author=mikeroq "Code") | [<img src="https://avatars.githubusercontent.com/u/7991086?v=4" width="110px;"/><br /><sub>Daniel Reeder</sub>](https://github.com/reederda)<br />[🌍](#translation-reederda "Translation") [🌍](#translation-reederda "Translation") [💻](https://github.com/snipe/snipe-it/commits?author=reederda "Code") | [<img src="https://avatars.githubusercontent.com/u/109422491?v=4" width="110px;"/><br /><sub>vickyjaura183</sub>](https://github.com/vickyjaura183)<br />[💻](https://github.com/snipe/snipe-it/commits?author=vickyjaura183 "Code") |
| [<img src="https://avatars.githubusercontent.com/u/32363424?v=4" width="110px;"/><br /><sub>Peace</sub>](https://github.com/julian-piehl)<br />[💻](https://github.com/snipe/snipe-it/commits?author=julian-piehl "Code") | [<img src="https://avatars.githubusercontent.com/u/231528?v=4" width="110px;"/><br /><sub>Kyle Gordon</sub>](https://github.com/kylegordon)<br />[💻](https://github.com/snipe/snipe-it/commits?author=kylegordon "Code") | [<img src="https://avatars.githubusercontent.com/u/53009155?v=4" width="110px;"/><br /><sub>Katharina Drexel</sub>](http://www.bfh.ch)<br />[💻](https://github.com/snipe/snipe-it/commits?author=sunflowerbofh "Code") | [<img src="https://avatars.githubusercontent.com/u/1931963?v=4" width="110px;"/><br /><sub>David Sferruzza</sub>](https://david.sferruzza.fr/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=dsferruzza "Code") | [<img src="https://avatars.githubusercontent.com/u/19511639?v=4" width="110px;"/><br /><sub>Rick Nelson</sub>](https://github.com/rnelsonee)<br />[💻](https://github.com/snipe/snipe-it/commits?author=rnelsonee "Code") | [<img src="https://avatars.githubusercontent.com/u/94169344?v=4" width="110px;"/><br /><sub>BasO12</sub>](https://github.com/BasO12)<br />[💻](https://github.com/snipe/snipe-it/commits?author=BasO12 "Code") | [<img src="https://avatars.githubusercontent.com/u/111710123?v=4" width="110px;"/><br /><sub>Vautia</sub>](https://github.com/Vautia)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Vautia "Code") |
| [<img src="https://avatars.githubusercontent.com/u/28321?v=4" width="110px;"/><br /><sub>Chris Hartjes</sub>](http://www.littlehart.net/atthekeyboard)<br />[💻](https://github.com/snipe/snipe-it/commits?author=chartjes "Code") | [<img src="https://avatars.githubusercontent.com/u/2404584?v=4" width="110px;"/><br /><sub>geo-chen</sub>](https://github.com/geo-chen)<br />[💻](https://github.com/snipe/snipe-it/commits?author=geo-chen "Code") | [<img src="https://avatars.githubusercontent.com/u/6006620?v=4" width="110px;"/><br /><sub>Phan Nguyen</sub>](https://github.com/nh314)<br />[💻](https://github.com/snipe/snipe-it/commits?author=nh314 "Code") | [<img src="https://avatars.githubusercontent.com/u/115993812?v=4" width="110px;"/><br /><sub>Iisakki Jaakkola</sub>](https://github.com/StarlessNights)<br />[💻](https://github.com/snipe/snipe-it/commits?author=StarlessNights "Code") | [<img src="https://avatars.githubusercontent.com/u/22633385?v=4" width="110px;"/><br /><sub>Ikko Ashimine</sub>](https://bandism.net/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=eltociear "Code") | [<img src="https://avatars.githubusercontent.com/u/56871540?v=4" width="110px;"/><br /><sub>Lukas Fehling</sub>](https://github.com/lukasfehling)<br />[💻](https://github.com/snipe/snipe-it/commits?author=lukasfehling "Code") | [<img src="https://avatars.githubusercontent.com/u/1975990?v=4" width="110px;"/><br /><sub>Fernando Almeida</sub>](https://github.com/fernando-almeida)<br />[💻](https://github.com/snipe/snipe-it/commits?author=fernando-almeida "Code") |
| [<img src="https://avatars.githubusercontent.com/u/116301219?v=4" width="110px;"/><br /><sub>akemidx</sub>](https://github.com/akemidx)<br />[💻](https://github.com/snipe/snipe-it/commits?author=akemidx "Code") | [<img src="https://avatars.githubusercontent.com/u/144778?v=4" width="110px;"/><br /><sub>Oguz Bilgic</sub>](http://oguz.site)<br />[💻](https://github.com/snipe/snipe-it/commits?author=oguzbilgic "Code") | [<img src="https://avatars.githubusercontent.com/u/9262438?v=4" width="110px;"/><br /><sub>Scooter Crawford</sub>](https://github.com/scoo73r)<br />[💻](https://github.com/snipe/snipe-it/commits?author=scoo73r "Code") | [<img src="https://avatars.githubusercontent.com/u/5957345?v=4" width="110px;"/><br /><sub>subdriven</sub>](https://github.com/subdriven)<br />[💻](https://github.com/snipe/snipe-it/commits?author=subdriven "Code") | [<img src="https://avatars.githubusercontent.com/u/658865?v=4" width="110px;"/><br /><sub>Andrew Savinykh</sub>](https://github.com/AndrewSav)<br />[💻](https://github.com/snipe/snipe-it/commits?author=AndrewSav "Code") | [<img src="https://avatars.githubusercontent.com/u/1155067?v=4" width="110px;"/><br /><sub>Tadayuki Onishi</sub>](https://kenchan0130.github.io)<br />[💻](https://github.com/snipe/snipe-it/commits?author=kenchan0130 "Code") | [<img src="https://avatars.githubusercontent.com/u/112496896?v=4" width="110px;"/><br /><sub>Florian</sub>](https://github.com/floschoepfer)<br />[💻](https://github.com/snipe/snipe-it/commits?author=floschoepfer "Code") |
| [<img src="https://avatars.githubusercontent.com/u/7305753?v=4" width="110px;"/><br /><sub>Spencer Long</sub>](http://spencerlong.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=spencerrlongg "Code") | [<img src="https://avatars.githubusercontent.com/u/1141514?v=4" width="110px;"/><br /><sub>Marcus Moore</sub>](https://github.com/marcusmoore)<br />[💻](https://github.com/snipe/snipe-it/commits?author=marcusmoore "Code") | [<img src="https://avatars.githubusercontent.com/u/570639?v=4" width="110px;"/><br /><sub>Martin Meredith</sub>](https://github.com/Mezzle)<br /> |
<!-- ALL-CONTRIBUTORS-LIST:END -->
This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind welcome!
> [!IMPORTANT]
> **To report a security vulnerability, please email security@snipeitapp.com instead of using the issue tracker.**

View File

@@ -9,43 +9,57 @@ Before starting, follow the [instructions](README.md#installation) for installin
Before attempting to run the test suite copy the example environment file for tests and update the values to match your environment:
`cp .env.testing.example .env.testing`
> Since the data in the database is flushed after each test it is recommended you create a separate mysql database for specifically for tests
The following should work for running tests in memory with sqlite:
```
# --------------------------------------------
# REQUIRED: BASIC APP SETTINGS
# --------------------------------------------
APP_ENV=testing
APP_DEBUG=true
APP_KEY=base64:glJpcM7BYwWiBggp3SQ/+NlRkqsBQMaGEOjemXqJzOU=
APP_URL=http://localhost:8000
APP_TIMEZONE='UTC'
APP_LOCALE=en
# --------------------------------------------
# REQUIRED: DATABASE SETTINGS
# --------------------------------------------
DB_CONNECTION=sqlite_testing
#DB_HOST=127.0.0.1
#DB_PORT=3306
#DB_DATABASE=null
#DB_USERNAME=null
#DB_PASSWORD=null
```
To use MySQL you should update the `DB_` variables to match your local test database:
```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE={}
DB_USERNAME={}
DB_PASSWORD={}
```
Now you are ready to run the entire test suite from your terminal:
`php artisan test`
```shell
php artisan test
````
To run individual test files, you can pass the path to the test that you want to run:
`php artisan test tests/Unit/AccessoryTest.php`
```shell
php artisan test tests/Unit/AccessoryTest.php
```
## Browser Tests
Some tests, like ones concerning LDAP, are marked with the `@group` annotation. Those groups can be run, or excluded, using the `--group` or `--exclude-group` flags:
Browser tests are run via [Laravel Dusk](https://laravel.com/docs/8.x/dusk) and require Google Chrome to be installed.
```shell
php artisan test --group=ldap
Before attempting to run Dusk tests copy the example environment file for Dusk and update the values to match your environment:
`cp .env.dusk.example .env.dusk.local`
> `local` refers to the value of `APP_ENV` in your `.env` so if you have it set to `dev` then the file should be named `.env.dusk.dev`.
**Important**: Dusk tests cannot be run using an in-memory SQLite database. Additionally, the Dusk test suite uses the `DatabaseMigrations` trait which will leave the database in a fresh state after running. Therefore, it is recommended that you create a test database and point `DB_DATABASE` in `.env.dusk.local` to it.
### Running Browser Tests
Your application needs to be configured and up and running in order for the browser tests to actually run. When running the tests locally, you can start the application using the following command:
`php artisan serve`
Now you are ready to run the test suite. Use the following command from another terminal tab or window:
`php artisan dusk`
To run individual test files, you can pass the path to the test that you want to run:
`php artisan dusk tests/Browser/LoginTest.php`
If you get an error when attempting to run Dusk tests that says `Couldn't connect to server` run:
`php artisan dusk:chrome-driver --detect`
This command will install the specific ChromeDriver Dusk needs for your operating system and Chrome version.
php artisan test --exclude-group=ldap
```
This can be helpful if a set of tests are failing because you don't have an extension, like LDAP, installed.

View File

@@ -38,7 +38,7 @@
"description": "The maximum number of search results that can be returned at one time.",
"value": "500"
},
"MAIL_DRIVER": {
"MAIL_MAILER": {
"description": "Mail driver - Generally SMTP on Heroku - https://snipe-it.readme.io/docs/configuration#required-outgoing-mail-settings",
"value": "smtp"
},
@@ -58,9 +58,9 @@
"description": "SMTP Server Password",
"value": "YOURPASSWORD"
},
"MAIL_ENCRYPTION": {
"description": "Encryption protocol for email sending.",
"value": "null"
"MAIL_TLS_VERIFY_PEER": {
"description": "Ensure validity of TLS certificate on remote mail server",
"value": true
},
"MAIL_FROM_ADDR": {
"description": "Email from address",

View File

@@ -56,7 +56,7 @@ class CheckoutLicenseToAllUsers extends Command
return false;
}
$users = User::whereNull('deleted_at')->where('autoassign_licenses', '==', 1)->with('licenses')->get();
$users = User::whereNull('deleted_at')->where('autoassign_licenses', '=', 1)->with('licenses')->get();
if ($users->count() > $license->getAvailSeatsCountAttribute()) {
$this->info('You do not have enough free seats to complete this task, so we will check out as many as we can. ');

View File

@@ -20,13 +20,14 @@ class CreateAdmin extends Command
* @property string $password
* @property boolean $activated
* @property boolean $show_in_list
* @property boolean $autoassign_licenses
* @property \Illuminate\Support\Carbon|null $created_at
* @property mixed $created_by
*/
protected $signature = 'snipeit:create-admin {--first_name=} {--last_name=} {--email=} {--username=} {--password=} {show_in_list?}';
protected $signature = 'snipeit:create-admin {--first_name=} {--last_name=} {--email=} {--username=} {--password=} {show_in_list?} {autoassign_licenses?}';
/**
* The console command description.
@@ -54,6 +55,9 @@ class CreateAdmin extends Command
$email = $this->option('email');
$password = $this->option('password');
$show_in_list = $this->argument('show_in_list');
$autoassign_licenses = $this->argument('autoassign_licenses');
if (($first_name == '') || ($last_name == '') || ($username == '') || ($email == '') || ($password == '')) {
$this->info('ERROR: All fields are required.');
@@ -70,6 +74,11 @@ class CreateAdmin extends Command
if ($show_in_list == 'false') {
$user->show_in_list = 0;
}
if ($autoassign_licenses == 'false') {
$user->autoassign_licenses = 0;
}
if ($user->save()) {
$this->info('New user created');
$user->groups()->attach(1);

View File

@@ -7,7 +7,7 @@ use Illuminate\Console\Command;
use App\Models\User;
use Laravel\Passport\TokenRepository;
use Illuminate\Contracts\Validation\Factory as ValidationFactory;
use DB;
use Illuminate\Support\Facades\DB;
class GeneratePersonalAccessToken extends Command
{

View File

@@ -9,7 +9,7 @@ use App\Models\Setting;
use App\Models\Ldap;
use App\Models\User;
use App\Models\Location;
use Log;
use Illuminate\Support\Facades\Log;
class LdapSync extends Command
{
@@ -18,7 +18,7 @@ class LdapSync extends Command
*
* @var string
*/
protected $signature = 'snipeit:ldap-sync {--location=} {--location_id=} {--base_dn=} {--filter=} {--summary} {--json_summary}';
protected $signature = 'snipeit:ldap-sync {--location=} {--location_id=*} {--base_dn=} {--filter=} {--summary} {--json_summary}';
/**
* The console command description.
@@ -62,9 +62,11 @@ class LdapSync extends Command
$ldap_result_phone = Setting::getSettings()->ldap_phone_field;
$ldap_result_jobtitle = Setting::getSettings()->ldap_jobtitle;
$ldap_result_country = Setting::getSettings()->ldap_country;
$ldap_result_location = Setting::getSettings()->ldap_location;
$ldap_result_dept = Setting::getSettings()->ldap_dept;
$ldap_result_manager = Setting::getSettings()->ldap_manager;
$ldap_default_group = Setting::getSettings()->ldap_default_group;
$search_base = Setting::getSettings()->ldap_base_dn;
try {
$ldapconn = Ldap::connectToLdap();
@@ -82,17 +84,37 @@ class LdapSync extends Command
$summary = [];
try {
/**
* if a location ID has been specified, use that OU
*/
if ( $this->option('location_id') ) {
foreach($this->option('location_id') as $location_id){
$location_ou = Location::where('id', '=', $location_id)->value('ldap_ou');
$search_base = $location_ou;
Log::debug('Importing users from specified location OU: \"'.$search_base.'\".');
}
}
/**
* if a manual base DN has been specified, use that. Allow the Base DN to override
* even if there's a location-based DN - if you picked it, you must have picked it for a reason.
*/
if ($this->option('base_dn') != '') {
$search_base = $this->option('base_dn');
Log::debug('Importing users from specified base DN: \"'.$search_base.'\".');
} else {
$search_base = null;
}
/**
* If a filter has been specified, use that
*/
if ($this->option('filter') != '') {
$results = Ldap::findLdapUsers($search_base, -1, $this->option('filter'));
} else {
$results = Ldap::findLdapUsers($search_base);
}
} catch (\Exception $e) {
if ($this->option('json_summary')) {
$json_summary = ['error' => true, 'error_message' => $e->getMessage(), 'summary' => []];
@@ -105,17 +127,21 @@ class LdapSync extends Command
/* Determine which location to assign users to by default. */
$location = null; // TODO - this would be better called "$default_location", which is more explicit about its purpose
if ($this->option('location') != '') {
$location = Location::where('name', '=', $this->option('location'))->first();
if ($location = Location::where('name', '=', $this->option('location'))->first()) {
Log::debug('Location name ' . $this->option('location') . ' passed');
Log::debug('Importing to ' . $location->name . ' (' . $location->id . ')');
} elseif ($this->option('location_id') != '') {
$location = Location::where('id', '=', $this->option('location_id'))->first();
Log::debug('Location ID '.$this->option('location_id').' passed');
Log::debug('Importing to '.$location->name.' ('.$location->id.')');
}
} elseif ($this->option('location_id')) {
foreach($this->option('location_id') as $location_id) {
if ($location = Location::where('id', '=', $location_id)->first()) {
Log::debug('Location ID ' . $location_id . ' passed');
Log::debug('Importing to ' . $location->name . ' (' . $location->id . ')');
}
}
}
if (! isset($location)) {
Log::debug('That location is invalid or a location was not provided, so no location will be assigned by default.');
}
@@ -179,10 +205,6 @@ class LdapSync extends Command
}
}
/* Create user account entries in Snipe-IT */
$tmp_pass = substr(str_shuffle('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'), 0, 20);
$pass = bcrypt($tmp_pass);
$manager_cache = [];
if($ldap_default_group != null) {
@@ -209,8 +231,14 @@ class LdapSync extends Command
$item['country'] = $results[$i][$ldap_result_country][0] ?? '';
$item['department'] = $results[$i][$ldap_result_dept][0] ?? '';
$item['manager'] = $results[$i][$ldap_result_manager][0] ?? '';
$item['location'] = $results[$i][$ldap_result_location][0] ?? '';
// ONLY if you are using the "ldap_location" option *AND* you have an actual result
if ($ldap_result_location && $item['location']) {
$location = Location::firstOrCreate([
'name' => $item['location'],
]);
}
$department = Department::firstOrCreate([
'name' => $item['department'],
]);
@@ -222,21 +250,45 @@ class LdapSync extends Command
} else {
// Creating a new user.
$user = new User;
$user->password = $pass;
$user->password = $user->noPassword();
$user->locale = app()->getLocale();
$user->activated = 1; // newly created users can log in by default, unless AD's UAC is in use, or an active flag is set (below)
$item['createorupdate'] = 'created';
}
$user->first_name = $item['firstname'];
$user->last_name = $item['lastname'];
//If a sync option is not filled in on the LDAP settings don't populate the user field
if($ldap_result_username != null){
$user->username = $item['username'];
$user->email = $item['email'];
}
if($ldap_result_last_name != null){
$user->last_name = $item['lastname'];
}
if($ldap_result_first_name != null){
$user->first_name = $item['firstname'];
}
if($ldap_result_emp_num != null){
$user->employee_num = e($item['employee_number']);
}
if($ldap_result_email != null){
$user->email = $item['email'];
}
if($ldap_result_phone != null){
$user->phone = $item['telephone'];
}
if($ldap_result_jobtitle != null){
$user->jobtitle = $item['jobtitle'];
}
if($ldap_result_country != null){
$user->country = $item['country'];
}
if($ldap_result_dept != null){
$user->department_id = $department->id;
}
if($ldap_result_location != null){
$user->location_id = $location ? $location->id : null;
}
if($ldap_result_manager != null){
if($item['manager'] != null) {
// Check Cache first
if (isset($manager_cache[$item['manager']])) {
@@ -247,7 +299,7 @@ class LdapSync extends Command
try {
$ldap_manager = Ldap::findLdapUsers($item['manager'], -1, $this->option('filter'));
} catch (\Exception $e) {
\Log::warning("Manager lookup caused an exception: " . $e->getMessage() . ". Falling back to direct username lookup");
Log::warning("Manager lookup caused an exception: " . $e->getMessage() . ". Falling back to direct username lookup");
// Hail-mary for Okta manager 'shortnames' - will only work if
// Okta configuration is using full email-address-style usernames
$ldap_manager = [
@@ -276,6 +328,7 @@ class LdapSync extends Command
}
}
}
// Sync activated state for Active Directory.
if ( !empty($ldap_result_active_flag)) { // IF we have an 'active' flag set....
@@ -338,7 +391,7 @@ class LdapSync extends Command
$user->location_id = $location->id;
}
}
$location = null;
$user->ldap_import = 1;
$errors = '';

View File

@@ -5,7 +5,7 @@ namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Models\Setting;
use Exception;
use Crypt;
use Illuminate\Support\Facades\Crypt;
/**
* Check if a given ip is in a network
@@ -160,7 +160,7 @@ class LdapTroubleshooter extends Command
$output[] = "-x";
$output[] = "-b ".escapeshellarg($settings->ldap_basedn);
$output[] = "-D ".escapeshellarg($settings->ldap_uname);
$output[] = "-w ".escapeshellarg(\Crypt::Decrypt($settings->ldap_pword));
$output[] = "-w ".escapeshellarg(Crypt::Decrypt($settings->ldap_pword));
$output[] = escapeshellarg(parenthesized_filter($settings->ldap_filter));
if($settings->ldap_tls) {
$this->line("# adding STARTTLS option");

View File

@@ -2,6 +2,7 @@
namespace App\Console\Commands;
use App\Events\UserMerged;
use App\Models\User;
use Carbon\Carbon;
use Illuminate\Console\Command;
@@ -51,7 +52,7 @@ class MergeUsersByUsername extends Command
$bad_users = User::where('username', '=', trim($parts[0]))
->whereNull('deleted_at')
->with('assets', 'manager', 'userlog', 'licenses', 'consumables', 'accessories', 'managedLocations')
->with('assets', 'manager', 'userlog', 'licenses', 'consumables', 'accessories', 'managedLocations','uploads', 'acceptances')
->get();
@@ -105,10 +106,26 @@ class MergeUsersByUsername extends Command
$managedLocation->save();
}
foreach ($bad_user->uploads as $upload) {
$this->info('Updating upload log record '.$upload->id.' to user '.$user->id);
$upload->item_id = $user->id;
$upload->save();
}
foreach ($bad_user->acceptances as $acceptance) {
$this->info('Updating acceptance log record '.$acceptance->id.' to user '.$user->id);
$acceptance->item_id = $user->id;
$acceptance->save();
}
// Mark the user as deleted
$this->info('Marking the user as deleted');
$bad_user->deleted_at = Carbon::now()->timestamp;
$bad_user->save();
event(new UserMerged($bad_user, $user, null));
}
}
}

View File

@@ -4,6 +4,7 @@ namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Log;
class MoveUploadsToNewDisk extends Command
{
@@ -74,7 +75,7 @@ class MoveUploadsToNewDisk extends Command
$new_url = Storage::disk('public')->url('uploads/'.$public_type.'/'.$filename, $filename);
$this->info($type_count.'. PUBLIC: '.$filename.' was copied to '.$new_url);
} catch (\Exception $e) {
\Log::debug($e);
Log::debug($e);
$this->error($e);
}
}
@@ -116,7 +117,7 @@ class MoveUploadsToNewDisk extends Command
$new_url = Storage::url($private_type . '/' . $filename, $filename);
$this->info($type_count . '. PRIVATE: ' . $filename . ' was copied to ' . $new_url);
} catch (\Exception $e) {
\Log::debug($e);
Log::debug($e);
$this->error($e);
}
}
@@ -140,7 +141,7 @@ class MoveUploadsToNewDisk extends Command
unlink($filename);
$public_delete_count++;
} catch (\Exception $e) {
\Log::debug($e);
Log::debug($e);
$this->error($e);
}
}
@@ -153,7 +154,7 @@ class MoveUploadsToNewDisk extends Command
unlink($filename);
$private_delete_count++;
} catch (\Exception $e) {
\Log::debug($e);
Log::debug($e);
$this->error($e);
}
}

View File

@@ -5,6 +5,7 @@ namespace App\Console\Commands;
use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputOption;
use Illuminate\Support\Facades\Log;
ini_set('max_execution_time', env('IMPORT_TIME_LIMIT', 600)); //600 seconds = 10 minutes
ini_set('memory_limit', env('IMPORT_MEMORY_LIMIT', '500M'));
@@ -59,7 +60,7 @@ class ObjectImportCommand extends Command
// This $logFile/useFiles() bit is currently broken, so commenting it out for now
// $logFile = $this->option('logfile');
// \Log::useFiles($logFile);
// Log::useFiles($logFile);
$this->comment('======= Importing Items from '.$filename.' =========');
$importer->import();
@@ -112,10 +113,10 @@ class ObjectImportCommand extends Command
public function log($string, $level = 'info')
{
if ($level === 'warning') {
\Log::warning($string);
Log::warning($string);
$this->comment($string);
} else {
\Log::Info($string);
Log::Info($string);
if ($this->option('verbose')) {
$this->comment($string);
}

View File

@@ -5,7 +5,7 @@ namespace App\Console\Commands;
use App\Models\Asset;
use App\Models\CustomField;
use Schema;
use DB;
use Illuminate\Support\Facades\DB;
use Illuminate\Console\Command;
class PaveIt extends Command

View File

@@ -103,7 +103,7 @@ class RecryptFromMcrypt extends Command
$this->comment('INFO: No LDAP password found. Skipping... ');
} else {
$decrypted_ldap_pword = $mcrypter->decrypt($settings->ldap_pword);
$settings->ldap_pword = \Crypt::encrypt($decrypted_ldap_pword);
$settings->ldap_pword = Crypt::encrypt($decrypted_ldap_pword);
$settings->save();
}
/** @var CustomField[] $custom_fields */
@@ -132,7 +132,7 @@ class RecryptFromMcrypt extends Command
// Try to decrypt the payload using the legacy app key
try {
$decrypted_field = $mcrypter->decrypt($asset->{$columnName});
$asset->{$columnName} = \Crypt::encrypt($decrypted_field);
$asset->{$columnName} = Crypt::encrypt($decrypted_field);
$this->comment($decrypted_field);
} catch (\Exception $e) {
$errors[] = ' - ERROR: Could not decrypt field ['.$encrypted_field->name.']: '.$e->getMessage();

View File

@@ -4,7 +4,7 @@ namespace App\Console\Commands;
use App\Models\Asset;
use App\Models\Setting;
use Artisan;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Console\Command;
class RegenerateAssetTags extends Command

View File

@@ -63,7 +63,7 @@ class ResetDemoSettings extends Command
$settings->date_display_format = 'D M d, Y';
$settings->time_display_format = 'g:iA';
$settings->thumbnail_max_h = '30';
$settings->locale = 'en';
$settings->locale = 'en-US';
$settings->version_footer = 'on';
$settings->support_footer = null;
$settings->saml_enabled = '0';
@@ -78,7 +78,7 @@ class ResetDemoSettings extends Command
$settings->save();
if ($user = User::where('username', '=', 'admin')->first()) {
$user->locale = 'en';
$user->locale = 'en-US';
$user->save();
}

View File

@@ -6,8 +6,8 @@ use App\Models\Actionlog;
use App\Models\Asset;
use App\Models\License;
use App\Models\User;
use Artisan;
use DB;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\DB;
use Illuminate\Console\Command;
class RestoreDeletedUsers extends Command

View File

@@ -4,6 +4,152 @@ namespace App\Console\Commands;
use Illuminate\Console\Command;
use ZipArchive;
use Illuminate\Support\Facades\Log;
class SQLStreamer {
private $input;
private $output;
// embed the prefix here?
public ?string $prefix;
private bool $reading_beginning_of_line = true;
public static $buffer_size = 1024 * 1024; // use a 1MB buffer, ought to work fine for most cases?
public array $tablenames = [];
private bool $should_guess = false;
private bool $statement_is_permitted = false;
public function __construct($input, $output, string $prefix = null)
{
$this->input = $input;
$this->output = $output;
$this->prefix = $prefix;
}
public function parse_sql(string $line): string {
// take into account the 'start of line or not' setting as an instance variable?
// 'continuation' lines for a permitted statement are PERMITTED.
if($this->statement_is_permitted && $line[0] === ' ') {
return $line;
}
$table_regex = '`?([a-zA-Z0-9_]+)`?';
$allowed_statements = [
"/^(DROP TABLE (?:IF EXISTS )?)`$table_regex(.*)$/" => false,
"/^(CREATE TABLE )$table_regex(.*)$/" => true, //sets up 'continuation'
"/^(LOCK TABLES )$table_regex(.*)$/" => false,
"/^(INSERT INTO )$table_regex(.*)$/" => false,
"/^UNLOCK TABLES/" => false,
// "/^\\) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;/" => false, // FIXME not sure what to do here?
"/^\\)[a-zA-Z0-9_= ]*;$/" => false
// ^^^^^^ that bit should *exit* the 'perimitted' black
];
foreach($allowed_statements as $statement => $statechange) {
// $this->info("Checking regex: $statement...\n");
$matches = [];
if (preg_match($statement,$line,$matches)) {
$this->statement_is_permitted = $statechange;
// matches are: 1 => first part of the statement, 2 => tablename, 3 => rest of statement
// (with of course 0 being "the whole match")
if (@$matches[2]) {
// print "Found a tablename! It's: ".$matches[2]."\n";
if ($this->should_guess) {
@$this->tablenames[$matches[2]] += 1;
continue; //oh? FIXME
} else {
$cleaned_tablename = \DB::getTablePrefix().preg_replace('/^'.$this->prefix.'/','',$matches[2]);
$line = preg_replace($statement,'$1`'.$cleaned_tablename.'`$3' , $line);
}
} else {
// no explicit tablename in this one, leave the line alone
}
//how do we *replace* the tablename?
// print "RETURNING LINE: $line";
return $line;
}
}
// all that is not allowed is denied.
return "";
}
//this is used in exactly *TWO* places, and in both cases should return a prefix I think?
// first - if you do the --sanitize-only one (which is mostly for testing/development)
// next - when you run *without* a guessed prefix, this is run first to figure out the prefix
// I think we have to *duplicate* the call to be able to run it again?
public static function guess_prefix($input):string
{
$parser = new self($input, null);
$parser->should_guess = true;
$parser->line_aware_piping(); // <----- THIS is doing the heavy lifting!
$check_tables = ['settings' => null, 'migrations' => null /* 'assets' => null */]; //TODO - move to statics?
//can't use 'users' because the 'accessories_users' table?
// can't use 'assets' because 'ver1_components_assets'
foreach($check_tables as $check_table => $_ignore) {
foreach ($parser->tablenames as $tablename => $_count) {
// print "Comparing $tablename to $check_table\n";
if (str_ends_with($tablename,$check_table)) {
// print "Found one!\n";
$check_tables[$check_table] = substr($tablename,0,-strlen($check_table));
}
}
}
$guessed_prefix = null;
foreach ($check_tables as $clean_table => $prefix_guess) {
if(is_null($prefix_guess)) {
print("Couldn't find table $clean_table\n");
die();
}
if(is_null($guessed_prefix)) {
$guessed_prefix = $prefix_guess;
} else {
if ($guessed_prefix != $prefix_guess) {
print("Prefix mismatch! Had guessed $guessed_prefix but got $prefix_guess\n");
die();
}
}
}
return $guessed_prefix;
}
public function line_aware_piping(): int
{
$bytes_read = 0;
if (! $this->input) {
throw new \Exception("No Input available for line_aware_piping");
}
while (($buffer = fgets($this->input, SQLStreamer::$buffer_size)) !== false) {
$bytes_read += strlen($buffer);
if ($this->reading_beginning_of_line) {
// Log::debug("Buffer is: '$buffer'");
$cleaned_buffer = $this->parse_sql($buffer);
if ($this->output) {
$bytes_written = fwrite($this->output, $cleaned_buffer);
if ($bytes_written === false) {
throw new \Exception("Unable to write to pipe");
}
}
}
// if we got a newline at the end of this, then the _next_ read is the beginning of a line
if($buffer[strlen($buffer)-1] === "\n") {
$this->reading_beginning_of_line = true;
} else {
$this->reading_beginning_of_line = false;
}
}
return $bytes_read;
}
}
class RestoreFromBackup extends Command
{
@@ -12,10 +158,13 @@ class RestoreFromBackup extends Command
*
* @var string
*/
// FIXME - , stripping prefixes and nonstandard SQL statements. Without --prefix, guess and return the correct prefix to strip
protected $signature = 'snipeit:restore
{--force : Skip the danger prompt; assuming you enter "y"}
{filename : The zip file to be migrated}
{--no-progress : Don\'t show a progress bar}';
{--no-progress : Don\'t show a progress bar}
{--sanitize-guess-prefix : Guess and output the table-prefix needed to "sanitize" the SQL}
{--sanitize-with-prefix= : "Sanitize" the SQL, using the passed-in table prefix (can be learned from --sanitize-guess-prefix). Pass as just \'--sanitize-with-prefix=\' to use no prefix}';
/**
* The console command description.
@@ -34,8 +183,6 @@ class RestoreFromBackup extends Command
parent::__construct();
}
public static $buffer_size = 1024 * 1024; // use a 1MB buffer, ought to work fine for most cases?
/**
* Execute the console command.
*
@@ -45,7 +192,7 @@ class RestoreFromBackup extends Command
{
$dir = getcwd();
if( $dir != base_path() ) { // usually only the case when running via webserver, not via command-line
\Log::debug("Current working directory is: $dir, changing directory to: ".base_path());
Log::debug("Current working directory is: $dir, changing directory to: ".base_path());
chdir(base_path()); // TODO - is this *safe* to change on a running script?!
}
//
@@ -55,7 +202,7 @@ class RestoreFromBackup extends Command
return $this->error('Missing required filename');
}
if (! $this->option('force') && ! $this->confirm('Are you sure you wish to restore from the given backup file? This can lead to MASSIVE DATA LOSS!')) {
if (! $this->option('force') && ! $this->option('sanitize-guess-prefix') && ! $this->confirm('Are you sure you wish to restore from the given backup file? This can lead to MASSIVE DATA LOSS!')) {
return $this->error('Data loss not confirmed');
}
@@ -84,35 +231,36 @@ class RestoreFromBackup extends Command
$private_dirs = [
'storage/private_uploads/accessories',
'storage/private_uploads/assetmodels',
'storage/private_uploads/assets', // these are asset _files_, not the pictures.
'storage/private_uploads/audits',
'storage/private_uploads/components',
'storage/private_uploads/consumables',
'storage/private_uploads/eula-pdfs',
'storage/private_uploads/imports',
'storage/private_uploads/assetmodels',
'storage/private_uploads/users',
'storage/private_uploads/licenses',
'storage/private_uploads/signatures',
'storage/private_uploads/users',
];
$private_files = [
'storage/oauth-private.key',
'storage/oauth-public.key',
];
$public_dirs = [
'public/uploads/accessories',
'public/uploads/assets', // these are asset _pictures_, not asset files
'public/uploads/avatars',
//'public/uploads/barcodes', // we don't want this, let the barcodes be regenerated
'public/uploads/categories',
'public/uploads/companies',
'public/uploads/components',
'public/uploads/categories',
'public/uploads/manufacturers',
//'public/uploads/barcodes', // we don't want this, let the barcodes be regenerated
'public/uploads/consumables',
'public/uploads/departments',
'public/uploads/avatars',
'public/uploads/suppliers',
'public/uploads/assets', // these are asset _pictures_, not asset files
'public/uploads/locations',
'public/uploads/accessories',
'public/uploads/models',
'public/uploads/categories',
'public/uploads/avatars',
'public/uploads/manufacturers',
'public/uploads/models',
'public/uploads/suppliers',
];
$public_files = [
@@ -150,7 +298,7 @@ class RestoreFromBackup extends Command
continue;
}
if (@pathinfo($raw_path, PATHINFO_EXTENSION) == 'sql') {
\Log::debug("Found a sql file!");
Log::debug("Found a sql file!");
$sqlfiles[] = $raw_path;
$sqlfile_indices[] = $i;
continue;
@@ -195,7 +343,6 @@ class RestoreFromBackup extends Command
}
$boring_files[] = $raw_path; //if we've gotten to here and haven't continue'ed our way into the next iteration, we don't want this file
} // end of pre-processing the ZIP file for-loop
// print_r($interesting_files);exit(-1);
if (count($sqlfiles) != 1) {
@@ -207,6 +354,17 @@ class RestoreFromBackup extends Command
//older Snipe-IT installs don't have the db-dumps subdirectory component
}
$sql_stat = $za->statIndex($sqlfile_indices[0]);
//$this->info("SQL Stat is: ".print_r($sql_stat,true));
$sql_contents = $za->getStream($sql_stat['name']); // maybe copy *THIS* thing?
// OKAY, now that we *found* the sql file if we're doing just the guess-prefix thing, we can do that *HERE* I think?
if ($this->option('sanitize-guess-prefix')) {
$prefix = SQLStreamer::guess_prefix($sql_contents);
$this->line($prefix);
return $this->info("Re-run this command with '--sanitize-with-prefix=".$prefix."' to see an attempt to sanitze your SQL.");
}
//how to invoke the restore?
$pipes = [];
@@ -227,6 +385,7 @@ class RestoreFromBackup extends Command
return $this->error('Unable to invoke mysql via CLI');
}
// I'm not sure about these?
stream_set_blocking($pipes[1], false); // use non-blocking reads for stdout
stream_set_blocking($pipes[2], false); // use non-blocking reads for stderr
@@ -237,9 +396,9 @@ class RestoreFromBackup extends Command
//$sql_contents = fopen($sqlfiles[0], "r"); //NOPE! This isn't a real file yet, silly-billy!
$sql_stat = $za->statIndex($sqlfile_indices[0]);
//$this->info("SQL Stat is: ".print_r($sql_stat,true));
$sql_contents = $za->getStream($sql_stat['name']);
// FIXME - this feels like it wants to go somewhere else?
// and it doesn't seem 'right' - if you can't get a stream to the .sql file,
// why do we care what's happening with pipes and stdout and stderr?!
if ($sql_contents === false) {
$stdout = fgets($pipes[1]);
$this->info($stdout);
@@ -248,29 +407,35 @@ class RestoreFromBackup extends Command
return false;
}
$bytes_read = 0;
try {
while (($buffer = fgets($sql_contents, self::$buffer_size)) !== false) {
if ( $this->option('sanitize-with-prefix') === null) {
// "Legacy" direct-piping
$bytes_read = 0;
while (($buffer = fgets($sql_contents, SQLStreamer::$buffer_size)) !== false) {
$bytes_read += strlen($buffer);
// \Log::debug("Buffer is: '$buffer'");
// Log::debug("Buffer is: '$buffer'");
$bytes_written = fwrite($pipes[0], $buffer);
if ($bytes_written === false) {
throw new Exception("Unable to write to pipe");
}
}
} else {
$sql_importer = new SQLStreamer($sql_contents, $pipes[0], $this->option('sanitize-with-prefix'));
$bytes_read = $sql_importer->line_aware_piping();
}
} catch (\Exception $e) {
\Log::error("Error during restore!!!! ".$e->getMessage());
Log::error("Error during restore!!!! ".$e->getMessage());
// FIXME - put these back and/or put them in the right places?!
$err_out = fgets($pipes[1]);
$err_err = fgets($pipes[2]);
\Log::error("Error OUTPUT: ".$err_out);
Log::error("Error OUTPUT: ".$err_out);
$this->info($err_out);
\Log::error("Error ERROR : ".$err_err);
Log::error("Error ERROR : ".$err_err);
$this->error($err_err);
throw $e;
}
if (!feof($sql_contents) || $bytes_read == 0) {
return $this->error("Not at end of file for sql file, or zero bytes read. aborting!");
}
@@ -302,7 +467,7 @@ class RestoreFromBackup extends Command
$fp = $za->getStream($ugly_file_name);
//$this->info("Weird problem, here are file details? ".print_r($file_details,true));
$migrated_file = fopen($file_details['dest'].'/'.basename($pretty_file_name), 'w');
while (($buffer = fgets($fp, self::$buffer_size)) !== false) {
while (($buffer = fgets($fp, SQLStreamer::$buffer_size)) !== false) {
fwrite($migrated_file, $buffer);
}
fclose($migrated_file);

View File

@@ -5,8 +5,9 @@ namespace App\Console\Commands;
use App\Models\Asset;
use App\Models\CustomField;
use App\Models\Setting;
use Artisan;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Console\Command;
use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Encryption\Encrypter;
class RotateAppKey extends Command
@@ -16,14 +17,17 @@ class RotateAppKey extends Command
*
* @var string
*/
protected $signature = 'snipeit:rotate-key';
protected $signature = 'snipeit:rotate-key
{previous_key? : The previous key to rotate from}
{--emergency : Emergency mode - rotate from .env APP_KEY to newly-generated one, modifying .env}
{--force : Skip interactive confirmation}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
protected $description = 'Rotates APP_KEY to a new value, optionally taking the previous key as an argument';
/**
* Create a new command instance.
@@ -42,27 +46,43 @@ class RotateAppKey extends Command
*/
public function handle()
{
if ($this->confirm("\n****************************************************\nTHIS WILL MODIFY YOUR APP_KEY AND DE-CRYPT YOUR ENCRYPTED CUSTOM FIELDS AND \nRE-ENCRYPT THEM WITH A NEWLY GENERATED KEY. \n\nThere is NO undo. \n\nMake SURE you have a database backup and a backup of your .env generated BEFORE running this command. \n\nIf you do not save the newly generated APP_KEY to your .env in this process, \nyour encrypted data will no longer be decryptable. \n\nAre you SURE you wish to continue, and have confirmed you have a database backup and an .env backup? ")) {
//make sure they specify only exactly one of --emergency, or a filename. Not neither, and not both.
if ( (!$this->option('emergency') && !$this->argument('previous_key')) || ( $this->option('emergency') && $this->argument('previous_key'))) {
$this->error("Specify only one of --emergency, or an app key value, in order to rotate keys");
return 1;
}
if ( $this->option('emergency') ) {
$msg = "\n****************************************************\nTHIS WILL MODIFY YOUR APP_KEY AND DE-CRYPT YOUR ENCRYPTED CUSTOM FIELDS AND \nRE-ENCRYPT THEM WITH A NEWLY GENERATED KEY. \n\nThere is NO undo. \n\nMake SURE you have a database backup and a backup of your .env generated BEFORE running this command. \n\nIf you do not save the newly generated APP_KEY to your .env in this process, \nyour encrypted data will no longer be decryptable. \n\nAre you SURE you wish to continue, and have confirmed you have a database backup and an .env backup? ";
} else {
$msg = "\n****************************************************\nTHIS WILL DE-CRYPT YOUR ENCRYPTED CUSTOM FIELDS AND RE-ENCRYPT THEM WITH YOUR\nAPP_KEY.\n\nThere is NO undo. \n\nMake SURE you have a database backup BEFORE running this command. \n\nAre you SURE you wish to continue, and have confirmed you have a database backup? ";
}
if ($this->option('force') || $this->confirm($msg)) {
// Get the existing app_key and ciphers
// We put them in a variable since we clear the cache partway through here.
if ($this->option('emergency')) {
$old_app_key = config('app.key');
$cipher = config('app.cipher');
// Generate a new one
Artisan::call('key:generate', ['--show' => true]);
$new_app_key = Artisan::output();
$new_app_key = trim(Artisan::output());
// Clear the config cache
Artisan::call('config:clear');
// Write the new app key to the .env file
$this->writeNewEnvironmentFileWith($new_app_key);
} elseif ($this->argument('previous_key')) {
$old_app_key = $this->argument('previous_key');
$cipher = config('app.cipher'); // just a guess?
$new_app_key = config('app.key');
}
$this->warn('Your app cipher is: ' . $cipher);
$this->warn('Your old APP_KEY is: ' . $old_app_key);
$this->warn('Your new APP_KEY is: ' . $new_app_key);
// Write the new app key to the .env file
$this->writeNewEnvironmentFileWith($new_app_key);
// Manually create an old encrypter instance using the old app key
// and also create a new encrypter instance so we can re-crypt the field
// using the newly generated app key
@@ -75,8 +95,16 @@ class RotateAppKey extends Command
$assets = Asset::whereNotNull($field->db_column)->get();
foreach ($assets as $asset) {
try {
$asset->{$field->db_column} = $oldEncrypter->decrypt($asset->{$field->db_column});
$this->line('DECRYPTED: ' . $field->db_column);
} catch (DecryptException $e) {
$this->line('Could not decrypt '. $field->db_column.' using "old key" - skipping...');
continue;
} catch (\Exception $e) {
$this->error("Error decrypting ".$field->db_column.", reason: ".$e->getMessage().". Aborting key rotation");
throw $e;
}
$asset->{$field->db_column} = $newEncrypter->encrypt($asset->{$field->db_column});
$this->line('ENCRYPTED: '.$field->db_column);
$asset->save();
@@ -86,10 +114,14 @@ class RotateAppKey extends Command
// Handle the LDAP password if one is provided
$setting = Setting::first();
if ($setting->ldap_pword != '') {
try {
$setting->ldap_pword = $oldEncrypter->decrypt($setting->ldap_pword);
$setting->ldap_pword = $newEncrypter->encrypt($setting->ldap_pword);
$setting->save();
$this->warn('LDAP password has been re-encrypted.');
} catch(DecryptException $e) {
$this->warn("Unable to decrypt old LDAP password; skipping");
}
}
} else {
$this->info('This operation has been canceled. No changes have been made.');
@@ -106,7 +138,7 @@ class RotateAppKey extends Command
{
file_put_contents($this->laravel->environmentFilePath(), preg_replace(
$this->keyReplacementPattern(),
'APP_KEY='.$key,
'APP_KEY="'.$key.'"',
file_get_contents($this->laravel->environmentFilePath())
));
}
@@ -118,7 +150,7 @@ class RotateAppKey extends Command
*/
protected function keyReplacementPattern()
{
$escaped = preg_quote('='.$this->laravel['config']['app.key'], '/');
$escaped = '="?'.preg_quote($this->laravel['config']['app.key'], '/').'"?';
return "/^APP_KEY{$escaped}/m";
}

View File

@@ -0,0 +1,44 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Models\SamlNonce;
class SamlClearExpiredNonces extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'saml:clear_expired_nonces';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Clears out expired SAML assertions from the saml_nonces table';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
SamlNonce::where('not_valid_after','<=',now())->delete();
return 0;
}
}

View File

@@ -0,0 +1,105 @@
<?php
namespace App\Console\Commands;
use App\Models\Asset;
use App\Models\CheckoutAcceptance;
use App\Models\Setting;
use App\Models\User;
use App\Notifications\CheckoutAssetNotification;
use App\Notifications\CurrentInventory;
use App\Notifications\UnacceptedAssetReminderNotification;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Notification;
class SendAcceptanceReminder extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'snipeit:acceptance-reminder';
/**
* The console command description.
*
* @var string
*/
protected $description = 'This will resend users with unaccepted assets a reminder to accept or decline them.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$pending = CheckoutAcceptance::pending()->where('checkoutable_type', 'App\Models\Asset')
->whereHas('checkoutable', function($query) {
$query->where('archived', 0);
})
->with(['assignedTo', 'checkoutable.assignedTo', 'checkoutable.model', 'checkoutable.adminuser'])
->get();
$count = 0;
$unacceptedAssetGroups = $pending
->filter(function($acceptance) {
return $acceptance->checkoutable_type == 'App\Models\Asset';
})
->map(function($acceptance) {
return ['assetItem' => $acceptance->checkoutable, 'acceptance' => $acceptance];
})
->groupBy(function($item) {
return $item['acceptance']->assignedTo ? $item['acceptance']->assignedTo->id : '';
});
$no_mail_address = [];
foreach($unacceptedAssetGroups as $unacceptedAssetGroup) {
$item_count = $unacceptedAssetGroup->count();
foreach ($unacceptedAssetGroup as $unacceptedAsset) {
// if ($unacceptedAsset['acceptance']->assignedTo->email == ''){
// $no_mail_address[] = $unacceptedAsset['checkoutable']->assignedTo->present()->fullName;
// }
if ($unacceptedAsset['acceptance']->assignedTo) {
if (!$unacceptedAsset['acceptance']->assignedTo->locale) {
Notification::locale(Setting::getSettings()->locale)->send(
$unacceptedAsset['acceptance']->assignedTo,
new UnacceptedAssetReminderNotification($unacceptedAsset['assetItem'], $count)
);
} else {
Notification::send(
$unacceptedAsset['acceptance']->assignedTo,
new UnacceptedAssetReminderNotification($unacceptedAsset, $item_count)
);
}
$count++;
}
}
}
if (!empty($no_mail_address)) {
foreach($no_mail_address as $user) {
return $user.' has no email.';
}
}
$this->info($count.' users notified.');
}
}

View File

@@ -43,7 +43,7 @@ class SendCurrentInventoryToUsers extends Command
$count = 0;
foreach ($users as $user) {
if (($user->assets->count() > 0) || ($user->accessories->count() > 0) || ($user->licenses->count() > 0)) {
if (($user->assets->count() > 0) || ($user->accessories->count() > 0) || ($user->licenses->count() > 0) || ($user->consumables->count() > 0)) {
$count++;
$user->notify((new CurrentInventory($user)));
}

View File

@@ -42,24 +42,31 @@ class SendExpectedCheckinAlerts extends Command
public function handle()
{
$settings = Setting::getSettings();
$whenNotify = Carbon::now()->addDays(7);
$assets = Asset::with('assignedTo')->whereNotNull('assigned_to')->whereNotNull('expected_checkin')->where('expected_checkin', '<=', $whenNotify)->get();
$interval = $settings->audit_warning_days ?? 0;
$today = Carbon::now();
$interval_date = $today->copy()->addDays($interval);
$assets = Asset::whereNull('deleted_at')->DueOrOverdueForCheckin($settings)->orderBy('assets.expected_checkin', 'desc')->get();
$this->info($assets->count().' assets must be checked in on or before '.$interval_date.' is deadline');
$this->info($whenNotify.' is deadline');
$this->info($assets->count().' assets');
foreach ($assets as $asset) {
if ($asset->assigned && $asset->checkedOutToUser()) {
$asset->assigned->notify((new ExpectedCheckinNotification($asset)));
if ($asset->assignedTo && (isset($asset->assignedTo->email)) && ($asset->assignedTo->email!='') && $asset->checkedOutToUser()) {
$this->info('Sending User ExpectedCheckinNotification to: '.$asset->assignedTo->email);
$asset->assignedTo->notify((new ExpectedCheckinNotification($asset)));
}
}
if (($assets) && ($assets->count() > 0) && ($settings->alert_email != '')) {
// Send a rollup to the admin, if settings dictate
$recipients = collect(explode(',', $settings->alert_email))->map(function ($item, $key) {
$recipients = collect(explode(',', $settings->alert_email))->map(function ($item) {
return new AlertRecipient($item);
});
$this->info('Sending Admin ExpectedCheckinNotification to: '.$settings->alert_email);
\Notification::send($recipients, new ExpectedCheckinAdminNotification($assets));
}
}
}

View File

@@ -3,13 +3,11 @@
namespace App\Console\Commands;
use App\Models\Asset;
use App\Models\License;
use App\Models\Recipients;
use App\Models\Recipients\AlertRecipient;
use App\Models\Setting;
use App\Notifications\ExpiringAssetsNotification;
use App\Notifications\SendUpcomingAuditNotification;
use Carbon\Carbon;
use DB;
use Illuminate\Support\Facades\DB;
use Illuminate\Console\Command;
class SendUpcomingAuditReport extends Command
@@ -46,39 +44,24 @@ class SendUpcomingAuditReport extends Command
public function handle()
{
$settings = Setting::getSettings();
$interval = $settings->audit_warning_days ?? 0;
$today = Carbon::now();
$interval_date = $today->copy()->addDays($interval);
if (($settings->alert_email != '') && ($settings->audit_warning_days) && ($settings->alerts_enabled == 1)) {
$assets = Asset::whereNull('deleted_at')->DueOrOverdueForAudit($settings)->orderBy('assets.next_audit_date', 'desc')->get();
$this->info($assets->count().' assets must be audited in on or before '.$interval_date.' is deadline');
if (($assets) && ($assets->count() > 0) && ($settings->alert_email != '')) {
// Send a rollup to the admin, if settings dictate
$recipients = collect(explode(',', $settings->alert_email))->map(function ($item, $key) {
return new \App\Models\Recipients\AlertRecipient($item);
$recipients = collect(explode(',', $settings->alert_email))->map(function ($item) {
return new AlertRecipient($item);
});
// Assets due for auditing
$assets = Asset::whereNotNull('next_audit_date')
->DueOrOverdueForAudit($settings)
->orderBy('last_audit_date', 'asc')->get();
if ($assets->count() > 0) {
$this->info(trans_choice('mail.upcoming-audits', $assets->count(),
['count' => $assets->count(), 'threshold' => $settings->audit_warning_days]));
$this->info('Sending Admin SendUpcomingAuditNotification to: '.$settings->alert_email);
\Notification::send($recipients, new SendUpcomingAuditNotification($assets, $settings->audit_warning_days));
$this->info('Audit report sent to '.$settings->alert_email);
} else {
$this->info('No assets to be audited. No report sent.');
}
} elseif ($settings->alert_email == '') {
$this->error('Could not send email. No alert email configured in settings');
} elseif (! $settings->audit_warning_days) {
$this->error('No audit warning days set in Admin Notifications. No mail will be sent.');
} elseif ($settings->alerts_enabled != 1) {
$this->info('Alerts are disabled in the settings. No mail will be sent');
} else {
$this->error('Something went wrong. :( ');
$this->error('Admin Notifications Email Setting: '.$settings->alert_email);
$this->error('Admin Audit Warning Setting: '.$settings->audit_warning_days);
$this->error('Admin Alerts Emnabled: '.$settings->alerts_enabled);
}
}
}

View File

@@ -4,6 +4,7 @@ namespace App\Console\Commands;
use App\Models\Asset;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;
class SyncAssetCounters extends Command
{
@@ -58,7 +59,7 @@ class SyncAssetCounters extends Command
$asset->save();
$bar->advance();
\Log::debug('Asset: '.$asset->id.' has '.$asset->checkin_counter.' checkins, '.$asset->checkout_counter.' checkouts, and '.$asset->requests_counter.' requests');
Log::debug('Asset: '.$asset->id.' has '.$asset->checkin_counter.' checkins, '.$asset->checkout_counter.' checkouts, and '.$asset->requests_counter.' requests');
}

View File

@@ -11,7 +11,7 @@ class SystemBackup extends Command
*
* @var string
*/
protected $name = 'snipeit:backup';
protected $signature = 'snipeit:backup {--filename=}';
/**
* The console command description.
@@ -37,7 +37,18 @@ class SystemBackup extends Command
*/
public function handle()
{
//
if ($this->option('filename')) {
$filename = $this->option('filename');
// Make sure the filename ends in .zip
if (!ends_with($filename, '.zip')) {
$filename = $filename.'.zip';
}
$this->call('backup:run', ['--filename' => $filename]);
} else {
$this->call('backup:run');
}
}
}

View File

@@ -0,0 +1,76 @@
<?php
namespace App\Console\Commands;
use App\Models\Asset;
use App\Models\CustomField;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
class ToggleCustomfieldEncryption extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'snipeit:customfield-encryption
{fieldname : the db_column_name of the field}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'This command should be used to convert an unencrypted custom field into a custom field and encrypt the associated data in the assets table for that column.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$fieldname = $this->argument('fieldname');
if ($field = CustomField::where('db_column', $fieldname)->first()) {
// If the field is not encrypted, make it encrypted and encrypt the data in the assets table for the
// corresponding field.
DB::transaction(function () use ($field) {
if ($field->field_encrypted == 0) {
$assets = Asset::whereNotNull($field->db_column)->get();
foreach ($assets as $asset) {
$asset->{$field->db_column} = encrypt($asset->{$field->db_column});
$asset->save();
}
$field->field_encrypted = 1;
$field->save();
// This field is already encrypted. Do nothing.
} else {
$this->error('The custom field ' . $field->db_column.' is already encrypted. No action was taken.');
}
});
// No matching column name found
} else {
$this->error('No matching results for unencrypted custom fields with db_column name: ' . $fieldname.'. Please check the fieldname.');
}
}
}

View File

@@ -25,6 +25,7 @@ class Kernel extends ConsoleKernel
$schedule->command('backup:clean')->daily();
$schedule->command('snipeit:upcoming-audits')->daily();
$schedule->command('auth:clear-resets')->everyFifteenMinutes();
$schedule->command('saml:clear_expired_nonces')->weekly();
}
/**

View File

@@ -15,18 +15,20 @@ class CheckoutableCheckedIn
public $checkedInBy;
public $note;
public $action_date; // Date setted in the hardware.checkin view at the checkin_at input, for the action log
public $originalValues;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct($checkoutable, $checkedOutTo, User $checkedInBy, $note, $action_date = null)
public function __construct($checkoutable, $checkedOutTo, User $checkedInBy, $note, $action_date = null, $originalValues = [])
{
$this->checkoutable = $checkoutable;
$this->checkedOutTo = $checkedOutTo;
$this->checkedInBy = $checkedInBy;
$this->note = $note;
$this->action_date = $action_date ?? date('Y-m-d');
$this->originalValues = $originalValues;
}
}

View File

@@ -14,17 +14,19 @@ class CheckoutableCheckedOut
public $checkedOutTo;
public $checkedOutBy;
public $note;
public $originalValues;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct($checkoutable, $checkedOutTo, User $checkedOutBy, $note)
public function __construct($checkoutable, $checkedOutTo, User $checkedOutBy, $note, $originalValues = [])
{
$this->checkoutable = $checkoutable;
$this->checkedOutTo = $checkedOutTo;
$this->checkedOutBy = $checkedOutBy;
$this->note = $note;
$this->originalValues = $originalValues;
}
}

View File

@@ -15,7 +15,7 @@ class UserMerged
*
* @return void
*/
public function __construct(User $from_user, User $to_user, User $admin)
public function __construct(User $from_user, User $to_user, ?User $admin)
{
$this->merged_from = $from_user;
$this->merged_to = $to_user;

View File

@@ -7,10 +7,10 @@ use App\Helpers\Helper;
use Illuminate\Validation\ValidationException;
use Illuminate\Auth\AuthenticationException;
use ArieTimmerman\Laravel\SCIMServer\Exceptions\SCIMException;
use Log;
use Illuminate\Support\Facades\Log;
use Throwable;
use JsonException;
use Carbon\Exceptions\InvalidFormatException;
class Handler extends ExceptionHandler
{
@@ -30,6 +30,7 @@ class Handler extends ExceptionHandler
\League\OAuth2\Server\Exception\OAuthServerException::class,
JsonException::class,
SCIMException::class, //these generally don't need to be reported
InvalidFormatException::class,
];
/**
@@ -43,8 +44,8 @@ class Handler extends ExceptionHandler
public function report(Throwable $exception)
{
if ($this->shouldReport($exception)) {
if (class_exists(\Log::class)) {
\Log::error($exception);
if (class_exists(Log::class)) {
Log::error($exception);
}
return parent::report($exception);
}
@@ -69,21 +70,39 @@ class Handler extends ExceptionHandler
// Invalid JSON exception
// TODO: don't understand why we have to do this when we have the invalidJson() method, below, but, well, whatever
if ($e instanceof JsonException) {
return response()->json(Helper::formatStandardApiResponse('error', null, 'invalid JSON'), 422);
return response()->json(Helper::formatStandardApiResponse('error', null, 'Invalid JSON'), 422);
}
// Handle SCIM exceptions
if ($e instanceof SCIMException) {
return response()->json(Helper::formatStandardApiResponse('error', null, 'invalid SCIM Request'), 400);
try {
$e->report(); // logs as 'debug', so shouldn't get too noisy
} catch(\Exception $reportException) {
//do nothing
}
return $e->render($request); // ALL SCIMExceptions have the 'render()' method
}
// Handle Ajax requests that fail because the model doesn't exist
// Handle standard requests that fail because Carbon cannot parse the date on validation (when a submitted date value is definitely not a date)
if ($e instanceof InvalidFormatException) {
return redirect()->back()->withInput()->with('error', trans('validation.date', ['attribute' => 'date']));
}
// Handle API requests that fail
if ($request->ajax() || $request->wantsJson()) {
// Handle API requests that fail because Carbon cannot parse the date on validation (when a submitted date value is definitely not a date)
if ($e instanceof InvalidFormatException) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('validation.date', ['attribute' => 'date'])), 200);
}
// Handle API requests that fail because the model doesn't exist
if ($e instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) {
$className = last(explode('\\', $e->getModel()));
return response()->json(Helper::formatStandardApiResponse('error', null, $className . ' not found'), 200);
}
// Handle API requests that fail because of an HTTP status code and return a useful error message
if ($this->isHttpException($e)) {
$statusCode = $e->getStatusCode();
@@ -103,6 +122,8 @@ class Handler extends ExceptionHandler
}
if ($this->isHttpException($e) && (isset($statusCode)) && ($statusCode == '404' )) {
return response()->view('layouts/basic', [
'content' => view('errors/404')
@@ -129,6 +150,11 @@ class Handler extends ExceptionHandler
return redirect()->guest('login');
}
protected function invalidJson($request, ValidationException $exception)
{
return response()->json(Helper::formatStandardApiResponse('error', null, $exception->errors()), 200);
}
/**
* A list of the inputs that are never flashed for validation exceptions.

View File

@@ -2,6 +2,8 @@
namespace App\Helpers;
use App\Models\Accessory;
use App\Models\Asset;
use App\Models\AssetModel;
use App\Models\Component;
use App\Models\Consumable;
use App\Models\CustomField;
@@ -9,13 +11,73 @@ use App\Models\CustomFieldset;
use App\Models\Depreciation;
use App\Models\Setting;
use App\Models\Statuslabel;
use Crypt;
use App\Models\License;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Contracts\Encryption\DecryptException;
use Image;
use Carbon\Carbon;
use Illuminate\Support\Facades\Log;
use Intervention\Image\ImageManagerStatic as Image;
use Illuminate\Support\Facades\Session;
class Helper
{
/**
* This is only used for reversing the migration that updates the locale to the 5-6 letter codes from two
* letter codes. The normal dropdowns use the autoglossonyms in the language files located
* in resources/en-US/localizations.php.
*/
public static $language_map = [
'af' => 'af-ZA', // Afrikaans
'am' => 'am-ET', // Amharic
'ar' => 'ar-SA', // Arabic
'bg' => 'bg-BG', // Bulgarian
'ca' => 'ca-ES', // Catalan
'cs' => 'cs-CZ', // Czech
'cy' => 'cy-GB', // Welsh
'da' => 'da-DK', // Danish
'de-i' => 'de-if', // German informal
'de' => 'de-DE', // German
'el' => 'el-GR', // Greek
'en' => 'en-US', // English
'et' => 'et-EE', // Estonian
'fa' => 'fa-IR', // Persian
'fi' => 'fi-FI', // Finnish
'fil' => 'fil-PH', // Filipino
'fr' => 'fr-FR', // French
'he' => 'he-IL', // Hebrew
'hr' => 'hr-HR', // Croatian
'hu' => 'hu-HU', // Hungarian
'id' => 'id-ID', // Indonesian
'is' => 'is-IS', // Icelandic
'it' => 'it-IT', // Italian
'iu' => 'iu-NU', // Inuktitut
'ja' => 'ja-JP', // Japanese
'ko' => 'ko-KR', // Korean
'lt' => 'lt-LT', // Lithuanian
'lv' => 'lv-LV', // Latvian
'mi' => 'mi-NZ', // Maori
'mk' => 'mk-MK', // Macedonian
'mn' => 'mn-MN', // Mongolian
'ms' => 'ms-MY', // Malay
'nl' => 'nl-NL', // Dutch
'no' => 'no-NO', // Norwegian
'pl' => 'pl-PL', // Polish
'ro' => 'ro-RO', // Romanian
'ru' => 'ru-RU', // Russian
'sk' => 'sk-SK', // Slovak
'sl' => 'sl-SI', // Slovenian
'so' => 'so-SO', // Somali
'ta' => 'ta-IN', // Tamil
'th' => 'th-TH', // Thai
'tl' => 'tl-PH', // Tagalog
'tr' => 'tr-TR', // Turkish
'uk' => 'uk-UA', // Ukrainian
'vi' => 'vi-VN', // Vietnamese
'zu' => 'zu-ZA', // Zulu
];
/**
* Simple helper to invoke the markdown parser
*
@@ -33,6 +95,16 @@ class Helper
}
}
public static function parseEscapedMarkedownInline($str = null)
{
$Parsedown = new \Parsedown();
$Parsedown->setSafeMode(true);
if ($str) {
return $Parsedown->line($str);
}
}
/**
* The importer has formatted number strings since v3,
* so the value might be a string, or an integer.
@@ -61,10 +133,14 @@ class Helper
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v3.3]
* @return array
* @return string
*/
public static function defaultChartColors($index = 0)
public static function defaultChartColors(int $index = 0)
{
if ($index < 0) {
$index = 0;
}
$colors = [
'#008941',
'#FF4A46',
@@ -337,7 +413,19 @@ class Helper
$total_colors = count($colors);
if ($index >= $total_colors) {
$index = $index - $total_colors;
Log::info('Status label count is '.$index.' and exceeds the allowed count of 266.');
//patch fix for array key overflow (color count starts at 1, array starts at 0)
$index = $index - $total_colors - 1;
//constraints to keep result in 0-265 range. This should never be needed, but if something happens
//to create this many status labels and it DOES happen, this will keep it from failing at least.
if($index < 0) {
$index = 0;
}
elseif($index >($total_colors - 1)) {
$index = $total_colors - 1;
}
}
return $colors[$index];
@@ -544,7 +632,7 @@ class Helper
];
if ($selection != null){
return $category_types[$selection];
return $category_types[strtolower($selection)];
}
else
return $category_types;
@@ -630,17 +718,19 @@ class Helper
*/
public static function checkLowInventory()
{
$alert_threshold = \App\Models\Setting::getSettings()->alert_threshold;
$consumables = Consumable::withCount('consumableAssignments as consumable_assignments_count')->whereNotNull('min_amt')->get();
$accessories = Accessory::withCount('users as users_count')->whereNotNull('min_amt')->get();
$components = Component::whereNotNull('min_amt')->get();
$asset_models = AssetModel::where('min_amt', '>', 0)->get();
$licenses = License::where('min_amt', '>', 0)->get();
$avail_consumables = 0;
$items_array = [];
$all_count = 0;
foreach ($consumables as $consumable) {
$avail = $consumable->numRemaining();
if ($avail < ($consumable->min_amt) + \App\Models\Setting::getSettings()->alert_threshold) {
if ($avail < ($consumable->min_amt) + $alert_threshold) {
if ($consumable->qty > 0) {
$percent = number_format((($avail / $consumable->qty) * 100), 0);
} else {
@@ -659,7 +749,7 @@ class Helper
foreach ($accessories as $accessory) {
$avail = $accessory->qty - $accessory->users_count;
if ($avail < ($accessory->min_amt) + \App\Models\Setting::getSettings()->alert_threshold) {
if ($avail < ($accessory->min_amt) + $alert_threshold) {
if ($accessory->qty > 0) {
$percent = number_format((($avail / $accessory->qty) * 100), 0);
} else {
@@ -678,7 +768,7 @@ class Helper
foreach ($components as $component) {
$avail = $component->numRemaining();
if ($avail < ($component->min_amt) + \App\Models\Setting::getSettings()->alert_threshold) {
if ($avail < ($component->min_amt) + $alert_threshold) {
if ($component->qty > 0) {
$percent = number_format((($avail / $component->qty) * 100), 0);
} else {
@@ -695,6 +785,48 @@ class Helper
}
}
foreach ($asset_models as $asset_model){
$asset = new Asset();
$total_owned = $asset->where('model_id', '=', $asset_model->id)->count();
$avail = $asset->where('model_id', '=', $asset_model->id)->whereNull('assigned_to')->count();
if ($avail < ($asset_model->min_amt) + $alert_threshold) {
if ($avail > 0) {
$percent = number_format((($avail / $total_owned) * 100), 0);
} else {
$percent = 100;
}
$items_array[$all_count]['id'] = $asset_model->id;
$items_array[$all_count]['name'] = $asset_model->name;
$items_array[$all_count]['type'] = 'models';
$items_array[$all_count]['percent'] = $percent;
$items_array[$all_count]['remaining'] = $avail;
$items_array[$all_count]['min_amt'] = $asset_model->min_amt;
$all_count++;
}
}
foreach ($licenses as $license){
$avail = $license->remaincount();
if ($avail < ($license->min_amt) + $alert_threshold) {
if ($avail > 0) {
$percent = number_format((($avail / $license->min_amt) * 100), 0);
} else {
$percent = 100;
}
$items_array[$all_count]['id'] = $license->id;
$items_array[$all_count]['name'] = $license->name;
$items_array[$all_count]['type'] = 'licenses';
$items_array[$all_count]['percent'] = $percent;
$items_array[$all_count]['remaining'] = $avail;
$items_array[$all_count]['min_amt'] = $license->min_amt;
$all_count++;
}
}
return $items_array;
}
@@ -712,7 +844,7 @@ class Helper
$filetype = @finfo_file($finfo, $file);
finfo_close($finfo);
if (($filetype == 'image/jpeg') || ($filetype == 'image/jpg') || ($filetype == 'image/png') || ($filetype == 'image/bmp') || ($filetype == 'image/gif')) {
if (($filetype == 'image/jpeg') || ($filetype == 'image/jpg') || ($filetype == 'image/png') || ($filetype == 'image/bmp') || ($filetype == 'image/gif') || ($filetype == 'image/avif')) {
return $filetype;
}
@@ -745,12 +877,15 @@ class Helper
$permission_name = $permission[$x]['permission'];
if ($permission[$x]['display'] === true) {
if ($selected_arr) {
if (is_array($selected_arr)) {
if (array_key_exists($permission_name, $selected_arr)) {
$permissions_arr[$permission_name] = $selected_arr[$permission_name];
} else {
$permissions_arr[$permission_name] = '0';
}
} else {
$permissions_arr[$permission_name] = '0';
}
@@ -882,7 +1017,7 @@ class Helper
try {
$tmp_date = new \Carbon($date);
$tmp_date = new Carbon($date);
if ($type == 'datetime') {
$dt['datetime'] = $tmp_date->format('Y-m-d H:i:s');
@@ -899,7 +1034,7 @@ class Helper
return $dt['formatted'];
} catch (\Exception $e) {
\Log::warning($e);
Log::warning($e);
return $date.' (Invalid '.$type.' value.)';
}
@@ -976,6 +1111,8 @@ class Helper
'jpeg' => 'far fa-image',
'gif' => 'far fa-image',
'png' => 'far fa-image',
'webp' => 'far fa-image',
'avif' => 'far fa-image',
// word
'doc' => 'far fa-file-word',
'docx' => 'far fa-file-word',
@@ -1011,6 +1148,8 @@ class Helper
case 'jpeg':
case 'gif':
case 'png':
case 'webp':
case 'avif':
return true;
break;
default:
@@ -1208,13 +1347,63 @@ class Helper
public static function isDemoMode() {
if (config('app.lock_passwords') === true) {
return true;
\Log::debug('app locked!');
Log::debug('app locked!');
}
return false;
}
/**
* Conversion between units of measurement
*
* @author Grant Le Roux <grant.leroux+snipe-it@gmail.com>
* @since 5.0
* @param float $value Measurement value to convert
* @param string $srcUnit Source unit of measurement
* @param string $dstUnit Destination unit of measurement
* @param int $round Round the result to decimals (Default false - No rounding)
* @return float
*/
public static function convertUnit($value, $srcUnit, $dstUnit, $round=false) {
$srcFactor = static::getUnitConversionFactor($srcUnit);
$dstFactor = static::getUnitConversionFactor($dstUnit);
$output = $value * $srcFactor / $dstFactor;
return ($round !== false) ? round($output, $round) : $output;
}
/**
* Get conversion factor from unit of measurement to mm
*
* @author Grant Le Roux <grant.leroux+snipe-it@gmail.com>
* @since 5.0
* @param string $unit Unit of measurement
* @return float
*/
public static function getUnitConversionFactor($unit) {
switch (strtolower($unit)) {
case 'mm':
return 1.0;
case 'cm':
return 10.0;
case 'm':
return 1000.0;
case 'in':
return 25.4;
case 'ft':
return 12 * static::getUnitConversionFactor('in');
case 'yd':
return 3 * static::getUnitConversionFactor('ft');
case 'pt':
return (1 / 72) * static::getUnitConversionFactor('in');
default:
throw new \InvalidArgumentException('Unit: \'' . $unit . '\' is not supported');
return false;
}
}
/*
* I know it's gauche to return a shitty HTML string, but this is just a helper and since it will be the same every single time,
* it seemed pretty safe to do here. Don't you judge me.
@@ -1224,4 +1413,89 @@ class Helper
return "<p class=\"text-warning\"><i class=\"fas fa-lock\"></i>" . trans('general.feature_disabled') . "</p>";
}
}
/**
* Ah, legacy code.
*
* This corrects the original mistakes from 2013 where we used the wrong locale codes. Hopefully we
* can get rid of this in a future version, but this should at least give us the belt and suspenders we need
* to be sure this change is not too disruptive.
*
* In this array, we ONLY include the older languages where we weren't using the correct locale codes.
*
* @see public static $language_map in this file
* @author A. Gianotto <snipe@snipe.net>
* @since 6.3.0
*
* @param $language_code
* @return string []
*/
public static function mapLegacyLocale($language_code = null)
{
if (strlen($language_code) > 4) {
return $language_code;
}
foreach (self::$language_map as $legacy => $new) {
if ($language_code == $legacy) {
Log::debug('Current language is '.$legacy.', using '.$new.' instead');
return $new;
}
}
// Return US english if we don't have a match
return 'en-US';
}
public static function mapBackToLegacyLocale($new_locale = null)
{
if (strlen($new_locale) <= 4) {
return $new_locale; //"new locale" apparently wasn't quite so new
}
// This does a *reverse* search against our new language map array - given the value, find the *key* for it
$legacy_locale = array_search($new_locale, self::$language_map);
if($legacy_locale !== false) {
return $legacy_locale;
}
return $new_locale; // better that you have some weird locale that doesn't fit into our mappings anywhere than 'void'
}
static public function getRedirectOption($request, $id, $table, $asset_id = null)
{
$redirect_option = Session::get('redirect_option');
$checkout_to_type = Session::get('checkout_to_type');
//return to index
if ($redirect_option == '0') {
switch ($table) {
case "Assets":
return redirect()->route('hardware.index')->with('success', trans('admin/hardware/message.checkout.success'));
}
}
//return to thing being assigned
if ($redirect_option == '1') {
switch ($table) {
case "Assets":
return redirect()->route('hardware.show', $id ? $id : $asset_id)->with('success', trans('admin/hardware/message.checkout.success'));
}
}
//return to thing being assigned to
if ($redirect_option == '2') {
switch ($checkout_to_type) {
case 'user':
return redirect()->route('users.show', $request->assigned_user)->with('success', trans('admin/hardware/message.checkout.success'));
case 'location':
return redirect()->route('locations.show', $request->assigned_location)->with('success', trans('admin/hardware/message.checkout.success'));
case 'asset':
return redirect()->route('hardware.show', $request->assigned_asset)->with('success', trans('admin/hardware/message.checkout.success'));
}
}
return redirect()->back()->with('error', trans('admin/hardware/message.checkout.error'));
}
}

View File

@@ -3,10 +3,13 @@
namespace App\Helpers;
use Illuminate\Support\Facades\Storage;
use Illuminate\Http\Response;
use Illuminate\Http\RedirectResponse;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\StreamedResponse;
class StorageHelper
{
public static function downloader($filename, $disk = 'default')
public static function downloader($filename, $disk = 'default') : BinaryFileResponse | RedirectResponse | StreamedResponse
{
if ($disk == 'default') {
$disk = config('filesystems.default');

View File

@@ -7,10 +7,11 @@ use App\Http\Controllers\Controller;
use App\Http\Requests\ImageUploadRequest;
use App\Models\Accessory;
use App\Models\Company;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;
use Redirect;
use \Illuminate\Contracts\View\View;
use \Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Log;
/** This controller handles all actions related to Accessories for
* the Snipe-IT Asset Management application.
@@ -26,13 +27,10 @@ class AccessoriesController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @see AccessoriesController::getDatatable() method that generates the JSON response
* @since [v1.0]
* @return View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function index()
public function index() : View
{
$this->authorize('index', Accessory::class);
return view('accessories/index');
}
@@ -40,10 +38,8 @@ class AccessoriesController extends Controller
* Returns a view with a form to create a new Accessory.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @return View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function create()
public function create() : View
{
$this->authorize('create', Accessory::class);
$category_type = 'accessory';
@@ -57,10 +53,8 @@ class AccessoriesController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param ImageUploadRequest $request
* @return Redirect
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function store(ImageUploadRequest $request)
public function store(ImageUploadRequest $request) : RedirectResponse
{
$this->authorize(Accessory::class);
@@ -77,9 +71,9 @@ class AccessoriesController extends Controller
$accessory->manufacturer_id = request('manufacturer_id');
$accessory->model_number = request('model_number');
$accessory->purchase_date = request('purchase_date');
$accessory->purchase_cost = Helper::ParseCurrency(request('purchase_cost'));
$accessory->purchase_cost = request('purchase_cost');
$accessory->qty = request('qty');
$accessory->user_id = Auth::user()->id;
$accessory->user_id = auth()->id();
$accessory->supplier_id = request('supplier_id');
$accessory->notes = request('notes');
@@ -99,15 +93,12 @@ class AccessoriesController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $accessoryId
* @return View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function edit($accessoryId = null)
public function edit($accessoryId = null) : View | RedirectResponse
{
if ($item = Accessory::find($accessoryId)) {
$this->authorize($item);
return view('accessories/edit', compact('item'))->with('category_type', 'accessory');
}
@@ -121,17 +112,17 @@ class AccessoriesController extends Controller
* @author [J. Vinsmoke]
* @param int $accessoryId
* @since [v6.0]
* @return View
*/
public function getClone($accessoryId = null)
public function getClone($accessoryId = null) : View | RedirectResponse
{
$this->authorize('create', Accesory::class);
$this->authorize('create', Accessory::class);
// Check if the asset exists
if (is_null($accessory_to_clone = Accessory::find($accessoryId))) {
// Redirect to the asset management page
return redirect()->route('accessory.index')->with('error', trans('admin/accessories/message.does_not_exist'));
return redirect()->route('accessories.index')
->with('error', trans('admin/accessories/message.does_not_exist', ['id' => $accessoryId]));
}
$accessory = clone $accessory_to_clone;
@@ -149,10 +140,8 @@ class AccessoriesController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param ImageUploadRequest $request
* @param int $accessoryId
* @return Redirect
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function update(ImageUploadRequest $request, $accessoryId = null)
public function update(ImageUploadRequest $request, $accessoryId = null) : RedirectResponse
{
if ($accessory = Accessory::withCount('users as users_count')->find($accessoryId)) {
@@ -180,7 +169,7 @@ class AccessoriesController extends Controller
$accessory->order_number = request('order_number');
$accessory->model_number = request('model_number');
$accessory->purchase_date = request('purchase_date');
$accessory->purchase_cost = Helper::ParseCurrency(request('purchase_cost'));
$accessory->purchase_cost = request('purchase_cost');
$accessory->qty = request('qty');
$accessory->supplier_id = request('supplier_id');
$accessory->notes = request('notes');
@@ -203,10 +192,8 @@ class AccessoriesController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $accessoryId
* @return Redirect
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function destroy($accessoryId)
public function destroy($accessoryId) : RedirectResponse
{
if (is_null($accessory = Accessory::find($accessoryId))) {
return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.not_found'));
@@ -223,7 +210,7 @@ class AccessoriesController extends Controller
try {
Storage::disk('public')->delete('accessories'.'/'.$accessory->image);
} catch (\Exception $e) {
\Log::debug($e);
Log::debug($e);
}
}
@@ -241,10 +228,8 @@ class AccessoriesController extends Controller
* @param int $accessoryID
* @see AccessoriesController::getDataView() method that generates the JSON response
* @since [v1.0]
* @return View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function show($accessoryID = null)
public function show($accessoryID = null) : View | RedirectResponse
{
$accessory = Accessory::withCount('users as users_count')->find($accessoryID);
$this->authorize('view', $accessory);

View File

@@ -4,35 +4,35 @@ namespace App\Http\Controllers\Accessories;
use App\Helpers\StorageHelper;
use App\Http\Controllers\Controller;
use App\Http\Requests\AssetFileRequest;
use App\Http\Requests\UploadFileRequest;
use App\Models\Actionlog;
use App\Models\Accessory;
use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\Storage;
use Symfony\Accessory\HttpFoundation\JsonResponse;
use enshrined\svgSanitize\Sanitizer;
use Illuminate\Support\Facades\Log;
use \Illuminate\Contracts\View\View;
use \Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Response;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\StreamedResponse;
class AccessoriesFilesController extends Controller
{
/**
* Validates and stores files associated with a accessory.
*
* @todo Switch to using the AssetFileRequest form request validator.
* @param UploadFileRequest $request
* @param int $accessoryId
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0]
* @param AssetFileRequest $request
* @param int $accessoryId
* @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
* @todo Switch to using the AssetFileRequest form request validator.
*/
public function store(AssetFileRequest $request, $accessoryId = null)
public function store(UploadFileRequest $request, $accessoryId = null) : RedirectResponse
{
if (config('app.lock_passwords')) {
return redirect()->route('accessories.show', ['accessory'=>$accessoryId])->with('error', trans('general.feature_disabled'));
}
$accessory = Accessory::find($accessoryId);
if (isset($accessory->id)) {
@@ -45,30 +45,7 @@ class AccessoriesFilesController extends Controller
foreach ($request->file('file') as $file) {
$extension = $file->getClientOriginalExtension();
$file_name = 'accessory-'.$accessory->id.'-'.str_random(8).'-'.str_slug(basename($file->getClientOriginalName(), '.'.$extension)).'.'.$extension;
// Check for SVG and sanitize it
if ($extension == 'svg') {
\Log::debug('This is an SVG');
\Log::debug($file_name);
$sanitizer = new Sanitizer();
$dirtySVG = file_get_contents($file->getRealPath());
$cleanSVG = $sanitizer->sanitize($dirtySVG);
try {
Storage::put('private_uploads/accessories/'.$file_name, $cleanSVG);
} catch (\Exception $e) {
\Log::debug('Upload no workie :( ');
\Log::debug($e);
}
} else {
Storage::put('private_uploads/accessories/'.$file_name, file_get_contents($file));
}
$file_name = $request->handleFile('private_uploads/accessories/', 'accessory-'.$accessory->id, $file);
//Log the upload to the log
$accessory->logUpload($file_name, e($request->input('notes')));
}
@@ -92,10 +69,8 @@ class AccessoriesFilesController extends Controller
* @since [v1.0]
* @param int $accessoryId
* @param int $fileId
* @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function destroy($accessoryId = null, $fileId = null)
public function destroy($accessoryId = null, $fileId = null) : RedirectResponse
{
$accessory = Accessory::find($accessoryId);
@@ -109,7 +84,7 @@ class AccessoriesFilesController extends Controller
try {
Storage::delete('accessories/'.$log->filename);
} catch (\Exception $e) {
\Log::debug($e);
Log::debug($e);
}
}
@@ -130,13 +105,11 @@ class AccessoriesFilesController extends Controller
* @since [v1.4]
* @param int $accessoryId
* @param int $fileId
* @return \Symfony\Accessory\HttpFoundation\Response
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function show($accessoryId = null, $fileId = null, $download = true)
public function show($accessoryId = null, $fileId = null, $download = true) : View | RedirectResponse | Response | BinaryFileResponse | StreamedResponse
{
\Log::debug('Private filesystem is: '.config('filesystems.default'));
Log::debug('Private filesystem is: '.config('filesystems.default'));
$accessory = Accessory::find($accessoryId);
@@ -146,37 +119,33 @@ class AccessoriesFilesController extends Controller
$this->authorize('view', $accessory);
$this->authorize('accessories.files', $accessory);
if (! $log = Actionlog::find($fileId)) {
return response('No matching record for that asset/file', 500)
->header('Content-Type', 'text/plain');
if (! $log = Actionlog::whereNotNull('filename')->where('item_id', $accessory->id)->find($fileId)) {
return redirect()->route('accessories.index')->with('error', trans('admin/users/message.log_record_not_found'));
}
$file = 'private_uploads/accessories/'.$log->filename;
if (Storage::missing($file)) {
\Log::debug('FILE DOES NOT EXISTS for '.$file);
\Log::debug('URL should be '.Storage::url($file));
Log::debug('FILE DOES NOT EXISTS for '.$file);
Log::debug('URL should be '.Storage::url($file));
return response('File '.$file.' ('.Storage::url($file).') not found on server', 404)
->header('Content-Type', 'text/plain');
} else {
// Display the file inline
if (request('inline') == 'true') {
$headers = [
'Content-Disposition' => 'inline',
];
return Storage::download($file, $log->filename, $headers);
}
// We have to override the URL stuff here, since local defaults in Laravel's Flysystem
// won't work, as they're not accessible via the web
if (config('filesystems.default') == 'local') { // TODO - is there any way to fix this at the StorageHelper layer?
return StorageHelper::downloader($file);
} else {
if ($download != 'true') {
\Log::debug('display the file');
if ($contents = file_get_contents(Storage::url($file))) { // TODO - this will fail on private S3 files or large public ones
return Response::make(Storage::url($file)->header('Content-Type', mime_content_type($file)));
}
return JsonResponse::create(['error' => 'Failed validation: '], 500);
}
return StorageHelper::downloader($file);
}
}
}

View File

@@ -7,8 +7,9 @@ use App\Http\Controllers\Controller;
use App\Models\Accessory;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use \Illuminate\Contracts\View\View;
use \Illuminate\Http\RedirectResponse;
class AccessoryCheckinController extends Controller
{
@@ -19,15 +20,10 @@ class AccessoryCheckinController extends Controller
* @param Request $request
* @param int $accessoryUserId
* @param string $backto
* @return View
* @internal param int $accessoryId
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function create($accessoryUserId = null, $backto = null)
public function create($accessoryUserId = null, $backto = null) : View | RedirectResponse
{
// Check if the accessory exists
if (is_null($accessory_user = DB::table('accessories_users')->find($accessoryUserId))) {
// Redirect to the accessory management page with error
return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.not_found'));
}
@@ -44,15 +40,10 @@ class AccessoryCheckinController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param null $accessoryUserId
* @param string $backto
* @return Redirect
* @throws \Illuminate\Auth\Access\AuthorizationException
* @internal param int $accessoryId
*/
public function store(Request $request, $accessoryUserId = null, $backto = null)
public function store(Request $request, $accessoryUserId = null, $backto = null) : RedirectResponse
{
// Check if the accessory exists
if (is_null($accessory_user = DB::table('accessories_users')->find($accessoryUserId))) {
// Redirect to the accessory management page with error
return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.does_not_exist'));
}
@@ -60,16 +51,17 @@ class AccessoryCheckinController extends Controller
$this->authorize('checkin', $accessory);
$checkin_at = date('Y-m-d');
$checkin_hours = date('H:i:s');
$checkin_at = date('Y-m-d H:i:s');
if ($request->filled('checkin_at')) {
$checkin_at = $request->input('checkin_at');
$checkin_at = $request->input('checkin_at').' '.$checkin_hours;
}
// Was the accessory updated?
if (DB::table('accessories_users')->where('id', '=', $accessory_user->id)->delete()) {
$return_to = e($accessory_user->assigned_to);
event(new CheckoutableCheckedIn($accessory, User::find($return_to), Auth::user(), $request->input('note'), $checkin_at));
event(new CheckoutableCheckedIn($accessory, User::find($return_to), auth()->user(), $request->input('note'), $checkin_at));
return redirect()->route('accessories.show', $accessory->id)->with('success', trans('admin/accessories/message.checkin.success'));
}

View File

@@ -10,7 +10,8 @@ use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Input;
use \Illuminate\Contracts\View\View;
use \Illuminate\Http\RedirectResponse;
class AccessoryCheckoutController extends Controller
{
@@ -18,31 +19,34 @@ class AccessoryCheckoutController extends Controller
* Return the form to checkout an Accessory to a user.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $accessoryId
* @return View
* @throws \Illuminate\Auth\Access\AuthorizationException
* @param int $id
*/
public function create($accessoryId)
public function create($id) : View | RedirectResponse
{
// Check if the accessory exists
if (is_null($accessory = Accessory::withCount('users as users_count')->find($accessoryId))) {
// Redirect to the accessory management page with error
return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.not_found'));
}
if ($accessory = Accessory::withCount('users as users_count')->find($id)) {
$this->authorize('checkout', $accessory);
if ($accessory->category) {
// Make sure there is at least one available to checkout
if ($accessory->numRemaining() <= 0){
return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.checkout.unavailable'));
}
if ($accessory->category) {
$this->authorize('checkout', $accessory);
// Get the dropdown of users and then pass it to the checkout view
// Return the checkout view
return view('accessories/checkout', compact('accessory'));
}
return redirect()->back()->with('error', 'The category type for this accessory is not valid. Edit the accessory and select a valid accessory category.');
// Invalid category
return redirect()->route('accessories.edit', ['accessory' => $accessory->id])
->with('error', trans('general.invalid_item_category_single', ['type' => trans('general.accessory')]));
}
// Not found
return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.not_found'));
}
/**
@@ -54,10 +58,8 @@ class AccessoryCheckoutController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param Request $request
* @param int $accessoryId
* @return Redirect
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function store(Request $request, $accessoryId)
public function store(Request $request, $accessoryId) : RedirectResponse
{
// Check if the accessory exists
if (is_null($accessory = Accessory::withCount('users as users_count')->find($accessoryId))) {
@@ -90,7 +92,7 @@ class AccessoryCheckoutController extends Controller
DB::table('accessories_users')->where('assigned_to', '=', $accessory->assigned_to)->where('accessory_id', '=', $accessory->id)->first();
event(new CheckoutableCheckedOut($accessory, $user, Auth::user(), $request->input('note')));
event(new CheckoutableCheckedOut($accessory, $user, auth()->user(), $request->input('note')));
// Redirect to the new accessory page
return redirect()->route('accessories.index')->with('success', trans('admin/accessories/message.checkout.success'));

View File

@@ -23,25 +23,23 @@ use App\Notifications\AcceptanceAssetAcceptedNotification;
use App\Notifications\AcceptanceAssetDeclinedNotification;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use App\Http\Controllers\SettingsController;
use Barryvdh\DomPDF\Facade\Pdf;
use Carbon\Carbon;
use phpDocumentor\Reflection\Types\Compound;
use \Illuminate\Contracts\View\View;
use \Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Log;
class AcceptanceController extends Controller
{
/**
* Show a listing of pending checkout acceptances for the current user
*
* @return View
*/
public function index()
public function index() : View
{
$acceptances = CheckoutAcceptance::forUser(Auth::user())->pending()->get();
$acceptances = CheckoutAcceptance::forUser(auth()->user())->pending()->get();
return view('account/accept.index', compact('acceptances'));
}
@@ -49,9 +47,8 @@ class AcceptanceController extends Controller
* Shows a form to either accept or decline the checkout acceptance
*
* @param int $id
* @return mixed
*/
public function create($id)
public function create($id) : View | RedirectResponse
{
$acceptance = CheckoutAcceptance::find($id);
@@ -64,12 +61,12 @@ class AcceptanceController extends Controller
return redirect()->route('account.accept')->with('error', trans('admin/users/message.error.asset_already_accepted'));
}
if (! $acceptance->isCheckedOutTo(Auth::user())) {
if (! $acceptance->isCheckedOutTo(auth()->user())) {
return redirect()->route('account.accept')->with('error', trans('admin/users/message.error.incorrect_user_accepted'));
}
if (! Company::isCurrentUserHasAccess($acceptance->checkoutable)) {
return redirect()->route('account.accept')->with('error', trans('general.insufficient_permissions'));
return redirect()->route('account.accept')->with('error', trans('general.error_user_company'));
}
return view('account/accept.create', compact('acceptance'));
@@ -80,9 +77,8 @@ class AcceptanceController extends Controller
*
* @param Request $request
* @param int $id
* @return Redirect
*/
public function store(Request $request, $id)
public function store(Request $request, $id) : RedirectResponse
{
$acceptance = CheckoutAcceptance::find($id);
@@ -94,7 +90,7 @@ class AcceptanceController extends Controller
return redirect()->route('account.accept')->with('error', trans('admin/users/message.error.asset_already_accepted'));
}
if (! $acceptance->isCheckedOutTo(Auth::user())) {
if (! $acceptance->isCheckedOutTo(auth()->user())) {
return redirect()->route('account.accept')->with('error', trans('admin/users/message.error.incorrect_user_accepted'));
}
@@ -121,7 +117,6 @@ class AcceptanceController extends Controller
$pdf_filename = 'accepted-eula-'.date('Y-m-d-h-i-s').'.pdf';
$sig_filename='';
if ($request->input('asset_acceptance') == 'accepted') {
/**
@@ -153,12 +148,14 @@ class AcceptanceController extends Controller
}
}
// this is horrible
switch($acceptance->checkoutable_type){
case 'App\Models\Asset':
$pdf_view_route ='account.accept.accept-asset-eula';
$asset_model = AssetModel::find($item->model_id);
if (!$asset_model) {
return redirect()->back()->with('error', trans('admin/models/message.does_not_exist'));
}
$display_model = $asset_model->name;
$assigned_to = User::find($acceptance->assigned_to_id)->present()->fullName;
break;
@@ -167,7 +164,7 @@ class AcceptanceController extends Controller
$pdf_view_route ='account.accept.accept-accessory-eula';
$accessory = Accessory::find($item->id);
$display_model = $accessory->name;
$assigned_to = User::find($item->assignedTo);
$assigned_to = User::find($acceptance->assigned_to_id)->present()->fullName;
break;
case 'App\Models\LicenseSeat':
@@ -222,6 +219,7 @@ class AcceptanceController extends Controller
'item_model' => $display_model,
'item_serial' => $item->serial,
'eula' => $item->getEula(),
'note' => $request->input('note'),
'check_out_date' => Carbon::parse($acceptance->created_at)->format('Y-m-d'),
'accepted_date' => Carbon::parse($acceptance->accepted_at)->format('Y-m-d'),
'assigned_to' => $assigned_to,
@@ -232,29 +230,63 @@ class AcceptanceController extends Controller
];
if ($pdf_view_route!='') {
\Log::debug($pdf_filename.' is the filename, and the route was specified.');
Log::debug($pdf_filename.' is the filename, and the route was specified.');
$pdf = Pdf::loadView($pdf_view_route, $data);
Storage::put('private_uploads/eula-pdfs/' .$pdf_filename, $pdf->output());
}
$acceptance->accept($sig_filename, $item->getEula(), $pdf_filename);
$acceptance->accept($sig_filename, $item->getEula(), $pdf_filename, $request->input('note'));
$acceptance->notify(new AcceptanceAssetAcceptedNotification($data));
event(new CheckoutAccepted($acceptance));
$return_msg = trans('admin/users/message.accepted');
} else {
/**
* Check for the eula-pdfs directory
*/
if (! Storage::exists('private_uploads/eula-pdfs')) {
Storage::makeDirectory('private_uploads/eula-pdfs', 775);
}
if (Setting::getSettings()->require_accept_signature == '1') {
// Check if the signature directory exists, if not create it
if (!Storage::exists('private_uploads/signatures')) {
Storage::makeDirectory('private_uploads/signatures', 775);
}
// The item was accepted, check for a signature
if ($request->filled('signature_output')) {
$sig_filename = 'siglog-' . Str::uuid() . '-' . date('Y-m-d-his') . '.png';
$data_uri = $request->input('signature_output');
$encoded_image = explode(',', $data_uri);
$decoded_image = base64_decode($encoded_image[1]);
Storage::put('private_uploads/signatures/' . $sig_filename, (string)$decoded_image);
// No image data is present, kick them back.
// This mostly only applies to users on super-duper crapola browsers *cough* IE *cough*
} else {
return redirect()->back()->with('error', trans('general.shitty_browser'));
}
}
// Format the data to send the declined notification
$branding_settings = SettingsController::getPDFBranding();
// This is the most horriblest
switch($acceptance->checkoutable_type){
case 'App\Models\Asset':
$asset_model = AssetModel::find($item->model_id);
$display_model = $asset_model->name;
$assigned_to = User::find($acceptance->assigned_to_id)->present()->fullName;
break;
case 'App\Models\Accessory':
$assigned_to = User::find($item->assignedTo);
$accessory = Accessory::find($item->id);
$display_model = $accessory->name;
$assigned_to = User::find($acceptance->assigned_to_id)->present()->fullName;
break;
case 'App\Models\LicenseSeat':
@@ -266,20 +298,31 @@ class AcceptanceController extends Controller
break;
case 'App\Models\Consumable':
$consumable = Consumable::find($item->id);
$display_model = $consumable->name;
$assigned_to = User::find($acceptance->assigned_to_id)->present()->fullName;
break;
}
$data = [
'item_tag' => $item->asset_tag,
'item_model' => $display_model,
'item_serial' => $item->serial,
'note' => $request->input('note'),
'declined_date' => Carbon::parse($acceptance->declined_at)->format('Y-m-d'),
'signature' => ($sig_filename) ? storage_path() . '/private_uploads/signatures/' . $sig_filename : null,
'assigned_to' => $assigned_to,
'company_name' => $branding_settings->site_name,
'date_settings' => $branding_settings->date_display_format,
];
$acceptance->decline($sig_filename);
if ($pdf_view_route!='') {
Log::debug($pdf_filename.' is the filename, and the route was specified.');
$pdf = Pdf::loadView($pdf_view_route, $data);
Storage::put('private_uploads/eula-pdfs/' .$pdf_filename, $pdf->output());
}
$acceptance->decline($sig_filename, $request->input('note'));
$acceptance->notify(new AcceptanceAssetDeclinedNotification($data));
event(new CheckoutDeclined($acceptance));
$return_msg = trans('admin/users/message.declined');

View File

@@ -3,34 +3,44 @@
namespace App\Http\Controllers;
use App\Helpers\Helper;
use App\Models\Actionlog;
use Response;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
use \Illuminate\Http\Response;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
class ActionlogController extends Controller
{
public function displaySig($filename)
public function displaySig($filename) : RedirectResponse | Response | bool
{
// PHP doesn't let you handle file not found errors well with
// file_get_contents, so we set the error reporting for just this class
error_reporting(0);
$disk = config('filesystems.default');
switch (config("filesystems.disks.$disk.driver")) {
case 's3':
$file = 'private_uploads/signatures/'.$filename;
return redirect()->away(Storage::disk($disk)->temporaryUrl($file, now()->addMinutes(5)));
default:
$this->authorize('view', \App\Models\Asset::class);
$file = config('app.private_uploads').'/signatures/'.$filename;
$filetype = Helper::checkUploadIsImage($file);
$contents = file_get_contents($file, false, stream_context_create(['http' => ['ignore_errors' => true]]));
if ($contents === false) {
\Log::warn('File '.$file.' not found');
Log::warning('File '.$file.' not found');
return false;
} else {
return Response::make($contents)->header('Content-Type', $filetype);
return response()->make($contents)->header('Content-Type', $filetype);
}
}
}
}
public function getStoredEula($filename){
public function getStoredEula($filename) : Response | BinaryFileResponse
{
$this->authorize('view', \App\Models\Asset::class);
$file = config('app.private_uploads').'/eula-pdfs/'.$filename;
return Response::download($file);
return response()->download($file);
}
}

View File

@@ -2,6 +2,7 @@
namespace App\Http\Controllers\Api;
use App\Events\CheckoutableCheckedOut;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Http\Transformers\AccessoriesTransformer;
@@ -9,12 +10,13 @@ use App\Http\Transformers\SelectlistTransformer;
use App\Models\Accessory;
use App\Models\Company;
use App\Models\User;
use Auth;
use Illuminate\Support\Facades\Auth;
use Carbon\Carbon;
use DB;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use App\Http\Requests\ImageUploadRequest;
class AccessoriesController extends Controller
{
/**
@@ -80,12 +82,9 @@ class AccessoriesController extends Controller
$accessories->where('notes','=',$request->input('notes'));
}
// Set the offset to the API call's offset, unless the offset is higher than the actual count of items in which
// case we override with the actual count, so we should return 0 items.
$offset = (($accessories) && ($request->get('offset') > $accessories->count())) ? $accessories->count() : $request->get('offset', 0);
// Check to make sure the limit is not higher than the max allowed
((config('app.max_results') >= $request->input('limit')) && ($request->filled('limit'))) ? $limit = $request->input('limit') : $limit = config('app.max_results');
// Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $accessories->count()) ? $accessories->count() : abs($request->input('offset'));
$limit = app('api_limit_value');
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
$sort_override = $request->input('sort');
@@ -153,7 +152,7 @@ class AccessoriesController extends Controller
public function show($id)
{
$this->authorize('view', Accessory::class);
$accessory = Accessory::findOrFail($id);
$accessory = Accessory::withCount('users as users_count')->findOrFail($id);
return (new AccessoriesTransformer)->transformAccessory($accessory);
}
@@ -276,12 +275,12 @@ class AccessoriesController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $accessoryId
* @return Redirect
* @return \Illuminate\Http\RedirectResponse
*/
public function checkout(Request $request, $accessoryId)
{
// Check if the accessory exists
if (is_null($accessory = Accessory::find($accessoryId))) {
if (is_null($accessory = Accessory::withCount('users as users_count')->find($accessoryId))) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/accessories/message.does_not_exist')));
}
@@ -305,7 +304,7 @@ class AccessoriesController extends Controller
'note' => $request->get('note'),
]);
$accessory->logCheckout($request->input('note'), $user);
event(new CheckoutableCheckedOut($accessory, $user, auth()->user(), $request->input('note')));
return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/accessories/message.checkout.success')));
}
@@ -322,7 +321,7 @@ class AccessoriesController extends Controller
* @param Request $request
* @param int $accessoryUserId
* @param string $backto
* @return Redirect
* @return \Illuminate\Http\RedirectResponse
* @internal param int $accessoryId
*/
public function checkin(Request $request, $accessoryUserId = null)
@@ -334,7 +333,7 @@ class AccessoriesController extends Controller
$accessory = Accessory::find($accessory_user->accessory_id);
$this->authorize('checkin', $accessory);
$logaction = $accessory->logCheckin(User::find($accessory_user->user_id), $request->input('note'));
$logaction = $accessory->logCheckin(User::find($accessory_user->assigned_to), $request->input('note'));
// Was the accessory updated?
if (DB::table('accessories_users')->where('id', '=', $accessory_user->id)->delete()) {

View File

@@ -0,0 +1,200 @@
<?php
namespace App\Http\Controllers\Api;
use App\Helpers\StorageHelper;
use Illuminate\Support\Facades\Storage;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Models\Asset;
use App\Models\Actionlog;
use App\Http\Requests\UploadFileRequest;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
/**
* This class controls file related actions related
* to assets for the Snipe-IT Asset Management application.
*
* Based on the Assets/AssetFilesController by A. Gianotto <snipe@snipe.net>
*
* @version v1.0
* @author [T. Scarsbrook] [<snipe@scarzybrook.co.uk>]
*/
class AssetFilesController extends Controller
{
/**
* Accepts a POST to upload a file to the server.
*
* @param \App\Http\Requests\UploadFileRequest $request
* @param int $assetId
* @since [v6.0]
* @author [T. Scarsbrook] [<snipe@scarzybrook.co.uk>]
*/
public function store(UploadFileRequest $request, $assetId = null) : JsonResponse
{
// Start by checking if the asset being acted upon exists
if (! $asset = Asset::find($assetId)) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.does_not_exist')), 404);
}
// Make sure we are allowed to update this asset
$this->authorize('update', $asset);
if ($request->hasFile('file')) {
// If the file storage directory doesn't exist; create it
if (! Storage::exists('private_uploads/assets')) {
Storage::makeDirectory('private_uploads/assets', 775);
}
// Loop over the attached files and add them to the asset
foreach ($request->file('file') as $file) {
$file_name = $request->handleFile('private_uploads/assets/','hardware-'.$asset->id, $file);
$asset->logUpload($file_name, e($request->get('notes')));
}
// All done - report success
return response()->json(Helper::formatStandardApiResponse('success', $asset, trans('admin/hardware/message.upload.success')));
}
// We only reach here if no files were included in the POST, so tell the user this
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.upload.nofiles')), 500);
}
/**
* List the files for an asset.
*
* @param int $assetId
* @since [v6.0]
* @author [T. Scarsbrook] [<snipe@scarzybrook.co.uk>]
*/
public function list($assetId = null) : JsonResponse
{
// Start by checking if the asset being acted upon exists
if (! $asset = Asset::find($assetId)) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.does_not_exist')), 404);
}
// the asset is valid
if (isset($asset->id)) {
$this->authorize('view', $asset);
// Check that there are some uploads on this asset that can be listed
if ($asset->uploads->count() > 0) {
$files = array();
foreach ($asset->uploads as $upload) {
array_push($files, $upload);
}
// Give the list of files back to the user
return response()->json(Helper::formatStandardApiResponse('success', $files, trans('admin/hardware/message.upload.success')));
}
// There are no files.
return response()->json(Helper::formatStandardApiResponse('success', array(), trans('admin/hardware/message.upload.success')));
}
// Send back an error message
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.download.error')), 500);
}
/**
* Check for permissions and display the file.
*
* @param int $assetId
* @param int $fileId
* @return \Illuminate\Http\JsonResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
* @since [v6.0]
* @author [T. Scarsbrook] [<snipe@scarzybrook.co.uk>]
*/
public function show($assetId = null, $fileId = null) : JsonResponse | StreamedResponse | Storage | StorageHelper | BinaryFileResponse
{
// Start by checking if the asset being acted upon exists
if (! $asset = Asset::find($assetId)) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.does_not_exist')), 404);
}
// the asset is valid
if (isset($asset->id)) {
$this->authorize('view', $asset);
// Check that the file being requested exists for the asset
if (! $log = Actionlog::whereNotNull('filename')->where('item_id', $asset->id)->find($fileId)) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.download.no_match', ['id' => $fileId])), 404);
}
// Form the full filename with path
$file = 'private_uploads/assets/'.$log->filename;
Log::debug('Checking for '.$file);
if ($log->action_type == 'audit') {
$file = 'private_uploads/audits/'.$log->filename;
}
// Check the file actually exists on the filesystem
if (! Storage::exists($file)) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.download.does_not_exist', ['id' => $fileId])), 404);
}
if (request('inline') == 'true') {
$headers = [
'Content-Disposition' => 'inline',
];
return Storage::download($file, $log->filename, $headers);
}
return StorageHelper::downloader($file);
}
// Send back an error message
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.download.error', ['id' => $fileId])), 500);
}
/**
* Delete the associated file
*
* @param int $assetId
* @param int $fileId
* @since [v6.0]
* @author [T. Scarsbrook] [<snipe@scarzybrook.co.uk>]
*/
public function destroy($assetId = null, $fileId = null) : JsonResponse
{
// Start by checking if the asset being acted upon exists
if (! $asset = Asset::find($assetId)) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.does_not_exist')), 404);
}
$rel_path = 'private_uploads/assets';
// the asset is valid
if (isset($asset->id)) {
$this->authorize('update', $asset);
// Check for the file
$log = Actionlog::find($fileId);
if ($log) {
// Check the file actually exists, and delete it
if (Storage::exists($rel_path.'/'.$log->filename)) {
Storage::delete($rel_path.'/'.$log->filename);
}
// Delete the record of the file
$log->delete();
// All deleting done - notify the user of success
return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/hardware/message.deletefile.success')), 200);
}
// The file doesn't seem to really exist, so report an error
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.deletefile.error')), 500);
}
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.deletefile.error')), 500);
}
}

View File

@@ -8,10 +8,9 @@ use App\Http\Transformers\AssetMaintenancesTransformer;
use App\Models\Asset;
use App\Models\AssetMaintenance;
use App\Models\Company;
use Auth;
use Carbon\Carbon;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Input;
use Illuminate\Http\JsonResponse;
/**
* This controller handles all actions related to Asset Maintenance for
@@ -22,7 +21,6 @@ use Illuminate\Support\Facades\Input;
class AssetMaintenancesController extends Controller
{
/**
* Generates the JSON response for asset maintenances listing view.
*
@@ -30,13 +28,13 @@ class AssetMaintenancesController extends Controller
* @author Vincent Sposato <vincent.sposato@gmail.com>
* @version v1.0
* @since [v1.8]
* @return string JSON
*/
public function index(Request $request)
public function index(Request $request) : JsonResponse | array
{
$this->authorize('view', Asset::class);
$maintenances = AssetMaintenance::select('asset_maintenances.*')->with('asset', 'asset.model', 'asset.location', 'supplier', 'asset.company', 'admin');
$maintenances = AssetMaintenance::select('asset_maintenances.*')
->with('asset', 'asset.model', 'asset.location', 'asset.defaultLoc', 'supplier', 'asset.company', 'asset.assetstatus', 'admin');
if ($request->filled('search')) {
$maintenances = $maintenances->TextSearch($request->input('search'));
@@ -47,7 +45,7 @@ class AssetMaintenancesController extends Controller
}
if ($request->filled('supplier_id')) {
$maintenances->where('supplier_id', '=', $request->input('supplier_id'));
$maintenances->where('asset_maintenances.supplier_id', '=', $request->input('supplier_id'));
}
if ($request->filled('asset_maintenance_type')) {
@@ -55,12 +53,9 @@ class AssetMaintenancesController extends Controller
}
// Set the offset to the API call's offset, unless the offset is higher than the actual count of items in which
// case we override with the actual count, so we should return 0 items.
$offset = (($maintenances) && ($request->get('offset') > $maintenances->count())) ? $maintenances->count() : $request->get('offset', 0);
// Check to make sure the limit is not higher than the max allowed
((config('app.max_results') >= $request->input('limit')) && ($request->filled('limit'))) ? $limit = $request->input('limit') : $limit = config('app.max_results');
// Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $maintenances->count()) ? $maintenances->count() : abs($request->input('offset'));
$limit = app('api_limit_value');
$allowed_columns = [
'id',
@@ -73,9 +68,13 @@ class AssetMaintenancesController extends Controller
'notes',
'asset_tag',
'asset_name',
'serial',
'user_id',
'supplier'
'supplier',
'is_warranty',
'status_label',
];
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
$sort = in_array($request->input('sort'), $allowed_columns) ? e($request->input('sort')) : 'created_at';
@@ -92,6 +91,12 @@ class AssetMaintenancesController extends Controller
case 'asset_name':
$maintenances = $maintenances->OrderByAssetName($order);
break;
case 'serial':
$maintenances = $maintenances->OrderByAssetSerial($order);
break;
case 'status_label':
$maintenances = $maintenances->OrderStatusName($order);
break;
default:
$maintenances = $maintenances->orderBy($sort, $order);
break;
@@ -112,47 +117,22 @@ class AssetMaintenancesController extends Controller
* @author Vincent Sposato <vincent.sposato@gmail.com>
* @version v1.0
* @since [v1.8]
* @return string JSON
*/
public function store(Request $request)
public function store(Request $request) : JsonResponse
{
$this->authorize('update', Asset::class);
// create a new model instance
$assetMaintenance = new AssetMaintenance();
$assetMaintenance->supplier_id = $request->input('supplier_id');
$assetMaintenance->is_warranty = $request->input('is_warranty');
$assetMaintenance->cost = Helper::ParseCurrency($request->input('cost'));
$assetMaintenance->notes = e($request->input('notes'));
$asset = Asset::find(e($request->input('asset_id')));
if (! Company::isCurrentUserHasAccess($asset)) {
return response()->json(Helper::formatStandardApiResponse('error', null, 'You cannot add a maintenance for that asset'));
}
// Save the asset maintenance data
$assetMaintenance->asset_id = $request->input('asset_id');
$assetMaintenance->asset_maintenance_type = $request->input('asset_maintenance_type');
$assetMaintenance->title = $request->input('title');
$assetMaintenance->start_date = $request->input('start_date');
$assetMaintenance->completion_date = $request->input('completion_date');
$assetMaintenance->user_id = Auth::id();
if (($assetMaintenance->completion_date !== null)
&& ($assetMaintenance->start_date !== '')
&& ($assetMaintenance->start_date !== '0000-00-00')
) {
$startDate = Carbon::parse($assetMaintenance->start_date);
$completionDate = Carbon::parse($assetMaintenance->completion_date);
$assetMaintenance->asset_maintenance_time = $completionDate->diffInDays($startDate);
}
$maintenance = new AssetMaintenance();
$maintenance->fill($request->all());
$maintenance->user_id = Auth::id();
// Was the asset maintenance created?
if ($assetMaintenance->save()) {
return response()->json(Helper::formatStandardApiResponse('success', $assetMaintenance, trans('admin/asset_maintenances/message.create.success')));
if ($maintenance->save()) {
return response()->json(Helper::formatStandardApiResponse('success', $maintenance, trans('admin/asset_maintenances/message.create.success')));
}
return response()->json(Helper::formatStandardApiResponse('error', null, $assetMaintenance->getErrors()));
return response()->json(Helper::formatStandardApiResponse('error', null, $maintenance->getErrors()));
}
@@ -160,67 +140,40 @@ class AssetMaintenancesController extends Controller
* Validates and stores an update to an asset maintenance
*
* @author A. Gianotto <snipe@snipe.net>
* @param int $assetMaintenanceId
* @param int $id
* @param int $request
* @version v1.0
* @since [v4.0]
* @return string JSON
*/
public function update(Request $request, $assetMaintenanceId = null)
public function update(Request $request, $id) : JsonResponse
{
$this->authorize('update', Asset::class);
// Check if the asset maintenance exists
$assetMaintenance = AssetMaintenance::findOrFail($assetMaintenanceId);
if (! Company::isCurrentUserHasAccess($assetMaintenance->asset)) {
return response()->json(Helper::formatStandardApiResponse('error', null, 'You cannot edit a maintenance for that asset'));
if ($maintenance = AssetMaintenance::with('asset')->find($id)) {
// Can this user manage this asset?
if (! Company::isCurrentUserHasAccess($maintenance->asset)) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('general.action_permission_denied', ['item_type' => trans('admin/asset_maintenances/general.maintenance'), 'id' => $id, 'action' => trans('general.edit')])));
}
$assetMaintenance->supplier_id = e($request->input('supplier_id'));
$assetMaintenance->is_warranty = e($request->input('is_warranty'));
$assetMaintenance->cost = Helper::ParseCurrency($request->input('cost'));
$assetMaintenance->notes = e($request->input('notes'));
$asset = Asset::find(request('asset_id'));
if (! Company::isCurrentUserHasAccess($asset)) {
return response()->json(Helper::formatStandardApiResponse('error', null, 'You cannot edit a maintenance for that asset'));
// The asset this miantenance is attached to is not valid or has been deleted
if (!$maintenance->asset) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('general.item_not_found', ['item_type' => trans('general.asset'), 'id' => $id])));
}
// Save the asset maintenance data
$assetMaintenance->asset_id = $request->input('asset_id');
$assetMaintenance->asset_maintenance_type = $request->input('asset_maintenance_type');
$assetMaintenance->title = $request->input('title');
$assetMaintenance->start_date = $request->input('start_date');
$assetMaintenance->completion_date = $request->input('completion_date');
$maintenance->fill($request->all());
if (($assetMaintenance->completion_date == null)
) {
if (($assetMaintenance->asset_maintenance_time !== 0)
|| (! is_null($assetMaintenance->asset_maintenance_time))
) {
$assetMaintenance->asset_maintenance_time = null;
}
if ($maintenance->save()) {
return response()->json(Helper::formatStandardApiResponse('success', $maintenance, trans('admin/asset_maintenances/message.edit.success')));
}
if (($assetMaintenance->completion_date !== null)
&& ($assetMaintenance->start_date !== '')
&& ($assetMaintenance->start_date !== '0000-00-00')
) {
$startDate = Carbon::parse($assetMaintenance->start_date);
$completionDate = Carbon::parse($assetMaintenance->completion_date);
$assetMaintenance->asset_maintenance_time = $completionDate->diffInDays($startDate);
return response()->json(Helper::formatStandardApiResponse('error', null, $maintenance->getErrors()));
}
// Was the asset maintenance created?
if ($assetMaintenance->save()) {
return response()->json(Helper::formatStandardApiResponse('success', $assetMaintenance, trans('admin/asset_maintenances/message.edit.success')));
return response()->json(Helper::formatStandardApiResponse('error', null, trans('general.item_not_found', ['item_type' => trans('admin/asset_maintenances/general.maintenance'), 'id' => $id])));
}
return response()->json(Helper::formatStandardApiResponse('error', null, $assetMaintenance->getErrors()));
}
/**
* Delete an asset maintenance
*
@@ -228,9 +181,8 @@ class AssetMaintenancesController extends Controller
* @param int $assetMaintenanceId
* @version v1.0
* @since [v4.0]
* @return string JSON
*/
public function destroy($assetMaintenanceId)
public function destroy($assetMaintenanceId) : JsonResponse
{
$this->authorize('update', Asset::class);
// Check if the asset maintenance exists
@@ -254,9 +206,8 @@ class AssetMaintenancesController extends Controller
* @param int $assetMaintenanceId
* @version v1.0
* @since [v4.0]
* @return string JSON
*/
public function show($assetMaintenanceId)
public function show($assetMaintenanceId) : JsonResponse
{
$this->authorize('view', Asset::class);
$assetMaintenance = AssetMaintenance::findOrFail($assetMaintenanceId);

View File

@@ -4,14 +4,16 @@ namespace App\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Http\Requests\StoreAssetModelRequest;
use App\Http\Transformers\AssetModelsTransformer;
use App\Http\Transformers\AssetsTransformer;
use App\Http\Transformers\SelectlistTransformer;
use App\Models\Asset;
use App\Models\AssetModel;
use Illuminate\Http\Request;
use App\Http\Requests\ImageUploadRequest;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Log;
use Illuminate\Http\JsonResponse;
/**
* This class controls all actions related to asset models for
@@ -27,9 +29,8 @@ class AssetModelsController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
public function index(Request $request) : JsonResponse | array
{
$this->authorize('view', AssetModel::class);
$allowed_columns =
@@ -38,6 +39,7 @@ class AssetModelsController extends Controller
'image',
'name',
'model_number',
'min_amt',
'eol',
'notes',
'created_at',
@@ -45,6 +47,7 @@ class AssetModelsController extends Controller
'requestable',
'assets_count',
'category',
'fieldset',
];
$assetmodels = AssetModel::select([
@@ -52,6 +55,7 @@ class AssetModelsController extends Controller
'models.image',
'models.name',
'model_number',
'min_amt',
'eol',
'requestable',
'models.notes',
@@ -63,7 +67,7 @@ class AssetModelsController extends Controller
'models.deleted_at',
'models.updated_at',
])
->with('category', 'depreciation', 'manufacturer', 'fieldset')
->with('category', 'depreciation', 'manufacturer', 'fieldset.fields.defaultValues')
->withCount('assets as assets_count');
if ($request->input('status')=='deleted') {
@@ -78,12 +82,9 @@ class AssetModelsController extends Controller
$assetmodels->TextSearch($request->input('search'));
}
// Set the offset to the API call's offset, unless the offset is higher than the actual count of items in which
// case we override with the actual count, so we should return 0 items.
$offset = (($assetmodels) && ($request->get('offset') > $assetmodels->count())) ? $assetmodels->count() : $request->get('offset', 0);
// Check to make sure the limit is not higher than the max allowed
((config('app.max_results') >= $request->input('limit')) && ($request->filled('limit'))) ? $limit = $request->input('limit') : $limit = config('app.max_results');
// Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $assetmodels->count()) ? $assetmodels->count() : abs($request->input('offset'));
$limit = app('api_limit_value');
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
$sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'models.created_at';
@@ -95,6 +96,9 @@ class AssetModelsController extends Controller
case 'category':
$assetmodels->OrderCategory($order);
break;
case 'fieldset':
$assetmodels->OrderFieldset($order);
break;
default:
$assetmodels->orderBy($sort, $order);
break;
@@ -112,10 +116,9 @@ class AssetModelsController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param \App\Http\Requests\ImageUploadRequest $request
* @return \Illuminate\Http\Response
* @param \App\Http\Requests\StoreAssetModelRequest $request
*/
public function store(ImageUploadRequest $request)
public function store(StoreAssetModelRequest $request) : JsonResponse
{
$this->authorize('create', AssetModel::class);
$assetmodel = new AssetModel;
@@ -136,9 +139,8 @@ class AssetModelsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
public function show($id) : array
{
$this->authorize('view', AssetModel::class);
$assetmodel = AssetModel::withCount('assets as assets_count')->findOrFail($id);
@@ -152,9 +154,8 @@ class AssetModelsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function assets($id)
public function assets($id) : array
{
$this->authorize('view', AssetModel::class);
$assets = Asset::where('model_id', '=', $id)->get();
@@ -172,7 +173,7 @@ class AssetModelsController extends Controller
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(ImageUploadRequest $request, $id)
public function update(StoreAssetModelRequest $request, $id) : JsonResponse
{
$this->authorize('update', AssetModel::class);
$assetmodel = AssetModel::findOrFail($id);
@@ -205,9 +206,8 @@ class AssetModelsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
public function destroy($id) : JsonResponse
{
$this->authorize('delete', AssetModel::class);
$assetmodel = AssetModel::findOrFail($id);
@@ -221,7 +221,7 @@ class AssetModelsController extends Controller
try {
Storage::disk('public')->delete('assetmodels/'.$assetmodel->image);
} catch (\Exception $e) {
\Log::info($e);
Log::info($e);
}
}
@@ -237,7 +237,7 @@ class AssetModelsController extends Controller
* @since [v4.0.16]
* @see \App\Http\Transformers\SelectlistTransformer
*/
public function selectlist(Request $request)
public function selectlist(Request $request) : array
{
$this->authorize('view.selectlists');

View File

@@ -3,15 +3,20 @@
namespace App\Http\Controllers\Api;
use App\Events\CheckoutableCheckedIn;
use App\Http\Requests\StoreAssetRequest;
use App\Http\Traits\MigratesLegacyAssetLocations;
use App\Models\CheckoutAcceptance;
use App\Models\LicenseSeat;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\Facades\Gate;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Http\Requests\AssetCheckoutRequest;
use App\Http\Transformers\AssetsTransformer;
use App\Http\Transformers\DepreciationReportTransformer;
use App\Http\Transformers\LicensesTransformer;
use App\Http\Transformers\SelectlistTransformer;
use App\Models\Actionlog;
use App\Models\Asset;
use App\Models\AssetModel;
use App\Models\Company;
@@ -20,18 +25,14 @@ use App\Models\License;
use App\Models\Location;
use App\Models\Setting;
use App\Models\User;
use Auth;
use Illuminate\Support\Facades\Auth;
use Carbon\Carbon;
use DB;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use App\Http\Requests\ImageUploadRequest;
use Input;
use Paginator;
use Slack;
use Str;
use TCPDF;
use Validator;
use Route;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Route;
/**
* This class controls all actions related to assets for
@@ -42,15 +43,16 @@ use Route;
*/
class AssetsController extends Controller
{
use MigratesLegacyAssetLocations;
/**
* Returns JSON listing of all assets
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $assetId
* @since [v4.0]
* @return JsonResponse
*/
public function index(Request $request, $audit = null)
public function index(Request $request, $action = null, $upcoming_status = null) : JsonResponse | array
{
$filter_non_deprecable_assets = false;
@@ -85,6 +87,7 @@ class AssetsController extends Controller
'serial',
'model_number',
'last_checkout',
'last_checkin',
'notes',
'expected_checkin',
'order_number',
@@ -102,6 +105,7 @@ class AssetsController extends Controller
'requests_counter',
'byod',
'asset_eol_date',
'requestable',
];
$filter = [];
@@ -115,7 +119,7 @@ class AssetsController extends Controller
$allowed_columns[] = $field->db_column_name();
}
$assets = Company::scopeCompanyables(Asset::select('assets.*'), 'company_id', 'assets')
$assets = Asset::select('assets.*')
->with('location', 'assetstatus', 'company', 'defaultLoc','assignedTo',
'model.category', 'model.manufacturer', 'model.fieldset','supplier'); //it might be tempting to add 'assetlog' here, but don't. It blows up update-heavy users.
@@ -125,17 +129,141 @@ class AssetsController extends Controller
$assets->InModelList($non_deprecable_models->toArray());
}
// These are used by the API to query against specific ID numbers.
// They are also used by the individual searches on detail pages like
// locations, etc.
// Search custom fields by column name
foreach ($all_custom_fields as $field) {
if ($request->filled($field->db_column_name())) {
if ($request->filled($field->db_column_name()) && $field->db_column_name()) {
$assets->where($field->db_column_name(), '=', $request->input($field->db_column_name()));
}
}
if ((! is_null($filter)) && (count($filter)) > 0) {
$assets->ByFilter($filter);
} elseif ($request->filled('search')) {
$assets->TextSearch($request->input('search'));
}
/**
* Handle due and overdue audits and checkin dates
*/
switch ($action) {
case 'audits':
switch ($upcoming_status) {
case 'due':
$assets->DueForAudit($settings);
break;
case 'overdue':
$assets->OverdueForAudit();
break;
case 'due-or-overdue':
$assets->DueOrOverdueForAudit($settings);
break;
}
break;
case 'checkins':
switch ($upcoming_status) {
case 'due':
$assets->DueForCheckin($settings);
break;
case 'overdue':
$assets->OverdueForCheckin();
break;
case 'due-or-overdue':
$assets->DueOrOverdueForCheckin($settings);
break;
}
break;
}
/**
* End handling due and overdue audits and checkin dates
*/
// This is used by the sidenav, mostly
// We switched from using query scopes here because of a Laravel bug
// related to fulltext searches on complex queries.
// I am sad. :(
switch ($request->input('status')) {
case 'Deleted':
$assets->onlyTrashed();
break;
case 'Pending':
$assets->join('status_labels AS status_alias', function ($join) {
$join->on('status_alias.id', '=', 'assets.status_id')
->where('status_alias.deployable', '=', 0)
->where('status_alias.pending', '=', 1)
->where('status_alias.archived', '=', 0);
});
break;
case 'RTD':
$assets->whereNull('assets.assigned_to')
->join('status_labels AS status_alias', function ($join) {
$join->on('status_alias.id', '=', 'assets.status_id')
->where('status_alias.deployable', '=', 1)
->where('status_alias.pending', '=', 0)
->where('status_alias.archived', '=', 0);
});
break;
case 'Undeployable':
$assets->Undeployable();
break;
case 'Archived':
$assets->join('status_labels AS status_alias', function ($join) {
$join->on('status_alias.id', '=', 'assets.status_id')
->where('status_alias.deployable', '=', 0)
->where('status_alias.pending', '=', 0)
->where('status_alias.archived', '=', 1);
});
break;
case 'Requestable':
$assets->where('assets.requestable', '=', 1)
->join('status_labels AS status_alias', function ($join) {
$join->on('status_alias.id', '=', 'assets.status_id')
->where('status_alias.deployable', '=', 1)
->where('status_alias.pending', '=', 0)
->where('status_alias.archived', '=', 0);
});
break;
case 'Deployed':
// more sad, horrible workarounds for laravel bugs when doing full text searches
$assets->whereNotNull('assets.assigned_to');
break;
case 'byod':
// This is kind of redundant, since we already check for byod=1 above, but this keeps the
// sidebar nav links a little less chaotic
$assets->where('assets.byod', '=', '1');
break;
default:
if ((! $request->filled('status_id')) && ($settings->show_archived_in_list != '1')) {
// terrible workaround for complex-query Laravel bug in fulltext
$assets->join('status_labels AS status_alias', function ($join) {
$join->on('status_alias.id', '=', 'assets.status_id')
->where('status_alias.archived', '=', 0);
});
// If there is a status ID, don't take show_archived_in_list into consideration
} else {
$assets->join('status_labels AS status_alias', function ($join) {
$join->on('status_alias.id', '=', 'assets.status_id');
});
}
}
// Leave these under the TextSearch scope, else the fuzziness will override the specific ID (status ID, etc) requested
if ($request->filled('status_id')) {
$assets->where('assets.status_id', '=', $request->input('status_id'));
}
@@ -197,113 +325,9 @@ class AssetsController extends Controller
$assets->where('assets.byod', '=', $request->input('byod'));
}
$request->filled('order_number') ? $assets = $assets->where('assets.order_number', '=', e($request->get('order_number'))) : '';
// Set the offset to the API call's offset, unless the offset is higher than the actual count of items in which
// case we override with the actual count, so we should return 0 items.
$offset = (($assets) && ($request->get('offset') > $assets->count())) ? $assets->count() : $request->get('offset', 0);
// Check to make sure the limit is not higher than the max allowed
((config('app.max_results') >= $request->input('limit')) && ($request->filled('limit'))) ? $limit = $request->input('limit') : $limit = config('app.max_results');
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
// This is used by the audit reporting routes
if (Gate::allows('audit', Asset::class)) {
switch ($audit) {
case 'due':
$assets->DueOrOverdueForAudit($settings);
break;
case 'overdue':
$assets->overdueForAudit($settings);
break;
if ($request->filled('order_number')) {
$assets->where('assets.order_number', '=', strval($request->get('order_number')));
}
}
// This is used by the sidenav, mostly
// We switched from using query scopes here because of a Laravel bug
// related to fulltext searches on complex queries.
// I am sad. :(
switch ($request->input('status')) {
case 'Deleted':
$assets->onlyTrashed();
break;
case 'Pending':
$assets->join('status_labels AS status_alias', function ($join) {
$join->on('status_alias.id', '=', 'assets.status_id')
->where('status_alias.deployable', '=', 0)
->where('status_alias.pending', '=', 1)
->where('status_alias.archived', '=', 0);
});
break;
case 'RTD':
$assets->whereNull('assets.assigned_to')
->join('status_labels AS status_alias', function ($join) {
$join->on('status_alias.id', '=', 'assets.status_id')
->where('status_alias.deployable', '=', 1)
->where('status_alias.pending', '=', 0)
->where('status_alias.archived', '=', 0);
});
break;
case 'Undeployable':
$assets->Undeployable();
break;
case 'Archived':
$assets->join('status_labels AS status_alias', function ($join) {
$join->on('status_alias.id', '=', 'assets.status_id')
->where('status_alias.deployable', '=', 0)
->where('status_alias.pending', '=', 0)
->where('status_alias.archived', '=', 1);
});
break;
case 'Requestable':
$assets->where('assets.requestable', '=', 1)
->join('status_labels AS status_alias', function ($join) {
$join->on('status_alias.id', '=', 'assets.status_id')
->where('status_alias.deployable', '=', 1)
->where('status_alias.pending', '=', 0)
->where('status_alias.archived', '=', 0);
});
break;
case 'Deployed':
// more sad, horrible workarounds for laravel bugs when doing full text searches
$assets->where('assets.assigned_to', '>', '0');
break;
case 'byod':
// This is kind of redundant, since we already check for byod=1 above, but this keeps the
// sidebar nav links a little less chaotic
$assets->where('assets.byod', '=', '1');
break;
default:
if ((! $request->filled('status_id')) && ($settings->show_archived_in_list != '1')) {
// terrible workaround for complex-query Laravel bug in fulltext
$assets->join('status_labels AS status_alias', function ($join) {
$join->on('status_alias.id', '=', 'assets.status_id')
->where('status_alias.archived', '=', 0);
});
// If there is a status ID, don't take show_archived_in_list into consideration
} else {
$assets->join('status_labels AS status_alias', function ($join) {
$join->on('status_alias.id', '=', 'assets.status_id');
});
}
}
if ((! is_null($filter)) && (count($filter)) > 0) {
$assets->ByFilter($filter);
} elseif ($request->filled('search')) {
$assets->TextSearch($request->input('search'));
}
// This is kinda gross, but we need to do this because the Bootstrap Tables
// API passes custom field ordering as custom_fields.fieldname, and we have to strip
@@ -314,6 +338,7 @@ class AssetsController extends Controller
// in the allowed_columns array)
$column_sort = in_array($sort_override, $allowed_columns) ? $sort_override : 'assets.created_at';
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
switch ($sort_override) {
case 'model':
@@ -351,6 +376,10 @@ class AssetsController extends Controller
}
// Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $assets->count()) ? $assets->count() : app('api_offset_value');
$limit = app('api_limit_value');
$total = $assets->count();
$assets = $assets->skip($offset)->take($limit)->get();
@@ -380,9 +409,8 @@ class AssetsController extends Controller
* @param string $tag
* @since [v4.2.1]
* @author [A. Gianotto] [<snipe@snipe.net>]
* @return \Illuminate\Http\JsonResponse
*/
public function showByTag(Request $request, $tag)
public function showByTag(Request $request, $tag) : JsonResponse | array
{
$this->authorize('index', Asset::class);
$assets = Asset::where('asset_tag', $tag)->with('assetstatus')->with('assignedTo');
@@ -420,7 +448,7 @@ class AssetsController extends Controller
* @since [v4.2.1]
* @return \Illuminate\Http\JsonResponse
*/
public function showBySerial(Request $request, $serial)
public function showBySerial(Request $request, $serial) : JsonResponse | array
{
$this->authorize('index', Asset::class);
$assets = Asset::where('serial', $serial)->with('assetstatus')->with('assignedTo');
@@ -445,21 +473,22 @@ class AssetsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $assetId
* @since [v4.0]
* @return JsonResponse
* @return \Illuminate\Http\JsonResponse
*/
public function show(Request $request, $id)
public function show(Request $request, $id) : JsonResponse | array
{
if ($asset = Asset::with('assetstatus')->with('assignedTo')->withTrashed()
->withCount('checkins as checkins_count', 'checkouts as checkouts_count', 'userRequests as user_requests_count')->findOrFail($id)) {
if ($asset = Asset::with('assetstatus')
->with('assignedTo')->withTrashed()
->withCount('checkins as checkins_count', 'checkouts as checkouts_count', 'userRequests as user_requests_count')->find($id)) {
$this->authorize('view', $asset);
return (new AssetsTransformer)->transformAsset($asset, $request->input('components') );
}
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.does_not_exist')), 200);
}
public function licenses(Request $request, $id)
public function licenses(Request $request, $id) : array
{
$this->authorize('view', Asset::class);
$this->authorize('view', License::class);
@@ -476,12 +505,11 @@ class AssetsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0.16]
* @see \App\Http\Transformers\SelectlistTransformer
*
*/
public function selectlist(Request $request)
public function selectlist(Request $request) : array
{
$assets = Company::scopeCompanyables(Asset::select([
$assets = Asset::select([
'assets.id',
'assets.name',
'assets.asset_tag',
@@ -489,7 +517,7 @@ class AssetsController extends Controller
'assets.assigned_to',
'assets.assigned_type',
'assets.status_id',
])->with('model', 'assetstatus', 'assignedTo')->NotArchived(), 'company_id', 'assets');
])->with('model', 'assetstatus', 'assignedTo')->NotArchived();
if ($request->filled('assetStatusType') && $request->input('assetStatusType') === 'RTD') {
$assets = $assets->RTD();
@@ -532,35 +560,14 @@ class AssetsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param \App\Http\Requests\ImageUploadRequest $request
* @since [v4.0]
* @return JsonResponse
*/
public function store(ImageUploadRequest $request)
public function store(StoreAssetRequest $request): JsonResponse
{
$this->authorize('create', Asset::class);
$asset = new Asset();
$asset->model()->associate(AssetModel::find((int) $request->get('model_id')));
$asset->name = $request->get('name');
$asset->serial = $request->get('serial');
$asset->company_id = Company::getIdForCurrentUser($request->get('company_id'));
$asset->model_id = $request->get('model_id');
$asset->order_number = $request->get('order_number');
$asset->notes = $request->get('notes');
$asset->asset_tag = $request->get('asset_tag', Asset::autoincrement_asset());
$asset->fill($request->validated());
$asset->user_id = Auth::id();
$asset->archived = '0';
$asset->physical = '1';
$asset->depreciate = '0';
$asset->status_id = $request->get('status_id', 0);
$asset->warranty_months = $request->get('warranty_months', null);
$asset->purchase_cost = Helper::ParseCurrency($request->get('purchase_cost')); // this is the API's store method, so I don't know that I want to do this? Confusing. FIXME (or not?!)
$asset->purchase_date = $request->get('purchase_date', null);
$asset->assigned_to = $request->get('assigned_to', null);
$asset->supplier_id = $request->get('supplier_id');
$asset->requestable = $request->get('requestable', 0);
$asset->rtd_location_id = $request->get('rtd_location_id', null);
$asset->location_id = $request->get('rtd_location_id', null);
/**
* this is here just legacy reasons. Api\AssetController
@@ -573,9 +580,11 @@ class AssetsController extends Controller
$asset = $request->handleImages($asset);
// Update custom fields in the database.
// Validation for these fields is handled through the AssetRequest form request
$model = AssetModel::find($request->get('model_id'));
if (($model) && ($model->fieldset)) {
$model = AssetModel::find($request->input('model_id'));
// Check that it's an object and not a collection
// (Sometimes people send arrays here and they shouldn't
if (($model) && ($model instanceof AssetModel) && ($model->fieldset)) {
foreach ($model->fieldset->fields as $field) {
// Set the field value based on what was sent in the request
@@ -583,25 +592,30 @@ class AssetsController extends Controller
// If input value is null, use custom field's default value
if ($field_val == null) {
\Log::debug('Field value for '.$field->db_column.' is null');
Log::debug('Field value for '.$field->db_column.' is null');
$field_val = $field->defaultValue($request->get('model_id'));
\Log::debug('Use the default fieldset value of '.$field->defaultValue($request->get('model_id')));
Log::debug('Use the default fieldset value of '.$field->defaultValue($request->get('model_id')));
}
// if the field is set to encrypted, make sure we encrypt the value
if ($field->field_encrypted == '1') {
\Log::debug('This model field is encrypted in this fieldset.');
Log::debug('This model field is encrypted in this fieldset.');
if (Gate::allows('admin')) {
// If input value is null, use custom field's default value
if (($field_val == null) && ($request->has('model_id') != '')) {
$field_val = \Crypt::encrypt($field->defaultValue($request->get('model_id')));
$field_val = Crypt::encrypt($field->defaultValue($request->get('model_id')));
} else {
$field_val = \Crypt::encrypt($request->input($field->db_column));
$field_val = Crypt::encrypt($request->input($field->db_column));
}
}
}
if ($field->element == 'checkbox') {
if(is_array($field_val)) {
$field_val = implode(',', $field_val);
}
}
$asset->{$field->db_column} = $field_val;
@@ -617,7 +631,7 @@ class AssetsController extends Controller
$target = Location::find(request('assigned_location'));
}
if (isset($target)) {
$asset->checkOut($target, Auth::user(), date('Y-m-d H:i:s'), '', 'Checked out on asset creation', e($request->get('name')));
$asset->checkOut($target, auth()->user(), date('Y-m-d H:i:s'), '', 'Checked out on asset creation', e($request->get('name')));
}
if ($asset->image) {
@@ -625,6 +639,8 @@ class AssetsController extends Controller
}
return response()->json(Helper::formatStandardApiResponse('success', $asset, trans('admin/hardware/message.create.success')));
return response()->json(Helper::formatStandardApiResponse('success', (new AssetsTransformer)->transformAsset($asset), trans('admin/hardware/message.create.success')));
}
return response()->json(Helper::formatStandardApiResponse('error', null, $asset->getErrors()), 200);
@@ -637,9 +653,8 @@ class AssetsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param \App\Http\Requests\ImageUploadRequest $request
* @since [v4.0]
* @return JsonResponse
*/
public function update(ImageUploadRequest $request, $id)
public function update(ImageUploadRequest $request, $id) : JsonResponse
{
$this->authorize('update', Asset::class);
@@ -665,19 +680,30 @@ class AssetsController extends Controller
}
$asset = $request->handleImages($asset);
$model = AssetModel::find($asset->model_id);
// Update custom fields
if (($model = AssetModel::find($asset->model_id)) && (isset($model->fieldset))) {
$problems_updating_encrypted_custom_fields = false;
if (($model) && (isset($model->fieldset))) {
foreach ($model->fieldset->fields as $field) {
$field_val = $request->input($field->db_column, null);
if ($request->has($field->db_column)) {
if ($field->element == 'checkbox') {
if(is_array($field_val)) {
$field_val = implode(',', $field_val);
}
}
if ($field->field_encrypted == '1') {
if (Gate::allows('admin')) {
$asset->{$field->db_column} = \Crypt::encrypt($request->input($field->db_column));
}
$field_val = Crypt::encrypt($field_val);
} else {
$asset->{$field->db_column} = $request->input($field->db_column);
$problems_updating_encrypted_custom_fields = true;
continue;
}
}
$asset->{$field->db_column} = $field_val;
}
}
}
@@ -695,15 +721,19 @@ class AssetsController extends Controller
}
if (isset($target)) {
$asset->checkOut($target, Auth::user(), date('Y-m-d H:i:s'), '', 'Checked out on asset update', e($request->get('name')), $location);
$asset->checkOut($target, auth()->user(), date('Y-m-d H:i:s'), '', 'Checked out on asset update', e($request->get('name')), $location);
}
if ($asset->image) {
$asset->image = $asset->getImageUrl();
}
if ($problems_updating_encrypted_custom_fields) {
return response()->json(Helper::formatStandardApiResponse('success', $asset, trans('admin/hardware/message.update.encrypted_warning')));
} else {
return response()->json(Helper::formatStandardApiResponse('success', $asset, trans('admin/hardware/message.update.success')));
}
}
return response()->json(Helper::formatStandardApiResponse('error', null, $asset->getErrors()), 200);
}
@@ -718,9 +748,8 @@ class AssetsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $assetId
* @since [v4.0]
* @return JsonResponse
*/
public function destroy($id)
public function destroy($id) : JsonResponse
{
$this->authorize('delete', Asset::class);
@@ -747,38 +776,27 @@ class AssetsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $assetId
* @since [v5.1.18]
* @return JsonResponse
*/
public function restore(Request $request, $assetId = null)
public function restore(Request $request, $assetId = null) : JsonResponse
{
// Get asset information
$asset = Asset::withTrashed()->find($assetId);
if ($asset = Asset::withTrashed()->find($assetId)) {
$this->authorize('delete', $asset);
if (isset($asset->id)) {
if ($asset->deleted_at == '') {
$message = 'Asset was not deleted. No data was changed.';
} else {
$message = trans('admin/hardware/message.restore.success');
// Restore the asset
Asset::withTrashed()->where('id', $assetId)->restore();
$logaction = new Actionlog();
$logaction->item_type = Asset::class;
$logaction->item_id = $asset->id;
$logaction->created_at = date("Y-m-d H:i:s");
$logaction->user_id = Auth::user()->id;
$logaction->logaction('restored');
return response()->json(Helper::formatStandardApiResponse('error', trans('general.not_deleted', ['item_type' => trans('general.asset')])), 200);
}
return response()->json(Helper::formatStandardApiResponse('success', (new AssetsTransformer)->transformAsset($asset, $request), $message));
if ($asset->restore()) {
return response()->json(Helper::formatStandardApiResponse('success', trans('admin/hardware/message.restore.success')), 200);
}
// Check validation to make sure we're not restoring an asset with the same asset tag (or unique attribute) as an existing asset
return response()->json(Helper::formatStandardApiResponse('error', trans('general.could_not_restore', ['item_type' => trans('general.asset'), 'error' => $asset->getErrors()->first()])), 200);
}
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.does_not_exist')), 200);
}
/**
@@ -787,9 +805,8 @@ class AssetsController extends Controller
* @author [N. Butler]
* @param string $tag
* @since [v6.0.5]
* @return JsonResponse
*/
public function checkoutByTag(AssetCheckoutRequest $request, $tag)
public function checkoutByTag(AssetCheckoutRequest $request, $tag) : JsonResponse
{
if ($asset = Asset::where('asset_tag', $tag)->first()) {
return $this->checkout($request, $asset->id);
@@ -803,9 +820,8 @@ class AssetsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $assetId
* @since [v4.0]
* @return JsonResponse
*/
public function checkout(AssetCheckoutRequest $request, $asset_id)
public function checkout(AssetCheckoutRequest $request, $asset_id) : JsonResponse
{
$this->authorize('checkout', Asset::class);
$asset = Asset::findOrFail($asset_id);
@@ -822,7 +838,6 @@ class AssetsController extends Controller
'asset_tag' => $asset->asset_tag,
];
// This item is checked out to a location
if (request('checkout_to_type') == 'location') {
$target = Location::find(request('assigned_location'));
@@ -849,13 +864,10 @@ class AssetsController extends Controller
$asset->status_id = $request->get('status_id');
}
if (! isset($target)) {
return response()->json(Helper::formatStandardApiResponse('error', $error_payload, 'Checkout target for asset '.e($asset->asset_tag).' is invalid - '.$error_payload['target_type'].' does not exist.'));
}
$checkout_at = request('checkout_at', date('Y-m-d H:i:s'));
$expected_checkin = request('expected_checkin', null);
$note = request('note', null);
@@ -871,9 +883,7 @@ class AssetsController extends Controller
// $asset->location_id = $target->rtd_location_id;
// }
if ($asset->checkOut($target, Auth::user(), $checkout_at, $expected_checkin, $note, $asset_name, $asset->location_id)) {
if ($asset->checkOut($target, auth()->user(), $checkout_at, $expected_checkin, $note, $asset_name, $asset->location_id)) {
return response()->json(Helper::formatStandardApiResponse('success', ['asset'=> e($asset->asset_tag)], trans('admin/hardware/message.checkout.success')));
}
@@ -887,23 +897,24 @@ class AssetsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $assetId
* @since [v4.0]
* @return JsonResponse
*/
public function checkin(Request $request, $asset_id)
public function checkin(Request $request, $asset_id) : JsonResponse
{
$this->authorize('checkin', Asset::class);
$asset = Asset::findOrFail($asset_id);
$asset = Asset::with('model')->findOrFail($asset_id);
$this->authorize('checkin', $asset);
$target = $asset->assignedTo;
if (is_null($target)) {
return response()->json(Helper::formatStandardApiResponse('error', ['asset'=> e($asset->asset_tag)], trans('admin/hardware/message.checkin.already_checked_in')));
return response()->json(Helper::formatStandardApiResponse('error', [
'asset_tag'=> e($asset->asset_tag),
'model' => e($asset->model->name),
'model_number' => e($asset->model->model_number)
], trans('admin/hardware/message.checkin.already_checked_in')));
}
$asset->expected_checkin = null;
$asset->last_checkout = null;
$asset->assigned_to = null;
//$asset->last_checkout = null;
$asset->last_checkin = now();
$asset->assignedTo()->disassociate($asset);
$asset->accepted = null;
@@ -911,10 +922,16 @@ class AssetsController extends Controller
$asset->name = $request->input('name');
}
$this->migrateLegacyLocations($asset);
$asset->location_id = $asset->rtd_location_id;
if ($request->filled('location_id')) {
$asset->location_id = $request->input('location_id');
if ($request->input('update_default_location')){
$asset->rtd_location_id = $request->input('location_id');
}
}
if ($request->has('status_id')) {
@@ -922,12 +939,37 @@ class AssetsController extends Controller
}
$checkin_at = $request->filled('checkin_at') ? $request->input('checkin_at').' '. date('H:i:s') : date('Y-m-d H:i:s');
$originalValues = $asset->getRawOriginal();
if (($request->filled('checkin_at')) && ($request->get('checkin_at') != date('Y-m-d'))) {
$originalValues['action_date'] = $checkin_at;
}
$asset->licenseseats->each(function (LicenseSeat $seat) {
$seat->update(['assigned_to' => null]);
});
// Get all pending Acceptances for this asset and delete them
CheckoutAcceptance::pending()
->whereHasMorph(
'checkoutable',
[Asset::class],
function (Builder $query) use ($asset) {
$query->where('id', $asset->id);
})
->get()
->map(function ($acceptance) {
$acceptance->delete();
});
if ($asset->save()) {
event(new CheckoutableCheckedIn($asset, $target, Auth::user(), $request->input('note'), $checkin_at));
event(new CheckoutableCheckedIn($asset, $target, auth()->user(), $request->input('note'), $checkin_at, $originalValues));
return response()->json(Helper::formatStandardApiResponse('success', ['asset'=> e($asset->asset_tag)], trans('admin/hardware/message.checkin.success')));
return response()->json(Helper::formatStandardApiResponse('success', [
'asset_tag'=> e($asset->asset_tag),
'model' => e($asset->model->name),
'model_number' => e($asset->model->model_number)
], trans('admin/hardware/message.checkin.success')));
}
return response()->json(Helper::formatStandardApiResponse('error', ['asset'=> e($asset->asset_tag)], trans('admin/hardware/message.checkin.error')));
@@ -938,9 +980,8 @@ class AssetsController extends Controller
*
* @author [A. Janes] [<ajanes@adagiohealth.org>]
* @since [v6.0]
* @return JsonResponse
*/
public function checkinByTag(Request $request, $tag = null)
public function checkinByTag(Request $request, $tag = null) : JsonResponse
{
$this->authorize('checkin', Asset::class);
if(null == $tag && null !== ($request->input('asset_tag'))) {
@@ -964,31 +1005,44 @@ class AssetsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $id
* @since [v4.0]
* @return JsonResponse
*/
public function audit(Request $request)
public function audit(Request $request) : JsonResponse
{
$this->authorize('audit', Asset::class);
$rules = [
'asset_tag' => 'required',
'location_id' => 'exists:locations,id|nullable|numeric',
'next_audit_date' => 'date|nullable',
];
$validator = Validator::make($request->all(), $rules);
if ($validator->fails()) {
return response()->json(Helper::formatStandardApiResponse('error', null, $validator->errors()->all()));
}
$settings = Setting::getSettings();
$dt = Carbon::now()->addMonths($settings->audit_interval)->toDateString();
// No tag passed - return an error
if (!$request->filled('asset_tag')) {
return response()->json(Helper::formatStandardApiResponse('error', [
'asset_tag'=> '',
'error'=> trans('admin/hardware/message.no_tag'),
], trans('admin/hardware/message.no_tag')), 200);
}
$asset = Asset::where('asset_tag', '=', $request->input('asset_tag'))->first();
if ($asset) {
// We don't want to log this as a normal update, so let's bypass that
/**
* Even though we do a save() further down, we don't want to log this as a "normal" asset update,
* which would trigger the Asset Observer and would log an asset *update* log entry (because the
* de-normed fields like next_audit_date on the asset itself will change on save()) *in addition* to
* the audit log entry we're creating through this controller.
*
* To prevent this double-logging (one for update and one for audit), we skip the observer and bypass
* that de-normed update log entry by using unsetEventDispatcher(), BUT invoking unsetEventDispatcher()
* will bypass normal model-level validation that's usually handled at the observer )
*
* We handle validation on the save() by checking if the asset is valid via the ->isValid() method,
* which manually invokes Watson Validating to make sure the asset's model is valid.
*
* @see \App\Observers\AssetObserver::updating()
*/
$asset->unsetEventDispatcher();
$asset->next_audit_date = $dt;
@@ -1004,8 +1058,12 @@ class AssetsController extends Controller
$asset->last_audit_date = date('Y-m-d H:i:s');
if ($asset->save()) {
$log = $asset->logAudit(request('note'), request('location_id'));
/**
* Invoke Watson Validating to check the asset itself and check to make sure it saved correctly.
* We have to invoke this manually because of the unsetEventDispatcher() above.)
*/
if ($asset->isValid() && $asset->save()) {
$asset->logAudit(request('note'), request('location_id'));
return response()->json(Helper::formatStandardApiResponse('success', [
'asset_tag'=> e($asset->asset_tag),
@@ -1013,9 +1071,23 @@ class AssetsController extends Controller
'next_audit_date' => Helper::getFormattedDateObject($asset->next_audit_date),
], trans('admin/hardware/message.audit.success')));
}
// Asset failed validation or was not able to be saved
return response()->json(Helper::formatStandardApiResponse('error', [
'asset_tag'=> e($asset->asset_tag),
'error'=> $asset->getErrors()->first(),
], trans('admin/hardware/message.audit.error', ['error' => $asset->getErrors()->first()])), 200);
}
return response()->json(Helper::formatStandardApiResponse('error', ['asset_tag'=> e($request->input('asset_tag'))], 'Asset with tag '.e($request->input('asset_tag')).' not found'));
// No matching asset for the asset tag that was passed.
return response()->json(Helper::formatStandardApiResponse('error', [
'asset_tag'=> e($request->input('asset_tag')),
'error'=> trans('admin/hardware/message.audit.error'),
], trans('admin/hardware/message.audit.error', ['error' => trans('admin/hardware/message.does_not_exist')])), 200);
}
@@ -1025,23 +1097,52 @@ class AssetsController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @return JsonResponse
*/
public function requestable(Request $request)
public function requestable(Request $request) : JsonResponse | array
{
$this->authorize('viewRequestable', Asset::class);
$assets = Company::scopeCompanyables(Asset::select('assets.*'), 'company_id', 'assets')
->with('location', 'assetstatus', 'assetlog', 'company', 'defaultLoc','assignedTo',
'model.category', 'model.manufacturer', 'model.fieldset', 'supplier')->requestableAssets();
$allowed_columns = [
'name',
'asset_tag',
'serial',
'model_number',
'image',
'purchase_cost',
'expected_checkin',
];
$all_custom_fields = CustomField::all(); //used as a 'cache' of custom fields throughout this page load
foreach ($all_custom_fields as $field) {
$allowed_columns[] = $field->db_column_name();
}
$assets = Asset::select('assets.*')
->with('location', 'assetstatus', 'assetlog', 'company','assignedTo',
'model.category', 'model.manufacturer', 'model.fieldset', 'supplier', 'requests');
$offset = request('offset', 0);
$limit = $request->input('limit', 50);
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
if ($request->filled('search')) {
$assets->TextSearch($request->input('search'));
}
// Search custom fields by column name
foreach ($all_custom_fields as $field) {
if ($request->filled($field->db_column_name())) {
$assets->where($field->db_column_name(), '=', $request->input($field->db_column_name()));
}
}
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
$sort_override = str_replace('custom_fields.', '', $request->input('sort'));
// This handles all the pivot sorting (versus the assets.* fields
// in the allowed_columns array)
$column_sort = in_array($sort_override, $allowed_columns) ? $sort_override : 'assets.created_at';
switch ($request->input('sort')) {
case 'model':
$assets->OrderModels($order);
@@ -1049,17 +1150,20 @@ class AssetsController extends Controller
case 'model_number':
$assets->OrderModelNumber($order);
break;
case 'category':
$assets->OrderCategory($order);
break;
case 'manufacturer':
$assets->OrderManufacturer($order);
case 'location':
$assets->OrderLocation($order);
break;
default:
$assets->orderBy('assets.created_at', $order);
$assets->orderBy($column_sort, $order);
break;
}
$assets->requestableAssets();
// Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $assets->count()) ? $assets->count() : app('api_offset_value');
$limit = app('api_limit_value');
$total = $assets->count();
$assets = $assets->skip($offset)->take($limit)->get();

View File

@@ -4,24 +4,39 @@ namespace App\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Http\Transformers\CategoriesTransformer;
use App\Http\Transformers\SelectlistTransformer;
use App\Models\Category;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use App\Http\Requests\ImageUploadRequest;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;
use Illuminate\Pagination\LengthAwarePaginator;
use App\Models\Traits\ApiResponder;
use App\Http\Serializers\BootstrapTablesSerializer;
use League\Fractal\Resource\Item;
use League\Fractal\Resource\Collection;
use League\Fractal\Serializer\DataArraySerializer;
use League\Fractal\Serializer\ArraySerializer;
use App\Http\Transformers\CategoriesTransformer;
use League\Fractal\Manager;
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use Spatie\Fractalistic\Fractal;
use function Illuminate\Events\queueable;
class CategoriesController extends Controller
{
use ApiResponder;
/**
* Display a listing of the resource.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
public function index(Request $request) : array
{
$this->authorize('view', Category::class);
$allowed_columns = [
@@ -67,8 +82,6 @@ class CategoriesController extends Controller
$categories = $categories->withCount('showableAssets as assets_count');
}
if ($request->filled('search')) {
$categories = $categories->TextSearch($request->input('search'));
}
@@ -93,23 +106,20 @@ class CategoriesController extends Controller
$categories->where('checkin_email', '=', $request->input('checkin_email'));
}
// Set the offset to the API call's offset, unless the offset is higher than the actual count of items in which
// case we override with the actual count, so we should return 0 items.
$offset = (($categories) && ($request->get('offset') > $categories->count())) ? $categories->count() : $request->get('offset', 0);
// Check to make sure the limit is not higher than the max allowed
((config('app.max_results') >= $request->input('limit')) && ($request->filled('limit'))) ? $limit = $request->input('limit') : $limit = config('app.max_results');
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
$sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'assets_count';
$categories->orderBy($sort, $order);
$total = $categories->count();
$categories = $categories->skip($offset)->take($limit)->get();
$paginator = $categories->paginate(app('page_number'));
$total_results = $paginator->total();
$results = $paginator->getCollection();
return (new CategoriesTransformer)->transformCategories($categories, $total);
return Fractal::create()
->collection($results, new CategoriesTransformer())
->serializeWith(new BootstrapTablesSerializer())
->addMeta(['total' => $total_results])
->paginateWith(new IlluminatePaginatorAdapter($paginator))
->toArray();
}
@@ -122,7 +132,7 @@ class CategoriesController extends Controller
* @param \App\Http\Requests\ImageUploadRequest $request
* @return \Illuminate\Http\Response
*/
public function store(ImageUploadRequest $request)
public function store(ImageUploadRequest $request) : JsonResponse
{
$this->authorize('create', Category::class);
$category = new Category;
@@ -143,13 +153,13 @@ class CategoriesController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
public function show($id) : array
{
$this->authorize('view', Category::class);
$category = Category::withCount('assets as assets_count', 'accessories as accessories_count', 'consumables as consumables_count', 'components as components_count', 'licenses as licenses_count')->findOrFail($id);
return (new CategoriesTransformer)->transformCategory($category);
$transformer = $category->first()->transformer;
return $this->transformData($category, $transformer);
}
@@ -163,7 +173,7 @@ class CategoriesController extends Controller
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(ImageUploadRequest $request, $id)
public function update(ImageUploadRequest $request, $id) : JsonResponse
{
$this->authorize('update', Category::class);
$category = Category::findOrFail($id);
@@ -171,7 +181,7 @@ class CategoriesController extends Controller
// Don't allow the user to change the category_type once it's been created
if (($request->filled('category_type')) && ($category->category_type != $request->input('category_type'))) {
return response()->json(
Helper::formatStandardApiResponse('error', null, trans('admin/categories/message.update.cannot_change_category_type'))
Helper::formatStandardApiResponse('error', null, ['category_type' => trans('admin/categories/message.update.cannot_change_category_type')], 422)
);
}
$category->fill($request->all());
@@ -192,7 +202,7 @@ class CategoriesController extends Controller
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
public function destroy($id) : JsonResponse
{
$this->authorize('delete', Category::class);
$category = Category::withCount('assets as assets_count', 'accessories as accessories_count', 'consumables as consumables_count', 'components as components_count', 'licenses as licenses_count')->findOrFail($id);
@@ -215,7 +225,7 @@ class CategoriesController extends Controller
* @since [v4.0.16]
* @see \App\Http\Transformers\SelectlistTransformer
*/
public function selectlist(Request $request, $category_type = 'asset')
public function selectlist(Request $request, $category_type = 'asset') : array
{
$this->authorize('view.selectlists');
$categories = Category::select([

View File

@@ -10,6 +10,7 @@ use App\Models\Company;
use Illuminate\Http\Request;
use App\Http\Requests\ImageUploadRequest;
use Illuminate\Support\Facades\Storage;
use Illuminate\Http\JsonResponse;
class CompaniesController extends Controller
{
@@ -18,15 +19,17 @@ class CompaniesController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
public function index(Request $request) : JsonResponse | array
{
$this->authorize('view', Company::class);
$allowed_columns = [
'id',
'name',
'phone',
'fax',
'email',
'created_at',
'updated_at',
'users_count',
@@ -37,7 +40,9 @@ class CompaniesController extends Controller
'components_count',
];
$companies = Company::withCount('assets as assets_count', 'licenses as licenses_count', 'accessories as accessories_count', 'consumables as consumables_count', 'components as components_count', 'users as users_count');
$companies = Company::withCount(['assets as assets_count' => function ($query) {
$query->AssetsForShow();
}])->withCount('licenses as licenses_count', 'accessories as accessories_count', 'consumables as consumables_count', 'components as components_count', 'users as users_count');
if ($request->filled('search')) {
$companies->TextSearch($request->input('search'));
@@ -47,13 +52,15 @@ class CompaniesController extends Controller
$companies->where('name', '=', $request->input('name'));
}
if ($request->filled('email')) {
$companies->where('email', '=', $request->input('email'));
}
// Set the offset to the API call's offset, unless the offset is higher than the actual count of items in which
// case we override with the actual count, so we should return 0 items.
$offset = (($companies) && ($request->get('offset') > $companies->count())) ? $companies->count() : $request->get('offset', 0);
// Check to make sure the limit is not higher than the max allowed
((config('app.max_results') >= $request->input('limit')) && ($request->filled('limit'))) ? $limit = $request->input('limit') : $limit = config('app.max_results');
// Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $companies->count()) ? $companies->count() : app('api_offset_value');
$limit = app('api_limit_value');
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
$sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at';
@@ -72,9 +79,8 @@ class CompaniesController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param \App\Http\Requests\ImageUploadRequest $request
* @return \Illuminate\Http\Response
*/
public function store(ImageUploadRequest $request)
public function store(ImageUploadRequest $request) : JsonResponse
{
$this->authorize('create', Company::class);
$company = new Company;
@@ -95,9 +101,8 @@ class CompaniesController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
public function show($id) : array
{
$this->authorize('view', Company::class);
$company = Company::findOrFail($id);
@@ -113,9 +118,8 @@ class CompaniesController extends Controller
* @since [v4.0]
* @param \App\Http\Requests\ImageUploadRequest $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(ImageUploadRequest $request, $id)
public function update(ImageUploadRequest $request, $id) : JsonResponse
{
$this->authorize('update', Company::class);
$company = Company::findOrFail($id);
@@ -137,9 +141,8 @@ class CompaniesController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
public function destroy($id) : JsonResponse
{
$this->authorize('delete', Company::class);
$company = Company::findOrFail($id);
@@ -162,12 +165,13 @@ class CompaniesController extends Controller
* @since [v4.0.16]
* @see \App\Http\Transformers\SelectlistTransformer
*/
public function selectlist(Request $request)
public function selectlist(Request $request) : array
{
$this->authorize('view.selectlists');
$companies = Company::select([
'companies.id',
'companies.name',
'companies.email',
'companies.image',
]);

View File

@@ -5,14 +5,17 @@ namespace App\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Http\Transformers\ComponentsTransformer;
use App\Models\Company;
use App\Models\Component;
use Illuminate\Http\Request;
use App\Http\Requests\ImageUploadRequest;
use App\Events\CheckoutableCheckedIn;
use App\Events\ComponentCheckedIn;
use App\Models\Asset;
use Illuminate\Support\Facades\Validator;
use Illuminate\Database\Query\Builder;
use Illuminate\Support\Facades\Log;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
class ComponentsController extends Controller
{
@@ -22,9 +25,8 @@ class ComponentsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
*
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
public function index(Request $request) : JsonResponse | array
{
$this->authorize('view', Component::class);
@@ -44,9 +46,8 @@ class ComponentsController extends Controller
'notes',
];
$components = Company::scopeCompanyables(Component::select('components.*')
->with('company', 'location', 'category', 'assets'));
$components = Component::select('components.*')
->with('company', 'location', 'category', 'assets', 'supplier');
if ($request->filled('search')) {
$components = $components->TextSearch($request->input('search'));
@@ -64,6 +65,10 @@ class ComponentsController extends Controller
$components->where('category_id', '=', $request->input('category_id'));
}
if ($request->filled('supplier_id')) {
$components->where('supplier_id', '=', $request->input('supplier_id'));
}
if ($request->filled('location_id')) {
$components->where('location_id', '=', $request->input('location_id'));
}
@@ -72,13 +77,9 @@ class ComponentsController extends Controller
$components->where('notes','=',$request->input('notes'));
}
// Set the offset to the API call's offset, unless the offset is higher than the actual count of items in which
// case we override with the actual count, so we should return 0 items.
$offset = (($components) && ($request->get('offset') > $components->count())) ? $components->count() : $request->get('offset', 0);
// Check to make sure the limit is not higher than the max allowed
((config('app.max_results') >= $request->input('limit')) && ($request->filled('limit'))) ? $limit = $request->input('limit') : $limit = config('app.max_results');
// Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $components->count()) ? $components->count() : app('api_offset_value');
$limit = app('api_limit_value');
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
$sort_override = $request->input('sort');
@@ -94,6 +95,9 @@ class ComponentsController extends Controller
case 'company':
$components = $components->OrderCompany($order);
break;
case 'supplier':
$components = $components->OrderSupplier($order);
break;
default:
$components = $components->orderBy($column_sort, $order);
break;
@@ -112,9 +116,8 @@ class ComponentsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param \App\Http\Requests\ImageUploadRequest $request
* @return \Illuminate\Http\Response
*/
public function store(ImageUploadRequest $request)
public function store(ImageUploadRequest $request) : JsonResponse
{
$this->authorize('create', Component::class);
$component = new Component;
@@ -133,9 +136,8 @@ class ComponentsController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
public function show($id) : array
{
$this->authorize('view', Component::class);
$component = Component::findOrFail($id);
@@ -152,9 +154,8 @@ class ComponentsController extends Controller
* @since [v4.0]
* @param \App\Http\Requests\ImageUploadRequest $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(ImageUploadRequest $request, $id)
public function update(ImageUploadRequest $request, $id) : JsonResponse
{
$this->authorize('update', Component::class);
$component = Component::findOrFail($id);
@@ -175,9 +176,8 @@ class ComponentsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
public function destroy($id) : JsonResponse
{
$this->authorize('delete', Component::class);
$component = Component::findOrFail($id);
@@ -194,19 +194,35 @@ class ComponentsController extends Controller
* @since [v4.0]
* @param Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function getAssets(Request $request, $id)
public function getAssets(Request $request, $id) : array
{
$this->authorize('view', \App\Models\Asset::class);
$component = Component::findOrFail($id);
$assets = $component->assets();
$offset = request('offset', 0);
$limit = $request->input('limit', 50);
if ($request->filled('search')) {
$assets = $component->assets()
->where(function ($query) use ($request) {
$search_str = '%' . $request->input('search') . '%';
$query->where('name', 'like', $search_str)
->orWhereIn('model_id', function (Builder $query) use ($request) {
$search_str = '%' . $request->input('search') . '%';
$query->selectRaw('id')->from('models')->where('name', 'like', $search_str);
})
->orWhere('asset_tag', 'like', $search_str);
})
->get();
$total = $assets->count();
} else {
$assets = $component->assets();
$total = $assets->count();
$assets = $assets->skip($offset)->take($limit)->get();
}
return (new ComponentsTransformer)->transformCheckedoutComponents($assets, $total);
}
@@ -220,10 +236,8 @@ class ComponentsController extends Controller
* @since [v5.1.8]
* @param Request $request
* @param int $componentId
* @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function checkout(Request $request, $componentId)
public function checkout(Request $request, $componentId) : JsonResponse
{
// Check if the component exists
if (!$component = Component::find($componentId)) {
@@ -233,7 +247,7 @@ class ComponentsController extends Controller
$this->authorize('checkout', $component);
$validator = Validator::make($request->all(), [
'asset_id' => 'required|exists:assets,id',
'assigned_to' => 'required|exists:assets,id',
'assigned_qty' => "required|numeric|min:1|digits_between:1,".$component->numRemaining(),
]);
@@ -243,7 +257,7 @@ class ComponentsController extends Controller
}
// Make sure there is at least one available to checkout
if ($component->numRemaining() <= $request->get('assigned_qty')) {
if ($component->numRemaining() < $request->get('assigned_qty')) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/components/message.checkout.unavailable', ['remaining' => $component->numRemaining(), 'requested' => $request->get('assigned_qty')])));
}
@@ -254,9 +268,9 @@ class ComponentsController extends Controller
$component->assets()->attach($component->id, [
'component_id' => $component->id,
'created_at' => \Carbon::now(),
'created_at' => Carbon::now(),
'assigned_qty' => $request->get('assigned_qty', 1),
'user_id' => \Auth::id(),
'user_id' => auth()->id(),
'asset_id' => $request->get('assigned_to'),
'note' => $request->get('note'),
]);
@@ -276,12 +290,10 @@ class ComponentsController extends Controller
* @since [v5.1.8]
* @param Request $request
* @param $component_asset_id
* @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function checkin(Request $request, $component_asset_id)
public function checkin(Request $request, $component_asset_id) : JsonResponse
{
if ($component_assets = \DB::table('components_assets')->find($component_asset_id)) {
if ($component_assets = DB::table('components_assets')->find($component_asset_id)) {
if (is_null($component = Component::find($component_assets->component_id))) {
@@ -294,7 +306,7 @@ class ComponentsController extends Controller
if ($max_to_checkin > 1) {
$validator = \Validator::make($request->all(), [
$validator = Validator::make($request->all(), [
"checkin_qty" => "required|numeric|between:1,$max_to_checkin"
]);
@@ -311,21 +323,21 @@ class ComponentsController extends Controller
// actually checked out.
$component_assets->assigned_qty = $qty_remaining_in_checkout;
\Log::debug($component_asset_id.' - '.$qty_remaining_in_checkout.' remaining in record '.$component_assets->id);
Log::debug($component_asset_id.' - '.$qty_remaining_in_checkout.' remaining in record '.$component_assets->id);
\DB::table('components_assets')->where('id',
DB::table('components_assets')->where('id',
$component_asset_id)->update(['assigned_qty' => $qty_remaining_in_checkout]);
// If the checked-in qty is exactly the same as the assigned_qty,
// we can simply delete the associated components_assets record
if ($qty_remaining_in_checkout == 0) {
\DB::table('components_assets')->where('id', '=', $component_asset_id)->delete();
DB::table('components_assets')->where('id', '=', $component_asset_id)->delete();
}
$asset = Asset::find($component_assets->asset_id);
event(new CheckoutableCheckedIn($component, $asset, \Auth::user(), $request->input('note'), \Carbon::now()));
event(new CheckoutableCheckedIn($component, $asset, auth()->user(), $request->input('note'), Carbon::now()));
return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/components/message.checkin.success')));

View File

@@ -2,8 +2,10 @@
namespace App\Http\Controllers\Api;
use App\Events\CheckoutableCheckedOut;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Http\Requests\StoreConsumableRequest;
use App\Http\Transformers\ConsumablesTransformer;
use App\Http\Transformers\SelectlistTransformer;
use App\Models\Company;
@@ -11,6 +13,8 @@ use App\Models\Consumable;
use App\Models\User;
use Illuminate\Http\Request;
use App\Http\Requests\ImageUploadRequest;
use Illuminate\Support\Facades\Log;
use Illuminate\Http\JsonResponse;
class ConsumablesController extends Controller
{
@@ -19,37 +23,13 @@ class ConsumablesController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
*
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
public function index(Request $request) : array
{
$this->authorize('index', Consumable::class);
// This array is what determines which fields should be allowed to be sorted on ON the table itself, no relations
// Relations will be handled in query scopes a little further down.
$allowed_columns =
[
'id',
'name',
'order_number',
'min_amt',
'purchase_date',
'purchase_cost',
'company',
'category',
'model_number',
'item_no',
'qty',
'image',
'notes',
];
$consumables = Company::scopeCompanyables(
Consumable::select('consumables.*')
->with('company', 'location', 'category', 'users', 'manufacturer')
);
$consumables = Consumable::with('company', 'location', 'category', 'supplier', 'manufacturer')
->withCount('users as consumables_users_count');
if ($request->filled('search')) {
$consumables = $consumables->TextSearch(e($request->input('search')));
@@ -75,6 +55,10 @@ class ConsumablesController extends Controller
$consumables->where('manufacturer_id', '=', $request->input('manufacturer_id'));
}
if ($request->filled('supplier_id')) {
$consumables->where('supplier_id', '=', $request->input('supplier_id'));
}
if ($request->filled('location_id')) {
$consumables->where('location_id','=',$request->input('location_id'));
}
@@ -84,21 +68,12 @@ class ConsumablesController extends Controller
}
// Set the offset to the API call's offset, unless the offset is higher than the actual count of items in which
// case we override with the actual count, so we should return 0 items.
$offset = (($consumables) && ($request->get('offset') > $consumables->count())) ? $consumables->count() : $request->get('offset', 0);
// Check to make sure the limit is not higher than the max allowed
((config('app.max_results') >= $request->input('limit')) && ($request->filled('limit'))) ? $limit = $request->input('limit') : $limit = config('app.max_results');
$allowed_columns = ['id', 'name', 'order_number', 'min_amt', 'purchase_date', 'purchase_cost', 'company', 'category', 'model_number', 'item_no', 'manufacturer', 'location', 'qty', 'image'];
// Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $consumables->count()) ? $consumables->count() : app('api_offset_value');
$limit = app('api_limit_value');
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
$sort_override = $request->input('sort');
$column_sort = in_array($sort_override, $allowed_columns) ? $sort_override : 'created_at';
switch ($sort_override) {
switch ($request->input('sort')) {
case 'category':
$consumables = $consumables->OrderCategory($order);
break;
@@ -111,8 +86,31 @@ class ConsumablesController extends Controller
case 'company':
$consumables = $consumables->OrderCompany($order);
break;
case 'supplier':
$consumables = $consumables->OrderSupplier($order);
break;
default:
$consumables = $consumables->orderBy($column_sort, $order);
// This array is what determines which fields should be allowed to be sorted on ON the table itself.
// These must match a column on the consumables table directly.
$allowed_columns = [
'id',
'name',
'order_number',
'min_amt',
'purchase_date',
'purchase_cost',
'company',
'category',
'model_number',
'item_no',
'manufacturer',
'location',
'qty',
'image'
];
$sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at';
$consumables = $consumables->orderBy($sort, $order);
break;
}
@@ -128,9 +126,8 @@ class ConsumablesController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param \App\Http\Requests\ImageUploadRequest $request
* @return \Illuminate\Http\Response
*/
public function store(ImageUploadRequest $request)
public function store(StoreConsumableRequest $request) : JsonResponse
{
$this->authorize('create', Consumable::class);
$consumable = new Consumable;
@@ -149,9 +146,8 @@ class ConsumablesController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
public function show($id) : array
{
$this->authorize('view', Consumable::class);
$consumable = Consumable::with('users')->findOrFail($id);
@@ -166,9 +162,8 @@ class ConsumablesController extends Controller
* @since [v4.0]
* @param \App\Http\Requests\ImageUploadRequest $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(ImageUploadRequest $request, $id)
public function update(StoreConsumableRequest $request, $id) : JsonResponse
{
$this->authorize('update', Consumable::class);
$consumable = Consumable::findOrFail($id);
@@ -188,9 +183,8 @@ class ConsumablesController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
public function destroy($id) : JsonResponse
{
$this->authorize('delete', Consumable::class);
$consumable = Consumable::findOrFail($id);
@@ -207,9 +201,8 @@ class ConsumablesController extends Controller
* @see \App\Http\Controllers\Consumables\ConsumablesController::getView() method that returns the form.
* @since [v1.0]
* @param int $consumableId
* @return array
*/
public function getDataView($consumableId)
public function getDataView($consumableId) : array
{
$consumable = Consumable::with(['consumableAssignments'=> function ($query) {
$query->orderBy($query->getModel()->getTable().'.created_at', 'DESC');
@@ -248,9 +241,8 @@ class ConsumablesController extends Controller
* @author [A. Gutierrez] [<andres@baller.tv>]
* @param int $id
* @since [v4.9.5]
* @return JsonResponse
*/
public function checkout(Request $request, $id)
public function checkout(Request $request, $id) : JsonResponse
{
// Check if the consumable exists
if (!$consumable = Consumable::with('users')->find($id)) {
@@ -262,14 +254,18 @@ class ConsumablesController extends Controller
// Make sure there is at least one available to checkout
if ($consumable->numRemaining() <= 0) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/consumables/message.checkout.unavailable')));
\Log::debug('No enough remaining');
}
// Make sure there is a valid category
if (!$consumable->category){
return response()->json(Helper::formatStandardApiResponse('error', null, trans('general.invalid_item_category_single', ['type' => trans('general.consumable')])));
}
// Check if the user exists - @TODO: this should probably be handled via validation, not here??
if (!$user = User::find($request->input('assigned_to'))) {
// Return error message
return response()->json(Helper::formatStandardApiResponse('error', null, 'No user found'));
\Log::debug('No valid user');
}
// Update the consumable data
@@ -284,15 +280,7 @@ class ConsumablesController extends Controller
]
);
// Log checkout event
$logaction = $consumable->logCheckout($request->input('note'), $user);
$data['log_id'] = $logaction->id;
$data['eula'] = $consumable->getEula();
$data['first_name'] = $user->first_name;
$data['item_name'] = $consumable->name;
$data['checkout_date'] = $logaction->created_at;
$data['note'] = $logaction->note;
$data['require_acceptance'] = $consumable->requireAcceptance();
event(new CheckoutableCheckedOut($consumable, $user, auth()->user(), $request->input('note')));
return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/consumables/message.checkout.success')));
@@ -303,7 +291,7 @@ class ConsumablesController extends Controller
*
* @see \App\Http\Transformers\SelectlistTransformer
*/
public function selectlist(Request $request)
public function selectlist(Request $request) : array
{
$consumables = Consumable::select([
'consumables.id',

View File

@@ -8,7 +8,8 @@ use App\Http\Transformers\CustomFieldsTransformer;
use App\Models\CustomField;
use App\Models\CustomFieldset;
use Illuminate\Http\Request;
use Validator;
use Illuminate\Support\Facades\Validator;
use Illuminate\Http\JsonResponse;
class CustomFieldsController extends Controller
{
@@ -20,7 +21,7 @@ class CustomFieldsController extends Controller
* @since [v3.0]
* @return array
*/
public function index()
public function index() : array
{
$this->authorize('index', CustomField::class);
$fields = CustomField::get();
@@ -33,9 +34,8 @@ class CustomFieldsController extends Controller
* @author [V. Cordes] [<volker@fdatek.de>]
* @param int $id
* @since [v4.1.10]
* @return View
*/
public function show($id)
public function show($id) : JsonResponse | array
{
$this->authorize('view', CustomField::class);
if ($field = CustomField::find($id)) {
@@ -52,9 +52,8 @@ class CustomFieldsController extends Controller
* @since [v4.1.10]
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
public function update(Request $request, $id) : JsonResponse
{
$this->authorize('update', CustomField::class);
$field = CustomField::findOrFail($id);
@@ -86,9 +85,8 @@ class CustomFieldsController extends Controller
* @author [V. Cordes] [<volker@fdatek.de>]
* @since [v4.1.10]
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
public function store(Request $request) : JsonResponse
{
$this->authorize('create', CustomField::class);
$field = new CustomField;
@@ -136,7 +134,7 @@ class CustomFieldsController extends Controller
return $fieldset->fields()->sync($fields);
}
public function associate(Request $request, $field_id)
public function associate(Request $request, $field_id) : JsonResponse
{
$this->authorize('update', CustomFieldset::class);
@@ -155,10 +153,9 @@ class CustomFieldsController extends Controller
return response()->json(Helper::formatStandardApiResponse('success', $fieldset, trans('admin/custom_fields/message.fieldset.update.success')));
}
public function disassociate(Request $request, $field_id)
public function disassociate(Request $request, $field_id) : JsonResponse
{
$this->authorize('update', CustomFieldset::class);
$field = CustomField::findOrFail($field_id);
$fieldset_id = $request->input('fieldset_id');
@@ -179,9 +176,8 @@ class CustomFieldsController extends Controller
*
* @author [Brady Wetherington] [<uberbrady@gmail.com>]
* @since [v1.8]
* @return Redirect
*/
public function destroy($field_id)
public function destroy($field_id) : JsonResponse
{
$field = CustomField::findOrFail($field_id);

View File

@@ -7,9 +7,9 @@ use App\Http\Controllers\Controller;
use App\Http\Transformers\CustomFieldsetsTransformer;
use App\Http\Transformers\CustomFieldsTransformer;
use App\Models\CustomFieldset;
use App\Models\CustomField;
use Illuminate\Http\Request;
use Redirect;
use View;
use Illuminate\Http\JsonResponse;
/**
* This controller handles all actions related to Custom Asset Fieldsets for
@@ -29,9 +29,8 @@ class CustomFieldsetsController extends Controller
* @author [Josh Gibson]
* @param int $id
* @since [v1.8]
* @return View
*/
public function index()
public function index() : array
{
$this->authorize('index', CustomField::class);
$fieldsets = CustomFieldset::withCount('fields as fields_count', 'models as models_count')->get();
@@ -45,9 +44,8 @@ class CustomFieldsetsController extends Controller
* @author [Josh Gibson]
* @param int $id
* @since [v1.8]
* @return View
*/
public function show($id)
public function show($id) : JsonResponse | array
{
$this->authorize('view', CustomField::class);
if ($fieldset = CustomFieldset::find($id)) {
@@ -64,9 +62,8 @@ class CustomFieldsetsController extends Controller
* @since [v4.0]
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
public function update(Request $request, $id) : JsonResponse
{
$this->authorize('update', CustomField::class);
$fieldset = CustomFieldset::findOrFail($id);
@@ -85,15 +82,26 @@ class CustomFieldsetsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
public function store(Request $request) : JsonResponse
{
$this->authorize('create', CustomField::class);
$fieldset = new CustomFieldset;
$fieldset->fill($request->all());
if ($fieldset->save()) {
// Sync fieldset with auto_add_to_fieldsets
$fields = CustomField::select('id')->where('auto_add_to_fieldsets', '=', '1')->get();
if ($fields->count() > 0) {
foreach ($fields as $field) {
$field_ids[] = $field->id;
}
$fieldset->fields()->sync($field_ids);
}
return response()->json(Helper::formatStandardApiResponse('success', $fieldset, trans('admin/custom_fields/message.fieldset.create.success')));
}
@@ -105,9 +113,8 @@ class CustomFieldsetsController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @return Redirect
*/
public function destroy($id)
public function destroy($id) : JsonResponse
{
$this->authorize('delete', CustomField::class);
$fieldset = CustomFieldset::findOrFail($id);
@@ -134,7 +141,7 @@ class CustomFieldsetsController extends Controller
* @param $fieldsetId
* @return string JSON
*/
public function fields($id)
public function fields($id) : array
{
$this->authorize('view', CustomField::class);
$set = CustomFieldset::findOrFail($id);
@@ -151,14 +158,11 @@ class CustomFieldsetsController extends Controller
* @param $fieldsetId
* @return string JSON
*/
public function fieldsWithDefaultValues($fieldsetId, $modelId)
public function fieldsWithDefaultValues($fieldsetId, $modelId) : array
{
$this->authorize('view', CustomField::class);
$set = CustomFieldset::findOrFail($fieldsetId);
$fields = $set->fields;
return (new CustomFieldsTransformer)->transformCustomFieldsWithDefaultValues($fields, $modelId, $fields->count());
}
}

View File

@@ -6,12 +6,11 @@ use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Http\Transformers\DepartmentsTransformer;
use App\Http\Transformers\SelectlistTransformer;
use App\Models\Company;
use App\Models\Department;
use Auth;
use Illuminate\Http\Request;
use App\Http\Requests\ImageUploadRequest;
use Illuminate\Support\Facades\Storage;
use Illuminate\Http\JsonResponse;
class DepartmentsController extends Controller
{
@@ -20,23 +19,24 @@ class DepartmentsController extends Controller
*
* @author [Godfrey Martinez] [<snipe@snipe.net>]
* @since [v4.0]
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
public function index(Request $request) : JsonResponse | array
{
$this->authorize('view', Department::class);
$allowed_columns = ['id', 'name', 'image', 'users_count'];
$departments = Company::scopeCompanyables(Department::select(
$departments = Department::select(
'departments.id',
'departments.name',
'departments.phone',
'departments.fax',
'departments.location_id',
'departments.company_id',
'departments.manager_id',
'departments.created_at',
'departments.updated_at',
'departments.image'),
"company_id", "departments")->with('users')->with('location')->with('manager')->with('company')->withCount('users as users_count');
'departments.image'
)->with('users')->with('location')->with('manager')->with('company')->withCount('users as users_count');
if ($request->filled('search')) {
$departments = $departments->TextSearch($request->input('search'));
@@ -58,12 +58,9 @@ class DepartmentsController extends Controller
$departments->where('location_id', '=', $request->input('location_id'));
}
// Set the offset to the API call's offset, unless the offset is higher than the actual count of items in which
// case we override with the actual count, so we should return 0 items.
$offset = (($departments) && ($request->get('offset') > $departments->count())) ? $departments->count() : $request->get('offset', 0);
// Check to make sure the limit is not higher than the max allowed
((config('app.max_results') >= $request->input('limit')) && ($request->filled('limit'))) ? $limit = $request->input('limit') : $limit = config('app.max_results');
// Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $departments->count()) ? $departments->count() : app('api_offset_value');
$limit = app('api_limit_value');
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
$sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at';
@@ -92,16 +89,15 @@ class DepartmentsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param \App\Http\Requests\ImageUploadRequest $request
* @return \Illuminate\Http\Response
*/
public function store(ImageUploadRequest $request)
public function store(ImageUploadRequest $request) : JsonResponse
{
$this->authorize('create', Department::class);
$department = new Department;
$department->fill($request->all());
$department = $request->handleImages($department);
$department->user_id = Auth::user()->id;
$department->user_id = auth()->id();
$department->manager_id = ($request->filled('manager_id') ? $request->input('manager_id') : null);
if ($department->save()) {
@@ -117,13 +113,11 @@ class DepartmentsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
public function show($id) : array
{
$this->authorize('view', Department::class);
$department = Department::findOrFail($id);
return (new DepartmentsTransformer)->transformDepartment($department);
}
@@ -134,9 +128,8 @@ class DepartmentsController extends Controller
* @since [v5.0]
* @param \App\Http\Requests\ImageUploadRequest $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(ImageUploadRequest $request, $id)
public function update(ImageUploadRequest $request, $id) : JsonResponse
{
$this->authorize('update', Department::class);
$department = Department::findOrFail($id);
@@ -157,9 +150,8 @@ class DepartmentsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $locationId
* @since [v4.0]
* @return \Illuminate\Http\RedirectResponse
*/
public function destroy($id)
public function destroy($id) : JsonResponse
{
$department = Department::findOrFail($id);
@@ -181,7 +173,7 @@ class DepartmentsController extends Controller
* @since [v4.0.16]
* @see \App\Http\Transformers\SelectlistTransformer
*/
public function selectlist(Request $request)
public function selectlist(Request $request) : array
{
$this->authorize('view.selectlists');

View File

@@ -7,6 +7,7 @@ use App\Http\Controllers\Controller;
use App\Http\Transformers\DepreciationsTransformer;
use App\Models\Depreciation;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
class DepreciationsController extends Controller
{
@@ -15,9 +16,8 @@ class DepreciationsController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
public function index(Request $request) : JsonResponse | array
{
$this->authorize('view', Depreciation::class);
$allowed_columns = ['id','name','months','depreciation_min','created_at'];
@@ -28,12 +28,9 @@ class DepreciationsController extends Controller
$depreciations = $depreciations->TextSearch($request->input('search'));
}
// Set the offset to the API call's offset, unless the offset is higher than the actual count of items in which
// case we override with the actual count, so we should return 0 items.
$offset = (($depreciations) && ($request->get('offset') > $depreciations->count())) ? $depreciations->count() : $request->get('offset', 0);
// Check to make sure the limit is not higher than the max allowed
((config('app.max_results') >= $request->input('limit')) && ($request->filled('limit'))) ? $limit = $request->input('limit') : $limit = config('app.max_results');
// Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $depreciations->count()) ? $depreciations->count() : app('api_offset_value');
$limit = app('api_limit_value');
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
$sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at';
@@ -51,9 +48,8 @@ class DepreciationsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
public function store(Request $request) : JsonResponse
{
$this->authorize('create', Depreciation::class);
$depreciation = new Depreciation;
@@ -72,9 +68,8 @@ class DepreciationsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
public function show($id) : JsonResponse | array
{
$this->authorize('view', Depreciation::class);
$depreciation = Depreciation::findOrFail($id);
@@ -89,9 +84,8 @@ class DepreciationsController extends Controller
* @since [v4.0]
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
public function update(Request $request, $id) : JsonResponse
{
$this->authorize('update', Depreciation::class);
$depreciation = Depreciation::findOrFail($id);
@@ -110,9 +104,8 @@ class DepreciationsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
public function destroy($id) : JsonResponse
{
$this->authorize('delete', Depreciation::class);
$depreciation = Depreciation::withCount('models as models_count')->findOrFail($id);

View File

@@ -7,6 +7,7 @@ use App\Http\Controllers\Controller;
use App\Http\Transformers\GroupsTransformer;
use App\Models\Group;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
class GroupsController extends Controller
@@ -16,16 +17,15 @@ class GroupsController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
public function index(Request $request) : JsonResponse | array
{
$this->authorize('superadmin');
$this->authorize('view', Group::class);
$allowed_columns = ['id', 'name', 'created_at', 'users_count'];
$groups = Group::select('id', 'name', 'permissions', 'created_at', 'updated_at')->withCount('users as users_count');
$groups = Group::select('id', 'name', 'permissions', 'created_at', 'updated_at', 'created_by')->with('admin')->withCount('users as users_count');
if ($request->filled('search')) {
$groups = $groups->TextSearch($request->input('search'));
@@ -35,12 +35,9 @@ class GroupsController extends Controller
$groups->where('name', '=', $request->input('name'));
}
// Set the offset to the API call's offset, unless the offset is higher than the actual count of items in which
// case we override with the actual count, so we should return 0 items.
$offset = (($groups) && ($request->get('offset') > $groups->count())) ? $groups->count() : $request->get('offset', 0);
// Check to make sure the limit is not higher than the max allowed
((config('app.max_results') >= $request->input('limit')) && ($request->filled('limit'))) ? $limit = $request->input('limit') : $limit = config('app.max_results');
// Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $groups->count()) ? $groups->count() : app('api_offset_value');
$limit = app('api_limit_value');
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
$sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at';
@@ -58,18 +55,21 @@ class GroupsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
public function store(Request $request) : JsonResponse
{
$this->authorize('superadmin');
$group = new Group;
// Get all the available permissions
$permissions = config('permissions');
$groupPermissions = Helper::selectedPermissionsArray($permissions, $permissions);
$group->name = $request->input('name');
$group->permissions = $request->input('permissions'); // Todo - some JSON validation stuff here
$group->created_by = auth()->id();
$group->permissions = json_encode($request->input('permissions', $groupPermissions));
if ($group->save()) {
return response()->json(Helper::formatStandardApiResponse('success', $group, trans('admin/groups/message.create.success')));
return response()->json(Helper::formatStandardApiResponse('success', (new GroupsTransformer)->transformGroup($group), trans('admin/groups/message.success.create')));
}
return response()->json(Helper::formatStandardApiResponse('error', null, $group->getErrors()));
@@ -81,13 +81,11 @@ class GroupsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
public function show($id) : array
{
$this->authorize('superadmin');
$group = Group::findOrFail($id);
return (new GroupsTransformer)->transformGroup($group);
}
@@ -98,9 +96,8 @@ class GroupsController extends Controller
* @since [v4.0]
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
public function update(Request $request, $id) : JsonResponse
{
$this->authorize('superadmin');
$group = Group::findOrFail($id);
@@ -109,7 +106,7 @@ class GroupsController extends Controller
$group->permissions = $request->input('permissions'); // Todo - some JSON validation stuff here
if ($group->save()) {
return response()->json(Helper::formatStandardApiResponse('success', $group, trans('admin/groups/message.update.success')));
return response()->json(Helper::formatStandardApiResponse('success', (new GroupsTransformer)->transformGroup($group), trans('admin/groups/message.success.update')));
}
return response()->json(Helper::formatStandardApiResponse('error', null, $group->getErrors()));
@@ -121,9 +118,8 @@ class GroupsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
public function destroy($id) : JsonResponse
{
$this->authorize('superadmin');
$group = Group::findOrFail($id);

View File

@@ -9,22 +9,23 @@ use App\Http\Transformers\ImportsTransformer;
use App\Models\Asset;
use App\Models\Company;
use App\Models\Import;
use Artisan;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Database\Eloquent\JsonEncodingException;
use Illuminate\Support\Facades\Request;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Storage;
use League\Csv\Reader;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Illuminate\Support\Facades\Log;
use Illuminate\Http\JsonResponse;
class ImportController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
public function index() : JsonResponse | array
{
$this->authorize('import');
$imports = Import::latest()->get();
@@ -36,9 +37,8 @@ class ImportController extends Controller
* Process and store a CSV upload file.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function store()
public function store() : JsonResponse
{
$this->authorize('import');
if (! config('app.lock_passwords')) {
@@ -151,18 +151,17 @@ class ImportController extends Controller
* Processes the specified Import.
*
* @param int $import_id
* @return \Illuminate\Http\Response
*/
public function process(ItemImportRequest $request, $import_id)
public function process(ItemImportRequest $request, $import_id) : JsonResponse
{
$this->authorize('import');
// Run a backup immediately before processing
if ($request->get('run-backup')) {
\Log::debug('Backup manually requested via importer');
Artisan::call('backup:run');
Log::debug('Backup manually requested via importer');
Artisan::call('snipeit:backup', ['--filename' => 'pre-import-backup-'.date('Y-m-d-H:i:s')]);
} else {
\Log::debug('NO BACKUP requested via importer');
Log::debug('NO BACKUP requested via importer');
}
$import = Import::find($import_id);
@@ -193,6 +192,9 @@ class ImportController extends Controller
case 'user':
$redirectTo = 'users.index';
break;
case 'location':
$redirectTo = 'locations.index';
break;
}
if ($errors) { //Failure
@@ -208,9 +210,8 @@ class ImportController extends Controller
* Remove the specified resource from storage.
*
* @param int $import_id
* @return \Illuminate\Http\Response
*/
public function destroy($import_id)
public function destroy($import_id) : JsonResponse
{
$this->authorize('create', Asset::class);
@@ -227,6 +228,8 @@ class ImportController extends Controller
return response()->json(Helper::formatStandardApiResponse('warning', null, trans('admin/hardware/message.import.file_not_deleted_warning')));
}
}
}
return response()->json(Helper::formatStandardApiResponse('warning', null, trans('admin/hardware/message.import.file_not_deleted_warning')));
}
}

View File

@@ -0,0 +1,69 @@
<?php
namespace App\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Http\Transformers\LabelsTransformer;
use App\Models\Labels\Label;
use Illuminate\Http\Request;
use Illuminate\Support\ItemNotFoundException;
use Illuminate\Http\JsonResponse;
class LabelsController extends Controller
{
/**
* Returns JSON listing of all labels.
*
* @author Grant Le Roux <grant.leroux+snipe-it@gmail.com>
*/
public function index(Request $request) : JsonResponse | array
{
$this->authorize('view', Label::class);
$labels = Label::find();
if ($request->filled('search')) {
$search = $request->get('search');
$labels = $labels->filter(function ($label, $index) use ($search) {
return stripos($label->getName(), $search) !== false;
});
}
$total = $labels->count();
$offset = $request->get('offset', 0);
$offset = ($offset > $total) ? $total : $offset;
$maxLimit = config('app.max_results');
$limit = $request->get('limit', $maxLimit);
$limit = ($limit > $maxLimit) ? $maxLimit : $limit;
$labels = $labels->skip($offset)->take($limit);
return (new LabelsTransformer)->transformLabels($labels, $total, $request);
}
/**
* Returns JSON with information about a label for detail view.
*
* @author Grant Le Roux <grant.leroux+snipe-it@gmail.com>
* @param string $labelName
*/
public function show(string $labelName) : JsonResponse | array
{
$labelName = str_replace('/', '\\', $labelName);
try {
$label = Label::find($labelName);
} catch(ItemNotFoundException $e) {
return response()
->json(
Helper::formatStandardApiResponse('error', null, trans('admin/labels/message.does_not_exist')),
404
);
}
$this->authorize('view', $label);
return (new LabelsTransformer)->transformLabel($label);
}
}

View File

@@ -9,7 +9,7 @@ use App\Models\Asset;
use App\Models\License;
use App\Models\LicenseSeat;
use App\Models\User;
use Auth;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class LicenseSeatsController extends Controller
@@ -19,11 +19,10 @@ class LicenseSeatsController extends Controller
*
* @param \Illuminate\Http\Request $request
* @param int $licenseId
* @return \Illuminate\Http\Response
*/
public function index(Request $request, $licenseId)
public function index(Request $request, $licenseId) : JsonResponse | array
{
//
if ($license = License::find($licenseId)) {
$this->authorize('view', $license);
@@ -39,8 +38,15 @@ class LicenseSeatsController extends Controller
}
$total = $seats->count();
$offset = (($seats) && (request('offset') >= $total)) ? 0 : request('offset', 0);
$limit = request('limit', 50);
// Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $seats->count()) ? $seats->count() : app('api_offset_value');
if ($offset >= $total ){
$offset = 0;
}
$limit = app('api_limit_value');
$seats = $seats->skip($offset)->take($limit)->get();
@@ -57,11 +63,10 @@ class LicenseSeatsController extends Controller
*
* @param int $licenseId
* @param int $seatId
* @return \Illuminate\Http\Response
*/
public function show($licenseId, $seatId)
public function show($licenseId, $seatId) : JsonResponse | array
{
//
$this->authorize('view', License::class);
// sanity checks:
// 1. does the license seat exist?
@@ -82,19 +87,18 @@ class LicenseSeatsController extends Controller
* @param \Illuminate\Http\Request $request
* @param int $licenseId
* @param int $seatId
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $licenseId, $seatId)
public function update(Request $request, $licenseId, $seatId) : JsonResponse | array
{
$this->authorize('checkout', License::class);
// sanity checks:
// 1. does the license seat exist?
if (! $licenseSeat = LicenseSeat::find($seatId)) {
return response()->json(Helper::formatStandardApiResponse('error', null, 'Seat not found'));
}
// 2. does the seat belong to the specified license?
if (! $license = $licenseSeat->license()->first() || $license->id != intval($licenseId)) {
$license = $licenseSeat->license()->first();
if (!$license || $license->id != intval($licenseId)) {
return response()->json(Helper::formatStandardApiResponse('error', null, 'Seat does not belong to the specified license'));
}
@@ -103,7 +107,7 @@ class LicenseSeatsController extends Controller
// attempt to update the license seat
$licenseSeat->fill($request->all());
$licenseSeat->user_id = Auth::user()->id;
$licenseSeat->user_id = auth()->id();
// check if this update is a checkin operation
// 1. are relevant fields touched at all?

View File

@@ -4,14 +4,12 @@ namespace App\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Http\Transformers\LicenseSeatsTransformer;
use App\Http\Transformers\LicensesTransformer;
use App\Http\Transformers\SelectlistTransformer;
use App\Models\Company;
use App\Models\License;
use App\Models\LicenseSeat;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\JsonResponse;
class LicensesController extends Controller
{
@@ -21,13 +19,12 @@ class LicensesController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
*
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
public function index(Request $request) : JsonResponse | array
{
$this->authorize('view', License::class);
$licenses = Company::scopeCompanyables(License::with('company', 'manufacturer', 'supplier','category')->withCount('freeSeats as free_seats_count'));
$licenses = License::with('company', 'manufacturer', 'supplier','category')->withCount('freeSeats as free_seats_count');
if ($request->filled('company_id')) {
$licenses->where('company_id', '=', $request->input('company_id'));
@@ -94,12 +91,9 @@ class LicensesController extends Controller
$licenses->onlyTrashed();
}
// Set the offset to the API call's offset, unless the offset is higher than the actual count of items in which
// case we override with the actual count, so we should return 0 items.
$offset = (($licenses) && ($request->get('offset') > $licenses->count())) ? $licenses->count() : $request->get('offset', 0);
// Check to make sure the limit is not higher than the max allowed
((config('app.max_results') >= $request->input('limit')) && ($request->filled('limit'))) ? $limit = $request->input('limit') : $limit = config('app.max_results');
// Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $licenses->count()) ? $licenses->count() : app('api_offset_value');
$limit = app('api_limit_value');
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
@@ -139,6 +133,7 @@ class LicensesController extends Controller
'seats',
'termination_date',
'depreciation_id',
'min_amt',
];
$sort = in_array($request->input('sort'), $allowed_columns) ? e($request->input('sort')) : 'created_at';
$licenses = $licenses->orderBy($sort, $order);
@@ -158,11 +153,9 @@ class LicensesController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
public function store(Request $request) : JsonResponse
{
//
$this->authorize('create', License::class);
$license = new License;
$license->fill($request->all());
@@ -179,9 +172,8 @@ class LicensesController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
public function show($id) : JsonResponse | array
{
$this->authorize('view', License::class);
$license = License::withCount('freeSeats')->findOrFail($id);
@@ -197,9 +189,8 @@ class LicensesController extends Controller
* @since [v4.0]
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
public function update(Request $request, $id) : JsonResponse | array
{
//
$this->authorize('update', License::class);
@@ -220,9 +211,8 @@ class LicensesController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
public function destroy($id) : JsonResponse
{
//
$license = License::findOrFail($id);
@@ -250,7 +240,7 @@ class LicensesController extends Controller
*
* @see \App\Http\Transformers\SelectlistTransformer
*/
public function selectlist(Request $request)
public function selectlist(Request $request) : array
{
$licenses = License::select([
'licenses.id',

View File

@@ -11,6 +11,7 @@ use App\Models\Location;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;
use Illuminate\Http\JsonResponse;
class LocationsController extends Controller
{
@@ -21,13 +22,31 @@ class LocationsController extends Controller
* @since [v4.0]
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
public function index(Request $request) : JsonResponse | array
{
$this->authorize('view', Location::class);
$allowed_columns = [
'id', 'name', 'address', 'address2', 'city', 'state', 'country', 'zip', 'created_at',
'updated_at', 'manager_id', 'image',
'assigned_assets_count', 'users_count', 'assets_count','assigned_assets_count', 'assets_count', 'rtd_assets_count', 'currency', 'ldap_ou', ];
'id',
'name',
'address',
'address2',
'city',
'state',
'country',
'zip',
'created_at',
'updated_at',
'manager_id',
'image',
'assigned_assets_count',
'users_count',
'assets_count',
'assigned_assets_count',
'assets_count',
'rtd_assets_count',
'currency',
'ldap_ou',
];
$locations = Location::with('parent', 'manager', 'children')->select([
'locations.id',
@@ -37,6 +56,8 @@ class LocationsController extends Controller
'locations.city',
'locations.state',
'locations.zip',
'locations.phone',
'locations.fax',
'locations.country',
'locations.parent_id',
'locations.manager_id',
@@ -48,6 +69,7 @@ class LocationsController extends Controller
])->withCount('assignedAssets as assigned_assets_count')
->withCount('assets as assets_count')
->withCount('rtd_assets as rtd_assets_count')
->withCount('children as children_count')
->withCount('users as users_count');
if ($request->filled('search')) {
@@ -78,14 +100,19 @@ class LocationsController extends Controller
$locations->where('locations.country', '=', $request->input('country'));
}
$offset = (($locations) && (request('offset') > $locations->count())) ? $locations->count() : request('offset', 0);
if ($request->filled('manager_id')) {
$locations->where('locations.manager_id', '=', $request->input('manager_id'));
}
// Check to make sure the limit is not higher than the max allowed
((config('app.max_results') >= $request->input('limit')) && ($request->filled('limit'))) ? $limit = $request->input('limit') : $limit = config('app.max_results');
// Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $locations->count()) ? $locations->count() : app('api_offset_value');
$limit = app('api_limit_value');
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
$sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at';
switch ($request->input('sort')) {
case 'parent':
$locations->OrderParent($order);
@@ -112,9 +139,8 @@ class LocationsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param \App\Http\Requests\ImageUploadRequest $request
* @return \Illuminate\Http\Response
*/
public function store(ImageUploadRequest $request)
public function store(ImageUploadRequest $request) : JsonResponse
{
$this->authorize('create', Location::class);
$location = new Location;
@@ -134,9 +160,8 @@ class LocationsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
public function show($id) : JsonResponse | array
{
$this->authorize('view', Location::class);
$location = Location::with('parent', 'manager', 'children')
@@ -173,9 +198,8 @@ class LocationsController extends Controller
* @since [v4.0]
* @param \App\Http\Requests\ImageUploadRequest $request
* @param int $id
* @return \Illuminate\Http\JsonResponse
*/
public function update(ImageUploadRequest $request, $id)
public function update(ImageUploadRequest $request, $id) : JsonResponse
{
$this->authorize('update', Location::class);
$location = Location::findOrFail($id);
@@ -204,15 +228,20 @@ class LocationsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
public function destroy($id) : JsonResponse
{
$this->authorize('delete', Location::class);
$location = Location::findOrFail($id);
$location = Location::withCount('assignedAssets as assigned_assets_count')
->withCount('assets as assets_count')
->withCount('rtd_assets as rtd_assets_count')
->withCount('children as children_count')
->withCount('users as users_count')
->findOrFail($id);
if (! $location->isDeletable()) {
return response()
->json(Helper::formatStandardApiResponse('error', null, trans('admin/companies/message.assoc_users')));
->json(Helper::formatStandardApiResponse('error', null, trans('admin/locations/message.assoc_users')));
}
$this->authorize('delete', $location);
$location->delete();
@@ -248,10 +277,14 @@ class LocationsController extends Controller
* @since [v4.0.16]
* @see \App\Http\Transformers\SelectlistTransformer
*/
public function selectlist(Request $request)
public function selectlist(Request $request) : array
{
$this->authorize('view.selectlists');
// If a user is in the process of editing their profile, as determined by the referrer,
// then we check that they have permission to edit their own location.
// Otherwise, we do our normal check that they can view select lists.
$request->headers->get('referer') === route('profile')
? $this->authorize('self.edit_location')
: $this->authorize('view.selectlists');
$locations = Location::select([
'locations.id',
@@ -289,7 +322,6 @@ class LocationsController extends Controller
$paginated_results = new LengthAwarePaginator($locations_formatted->forPage($page, 500), $locations_formatted->count(), 500, $page, []);
//return [];
return (new SelectlistTransformer)->transformSelectlist($paginated_results);
}
}

View File

@@ -6,10 +6,12 @@ use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Http\Transformers\ManufacturersTransformer;
use App\Http\Transformers\SelectlistTransformer;
use App\Models\Actionlog;
use App\Models\Manufacturer;
use Illuminate\Http\Request;
use App\Http\Requests\ImageUploadRequest;
use Illuminate\Support\Facades\Storage;
use Illuminate\Http\JsonResponse;
class ManufacturersController extends Controller
{
@@ -20,13 +22,13 @@ class ManufacturersController extends Controller
* @since [v4.0]
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
public function index(Request $request) : JsonResponse | array
{
$this->authorize('view', Manufacturer::class);
$allowed_columns = ['id', 'name', 'url', 'support_url', 'support_email', 'support_phone', 'created_at', 'updated_at', 'image', 'assets_count', 'consumables_count', 'components_count', 'licenses_count'];
$allowed_columns = ['id', 'name', 'url', 'support_url', 'support_email', 'warranty_lookup_url', 'support_phone', 'created_at', 'updated_at', 'image', 'assets_count', 'consumables_count', 'components_count', 'licenses_count'];
$manufacturers = Manufacturer::select(
['id', 'name', 'url', 'support_url', 'support_email', 'support_phone', 'created_at', 'updated_at', 'image', 'deleted_at']
['id', 'name', 'url', 'support_url', 'warranty_lookup_url', 'support_email', 'support_phone', 'created_at', 'updated_at', 'image', 'deleted_at']
)->withCount('assets as assets_count')->withCount('licenses as licenses_count')->withCount('consumables as consumables_count')->withCount('accessories as accessories_count');
if ($request->input('deleted') == 'true') {
@@ -49,6 +51,10 @@ class ManufacturersController extends Controller
$manufacturers->where('support_url', '=', $request->input('support_url'));
}
if ($request->filled('warranty_lookup_url')) {
$manufacturers->where('warranty_lookup_url', '=', $request->input('warranty_lookup_url'));
}
if ($request->filled('support_phone')) {
$manufacturers->where('support_phone', '=', $request->input('support_phone'));
}
@@ -57,12 +63,9 @@ class ManufacturersController extends Controller
$manufacturers->where('support_email', '=', $request->input('support_email'));
}
// Set the offset to the API call's offset, unless the offset is higher than the actual count of items in which
// case we override with the actual count, so we should return 0 items.
$offset = (($manufacturers) && ($request->get('offset') > $manufacturers->count())) ? $manufacturers->count() : $request->get('offset', 0);
// Check to make sure the limit is not higher than the max allowed
((config('app.max_results') >= $request->input('limit')) && ($request->filled('limit'))) ? $limit = $request->input('limit') : $limit = config('app.max_results');
// Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $manufacturers->count()) ? $manufacturers->count() : app('api_offset_value');
$limit = app('api_limit_value');
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
$sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at';
@@ -80,9 +83,8 @@ class ManufacturersController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param \App\Http\Requests\ImageUploadRequest $request
* @return \Illuminate\Http\Response
*/
public function store(ImageUploadRequest $request)
public function store(ImageUploadRequest $request) : JsonResponse
{
$this->authorize('create', Manufacturer::class);
$manufacturer = new Manufacturer;
@@ -102,9 +104,8 @@ class ManufacturersController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
public function show($id) : JsonResponse | array
{
$this->authorize('view', Manufacturer::class);
$manufacturer = Manufacturer::withCount('assets as assets_count')->withCount('licenses as licenses_count')->withCount('consumables as consumables_count')->withCount('accessories as accessories_count')->findOrFail($id);
@@ -119,9 +120,8 @@ class ManufacturersController extends Controller
* @since [v4.0]
* @param \App\Http\Requests\ImageUploadRequest $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(ImageUploadRequest $request, $id)
public function update(ImageUploadRequest $request, $id) : JsonResponse
{
$this->authorize('update', Manufacturer::class);
$manufacturer = Manufacturer::findOrFail($id);
@@ -141,9 +141,8 @@ class ManufacturersController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
public function destroy($id) : JsonResponse
{
$this->authorize('delete', Manufacturer::class);
$manufacturer = Manufacturer::findOrFail($id);
@@ -158,6 +157,43 @@ class ManufacturersController extends Controller
}
/**
* Restore a given Manufacturer (mark as un-deleted)
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v6.3.4]
* @param int $id
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function restore($id) : JsonResponse
{
$this->authorize('delete', Manufacturer::class);
if ($manufacturer = Manufacturer::withTrashed()->find($id)) {
if ($manufacturer->deleted_at == '') {
return response()->json(Helper::formatStandardApiResponse('error', trans('general.not_deleted', ['item_type' => trans('general.manufacturer')])), 200);
}
if ($manufacturer->restore()) {
$logaction = new Actionlog();
$logaction->item_type = Manufacturer::class;
$logaction->item_id = $manufacturer->id;
$logaction->created_at = date('Y-m-d H:i:s');
$logaction->user_id = auth()->id();
$logaction->logaction('restore');
return response()->json(Helper::formatStandardApiResponse('success', trans('admin/manufacturers/message.restore.success')), 200);
}
// Check validation to make sure we're not restoring an item with the same unique attributes as a non-deleted one
return response()->json(Helper::formatStandardApiResponse('error', trans('general.could_not_restore', ['item_type' => trans('general.manufacturer'), 'error' => $manufacturer->getErrors()->first()])), 200);
}
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/manufacturers/message.does_not_exist')));
}
/**
* Gets a paginated collection for the select2 menus
*
@@ -165,7 +201,7 @@ class ManufacturersController extends Controller
* @since [v4.0.16]
* @see \App\Http\Transformers\SelectlistTransformer
*/
public function selectlist(Request $request)
public function selectlist(Request $request) : array
{
$this->authorize('view.selectlists');

View File

@@ -7,6 +7,8 @@ use App\Http\Controllers\Controller;
use App\Http\Transformers\PredefinedKitsTransformer;
use App\Models\PredefinedKit;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use App\Http\Transformers\SelectlistTransformer;
/**
* @author [D. Minaev.] [<dmitriy.minaev.v@gmail.com>]
@@ -18,7 +20,7 @@ class PredefinedKitsController extends Controller
*
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
public function index(Request $request) : JsonResponse | array
{
$this->authorize('view', PredefinedKit::class);
$allowed_columns = ['id', 'name'];
@@ -29,8 +31,10 @@ class PredefinedKitsController extends Controller
$kits = $kits->TextSearch($request->input('search'));
}
$offset = $request->input('offset', 0);
$limit = $request->input('limit', 50);
// Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $kits->count()) ? $kits->count() : app('api_offset_value');
$limit = app('api_limit_value');
$order = $request->input('order') === 'desc' ? 'desc' : 'asc';
$sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'name';
$kits->orderBy($sort, $order);
@@ -45,9 +49,8 @@ class PredefinedKitsController extends Controller
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
public function store(Request $request) : JsonResponse
{
$this->authorize('create', PredefinedKit::class);
$kit = new PredefinedKit;
@@ -64,9 +67,8 @@ class PredefinedKitsController extends Controller
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
public function show($id) : array
{
$this->authorize('view', PredefinedKit::class);
$kit = PredefinedKit::findOrFail($id);
@@ -79,9 +81,8 @@ class PredefinedKitsController extends Controller
*
* @param \Illuminate\Http\Request $request
* @param int $id kit id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
public function update(Request $request, $id) : JsonResponse
{
$this->authorize('update', PredefinedKit::class);
$kit = PredefinedKit::findOrFail($id);
@@ -98,9 +99,8 @@ class PredefinedKitsController extends Controller
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
public function destroy($id) : JsonResponse
{
$this->authorize('delete', PredefinedKit::class);
$kit = PredefinedKit::findOrFail($id);
@@ -121,7 +121,7 @@ class PredefinedKitsController extends Controller
*
* @see \App\Http\Transformers\SelectlistTransformer
*/
public function selectlist(Request $request)
public function selectlist(Request $request) : array
{
$kits = PredefinedKit::select([
'id',
@@ -143,7 +143,7 @@ class PredefinedKitsController extends Controller
* @param int $id
* @return \Illuminate\Http\Response
*/
public function indexLicenses($kit_id)
public function indexLicenses($kit_id) : array
{
$this->authorize('view', PredefinedKit::class);
$kit = PredefinedKit::findOrFail($kit_id);
@@ -158,7 +158,7 @@ class PredefinedKitsController extends Controller
* @param int $id
* @return \Illuminate\Http\Response
*/
public function storeLicense(Request $request, $kit_id)
public function storeLicense(Request $request, $kit_id) : JsonResponse
{
$this->authorize('update', PredefinedKit::class);
@@ -184,9 +184,8 @@ class PredefinedKitsController extends Controller
*
* @param \Illuminate\Http\Request $request
* @param int $kit_id
* @return \Illuminate\Http\Response
*/
public function updateLicense(Request $request, $kit_id, $license_id)
public function updateLicense(Request $request, $kit_id, $license_id) : JsonResponse
{
$this->authorize('update', PredefinedKit::class);
$kit = PredefinedKit::findOrFail($kit_id);
@@ -203,9 +202,8 @@ class PredefinedKitsController extends Controller
* Remove the specified resource from storage.
*
* @param int $kit_id
* @return \Illuminate\Http\Response
*/
public function detachLicense($kit_id, $license_id)
public function detachLicense($kit_id, $license_id) : JsonResponse
{
$this->authorize('update', PredefinedKit::class);
$kit = PredefinedKit::findOrFail($kit_id);
@@ -219,9 +217,8 @@ class PredefinedKitsController extends Controller
* Display the specified resource.
*
* @param int $kit_id
* @return \Illuminate\Http\Response
*/
public function indexModels($kit_id)
public function indexModels($kit_id) : array
{
$this->authorize('view', PredefinedKit::class);
$kit = PredefinedKit::findOrFail($kit_id);
@@ -234,9 +231,8 @@ class PredefinedKitsController extends Controller
* Store the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function storeModel(Request $request, $kit_id)
public function storeModel(Request $request, $kit_id) : JsonResponse
{
$this->authorize('update', PredefinedKit::class);
@@ -262,9 +258,8 @@ class PredefinedKitsController extends Controller
*
* @param \Illuminate\Http\Request $request
* @param int $kit_id
* @return \Illuminate\Http\Response
*/
public function updateModel(Request $request, $kit_id, $model_id)
public function updateModel(Request $request, $kit_id, $model_id) : JsonResponse
{
$this->authorize('update', PredefinedKit::class);
$kit = PredefinedKit::findOrFail($kit_id);
@@ -281,9 +276,8 @@ class PredefinedKitsController extends Controller
* Remove the specified resource from storage.
*
* @param int $kit_id
* @return \Illuminate\Http\Response
*/
public function detachModel($kit_id, $model_id)
public function detachModel($kit_id, $model_id) : JsonResponse
{
$this->authorize('update', PredefinedKit::class);
$kit = PredefinedKit::findOrFail($kit_id);
@@ -297,9 +291,8 @@ class PredefinedKitsController extends Controller
* Display the specified resource.
*
* @param int $kit_id
* @return \Illuminate\Http\Response
*/
public function indexConsumables($kit_id)
public function indexConsumables($kit_id) : array
{
$this->authorize('view', PredefinedKit::class);
$kit = PredefinedKit::findOrFail($kit_id);
@@ -312,9 +305,8 @@ class PredefinedKitsController extends Controller
* Store the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function storeConsumable(Request $request, $kit_id)
public function storeConsumable(Request $request, $kit_id) : JsonResponse
{
$this->authorize('update', PredefinedKit::class);
@@ -340,9 +332,8 @@ class PredefinedKitsController extends Controller
*
* @param \Illuminate\Http\Request $request
* @param int $kit_id
* @return \Illuminate\Http\Response
*/
public function updateConsumable(Request $request, $kit_id, $consumable_id)
public function updateConsumable(Request $request, $kit_id, $consumable_id) : JsonResponse
{
$this->authorize('update', PredefinedKit::class);
$kit = PredefinedKit::findOrFail($kit_id);
@@ -359,9 +350,8 @@ class PredefinedKitsController extends Controller
* Remove the specified resource from storage.
*
* @param int $kit_id
* @return \Illuminate\Http\Response
*/
public function detachConsumable($kit_id, $consumable_id)
public function detachConsumable($kit_id, $consumable_id) : JsonResponse
{
$this->authorize('update', PredefinedKit::class);
$kit = PredefinedKit::findOrFail($kit_id);
@@ -375,9 +365,8 @@ class PredefinedKitsController extends Controller
* Display the specified resource.
*
* @param int $kit_id
* @return \Illuminate\Http\Response
*/
public function indexAccessories($kit_id)
public function indexAccessories($kit_id) : array
{
$this->authorize('view', PredefinedKit::class);
$kit = PredefinedKit::findOrFail($kit_id);
@@ -390,9 +379,8 @@ class PredefinedKitsController extends Controller
* Store the specified resource.
*
* @param int $kit_id
* @return \Illuminate\Http\Response
*/
public function storeAccessory(Request $request, $kit_id)
public function storeAccessory(Request $request, $kit_id) : JsonResponse
{
$this->authorize('update', PredefinedKit::class);
@@ -418,9 +406,8 @@ class PredefinedKitsController extends Controller
*
* @param \Illuminate\Http\Request $request
* @param int $kit_id
* @return \Illuminate\Http\Response
*/
public function updateAccessory(Request $request, $kit_id, $accessory_id)
public function updateAccessory(Request $request, $kit_id, $accessory_id) : JsonResponse
{
$this->authorize('update', PredefinedKit::class);
$kit = PredefinedKit::findOrFail($kit_id);
@@ -437,9 +424,8 @@ class PredefinedKitsController extends Controller
* Remove the specified resource from storage.
*
* @param int $kit_id
* @return \Illuminate\Http\Response
*/
public function detachAccessory($kit_id, $accessory_id)
public function detachAccessory($kit_id, $accessory_id) : JsonResponse
{
$this->authorize('update', PredefinedKit::class);
$kit = PredefinedKit::findOrFail($kit_id);

View File

@@ -6,12 +6,13 @@ use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Models\CheckoutRequest;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use Laravel\Passport\TokenRepository;
use Illuminate\Contracts\Validation\Factory as ValidationFactory;
use Illuminate\Support\Facades\Gate;
use DB;
use App\Models\CustomField;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\JsonResponse;
class ProfileController extends Controller
{
@@ -41,21 +42,28 @@ class ProfileController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.3.0]
*
* @return array
*/
public function requestedAssets()
public function requestedAssets() : array
{
$checkoutRequests = CheckoutRequest::where('user_id', '=', Auth::user()->id)->get();
$checkoutRequests = CheckoutRequest::where('user_id', '=', auth()->id())->get();
$results = [];
$results = array();
$show_field = array();
$showable_fields = array();
$results['total'] = $checkoutRequests->count();
$all_custom_fields = CustomField::all(); //used as a 'cache' of custom fields throughout this page load
foreach ($all_custom_fields as $field) {
if (($field->field_encrypted=='0') && ($field->show_in_requestable_list=='1')) {
$showable_fields[] = $field->db_column_name();
}
}
foreach ($checkoutRequests as $checkoutRequest) {
// Make sure the asset and request still exist
if ($checkoutRequest && $checkoutRequest->itemRequested()) {
$results['rows'][] = [
$assets = [
'image' => e($checkoutRequest->itemRequested()->present()->getImageUrl()),
'name' => e($checkoutRequest->itemRequested()->present()->name()),
'type' => e($checkoutRequest->itemType()),
@@ -64,7 +72,16 @@ class ProfileController extends Controller
'expected_checkin' => Helper::getFormattedDateObject($checkoutRequest->itemRequested()->expected_checkin, 'datetime'),
'request_date' => Helper::getFormattedDateObject($checkoutRequest->created_at, 'datetime'),
];
foreach ($showable_fields as $showable_field_name) {
$show_field['custom_fields.'.$showable_field_name] = $checkoutRequest->itemRequested()->{$showable_field_name};
}
// Merge the plain asset data and the custom fields data
$results['rows'][] = array_merge($assets, $show_field);
}
}
return $results;
@@ -76,10 +93,9 @@ class ProfileController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v6.0.5]
*
* @return \Illuminate\Http\Response
*/
public function createApiToken(Request $request) {
public function createApiToken(Request $request) : JsonResponse
{
if (!Gate::allows('self.api')) {
abort(403);
@@ -87,14 +103,14 @@ class ProfileController extends Controller
$accessTokenName = $request->input('name', 'Auth Token');
if ($accessToken = Auth::user()->createToken($accessTokenName)->accessToken) {
if ($accessToken = auth()->user()->createToken($accessTokenName)->accessToken) {
// Get the ID so we can return that with the payload
$token = DB::table('oauth_access_tokens')->where('user_id', '=', Auth::user()->id)->where('name','=',$accessTokenName)->orderBy('created_at', 'desc')->first();
$token = DB::table('oauth_access_tokens')->where('user_id', '=', auth()->id())->where('name','=',$accessTokenName)->orderBy('created_at', 'desc')->first();
$accessTokenData['id'] = $token->id;
$accessTokenData['token'] = $accessToken;
$accessTokenData['name'] = $accessTokenName;
return response()->json(Helper::formatStandardApiResponse('success', $accessTokenData, 'Personal access token '.$accessTokenName.' created successfully'));
return response()->json(Helper::formatStandardApiResponse('success', $accessTokenData, trans('account/general.personal_api_keys_success', ['key' => $accessTokenName])));
}
return response()->json(Helper::formatStandardApiResponse('error', null, 'Token could not be created.'));
@@ -106,17 +122,16 @@ class ProfileController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v6.0.5]
*
* @return \Illuminate\Http\Response
*/
public function deleteApiToken($tokenId) {
public function deleteApiToken($tokenId) : Response
{
if (!Gate::allows('self.api')) {
abort(403);
}
$token = $this->tokenRepository->findForUser(
$tokenId, Auth::user()->getAuthIdentifier()
$tokenId, auth()->user()->getAuthIdentifier()
);
if (is_null($token)) {
@@ -135,16 +150,15 @@ class ProfileController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v6.0.5]
*
* @return \Illuminate\Http\Response
*/
public function showApiTokens(Request $request) {
public function showApiTokens() : JsonResponse
{
if (!Gate::allows('self.api')) {
abort(403);
}
$tokens = $this->tokenRepository->forUser(Auth::user()->getAuthIdentifier());
$tokens = $this->tokenRepository->forUser(auth()->user()->getAuthIdentifier());
$token_values = $tokens->load('client')->filter(function ($token) {
return $token->client->personal_access_client && ! $token->revoked;
})->values();

View File

@@ -6,6 +6,7 @@ use App\Http\Controllers\Controller;
use App\Http\Transformers\ActionlogsTransformer;
use App\Models\Actionlog;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
class ReportsController extends Controller
{
@@ -14,9 +15,8 @@ class ReportsController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @return View
*/
public function index(Request $request)
public function index(Request $request) : JsonResponse | array
{
$this->authorize('reports.view');
@@ -32,14 +32,34 @@ class ReportsController extends Controller
}
if (($request->filled('item_type')) && ($request->filled('item_id'))) {
$actionlogs = $actionlogs->where('item_id', '=', $request->input('item_id'))
->where('item_type', '=', 'App\\Models\\'.ucwords($request->input('item_type')));
$actionlogs = $actionlogs->where(function($query) use ($request)
{
$query->where('item_id', '=', $request->input('item_id'))
->where('item_type', '=', 'App\\Models\\'.ucwords($request->input('item_type')))
->orWhere(function($query) use ($request)
{
$query->where('target_id', '=', $request->input('item_id'))
->where('target_type', '=', 'App\\Models\\'.ucwords($request->input('item_type')));
});
});
}
if ($request->filled('action_type')) {
$actionlogs = $actionlogs->where('action_type', '=', $request->input('action_type'))->orderBy('created_at', 'desc');
}
if ($request->filled('user_id')) {
$actionlogs = $actionlogs->where('user_id', '=', $request->input('user_id'));
}
if ($request->filled('action_source')) {
$actionlogs = $actionlogs->where('action_source', '=', $request->input('action_source'))->orderBy('created_at', 'desc');
}
if ($request->filled('remote_ip')) {
$actionlogs = $actionlogs->where('remote_ip', '=', $request->input('remote_ip'))->orderBy('created_at', 'desc');
}
if ($request->filled('uploads')) {
$actionlogs = $actionlogs->whereNotNull('filename')->orderBy('created_at', 'desc');
}
@@ -52,15 +72,19 @@ class ReportsController extends Controller
'accept_signature',
'action_type',
'note',
'remote_ip',
'user_agent',
'action_source',
];
$total = $actionlogs->count();
// Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $total) ? $total : app('api_offset_value');
$limit = app('api_limit_value');
$sort = in_array($request->input('sort'), $allowed_columns) ? e($request->input('sort')) : 'created_at';
$order = ($request->input('order') == 'asc') ? 'asc' : 'desc';
$offset = request('offset', 0);
$total = $actionlogs->count();
// Check to make sure the limit is not higher than the max allowed
((config('app.max_results') >= $request->input('limit')) && ($request->filled('limit'))) ? $limit = $request->input('limit') : $limit = config('app.max_results');
$actionlogs = $actionlogs->orderBy($sort, $order)->skip($offset)->take($limit)->get();

View File

@@ -9,42 +9,38 @@ use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\Ldap;
use App\Models\Setting;
use Mail;
use App\Notifications\SlackTest;
use App\Notifications\MailTest;
use GuzzleHttp\Client;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Notification;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;
use App\Http\Requests\SlackSettingsRequest;
use App\Http\Transformers\LoginAttemptsTransformer;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
class SettingsController extends Controller
{
public function ldaptest()
public function ldaptest() : JsonResponse
{
$settings = Setting::getSettings();
if ($settings->ldap_enabled!='1') {
\Log::debug('LDAP is not enabled cannot test.');
Log::debug('LDAP is not enabled cannot test.');
return response()->json(['message' => 'LDAP is not enabled, cannot test.'], 400);
}
\Log::debug('Preparing to test LDAP connection');
Log::debug('Preparing to test LDAP connection');
$message = []; //where we collect together test messages
try {
$connection = Ldap::connectToLdap();
try {
$message['bind'] = ['message' => 'Successfully bound to LDAP server.'];
\Log::debug('attempting to bind to LDAP for LDAP test');
Log::debug('attempting to bind to LDAP for LDAP test');
Ldap::bindAdminToLdap($connection);
$message['login'] = [
'message' => 'Successfully connected to LDAP server.',
@@ -75,24 +71,24 @@ class SettingsController extends Controller
return response()->json($message, 200);
} catch (\Exception $e) {
\Log::debug('Bind failed');
\Log::debug("Exception was: ".$e->getMessage());
Log::debug('Bind failed');
Log::debug("Exception was: ".$e->getMessage());
return response()->json(['message' => $e->getMessage()], 400);
//return response()->json(['message' => $e->getMessage()], 500);
}
} catch (\Exception $e) {
\Log::debug('Connection failed but we cannot debug it any further on our end.');
Log::debug('Connection failed but we cannot debug it any further on our end.');
return response()->json(['message' => $e->getMessage()], 500);
}
}
public function ldaptestlogin(Request $request)
public function ldaptestlogin(Request $request) : JsonResponse
{
if (Setting::getSettings()->ldap_enabled != '1') {
\Log::debug('LDAP is not enabled. Cannot test.');
Log::debug('LDAP is not enabled. Cannot test.');
return response()->json(['message' => 'LDAP is not enabled, cannot test.'], 400);
}
@@ -104,39 +100,39 @@ class SettingsController extends Controller
$validator = Validator::make($request->all(), $rules);
if ($validator->fails()) {
\Log::debug('LDAP Validation test failed.');
Log::debug('LDAP Validation test failed.');
$validation_errors = implode(' ',$validator->errors()->all());
return response()->json(['message' => $validator->errors()->all()], 400);
}
\Log::debug('Preparing to test LDAP login');
Log::debug('Preparing to test LDAP login');
try {
$connection = Ldap::connectToLdap();
try {
Ldap::bindAdminToLdap($connection);
\Log::debug('Attempting to bind to LDAP for LDAP test');
Log::debug('Attempting to bind to LDAP for LDAP test');
try {
$ldap_user = Ldap::findAndBindUserLdap($request->input('ldaptest_user'), $request->input('ldaptest_password'));
if ($ldap_user) {
\Log::debug('It worked! '. $request->input('ldaptest_user').' successfully binded to LDAP.');
Log::debug('It worked! '. $request->input('ldaptest_user').' successfully binded to LDAP.');
return response()->json(['message' => 'It worked! '. $request->input('ldaptest_user').' successfully binded to LDAP.'], 200);
}
return response()->json(['message' => 'Login Failed. '. $request->input('ldaptest_user').' did not successfully bind to LDAP.'], 400);
} catch (\Exception $e) {
\Log::debug('LDAP login failed');
Log::debug('LDAP login failed');
return response()->json(['message' => $e->getMessage()], 400);
}
} catch (\Exception $e) {
\Log::debug('Bind failed');
Log::debug('Bind failed');
return response()->json(['message' => $e->getMessage()], 400);
//return response()->json(['message' => $e->getMessage()], 500);
}
} catch (\Exception $e) {
\Log::debug('Connection failed');
Log::debug('Connection failed');
return response()->json(['message' => $e->getMessage()], 500);
}
@@ -148,9 +144,8 @@ class SettingsController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v3.0]
* @return Redirect
*/
public function ajaxTestEmail()
public function ajaxTestEmail() : JsonResponse
{
if (!config('app.lock_passwords')) {
try {
@@ -170,9 +165,8 @@ class SettingsController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v5.0.0]
* @return Response
*/
public function purgeBarcodes()
public function purgeBarcodes() : JsonResponse
{
$file_count = 0;
$files = Storage::disk('public')->files('barcodes');
@@ -181,19 +175,19 @@ class SettingsController extends Controller
$file_parts = explode('.', $file);
$extension = end($file_parts);
\Log::debug($extension);
Log::debug($extension);
// Only generated barcodes would have a .png file extension
if ($extension == 'png') {
\Log::debug('Deleting: '.$file);
Log::debug('Deleting: '.$file);
try {
Storage::disk('public')->delete($file);
\Log::debug('Deleting: '.$file);
Log::debug('Deleting: '.$file);
$file_count++;
} catch (\Exception $e) {
\Log::debug($e);
Log::debug($e);
}
}
}
@@ -211,9 +205,8 @@ class SettingsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v5.0.0]
* @param \Illuminate\Http\Request $request
* @return array
*/
public function showLoginAttempts(Request $request)
public function showLoginAttempts(Request $request) : array
{
$allowed_columns = ['id', 'username', 'remote_ip', 'user_agent', 'successful', 'created_at'];
@@ -229,7 +222,13 @@ class SettingsController extends Controller
}
public function listBackups() {
/**
* Lists backup files
*
* @author [A. Gianotto]
*/
public function listBackups() : array
{
$settings = Setting::getSettings();
$path = 'app/backups';
$backup_files = Storage::files($path);
@@ -249,12 +248,12 @@ class SettingsController extends Controller
'filesize' => Setting::fileSizeConvert(Storage::size($backup_files[$f])),
'modified_value' => $file_timestamp,
'modified_display' => date($settings->date_display_format.' '.$settings->time_display_format, $file_timestamp),
'backup_url' => config('app.url').'/settings/backups/download/'.basename($backup_files[$f]),
];
$count++;
}
}
}
@@ -264,15 +263,56 @@ class SettingsController extends Controller
}
public function downloadBackup($file) {
/**
* Downloads a backup file.
* We use response()->download() here instead of Storage::download() because Storage::download()
* exhausts memory on larger files.
*
* @author [A. Gianotto]
*/
public function downloadBackup($file) : JsonResponse | BinaryFileResponse
{
$path = 'app/backups';
if (Storage::exists($path.'/'.$file)) {
$path = storage_path('app/backups');
if (Storage::exists('app/backups/'.$file)) {
$headers = ['ContentType' => 'application/zip'];
return Storage::download($path.'/'.$file, $file, $headers);
return response()->download($path.'/'.$file, $file, $headers);
} else {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('general.file_not_found')));
return response()->json(Helper::formatStandardApiResponse('error', null, trans('general.file_not_found')), 404);
}
}
/**
* Determines and downloads the latest backup
*
* @author [A. Gianotto]
* @since [v6.3.1]
*/
public function downloadLatestBackup() : JsonResponse | BinaryFileResponse
{
$fileData = collect();
foreach (Storage::files('app/backups') as $file) {
if (pathinfo($file, PATHINFO_EXTENSION) == 'zip') {
$fileData->push([
'file' => $file,
'date' => Storage::lastModified($file)
]);
}
}
$newest = $fileData->sortByDesc('date')->first();
if (Storage::exists($newest['file'])) {
$headers = ['ContentType' => 'application/zip'];
return response()->download(storage_path($newest['file']), basename($newest['file']), $headers);
} else {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('general.file_not_found')), 404);
}
}
}

View File

@@ -5,12 +5,13 @@ namespace App\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Http\Transformers\AssetsTransformer;
use App\Http\Transformers\SelectlistTransformer;
use App\Http\Transformers\StatuslabelsTransformer;
use App\Models\Asset;
use App\Models\Statuslabel;
use Illuminate\Http\Request;
use App\Http\Transformers\PieChartTransformer;
use Illuminate\Support\Arr;
use Illuminate\Http\JsonResponse;
class StatuslabelsController extends Controller
{
@@ -19,9 +20,8 @@ class StatuslabelsController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
public function index(Request $request) : array
{
$this->authorize('view', Statuslabel::class);
$allowed_columns = ['id', 'name', 'created_at', 'assets_count', 'color', 'notes', 'default_label'];
@@ -50,12 +50,9 @@ class StatuslabelsController extends Controller
}
}
// Set the offset to the API call's offset, unless the offset is higher than the actual count of items in which
// case we override with the actual count, so we should return 0 items.
$offset = (($statuslabels) && ($request->get('offset') > $statuslabels->count())) ? $statuslabels->count() : $request->get('offset', 0);
// Check to make sure the limit is not higher than the max allowed
((config('app.max_results') >= $request->input('limit')) && ($request->filled('limit'))) ? $limit = $request->input('limit') : $limit = config('app.max_results');
// Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $statuslabels->count()) ? $statuslabels->count() : app('api_offset_value');
$limit = app('api_limit_value');
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
$sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at';
@@ -74,9 +71,8 @@ class StatuslabelsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
public function store(Request $request) : JsonResponse
{
$this->authorize('create', Statuslabel::class);
$request->except('deployable', 'pending', 'archived');
@@ -110,9 +106,8 @@ class StatuslabelsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
public function show($id) : array
{
$this->authorize('view', Statuslabel::class);
$statuslabel = Statuslabel::findOrFail($id);
@@ -128,9 +123,8 @@ class StatuslabelsController extends Controller
* @since [v4.0]
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
public function update(Request $request, $id) : JsonResponse
{
$this->authorize('update', Statuslabel::class);
$statuslabel = Statuslabel::findOrFail($id);
@@ -165,9 +159,8 @@ class StatuslabelsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
public function destroy($id) : JsonResponse
{
$this->authorize('delete', Statuslabel::class);
$statuslabel = Statuslabel::findOrFail($id);
@@ -190,9 +183,8 @@ class StatuslabelsController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v3.0]
* @return array
*/
public function getAssetCountByStatuslabel()
public function getAssetCountByStatuslabel() : array
{
$this->authorize('view', Statuslabel::class);
$statuslabels = Statuslabel::withCount('assets')->get();
@@ -217,9 +209,8 @@ class StatuslabelsController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v6.0.11]
* @return array
*/
public function getAssetCountByMetaStatus()
public function getAssetCountByMetaStatus() : array
{
$this->authorize('view', Statuslabel::class);
@@ -247,9 +238,8 @@ class StatuslabelsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function assets(Request $request, $id)
public function assets(Request $request, $id) : array
{
$this->authorize('view', Statuslabel::class);
$this->authorize('index', Asset::class);
@@ -283,9 +273,8 @@ class StatuslabelsController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @return bool
*/
public function checkIfDeployable($id)
public function checkIfDeployable($id) : string
{
$statuslabel = Statuslabel::findOrFail($id);
if ($statuslabel->getStatuslabelType() == 'deployable') {
@@ -294,4 +283,45 @@ class StatuslabelsController extends Controller
return '0';
}
/**
* Gets a paginated collection for the select2 menus
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v6.1.1]
* @see \App\Http\Transformers\SelectlistTransformer
*/
public function selectlist(Request $request) : array
{
$this->authorize('view.selectlists');
$statuslabels = Statuslabel::orderBy('default_label', 'desc')->orderBy('name', 'asc')->orderBy('deployable', 'desc');
if ($request->filled('search')) {
$statuslabels = $statuslabels->where('name', 'LIKE', '%'.$request->get('search').'%');
}
if ($request->filled('deployable')) {
$statuslabels = $statuslabels->where('deployable', '=', '1');
}
if ($request->filled('pending')) {
$statuslabels = $statuslabels->where('pending', '=', '1');
}
if ($request->filled('archived')) {
$statuslabels = $statuslabels->where('archived', '=', '1');
}
$statuslabels = $statuslabels->orderBy('name', 'ASC')->paginate(50);
// Loop through and set some custom properties for the transformer to use.
// This lets us have more flexibility in special cases like assets, where
// they may not have a ->name value but we want to display something anyway
foreach ($statuslabels as $statuslabel) {
$statuslabels->use_text = $statuslabel->name;
}
return (new SelectlistTransformer)->transformSelectlist($statuslabels);
}
}

View File

@@ -10,6 +10,7 @@ use App\Models\Supplier;
use Illuminate\Http\Request;
use App\Http\Requests\ImageUploadRequest;
use Illuminate\Support\Facades\Storage;
use Illuminate\Http\JsonResponse;
class SuppliersController extends Controller
{
@@ -20,14 +21,33 @@ class SuppliersController extends Controller
* @since [v4.0]
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
public function index(Request $request): array
{
$this->authorize('view', Supplier::class);
$allowed_columns = ['id', 'name', 'address', 'phone', 'contact', 'fax', 'email', 'image', 'assets_count', 'licenses_count', 'accessories_count', 'url'];
$allowed_columns = ['
id',
'name',
'address',
'phone',
'contact',
'fax',
'email',
'image',
'assets_count',
'licenses_count',
'accessories_count',
'components_count',
'consumables_count',
'url',
];
$suppliers = Supplier::select(
['id', 'name', 'address', 'address2', 'city', 'state', 'country', 'fax', 'phone', 'email', 'contact', 'created_at', 'updated_at', 'deleted_at', 'image', 'notes']
)->withCount('assets as assets_count')->withCount('licenses as licenses_count')->withCount('accessories as accessories_count');
['id', 'name', 'address', 'address2', 'city', 'state', 'country', 'fax', 'phone', 'email', 'contact', 'created_at', 'updated_at', 'deleted_at', 'image', 'notes', 'url'])
->withCount('assets as assets_count')
->withCount('licenses as licenses_count')
->withCount('accessories as accessories_count')
->withCount('components as components_count')
->withCount('consumables as consumables_count');
if ($request->filled('search')) {
@@ -74,12 +94,9 @@ class SuppliersController extends Controller
$suppliers->where('notes', '=', $request->input('notes'));
}
// Set the offset to the API call's offset, unless the offset is higher than the actual count of items in which
// case we override with the actual count, so we should return 0 items.
$offset = (($suppliers) && ($request->get('offset') > $suppliers->count())) ? $suppliers->count() : $request->get('offset', 0);
// Check to make sure the limit is not higher than the max allowed
((config('app.max_results') >= $request->input('limit')) && ($request->filled('limit'))) ? $limit = $request->input('limit') : $limit = config('app.max_results');
// Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $suppliers->count()) ? $suppliers->count() : app('api_offset_value');
$limit = app('api_limit_value');
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
$sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at';
@@ -98,9 +115,8 @@ class SuppliersController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param \App\Http\Requests\ImageUploadRequest $request
* @return \Illuminate\Http\Response
*/
public function store(ImageUploadRequest $request)
public function store(ImageUploadRequest $request) : JsonResponse
{
$this->authorize('create', Supplier::class);
$supplier = new Supplier;
@@ -120,9 +136,8 @@ class SuppliersController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
public function show($id) : array
{
$this->authorize('view', Supplier::class);
$supplier = Supplier::findOrFail($id);
@@ -138,9 +153,8 @@ class SuppliersController extends Controller
* @since [v4.0]
* @param \App\Http\Requests\ImageUploadRequest $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(ImageUploadRequest $request, $id)
public function update(ImageUploadRequest $request, $id) : JsonResponse
{
$this->authorize('update', Supplier::class);
$supplier = Supplier::findOrFail($id);
@@ -160,9 +174,8 @@ class SuppliersController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
public function destroy($id) : JsonResponse
{
$this->authorize('delete', Supplier::class);
$supplier = Supplier::with('asset_maintenances', 'assets', 'licenses')->withCount('asset_maintenances as asset_maintenances_count', 'assets as assets_count', 'licenses as licenses_count')->findOrFail($id);
@@ -193,7 +206,7 @@ class SuppliersController extends Controller
* @since [v4.0.16]
* @see \App\Http\Transformers\SelectlistTransformer
*/
public function selectlist(Request $request)
public function selectlist(Request $request) : array
{
$this->authorize('view.selectlists');

View File

@@ -11,16 +11,20 @@ use App\Http\Transformers\ConsumablesTransformer;
use App\Http\Transformers\LicensesTransformer;
use App\Http\Transformers\SelectlistTransformer;
use App\Http\Transformers\UsersTransformer;
use App\Models\Actionlog;
use App\Models\Asset;
use App\Models\Company;
use App\Models\Accessory;
use App\Models\Consumable;
use App\Models\License;
use App\Models\User;
use App\Notifications\CurrentInventory;
use Auth;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use App\Http\Requests\ImageUploadRequest;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Log;
use App\Http\Requests\DeleteUserRequest;
use Illuminate\Http\JsonResponse;
class UsersController extends Controller
{
@@ -30,9 +34,9 @@ class UsersController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
*
* @return \Illuminate\Http\Response
* @return array
*/
public function index(Request $request)
public function index(Request $request) : array
{
$this->authorize('view', User::class);
@@ -71,16 +75,15 @@ class UsersController extends Controller
'users.start_date',
'users.end_date',
'users.vip',
'users.autoassign_licenses',
'users.website',
])->with('manager', 'groups', 'userloc', 'company', 'department', 'assets', 'licenses', 'accessories', 'consumables', 'createdBy',)
->withCount('assets as assets_count', 'licenses as licenses_count', 'accessories as accessories_count', 'consumables as consumables_count');
$users = Company::scopeCompanyables($users);
])->with('manager', 'groups', 'userloc', 'company', 'department', 'assets', 'licenses', 'accessories', 'consumables', 'createdBy', 'managesUsers', 'managedLocations')
->withCount('assets as assets_count', 'licenses as licenses_count', 'accessories as accessories_count', 'consumables as consumables_count', 'managesUsers as manages_users_count', 'managedLocations as manages_locations_count');
if (($request->filled('deleted')) && ($request->input('deleted') == 'true')) {
$users = $users->onlyTrashed();
} elseif (($request->filled('all')) && ($request->input('all') == 'true')) {
$users = $users->withTrashed();
if ($request->filled('search') != '') {
$users = $users->TextSearch($request->input('search'));
}
if ($request->filled('activated')) {
@@ -127,6 +130,10 @@ class UsersController extends Controller
$users = $users->where('users.country', '=', $request->input('country'));
}
if ($request->filled('website')) {
$users = $users->where('users.website', '=', $request->input('website'));
}
if ($request->filled('zip')) {
$users = $users->where('users.zip', '=', $request->input('zip'));
}
@@ -187,20 +194,27 @@ class UsersController extends Controller
$users->has('accessories', '=', $request->input('accessories_count'));
}
if ($request->filled('search')) {
$users = $users->TextSearch($request->input('search'));
if ($request->filled('manages_users_count')) {
$users->has('manages_users_count', '=', $request->input('manages_users_count'));
}
if ($request->filled('manages_locations_count')) {
$users->has('manages_locations_count', '=', $request->input('manages_locations_count'));
}
if ($request->filled('autoassign_licenses')) {
$users->where('autoassign_licenses', '=', $request->input('autoassign_licenses'));
}
if (($request->filled('deleted')) && ($request->input('deleted') == 'true')) {
$users = $users->onlyTrashed();
} elseif (($request->filled('all')) && ($request->input('all') == 'true')) {
$users = $users->withTrashed();
}
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
// Set the offset to the API call's offset, unless the offset is higher than the actual count of items in which
// case we override with the actual count, so we should return 0 items.
$offset = (($users) && ($request->get('offset') > $users->count())) ? $users->count() : $request->get('offset', 0);
// Check to make sure the limit is not higher than the max allowed
((config('app.max_results') >= $request->input('limit')) && ($request->filled('limit'))) ? $limit = $request->input('limit') : $limit = config('app.max_results');
switch ($request->input('sort')) {
case 'manager':
$users = $users->OrderManager($order);
@@ -234,10 +248,6 @@ class UsersController extends Controller
'jobtitle',
'username',
'employee_num',
'assets',
'accessories',
'consumables',
'licenses',
'groups',
'activated',
'created_at',
@@ -248,6 +258,8 @@ class UsersController extends Controller
'licenses_count',
'consumables_count',
'accessories_count',
'manages_users_count',
'manages_locations_count',
'phone',
'address',
'city',
@@ -262,13 +274,21 @@ class UsersController extends Controller
'vip',
'start_date',
'end_date',
'autoassign_licenses',
'website',
];
$sort = in_array($request->get('sort'), $allowed_columns) ? $request->get('sort') : 'first_name';
$sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'first_name';
$users = $users->orderBy($sort, $order);
break;
}
// Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $users->count()) ? $users->count() : app('api_offset_value');
$limit = app('api_limit_value');
$total = $users->count();
$users = $users->skip($offset)->take($limit)->get();
@@ -282,7 +302,7 @@ class UsersController extends Controller
* @since [v4.0.16]
* @see \App\Http\Transformers\SelectlistTransformer
*/
public function selectlist(Request $request)
public function selectlist(Request $request) : array
{
$users = User::select(
[
@@ -297,8 +317,6 @@ class UsersController extends Controller
]
)->where('show_in_list', '=', '1');
$users = Company::scopeCompanyables($users);
if ($request->filled('search')) {
$users = $users->where(function ($query) use ($request) {
$query->SimpleNameSearch($request->get('search'))
@@ -340,27 +358,31 @@ class UsersController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(SaveUserRequest $request)
public function store(SaveUserRequest $request) : JsonResponse
{
$this->authorize('create', User::class);
$user = new User;
$user->fill($request->all());
$user->created_by = auth()->id();
if ($request->has('permissions')) {
$permissions_array = $request->input('permissions');
// Strip out the superuser permission if the API user isn't a superadmin
if (! Auth::user()->isSuperUser()) {
if (! auth()->user()->isSuperUser()) {
unset($permissions_array['superuser']);
}
$user->permissions = $permissions_array;
}
$tmp_pass = substr(str_shuffle('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'), 0, 20);
$user->password = bcrypt($request->get('password', $tmp_pass));
//
if ($request->filled('password')) {
$user->password = bcrypt($request->get('password'));
} else {
$user->password = $user->noPassword();
}
app('App\Http\Requests\ImageUploadRequest')->handleImages($user, 600, 'image', 'avatars', 'avatar');
@@ -382,16 +404,20 @@ class UsersController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
public function show($id) : JsonResponse | array
{
$this->authorize('view', User::class);
$user = User::withCount('assets as assets_count', 'licenses as licenses_count', 'accessories as accessories_count', 'consumables as consumables_count')->findOrFail($id);
if ($user = User::withCount('assets as assets_count', 'licenses as licenses_count', 'accessories as accessories_count', 'consumables as consumables_count', 'managesUsers as manages_users_count', 'managedLocations as manages_locations_count')->find($id)) {
$this->authorize('view', $user);
return (new UsersTransformer)->transformUser($user);
}
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/users/message.user_not_found', compact('id'))));
}
/**
* Update the specified resource in storage.
@@ -400,19 +426,19 @@ class UsersController extends Controller
* @since [v4.0]
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(SaveUserRequest $request, $id)
public function update(SaveUserRequest $request, $id) : JsonResponse
{
$this->authorize('update', User::class);
$user = User::findOrFail($id);
if ($user = User::find($id)) {
$this->authorize('update', $user);
/**
* This is a janky hack to prevent people from changing admin demo user data on the public demo.
*
* The $ids 1 and 2 are special since they are seeded as superadmins in the demo seeder.
*
* Thanks, jerks. You are why we can't have nice things. - snipe
*
*/
@@ -439,15 +465,15 @@ class UsersController extends Controller
if ($request->has('permissions')) {
$permissions_array = $request->input('permissions');
// Strip out the superuser permission if the API user isn't a superadmin
if (! Auth::user()->isSuperUser()) {
// Strip out the individual superuser permission if the API user isn't a superadmin
if (!auth()->user()->isSuperUser()) {
unset($permissions_array['superuser']);
}
$user->permissions = $permissions_array;
}
// Update the location of any assets checked out to this user
Asset::where('assigned_type', User::class)
->where('assigned_to', $user->id)->update(['location_id' => $request->input('location_id', null)]);
@@ -457,27 +483,22 @@ class UsersController extends Controller
if ($user->save()) {
// Sync group memberships:
// This was changed in Snipe-IT v4.6.x to 4.7, since we upgraded to Laravel 5.5
// which changes the behavior of has vs filled.
// The $request->has method will now return true even if the input value is an empty string or null.
// A new $request->filled method has was added that provides the previous behavior of the has method.
// Check if the request has groups passed and has a value, AND that the user us a superuser
if (($request->has('groups')) && (auth()->user()->isSuperUser())) {
// Check if the request has groups passed and has a value
if ($request->filled('groups')) {
$validator = Validator::make($request->all(), [
$validator = Validator::make($request->only('groups'), [
'groups.*' => 'integer|exists:permission_groups,id',
]);
if ($validator->fails()) {
return response()->json(Helper::formatStandardApiResponse('error', null, $user->getErrors()));
}
$user->groups()->sync($request->input('groups'));
// The groups field has been passed but it is null, so we should blank it out
} elseif ($request->has('groups')) {
$user->groups()->sync([]);
return response()->json(Helper::formatStandardApiResponse('error', null, $validator->errors()));
}
// Sync the groups since the user is a superuser and the groups pass validation
$user->groups()->sync($request->input('groups'));
}
return response()->json(Helper::formatStandardApiResponse('success', (new UsersTransformer)->transformUser($user), trans('admin/users/message.success.update')));
}
@@ -485,36 +506,25 @@ class UsersController extends Controller
return response()->json(Helper::formatStandardApiResponse('error', null, $user->getErrors()));
}
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/users/message.user_not_found', compact('id'))));
}
/**
* Remove the specified resource from storage.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0]
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
public function destroy(DeleteUserRequest $request, $id) : JsonResponse
{
$this->authorize('delete', User::class);
$user = User::findOrFail($id);
if ($user = User::withTrashed()->find($id)) {
$this->authorize('delete', $user);
if (($user->assets) && ($user->assets->count() > 0)) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/users/message.error.delete_has_assets')));
}
if (($user->licenses) && ($user->licenses->count() > 0)) {
return response()->json(Helper::formatStandardApiResponse('error', null, 'This user still has '.$user->licenses->count().' license(s) associated with them and cannot be deleted.'));
}
if (($user->accessories) && ($user->accessories->count() > 0)) {
return response()->json(Helper::formatStandardApiResponse('error', null, 'This user still has '.$user->accessories->count().' accessories associated with them.'));
}
if (($user->managedLocations()) && ($user->managedLocations()->count() > 0)) {
return response()->json(Helper::formatStandardApiResponse('error', null, 'This user still has '.$user->managedLocations()->count().' locations that they manage.'));
}
if ($user->delete()) {
// Remove the user's avatar if they have one
@@ -522,7 +532,7 @@ class UsersController extends Controller
try {
Storage::disk('public')->delete('avatars/' . $user->avatar);
} catch (\Exception $e) {
\Log::debug($e);
Log::debug($e);
}
}
@@ -530,6 +540,11 @@ class UsersController extends Controller
}
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/users/message.error.delete')));
}
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/users/message.user_not_found')));
}
/**
@@ -538,17 +553,43 @@ class UsersController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v3.0]
* @param $userId
* @return string JSON
*/
public function assets(Request $request, $id)
public function assets(Request $request, $id) : JsonResponse | array
{
$this->authorize('view', User::class);
$this->authorize('view', Asset::class);
$assets = Asset::where('assigned_to', '=', $id)->where('assigned_type', '=', User::class)->with('model')->get();
if ($user = User::with('assets', 'assets.model', 'consumables', 'accessories', 'licenses', 'userloc')->withTrashed()->find($id)) {
$this->authorize('view', $user);
$assets = Asset::where('assigned_to', '=', $id)->where('assigned_type', '=', User::class)->with('model');
// Filter on category ID
if ($request->filled('category_id')) {
$assets = $assets->InCategory($request->input('category_id'));
}
// Filter on model ID
if ($request->filled('model_id')) {
$model_ids = $request->input('model_id');
if (!is_array($model_ids)) {
$model_ids = array($model_ids);
}
$assets = $assets->InModelList($model_ids);
}
$assets = $assets->get();
return (new AssetsTransformer)->transformAssets($assets, $assets->count(), $request);
}
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/users/message.user_not_found', compact('id'))));
}
/**
* Notify a specific user via email with all of their assigned assets.
*
@@ -556,34 +597,41 @@ class UsersController extends Controller
* @since [v6.0.13]
* @param Request $request
* @param $id
* @return string JSON
*/
public function emailAssetList(Request $request, $id)
public function emailAssetList(Request $request, $id) : JsonResponse
{
$user = User::findOrFail($id);
$this->authorize('update', User::class);
if ($user = User::find($id)) {
$this->authorize('update', $user);
if (empty($user->email)) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/users/message.inventorynotification.error')));
}
$user->notify((new CurrentInventory($user)));
return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/users/message.inventorynotification.success')));
}
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/users/message.user_not_found', compact('id'))));
}
/**
* Return JSON containing a list of consumables assigned to a user.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v3.0]
* @param $userId
* @return string JSON
*/
public function consumables(Request $request, $id)
public function consumables(Request $request, $id) : array
{
$this->authorize('view', User::class);
$this->authorize('view', Consumable::class);
$user = User::findOrFail($id);
$this->authorize('view', $user);
$consumables = $user->consumables;
return (new ConsumablesTransformer)->transformConsumables($consumables, $consumables->count(), $request);
}
@@ -594,12 +642,12 @@ class UsersController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.6.14]
* @param $userId
* @return string JSON
*/
public function accessories($id)
public function accessories($id) : array
{
$this->authorize('view', User::class);
$user = User::findOrFail($id);
$this->authorize('view', $user);
$this->authorize('view', Accessory::class);
$accessories = $user->accessories;
@@ -612,14 +660,14 @@ class UsersController extends Controller
* @author [N. Mathar] [<snipe@snipe.net>]
* @since [v5.0]
* @param $userId
* @return string JSON
*/
public function licenses($id)
public function licenses($id) : JsonResponse | array
{
$this->authorize('view', User::class);
$this->authorize('view', License::class);
if ($user = User::where('id', $id)->withTrashed()->first()) {
$this->authorize('update', $user);
$licenses = $user->licenses()->get();
return (new LicensesTransformer())->transformLicenses($licenses, $licenses->count());
}
@@ -634,18 +682,28 @@ class UsersController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v3.0]
* @param $userId
* @return string JSON
*/
public function postTwoFactorReset(Request $request)
public function postTwoFactorReset(Request $request) : JsonResponse
{
$this->authorize('update', User::class);
if ($request->filled('id')) {
try {
$user = User::find($request->get('id'));
$this->authorize('update', $user);
$user->two_factor_secret = null;
$user->two_factor_enrolled = 0;
$user->save();
$user->saveQuietly();
// Log the reset
$logaction = new Actionlog();
$logaction->target_type = User::class;
$logaction->target_id = $user->id;
$logaction->item_type = User::class;
$logaction->item_id = $user->id;
$logaction->created_at = date('Y-m-d H:i:s');
$logaction->user_id = auth()->id();
$logaction->logaction('2FA reset');
return response()->json(['message' => trans('admin/settings/general.two_factor_reset_success')], 200);
} catch (\Exception $e) {
@@ -663,9 +721,8 @@ class UsersController extends Controller
* @author [Juan Font] [<juanfontalonso@gmail.com>]
* @since [v4.4.2]
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function getCurrentUserInfo(Request $request)
public function getCurrentUserInfo(Request $request) : array
{
return (new UsersTransformer)->transformUser($request->user());
}
@@ -676,21 +733,34 @@ class UsersController extends Controller
* @author [E. Taylor] [<dev@evantaylor.name>]
* @param int $userId
* @since [v6.0.0]
* @return JsonResponse
*/
public function restore($userId = null)
public function restore($userId) : JsonResponse
{
// Get asset information
$user = User::withTrashed()->find($userId);
$this->authorize('delete', User::class);
if ($user = User::withTrashed()->find($userId)) {
$this->authorize('delete', $user);
if (isset($user->id)) {
// Restore the user
User::withTrashed()->where('id', $userId)->restore();
return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/users/message.success.restored')));
if ($user->deleted_at == '') {
return response()->json(Helper::formatStandardApiResponse('error', trans('general.not_deleted', ['item_type' => trans('general.user')])), 200);
}
$id = $userId;
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/users/message.user_not_found', compact('id'))), 200);
if ($user->restore()) {
$logaction = new Actionlog();
$logaction->item_type = User::class;
$logaction->item_id = $user->id;
$logaction->created_at = date('Y-m-d H:i:s');
$logaction->user_id = auth()->id();
$logaction->logaction('restore');
return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/users/message.success.restored')), 200);
}
}
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/users/message.user_not_found')), 200);
}
}

View File

@@ -2,17 +2,14 @@
namespace App\Http\Controllers;
use App\Helpers\Helper;
use App\Models\Asset;
use App\Models\AssetMaintenance;
use App\Models\Company;
use Auth;
use Illuminate\Support\Facades\Auth;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Slack;
use Str;
use TCPDF;
use View;
use \Illuminate\Contracts\View\View;
use \Illuminate\Http\RedirectResponse;
/**
* This controller handles all actions related to Asset Maintenance for
@@ -29,9 +26,8 @@ class AssetMaintenancesController extends Controller
* @author Vincent Sposato <vincent.sposato@gmail.com>
* @version v1.0
* @since [v1.8]
* @return View
*/
private static function getInsufficientPermissionsRedirect()
private static function getInsufficientPermissionsRedirect(): RedirectResponse
{
return redirect()->route('maintenances.index')
->with('error', trans('general.insufficient_permissions'));
@@ -46,9 +42,8 @@ class AssetMaintenancesController extends Controller
* @author Vincent Sposato <vincent.sposato@gmail.com>
* @version v1.0
* @since [v1.8]
* @return View
*/
public function index()
public function index() : View
{
$this->authorize('view', Asset::class);
return view('asset_maintenances/index');
@@ -63,7 +58,7 @@ class AssetMaintenancesController extends Controller
* @since [v1.8]
* @return mixed
*/
public function create()
public function create() : View
{
$this->authorize('update', Asset::class);
$asset = null;
@@ -92,16 +87,15 @@ class AssetMaintenancesController extends Controller
* @author Vincent Sposato <vincent.sposato@gmail.com>
* @version v1.0
* @since [v1.8]
* @return mixed
*/
public function store(Request $request)
public function store(Request $request) : RedirectResponse
{
$this->authorize('update', Asset::class);
// create a new model instance
$assetMaintenance = new AssetMaintenance();
$assetMaintenance->supplier_id = $request->input('supplier_id');
$assetMaintenance->is_warranty = $request->input('is_warranty');
$assetMaintenance->cost = Helper::ParseCurrency($request->input('cost'));
$assetMaintenance->cost = $request->input('cost');
$assetMaintenance->notes = $request->input('notes');
$asset = Asset::find($request->input('asset_id'));
@@ -144,42 +138,26 @@ class AssetMaintenancesController extends Controller
* @param int $assetMaintenanceId
* @version v1.0
* @since [v1.8]
* @return mixed
*/
public function edit($assetMaintenanceId = null)
public function edit($assetMaintenanceId = null) : View | RedirectResponse
{
$this->authorize('update', Asset::class);
// Check if the asset maintenance exists
$this->authorize('update', Asset::class);
// Check if the asset maintenance exists
if (is_null($assetMaintenance = AssetMaintenance::find($assetMaintenanceId))) {
// Redirect to the improvement management page
return redirect()->route('maintenances.index')
->with('error', trans('admin/asset_maintenances/message.not_found'));
} elseif (! $assetMaintenance->asset) {
return redirect()->route('maintenances.index')
->with('error', 'The asset associated with this maintenance does not exist.');
// Redirect to the asset maintenance management page
return redirect()->route('maintenances.index')->with('error', trans('admin/asset_maintenances/message.not_found'));
} elseif ((!$assetMaintenance->asset) || ($assetMaintenance->asset->deleted_at!='')) {
// Redirect to the asset maintenance management page
return redirect()->route('maintenances.index')->with('error', 'asset does not exist');
} elseif (! Company::isCurrentUserHasAccess($assetMaintenance->asset)) {
return static::getInsufficientPermissionsRedirect();
}
if ($assetMaintenance->completion_date == '0000-00-00') {
$assetMaintenance->completion_date = null;
}
if ($assetMaintenance->start_date == '0000-00-00') {
$assetMaintenance->start_date = null;
}
if ($assetMaintenance->cost == '0.00') {
$assetMaintenance->cost = null;
}
// Prepare Improvement Type List
$assetMaintenanceType = [
'' => 'Select an improvement type',
] + AssetMaintenance::getImprovementOptions();
$assetMaintenanceType = ['' => 'Select an improvement type'] + AssetMaintenance::getImprovementOptions();
// Get Supplier List
// Render the view
return view('asset_maintenances/edit')
->with('selectedAsset', null)
->with('assetMaintenanceType', $assetMaintenanceType)
@@ -193,25 +171,26 @@ class AssetMaintenancesController extends Controller
* @author Vincent Sposato <vincent.sposato@gmail.com>
* @param Request $request
* @param int $assetMaintenanceId
* @return mixed
* @version v1.0
* @since [v1.8]
*/
public function update(Request $request, $assetMaintenanceId = null)
public function update(Request $request, $assetMaintenanceId = null) : View | RedirectResponse
{
$this->authorize('update', Asset::class);
// Check if the asset maintenance exists
if (is_null($assetMaintenance = AssetMaintenance::find($assetMaintenanceId))) {
// Redirect to the asset maintenance management page
return redirect()->route('maintenances.index')
->with('error', trans('admin/asset_maintenances/message.not_found'));
return redirect()->route('maintenances.index')->with('error', trans('admin/asset_maintenances/message.not_found'));
} elseif ((!$assetMaintenance->asset) || ($assetMaintenance->asset->deleted_at!='')) {
// Redirect to the asset maintenance management page
return redirect()->route('maintenances.index')->with('error', 'asset does not exist');
} elseif (! Company::isCurrentUserHasAccess($assetMaintenance->asset)) {
return static::getInsufficientPermissionsRedirect();
}
$assetMaintenance->supplier_id = $request->input('supplier_id');
$assetMaintenance->is_warranty = $request->input('is_warranty');
$assetMaintenance->cost = Helper::ParseCurrency($request->input('cost'));
$assetMaintenance->cost = $request->input('cost');
$assetMaintenance->notes = $request->input('notes');
$asset = Asset::find(request('asset_id'));
@@ -263,9 +242,8 @@ class AssetMaintenancesController extends Controller
* @param int $assetMaintenanceId
* @version v1.0
* @since [v1.8]
* @return mixed
*/
public function destroy($assetMaintenanceId)
public function destroy($assetMaintenanceId) : RedirectResponse
{
$this->authorize('update', Asset::class);
// Check if the asset maintenance exists
@@ -292,9 +270,8 @@ class AssetMaintenancesController extends Controller
* @param int $assetMaintenanceId
* @version v1.0
* @since [v1.8]
* @return View
*/
public function show($assetMaintenanceId)
public function show($assetMaintenanceId) : View | RedirectResponse
{
$this->authorize('view', Asset::class);

View File

@@ -4,15 +4,21 @@ namespace App\Http\Controllers;
use App\Helpers\Helper;
use App\Http\Requests\ImageUploadRequest;
use App\Http\Requests\StoreAssetModelRequest;
use App\Models\Actionlog;
use App\Models\AssetModel;
use App\Models\CustomField;
use App\Models\SnipeModel;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\View;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Redirect;
use Request;
use Storage;
use Symfony\Component\HttpFoundation\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Log;
use \Illuminate\Contracts\View\View;
use \Illuminate\Http\RedirectResponse;
/**
* This class controls all actions related to asset models for
@@ -29,10 +35,8 @@ class AssetModelsController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0]
* @return View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function index()
public function index() : View
{
$this->authorize('index', AssetModel::class);
@@ -44,10 +48,8 @@ class AssetModelsController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0]
* @return View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function create()
public function create() : View
{
$this->authorize('create', AssetModel::class);
@@ -62,33 +64,29 @@ class AssetModelsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0]
* @param ImageUploadRequest $request
* @return Redirect
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function store(ImageUploadRequest $request)
public function store(StoreAssetModelRequest $request) : RedirectResponse
{
$this->authorize('create', AssetModel::class);
// Create a new asset model
$model = new AssetModel;
// Save the model data
$model->eol = $request->input('eol');
$model->depreciation_id = $request->input('depreciation_id');
$model->name = $request->input('name');
$model->model_number = $request->input('model_number');
$model->min_amt = $request->input('min_amt');
$model->manufacturer_id = $request->input('manufacturer_id');
$model->category_id = $request->input('category_id');
$model->notes = $request->input('notes');
$model->user_id = Auth::id();
$model->requestable = Request::has('requestable');
$model->requestable = $request->has('requestable');
if ($request->input('fieldset_id') != '') {
$model->fieldset_id = e($request->input('fieldset_id'));
$model->fieldset_id = $request->input('fieldset_id');
}
$model = $request->handleImages($model);
// Was it created?
if ($model->save()) {
if ($this->shouldAddDefaultValues($request->input())) {
if (!$this->assignCustomFieldsDefaultValues($model, $request->input('default_values'))){
@@ -96,7 +94,6 @@ class AssetModelsController extends Controller
}
}
// Redirect to the new model page
return redirect()->route('models.index')->with('success', trans('admin/models/message.create.success'));
}
@@ -109,18 +106,14 @@ class AssetModelsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0]
* @param int $modelId
* @return View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function edit($modelId = null)
public function edit($modelId = null) : View | RedirectResponse
{
$this->authorize('update', AssetModel::class);
if ($item = AssetModel::find($modelId)) {
$category_type = 'asset';
$view = View::make('models/edit', compact('item', 'category_type'));
$view->with('depreciation_list', Helper::depreciationList());
return view('models/edit', compact('item', 'category_type'))->with('depreciation_list', Helper::depreciationList());
return $view;
}
return redirect()->route('models.index')->with('error', trans('admin/models/message.does_not_exist'));
@@ -135,15 +128,14 @@ class AssetModelsController extends Controller
* @since [v1.0]
* @param ImageUploadRequest $request
* @param int $modelId
* @return Redirect
* @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function update(ImageUploadRequest $request, $modelId = null)
public function update(StoreAssetModelRequest $request, $modelId) : RedirectResponse
{
$this->authorize('update', AssetModel::class);
// Check if the model exists
if (is_null($model = AssetModel::find($modelId))) {
// Redirect to the models management page
return redirect()->route('models.index')->with('error', trans('admin/models/message.does_not_exist'));
}
@@ -153,6 +145,7 @@ class AssetModelsController extends Controller
$model->eol = $request->input('eol');
$model->name = $request->input('name');
$model->model_number = $request->input('model_number');
$model->min_amt = $request->input('min_amt');
$model->manufacturer_id = $request->input('manufacturer_id');
$model->category_id = $request->input('category_id');
$model->notes = $request->input('notes');
@@ -160,9 +153,6 @@ class AssetModelsController extends Controller
$this->removeCustomFieldsDefaultValues($model);
if ($request->input('fieldset_id') == '') {
$model->fieldset_id = null;
} else {
$model->fieldset_id = $request->input('fieldset_id');
if ($this->shouldAddDefaultValues($request->input())) {
@@ -170,9 +160,18 @@ class AssetModelsController extends Controller
return redirect()->back()->withInput()->with('error', trans('admin/custom_fields/message.fieldset_default_value.error'));
}
}
}
if ($model->save()) {
if ($model->wasChanged('eol')) {
if ($model->eol > 0) {
$newEol = $model->eol;
$model->assets()->whereNotNull('purchase_date')->where('eol_explicit', false)
->update(['asset_eol_date' => DB::raw('DATE_ADD(purchase_date, INTERVAL ' . $newEol . ' MONTH)')]);
} elseif ($model->eol == 0) {
$model->assets()->whereNotNull('purchase_date')->where('eol_explicit', false)
->update(['asset_eol_date' => DB::raw('null')]);
}
}
return redirect()->route('models.index')->with('success', trans('admin/models/message.update.success'));
}
@@ -186,15 +185,13 @@ class AssetModelsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0]
* @param int $modelId
* @return Redirect
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function destroy($modelId)
public function destroy($modelId) : RedirectResponse
{
$this->authorize('delete', AssetModel::class);
// Check if the model exists
if (is_null($model = AssetModel::find($modelId))) {
return redirect()->route('models.index')->with('error', trans('admin/models/message.not_found'));
return redirect()->route('models.index')->with('error', trans('admin/models/message.does_not_exist'));
}
if ($model->assets()->count() > 0) {
@@ -206,7 +203,7 @@ class AssetModelsController extends Controller
try {
Storage::disk('public')->delete('models/'.$model->image);
} catch (\Exception $e) {
\Log::info($e);
Log::info($e);
}
}
@@ -222,22 +219,40 @@ class AssetModelsController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0]
* @param int $modelId
* @return Redirect
* @throws \Illuminate\Auth\Access\AuthorizationException
* @param int $id
*/
public function getRestore($modelId = null)
public function getRestore($id) : RedirectResponse
{
$this->authorize('create', AssetModel::class);
// Get user information
$model = AssetModel::withTrashed()->find($modelId);
if (isset($model->id)) {
$model->restore();
if ($model = AssetModel::withTrashed()->find($id)) {
if ($model->deleted_at == '') {
return redirect()->back()->with('error', trans('general.not_deleted', ['item_type' => trans('general.asset_model')]));
}
if ($model->restore()) {
$logaction = new Actionlog();
$logaction->item_type = User::class;
$logaction->item_id = $model->id;
$logaction->created_at = date('Y-m-d H:i:s');
$logaction->user_id = auth()->id();
$logaction->logaction('restore');
// Redirect them to the deleted page if there are more, otherwise the section index
$deleted_models = AssetModel::onlyTrashed()->count();
if ($deleted_models > 0) {
return redirect()->back()->with('success', trans('admin/models/message.restore.success'));
}
return redirect()->route('models.index')->with('success', trans('admin/models/message.restore.success'));
}
return redirect()->back()->with('error', trans('admin/models/message.not_found'));
// Check validation
return redirect()->back()->with('error', trans('general.could_not_restore', ['item_type' => trans('general.asset_model'), 'error' => $model->getErrors()->first()]));
}
return redirect()->back()->with('error', trans('admin/models/message.does_not_exist'));
}
@@ -248,10 +263,8 @@ class AssetModelsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0]
* @param int $modelId
* @return View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function show($modelId = null)
public function show($modelId = null) : View | RedirectResponse
{
$this->authorize('view', AssetModel::class);
$model = AssetModel::withTrashed()->find($modelId);
@@ -269,9 +282,8 @@ class AssetModelsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0]
* @param int $modelId
* @return View
*/
public function getClone($modelId = null)
public function getClone($modelId = null) : View | RedirectResponse
{
$this->authorize('create', AssetModel::class);
// Check if the model exists
@@ -286,6 +298,7 @@ class AssetModelsController extends Controller
return view('models/edit')
->with('depreciation_list', Helper::depreciationList())
->with('item', $model)
->with('model_id', $model_to_clone->id)
->with('clone_model', $model_to_clone);
}
@@ -296,9 +309,8 @@ class AssetModelsController extends Controller
* @author [B. Wetherington] [<uberbrady@gmail.com>]
* @since [v2.0]
* @param int $modelId
* @return View
*/
public function getCustomFields($modelId)
public function getCustomFields($modelId) : View
{
return view('models.custom_fields_form')->with('model', AssetModel::find($modelId));
}
@@ -310,9 +322,8 @@ class AssetModelsController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.7]
* @return \Illuminate\Contracts\View\View
*/
public function postBulkEdit(Request $request)
public function postBulkEdit(Request $request) : View | RedirectResponse
{
$models_raw_array = $request->input('ids');
@@ -354,9 +365,8 @@ class AssetModelsController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.7]
* @return \Illuminate\Contracts\View\View
*/
public function postBulkEditSave(Request $request)
public function postBulkEditSave(Request $request) : RedirectResponse
{
$models_raw_array = $request->input('ids');
$update_array = [];
@@ -394,9 +404,8 @@ class AssetModelsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0]
* @param int $modelId
* @return Redirect
*/
public function postBulkDelete(Request $request)
public function postBulkDelete(Request $request) : RedirectResponse
{
$models_raw_array = $request->input('ids');
@@ -407,7 +416,6 @@ class AssetModelsController extends Controller
$del_count = 0;
foreach ($models as $model) {
\Log::debug($model->id);
if ($model->assets_count > 0) {
$del_error_count++;
@@ -417,8 +425,6 @@ class AssetModelsController extends Controller
}
}
\Log::debug($del_count);
\Log::debug($del_error_count);
if ($del_error_count == 0) {
return redirect()->route('models.index')
@@ -438,9 +444,8 @@ class AssetModelsController extends Controller
* any default values were entered into the form.
*
* @param array $input
* @return bool
*/
private function shouldAddDefaultValues(array $input)
private function shouldAddDefaultValues(array $input) : bool
{
return ! empty($input['add_default_values'])
&& ! empty($input['default_values'])
@@ -452,28 +457,27 @@ class AssetModelsController extends Controller
*
* @param AssetModel $model
* @param array $defaultValues
* @return void
*/
private function assignCustomFieldsDefaultValues(AssetModel $model, array $defaultValues)
private function assignCustomFieldsDefaultValues(AssetModel|SnipeModel $model, array $defaultValues): bool
{
$data = array();
foreach ($defaultValues as $customFieldId => $defaultValue) {
$customField = \App\Models\CustomField::find($customFieldId);
$customField = CustomField::find($customFieldId);
$data[$customField->db_column] = $defaultValue;
}
$fieldsets = $model->fieldset->validation_rules();
$allRules = $model->fieldset->validation_rules();
$rules = array();
foreach ($fieldsets as $fieldset => $validation){
foreach ($allRules as $field => $validation) {
// If the field is marked as required, eliminate the rule so it doesn't interfere with the default values
// (we are at model level, the rule still applies when creating a new asset using this model)
$index = array_search('required', $validation);
if ($index !== false){
$validation[$index] = 'nullable';
}
$rules[$fieldset] = $validation;
$rules[$field] = $validation;
}
$validator = Validator::make($data, $rules);
@@ -495,9 +499,8 @@ class AssetModelsController extends Controller
/**
* Removes all default values
*
* @return void
*/
private function removeCustomFieldsDefaultValues(AssetModel $model)
private function removeCustomFieldsDefaultValues(AssetModel|SnipeModel $model): void
{
$model->defaultValues()->detach();
}

View File

@@ -3,26 +3,28 @@
namespace App\Http\Controllers;
use App\Helpers\StorageHelper;
use App\Http\Requests\AssetFileRequest;
use App\Http\Requests\UploadFileRequest;
use App\Models\Actionlog;
use App\Models\AssetModel;
use Illuminate\Support\Facades\Response;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Storage;
use enshrined\svgSanitize\Sanitizer;
use \Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
class AssetModelsFilesController extends Controller
{
/**
* Upload a file to the server.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param AssetFileRequest $request
* @param UploadFileRequest $request
* @param int $modelId
* @return Redirect
* @since [v1.0]
* @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*@since [v1.0]
* @author [A. Gianotto] [<snipe@snipe.net>]
*/
public function store(AssetFileRequest $request, $modelId = null)
public function store(UploadFileRequest $request, $modelId = null) : RedirectResponse
{
if (! $model = AssetModel::find($modelId)) {
return redirect()->route('models.index')->with('error', trans('admin/hardware/message.does_not_exist'));
@@ -37,29 +39,9 @@ class AssetModelsFilesController extends Controller
foreach ($request->file('file') as $file) {
$extension = $file->getClientOriginalExtension();
$file_name = 'model-'.$model->id.'-'.str_random(8).'-'.str_slug(basename($file->getClientOriginalName(), '.'.$extension)).'.'.$extension;
$file_name = $request->handleFile('private_uploads/assetmodels/','model-'.$model->id,$file);
// Check for SVG and sanitize it
if ($extension=='svg') {
\Log::debug('This is an SVG');
$sanitizer = new Sanitizer();
$dirtySVG = file_get_contents($file->getRealPath());
$cleanSVG = $sanitizer->sanitize($dirtySVG);
try {
Storage::put('private_uploads/assetmodels/'.$file_name, $cleanSVG);
} catch (\Exception $e) {
\Log::debug('Upload no workie :( ');
\Log::debug($e);
}
} else {
Storage::put('private_uploads/assetmodels/'.$file_name, file_get_contents($file));
}
$model->logUpload($file_name, e($request->get('notes')));
$model->logUpload($file_name, $request->get('notes'));
}
return redirect()->back()->with('success', trans('general.file_upload_success'));
@@ -75,10 +57,8 @@ class AssetModelsFilesController extends Controller
* @param int $modelId
* @param int $fileId
* @since [v1.0]
* @return View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function show($modelId = null, $fileId = null, $download = true)
public function show($modelId = null, $fileId = null) : StreamedResponse | Response | RedirectResponse | BinaryFileResponse
{
$model = AssetModel::find($modelId);
// the asset is valid
@@ -91,20 +71,19 @@ class AssetModelsFilesController extends Controller
}
$file = 'private_uploads/assetmodels/'.$log->filename;
\Log::debug('Checking for '.$file);
if (! Storage::exists($file)) {
return response('File '.$file.' not found on server', 404)
->header('Content-Type', 'text/plain');
}
if ($download != 'true') {
if ($contents = file_get_contents(Storage::url($file))) {
return Response::make(Storage::url($file)->header('Content-Type', mime_content_type($file)));
}
if (request('inline') == 'true') {
return JsonResponse::create(['error' => 'Failed validation: '], 500);
$headers = [
'Content-Disposition' => 'inline',
];
return Storage::download($file, $log->filename, $headers);
}
return StorageHelper::downloader($file);
@@ -123,10 +102,8 @@ class AssetModelsFilesController extends Controller
* @param int $modelId
* @param int $fileId
* @since [v1.0]
* @return View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function destroy($modelId = null, $fileId = null)
public function destroy($modelId = null, $fileId = null) : RedirectResponse
{
$model = AssetModel::find($modelId);
$this->authorize('update', $model);

View File

@@ -6,26 +6,29 @@ use App\Events\CheckoutableCheckedIn;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Http\Requests\AssetCheckinRequest;
use App\Http\Traits\MigratesLegacyAssetLocations;
use App\Models\Asset;
use App\Models\CheckoutAcceptance;
use App\Models\LicenseSeat;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\View;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Log;
use \Illuminate\Contracts\View\View;
use \Illuminate\Http\RedirectResponse;
class AssetCheckinController extends Controller
{
use MigratesLegacyAssetLocations;
/**
* Returns a view that presents a form to check an asset back into inventory.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $assetId
* @param string $backto
* @return View
* @throws \Illuminate\Auth\Access\AuthorizationException
* @since [v1.0]
*/
public function create($assetId, $backto = null)
public function create($assetId, $backto = null) : View | RedirectResponse
{
// Check if the asset exists
if (is_null($asset = Asset::find($assetId))) {
@@ -35,7 +38,17 @@ class AssetCheckinController extends Controller
$this->authorize('checkin', $asset);
return view('hardware/checkin', compact('asset'))->with('statusLabel_list', Helper::statusLabelList())->with('backto', $backto);
// This asset is already checked in, redirect
if (is_null($asset->assignedTo)) {
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.checkin.already_checked_in'));
}
if (!$asset->model) {
return redirect()->route('hardware.show', $asset->id)->with('error', trans('admin/hardware/general.model_invalid_fix'));
}
return view('hardware/checkin', compact('asset'))->with('statusLabel_list', Helper::statusLabelList())->with('backto', $backto)->with('table_name', 'Assets');
}
/**
@@ -45,11 +58,9 @@ class AssetCheckinController extends Controller
* @param AssetCheckinRequest $request
* @param int $assetId
* @param null $backto
* @return Redirect
* @throws \Illuminate\Auth\Access\AuthorizationException
* @since [v1.0]
*/
public function store(AssetCheckinRequest $request, $assetId = null, $backto = null)
public function store(AssetCheckinRequest $request, $assetId = null, $backto = null) : RedirectResponse
{
// Check if the asset exists
if (is_null($asset = Asset::find($assetId))) {
@@ -60,6 +71,11 @@ class AssetCheckinController extends Controller
if (is_null($target = $asset->assignedTo)) {
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.checkin.already_checked_in'));
}
if (!$asset->model) {
return redirect()->route('hardware.show', $asset->id)->with('error', trans('admin/hardware/general.model_invalid_fix'));
}
$this->authorize('checkin', $asset);
if ($asset->assignedType() == Asset::USER) {
@@ -67,10 +83,9 @@ class AssetCheckinController extends Controller
}
$asset->expected_checkin = null;
$asset->last_checkout = null;
$asset->assigned_to = null;
//$asset->last_checkout = null;
$asset->last_checkin = now();
$asset->assignedTo()->disassociate($asset);
$asset->assigned_type = null;
$asset->accepted = null;
$asset->name = $request->get('name');
@@ -78,43 +93,30 @@ class AssetCheckinController extends Controller
$asset->status_id = e($request->get('status_id'));
}
// This is just meant to correct legacy issues where some user data would have 0
// as a location ID, which isn't valid. Later versions of Snipe-IT have stricter validation
// rules, so it's necessary to fix this for long-time users. It's kinda gross, but will help
// people (and their data) in the long run
if ($asset->rtd_location_id == '0') {
\Log::debug('Manually override the RTD location IDs');
\Log::debug('Original RTD Location ID: '.$asset->rtd_location_id);
$asset->rtd_location_id = '';
\Log::debug('New RTD Location ID: '.$asset->rtd_location_id);
}
if ($asset->location_id == '0') {
\Log::debug('Manually override the location IDs');
\Log::debug('Original Location ID: '.$asset->location_id);
$asset->location_id = '';
\Log::debug('New RTD Location ID: '.$asset->location_id);
}
$this->migrateLegacyLocations($asset);
$asset->location_id = $asset->rtd_location_id;
if ($request->filled('location_id')) {
\Log::debug('NEW Location ID: '.$request->get('location_id'));
$asset->location_id = e($request->get('location_id'));
Log::debug('NEW Location ID: '.$request->get('location_id'));
$asset->location_id = $request->get('location_id');
if ($request->get('update_default_location') == 0){
$asset->rtd_location_id = $request->get('location_id');
}
}
$originalValues = $asset->getRawOriginal();
$checkin_at = date('Y-m-d H:i:s');
if (($request->filled('checkin_at')) && ($request->get('checkin_at') != date('Y-m-d'))) {
$originalValues['action_date'] = $checkin_at;
$checkin_at = $request->get('checkin_at');
}
if(!empty($asset->licenseseats->all())){
foreach ($asset->licenseseats as $seat){
$seat->assigned_to = null;
$seat->save();
}
}
$asset->licenseseats->each(function (LicenseSeat $seat) {
$seat->update(['assigned_to' => null]);
});
// Get all pending Acceptances for this asset and delete them
$acceptances = CheckoutAcceptance::pending()->whereHasMorph('checkoutable',
@@ -126,15 +128,12 @@ class AssetCheckinController extends Controller
$acceptance->delete();
});
Session::put('redirect_option', $request->get('redirect_option'));
// Was the asset updated?
if ($asset->save()) {
event(new CheckoutableCheckedIn($asset, $target, Auth::user(), $request->input('note'), $checkin_at));
if ((isset($user)) && ($backto == 'user')) {
return redirect()->route('users.show', $user->id)->with('success', trans('admin/hardware/message.checkin.success'));
}
return redirect()->route('hardware.index')->with('success', trans('admin/hardware/message.checkin.success'));
event(new CheckoutableCheckedIn($asset, $target, auth()->user(), $request->input('note'), $checkin_at, $originalValues));
return Helper::getRedirectOption($asset, $assetId, 'Assets');
}
// Redirect to the asset management page with error
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.checkin.error').$asset->getErrors());

View File

@@ -9,7 +9,9 @@ use App\Http\Controllers\Controller;
use App\Http\Requests\AssetCheckoutRequest;
use App\Models\Asset;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Session;
use \Illuminate\Contracts\View\View;
use \Illuminate\Http\RedirectResponse;
class AssetCheckoutController extends Controller
{
@@ -22,9 +24,9 @@ class AssetCheckoutController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $assetId
* @since [v1.0]
* @return View
* @return \Illuminate\Contracts\View\View
*/
public function create($assetId)
public function create($assetId) : View | RedirectResponse
{
// Check if the asset exists
if (is_null($asset = Asset::with('company')->find(e($assetId)))) {
@@ -33,11 +35,17 @@ class AssetCheckoutController extends Controller
$this->authorize('checkout', $asset);
if (!$asset->model) {
return redirect()->route('hardware.show', $asset->id)->with('error', trans('admin/hardware/general.model_invalid_fix'));
}
if ($asset->availableForCheckout()) {
return view('hardware/checkout', compact('asset'))
->with('statusLabel_list', Helper::deployableStatusLabelList());
->with('statusLabel_list', Helper::deployableStatusLabelList())
->with('table_name', 'Assets');
}
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.checkout.not_available'));
}
@@ -46,11 +54,9 @@ class AssetCheckoutController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param AssetCheckoutRequest $request
* @param int $assetId
* @return Redirect
* @since [v1.0]
*/
public function store(AssetCheckoutRequest $request, $assetId)
public function store(AssetCheckoutRequest $request, $assetId) : RedirectResponse
{
try {
// Check if the asset exists
@@ -60,9 +66,14 @@ class AssetCheckoutController extends Controller
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.checkout.not_available'));
}
$this->authorize('checkout', $asset);
$admin = Auth::user();
$target = $this->determineCheckoutTarget($asset);
if (!$asset->model) {
return redirect()->route('hardware.show', $asset->id)->with('error', trans('admin/hardware/general.model_invalid_fix'));
}
$admin = auth()->user();
$target = $this->determineCheckoutTarget();
$asset = $this->updateAssetLocation($asset, $target);
@@ -89,10 +100,20 @@ class AssetCheckoutController extends Controller
}
}
if ($asset->checkOut($target, $admin, $checkout_at, $expected_checkin, e($request->get('note')), $request->get('name'))) {
return redirect()->route('hardware.index')->with('success', trans('admin/hardware/message.checkout.success'));
$settings = \App\Models\Setting::getSettings();
// We have to check whether $target->company_id is null here since locations don't have a company yet
if (($settings->full_multiple_companies_support) && ((!is_null($target->company_id)) && (!is_null($asset->company_id)))) {
if ($target->company_id != $asset->company_id){
return redirect()->to("hardware/$assetId/checkout")->with('error', trans('general.error_user_company'));
}
}
Session::put(['redirect_option' => $request->get('redirect_option'), 'checkout_to_type' => $request->get('checkout_to_type')]);
if ($asset->checkOut($target, $admin, $checkout_at, $expected_checkin, $request->get('note'), $request->get('name'))) {
return Helper::getRedirectOption($request, $assetId, 'Assets');
}
// Redirect to the asset management page with error
return redirect()->to("hardware/$assetId/checkout")->with('error', trans('admin/hardware/message.checkout.error').$asset->getErrors());
} catch (ModelNotFoundException $e) {

View File

@@ -4,26 +4,29 @@ namespace App\Http\Controllers\Assets;
use App\Helpers\StorageHelper;
use App\Http\Controllers\Controller;
use App\Http\Requests\AssetFileRequest;
use App\Http\Requests\UploadFileRequest;
use App\Models\Actionlog;
use App\Models\Asset;
use Illuminate\Support\Facades\Response;
use \Illuminate\Http\Response;
use Illuminate\Support\Facades\Storage;
use enshrined\svgSanitize\Sanitizer;
use \Illuminate\Contracts\View\View;
use \Illuminate\Http\RedirectResponse;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
class AssetFilesController extends Controller
{
/**
* Upload a file to the server.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param AssetFileRequest $request
* @param UploadFileRequest $request
* @param int $assetId
* @return Redirect
* @since [v1.0]
* @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*@since [v1.0]
* @author [A. Gianotto] [<snipe@snipe.net>]
*/
public function store(AssetFileRequest $request, $assetId = null)
public function store(UploadFileRequest $request, $assetId = null) : RedirectResponse
{
if (! $asset = Asset::find($assetId)) {
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist'));
@@ -37,30 +40,9 @@ class AssetFilesController extends Controller
}
foreach ($request->file('file') as $file) {
$file_name = $request->handleFile('private_uploads/assets/','hardware-'.$asset->id, $file);
$extension = $file->getClientOriginalExtension();
$file_name = 'hardware-'.$asset->id.'-'.str_random(8).'-'.str_slug(basename($file->getClientOriginalName(), '.'.$extension)).'.'.$extension;
// Check for SVG and sanitize it
if ($extension=='svg') {
\Log::debug('This is an SVG');
$sanitizer = new Sanitizer();
$dirtySVG = file_get_contents($file->getRealPath());
$cleanSVG = $sanitizer->sanitize($dirtySVG);
try {
Storage::put('private_uploads/assets/'.$file_name, $cleanSVG);
} catch (\Exception $e) {
\Log::debug('Upload no workie :( ');
\Log::debug($e);
}
} else {
Storage::put('private_uploads/assets/'.$file_name, file_get_contents($file));
}
$asset->logUpload($file_name, e($request->get('notes')));
$asset->logUpload($file_name, $request->get('notes'));
}
return redirect()->back()->with('success', trans('admin/hardware/message.upload.success'));
@@ -76,23 +58,20 @@ class AssetFilesController extends Controller
* @param int $assetId
* @param int $fileId
* @since [v1.0]
* @return View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function show($assetId = null, $fileId = null, $download = true)
public function show($assetId = null, $fileId = null) : View | RedirectResponse | Response | StreamedResponse | BinaryFileResponse
{
$asset = Asset::find($assetId);
// the asset is valid
if (isset($asset->id)) {
$this->authorize('view', $asset);
if (! $log = Actionlog::find($fileId)) {
if (! $log = Actionlog::whereNotNull('filename')->where('item_id', $asset->id)->find($fileId)) {
return response('No matching record for that asset/file', 500)
->header('Content-Type', 'text/plain');
}
$file = 'private_uploads/assets/'.$log->filename;
\Log::debug('Checking for '.$file);
if ($log->action_type == 'audit') {
$file = 'private_uploads/audits/'.$log->filename;
@@ -103,12 +82,13 @@ class AssetFilesController extends Controller
->header('Content-Type', 'text/plain');
}
if ($download != 'true') {
if ($contents = file_get_contents(Storage::url($file))) {
return Response::make(Storage::url($file)->header('Content-Type', mime_content_type($file)));
}
if (request('inline') == 'true') {
return JsonResponse::create(['error' => 'Failed validation: '], 500);
$headers = [
'Content-Disposition' => 'inline',
];
return Storage::download($file, $log->filename, $headers);
}
return StorageHelper::downloader($file);
@@ -127,10 +107,8 @@ class AssetFilesController extends Controller
* @param int $assetId
* @param int $fileId
* @since [v1.0]
* @return View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function destroy($assetId = null, $fileId = null)
public function destroy($assetId = null, $fileId = null) : RedirectResponse
{
$asset = Asset::find($assetId);
$this->authorize('update', $asset);
@@ -153,7 +131,6 @@ class AssetFilesController extends Controller
->with('success', trans('admin/hardware/message.deletefile.success'));
}
// Redirect to the hardware management page
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist'));
}
}

View File

@@ -6,32 +6,30 @@ use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Http\Requests\ImageUploadRequest;
use App\Models\Actionlog;
use App\Http\Requests\UploadFileRequest;
use Illuminate\Support\Facades\Log;
use App\Models\Asset;
use App\Models\AssetModel;
use App\Models\CheckoutRequest;
use App\Models\Company;
use App\Models\Location;
use App\Models\Setting;
use App\Models\Statuslabel;
use App\Models\User;
use Auth;
use Illuminate\Support\Facades\Auth;
use App\View\Label;
use Carbon\Carbon;
use DB;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Gate;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Cookie;
use Input;
use Intervention\Image\Facades\Image;
use Illuminate\Support\Facades\Validator;
use League\Csv\Reader;
use League\Csv\Statement;
use Paginator;
use Redirect;
use Response;
use Slack;
use Str;
use TCPDF;
use View;
use Illuminate\Http\Response;
use Illuminate\Contracts\View\View;
use Illuminate\Http\RedirectResponse;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
/**
* This class controls all actions related to assets for
@@ -59,10 +57,8 @@ class AssetsController extends Controller
* @see AssetController::getDatatable() method that generates the JSON response
* @since [v1.0]
* @param Request $request
* @return View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function index(Request $request)
public function index(Request $request) : View
{
$this->authorize('index', Asset::class);
$company = Company::find($request->input('company_id'));
@@ -76,13 +72,12 @@ class AssetsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0]
* @param Request $request
* @return View
* @internal param int $model_id
*/
public function create(Request $request)
public function create(Request $request) : View
{
$this->authorize('create', Asset::class);
$view = View::make('hardware/edit')
$view = view('hardware/edit')
->with('statuslabel_list', Helper::statusLabelList())
->with('item', new Asset)
->with('statuslabel_types', Helper::statusTypeList());
@@ -100,12 +95,15 @@ class AssetsController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0]
* @return Redirect
*/
public function store(ImageUploadRequest $request)
public function store(ImageUploadRequest $request) : RedirectResponse
{
$this->authorize(Asset::class);
// There are a lot more rules to add here but prevents
// errors around `asset_tags` not being present below.
$this->validate($request, ['asset_tags' => ['required', 'array']]);
// Handle asset tags - there could be one, or potentially many.
// This is only necessary on create, not update, since bulk editing is handled
// differently
@@ -135,12 +133,9 @@ class AssetsController extends Controller
$asset->order_number = $request->input('order_number');
$asset->notes = $request->input('notes');
$asset->user_id = Auth::id();
$asset->archived = '0';
$asset->physical = '1';
$asset->depreciate = '0';
$asset->status_id = request('status_id');
$asset->warranty_months = request('warranty_months', null);
$asset->purchase_cost = Helper::ParseCurrency($request->get('purchase_cost'));
$asset->purchase_cost = request('purchase_cost');
$asset->purchase_date = request('purchase_date', null);
$asset->asset_eol_date = request('asset_eol_date', null);
$asset->assigned_to = request('assigned_to', null);
@@ -153,7 +148,8 @@ class AssetsController extends Controller
$asset->next_audit_date = Carbon::now()->addMonths($settings->audit_interval)->toDateString();
}
if ($asset->assigned_to == '') {
// Set location_id to rtd_location_id ONLY if the asset isn't being checked out
if (!request('assigned_user') && !request('assigned_asset') && !request('assigned_location')) {
$asset->location_id = $request->input('rtd_location_id', null);
}
@@ -171,9 +167,9 @@ class AssetsController extends Controller
if ($field->field_encrypted == '1') {
if (Gate::allows('admin')) {
if (is_array($request->input($field->db_column))) {
$asset->{$field->db_column} = \Crypt::encrypt(implode(', ', $request->input($field->db_column)));
$asset->{$field->db_column} = Crypt::encrypt(implode(', ', $request->input($field->db_column)));
} else {
$asset->{$field->db_column} = \Crypt::encrypt($request->input($field->db_column));
$asset->{$field->db_column} = Crypt::encrypt($request->input($field->db_column));
}
}
} else {
@@ -200,7 +196,7 @@ class AssetsController extends Controller
}
if (isset($target)) {
$asset->checkOut($target, Auth::user(), date('Y-m-d H:i:s'), $request->input('expected_checkin', null), 'Checked out on asset creation', $request->get('name'), $location);
$asset->checkOut($target, auth()->user(), date('Y-m-d H:i:s'), $request->input('expected_checkin', null), 'Checked out on asset creation', $request->get('name'), $location);
}
$success = true;
@@ -209,12 +205,8 @@ class AssetsController extends Controller
}
if ($success) {
// Redirect to the asset listing page
$minutes = 518400;
// dd( $_POST['options']);
// Cookie::queue(Cookie::make('optional_info', json_decode($_POST['options']), $minutes));
return redirect()->route('hardware.index')
->with('success', trans('admin/hardware/message.create.success'));
->with('success-unescaped', trans('admin/hardware/message.create.success_linked', ['link' => route('hardware.show', $asset->id), 'id', 'tag' => e($asset->asset_tag)]));
}
@@ -222,11 +214,6 @@ class AssetsController extends Controller
return redirect()->back()->withInput()->withErrors($asset->getErrors());
}
public function getOptionCookie(Request $request){
$value = $request->cookie('optional_info');
echo $value;
return $value;
}
/**
* Returns a view that presents a form to edit an existing asset.
@@ -234,9 +221,9 @@ class AssetsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $assetId
* @since [v1.0]
* @return View
* @return \Illuminate\Contracts\View\View
*/
public function edit($assetId = null)
public function edit($assetId = null) : View | RedirectResponse
{
if (! $item = Asset::find($assetId)) {
// Redirect to the asset management page with error
@@ -257,9 +244,9 @@ class AssetsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $assetId
* @since [v1.0]
* @return View
* @return \Illuminate\Contracts\View\View
*/
public function show($assetId = null)
public function show($assetId = null) : View | RedirectResponse
{
$asset = Asset::withTrashed()->find($assetId);
$this->authorize('view', $asset);
@@ -296,12 +283,11 @@ class AssetsController extends Controller
/**
* Validate and process asset edit form.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $assetId
* @since [v1.0]
* @return Redirect
* @author [A. Gianotto] [<snipe@snipe.net>]
*/
public function update(ImageUploadRequest $request, $assetId = null)
public function update(ImageUploadRequest $request, $assetId = null) : RedirectResponse
{
// Check if the asset exists
if (! $asset = Asset::find($assetId)) {
@@ -312,10 +298,29 @@ class AssetsController extends Controller
$asset->status_id = $request->input('status_id', null);
$asset->warranty_months = $request->input('warranty_months', null);
$asset->purchase_cost = Helper::ParseCurrency($request->input('purchase_cost', null));
$asset->asset_eol_date = request('asset_eol_date', null);
$asset->purchase_cost = $request->input('purchase_cost', null);
$asset->purchase_date = $request->input('purchase_date', null);
$asset->next_audit_date = $request->input('next_audit_date', null);
if ($request->filled('purchase_date') && !$request->filled('asset_eol_date') && ($asset->model->eol > 0)) {
$asset->purchase_date = $request->input('purchase_date', null);
$asset->asset_eol_date = Carbon::parse($request->input('purchase_date'))->addMonths($asset->model->eol)->format('Y-m-d');
$asset->eol_explicit = false;
} elseif ($request->filled('asset_eol_date')) {
$asset->asset_eol_date = $request->input('asset_eol_date', null);
$months = Carbon::parse($asset->asset_eol_date)->diffInMonths($asset->purchase_date);
if($asset->model->eol) {
if($months != $asset->model->eol > 0) {
$asset->eol_explicit = true;
} else {
$asset->eol_explicit = false;
}
} else {
$asset->eol_explicit = true;
}
} elseif (!$request->filled('asset_eol_date') && (($asset->model->eol) == 0)) {
$asset->asset_eol_date = null;
$asset->eol_explicit = false;
}
$asset->supplier_id = $request->input('supplier_id', null);
$asset->expected_checkin = $request->input('expected_checkin', null);
@@ -324,6 +329,12 @@ class AssetsController extends Controller
$asset->rtd_location_id = $request->input('rtd_location_id', null);
$asset->byod = $request->input('byod', 0);
$status = Statuslabel::find($asset->status_id);
if($status->archived){
$asset->assigned_to = null;
}
if ($asset->assigned_to == '') {
$asset->location_id = $request->input('rtd_location_id', null);
}
@@ -334,7 +345,7 @@ class AssetsController extends Controller
unlink(public_path().'/uploads/assets/'.$asset->image);
$asset->image = '';
} catch (\Exception $e) {
\Log::info($e);
Log::info($e);
}
}
@@ -348,7 +359,6 @@ class AssetsController extends Controller
$asset->order_number = $request->input('order_number');
$asset->asset_tag = $asset_tag[1];
$asset->notes = $request->input('notes');
$asset->physical = '1';
$asset = $request->handleImages($asset);
@@ -362,9 +372,9 @@ class AssetsController extends Controller
if ($field->field_encrypted == '1') {
if (Gate::allows('admin')) {
if (is_array($request->input($field->db_column))) {
$asset->{$field->db_column} = \Crypt::encrypt(implode(', ', $request->input($field->db_column)));
$asset->{$field->db_column} = Crypt::encrypt(implode(', ', $request->input($field->db_column)));
} else {
$asset->{$field->db_column} = \Crypt::encrypt($request->input($field->db_column));
$asset->{$field->db_column} = Crypt::encrypt($request->input($field->db_column));
}
}
} else {
@@ -392,9 +402,8 @@ class AssetsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $assetId
* @since [v1.0]
* @return Redirect
*/
public function destroy($assetId)
public function destroy($assetId) : RedirectResponse
{
// Check if the asset exists
if (is_null($asset = Asset::find($assetId))) {
@@ -412,7 +421,7 @@ class AssetsController extends Controller
try {
Storage::disk('public')->delete('assets'.'/'.$asset->image);
} catch (\Exception $e) {
\Log::debug($e);
Log::debug($e);
}
}
@@ -426,9 +435,8 @@ class AssetsController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v3.0]
* @return Redirect
*/
public function getAssetBySerial(Request $request)
public function getAssetBySerial(Request $request) : RedirectResponse
{
$topsearch = ($request->get('topsearch')=="true");
@@ -444,13 +452,14 @@ class AssetsController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v3.0]
* @return Redirect
* @return \Illuminate\Http\RedirectResponse
*/
public function getAssetByTag(Request $request)
public function getAssetByTag(Request $request, $tag=null) : RedirectResponse
{
$tag = $tag ? $tag : $request->get('assetTag');
$topsearch = ($request->get('topsearch') == 'true');
if (! $asset = Asset::where('asset_tag', '=', $request->get('assetTag'))->first()) {
if (! $asset = Asset::where('asset_tag', '=', $tag)->first()) {
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist'));
}
$this->authorize('view', $asset);
@@ -465,9 +474,8 @@ class AssetsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $assetId
* @since [v1.0]
* @return Response
*/
public function getQrCode($assetId = null)
public function getQrCode($assetId = null) : Response | BinaryFileResponse | string | bool
{
$settings = Setting::getSettings();
@@ -494,6 +502,7 @@ class AssetsController extends Controller
return 'That asset is invalid';
}
return false;
}
/**
@@ -507,7 +516,7 @@ class AssetsController extends Controller
public function getBarCode($assetId = null)
{
$settings = Setting::getSettings();
$asset = Asset::find($assetId);
if ($asset = Asset::withTrashed()->find($assetId)) {
$barcode_file = public_path().'/uploads/barcodes/'.str_slug($settings->alt_barcode).'-'.str_slug($asset->asset_tag).'.png';
if (isset($asset->id, $asset->asset_tag)) {
@@ -526,20 +535,22 @@ class AssetsController extends Controller
return response($barcode_obj->getPngData())->header('Content-type', 'image/png');
} catch (\Exception $e) {
\Log::debug('The barcode format is invalid.');
Log::debug('The barcode format is invalid.');
return response(file_get_contents(public_path('uploads/barcodes/invalid_barcode.gif')))->header('Content-type', 'image/gif');
}
}
}
}
return null;
}
/**
* Return a label for an individual asset.
*
* @author [L. Swartzendruber] [<logan.swartzendruber@gmail.com>
* @param int $assetId
* @return View
* @return \Illuminate\Contracts\View\View
*/
public function getLabel($assetId = null)
{
@@ -547,9 +558,11 @@ class AssetsController extends Controller
$asset = Asset::find($assetId);
$this->authorize('view', $asset);
return view('hardware/labels')
->with('assets', Asset::find($asset))
return (new Label())
->with('assets', collect([ $asset ]))
->with('settings', Setting::getSettings())
->with('template', request()->get('template'))
->with('offset', request()->get('offset'))
->with('bulkedit', false)
->with('count', 0);
}
@@ -561,7 +574,7 @@ class AssetsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $assetId
* @since [v1.0]
* @return View
* @return \Illuminate\Contracts\View\View
*/
public function getClone($assetId = null)
{
@@ -590,7 +603,7 @@ class AssetsController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0]
* @return View
* @return \Illuminate\Contracts\View\View
*/
public function getImportHistory()
{
@@ -612,7 +625,7 @@ class AssetsController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v3.3]
* @return View
* @return \Illuminate\Contracts\View\View
*/
public function postImportHistory(Request $request)
{
@@ -706,8 +719,8 @@ class AssetsController extends Controller
Actionlog::firstOrCreate([
'item_id' => $asset->id,
'item_type' => Asset::class,
'user_id' => Auth::user()->id,
'note' => 'Checkout imported by '.Auth::user()->present()->fullName().' from history importer',
'user_id' => auth()->id(),
'note' => 'Checkout imported by '.auth()->user()->present()->fullName().' from history importer',
'target_id' => $item[$asset_tag][$batch_counter]['user_id'],
'target_type' => User::class,
'created_at' => $item[$asset_tag][$batch_counter]['checkout_date'],
@@ -719,10 +732,10 @@ class AssetsController extends Controller
if ($isCheckinHeaderExplicit) {
// if checkin date header exists, assume that empty or future date is still checked out
//if checkin is before todays date, assume it's checked in and do not assign user ID, if checkin date is in the future or blank, this is the expected checkin date, items is checked out
// if checkin is before today's date, assume it's checked in and do not assign user ID, if checkin date is in the future or blank, this is the expected checkin date, items are checked out
if ((strtotime($checkin_date) > strtotime(Carbon::now())) || (empty($checkin_date))
) {
if ((strtotime($checkin_date) > strtotime(Carbon::now())) || (empty($checkin_date)))
{
//only do this if item is checked out
$asset->assigned_to = $user->id;
$asset->assigned_type = User::class;
@@ -734,8 +747,8 @@ class AssetsController extends Controller
Actionlog::firstOrCreate([
'item_id' => $item[$asset_tag][$batch_counter]['asset_id'],
'item_type' => Asset::class,
'user_id' => Auth::user()->id,
'note' => 'Checkin imported by '.Auth::user()->present()->fullName().' from history importer',
'user_id' => auth()->id(),
'note' => 'Checkin imported by '.auth()->user()->present()->fullName().' from history importer',
'target_id' => null,
'created_at' => $checkin_date,
'action_type' => 'checkin',
@@ -767,32 +780,35 @@ class AssetsController extends Controller
}
/**
* Retore a deleted asset.
* Restore a deleted asset.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $assetId
* @since [v1.0]
* @return View
* @return \Illuminate\Contracts\View\View
*/
public function getRestore($assetId = null)
{
// Get asset information
$asset = Asset::withTrashed()->find($assetId);
if ($asset = Asset::withTrashed()->find($assetId)) {
$this->authorize('delete', $asset);
if (isset($asset->id)) {
// Restore the asset
Asset::withTrashed()->where('id', $assetId)->restore();
$logaction = new Actionlog();
$logaction->item_type = Asset::class;
$logaction->item_id = $asset->id;
$logaction->created_at = date('Y-m-d H:i:s');
$logaction->user_id = Auth::user()->id;
$logaction->logaction('restored');
if ($asset->deleted_at == '') {
return redirect()->back()->with('error', trans('general.not_deleted', ['item_type' => trans('general.asset')]));
}
if ($asset->restore()) {
// Redirect them to the deleted page if there are more, otherwise the section index
$deleted_assets = Asset::onlyTrashed()->count();
if ($deleted_assets > 0) {
return redirect()->back()->with('success', trans('admin/hardware/message.restore.success'));
}
return redirect()->route('hardware.index')->with('success', trans('admin/hardware/message.restore.success'));
}
// Check validation to make sure we're not restoring an asset with the same asset tag (or unique attribute) as an existing asset
return redirect()->back()->with('error', trans('general.could_not_restore', ['item_type' => trans('general.asset'), 'error' => $asset->getErrors()->first()]));
}
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist'));
}
@@ -828,15 +844,15 @@ class AssetsController extends Controller
return view('hardware/audit-due');
}
public function overdueForAudit()
public function dueForCheckin()
{
$this->authorize('audit', Asset::class);
$this->authorize('checkin', Asset::class);
return view('hardware/audit-overdue');
return view('hardware/checkin-due');
}
public function auditStore(Request $request, $id)
public function auditStore(UploadFileRequest $request, $id)
{
$this->authorize('audit', Asset::class);
@@ -845,7 +861,7 @@ class AssetsController extends Controller
'next_audit_date' => 'date|nullable',
];
$validator = \Validator::make($request->all(), $rules);
$validator = Validator::make($request->all(), $rules);
if ($validator->fails()) {
return response()->json(Helper::formatStandardApiResponse('error', null, $validator->errors()->all()));
@@ -853,7 +869,21 @@ class AssetsController extends Controller
$asset = Asset::findOrFail($id);
// We don't want to log this as a normal update, so let's bypass that
/**
* Even though we do a save() further down, we don't want to log this as a "normal" asset update,
* which would trigger the Asset Observer and would log an asset *update* log entry (because the
* de-normed fields like next_audit_date on the asset itself will change on save()) *in addition* to
* the audit log entry we're creating through this controller.
*
* To prevent this double-logging (one for update and one for audit), we skip the observer and bypass
* that de-normed update log entry by using unsetEventDispatcher(), BUT invoking unsetEventDispatcher()
* will bypass normal model-level validation that's usually handled at the observer )
*
* We handle validation on the save() by checking if the asset is valid via the ->isValid() method,
* which manually invokes Watson Validating to make sure the asset's model is valid.
*
* @see \App\Observers\AssetObserver::updating()
*/
$asset->unsetEventDispatcher();
$asset->next_audit_date = $request->input('next_audit_date');
@@ -862,29 +892,27 @@ class AssetsController extends Controller
// Check to see if they checked the box to update the physical location,
// not just note it in the audit notes
if ($request->input('update_location') == '1') {
\Log::debug('update location in audit');
$asset->location_id = $request->input('location_id');
}
if ($asset->save()) {
$file_name = '';
// Upload an image, if attached
if ($request->hasFile('image')) {
$path = 'private_uploads/audits';
if (! Storage::exists($path)) {
Storage::makeDirectory($path, 775);
}
$upload = $image = $request->file('image');
$ext = $image->getClientOriginalExtension();
$file_name = 'audit-'.str_random(18).'.'.$ext;
Storage::putFileAs($path, $upload, $file_name);
}
/**
* Invoke Watson Validating to check the asset itself and check to make sure it saved correctly.
* We have to invoke this manually because of the unsetEventDispatcher() above.)
*/
if ($asset->isValid() && $asset->save()) {
$file_name = null;
// Create the image (if one was chosen.)
if ($request->hasFile('image')) {
$file_name = $request->handleFile('private_uploads/audits/', 'audit-'.$asset->id, $request->file('image'));
}
$asset->logAudit($request->input('note'), $request->input('location_id'), $file_name);
return redirect()->route('assets.audit.due')->with('success', trans('admin/hardware/message.audit.success'));
}
return redirect()->back()->withInput()->withErrors($asset->getErrors());
}
public function getRequestedIndex($user_id = null)

Some files were not shown because too many files have changed in this diff Show More