From 22c79d8e1b62cac208efefe42b080be9f6cc528c Mon Sep 17 00:00:00 2001 From: snipe Date: Tue, 12 Nov 2024 15:39:22 +0000 Subject: [PATCH] Squashed commit of the following: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 6bec573956922013dc19cee4840fcb14bcbb74f1 Merge: b6ad69fac 1fc5bb54e Author: snipe Date: Mon Nov 11 13:54:09 2024 +0000 Merge pull request #15794 from snipe/check_for_file_on_asset_acceptance Check that the file exists before trying to download stored EULA commit 1fc5bb54e1ac036c44e4a6096b958f7e86674248 Author: snipe Date: Mon Nov 11 13:50:53 2024 +0000 Check that the file exists before trying to download Signed-off-by: snipe commit b6ad69fac248658a964ea60dc8d3e909e32795f6 Merge: 357ef7e37 47b2cdb84 Author: snipe Date: Sun Nov 10 18:05:20 2024 +0000 Merge pull request #15793 from snipe/allow_eol_explicit Allow user to specify null for calculation or explicit on bulk edit commit 47b2cdb8469e6d4904f9ad3ffb34bdc6d9a196db Author: snipe Date: Sun Nov 10 18:04:13 2024 +0000 Allow user to specify null for calculation or explicit on bulk edit Signed-off-by: snipe commit 357ef7e3757712307417b5533785d839c0fb58a9 Merge: 000f3171e 6928b1b27 Author: snipe Date: Sun Nov 10 17:48:25 2024 +0000 Merge pull request #15792 from snipe/edit_eol_from_bulk Added EOL date to bulk asset edit commit 6928b1b273667f1b36c97183e167da0418c39dd6 Author: snipe Date: Sun Nov 10 17:47:10 2024 +0000 Added eol date to bulk asset edit Signed-off-by: snipe commit 000f3171e39bcdbbb79a12296aa3f6326101d22f Author: snipe Date: Fri Nov 8 10:28:01 2024 +0000 Upgrade jspdf-autotable from 3.8.3 to 3.8.4 #15786 Signed-off-by: snipe commit 5ef3183a5261bfe74df7e5616bb2d54b9c64f37c Merge: a41529dbc 050831868 Author: snipe Date: Thu Nov 7 11:44:06 2024 +0000 Merge pull request #15783 from uberbrady/improve_user_and_location_manager_indexes Improved indexes on manager_id for locations and users, including del… commit 050831868e96722753ef15228d794f8343da5548 Author: Brady Wetherington Date: Thu Nov 7 11:39:27 2024 +0000 Improved indexes on manager_id for locations and users, including deleted_at commit a41529dbc4798d635739bdb77b8ffb8955049c89 Merge: aa168fcb5 4fcf5ac7d Author: snipe Date: Wed Nov 6 21:22:45 2024 +0000 Merge pull request #15780 from uberbrady/add_manager_indexes Add new indexes to locations and users for faster manager lookups commit 4fcf5ac7dae2819e6b19d1d63d7d865d08d056be Author: Brady Wetherington Date: Wed Nov 6 21:19:41 2024 +0000 Add new indexes to locations and users for faster manager lookups commit aa168fcb5b7d9c9d0c600ca2d7160985ce1a240f Author: snipe Date: Wed Nov 6 18:41:52 2024 +0000 Updated BS table to 1.23.5 Signed-off-by: snipe commit 9c1c93ad52112a53c7c1e4d502f04091b118c125 Merge: b96a31253 ad99b8b45 Author: snipe Date: Wed Nov 6 18:40:35 2024 +0000 Merge pull request #15774 from marcusmoore/feature/sc-27350 Added Checkout ID column to user accessory table commit ad99b8b456968c2385f288b20d20d30d41d847b6 Author: Marcus Moore Date: Wed Nov 6 10:37:31 2024 -0800 Use generic ID translation commit b96a31253902a4d702de318b381098f66e474fb8 Merge: 654f67b6a bab1e58ea Author: snipe Date: Wed Nov 6 18:29:22 2024 +0000 Merge pull request #15779 from ubc-cpsc/bugfix/CVE-2024-50345 Fixes CVE-2024-50342, CVE-2024-50345, CVE-2024-51736 commit bab1e58ea4dc0715478e8feef1aa562d1ab9ce82 Author: Joël Pittet Date: Wed Nov 6 09:46:11 2024 -0800 symfony/http-client CVE-2024-50342, symfony/http-foundation CVE-2024-50345, symfony/process CVE-2024-51736 commit 654f67b6ac4537794ec134fa96ee924075875b5e Author: snipe Date: Wed Nov 6 14:05:42 2024 +0000 Updated webpack Signed-off-by: snipe commit 3965bcd7c116bdde2649e38d96531808d811962b Merge: 287f4addf 2362cb5e5 Author: snipe Date: Wed Nov 6 14:02:44 2024 +0000 Merge pull request #15773 from Godmartinz/Fix_failing_failing_tests Fixed notifications for licenses and asset to asset checkoutables commit 2362cb5e5221ecae78c6aaf28bf8380f5ae20de2 Author: Godfrey M Date: Mon Nov 4 16:32:46 2024 -0800 refactor to getNotifiables commit e7cb4a75eb5cd0d32524bcae0d53d184415acff5 Author: Marcus Moore Date: Mon Nov 4 15:56:53 2024 -0800 Show accessory checkout id in user accessory table commit 93494ac55447b062b80918d84a80e38c5dbd2c3d Author: Godfrey M Date: Mon Nov 4 15:17:58 2024 -0800 put dataprovider back in for tests commit 0d707a18512aa8e01c242d6d5486b675754ed5ed Author: Godfrey M Date: Mon Nov 4 15:13:10 2024 -0800 fixes notifications for licenses and asset to asset checkouables commit 287f4addf026f44467376bada0222aa4e489eb0f Merge: f32ebdc7a 2e96d478f Author: snipe Date: Mon Nov 4 20:06:24 2024 +0000 Merge pull request #15771 from snipe/revert-15744-chore/action-tests-debugging Revert "Added the display of logs when tests fail in GitHub Actions" commit 2e96d478f15c433c5628e3307cd323fcd8a765ac Author: Marcus Moore Date: Mon Nov 4 11:04:17 2024 -0800 Revert "Added the display of logs when tests fail in GitHub Actions" commit f32ebdc7acc370ab8d6f0e07a3f8ee59981d1491 Merge: 5897d37fc d6c7dc8e1 Author: snipe Date: Thu Oct 31 22:39:58 2024 +0000 Merge pull request #15765 from marcusmoore/chore/add-missing-livewire-file Added missing Livewire file commit d6c7dc8e1c99c5421c149543a22b8cec0784ba7f Author: Marcus Moore Date: Thu Oct 31 15:37:01 2024 -0700 Add missing livewire file commit 5897d37fcfd3c79afeef72e095d32145e90798bc Merge: 49de07045 21a27dcac Author: snipe Date: Thu Oct 31 20:54:01 2024 +0000 Merge pull request #15763 from Godmartinz/no_to_email_check Fixed emails not being send if target has no email or if not instance of User. Cc_emails will still be sent. commit 21a27dcac11a696a28d35a20d32e5381faa10e43 Merge: 379138076 49de07045 Author: Godfrey M Date: Thu Oct 31 12:55:46 2024 -0700 fixed conflicts commit 3791380764fa0ddffeb94d5c5b14d1ae2357bab6 Author: Godfrey M Date: Thu Oct 31 12:52:47 2024 -0700 remove unused uses commit 7a0f79ecd222b23f9e874c354b5881dcaba9d2db Author: Godfrey M Date: Thu Oct 31 12:51:22 2024 -0700 remove test route commit 97a449e80ece3e553ec12064e74eae9e291f30f6 Author: Godfrey M Date: Thu Oct 31 12:50:13 2024 -0700 removes instanceof User check commit e65942064e3b555885e575aa22315ff02801bde9 Author: Godfrey M Date: Thu Oct 31 12:45:29 2024 -0700 send emails even if target has no email commit 49de07045ad48893daad9ea116b517145a711433 Merge: 7e996c40f 73772a013 Author: snipe Date: Thu Oct 31 17:53:17 2024 +0000 Merge pull request #15731 from Godmartinz/refacto_ms_teams_notifs Fixed MS Team Notifications to utilize workflows after deprecation commit 7e996c40f5770b608b36af035c0118c83fd07864 Merge: 73e8f160c 69e74bbdd Author: snipe Date: Thu Oct 31 02:51:42 2024 +0000 Merge pull request #15758 from snipe/jerm/fix-deprecation-warning Fix ${var} deprecation warning in License model commit 69e74bbdd39201fad43216a0520d771a58554021 Author: Jeremy Price Date: Wed Oct 30 19:43:54 2024 -0700 Fix ${var} deprecation warning in License model When upgrading to php8.3 i started getting deprecation warning about using ${var} instead of {$var} in 2 places in License.php PHP Deprecated: Using ${var} in strings is deprecated, use {$var} instead in /var/www/snipe-it/app/Models/License.php on line 187 PHP Deprecated: Using ${var} in strings is deprecated, use {$var} instead in /var/www/snipe-it/app/Models/License.php on line 219 This simple fix switches the offending statements to {$var} syntax. commit 73e8f160cf078e3dbc69cf032a899cf6fa8d8739 Merge: f68df1fa0 bd23772fe Author: snipe Date: Wed Oct 30 19:29:09 2024 +0000 Merge pull request #15756 from Godmartinz/cc-email-array changes `admin_cc_email` validation to allow an array commit bd23772fe96dc33db62c0fd286a095d4c99e2067 Author: Godfrey M Date: Wed Oct 30 11:42:15 2024 -0700 changes cc_email validation to allow array commit 73772a01381ea654bf7cca48860e61551f363295 Author: Godfrey M Date: Wed Oct 30 11:12:31 2024 -0700 change button text commit b26cae372cad814dac2a40467aaa122c58c93787 Author: Godfrey M Date: Wed Oct 30 10:40:23 2024 -0700 merged in develop commit d6ba303f39c6b5d00aabfdc61a8aadd74c7ca7bf Merge: 9a0eee8f0 f68df1fa0 Author: Godfrey M Date: Wed Oct 30 10:27:45 2024 -0700 Merge branch 'develop' into refacto_ms_teams_notifs # Conflicts: # app/Listeners/CheckoutableListener.php commit f68df1fa063125eb1b3f6e5a44b7e5156148c1e4 Author: snipe Date: Wed Oct 30 13:21:13 2024 +0000 Made type searchable in action logs Signed-off-by: snipe commit f0813e03bf95f3ab53e650ebb8f7128b7fc90164 Merge: 05875ebd1 58ff641f8 Author: snipe Date: Wed Oct 30 12:18:41 2024 +0000 Merge pull request #15681 from Godmartinz/seperating_notification_n_mail Separated Notifications and Emails: Check ins and Check outs commit 05875ebd1fcea7366288de8833adfcedd66a309c Author: snipe Date: Mon Oct 28 22:04:35 2024 +0000 Updated translations Signed-off-by: snipe commit 9a0eee8f03fa06ba67476996741faffe5cf248e7 Author: Godfrey M Date: Mon Oct 28 15:03:43 2024 -0700 revert testing variables commit 6128765d1f88215c9aa0e528ae2def74cba9bf4c Author: Godfrey M Date: Mon Oct 28 15:03:03 2024 -0700 change wording on notification button commit c24f79c025cde958335981252d47285e347aae98 Author: Godfrey M Date: Mon Oct 28 14:58:43 2024 -0700 update method comment commit e7c4343c902961268792bd4951930cec56959384 Author: Godfrey M Date: Mon Oct 28 14:56:48 2024 -0700 readd checkin accessory format commit c0620c27ff74ceb66ce23a75431d8f2184eb91e0 Author: Godfrey M Date: Mon Oct 28 14:30:34 2024 -0700 adds back laravels channel formats commit ed81973fe649355a687dfd5dc70b60d9fdb997c3 Author: Godfrey M Date: Mon Oct 28 13:57:42 2024 -0700 adds notifications for deprecation commit 2d318b394c98954c51e9a6457ccf570487e47ae4 Merge: 86d784bd5 5c4971612 Author: snipe Date: Mon Oct 28 18:41:49 2024 +0000 Merge pull request #15744 from marcusmoore/chore/action-tests-debugging Added the display of logs when tests fail in GitHub Actions commit b987b3dc005400e2c5042fc47be7d134e86c4314 Author: Godfrey M Date: Mon Oct 28 10:57:48 2024 -0700 adds back the laravel channels package and applies a deprecated check commit 5c49716129950b19b503c0d05456ea83c2119755 Author: Marcus Moore Date: Mon Oct 28 10:24:35 2024 -0700 Dump logs on test failure commit 86d784bd598393919a7b60a4845d6e47d1931de0 Author: snipe Date: Mon Oct 28 13:37:59 2024 +0000 Fixed #15740 - use non-translated strings for icons Signed-off-by: snipe commit 589f9cccdf1f4af8956f527728678e2b2316d723 Author: snipe Date: Mon Oct 28 12:04:10 2024 +0000 Fixed #15732 Signed-off-by: snipe commit 4d848e45e6c58aec7cb3d5fc32b5bdab7ddf1bd0 Author: snipe Date: Mon Oct 28 11:55:24 2024 +0000 Fixed #15736 Signed-off-by: snipe commit 58ff641f822eec54ebd40c9904c26034e215c550 Author: Godfrey M Date: Thu Oct 24 22:53:53 2024 -0700 removed unused variables commit ce68f550d8edf633d01af476fd95f1161b474e44 Author: Godfrey M Date: Thu Oct 24 16:01:17 2024 -0700 remove alert emails from cc commit 6f0c1b12b18901bc335bfdda328777399436386c Author: Godfrey M Date: Thu Oct 24 15:04:54 2024 -0700 this adds check out message for consumables commit 278bc5e52a133189cfaf5348d709dcf229229e2f Author: Godfrey M Date: Thu Oct 24 14:59:10 2024 -0700 ads check in and checkout message for license seats commit cce75a81859d3ff36dee19cf7d0278c17b711549 Author: Godfrey M Date: Thu Oct 24 14:48:23 2024 -0700 adds check in and checkout messag for accessories commit e27ff13377f8f783b7230287736eeff63e24c75d Author: Godfrey M Date: Thu Oct 24 14:39:40 2024 -0700 adds check in and checkout message for assets commit 56365495a1c3b38443772a8ab6d3cc5f9815691c Author: Godfrey M Date: Thu Oct 24 14:26:42 2024 -0700 remove unnecessary fields in accessory checkout mail commit 18da80e6de14f285f59012c75696f55be617a2d4 Author: Godfrey M Date: Thu Oct 24 14:24:00 2024 -0700 fix checkoutable listener for microsoft teams commit 18760e3fa19d4d37cf16995a4ba5f0b56ba3771a Author: Godfrey M Date: Thu Oct 24 12:21:51 2024 -0700 replaces teams notification package, passes integration test commit 57107c487cce4f5520b8cfb97408e8c9f02d6547 Author: Godfrey M Date: Thu Oct 24 09:40:10 2024 -0700 fixed last test, definetly the last test commit dfc63641dca2b0a19f632f73733c5bf015517815 Merge: 07a51ec8b b6340532d Author: snipe Date: Thu Oct 24 11:40:50 2024 +0100 Merge pull request #15550 from uberbrady/fix_multi_create_partial_failure Fix multi create partial failure (fixes: [RB-18591]) commit 07a51ec8b128aca554b44af9e9b030f284769650 Merge: e0ec6795b 727c0e458 Author: snipe Date: Thu Oct 24 10:03:10 2024 +0100 Merge pull request #15712 from Godmartinz/fix_import-progress-bar Upgraded `livewire v3.5.9 => v3.5.12` commit 6329f5b87e9dd2ff852073aa290e2930b2f78c10 Author: Godfrey M Date: Wed Oct 23 17:33:23 2024 -0700 removed unused variable from test commit e0ec6795b57406e100fc80af4b5799eb6b00b757 Author: snipe Date: Thu Oct 24 01:27:50 2024 +0100 Use crucial for seeded data Signed-off-by: snipe commit 15073a0d3885dc18609158943254317a2394d9d7 Author: Godfrey M Date: Wed Oct 23 17:27:37 2024 -0700 last test to fix commit a80c09c16d256d67592e35fdde2bd165ff7090bb Merge: ab3b9c451 5509d756b Author: Godfrey M Date: Wed Oct 23 17:23:55 2024 -0700 Merge branch 'develop' into seperating_notification_n_mail commit 5509d756b7d410f5ec98c599c87ad530003b2cb4 Merge: 55ba6279a b16a978f1 Author: snipe Date: Thu Oct 24 01:12:11 2024 +0100 Merge pull request #15722 from Godmartinz/fix_component_factory Fixed Component Factory: use manufacturer factory for `manufactuer_id` commit b16a978f1b5c11c949f9caff4e297628a21d0511 Author: Godfrey M Date: Wed Oct 23 16:25:51 2024 -0700 uses manufacturer factory for manufactuer_id commit ab3b9c45106fb68522f3832863f6e16c8f4856f7 Author: Godfrey M Date: Wed Oct 23 16:24:01 2024 -0700 remove unnecessary code from checkinasset notification commit 2cc2b2b1dfc3c4040a223c052d4cfff0175b3f0c Author: Godfrey M Date: Wed Oct 23 16:06:27 2024 -0700 apply array_filter to cc emails to prevent errors commit 62d06b44d634155aff0035dd4340a03f86479918 Author: Godfrey M Date: Wed Oct 23 15:43:42 2024 -0700 set fallback from email address to service.snipe-it.io commit f29a3831796ea5b8e73e17bb4a45919701f221bd Merge: fd74c3510 55ba6279a Author: Godfrey M Date: Wed Oct 23 15:15:14 2024 -0700 Merge branch 'develop' into seperating_notification_n_mail # Conflicts: # app/Notifications/CheckoutConsumableNotification.php commit fd74c35102b19ec99118c84e6e8339003936aa0e Author: Godfrey M Date: Wed Oct 23 15:08:29 2024 -0700 remove old notify by mail from consumable notification commit c681946b1df9f27242d03ae0dcd2342b1b11fdd3 Author: Godfrey M Date: Wed Oct 23 15:05:39 2024 -0700 added component markdown changes commit 257d25bd9eb1a3114c57c87aad90debc389543b6 Author: Godfrey M Date: Wed Oct 23 14:56:54 2024 -0700 removed import notification from test, feature is not present in project commit 6c34a5c52c8e5391dab246c69a41ad118cfb0cc5 Author: Godfrey M Date: Wed Oct 23 14:54:21 2024 -0700 conditionally check cc emails, initiate variables commit 1b5f4415ae11de482d79f3889db5e71b33e70f99 Author: Godfrey M Date: Wed Oct 23 14:44:45 2024 -0700 corrected cc email behavior commit 55ba6279a4f841d8c3f800bec90b52067e403fc5 Author: snipe Date: Wed Oct 23 19:14:17 2024 +0100 Use trans_choice on alert menu Signed-off-by: snipe commit a9eea830e30f75a4b46648d3bf99d9aa54f07c99 Author: snipe Date: Wed Oct 23 19:05:34 2024 +0100 Added manufacturer and model number to component seeders Signed-off-by: snipe commit af564935d5405e545412210a8a9cfb90c1836948 Merge: d58f87862 3ee76be7e Author: snipe Date: Wed Oct 23 17:56:04 2024 +0100 Merge pull request #15720 from snipe/15695_adds_manufacturer_and_model_number_to_components Fixed #15695 - Added manufacturer and model_number to components commit 3ee76be7e37311fc1d835ca8350fbdb8481b6d23 Author: snipe Date: Wed Oct 23 17:50:22 2024 +0100 Added manufacturer and model_number to components Signed-off-by: snipe commit d58f87862c8b9dedc65b85f9e37601e6aa366a90 Merge: 5da3ce356 0b6859c49 Author: snipe Date: Wed Oct 23 15:09:50 2024 +0100 Merge pull request #15719 from snipe/#15717_adds_qty_to_consumable Fixed #15717 - Added ability to checkout consumables in variable qty via API commit 0b6859c49180c0cb76fa9a7fbdb87286d82815b1 Author: snipe Date: Wed Oct 23 15:05:35 2024 +0100 Added ability to checkout consumables in variable qty Signed-off-by: snipe commit 1e9922a0b08cf2ee0d14a10b734e4c44dd9942c7 Author: Godfrey M Date: Tue Oct 22 16:14:36 2024 -0700 fix moar tests commit ead27accacaefb08f0ed990c7d28843475d757e8 Author: Godfrey M Date: Tue Oct 22 15:45:52 2024 -0700 fixed accessory tests and notifiable target commit 727c0e458ceccc59f62667e28bb80204c219569c Author: Godfrey M Date: Tue Oct 22 14:34:39 2024 -0700 remove translation commit 870dc747db51fa7e0f0ea7d4fac9d857f10191cd Author: Godfrey M Date: Tue Oct 22 14:27:32 2024 -0700 oops commit 0fb3d83fac1df5f800da60a6471017010edea78b Author: Godfrey M Date: Tue Oct 22 14:26:54 2024 -0700 revert controller change commit 0d59ccd6a66cf15a55afc1b92be8ab5e2a3679cb Author: Godfrey M Date: Tue Oct 22 14:23:26 2024 -0700 upgraded livewire v3.5.9 => v3.5.12 commit 5da3ce3564c1ea8860e101ddbebe15c825b6884a Merge: c3bbca30a 5ecd2b629 Author: snipe Date: Tue Oct 22 22:10:20 2024 +0100 Merge pull request #15711 from marcusmoore/fixes/custom-fieldset-checkboxes Fixed custom field checkboxes on asset edit page commit c3bbca30adb33ebc15c7d2c27675d338a27928ef Merge: dccb788a8 37f14fff3 Author: snipe Date: Tue Oct 22 22:07:50 2024 +0100 Merge pull request #15710 from snipe/fixes_lightbox_for_avif Fixes #15701 - load avif files properly in lightbox commit 37f14fff3b98ab23654706b2087eae2261e2931a Author: snipe Date: Tue Oct 22 22:07:28 2024 +0100 Fixed typo Signed-off-by: snipe commit eb6c51fabdf755b488493bff2b1c4d52a3ba8b3f Author: snipe Date: Tue Oct 22 22:04:57 2024 +0100 Fixes #15701 - load avif files properly in lightbox Signed-off-by: snipe commit 5ecd2b62935489df9f6228d378d42a03cfcb17f0 Author: Marcus Moore Date: Tue Oct 22 14:04:05 2024 -0700 Default checkbox elements to an empty array commit 1e31592c553e49eab175531cf9aa3b02ce738812 Author: Godfrey M Date: Tue Oct 22 11:49:06 2024 -0700 messing with the tests commit dccb788a88497608289fbaf08aec8a106d9a8b49 Merge: 5e1d792bb d10fe77ee Author: snipe Date: Tue Oct 22 17:44:30 2024 +0100 Merge pull request #15691 from marcusmoore/fixes/get-id-for-current-user Updated `Company::getIdForCurrentUser()` to return null in certain scenarios commit d10fe77ee7d6445379445024d5f6714159554652 Merge: e1882ee6d 5e1d792bb Author: Marcus Moore Date: Tue Oct 22 09:38:31 2024 -0700 Merge branch 'develop' into fixes/get-id-for-current-user commit 5e1d792bbaf5cdc140ecb4c53b054d20949a546b Merge: 9cf71976f 780ed91a1 Author: snipe Date: Tue Oct 22 16:52:28 2024 +0100 Merge pull request #15687 from NebelKreis/fix/dashboard-title-casing Fixed #15686: Corrected capitalization for dashboard section titles by removing strtolower() commit 9cf71976f6b2865411f6fa8ae257c10c3e8a7e4c Author: snipe Date: Tue Oct 22 16:51:42 2024 +0100 Fixed #15706 - Removed purchase order number from asset import Signed-off-by: snipe commit 15745d9737f551ba0f04092c352ce65f5012870a Merge: bd97955b9 3f74ff25d Author: snipe Date: Tue Oct 22 16:39:44 2024 +0100 Merge pull request #15566 from Godmartinz/status-label-error-message Fixed Status Labels Error Message commit bd97955b9e21294aa409cdb9b701bf90261d3863 Author: snipe Date: Tue Oct 22 16:38:46 2024 +0100 Bumped hash Signed-off-by: snipe commit 252d99421ca4dd707d456fc424f30316b10cd86d Merge: 5767a98ad db8170162 Author: snipe Date: Tue Oct 22 16:26:48 2024 +0100 Merge pull request #15689 from snipe/better_handle_inline_files Better handle inline files in file listing commit 5767a98ad8abe738c4a18a9c33290ac4e3f5ceb1 Merge: 0c820cbc0 524a44272 Author: snipe Date: Tue Oct 22 16:26:23 2024 +0100 Merge pull request #15649 from bryanlopezinc/ImproveImporting Improve import performance commit 0c820cbc0da0c6bb05ec4f685a7eeeaa5156bf7d Merge: 147fcfb8e 3153bbb13 Author: snipe Date: Tue Oct 22 15:56:12 2024 +0100 Merge pull request #15598 from spencerrlongg/bug/custom_field_validation_issue Custom Field Existence Validation Issue commit db8170162174b5688372e50005c5bd18b262508f Merge: a05c33feb 147fcfb8e Author: snipe Date: Tue Oct 22 15:44:24 2024 +0100 Merge branch 'develop' into better_handle_inline_files commit a05c33febfb49b6a845e762817dd20e16db71d0e Author: snipe Date: Tue Oct 22 15:43:19 2024 +0100 Squashed commit of the following: commit 147fcfb8ebc4ceeea96d803d6a455abeba54f45a Merge: 58a3d09b5 fdcc17ca2 Author: snipe Date: Tue Oct 22 15:12:55 2024 +0100 Merge pull request #15676 from Toreg87/fixes/api_create_user_fmcs Fix user creation with FullMultipleCompanySupport enabled over API commit 58a3d09b5fd7ffa979bfb9553cacbb24ae452462 Merge: 30a06a594 867fa2f36 Author: snipe Date: Tue Oct 22 14:55:42 2024 +0100 Merge pull request #15703 from marcusmoore/bug/sc-27188 Linked accessory files in activity report commit 30a06a594289571097e2d30901546bc9a17b4bac Merge: 6c6af78e0 ce3086317 Author: snipe Date: Tue Oct 22 11:47:06 2024 +0100 Merge pull request #15693 from marcusmoore/chore/remove-parallel-testing Removed brianium/paratest commit 6c6af78e0840fc4f134e5bbb7965f21f4adcc0e1 Merge: 9b06bbb6c 3f79fd7ea Author: snipe Date: Tue Oct 22 11:46:04 2024 +0100 Merge pull request #15705 from marcusmoore/tests/icon-component-test Added test to ensure icon component does not end in newline commit 3f79fd7ea744bd18134785c37b87a2f4bcff0347 Author: Marcus Moore Date: Mon Oct 21 17:07:40 2024 -0700 Add test to ensure icon component does not end in newline commit 9b06bbb6c37fcea9b6202ad9fb2b4d952210dd01 Merge: 46ad1d072 d7f70146f Author: snipe Date: Mon Oct 21 22:38:26 2024 +0100 Merge pull request #15704 from marcusmoore/bug/remove-extra-icon Removed second icon in accessory file list commit ce30863177e499a29f395c9c88ce9c67bd669a74 Author: Marcus Moore Date: Mon Oct 21 13:57:04 2024 -0700 Remove brianium/paratest dependency commit d7f70146f4a886795ddb118cc2f71bbadded72dc Author: Marcus Moore Date: Mon Oct 21 13:48:25 2024 -0700 Remove extra icon in accessory file upload list commit 867fa2f36e02bdfe0ee74ae98b590fd013f6fc7a Author: Marcus Moore Date: Mon Oct 21 12:40:24 2024 -0700 Display file in activity report for accessories commit 0933a2d4ea6d5babd6ef3e0e2f8350c2e088648d Author: Marcus Moore Date: Thu Oct 17 18:01:48 2024 -0700 Remove --parallel flag commit 46ad1d072f5c45d20c1b078d2b3f84a3a0f36632 Merge: bcb4bd9eb 3cf746d7d Author: snipe Date: Thu Oct 17 15:29:47 2024 +0100 Merge pull request #15680 from uberbrady/bulk_checkout_to_bulk_actions Bulk checkout to bulk actions commit bcb4bd9eb4e419e8a125a7dccd3e79c39dc13e21 Merge: 250037540 f50ccbcc4 Author: snipe Date: Thu Oct 17 10:20:13 2024 +0100 Merge pull request #15683 from Toreg87/fixes/outdated_comment Fix outdated comment in CompanyableTrait commit f50ccbcc492db6c98cabf6dc6752dd99ab82bce7 Author: Tobias Regnery Date: Thu Oct 17 11:07:28 2024 +0200 Fix outdated comment in CompanyableTrait As of commit 5800e8d the user model uses CompanyableTrait so remove this clearly outdated comment commit 3cf746d7df83ef3e7cfa45c602fc182ebe8f11e3 Author: Brady Wetherington Date: Wed Oct 16 23:13:32 2024 +0100 Rework the bulk checkout to not change how all checkouts work commit 6b7af802af41c92a36e77605415869c9e72ec192 Author: Brady Wetherington Date: Thu Oct 10 13:28:23 2024 +0100 Add 'bulk checkout' as one of the bulk actions in the bulk actions toolbar commit fdcc17ca2c33d38a7af505c99d9547e014f5f783 Author: Tobias Regnery Date: Wed Oct 16 11:18:24 2024 +0200 Fix user creation with FullMultipleCompanySupport enabled over API It is currently possible as a non-superuser to create a new user or patch an existing user with arbitrary company over the API if FullMultipleCompanySupport is enabled. Altough a highly unlikely scenario as the user needs permission to create API keys and new users, it is a bug that should get fixed. Add a call to getIdForCurrentUser() to normalize the company_id if FullMultipleCompanySupport is enabled. Signed-off-by: snipe commit 147fcfb8ebc4ceeea96d803d6a455abeba54f45a Merge: 58a3d09b5 fdcc17ca2 Author: snipe Date: Tue Oct 22 15:12:55 2024 +0100 Merge pull request #15676 from Toreg87/fixes/api_create_user_fmcs Fix user creation with FullMultipleCompanySupport enabled over API commit 58a3d09b5fd7ffa979bfb9553cacbb24ae452462 Merge: 30a06a594 867fa2f36 Author: snipe Date: Tue Oct 22 14:55:42 2024 +0100 Merge pull request #15703 from marcusmoore/bug/sc-27188 Linked accessory files in activity report commit 30a06a594289571097e2d30901546bc9a17b4bac Merge: 6c6af78e0 ce3086317 Author: snipe Date: Tue Oct 22 11:47:06 2024 +0100 Merge pull request #15693 from marcusmoore/chore/remove-parallel-testing Removed brianium/paratest commit 6c6af78e0840fc4f134e5bbb7965f21f4adcc0e1 Merge: 9b06bbb6c 3f79fd7ea Author: snipe Date: Tue Oct 22 11:46:04 2024 +0100 Merge pull request #15705 from marcusmoore/tests/icon-component-test Added test to ensure icon component does not end in newline commit 3f79fd7ea744bd18134785c37b87a2f4bcff0347 Author: Marcus Moore Date: Mon Oct 21 17:07:40 2024 -0700 Add test to ensure icon component does not end in newline commit 9b06bbb6c37fcea9b6202ad9fb2b4d952210dd01 Merge: 46ad1d072 d7f70146f Author: snipe Date: Mon Oct 21 22:38:26 2024 +0100 Merge pull request #15704 from marcusmoore/bug/remove-extra-icon Removed second icon in accessory file list commit ce30863177e499a29f395c9c88ce9c67bd669a74 Author: Marcus Moore Date: Mon Oct 21 13:57:04 2024 -0700 Remove brianium/paratest dependency commit d7f70146f4a886795ddb118cc2f71bbadded72dc Author: Marcus Moore Date: Mon Oct 21 13:48:25 2024 -0700 Remove extra icon in accessory file upload list commit 867fa2f36e02bdfe0ee74ae98b590fd013f6fc7a Author: Marcus Moore Date: Mon Oct 21 12:40:24 2024 -0700 Display file in activity report for accessories commit e1882ee6d2a78506abfd371ba6e0d592ac487181 Author: Marcus Moore Date: Mon Oct 21 12:21:45 2024 -0700 Add comment commit 7eee239378f1b4318557886d1e022540a10977af Author: Marcus Moore Date: Mon Oct 21 12:20:28 2024 -0700 use is_numeric instead of is_int commit 4188849ae17d52dd9befd349b56419eaea9f5287 Author: Marcus Moore Date: Mon Oct 21 12:19:48 2024 -0700 Add failing test case commit 787e651778dbc04acf66cd77faf0386f5a137534 Author: snipe Date: Mon Oct 21 16:52:21 2024 +0100 Fixed todos with log message Signed-off-by: snipe commit ef9b6e3b072f88bfec52c4ec930816d30eb34cb9 Author: snipe Date: Mon Oct 21 16:34:54 2024 +0100 Code cleanup Signed-off-by: snipe commit 06c599cc17ca8f7a29515564e5cac9be905e338d Author: snipe Date: Mon Oct 21 16:34:03 2024 +0100 Added method to show or download file Signed-off-by: snipe commit 61053238777c38579c6188d2380f0cb7b99ae59e Author: snipe Date: Mon Oct 21 14:11:20 2024 +0100 Use plural class name for src Signed-off-by: snipe commit 0933a2d4ea6d5babd6ef3e0e2f8350c2e088648d Author: Marcus Moore Date: Thu Oct 17 18:01:48 2024 -0700 Remove --parallel flag commit a8d853c44a38b50db05884843c614fe7b7342d60 Author: Marcus Moore Date: Thu Oct 17 15:26:27 2024 -0700 Remove focus group tags commit 7e1b47708e7d44a2ad3bc7af93a38fc2dc6e72a9 Author: Marcus Moore Date: Thu Oct 17 15:18:41 2024 -0700 Fix failing test ensuring company id is an integer commit 979e4502ffbadab5978d38633fe06aa96eed698a Author: Marcus Moore Date: Thu Oct 17 15:14:39 2024 -0700 Have getIdForCurrentUser method return null if FMCS enabled, user is not super admin, and does not have company commit ff113ef523f77fb887b939a23de3936f603812a6 Author: Godfrey M Date: Thu Oct 17 14:56:58 2024 -0700 typo fix commit 99dd51a965c7a02f8b24deddd1c233fac05f8465 Author: Marcus Moore Date: Thu Oct 17 14:53:18 2024 -0700 Improve name commit 15c2169477e9691216d9f3fc2b8b8ddd2d8ee21a Author: Marcus Moore Date: Thu Oct 17 14:31:05 2024 -0700 Scaffold additional tests commit 50fa6ce33588f466e90829fb59e8d91411c8d736 Author: Marcus Moore Date: Thu Oct 17 14:12:22 2024 -0700 Scaffold tests commit 7ae76e7db9be7943ca473ab9ef30bda27b166aac Author: Godfrey M Date: Thu Oct 17 13:55:03 2024 -0700 remove viewdata array from 3 tests commit b98058ca98e02b865fdf1488e83a49d4bf7df9c8 Author: Godfrey M Date: Thu Oct 17 13:48:26 2024 -0700 fix tests pt 3 commit 83e8186d9e261efdde81ac56deeb9a799fdaa1e7 Author: Godfrey M Date: Thu Oct 17 13:39:56 2024 -0700 fix assertSent to AssertNotSent on some test commit cdd4fef7df6d49951aaa09ca597995b90a26f2ad Author: Godfrey M Date: Thu Oct 17 13:34:55 2024 -0700 attempt to fix tests p2 commit dceb8e305f55be79f3755a48bc3b4165dc79d43e Author: Godfrey M Date: Thu Oct 17 13:11:39 2024 -0700 attempt to fix tests commit 123cdeb858a8148cd8210847fcb39e635b7dc2bf Author: Godfrey M Date: Thu Oct 17 12:39:48 2024 -0700 add email check to listener commit 496b44e887078b6110f4e8e97e2b04bf22240677 Author: Godfrey M Date: Thu Oct 17 12:28:57 2024 -0700 merged composer lock from dev commit a690cc3582237fb6d40f8eaa3e3e83e7822574fc Author: Godfrey M Date: Thu Oct 17 12:26:55 2024 -0700 removing my composer stuff again..for the last time commit ceb3f5cea629ed68fa4bfc119fefa2166456499c Author: Godfrey M Date: Thu Oct 17 12:19:50 2024 -0700 added mail-gun and http-client to 8.1 commit 65735a31f178c8bd4e1efabc7190a30e3500f5fd Author: Godfrey M Date: Thu Oct 17 12:18:34 2024 -0700 removed symfony/mailgun-mailer symfony/http-client commit 285d6897cf83d2cac7e791fa50d23ec88f116849 Author: Godfrey M Date: Thu Oct 17 12:05:36 2024 -0700 added a coulple test adjustments and moved mail send logic to listener commit 159a1d3f4356141844767c2c2593252b98df3b11 Author: Marcus Moore Date: Thu Oct 17 11:48:55 2024 -0700 Be more explicit commit d1149730be99fdc8e59e91ce3b02c863a08d4aa1 Author: snipe Date: Thu Oct 17 16:31:17 2024 +0100 Apply blade component to files views Signed-off-by: snipe commit 46ad1d072f5c45d20c1b078d2b3f84a3a0f36632 Merge: bcb4bd9eb 3cf746d7d Author: snipe Date: Thu Oct 17 15:29:47 2024 +0100 Merge pull request #15680 from uberbrady/bulk_checkout_to_bulk_actions Bulk checkout to bulk actions commit 780ed91a1098ed9af2a5f8f95d6ac87a14e55b20 Author: NebelKreis Date: Thu Oct 17 16:09:25 2024 +0200 Fix: Removed strtolower() from dashboard titles This fix ensures the correct capitalization in different languages. commit bcb4bd9eb4e419e8a125a7dccd3e79c39dc13e21 Merge: 250037540 f50ccbcc4 Author: snipe Date: Thu Oct 17 10:20:13 2024 +0100 Merge pull request #15683 from Toreg87/fixes/outdated_comment Fix outdated comment in CompanyableTrait commit f50ccbcc492db6c98cabf6dc6752dd99ab82bce7 Author: Tobias Regnery Date: Thu Oct 17 11:07:28 2024 +0200 Fix outdated comment in CompanyableTrait As of commit 5800e8d the user model uses CompanyableTrait so remove this clearly outdated comment commit 9a794833755ff5fb335ab6cf1e118a0d411b021e Author: Godfrey M Date: Wed Oct 16 16:59:18 2024 -0700 removed namespaces from routing commit ed6034065b34797ba531782a207fe49384e0f465 Author: Godfrey M Date: Wed Oct 16 16:47:36 2024 -0700 removed test route commit a7754c1a7fd6559b5d512fbd520556c9d10b76aa Author: Godfrey M Date: Wed Oct 16 16:46:52 2024 -0700 fixed asset checkout markdown, and notifiable variable commit 0e9b3c9119e77259ed2f8740ae98e9149936bd51 Author: snipe Date: Thu Oct 17 00:27:39 2024 +0100 Check for existence before trying to get the icon Signed-off-by: snipe commit 4933aa5784e3a86021136775055d81eed7b3c966 Author: snipe Date: Thu Oct 17 00:27:04 2024 +0100 Add StorageHelper to app config Signed-off-by: snipe commit d67addc69ee2fde2fdc9d90e1eefa13f1c1e4f26 Author: snipe Date: Thu Oct 17 00:21:43 2024 +0100 Removed filetype column - it’s dumb Signed-off-by: snipe commit 02c80ff18af48c016433807b4bdc0f384ffde41a Author: snipe Date: Thu Oct 17 00:18:40 2024 +0100 Added comment Signed-off-by: snipe commit c01190fac279b38d8ee74a636d8cf9c2fd7a7285 Author: snipe Date: Thu Oct 17 00:18:34 2024 +0100 Conditionally add content-type Signed-off-by: snipe commit 017884f8432abd3afed7397a7967bb2813df0262 Author: snipe Date: Thu Oct 17 00:09:09 2024 +0100 Added checks and filetype display Signed-off-by: snipe commit c49921f50fc54785b87d59e6265b29088bba48fe Author: snipe Date: Thu Oct 17 00:08:54 2024 +0100 Removed unused (maybe?) API endpoint Signed-off-by: snipe commit c49abb6aeafbfbf43ebcb7e1a9c565288b72b9d9 Author: snipe Date: Thu Oct 17 00:08:38 2024 +0100 Refactor the UserFilesController show method for simpler inlining Signed-off-by: snipe commit ccd20194484313c6e53bf357687ef8a29a4fffe6 Author: snipe Date: Thu Oct 17 00:08:04 2024 +0100 Removed unusded use statements Signed-off-by: snipe commit 96191a5e9391e86701095b74fefc9064e4bf74d3 Author: snipe Date: Thu Oct 17 00:07:54 2024 +0100 Added method to decide if the file should be inlinable Signed-off-by: snipe commit c56affd66345a92f64fb8c7451ced58b5340dd70 Author: snipe Date: Thu Oct 17 00:07:37 2024 +0100 Added SVG icon Signed-off-by: snipe commit 02bda3cd9598d77ddd2c68f67f589f82e0af37b3 Author: Godfrey M Date: Wed Oct 16 15:53:05 2024 -0700 adds Checkout Consumable mailable and slackwebhook channel to notifs commit 02ff646da4388422d260ed50d8e93ea7bc57dab0 Author: Godfrey M Date: Wed Oct 16 15:44:45 2024 -0700 adds checkin license mailable commit 4becdca8aa792957243e5ca9a3dcf04cfa3ee522 Author: Godfrey M Date: Wed Oct 16 15:39:20 2024 -0700 removes toMail from license notificaqtion commit 2584d603445bb0a82e722cd8b7a3dbf7f1c1d020 Author: Godfrey M Date: Wed Oct 16 15:38:49 2024 -0700 adds Licenses seat checkout Mailable commit f1d83a3f281a7d17c2b8ca52ccaf8403cac4d246 Author: Godfrey M Date: Wed Oct 16 15:30:53 2024 -0700 forgot to add asset checkout markdown to projet commit c39df34bdfabb2acde4ab8aaba01cf5c65582675 Author: Godfrey M Date: Wed Oct 16 15:29:50 2024 -0700 forgot to add accessory mail to project commit dcdf600b785501d960ee6a8f99a46f9a6ba90b9f Author: Godfrey M Date: Wed Oct 16 15:27:34 2024 -0700 adds Checkin and Checkout mailables and listner logic commit 3cf746d7df83ef3e7cfa45c602fc182ebe8f11e3 Author: Brady Wetherington Date: Wed Oct 16 23:13:32 2024 +0100 Rework the bulk checkout to not change how all checkouts work commit 6b7af802af41c92a36e77605415869c9e72ec192 Author: Brady Wetherington Date: Thu Oct 10 13:28:23 2024 +0100 Add 'bulk checkout' as one of the bulk actions in the bulk actions toolbar commit 9710436d54fc23e79bf96b61430f3f0f3345581a Author: Godfrey M Date: Wed Oct 16 13:12:07 2024 -0700 adds Mailables for asset checkin and out commit 16cffe9a9dd0cbce4f38d161a2b4cbebeaffde1c Author: Godfrey M Date: Wed Oct 16 12:53:35 2024 -0700 simplified checkout webhook call commit 9e1b86f586f2942312105b0b37d69ee8ec34ca17 Author: Godfrey M Date: Wed Oct 16 12:51:19 2024 -0700 sends checkout notification via webhook commit 3ab2521cb0b8f61cb42a7b205a7836d7950046a6 Author: Godfrey M Date: Wed Oct 16 12:21:33 2024 -0700 email comes through, no picture and html markup appear though. commit 604a9644624a52cd1aa965d92d36aa936840265d Author: Marcus Moore Date: Wed Oct 16 11:52:24 2024 -0700 Improve scenario descriptions commit 2f72c66614676efd205585e25d909424b136d869 Author: Marcus Moore Date: Wed Oct 16 11:30:06 2024 -0700 Add additional case commit fdcc17ca2c33d38a7af505c99d9547e014f5f783 Author: Tobias Regnery Date: Wed Oct 16 11:18:24 2024 +0200 Fix user creation with FullMultipleCompanySupport enabled over API It is currently possible as a non-superuser to create a new user or patch an existing user with arbitrary company over the API if FullMultipleCompanySupport is enabled. Altough a highly unlikely scenario as the user needs permission to create API keys and new users, it is a bug that should get fixed. Add a call to getIdForCurrentUser() to normalize the company_id if FullMultipleCompanySupport is enabled. commit cba1a560408c821c4112a2548a6df20755536efd Author: Marcus Moore Date: Tue Oct 15 17:38:11 2024 -0700 Improve readability? commit d9afde4610dd0527fb19fd52093f2d654ce36430 Author: Marcus Moore Date: Tue Oct 15 17:00:22 2024 -0700 Write failing test commit 9f06a0e441940606de32279c428b24a8957186fb Author: Godfrey M Date: Tue Oct 15 14:01:28 2024 -0700 handle some edge cases, null values clean up variable names commit 42095c0167b661d0f7a996a3bd17e0c0cfac5750 Author: Marcus Moore Date: Tue Oct 15 13:02:22 2024 -0700 Add reference link commit f8476f713396027e7149e7306db2bfcc710d5e5c Author: Godfrey M Date: Tue Oct 15 12:49:52 2024 -0700 finished the construct and mail call in the listner commit b29d032bf0250941a2a968c85c227bbee9449c81 Author: Godfrey M Date: Tue Oct 15 11:28:27 2024 -0700 adds checkoutAssetMail class, and content method commit 250037540038cb140c12cfe4cbf2aa9a7c0ffbdc Merge: 16c8264e7 e4e1d0d50 Author: snipe Date: Tue Oct 15 17:34:35 2024 +0100 Merge pull request #15672 from uberbrady/ldap_location_fixes Clean up how we use the '$location' in LDAP sync command commit e4e1d0d50a4a3e418d1b736dac6221d437d88b66 Author: Brady Wetherington Date: Tue Oct 15 17:26:31 2024 +0100 Clean up how we use the '$location' in LDAP sync command commit 16c8264e766b56e24c33fea740847a48a91d2cc3 Merge: 914a64720 0ae9ce0aa Author: snipe Date: Tue Oct 15 16:42:34 2024 +0100 Merge pull request #15671 from snipe/bug/sc-27147 Bug/sc 27147 commit 0ae9ce0aa9fe06b850183f15a668f366f6128565 Author: snipe Date: Tue Oct 15 16:41:45 2024 +0100 Cannot sort by updated at on Users [sc-27147] Signed-off-by: snipe commit 50b8f180b3d1315e48d8d545c3b9c7153a768bdf Author: snipe Date: Tue Oct 15 16:41:39 2024 +0100 More logical grouping in allow_columns Signed-off-by: snipe commit 914a647204843f784edeffc358d50bd0175d2d14 Merge: 69b6080bd e9225ff3e Author: snipe Date: Tue Oct 15 12:47:15 2024 +0100 Merge pull request #15669 from snipe/remlove_ou_requirenedess Fixed #15663 - remove requiredness for OU commit e9225ff3ea6952f83ec0cbda2749f0756d6f1de7 Author: snipe Date: Tue Oct 15 12:43:10 2024 +0100 Switch to regular HTML for input form field Signed-off-by: snipe commit d0d4159088e4452ff18dcfb80e3746475caedc88 Author: snipe Date: Tue Oct 15 12:42:09 2024 +0100 Fixed typo Signed-off-by: snipe commit 69b6080bd865c6db78577d256627b894b28550cd Merge: ddead359d b997d728f Author: snipe Date: Tue Oct 15 10:31:29 2024 +0100 Merge pull request #15666 from snipe/updated_readme_llm Added LLM note commit b997d728fb508f00b28d1f5db7bdd7ecd6177c0b Author: snipe Date: Tue Oct 15 10:30:34 2024 +0100 Added LLM note Signed-off-by: snipe commit ddead359d055f1ebc52b2e3bbcf4004f8233800d Merge: 0d35335da f3c4e5566 Author: snipe Date: Mon Oct 14 14:29:34 2024 +0100 Merge pull request #15660 from Toreg87/fixes/api_asset_create_fmcs2 Refactor asset creation with API commit f3c4e556675d7dcd7920807bced18b3416b0b2ec Author: Tobias Regnery Date: Mon Oct 14 15:14:41 2024 +0200 Refactor asset creation with API Commit fb4fe3004 restored the previous behaviour to check the company_id in case of FullMultipleCompanySupport. But after rereading the code and the laravel documentation, the check is already there where it belongs in AssetStoreRequest::prepareForValidation() The bug is the is_int-check of the request input in prepareForValidation(). Is is of type string even if it is a numeric value, so the call to getIdForCurrentUser() never happend. Fix this by removing the check and the now redundant call to getIdForCurrentUser(). Wrong values will get caught by the model-level validation rules. commit 0d35335da7df0d601d4221d1c2073478d3ab55b2 Author: snipe Date: Fri Oct 11 16:06:17 2024 +0100 Removed debugging Signed-off-by: snipe commit feaa71430493b46870203f31d0540a39b2355411 Author: snipe Date: Fri Oct 11 14:23:57 2024 +0100 Nicer disabled button Signed-off-by: snipe commit e1a70023b167999defc72adf3d837d8ff2679e2a Merge: de62359c6 fb4fe3004 Author: snipe Date: Fri Oct 11 11:45:48 2024 +0100 Merge pull request #15655 from Toreg87/fixes/api_asset_create_fmcs Fixes #15654 Fix asset creation with API and FullMultipleCompanySupport commit de62359c6734bdd01c1d3823b723be671ff0595b Merge: 12bda8fc7 3dc64cc5e Author: snipe Date: Fri Oct 11 11:29:34 2024 +0100 Merge pull request #15533 from marcusmoore/testing/fmcs-accessories Added tests for accessory api controller commit 12bda8fc7b756e7d930ed1a14b94f130d39f673a Merge: 8aa298f6b b054017c9 Author: snipe Date: Fri Oct 11 11:27:18 2024 +0100 Merge pull request #15653 from snipe/15651_admin_user_on_maintenances Fixed #15651 - admin user now displaying on maintenances page commit fb4fe3004906acfc53a0d26e5e62569cb078d1e8 Author: Tobias Regnery Date: Fri Oct 11 12:09:09 2024 +0200 Fix asset creation with API and FullMultipleCompanySupport It is currently possible to create an asset with arbitrary company without being superuser and FullMultipleCompanySupport enabled. This bug goes back to 75ac7f80b9 which is part of version 6.3.0. Fix this by restoring the previous behaviour to check the company_id with getIdForCurrentUser(). commit b054017c9f422d37c32b137b49ce04dc2a4e9533 Author: snipe Date: Fri Oct 11 11:16:24 2024 +0100 Fixed #15651 - admin user now displaying on maintenances page Signed-off-by: snipe commit 524a44272452d701e9da4d2e77ca10780f019f96 Author: bryanlopezinc Date: Thu Oct 10 23:32:07 2024 +0100 Improved import performance commit 8aa298f6b017c27feb5787a3d58dd9cd5023f419 Merge: 1f3465773 b5b93fdd3 Author: snipe Date: Thu Oct 10 12:30:53 2024 +0100 Merge pull request #15644 from snipe/form_requests_for_settings Form requests for settings commit 1f34657734f075286e6007c75cfb764637cb708c Author: snipe Date: Thu Oct 10 12:30:35 2024 +0100 Fixed test Signed-off-by: snipe commit 0856ee648ec8b55cf17cbbf46fddb8fb0cc05a21 Merge: 94a074a19 1dafc970d Author: snipe Date: Thu Oct 10 12:23:14 2024 +0100 Merge pull request #15648 from snipe/update_packages Updated livewire to 3.5.2 commit 1dafc970dfb517d710b57a39c25470249deeeb6f Author: snipe Date: Thu Oct 10 12:19:57 2024 +0100 Updated livewire to 3.5.2 Signed-off-by: snipe commit 94a074a193cdcba198613906641cba57e3703890 Merge: 2d49e1eff b34a7c8aa Author: snipe Date: Thu Oct 10 01:11:10 2024 +0100 Merge pull request #15601 from snipe/check_db_on_healthcheck Fixed #15439 - check database on healthcheck commit 2d49e1eff207dc37662d5a0f1017cf498c6f50c7 Merge: 705bc6f0c c2663ea1e Author: snipe Date: Thu Oct 10 01:09:11 2024 +0100 Merge pull request #15637 from akemidx/bug/sc-26614 FIXED: Badge counter showing deleted assets on User page commit 705bc6f0c0d5582cb8e3dcaed97561bfd613894f Merge: 3ee571374 67a605c9a Author: snipe Date: Thu Oct 10 01:08:25 2024 +0100 Merge pull request #15642 from uberbrady/fix_bulk_checkout Fix bulk checkout to users, assets, and locations commit b5b93fdd3a75bf72712b927b5c59c1e249c47f16 Author: snipe Date: Thu Oct 10 00:27:00 2024 +0100 Make ldap username required Signed-off-by: snipe commit d9432baf7ad497e6b7104990401a4074b1d6fe80 Author: snipe Date: Wed Oct 9 23:51:20 2024 +0100 Mlore ldap style improvements Signed-off-by: snipe commit 90be2a4498a71d55080663875e29ebd67cfdc433 Author: snipe Date: Wed Oct 9 22:26:30 2024 +0100 Use newer naming convention for errors Signed-off-by: snipe commit 3886da8941b01af7d4f7c63a141ea2bde49854c3 Author: snipe Date: Wed Oct 9 22:15:49 2024 +0100 Remove form request from get LDAP method Signed-off-by: snipe commit 130e0c6242e2590cb44d60437d8b7c0f4e3c7f67 Author: snipe Date: Wed Oct 9 22:15:37 2024 +0100 More validation Signed-off-by: snipe commit 4361a108183b8b1ed473be8bfe8b7c27eda7a84c Author: snipe Date: Wed Oct 9 22:15:30 2024 +0100 Added string Signed-off-by: snipe commit aa8048ac15fc931825083070099b0ceee550f281 Author: snipe Date: Wed Oct 9 22:15:25 2024 +0100 Blade changes for ldap Signed-off-by: snipe commit 710e738e8ef0d39f0ead49f8dd0604d201a11936 Author: snipe Date: Wed Oct 9 22:15:16 2024 +0100 Fixed tests Signed-off-by: snipe commit 3705b914399054e29d4964371ca638524a427bed Author: snipe Date: Wed Oct 9 20:51:34 2024 +0100 Added more validation Signed-off-by: snipe commit 707bdad192416c9bd6be3fd221913df282601d55 Author: snipe Date: Wed Oct 9 20:33:56 2024 +0100 Updated test Signed-off-by: snipe commit 242fe33f973131463c5ebb297b4d05aa50974c3c Author: snipe Date: Wed Oct 9 20:33:42 2024 +0100 Switch to regular HTML input Signed-off-by: snipe commit ded79469c1cdfe7ce8421b872da9945cf9ff569d Author: snipe Date: Wed Oct 9 20:33:29 2024 +0100 Remove unused controller method Signed-off-by: snipe commit d9fbf330e5302355b4c59d14fec7311e2375fb24 Author: snipe Date: Wed Oct 9 20:33:15 2024 +0100 Fixed translations Signed-off-by: snipe commit 2cb9ac26cd4b5b79fc9c813a76a8a0043ef2fa6c Author: snipe Date: Wed Oct 9 19:57:04 2024 +0100 Renamed test Signed-off-by: snipe commit 185bc966e6c699e9ff4930a254c5c79405c0b836 Author: snipe Date: Wed Oct 9 19:46:47 2024 +0100 Cleaned up use statements in tests Signed-off-by: snipe commit a7f7e4938ffb99217f9cbbc70cdf08a4a9bbf9cd Author: snipe Date: Wed Oct 9 19:31:56 2024 +0100 Added form action Signed-off-by: snipe commit 2883e791938812a54ad2e4865cfcabd40bbb5589 Author: snipe Date: Wed Oct 9 19:30:55 2024 +0100 Removed unecessary assets creation Signed-off-by: snipe commit 9c4191ae0ac4c4d338f77cb6bd3ea71c66f0844d Author: snipe Date: Wed Oct 9 19:30:42 2024 +0100 Basic tests Signed-off-by: snipe commit 3a77b83e9c71bf60f52e4900670047764b453e62 Author: snipe Date: Wed Oct 9 19:30:34 2024 +0100 Added space Signed-off-by: snipe commit d9be2b5a5e5cff6266c0ee54b5d2261885459f69 Author: snipe Date: Wed Oct 9 19:30:25 2024 +0100 Trying to use the email_array translation Signed-off-by: snipe commit 69c43c610c87babcf3919a8bac8ac73f6533330b Author: snipe Date: Wed Oct 9 19:30:00 2024 +0100 Fixed typo Signed-off-by: snipe commit 4f957bcf7191ce17bbc33b958a5b60968fb3264f Author: snipe Date: Wed Oct 9 18:34:53 2024 +0100 Required flag Signed-off-by: snipe commit 5cda7cce4830626f594de8cb4d4291c161916351 Author: snipe Date: Wed Oct 9 18:21:40 2024 +0100 Only accept a positive number for thresholds Signed-off-by: snipe commit 41b94e7128c68af71f53e95ddd8bfbc242cde198 Author: snipe Date: Wed Oct 9 18:19:26 2024 +0100 Fixed form input group Signed-off-by: snipe commit aa55fa6ff496d279ca271b4614a5f778e73ae808 Author: snipe Date: Wed Oct 9 18:16:34 2024 +0100 Switch to form requests for settings Signed-off-by: snipe commit 67a605c9a5cf01f6028bf981a35664a399b43347 Author: Brady Wetherington Date: Wed Oct 9 17:01:26 2024 +0100 Fix bulk checkout to users, assets, and locations commit c2663ea1e090c089ef58db872f9f2676891611e9 Author: akemidx Date: Tue Oct 8 16:38:33 2024 -0400 withouttrashed commit 3ee5713740c9944dbcd1233c7f35bf51c0b5ca36 Merge: ab8a22f77 56e7ea667 Author: snipe Date: Mon Oct 7 23:13:15 2024 +0100 Merge pull request #15631 from snipe/test/importer-tests Add importer tests commit ab8a22f77e13ad86c4964787cfe9bf12d57c7a6f Merge: 26d7572bc 8c9132aff Author: snipe Date: Mon Oct 7 22:56:23 2024 +0100 Merge pull request #15630 from marcusmoore/bug/sc-27028 Only show EULA when available on print users page commit 56e7ea6677ee9372a19adb30f8338995d9a245f3 Merge: 32551d55d 803532667 Author: snipe Date: Mon Oct 7 22:29:35 2024 +0100 Merge pull request #15616 from marcusmoore/test/importer-test-updates Improve importer tests commit 26d7572bcc36030f5d0b62d432a4f6bfd965d962 Merge: 382ebef8c ee046a868 Author: snipe Date: Mon Oct 7 22:28:53 2024 +0100 Merge pull request #15603 from marcusmoore/fixes/add-reguard Added `Model::reguard()` to importer commit 8c9132aff9be01a90ac53b16d87303bd912b24b0 Author: Marcus Moore Date: Mon Oct 7 14:22:49 2024 -0700 Hide EULA text and button when nothing will be displayed commit 382ebef8ca069767d9e340c7def62ca920537a91 Merge: 2be88cb95 f76da4844 Author: snipe Date: Mon Oct 7 21:26:21 2024 +0100 Merge pull request #15621 from sniff122/develop Docker Env: Change trusted proxies to RFC1918 commit 2be88cb95517c09cb962069fd41d19ee76fead33 Merge: 7fc498a59 3f36d5f9b Author: snipe Date: Mon Oct 7 11:14:24 2024 +0100 Merge pull request #15624 from snipe/fixed_line_break_on_print_all_for_users Removed duplicate JS and removed line break before user section commit 3f36d5f9b38d9adae796f01b930bccbe1b6406ed Author: snipe Date: Mon Oct 7 11:08:02 2024 +0100 Removed duplicate CSS and removed line break before user section Signed-off-by: snipe commit f76da48448e06a6008751bcf9b7148b15722b1b8 Author: Lewis Foster Date: Sat Oct 5 18:27:42 2024 +0100 Docker Env: Change trusted proxies to RFC1918 commit 8035326675e9a479c030687dc5a8079fd43e34f5 Author: Marcus Moore Date: Thu Oct 3 16:53:19 2024 -0700 Add test commit dfdd85abb17422380499d20fe4596a759ff56e4c Author: Marcus Moore Date: Thu Oct 3 15:14:07 2024 -0700 Remove unused imports commit 063ea1892b3fecdd52ad8cd353c39038a8087de7 Author: Marcus Moore Date: Thu Oct 3 15:02:03 2024 -0700 Add trait to clean up files after test runs commit e21305377549886099d21b67f49d2abbccc42d91 Author: Marcus Moore Date: Thu Oct 3 13:59:58 2024 -0700 Swap factory syntax commit 88d549e7c5ee8fd385d897be557dbbac60a66f73 Author: Marcus Moore Date: Thu Oct 3 13:40:37 2024 -0700 Remove unused data provider method commit 983a25aa5f9004e05f27713fbef6e8f9302bb772 Author: Marcus Moore Date: Thu Oct 3 13:39:54 2024 -0700 Simplify permission tests commit bde05d6ed9840d6e712e0f4a785f9c9166f352fd Author: Marcus Moore Date: Thu Oct 3 13:15:49 2024 -0700 Use new() instead of times() commit b5ffe54bd07bd6a14216e993142e9086fbdee9e7 Author: Marcus Moore Date: Thu Oct 3 13:15:02 2024 -0700 Swap assertEquals parameter order commit 863c0a8b609d9c407bf7ed038bcb7db0e40dd4df Author: Marcus Moore Date: Thu Oct 3 11:43:02 2024 -0700 Fix import_type for accessory state commit 32551d55d730271d6ab24b566b111d7e80a1e3b9 Merge: 7fc498a59 e807cfab8 Author: Marcus Moore Date: Thu Oct 3 11:39:21 2024 -0700 Merge pull request #15579 from bryanlopezinc/ImportTests Add Import data tests commit 7fc498a5977d975d0e349cf3d09e473369c5881b Merge: 78ca1026f cb281c640 Author: snipe Date: Thu Oct 3 17:39:18 2024 +0100 Merge pull request #15613 from snipe/css_fixes_for_long_values Smarter word-wrapping on long text commit cb281c6408bb81dd0fbcb8f65e0ad6fea090c154 Author: snipe Date: Thu Oct 3 17:33:46 2024 +0100 Tweaked line height Signed-off-by: snipe commit f483cd448fdcf3dc75482a0e9029f0569fc3916d Author: snipe Date: Thu Oct 3 17:27:37 2024 +0100 Smarter work-wrapping on long text Signed-off-by: snipe commit 78ca1026fd4a02e949ac500cacd48ed2dd0b4ceb Merge: 3699d7936 722d5a58e Author: snipe Date: Thu Oct 3 16:24:32 2024 +0100 Merge pull request #15612 from snipe/fixes_print_assigned_in_profile Fixes print assigned in profile commit 722d5a58e719886282f908a11420fa88f9fed4fc Author: snipe Date: Thu Oct 3 16:19:38 2024 +0100 Added isset on users Signed-off-by: snipe commit 7461c3e0ca2af18ed989a5905c84c5710213f1fb Author: snipe Date: Thu Oct 3 16:19:27 2024 +0100 Change controller to assume a collection. (This is dumb, but whatever) Signed-off-by: snipe commit 3c0f4181ae994e6e33c4c15adbb6704be921c99f Author: snipe Date: Thu Oct 3 16:19:06 2024 +0100 Use the newer button style Signed-off-by: snipe commit 3699d79363cb578ba0689f66cc512a84f8d143eb Merge: 54fbd0540 350b627ce Author: snipe Date: Thu Oct 3 14:34:00 2024 +0100 Merge pull request #15610 from uberbrady/fix_numeric_sort_bug Fix numeric sort 'ambiguous order clause' error commit 350b627ce1a247b248845b8b85d2a802c8fb8f74 Author: Brady Wetherington Date: Thu Oct 3 14:23:40 2024 +0100 Fix numeric sort 'ambiguous order clause' error commit ee046a86885deecf15601acd65ee97fac1f6b54e Author: Marcus Moore Date: Wed Oct 2 10:50:40 2024 -0700 Add matching Model::reguard() commit b34a7c8aad07ce285e09cfcd4fb779c8c4295d3f Author: snipe Date: Wed Oct 2 15:48:35 2024 +0100 Removed die() Signed-off-by: snipe commit f92bf5dc2067cae2b533090f0c3a947d16fb4d50 Author: snipe Date: Wed Oct 2 15:39:27 2024 +0100 Updated language for failure Signed-off-by: snipe commit 4d9e85026aa814bd5cba426c339f931cacdafd67 Author: snipe Date: Wed Oct 2 15:36:01 2024 +0100 Fixed #15439 - check database on healthcheck Signed-off-by: snipe commit 54fbd0540d8600ba8f49681f158d4db4fea4e9cf Merge: b483bb163 4db735808 Author: snipe Date: Wed Oct 2 12:40:49 2024 +0100 Merge branch 'develop' of https://github.com/snipe/snipe-it into develop commit b483bb1633af5933fd8ac56a489bb8717fd14a5e Author: snipe Date: Wed Oct 2 12:40:45 2024 +0100 Bumped version Signed-off-by: snipe commit 4db73580869fd4d05475f68152fb6f83304c83fc Merge: 0dd6f41f6 b9cfdf2e5 Author: snipe Date: Wed Oct 2 12:38:46 2024 +0100 Merge pull request #15593 from Godmartinz/Fixed-divide-by-zero-bug Fixed divide by zero bug in depreciation transformer commit 0dd6f41f66c0e41ca8ac3561162f818b1af88540 Author: snipe Date: Wed Oct 2 11:04:55 2024 +0100 Simplified 2fa if/else Signed-off-by: snipe commit 684c20ae393cc524821137fe442ce1f0b7a8873d Author: snipe Date: Wed Oct 2 11:00:49 2024 +0100 Fixed parenthasis Signed-off-by: snipe commit 3153bbb13fb2244a457135e7550f656a51a6ea20 Author: spencerrlongg Date: Tue Oct 1 17:04:18 2024 -0500 dumb fix commit 3dc64cc5e0465e60116e2afd9e04a865d8781199 Author: Marcus Moore Date: Tue Oct 1 13:35:39 2024 -0700 Reference accessory checkout and not the accessory commit c32f4e34b4a233bdd2f812b0ff6ff1e2ba3a8523 Author: snipe Date: Tue Oct 1 20:35:49 2024 +0100 Minor formatting fix Signed-off-by: snipe commit ca1886cebcc107b4ca4e31739cb556ad7a806caf Merge: 45ab49eea a79dfea40 Author: snipe Date: Tue Oct 1 20:31:38 2024 +0100 Merge pull request #15594 from snipe/localizations/update-2024-10-01 Updated strings commit a79dfea40a2a4776b9f7e6ae64453ef072e0870d Author: snipe Date: Tue Oct 1 20:30:58 2024 +0100 Updated strings Signed-off-by: snipe commit 45ab49eeab1e995999337f060ac76c33ddb2dcc3 Merge: 97d00e5aa 8232618a9 Author: snipe Date: Tue Oct 1 20:26:42 2024 +0100 Merge pull request #15592 from spencerrlongg/bug/catch_request_notify_errors Catch Errors Around Request Notifications commit 8232618a9f8868cd1c5495fe301544fd3461a2d5 Author: spencerrlongg Date: Tue Oct 1 14:26:32 2024 -0500 change the other one too commit 9a651b567d0c3c463f781b8e5b87609113b0fdd0 Author: spencerrlongg Date: Tue Oct 1 14:24:03 2024 -0500 change error to warning commit 97d00e5aa87fb1581aa44829e8cbb5410e021ebd Author: snipe Date: Tue Oct 1 20:08:54 2024 +0100 Fixed erroneous form tag on anchor Signed-off-by: snipe commit 5b90d79494215f27f8d1f8b02e1d14c787f44a6a Author: Marcus Moore Date: Tue Oct 1 11:50:48 2024 -0700 Use created_by commit b9cfdf2e54bdc3571e64e3ddd9dcfdec68b98222 Author: Godfrey M Date: Tue Oct 1 11:41:59 2024 -0700 reworked monthly depreciation variable value commit 1139acd9f3e026a648e3d00b7cbf4036c17518c9 Author: spencerrlongg Date: Tue Oct 1 13:36:47 2024 -0500 catch errors around request notifications commit b7ad80bd319ad787990aee24dbcbb50bb175fa21 Author: Godfrey M Date: Tue Oct 1 11:24:24 2024 -0700 fix monthly depreciation value commit 5ffd1b8daaa06865119fe0913f41dfcdfaaa8c62 Author: Godfrey M Date: Tue Oct 1 11:02:39 2024 -0700 fixes if statement in transformer commit 9a2117466e04c68e8d9e813c494d248ec44b4951 Author: snipe Date: Tue Oct 1 18:23:40 2024 +0100 Removed placeholder Signed-off-by: snipe commit 7e3a0629844446c23f2a215305764a30f32eba53 Author: snipe Date: Tue Oct 1 18:23:07 2024 +0100 Use for table header in bulk interstitial Signed-off-by: snipe commit d274fb696357f78dd107a38abcfdb0029f594899 Merge: cfc04a1d1 27ba641aa Author: snipe Date: Tue Oct 1 14:32:48 2024 +0100 Merge pull request #15589 from snipe/adds_checkin_action_on_asset_delete Adds checkin action on asset delete via View UI commit 27ba641aa512c1ab869f8b62bb62c36c07efe12f Author: snipe Date: Tue Oct 1 14:30:34 2024 +0100 Added checkin on delete to API Signed-off-by: snipe commit 5823197e6fe2ec09448e41300d4b129e5435cf96 Author: snipe Date: Tue Oct 1 14:29:02 2024 +0100 Added checkin action on delete for checked out assets Signed-off-by: snipe commit cfc04a1d12825245594a3da2df03367ccf7dd3e3 Merge: 12da43303 cae8aa784 Author: snipe Date: Tue Oct 1 14:08:58 2024 +0100 Merge pull request #15588 from snipe/added_more_maxlengths Added maxlengths to additional fields commit cae8aa78406c28d8b6c1cc40d79c05a42f38d988 Author: snipe Date: Tue Oct 1 14:02:54 2024 +0100 Added maxlengths to additional fields Signed-off-by: snipe commit 12da43303f162feed2c68bfd9b181760ff1a5d8c Author: snipe Date: Tue Oct 1 01:44:05 2024 +0100 Fixed #15584 - regression with required css change Signed-off-by: snipe commit fdfea390fbdc619888c9f97cacc2a13fcffd3d29 Merge: d609ed50a 5689e940b Author: Marcus Moore Date: Mon Sep 30 12:59:27 2024 -0700 Merge branch 'develop' into testing/fmcs-accessories commit b04afbbc855927f491a9eeb5efbb9df520c01bf9 Merge: b964ce102 3f311ba2f Author: snipe Date: Mon Sep 30 19:26:08 2024 +0100 Merge pull request #15564 from uberbrady/improve_autoclose Get us better debugging output for new Github Stale Action commit b964ce102556d3ec9c15b4d4301aaf7121d078e9 Merge: 6217cba20 68e3f375f Author: snipe Date: Mon Sep 30 19:25:05 2024 +0100 Merge pull request #15583 from Godmartinz/remove-sortable-from-depreciations Removed sortablity for current value column in depreciations report commit 6217cba2017ef231cadd4b9b6554fb504d0e3dd3 Merge: 5689e940b b32ab6a06 Author: snipe Date: Mon Sep 30 19:24:19 2024 +0100 Merge pull request #15524 from Godmartinz/double-notif-bug Fixed double webhook notifications // Separated email and webhook notifications. commit 68e3f375fc1fecd0baf0e4a5346b05717e332749 Author: Godfrey M Date: Mon Sep 30 11:15:49 2024 -0700 removes sortablity from current value column commit 5689e940b85e767fe109de28fd264bc632b6c8b5 Author: snipe Date: Mon Sep 30 18:23:12 2024 +0100 Fixed #15581 - missing bracker Signed-off-by: snipe commit e807cfab869b558c4ee6f2bb72fb78b6e496d2b1 Merge: 0b3f45856 001348c63 Author: bryanlopezinc Date: Mon Sep 30 12:47:52 2024 +0100 Merge branch 'develop' into importTests commit 0b3f458561370fd6c825cc756c2de633c77326df Author: bryanlopezinc Date: Mon Sep 30 12:42:41 2024 +0100 Added tests for Import feature commit 001348c6388b8daa05a5f4ed4e248639c06b4d67 Author: snipe Date: Sun Sep 29 14:33:42 2024 +0100 Unset required on checkout select :( Related to the discussion at #15552 Signed-off-by: snipe commit 1b041af8625ce3a0107de6f68246308050f54800 Merge: 260b15368 d120585f9 Author: snipe Date: Sun Sep 29 11:25:01 2024 +0100 Merge remote-tracking branch 'origin/master' into develop Signed-off-by: snipe # Conflicts: # public/css/build/app.css # public/css/build/overrides.css # public/css/dist/all.css # public/mix-manifest.json commit 260b153689368a2936e55959d83621f1e4ae5c37 Merge: 36b27fcda 05d74f7a9 Author: snipe Date: Sat Sep 28 16:09:51 2024 +0100 Merge pull request #15573 from snipe/fixed_requiredness_indicator Fixes for requiredness indicator in UI commit 05d74f7a92c0afaa00e1a520983b90545c7f79d9 Author: snipe Date: Sat Sep 28 15:42:03 2024 +0100 Covered setup pages too Signed-off-by: snipe commit dc85588d7f9cd3f0e485ea148eb491e10154909d Author: snipe Date: Sat Sep 28 15:31:44 2024 +0100 Don’t show password as required if editing Signed-off-by: snipe commit 585f998cae3bf8d812509fba7937cd28b9b4a5d0 Author: snipe Date: Sat Sep 28 15:28:06 2024 +0100 Fixes for requiredness display Signed-off-by: snipe commit d120585f94f22e03692b86dd1a0d3ebed4bb1f82 Author: snipe Date: Fri Sep 27 14:07:30 2024 +0100 Check for valid eula for license, consumable Signed-off-by: snipe commit 166a700342eddf283370bc15b72d7f9e3d681431 Merge: 6c85ba349 36b27fcda Author: snipe Date: Fri Sep 27 13:37:28 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 36b27fcda3b3fc0978a951a78f88f6e62796fb87 Author: snipe Date: Fri Sep 27 13:37:14 2024 +0100 Check for valid category before getting the eula Signed-off-by: snipe commit a44490e44868ba992c784af12d516172e89c2ecd Author: snipe Date: Fri Sep 27 13:07:24 2024 +0100 Nowrap on files column Signed-off-by: snipe commit 9aada2ec701cadbe6eeb8ec77d0f2954511cf3a2 Merge: ac6411743 ef82f954e Author: snipe Date: Thu Sep 26 09:09:35 2024 +0100 Merge pull request #15498 from Godmartinz/Modal_fix Refactoring modals with partials and fixing misalignments commit 3f74ff25d2e0ddc259c6d397150ff6d5ac42d6ed Author: Godfrey M Date: Wed Sep 25 16:19:09 2024 -0700 fixed error message commit ef82f954e538d8afb6e765aadcffe79b914c276a Author: Godfrey M Date: Wed Sep 25 15:47:57 2024 -0700 fixed required css, and user input lengths commit 3f311ba2fb37c19a4f728720b06a5bfee9ded63d Author: Brady Wetherington Date: Wed Sep 25 21:27:45 2024 +0100 Get us better debugging output for new Github Stale Action commit 96953aa2edeacd13a05da471cf03f5608b561d96 Merge: e609b3976 b797c37ac Author: Godfrey Martinez <47435081+Godmartinz@users.noreply.github.com> Date: Wed Sep 25 12:50:01 2024 -0700 Merge pull request #23 from Godmartinz/Modal_fix_p3 replace duplicate code with partials commit b797c37acba1801e52945202620fdb12e20e0796 Author: Godfrey M Date: Wed Sep 25 12:48:05 2024 -0700 replace duplicate code with partials commit 6c85ba3495a005be6a413e014c51b25a820db31a Merge: 9f8473e25 ac6411743 Author: snipe Date: Wed Sep 25 20:45:02 2024 +0100 Merge remote-tracking branch 'origin/develop' commit ac6411743bab13cb5b6a63c0b5312bdc494acba0 Merge: 9b03f4649 3f0245f88 Author: snipe Date: Wed Sep 25 20:35:58 2024 +0100 Merge pull request #15563 from snipe/refined_gates_on_user_bulk Update for #15534 - Refined gates on user bulk commit 3f0245f88f03b7e7ec3e7903a6b88027c5e5c01d Author: snipe Date: Wed Sep 25 20:33:00 2024 +0100 Make controller gate match dropdown gate Signed-off-by: snipe commit c02647a0fa025d9807b242a4707a2525e578000c Author: snipe Date: Wed Sep 25 20:32:03 2024 +0100 Moved merge into delete gate, since they do technically delete Signed-off-by: snipe commit edca3f432ce1384e0b087d8209787e60beac1219 Author: snipe Date: Wed Sep 25 20:30:58 2024 +0100 Removed gate for delete Signed-off-by: snipe commit 2218c94aa30fe83c460239cfdb4044c49e79baf6 Author: snipe Date: Wed Sep 25 20:29:23 2024 +0100 Gates the dropdown based on user permissions Signed-off-by: snipe commit e609b39760ff48e2b5b7d51a4e31d47a7d57f272 Merge: 0bc98e971 12522a379 Author: Godfrey Martinez <47435081+Godmartinz@users.noreply.github.com> Date: Wed Sep 25 12:09:26 2024 -0700 Merge pull request #22 from Godmartinz/Modal_fix_p2 Modal fix p2 commit 12522a3791a0705340f999b7a665d0ea45aa5918 Author: Godfrey M Date: Wed Sep 25 12:07:15 2024 -0700 fix spacing issues commit f6d7ea19e4df08cb80c3875060d5b51333e9f025 Author: snipe Date: Wed Sep 25 19:44:39 2024 +0100 Set view as base permission, drill down for more intrusive actions Signed-off-by: snipe commit 18ddffe8f96deeecd84b1098f3f83d034c923e5d Author: Godfrey M Date: Wed Sep 25 11:42:16 2024 -0700 fix partial variable intialization, fix width of input fields commit 9b03f4649051998b95feb0a54b83a0f00c483c8b Merge: cb6e5042d fac4833b5 Author: snipe Date: Wed Sep 25 19:32:01 2024 +0100 Merge pull request #15534 from marcusmoore/bulk-print-users Added the ability to bulk print users commit 926a319552eff366f68081d828362fa1e6977a05 Merge: 0bc98e971 cb6e5042d Author: Godfrey M Date: Wed Sep 25 11:10:24 2024 -0700 Merge branch 'develop' into Modal_fix_p2 commit 9f8473e254b858042fb0ec1c89edb57fc3f93707 Merge: 0e61d0b19 cb6e5042d Author: snipe Date: Wed Sep 25 18:36:40 2024 +0100 Merge remote-tracking branch 'origin/develop' commit cb6e5042d91b4dd6711964377bd328ca7088194f Merge: c1a887b48 ba69259f2 Author: snipe Date: Wed Sep 25 18:32:59 2024 +0100 Merge pull request #15547 from snipe/disallow_checkout_with_nondeployable_status Fixed #13396 - do not allow checkout to undeployable status types commit c1a887b48b9f6d8c482ebe93e940cfc3d76d7d49 Merge: ba1220484 658c94ad8 Author: snipe Date: Wed Sep 25 18:32:21 2024 +0100 Merge pull request #15561 from snipe/fixes/adds_action_date_to_sorting Changed `action_date` to `created_at` in activity report commit 658c94ad8b31495c37ec100b39e1daaab1f253b2 Author: snipe Date: Wed Sep 25 17:25:15 2024 +0100 Changed action_date to created_at Signed-off-by: snipe commit 0e61d0b195557e88fb698d16b5ee9a51625f4262 Merge: abdddbec4 ba1220484 Author: snipe Date: Wed Sep 25 15:51:38 2024 +0100 Merge remote-tracking branch 'origin/develop' commit ba12204842b68a5fa57aa1e24f9084d38e897890 Merge: eeabc8dc9 1c3babaca Author: snipe Date: Wed Sep 25 15:51:14 2024 +0100 Merge pull request #15555 from snipe/fixes/user_file_upload Fixed case on `$logAction` for user file upload commit 1c3babacaf9401c4559e24623722d81b44c6e2b4 Author: snipe Date: Wed Sep 25 15:46:57 2024 +0100 Fixed case on logAction for usewr file upload Signed-off-by: snipe commit abdddbec448c4912a2c0fbcd2c769953b491bc5d Merge: a425c2b76 eeabc8dc9 Author: snipe Date: Wed Sep 25 11:58:25 2024 +0100 Merge remote-tracking branch 'origin/develop' Signed-off-by: snipe # Conflicts: # public/css/build/app.css # public/css/build/overrides.css # public/css/dist/all.css # public/mix-manifest.json commit eeabc8dc9d0adf5d2069c3b152fca2a6eb33bd2a Author: snipe Date: Wed Sep 25 11:33:45 2024 +0100 Dev assets Signed-off-by: snipe commit 21f8ac8e52205777dc8775604a8592b9a41c23a7 Merge: c38222e95 2a2666be0 Author: snipe Date: Wed Sep 25 11:31:23 2024 +0100 Merge pull request #15552 from Godmartinz/ragged-form-inputs Fixed input field misalignments commit a425c2b765f893789be1f624518a8ea3ae711547 Merge: 34eb10ff7 c38222e95 Author: snipe Date: Wed Sep 25 10:52:19 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 2a2666be0b4210075ac1786ffb9e8cbfa6dbd632 Author: Godfrey M Date: Tue Sep 24 13:24:50 2024 -0700 makes required a pseudo field commit c38222e9569548d0981e576156bd58f4b778452c Merge: 8cf1e4dce 0ce5832b6 Author: snipe Date: Tue Sep 24 18:10:53 2024 +0100 Merge pull request #15549 from snipe/fixes/#15548_unify_audit_api_endpoints Fixes #15548 - unify audit api endpoints commit 0ce5832b6cbed103433664fd9aa08cef2c1fd796 Author: snipe Date: Tue Sep 24 17:29:40 2024 +0100 Removed debugging Signed-off-by: snipe commit b6340532d7e34c31d65999e55440241935c6db60 Author: Brady Wetherington Date: Tue Sep 24 17:15:39 2024 +0100 Improve the error and success messages and linking commit 5fb43dd159b1af02c82f2b3a3f3530c9ca6612ec Author: snipe Date: Tue Sep 24 16:55:56 2024 +0100 Handle `audit` *and* `audits` for urls Signed-off-by: snipe commit de57d71bf12dc48bef933e6c64e23e8724996297 Author: snipe Date: Tue Sep 24 16:30:24 2024 +0100 Fixed #15548 - unify audit due/overdue APIs Signed-off-by: snipe commit ba69259f2d2181d9bad2f9fb33d2e46c5137a8f8 Author: snipe Date: Tue Sep 24 15:35:00 2024 +0100 Fixed #13396 - do not allow checkout to undeployable status types Signed-off-by: snipe commit c71411465a03499caf98937857e95ec489e865b4 Author: Brady Wetherington Date: Tue Sep 24 15:17:35 2024 +0100 First pass at better-handling those annoying Rollbars we keep getting commit 8cf1e4dceb7682b196592d09cf56817d6caa4295 Merge: ab0c009c0 66249a37e Author: snipe Date: Tue Sep 24 11:10:20 2024 +0100 Merge pull request #15544 from snipe/bug/sc-26855 Fixed app settings view on mobile commit 66249a37ed6ea5982d4aca91a2d4d77f5e61488b Author: snipe Date: Tue Sep 24 11:08:31 2024 +0100 Tweaked styles Signed-off-by: snipe commit 96712cb398d5d4142068166daddc5ce983a67041 Author: snipe Date: Tue Sep 24 10:55:26 2024 +0100 Fixed app settings view on mobile Signed-off-by: snipe commit fac4833b58a8d5102fa97b365d753fb91447d848 Author: Marcus Moore Date: Mon Sep 23 17:15:16 2024 -0700 Remove unused import commit a12c9d053ff6fc399e30287c246f24b392e0209a Author: Marcus Moore Date: Mon Sep 23 16:44:25 2024 -0700 Hide label when printing commit 8b3b68b308b55d35894f25abdfa3421ad8f9d64e Author: Marcus Moore Date: Mon Sep 23 16:43:14 2024 -0700 Show or hide all eulas at once when printing multiple users commit 4b02db5031cb4e8f850a9ea942e99efe449c8895 Author: Marcus Moore Date: Mon Sep 23 16:26:22 2024 -0700 Add authorization check in bulk users controller commit ab90c0cf05c36796e69641f1ee6c8120df2a2c56 Author: Marcus Moore Date: Mon Sep 23 16:10:40 2024 -0700 Add missing eager load in bulk users controller commit cef7ddc719a7f6fdc63b341038aa28b89cd2ead2 Author: Marcus Moore Date: Mon Sep 23 16:10:21 2024 -0700 Add eager loads to userscontroller commit 3870095a28784d7b776b4647b0bbe325cadea8aa Author: Marcus Moore Date: Mon Sep 23 15:50:24 2024 -0700 Fix Cannot read properties of undefined error by removing snipe-table class from eula table commit a02e250b22538e440ff0b25578c62540a316c029 Author: Marcus Moore Date: Mon Sep 23 15:26:15 2024 -0700 Add page breaks for each user commit 8ac5c0e471867163beae248ae5cb81891e8c2d9e Author: Marcus Moore Date: Mon Sep 23 14:05:47 2024 -0700 Re-combine layout and view commit a2d4dcf6e82df284602990bf9465129e0997a27b Author: Marcus Moore Date: Mon Sep 23 12:49:36 2024 -0700 Use bulk actions menu commit 54044bfa5e4752c3ac0dc907bb40734154520f31 Author: Marcus Moore Date: Mon Sep 23 10:57:57 2024 -0700 Add eager loads commit e493cc964daf88a8e4f0ddf5d397f6092d6f745e Author: Marcus Moore Date: Mon Sep 23 10:48:07 2024 -0700 Remove AssetCountForSidebar middleware from print view commit 29af210f4fc7351fa319139e5b7022aae82b2a28 Merge: 5128fd49e ab0c009c0 Author: Marcus Moore Date: Mon Sep 23 10:26:20 2024 -0700 Merge branch 'develop' into bulk-print-users commit 34eb10ff73e50cf9617779c085fc7f529a436b89 Merge: 7d7d58769 ab0c009c0 Author: snipe Date: Fri Sep 20 19:45:20 2024 +0100 Merge remote-tracking branch 'origin/develop' commit ab0c009c0db3cabfed8401b3754aa2addfbc111c Author: snipe Date: Fri Sep 20 19:45:10 2024 +0100 Fixed seeder Signed-off-by: snipe commit 7d7d58769c637e70d993b585273f2c65e6322346 Merge: 245d5dc46 b68805cf8 Author: snipe Date: Fri Sep 20 19:13:00 2024 +0100 Merge remote-tracking branch 'origin/develop' commit b68805cf83aeff549346e68013d2c5e017a7fabb Author: snipe Date: Fri Sep 20 19:11:52 2024 +0100 Small fix for notifications checkout Signed-off-by: snipe commit 245d5dc469c7d68b2601d02dfa307060f0af5a1f Merge: 4ab478bb9 7d858129d Author: snipe Date: Fri Sep 20 17:28:15 2024 +0100 Merge remote-tracking branch 'origin/develop' Signed-off-by: snipe # Conflicts: # config/version.php commit 7d858129d9b42dda78f82ef2501461070d22fb85 Author: snipe Date: Fri Sep 20 14:44:19 2024 +0100 Bumped hash Signed-off-by: snipe commit 65ce63bc9b530daa8b652371d929e9709a4086c6 Merge: 5eea9d195 54fba2f54 Author: snipe Date: Fri Sep 20 14:42:07 2024 +0100 Merge pull request #15537 from snipe/snyk/updated_jspdf_autotable Updated jspdf autotable commit 54fba2f547c61b4dee28722faa334b529b82452b Author: snipe Date: Fri Sep 20 14:40:41 2024 +0100 Update jspdf autotable Signed-off-by: snipe commit 5eea9d1950ab673df373733bba248e50e83d0539 Author: snipe Date: Fri Sep 20 14:33:56 2024 +0100 Corrected text warning translation Signed-off-by: snipe commit b84a634ec78e72f489d4c19b95becea5b9316228 Author: snipe Date: Fri Sep 20 14:33:35 2024 +0100 Corrected comment Signed-off-by: snipe commit 2fc88a0e081ddd17672a68fa59513b6ecd992124 Author: snipe Date: Fri Sep 20 14:33:26 2024 +0100 Eager load adminuser Signed-off-by: snipe commit bc540b6564a7e08720339de708299c04979c7024 Author: snipe Date: Fri Sep 20 14:02:28 2024 +0100 Requestable status not saving with manual [sc-26848] Signed-off-by: snipe commit f53b852dffef85dce789bd620b65b5f0ca0aae3d Author: snipe Date: Fri Sep 20 13:53:52 2024 +0100 Make created_by equal one in the seeder Signed-off-by: snipe commit b83d1a043f49a484acea8b38d184120d6d16fa68 Merge: cdb7ccb8f b21c303e5 Author: snipe Date: Fri Sep 20 13:47:31 2024 +0100 Merge pull request #15519 from snipe/features/add_created_at_created_by Change `user_id` to `created_by` commit 4ab478bb97206aaf6265c6a86c578a079ee7d067 Merge: d96c5e1ba cdb7ccb8f Author: snipe Date: Fri Sep 20 13:44:45 2024 +0100 Merge remote-tracking branch 'origin/develop' commit b21c303e5652992c49b3b73c5a1c7bd1eeb8b95a Merge: b88f2054d cdb7ccb8f Author: snipe Date: Fri Sep 20 13:43:50 2024 +0100 Merge remote-tracking branch 'origin/develop' into features/add_created_at_created_by commit 5128fd49e6f7705c8b9b4b095a2423544439ff94 Author: Marcus Moore Date: Thu Sep 19 17:27:25 2024 -0700 Allow printing all users commit 2d2d5bdc7ea37174da7069471eac03d002584698 Author: Marcus Moore Date: Thu Sep 19 17:23:47 2024 -0700 Pass user in array commit 8364d26c9be3bafd6ab918f124a99bfa99e0aaa5 Author: Marcus Moore Date: Thu Sep 19 17:18:26 2024 -0700 Extract parent layout commit efd6d7625fa7e99719e483625a474a2c39061b21 Author: Marcus Moore Date: Thu Sep 19 17:16:05 2024 -0700 Remove bad closing tag commit bdf5708bfcf4b9c95a8d8edf7544db74f8e69ffb Author: Marcus Moore Date: Thu Sep 19 17:10:43 2024 -0700 Remove accidental line commit e95703cb181b273b0fdbc5016ab585408c7636c0 Author: Marcus Moore Date: Thu Sep 19 17:10:07 2024 -0700 Use eager load commit 7ad4a2997094f9302e4858e4ca61453758fbf3cc Author: Marcus Moore Date: Thu Sep 19 16:54:39 2024 -0700 Add eager loading commit cdb7ccb8f3910ab8783cdcb4fe5d41866988b594 Merge: 8270947ed d446773fd Author: snipe Date: Thu Sep 19 21:54:03 2024 +0100 Merge pull request #15532 from spencerrlongg/bug/15253 Catch Exceptions on Checkout Notification commit 8270947ed29dffcfac20dff105068516449467f6 Merge: 4f7c8e0c3 8e1111c68 Author: snipe Date: Thu Sep 19 21:49:27 2024 +0100 Merge pull request #13291 from akemidx/eol_date_range_for_reports Added date range for EOL in custom reports commit 4f7c8e0c3d27b0d77994cdb73cbfb625f0e3859e Merge: d7bde3784 3ea5d4ee4 Author: snipe Date: Thu Sep 19 21:36:09 2024 +0100 Merge pull request #14671 from Robert-Azelis/patch-6 [FIX] Update EOL date when used bulk update of purchase date commit d609ed50a42641ed8a5003d5013b13e447bbfca2 Merge: d639d6fbc d7bde3784 Author: Marcus Moore Date: Thu Sep 19 13:20:55 2024 -0700 Merge branch 'develop' into testing/fmcs-accessories commit b88f2054dd771ed7678022d1ec97b378d015e553 Author: snipe Date: Thu Sep 19 20:38:34 2024 +0100 Refactor isDeletable on companies Signed-off-by: snipe commit d7914e238d8a6c4db5eac92cf52ec2485b384536 Author: snipe Date: Thu Sep 19 20:34:54 2024 +0100 Added created by to company on save Signed-off-by: snipe commit d7bde37842dbfa03cbbe1910c9fae5ef897f4b4a Merge: 454796e52 4facc4007 Author: snipe Date: Thu Sep 19 20:33:10 2024 +0100 Merge pull request #15507 from setpill/setpill/feat/use_explicit_attributes_in_ldap_sync Added #15506: Explicitly request used LDAP attributes commit 454796e52a99ac8631d7bb0cce45f220a4993419 Merge: eef487d61 7c85ad54e Author: snipe Date: Thu Sep 19 20:32:03 2024 +0100 Merge pull request #15518 from snipe/sort_by_numeric_custom_fields Fixed #11634 - Sort by numeric columns for numeric custom fields commit eef487d61b74b61858b953a9eb3e871c9ca330d6 Merge: dddbf27d7 71dbc7abb Author: snipe Date: Thu Sep 19 20:31:02 2024 +0100 Merge pull request #15531 from Godmartinz/status-doesnt-update-in-email Fixed mail notification field `status label` not updating commit 71dbc7abb0ab43d0887449a185236c12ccd591d8 Author: Godfrey M Date: Thu Sep 19 12:23:07 2024 -0700 refreshed the assetstatus relationship commit d639d6fbc1467ce8f231c73507ec371f4c705fc5 Author: Marcus Moore Date: Thu Sep 19 12:21:54 2024 -0700 Add tests for accessory select list endpoint commit 74088ea5813b0ccdb4b6c58e375f41bb19ecae29 Author: snipe Date: Thu Sep 19 20:13:38 2024 +0100 Optimize isDeletable counts Signed-off-by: snipe commit fff069824b91753a5b0bbd042f7fe0e9d9240aac Author: Marcus Moore Date: Thu Sep 19 12:11:03 2024 -0700 Add tests for update accessory endpoint commit d446773fdd0a6782583a9e7fd384888996fdc5e5 Author: spencerrlongg Date: Thu Sep 19 14:05:48 2024 -0500 catch exceptions on notification commit f283b5fbe88b3f582b8f13c52532bb8de80548da Author: snipe Date: Thu Sep 19 19:56:39 2024 +0100 Eager load adminuser Signed-off-by: snipe commit a5be18bb14242da7d503fe8b6e1c5d31ad1a07e8 Author: Marcus Moore Date: Thu Sep 19 11:55:15 2024 -0700 Add test for limit and offset commit eb6f05faf7f2f6c94a56d93ee95fd48c44f60a9f Author: snipe Date: Thu Sep 19 19:41:46 2024 +0100 Eager load adminuser Signed-off-by: snipe commit 118183ff58b3d136a1abcad75fc399ff6622e825 Author: snipe Date: Thu Sep 19 19:41:39 2024 +0100 Removed footer Signed-off-by: snipe commit 21378904969e0ad166355cd8a92b2bcc74978510 Author: Marcus Moore Date: Thu Sep 19 11:33:20 2024 -0700 Remove dead code commit ebf6ce69809b30178aa09d43ed45669cc886ed73 Author: snipe Date: Thu Sep 19 19:27:10 2024 +0100 Refactor for fewer queries Signed-off-by: snipe commit 9b22d6d493734e2ff55b6b2e80f682b98f92e6e4 Author: Marcus Moore Date: Thu Sep 19 11:24:01 2024 -0700 Add tests for accessory checkouts endpoint commit 5ebf0ed2b2a0793d241b982bb293779cf4851939 Author: snipe Date: Thu Sep 19 19:19:14 2024 +0100 Updated variable Signed-off-by: snipe commit 836893cba527149e25804b5767c35d08d313dd0b Author: snipe Date: Thu Sep 19 18:35:00 2024 +0100 Added id to report Signed-off-by: snipe commit cd98b3817d53ace3a1345e30d8ce6d15af6decb5 Author: snipe Date: Thu Sep 19 18:26:08 2024 +0100 Removed duplicate line Signed-off-by: snipe commit 727806372c66a9945be301c597d5f9182b626b22 Author: snipe Date: Thu Sep 19 18:22:11 2024 +0100 Added created_by to status label Signed-off-by: snipe commit 5e1c736d4982b1e7c9bf15f848210d5e2fcedb2d Author: snipe Date: Thu Sep 19 18:04:50 2024 +0100 Added created_by for manufacturers Signed-off-by: snipe commit 6579fa72dae9eb31b24ff4944cab61ab49c463bd Author: snipe Date: Thu Sep 19 17:56:05 2024 +0100 Added scoping for categories and companies Signed-off-by: snipe commit 82d6e1510f6a8472e9cbfb70342113497a6a692d Author: snipe Date: Thu Sep 19 17:41:05 2024 +0100 Order by created_by for depreciations Signed-off-by: snipe commit 822ea96dfd4d77ca33ed4860cc4e318930b4d836 Author: snipe Date: Thu Sep 19 17:31:46 2024 +0100 Use auth()->id() instead of Auth::id() Signed-off-by: snipe commit b247fc33b9de9f4395481ab8498df73eb97cf999 Author: snipe Date: Thu Sep 19 17:28:01 2024 +0100 Added legacy comment Signed-off-by: snipe commit 2dcae780c0d5b1cb572a70ebc268e39dca124b4f Author: snipe Date: Thu Sep 19 17:26:21 2024 +0100 Reapply deleted code Signed-off-by: snipe commit 5c3180ffa074c3ade9647e958ea3d0bbbe099f16 Author: snipe Date: Thu Sep 19 17:25:09 2024 +0100 Removed duplicate code Signed-off-by: snipe commit 65eba30038ddebd2bdfac8b11c26d4ee55e2dd49 Author: snipe Date: Thu Sep 19 17:23:34 2024 +0100 Fixed markdown in acceptance reminder Signed-off-by: snipe commit bbce7b40ca27d1d01ae75a63237832c945255454 Author: snipe Date: Thu Sep 19 17:20:56 2024 +0100 Additional consistencies Signed-off-by: snipe commit 02a29c71efa32eb4cde7358d19cc09f15d6aa60e Author: snipe Date: Thu Sep 19 17:01:48 2024 +0100 Added created_by Signed-off-by: snipe commit 66999959725e204448ffa56fc829378440d10a8a Author: snipe Date: Thu Sep 19 17:01:36 2024 +0100 Added created_by to components Signed-off-by: snipe commit 951f03094a27f94f9120e05648bdbe911cb2c4a9 Author: snipe Date: Thu Sep 19 17:01:17 2024 +0100 Added created_by to kits Signed-off-by: snipe commit 354b00ef15db3de303a1908afd2e76d091cff29a Author: snipe Date: Thu Sep 19 16:45:51 2024 +0100 Made method name consistent Signed-off-by: snipe commit c93229179b6b3e67e81a995c645563cd05bcf8f7 Author: snipe Date: Thu Sep 19 16:45:39 2024 +0100 Added order by created_by to accessories Signed-off-by: snipe commit a77a7065d7d09a986147e4ee825073f8a2f4958f Author: snipe Date: Thu Sep 19 16:34:10 2024 +0100 Added order by admin to assets Signed-off-by: snipe commit 4363e8b34c2b94d94543a6988fd026449a01e04a Author: snipe Date: Thu Sep 19 16:20:42 2024 +0100 Updated importer Signed-off-by: snipe commit 9adb2c24f3a26a846f870494d2e27cc699deaf50 Author: snipe Date: Thu Sep 19 16:06:36 2024 +0100 Squashed commit of the following: commit dddbf27d780be4871ddbc401740f35a4561039a4 Author: snipe Date: Wed Sep 18 14:18:52 2024 +0100 Updated language strings Signed-off-by: snipe commit fcefcc8184b615bc9cdea9888e1f595f8fbc69b8 Merge: 04bb3eec8 3519a82dd Author: snipe Date: Wed Sep 18 13:44:44 2024 +0100 Merge pull request #15512 from marcusmoore/testing/fmcs Added tests for delete methods in api commit 04bb3eec8308556c8e26166dfcae7ac7ec3aa446 Merge: 154d5d8d9 f963b9a19 Author: snipe Date: Wed Sep 18 13:41:37 2024 +0100 Merge pull request #15521 from uberbrady/improve_country_selector Fix selected-index of Countries drop-down [fd-44144] commit f963b9a19f7b135a9141da34b1af0104a02ca5b3 Author: Brady Wetherington Date: Wed Sep 18 13:24:26 2024 +0100 Fix selected-index of Countries drop-down commit 154d5d8d913fcea2bfc18ddff26ec874a21b5640 Merge: 6c996b775 9e5f6d656 Author: snipe Date: Tue Sep 17 23:40:25 2024 +0100 Merge pull request #15491 from uberbrady/numeric_prefixes_add_multiple_assets [Fixes fd-43940] Improve multi-asset create when using numeric prefixes to asset_tags commit 3519a82dddedebfd518cbff61ddc1e1c979859fe Author: Marcus Moore Date: Mon Sep 16 16:55:20 2024 -0700 Fix name: TestsFullMultipleCompaniesSupport commit a629df07bfc25da2e71a158a09cee9f5e3b1a612 Author: Marcus Moore Date: Mon Sep 16 14:49:08 2024 -0700 Implement interfaces on existing test classes commit 9a13fcab23f76a7336ffe58e38f269bfd3cea4cd Author: Marcus Moore Date: Mon Sep 16 14:38:38 2024 -0700 Pluralize commit f5705a1dde7a736e167e27ec156f72351cfb47ec Author: Marcus Moore Date: Mon Sep 16 14:34:55 2024 -0700 More unification commit f325c4afdb234ab4ba820caac45bdf599a550c2f Author: Marcus Moore Date: Mon Sep 16 14:32:38 2024 -0700 Unify assertion method commit 1fddacd7d0440db2598c1d0e4aa0373de204bf53 Author: Marcus Moore Date: Mon Sep 16 14:25:11 2024 -0700 Re-order test methods commit 4af893df6189423edeb73d5239a12d4c7d5a68d0 Author: Marcus Moore Date: Mon Sep 16 14:20:24 2024 -0700 Improve assertions commit b8b3f91ce49e5d1829bcb2a84f4d145dc1701b29 Author: Marcus Moore Date: Mon Sep 16 13:55:18 2024 -0700 Formatting commit 7f40f55343fe7e801c6de0cd0d1fa63f442b8349 Author: Marcus Moore Date: Mon Sep 16 13:52:02 2024 -0700 Add tests for delete supplier endpoint commit b06e8d442d81b40e82ba70aaacf277eb5b5e075f Author: Marcus Moore Date: Mon Sep 16 13:37:08 2024 -0700 Add tests for delete status label endpoint commit c269184c60e69b7aa319fedc5b4bbcb122677cb8 Author: Marcus Moore Date: Mon Sep 16 13:29:41 2024 -0700 Add tests for delete predefined kit endpoint commit 53c673dee21e9f8cb00904950ec66cb05bde6c55 Author: Marcus Moore Date: Mon Sep 16 13:13:12 2024 -0700 Add tests for delete manufacturer endpoint commit 50730fc4fba2519fb13799bc93ab682c10092c25 Author: Marcus Moore Date: Mon Sep 16 12:37:18 2024 -0700 Add tests for delete location endpoint commit 60a54cee797aa86e80c5abfe57699f263a85e841 Author: Marcus Moore Date: Mon Sep 16 12:33:30 2024 -0700 Add tests for delete license endpoint commit 446e962a503078e0c5fabef90aac7ada21ecb6e2 Author: Marcus Moore Date: Mon Sep 16 10:38:51 2024 -0700 Add tests for delete group endpoint commit 79a4bb73169445bb7a1e1e6bef4aff8a25dc1a12 Author: Marcus Moore Date: Mon Sep 16 10:35:44 2024 -0700 Add tests for delete depreciation endpoint commit 2f76c1bc5b5259cbb069356da8e8249a18910011 Author: Marcus Moore Date: Mon Sep 16 10:33:21 2024 -0700 Add assertion commit 38b9f4a43893f8c86e75d141a2ec41a7c2f90758 Author: Marcus Moore Date: Mon Sep 16 10:29:20 2024 -0700 Add tests for delete departments endpoint commit 3105f53afffdd78311314e970f6fe893e1162f8e Author: Marcus Moore Date: Thu Sep 12 16:54:29 2024 -0700 Add tests for delete custom fieldsets endpoint commit 2047cfed09a231a90f1958ab0ce650808e05985d Author: Marcus Moore Date: Thu Sep 12 16:20:32 2024 -0700 Add tests for delete custom fields endpoint commit e3268d32df495ed23e60c4c0587bd53fbb6d7485 Author: Marcus Moore Date: Thu Sep 12 16:00:02 2024 -0700 Add tests for delete consumable endpoint commit 6df8b0ac0e6936833bd93512c6a7e50c1f34091f Author: Marcus Moore Date: Thu Sep 12 15:52:07 2024 -0700 Add tests for delete component endpoint commit 910f13c1f78fd2761c2c54ef8a560f80fdf611c6 Author: Marcus Moore Date: Thu Sep 12 15:38:30 2024 -0700 Add tests for delete companies endpoint commit 8ce2512f55a6c293c0d744932453a12cf48f7d6d Author: Marcus Moore Date: Thu Sep 12 13:54:44 2024 -0700 Add tests for delete category endpoint commit 0ec415d4d018c0dfb5cd51f9abf01eaf62c4f0d3 Author: Marcus Moore Date: Thu Sep 12 13:46:22 2024 -0700 Clean up commit 2044570e95789a92ef705d02ca241216eb19d1e3 Author: Marcus Moore Date: Thu Sep 12 13:39:36 2024 -0700 Add tests for delete asset model endpoint commit b336c6273d57d6ca3181877ba844377cad5c6963 Author: Marcus Moore Date: Thu Sep 12 13:32:42 2024 -0700 Pluralize test classes commit 5299b3e9f066e1779312798ecb150786152cf254 Author: Marcus Moore Date: Thu Sep 12 13:29:44 2024 -0700 Remove code handled by CompanyableChildTrait commit 872b76b45fbdd41cb6e5ae149b158c83a97a6865 Author: Marcus Moore Date: Thu Sep 12 13:29:10 2024 -0700 Add tests for delete asset maintenance endpoint commit 275cf4630e6461ba2b22c846118ac1e2f352e989 Author: Marcus Moore Date: Thu Sep 12 13:16:37 2024 -0700 Add tests for delete asset endpoint commit 5c2660bd34873b3b9e7ef89990ea450f92ded381 Author: Marcus Moore Date: Thu Sep 12 13:02:32 2024 -0700 Introduce interface commit c7ae9d9dfa76b0efadf47695492761a8120439bf Author: Marcus Moore Date: Thu Sep 12 12:58:47 2024 -0700 Add tests for delete accessory endpoint commit 9e5f6d656a5df14edae5e99be6b375b70b778950 Author: Brady Wetherington Date: Wed Sep 11 15:45:01 2024 +0100 Improve multi-asset create when using numeric prefixes to asset_tags Signed-off-by: snipe commit 634a4afa7581591a8f7eaa902009fd9a5c3e4d09 Author: snipe Date: Thu Sep 19 16:04:54 2024 +0100 Fixed 1001 query on license Signed-off-by: snipe commit 7650628d30646d51d1f4aa650e786f406c600350 Author: snipe Date: Thu Sep 19 16:00:59 2024 +0100 Removed free seat count from fillable Signed-off-by: snipe commit 7f690a6238d61ea145e00e602ff9dccf43bb4341 Author: snipe Date: Thu Sep 19 15:58:32 2024 +0100 Fixed variable name Signed-off-by: snipe commit b32ab6a06ce226562add8a8654dd9307efe6abea Author: Godfrey M Date: Wed Sep 18 16:36:24 2024 -0700 import User model commit 4ff5fc1ff9528e10218106db85902c644afedc4c Author: Godfrey M Date: Wed Sep 18 16:19:35 2024 -0700 clean up variables commit 86f13a9735358ce0ce51205a439ce8fc7df5197c Author: Marcus Moore Date: Wed Sep 18 16:13:34 2024 -0700 Add index test commit c40209f5000aaf9c6ec3449cec6463d956dd19bb Author: Godfrey M Date: Wed Sep 18 15:23:44 2024 -0700 seperates emails and webhook notifications commit a071fff954b8f90b7a5e5a4df3f8a5a7d45598c1 Author: Marcus Moore Date: Wed Sep 18 12:32:14 2024 -0700 Implement tests commit 8b50ef077dc52c09bddd4743336aeea2d2d9de98 Author: Marcus Moore Date: Wed Sep 18 11:58:33 2024 -0700 Implement test commit 607f29030f13f82b40ccacefeec5f329f250b887 Author: Marcus Moore Date: Wed Sep 18 11:53:27 2024 -0700 Stub out test commit a6bcd3c0c2b03c81b45ece70d453e767d277acc0 Author: Marcus Moore Date: Wed Sep 18 11:47:59 2024 -0700 Add validation test commit 9b293afaac70370ad7741c306e7b14c47eecf3ce Author: Marcus Moore Date: Wed Sep 18 11:28:29 2024 -0700 Remove more dead code commit 636c776620a012937c7f79cd67dde9cf7c6a92cf Author: Marcus Moore Date: Wed Sep 18 11:27:37 2024 -0700 Remove dead code commit d5f659024c06a8dc3a6573f1b2d7eddf25b698c4 Author: Marcus Moore Date: Wed Sep 18 11:27:09 2024 -0700 Add test for logging commit 832e50a71ebcda26451f090042cb072bae05c4f3 Author: Marcus Moore Date: Wed Sep 18 11:19:41 2024 -0700 Implement test commit fa1968624885e51b71f4a77215cec01beaae01e5 Author: Marcus Moore Date: Wed Sep 18 11:18:21 2024 -0700 Implement test commit c021609c136a7fc01ba860bf476aefb81d9c0452 Merge: 7b31df7c1 dddbf27d7 Author: Marcus Moore Date: Wed Sep 18 10:42:58 2024 -0700 Merge branch 'develop' into testing/fmcs-accessories commit 655abe8be5491531656de70242b21d22acfd280f Author: snipe Date: Wed Sep 18 14:32:59 2024 +0100 Fixed requestable user_id Signed-off-by: snipe commit d96c5e1ba4ff80f77da2d467109fde22e08a73a2 Merge: a807646d3 dddbf27d7 Author: snipe Date: Wed Sep 18 14:20:55 2024 +0100 Merge remote-tracking branch 'origin/develop' commit dddbf27d780be4871ddbc401740f35a4561039a4 Author: snipe Date: Wed Sep 18 14:18:52 2024 +0100 Updated language strings Signed-off-by: snipe commit bae99828333b608e029250925730388671070aea Author: snipe Date: Wed Sep 18 14:18:14 2024 +0100 Updated request methods Signed-off-by: snipe commit a807646d39575f851fa57b0be22dd67daf26f7db Merge: 83b4bf9cf fcefcc818 Author: snipe Date: Wed Sep 18 13:48:09 2024 +0100 Merge remote-tracking branch 'origin/develop' commit abe79df6dca919512419318acb8381daefb5c990 Author: snipe Date: Wed Sep 18 13:47:30 2024 +0100 Added translation Signed-off-by: snipe commit fcefcc8184b615bc9cdea9888e1f595f8fbc69b8 Merge: 04bb3eec8 3519a82dd Author: snipe Date: Wed Sep 18 13:44:44 2024 +0100 Merge pull request #15512 from marcusmoore/testing/fmcs Added tests for delete methods in api commit 04bb3eec8308556c8e26166dfcae7ac7ec3aa446 Merge: 154d5d8d9 f963b9a19 Author: snipe Date: Wed Sep 18 13:41:37 2024 +0100 Merge pull request #15521 from uberbrady/improve_country_selector Fix selected-index of Countries drop-down [fd-44144] commit f963b9a19f7b135a9141da34b1af0104a02ca5b3 Author: Brady Wetherington Date: Wed Sep 18 13:24:26 2024 +0100 Fix selected-index of Countries drop-down commit 154d5d8d913fcea2bfc18ddff26ec874a21b5640 Merge: 6c996b775 9e5f6d656 Author: snipe Date: Tue Sep 17 23:40:25 2024 +0100 Merge pull request #15491 from uberbrady/numeric_prefixes_add_multiple_assets [Fixes fd-43940] Improve multi-asset create when using numeric prefixes to asset_tags commit 1582d81e5bf3c408cddf50cd716d63e54028109d Author: snipe Date: Tue Sep 17 22:16:41 2024 +0100 Change `user_id` to `created_by` Signed-off-by: snipe commit 7c85ad54eb742f063936423d1c8b21d4f9f57079 Author: snipe Date: Tue Sep 17 19:44:03 2024 +0100 Sort by numeric columns for numeric custom fields Signed-off-by: snipe commit 7b31df7c148566274527317bb5bf006e5764fda8 Author: Marcus Moore Date: Tue Sep 17 09:11:58 2024 -0700 Begin additional test case commit 83b4bf9cf8a36324a5e0e87bbcc00b44cc9a0cb8 Merge: 9ff211105 6c996b775 Author: snipe Date: Tue Sep 17 15:54:53 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 6c996b7759384d96b581e3e61633a6bbbb6e8c10 Merge: fe5fc6e0c 9e957baeb Author: snipe Date: Tue Sep 17 15:54:11 2024 +0100 Merge pull request #15516 from snipe/fixes/fmcs_edit_user Fixed check for outside assets on user update validation commit 9e957baeb53e49abe4440bc30100b8629b065ae8 Author: snipe Date: Tue Sep 17 15:46:45 2024 +0100 Fixed check for outside assets on user update validation Signed-off-by: snipe commit 12fd9cd97a30ca1ab715fd923c40d3558706e88e Author: Marcus Moore Date: Mon Sep 16 17:00:08 2024 -0700 Update interface name commit 9e03c4ba6f6c99a93881d3bd262e4d1809d8cf55 Merge: 8eb1c487b 3519a82dd Author: Marcus Moore Date: Mon Sep 16 16:58:46 2024 -0700 Merge branch 'testing/fmcs' into testing/fmcs-accessories commit 3519a82dddedebfd518cbff61ddc1e1c979859fe Author: Marcus Moore Date: Mon Sep 16 16:55:20 2024 -0700 Fix name: TestsFullMultipleCompaniesSupport commit 8eb1c487bcaa1fb6ec71d85985226d49c01e3cea Author: Marcus Moore Date: Mon Sep 16 16:52:10 2024 -0700 implement FMCS test for accessory index commit e835637ef0120a96012951a965848ecb8465e69f Author: Marcus Moore Date: Mon Sep 16 16:40:10 2024 -0700 Add accessory checkin test commit eb35608bb59a3fc72c7fc55c5431462aef04b040 Author: Marcus Moore Date: Mon Sep 16 16:35:33 2024 -0700 Remove call handled by form request commit 3f07f682defd228dc51d01b962353978e6e5eed8 Author: Marcus Moore Date: Mon Sep 16 16:35:21 2024 -0700 Migrate existing tests to TestsPermissionsRequirement commit a629df07bfc25da2e71a158a09cee9f5e3b1a612 Author: Marcus Moore Date: Mon Sep 16 14:49:08 2024 -0700 Implement interfaces on existing test classes commit 9a13fcab23f76a7336ffe58e38f269bfd3cea4cd Author: Marcus Moore Date: Mon Sep 16 14:38:38 2024 -0700 Pluralize commit f5705a1dde7a736e167e27ec156f72351cfb47ec Author: Marcus Moore Date: Mon Sep 16 14:34:55 2024 -0700 More unification commit f325c4afdb234ab4ba820caac45bdf599a550c2f Author: Marcus Moore Date: Mon Sep 16 14:32:38 2024 -0700 Unify assertion method commit 1fddacd7d0440db2598c1d0e4aa0373de204bf53 Author: Marcus Moore Date: Mon Sep 16 14:25:11 2024 -0700 Re-order test methods commit 4af893df6189423edeb73d5239a12d4c7d5a68d0 Author: Marcus Moore Date: Mon Sep 16 14:20:24 2024 -0700 Improve assertions commit b8b3f91ce49e5d1829bcb2a84f4d145dc1701b29 Author: Marcus Moore Date: Mon Sep 16 13:55:18 2024 -0700 Formatting commit 7f40f55343fe7e801c6de0cd0d1fa63f442b8349 Author: Marcus Moore Date: Mon Sep 16 13:52:02 2024 -0700 Add tests for delete supplier endpoint commit b06e8d442d81b40e82ba70aaacf277eb5b5e075f Author: Marcus Moore Date: Mon Sep 16 13:37:08 2024 -0700 Add tests for delete status label endpoint commit c269184c60e69b7aa319fedc5b4bbcb122677cb8 Author: Marcus Moore Date: Mon Sep 16 13:29:41 2024 -0700 Add tests for delete predefined kit endpoint commit 53c673dee21e9f8cb00904950ec66cb05bde6c55 Author: Marcus Moore Date: Mon Sep 16 13:13:12 2024 -0700 Add tests for delete manufacturer endpoint commit 50730fc4fba2519fb13799bc93ab682c10092c25 Author: Marcus Moore Date: Mon Sep 16 12:37:18 2024 -0700 Add tests for delete location endpoint commit 60a54cee797aa86e80c5abfe57699f263a85e841 Author: Marcus Moore Date: Mon Sep 16 12:33:30 2024 -0700 Add tests for delete license endpoint commit 446e962a503078e0c5fabef90aac7ada21ecb6e2 Author: Marcus Moore Date: Mon Sep 16 10:38:51 2024 -0700 Add tests for delete group endpoint commit 79a4bb73169445bb7a1e1e6bef4aff8a25dc1a12 Author: Marcus Moore Date: Mon Sep 16 10:35:44 2024 -0700 Add tests for delete depreciation endpoint commit 2f76c1bc5b5259cbb069356da8e8249a18910011 Author: Marcus Moore Date: Mon Sep 16 10:33:21 2024 -0700 Add assertion commit 38b9f4a43893f8c86e75d141a2ec41a7c2f90758 Author: Marcus Moore Date: Mon Sep 16 10:29:20 2024 -0700 Add tests for delete departments endpoint commit fe5fc6e0ce8374a3304dc3f44ea985e73c7ca2fb Merge: 62747a009 15183c482 Author: snipe Date: Mon Sep 16 15:56:31 2024 +0100 Merge pull request #15471 from Godmartinz/Edit_side-panel Fixes margin for the sidebar menus while using rtl languages commit 62747a00902e415ef7b207a68c6cbabc5ef2f527 Merge: b465cc98d c6c5cb73c Author: snipe Date: Mon Sep 16 15:02:55 2024 +0100 Merge pull request #15493 from Godmartinz/fix_consumables_media_sizing Fixed misalignment of consumables with smaller media commit 9ff211105544fff678c5355e90fdb8319e0806ce Merge: 1328366a4 b465cc98d Author: snipe Date: Mon Sep 16 14:52:48 2024 +0100 Merge remote-tracking branch 'origin/develop' commit b465cc98d8cb2310f5dea14ed2f22448a27bff59 Merge: 8774da392 4debaaea3 Author: snipe Date: Mon Sep 16 14:45:06 2024 +0100 Merge pull request #15510 from snipe/bulk_users_locale_fix Fixed #15504 - allow nulling/not changing locale in user bulk edit commit 4debaaea39667d86fdc710c14706b90d25d08617 Author: snipe Date: Mon Sep 16 14:31:10 2024 +0100 Fixed #15504 - allow nulling/not changing locale in user bulk edit Signed-off-by: snipe commit 1328366a486e91bd6c94bf308a3c2ad8a5171bb0 Merge: 7e14f8c6d 8774da392 Author: snipe Date: Mon Sep 16 12:38:56 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 4facc4007e56924429097b0840ea0acd0bbcd1fa Author: setpill <37372069+setpill@users.noreply.github.com> Date: Fri Sep 13 17:05:48 2024 +0200 feat: Explicitly request LDAP attributes during sync commit 31da47e04676e32cf213fff49174615b6501d394 Author: setpill <37372069+setpill@users.noreply.github.com> Date: Fri Sep 13 17:05:28 2024 +0200 refactor: Put LDAP attribute mapping in array commit 3105f53afffdd78311314e970f6fe893e1162f8e Author: Marcus Moore Date: Thu Sep 12 16:54:29 2024 -0700 Add tests for delete custom fieldsets endpoint commit 2047cfed09a231a90f1958ab0ce650808e05985d Author: Marcus Moore Date: Thu Sep 12 16:20:32 2024 -0700 Add tests for delete custom fields endpoint commit e3268d32df495ed23e60c4c0587bd53fbb6d7485 Author: Marcus Moore Date: Thu Sep 12 16:00:02 2024 -0700 Add tests for delete consumable endpoint commit 6df8b0ac0e6936833bd93512c6a7e50c1f34091f Author: Marcus Moore Date: Thu Sep 12 15:52:07 2024 -0700 Add tests for delete component endpoint commit 910f13c1f78fd2761c2c54ef8a560f80fdf611c6 Author: Marcus Moore Date: Thu Sep 12 15:38:30 2024 -0700 Add tests for delete companies endpoint commit 8ce2512f55a6c293c0d744932453a12cf48f7d6d Author: Marcus Moore Date: Thu Sep 12 13:54:44 2024 -0700 Add tests for delete category endpoint commit 0ec415d4d018c0dfb5cd51f9abf01eaf62c4f0d3 Author: Marcus Moore Date: Thu Sep 12 13:46:22 2024 -0700 Clean up commit 2044570e95789a92ef705d02ca241216eb19d1e3 Author: Marcus Moore Date: Thu Sep 12 13:39:36 2024 -0700 Add tests for delete asset model endpoint commit b336c6273d57d6ca3181877ba844377cad5c6963 Author: Marcus Moore Date: Thu Sep 12 13:32:42 2024 -0700 Pluralize test classes commit 5299b3e9f066e1779312798ecb150786152cf254 Author: Marcus Moore Date: Thu Sep 12 13:29:44 2024 -0700 Remove code handled by CompanyableChildTrait commit 872b76b45fbdd41cb6e5ae149b158c83a97a6865 Author: Marcus Moore Date: Thu Sep 12 13:29:10 2024 -0700 Add tests for delete asset maintenance endpoint commit 275cf4630e6461ba2b22c846118ac1e2f352e989 Author: Marcus Moore Date: Thu Sep 12 13:16:37 2024 -0700 Add tests for delete asset endpoint commit 5c2660bd34873b3b9e7ef89990ea450f92ded381 Author: Marcus Moore Date: Thu Sep 12 13:02:32 2024 -0700 Introduce interface commit c7ae9d9dfa76b0efadf47695492761a8120439bf Author: Marcus Moore Date: Thu Sep 12 12:58:47 2024 -0700 Add tests for delete accessory endpoint commit 0bc98e971fd9c5e0c0eb596daed799dab54f6ec4 Author: Godfrey M Date: Thu Sep 12 12:26:19 2024 -0700 refactoring modals with partials and fixing misalignments commit 8774da3921eb6ed28494521a42305437b4158f6b Merge: ab3b65531 a97530367 Author: snipe Date: Thu Sep 12 16:08:44 2024 +0100 Merge pull request #15492 from snipe/fixes/edit_to_archived_warning Fix - warn user on changing status to undeployable when editing commit c6c5cb73cf4b5c553a1fa0996f7ac27534b52505 Author: Godfrey M Date: Wed Sep 11 10:49:27 2024 -0700 fixes consumables positioning with smaller media commit a97530367d6013a05c5a99341087dd2f8002343b Author: snipe Date: Wed Sep 11 17:29:22 2024 +0100 Fixed tests again Signed-off-by: snipe commit 43250ae88142d3168a009457c54d4eb01bbe261a Author: snipe Date: Wed Sep 11 17:04:09 2024 +0100 Updated tests Signed-off-by: snipe commit 04e96b8f20095568aa37dad8eca2d0b1effff07e Author: snipe Date: Wed Sep 11 16:43:41 2024 +0100 Added tests Signed-off-by: snipe commit 98323185de298a32df9f545ea5ebacc6a7bc42cd Author: snipe Date: Wed Sep 11 16:43:33 2024 +0100 Null and warn if editing asset to a non-deployabe state Signed-off-by: snipe commit 9e5f6d656a5df14edae5e99be6b375b70b778950 Author: Brady Wetherington Date: Wed Sep 11 15:45:01 2024 +0100 Improve multi-asset create when using numeric prefixes to asset_tags commit 7e14f8c6d69bebeb46242dda75ac519f2fb4f174 Merge: fddbdafb9 ab3b65531 Author: snipe Date: Wed Sep 11 12:25:28 2024 +0100 Merge remote-tracking branch 'origin/develop' commit ab3b655312f674142735f1a2c2ef61e17f477185 Author: snipe Date: Wed Sep 11 12:25:09 2024 +0100 Fixed #15483 - show EOL by default Signed-off-by: snipe commit 601d8d7e5fa5f4d266c0dcdd8daa1b3244404821 Merge: 4f0f72b29 ca01261c1 Author: snipe Date: Wed Sep 11 09:46:58 2024 +0100 Merge pull request #15486 from marcusmoore/fixes/custom-field-values Fixed a couple bugs in CustomFieldSetDefaultValuesForModel component commit ca01261c1f309b7dd616210aab1854774158cf2d Merge: 6423df213 4f0f72b29 Author: Marcus Moore Date: Tue Sep 10 16:05:39 2024 -0700 Merge branch 'develop' into fixes/custom-field-values commit 15183c48220f85948527cbc2ef34986f645dfa06 Author: Godfrey M Date: Tue Sep 10 11:05:03 2024 -0700 rephrased the ternary <-correctly spelled commit fddbdafb99cf739b435220a7a4e259a27040f03a Author: snipe Date: Tue Sep 10 19:03:56 2024 +0100 Fixed conflict Signed-off-by: snipe commit a5dbece1a96e54f851e177596e2de62f52f2afd0 Merge: 713bb104e 4f0f72b29 Author: snipe Date: Tue Sep 10 19:00:05 2024 +0100 Merge remote-tracking branch 'origin/develop' Signed-off-by: snipe # Conflicts: # config/version.php # public/css/build/app.css # public/css/build/overrides.css # public/css/dist/all.css # public/mix-manifest.json commit 4f0f72b29e2e49284e72eb89d103c333a1be48bf Author: snipe Date: Tue Sep 10 18:15:12 2024 +0100 Fixed version Signed-off-by: snipe commit 4183d1834f6ba8a691525b9f28e1ec09e7b1580f Author: snipe Date: Tue Sep 10 18:14:03 2024 +0100 Pre-release assets Signed-off-by: snipe commit 713bb104ecaf0ad68204efa1f3cab191e99da3e9 Merge: 7f2cae4f2 4998d60f3 Author: snipe Date: Tue Sep 10 14:46:15 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 4998d60f39d723277e3496ea8fdf1bddc86d02c7 Merge: f6bf2d03c 7cf30003b Author: snipe Date: Tue Sep 10 14:43:27 2024 +0100 Merge pull request #15481 from snipe/localizations/2024-09-10 Updated translations commit 7cf30003b61b040a9b191aa85a7efb51fba7379f Author: snipe Date: Tue Sep 10 14:41:08 2024 +0100 Updated strings Signed-off-by: snipe commit f6bf2d03c403f29f3ef31246ecba82b079cb96b0 Merge: 6f44441a8 7c8955b12 Author: snipe Date: Tue Sep 10 11:04:58 2024 +0100 Merge pull request #15445 from Godmartinz/eula_confusion Fixed priority for category eula vs default eula commit 6f44441a8b66f391e7ee3c6ac4fb224c537d713c Merge: e7e5dfbdf 76c9015aa Author: snipe Date: Tue Sep 10 11:04:23 2024 +0100 Merge pull request #15469 from marcusmoore/accessory_tests Added UI tests for creating accessories commit e7e5dfbdfabd3184d5008190eaddd4310d117e29 Merge: d62315fbe 5d5f42129 Author: snipe Date: Tue Sep 10 11:04:08 2024 +0100 Merge pull request #15470 from marcusmoore/company_tests Added UI tests for creating companies commit d62315fbe4152de0cf5769a3bd9a5f32b885ff46 Merge: 7f3f77dec 22a2cc025 Author: snipe Date: Tue Sep 10 11:03:55 2024 +0100 Merge pull request #15472 from marcusmoore/testing/dashboard_counts Added test for dashboard counts commit 7f3f77dec803ff98467d7ea743e0adf73d03dba8 Merge: 82e56c683 0820dd9da Author: snipe Date: Tue Sep 10 11:03:46 2024 +0100 Merge pull request #15473 from marcusmoore/testing/accessory_api_tests Added some permission tests for accessory api endpoints commit 82e56c68325457f8fb903b7e02e1b7e666c3e5b9 Merge: 549dec9f9 dc6a5bf99 Author: snipe Date: Tue Sep 10 09:37:02 2024 +0100 Merge pull request #15474 from marcusmoore/bug/sc-26730 Fixed login success message not being displayed commit 76c9015aa9c6988127d5c749b5ffdb5ba04e7d54 Author: Marcus Moore Date: Mon Sep 9 16:51:40 2024 -0700 Add test case commit 5d5f421294195c4a88db5c4f8cf87fe47ef2c326 Author: Marcus Moore Date: Mon Sep 9 16:49:43 2024 -0700 Add test case commit 367f02af8642c23674afbfefedc456e7cedb6785 Author: Godfrey M Date: Mon Sep 9 16:34:04 2024 -0700 more partials and includes commit 7a1c721eca13c8e270c55b41fa8249e6da40a918 Author: Godfrey M Date: Mon Sep 9 16:22:56 2024 -0700 making modal partials for reuse commit 6423df213344c0d958baa9ac2d90e5bc47809f5f Merge: 51d63d57c 549dec9f9 Author: Marcus Moore Date: Mon Sep 9 16:07:37 2024 -0700 Merge branch 'develop' into fixes/custom-field-values # Conflicts: # resources/views/livewire/custom-field-set-default-values-for-model.blade.php commit dc6a5bf998060d5ac26446bb0b6c6191a4cc4e20 Author: Marcus Moore Date: Mon Sep 9 14:54:19 2024 -0700 Reflash session so login message is displayed commit 0820dd9da457554d1d577cb785ea94c3be5972e4 Author: Marcus Moore Date: Mon Sep 9 14:36:32 2024 -0700 Update test names commit aa6ab2df60be0c1904edf265763993ae0c1576ed Author: Marcus Moore Date: Mon Sep 9 14:35:38 2024 -0700 Add permission tests for some accessory api endpoints commit 22a2cc025671811f4d5925274a2b960cdfdb84d9 Author: Marcus Moore Date: Mon Sep 9 13:21:10 2024 -0700 Add test for dashboard counts commit 57fab0268b5ace5cad8a2df7db3a7d9305815ca8 Author: Godfrey M Date: Mon Sep 9 13:02:25 2024 -0700 made it a terenary commit ad5768d8b2c719d10e1915f7f9b3b26902701a22 Author: Godfrey M Date: Mon Sep 9 12:45:11 2024 -0700 fixes margin for the sidebar using rtl languages commit 35533c39d5e92df6f7a001c6987d255ce01985f0 Merge: d4426e468 549dec9f9 Author: Marcus Moore Date: Mon Sep 9 12:18:02 2024 -0700 Merge branch 'develop' into company_tests commit de403f6e0758e10f8c049cb152eb9bbfbadbd07d Merge: 010f66f4c 549dec9f9 Author: Marcus Moore Date: Mon Sep 9 12:17:53 2024 -0700 Merge branch 'develop' into accessory_tests commit 549dec9f9efa8a8b2cb3a9f748f61407121aed47 Merge: b2a634924 0e9f7153c Author: snipe Date: Mon Sep 9 20:13:01 2024 +0100 Merge pull request #15468 from marcusmoore/coverage Added coverage commands for Herd users commit d4426e4686dd6106de39660cbede793be5f1c504 Author: Marcus Moore Date: Mon Sep 9 11:03:00 2024 -0700 Add simple tests for company creation via UI commit b2a6349243e6de65226bcc898cafad89af655a3f Merge: ce97e2a30 c5dbc5f6b Author: snipe Date: Mon Sep 9 10:06:42 2024 +0100 Merge pull request #15465 from snipe/update_city_on_bulk_user_edit Correctly save user’s city on bulk edit commit c5dbc5f6b887d866a4dfb9800cb001b26593a89b Author: snipe Date: Mon Sep 9 10:01:07 2024 +0100 Correctly save user’s city on bulk edit Signed-off-by: snipe commit 7f2cae4f26c90f0c5195f76871f48ececea49bca Merge: e34f549e4 ce97e2a30 Author: snipe Date: Mon Sep 9 03:56:05 2024 +0100 Merge remote-tracking branch 'origin/develop' commit ce97e2a30f88b0911cc906d738df1a975f1ac35e Merge: e1fcfc8dc 7d9a0eba0 Author: snipe Date: Mon Sep 9 03:54:28 2024 +0100 Merge pull request #15463 from snipe/consumables_order_by_remaining Added ability to sort on qty and remaining for consumables commit 7d9a0eba04d6607adffa93b0a2117c2c22dd3d2a Author: snipe Date: Mon Sep 9 03:49:58 2024 +0100 Added ability to sort on qty and remaining for consumables Signed-off-by: snipe commit 010f66f4c9f79eb8199a5baa15e557218398f047 Author: Marcus Moore Date: Wed Sep 4 15:48:11 2024 -0700 Add validation test commit 9c6718b459ea2d10ff2f0f34a7f566068118549e Author: Marcus Moore Date: Wed Sep 4 15:46:35 2024 -0700 Organize commit 9f832a93c948dc62c3374224d2804a4e6c8124b9 Author: Marcus Moore Date: Wed Sep 4 15:44:52 2024 -0700 Ensure user is stored commit 487d88c0128a04a8e0f15cbbc73426416b36ed7d Author: Marcus Moore Date: Wed Sep 4 15:43:01 2024 -0700 Add some ui tests for accessories commit 0e9f7153c05ebeda1650455ce1bd96dae3d04291 Author: Marcus Moore Date: Wed Sep 4 15:13:45 2024 -0700 Add composer commands for generating coverage reports via Herd commit 7c8955b12620208281c449bff2ecbfe29103d466 Author: Godfrey M Date: Wed Sep 4 12:38:35 2024 -0700 revert changes to label view commit 20fa4c39f90394ae1aaf381374e242b2035bb36d Author: Godfrey M Date: Wed Sep 4 12:26:44 2024 -0700 adds setEula to support\settings commit f04a4a3cf51564269352cfd2b0ba4baeb99ac3fe Author: Godfrey M Date: Wed Sep 4 12:21:49 2024 -0700 adds test commit cf07186ae8704d609c65c7f91db67af9a2963c76 Author: Godfrey M Date: Tue Sep 3 12:23:23 2024 -0700 gives priority to default eula being checked vs catregory eula commit 51d63d57c65ec3ab5da48c1a3481f18ca680b596 Author: Marcus Moore Date: Tue Sep 3 12:22:43 2024 -0700 Hide the "Add default values" checkbox if no fieldset selected commit e34f549e4cddb695d01fb304d7472fcdafada27d Merge: a8813cca9 e1fcfc8dc Author: snipe Date: Mon Sep 2 19:16:23 2024 +0100 Merge remote-tracking branch 'origin/develop' commit e1fcfc8dc13329b752532970f256c1fcaa5f1935 Merge: 13dbf9ee7 9fe8a866e Author: snipe Date: Mon Sep 2 19:14:49 2024 +0100 Merge pull request #15440 from snipe/fixes/user_api_put_patch Fixes #15435 - user api put patch API route regression commit 9fe8a866e0164140db8c92f8c956173a9d5398ae Author: snipe Date: Mon Sep 2 19:07:21 2024 +0100 Updated test Signed-off-by: snipe commit e8e3060a7561caaf7a92fe475af680c7f98c9079 Author: snipe Date: Mon Sep 2 18:51:22 2024 +0100 Added tests Signed-off-by: snipe commit 6aaf2f623feabdbb13a0878fdd4050e4e2e7ff52 Author: snipe Date: Mon Sep 2 18:49:55 2024 +0100 Removed extra route Signed-off-by: snipe commit dfbccf50e8aaa2f0135002d08f304d4bb802d2a1 Author: snipe Date: Mon Sep 2 18:48:09 2024 +0100 Added patch/put back into resource routes Signed-off-by: snipe commit a8813cca9458fcbf20e5fdad763285ec15db1a99 Merge: 9fef27a44 13dbf9ee7 Author: snipe Date: Sat Aug 31 13:48:59 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 13dbf9ee747832fbececfc1618b0abd64cac4f22 Author: snipe Date: Sat Aug 31 13:48:42 2024 +0100 Added icon for dept Signed-off-by: snipe commit f8bbb7ad9b0455ed3d30c9a4c4949865313812c3 Merge: 12fa50597 3c7d455ee Author: snipe Date: Sat Aug 31 13:47:25 2024 +0100 Merge pull request #15431 from snipe/add_employee_num_to_asset_overview Added employee number to asset view commit 3c7d455ee31a13862f1dab0ff2b236188c1128e9 Author: snipe Date: Sat Aug 31 13:38:38 2024 +0100 Added employee number to asset view Signed-off-by: snipe commit 9fef27a448a13c1cb6c94d737702fd51e78257a5 Merge: d2b88a510 12fa50597 Author: snipe Date: Thu Aug 29 21:07:56 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 12fa505972693d0983b1bc2e3e8472ad1e6ef91d Author: snipe Date: Thu Aug 29 21:07:30 2024 +0100 Disabmiguate licenses company_id Signed-off-by: snipe commit d2b88a51076df62982926a91af97568ac3b98034 Merge: 4e35f389d 4e4930ba6 Author: snipe Date: Thu Aug 29 21:02:21 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 4e4930ba62355bee219eb837a39ae3c6d3c622f9 Author: snipe Date: Thu Aug 29 21:01:48 2024 +0100 Check for array Signed-off-by: snipe commit 4e35f389df0308bbe6571afc850f70870e6bd3b0 Merge: e5b9d9a28 76301bc30 Author: snipe Date: Thu Aug 29 20:07:03 2024 +0100 Merge remote-tracking branch 'origin/develop' Signed-off-by: snipe # Conflicts: # public/css/build/app.css # public/css/build/overrides.css # public/css/dist/all.css # public/mix-manifest.json commit 76301bc30d5b6e55cc894200dff5ab074993013e Author: snipe Date: Thu Aug 29 20:05:03 2024 +0100 Fixed typo Signed-off-by: snipe commit 964e105cf998ae91f778d78aa4de0c2273dbeca1 Merge: 6fd24c7e1 abb422153 Author: snipe Date: Thu Aug 29 19:20:03 2024 +0100 Merge pull request #15415 from snipe/rules/prevent_company_switch Validation rules to prevent switching user companies if items are assigned to them commit 6fd24c7e1443caef18aa787538d723d9e4f888ac Merge: e4ebabdab 231bc1e2d Author: snipe Date: Thu Aug 29 18:55:11 2024 +0100 Merge pull request #15418 from snipe/added_multiple_for_custom_report Fixed #15416 - Added multiple selects for custom report commit 231bc1e2de18568b760da1fcd6391e57ebfaabd1 Author: snipe Date: Thu Aug 29 18:31:34 2024 +0100 Updated blade selectors Signed-off-by: snipe commit 37d04b717683d15a91d6ee2801df89cb7cecd038 Author: snipe Date: Thu Aug 29 17:52:01 2024 +0100 Some CSS tweaks for select2 Signed-off-by: snipe commit e62a8029266ed6ca5625d9ee8d1c1616bea5e3c2 Author: snipe Date: Thu Aug 29 17:51:44 2024 +0100 Use whereIn instead of where = Signed-off-by: snipe commit 69e981364aee151aa1b448082971099859b38f5a Author: snipe Date: Thu Aug 29 17:51:20 2024 +0100 Made multiple select Signed-off-by: snipe commit e5b9d9a28b33b9a52101ea7005a4aba834d3a78b Merge: 4111ef0d7 e4ebabdab Author: snipe Date: Thu Aug 29 15:04:32 2024 +0100 Merge remote-tracking branch 'origin/develop' Signed-off-by: snipe # Conflicts: # public/js/build/app.js # public/js/build/vendor.js # public/js/dist/all.js # public/mix-manifest.json commit abb422153903939d2e3b1bc103d27eb30a52fe9e Author: snipe Date: Thu Aug 29 14:55:18 2024 +0100 Validation rules to prevent switchng user companies if assets are assigned Signed-off-by: snipe commit e4ebabdaba22f89d6f8b0c85530e5d824bf522c8 Merge: b64ed254e da1e38329 Author: snipe Date: Thu Aug 29 14:19:51 2024 +0100 Merge pull request #15414 from uberbrady/fix_create_user Use the null-safe property accessor for new-user creation commit da1e383295d6ee3940d6842979a73c1f14e6ff9a Author: Brady Wetherington Date: Thu Aug 29 14:09:23 2024 +0100 Use the null-safe property accessor for new-user creation commit b64ed254e022cb4fd363b7ffd5c99cfc46567d5d Author: snipe Date: Thu Aug 29 13:49:09 2024 +0100 Fixed tests Signed-off-by: snipe commit ba291edc42bf30199727d98138b1e667a0658fa8 Merge: c197644ba ec2ea955d Author: snipe Date: Thu Aug 29 13:18:52 2024 +0100 Merge pull request #15412 from uberbrady/ImprovePatchPurchasePrice Fix [FD-43836] PATCH of purchase_cost for assets for comma as decimal separator commit ec2ea955d895b979d8285b2b5c497ef9c085b983 Author: Brady Wetherington Date: Thu Aug 29 12:35:14 2024 +0100 Fix PATCH of purchase_cost for assets for comma as decimal separator commit c197644ba7554404ce6f68fbadeadd9bb9266c97 Merge: 29b30cc5d a8cd1027f Author: snipe Date: Thu Aug 29 11:38:15 2024 +0100 Merge pull request #15284 from spencerrlongg/bug/sc-26584 [Multi-Company] Fixes Users Being Moved With Items Still Assigned commit 29b30cc5d3236aa94340160ecfc3f14d84856287 Merge: a89f17a14 6af27516d Author: snipe Date: Thu Aug 29 11:29:44 2024 +0100 Merge pull request #15411 from snipe/snyk/upgrade-webpack Upgraded webpack commit 6af27516dc348fcf135c348c118ca0c49e8056ea Author: snipe Date: Thu Aug 29 11:29:00 2024 +0100 Upgraded webpack Signed-off-by: snipe commit a89f17a145216d0d4f75bbb44a4b0703f4137bfa Merge: 68c708bde de0565f5b Author: snipe Date: Thu Aug 29 11:25:56 2024 +0100 Merge pull request #15410 from snipe/snyk/upgrade-jquery-ui Updated jquery UI commit de0565f5b35ec85cc39a9302637329bba3d4c83a Author: snipe Date: Thu Aug 29 11:24:06 2024 +0100 Updated jquery UI Signed-off-by: snipe commit 4111ef0d78f40086a549c1516bec32f2a0435ca4 Merge: cfa56e221 68c708bde Author: snipe Date: Thu Aug 29 11:20:21 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 68c708bdef3e732123dfe16bb0a5c34a4381cc9f Merge: 58e366a06 5581950fe Author: snipe Date: Thu Aug 29 11:18:34 2024 +0100 Merge pull request #15409 from snipe/fixes-string Corrected language string commit 5581950fee50d7a260ad9aa1908373607c586e1c Author: snipe Date: Thu Aug 29 11:17:17 2024 +0100 Corrected language string Signed-off-by: snipe commit cfa56e2219e4948d5eaba2a6bb43d49f5859e790 Merge: 7f1dfcc93 58e366a06 Author: snipe Date: Thu Aug 29 11:08:53 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 58e366a063dcb015f148e7d00dc91f43bb4b98c9 Merge: 26f28a862 b06c52776 Author: snipe Date: Thu Aug 29 11:08:02 2024 +0100 Merge pull request #15408 from snipe/redirect-on-print-if-user-invalid Check that the user exists before trying to print commit b06c5277674842267aed27d1cd3913dba6998be3 Author: snipe Date: Thu Aug 29 11:06:30 2024 +0100 Check that the user exists before trying to print Signed-off-by: snipe commit 7f1dfcc935002fd804dc6d8e94587392a107b967 Merge: 6f3fb21fe 26f28a862 Author: snipe Date: Wed Aug 28 14:29:06 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 26f28a862a23818f39a03442dd3a59f6e67acfbb Merge: e8da7e2df 94c981e22 Author: snipe Date: Wed Aug 28 14:26:03 2024 +0100 Merge pull request #15404 from snipe/bug/sc-26717-model-delete Set image to null if model is deleted commit 94c981e22c275c453369ba709e2996d847112f73 Author: snipe Date: Wed Aug 28 14:23:49 2024 +0100 Set image to null if model is deleted Signed-off-by: snipe commit 6f3fb21fef34cb61b5bf831f094c5fdfccbd18a9 Merge: a48e79a1f e8da7e2df Author: snipe Date: Wed Aug 28 12:50:19 2024 +0100 Merge remote-tracking branch 'origin/develop' commit e8da7e2df2c9ed364896a2e30dfec97544e5dc51 Merge: 7b5b559ba d635c86e0 Author: snipe Date: Wed Aug 28 12:46:48 2024 +0100 Merge pull request #15403 from snipe/clean_up_depreciations Fixed #15392 - filter by depreciation when showing models commit d635c86e0096825f46993310facfba8b05a47822 Author: snipe Date: Wed Aug 28 12:46:30 2024 +0100 Added tests Signed-off-by: snipe commit 406ff6984b7b0c41aff78f2534e76edbbe30b4b5 Author: snipe Date: Wed Aug 28 12:42:23 2024 +0100 Added click to select on models table Signed-off-by: snipe commit c6ddc501c5b6f674c36363ccf301b584be817564 Author: snipe Date: Wed Aug 28 12:40:12 2024 +0100 Filter by depreciation_id Signed-off-by: snipe commit 4839181beb926bbed2ef357078ba0892340384c2 Author: snipe Date: Wed Aug 28 12:40:01 2024 +0100 Added counts to API Signed-off-by: snipe commit 63a05c89a72bb45d05c16350b9d710480fb1516f Author: snipe Date: Wed Aug 28 12:39:52 2024 +0100 Added counts to show method Signed-off-by: snipe commit 385c4f69f7225a76bbd548ee8f34aaaf0908a4f5 Author: snipe Date: Wed Aug 28 12:39:43 2024 +0100 Added counts to depreciation transformer Signed-off-by: snipe commit 486cd8c8c98d4fb83f28d7f8ab32894bde93f68f Author: snipe Date: Wed Aug 28 12:39:09 2024 +0100 Nicer formatting for searchableAttributes Signed-off-by: snipe commit eb5d93b3c2bf22d11063830771675c4f081eb516 Author: snipe Date: Wed Aug 28 12:38:55 2024 +0100 Added assets relationship Signed-off-by: snipe commit a5ff623484d066e7c29c0982a8e2df389142138c Author: snipe Date: Wed Aug 28 12:38:43 2024 +0100 Added asset, license, model count to API Signed-off-by: snipe commit b5a4389815cb133e645cd0efe68a2f14df110202 Author: snipe Date: Wed Aug 28 12:38:31 2024 +0100 Added badge count, fixed model bulk edit menu Signed-off-by: snipe commit 7b5b559baa83a51235119440dddc3c133e51f585 Merge: 64c4433b9 67a992974 Author: snipe Date: Wed Aug 28 11:57:29 2024 +0100 Merge pull request #15401 from snipe/fixes-15397-new-window-for-label Opens label new window commit 67a9929745e11371a12b169a8b2317eac581961b Author: snipe Date: Wed Aug 28 11:56:54 2024 +0100 Opens label new window Signed-off-by: snipe commit a48e79a1fc0d84a00f0e72bb59d89b5036f204b2 Merge: c207d4843 64c4433b9 Author: snipe Date: Tue Aug 27 07:37:53 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 64c4433b984676b487eb969c2990edcda1cadceb Merge: d3e8e0663 22bc088f6 Author: snipe Date: Tue Aug 27 07:36:37 2024 +0100 Merge pull request #15396 from snipe/add_start_end_date_to_users_edit Added `start_date` and `end_date` to user bulk edit commit 22bc088f6f9f91407cd74530ffed94b88d316c72 Author: snipe Date: Tue Aug 27 07:21:19 2024 +0100 Added start_date and end_date to user bulk edit Signed-off-by: snipe commit d3e8e066381a41de7974507469d0838ab36a9f43 Author: snipe Date: Mon Aug 26 14:07:06 2024 +0100 Add @swift2512 as a contributor commit c207d48430356fd4cc55a5e8bbca299294901b69 Merge: 991e48696 1b933f7ad Author: snipe Date: Mon Aug 26 14:01:38 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 1b933f7add1d8e27d7cc04ab817b933273cc60c0 Author: snipe Date: Mon Aug 26 13:47:17 2024 +0100 Added s to fa icons Signed-off-by: snipe commit 991e48696ae4659dcd02069bf70da4888beb293f Merge: 797488504 3fe891a05 Author: snipe Date: Mon Aug 26 10:26:06 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 3fe891a05babb7dc843a2b93cb29be76e86d7992 Author: snipe Date: Mon Aug 26 10:25:27 2024 +0100 Removed a few more commas Signed-off-by: snipe commit 7974885041b6e81b8c54ccad3ec674f955c08663 Merge: 4ef85bd52 f4c5b712f Author: snipe Date: Mon Aug 26 10:24:19 2024 +0100 Merge remote-tracking branch 'origin/develop' commit f4c5b712f4e45d4029496fa326fb80693739d89f Author: snipe Date: Mon Aug 26 10:24:07 2024 +0100 Removed colons Signed-off-by: snipe commit 4ef85bd529bffeeb83fbf89f66956f5be9e3b568 Merge: 6eab83a85 4c8dc7818 Author: snipe Date: Fri Aug 23 17:58:08 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 4c8dc7818dee1988ee3bbc31b980bdcdef8f6e2c Merge: aa86e07cd 5c43a1f87 Author: snipe Date: Fri Aug 23 17:57:00 2024 +0100 Merge pull request #15389 from snipe/added_generate_label_to_button_stack Fixed #15388 - Moved generate label button commit 5c43a1f87cfbd7558df08314e4212b6524f7f7dd Author: snipe Date: Fri Aug 23 17:54:49 2024 +0100 Use proper style for buttons Signed-off-by: snipe commit d3b265de8e44131610a003affe46918130c929e7 Author: snipe Date: Fri Aug 23 17:48:36 2024 +0100 Moved button on hardware Signed-off-by: snipe commit 263151658fd7bc6f527388ff0f5b9533cb516567 Author: snipe Date: Fri Aug 23 17:44:09 2024 +0100 Moved general label button Signed-off-by: snipe commit 6eab83a85a220b0dbcc35c70942b26d7901634e4 Merge: cce1f87da aa86e07cd Author: snipe Date: Fri Aug 23 15:22:53 2024 +0100 Merge remote-tracking branch 'origin/develop' commit aa86e07cd2341ad4877a053d10aa55759be940b4 Author: snipe Date: Fri Aug 23 15:22:39 2024 +0100 Fixed #15385 - small icon tweaks Signed-off-by: snipe commit cce1f87da653aa4a4547e585b5befb54fd9f0af9 Merge: b460e8dc8 d92fa5de6 Author: snipe Date: Fri Aug 23 15:18:30 2024 +0100 Merge remote-tracking branch 'origin/develop' commit d92fa5de6518e787790b5f0f82b4ad9da00af506 Author: snipe Date: Fri Aug 23 15:17:25 2024 +0100 fa-fw on settings icon Signed-off-by: snipe commit b460e8dc831bb6ff96b15fbdff4628bf6d9cd18e Merge: 50cb7e65c c589140ea Author: snipe Date: Fri Aug 23 08:42:32 2024 +0100 Merge remote-tracking branch 'origin/develop' commit c589140ea0fe8320b60529ba3fcfe699000e9144 Merge: cc2c8f76d 52894615c Author: snipe Date: Fri Aug 23 08:42:04 2024 +0100 Merge pull request #15383 from snipe/re-adds-checkout-button Fixed #15378 - Corrected gate on checkin button on asset view commit 52894615ce962beef3f1eff89f1ee916fbe0a878 Author: snipe Date: Fri Aug 23 08:40:41 2024 +0100 More specific gate for checkin Signed-off-by: snipe commit 8546bbdd65c9eb71fbe227df8b26014a894092c1 Author: snipe Date: Fri Aug 23 08:38:47 2024 +0100 Fixed gate for checkout button Signed-off-by: snipe commit 50cb7e65c9439879ad552fa787c4139e1636dec3 Merge: 821dd158d cc2c8f76d Author: snipe Date: Fri Aug 23 07:32:39 2024 +0100 Merge remote-tracking branch 'origin/develop' commit cc2c8f76d0fd55f7b33110dfa8125679e31b85f4 Merge: 1ffa69c43 3957d670d Author: snipe Date: Fri Aug 23 07:31:29 2024 +0100 Merge pull request #15375 from Godmartinz/fix-acceptance-reminder-command Fixes the `acceptance-reminder` command commit 1ffa69c43c8369d31bceafc0b537a675f6d4ba80 Merge: 78d355f13 f85ebd7ff Author: snipe Date: Fri Aug 23 07:28:20 2024 +0100 Merge pull request #15380 from snipe/fixed/fixed_nav_bracket Added pull-right to angle bracket commit f85ebd7ffd30b334593724cc04dec607afe75ea0 Author: snipe Date: Fri Aug 23 07:27:39 2024 +0100 Added pull-right to angle bracket Signed-off-by: snipe commit 78d355f136e4cd05d8c7cea66d2619cdfd903062 Merge: ec0346e4a af0a95be1 Author: snipe Date: Fri Aug 23 07:20:23 2024 +0100 Merge pull request #15377 from marcusmoore/fixes/custom-field-values-on-validation-error Fixed custom field defaults being prematurely updated commit ec0346e4a89635871f1a0f432ed2aa9fea6200c7 Author: snipe Date: Fri Aug 23 07:19:08 2024 +0100 Add @setpill as a contributor commit fc5eb377766c9ff076214f2eb3f441577a6480fb Merge: 833dace2b 1d7853cbf Author: snipe Date: Fri Aug 23 07:18:41 2024 +0100 Merge pull request #15379 from setpill/fix/load-trustproxies-middleware fixed #15374: load TrustProxies middleware in Kernel.php commit 9a73311a992773956bd311cc2577572b74ba4cee Author: Marcus Moore Date: Thu Aug 22 17:04:04 2024 -0700 Fix nested checkboxes being updated as a group commit aec781e7dfeca89ab441d2c294d407ae018c502e Author: Marcus Moore Date: Thu Aug 22 16:03:30 2024 -0700 Be a little more explicit commit 1d7853cbfe7ec5def3b8124133379355e133525d Author: setpill <37372069+setpill@users.noreply.github.com> Date: Thu Aug 22 19:45:53 2024 +0200 fixed #15374: load TrustProxies middleware in Kernel.php commit 7f3c86165b21ee10081604deeae23bc261ef0faa Author: Marcus Moore Date: Thu Aug 22 13:58:31 2024 -0700 Conditionally disable Add default values checkbox commit 10b45812c4733e69de83ff78889bce8519557b5a Author: Marcus Moore Date: Thu Aug 22 13:38:01 2024 -0700 Improve id for checkboxes and radio buttons commit c3165717ed43ed7bd4561b1b893a53ffb450ea9f Author: Marcus Moore Date: Thu Aug 22 13:20:04 2024 -0700 Handle old input commit d0a351a132e5be9ee0b86df314bdf0c73a2f12ce Author: Marcus Moore Date: Thu Aug 22 12:59:03 2024 -0700 Add comment commit 68749e7e878fdcece52a0927255b4ae62f221aae Author: Marcus Moore Date: Thu Aug 22 12:58:35 2024 -0700 Simplify logic commit 0abb5637e08551fa06611741212ffa51f258386f Author: Marcus Moore Date: Thu Aug 22 12:54:54 2024 -0700 WIP: handle old input commit af0a95be12fbe3b12ec710e95935fa1dcb54bc74 Author: Marcus Moore Date: Wed Aug 21 17:00:32 2024 -0700 Simplify assertions commit d67975cb62f1f5ddb5bc3fa7c5297cb71e3388ea Author: Marcus Moore Date: Wed Aug 21 16:59:44 2024 -0700 Implement fix commit 663b2fd844aa6461b5336f10f66d7ea49cf3ecdf Author: Marcus Moore Date: Wed Aug 21 16:59:38 2024 -0700 Add test case commit bcace9d019b08048a954a9b89df9e09f8cbfa67e Author: Marcus Moore Date: Wed Aug 21 16:54:16 2024 -0700 Point test to correct endpoint commit b59bf3e7dc803b24159744c8bf2819a95a7df8ab Author: Marcus Moore Date: Wed Aug 21 16:49:29 2024 -0700 Add failing test commit 3957d670d0b38505ab233ee42f66382392f5a389 Author: Godfrey M Date: Thu Aug 22 10:04:46 2024 -0700 fixes send acceptance reminder query commit 821dd158d1cf4d9eaef21a594754e863ddb96a5d Merge: 6c9a40268 833dace2b Author: snipe Date: Thu Aug 22 15:50:20 2024 +0100 Merge remote-tracking branch 'origin/develop' Signed-off-by: snipe # Conflicts: # public/css/build/app.css # public/css/build/overrides.css # public/css/dist/all.css # public/js/build/app.js # public/js/dist/all.js # public/mix-manifest.json commit 833dace2b4490fd3510ae3494743cd0cf321231c Merge: ec365b080 56e31d230 Author: snipe Date: Thu Aug 22 15:00:16 2024 +0100 Merge pull request #15373 from snipe/fixes/#15366_custom_fields Fixed #15366 use the non-admin edit encrypted custom fields permissions commit 56e31d23036db2c26900fb46b77fc9786041017a Author: snipe Date: Thu Aug 22 14:58:09 2024 +0100 Fixed #15366 - use permission for encrypted custom fields Signed-off-by: snipe commit ec365b0804237e9eb17d414c4837d81a1089ce02 Merge: ca8864c06 aef0ac68c Author: snipe Date: Thu Aug 22 14:49:13 2024 +0100 Merge pull request #15372 from StarlessNights/update-docker-compose-files Fixed #15371: docker-compose files updated. commit aef0ac68c36a7b2be1dece41f515df2bdae40ca4 Author: Iisakki Jaakkola Date: Thu Aug 22 16:10:00 2024 +0300 Need to use the long format for redis too in docker-compose file. commit f12f9a816f6776395788cec8e7b0bfddad3de26c Author: Iisakki Jaakkola Date: Thu Aug 22 15:47:12 2024 +0300 Update the official docker-compose file too while at it. commit a000d6454f23c0681c8abb1913479e528a463cb5 Author: Iisakki Jaakkola Date: Thu Aug 22 15:46:40 2024 +0300 Fix non-functional development docker-compose file. commit ca8864c061adbb2022ce81e5942ee0c243102191 Author: snipe Date: Thu Aug 22 13:28:52 2024 +0100 Fixed small layout quirks in asset view Signed-off-by: snipe commit 423f4f9126f1a91f7a2a47d8cfaae6eab2f43853 Merge: 456c7d8d9 5fa0c87ab Author: snipe Date: Thu Aug 22 13:25:41 2024 +0100 Merge pull request #14667 from Godmartinz/add_location_to_create_user_via_asset Adds location select to the create new user via asset checkout commit 456c7d8d919963687c8c0c325453a313263acad7 Merge: 54cfe3f6e d4d19569e Author: snipe Date: Thu Aug 22 13:20:56 2024 +0100 Merge pull request #15065 from Godmartinz/explicit_eol_removal_command Adds `snipeit:remove-explicit-eols` command commit 54cfe3f6e6ed6c019362d4827ab54ffcdee7c559 Merge: 5e0b18104 bb465dbfa Author: snipe Date: Thu Aug 22 13:20:10 2024 +0100 Merge pull request #15156 from uberbrady/re-add-stalebot Re-add stalebot-esque github Action commit 5e0b18104d9ccabb27ab34d42e13d5f2f2d59fe4 Merge: ec0b9b198 8b5d3f7fb Author: snipe Date: Thu Aug 22 12:59:20 2024 +0100 Merge pull request #15369 from snipe/fixes/checkbox_on_restore Fixed checkbox layout on modal from #15296 commit 8b5d3f7fbd082621abb222565b9268e254ae694c Author: snipe Date: Thu Aug 22 12:56:32 2024 +0100 Fixed extra closing p tag Signed-off-by: snipe commit 744f43676d51ee8b8cb06f2f690305dacd350563 Author: snipe Date: Thu Aug 22 12:53:16 2024 +0100 Fixed checkbox layout on modal from #15296 Signed-off-by: snipe commit ec0b9b198f54a72fe757252339e38f4bc8348ae5 Merge: 94300d81d 738ef442f Author: snipe Date: Thu Aug 22 12:43:07 2024 +0100 Merge pull request #15296 from uberbrady/expose_restore_sanitize Expose the 'sanitize' system for backup restores to the web GUI commit 6c9a402685f3faffd4cd5df0df296568f6705f9e Author: snipe Date: Thu Aug 22 11:20:52 2024 +0100 Updated prod assets Signed-off-by: snipe commit 1b310f3a247fc6279182ad3fe364e180478f80c3 Merge: c54bff0f8 94300d81d Author: snipe Date: Thu Aug 22 11:20:42 2024 +0100 Merge remote-tracking branch 'origin/develop' Signed-off-by: snipe # Conflicts: # public/css/build/app.css # public/css/build/overrides.css # public/css/dist/all.css # public/mix-manifest.json commit 94300d81d618d4b50c127e6094f78453412746b9 Author: snipe Date: Thu Aug 22 11:19:32 2024 +0100 Updated dev assets Signed-off-by: snipe commit bc9ea5a2eced12c84493819d9c58b232171ee3e5 Merge: 4635a6efc 963911f2e Author: snipe Date: Thu Aug 22 11:18:06 2024 +0100 Merge pull request #15352 from Godmartinz/mobile_breakpoint Fixed Mobile misalignment of info on Assets and Users view pages commit 4635a6efc38c4763153b944ebe766f7e023ea892 Merge: 9608414ea d29b3bfb9 Author: snipe Date: Thu Aug 22 11:17:49 2024 +0100 Merge pull request #15360 from snipe/more_print_fixes More print fixes for asset view commit 9608414eaedf3fd1b99a5ea70e508e01f09a507b Merge: 47d8e2f8b 5efddf6f5 Author: snipe Date: Thu Aug 22 11:06:13 2024 +0100 Merge pull request #15367 from snipe/fixes/15344_added_freeform_to_country_select2 Fixed #15344 - make select2 for countries freeform-ish commit 5efddf6f5b287f83295e5bde066e7a5a707215e6 Author: snipe Date: Thu Aug 22 11:01:39 2024 +0100 Allow clear on country dropdown Signed-off-by: snipe commit 305dc049a498c913caacdd6f2c21f4320b9c9e52 Author: snipe Date: Thu Aug 22 11:01:28 2024 +0100 Added asterisk help text Signed-off-by: snipe commit 3ac07020945751505b06d4acc358575e92860e0e Author: snipe Date: Thu Aug 22 10:13:22 2024 +0100 Fixed #15344 - make select2 for countries freeform-ish Signed-off-by: snipe commit 47d8e2f8b91f82768a9399c5d4de73d63974eb82 Author: snipe Date: Thu Aug 22 09:42:05 2024 +0100 Add @Scarzy as a contributor commit a2246b96451c81aab3243a67c2df1ed4ae7eb841 Author: Marcus Moore Date: Wed Aug 21 17:00:32 2024 -0700 Simplify assertions commit 1d897597062351b6fb8fac736cd34cc58b71b2ac Author: Marcus Moore Date: Wed Aug 21 16:59:44 2024 -0700 Implement fix commit 206f8fe605e18deab216a3f61026321b57a8b118 Author: Marcus Moore Date: Wed Aug 21 16:59:38 2024 -0700 Add test case commit 21d2217619d95434ab1fea3f9e2720e73ad51fb9 Author: Marcus Moore Date: Wed Aug 21 16:54:16 2024 -0700 Point test to correct endpoint commit 833bcb282f4516cc12e0edf7efd0f7f82e25eba8 Author: Marcus Moore Date: Wed Aug 21 16:49:29 2024 -0700 Add failing test commit 83dd9ce20e8b000b2ed96ead370cebbfa7f53427 Merge: 6fdce3c53 a8eb76fd8 Author: snipe Date: Wed Aug 21 23:15:24 2024 +0100 Merge pull request #15362 from r-xyz/model-files-api Added #9413: AssetModel files endpoints to API commit a8eb76fd8dae5f2ad6b716307b32ba477d31ed32 Author: r-xyz <100710244+r-xyz@users.noreply.github.com> Date: Wed Aug 21 22:25:41 2024 +0200 Fixed model files API routes. commit cd7db5c4a8448239b632507ea53a25545b41d972 Author: r-xyz <100710244+r-xyz@users.noreply.github.com> Date: Wed Aug 21 22:24:08 2024 +0200 Fix some typos in models file handler. commit da7313bc9d2ee8614967abaf601782fe85e35113 Author: r-xyz <100710244+r-xyz@users.noreply.github.com> Date: Wed Aug 21 20:24:22 2024 +0200 Fix models files API routes. commit 4ec361c7183547cd90e67c8c86e87055e55605be Author: r-xyz <100710244+r-xyz@users.noreply.github.com> Date: Wed Aug 21 19:49:51 2024 +0200 Add AssetModel files endpoints to API commit 738ef442fdd87887b1ad26ccadf7e78217ffa52e Author: Brady Wetherington Date: Wed Aug 21 13:16:51 2024 +0100 Rename .env var to have DB_ prefix for sanitize-by-default setting commit d29b3bfb9ae71dc66bf3f49ee6f3453aa2847da9 Author: snipe Date: Wed Aug 21 13:06:16 2024 +0100 Few more hidden-print classes Signed-off-by: snipe commit 6fdce3c536a41168c22141589f4a5dd72ff33fbb Merge: 01c4fe611 1ab29ec3a Author: snipe Date: Wed Aug 21 13:02:50 2024 +0100 Merge pull request #15358 from r-xyz/rename-docker-startup Renamed docker startup scripts coherently. commit 912bbf0e32ad362bb1055eb6d8c62e7ecdce4510 Author: snipe Date: Wed Aug 21 13:02:21 2024 +0100 More print fixes Signed-off-by: snipe commit c54bff0f83baba2e89e7e20c6af92d9e71c50d63 Merge: d3f30ced9 01c4fe611 Author: snipe Date: Wed Aug 21 12:24:13 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 01c4fe61139bb3f259e4d4511537590a7e3fc8c6 Merge: 7e475a078 0fa9f5797 Author: snipe Date: Wed Aug 21 12:12:23 2024 +0100 Merge pull request #15359 from uberbrady/improve_windows_upgrade Fixed #15190 - Improvements to upgrade.php script to improve Windows experience commit 0fa9f57971391d0c24c3585d8bf8fcdafa2731a9 Author: Brady Wetherington Date: Wed Aug 21 11:53:38 2024 +0100 Improvements to upgrade.php script to improve Windows experience commit 1ab29ec3a4c7ad902aa95cd35105105eb2ec567d Author: r-xyz <100710244+r-xyz@users.noreply.github.com> Date: Wed Aug 21 11:52:09 2024 +0200 Rename docker startup scripts coherently. commit 7e475a07863c5f4ead90871ef018544b9dcd4205 Merge: d0acf5b8a 26b3c62ab Author: snipe Date: Wed Aug 21 10:41:17 2024 +0100 Merge pull request #15357 from snipe/tighten_category_view_translations Fixed #15330 - Cleaned up category title commit 26b3c62ab804d0ee03815e772ba02e22274bc89c Author: snipe Date: Wed Aug 21 10:29:51 2024 +0100 Cleaned up category title Signed-off-by: snipe commit d3f30ced94465ead29280f83e57b5f38073bc465 Merge: 973e2e575 d0acf5b8a Author: snipe Date: Wed Aug 21 10:13:57 2024 +0100 Merge remote-tracking branch 'origin/develop' commit d0acf5b8a6c032e2864b95b3f8c7bcbf0c7bf731 Merge: 09033b19a 74fbc2382 Author: snipe Date: Wed Aug 21 10:12:58 2024 +0100 Merge pull request #15356 from snipe/validate_location_parent Fixed #15341 - validate parent ID commit 74fbc238230cabc1c44ab1933c65fe48effda13f Author: snipe Date: Wed Aug 21 10:09:35 2024 +0100 Updated tests Signed-off-by: snipe commit a23dee52f27aa4c54578308eef78f3d875b34c65 Author: snipe Date: Wed Aug 21 09:58:47 2024 +0100 Added tests Signed-off-by: snipe commit 4d03f1e110b02e5a75bf931a6674b67c269c12de Author: snipe Date: Wed Aug 21 09:46:18 2024 +0100 Fixed #15341 - validate parent ID Signed-off-by: snipe commit 963911f2e19b04656b470d00da76cedfe5b3d068 Author: Godfrey M Date: Wed Aug 21 00:23:10 2024 -0700 changed order of info stgack commit 59832126cbf9a3d86265f03deedc2267ca32a706 Author: Marcus Moore Date: Tue Aug 20 16:52:51 2024 -0700 Improve comment commit 680cce3ee2d47357aa9daf5878b87a2016e35410 Author: Marcus Moore Date: Tue Aug 20 16:42:29 2024 -0700 Align indents commit 6c5ec6a16c3eeccf9391083dc988345d41602a95 Author: Marcus Moore Date: Tue Aug 20 16:41:24 2024 -0700 Get datepicker working commit 5d1f98bf93fedc77c08740f06d77590283baa24e Author: Marcus Moore Date: Tue Aug 20 15:38:43 2024 -0700 Simplify by directly wire:modeling commit 9d484077ae030020e3b1cd585783d8db03c5c0f5 Author: Godfrey M Date: Tue Aug 20 14:24:37 2024 -0700 missed a file commit 9858b0f37f2f27c43c47e6f437b36e8a72985690 Author: Godfrey M Date: Tue Aug 20 14:23:55 2024 -0700 fixes info tab for users and assets commit 973e2e5756b72e939f046d561fd91f2a344ca5cb Merge: 46ed07642 09033b19a Author: snipe Date: Tue Aug 20 19:45:53 2024 +0100 Merge remote-tracking branch 'origin/develop' Signed-off-by: snipe # Conflicts: # config/version.php commit 09033b19a7be28ea35e0bd4fe9f94c0e4f8c1a70 Author: snipe Date: Tue Aug 20 19:44:13 2024 +0100 Bumped hash Signed-off-by: snipe commit 46ed0764288efc767a14069ed8a1edbf5963e539 Merge: d3a555ce9 5fdeb9c41 Author: snipe Date: Tue Aug 20 19:42:56 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 5fdeb9c4131e7fb3653f359419500d9b130c2443 Merge: 22d373407 6c450d133 Author: snipe Date: Tue Aug 20 19:42:08 2024 +0100 Merge pull request #15351 from snipe/localizations/new_translations_2024-08-20 Updated languages commit 22d3734075becd0d9604ddc18cc0403d9cdfb025 Merge: d99b306ae eca6b03f4 Author: snipe Date: Tue Aug 20 19:34:38 2024 +0100 Merge pull request #15350 from marcusmoore/icon-component-updates Fixed icon not rotated and simplified component commit eca6b03f44a0f4c51c650afa45bf9833021a8314 Author: Marcus Moore Date: Tue Aug 20 11:08:53 2024 -0700 Allow id to be rendered commit bbdbec71976b0abd2c1ac8e6c999d6321098b37b Author: Marcus Moore Date: Tue Aug 20 11:00:39 2024 -0700 Rely on $attributes behavior rendering passed attributes commit 6c450d1338225ae459abaf23d5662d40d03ca512 Author: snipe Date: Tue Aug 20 18:18:17 2024 +0100 Updated languages Signed-off-by: snipe commit a8cd1027f3cc1716b76461f9db7dbc17b8a130b4 Author: spencerrlongg Date: Tue Aug 20 11:40:15 2024 -0500 rm commented code commit d3a555ce91fd838e625d0bcdb75f31a79439936b Author: snipe Date: Tue Aug 20 11:49:39 2024 +0100 Updated assets Signed-off-by: snipe commit 0f8e041809f151f45a26c2f1b6cd131e4fd224a6 Merge: e8a22f3c5 d99b306ae Author: snipe Date: Tue Aug 20 11:49:32 2024 +0100 Merge remote-tracking branch 'origin/develop' Signed-off-by: snipe # Conflicts: # public/css/build/app.css # public/css/build/overrides.css # public/css/dist/all.css # public/css/dist/bootstrap-table.css # public/js/dist/bootstrap-table.js # public/mix-manifest.json commit d99b306ae96d636504323b0c92a879d9df5fa993 Merge: f597d6433 74136761d Author: snipe Date: Tue Aug 20 11:46:55 2024 +0100 Merge pull request #15345 from snipe/add_trim_strings_middleware Added TrimStrings middleware commit 74136761dfdbeb9486f07d8ef7658a47402f5b18 Author: snipe Date: Tue Aug 20 11:45:13 2024 +0100 Added TrimStrings middleware Signed-off-by: snipe commit f597d64339bec6e1a7bf06e9ecf1e78c7b2f08fb Merge: 64bed01a9 0072f1500 Author: snipe Date: Tue Aug 20 10:17:26 2024 +0100 Merge pull request #15342 from snipe/snyk/bs-tables [Snyk] Upgrade bootstrap-table from 1.23.0 to 1.23.2 commit 0072f1500ea60a7660f995fa100ddb46600d1ec6 Author: snipe Date: Tue Aug 20 10:16:27 2024 +0100 [Snyk] Upgrade bootstrap-table from 1.23.0 to 1.23.2 Signed-off-by: snipe commit 64bed01a9168e8b9e57100db06653cda678be3b5 Merge: f8c72fb0a f6319e11e Author: snipe Date: Tue Aug 20 10:13:43 2024 +0100 Merge pull request #15327 from snipe/update_button_style Update icons to use blade components, standardize button colors and format commit f6319e11e7103231ffb9c34093560e319c1d0859 Author: snipe Date: Tue Aug 20 10:11:27 2024 +0100 Added fa-fw to sidebar elements Signed-off-by: snipe commit 5d9f988df3110286d342aa2a4f069abb437a2f69 Author: snipe Date: Tue Aug 20 10:01:49 2024 +0100 Added fw class to topnav icons Signed-off-by: snipe commit f8c72fb0ac4c44b32fa3ad8d886da82a603c7d72 Merge: 886514a25 fa765667f Author: snipe Date: Tue Aug 20 09:57:03 2024 +0100 Merge pull request #15112 from marcusmoore/livewire-importer-improvements Improved handling attempted access of deleted files in importer commit 8e1111c681df1a7f7ef88c5ce3a91585cbb243d0 Merge: 697595d96 886514a25 Author: akemidx Date: Mon Aug 19 19:33:44 2024 -0400 Merge remote-tracking branch 'upstream/develop' into eol_date_range_for_reports commit 886514a25f3a45525366d8520a3cfc89eadc237d Merge: cb40a82e7 434bdcd6d Author: snipe Date: Mon Aug 19 22:46:08 2024 +0100 Merge pull request #15336 from marcusmoore/fixes/remove-displayed-parentheses Fixed `)` being added to expected asset checkin report email header commit fa765667f261205853300a0bde11d719fbbec5e1 Merge: 94d8a547b cb40a82e7 Author: Marcus Moore Date: Mon Aug 19 14:41:58 2024 -0700 Merge branch 'develop' into livewire-importer-improvements commit 434bdcd6d4f3f1ffccdd9d3eb52af5c74d4b24f0 Author: Marcus Moore Date: Mon Aug 19 14:31:47 2024 -0700 Add missing parentheses to conditional commit be5f3f38f802a5aaf290cb9d9151cf2725e10688 Author: snipe Date: Mon Aug 19 14:48:12 2024 +0100 Settings pages Signed-off-by: snipe commit 08c3a25b39a8ff8465d5445bf30e575c6918c5a7 Author: snipe Date: Mon Aug 19 14:16:57 2024 +0100 Little more padding Signed-off-by: snipe commit 34cd4b624404cd12464ede49d2be58ba6a7a0f7e Author: snipe Date: Mon Aug 19 14:15:36 2024 +0100 Added links to apple/google maps Signed-off-by: snipe commit d89c8682beb4c30bebebf1b28fdd84b18a612477 Author: snipe Date: Mon Aug 19 13:46:31 2024 +0100 Reversed location button ordering Signed-off-by: snipe commit 6f024849e9949121ec9459383a1510d026daeea8 Author: snipe Date: Mon Aug 19 13:39:24 2024 +0100 Few more Signed-off-by: snipe commit e048f0955f007b83ad023257b6b65830b22f0b72 Author: snipe Date: Mon Aug 19 13:27:21 2024 +0100 More icons Signed-off-by: snipe commit 479b2b4fd3e813d56301ec76e112b1997d31cd07 Author: snipe Date: Mon Aug 19 13:23:08 2024 +0100 More icons Signed-off-by: snipe commit 84f14a05bd09d0e85fcce5aa933e598893266a96 Author: snipe Date: Mon Aug 19 13:20:19 2024 +0100 Fixed logging for asset model restore Signed-off-by: snipe commit 8d52fa51b16a978ddfdadd49c321956277cdcbb2 Author: snipe Date: Mon Aug 19 13:20:06 2024 +0100 Fixed suppliers buttons Signed-off-by: snipe commit 229d8b9bf573f0a20ade55bdd1f90f8ea507b84a Author: snipe Date: Mon Aug 19 13:19:59 2024 +0100 Added location restore Signed-off-by: snipe commit eb8d43a8049cc470e605e7faec493fa7fef396a1 Author: snipe Date: Mon Aug 19 12:32:44 2024 +0100 Updated buttons on models Signed-off-by: snipe commit f82266fadec3524f4ee0304a18a1ec8a4ba642a5 Author: snipe Date: Mon Aug 19 11:58:31 2024 +0100 Cleaned up presenters Signed-off-by: snipe commit b4b6f7a35f8060b5bec460d537816b72e8b0fd1b Author: snipe Date: Mon Aug 19 11:58:21 2024 +0100 Added css-consumable to overrides for table headers Signed-off-by: snipe commit 0bc995b87f6dc5db5523ed099cafd6ea396c642a Author: snipe Date: Mon Aug 19 11:58:05 2024 +0100 Updated more icons Signed-off-by: snipe commit 59725f203173f5eb9536d052d1356f8be2ca5df4 Author: snipe Date: Mon Aug 19 11:57:40 2024 +0100 Removed extra debugging in test Signed-off-by: snipe commit 00bc9ac8065f4a960d508c4883ba01b77b1eb2b4 Author: snipe Date: Sun Aug 18 22:39:14 2024 +0100 Fixed spacing Signed-off-by: snipe commit f200960a5756e306d4230b70b702c8c772505597 Author: snipe Date: Sun Aug 18 22:26:57 2024 +0100 Aaaand more Signed-off-by: snipe commit c700127f1ae3db8cd2d4585476ac27b1c146fe43 Author: snipe Date: Sun Aug 18 22:09:00 2024 +0100 Updated user view Signed-off-by: snipe commit ae2f9571b43665eee44b7e9ed48e0358b65eff04 Author: snipe Date: Sun Aug 18 21:57:37 2024 +0100 And still more Signed-off-by: snipe commit a77dcad33654a960f117ba993ba78a78c5c76aab Author: snipe Date: Sun Aug 18 20:30:53 2024 +0100 More links Signed-off-by: snipe commit 7ace9324b4450ef0da8fa2c2dd9d21cc96a32175 Author: snipe Date: Sun Aug 18 20:30:22 2024 +0100 Added padlock sound Signed-off-by: snipe commit d2e889e927a1b88aca3564d140093f146e7bfb71 Author: snipe Date: Sun Aug 18 19:21:59 2024 +0100 Still more Signed-off-by: snipe commit 803bdb457c12f186c75e7d837d301aeb6b8ad217 Author: snipe Date: Sun Aug 18 18:48:19 2024 +0100 Added calendar Signed-off-by: snipe commit 7c9b1f6e38b56305a2f6f59c7bb28df9cc3c599d Author: snipe Date: Sun Aug 18 18:39:22 2024 +0100 Added the plus icon Signed-off-by: snipe commit d545537a431942b3b1b0d0e625c2daa8ab95853f Author: snipe Date: Sun Aug 18 18:34:13 2024 +0100 More icons Signed-off-by: snipe commit 4d8904938dfa80487a37b72171a5a692f5dbcdb0 Author: snipe Date: Sun Aug 18 18:24:26 2024 +0100 Added calendar icon for datepickers Signed-off-by: snipe commit 0c09f2b2c0e935c93f66088552589a6c7950ec61 Author: snipe Date: Sun Aug 18 18:13:49 2024 +0100 Moar icon replacement Signed-off-by: snipe commit bffba025113c5f95cf140802f41ea03c49db4030 Author: snipe Date: Sun Aug 18 17:26:44 2024 +0100 Updated icons Signed-off-by: snipe commit 901f4df7eef6a814e9274dd9addc56c715363c3e Author: snipe Date: Sun Aug 18 17:03:36 2024 +0100 Added more icons Signed-off-by: snipe commit 9337cba34030be17c2fd8ccc50d42d8b5cc081e9 Author: snipe Date: Sun Aug 18 15:53:58 2024 +0100 Added download Signed-off-by: snipe commit 2b0c67c26381a55ade9104438386fef646b5c17e Author: snipe Date: Sun Aug 18 15:51:00 2024 +0100 Load the icon helper Signed-off-by: snipe commit da71f031f5b66662ec5c64f913f3be76e349e23d Author: snipe Date: Sun Aug 18 15:48:24 2024 +0100 Use icon in hardware view Signed-off-by: snipe commit d2e585baa76991037b82cfa9b610a279b744ad00 Author: snipe Date: Sun Aug 18 15:47:45 2024 +0100 Added icon blade Signed-off-by: snipe commit a102c085dfb36ecc64f7056720418fd00e268310 Author: snipe Date: Sun Aug 18 15:47:37 2024 +0100 Added icon helper Signed-off-by: snipe commit e8a22f3c5bf0fc22602a1373cf91090d40e9d734 Merge: d843cf8dc cb40a82e7 Author: snipe Date: Sun Aug 18 04:55:04 2024 +0100 Merge remote-tracking branch 'origin/develop' commit cb40a82e796dbffb2fe237c290d44bdb9fdd1bcc Merge: 7e6ff3cbe 4253acad4 Author: snipe Date: Sun Aug 18 04:54:23 2024 +0100 Merge pull request #15324 from snipe/jerk_prevention Prevent passing an array as login commit 4253acad4c9bdabdbc42ea3ea46885fde8ebf706 Author: snipe Date: Sun Aug 18 04:51:36 2024 +0100 Prevent passing an array as login Signed-off-by: snipe commit d843cf8dcc94e50c36958e4180ec76f9e351d7ad Merge: 1013dcae6 7e6ff3cbe Author: snipe Date: Sat Aug 17 00:52:10 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 1013dcae618b77bc96df9c52298f912d3d756684 Merge: c30c649aa e7ef3bf51 Author: snipe Date: Sat Aug 17 00:38:44 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 70e5e0f9df91c10d94568c98168be1f5fdc5686a Author: spencerrlongg Date: Fri Aug 16 12:52:06 2024 -0500 get rid of dd commit dec4691c73b28bab35ed8fdb1ff83578ad517bb0 Author: spencerrlongg Date: Fri Aug 16 12:50:09 2024 -0500 should be good to go now commit c30c649aaae21ab6dad1e077155cc0bc4e09e2af Merge: bb1385369 ad6d09b6a Author: snipe Date: Fri Aug 16 16:44:02 2024 +0100 Merge remote-tracking branch 'origin/develop' commit bb1385369c65ac2eab73ba626ab8b2bad7439270 Merge: c1caf6088 43b338d61 Author: snipe Date: Fri Aug 16 16:18:00 2024 +0100 Merge remote-tracking branch 'origin/develop' Signed-off-by: snipe # Conflicts: # public/css/build/app.css # public/css/build/overrides.css # public/css/dist/all.css # public/mix-manifest.json commit c1caf6088eeb0474dd90a66b12d592541084fc89 Author: snipe Date: Fri Aug 16 13:12:13 2024 +0100 Prod assets Signed-off-by: snipe commit 12dfe71ea840bf5b54365be22f432278630537fa Merge: ca8926871 ea2b1b074 Author: snipe Date: Fri Aug 16 12:48:42 2024 +0100 Merge remote-tracking branch 'origin/develop' commit ca89268716df8d706182aba2a780c05a5a1afe30 Merge: ec5731353 3167ee91d Author: snipe Date: Fri Aug 16 11:02:56 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 94d8a547b88a4ee77caf0b3de85d382d07a74840 Merge: 6521c0252 b39a7c6f0 Author: Marcus Moore Date: Thu Aug 15 13:47:49 2024 -0700 Merge branch 'develop' into livewire-importer-improvements commit 43b109fac07f5b5725c094ff1f671b61db42fb16 Author: Marcus Moore Date: Thu Aug 15 13:20:22 2024 -0700 Use cached values for textarea and radio input commit 75c1e7658fe6303ca6decc82fcdb91a2aad995ab Author: Marcus Moore Date: Thu Aug 15 10:43:41 2024 -0700 Improve method name commit e7c9c799bbd90320ada1da9343cb8539bc23ecf1 Author: Marcus Moore Date: Thu Aug 15 10:40:23 2024 -0700 Add wire:keys commit 6ab976f353b67b03824ed2b29ea78155dd294b4b Author: Marcus Moore Date: Thu Aug 15 10:32:33 2024 -0700 Use cached values for text input commit ec5731353a5ce6921eff8faa5579c9a185d9eeb6 Merge: 3283704fe b39a7c6f0 Author: snipe Date: Thu Aug 15 15:53:52 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 3283704fe855ff1dabff53454b3248de8e3c05cb Author: snipe Date: Thu Aug 15 12:25:08 2024 +0100 Updated assets Signed-off-by: snipe commit 540df3204628a030027e138e8b24fdfa03088582 Merge: 85486fa58 594f50664 Author: snipe Date: Thu Aug 15 12:24:59 2024 +0100 Merge remote-tracking branch 'origin/develop' Signed-off-by: snipe # Conflicts: # public/js/build/app.js # public/js/dist/all.js # public/mix-manifest.json commit 85486fa58c5598e6178abe48203f84f3e0b2931a Merge: 3618df2ec 10dc1f136 Author: snipe Date: Thu Aug 15 10:53:54 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 3618df2ec5c81efd3634f74ec18346f91f6b3cc4 Merge: a201f22fd 8f7bce7aa Author: snipe Date: Thu Aug 15 10:44:39 2024 +0100 Merge remote-tracking branch 'origin/develop' commit a201f22fdb85ce2f7f0961b6f19ef842163fa8a3 Author: snipe Date: Thu Aug 15 10:36:12 2024 +0100 Bumped version Signed-off-by: snipe commit 6070d530cf95d5666fcee4349754efe8f36842ee Merge: 6c0cf9447 4d66f7c93 Author: snipe Date: Thu Aug 15 10:35:33 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 6c0cf944738bc6b5813f83a7165be2500ae2f218 Merge: bf4b91516 381003eea Author: snipe Date: Thu Aug 15 10:28:08 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 9622e05cf5b545bac1f506af085e6c7e27259848 Author: spencerrlongg Date: Wed Aug 14 18:41:06 2024 -0500 correct api test commit afaf53cdfc37d49ba1afbbe178cd974fbb83920f Author: spencerrlongg Date: Wed Aug 14 18:14:21 2024 -0500 failing ui test commit f031309f8ffce5747c29e24d467b93cf61ace657 Author: spencerrlongg Date: Wed Aug 14 16:09:15 2024 -0500 set up api controller for route/model binding commit 20ec420ba3a51638f7934e5a3820907760fc544c Author: spencerrlongg Date: Wed Aug 14 13:53:29 2024 -0500 not quite done, api side needs some work commit ab63a19affed7fe30f2ba13db4e17b391342414a Author: Marcus Moore Date: Wed Aug 14 11:01:51 2024 -0700 Initialize concept of cached values commit a70b94e707a66c1666d2ba5a1d85eff6f1cd461f Merge: 120cfd13c 3e2945709 Author: spencerrlongg Date: Wed Aug 14 11:36:19 2024 -0500 Merge branch 'refs/heads/develop' into bug/sc-26584 commit 008bf036b5159cf086e3b4e7af2f27774de8461c Author: Brady Wetherington Date: Wed Aug 14 16:09:34 2024 +0100 Got rid of weird namespace declaration and commented-out data-toggle line commit cc5ad456e6b65c3e0d8d1ad9d7bd7ab4b31d2249 Author: Brady Wetherington Date: Wed Aug 14 15:59:21 2024 +0100 Expose the 'sanitize' system for backup restores to the web GUI commit bf4b915168d19668f9653fb0bbbf66204cec3239 Merge: 0a9c2e354 0f1e5181a Author: snipe Date: Wed Aug 14 10:45:13 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 0a9c2e354f44469972da3ecc063f4f7a1c1d1331 Merge: 47f1b3b14 e54400718 Author: snipe Date: Wed Aug 14 10:02:43 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 038e86954b10fda8100d3a6cf5c87f48880e69e4 Author: Marcus Moore Date: Tue Aug 13 17:30:53 2024 -0700 Improve property name commit f6c1642bf231ca69fa7a2b328957050dcf39af18 Author: Marcus Moore Date: Tue Aug 13 17:01:35 2024 -0700 Use computed fields in CustomFieldSetDefaultValuesForModel component commit 120cfd13c544fb79e69f5f59aa44f908b4a39947 Author: spencerrlongg Date: Tue Aug 13 14:07:40 2024 -0500 translation commit 09f2739298933ea8150a6dfda4aa19b3c5baa94f Author: spencerrlongg Date: Tue Aug 13 13:45:41 2024 -0500 works, un-reassignable licenses are an issue commit 47f1b3b14e291a46b66d028e259425dd8e017f5b Merge: 198b76ebc 3044af941 Author: snipe Date: Tue Aug 13 16:48:06 2024 +0100 Merge remote-tracking branch 'origin/develop' Signed-off-by: snipe # Conflicts: # public/css/build/app.css # public/css/build/overrides.css # public/css/dist/all.css # public/mix-manifest.json commit 198b76ebc2c7099aed211e812ac85f1f3db49060 Merge: 5546f9676 6e84c29ce Author: snipe Date: Tue Aug 13 15:47:00 2024 +0100 Merge remote-tracking branch 'origin/develop' Signed-off-by: snipe # Conflicts: # public/css/build/app.css # public/css/build/overrides.css # public/css/dist/all.css # public/mix-manifest.json commit 5546f9676a9795d17cfd6c518f8f8bc78e80b1a0 Merge: 46caa478d 9e73eaf95 Author: snipe Date: Tue Aug 13 13:51:33 2024 +0100 Merge remote-tracking branch 'origin/develop' commit ec863df0074ce785aa3ac80f4871accb8eb2145b Author: spencerrlongg Date: Mon Aug 12 16:58:53 2024 -0500 rm conditional that might be unnecessary commit cc3b8e0681f74276958c988d986de07cff3e798d Author: spencerrlongg Date: Mon Aug 12 16:58:21 2024 -0500 this should more or less work, but i need to determine if this is the best way commit ff145abbe720f36604585005b26cf62873169f56 Author: spencerrlongg Date: Mon Aug 12 16:13:03 2024 -0500 use array for eager loading, makes ide prettier commit 46caa478d2eb120f3a1acec3b04dc4c9866e6116 Merge: 4d8569e75 e6106aa7c Author: snipe Date: Mon Aug 12 20:47:45 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 4d8569e7548aedc9121f2a03f78736247a849744 Merge: 4dc57f95e c9f8a84d4 Author: snipe Date: Mon Aug 12 18:01:21 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 4dc57f95e2bbd997deed5cc2e81717e04b5522f0 Merge: 316ee6f81 9d354ca65 Author: snipe Date: Mon Aug 12 16:38:23 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 316ee6f81092d419a95da198ad118590de134648 Merge: 509cc812e 3f2139349 Author: snipe Date: Mon Aug 12 16:30:53 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 509cc812ea1ef38b17bc3f4f21d9b98c92a3448e Merge: d5f66bc0d e7fb29fce Author: snipe Date: Mon Aug 12 15:58:40 2024 +0100 Merge remote-tracking branch 'origin/develop' commit d5f66bc0dd2092bc4f36812eff5016b0d41b6561 Merge: 1e213c31e ce5be8ac2 Author: snipe Date: Mon Aug 12 10:10:59 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 1e213c31ef6af0d9c420d74a1da5e2bd9e6c606c Merge: 91874dfe0 1777bb4b9 Author: snipe Date: Sun Aug 11 10:26:16 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 91874dfe0b5191daf5438d7ca5f2a64acf4d80f4 Merge: 0e6eda5e8 5c6c655cd Author: snipe Date: Sat Aug 10 19:37:37 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 0e6eda5e8afbed2448dc671e2a72aad6e882b4b3 Merge: 24560b936 60eb60215 Author: snipe Date: Sat Aug 10 18:29:41 2024 +0100 Merge remote-tracking branch 'origin/develop' commit 24560b93626946d9b74c0b262356fa81c5e27bd7 Author: snipe Date: Sat Aug 10 18:24:49 2024 +0100 Updated prod assets Signed-off-by: snipe commit 6521c025264979fa57e788c1cf223e862912d8c9 Merge: 8d1cc22c5 9350a2018 Author: Marcus Moore Date: Wed Aug 7 15:20:39 2024 -0700 Merge branch 'develop' into livewire-importer-improvements # Conflicts: # resources/views/livewire/importer.blade.php commit bb465dbfaafeb6d42a4ee277d1cfe6d7067dfa34 Author: Brady Wetherington Date: Wed Jul 24 15:09:23 2024 +0100 Cut down run number to 100 from 1000 commit 8cbcc237c0c587f05dd5e6e96bb900507c249d84 Author: Brady Wetherington Date: Wed Jul 24 13:27:31 2024 +0100 Cleanup of Stale workflow for GH - set to debug-mode to start commit 97e3af8fc989f0b03db39e984c45ba540f7f8ed7 Author: Brady Wetherington Date: Sat Jun 29 00:59:47 2024 +0100 WIP on new GitHub-backed stalebot settings commit 914e29210ae746ed78c240b3f037611e0e8bd149 Author: Brady Wetherington Date: Wed Jun 26 18:53:01 2024 +0100 Initial rough stab at re-implementing stalebot commit 8d1cc22c5818baa8673e24cb402090acfbb73a10 Author: Marcus Moore Date: Thu Jul 18 12:00:01 2024 -0700 Turn on legacy binding since other components still use it commit 7685de45f255979cbf1799dd8c6936a2c874419c Author: Marcus Moore Date: Wed Jul 17 17:12:14 2024 -0700 Turn off legacy binding commit 199e68ff2929e4f13d6fdd35ec71751b71cf82e5 Author: Marcus Moore Date: Wed Jul 17 17:10:12 2024 -0700 Simplify computed propery commit 81bffccf0144dce331cabe57b7c5993fba13a6b2 Author: Marcus Moore Date: Wed Jul 17 16:28:26 2024 -0700 Use better error message commit cfca1514c00e7ce1eab506b110f93f59a1b2eaf8 Author: Marcus Moore Date: Wed Jul 17 16:22:44 2024 -0700 Swap file_id for activeFileId commit b4ed01243bbac083ddd66d912207bd865098c30a Author: Marcus Moore Date: Wed Jul 17 13:40:41 2024 -0700 Add more details commit 3772a21a517c9805929f66e38122cbe7bf6f06f8 Author: Marcus Moore Date: Wed Jul 17 13:37:24 2024 -0700 Move comment up commit 04b6cb763f1cad48da45e4b2c2a491e95430728e Author: Marcus Moore Date: Wed Jul 17 10:58:48 2024 -0700 Add todo commit dd32341502c94f5dbcac64196a4e3acdc7e95462 Author: Marcus Moore Date: Tue Jul 16 17:21:18 2024 -0700 Display message if attempting to delete non-existent file commit f58e3114a23435331536000d04ee3090ad4fb9f4 Author: Marcus Moore Date: Tue Jul 16 17:17:45 2024 -0700 Simplify destroy method and update list commit eba494ad8c5a9441fdf348507f8332ba1efa4142 Author: Marcus Moore Date: Tue Jul 16 17:03:42 2024 -0700 Make $activeFile a computed property commit 7e89b58746d5e18863fb2097fd6727aabaeeb04c Author: Marcus Moore Date: Tue Jul 16 16:08:42 2024 -0700 Move files to computed property commit b7744105a09e87a673f50eff32c1a7516d91c5ec Author: Marcus Moore Date: Tue Jul 16 14:20:41 2024 -0700 Migrate import type to component commit 69263f0e5b2d5e600e4368a766104691a6e65e3f Author: Marcus Moore Date: Tue Jul 16 13:30:29 2024 -0700 Migrate header row to component commit 017530ba4ba45f96d77cb27dd85e724b0d3783e7 Author: Marcus Moore Date: Tue Jul 16 12:02:50 2024 -0700 Make updating hook more specific commit c8dad528a8d5244cf01111523dfcadd58eb5ada1 Author: Marcus Moore Date: Mon Jul 15 16:15:58 2024 -0700 Migrate a couple items out of mount commit 256e989ba113650fbe5624bc00735e9329a2795d Author: Marcus Moore Date: Mon Jul 15 15:49:18 2024 -0700 Add test for importer commit 9793016603cb35524e3e421edf0fe4044e6a42e3 Author: Marcus Moore Date: Thu Jul 11 13:32:16 2024 -0700 Remove unneeded AuthorizesRequests commit 9e06f2d17fdcdb709a9feada88f2ab7088459f08 Author: Marcus Moore Date: Thu Jul 11 13:22:10 2024 -0700 Remove commented code commit d4d19569eeecb16e9064e47f47ca503afba469a5 Author: Godfrey M Date: Thu Jul 11 10:52:47 2024 -0700 adds execution timer commit 43c7504f899d560e70d033fc8a2ac9823e1fabde Author: Godfrey M Date: Thu Jul 11 10:03:51 2024 -0700 adds an all option, adds help context for all, seperates logic commit 1fa6a763bcfd2c543f58073fdfe40eca927ad636 Author: Godfrey M Date: Wed Jul 10 11:09:57 2024 -0700 updated description commit 726308bfd58a1ba4a99174fcd47c052b6404821f Author: Godfrey M Date: Wed Jul 10 10:58:45 2024 -0700 removed typo commit 22ddb695f2cfe9306b75d7d53eb201cb4a64595b Author: Godfrey M Date: Wed Jul 10 10:57:47 2024 -0700 better description commit 09b2feac5401694cdb8a4f306a7418895bd4ec37 Author: Godfrey M Date: Wed Jul 10 10:56:44 2024 -0700 updates assets with selected model to inherit asset model eol commit 57e1df86c8041b0efe6dbbfbcc5c92195dd15fb5 Author: Godfrey M Date: Wed Jul 10 10:21:24 2024 -0700 finds model and collects assets with such model commit 3ea5d4ee4067b236af345416666faa8c6e976669 Author: Robert-Azelis <82208283+Robert-Azelis@users.noreply.github.com> Date: Thu May 2 12:55:17 2024 +0200 Update BulkAssetsController.php Fix for bulk updarte of purchase date to calculate new EOL commit 5fa0c87ab0554e7c6455d7cd4922ae82cd6657f1 Author: Godfrey M Date: Tue Apr 30 12:02:11 2024 -0700 null debugbar commit 75aa01791a2fe64da98f29a942923ab028a92586 Author: Godfrey M Date: Tue Apr 30 11:54:33 2024 -0700 adds location select to the create new user vice asset checkout commit 697595d96377ac41bf1525d363f093621ff50102 Merge: 0bdd8a591 9502525a4 Author: akemidx <116301219+akemidx@users.noreply.github.com> Date: Tue Nov 21 16:07:26 2023 -0500 Merge branch 'develop' into eol_date_range_for_reports commit 0bdd8a59175a846c70ac122dd4b2124d67cbd6b8 Author: akemidx Date: Wed Aug 2 16:40:38 2023 -0400 fixing key names commit e35dd2daa16c61c01bd666411ad93ea5503de601 Author: akemidx Date: Wed Jul 26 17:45:18 2023 -0400 asset_eol_date stuff commit f71b69a739c8437c4ef2c6065ba80f8e08102d29 Author: akemidx Date: Wed Jul 26 17:31:06 2023 -0400 adding eol fields commit 499a3debcdd1e996ac05fa8dc28d2e39e2bdcb2a Author: akemidx Date: Tue Jul 11 14:08:55 2023 -0400 this WILL break. i'm back to site not found which is something missing. otherwise the columns are either blank or another value like expected checkin i was using to test a bit Signed-off-by: snipe --- .all-contributorsrc | 27 + .env.dev.docker | 2 + .env.docker | 2 +- .env.example | 2 + .github/stale.yml | 43 - .github/workflows/stale.yml | 40 + .github/workflows/tests-mysql.yml | 2 +- .github/workflows/tests-postgres.yml | 2 +- .github/workflows/tests-sqlite.yml | 2 +- .gitignore | 1 + CONTRIBUTORS.md | 2 +- Dockerfile.alpine | 8 +- Dockerfile.fpm-alpine | 6 +- README.md | 6 +- app/Console/Commands/LdapSync.php | 276 +-- app/Console/Commands/ObjectImportCommand.php | 49 +- app/Console/Commands/RemoveExplicitEols.php | 60 + .../Commands/SendAcceptanceReminder.php | 3 +- app/Helpers/Helper.php | 60 +- app/Helpers/IconHelper.php | 190 +++ app/Helpers/StorageHelper.php | 61 + .../Accessories/AccessoriesController.php | 2 +- .../AccessoriesFilesController.php | 45 +- .../AccessoryCheckoutController.php | 2 +- .../Account/AcceptanceController.php | 7 +- app/Http/Controllers/ActionlogController.php | 12 +- .../Controllers/Api/AccessoriesController.php | 26 +- .../Api/AssetMaintenancesController.php | 19 +- .../Api/AssetModelFilesController.php | 200 +++ .../Controllers/Api/AssetModelsController.php | 8 +- app/Http/Controllers/Api/AssetsController.php | 57 +- .../Controllers/Api/CategoriesController.php | 33 +- .../Controllers/Api/CompaniesController.php | 22 +- .../Controllers/Api/ComponentsController.php | 19 +- .../Controllers/Api/ConsumablesController.php | 26 +- .../Controllers/Api/DepartmentsController.php | 2 +- .../Api/DepreciationsController.php | 32 +- app/Http/Controllers/Api/GroupsController.php | 27 +- .../Api/LicenseSeatsController.php | 2 +- .../Controllers/Api/LicensesController.php | 11 +- .../Api/ManufacturersController.php | 56 +- .../Api/PredefinedKitsController.php | 24 +- .../Controllers/Api/ReportsController.php | 26 +- .../Api/StatuslabelsController.php | 29 +- app/Http/Controllers/Api/UsersController.php | 40 +- .../AssetMaintenancesController.php | 2 +- .../Controllers/AssetModelsController.php | 23 +- .../Assets/AssetFilesController.php | 49 +- .../Controllers/Assets/AssetsController.php | 76 +- .../Assets/BulkAssetsController.php | 60 +- app/Http/Controllers/Auth/LoginController.php | 4 +- app/Http/Controllers/CategoriesController.php | 2 +- app/Http/Controllers/CompaniesController.php | 1 + .../ComponentCheckoutController.php | 2 +- .../Components/ComponentsController.php | 6 +- .../Components/ComponentsFilesController.php | 35 +- .../ConsumableCheckoutController.php | 8 +- .../Consumables/ConsumablesController.php | 4 +- .../ConsumablesFilesController.php | 37 +- .../Controllers/CustomFieldsController.php | 4 +- .../Controllers/CustomFieldsetsController.php | 2 +- app/Http/Controllers/DashboardController.php | 3 + .../Controllers/DepartmentsController.php | 2 +- .../Controllers/DepreciationsController.php | 19 +- app/Http/Controllers/HealthController.php | 29 +- .../Kits/PredefinedKitsController.php | 1 + .../Licenses/LicenseCheckoutController.php | 2 +- .../Licenses/LicenseFilesController.php | 38 +- .../Licenses/LicensesController.php | 2 +- app/Http/Controllers/LocationsController.php | 46 +- .../Controllers/ManufacturersController.php | 4 +- app/Http/Controllers/ProfileController.php | 19 +- app/Http/Controllers/ReportsController.php | 6 +- app/Http/Controllers/SettingsController.php | 80 +- .../Controllers/StatuslabelsController.php | 2 +- app/Http/Controllers/SuppliersController.php | 2 +- .../Controllers/Users/BulkUsersController.php | 64 +- .../Controllers/Users/UserFilesController.php | 30 +- .../Controllers/Users/UsersController.php | 162 +- app/Http/Controllers/ViewAssetsController.php | 14 +- app/Http/Kernel.php | 7 + app/Http/Middleware/CheckForSetup.php | 13 +- app/Http/Requests/ItemImportRequest.php | 2 +- app/Http/Requests/SaveUserRequest.php | 4 + app/Http/Requests/StoreAssetRequest.php | 5 +- app/Http/Requests/StoreLabelSettings.php | 41 + app/Http/Requests/StoreLdapSettings.php | 38 + .../Requests/StoreLocalizationSettings.php | 30 + .../Requests/StoreNotificationSettings.php | 37 + app/Http/Requests/StoreSecuritySettings.php | 35 + .../Traits/MayContainCustomFields.php | 2 +- app/Http/Requests/UpdateAssetRequest.php | 7 + .../Transformers/AccessoriesTransformer.php | 9 +- .../Transformers/ActionlogsTransformer.php | 21 +- .../AssetMaintenancesTransformer.php | 9 +- app/Http/Transformers/AssetsTransformer.php | 4 + .../Transformers/CategoriesTransformer.php | 4 + .../Transformers/CompaniesTransformer.php | 8 +- .../Transformers/ComponentsTransformer.php | 6 + .../Transformers/ConsumablesTransformer.php | 4 + .../DepreciationReportTransformer.php | 11 +- .../Transformers/DepreciationsTransformer.php | 7 + app/Http/Transformers/GroupsTransformer.php | 5 +- app/Http/Transformers/LicensesTransformer.php | 2 +- .../Transformers/ManufacturersTransformer.php | 5 + .../PredefinedKitsTransformer.php | 7 + .../Transformers/StatuslabelsTransformer.php | 4 + app/Importer/AssetImporter.php | 4 +- app/Importer/ComponentImporter.php | 2 +- app/Importer/Importer.php | 44 +- app/Importer/ItemImporter.php | 10 +- app/Importer/LicenseImporter.php | 4 +- app/Importer/LocationImporter.php | 2 +- app/Importer/UserImporter.php | 2 +- app/Listeners/CheckoutableListener.php | 205 ++- app/Listeners/LogListener.php | 4 +- .../CustomFieldSetDefaultValuesForModel.php | 104 +- app/Livewire/Importer.php | 118 +- app/Livewire/OauthClients.php | 12 +- app/Livewire/SlackSettingsForm.php | 55 +- app/Mail/CheckinAccessoryMail.php | 70 + app/Mail/CheckinAssetMail.php | 93 + app/Mail/CheckinLicenseMail.php | 71 + app/Mail/CheckoutAccessoryMail.php | 82 + app/Mail/CheckoutAssetMail.php | 110 ++ app/Mail/CheckoutConsumableMail.php | 84 + app/Mail/CheckoutLicenseMail.php | 80 + app/Models/Accessory.php | 24 +- app/Models/AccessoryCheckout.php | 2 +- app/Models/Actionlog.php | 24 +- app/Models/Asset.php | 65 +- app/Models/AssetMaintenance.php | 26 +- app/Models/AssetModel.php | 21 +- app/Models/Category.php | 18 +- app/Models/CheckoutRequest.php | 2 +- app/Models/Company.php | 31 +- app/Models/CompanyableTrait.php | 3 - app/Models/Component.php | 55 +- app/Models/Consumable.php | 27 +- app/Models/ConsumableAssignment.php | 4 +- app/Models/Department.php | 2 +- app/Models/Depreciation.php | 36 + app/Models/Group.php | 14 +- app/Models/Import.php | 3 + app/Models/Ldap.php | 7 +- app/Models/License.php | 26 +- app/Models/Location.php | 4 +- app/Models/Loggable.php | 50 +- app/Models/Manufacturer.php | 28 +- app/Models/PredefinedKit.php | 14 + app/Models/Recipients/AdminRecipient.php | 6 + app/Models/Requestable.php | 6 +- app/Models/Setting.php | 29 - app/Models/SnipeModel.php | 5 + app/Models/Statuslabel.php | 10 + app/Models/User.php | 1 + .../CheckinAccessoryNotification.php | 70 +- .../CheckinAssetNotification.php | 77 +- .../CheckinLicenseSeatNotification.php | 65 +- .../CheckoutAccessoryNotification.php | 14 + .../CheckoutAssetNotification.php | 127 +- .../CheckoutConsumableNotification.php | 94 +- .../CheckoutLicenseSeatNotification.php | 91 +- app/Observers/AccessoryObserver.php | 6 +- app/Observers/AssetObserver.php | 8 +- app/Observers/ComponentObserver.php | 6 +- app/Observers/ConsumableObserver.php | 6 +- app/Observers/LicenseObserver.php | 6 +- app/Observers/UserObserver.php | 8 +- app/Presenters/AccessoryPresenter.php | 23 + app/Presenters/ActionlogPresenter.php | 28 +- app/Presenters/AssetMaintenancesPresenter.php | 23 +- app/Presenters/AssetModelPresenter.php | 16 +- app/Presenters/AssetPresenter.php | 18 +- app/Presenters/CategoryPresenter.php | 13 +- app/Presenters/CompanyPresenter.php | 41 +- app/Presenters/ComponentPresenter.php | 37 +- app/Presenters/ConsumablePresenter.php | 25 +- app/Presenters/DepreciationPresenter.php | 42 + .../DepreciationReportPresenter.php | 4 +- app/Presenters/LicensePresenter.php | 2 +- app/Presenters/LocationPresenter.php | 2 +- app/Presenters/ManufacturerPresenter.php | 46 +- app/Presenters/PredefinedKitPresenter.php | 23 + app/Presenters/StatusLabelPresenter.php | 115 ++ app/Presenters/UserPresenter.php | 18 +- app/Providers/ValidationServiceProvider.php | 3 +- ...annotBeCheckedOutToNondeployableStatus.php | 51 + ...erCannotSwitchCompaniesIfItemsAssigned.php | 29 + app/Services/PredefinedKitCheckoutService.php | 2 +- composer.json | 8 +- composer.lock | 1520 ++++++++--------- config/app.php | 5 +- config/backup.php | 2 + config/version.php | 10 +- database/factories/AccessoryFactory.php | 22 +- database/factories/ActionlogFactory.php | 4 +- database/factories/AssetFactory.php | 2 +- database/factories/AssetModelFactory.php | 2 +- database/factories/CategoryFactory.php | 2 +- database/factories/CompanyFactory.php | 1 + database/factories/ComponentFactory.php | 21 +- database/factories/ConsumableFactory.php | 6 +- database/factories/DepartmentFactory.php | 2 +- database/factories/DepreciationFactory.php | 2 +- database/factories/ImportFactory.php | 146 ++ database/factories/LicenseFactory.php | 2 +- database/factories/ManufacturerFactory.php | 2 +- database/factories/PredefinedKitFactory.php | 23 + database/factories/StatuslabelFactory.php | 2 +- database/factories/UserFactory.php | 74 + ...17_204302_change_user_id_to_created_by.php | 93 + ...acturer_id_model_number_to_consumables.php | 30 + ...d_manager_indexes_to_location_and_user.php | 34 + ...manager_indexes_on_users_and_locations.php | 39 + database/seeders/AccessorySeeder.php | 8 +- database/seeders/ActionlogSeeder.php | 6 +- database/seeders/AssetModelSeeder.php | 36 +- database/seeders/AssetSeeder.php | 4 +- database/seeders/CategorySeeder.php | 30 +- database/seeders/ConsumableSeeder.php | 6 +- database/seeders/DepartmentSeeder.php | 12 +- database/seeders/DepreciationSeeder.php | 6 +- database/seeders/LicenseSeeder.php | 8 +- database/seeders/ManufacturerSeeder.php | 22 +- database/seeders/StatuslabelSeeder.php | 14 +- dev.docker-compose.yml | 46 +- docker-compose.yml | 13 +- ...entrypoint_alpine.sh => startup_alpine.sh} | 0 ...er-entrypoint.sh => startup_alpine_fpm.sh} | 0 package-lock.json | 125 +- package.json | 8 +- public/css/build/app.css | Bin 26967 -> 28319 bytes public/css/build/overrides.css | Bin 20117 -> 21447 bytes public/css/dist/all.css | Bin 512228 -> 516833 bytes public/css/dist/bootstrap-table.css | Bin 10837 -> 12904 bytes public/js/build/app.js | Bin 1008666 -> 1007743 bytes public/js/build/app.js.LICENSE.txt | Bin 1160 -> 1160 bytes public/js/build/vendor.js | Bin 1768352 -> 1757666 bytes public/js/dist/all.js | Bin 2777019 -> 2765410 bytes public/js/dist/bootstrap-table-en-US.min.js | Bin 2727 -> 19018 bytes .../js/dist/bootstrap-table-locale-all.min.js | Bin 124281 -> 146094 bytes public/js/dist/bootstrap-table.js | Bin 1189522 -> 2105599 bytes public/mix-manifest.json | 20 +- public/sounds/lock.mp3 | Bin 0 -> 22080 bytes public/vendor/livewire/livewire.esm.js | 320 +++- public/vendor/livewire/livewire.esm.js.map | 7 + public/vendor/livewire/livewire.js | 290 +++- public/vendor/livewire/livewire.min.js | 12 +- public/vendor/livewire/livewire.min.js.map | 6 +- public/vendor/livewire/manifest.json | 2 +- resources/assets/js/snipeit.js | 99 +- resources/assets/less/app.less | 2 +- resources/assets/less/overrides.less | 76 +- resources/lang/aa-ER/admin/hardware/form.php | 1 + .../lang/aa-ER/admin/hardware/message.php | 8 + resources/lang/aa-ER/admin/hardware/table.php | 1 - resources/lang/aa-ER/admin/kits/general.php | 1 + .../lang/aa-ER/admin/locations/message.php | 8 +- resources/lang/aa-ER/admin/models/message.php | 2 +- .../lang/aa-ER/admin/settings/general.php | 5 + .../lang/aa-ER/admin/settings/message.php | 2 +- resources/lang/aa-ER/admin/users/message.php | 3 +- resources/lang/aa-ER/general.php | 20 +- resources/lang/aa-ER/localizations.php | 9 +- resources/lang/aa-ER/mail.php | 22 +- resources/lang/aa-ER/validation.php | 10 +- resources/lang/af-ZA/admin/hardware/form.php | 1 + .../lang/af-ZA/admin/hardware/message.php | 8 + resources/lang/af-ZA/admin/hardware/table.php | 1 - resources/lang/af-ZA/admin/kits/general.php | 1 + .../lang/af-ZA/admin/locations/message.php | 8 +- resources/lang/af-ZA/admin/models/message.php | 2 +- .../lang/af-ZA/admin/settings/general.php | 5 + .../lang/af-ZA/admin/settings/message.php | 2 +- resources/lang/af-ZA/admin/users/message.php | 3 +- resources/lang/af-ZA/general.php | 20 +- resources/lang/af-ZA/localizations.php | 9 +- resources/lang/af-ZA/mail.php | 22 +- resources/lang/af-ZA/validation.php | 10 +- resources/lang/am-ET/admin/hardware/form.php | 1 + .../lang/am-ET/admin/hardware/message.php | 8 + resources/lang/am-ET/admin/hardware/table.php | 1 - resources/lang/am-ET/admin/kits/general.php | 1 + .../lang/am-ET/admin/locations/message.php | 8 +- resources/lang/am-ET/admin/models/message.php | 2 +- .../lang/am-ET/admin/settings/general.php | 5 + .../lang/am-ET/admin/settings/message.php | 2 +- resources/lang/am-ET/admin/users/message.php | 3 +- resources/lang/am-ET/general.php | 20 +- resources/lang/am-ET/localizations.php | 9 +- resources/lang/am-ET/mail.php | 22 +- resources/lang/am-ET/validation.php | 10 +- resources/lang/ar-SA/admin/hardware/form.php | 1 + .../lang/ar-SA/admin/hardware/message.php | 8 + resources/lang/ar-SA/admin/hardware/table.php | 1 - resources/lang/ar-SA/admin/kits/general.php | 1 + .../lang/ar-SA/admin/locations/message.php | 8 +- resources/lang/ar-SA/admin/models/message.php | 2 +- .../lang/ar-SA/admin/settings/general.php | 5 + .../lang/ar-SA/admin/settings/message.php | 2 +- resources/lang/ar-SA/admin/users/message.php | 3 +- resources/lang/ar-SA/general.php | 20 +- resources/lang/ar-SA/localizations.php | 9 +- resources/lang/ar-SA/mail.php | 22 +- resources/lang/ar-SA/validation.php | 10 +- resources/lang/bg-BG/admin/hardware/form.php | 1 + .../lang/bg-BG/admin/hardware/message.php | 8 + resources/lang/bg-BG/admin/hardware/table.php | 1 - resources/lang/bg-BG/admin/kits/general.php | 1 + .../lang/bg-BG/admin/locations/message.php | 8 +- resources/lang/bg-BG/admin/models/message.php | 2 +- .../lang/bg-BG/admin/settings/general.php | 5 + .../lang/bg-BG/admin/settings/message.php | 2 +- resources/lang/bg-BG/admin/users/message.php | 3 +- resources/lang/bg-BG/general.php | 20 +- resources/lang/bg-BG/localizations.php | 9 +- resources/lang/bg-BG/mail.php | 20 +- resources/lang/bg-BG/validation.php | 10 +- resources/lang/ca-ES/admin/hardware/form.php | 1 + .../lang/ca-ES/admin/hardware/message.php | 8 + resources/lang/ca-ES/admin/hardware/table.php | 1 - resources/lang/ca-ES/admin/kits/general.php | 1 + .../lang/ca-ES/admin/locations/message.php | 8 +- resources/lang/ca-ES/admin/models/message.php | 2 +- .../lang/ca-ES/admin/settings/general.php | 5 + .../lang/ca-ES/admin/settings/message.php | 2 +- resources/lang/ca-ES/admin/users/message.php | 3 +- resources/lang/ca-ES/general.php | 20 +- resources/lang/ca-ES/localizations.php | 9 +- resources/lang/ca-ES/mail.php | 22 +- resources/lang/ca-ES/validation.php | 10 +- resources/lang/chr-US/admin/hardware/form.php | 1 + .../lang/chr-US/admin/hardware/message.php | 8 + .../lang/chr-US/admin/hardware/table.php | 1 - resources/lang/chr-US/admin/kits/general.php | 1 + .../lang/chr-US/admin/locations/message.php | 8 +- .../lang/chr-US/admin/models/message.php | 2 +- .../lang/chr-US/admin/settings/general.php | 5 + .../lang/chr-US/admin/settings/message.php | 2 +- resources/lang/chr-US/admin/users/message.php | 3 +- resources/lang/chr-US/general.php | 20 +- resources/lang/chr-US/localizations.php | 9 +- resources/lang/chr-US/mail.php | 22 +- resources/lang/chr-US/validation.php | 10 +- resources/lang/cs-CZ/account/general.php | 16 +- resources/lang/cs-CZ/admin/hardware/form.php | 1 + .../lang/cs-CZ/admin/hardware/message.php | 8 + resources/lang/cs-CZ/admin/hardware/table.php | 1 - resources/lang/cs-CZ/admin/kits/general.php | 1 + .../lang/cs-CZ/admin/locations/message.php | 8 +- resources/lang/cs-CZ/admin/models/message.php | 2 +- .../lang/cs-CZ/admin/settings/general.php | 5 + .../lang/cs-CZ/admin/settings/message.php | 2 +- resources/lang/cs-CZ/admin/users/message.php | 3 +- resources/lang/cs-CZ/general.php | 20 +- resources/lang/cs-CZ/localizations.php | 9 +- resources/lang/cs-CZ/mail.php | 22 +- resources/lang/cs-CZ/validation.php | 32 +- resources/lang/cy-GB/admin/hardware/form.php | 1 + .../lang/cy-GB/admin/hardware/message.php | 8 + resources/lang/cy-GB/admin/hardware/table.php | 1 - resources/lang/cy-GB/admin/kits/general.php | 1 + .../lang/cy-GB/admin/locations/message.php | 8 +- resources/lang/cy-GB/admin/models/message.php | 2 +- .../lang/cy-GB/admin/settings/general.php | 5 + .../lang/cy-GB/admin/settings/message.php | 2 +- resources/lang/cy-GB/admin/users/message.php | 3 +- resources/lang/cy-GB/general.php | 20 +- resources/lang/cy-GB/localizations.php | 9 +- resources/lang/cy-GB/mail.php | 22 +- resources/lang/cy-GB/validation.php | 10 +- resources/lang/da-DK/admin/hardware/form.php | 1 + .../lang/da-DK/admin/hardware/message.php | 8 + resources/lang/da-DK/admin/hardware/table.php | 1 - resources/lang/da-DK/admin/kits/general.php | 1 + .../lang/da-DK/admin/locations/message.php | 8 +- resources/lang/da-DK/admin/models/message.php | 2 +- .../lang/da-DK/admin/settings/general.php | 5 + .../lang/da-DK/admin/settings/message.php | 2 +- resources/lang/da-DK/admin/users/message.php | 3 +- resources/lang/da-DK/general.php | 20 +- resources/lang/da-DK/localizations.php | 9 +- resources/lang/da-DK/mail.php | 22 +- resources/lang/da-DK/validation.php | 10 +- resources/lang/de-DE/account/general.php | 2 +- resources/lang/de-DE/admin/hardware/form.php | 1 + .../lang/de-DE/admin/hardware/message.php | 8 + resources/lang/de-DE/admin/hardware/table.php | 1 - resources/lang/de-DE/admin/kits/general.php | 1 + resources/lang/de-DE/admin/labels/table.php | 4 +- .../lang/de-DE/admin/locations/message.php | 8 +- .../lang/de-DE/admin/settings/general.php | 5 + resources/lang/de-DE/admin/users/message.php | 3 +- resources/lang/de-DE/general.php | 20 +- resources/lang/de-DE/localizations.php | 9 +- resources/lang/de-DE/mail.php | 24 +- resources/lang/de-DE/validation.php | 10 +- resources/lang/de-if/account/general.php | 2 +- .../lang/de-if/admin/accessories/general.php | 2 +- .../lang/de-if/admin/accessories/message.php | 2 +- .../lang/de-if/admin/categories/general.php | 2 +- .../lang/de-if/admin/categories/message.php | 2 +- .../lang/de-if/admin/companies/message.php | 2 +- .../lang/de-if/admin/components/message.php | 2 +- .../lang/de-if/admin/consumables/message.php | 2 +- .../de-if/admin/custom_fields/general.php | 2 +- .../de-if/admin/custom_fields/message.php | 4 +- .../lang/de-if/admin/departments/message.php | 2 +- .../de-if/admin/depreciations/message.php | 2 +- resources/lang/de-if/admin/groups/message.php | 2 +- resources/lang/de-if/admin/hardware/form.php | 3 +- .../lang/de-if/admin/hardware/general.php | 4 +- .../lang/de-if/admin/hardware/message.php | 12 +- resources/lang/de-if/admin/hardware/table.php | 1 - resources/lang/de-if/admin/kits/general.php | 3 +- .../lang/de-if/admin/licenses/message.php | 10 +- .../lang/de-if/admin/locations/message.php | 10 +- .../de-if/admin/manufacturers/message.php | 2 +- .../lang/de-if/admin/manufacturers/table.php | 2 +- resources/lang/de-if/admin/models/message.php | 4 +- .../lang/de-if/admin/settings/general.php | 41 +- .../lang/de-if/admin/settings/message.php | 6 +- .../lang/de-if/admin/statuslabels/message.php | 2 +- .../lang/de-if/admin/suppliers/message.php | 2 +- resources/lang/de-if/admin/users/general.php | 10 +- resources/lang/de-if/admin/users/message.php | 7 +- resources/lang/de-if/admin/users/table.php | 2 +- resources/lang/de-if/auth/general.php | 2 +- resources/lang/de-if/auth/message.php | 6 +- resources/lang/de-if/general.php | 46 +- resources/lang/de-if/help.php | 4 +- resources/lang/de-if/localizations.php | 9 +- resources/lang/de-if/mail.php | 28 +- resources/lang/de-if/validation.php | 10 +- resources/lang/el-GR/admin/hardware/form.php | 1 + .../lang/el-GR/admin/hardware/message.php | 8 + resources/lang/el-GR/admin/hardware/table.php | 1 - resources/lang/el-GR/admin/kits/general.php | 1 + .../lang/el-GR/admin/locations/message.php | 8 +- resources/lang/el-GR/admin/models/message.php | 2 +- .../lang/el-GR/admin/settings/general.php | 5 + .../lang/el-GR/admin/settings/message.php | 2 +- resources/lang/el-GR/admin/users/message.php | 3 +- resources/lang/el-GR/general.php | 22 +- resources/lang/el-GR/localizations.php | 9 +- resources/lang/el-GR/mail.php | 22 +- resources/lang/el-GR/validation.php | 10 +- resources/lang/en-GB/admin/hardware/form.php | 1 + .../lang/en-GB/admin/hardware/message.php | 8 + resources/lang/en-GB/admin/hardware/table.php | 1 - resources/lang/en-GB/admin/kits/general.php | 1 + .../lang/en-GB/admin/locations/message.php | 8 +- resources/lang/en-GB/admin/models/message.php | 2 +- .../lang/en-GB/admin/settings/general.php | 5 + resources/lang/en-GB/admin/users/message.php | 3 +- resources/lang/en-GB/general.php | 12 +- resources/lang/en-GB/localizations.php | 9 +- resources/lang/en-GB/mail.php | 22 +- resources/lang/en-GB/validation.php | 10 +- resources/lang/en-ID/admin/hardware/form.php | 1 + .../lang/en-ID/admin/hardware/message.php | 8 + resources/lang/en-ID/admin/hardware/table.php | 1 - resources/lang/en-ID/admin/kits/general.php | 1 + .../lang/en-ID/admin/locations/message.php | 8 +- .../lang/en-ID/admin/settings/general.php | 5 + resources/lang/en-ID/admin/users/message.php | 3 +- resources/lang/en-ID/general.php | 12 +- resources/lang/en-ID/localizations.php | 9 +- resources/lang/en-ID/mail.php | 22 +- resources/lang/en-ID/validation.php | 10 +- .../lang/en-US/admin/accessories/table.php | 2 - resources/lang/en-US/admin/hardware/form.php | 4 +- .../lang/en-US/admin/hardware/message.php | 8 + resources/lang/en-US/admin/hardware/table.php | 1 - .../lang/en-US/admin/locations/message.php | 8 +- .../lang/en-US/admin/settings/general.php | 3 + resources/lang/en-US/admin/users/message.php | 3 +- resources/lang/en-US/general.php | 9 +- resources/lang/en-US/localizations.php | 9 +- resources/lang/en-US/mail.php | 23 +- resources/lang/en-US/validation.php | 10 +- resources/lang/es-CO/account/general.php | 6 +- .../lang/es-CO/admin/accessories/general.php | 10 +- .../lang/es-CO/admin/accessories/message.php | 2 +- .../lang/es-CO/admin/accessories/table.php | 2 +- .../es-CO/admin/asset_maintenances/form.php | 8 +- .../admin/asset_maintenances/general.php | 10 +- .../admin/asset_maintenances/message.php | 6 +- .../es-CO/admin/asset_maintenances/table.php | 2 +- .../lang/es-CO/admin/companies/message.php | 14 +- .../lang/es-CO/admin/companies/table.php | 6 +- .../lang/es-CO/admin/components/general.php | 10 +- .../lang/es-CO/admin/components/message.php | 4 +- .../lang/es-CO/admin/components/table.php | 2 +- .../lang/es-CO/admin/consumables/general.php | 8 +- .../lang/es-CO/admin/consumables/message.php | 4 +- .../lang/es-CO/admin/consumables/table.php | 2 +- .../es-CO/admin/custom_fields/general.php | 38 +- .../es-CO/admin/custom_fields/message.php | 14 +- .../lang/es-CO/admin/departments/message.php | 4 +- .../lang/es-CO/admin/departments/table.php | 4 +- .../es-CO/admin/depreciations/general.php | 4 +- .../lang/es-CO/admin/depreciations/table.php | 2 +- resources/lang/es-CO/admin/groups/message.php | 4 +- resources/lang/es-CO/admin/groups/titles.php | 10 +- resources/lang/es-CO/admin/hardware/form.php | 5 +- .../lang/es-CO/admin/hardware/general.php | 6 +- .../lang/es-CO/admin/hardware/message.php | 28 +- resources/lang/es-CO/admin/hardware/table.php | 3 +- resources/lang/es-CO/admin/kits/general.php | 19 +- resources/lang/es-CO/admin/labels/message.php | 6 +- resources/lang/es-CO/admin/labels/table.php | 2 +- resources/lang/es-CO/admin/licenses/form.php | 6 +- .../lang/es-CO/admin/licenses/general.php | 8 +- .../lang/es-CO/admin/licenses/message.php | 6 +- .../lang/es-CO/admin/locations/message.php | 8 +- .../es-CO/admin/manufacturers/message.php | 10 +- .../lang/es-CO/admin/manufacturers/table.php | 2 +- resources/lang/es-CO/admin/models/general.php | 8 +- resources/lang/es-CO/admin/models/message.php | 6 +- resources/lang/es-CO/admin/models/table.php | 4 +- .../lang/es-CO/admin/reports/general.php | 8 +- .../lang/es-CO/admin/settings/general.php | 157 +- .../lang/es-CO/admin/settings/message.php | 10 +- .../lang/es-CO/admin/statuslabels/table.php | 4 +- .../lang/es-CO/admin/suppliers/table.php | 6 +- resources/lang/es-CO/admin/users/general.php | 8 +- resources/lang/es-CO/admin/users/message.php | 15 +- resources/lang/es-CO/admin/users/table.php | 4 +- resources/lang/es-CO/auth/general.php | 4 +- resources/lang/es-CO/auth/message.php | 6 +- resources/lang/es-CO/button.php | 6 +- resources/lang/es-CO/general.php | 178 +- resources/lang/es-CO/help.php | 6 +- resources/lang/es-CO/localizations.php | 19 +- resources/lang/es-CO/mail.php | 34 +- resources/lang/es-CO/validation.php | 38 +- resources/lang/es-ES/account/general.php | 6 +- .../lang/es-ES/admin/accessories/general.php | 10 +- .../lang/es-ES/admin/accessories/table.php | 2 +- .../es-ES/admin/asset_maintenances/form.php | 10 +- .../admin/asset_maintenances/general.php | 14 +- .../admin/asset_maintenances/message.php | 8 +- .../es-ES/admin/asset_maintenances/table.php | 2 +- .../lang/es-ES/admin/categories/general.php | 4 +- .../lang/es-ES/admin/companies/message.php | 10 +- .../lang/es-ES/admin/companies/table.php | 6 +- .../lang/es-ES/admin/components/general.php | 4 +- .../lang/es-ES/admin/components/message.php | 4 +- .../lang/es-ES/admin/components/table.php | 2 +- .../lang/es-ES/admin/consumables/general.php | 8 +- .../lang/es-ES/admin/consumables/message.php | 2 +- .../lang/es-ES/admin/consumables/table.php | 2 +- .../es-ES/admin/custom_fields/general.php | 30 +- .../es-ES/admin/custom_fields/message.php | 12 +- .../lang/es-ES/admin/departments/message.php | 4 +- .../lang/es-ES/admin/departments/table.php | 2 +- .../es-ES/admin/depreciations/general.php | 2 +- .../es-ES/admin/depreciations/message.php | 2 +- resources/lang/es-ES/admin/groups/message.php | 8 +- resources/lang/es-ES/admin/groups/table.php | 4 +- resources/lang/es-ES/admin/groups/titles.php | 10 +- resources/lang/es-ES/admin/hardware/form.php | 3 +- .../lang/es-ES/admin/hardware/general.php | 2 +- .../lang/es-ES/admin/hardware/message.php | 26 +- resources/lang/es-ES/admin/hardware/table.php | 3 +- resources/lang/es-ES/admin/kits/general.php | 31 +- resources/lang/es-ES/admin/labels/message.php | 4 +- resources/lang/es-ES/admin/labels/table.php | 2 +- resources/lang/es-ES/admin/licenses/form.php | 10 +- .../lang/es-ES/admin/licenses/general.php | 16 +- .../lang/es-ES/admin/licenses/message.php | 6 +- resources/lang/es-ES/admin/licenses/table.php | 6 +- .../lang/es-ES/admin/locations/message.php | 8 +- .../es-ES/admin/manufacturers/message.php | 12 +- .../lang/es-ES/admin/manufacturers/table.php | 2 +- resources/lang/es-ES/admin/models/general.php | 14 +- resources/lang/es-ES/admin/models/message.php | 12 +- resources/lang/es-ES/admin/models/table.php | 4 +- .../lang/es-ES/admin/reports/general.php | 8 +- .../lang/es-ES/admin/settings/general.php | 179 +- .../lang/es-ES/admin/settings/message.php | 12 +- .../lang/es-ES/admin/statuslabels/table.php | 2 +- .../lang/es-ES/admin/suppliers/message.php | 4 +- .../lang/es-ES/admin/suppliers/table.php | 16 +- resources/lang/es-ES/admin/users/general.php | 14 +- resources/lang/es-ES/admin/users/message.php | 9 +- resources/lang/es-ES/admin/users/table.php | 8 +- resources/lang/es-ES/auth/general.php | 8 +- resources/lang/es-ES/auth/message.php | 14 +- resources/lang/es-ES/button.php | 6 +- resources/lang/es-ES/general.php | 194 ++- resources/lang/es-ES/help.php | 6 +- resources/lang/es-ES/localizations.php | 15 +- resources/lang/es-ES/mail.php | 36 +- resources/lang/es-ES/validation.php | 38 +- resources/lang/es-MX/account/general.php | 6 +- .../lang/es-MX/admin/accessories/general.php | 10 +- .../lang/es-MX/admin/accessories/table.php | 2 +- .../es-MX/admin/asset_maintenances/form.php | 8 +- .../admin/asset_maintenances/general.php | 10 +- .../admin/asset_maintenances/message.php | 8 +- .../es-MX/admin/asset_maintenances/table.php | 2 +- .../lang/es-MX/admin/categories/general.php | 2 +- .../lang/es-MX/admin/companies/message.php | 10 +- .../lang/es-MX/admin/companies/table.php | 6 +- .../lang/es-MX/admin/components/general.php | 4 +- .../lang/es-MX/admin/components/message.php | 4 +- .../lang/es-MX/admin/components/table.php | 2 +- .../lang/es-MX/admin/consumables/general.php | 8 +- .../lang/es-MX/admin/consumables/message.php | 2 +- .../lang/es-MX/admin/consumables/table.php | 2 +- .../es-MX/admin/custom_fields/general.php | 32 +- .../es-MX/admin/custom_fields/message.php | 12 +- .../lang/es-MX/admin/departments/message.php | 4 +- .../lang/es-MX/admin/departments/table.php | 2 +- .../es-MX/admin/depreciations/general.php | 2 +- .../es-MX/admin/depreciations/message.php | 2 +- .../lang/es-MX/admin/depreciations/table.php | 3 +- resources/lang/es-MX/admin/groups/message.php | 8 +- resources/lang/es-MX/admin/groups/table.php | 4 +- resources/lang/es-MX/admin/groups/titles.php | 8 +- resources/lang/es-MX/admin/hardware/form.php | 3 +- .../lang/es-MX/admin/hardware/general.php | 4 +- .../lang/es-MX/admin/hardware/message.php | 26 +- resources/lang/es-MX/admin/hardware/table.php | 5 +- resources/lang/es-MX/admin/kits/general.php | 13 +- resources/lang/es-MX/admin/labels/message.php | 6 +- resources/lang/es-MX/admin/labels/table.php | 2 +- resources/lang/es-MX/admin/licenses/form.php | 10 +- .../lang/es-MX/admin/licenses/general.php | 16 +- .../lang/es-MX/admin/licenses/message.php | 2 +- resources/lang/es-MX/admin/licenses/table.php | 6 +- .../lang/es-MX/admin/locations/message.php | 8 +- .../lang/es-MX/admin/locations/table.php | 2 +- .../es-MX/admin/manufacturers/message.php | 12 +- .../lang/es-MX/admin/manufacturers/table.php | 2 +- resources/lang/es-MX/admin/models/general.php | 12 +- resources/lang/es-MX/admin/models/message.php | 12 +- resources/lang/es-MX/admin/models/table.php | 4 +- .../lang/es-MX/admin/reports/general.php | 8 +- .../lang/es-MX/admin/settings/general.php | 169 +- .../lang/es-MX/admin/settings/message.php | 10 +- .../lang/es-MX/admin/statuslabels/table.php | 2 +- .../lang/es-MX/admin/suppliers/message.php | 4 +- .../lang/es-MX/admin/suppliers/table.php | 16 +- resources/lang/es-MX/admin/users/general.php | 8 +- resources/lang/es-MX/admin/users/message.php | 9 +- resources/lang/es-MX/admin/users/table.php | 8 +- resources/lang/es-MX/auth.php | 2 +- resources/lang/es-MX/auth/general.php | 8 +- resources/lang/es-MX/auth/message.php | 14 +- resources/lang/es-MX/button.php | 4 +- resources/lang/es-MX/general.php | 192 ++- resources/lang/es-MX/help.php | 6 +- resources/lang/es-MX/localizations.php | 17 +- resources/lang/es-MX/mail.php | 38 +- resources/lang/es-MX/validation.php | 38 +- resources/lang/es-VE/account/general.php | 6 +- .../lang/es-VE/admin/accessories/general.php | 10 +- .../lang/es-VE/admin/accessories/message.php | 2 +- .../lang/es-VE/admin/accessories/table.php | 2 +- .../es-VE/admin/asset_maintenances/form.php | 8 +- .../admin/asset_maintenances/general.php | 6 +- .../admin/asset_maintenances/message.php | 8 +- .../es-VE/admin/asset_maintenances/table.php | 2 +- .../lang/es-VE/admin/categories/table.php | 2 +- .../lang/es-VE/admin/companies/message.php | 10 +- .../lang/es-VE/admin/companies/table.php | 8 +- .../lang/es-VE/admin/components/general.php | 10 +- .../lang/es-VE/admin/components/message.php | 4 +- .../lang/es-VE/admin/components/table.php | 2 +- .../lang/es-VE/admin/consumables/general.php | 4 +- .../lang/es-VE/admin/consumables/message.php | 4 +- .../lang/es-VE/admin/consumables/table.php | 2 +- .../es-VE/admin/custom_fields/general.php | 42 +- .../es-VE/admin/custom_fields/message.php | 18 +- .../lang/es-VE/admin/departments/message.php | 6 +- .../lang/es-VE/admin/departments/table.php | 2 +- .../es-VE/admin/depreciations/general.php | 4 +- .../lang/es-VE/admin/depreciations/table.php | 4 +- resources/lang/es-VE/admin/groups/message.php | 10 +- resources/lang/es-VE/admin/groups/table.php | 4 +- resources/lang/es-VE/admin/groups/titles.php | 10 +- resources/lang/es-VE/admin/hardware/form.php | 7 +- .../lang/es-VE/admin/hardware/general.php | 2 +- .../lang/es-VE/admin/hardware/message.php | 28 +- resources/lang/es-VE/admin/hardware/table.php | 3 +- resources/lang/es-VE/admin/kits/general.php | 27 +- resources/lang/es-VE/admin/labels/message.php | 6 +- resources/lang/es-VE/admin/labels/table.php | 2 +- resources/lang/es-VE/admin/licenses/form.php | 6 +- .../lang/es-VE/admin/licenses/general.php | 12 +- .../lang/es-VE/admin/licenses/message.php | 14 +- resources/lang/es-VE/admin/licenses/table.php | 4 +- .../lang/es-VE/admin/locations/message.php | 8 +- .../es-VE/admin/manufacturers/message.php | 10 +- .../lang/es-VE/admin/manufacturers/table.php | 2 +- resources/lang/es-VE/admin/models/general.php | 12 +- resources/lang/es-VE/admin/models/message.php | 10 +- resources/lang/es-VE/admin/models/table.php | 4 +- .../lang/es-VE/admin/reports/general.php | 8 +- .../lang/es-VE/admin/settings/general.php | 157 +- .../lang/es-VE/admin/settings/message.php | 8 +- .../lang/es-VE/admin/statuslabels/table.php | 2 +- .../lang/es-VE/admin/suppliers/message.php | 2 +- .../lang/es-VE/admin/suppliers/table.php | 14 +- resources/lang/es-VE/admin/users/general.php | 12 +- resources/lang/es-VE/admin/users/message.php | 9 +- resources/lang/es-VE/admin/users/table.php | 6 +- resources/lang/es-VE/auth/general.php | 6 +- resources/lang/es-VE/auth/message.php | 14 +- resources/lang/es-VE/button.php | 8 +- resources/lang/es-VE/general.php | 186 +- resources/lang/es-VE/help.php | 6 +- resources/lang/es-VE/localizations.php | 19 +- resources/lang/es-VE/mail.php | 42 +- resources/lang/es-VE/validation.php | 40 +- resources/lang/et-EE/admin/hardware/form.php | 1 + .../lang/et-EE/admin/hardware/message.php | 8 + resources/lang/et-EE/admin/hardware/table.php | 1 - resources/lang/et-EE/admin/kits/general.php | 1 + .../lang/et-EE/admin/locations/message.php | 8 +- resources/lang/et-EE/admin/models/message.php | 2 +- .../lang/et-EE/admin/settings/general.php | 5 + .../lang/et-EE/admin/settings/message.php | 2 +- resources/lang/et-EE/admin/users/message.php | 3 +- resources/lang/et-EE/general.php | 22 +- resources/lang/et-EE/localizations.php | 9 +- resources/lang/et-EE/mail.php | 22 +- resources/lang/et-EE/validation.php | 10 +- resources/lang/fa-IR/admin/hardware/form.php | 1 + .../lang/fa-IR/admin/hardware/message.php | 8 + resources/lang/fa-IR/admin/hardware/table.php | 2 - resources/lang/fa-IR/admin/kits/general.php | 1 + .../lang/fa-IR/admin/locations/message.php | 8 +- resources/lang/fa-IR/admin/models/message.php | 2 +- .../lang/fa-IR/admin/settings/general.php | 5 + .../lang/fa-IR/admin/settings/message.php | 2 +- resources/lang/fa-IR/admin/users/message.php | 3 +- resources/lang/fa-IR/general.php | 21 +- resources/lang/fa-IR/localizations.php | 9 +- resources/lang/fa-IR/mail.php | 21 +- resources/lang/fa-IR/validation.php | 10 +- resources/lang/fi-FI/admin/hardware/form.php | 1 + .../lang/fi-FI/admin/hardware/message.php | 8 + resources/lang/fi-FI/admin/hardware/table.php | 1 - resources/lang/fi-FI/admin/kits/general.php | 1 + .../lang/fi-FI/admin/locations/message.php | 8 +- resources/lang/fi-FI/admin/models/message.php | 2 +- .../lang/fi-FI/admin/settings/general.php | 5 + .../lang/fi-FI/admin/settings/message.php | 2 +- resources/lang/fi-FI/admin/users/message.php | 3 +- resources/lang/fi-FI/general.php | 20 +- resources/lang/fi-FI/localizations.php | 9 +- resources/lang/fi-FI/mail.php | 22 +- resources/lang/fi-FI/validation.php | 10 +- resources/lang/fil-PH/admin/hardware/form.php | 1 + .../lang/fil-PH/admin/hardware/message.php | 8 + .../lang/fil-PH/admin/hardware/table.php | 1 - resources/lang/fil-PH/admin/kits/general.php | 1 + .../lang/fil-PH/admin/locations/message.php | 8 +- .../lang/fil-PH/admin/models/message.php | 2 +- .../lang/fil-PH/admin/settings/general.php | 5 + .../lang/fil-PH/admin/settings/message.php | 2 +- resources/lang/fil-PH/admin/users/message.php | 3 +- resources/lang/fil-PH/general.php | 20 +- resources/lang/fil-PH/localizations.php | 9 +- resources/lang/fil-PH/mail.php | 22 +- resources/lang/fil-PH/validation.php | 10 +- resources/lang/fr-FR/admin/hardware/form.php | 1 + .../lang/fr-FR/admin/hardware/message.php | 8 + resources/lang/fr-FR/admin/hardware/table.php | 1 - resources/lang/fr-FR/admin/kits/general.php | 1 + .../lang/fr-FR/admin/locations/message.php | 8 +- resources/lang/fr-FR/admin/models/message.php | 2 +- .../lang/fr-FR/admin/settings/general.php | 5 + .../lang/fr-FR/admin/settings/message.php | 2 +- resources/lang/fr-FR/admin/users/message.php | 3 +- resources/lang/fr-FR/general.php | 20 +- resources/lang/fr-FR/localizations.php | 9 +- resources/lang/fr-FR/mail.php | 22 +- resources/lang/fr-FR/validation.php | 12 +- resources/lang/ga-IE/admin/hardware/form.php | 1 + .../lang/ga-IE/admin/hardware/message.php | 8 + resources/lang/ga-IE/admin/hardware/table.php | 1 - resources/lang/ga-IE/admin/kits/general.php | 1 + .../lang/ga-IE/admin/locations/message.php | 8 +- resources/lang/ga-IE/admin/models/message.php | 2 +- .../lang/ga-IE/admin/settings/general.php | 5 + .../lang/ga-IE/admin/settings/message.php | 2 +- resources/lang/ga-IE/admin/users/message.php | 3 +- resources/lang/ga-IE/general.php | 20 +- resources/lang/ga-IE/localizations.php | 9 +- resources/lang/ga-IE/mail.php | 22 +- resources/lang/ga-IE/validation.php | 10 +- resources/lang/he-IL/admin/hardware/form.php | 1 + .../lang/he-IL/admin/hardware/message.php | 8 + resources/lang/he-IL/admin/hardware/table.php | 1 - resources/lang/he-IL/admin/kits/general.php | 1 + .../lang/he-IL/admin/locations/message.php | 8 +- resources/lang/he-IL/admin/models/message.php | 2 +- .../lang/he-IL/admin/settings/general.php | 5 + .../lang/he-IL/admin/settings/message.php | 2 +- resources/lang/he-IL/admin/users/message.php | 3 +- resources/lang/he-IL/general.php | 20 +- resources/lang/he-IL/localizations.php | 9 +- resources/lang/he-IL/mail.php | 22 +- resources/lang/he-IL/validation.php | 10 +- resources/lang/hr-HR/admin/hardware/form.php | 1 + .../lang/hr-HR/admin/hardware/message.php | 8 + resources/lang/hr-HR/admin/hardware/table.php | 1 - resources/lang/hr-HR/admin/kits/general.php | 1 + .../lang/hr-HR/admin/locations/message.php | 8 +- resources/lang/hr-HR/admin/models/message.php | 2 +- .../lang/hr-HR/admin/settings/general.php | 5 + .../lang/hr-HR/admin/settings/message.php | 2 +- resources/lang/hr-HR/admin/users/message.php | 3 +- resources/lang/hr-HR/general.php | 20 +- resources/lang/hr-HR/localizations.php | 9 +- resources/lang/hr-HR/mail.php | 22 +- resources/lang/hr-HR/validation.php | 10 +- resources/lang/hu-HU/admin/hardware/form.php | 1 + .../lang/hu-HU/admin/hardware/message.php | 8 + resources/lang/hu-HU/admin/hardware/table.php | 1 - resources/lang/hu-HU/admin/kits/general.php | 1 + .../lang/hu-HU/admin/locations/message.php | 8 +- resources/lang/hu-HU/admin/models/message.php | 2 +- .../lang/hu-HU/admin/settings/general.php | 5 + .../lang/hu-HU/admin/settings/message.php | 2 +- resources/lang/hu-HU/admin/users/message.php | 3 +- resources/lang/hu-HU/general.php | 20 +- resources/lang/hu-HU/localizations.php | 9 +- resources/lang/hu-HU/mail.php | 22 +- resources/lang/hu-HU/validation.php | 10 +- resources/lang/id-ID/admin/hardware/form.php | 1 + .../lang/id-ID/admin/hardware/message.php | 8 + resources/lang/id-ID/admin/hardware/table.php | 1 - resources/lang/id-ID/admin/kits/general.php | 1 + .../lang/id-ID/admin/locations/message.php | 8 +- resources/lang/id-ID/admin/models/message.php | 2 +- .../lang/id-ID/admin/settings/general.php | 5 + .../lang/id-ID/admin/settings/message.php | 2 +- resources/lang/id-ID/admin/users/message.php | 3 +- resources/lang/id-ID/general.php | 24 +- resources/lang/id-ID/localizations.php | 9 +- resources/lang/id-ID/mail.php | 22 +- resources/lang/id-ID/validation.php | 10 +- resources/lang/is-IS/admin/hardware/form.php | 1 + .../lang/is-IS/admin/hardware/message.php | 8 + resources/lang/is-IS/admin/hardware/table.php | 1 - resources/lang/is-IS/admin/kits/general.php | 1 + .../lang/is-IS/admin/locations/message.php | 8 +- resources/lang/is-IS/admin/models/message.php | 2 +- .../lang/is-IS/admin/settings/general.php | 5 + .../lang/is-IS/admin/settings/message.php | 2 +- resources/lang/is-IS/admin/users/message.php | 3 +- resources/lang/is-IS/button.php | 2 +- resources/lang/is-IS/general.php | 20 +- resources/lang/is-IS/localizations.php | 11 +- resources/lang/is-IS/mail.php | 22 +- resources/lang/is-IS/validation.php | 10 +- resources/lang/it-IT/account/general.php | 2 +- .../lang/it-IT/admin/accessories/message.php | 2 +- .../lang/it-IT/admin/categories/general.php | 31 +- .../lang/it-IT/admin/categories/message.php | 10 +- .../lang/it-IT/admin/categories/table.php | 2 +- .../lang/it-IT/admin/consumables/general.php | 2 +- .../it-IT/admin/custom_fields/message.php | 2 +- .../lang/it-IT/admin/departments/message.php | 2 +- .../lang/it-IT/admin/departments/table.php | 2 +- .../it-IT/admin/depreciations/message.php | 14 +- resources/lang/it-IT/admin/hardware/form.php | 57 +- .../lang/it-IT/admin/hardware/general.php | 2 +- .../lang/it-IT/admin/hardware/message.php | 12 +- resources/lang/it-IT/admin/hardware/table.php | 19 +- resources/lang/it-IT/admin/kits/general.php | 1 + resources/lang/it-IT/admin/licenses/form.php | 2 +- .../lang/it-IT/admin/licenses/general.php | 6 +- .../lang/it-IT/admin/licenses/message.php | 4 +- .../lang/it-IT/admin/locations/message.php | 30 +- .../lang/it-IT/admin/locations/table.php | 32 +- .../lang/it-IT/admin/settings/general.php | 67 +- .../lang/it-IT/admin/settings/message.php | 2 +- resources/lang/it-IT/admin/users/general.php | 6 +- resources/lang/it-IT/admin/users/message.php | 5 +- resources/lang/it-IT/admin/users/table.php | 4 +- resources/lang/it-IT/button.php | 16 +- resources/lang/it-IT/general.php | 74 +- resources/lang/it-IT/help.php | 4 +- resources/lang/it-IT/localizations.php | 11 +- resources/lang/it-IT/mail.php | 36 +- resources/lang/it-IT/validation.php | 240 +-- resources/lang/iu-NU/admin/hardware/form.php | 1 + .../lang/iu-NU/admin/hardware/message.php | 8 + resources/lang/iu-NU/admin/hardware/table.php | 1 - resources/lang/iu-NU/admin/kits/general.php | 1 + .../lang/iu-NU/admin/locations/message.php | 8 +- resources/lang/iu-NU/admin/models/message.php | 2 +- .../lang/iu-NU/admin/settings/general.php | 5 + .../lang/iu-NU/admin/settings/message.php | 2 +- resources/lang/iu-NU/admin/users/message.php | 3 +- resources/lang/iu-NU/general.php | 20 +- resources/lang/iu-NU/localizations.php | 9 +- resources/lang/iu-NU/mail.php | 22 +- resources/lang/iu-NU/validation.php | 10 +- resources/lang/ja-JP/admin/hardware/form.php | 1 + .../lang/ja-JP/admin/hardware/message.php | 8 + resources/lang/ja-JP/admin/hardware/table.php | 1 - resources/lang/ja-JP/admin/kits/general.php | 1 + .../lang/ja-JP/admin/locations/message.php | 8 +- resources/lang/ja-JP/admin/models/message.php | 2 +- .../lang/ja-JP/admin/settings/general.php | 5 + .../lang/ja-JP/admin/settings/message.php | 2 +- resources/lang/ja-JP/admin/users/message.php | 3 +- resources/lang/ja-JP/general.php | 22 +- resources/lang/ja-JP/localizations.php | 5 +- resources/lang/ja-JP/mail.php | 22 +- resources/lang/ja-JP/validation.php | 10 +- resources/lang/km-KH/account/general.php | 16 +- .../km-KH/admin/custom_fields/general.php | 42 +- .../km-KH/admin/depreciations/general.php | 8 +- .../lang/km-KH/admin/depreciations/table.php | 2 +- resources/lang/km-KH/admin/hardware/form.php | 1 + .../lang/km-KH/admin/hardware/message.php | 8 + resources/lang/km-KH/admin/hardware/table.php | 1 - resources/lang/km-KH/admin/kits/general.php | 1 + .../lang/km-KH/admin/locations/message.php | 8 +- .../lang/km-KH/admin/locations/table.php | 34 +- resources/lang/km-KH/admin/models/message.php | 2 +- .../lang/km-KH/admin/settings/general.php | 5 + .../lang/km-KH/admin/settings/message.php | 2 +- .../lang/km-KH/admin/statuslabels/message.php | 4 +- .../lang/km-KH/admin/statuslabels/table.php | 22 +- .../lang/km-KH/admin/suppliers/table.php | 28 +- resources/lang/km-KH/admin/users/message.php | 23 +- resources/lang/km-KH/admin/users/table.php | 44 +- resources/lang/km-KH/general.php | 26 +- resources/lang/km-KH/localizations.php | 91 +- resources/lang/km-KH/mail.php | 16 +- resources/lang/km-KH/table.php | 4 +- resources/lang/km-KH/validation.php | 218 +-- .../lang/ko-KR/admin/companies/message.php | 2 +- .../lang/ko-KR/admin/companies/table.php | 4 +- .../ko-KR/admin/custom_fields/message.php | 2 +- resources/lang/ko-KR/admin/hardware/form.php | 5 +- .../lang/ko-KR/admin/hardware/general.php | 6 +- .../lang/ko-KR/admin/hardware/message.php | 8 + resources/lang/ko-KR/admin/hardware/table.php | 7 +- resources/lang/ko-KR/admin/kits/general.php | 1 + .../lang/ko-KR/admin/locations/message.php | 8 +- .../lang/ko-KR/admin/locations/table.php | 4 +- resources/lang/ko-KR/admin/models/message.php | 2 +- .../lang/ko-KR/admin/settings/general.php | 7 +- .../lang/ko-KR/admin/settings/message.php | 2 +- resources/lang/ko-KR/admin/settings/table.php | 2 +- .../lang/ko-KR/admin/statuslabels/message.php | 2 +- resources/lang/ko-KR/admin/users/message.php | 3 +- resources/lang/ko-KR/button.php | 2 +- resources/lang/ko-KR/general.php | 50 +- resources/lang/ko-KR/localizations.php | 11 +- resources/lang/ko-KR/mail.php | 22 +- resources/lang/ko-KR/validation.php | 10 +- resources/lang/lt-LT/account/general.php | 2 +- resources/lang/lt-LT/admin/hardware/form.php | 1 + .../lang/lt-LT/admin/hardware/message.php | 8 + resources/lang/lt-LT/admin/hardware/table.php | 3 +- resources/lang/lt-LT/admin/kits/general.php | 1 + .../lang/lt-LT/admin/locations/message.php | 8 +- .../lang/lt-LT/admin/settings/general.php | 5 + resources/lang/lt-LT/admin/users/message.php | 3 +- resources/lang/lt-LT/general.php | 32 +- resources/lang/lt-LT/localizations.php | 5 +- resources/lang/lt-LT/mail.php | 24 +- resources/lang/lt-LT/validation.php | 10 +- .../lv-LV/admin/asset_maintenances/form.php | 2 +- resources/lang/lv-LV/admin/hardware/form.php | 1 + .../lang/lv-LV/admin/hardware/message.php | 8 + resources/lang/lv-LV/admin/hardware/table.php | 5 +- resources/lang/lv-LV/admin/kits/general.php | 1 + resources/lang/lv-LV/admin/labels/table.php | 2 +- .../lang/lv-LV/admin/locations/message.php | 8 +- .../lang/lv-LV/admin/locations/table.php | 2 +- resources/lang/lv-LV/admin/models/message.php | 2 +- .../lang/lv-LV/admin/settings/general.php | 5 + .../lang/lv-LV/admin/settings/message.php | 2 +- resources/lang/lv-LV/admin/users/message.php | 3 +- resources/lang/lv-LV/general.php | 20 +- resources/lang/lv-LV/localizations.php | 9 +- resources/lang/lv-LV/mail.php | 22 +- resources/lang/lv-LV/validation.php | 10 +- resources/lang/mi-NZ/admin/hardware/form.php | 1 + .../lang/mi-NZ/admin/hardware/message.php | 8 + resources/lang/mi-NZ/admin/hardware/table.php | 1 - resources/lang/mi-NZ/admin/kits/general.php | 1 + .../lang/mi-NZ/admin/locations/message.php | 8 +- resources/lang/mi-NZ/admin/models/message.php | 2 +- .../lang/mi-NZ/admin/settings/general.php | 5 + .../lang/mi-NZ/admin/settings/message.php | 2 +- resources/lang/mi-NZ/admin/users/message.php | 3 +- resources/lang/mi-NZ/general.php | 20 +- resources/lang/mi-NZ/localizations.php | 9 +- resources/lang/mi-NZ/mail.php | 22 +- resources/lang/mi-NZ/validation.php | 14 +- resources/lang/mk-MK/account/general.php | 24 +- .../lang/mk-MK/admin/accessories/general.php | 4 +- .../lang/mk-MK/admin/accessories/message.php | 8 +- .../mk-MK/admin/asset_maintenances/form.php | 12 +- .../admin/asset_maintenances/general.php | 10 +- .../lang/mk-MK/admin/categories/general.php | 10 +- .../lang/mk-MK/admin/categories/message.php | 2 +- .../lang/mk-MK/admin/companies/general.php | 2 +- .../lang/mk-MK/admin/companies/message.php | 2 +- .../lang/mk-MK/admin/companies/table.php | 4 +- .../lang/mk-MK/admin/components/general.php | 2 +- .../lang/mk-MK/admin/components/message.php | 2 +- .../lang/mk-MK/admin/consumables/general.php | 2 +- .../lang/mk-MK/admin/consumables/message.php | 4 +- .../mk-MK/admin/custom_fields/general.php | 60 +- .../mk-MK/admin/custom_fields/message.php | 4 +- .../lang/mk-MK/admin/departments/message.php | 2 +- .../mk-MK/admin/depreciations/general.php | 10 +- .../lang/mk-MK/admin/depreciations/table.php | 2 +- resources/lang/mk-MK/admin/groups/message.php | 2 +- resources/lang/mk-MK/admin/groups/titles.php | 6 +- resources/lang/mk-MK/admin/hardware/form.php | 41 +- .../lang/mk-MK/admin/hardware/general.php | 44 +- .../lang/mk-MK/admin/hardware/message.php | 38 +- resources/lang/mk-MK/admin/hardware/table.php | 19 +- resources/lang/mk-MK/admin/kits/general.php | 87 +- resources/lang/mk-MK/admin/labels/message.php | 8 +- resources/lang/mk-MK/admin/labels/table.php | 18 +- .../lang/mk-MK/admin/licenses/general.php | 40 +- .../lang/mk-MK/admin/licenses/message.php | 14 +- resources/lang/mk-MK/admin/licenses/table.php | 2 +- .../lang/mk-MK/admin/locations/message.php | 12 +- .../lang/mk-MK/admin/locations/table.php | 20 +- .../mk-MK/admin/manufacturers/message.php | 2 +- .../lang/mk-MK/admin/manufacturers/table.php | 2 +- resources/lang/mk-MK/admin/models/general.php | 4 +- resources/lang/mk-MK/admin/models/message.php | 14 +- .../lang/mk-MK/admin/reports/general.php | 20 +- .../lang/mk-MK/admin/settings/general.php | 609 +++---- .../lang/mk-MK/admin/settings/message.php | 42 +- resources/lang/mk-MK/admin/settings/table.php | 2 +- .../lang/mk-MK/admin/statuslabels/message.php | 2 +- .../lang/mk-MK/admin/suppliers/message.php | 2 +- resources/lang/mk-MK/admin/users/general.php | 60 +- resources/lang/mk-MK/admin/users/message.php | 29 +- resources/lang/mk-MK/admin/users/table.php | 8 +- resources/lang/mk-MK/auth.php | 6 +- resources/lang/mk-MK/auth/general.php | 12 +- resources/lang/mk-MK/auth/message.php | 18 +- resources/lang/mk-MK/button.php | 30 +- resources/lang/mk-MK/general.php | 626 +++---- resources/lang/mk-MK/help.php | 4 +- resources/lang/mk-MK/localizations.php | 623 +++---- resources/lang/mk-MK/mail.php | 90 +- resources/lang/mk-MK/passwords.php | 10 +- resources/lang/mk-MK/reminders.php | 4 +- resources/lang/mk-MK/table.php | 2 +- resources/lang/mk-MK/validation.php | 286 ++-- resources/lang/ml-IN/admin/hardware/form.php | 1 + .../lang/ml-IN/admin/hardware/message.php | 8 + resources/lang/ml-IN/admin/hardware/table.php | 1 - resources/lang/ml-IN/admin/kits/general.php | 1 + .../lang/ml-IN/admin/locations/message.php | 8 +- resources/lang/ml-IN/admin/models/message.php | 2 +- .../lang/ml-IN/admin/settings/general.php | 5 + .../lang/ml-IN/admin/settings/message.php | 2 +- resources/lang/ml-IN/admin/users/message.php | 3 +- resources/lang/ml-IN/general.php | 20 +- resources/lang/ml-IN/localizations.php | 9 +- resources/lang/ml-IN/mail.php | 22 +- resources/lang/ml-IN/validation.php | 10 +- resources/lang/mn-MN/admin/hardware/form.php | 1 + .../lang/mn-MN/admin/hardware/message.php | 8 + resources/lang/mn-MN/admin/hardware/table.php | 1 - resources/lang/mn-MN/admin/kits/general.php | 1 + .../lang/mn-MN/admin/locations/message.php | 8 +- resources/lang/mn-MN/admin/models/message.php | 2 +- .../lang/mn-MN/admin/settings/general.php | 5 + .../lang/mn-MN/admin/settings/message.php | 2 +- resources/lang/mn-MN/admin/users/message.php | 3 +- resources/lang/mn-MN/general.php | 20 +- resources/lang/mn-MN/localizations.php | 9 +- resources/lang/mn-MN/mail.php | 22 +- resources/lang/mn-MN/validation.php | 10 +- .../lang/ms-MY/admin/accessories/general.php | 2 +- .../lang/ms-MY/admin/accessories/message.php | 2 +- resources/lang/ms-MY/admin/hardware/form.php | 1 + .../lang/ms-MY/admin/hardware/message.php | 8 + resources/lang/ms-MY/admin/hardware/table.php | 1 - resources/lang/ms-MY/admin/kits/general.php | 1 + .../lang/ms-MY/admin/locations/message.php | 8 +- resources/lang/ms-MY/admin/models/message.php | 2 +- .../lang/ms-MY/admin/settings/general.php | 5 + .../lang/ms-MY/admin/settings/message.php | 2 +- resources/lang/ms-MY/admin/users/message.php | 3 +- resources/lang/ms-MY/general.php | 22 +- resources/lang/ms-MY/localizations.php | 9 +- resources/lang/ms-MY/mail.php | 22 +- resources/lang/ms-MY/validation.php | 10 +- resources/lang/nb-NO/admin/hardware/form.php | 1 + .../lang/nb-NO/admin/hardware/message.php | 8 + resources/lang/nb-NO/admin/hardware/table.php | 1 - resources/lang/nb-NO/admin/kits/general.php | 1 + .../lang/nb-NO/admin/locations/message.php | 8 +- resources/lang/nb-NO/admin/models/message.php | 2 +- .../lang/nb-NO/admin/settings/general.php | 5 + .../lang/nb-NO/admin/settings/message.php | 2 +- resources/lang/nb-NO/admin/users/message.php | 3 +- resources/lang/nb-NO/general.php | 20 +- resources/lang/nb-NO/localizations.php | 9 +- resources/lang/nb-NO/mail.php | 22 +- resources/lang/nb-NO/validation.php | 10 +- resources/lang/nl-NL/account/general.php | 18 +- .../lang/nl-NL/admin/accessories/message.php | 2 +- .../lang/nl-NL/admin/consumables/general.php | 2 +- .../lang/nl-NL/admin/consumables/message.php | 2 +- .../nl-NL/admin/custom_fields/message.php | 2 +- resources/lang/nl-NL/admin/hardware/form.php | 7 +- .../lang/nl-NL/admin/hardware/general.php | 4 +- .../lang/nl-NL/admin/hardware/message.php | 20 +- resources/lang/nl-NL/admin/hardware/table.php | 1 - resources/lang/nl-NL/admin/kits/general.php | 1 + .../lang/nl-NL/admin/licenses/general.php | 6 +- .../lang/nl-NL/admin/licenses/message.php | 4 +- .../lang/nl-NL/admin/locations/message.php | 8 +- resources/lang/nl-NL/admin/models/message.php | 2 +- .../lang/nl-NL/admin/settings/general.php | 41 +- .../lang/nl-NL/admin/settings/message.php | 2 +- resources/lang/nl-NL/admin/users/message.php | 15 +- resources/lang/nl-NL/auth/message.php | 4 +- resources/lang/nl-NL/button.php | 14 +- resources/lang/nl-NL/general.php | 78 +- resources/lang/nl-NL/localizations.php | 11 +- resources/lang/nl-NL/mail.php | 28 +- resources/lang/nl-NL/table.php | 2 +- resources/lang/nl-NL/validation.php | 246 +-- resources/lang/nn-NO/admin/hardware/form.php | 1 + .../lang/nn-NO/admin/hardware/message.php | 8 + resources/lang/nn-NO/admin/hardware/table.php | 1 - resources/lang/nn-NO/admin/kits/general.php | 1 + .../lang/nn-NO/admin/locations/message.php | 8 +- resources/lang/nn-NO/admin/models/message.php | 2 +- .../lang/nn-NO/admin/settings/general.php | 5 + .../lang/nn-NO/admin/settings/message.php | 2 +- resources/lang/nn-NO/admin/users/message.php | 3 +- resources/lang/nn-NO/general.php | 20 +- resources/lang/nn-NO/localizations.php | 9 +- resources/lang/nn-NO/mail.php | 22 +- resources/lang/nn-NO/validation.php | 10 +- resources/lang/no-NO/admin/hardware/form.php | 1 + .../lang/no-NO/admin/hardware/message.php | 8 + resources/lang/no-NO/admin/hardware/table.php | 1 - resources/lang/no-NO/admin/kits/general.php | 1 + .../lang/no-NO/admin/locations/message.php | 8 +- resources/lang/no-NO/admin/models/message.php | 2 +- .../lang/no-NO/admin/settings/general.php | 5 + .../lang/no-NO/admin/settings/message.php | 2 +- resources/lang/no-NO/admin/users/message.php | 3 +- resources/lang/no-NO/general.php | 20 +- resources/lang/no-NO/localizations.php | 9 +- resources/lang/no-NO/mail.php | 22 +- resources/lang/no-NO/validation.php | 10 +- resources/lang/pl-PL/admin/hardware/form.php | 1 + .../lang/pl-PL/admin/hardware/message.php | 8 + resources/lang/pl-PL/admin/hardware/table.php | 1 - resources/lang/pl-PL/admin/kits/general.php | 1 + .../lang/pl-PL/admin/locations/message.php | 8 +- .../lang/pl-PL/admin/settings/general.php | 5 + .../lang/pl-PL/admin/settings/message.php | 2 +- resources/lang/pl-PL/admin/users/message.php | 3 +- resources/lang/pl-PL/general.php | 20 +- resources/lang/pl-PL/localizations.php | 9 +- resources/lang/pl-PL/mail.php | 22 +- resources/lang/pl-PL/validation.php | 10 +- resources/lang/pt-BR/account/general.php | 4 +- .../lang/pt-BR/admin/accessories/message.php | 4 +- .../lang/pt-BR/admin/categories/general.php | 2 +- .../lang/pt-BR/admin/consumables/general.php | 2 +- .../lang/pt-BR/admin/consumables/message.php | 4 +- .../pt-BR/admin/custom_fields/message.php | 2 +- resources/lang/pt-BR/admin/hardware/form.php | 17 +- .../lang/pt-BR/admin/hardware/general.php | 4 +- .../lang/pt-BR/admin/hardware/message.php | 22 +- resources/lang/pt-BR/admin/hardware/table.php | 5 +- resources/lang/pt-BR/admin/kits/general.php | 5 +- .../lang/pt-BR/admin/licenses/general.php | 8 +- .../lang/pt-BR/admin/licenses/message.php | 8 +- .../lang/pt-BR/admin/locations/message.php | 8 +- .../lang/pt-BR/admin/locations/table.php | 2 +- resources/lang/pt-BR/admin/models/message.php | 2 +- .../lang/pt-BR/admin/settings/general.php | 21 +- .../lang/pt-BR/admin/settings/message.php | 2 +- .../lang/pt-BR/admin/statuslabels/message.php | 22 +- .../lang/pt-BR/admin/statuslabels/table.php | 16 +- resources/lang/pt-BR/admin/users/general.php | 8 +- resources/lang/pt-BR/admin/users/message.php | 15 +- resources/lang/pt-BR/auth/message.php | 4 +- resources/lang/pt-BR/button.php | 10 +- resources/lang/pt-BR/general.php | 70 +- resources/lang/pt-BR/localizations.php | 11 +- resources/lang/pt-BR/mail.php | 34 +- resources/lang/pt-BR/validation.php | 48 +- .../lang/pt-PT/admin/accessories/message.php | 2 +- .../lang/pt-PT/admin/consumables/general.php | 2 +- .../lang/pt-PT/admin/consumables/message.php | 2 +- .../pt-PT/admin/custom_fields/message.php | 2 +- resources/lang/pt-PT/admin/hardware/form.php | 3 +- .../lang/pt-PT/admin/hardware/general.php | 2 +- .../lang/pt-PT/admin/hardware/message.php | 12 +- resources/lang/pt-PT/admin/hardware/table.php | 1 - resources/lang/pt-PT/admin/kits/general.php | 1 + .../lang/pt-PT/admin/locations/message.php | 8 +- resources/lang/pt-PT/admin/models/message.php | 2 +- .../lang/pt-PT/admin/settings/general.php | 5 + .../lang/pt-PT/admin/settings/message.php | 2 +- resources/lang/pt-PT/admin/users/message.php | 3 +- resources/lang/pt-PT/general.php | 20 +- resources/lang/pt-PT/localizations.php | 9 +- resources/lang/pt-PT/mail.php | 22 +- resources/lang/pt-PT/validation.php | 10 +- resources/lang/ro-RO/admin/hardware/form.php | 1 + .../lang/ro-RO/admin/hardware/message.php | 8 + resources/lang/ro-RO/admin/hardware/table.php | 1 - resources/lang/ro-RO/admin/kits/general.php | 1 + .../lang/ro-RO/admin/locations/message.php | 8 +- resources/lang/ro-RO/admin/models/message.php | 2 +- .../lang/ro-RO/admin/settings/general.php | 5 + .../lang/ro-RO/admin/settings/message.php | 2 +- resources/lang/ro-RO/admin/users/message.php | 3 +- resources/lang/ro-RO/general.php | 20 +- resources/lang/ro-RO/localizations.php | 9 +- resources/lang/ro-RO/mail.php | 22 +- resources/lang/ro-RO/validation.php | 10 +- resources/lang/ru-RU/account/general.php | 18 +- .../lang/ru-RU/admin/accessories/message.php | 2 +- .../lang/ru-RU/admin/consumables/general.php | 2 +- .../lang/ru-RU/admin/consumables/message.php | 2 +- .../ru-RU/admin/custom_fields/message.php | 2 +- resources/lang/ru-RU/admin/hardware/form.php | 7 +- .../lang/ru-RU/admin/hardware/general.php | 4 +- .../lang/ru-RU/admin/hardware/message.php | 20 +- resources/lang/ru-RU/admin/hardware/table.php | 1 - resources/lang/ru-RU/admin/kits/general.php | 1 + .../lang/ru-RU/admin/licenses/general.php | 6 +- .../lang/ru-RU/admin/licenses/message.php | 4 +- .../lang/ru-RU/admin/locations/message.php | 8 +- resources/lang/ru-RU/admin/models/message.php | 2 +- .../lang/ru-RU/admin/settings/general.php | 37 +- .../lang/ru-RU/admin/settings/message.php | 2 +- resources/lang/ru-RU/admin/users/message.php | 15 +- resources/lang/ru-RU/auth/message.php | 4 +- resources/lang/ru-RU/button.php | 16 +- resources/lang/ru-RU/general.php | 74 +- resources/lang/ru-RU/localizations.php | 11 +- resources/lang/ru-RU/mail.php | 28 +- resources/lang/ru-RU/table.php | 2 +- resources/lang/ru-RU/validation.php | 246 +-- resources/lang/si-LK/admin/hardware/form.php | 1 + .../lang/si-LK/admin/hardware/message.php | 8 + resources/lang/si-LK/admin/hardware/table.php | 1 - resources/lang/si-LK/admin/kits/general.php | 1 + .../lang/si-LK/admin/locations/message.php | 8 +- resources/lang/si-LK/admin/models/message.php | 2 +- .../lang/si-LK/admin/settings/general.php | 5 + .../lang/si-LK/admin/settings/message.php | 2 +- resources/lang/si-LK/admin/users/message.php | 3 +- resources/lang/si-LK/general.php | 20 +- resources/lang/si-LK/localizations.php | 9 +- resources/lang/si-LK/mail.php | 22 +- resources/lang/si-LK/validation.php | 10 +- resources/lang/sk-SK/admin/hardware/form.php | 1 + .../lang/sk-SK/admin/hardware/message.php | 8 + resources/lang/sk-SK/admin/hardware/table.php | 1 - resources/lang/sk-SK/admin/kits/general.php | 1 + .../lang/sk-SK/admin/locations/message.php | 8 +- resources/lang/sk-SK/admin/models/message.php | 2 +- .../lang/sk-SK/admin/settings/general.php | 5 + .../lang/sk-SK/admin/settings/message.php | 2 +- resources/lang/sk-SK/admin/users/message.php | 3 +- resources/lang/sk-SK/general.php | 20 +- resources/lang/sk-SK/localizations.php | 9 +- resources/lang/sk-SK/mail.php | 22 +- resources/lang/sk-SK/validation.php | 10 +- .../sl-SI/admin/asset_maintenances/form.php | 2 +- .../lang/sl-SI/admin/categories/general.php | 4 +- .../lang/sl-SI/admin/categories/message.php | 2 +- .../lang/sl-SI/admin/companies/table.php | 2 +- .../sl-SI/admin/custom_fields/general.php | 12 +- resources/lang/sl-SI/admin/groups/titles.php | 2 +- resources/lang/sl-SI/admin/hardware/form.php | 41 +- .../lang/sl-SI/admin/hardware/general.php | 8 +- .../lang/sl-SI/admin/hardware/message.php | 24 +- resources/lang/sl-SI/admin/hardware/table.php | 17 +- resources/lang/sl-SI/admin/kits/general.php | 1 + resources/lang/sl-SI/admin/labels/message.php | 2 +- resources/lang/sl-SI/admin/labels/table.php | 6 +- resources/lang/sl-SI/admin/licenses/table.php | 2 +- .../lang/sl-SI/admin/locations/message.php | 12 +- .../lang/sl-SI/admin/locations/table.php | 18 +- resources/lang/sl-SI/admin/models/message.php | 14 +- .../lang/sl-SI/admin/reports/general.php | 6 +- .../lang/sl-SI/admin/settings/general.php | 129 +- .../lang/sl-SI/admin/settings/message.php | 16 +- resources/lang/sl-SI/admin/settings/table.php | 2 +- .../lang/sl-SI/admin/statuslabels/message.php | 2 +- resources/lang/sl-SI/admin/users/general.php | 44 +- resources/lang/sl-SI/admin/users/message.php | 13 +- resources/lang/sl-SI/admin/users/table.php | 2 +- resources/lang/sl-SI/button.php | 6 +- resources/lang/sl-SI/general.php | 114 +- resources/lang/sl-SI/localizations.php | 29 +- resources/lang/sl-SI/mail.php | 24 +- resources/lang/sl-SI/passwords.php | 4 +- resources/lang/sl-SI/validation.php | 12 +- resources/lang/so-SO/admin/hardware/form.php | 1 + .../lang/so-SO/admin/hardware/message.php | 8 + resources/lang/so-SO/admin/hardware/table.php | 1 - resources/lang/so-SO/admin/kits/general.php | 1 + .../lang/so-SO/admin/locations/message.php | 8 +- resources/lang/so-SO/admin/models/message.php | 2 +- .../lang/so-SO/admin/settings/general.php | 5 + .../lang/so-SO/admin/settings/message.php | 2 +- resources/lang/so-SO/admin/users/message.php | 3 +- resources/lang/so-SO/general.php | 20 +- resources/lang/so-SO/localizations.php | 9 +- resources/lang/so-SO/mail.php | 22 +- resources/lang/so-SO/validation.php | 10 +- resources/lang/sq-AL/admin/hardware/form.php | 1 + .../lang/sq-AL/admin/hardware/message.php | 8 + resources/lang/sq-AL/admin/hardware/table.php | 1 - resources/lang/sq-AL/admin/kits/general.php | 1 + .../lang/sq-AL/admin/locations/message.php | 8 +- resources/lang/sq-AL/admin/models/message.php | 2 +- .../lang/sq-AL/admin/settings/general.php | 5 + .../lang/sq-AL/admin/settings/message.php | 2 +- resources/lang/sq-AL/admin/users/message.php | 3 +- resources/lang/sq-AL/general.php | 20 +- resources/lang/sq-AL/localizations.php | 9 +- resources/lang/sq-AL/mail.php | 22 +- resources/lang/sq-AL/validation.php | 10 +- resources/lang/sr-CS/account/general.php | 2 +- resources/lang/sr-CS/admin/hardware/form.php | 1 + .../lang/sr-CS/admin/hardware/message.php | 8 + resources/lang/sr-CS/admin/hardware/table.php | 1 - resources/lang/sr-CS/admin/kits/general.php | 1 + .../lang/sr-CS/admin/locations/message.php | 8 +- resources/lang/sr-CS/admin/models/message.php | 2 +- .../lang/sr-CS/admin/settings/general.php | 5 + .../lang/sr-CS/admin/settings/message.php | 2 +- resources/lang/sr-CS/admin/users/message.php | 3 +- resources/lang/sr-CS/general.php | 20 +- resources/lang/sr-CS/localizations.php | 7 +- resources/lang/sr-CS/mail.php | 22 +- resources/lang/sr-CS/validation.php | 10 +- .../lang/sv-SE/admin/accessories/message.php | 2 +- .../lang/sv-SE/admin/consumables/general.php | 2 +- .../lang/sv-SE/admin/consumables/message.php | 2 +- .../sv-SE/admin/custom_fields/message.php | 2 +- resources/lang/sv-SE/admin/hardware/form.php | 7 +- .../lang/sv-SE/admin/hardware/general.php | 4 +- .../lang/sv-SE/admin/hardware/message.php | 20 +- resources/lang/sv-SE/admin/hardware/table.php | 1 - resources/lang/sv-SE/admin/kits/general.php | 1 + .../lang/sv-SE/admin/licenses/general.php | 6 +- .../lang/sv-SE/admin/licenses/message.php | 4 +- .../lang/sv-SE/admin/locations/message.php | 8 +- resources/lang/sv-SE/admin/models/message.php | 2 +- .../lang/sv-SE/admin/settings/general.php | 5 + .../lang/sv-SE/admin/settings/message.php | 2 +- resources/lang/sv-SE/admin/users/message.php | 3 +- resources/lang/sv-SE/general.php | 80 +- resources/lang/sv-SE/localizations.php | 9 +- resources/lang/sv-SE/mail.php | 22 +- resources/lang/sv-SE/validation.php | 10 +- resources/lang/ta-IN/admin/hardware/form.php | 1 + .../lang/ta-IN/admin/hardware/message.php | 8 + resources/lang/ta-IN/admin/hardware/table.php | 1 - resources/lang/ta-IN/admin/kits/general.php | 1 + .../lang/ta-IN/admin/locations/message.php | 8 +- resources/lang/ta-IN/admin/models/message.php | 2 +- .../lang/ta-IN/admin/settings/general.php | 5 + .../lang/ta-IN/admin/settings/message.php | 2 +- resources/lang/ta-IN/admin/users/message.php | 3 +- resources/lang/ta-IN/general.php | 40 +- resources/lang/ta-IN/localizations.php | 9 +- resources/lang/ta-IN/mail.php | 20 +- resources/lang/ta-IN/validation.php | 10 +- resources/lang/th-TH/admin/hardware/form.php | 1 + .../lang/th-TH/admin/hardware/message.php | 8 + resources/lang/th-TH/admin/hardware/table.php | 1 - resources/lang/th-TH/admin/kits/general.php | 1 + .../lang/th-TH/admin/locations/message.php | 8 +- .../lang/th-TH/admin/locations/table.php | 4 +- resources/lang/th-TH/admin/models/message.php | 2 +- .../lang/th-TH/admin/settings/general.php | 5 + .../lang/th-TH/admin/settings/message.php | 2 +- resources/lang/th-TH/admin/users/message.php | 3 +- resources/lang/th-TH/general.php | 20 +- resources/lang/th-TH/localizations.php | 9 +- resources/lang/th-TH/mail.php | 22 +- resources/lang/th-TH/validation.php | 10 +- resources/lang/tl-PH/admin/hardware/form.php | 1 + .../lang/tl-PH/admin/hardware/message.php | 8 + resources/lang/tl-PH/admin/hardware/table.php | 1 - resources/lang/tl-PH/admin/kits/general.php | 1 + .../lang/tl-PH/admin/locations/message.php | 8 +- resources/lang/tl-PH/admin/models/message.php | 2 +- .../lang/tl-PH/admin/settings/general.php | 5 + .../lang/tl-PH/admin/settings/message.php | 2 +- resources/lang/tl-PH/admin/users/message.php | 3 +- resources/lang/tl-PH/general.php | 20 +- resources/lang/tl-PH/localizations.php | 9 +- resources/lang/tl-PH/mail.php | 22 +- resources/lang/tl-PH/validation.php | 10 +- resources/lang/tr-TR/admin/hardware/form.php | 1 + .../lang/tr-TR/admin/hardware/message.php | 8 + resources/lang/tr-TR/admin/hardware/table.php | 1 - resources/lang/tr-TR/admin/kits/general.php | 1 + .../lang/tr-TR/admin/locations/message.php | 8 +- resources/lang/tr-TR/admin/models/message.php | 2 +- .../lang/tr-TR/admin/settings/general.php | 5 + .../lang/tr-TR/admin/settings/message.php | 2 +- resources/lang/tr-TR/admin/users/message.php | 3 +- resources/lang/tr-TR/general.php | 28 +- resources/lang/tr-TR/localizations.php | 9 +- resources/lang/tr-TR/mail.php | 22 +- resources/lang/tr-TR/validation.php | 10 +- resources/lang/uk-UA/admin/hardware/form.php | 1 + .../lang/uk-UA/admin/hardware/message.php | 8 + resources/lang/uk-UA/admin/hardware/table.php | 1 - resources/lang/uk-UA/admin/kits/general.php | 1 + .../lang/uk-UA/admin/locations/message.php | 8 +- resources/lang/uk-UA/admin/models/message.php | 2 +- .../lang/uk-UA/admin/settings/general.php | 5 + .../lang/uk-UA/admin/settings/message.php | 2 +- resources/lang/uk-UA/admin/users/message.php | 3 +- resources/lang/uk-UA/general.php | 20 +- resources/lang/uk-UA/localizations.php | 9 +- resources/lang/uk-UA/mail.php | 22 +- resources/lang/uk-UA/validation.php | 10 +- resources/lang/ur-PK/admin/hardware/form.php | 1 + .../lang/ur-PK/admin/hardware/message.php | 8 + resources/lang/ur-PK/admin/hardware/table.php | 1 - resources/lang/ur-PK/admin/kits/general.php | 1 + .../lang/ur-PK/admin/locations/message.php | 8 +- resources/lang/ur-PK/admin/models/message.php | 2 +- .../lang/ur-PK/admin/settings/general.php | 5 + .../lang/ur-PK/admin/settings/message.php | 2 +- resources/lang/ur-PK/admin/users/message.php | 3 +- resources/lang/ur-PK/general.php | 20 +- resources/lang/ur-PK/localizations.php | 9 +- resources/lang/ur-PK/mail.php | 22 +- resources/lang/ur-PK/validation.php | 10 +- resources/lang/vi-VN/admin/hardware/form.php | 1 + .../lang/vi-VN/admin/hardware/message.php | 8 + resources/lang/vi-VN/admin/hardware/table.php | 1 - resources/lang/vi-VN/admin/kits/general.php | 1 + .../lang/vi-VN/admin/locations/message.php | 8 +- resources/lang/vi-VN/admin/models/message.php | 2 +- .../lang/vi-VN/admin/settings/general.php | 5 + .../lang/vi-VN/admin/settings/message.php | 2 +- resources/lang/vi-VN/admin/users/message.php | 3 +- resources/lang/vi-VN/general.php | 20 +- resources/lang/vi-VN/localizations.php | 9 +- resources/lang/vi-VN/mail.php | 22 +- resources/lang/vi-VN/validation.php | 10 +- resources/lang/zh-CN/account/general.php | 4 +- resources/lang/zh-CN/admin/hardware/form.php | 1 + .../lang/zh-CN/admin/hardware/message.php | 8 + resources/lang/zh-CN/admin/hardware/table.php | 1 - resources/lang/zh-CN/admin/kits/general.php | 1 + .../lang/zh-CN/admin/locations/message.php | 8 +- resources/lang/zh-CN/admin/models/message.php | 2 +- .../lang/zh-CN/admin/settings/general.php | 5 + resources/lang/zh-CN/admin/users/message.php | 3 +- resources/lang/zh-CN/general.php | 20 +- resources/lang/zh-CN/localizations.php | 7 +- resources/lang/zh-CN/mail.php | 18 +- resources/lang/zh-CN/validation.php | 12 +- resources/lang/zh-HK/admin/hardware/form.php | 1 + .../lang/zh-HK/admin/hardware/message.php | 8 + resources/lang/zh-HK/admin/hardware/table.php | 1 - resources/lang/zh-HK/admin/kits/general.php | 1 + .../lang/zh-HK/admin/locations/message.php | 8 +- resources/lang/zh-HK/admin/models/message.php | 2 +- .../lang/zh-HK/admin/settings/general.php | 5 + .../lang/zh-HK/admin/settings/message.php | 2 +- resources/lang/zh-HK/admin/users/message.php | 3 +- resources/lang/zh-HK/general.php | 20 +- resources/lang/zh-HK/localizations.php | 9 +- resources/lang/zh-HK/mail.php | 22 +- resources/lang/zh-HK/validation.php | 10 +- resources/lang/zh-TW/admin/hardware/form.php | 1 + .../lang/zh-TW/admin/hardware/message.php | 8 + resources/lang/zh-TW/admin/hardware/table.php | 1 - resources/lang/zh-TW/admin/kits/general.php | 1 + .../lang/zh-TW/admin/locations/message.php | 8 +- resources/lang/zh-TW/admin/models/message.php | 2 +- .../lang/zh-TW/admin/settings/general.php | 5 + .../lang/zh-TW/admin/settings/message.php | 2 +- resources/lang/zh-TW/admin/users/message.php | 3 +- resources/lang/zh-TW/general.php | 20 +- resources/lang/zh-TW/localizations.php | 9 +- resources/lang/zh-TW/mail.php | 18 +- resources/lang/zh-TW/validation.php | 10 +- resources/lang/zu-ZA/admin/hardware/form.php | 1 + .../lang/zu-ZA/admin/hardware/message.php | 8 + resources/lang/zu-ZA/admin/hardware/table.php | 1 - resources/lang/zu-ZA/admin/kits/general.php | 1 + .../lang/zu-ZA/admin/locations/message.php | 8 +- resources/lang/zu-ZA/admin/models/message.php | 2 +- .../lang/zu-ZA/admin/settings/general.php | 5 + .../lang/zu-ZA/admin/settings/message.php | 2 +- resources/lang/zu-ZA/admin/users/message.php | 3 +- resources/lang/zu-ZA/general.php | 20 +- resources/lang/zu-ZA/localizations.php | 9 +- resources/lang/zu-ZA/mail.php | 22 +- resources/lang/zu-ZA/validation.php | 10 +- resources/macros/macros.php | 21 +- resources/views/accessories/view.blade.php | 159 +- .../views/account/change-password.blade.php | 2 +- resources/views/account/profile.blade.php | 2 +- resources/views/account/view-assets.blade.php | 28 +- .../views/asset_maintenances/edit.blade.php | 30 +- resources/views/auth/login.blade.php | 12 +- .../views/auth/passwords/email.blade.php | 8 +- .../views/auth/passwords/reset.blade.php | 13 +- resources/views/blade/filestable.blade.php | 142 ++ resources/views/blade/icon.blade.php | 6 + .../blade/redirect_submit_options.blade.php | 2 +- resources/views/categories/view.blade.php | 19 +- resources/views/companies/view.blade.php | 2 +- resources/views/components/checkout.blade.php | 2 +- resources/views/components/edit.blade.php | 2 + resources/views/components/view.blade.php | 125 +- .../views/consumables/checkout.blade.php | 2 +- resources/views/consumables/view.blade.php | 165 +- .../views/custom_fields/fields/edit.blade.php | 2 +- resources/views/dashboard.blade.php | 84 +- resources/views/depreciations/edit.blade.php | 2 +- resources/views/depreciations/view.blade.php | 42 +- resources/views/errors/403.blade.php | 2 +- resources/views/errors/404.blade.php | 2 +- resources/views/errors/503.blade.php | 2 +- resources/views/groups/index.blade.php | 4 +- resources/views/hardware/audit.blade.php | 6 +- .../views/hardware/bulk-checkout.blade.php | 41 +- .../views/hardware/bulk-delete.blade.php | 20 +- .../views/hardware/bulk-restore.blade.php | 2 +- resources/views/hardware/bulk.blade.php | 45 +- resources/views/hardware/checkin.blade.php | 2 +- resources/views/hardware/checkout.blade.php | 21 +- resources/views/hardware/edit.blade.php | 25 +- .../hardware/quickscan-checkin.blade.php | 4 +- resources/views/hardware/quickscan.blade.php | 22 +- resources/views/hardware/requested.blade.php | 12 +- resources/views/hardware/view.blade.php | 448 ++--- resources/views/kits/checkout.blade.php | 6 +- resources/views/layouts/default.blade.php | 164 +- resources/views/layouts/edit-form.blade.php | 2 +- resources/views/licenses/checkout.blade.php | 4 +- resources/views/licenses/edit.blade.php | 12 +- resources/views/licenses/view.blade.php | 175 +- ...eld-set-default-values-for-model.blade.php | 85 +- resources/views/livewire/importer.blade.php | 48 +- .../views/livewire/oauth-clients.blade.php | 1 + .../livewire/slack-settings-form.blade.php | 11 +- .../views/locations/bulk-delete.blade.php | 2 +- resources/views/locations/edit.blade.php | 23 +- resources/views/locations/view.blade.php | 169 +- .../markdown/checkin-accessory.blade.php | 0 .../markdown/checkin-asset.blade.php | 0 .../markdown/checkin-license.blade.php | 12 +- .../markdown/checkout-accessory.blade.php | 0 .../markdown/checkout-asset.blade.php | 2 +- .../markdown/checkout-consumable.blade.php | 6 + .../markdown/checkout-license.blade.php | 14 +- resources/views/manufacturers/index.blade.php | 1 - resources/views/manufacturers/view.blade.php | 48 +- resources/views/modals/category.blade.php | 13 +- resources/views/modals/location.blade.php | 12 +- resources/views/modals/manufacturer.blade.php | 13 +- resources/views/modals/model.blade.php | 41 +- .../partials/categories-select.blade.php | 11 + .../modals/partials/fieldset-select.blade.php | 6 + .../views/modals/partials/footer.blade.php | 6 + .../partials/manufacturer-select.blade.php | 8 + .../modals/partials/model-number.blade.php | 6 + .../views/modals/partials/name.blade.php | 10 + resources/views/modals/statuslabel.blade.php | 13 +- resources/views/modals/supplier.blade.php | 9 +- resources/views/modals/user.blade.php | 91 +- resources/views/models/bulk-delete.blade.php | 2 +- resources/views/models/bulk-edit.blade.php | 2 +- .../views/models/custom_fields_form.blade.php | 2 +- .../custom_fields_form_bulk_edit.blade.php | 2 +- resources/views/models/view.blade.php | 158 +- .../markdown/asset-reminder.blade.php | 10 +- .../partials/asset-bulk-actions.blade.php | 23 +- .../views/partials/bootstrap-table.blade.php | 36 +- .../forms/checkout-selector.blade.php | 2 +- .../forms/edit/accessory-select.blade.php | 4 +- .../partials/forms/edit/address.blade.php | 9 +- .../forms/edit/asset-select.blade.php | 16 +- .../forms/edit/category-select.blade.php | 4 +- .../partials/forms/edit/category.blade.php | 4 +- .../forms/edit/company-select.blade.php | 6 +- .../partials/forms/edit/company.blade.php | 4 +- .../partials/forms/edit/datepicker.blade.php | 2 +- .../forms/edit/department-select.blade.php | 2 - .../views/partials/forms/edit/email.blade.php | 8 +- .../partials/forms/edit/eol_date.blade.php | 4 +- .../views/partials/forms/edit/fax.blade.php | 2 +- .../partials/forms/edit/item_number.blade.php | 4 +- .../partials/forms/edit/kit-select.blade.php | 4 +- .../forms/edit/license-select.blade.php | 4 +- .../edit/location-profile-select.blade.php | 2 +- .../forms/edit/location-select.blade.php | 6 +- .../partials/forms/edit/location.blade.php | 2 +- .../forms/edit/maintenance_type.blade.php | 4 +- .../forms/edit/manufacturer-select.blade.php | 4 +- .../forms/edit/manufacturer.blade.php | 6 +- .../forms/edit/minimum_quantity.blade.php | 7 +- .../forms/edit/model-select.blade.php | 6 +- .../partials/forms/edit/name-first.blade.php | 14 + .../partials/forms/edit/name-last.blade.php | 14 + .../views/partials/forms/edit/name.blade.php | 4 +- .../forms/edit/order_number.blade.php | 2 +- .../views/partials/forms/edit/phone.blade.php | 2 +- .../forms/edit/purchase_cost.blade.php | 2 +- .../forms/edit/purchase_date.blade.php | 2 +- .../partials/forms/edit/quantity.blade.php | 2 +- .../partials/forms/edit/serial.blade.php | 4 +- .../forms/edit/status-select.blade.php | 4 +- .../partials/forms/edit/status.blade.php | 2 +- .../forms/edit/submit-button.blade.php | 2 +- .../partials/forms/edit/submit.blade.php | 2 +- .../forms/edit/supplier-select.blade.php | 6 +- .../partials/forms/edit/supplier.blade.php | 4 +- .../partials/forms/edit/user-select.blade.php | 4 +- .../partials/forms/edit/username.blade.php | 14 + resources/views/partials/more-info.blade.php | 3 +- .../partials/users-bulk-actions.blade.php | 42 +- resources/views/reports/activity.blade.php | 64 +- resources/views/reports/custom.blade.php | 81 +- resources/views/settings/alerts.blade.php | 25 +- resources/views/settings/asset_tags.blade.php | 6 +- resources/views/settings/backups.blade.php | 75 +- resources/views/settings/barcodes.blade.php | 5 +- resources/views/settings/branding.blade.php | 5 +- resources/views/settings/general.blade.php | 6 +- resources/views/settings/google.blade.php | 5 +- resources/views/settings/index.blade.php | 80 +- resources/views/settings/labels.blade.php | 6 +- resources/views/settings/ldap.blade.php | 514 ++++-- .../views/settings/localization.blade.php | 4 +- resources/views/settings/purge-form.blade.php | 4 +- resources/views/settings/saml.blade.php | 5 +- resources/views/settings/security.blade.php | 10 +- resources/views/setup/user.blade.php | 32 +- resources/views/statuslabels/index.blade.php | 14 +- resources/views/suppliers/view.blade.php | 14 +- resources/views/users/bulk-edit.blade.php | 52 +- .../views/users/confirm-bulk-delete.blade.php | 2 +- resources/views/users/confirm-merge.blade.php | 2 +- resources/views/users/edit.blade.php | 41 +- resources/views/users/print.blade.php | 219 +-- resources/views/users/view.blade.php | 351 ++-- .../views/vendor/mail/html/message.blade.php | 2 +- routes/api.php | 46 +- routes/web.php | 15 +- routes/web/users.php | 6 +- .../TestsFullMultipleCompaniesSupport.php | 8 + .../Concerns/TestsPermissionsRequirement.php | 8 + .../Api/AccessoriesForSelectListTest.php | 59 + .../Accessories/Api/DeleteAccessoriesTest.php | 77 + .../Api/IndexAccessoryCheckoutsTest.php | 84 + .../Accessories/Api/IndexAccessoryTest.php | 70 + .../Accessories/Api/ShowAccessoryTest.php | 61 + .../Accessories/Api/StoreAccessoryTest.php | 98 ++ .../Accessories/Api/UpdateAccessoryTest.php | 106 ++ .../Accessories/Ui/AccessoriesIndexTest.php | 16 + .../Accessories/Ui/CreateAccessoriesTest.php | 82 + ...soryWithFullMultipleCompanySupportTest.php | 37 + .../Api/DeleteAssetMaintenancesTest.php | 70 + .../AssetModels/Api/AssetModelFilesTest.php | 120 ++ .../AssetModels/Api/DeleteAssetModelsTest.php | 45 + .../AssetModels/Ui/UpdateAssetModelsTest.php | 78 +- tests/Feature/Assets/Api/DeleteAssetsTest.php | 71 + tests/Feature/Assets/Api/StoreAssetTest.php | 101 +- ...ssetWithFullMultipleCompanySupportTest.php | 58 + tests/Feature/Assets/Api/UpdateAssetTest.php | 98 +- tests/Feature/Assets/Ui/EditAssetTest.php | 40 +- ...ssetWithFullMultipleCompanySupportTest.php | 35 + .../Categories/Api/DeleteCategoriesTest.php | 46 + .../Checkins/Api/AccessoryCheckinTest.php | 86 + .../Checkins/Ui/AccessoryCheckinTest.php | 30 +- .../Checkouts/Api/AccessoryCheckoutTest.php | 19 +- .../Checkouts/Api/ConsumableCheckoutTest.php | 10 +- .../Checkouts/Ui/AccessoryCheckoutTest.php | 10 +- .../Checkouts/Ui/ConsumableCheckoutTest.php | 10 +- .../Companies/Api/DeleteCompaniesTest.php | 56 + .../Companies/Ui/CreateCompaniesTest.php | 60 + .../Components/Api/DeleteComponentsTest.php | 66 + ...nentWithFullMultipleCompanySupportTest.php | 34 + .../Consumables/Api/DeleteConsumablesTest.php | 66 + ...ableWithFullMultipleCompanySupportTest.php | 33 + .../Api/DeleteCustomFieldsTest.php | 54 + .../Api/DeleteCustomFieldsetsTest.php | 67 + tests/Feature/DashboardTest.php | 40 + .../Departments/Api/DeleteDepartmentsTest.php | 77 + .../Api/DeleteDepreciationsTest.php | 44 + .../Api/DepreciationsIndexTest.php | 17 + .../Ui/DepreciationsIndexTest.php | 23 + tests/Feature/Groups/Api/DeleteGroupsTest.php | 34 + .../Importing/Api/GeneralImportTest.php | 16 + .../Importing/Api/ImportAccessoriesTest.php | 420 +++++ .../Importing/Api/ImportAssetsTest.php | 595 +++++++ .../Importing/Api/ImportComponentsTest.php | 305 ++++ .../Importing/Api/ImportConsumablesTest.php | 305 ++++ .../Importing/Api/ImportDataTestCase.php | 14 + .../Importing/Api/ImportLicenseTest.php | 356 ++++ .../Feature/Importing/Api/ImportUsersTest.php | 336 ++++ .../Licenses/Api/DeleteLicensesTest.php | 90 + ...enseWithFullMultipleCompanySupportTest.php | 34 + tests/Feature/Livewire/ImporterTest.php | 25 + .../Locations/Api/DeleteLocationsTest.php | 24 +- .../Locations/Ui/CreateLocationsTest.php | 16 +- .../Locations/Ui/UpdateLocationsTest.php | 15 + .../Api/DeleteManufacturersTest.php | 64 + .../EmailNotificationsUponCheckinTest.php | 30 +- .../Api/DeletePredefinedKitsTest.php | 59 + tests/Feature/Settings/AlertsSettingTest.php | 16 +- .../Feature/Settings/BrandingSettingsTest.php | 1 - tests/Feature/Settings/LabelSettingTest.php | 18 + tests/Feature/Settings/LdapSettingsTest.php | 62 + .../Feature/Settings/SecuritySettingTest.php | 18 + .../Api/DeleteStatusLabelsTest.php | 47 + .../Suppliers/Api/DeleteSuppliersTest.php | 52 + ...DeleteUserTest.php => DeleteUsersTest.php} | 50 +- tests/Feature/Users/Api/UpdateUserTest.php | 170 +- tests/Feature/Users/Ui/UpdateUserTest.php | 75 + tests/Feature/Users/Ui/ViewUserTest.php | 2 +- tests/Support/CustomTestMacros.php | 21 + .../AccessoriesImportFileBuilder.php | 74 + .../Importing/AssetsImportFileBuilder.php | 92 + .../Support/Importing/CleansUpImportFiles.php | 20 + .../Importing/ComponentsImportFileBuilder.php | 65 + .../ConsumablesImportFileBuilder.php | 65 + tests/Support/Importing/FileBuilder.php | 249 +++ .../Importing/LicensesImportFileBuilder.php | 86 + .../Importing/UsersImportFileBuilder.php | 65 + ...taForFullMultipleCompanySupportTesting.php | 70 + tests/Support/Settings.php | 4 + tests/Unit/AssetTest.php | 2 - .../BladeComponents/IconComponentTest.php | 20 + tests/Unit/LdapTest.php | 2 +- tests/Unit/Listeners/LogListenerTest.php | 4 +- .../Company/GetIdForCurrentUserTest.php | 4 +- tests/Unit/NotificationTest.php | 32 +- upgrade.php | 24 +- 1766 files changed, 23896 insertions(+), 11646 deletions(-) delete mode 100644 .github/stale.yml create mode 100644 .github/workflows/stale.yml mode change 100755 => 100644 app/Console/Commands/LdapSync.php create mode 100644 app/Console/Commands/RemoveExplicitEols.php create mode 100644 app/Helpers/IconHelper.php create mode 100644 app/Http/Controllers/Api/AssetModelFilesController.php create mode 100644 app/Http/Requests/StoreLabelSettings.php create mode 100644 app/Http/Requests/StoreLdapSettings.php create mode 100644 app/Http/Requests/StoreLocalizationSettings.php create mode 100644 app/Http/Requests/StoreNotificationSettings.php create mode 100644 app/Http/Requests/StoreSecuritySettings.php create mode 100644 app/Mail/CheckinAccessoryMail.php create mode 100644 app/Mail/CheckinAssetMail.php create mode 100644 app/Mail/CheckinLicenseMail.php create mode 100644 app/Mail/CheckoutAccessoryMail.php create mode 100644 app/Mail/CheckoutAssetMail.php create mode 100644 app/Mail/CheckoutConsumableMail.php create mode 100644 app/Mail/CheckoutLicenseMail.php create mode 100644 app/Presenters/StatusLabelPresenter.php create mode 100644 app/Rules/AssetCannotBeCheckedOutToNondeployableStatus.php create mode 100644 app/Rules/UserCannotSwitchCompaniesIfItemsAssigned.php create mode 100644 database/factories/ImportFactory.php create mode 100644 database/factories/PredefinedKitFactory.php create mode 100644 database/migrations/2024_09_17_204302_change_user_id_to_created_by.php create mode 100644 database/migrations/2024_10_23_162301_add_manufacturer_id_model_number_to_consumables.php create mode 100644 database/migrations/2024_11_06_211457_add_manager_indexes_to_location_and_user.php create mode 100644 database/migrations/2024_11_07_113631_improve_manager_indexes_on_users_and_locations.php rename docker/{entrypoint_alpine.sh => startup_alpine.sh} (100%) rename docker/{docker-entrypoint.sh => startup_alpine_fpm.sh} (100%) create mode 100644 public/sounds/lock.mp3 create mode 100644 public/vendor/livewire/livewire.esm.js.map create mode 100644 resources/views/blade/filestable.blade.php create mode 100644 resources/views/blade/icon.blade.php rename resources/views/{notifications => mail}/markdown/checkin-accessory.blade.php (100%) rename resources/views/{notifications => mail}/markdown/checkin-asset.blade.php (100%) rename resources/views/{notifications => mail}/markdown/checkin-license.blade.php (54%) rename resources/views/{notifications => mail}/markdown/checkout-accessory.blade.php (100%) rename resources/views/{notifications => mail}/markdown/checkout-asset.blade.php (99%) rename resources/views/{notifications => mail}/markdown/checkout-consumable.blade.php (89%) rename resources/views/{notifications => mail}/markdown/checkout-license.blade.php (68%) create mode 100644 resources/views/modals/partials/categories-select.blade.php create mode 100644 resources/views/modals/partials/fieldset-select.blade.php create mode 100644 resources/views/modals/partials/footer.blade.php create mode 100644 resources/views/modals/partials/manufacturer-select.blade.php create mode 100644 resources/views/modals/partials/model-number.blade.php create mode 100644 resources/views/modals/partials/name.blade.php create mode 100644 resources/views/partials/forms/edit/name-first.blade.php create mode 100644 resources/views/partials/forms/edit/name-last.blade.php create mode 100644 resources/views/partials/forms/edit/username.blade.php create mode 100644 tests/Concerns/TestsFullMultipleCompaniesSupport.php create mode 100644 tests/Concerns/TestsPermissionsRequirement.php create mode 100644 tests/Feature/Accessories/Api/AccessoriesForSelectListTest.php create mode 100644 tests/Feature/Accessories/Api/DeleteAccessoriesTest.php create mode 100644 tests/Feature/Accessories/Api/IndexAccessoryCheckoutsTest.php create mode 100644 tests/Feature/Accessories/Api/IndexAccessoryTest.php create mode 100644 tests/Feature/Accessories/Api/ShowAccessoryTest.php create mode 100644 tests/Feature/Accessories/Api/StoreAccessoryTest.php create mode 100644 tests/Feature/Accessories/Api/UpdateAccessoryTest.php create mode 100644 tests/Feature/Accessories/Ui/AccessoriesIndexTest.php create mode 100644 tests/Feature/Accessories/Ui/CreateAccessoriesTest.php create mode 100644 tests/Feature/Accessories/Ui/CreateAccessoryWithFullMultipleCompanySupportTest.php create mode 100644 tests/Feature/AssetMaintenances/Api/DeleteAssetMaintenancesTest.php create mode 100644 tests/Feature/AssetModels/Api/AssetModelFilesTest.php create mode 100644 tests/Feature/AssetModels/Api/DeleteAssetModelsTest.php create mode 100644 tests/Feature/Assets/Api/DeleteAssetsTest.php create mode 100644 tests/Feature/Assets/Api/StoreAssetWithFullMultipleCompanySupportTest.php create mode 100644 tests/Feature/Assets/Ui/StoreAssetWithFullMultipleCompanySupportTest.php create mode 100644 tests/Feature/Categories/Api/DeleteCategoriesTest.php create mode 100644 tests/Feature/Checkins/Api/AccessoryCheckinTest.php create mode 100644 tests/Feature/Companies/Api/DeleteCompaniesTest.php create mode 100644 tests/Feature/Companies/Ui/CreateCompaniesTest.php create mode 100644 tests/Feature/Components/Api/DeleteComponentsTest.php create mode 100644 tests/Feature/Components/Ui/StoreComponentWithFullMultipleCompanySupportTest.php create mode 100644 tests/Feature/Consumables/Api/DeleteConsumablesTest.php create mode 100644 tests/Feature/Consumables/Ui/StoreConsumableWithFullMultipleCompanySupportTest.php create mode 100644 tests/Feature/CustomFields/Api/DeleteCustomFieldsTest.php create mode 100644 tests/Feature/CustomFieldsets/Api/DeleteCustomFieldsetsTest.php create mode 100644 tests/Feature/Departments/Api/DeleteDepartmentsTest.php create mode 100644 tests/Feature/Depreciations/Api/DeleteDepreciationsTest.php create mode 100644 tests/Feature/Depreciations/Api/DepreciationsIndexTest.php create mode 100644 tests/Feature/Depreciations/Ui/DepreciationsIndexTest.php create mode 100644 tests/Feature/Groups/Api/DeleteGroupsTest.php create mode 100644 tests/Feature/Importing/Api/GeneralImportTest.php create mode 100644 tests/Feature/Importing/Api/ImportAccessoriesTest.php create mode 100644 tests/Feature/Importing/Api/ImportAssetsTest.php create mode 100644 tests/Feature/Importing/Api/ImportComponentsTest.php create mode 100644 tests/Feature/Importing/Api/ImportConsumablesTest.php create mode 100644 tests/Feature/Importing/Api/ImportDataTestCase.php create mode 100644 tests/Feature/Importing/Api/ImportLicenseTest.php create mode 100644 tests/Feature/Importing/Api/ImportUsersTest.php create mode 100644 tests/Feature/Licenses/Api/DeleteLicensesTest.php create mode 100644 tests/Feature/Licenses/Ui/StoreLicenseWithFullMultipleCompanySupportTest.php create mode 100644 tests/Feature/Livewire/ImporterTest.php create mode 100644 tests/Feature/Manufacturers/Api/DeleteManufacturersTest.php create mode 100644 tests/Feature/PredefinedKits/Api/DeletePredefinedKitsTest.php create mode 100644 tests/Feature/Settings/LabelSettingTest.php create mode 100644 tests/Feature/Settings/LdapSettingsTest.php create mode 100644 tests/Feature/Settings/SecuritySettingTest.php create mode 100644 tests/Feature/StatusLabels/Api/DeleteStatusLabelsTest.php create mode 100644 tests/Feature/Suppliers/Api/DeleteSuppliersTest.php rename tests/Feature/Users/Api/{DeleteUserTest.php => DeleteUsersTest.php} (85%) create mode 100644 tests/Support/Importing/AccessoriesImportFileBuilder.php create mode 100644 tests/Support/Importing/AssetsImportFileBuilder.php create mode 100644 tests/Support/Importing/CleansUpImportFiles.php create mode 100644 tests/Support/Importing/ComponentsImportFileBuilder.php create mode 100644 tests/Support/Importing/ConsumablesImportFileBuilder.php create mode 100644 tests/Support/Importing/FileBuilder.php create mode 100644 tests/Support/Importing/LicensesImportFileBuilder.php create mode 100644 tests/Support/Importing/UsersImportFileBuilder.php create mode 100644 tests/Support/ProvidesDataForFullMultipleCompanySupportTesting.php create mode 100644 tests/Unit/BladeComponents/IconComponentTest.php diff --git a/.all-contributorsrc b/.all-contributorsrc index 68aec85323..8ea582b9b4 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -3190,6 +3190,33 @@ "contributions": [ "code" ] + }, + { + "login": "Scarzy", + "name": "Scarzy", + "avatar_url": "https://avatars.githubusercontent.com/u/1197791?v=4", + "profile": "https://github.com/Scarzy", + "contributions": [ + "code" + ] + }, + { + "login": "setpill", + "name": "setpill", + "avatar_url": "https://avatars.githubusercontent.com/u/37372069?v=4", + "profile": "https://github.com/setpill", + "contributions": [ + "code" + ] + }, + { + "login": "swift2512", + "name": "swift2512", + "avatar_url": "https://avatars.githubusercontent.com/u/3755203?v=4", + "profile": "https://github.com/swift2512", + "contributions": [ + "bug" + ] } ] } diff --git a/.env.dev.docker b/.env.dev.docker index 7b9e2000cf..983063bbd1 100644 --- a/.env.dev.docker +++ b/.env.dev.docker @@ -1,6 +1,8 @@ # -------------------------------------------- # REQUIRED: DB SETUP # -------------------------------------------- +# https://mariadb.com/kb/en/mariadb-server-docker-official-image-environment-variables/ + MYSQL_DATABASE=snipeit MYSQL_USER=snipeit MYSQL_PASSWORD=changeme1234 diff --git a/.env.docker b/.env.docker index 9e50383014..4865f8e13a 100644 --- a/.env.docker +++ b/.env.docker @@ -97,7 +97,7 @@ API_TOKEN_EXPIRATION_YEARS=40 # -------------------------------------------- # OPTIONAL: SECURITY HEADER SETTINGS # -------------------------------------------- -APP_TRUSTED_PROXIES=192.168.1.1,10.0.0.1,172.0.0.0/8 +APP_TRUSTED_PROXIES=192.168.1.1,10.0.0.1,172.16.0.0/12 ALLOW_IFRAMING=false REFERRER_POLICY=same-origin ENABLE_CSP=false diff --git a/.env.example b/.env.example index 426af4ff88..3bfee7bf24 100644 --- a/.env.example +++ b/.env.example @@ -32,6 +32,8 @@ DB_PREFIX=null DB_DUMP_PATH='/usr/bin' DB_CHARSET=utf8mb4 DB_COLLATION=utf8mb4_unicode_ci +DB_SANITIZE_BY_DEFAULT=false + # -------------------------------------------- # OPTIONAL: SSL DATABASE SETTINGS diff --git a/.github/stale.yml b/.github/stale.yml deleted file mode 100644 index 53acc282e4..0000000000 --- a/.github/stale.yml +++ /dev/null @@ -1,43 +0,0 @@ -# Number of days of inactivity before an issue becomes stale -daysUntilStale: 60 -# Number of days of inactivity before a stale issue is closed -daysUntilClose: 7 -# Issues with these labels will never be considered stale -exemptLabels: - - pinned - - security - - :woman_technologist: ready for dev - - :moneybag: bounty - - :hand: bug - - "🔐 security" - - "👩‍💻 ready for dev" - - "💰 bounty" - - "✋ bug" - -exemptMilestones: true - -# Label to use when marking an issue as stale -staleLabel: stale - -only: issues - -# Comment to post when removing the stale label. -unmarkComment: > - Okay, it looks like this issue or feature request might still be important. We'll re-open - it for now. Thank you for letting us know! - -# Comment to post when marking an issue as stale. Set to `false` to disable -markComment: > - Is this still relevant? We haven't heard from anyone in a bit. If so, - please comment with any updates or additional detail. - - This issue has been automatically marked as stale because it has not had - recent activity. It will be closed if no further activity occurs. Don't - take it personally, we just need to keep a handle on things. Thank you - for your contributions! -# Comment to post when closing a stale issue. Set to `false` to disable -closeComment: > - This issue has been automatically closed because it has not had - recent activity. If you believe this is still an issue, please confirm that - this issue is still happening in the most recent version of Snipe-IT and reply - to this thread to re-open it. diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 0000000000..5a4042aee4 --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,40 @@ +name: 'Close stale issues' +on: + schedule: + - cron: '30 1 * * *' + +jobs: + stale: + runs-on: ubuntu-latest + permissions: + # contents: write # only for delete-branch option + issues: write + # pull-requests: write + steps: + - uses: actions/stale@v9 + with: + debug-only: true + ascending: true + operations-per-run: 1000 # just while we're debugging + repo-token: ${{ secrets.GITHUB_TOKEN }} + days-before-stale: 60 + days-before-close: 7 + exempt-all-milestones: true + stale-issue-message: > + Is this still relevant? We haven't heard from anyone in a bit. If so, + please comment with any updates or additional detail. + + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Don't + take it personally, we just need to keep a handle on things. Thank you + for your contributions! + close-issue-message: > + This issue has been automatically closed because it has not had + recent activity. If you believe this is still an issue, please confirm that + this issue is still happening in the most recent version of Snipe-IT and reply + to this thread to re-open it. + # There doesn't seem to be a 'reopen issue message'? + # Since there is no 'stale-pr-message' - PR's should not be stale'd + stale-issue-label: stale + exempt-issue-labels: > + pinned,security,:woman_technologist: ready for dev,:moneybag: bounty,:hand: bug,🔐 security,👩‍💻 ready for dev,💰 bounty,✋ bug \ No newline at end of file diff --git a/.github/workflows/tests-mysql.yml b/.github/workflows/tests-mysql.yml index 737a86dca3..310414cda6 100644 --- a/.github/workflows/tests-mysql.yml +++ b/.github/workflows/tests-mysql.yml @@ -76,4 +76,4 @@ jobs: DB_DATABASE: snipeit DB_PORT: ${{ job.services.mysql.ports[3306] }} DB_USERNAME: root - run: php artisan test --parallel + run: php artisan test diff --git a/.github/workflows/tests-postgres.yml b/.github/workflows/tests-postgres.yml index 0c361511b8..ae48277be3 100644 --- a/.github/workflows/tests-postgres.yml +++ b/.github/workflows/tests-postgres.yml @@ -74,4 +74,4 @@ jobs: DB_PORT: ${{ job.services.postgresql.ports[5432] }} DB_USERNAME: snipeit DB_PASSWORD: password - run: php artisan test --parallel + run: php artisan test diff --git a/.github/workflows/tests-sqlite.yml b/.github/workflows/tests-sqlite.yml index 49c7c92d8e..8bf0115169 100644 --- a/.github/workflows/tests-sqlite.yml +++ b/.github/workflows/tests-sqlite.yml @@ -58,4 +58,4 @@ jobs: - name: Execute tests (Unit and Feature tests) via PHPUnit env: DB_CONNECTION: sqlite_testing - run: php artisan test --parallel + run: php artisan test diff --git a/.gitignore b/.gitignore index 0715ac0495..17a7d28dab 100755 --- a/.gitignore +++ b/.gitignore @@ -47,6 +47,7 @@ storage/private_uploads/users/* tests/_data/scenarios tests/_output/* tests/_support/_generated/* +tests/coverage/* /npm-debug.log /storage/oauth-private.key /storage/oauth-public.key diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 6359814b49..f821c1f17f 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -52,7 +52,7 @@ Thanks goes to all of these wonderful people ([emoji key](https://github.com/ken | [
bilias](https://github.com/bilias)
[💻](https://github.com/snipe/snipe-it/commits?author=bilias "Code") | [
coach1988](https://github.com/coach1988)
[💻](https://github.com/snipe/snipe-it/commits?author=coach1988 "Code") | [
MrM](https://github.com/mauro-miatello)
[💻](https://github.com/snipe/snipe-it/commits?author=mauro-miatello "Code") | [
koiakoia](https://github.com/koiakoia)
[💻](https://github.com/snipe/snipe-it/commits?author=koiakoia "Code") | [
Mustafa Online](https://github.com/mustafa-online)
[💻](https://github.com/snipe/snipe-it/commits?author=mustafa-online "Code") | [
franceslui](https://github.com/franceslui)
[💻](https://github.com/snipe/snipe-it/commits?author=franceslui "Code") | [
Q4kK](https://github.com/Q4kK)
[💻](https://github.com/snipe/snipe-it/commits?author=Q4kK "Code") | | [
squintfox](https://github.com/squintfox)
[💻](https://github.com/snipe/snipe-it/commits?author=squintfox "Code") | [
Jeff Clay](https://github.com/jeffclay)
[💻](https://github.com/snipe/snipe-it/commits?author=jeffclay "Code") | [
Phil J R](https://github.com/PP-JN-RL)
[💻](https://github.com/snipe/snipe-it/commits?author=PP-JN-RL "Code") | [
i_virus](https://www.corelight.com/)
[💻](https://github.com/snipe/snipe-it/commits?author=chandanchowdhury "Code") | [
Paul Grime](https://github.com/gitgrimbo)
[💻](https://github.com/snipe/snipe-it/commits?author=gitgrimbo "Code") | [
Lee Porte](https://leeporte.co.uk)
[💻](https://github.com/snipe/snipe-it/commits?author=LeePorte "Code") | [
BRYAN ](https://github.com/bryanlopezinc)
[💻](https://github.com/snipe/snipe-it/commits?author=bryanlopezinc "Code") [⚠️](https://github.com/snipe/snipe-it/commits?author=bryanlopezinc "Tests") | | [
U-H-T](https://github.com/U-H-T)
[💻](https://github.com/snipe/snipe-it/commits?author=U-H-T "Code") | [
Matt Tyree](https://github.com/Tyree)
[📖](https://github.com/snipe/snipe-it/commits?author=Tyree "Documentation") | [
Florent Bervas](http://spoontux.net)
[💻](https://github.com/snipe/snipe-it/commits?author=FlorentDotMe "Code") | [
Daniel Albertsen](https://ditscheri.com)
[💻](https://github.com/snipe/snipe-it/commits?author=dbakan "Code") | [
r-xyz](https://github.com/r-xyz)
[💻](https://github.com/snipe/snipe-it/commits?author=r-xyz "Code") | [
Steven Mainor](https://github.com/DrekiDegga)
[💻](https://github.com/snipe/snipe-it/commits?author=DrekiDegga "Code") | [
arne-kroeger](https://github.com/arne-kroeger)
[💻](https://github.com/snipe/snipe-it/commits?author=arne-kroeger "Code") | -| [
Glukose1](https://github.com/Glukose1)
[💻](https://github.com/snipe/snipe-it/commits?author=Glukose1 "Code") | +| [
Glukose1](https://github.com/Glukose1)
[💻](https://github.com/snipe/snipe-it/commits?author=Glukose1 "Code") | [
Scarzy](https://github.com/Scarzy)
[💻](https://github.com/snipe/snipe-it/commits?author=Scarzy "Code") | [
setpill](https://github.com/setpill)
[💻](https://github.com/snipe/snipe-it/commits?author=setpill "Code") | [
swift2512](https://github.com/swift2512)
[🐛](https://github.com/snipe/snipe-it/issues?q=author%3Aswift2512 "Bug reports") | This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind welcome! diff --git a/Dockerfile.alpine b/Dockerfile.alpine index c08cbbd95c..2c83a1a119 100644 --- a/Dockerfile.alpine +++ b/Dockerfile.alpine @@ -79,12 +79,12 @@ USER root VOLUME ["/var/lib/snipeit"] -# Entrypoints -COPY docker/entrypoint_alpine.sh /entrypoint.sh -RUN chmod +x /entrypoint.sh +# Startup script +COPY docker/startup_alpine.sh /startup.sh +RUN chmod +x /startup.sh ENTRYPOINT ["/sbin/tini", "--"] -CMD ["/entrypoint.sh"] +CMD ["/startup.sh"] EXPOSE 80 diff --git a/Dockerfile.fpm-alpine b/Dockerfile.fpm-alpine index 77302524d4..b7fb272985 100644 --- a/Dockerfile.fpm-alpine +++ b/Dockerfile.fpm-alpine @@ -97,7 +97,7 @@ RUN set -eux; \ VOLUME [ "/var/lib/snipeit" ] COPY --chown=www-data:www-data docker/docker-secrets.env /var/www/html/.env -COPY --chmod=655 docker/docker-entrypoint.sh /usr/local/bin/docker-snipeit-entrypoint +COPY --chmod=655 docker/startup_alpine_fpm.sh /startup.sh COPY docker/column-statistics.cnf /etc/mysql/conf.d/column-statistics.cnf -ENTRYPOINT [ "/usr/local/bin/docker-snipeit-entrypoint" ] -CMD [ "/usr/local/bin/docker-php-entrypoint", "php-fpm" ] +ENTRYPOINT [ "/startup.sh" ] +CMD [ "/startup.sh", "php-fpm" ] diff --git a/README.md b/README.md index 0086c7b327..e0f4154f6c 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,11 @@ Since the release of the JSON REST API, several third-party developers have been ### Contributing -Please see the documentation on [contributing and developing for Snipe-IT](https://snipe-it.readme.io/docs/contributing-overview). +Please refrain from submitting issues or pull requests generated by fully-automated tools. Maintainers reserve the right, at their sole discretion, to close such submissions and to block any account responsible for them. + +Ideally, contributions should follow from a human-to-human discussion in the form of an issue. + +Please see the complete 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. diff --git a/app/Console/Commands/LdapSync.php b/app/Console/Commands/LdapSync.php old mode 100755 new mode 100644 index 845db27ef9..9f4281bd46 --- a/app/Console/Commands/LdapSync.php +++ b/app/Console/Commands/LdapSync.php @@ -53,18 +53,22 @@ class LdapSync extends Command ini_set('max_execution_time', env('LDAP_TIME_LIM', 600)); //600 seconds = 10 minutes ini_set('memory_limit', env('LDAP_MEM_LIM', '500M')); - $ldap_result_username = Setting::getSettings()->ldap_username_field; - $ldap_result_last_name = Setting::getSettings()->ldap_lname_field; - $ldap_result_first_name = Setting::getSettings()->ldap_fname_field; - $ldap_result_active_flag = Setting::getSettings()->ldap_active_flag; - $ldap_result_emp_num = Setting::getSettings()->ldap_emp_num; - $ldap_result_email = Setting::getSettings()->ldap_email; - $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_map = [ + "username" => Setting::getSettings()->ldap_username_field, + "last_name" => Setting::getSettings()->ldap_lname_field, + "first_name" => Setting::getSettings()->ldap_fname_field, + "active_flag" => Setting::getSettings()->ldap_active_flag, + "emp_num" => Setting::getSettings()->ldap_emp_num, + "email" => Setting::getSettings()->ldap_email, + "phone" => Setting::getSettings()->ldap_phone_field, + "jobtitle" => Setting::getSettings()->ldap_jobtitle, + "country" => Setting::getSettings()->ldap_country, + "location" => Setting::getSettings()->ldap_location, + "dept" => Setting::getSettings()->ldap_dept, + "manager" => Setting::getSettings()->ldap_manager, + ]; + $ldap_default_group = Setting::getSettings()->ldap_default_group; $search_base = Setting::getSettings()->ldap_base_dn; @@ -107,14 +111,21 @@ class LdapSync extends Command } /** - * If a filter has been specified, use that + * If a filter has been specified, use that, otherwise default to null */ if ($this->option('filter') != '') { - $results = Ldap::findLdapUsers($search_base, -1, $this->option('filter')); + $filter = $this->option('filter'); } else { - $results = Ldap::findLdapUsers($search_base); + $filter = null; } - + + /** + * We only need to request the LDAP attributes that we process + */ + $attributes = array_values(array_filter($ldap_map)); + + $results = Ldap::findLdapUsers($search_base, -1, $filter, $attributes); + } catch (\Exception $e) { if ($this->option('json_summary')) { $json_summary = ['error' => true, 'error_message' => $e->getMessage(), 'summary' => []]; @@ -126,23 +137,24 @@ 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 + $default_location = null; if ($this->option('location') != '') { - if ($location = Location::where('name', '=', $this->option('location'))->first()) { + if ($default_location = Location::where('name', '=', $this->option('location'))->first()) { Log::debug('Location name ' . $this->option('location') . ' passed'); - Log::debug('Importing to ' . $location->name . ' (' . $location->id . ')'); + Log::debug('Importing to '.$default_location->name.' ('.$default_location->id.')'); } } elseif ($this->option('location_id')) { + //TODO - figure out how or why this is an array? foreach($this->option('location_id') as $location_id) { - if ($location = Location::where('id', '=', $location_id)->first()) { + if ($default_location = Location::where('id', '=', $location_id)->first()) { Log::debug('Location ID ' . $location_id . ' passed'); - Log::debug('Importing to ' . $location->name . ' (' . $location->id . ')'); + Log::debug('Importing to '.$default_location->name.' ('.$default_location->id.')'); } } } - if (! isset($location)) { + if (!isset($default_location)) { Log::debug('That location is invalid or a location was not provided, so no location will be assigned by default.'); } @@ -183,17 +195,17 @@ class LdapSync extends Command } $usernames = []; for ($i = 0; $i < $location_users['count']; $i++) { - if (array_key_exists($ldap_result_username, $location_users[$i])) { + if (array_key_exists($ldap_map["username"], $location_users[$i])) { $location_users[$i]['ldap_location_override'] = true; $location_users[$i]['location_id'] = $ldap_loc['id']; - $usernames[] = $location_users[$i][$ldap_result_username][0]; + $usernames[] = $location_users[$i][$ldap_map["username"]][0]; } } // Delete located users from the general group. foreach ($results as $key => $generic_entry) { - if ((is_array($generic_entry)) && (array_key_exists($ldap_result_username, $generic_entry))) { - if (in_array($generic_entry[$ldap_result_username][0], $usernames)) { + if ((is_array($generic_entry)) && (array_key_exists($ldap_map["username"], $generic_entry))) { + if (in_array($generic_entry[$ldap_map["username"]][0], $usernames)) { unset($results[$key]); } } @@ -218,77 +230,78 @@ class LdapSync extends Command for ($i = 0; $i < $results['count']; $i++) { - $item = []; - $item['username'] = $results[$i][$ldap_result_username][0] ?? ''; - $item['employee_number'] = $results[$i][$ldap_result_emp_num][0] ?? ''; - $item['lastname'] = $results[$i][$ldap_result_last_name][0] ?? ''; - $item['firstname'] = $results[$i][$ldap_result_first_name][0] ?? ''; - $item['email'] = $results[$i][$ldap_result_email][0] ?? ''; - $item['ldap_location_override'] = $results[$i]['ldap_location_override'] ?? ''; - $item['location_id'] = $results[$i]['location_id'] ?? ''; - $item['telephone'] = $results[$i][$ldap_result_phone][0] ?? ''; - $item['jobtitle'] = $results[$i][$ldap_result_jobtitle][0] ?? ''; - $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] ?? ''; + $item = []; + $item['username'] = $results[$i][$ldap_map["username"]][0] ?? ''; + $item['employee_number'] = $results[$i][$ldap_map["emp_num"]][0] ?? ''; + $item['lastname'] = $results[$i][$ldap_map["last_name"]][0] ?? ''; + $item['firstname'] = $results[$i][$ldap_map["first_name"]][0] ?? ''; + $item['email'] = $results[$i][$ldap_map["email"]][0] ?? ''; + $item['ldap_location_override'] = $results[$i]['ldap_location_override'] ?? ''; + $item['location_id'] = $results[$i]['location_id'] ?? ''; + $item['telephone'] = $results[$i][$ldap_map["phone"]][0] ?? ''; + $item['jobtitle'] = $results[$i][$ldap_map["jobtitle"]][0] ?? ''; + $item['country'] = $results[$i][$ldap_map["country"]][0] ?? ''; + $item['department'] = $results[$i][$ldap_map["dept"]][0] ?? ''; + $item['manager'] = $results[$i][$ldap_map["manager"]][0] ?? ''; + $item['location'] = $results[$i][$ldap_map["location"]][0] ?? ''; + $location = $default_location; //initially, set '$location' to the default_location (which may just be `null`) - // 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'], + // ONLY if you are using the "ldap_location" option *AND* you have an actual result + if ($ldap_map["location"] && $item['location']) { + $location = Location::firstOrCreate([ + 'name' => $item['location'], ]); + } + $department = Department::firstOrCreate([ + 'name' => $item['department'], + ]); - $user = User::where('username', $item['username'])->first(); - if ($user) { - // Updating an existing user. - $item['createorupdate'] = 'updated'; - } else { - // Creating a new user. - $user = new User; - $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 = User::where('username', $item['username'])->first(); + if ($user) { + // Updating an existing user. + $item['createorupdate'] = 'updated'; + } else { + // Creating a new user. + $user = new User; + $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'; + } //If a sync option is not filled in on the LDAP settings don't populate the user field - if($ldap_result_username != null){ + if($ldap_map["username"] != null){ $user->username = $item['username']; } - if($ldap_result_last_name != null){ + if($ldap_map["last_name"] != null){ $user->last_name = $item['lastname']; } - if($ldap_result_first_name != null){ + if($ldap_map["first_name"] != null){ $user->first_name = $item['firstname']; } - if($ldap_result_emp_num != null){ + if($ldap_map["emp_num"] != null){ $user->employee_num = e($item['employee_number']); } - if($ldap_result_email != null){ + if($ldap_map["email"] != null){ $user->email = $item['email']; } - if($ldap_result_phone != null){ + if($ldap_map["phone"] != null){ $user->phone = $item['telephone']; } - if($ldap_result_jobtitle != null){ + if($ldap_map["jobtitle"] != null){ $user->jobtitle = $item['jobtitle']; } - if($ldap_result_country != null){ + if($ldap_map["country"] != null){ $user->country = $item['country']; } - if($ldap_result_dept != null){ + if($ldap_map["dept"] != null){ $user->department_id = $department->id; } - if($ldap_result_location != null){ - $user->location_id = $location ? $location->id : null; + if($ldap_map["location"] != null){ + $user->location_id = $location?->id; } - if($ldap_result_manager != null){ + if($ldap_map["manager"] != null){ if($item['manager'] != null) { // Check Cache first if (isset($manager_cache[$item['manager']])) { @@ -305,7 +318,7 @@ class LdapSync extends Command $ldap_manager = [ "count" => 1, 0 => [ - $ldap_result_username => [$item['manager']] + $ldap_map["username"] => [$item['manager']] ] ]; } @@ -314,7 +327,7 @@ class LdapSync extends Command // Get the Manager's username // PHP LDAP returns every LDAP attribute as an array, and 90% of the time it's an array of just one item. But, hey, it's an array. - $ldapManagerUsername = $ldap_manager[0][$ldap_result_username][0]; + $ldapManagerUsername = $ldap_manager[0][$ldap_map["username"]][0]; // Get User from Manager username. $ldap_manager = User::where('username', $ldapManagerUsername)->first(); @@ -330,38 +343,38 @@ class LdapSync extends Command } } - // Sync activated state for Active Directory. - if ( !empty($ldap_result_active_flag)) { // IF we have an 'active' flag set.... - // ....then *most* things that are truthy will activate the user. Anything falsey will deactivate them. - // (Specifically, we don't handle a value of '0.0' correctly) - $raw_value = @$results[$i][$ldap_result_active_flag][0]; - $filter_var = filter_var($raw_value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE); - $boolean_cast = (bool)$raw_value; + // Sync activated state for Active Directory. + if (!empty($ldap_map["active_flag"])) { // IF we have an 'active' flag set.... + // ....then *most* things that are truthy will activate the user. Anything falsey will deactivate them. + // (Specifically, we don't handle a value of '0.0' correctly) + $raw_value = @$results[$i][$ldap_map["active_flag"]][0]; + $filter_var = filter_var($raw_value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE); + $boolean_cast = (bool) $raw_value; - $user->activated = $filter_var ?? $boolean_cast; // if filter_var() was true or false, use that. If it's null, use the $boolean_cast + $user->activated = $filter_var ?? $boolean_cast; // if filter_var() was true or false, use that. If it's null, use the $boolean_cast - } elseif (array_key_exists('useraccountcontrol', $results[$i]) ) { - // ....otherwise, (ie if no 'active' LDAP flag is defined), IF the UAC setting exists, - // ....then use the UAC setting on the account to determine can-log-in vs. cannot-log-in + } elseif (array_key_exists('useraccountcontrol', $results[$i])) { + // ....otherwise, (ie if no 'active' LDAP flag is defined), IF the UAC setting exists, + // ....then use the UAC setting on the account to determine can-log-in vs. cannot-log-in - /* The following is _probably_ the correct logic, but we can't use it because - some users may have been dependent upon the previous behavior, and this - could cause additional access to be available to users they don't want - to allow to log in. + /* The following is _probably_ the correct logic, but we can't use it because + some users may have been dependent upon the previous behavior, and this + could cause additional access to be available to users they don't want + to allow to log in. - $useraccountcontrol = $results[$i]['useraccountcontrol'][0]; - if( - // based on MS docs at: https://support.microsoft.com/en-us/help/305144/how-to-use-useraccountcontrol-to-manipulate-user-account-properties - ($useraccountcontrol & 0x200) && // is a NORMAL_ACCOUNT - !($useraccountcontrol & 0x02) && // *and* _not_ ACCOUNTDISABLE - !($useraccountcontrol & 0x10) // *and* _not_ LOCKOUT - ) { - $user->activated = 1; - } else { - $user->activated = 0; - } */ - $enabled_accounts = [ + $useraccountcontrol = $results[$i]['useraccountcontrol'][0]; + if( + // based on MS docs at: https://support.microsoft.com/en-us/help/305144/how-to-use-useraccountcontrol-to-manipulate-user-account-properties + ($useraccountcontrol & 0x200) && // is a NORMAL_ACCOUNT + !($useraccountcontrol & 0x02) && // *and* _not_ ACCOUNTDISABLE + !($useraccountcontrol & 0x10) // *and* _not_ LOCKOUT + ) { + $user->activated = 1; + } else { + $user->activated = 0; + } */ + $enabled_accounts = [ '512', // 0x200 NORMAL_ACCOUNT '544', // 0x220 NORMAL_ACCOUNT, PASSWD_NOTREQD '66048', // 0x10200 NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD @@ -374,44 +387,47 @@ class LdapSync extends Command '4260352', // 0x410200 NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD, DONT_REQ_PREAUTH '1049088', // 0x100200 NORMAL_ACCOUNT, NOT_DELEGATED '1114624', // 0x110200 NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD, NOT_DELEGATED, - ]; - $user->activated = (in_array($results[$i]['useraccountcontrol'][0], $enabled_accounts)) ? 1 : 0; + ]; + $user->activated = (in_array($results[$i]['useraccountcontrol'][0], $enabled_accounts)) ? 1 : 0; // If we're not using AD, and there isn't an activated flag set, activate all users - } /* implied 'else' here - leave the $user->activated flag alone. Newly-created accounts will be active. - already-existing accounts will be however the administrator has set them */ + } /* implied 'else' here - leave the $user->activated flag alone. Newly-created accounts will be active. + already-existing accounts will be however the administrator has set them */ - if ($item['ldap_location_override'] == true) { - $user->location_id = $item['location_id']; - } elseif ((isset($location)) && (! empty($location))) { - if ((is_array($location)) && (array_key_exists('id', $location))) { - $user->location_id = $location['id']; - } elseif (is_object($location)) { - $user->location_id = $location->id; - } + if ($item['ldap_location_override'] == true) { + $user->location_id = $item['location_id']; + } elseif ((isset($location)) && (!empty($location))) { + if ((is_array($location)) && (array_key_exists('id', $location))) { + $user->location_id = $location['id']; + } elseif (is_object($location)) { + $user->location_id = $location->id; //THIS is the magic line, this should do it. } - $location = null; - $user->ldap_import = 1; + } + // TODO - should we be NULLING locations if $location is really `null`, and that's what we came up with? + // will that conflict with any overriding setting that the user set? Like, if they moved someone from + // the 'null' location to somewhere, we wouldn't want to try to override that, right? + $location = null; + $user->ldap_import = 1; - $errors = ''; + $errors = ''; - if ($user->save()) { - $item['note'] = $item['createorupdate']; - $item['status'] = 'success'; - if ( $item['createorupdate'] === 'created' && $ldap_default_group) { - $user->groups()->attach($ldap_default_group); - } - - } else { - foreach ($user->getErrors()->getMessages() as $key => $err) { - $errors .= $err[0]; - } - $item['note'] = $errors; - $item['status'] = 'error'; + if ($user->save()) { + $item['note'] = $item['createorupdate']; + $item['status'] = 'success'; + if ($item['createorupdate'] === 'created' && $ldap_default_group) { + $user->groups()->attach($ldap_default_group); } - array_push($summary, $item); + } else { + foreach ($user->getErrors()->getMessages() as $key => $err) { + $errors .= $err[0]; + } + $item['note'] = $errors; + $item['status'] = 'error'; + } + + array_push($summary, $item); } if ($this->option('summary')) { diff --git a/app/Console/Commands/ObjectImportCommand.php b/app/Console/Commands/ObjectImportCommand.php index 8370e7c050..a1202ded89 100644 --- a/app/Console/Commands/ObjectImportCommand.php +++ b/app/Console/Commands/ObjectImportCommand.php @@ -6,6 +6,7 @@ use Illuminate\Console\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputOption; use Illuminate\Support\Facades\Log; +use Symfony\Component\Console\Helper\ProgressIndicator; ini_set('max_execution_time', env('IMPORT_TIME_LIMIT', 600)); //600 seconds = 10 minutes ini_set('memory_limit', env('IMPORT_MEMORY_LIMIT', '500M')); @@ -29,6 +30,11 @@ class ObjectImportCommand extends Command */ protected $description = 'Import Items from CSV'; + /** + * The progress indicator instance. + */ + protected ProgressIndicator $progressIndicator; + /** * Create a new command instance. * @@ -39,8 +45,6 @@ class ObjectImportCommand extends Command parent::__construct(); } - private $bar; - /** * Execute the console command. * @@ -48,6 +52,8 @@ class ObjectImportCommand extends Command */ public function handle() { + $this->progressIndicator = new ProgressIndicator($this->output); + $filename = $this->argument('filename'); $class = title_case($this->option('item-type')); $classString = "App\\Importer\\{$class}Importer"; @@ -61,46 +67,25 @@ class ObjectImportCommand extends Command // This $logFile/useFiles() bit is currently broken, so commenting it out for now // $logFile = $this->option('logfile'); // Log::useFiles($logFile); - $this->comment('======= Importing Items from '.$filename.' ========='); + $this->progressIndicator->start('======= Importing Items from '.$filename.' ========='); + $importer->import(); - $this->bar = null; - - if (! empty($this->errors)) { - $this->comment('The following Errors were encountered.'); - foreach ($this->errors as $asset => $error) { - $this->comment('Error: Item: '.$asset.' failed validation: '.json_encode($error)); - } - } else { - $this->comment('All Items imported successfully!'); - } - $this->comment(''); + $this->progressIndicator->finish('Import finished.'); } - public function errorCallback($item, $field, $errorString) + public function errorCallback($item, $field, $error) { - $this->errors[$item->name][$field] = $errorString; + $this->output->write("\x0D\x1B[2K"); + + $this->warn('Error: Item: '.$item->name.' failed validation: '.json_encode($error)); } - public function progress($count) + public function progress($importedItemsCount) { - if (! $this->bar) { - $this->bar = $this->output->createProgressBar($count); - } - static $index = 0; - $index++; - if ($index < $count) { - $this->bar->advance(); - } else { - $this->bar->finish(); - } + $this->progressIndicator->advance(); } - // Tracks the current item for error messages - private $updating; - // An array of errors encountered while parsing - private $errors; - /** * Log a message to file, configurable by the --log-file parameter. * If a warning message is passed, we'll spit it to the console as well. diff --git a/app/Console/Commands/RemoveExplicitEols.php b/app/Console/Commands/RemoveExplicitEols.php new file mode 100644 index 0000000000..f5164c2ee0 --- /dev/null +++ b/app/Console/Commands/RemoveExplicitEols.php @@ -0,0 +1,60 @@ +option('model_name') == 'all') { + $assets = Asset::all(); + $this->updateAssets($assets); + } else { + $assetModel = AssetModel::where('name', '=', $this->option('model_name'))->first(); + + if ($assetModel) { + $assets = Asset::where('model_id', '=', $assetModel->id)->get(); + $this->updateAssets($assets); + } else { + $this->error('Asset model not found'); + } + } + $endTime = microtime(true); + $executionTime = ($endTime - $startTime); + $this->info('Command executed in ' . round($executionTime, 2) . ' seconds.'); + } + + private function updateAssets($assets) + { + foreach ($assets as $asset) { + $asset->eol_explicit = 0; + $asset->asset_eol_date = null; + $asset->save(); + } + + $this->info($assets->count() . ' Assets updated successfully'); + } +} diff --git a/app/Console/Commands/SendAcceptanceReminder.php b/app/Console/Commands/SendAcceptanceReminder.php index dd9e59f611..1551348046 100644 --- a/app/Console/Commands/SendAcceptanceReminder.php +++ b/app/Console/Commands/SendAcceptanceReminder.php @@ -47,7 +47,8 @@ class SendAcceptanceReminder extends Command { $pending = CheckoutAcceptance::pending()->where('checkoutable_type', 'App\Models\Asset') ->whereHas('checkoutable', function($query) { - $query->where('archived', 0); + $query->where('accepted_at', null) + ->where('declined_at', null); }) ->with(['assignedTo', 'checkoutable.assignedTo', 'checkoutable.model', 'checkoutable.adminuser']) ->get(); diff --git a/app/Helpers/Helper.php b/app/Helpers/Helper.php index 18e149b57d..95a344dce9 100644 --- a/app/Helpers/Helper.php +++ b/app/Helpers/Helper.php @@ -16,6 +16,7 @@ use Illuminate\Support\Facades\Crypt; use Illuminate\Contracts\Encryption\DecryptException; use Carbon\Carbon; use Illuminate\Support\Facades\Log; +use Illuminate\Support\Str; use Intervention\Image\ImageManagerStatic as Image; use Illuminate\Support\Facades\Session; @@ -708,6 +709,28 @@ class Helper return $randomString; } + /** + * A method to be used to handle deprecations notifications, currently handling MS Teams. more can be added when needed. + * + * + * @author [Godfrey Martinez] + * @since [v7.0.14] + * @return array + */ + public static function deprecationCheck() : array { + // The check and message that the user is still using the deprecated version + $deprecations = [ + 'ms_teams_deprecated' => array( + 'check' => !Str::contains(Setting::getSettings()->webhook_endpoint, 'workflows'), + 'message' => 'The Microsoft Teams webhook URL being used will be deprecated Jan 31st, 2025. Change webhook endpoint'), + ]; + + // if item of concern is being used and its being used with the deprecated values return the notification array. + if(Setting::getSettings()->webhook_selected === 'microsoft' && $deprecations['ms_teams_deprecated']['check']) { + return $deprecations; + } + return []; + } /** * This nasty little method gets the low inventory info for the @@ -1123,6 +1146,7 @@ class Helper 'png' => 'far fa-image', 'webp' => 'far fa-image', 'avif' => 'far fa-image', + 'svg' => 'fas fa-vector-square', // word 'doc' => 'far fa-file-word', 'docx' => 'far fa-file-word', @@ -1135,7 +1159,7 @@ class Helper //Text 'txt' => 'far fa-file-alt', 'rtf' => 'far fa-file-alt', - 'xml' => 'far fa-file-alt', + 'xml' => 'fas fa-code', // Misc 'pdf' => 'far fa-file-pdf', 'lic' => 'far fa-save', @@ -1148,41 +1172,7 @@ class Helper return 'far fa-file'; } - public static function show_file_inline($filename) - { - $extension = substr(strrchr($filename, '.'), 1); - if ($extension) { - switch ($extension) { - case 'jpg': - case 'jpeg': - case 'gif': - case 'png': - case 'webp': - case 'avif': - return true; - break; - default: - return false; - } - } - - return false; - } - - /** - * Generate a random encrypted password. - * - * @author Wes Hulette - * - * @since 5.0.0 - * - * @return string - */ - public static function generateEncyrptedPassword(): string - { - return bcrypt(self::generateUnencryptedPassword()); - } /** * Get a random unencrypted password. diff --git a/app/Helpers/IconHelper.php b/app/Helpers/IconHelper.php new file mode 100644 index 0000000000..b56871f832 --- /dev/null +++ b/app/Helpers/IconHelper.php @@ -0,0 +1,190 @@ +download($filename); } } + + + /** + * This determines the file types that should be allowed inline and checks their fileinfo extension + * to determine that they are safe to display inline. + * + * @author [ + * @since v7.0.14 + * @param $file_with_path + * @return bool + */ + public static function allowSafeInline($file_with_path) { + + $allowed_inline = [ + 'pdf', + 'svg', + 'jpg', + 'gif', + 'svg', + 'avif', + 'webp', + 'png', + ]; + + + // The file exists and is allowed to be displayed inline + if (Storage::exists($file_with_path) && (in_array(pathinfo($file_with_path, PATHINFO_EXTENSION), $allowed_inline))) { + return true; + } + return false; + + } + + /** + * Decide whether to show the file inline or download it. + */ + public static function showOrDownloadFile($file, $filename) { + + $headers = []; + + if (request('inline') == 'true') { + + $headers = [ + 'Content-Disposition' => 'inline', + ]; + + // This is NOT allowed as inline - force it to be displayed as text in the browser + if (self::allowSafeInline($file) != true) { + $headers = array_merge($headers, ['Content-Type' => 'text/plain']); + } + } + + // Everything else seems okay, but the file doesn't exist on the server. + if (Storage::missing($file)) { + throw new FileNotFoundException(); + } + + return Storage::download($file, $filename, $headers); + + } } diff --git a/app/Http/Controllers/Accessories/AccessoriesController.php b/app/Http/Controllers/Accessories/AccessoriesController.php index 4fd5a4c547..8c66c9a3b2 100755 --- a/app/Http/Controllers/Accessories/AccessoriesController.php +++ b/app/Http/Controllers/Accessories/AccessoriesController.php @@ -73,7 +73,7 @@ class AccessoriesController extends Controller $accessory->purchase_date = request('purchase_date'); $accessory->purchase_cost = request('purchase_cost'); $accessory->qty = request('qty'); - $accessory->user_id = auth()->id(); + $accessory->created_by = auth()->id(); $accessory->supplier_id = request('supplier_id'); $accessory->notes = request('notes'); diff --git a/app/Http/Controllers/Accessories/AccessoriesFilesController.php b/app/Http/Controllers/Accessories/AccessoriesFilesController.php index b63c202d30..ebc1e4b8e0 100644 --- a/app/Http/Controllers/Accessories/AccessoriesFilesController.php +++ b/app/Http/Controllers/Accessories/AccessoriesFilesController.php @@ -106,50 +106,29 @@ class AccessoriesFilesController extends Controller * @param int $accessoryId * @param int $fileId */ - public function show($accessoryId = null, $fileId = null, $download = true) : View | RedirectResponse | Response | BinaryFileResponse | StreamedResponse + public function show($accessoryId = null, $fileId = null) : View | RedirectResponse | Response | BinaryFileResponse | StreamedResponse { - Log::debug('Private filesystem is: '.config('filesystems.default')); - $accessory = Accessory::find($accessoryId); - - // the accessory is valid - if (isset($accessory->id)) { + if ($accessory = Accessory::find($accessoryId)) { $this->authorize('view', $accessory); $this->authorize('accessories.files', $accessory); - 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')); - } + if ($log = Actionlog::whereNotNull('filename')->where('item_id', $accessory->id)->find($fileId)) { + $file = 'private_uploads/accessories/'.$log->filename; - $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)); - - 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); + try { + return StorageHelper::showOrDownloadFile($file, $log->filename); + } catch (\Exception $e) { + return redirect()->route('accessories.show', ['accessory' => $accessory])->with('error', trans('general.file_not_found')); } } + + return redirect()->route('accessories.show', ['accessory' => $accessory])->with('error', trans('general.log_record_not_found')); + } - return redirect()->route('accessories.index')->with('error', trans('general.file_does_not_exist', ['id' => $fileId])); + return redirect()->route('accessories.index')->with('error', trans('general.file_not_found')); } } diff --git a/app/Http/Controllers/Accessories/AccessoryCheckoutController.php b/app/Http/Controllers/Accessories/AccessoryCheckoutController.php index 03fb6ac250..2417f16567 100644 --- a/app/Http/Controllers/Accessories/AccessoryCheckoutController.php +++ b/app/Http/Controllers/Accessories/AccessoryCheckoutController.php @@ -78,7 +78,7 @@ class AccessoryCheckoutController extends Controller AccessoryCheckout::create([ 'accessory_id' => $accessory->id, 'created_at' => Carbon::now(), - 'user_id' => Auth::id(), + 'created_by' => auth()->id(), 'assigned_to' => $target->id, 'assigned_type' => $target::class, 'note' => $request->input('note'), diff --git a/app/Http/Controllers/Account/AcceptanceController.php b/app/Http/Controllers/Account/AcceptanceController.php index 6d84861fb0..278d7e2081 100644 --- a/app/Http/Controllers/Account/AcceptanceController.php +++ b/app/Http/Controllers/Account/AcceptanceController.php @@ -237,7 +237,11 @@ class AcceptanceController extends Controller } $acceptance->accept($sig_filename, $item->getEula(), $pdf_filename, $request->input('note')); - $acceptance->notify(new AcceptanceAssetAcceptedNotification($data)); + try { + $acceptance->notify(new AcceptanceAssetAcceptedNotification($data)); + } catch (\Exception $e) { + Log::warning($e); + } event(new CheckoutAccepted($acceptance)); $return_msg = trans('admin/users/message.accepted'); @@ -334,4 +338,5 @@ class AcceptanceController extends Controller return redirect()->to('account/accept')->with('success', $return_msg); } + } diff --git a/app/Http/Controllers/ActionlogController.php b/app/Http/Controllers/ActionlogController.php index f143c4b73b..7f86bff964 100644 --- a/app/Http/Controllers/ActionlogController.php +++ b/app/Http/Controllers/ActionlogController.php @@ -37,10 +37,18 @@ class ActionlogController extends Controller } } - public function getStoredEula($filename) : Response | BinaryFileResponse + public function getStoredEula($filename) : Response | BinaryFileResponse | RedirectResponse { $this->authorize('view', \App\Models\Asset::class); $file = config('app.private_uploads').'/eula-pdfs/'.$filename; - return response()->download($file); + + if (Storage::exists($file)) { + return response()->download($file); + } + + return redirect()->back()->with('error', trans('general.file_does_not_exist')); + + + } } diff --git a/app/Http/Controllers/Api/AccessoriesController.php b/app/Http/Controllers/Api/AccessoriesController.php index b1506e4f40..d1ef72bcca 100644 --- a/app/Http/Controllers/Api/AccessoriesController.php +++ b/app/Http/Controllers/Api/AccessoriesController.php @@ -56,8 +56,9 @@ class AccessoriesController extends Controller ]; - $accessories = Accessory::select('accessories.*')->with('category', 'company', 'manufacturer', 'checkouts', 'location', 'supplier') - ->withCount('checkouts as checkouts_count'); + $accessories = Accessory::select('accessories.*') + ->with('category', 'company', 'manufacturer', 'checkouts', 'location', 'supplier', 'adminuser') + ->withCount('checkouts as checkouts_count'); if ($request->filled('search')) { $accessories = $accessories->TextSearch($request->input('search')); @@ -110,7 +111,10 @@ class AccessoriesController extends Controller break; case 'supplier': $accessories = $accessories->OrderSupplier($order); - break; + break; + case 'created_by': + $accessories = $accessories->OrderByCreatedByName($order); + break; default: $accessories = $accessories->orderBy($column_sort, $order); break; @@ -133,7 +137,6 @@ class AccessoriesController extends Controller */ public function store(StoreAccessoryRequest $request) { - $this->authorize('create', Accessory::class); $accessory = new Accessory; $accessory->fill($request->all()); $accessory = $request->handleImages($accessory); @@ -193,9 +196,6 @@ class AccessoriesController extends Controller $this->authorize('view', Accessory::class); $accessory = Accessory::with('lastCheckout')->findOrFail($id); - if (! Company::isCurrentUserHasAccess($accessory)) { - return ['total' => 0, 'rows' => []]; - } $offset = request('offset', 0); $limit = request('limit', 50); @@ -287,7 +287,7 @@ class AccessoriesController extends Controller AccessoryCheckout::create([ 'accessory_id' => $accessory->id, 'created_at' => Carbon::now(), - 'user_id' => Auth::id(), + 'created_by' => auth()->id(), 'assigned_to' => $target->id, 'assigned_type' => $target::class, 'note' => $request->input('note'), @@ -321,7 +321,7 @@ class AccessoriesController extends Controller $accessory = Accessory::find($accessory_checkout->accessory_id); $this->authorize('checkin', $accessory); - $logaction = $accessory->logCheckin(User::find($accessory_checkout->assigned_to), $request->input('note')); + $accessory->logCheckin(User::find($accessory_checkout->assigned_to), $request->input('note')); // Was the accessory updated? if ($accessory_checkout->delete()) { @@ -329,14 +329,6 @@ class AccessoriesController extends Controller $user = User::find($accessory_checkout->assigned_to); } - $data['log_id'] = $logaction->id; - $data['first_name'] = $user->first_name; - $data['last_name'] = $user->last_name; - $data['item_name'] = $accessory->name; - $data['checkin_date'] = $logaction->created_at; - $data['item_tag'] = ''; - $data['note'] = $logaction->note; - return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/accessories/message.checkin.success'))); } diff --git a/app/Http/Controllers/Api/AssetMaintenancesController.php b/app/Http/Controllers/Api/AssetMaintenancesController.php index ac247a8873..3e02a56195 100644 --- a/app/Http/Controllers/Api/AssetMaintenancesController.php +++ b/app/Http/Controllers/Api/AssetMaintenancesController.php @@ -34,7 +34,7 @@ class AssetMaintenancesController extends Controller $this->authorize('view', Asset::class); $maintenances = AssetMaintenance::select('asset_maintenances.*') - ->with('asset', 'asset.model', 'asset.location', 'asset.defaultLoc', 'supplier', 'asset.company', 'asset.assetstatus', 'admin'); + ->with('asset', 'asset.model', 'asset.location', 'asset.defaultLoc', 'supplier', 'asset.company', 'asset.assetstatus', 'adminuser'); if ($request->filled('search')) { $maintenances = $maintenances->TextSearch($request->input('search')); @@ -48,6 +48,10 @@ class AssetMaintenancesController extends Controller $maintenances->where('asset_maintenances.supplier_id', '=', $request->input('supplier_id')); } + if ($request->filled('created_by')) { + $maintenances->where('asset_maintenances.created_by', '=', $request->input('created_by')); + } + if ($request->filled('asset_maintenance_type')) { $maintenances->where('asset_maintenance_type', '=', $request->input('asset_maintenance_type')); } @@ -69,7 +73,7 @@ class AssetMaintenancesController extends Controller 'asset_tag', 'asset_name', 'serial', - 'user_id', + 'created_by', 'supplier', 'is_warranty', 'status_label', @@ -79,8 +83,8 @@ class AssetMaintenancesController extends Controller $sort = in_array($request->input('sort'), $allowed_columns) ? e($request->input('sort')) : 'created_at'; switch ($sort) { - case 'user_id': - $maintenances = $maintenances->OrderAdmin($order); + case 'created_by': + $maintenances = $maintenances->OrderByCreatedBy($order); break; case 'supplier': $maintenances = $maintenances->OrderBySupplier($order); @@ -124,7 +128,7 @@ class AssetMaintenancesController extends Controller // create a new model instance $maintenance = new AssetMaintenance(); $maintenance->fill($request->all()); - $maintenance->user_id = Auth::id(); + $maintenance->created_by = auth()->id(); // Was the asset maintenance created? if ($maintenance->save()) { @@ -186,11 +190,8 @@ class AssetMaintenancesController extends Controller { $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 delete a maintenance for that asset')); - } + $assetMaintenance = AssetMaintenance::findOrFail($assetMaintenanceId); $assetMaintenance->delete(); diff --git a/app/Http/Controllers/Api/AssetModelFilesController.php b/app/Http/Controllers/Api/AssetModelFilesController.php new file mode 100644 index 0000000000..90d283f72e --- /dev/null +++ b/app/Http/Controllers/Api/AssetModelFilesController.php @@ -0,0 +1,200 @@ + + * + * @version v1.0 + * @author [T. Scarsbrook] [] + */ +class AssetModelFilesController extends Controller +{ + /** + * Accepts a POST to upload a file to the server. + * + * @param \App\Http\Requests\UploadFileRequest $request + * @param int $assetModelId + * @since [v7.0.12] + * @author [r-xyz] + */ + public function store(UploadFileRequest $request, $assetModelId = null) : JsonResponse + { + // Start by checking if the asset being acted upon exists + if (! $assetModel = AssetModel::find($assetModelId)) { + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/models/message.does_not_exist')), 404); + } + + // Make sure we are allowed to update this asset + $this->authorize('update', $assetModel); + + if ($request->hasFile('file')) { + // If the file storage directory doesn't exist; create it + if (! Storage::exists('private_uploads/assetmodels')) { + Storage::makeDirectory('private_uploads/assetmodels', 775); + } + + // Loop over the attached files and add them to the asset + foreach ($request->file('file') as $file) { + $file_name = $request->handleFile('private_uploads/assetmodels/','model-'.$assetModel->id, $file); + + $assetModel->logUpload($file_name, e($request->get('notes'))); + } + + // All done - report success + return response()->json(Helper::formatStandardApiResponse('success', $assetModel, trans('admin/models/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/models/message.upload.nofiles')), 500); + } + + /** + * List the files for an asset. + * + * @param int $assetModelId + * @since [v7.0.12] + * @author [r-xyz] + */ + public function list($assetModelId = null) : JsonResponse + { + // Start by checking if the asset being acted upon exists + if (! $assetModel = AssetModel::find($assetModelId)) { + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/models/message.does_not_exist')), 404); + } + + // the asset is valid + if (isset($assetModel->id)) { + $this->authorize('view', $assetModel); + + // Check that there are some uploads on this asset that can be listed + if ($assetModel->uploads->count() > 0) { + $files = array(); + foreach ($assetModel->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/models/message.upload.success'))); + } + + // There are no files. + return response()->json(Helper::formatStandardApiResponse('success', array(), trans('admin/models/message.upload.success'))); + } + + // Send back an error message + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/models/message.download.error')), 500); + } + + /** + * Check for permissions and display the file. + * + * @param int $assetModelId + * @param int $fileId + * @return \Illuminate\Http\JsonResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + * @since [v7.0.12] + * @author [r-xyz] + */ + public function show($assetModelId = null, $fileId = null) : JsonResponse | StreamedResponse | Storage | StorageHelper | BinaryFileResponse + { + // Start by checking if the asset being acted upon exists + if (! $assetModel = AssetModel::find($assetModelId)) { + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/models/message.does_not_exist')), 404); + } + + // the asset is valid + if (isset($assetModel->id)) { + $this->authorize('view', $assetModel); + + // Check that the file being requested exists for the asset + if (! $log = Actionlog::whereNotNull('filename')->where('item_id', $assetModel->id)->find($fileId)) { + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/models/message.download.no_match', ['id' => $fileId])), 404); + } + + // Form the full filename with path + $file = 'private_uploads/assetmodels/'.$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/models/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/models/message.download.error', ['id' => $fileId])), 500); + } + + /** + * Delete the associated file + * + * @param int $assetModelId + * @param int $fileId + * @since [v7.0.12] + * @author [r-xyz] + */ + public function destroy($assetModelId = null, $fileId = null) : JsonResponse + { + // Start by checking if the asset being acted upon exists + if (! $assetModel = AssetModel::find($assetModelId)) { + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/models/message.does_not_exist')), 404); + } + + $rel_path = 'private_uploads/assetmodels'; + + // the asset is valid + if (isset($assetModel->id)) { + $this->authorize('update', $assetModel); + + // 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/models/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/models/message.deletefile.error')), 500); + } + + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/models/message.deletefile.error')), 500); + } +} diff --git a/app/Http/Controllers/Api/AssetModelsController.php b/app/Http/Controllers/Api/AssetModelsController.php index 835f4d22e0..e1ae0c12d3 100644 --- a/app/Http/Controllers/Api/AssetModelsController.php +++ b/app/Http/Controllers/Api/AssetModelsController.php @@ -48,6 +48,8 @@ class AssetModelsController extends Controller 'assets_count', 'category', 'fieldset', + 'deleted_at', + 'updated_at', ]; $assetmodels = AssetModel::select([ @@ -67,7 +69,7 @@ class AssetModelsController extends Controller 'models.deleted_at', 'models.updated_at', ]) - ->with('category', 'depreciation', 'manufacturer', 'fieldset.fields.defaultValues') + ->with('category', 'depreciation', 'manufacturer', 'fieldset.fields.defaultValues','adminuser') ->withCount('assets as assets_count'); if ($request->input('status')=='deleted') { @@ -78,6 +80,10 @@ class AssetModelsController extends Controller $assetmodels = $assetmodels->where('models.category_id', '=', $request->input('category_id')); } + if ($request->filled('depreciation_id')) { + $assetmodels = $assetmodels->where('models.depreciation_id', '=', $request->input('depreciation_id')); + } + if ($request->filled('search')) { $assetmodels->TextSearch($request->input('search')); } diff --git a/app/Http/Controllers/Api/AssetsController.php b/app/Http/Controllers/Api/AssetsController.php index 855bc51268..d4a103be37 100644 --- a/app/Http/Controllers/Api/AssetsController.php +++ b/app/Http/Controllers/Api/AssetsController.php @@ -56,6 +56,11 @@ class AssetsController extends Controller public function index(Request $request, $action = null, $upcoming_status = null) : JsonResponse | array { + + // This handles the legacy audit endpoints :( + if ($action == 'audit') { + $action = 'audits'; + } $filter_non_deprecable_assets = false; /** @@ -121,7 +126,7 @@ class AssetsController extends Controller } $assets = Asset::select('assets.*') - ->with('location', 'assetstatus', 'company', 'defaultLoc','assignedTo', + ->with('location', 'assetstatus', 'company', 'defaultLoc','assignedTo', 'adminuser','model.depreciation', 'model.category', 'model.manufacturer', 'model.fieldset','supplier'); //it might be tempting to add 'assetlog' here, but don't. It blows up update-heavy users. @@ -154,8 +159,8 @@ class AssetsController extends Controller * Handle due and overdue audits and checkin dates */ switch ($action) { - case 'audits': - + // Audit (singular) is left over from earlier legacy APIs + case 'audits' : switch ($upcoming_status) { case 'due': $assets->DueForAudit($settings); @@ -371,8 +376,33 @@ class AssetsController extends Controller case 'assigned_to': $assets->OrderAssigned($order); break; + case 'created_by': + $assets->OrderByCreatedByName($order); + break; default: - $assets->orderBy($column_sort, $order); + $numeric_sort = false; + + // Search through the custom fields array to see if we're sorting on a custom field + if (array_search($column_sort, $all_custom_fields->pluck('db_column')->toArray()) !== false) { + + // Check to see if this is a numeric field type + foreach ($all_custom_fields as $field) { + if (($field->db_column == $sort_override) && ($field->format == 'NUMERIC')) { + $numeric_sort = true; + break; + } + } + + // This may not work for all databases, but it works for MySQL + if ($numeric_sort) { + $assets->orderByRaw(DB::getTablePrefix() . 'assets.' . $sort_override . ' * 1 ' . $order); + } else { + $assets->orderBy($sort_override, $order); + } + + } else { + $assets->orderBy($column_sort, $order); + } break; } @@ -568,7 +598,7 @@ class AssetsController extends Controller $asset->model()->associate(AssetModel::find((int) $request->get('model_id'))); $asset->fill($request->validated()); - $asset->user_id = Auth::id(); + $asset->created_by = auth()->id(); /** * this is here just legacy reasons. Api\AssetController @@ -602,7 +632,7 @@ class AssetsController extends Controller if ($field->field_encrypted == '1') { Log::debug('This model field is encrypted in this fieldset.'); - if (Gate::allows('admin')) { + if (Gate::allows('assets.view.encrypted_custom_fields')) { // If input value is null, use custom field's default value if (($field_val == null) && ($request->has('model_id') != '')) { @@ -695,7 +725,7 @@ class AssetsController extends Controller } } if ($field->field_encrypted == '1') { - if (Gate::allows('admin')) { + if (Gate::allows('assets.view.encrypted_custom_fields')) { $field_val = Crypt::encrypt($field_val); } else { $problems_updating_encrypted_custom_fields = true; @@ -750,9 +780,16 @@ class AssetsController extends Controller if ($asset = Asset::find($id)) { $this->authorize('delete', $asset); - DB::table('assets') - ->where('id', $asset->id) - ->update(['assigned_to' => null]); + if ($asset->assignedTo) { + + $target = $asset->assignedTo; + $checkin_at = date('Y-m-d H:i:s'); + $originalValues = $asset->getRawOriginal(); + event(new CheckoutableCheckedIn($asset, $target, auth()->user(), 'Checkin on delete', $checkin_at, $originalValues)); + DB::table('assets') + ->where('id', $asset->id) + ->update(['assigned_to' => null]); + } $asset->delete(); diff --git a/app/Http/Controllers/Api/CategoriesController.php b/app/Http/Controllers/Api/CategoriesController.php index 6e9866f90b..e772bec4df 100644 --- a/app/Http/Controllers/Api/CategoriesController.php +++ b/app/Http/Controllers/Api/CategoriesController.php @@ -43,6 +43,7 @@ class CategoriesController extends Controller $categories = Category::select([ 'id', + 'created_by', 'created_at', 'updated_at', 'name', 'category_type', @@ -50,8 +51,10 @@ class CategoriesController extends Controller 'eula_text', 'require_acceptance', 'checkin_email', - 'image' - ])->withCount('accessories as accessories_count', 'consumables as consumables_count', 'components as components_count', 'licenses as licenses_count'); + 'image', + ]) + ->with('adminuser') + ->withCount('accessories as accessories_count', 'consumables as consumables_count', 'components as components_count', 'licenses as licenses_count'); /* @@ -91,13 +94,33 @@ class CategoriesController extends Controller $categories->where('checkin_email', '=', $request->input('checkin_email')); } + if ($request->filled('created_by')) { + $categories->where('created_by', '=', $request->input('created_by')); + } + + if ($request->filled('created_at')) { + $categories->where('created_at', '=', $request->input('created_at')); + } + + if ($request->filled('updated_at')) { + $categories->where('updated_at', '=', $request->input('updated_at')); + } + // Make sure the offset and limit are actually integers and do not exceed system limits $offset = ($request->input('offset') > $categories->count()) ? $categories->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') : 'assets_count'; - $categories->orderBy($sort, $order); + $sort_override = $request->input('sort'); + $column_sort = in_array($sort_override, $allowed_columns) ? $sort_override : 'assets_count'; + + switch ($sort_override) { + case 'created_by': + $categories = $categories->OrderByCreatedBy($order); + break; + default: + $categories = $categories->orderBy($column_sort, $order); + break; + } $total = $categories->count(); $categories = $categories->skip($offset)->take($limit)->get(); diff --git a/app/Http/Controllers/Api/CompaniesController.php b/app/Http/Controllers/Api/CompaniesController.php index 0d78df9acc..5ba342db33 100644 --- a/app/Http/Controllers/Api/CompaniesController.php +++ b/app/Http/Controllers/Api/CompaniesController.php @@ -42,7 +42,7 @@ class CompaniesController extends Controller $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'); + }])->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'); if ($request->filled('search')) { $companies->TextSearch($request->input('search')); @@ -56,17 +56,29 @@ class CompaniesController extends Controller $companies->where('email', '=', $request->input('email')); } + if ($request->filled('created_by')) { + $companies->where('created_by', '=', $request->input('created_by')); + } + // 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'; - $companies->orderBy($sort, $order); + $sort_override = $request->input('sort'); + $column_sort = in_array($sort_override, $allowed_columns) ? $sort_override : 'created_at'; + + switch ($sort_override) { + case 'created_by': + $companies = $companies->OrderByCreatedBy($order); + break; + default: + $companies = $companies->orderBy($column_sort, $order); + break; + } $total = $companies->count(); + $companies = $companies->skip($offset)->take($limit)->get(); return (new CompaniesTransformer)->transformCompanies($companies, $total); diff --git a/app/Http/Controllers/Api/ComponentsController.php b/app/Http/Controllers/Api/ComponentsController.php index 69bd828487..8ee5b80e83 100644 --- a/app/Http/Controllers/Api/ComponentsController.php +++ b/app/Http/Controllers/Api/ComponentsController.php @@ -38,6 +38,7 @@ class ComponentsController extends Controller 'name', 'min_amt', 'order_number', + 'model_number', 'serial', 'purchase_date', 'purchase_cost', @@ -47,7 +48,7 @@ class ComponentsController extends Controller ]; $components = Component::select('components.*') - ->with('company', 'location', 'category', 'assets', 'supplier'); + ->with('company', 'location', 'category', 'assets', 'supplier', 'adminuser', 'manufacturer'); if ($request->filled('search')) { $components = $components->TextSearch($request->input('search')); @@ -69,6 +70,14 @@ class ComponentsController extends Controller $components->where('supplier_id', '=', $request->input('supplier_id')); } + if ($request->filled('manufacturer_id')) { + $components->where('manufacturer_id', '=', $request->input('manufacturer_id')); + } + + if ($request->filled('model_number')) { + $components->where('model_number', '=', $request->input('model_number')); + } + if ($request->filled('location_id')) { $components->where('location_id', '=', $request->input('location_id')); } @@ -98,6 +107,12 @@ class ComponentsController extends Controller case 'supplier': $components = $components->OrderSupplier($order); break; + case 'manufacturer': + $components = $components->OrderManufacturer($order); + break; + case 'created_by': + $components = $components->OrderByCreatedBy($order); + break; default: $components = $components->orderBy($column_sort, $order); break; @@ -270,7 +285,7 @@ class ComponentsController extends Controller 'component_id' => $component->id, 'created_at' => Carbon::now(), 'assigned_qty' => $request->get('assigned_qty', 1), - 'user_id' => auth()->id(), + 'created_by' => auth()->id(), 'asset_id' => $request->get('assigned_to'), 'note' => $request->get('note'), ]); diff --git a/app/Http/Controllers/Api/ConsumablesController.php b/app/Http/Controllers/Api/ConsumablesController.php index 1665b7f4f0..7ff676c7be 100644 --- a/app/Http/Controllers/Api/ConsumablesController.php +++ b/app/Http/Controllers/Api/ConsumablesController.php @@ -86,9 +86,15 @@ class ConsumablesController extends Controller case 'company': $consumables = $consumables->OrderCompany($order); break; + case 'remaining': + $consumables = $consumables->OrderRemaining($order); + break; case 'supplier': $consumables = $consumables->OrderSupplier($order); break; + case 'created_by': + $consumables = $consumables->OrderByCreatedBy($order); + break; default: // 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. @@ -207,7 +213,7 @@ class ConsumablesController extends Controller $consumable = Consumable::with(['consumableAssignments'=> function ($query) { $query->orderBy($query->getModel()->getTable().'.created_at', 'DESC'); }, - 'consumableAssignments.admin'=> function ($query) { + 'consumableAssignments.adminuser'=> function ($query) { }, 'consumableAssignments.user'=> function ($query) { }, @@ -225,7 +231,8 @@ class ConsumablesController extends Controller 'name' => ($consumable_assignment->user) ? $consumable_assignment->user->present()->nameUrl() : 'Deleted User', 'created_at' => Helper::getFormattedDateObject($consumable_assignment->created_at, 'datetime'), 'note' => ($consumable_assignment->note) ? e($consumable_assignment->note) : null, - 'admin' => ($consumable_assignment->admin) ? $consumable_assignment->admin->present()->nameUrl() : null, + 'admin' => ($consumable_assignment->adminuser) ? $consumable_assignment->adminuser->present()->nameUrl() : null, // legacy, so we don't change the shape of the response + 'created_by' => ($consumable_assignment->adminuser) ? $consumable_assignment->adminuser->present()->nameUrl() : null, ]; } @@ -251,6 +258,8 @@ class ConsumablesController extends Controller $this->authorize('checkout', $consumable); + $consumable->checkout_qty = $request->input('checkout_qty', 1); + // 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'))); @@ -261,6 +270,12 @@ class ConsumablesController extends Controller return response()->json(Helper::formatStandardApiResponse('error', null, trans('general.invalid_item_category_single', ['type' => trans('general.consumable')]))); } + // Make sure there is at least one available to checkout + if ($consumable->numRemaining() <= 0 || $consumable->checkout_qty > $consumable->numRemaining()) { + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/consumables/message.checkout.unavailable', ['requested' => $consumable->checkout_qty, 'remaining' => $consumable->numRemaining() ]))); + } + + // Check if the user exists - @TODO: this should probably be handled via validation, not here?? if (!$user = User::find($request->input('assigned_to'))) { @@ -271,14 +286,17 @@ class ConsumablesController extends Controller // Update the consumable data $consumable->assigned_to = $request->input('assigned_to'); - $consumable->users()->attach($consumable->id, + for ($i = 0; $i < $consumable->checkout_qty; $i++) { + $consumable->users()->attach($consumable->id, [ 'consumable_id' => $consumable->id, - 'user_id' => $user->id, + 'created_by' => $user->id, 'assigned_to' => $request->input('assigned_to'), 'note' => $request->input('note'), ] ); + } + event(new CheckoutableCheckedOut($consumable, $user, auth()->user(), $request->input('note'))); diff --git a/app/Http/Controllers/Api/DepartmentsController.php b/app/Http/Controllers/Api/DepartmentsController.php index eabc79ec2b..e337360cd7 100644 --- a/app/Http/Controllers/Api/DepartmentsController.php +++ b/app/Http/Controllers/Api/DepartmentsController.php @@ -97,7 +97,7 @@ class DepartmentsController extends Controller $department->fill($request->all()); $department = $request->handleImages($department); - $department->user_id = auth()->id(); + $department->created_by = auth()->id(); $department->manager_id = ($request->filled('manager_id') ? $request->input('manager_id') : null); if ($department->save()) { diff --git a/app/Http/Controllers/Api/DepreciationsController.php b/app/Http/Controllers/Api/DepreciationsController.php index 0209eae392..254a72c98e 100644 --- a/app/Http/Controllers/Api/DepreciationsController.php +++ b/app/Http/Controllers/Api/DepreciationsController.php @@ -20,9 +20,23 @@ class DepreciationsController extends Controller public function index(Request $request) : JsonResponse | array { $this->authorize('view', Depreciation::class); - $allowed_columns = ['id','name','months','depreciation_min', 'depreciation_type','created_at']; + $allowed_columns = [ + 'id', + 'name', + 'months', + 'depreciation_min', + 'depreciation_type', + 'created_at', + 'assets_count', + 'models_count', + 'licenses_count', + ]; - $depreciations = Depreciation::select('id','name','months','depreciation_min','depreciation_type','user_id','created_at','updated_at'); + $depreciations = Depreciation::select('id','name','months','depreciation_min','depreciation_type','created_at','updated_at', 'created_by') + ->with('adminuser') + ->withCount('assets as assets_count') + ->withCount('models as models_count') + ->withCount('licenses as licenses_count'); if ($request->filled('search')) { $depreciations = $depreciations->TextSearch($request->input('search')); @@ -31,10 +45,18 @@ class DepreciationsController extends Controller // 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'; - $depreciations->orderBy($sort, $order); + $sort_override = $request->input('sort'); + $column_sort = in_array($sort_override, $allowed_columns) ? $sort_override : 'created_at'; + + switch ($sort_override) { + case 'created_by': + $depreciations = $depreciations->OrderByCreatedBy($order); + break; + default: + $depreciations = $depreciations->orderBy($column_sort, $order); + break; + } $total = $depreciations->count(); $depreciations = $depreciations->skip($offset)->take($limit)->get(); diff --git a/app/Http/Controllers/Api/GroupsController.php b/app/Http/Controllers/Api/GroupsController.php index 878650c718..81217ce8db 100644 --- a/app/Http/Controllers/Api/GroupsController.php +++ b/app/Http/Controllers/Api/GroupsController.php @@ -23,9 +23,8 @@ class GroupsController extends Controller $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', 'created_by')->with('admin')->withCount('users as users_count'); + $groups = Group::select('id', 'name', 'permissions', 'created_at', 'updated_at', 'created_by')->with('adminuser')->withCount('users as users_count'); if ($request->filled('search')) { $groups = $groups->TextSearch($request->input('search')); @@ -35,13 +34,29 @@ class GroupsController extends Controller $groups->where('name', '=', $request->input('name')); } - // 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'; - $groups->orderBy($sort, $order); + + switch ($request->input('sort')) { + case 'created_by': + $groups = $groups->OrderByCreatedBy($order); + break; + default: + // 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', + 'created_at', + 'users_count', + ]; + + $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; + $groups = $groups->orderBy($sort, $order); + break; + } $total = $groups->count(); $groups = $groups->skip($offset)->take($limit)->get(); diff --git a/app/Http/Controllers/Api/LicenseSeatsController.php b/app/Http/Controllers/Api/LicenseSeatsController.php index a9630aa296..2ed7097322 100644 --- a/app/Http/Controllers/Api/LicenseSeatsController.php +++ b/app/Http/Controllers/Api/LicenseSeatsController.php @@ -107,7 +107,7 @@ class LicenseSeatsController extends Controller // attempt to update the license seat $licenseSeat->fill($request->all()); - $licenseSeat->user_id = auth()->id(); + $licenseSeat->created_by = auth()->id(); // check if this update is a checkin operation // 1. are relevant fields touched at all? diff --git a/app/Http/Controllers/Api/LicensesController.php b/app/Http/Controllers/Api/LicensesController.php index 71ad01b59b..db39f987aa 100644 --- a/app/Http/Controllers/Api/LicensesController.php +++ b/app/Http/Controllers/Api/LicensesController.php @@ -27,7 +27,7 @@ class LicensesController extends Controller $licenses = License::with('company', 'manufacturer', 'supplier','category', 'adminuser')->withCount('freeSeats as free_seats_count'); if ($request->filled('company_id')) { - $licenses->where('company_id', '=', $request->input('company_id')); + $licenses->where('licenses.company_id', '=', $request->input('company_id')); } if ($request->filled('name')) { @@ -70,8 +70,8 @@ class LicensesController extends Controller $licenses->where('depreciation_id', '=', $request->input('depreciation_id')); } - if ($request->filled('user_id')) { - $licenses->where('user_id', '=', $request->input('user_id')); + if ($request->filled('created_by')) { + $licenses->where('created_by', '=', $request->input('created_by')); } if (($request->filled('maintained')) && ($request->input('maintained')=='true')) { @@ -117,7 +117,7 @@ class LicensesController extends Controller $licenses = $licenses->leftJoin('companies', 'licenses.company_id', '=', 'companies.id')->orderBy('companies.name', $order); break; case 'created_by': - $licenses = $licenses->OrderCreatedBy($order); + $licenses = $licenses->OrderByCreatedBy($order); break; default: $allowed_columns = @@ -182,7 +182,7 @@ class LicensesController extends Controller public function show($id) : JsonResponse | array { $this->authorize('view', License::class); - $license = License::withCount('freeSeats')->findOrFail($id); + $license = License::withCount('freeSeats as free_seats_count')->findOrFail($id); $license = $license->load('assignedusers', 'licenseSeats.user', 'licenseSeats.asset'); return (new LicensesTransformer)->transformLicense($license); @@ -220,7 +220,6 @@ class LicensesController extends Controller */ public function destroy($id) : JsonResponse { - // $license = License::findOrFail($id); $this->authorize('delete', $license); diff --git a/app/Http/Controllers/Api/ManufacturersController.php b/app/Http/Controllers/Api/ManufacturersController.php index eb89693e5c..f716fbbf7f 100644 --- a/app/Http/Controllers/Api/ManufacturersController.php +++ b/app/Http/Controllers/Api/ManufacturersController.php @@ -25,11 +25,43 @@ class ManufacturersController extends Controller public function index(Request $request) : JsonResponse | array { $this->authorize('view', Manufacturer::class); - $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']; + $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', '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'); + $manufacturers = Manufacturer::select([ + 'id', + 'name', + 'url', + 'support_url', + 'warranty_lookup_url', + 'support_email', + 'support_phone', + 'created_by', + 'created_at', + 'updated_at', + 'image', + 'deleted_at', + ]) + ->with('adminuser') + ->withCount('assets as assets_count') + ->withCount('licenses as licenses_count') + ->withCount('consumables as consumables_count') + ->withCount('accessories as accessories_count') + ->withCount('components as components_count'); if ($request->input('deleted') == 'true') { $manufacturers->onlyTrashed(); @@ -66,10 +98,18 @@ class ManufacturersController extends Controller // 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'; - $manufacturers->orderBy($sort, $order); + $sort_override = $request->input('sort'); + $column_sort = in_array($sort_override, $allowed_columns) ? $sort_override : 'created_at'; + + switch ($sort_override) { + case 'created_by': + $manufacturers = $manufacturers->OrderByCreatedBy($order); + break; + default: + $manufacturers = $manufacturers->orderBy($column_sort, $order); + break; + } $total = $manufacturers->count(); $manufacturers = $manufacturers->skip($offset)->take($limit)->get(); @@ -181,7 +221,7 @@ class ManufacturersController extends Controller $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->created_by = auth()->id(); $logaction->logaction('restore'); return response()->json(Helper::formatStandardApiResponse('success', trans('admin/manufacturers/message.restore.success')), 200); diff --git a/app/Http/Controllers/Api/PredefinedKitsController.php b/app/Http/Controllers/Api/PredefinedKitsController.php index 26ccb50354..24f1320185 100644 --- a/app/Http/Controllers/Api/PredefinedKitsController.php +++ b/app/Http/Controllers/Api/PredefinedKitsController.php @@ -23,9 +23,8 @@ class PredefinedKitsController extends Controller public function index(Request $request) : JsonResponse | array { $this->authorize('view', PredefinedKit::class); - $allowed_columns = ['id', 'name']; - $kits = PredefinedKit::query(); + $kits = PredefinedKit::query()->with('adminuser'); if ($request->filled('search')) { $kits = $kits->TextSearch($request->input('search')); @@ -36,8 +35,25 @@ class PredefinedKitsController extends Controller $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); + + switch ($request->input('sort')) { + case 'created_by': + $kits = $kits->OrderByCreatedBy($order); + break; + default: + // 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', + 'created_at', + 'updated_at', + ]; + + $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; + $kits = $kits->orderBy($sort, $order); + break; + } $total = $kits->count(); $kits = $kits->skip($offset)->take($limit)->get(); diff --git a/app/Http/Controllers/Api/ReportsController.php b/app/Http/Controllers/Api/ReportsController.php index 931886fb29..63fca39d19 100644 --- a/app/Http/Controllers/Api/ReportsController.php +++ b/app/Http/Controllers/Api/ReportsController.php @@ -20,7 +20,7 @@ class ReportsController extends Controller { $this->authorize('reports.view'); - $actionlogs = Actionlog::with('item', 'user', 'admin', 'target', 'location'); + $actionlogs = Actionlog::with('item', 'user', 'adminuser', 'target', 'location'); if ($request->filled('search')) { $actionlogs = $actionlogs->TextSearch(e($request->input('search'))); @@ -44,21 +44,6 @@ class ReportsController extends Controller }); } - 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'); @@ -68,13 +53,16 @@ class ReportsController extends Controller 'id', 'created_at', 'target_id', - 'user_id', + 'created_by', 'accept_signature', 'action_type', 'note', 'remote_ip', 'user_agent', + 'target_type', + 'item_type', 'action_source', + 'action_date', ]; @@ -86,8 +74,8 @@ class ReportsController extends Controller $order = ($request->input('order') == 'asc') ? 'asc' : 'desc'; switch ($request->input('sort')) { - case 'admin': - $actionlogs->OrderAdmin($order); + case 'created_by': + $actionlogs->OrderByCreatedBy($order); break; default: $sort = in_array($request->input('sort'), $allowed_columns) ? e($request->input('sort')) : 'created_at'; diff --git a/app/Http/Controllers/Api/StatuslabelsController.php b/app/Http/Controllers/Api/StatuslabelsController.php index ce61d653f5..7e4851ff5a 100644 --- a/app/Http/Controllers/Api/StatuslabelsController.php +++ b/app/Http/Controllers/Api/StatuslabelsController.php @@ -25,9 +25,17 @@ class StatuslabelsController extends Controller public function index(Request $request) : array { $this->authorize('view', Statuslabel::class); - $allowed_columns = ['id', 'name', 'created_at', 'assets_count', 'color', 'notes', 'default_label']; + $allowed_columns = [ + 'id', + 'name', + 'created_at', + 'assets_count', + 'color', + 'notes', + 'default_label' + ]; - $statuslabels = Statuslabel::withCount('assets as assets_count'); + $statuslabels = Statuslabel::with('adminuser')->withCount('assets as assets_count'); if ($request->filled('search')) { $statuslabels = $statuslabels->TextSearch($request->input('search')); @@ -54,10 +62,18 @@ class StatuslabelsController extends Controller // 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'; - $statuslabels->orderBy($sort, $order); + $sort_override = $request->input('sort'); + $column_sort = in_array($sort_override, $allowed_columns) ? $sort_override : 'created_at'; + + switch ($sort_override) { + case 'created_by': + $statuslabels = $statuslabels->OrderByCreatedBy($order); + break; + default: + $statuslabels = $statuslabels->orderBy($column_sort, $order); + break; + } $total = $statuslabels->count(); $statuslabels = $statuslabels->skip($offset)->take($limit)->get(); @@ -79,7 +95,8 @@ class StatuslabelsController extends Controller $request->except('deployable', 'pending', 'archived'); if (! $request->filled('type')) { - return response()->json(Helper::formatStandardApiResponse('error', null, ['type' => ['Status label type is required.']]), 500); + + return response()->json(Helper::formatStandardApiResponse('error', null, ['type' => ['Status label type is required.']])); } $statuslabel = new Statuslabel; diff --git a/app/Http/Controllers/Api/UsersController.php b/app/Http/Controllers/Api/UsersController.php index 9200f80b1d..a9c8c26f14 100644 --- a/app/Http/Controllers/Api/UsersController.php +++ b/app/Http/Controllers/Api/UsersController.php @@ -14,6 +14,7 @@ use App\Http\Transformers\UsersTransformer; use App\Models\Actionlog; use App\Models\Asset; use App\Models\Accessory; +use App\Models\Company; use App\Models\Consumable; use App\Models\License; use App\Models\User; @@ -42,13 +43,14 @@ class UsersController extends Controller $users = User::select([ 'users.activated', - 'users.created_by', 'users.address', 'users.avatar', 'users.city', 'users.company_id', 'users.country', + 'users.created_by', 'users.created_at', + 'users.updated_at', 'users.deleted_at', 'users.department_id', 'users.email', @@ -67,7 +69,6 @@ class UsersController extends Controller 'users.state', 'users.two_factor_enrolled', 'users.two_factor_optin', - 'users.updated_at', 'users.username', 'users.zip', 'users.remote', @@ -206,6 +207,10 @@ class UsersController extends Controller $users->where('autoassign_licenses', '=', $request->input('autoassign_licenses')); } + if ($request->filled('locale')) { + $users = $users->where('users.locale', '=', $request->input('locale')); + } + if (($request->filled('deleted')) && ($request->input('deleted') == 'true')) { $users = $users->onlyTrashed(); @@ -251,6 +256,7 @@ class UsersController extends Controller 'groups', 'activated', 'created_at', + 'updated_at', 'two_factor_enrolled', 'two_factor_optin', 'last_login', @@ -276,6 +282,7 @@ class UsersController extends Controller 'end_date', 'autoassign_licenses', 'website', + 'locale', ]; $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'first_name'; @@ -365,6 +372,7 @@ class UsersController extends Controller $user = new User; $user->fill($request->all()); + $user->company_id = Company::getIdForCurrentUser($request->input('company_id')); $user->created_by = auth()->id(); if ($request->has('permissions')) { @@ -427,13 +435,10 @@ class UsersController extends Controller * @param \Illuminate\Http\Request $request * @param int $id */ - public function update(SaveUserRequest $request, $id) : JsonResponse + public function update(SaveUserRequest $request, User $user): JsonResponse { $this->authorize('update', User::class); - if ($user = User::find($id)) { - - $this->authorize('update', $user); /** @@ -443,14 +448,16 @@ class UsersController extends Controller * */ - - if ((($id == 1) || ($id == 2)) && (config('app.lock_passwords'))) { + if ((($user->id == 1) || ($user->id == 2)) && (config('app.lock_passwords'))) { return response()->json(Helper::formatStandardApiResponse('error', null, 'Permission denied. You cannot update user information via API on the demo.')); } - $user->fill($request->all()); + if ($request->filled('company_id')) { + $user->company_id = Company::getIdForCurrentUser($request->input('company_id')); + } + if ($user->id == $request->input('manager_id')) { return response()->json(Helper::formatStandardApiResponse('error', null, 'You cannot be your own manager')); } @@ -473,16 +480,13 @@ class UsersController extends Controller $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)]); - app('App\Http\Requests\ImageUploadRequest')->handleImages($user, 600, 'image', 'avatars', 'avatar'); if ($user->save()) { - // 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())) { @@ -496,18 +500,10 @@ class UsersController extends Controller // 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'))); } - 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')))); - } /** @@ -702,7 +698,7 @@ class UsersController extends Controller $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->created_by = auth()->id(); $logaction->logaction('2FA reset'); return response()->json(['message' => trans('admin/settings/general.two_factor_reset_success')], 200); @@ -752,7 +748,7 @@ class UsersController extends Controller $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->created_by = auth()->id(); $logaction->logaction('restore'); return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/users/message.success.restored')), 200); diff --git a/app/Http/Controllers/AssetMaintenancesController.php b/app/Http/Controllers/AssetMaintenancesController.php index 02be1e6061..360db45262 100644 --- a/app/Http/Controllers/AssetMaintenancesController.php +++ b/app/Http/Controllers/AssetMaintenancesController.php @@ -109,7 +109,7 @@ class AssetMaintenancesController extends Controller $assetMaintenance->title = $request->input('title'); $assetMaintenance->start_date = $request->input('start_date'); $assetMaintenance->completion_date = $request->input('completion_date'); - $assetMaintenance->user_id = Auth::id(); + $assetMaintenance->created_by = auth()->id(); if (($assetMaintenance->completion_date !== null) && ($assetMaintenance->start_date !== '') diff --git a/app/Http/Controllers/AssetModelsController.php b/app/Http/Controllers/AssetModelsController.php index 4421829f48..9d4c13afd9 100755 --- a/app/Http/Controllers/AssetModelsController.php +++ b/app/Http/Controllers/AssetModelsController.php @@ -78,7 +78,7 @@ class AssetModelsController extends Controller $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->created_by = auth()->id(); $model->requestable = $request->has('requestable'); if ($request->input('fieldset_id') != '') { @@ -151,17 +151,17 @@ class AssetModelsController extends Controller $model->notes = $request->input('notes'); $model->requestable = $request->input('requestable', '0'); - $this->removeCustomFieldsDefaultValues($model); - $model->fieldset_id = $request->input('fieldset_id'); - if ($this->shouldAddDefaultValues($request->input())) { - if (!$this->assignCustomFieldsDefaultValues($model, $request->input('default_values'))){ - return redirect()->back()->withInput()->with('error', trans('admin/custom_fields/message.fieldset_default_value.error')); - } - } - if ($model->save()) { + $this->removeCustomFieldsDefaultValues($model); + + if ($this->shouldAddDefaultValues($request->input())) { + if (!$this->assignCustomFieldsDefaultValues($model, $request->input('default_values'))) { + return redirect()->back()->withInput()->with('error', trans('admin/custom_fields/message.fieldset_default_value.error')); + } + } + if ($model->wasChanged('eol')) { if ($model->eol > 0) { $newEol = $model->eol; @@ -202,6 +202,7 @@ class AssetModelsController extends Controller if ($model->image) { try { Storage::disk('public')->delete('models/'.$model->image); + $model->update(['image' => null]); } catch (\Exception $e) { Log::info($e); } @@ -233,10 +234,10 @@ class AssetModelsController extends Controller if ($model->restore()) { $logaction = new Actionlog(); - $logaction->item_type = User::class; + $logaction->item_type = AssetModel::class; $logaction->item_id = $model->id; $logaction->created_at = date('Y-m-d H:i:s'); - $logaction->user_id = auth()->id(); + $logaction->created_by = auth()->id(); $logaction->logaction('restore'); diff --git a/app/Http/Controllers/Assets/AssetFilesController.php b/app/Http/Controllers/Assets/AssetFilesController.php index b5a04759bb..d15055c4b2 100644 --- a/app/Http/Controllers/Assets/AssetFilesController.php +++ b/app/Http/Controllers/Assets/AssetFilesController.php @@ -61,43 +61,30 @@ class AssetFilesController extends Controller */ public function show($assetId = null, $fileId = null) : View | RedirectResponse | Response | StreamedResponse | BinaryFileResponse { - $asset = Asset::find($assetId); - // the asset is valid - if (isset($asset->id)) { + if ($asset = Asset::find($assetId)) { + $this->authorize('view', $asset); - 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'); + if ($log = Actionlog::whereNotNull('filename')->where('item_id', $asset->id)->find($fileId)) { + $file = 'private_uploads/assets/'.$log->filename; + + if ($log->action_type == 'audit') { + $file = 'private_uploads/audits/'.$log->filename; + } + + try { + return StorageHelper::showOrDownloadFile($file, $log->filename); + } catch (\Exception $e) { + return redirect()->route('hardware.show', ['hardware' => $asset])->with('error', trans('general.file_not_found')); + } + } - $file = 'private_uploads/assets/'.$log->filename; - - if ($log->action_type == 'audit') { - $file = 'private_uploads/audits/'.$log->filename; - } - - if (! Storage::exists($file)) { - return response('File '.$file.' not found on server', 404) - ->header('Content-Type', 'text/plain'); - } - - if (request('inline') == 'true') { - - $headers = [ - 'Content-Disposition' => 'inline', - ]; - - return Storage::download($file, $log->filename, $headers); - } - - return StorageHelper::downloader($file); + return redirect()->route('hardware.show', ['hardware' => $asset])->with('error', trans('general.log_record_not_found')); } - // Prepare the error message - $error = trans('admin/hardware/message.does_not_exist', ['id' => $fileId]); - // Redirect to the hardware management page - return redirect()->route('hardware.index')->with('error', $error); + return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist')); + } /** diff --git a/app/Http/Controllers/Assets/AssetsController.php b/app/Http/Controllers/Assets/AssetsController.php index 75646e7267..52eb751a89 100755 --- a/app/Http/Controllers/Assets/AssetsController.php +++ b/app/Http/Controllers/Assets/AssetsController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\Assets; +use App\Events\CheckoutableCheckedIn; use App\Helpers\Helper; use App\Http\Controllers\Controller; use App\Http\Requests\ImageUploadRequest; @@ -16,7 +17,6 @@ use App\Models\Location; use App\Models\Setting; use App\Models\Statuslabel; use App\Models\User; -use Illuminate\Support\Facades\Auth; use App\View\Label; use Carbon\Carbon; use Illuminate\Support\Facades\DB; @@ -111,8 +111,10 @@ class AssetsController extends Controller $settings = Setting::getSettings(); - $success = false; + $successes = []; + $failures = []; $serials = $request->input('serials'); + $asset = null; for ($a = 1; $a <= count($asset_tags); $a++) { $asset = new Asset(); @@ -132,7 +134,7 @@ class AssetsController extends Controller $asset->model_id = $request->input('model_id'); $asset->order_number = $request->input('order_number'); $asset->notes = $request->input('notes'); - $asset->user_id = Auth::id(); + $asset->created_by = auth()->id(); $asset->status_id = request('status_id'); $asset->warranty_months = request('warranty_months', null); $asset->purchase_cost = request('purchase_cost'); @@ -165,7 +167,7 @@ class AssetsController extends Controller if (($model) && ($model->fieldset)) { foreach ($model->fieldset->fields as $field) { if ($field->field_encrypted == '1') { - if (Gate::allows('admin')) { + if (Gate::allows('assets.view.encrypted_custom_fields')) { if (is_array($request->input($field->db_column))) { $asset->{$field->db_column} = Crypt::encrypt(implode(', ', $request->input($field->db_column))); } else { @@ -199,20 +201,35 @@ class AssetsController extends Controller $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; - + $successes[] = " $asset->id]) . "' style='color: white;'>" . e($asset->asset_tag) . ""; + + } else { + $failures[] = join(",", $asset->getErrors()->all()); } } session()->put(['redirect_option' => $request->get('redirect_option'), 'checkout_to_type' => $request->get('checkout_to_type')]); - if ($success) { + if ($successes) { + if ($failures) { + //some succeeded, some failed + return redirect()->to(Helper::getRedirectOption($request, $asset->id, 'Assets')) //FIXME - not tested + ->with('success-unescaped', trans_choice('admin/hardware/message.create.multi_success_linked', $successes, ['links' => join(", ", $successes)])) + ->with('warning', trans_choice('admin/hardware/message.create.partial_failure', $failures, ['failures' => join("; ", $failures)])); + } else { + if (count($successes) == 1) { + //the most common case, keeping it so we don't have to make every use of that translation string be trans_choice'ed + //and re-translated + return redirect()->to(Helper::getRedirectOption($request, $asset->id, 'Assets')) + ->with('success-unescaped', trans('admin/hardware/message.create.success_linked', ['link' => route('hardware.show', ['hardware' => $asset->id]), 'id', 'tag' => e($asset->asset_tag)])); + } else { + //multi-success + return redirect()->to(Helper::getRedirectOption($request, $asset->id, 'Assets')) + ->with('success-unescaped', trans_choice('admin/hardware/message.create.multi_success_linked', $successes, ['links' => join(", ", $successes)])); + } + } - return redirect()->to(Helper::getRedirectOption($request, $asset->id, 'Assets')) - ->with('success-unescaped', trans('admin/hardware/message.create.success_linked', ['link' => route('hardware.show', ['hardware' => $asset->id]), 'id', 'tag' => e($asset->asset_tag)])); - - } return redirect()->back()->withInput()->withErrors($asset->getErrors()); @@ -328,16 +345,21 @@ class AssetsController extends Controller } $asset->supplier_id = $request->input('supplier_id', null); $asset->expected_checkin = $request->input('expected_checkin', null); - - // If the box isn't checked, it's not in the request at all. - $asset->requestable = $request->filled('requestable'); + $asset->requestable = $request->input('requestable', 0); $asset->rtd_location_id = $request->input('rtd_location_id', null); $asset->byod = $request->input('byod', 0); - $status = Statuslabel::find($asset->status_id); + $status = Statuslabel::find($request->input('status_id')); - if ($status && $status->archived) { + // This is a non-deployable status label - we should check the asset back in. + if (($status && $status->getStatuslabelType() != 'deployable') && ($target = $asset->assignedTo)) { + + $originalValues = $asset->getRawOriginal(); $asset->assigned_to = null; + $asset->assigned_type = null; + $asset->accepted = null; + + event(new CheckoutableCheckedIn($asset, $target, auth()->user(), 'Checkin on asset update', date('Y-m-d H:i:s'), $originalValues)); } if ($asset->assigned_to == '') { @@ -388,7 +410,7 @@ class AssetsController extends Controller foreach ($model->fieldset->fields as $field) { if ($field->field_encrypted == '1') { - if (Gate::allows('admin')) { + if (Gate::allows('assets.view.encrypted_custom_fields')) { if (is_array($request->input($field->db_column))) { $asset->{$field->db_column} = Crypt::encrypt(implode(', ', $request->input($field->db_column))); } else { @@ -422,7 +444,7 @@ class AssetsController extends Controller * @param int $assetId * @since [v1.0] */ - public function destroy($assetId) : RedirectResponse + public function destroy(Request $request, $assetId) : RedirectResponse { // Check if the asset exists if (is_null($asset = Asset::find($assetId))) { @@ -432,9 +454,17 @@ class AssetsController extends Controller $this->authorize('delete', $asset); - DB::table('assets') - ->where('id', $asset->id) - ->update(['assigned_to' => null]); + if ($asset->assignedTo) { + + $target = $asset->assignedTo; + $checkin_at = date('Y-m-d H:i:s'); + $originalValues = $asset->getRawOriginal(); + event(new CheckoutableCheckedIn($asset, $target, auth()->user(), 'Checkin on delete', $checkin_at, $originalValues)); + DB::table('assets') + ->where('id', $asset->id) + ->update(['assigned_to' => null]); + } + if ($asset->image) { try { @@ -739,7 +769,7 @@ class AssetsController extends Controller Actionlog::firstOrCreate([ 'item_id' => $asset->id, 'item_type' => Asset::class, - 'user_id' => auth()->id(), + 'created_by' => 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, @@ -767,7 +797,7 @@ class AssetsController extends Controller Actionlog::firstOrCreate([ 'item_id' => $item[$asset_tag][$batch_counter]['asset_id'], 'item_type' => Asset::class, - 'user_id' => auth()->id(), + 'created_by' => auth()->id(), 'note' => 'Checkin imported by '.auth()->user()->present()->fullName().' from history importer', 'target_id' => null, 'created_at' => $checkin_date, diff --git a/app/Http/Controllers/Assets/BulkAssetsController.php b/app/Http/Controllers/Assets/BulkAssetsController.php index d58edbacab..93f7255c0b 100644 --- a/app/Http/Controllers/Assets/BulkAssetsController.php +++ b/app/Http/Controllers/Assets/BulkAssetsController.php @@ -10,6 +10,7 @@ use App\Models\AssetModel; use App\Models\Statuslabel; use App\Models\Setting; use App\View\Label; +use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Support\Facades\Crypt; use Illuminate\Support\Facades\DB; @@ -51,6 +52,10 @@ class BulkAssetsController extends Controller } $asset_ids = $request->input('ids'); + if ($request->input('bulk_actions') === 'checkout') { + $request->session()->flashInput(['selected_assets' => $asset_ids]); + return redirect()->route('hardware.bulkcheckout.show'); + } // Figure out where we need to send the user after the update is complete, and store that in the session $bulk_back_url = request()->headers->get('referer'); @@ -240,10 +245,12 @@ class BulkAssetsController extends Controller || ($request->filled('status_id')) || ($request->filled('model_id')) || ($request->filled('next_audit_date')) + || ($request->filled('asset_eol_date')) || ($request->filled('null_name')) || ($request->filled('null_purchase_date')) || ($request->filled('null_expected_checkin_date')) || ($request->filled('null_next_audit_date')) + || ($request->filled('null_asset_eol_date')) || ($request->anyFilled($custom_field_columns)) ) { @@ -266,11 +273,29 @@ class BulkAssetsController extends Controller ->conditionallyAddItem('requestable') ->conditionallyAddItem('supplier_id') ->conditionallyAddItem('warranty_months') - ->conditionallyAddItem('next_audit_date'); + ->conditionallyAddItem('next_audit_date') + ->conditionallyAddItem('asset_eol_date'); foreach ($custom_field_columns as $key => $custom_field_column) { $this->conditionallyAddItem($custom_field_column); } + if (!($asset->eol_explicit)) { + if ($request->filled('model_id')) { + $model = AssetModel::find($request->input('model_id')); + if ($model->eol > 0) { + if ($request->filled('purchase_date')) { + $this->update_array['asset_eol_date'] = Carbon::parse($request->input('purchase_date'))->addMonths($model->eol)->format('Y-m-d'); + } else { + $this->update_array['asset_eol_date'] = Carbon::parse($asset->purchase_date)->addMonths($model->eol)->format('Y-m-d'); + } + } else { + $this->update_array['asset_eol_date'] = null; + } + } elseif (($request->filled('purchase_date')) && ($asset->model->eol > 0)) { + $this->update_array['asset_eol_date'] = Carbon::parse($request->input('purchase_date'))->addMonths($asset->model->eol)->format('Y-m-d'); + } + } + /** * Blank out fields that were requested to be blanked out via checkbox */ @@ -281,6 +306,9 @@ class BulkAssetsController extends Controller if ($request->input('null_purchase_date')=='1') { $this->update_array['purchase_date'] = null; + if (!($asset->eol_explicit)) { + $this->update_array['asset_eol_date'] = null; + } } if ($request->input('null_expected_checkin_date')=='1') { @@ -291,6 +319,17 @@ class BulkAssetsController extends Controller $this->update_array['next_audit_date'] = null; } + if ($request->input('null_asset_eol_date')=='1') { + $this->update_array['asset_eol_date'] = null; + + // If they are nulling the EOL date to allow it to calculate, set eol explicit to 0 + if ($request->input('calc_eol')=='1') { + $this->update_array['eol_explicit'] = 0; + } + } + + + if ($request->filled('purchase_cost')) { $this->update_array['purchase_cost'] = $request->input('purchase_cost'); } @@ -550,31 +589,34 @@ class BulkAssetsController extends Controller } $errors = []; - DB::transaction(function () use ($target, $admin, $checkout_at, $expected_checkin, $errors, $asset_ids, $request) { + DB::transaction(function () use ($target, $admin, $checkout_at, $expected_checkin, &$errors, $asset_ids, $request) { //NOTE: $errors is passsed by reference! foreach ($asset_ids as $asset_id) { $asset = Asset::findOrFail($asset_id); $this->authorize('checkout', $asset); - $error = $asset->checkOut($target, $admin, $checkout_at, $expected_checkin, e($request->get('note')), $asset->name, null); + $checkout_success = $asset->checkOut($target, $admin, $checkout_at, $expected_checkin, e($request->get('note')), $asset->name, null); + //TODO - I think this logic is duplicated in the checkOut method? if ($target->location_id != '') { $asset->location_id = $target->location_id; - $asset->unsetEventDispatcher(); - $asset->save(); + // TODO - I don't know why this is being saved without events + $asset::withoutEvents(function () use ($asset) { + $asset->save(); + }); } - if ($error) { - array_merge_recursive($errors, $asset->getErrors()->toArray()); + if (!$checkout_success) { + $errors = array_merge_recursive($errors, $asset->getErrors()->toArray()); } } }); if (! $errors) { // Redirect to the new asset page - return redirect()->to('hardware')->with('success', trans('admin/hardware/message.checkout.success')); + return redirect()->to('hardware')->with('success', trans_choice('admin/hardware/message.multi-checkout.success', $asset_ids)); } // Redirect to the asset management page with error - return redirect()->route('hardware.bulkcheckout.show')->with('error', trans('admin/hardware/message.checkout.error'))->withErrors($errors); + return redirect()->route('hardware.bulkcheckout.show')->withInput()->with('error', trans_choice('admin/hardware/message.multi-checkout.error', $asset_ids))->withErrors($errors); } catch (ModelNotFoundException $e) { return redirect()->route('hardware.bulkcheckout.show')->with('error', $e->getErrors()); } diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index 9ac976b43c..e7b10877cf 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -508,8 +508,8 @@ class LoginController extends Controller protected function validator(array $data) { return Validator::make($data, [ - 'username' => 'required', - 'password' => 'required', + 'username' => 'required|not_array', + 'password' => 'required|not_array', ]); } diff --git a/app/Http/Controllers/CategoriesController.php b/app/Http/Controllers/CategoriesController.php index ac57ad6a6d..93b3d4a0d0 100755 --- a/app/Http/Controllers/CategoriesController.php +++ b/app/Http/Controllers/CategoriesController.php @@ -69,7 +69,7 @@ class CategoriesController extends Controller $category->use_default_eula = $request->input('use_default_eula', '0'); $category->require_acceptance = $request->input('require_acceptance', '0'); $category->checkin_email = $request->input('checkin_email', '0'); - $category->user_id = Auth::id(); + $category->created_by = auth()->id(); $category = $request->handleImages($category); if ($category->save()) { diff --git a/app/Http/Controllers/CompaniesController.php b/app/Http/Controllers/CompaniesController.php index 589832af72..238ffc85f5 100644 --- a/app/Http/Controllers/CompaniesController.php +++ b/app/Http/Controllers/CompaniesController.php @@ -60,6 +60,7 @@ final class CompaniesController extends Controller $company->phone = $request->input('phone'); $company->fax = $request->input('fax'); $company->email = $request->input('email'); + $company->created_by = auth()->id(); $company = $request->handleImages($company); diff --git a/app/Http/Controllers/Components/ComponentCheckoutController.php b/app/Http/Controllers/Components/ComponentCheckoutController.php index e9db70811c..b40d592369 100644 --- a/app/Http/Controllers/Components/ComponentCheckoutController.php +++ b/app/Http/Controllers/Components/ComponentCheckoutController.php @@ -106,7 +106,7 @@ class ComponentCheckoutController extends Controller $component->asset_id = $request->input('asset_id'); $component->assets()->attach($component->id, [ 'component_id' => $component->id, - 'user_id' => auth()->user()->id, + 'created_by' => auth()->user()->id, 'created_at' => date('Y-m-d H:i:s'), 'assigned_qty' => $request->input('assigned_qty'), 'asset_id' => $request->input('asset_id'), diff --git a/app/Http/Controllers/Components/ComponentsController.php b/app/Http/Controllers/Components/ComponentsController.php index 57cd0a2b45..c4d9bcec36 100644 --- a/app/Http/Controllers/Components/ComponentsController.php +++ b/app/Http/Controllers/Components/ComponentsController.php @@ -73,6 +73,8 @@ class ComponentsController extends Controller $component->name = $request->input('name'); $component->category_id = $request->input('category_id'); $component->supplier_id = $request->input('supplier_id'); + $component->manufacturer_id = $request->input('manufacturer_id'); + $component->model_number = $request->input('model_number'); $component->location_id = $request->input('location_id'); $component->company_id = Company::getIdForCurrentUser($request->input('company_id')); $component->order_number = $request->input('order_number', null); @@ -81,7 +83,7 @@ class ComponentsController extends Controller $component->purchase_date = $request->input('purchase_date', null); $component->purchase_cost = $request->input('purchase_cost', null); $component->qty = $request->input('qty'); - $component->user_id = Auth::id(); + $component->created_by = auth()->id(); $component->notes = $request->input('notes'); $component = $request->handleImages($component); @@ -150,6 +152,8 @@ class ComponentsController extends Controller $component->name = $request->input('name'); $component->category_id = $request->input('category_id'); $component->supplier_id = $request->input('supplier_id'); + $component->manufacturer_id = $request->input('manufacturer_id'); + $component->model_number = $request->input('model_number'); $component->location_id = $request->input('location_id'); $component->company_id = Company::getIdForCurrentUser($request->input('company_id')); $component->order_number = $request->input('order_number'); diff --git a/app/Http/Controllers/Components/ComponentsFilesController.php b/app/Http/Controllers/Components/ComponentsFilesController.php index a7d42bb072..83468a0b10 100644 --- a/app/Http/Controllers/Components/ComponentsFilesController.php +++ b/app/Http/Controllers/Components/ComponentsFilesController.php @@ -112,40 +112,25 @@ class ComponentsFilesController extends Controller public function show($componentId = null, $fileId = null) { Log::debug('Private filesystem is: '.config('filesystems.default')); - $component = Component::find($componentId); + // the component is valid - if (isset($component->id)) { + if ($component = Component::find($componentId)) { $this->authorize('view', $component); $this->authorize('components.files', $component); - if (! $log = Actionlog::whereNotNull('filename')->where('item_id', $component->id)->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', $component->id)->find($fileId)) { - $file = 'private_uploads/components/'.$log->filename; + $file = 'private_uploads/components/'.$log->filename; - if (Storage::missing($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); + try { + return StorageHelper::showOrDownloadFile($file, $log->filename); + } catch (\Exception $e) { + return redirect()->route('components.show', ['component' => $component])->with('error', trans('general.file_not_found')); } - - if (config('filesystems.default') == 'local') { // TODO - is there any way to fix this at the StorageHelper layer? - return StorageHelper::downloader($file); - } } + return redirect()->route('components.show', ['component' => $component])->with('error', trans('general.log_record_not_found')); + } return redirect()->route('components.index')->with('error', trans('general.file_does_not_exist', ['id' => $fileId])); diff --git a/app/Http/Controllers/Consumables/ConsumableCheckoutController.php b/app/Http/Controllers/Consumables/ConsumableCheckoutController.php index 1bdb16af92..e08da41229 100644 --- a/app/Http/Controllers/Consumables/ConsumableCheckoutController.php +++ b/app/Http/Controllers/Consumables/ConsumableCheckoutController.php @@ -70,7 +70,7 @@ class ConsumableCheckoutController extends Controller $this->authorize('checkout', $consumable); // If the quantity is not present in the request or is not a positive integer, set it to 1 - $quantity = $request->input('qty'); + $quantity = $request->input('checkout_qty'); if (!isset($quantity) || !ctype_digit((string)$quantity) || $quantity <= 0) { $quantity = 1; } @@ -92,14 +92,16 @@ class ConsumableCheckoutController extends Controller // Update the consumable data $consumable->assigned_to = e($request->input('assigned_to')); - for($i = 0; $i < $quantity; $i++){ + for ($i = 0; $i < $quantity; $i++){ $consumable->users()->attach($consumable->id, [ 'consumable_id' => $consumable->id, - 'user_id' => $admin_user->id, + 'created_by' => $admin_user->id, 'assigned_to' => e($request->input('assigned_to')), 'note' => $request->input('note'), ]); } + + $consumable->checkout_qty = $quantity; event(new CheckoutableCheckedOut($consumable, $user, auth()->user(), $request->input('note'))); $request->request->add(['checkout_to_type' => 'user']); diff --git a/app/Http/Controllers/Consumables/ConsumablesController.php b/app/Http/Controllers/Consumables/ConsumablesController.php index 42c0766fe0..98141f2783 100644 --- a/app/Http/Controllers/Consumables/ConsumablesController.php +++ b/app/Http/Controllers/Consumables/ConsumablesController.php @@ -81,7 +81,7 @@ class ConsumablesController extends Controller $consumable->purchase_date = $request->input('purchase_date'); $consumable->purchase_cost = $request->input('purchase_cost'); $consumable->qty = $request->input('qty'); - $consumable->user_id = Auth::id(); + $consumable->created_by = auth()->id(); $consumable->notes = $request->input('notes'); @@ -221,7 +221,7 @@ class ConsumablesController extends Controller $consumable = clone $consumable_to_close; $consumable->id = null; $consumable->image = null; - $consumable->user_id = null; + $consumable->created_by = null; return view('consumables/edit')->with('item', $consumable); } diff --git a/app/Http/Controllers/Consumables/ConsumablesFilesController.php b/app/Http/Controllers/Consumables/ConsumablesFilesController.php index 35a4ae841e..054fdc0b81 100644 --- a/app/Http/Controllers/Consumables/ConsumablesFilesController.php +++ b/app/Http/Controllers/Consumables/ConsumablesFilesController.php @@ -104,7 +104,6 @@ class ConsumablesFilesController extends Controller * @since [v1.4] * @param int $consumableId * @param int $fileId - * @return \Symfony\Consumable\HttpFoundation\Response * @throws \Illuminate\Auth\Access\AuthorizationException */ public function show($consumableId = null, $fileId = null) @@ -116,36 +115,18 @@ class ConsumablesFilesController extends Controller $this->authorize('view', $consumable); $this->authorize('consumables.files', $consumable); - if (! $log = Actionlog::whereNotNull('filename')->where('item_id', $consumable->id)->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', $consumable->id)->find($fileId)) { + $file = 'private_uploads/consumables/'.$log->filename; - $file = 'private_uploads/consumables/'.$log->filename; - - if (Storage::missing($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); + try { + return StorageHelper::showOrDownloadFile($file, $log->filename); + } catch (\Exception $e) { + return redirect()->route('consumables.show', ['consumable' => $consumable])->with('error', trans('general.file_not_found')); } } + // The log record doesn't exist somehow + return redirect()->route('consumables.show', ['consumable' => $consumable])->with('error', trans('general.log_record_not_found')); + } return redirect()->route('consumables.index')->with('error', trans('general.file_does_not_exist', ['id' => $fileId])); diff --git a/app/Http/Controllers/CustomFieldsController.php b/app/Http/Controllers/CustomFieldsController.php index 42f6c212db..5a0dc6aec2 100644 --- a/app/Http/Controllers/CustomFieldsController.php +++ b/app/Http/Controllers/CustomFieldsController.php @@ -104,7 +104,7 @@ class CustomFieldsController extends Controller "auto_add_to_fieldsets" => $request->get("auto_add_to_fieldsets", 0), "show_in_listview" => $request->get("show_in_listview", 0), "show_in_requestable_list" => $request->get("show_in_requestable_list", 0), - "user_id" => Auth::id() + "user_id" => auth()->id() ]); @@ -248,7 +248,7 @@ class CustomFieldsController extends Controller $field->name = trim(e($request->get("name"))); $field->element = e($request->get("element")); $field->field_values = $request->get("field_values"); - $field->user_id = Auth::id(); + $field->created_by = auth()->id(); $field->help_text = $request->get("help_text"); $field->show_in_email = $show_in_email; $field->is_unique = $request->get("is_unique", 0); diff --git a/app/Http/Controllers/CustomFieldsetsController.php b/app/Http/Controllers/CustomFieldsetsController.php index 8b9844d152..1d887db29a 100644 --- a/app/Http/Controllers/CustomFieldsetsController.php +++ b/app/Http/Controllers/CustomFieldsetsController.php @@ -90,7 +90,7 @@ class CustomFieldsetsController extends Controller $fieldset = new CustomFieldset([ 'name' => $request->get('name'), - 'user_id' => auth()->id(), + 'created_by' => auth()->id(), ]); $validator = Validator::make($request->all(), $fieldset->rules); diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php index fc01c496c2..af9c7ee446 100755 --- a/app/Http/Controllers/DashboardController.php +++ b/app/Http/Controllers/DashboardController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers; use Illuminate\Support\Facades\Artisan; use Illuminate\Http\RedirectResponse; use \Illuminate\Contracts\View\View; +use Illuminate\Support\Facades\Session; /** @@ -44,6 +45,8 @@ class DashboardController extends Controller return view('dashboard')->with('asset_stats', $asset_stats)->with('counts', $counts); } else { + Session::reflash(); + // Redirect to the profile page return redirect()->intended('account/view-assets'); } diff --git a/app/Http/Controllers/DepartmentsController.php b/app/Http/Controllers/DepartmentsController.php index 5818435deb..287315ef2c 100644 --- a/app/Http/Controllers/DepartmentsController.php +++ b/app/Http/Controllers/DepartmentsController.php @@ -51,7 +51,7 @@ class DepartmentsController extends Controller $this->authorize('create', Department::class); $department = new Department; $department->fill($request->all()); - $department->user_id = auth()->id(); + $department->created_by = auth()->id(); $department->manager_id = ($request->filled('manager_id') ? $request->input('manager_id') : null); $department->location_id = ($request->filled('location_id') ? $request->input('location_id') : null); $department->company_id = ($request->filled('company_id') ? $request->input('company_id') : null); diff --git a/app/Http/Controllers/DepreciationsController.php b/app/Http/Controllers/DepreciationsController.php index c564cc98f7..5f4a5ca10d 100755 --- a/app/Http/Controllers/DepreciationsController.php +++ b/app/Http/Controllers/DepreciationsController.php @@ -61,7 +61,7 @@ class DepreciationsController extends Controller // Depreciation data $depreciation->name = $request->input('name'); $depreciation->months = $request->input('months'); - $depreciation->user_id = Auth::id(); + $depreciation->created_by = auth()->id(); $request->validate([ 'depreciation_min' => [ @@ -193,13 +193,20 @@ class DepreciationsController extends Controller */ public function show($id) : View | RedirectResponse { - if (is_null($depreciation = Depreciation::find($id))) { - // Redirect to the blogs management page - return redirect()->route('depreciations.index')->with('error', trans('admin/depreciations/message.does_not_exist')); - } + $depreciation = Depreciation::withCount('assets as assets_count') + ->withCount('models as models_count') + ->withCount('licenses as licenses_count') + ->find($id); $this->authorize('view', $depreciation); - return view('depreciations/view', compact('depreciation')); + if ($depreciation) { + return view('depreciations/view', compact('depreciation')); + + } + + return redirect()->route('depreciations.index')->with('error', trans('admin/depreciations/message.does_not_exist')); + + } } diff --git a/app/Http/Controllers/HealthController.php b/app/Http/Controllers/HealthController.php index c75b903b0b..dac1f17bf4 100644 --- a/app/Http/Controllers/HealthController.php +++ b/app/Http/Controllers/HealthController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers; use Illuminate\Routing\Controller as BaseController; +use Illuminate\Support\Facades\DB; /** * This controller provide the health route for @@ -15,13 +16,35 @@ use Illuminate\Routing\Controller as BaseController; */ class HealthController extends BaseController { + + public function __construct() + { + $this->middleware('health'); + } + + /** * Returns a fixed JSON content ({ "status": "ok"}) which indicate the app is up and running */ public function get() { - return response()->json([ - 'status' => 'ok', - ]); + try { + + if (DB::select('select 2 + 2')) { + return response()->json([ + 'status' => 'ok', + ]); + } + + } catch (\Exception $e) { + \Log::error('Could not connect to database'); + return response()->json([ + 'status' => 'database connection failed', + ], 500); + + } + + + } } diff --git a/app/Http/Controllers/Kits/PredefinedKitsController.php b/app/Http/Controllers/Kits/PredefinedKitsController.php index 187f5aad14..54f7514510 100644 --- a/app/Http/Controllers/Kits/PredefinedKitsController.php +++ b/app/Http/Controllers/Kits/PredefinedKitsController.php @@ -55,6 +55,7 @@ class PredefinedKitsController extends Controller // Create a new Predefined Kit $kit = new PredefinedKit; $kit->name = $request->input('name'); + $kit->created_by = auth()->id(); if (! $kit->save()) { return redirect()->back()->withInput()->withErrors($kit->getErrors()); diff --git a/app/Http/Controllers/Licenses/LicenseCheckoutController.php b/app/Http/Controllers/Licenses/LicenseCheckoutController.php index c08980fc06..0f31db1449 100644 --- a/app/Http/Controllers/Licenses/LicenseCheckoutController.php +++ b/app/Http/Controllers/Licenses/LicenseCheckoutController.php @@ -77,7 +77,7 @@ class LicenseCheckoutController extends Controller $this->authorize('checkout', $license); $licenseSeat = $this->findLicenseSeatToCheckout($license, $seatId); - $licenseSeat->user_id = Auth::id(); + $licenseSeat->created_by = auth()->id(); $licenseSeat->notes = $request->input('notes'); diff --git a/app/Http/Controllers/Licenses/LicenseFilesController.php b/app/Http/Controllers/Licenses/LicenseFilesController.php index fa18e8cf48..6ab3cb7703 100644 --- a/app/Http/Controllers/Licenses/LicenseFilesController.php +++ b/app/Http/Controllers/Licenses/LicenseFilesController.php @@ -112,37 +112,19 @@ class LicenseFilesController extends Controller $this->authorize('view', $license); $this->authorize('licenses.files', $license); - if (! $log = Actionlog::whereNotNull('filename')->where('item_id', $license->id)->find($fileId)) { - return response('No matching record for that asset/file', 500) - ->header('Content-Type', 'text/plain'); - } - - $file = 'private_uploads/licenses/'.$log->filename; - - if (Storage::missing($file)) { - Log::debug('NOT EXISTS for '.$file); - Log::debug('NOT EXISTS URL should be '.Storage::url($file)); - - return response('File '.$file.' ('.Storage::url($file).') not found on server', 404) - ->header('Content-Type', 'text/plain'); - } else { - - 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); + if ($log = Actionlog::whereNotNull('filename')->where('item_id', $license->id)->find($fileId)) { + $file = 'private_uploads/licenses/'.$log->filename; + try { + return StorageHelper::showOrDownloadFile($file, $log->filename); + } catch (\Exception $e) { + return redirect()->route('licenses.show', ['licenses' => $license])->with('error', trans('general.file_not_found')); } } + + // The log record doesn't exist somehow + return redirect()->route('licenses.show', ['licenses' => $license])->with('error', trans('general.log_record_not_found')); + } return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.does_not_exist', ['id' => $fileId])); diff --git a/app/Http/Controllers/Licenses/LicensesController.php b/app/Http/Controllers/Licenses/LicensesController.php index 7a51344dd0..6098423ba3 100755 --- a/app/Http/Controllers/Licenses/LicensesController.php +++ b/app/Http/Controllers/Licenses/LicensesController.php @@ -99,7 +99,7 @@ class LicensesController extends Controller $license->supplier_id = $request->input('supplier_id'); $license->category_id = $request->input('category_id'); $license->termination_date = $request->input('termination_date'); - $license->user_id = Auth::id(); + $license->created_by = auth()->id(); $license->min_amt = $request->input('min_amt'); session()->put(['redirect_option' => $request->get('redirect_option')]); diff --git a/app/Http/Controllers/LocationsController.php b/app/Http/Controllers/LocationsController.php index c498f09926..75abce97ed 100755 --- a/app/Http/Controllers/LocationsController.php +++ b/app/Http/Controllers/LocationsController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers; use App\Http\Requests\ImageUploadRequest; +use App\Models\Actionlog; use App\Models\Asset; use App\Models\Location; use App\Models\User; @@ -74,7 +75,7 @@ class LocationsController extends Controller $location->zip = $request->input('zip'); $location->ldap_ou = $request->input('ldap_ou'); $location->manager_id = $request->input('manager_id'); - $location->user_id = auth()->id(); + $location->created_by = auth()->id(); $location->phone = request('phone'); $location->fax = request('fax'); @@ -193,7 +194,13 @@ class LocationsController extends Controller */ public function show($id = null) : View | RedirectResponse { - $location = Location::find($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') + ->withTrashed() + ->find($id); if (isset($location->id)) { return view('locations/view', compact('location')); @@ -249,6 +256,41 @@ class LocationsController extends Controller } + /** + * Restore a given Asset Model (mark as un-deleted) + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $id + */ + public function postRestore($id) : RedirectResponse + { + $this->authorize('create', Location::class); + + if ($location = Location::withTrashed()->find($id)) { + + if ($location->deleted_at == '') { + return redirect()->back()->with('error', trans('general.not_deleted', ['item_type' => trans('general.location')])); + } + + if ($location->restore()) { + $logaction = new Actionlog(); + $logaction->item_type = Location::class; + $logaction->item_id = $location->id; + $logaction->created_at = date('Y-m-d H:i:s'); + $logaction->created_by = auth()->id(); + $logaction->logaction('restore'); + + return redirect()->route('locations.index')->with('success', trans('admin/locations/message.restore.success')); + } + + // Check validation + return redirect()->back()->with('error', trans('general.could_not_restore', ['item_type' => trans('general.location'), 'error' => $location->getErrors()->first()])); + } + + return redirect()->back()->with('error', trans('admin/models/message.does_not_exist')); + + } public function print_all_assigned($id) : View | RedirectResponse { if ($location = Location::where('id', $id)->first()) { diff --git a/app/Http/Controllers/ManufacturersController.php b/app/Http/Controllers/ManufacturersController.php index 8e979e3896..68124f644c 100755 --- a/app/Http/Controllers/ManufacturersController.php +++ b/app/Http/Controllers/ManufacturersController.php @@ -61,7 +61,7 @@ class ManufacturersController extends Controller $this->authorize('create', Manufacturer::class); $manufacturer = new Manufacturer; $manufacturer->name = $request->input('name'); - $manufacturer->user_id = Auth::id(); + $manufacturer->created_by = auth()->id(); $manufacturer->url = $request->input('url'); $manufacturer->support_url = $request->input('support_url'); $manufacturer->warranty_lookup_url = $request->input('warranty_lookup_url'); @@ -219,7 +219,7 @@ class ManufacturersController extends Controller $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->created_by = auth()->id(); $logaction->logaction('restore'); // Redirect them to the deleted page if there are more, otherwise the section index diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php index abe09e8afa..896c253463 100755 --- a/app/Http/Controllers/ProfileController.php +++ b/app/Http/Controllers/ProfileController.php @@ -194,14 +194,14 @@ class ProfileController extends Controller */ public function printInventory() : View { - $show_user = auth()->user(); + $show_users = User::where('id',auth()->user()->id)->get(); return view('users/print') - ->with('assets', auth()->user()->assets) - ->with('licenses', $show_user->licenses()->get()) - ->with('accessories', $show_user->accessories()->get()) - ->with('consumables', $show_user->consumables()->get()) - ->with('show_user', $show_user) + ->with('assets', auth()->user()->assets()) + ->with('licenses', auth()->user()->licenses()->get()) + ->with('accessories', auth()->user()->accessories()->get()) + ->with('consumables', auth()->user()->consumables()->get()) + ->with('users', $show_users) ->with('settings', Setting::getSettings()); } @@ -222,7 +222,12 @@ class ProfileController extends Controller return redirect()->back()->with('error', trans('admin/users/message.user_has_no_email')); } - $user->notify((new CurrentInventory($user))); + try { + $user->notify((new CurrentInventory($user))); + } catch (\Exception $e) { + \Log::error($e); + } + return redirect()->back()->with('success', trans('admin/users/general.user_notified')); } } diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index c4b7ee0609..105dac6350 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -703,6 +703,10 @@ class ReportsController extends Controller $assets->whereBetween('assets.expected_checkin', [$request->input('expected_checkin_start'), $request->input('expected_checkin_end')]); } + if (($request->filled('asset_eol_date_start')) && ($request->filled('asset_eol_date_end'))) { + $assets->whereBetween('assets.asset_eol_date', [$request->input('asset_eol_date_start'), $request->input('asset_eol_date_end')]); + } + if (($request->filled('last_audit_start')) && ($request->filled('last_audit_end'))) { $last_audit_start = Carbon::parse($request->input('last_audit_start'))->startOfDay(); $last_audit_end = Carbon::parse($request->input('last_audit_end'))->endOfDay(); @@ -778,7 +782,7 @@ class ReportsController extends Controller } if ($request->filled('eol')) { - $row[] = ($asset->asset_eol_date) ? $asset->asset_eol_date : ''; + $row[] = ($asset->purchase_date != '') ? $asset->asset_eol_date : ''; } if ($request->filled('order')) { diff --git a/app/Http/Controllers/SettingsController.php b/app/Http/Controllers/SettingsController.php index 0ab0525966..aa773d9eea 100755 --- a/app/Http/Controllers/SettingsController.php +++ b/app/Http/Controllers/SettingsController.php @@ -7,6 +7,11 @@ use App\Helpers\StorageHelper; use App\Http\Requests\ImageUploadRequest; use App\Http\Requests\SettingsSamlRequest; use App\Http\Requests\SetupUserRequest; +use App\Http\Requests\StoreLdapSettings; +use App\Http\Requests\StoreLocalizationSettings; +use App\Http\Requests\StoreNotificationSettings; +use App\Http\Requests\StoreLabelSettings; +use App\Http\Requests\StoreSecuritySettings; use App\Models\CustomField; use App\Models\Group; use App\Models\Setting; @@ -181,7 +186,7 @@ class SettingsController extends Controller $settings->brand = 1; $settings->locale = $request->input('locale', 'en-US'); $settings->default_currency = $request->input('default_currency', 'USD'); - $settings->user_id = 1; + $settings->created_by = 1; $settings->email_domain = $request->input('email_domain'); $settings->email_format = $request->input('email_format'); $settings->next_auto_tag_base = 1; @@ -273,20 +278,6 @@ class SettingsController extends Controller return view('settings/index', compact('settings')); } - /** - * Return the admin settings page. - * - * @author [A. Gianotto] [] - * - * @since [v1.0] - */ - public function getEdit() : View - - { - $setting = Setting::getSettings(); - - return view('settings/general', compact('setting')); - } /** * Return a form to allow a super admin to update settings. @@ -486,7 +477,7 @@ class SettingsController extends Controller * * @since [v1.0] */ - public function postSecurity(Request $request) : RedirectResponse + public function postSecurity(StoreSecuritySettings $request) : RedirectResponse { $this->validate($request, [ 'pwd_secure_complexity' => 'array', @@ -556,7 +547,7 @@ class SettingsController extends Controller * * @since [v1.0] */ - public function postLocalization(Request $request) : RedirectResponse + public function postLocalization(StoreLocalizationSettings $request) : RedirectResponse { if (is_null($setting = Setting::getSettings())) { return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error')); @@ -599,7 +590,7 @@ class SettingsController extends Controller * @author [A. Gianotto] [] * @since [v1.0] */ - public function postAlerts(Request $request) : RedirectResponse + public function postAlerts(StoreNotificationSettings $request) : RedirectResponse { if (is_null($setting = Setting::getSettings())) { return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error')); @@ -780,7 +771,7 @@ class SettingsController extends Controller * @author [A. Gianotto] [] * @since [v4.0] */ - public function postLabels(Request $request) : RedirectResponse + public function postLabels(StoreLabelSettings $request) : RedirectResponse { if (is_null($setting = Setting::getSettings())) { return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error')); @@ -859,26 +850,7 @@ class SettingsController extends Controller { $setting = Setting::getSettings(); $groups = Group::pluck('name', 'id'); - - - /** - * This validator is only temporary (famous last words.) - @snipe - */ - $messages = [ - 'ldap_username_field.not_in' => 'sAMAccountName (mixed case) will likely not work. You should use samaccountname (lowercase) instead. ', - 'ldap_auth_filter_query.not_in' => 'uid=samaccountname is probably not a valid auth filter. You probably want uid= ', - 'ldap_filter.regex' => 'This value should probably not be wrapped in parentheses.', - ]; - - $validator = Validator::make($setting->toArray(), [ - 'ldap_username_field' => 'not_in:sAMAccountName', - 'ldap_auth_filter_query' => 'not_in:uid=samaccountname|required_if:ldap_enabled,1', - 'ldap_filter' => 'nullable|regex:"^[^(]"|required_if:ldap_enabled,1', - ], $messages); - - - - return view('settings.ldap', compact('setting', 'groups'))->withErrors($validator); + return view('settings.ldap', compact('setting', 'groups')); } /** @@ -887,7 +859,7 @@ class SettingsController extends Controller * @author [A. Gianotto] [] * @since [v4.0] */ - public function postLdapSettings(Request $request) : RedirectResponse + public function postLdapSettings(StoreLdapSettings $request) : RedirectResponse { if (is_null($setting = Setting::getSettings())) { return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error')); @@ -1204,7 +1176,7 @@ class SettingsController extends Controller * @author [A. Gianotto] [] * @since [v6.0] */ - public function postRestore($filename = null) : RedirectResponse + public function postRestore(Request $request, $filename = null): RedirectResponse { if (! config('app.lock_passwords')) { @@ -1224,13 +1196,29 @@ class SettingsController extends Controller Log::debug('Attempting to restore from: '. storage_path($path).'/'.$filename); - // run the restore command - Artisan::call('snipeit:restore', - [ + $restore_params = [ '--force' => true, '--no-progress' => true, - 'filename' => storage_path($path).'/'.$filename - ]); + 'filename' => storage_path($path) . '/' . $filename + ]; + + if ($request->input('clean')) { + Log::debug("Attempting 'clean' - first, guessing prefix..."); + Artisan::call('snipeit:restore', [ + '--sanitize-guess-prefix' => true, + 'filename' => storage_path($path) . '/' . $filename + ]); + $guess_prefix_output = Artisan::output(); + Log::debug("Sanitize output is: $guess_prefix_output"); + list($prefix, $_output) = explode("\n", $guess_prefix_output); + Log::debug("prefix is: '$prefix'"); + $restore_params['--sanitize-with-prefix'] = $prefix; + } + + // run the restore command + Artisan::call('snipeit:restore', + $restore_params + ); // If it's greater than 300, it probably worked $output = Artisan::output(); diff --git a/app/Http/Controllers/StatuslabelsController.php b/app/Http/Controllers/StatuslabelsController.php index 535117e97f..21a7c798b9 100755 --- a/app/Http/Controllers/StatuslabelsController.php +++ b/app/Http/Controllers/StatuslabelsController.php @@ -69,7 +69,7 @@ class StatuslabelsController extends Controller // Save the Statuslabel data $statusLabel->name = $request->input('name'); - $statusLabel->user_id = Auth::id(); + $statusLabel->created_by = auth()->id(); $statusLabel->notes = $request->input('notes'); $statusLabel->deployable = $statusType['deployable']; $statusLabel->pending = $statusType['pending']; diff --git a/app/Http/Controllers/SuppliersController.php b/app/Http/Controllers/SuppliersController.php index e96e32b84f..605bb66f6d 100755 --- a/app/Http/Controllers/SuppliersController.php +++ b/app/Http/Controllers/SuppliersController.php @@ -62,7 +62,7 @@ class SuppliersController extends Controller $supplier->email = request('email'); $supplier->notes = request('notes'); $supplier->url = $supplier->addhttp(request('url')); - $supplier->user_id = Auth::id(); + $supplier->created_by = auth()->id(); $supplier = $request->handleImages($supplier); if ($supplier->save()) { diff --git a/app/Http/Controllers/Users/BulkUsersController.php b/app/Http/Controllers/Users/BulkUsersController.php index 1a8f84b7a1..fbf08c9820 100644 --- a/app/Http/Controllers/Users/BulkUsersController.php +++ b/app/Http/Controllers/Users/BulkUsersController.php @@ -13,6 +13,7 @@ use App\Models\Group; use App\Models\LicenseSeat; use App\Models\ConsumableAssignment; use App\Models\Consumable; +use App\Models\Setting; use App\Models\User; use Carbon\Carbon; use Illuminate\Http\Request; @@ -30,12 +31,12 @@ class BulkUsersController extends Controller * @author [A. Gianotto] [] * @since [v1.7] * @param Request $request - * @return \Illuminate\Contracts\View\View + * @return \Illuminate\Contracts\View\View | \Illuminate\Http\RedirectResponse * @throws \Illuminate\Auth\Access\AuthorizationException */ public function edit(Request $request) { - $this->authorize('update', User::class); + $this->authorize('view', User::class); // Make sure there were users selected if (($request->filled('ids')) && (count($request->input('ids')) > 0)) { @@ -47,16 +48,18 @@ class BulkUsersController extends Controller // bulk edit, display the bulk edit form if ($request->input('bulk_actions') == 'edit') { + $this->authorize('update', User::class); return view('users/bulk-edit', compact('users')) ->with('groups', Group::pluck('name', 'id')); // bulk delete, display the bulk delete confirmation form } elseif ($request->input('bulk_actions') == 'delete') { + $this->authorize('delete', User::class); return view('users/confirm-bulk-delete')->with('users', $users)->with('statuslabel_list', Helper::statusLabelList()); // merge, confirm they have at least 2 users selected and display the merge screen } elseif ($request->input('bulk_actions') == 'merge') { - + $this->authorize('delete', User::class); if (($request->filled('ids')) && (count($request->input('ids')) > 1)) { return view('users/confirm-merge')->with('users', $users); // Not enough users selected, send them back @@ -76,6 +79,33 @@ class BulkUsersController extends Controller } return redirect()->back()->with('success', trans('admin/users/message.password_resets_sent')); + } elseif ($request->input('bulk_actions') == 'print') { + $users = User::query() + ->with([ + 'assets.assetlog', + 'assets.assignedAssets.assetlog', + 'assets.assignedAssets.defaultLoc', + 'assets.assignedAssets.location', + 'assets.assignedAssets.model.category', + 'assets.defaultLoc', + 'assets.location', + 'assets.model.category', + 'accessories.assetlog', + 'accessories.category', + 'accessories.manufacturer', + 'consumables.assetlog', + 'consumables.category', + 'consumables.manufacturer', + 'licenses.category', + ]) + ->withTrashed() + ->findMany($request->input('ids')); + + $users->each(fn($user) => $this->authorize('view', $user)); + + return view('users.print') + ->with('users', $users) + ->with('settings', Setting::getSettings()); } } @@ -101,7 +131,7 @@ class BulkUsersController extends Controller $user_raw_array = $request->input('ids'); // Remove the user from any updates. - $user_raw_array = array_diff($user_raw_array, [Auth::id()]); + $user_raw_array = array_diff($user_raw_array, [auth()->id()]); $manager_conflict = false; $users = User::whereIn('id', $user_raw_array)->where('id', '!=', auth()->id())->get(); @@ -116,6 +146,9 @@ class BulkUsersController extends Controller ->conditionallyAddItem('remote') ->conditionallyAddItem('ldap_import') ->conditionallyAddItem('activated') + ->conditionallyAddItem('start_date') + ->conditionallyAddItem('end_date') + ->conditionallyAddItem('city') ->conditionallyAddItem('autoassign_licenses'); @@ -146,13 +179,24 @@ class BulkUsersController extends Controller $this->update_array['company_id'] = null; } - + if ($request->input('null_start_date')=='1') { + $this->update_array['start_date'] = null; + } + + if ($request->input('null_end_date')=='1') { + $this->update_array['end_date'] = null; + } + + if ($request->input('null_locale')=='1') { + $this->update_array['locale'] = null; + } + if (! $manager_conflict) { $this->conditionallyAddItem('manager_id'); } // Save the updated info User::whereIn('id', $user_raw_array) - ->where('id', '!=', Auth::id())->update($this->update_array); + ->where('id', '!=', auth()->id())->update($this->update_array); if (array_key_exists('location_id', $this->update_array)){ Asset::where('assigned_type', User::class) @@ -214,7 +258,7 @@ class BulkUsersController extends Controller $user_raw_array = request('ids'); - if (($key = array_search(Auth::id(), $user_raw_array)) !== false) { + if (($key = array_search(auth()->id(), $user_raw_array)) !== false) { unset($user_raw_array[$key]); } @@ -279,7 +323,7 @@ class BulkUsersController extends Controller $logAction->item_type = $itemType; $logAction->target_id = $item->assigned_to; $logAction->target_type = User::class; - $logAction->user_id = Auth::id(); + $logAction->created_at = auth()->id(); $logAction->note = 'Bulk checkin items'; $logAction->logaction('checkin from'); } @@ -293,7 +337,7 @@ class BulkUsersController extends Controller $logAction->item_type = Accessory::class; $logAction->target_id = $accessoryUserRow->assigned_to; $logAction->target_type = User::class; - $logAction->user_id = Auth::id(); + $logAction->created_at = auth()->id(); $logAction->note = 'Bulk checkin items'; $logAction->logaction('checkin from'); } @@ -307,7 +351,7 @@ class BulkUsersController extends Controller $logAction->item_type = Consumable::class; $logAction->target_id = $consumableUserRow->assigned_to; $logAction->target_type = User::class; - $logAction->user_id = Auth::id(); + $logAction->created_at = auth()->id(); $logAction->note = 'Bulk checkin items'; $logAction->logaction('checkin from'); } diff --git a/app/Http/Controllers/Users/UserFilesController.php b/app/Http/Controllers/Users/UserFilesController.php index ded44f35f6..e99bfe298f 100644 --- a/app/Http/Controllers/Users/UserFilesController.php +++ b/app/Http/Controllers/Users/UserFilesController.php @@ -7,9 +7,6 @@ use App\Http\Controllers\Controller; use App\Http\Requests\UploadFileRequest; use App\Models\Actionlog; use App\Models\User; -use Illuminate\Support\Facades\Auth; -use Illuminate\Support\Facades\Input; -use Illuminate\Support\Facades\Response; use Symfony\Component\HttpFoundation\JsonResponse; use Illuminate\Support\Facades\Storage; @@ -46,7 +43,7 @@ class UserFilesController extends Controller $logAction = new Actionlog(); $logAction->item_id = $user->id; $logAction->item_type = User::class; - $logAction->user_id = Auth::id(); + $logAction->created_by = auth()->id(); $logAction->note = $request->input('notes'); $logAction->target_id = null; $logAction->created_at = date("Y-m-d H:i:s"); @@ -116,31 +113,30 @@ class UserFilesController extends Controller public function show($userId = null, $fileId = null) { + if (empty($fileId)) { return redirect()->route('users.show')->with('error', 'Invalid file request'); } - $user = User::find($userId); - - // the license is valid - if (isset($user->id)) { + if ($user = User::find($userId)) { $this->authorize('view', $user); if ($log = Actionlog::whereNotNull('filename')->where('item_id', $user->id)->find($fileId)) { + $file = 'private_uploads/users/'.$log->filename; - // Display the file inline - if (request('inline') == 'true') { - $headers = [ - 'Content-Disposition' => 'inline', - ]; - return Storage::download('private_uploads/users/'.$log->filename, $log->filename, $headers); + try { + return StorageHelper::showOrDownloadFile($file, $log->filename); + } catch (\Exception $e) { + return redirect()->route('users.show', ['user' => $user])->with('error', trans('general.file_not_found')); } - - return Storage::download('private_uploads/users/'.$log->filename); } - return redirect()->route('users.index')->with('error', trans('admin/users/message.log_record_not_found')); + // The log record doesn't exist somehow + return redirect()->route('users.show', ['user' => $user])->with('error', trans('general.log_record_not_found')); + + + return redirect()->back()->with('error', trans('general.file_not_found')); } // Redirect to the user management page if the user doesn't exist diff --git a/app/Http/Controllers/Users/UsersController.php b/app/Http/Controllers/Users/UsersController.php index 1e203e71d5..051db1f4ef 100755 --- a/app/Http/Controllers/Users/UsersController.php +++ b/app/Http/Controllers/Users/UsersController.php @@ -186,7 +186,7 @@ class UsersController extends Controller { $this->authorize('update', User::class); - $user = User::with('assets', 'assets.model', 'consumables', 'accessories', 'licenses', 'userloc')->withTrashed()->find($id); + $user = User::with(['assets', 'assets.model', 'consumables', 'accessories', 'licenses', 'userloc'])->withTrashed()->find($id); if ($user) { @@ -214,83 +214,79 @@ class UsersController extends Controller * @return \Illuminate\Http\RedirectResponse * @throws \Illuminate\Auth\Access\AuthorizationException */ - public function update(SaveUserRequest $request, $id = null) + public function update(SaveUserRequest $request, User $user) { $this->authorize('update', User::class); // 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 - - if ((($id == 1) || ($id == 2)) && (config('app.lock_passwords'))) { + if ((($user->id == 1) || ($user->id == 2)) && (config('app.lock_passwords'))) { return redirect()->route('users.index')->with('error', trans('general.permission_denied_superuser_demo')); } - // We need to reverse the UI specific logic for our // permissions here before we update the user. $permissions = $request->input('permissions', []); app('request')->request->set('permissions', $permissions); - $user = User::with('assets', 'assets.model', 'consumables', 'accessories', 'licenses', 'userloc')->withTrashed()->find($id); + $user->load(['assets', 'assets.model', 'consumables', 'accessories', 'licenses', 'userloc'])->withTrashed(); - // User is valid - continue... - if ($user) { - $this->authorize('update', $user); + $this->authorize('update', $user); - // Figure out of this user was an admin before this edit - $orig_permissions_array = $user->decodePermissions(); - $orig_superuser = '0'; - if (is_array($orig_permissions_array)) { - if (array_key_exists('superuser', $orig_permissions_array)) { - $orig_superuser = $orig_permissions_array['superuser']; - } + // Figure out of this user was an admin before this edit + $orig_permissions_array = $user->decodePermissions(); + $orig_superuser = '0'; + if (is_array($orig_permissions_array)) { + if (array_key_exists('superuser', $orig_permissions_array)) { + $orig_superuser = $orig_permissions_array['superuser']; } + } - // Only save groups if the user is a superuser - if (auth()->user()->isSuperUser()) { - $user->groups()->sync($request->input('groups')); - } + // Only save groups if the user is a superuser + if (auth()->user()->isSuperUser()) { + $user->groups()->sync($request->input('groups')); + } - // Update the user fields - $user->username = trim($request->input('username')); - $user->email = trim($request->input('email')); - $user->first_name = $request->input('first_name'); - $user->last_name = $request->input('last_name'); - $user->two_factor_optin = $request->input('two_factor_optin') ?: 0; - $user->locale = $request->input('locale'); - $user->employee_num = $request->input('employee_num'); - $user->activated = $request->input('activated', 0); - $user->jobtitle = $request->input('jobtitle', null); - $user->phone = $request->input('phone'); - $user->location_id = $request->input('location_id', null); - $user->company_id = Company::getIdForUser($request->input('company_id', null)); - $user->manager_id = $request->input('manager_id', null); - $user->notes = $request->input('notes'); - $user->department_id = $request->input('department_id', null); - $user->address = $request->input('address', null); - $user->city = $request->input('city', null); - $user->state = $request->input('state', null); - $user->country = $request->input('country', null); - // if a user is editing themselves we should always keep activated true - $user->activated = $request->input('activated', $request->user()->is($user) ? 1 : 0); - $user->zip = $request->input('zip', null); - $user->remote = $request->input('remote', 0); - $user->vip = $request->input('vip', 0); - $user->website = $request->input('website', null); - $user->start_date = $request->input('start_date', null); - $user->end_date = $request->input('end_date', null); - $user->autoassign_licenses = $request->input('autoassign_licenses', 0); + // Update the user fields + $user->username = trim($request->input('username')); + $user->email = trim($request->input('email')); + $user->first_name = $request->input('first_name'); + $user->last_name = $request->input('last_name'); + $user->two_factor_optin = $request->input('two_factor_optin') ?: 0; + $user->locale = $request->input('locale'); + $user->employee_num = $request->input('employee_num'); + $user->activated = $request->input('activated', 0); + $user->jobtitle = $request->input('jobtitle', null); + $user->phone = $request->input('phone'); + $user->location_id = $request->input('location_id', null); + $user->company_id = Company::getIdForUser($request->input('company_id', null)); + $user->manager_id = $request->input('manager_id', null); + $user->notes = $request->input('notes'); + $user->department_id = $request->input('department_id', null); + $user->address = $request->input('address', null); + $user->city = $request->input('city', null); + $user->state = $request->input('state', null); + $user->country = $request->input('country', null); + // if a user is editing themselves we should always keep activated true + $user->activated = $request->input('activated', $request->user()->is($user) ? 1 : 0); + $user->zip = $request->input('zip', null); + $user->remote = $request->input('remote', 0); + $user->vip = $request->input('vip', 0); + $user->website = $request->input('website', null); + $user->start_date = $request->input('start_date', null); + $user->end_date = $request->input('end_date', null); + $user->autoassign_licenses = $request->input('autoassign_licenses', 0); - // 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)]); + // 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)]); - // Do we want to update the user password? - if ($request->filled('password')) { - $user->password = bcrypt($request->input('password')); - } + // Do we want to update the user password? + if ($request->filled('password')) { + $user->password = bcrypt($request->input('password')); + } // Update the location of any assets checked out to this user @@ -318,13 +314,7 @@ class UsersController extends Controller return redirect()->to(Helper::getRedirectOption($request, $user->id, 'Users')) ->with('success', trans('admin/users/message.success.update')); } - return redirect()->back()->withInput()->withErrors($user->getErrors()); - - - } - - return redirect()->route('users.index')->with('error', trans('admin/users/message.user_not_found', compact('id'))); } /** @@ -382,7 +372,7 @@ class UsersController extends Controller $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->created_by = auth()->id(); $logaction->logaction('restore'); // Redirect them to the deleted page if there are more, otherwise the section index @@ -601,29 +591,43 @@ class UsersController extends Controller /** * Print inventory * - * @author Aladin Alaily * @since [v1.8] - * @return \Illuminate\Http\RedirectResponse + * @author Aladin Alaily */ public function printInventory($id) { $this->authorize('view', User::class); - $user = User::where('id', $id)->withTrashed()->first(); - - // Make sure they can view this particular user - $this->authorize('view', $user); + $user = User::where('id', $id) + ->with([ + 'assets.assetlog', + 'assets.assignedAssets.assetlog', + 'assets.assignedAssets.defaultLoc', + 'assets.assignedAssets.location', + 'assets.assignedAssets.model.category', + 'assets.defaultLoc', + 'assets.location', + 'assets.model.category', + 'accessories.assetlog', + 'accessories.category', + 'accessories.manufacturer', + 'consumables.assetlog', + 'consumables.category', + 'consumables.manufacturer', + 'licenses.category', + ]) + ->withTrashed() + ->first(); - $assets = Asset::where('assigned_to', $id)->where('assigned_type', User::class)->with('model', 'model.category')->get(); - $accessories = $user->accessories()->get(); - $consumables = $user->consumables()->get(); + if ($user) { + $this->authorize('view', $user); - return view('users/print')->with('assets', $assets) - ->with('licenses', $user->licenses()->get()) - ->with('accessories', $accessories) - ->with('consumables', $consumables) - ->with('show_user', $user) - ->with('settings', Setting::getSettings()); + return view('users.print') + ->with('users', [$user]) + ->with('settings', Setting::getSettings()); + } + + return redirect()->route('users.index')->with('error', trans('admin/users/message.user_not_found', compact('id'))); } /** diff --git a/app/Http/Controllers/ViewAssetsController.php b/app/Http/Controllers/ViewAssetsController.php index db4afc8322..12c300e5bd 100755 --- a/app/Http/Controllers/ViewAssetsController.php +++ b/app/Http/Controllers/ViewAssetsController.php @@ -13,6 +13,7 @@ use App\Notifications\RequestAssetNotification; use Illuminate\Http\Request; use Illuminate\Http\RedirectResponse; use \Illuminate\Contracts\View\View; +use Log; /** * This controller handles all actions related to the ability for users @@ -179,8 +180,11 @@ class ViewAssetsController extends Controller $asset->decrement('requests_counter', 1); $logaction->logaction('request canceled'); - $settings->notify(new RequestAssetCancelation($data)); - + try { + $settings->notify(new RequestAssetCancelation($data)); + } catch (\Exception $e) { + Log::warning($e); + } return redirect()->route('requestable-assets') ->with('success')->with('success', trans('admin/hardware/message.requests.canceled')); } @@ -188,7 +192,11 @@ class ViewAssetsController extends Controller $logaction->logaction('requested'); $asset->request(); $asset->increment('requests_counter', 1); - $settings->notify(new RequestAssetNotification($data)); + try { + $settings->notify(new RequestAssetNotification($data)); + } catch (\Exception $e) { + Log::warning($e); + } return redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success')); } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 79027547b1..b69e22e4f9 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -14,6 +14,7 @@ class Kernel extends HttpKernel * @var array */ protected $middleware = [ + \App\Http\Middleware\TrustProxies::class, \App\Http\Middleware\NoSessionStore::class, \Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance::class, \Illuminate\Session\Middleware\StartSession::class, @@ -21,6 +22,7 @@ class Kernel extends HttpKernel \App\Http\Middleware\CheckForSetup::class, \App\Http\Middleware\CheckForDebug::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, + \App\Http\Middleware\TrimStrings::class, \App\Http\Middleware\SecurityHeaders::class, \App\Http\Middleware\PreventBackHistory::class, \Illuminate\Http\Middleware\HandleCors::class, @@ -51,6 +53,10 @@ class Kernel extends HttpKernel \App\Http\Middleware\CheckLocale::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], + + 'health' => [ + + ], ]; /** @@ -67,5 +73,6 @@ class Kernel extends HttpKernel 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, + 'health' => null, ]; } diff --git a/app/Http/Middleware/CheckForSetup.php b/app/Http/Middleware/CheckForSetup.php index 4e399ffcff..6cb593b5ff 100644 --- a/app/Http/Middleware/CheckForSetup.php +++ b/app/Http/Middleware/CheckForSetup.php @@ -7,14 +7,19 @@ use Closure; class CheckForSetup { + + protected $except = [ + '_debugbar*', + 'health' + ]; + public function handle($request, Closure $next, $guard = null) { /** - * This is dumb - * @todo Check on removing this, not sure if it's still needed + * Skip this middleware for the debugbar and health check */ - if ($request->is('_debugbar*')) { + if ($request->is($this->except)) { return $next($request); } @@ -25,7 +30,7 @@ class CheckForSetup return $next($request); } } else { - if (! ($request->is('setup*')) && ! ($request->is('.env')) && ! ($request->is('health'))) { + if (! ($request->is('setup*')) && ! ($request->is('.env'))) { return redirect(config('app.url').'/setup'); } diff --git a/app/Http/Requests/ItemImportRequest.php b/app/Http/Requests/ItemImportRequest.php index 2ea0839c93..a6dc0ad7e5 100644 --- a/app/Http/Requests/ItemImportRequest.php +++ b/app/Http/Requests/ItemImportRequest.php @@ -60,7 +60,7 @@ class ItemImportRequest extends FormRequest $fieldMappings = array_change_key_case(array_flip($import->field_map), CASE_LOWER); } $importer->setCallbacks([$this, 'log'], [$this, 'progress'], [$this, 'errorCallback']) - ->setUserId(Auth::id()) + ->setUserId(auth()->id()) ->setUpdating($this->get('import-update')) ->setShouldNotify($this->get('send-welcome')) ->setUsernameFormat('firstname.lastname') diff --git a/app/Http/Requests/SaveUserRequest.php b/app/Http/Requests/SaveUserRequest.php index b38193c15a..5a47362cfc 100644 --- a/app/Http/Requests/SaveUserRequest.php +++ b/app/Http/Requests/SaveUserRequest.php @@ -6,6 +6,7 @@ use App\Models\Setting; use Illuminate\Contracts\Validation\Validator; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Exceptions\HttpResponseException; +use App\Rules\UserCannotSwitchCompaniesIfItemsAssigned; class SaveUserRequest extends FormRequest { @@ -34,6 +35,7 @@ class SaveUserRequest extends FormRequest $rules = [ 'department_id' => 'nullable|exists:departments,id', 'manager_id' => 'nullable|exists:users,id', + 'company_id' => ['nullable','exists:companies,id'] ]; switch ($this->method()) { @@ -52,11 +54,13 @@ class SaveUserRequest extends FormRequest $rules['first_name'] = 'required|string|min:1'; $rules['username'] = 'required_unless:ldap_import,1|string|min:1'; $rules['password'] = Setting::passwordComplexityRulesSaving('update').'|confirmed'; + $rules['company_id'] = [new UserCannotSwitchCompaniesIfItemsAssigned()]; break; // Save only what's passed case 'PATCH': $rules['password'] = Setting::passwordComplexityRulesSaving('update'); + $rules['company_id'] = [new UserCannotSwitchCompaniesIfItemsAssigned()]; break; default: diff --git a/app/Http/Requests/StoreAssetRequest.php b/app/Http/Requests/StoreAssetRequest.php index b2feb72f79..fb7469ac88 100644 --- a/app/Http/Requests/StoreAssetRequest.php +++ b/app/Http/Requests/StoreAssetRequest.php @@ -9,6 +9,7 @@ use App\Models\Setting; use Carbon\Carbon; use Carbon\Exceptions\InvalidFormatException; use Illuminate\Support\Facades\Gate; +use App\Rules\AssetCannotBeCheckedOutToNondeployableStatus; class StoreAssetRequest extends ImageUploadRequest { @@ -28,7 +29,8 @@ class StoreAssetRequest extends ImageUploadRequest // Guard against users passing in an array for company_id instead of an integer. // If the company_id is not an integer then we simply use what was // provided to be caught by model level validation later. - $idForCurrentUser = is_int($this->company_id) + // The use of is_numeric accounts for 1 and '1'. + $idForCurrentUser = is_numeric($this->company_id) ? Company::getIdForCurrentUser($this->company_id) : $this->company_id; @@ -61,6 +63,7 @@ class StoreAssetRequest extends ImageUploadRequest return array_merge( $modelRules, + ['status_id' => [new AssetCannotBeCheckedOutToNondeployableStatus()]], parent::rules(), ); } diff --git a/app/Http/Requests/StoreLabelSettings.php b/app/Http/Requests/StoreLabelSettings.php new file mode 100644 index 0000000000..a203d2702d --- /dev/null +++ b/app/Http/Requests/StoreLabelSettings.php @@ -0,0 +1,41 @@ +|string> + */ + public function rules(): array + { + return [ + 'labels_per_page' => 'numeric', + 'labels_width' => 'numeric', + 'labels_height' => 'numeric', + 'labels_pmargin_left' => 'numeric|nullable', + 'labels_pmargin_right' => 'numeric|nullable', + 'labels_pmargin_top' => 'numeric|nullable', + 'labels_pmargin_bottom' => 'numeric|nullable', + 'labels_display_bgutter' => 'numeric|nullable', + 'labels_display_sgutter' => 'numeric|nullable', + 'labels_fontsize' => 'numeric|min:5', + 'labels_pagewidth' => 'numeric|nullable', + 'labels_pageheight' => 'numeric|nullable', + 'qr_text' => 'max:31|nullable', + ]; + } +} diff --git a/app/Http/Requests/StoreLdapSettings.php b/app/Http/Requests/StoreLdapSettings.php new file mode 100644 index 0000000000..4197145046 --- /dev/null +++ b/app/Http/Requests/StoreLdapSettings.php @@ -0,0 +1,38 @@ +|string> + */ + public function rules(): array + { + return [ + 'ldap_username_field' => 'not_in:sAMAccountName|required_if:ldap_enabled,1', + 'ldap_auth_filter_query' => 'not_in:uid=samaccountname|required_if:ldap_enabled,1', + 'ldap_filter' => 'nullable|regex:"^[^(]"|required_if:ldap_enabled,1', + 'ldap_server' => 'nullable|required_if:ldap_enabled,1|starts_with:ldap://,ldaps://', + 'ldap_uname' => 'nullable|required_if:ldap_enabled,1', + 'ldap_pword' => 'nullable|required_if:ldap_enabled,1', + 'ldap_basedn' => 'nullable|required_if:ldap_enabled,1', + 'ldap_fname_field' => 'nullable|required_if:ldap_enabled,1', + 'custom_forgot_pass_url' => 'nullable|url', + ]; + } + +} diff --git a/app/Http/Requests/StoreLocalizationSettings.php b/app/Http/Requests/StoreLocalizationSettings.php new file mode 100644 index 0000000000..4cea8826e8 --- /dev/null +++ b/app/Http/Requests/StoreLocalizationSettings.php @@ -0,0 +1,30 @@ +|string> + */ + public function rules(): array + { + return [ + 'default_currency' => 'required', + 'locale' => 'required', + ]; + } +} diff --git a/app/Http/Requests/StoreNotificationSettings.php b/app/Http/Requests/StoreNotificationSettings.php new file mode 100644 index 0000000000..13ce5478ed --- /dev/null +++ b/app/Http/Requests/StoreNotificationSettings.php @@ -0,0 +1,37 @@ +|string> + */ + public function rules(): array + { + return [ + 'alert_email' => 'email_array|nullable', + 'admin_cc_email' => 'email_array|nullable', + 'alert_threshold' => 'numeric|nullable|gt:0', + 'alert_interval' => 'numeric|nullable|gt:0', + 'audit_warning_days' => 'numeric|nullable|gt:0', + 'due_checkin_days' => 'numeric|nullable|gt:0', + 'audit_interval' => 'numeric|nullable|gt:0', + ]; + } + +} diff --git a/app/Http/Requests/StoreSecuritySettings.php b/app/Http/Requests/StoreSecuritySettings.php new file mode 100644 index 0000000000..42a529aa57 --- /dev/null +++ b/app/Http/Requests/StoreSecuritySettings.php @@ -0,0 +1,35 @@ +|string> + */ + public function rules(): array + { + return [ + 'pwd_secure_min' => 'numeric|required|min:8', + 'custom_forgot_pass_url' => 'url|nullable', + 'privacy_policy_link' => 'nullable|url', + 'login_remote_user_enabled' => 'numeric|nullable', + 'login_common_disabled' => 'numeric|nullable', + 'login_remote_user_custom_logout_url' => 'string|nullable', + 'login_remote_user_header_name' => 'string|nullable', + ]; + } +} diff --git a/app/Http/Requests/Traits/MayContainCustomFields.php b/app/Http/Requests/Traits/MayContainCustomFields.php index 9a7f85e3a2..bbdf62893d 100644 --- a/app/Http/Requests/Traits/MayContainCustomFields.php +++ b/app/Http/Requests/Traits/MayContainCustomFields.php @@ -23,7 +23,7 @@ trait MayContainCustomFields return str_starts_with($attributes, '_snipeit_'); }); // if there are custom fields, find the one's that don't exist on the model's fieldset and add an error to the validator's error bag - if (count($request_fields) > 0) { + if (count($request_fields) > 0 && $validator->errors()->isEmpty()) { $request_fields->diff($asset_model?->fieldset?->fields?->pluck('db_column')) ->each(function ($request_field_name) use ($request_fields, $validator) { if (CustomField::where('db_column', $request_field_name)->exists()) { diff --git a/app/Http/Requests/UpdateAssetRequest.php b/app/Http/Requests/UpdateAssetRequest.php index a749e5816b..1b379358f9 100644 --- a/app/Http/Requests/UpdateAssetRequest.php +++ b/app/Http/Requests/UpdateAssetRequest.php @@ -4,6 +4,7 @@ namespace App\Http\Requests; use App\Http\Requests\Traits\MayContainCustomFields; use App\Models\Asset; +use App\Models\Setting; use Illuminate\Support\Facades\Gate; use Illuminate\Validation\Rule; @@ -41,6 +42,12 @@ class UpdateAssetRequest extends ImageUploadRequest ], ); + // if the purchase cost is passed in as a string **and** the digit_separator is ',' (as is common in the EU) + // then we tweak the purchase_cost rule to make it a string + if (Setting::getSettings()->digit_separator === '1.234,56' && is_string($this->input('purchase_cost'))) { + $rules['purchase_cost'] = ['nullable', 'string']; + } + return $rules; } } diff --git a/app/Http/Transformers/AccessoriesTransformer.php b/app/Http/Transformers/AccessoriesTransformer.php index c85c4e86f4..839576c729 100644 --- a/app/Http/Transformers/AccessoriesTransformer.php +++ b/app/Http/Transformers/AccessoriesTransformer.php @@ -38,9 +38,12 @@ class AccessoriesTransformer 'purchase_cost' => Helper::formatCurrencyOutput($accessory->purchase_cost), 'order_number' => ($accessory->order_number) ? e($accessory->order_number) : null, 'min_qty' => ($accessory->min_amt) ? (int) $accessory->min_amt : null, - 'remaining_qty' => (int) $accessory->numRemaining(), + 'remaining_qty' => (int) ($accessory->qty - $accessory->checkouts_count), 'checkouts_count' => $accessory->checkouts_count, - + 'created_by' => ($accessory->adminuser) ? [ + 'id' => (int) $accessory->adminuser->id, + 'name'=> e($accessory->adminuser->present()->fullName()), + ] : null, 'created_at' => Helper::getFormattedDateObject($accessory->created_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($accessory->updated_at, 'datetime'), @@ -57,7 +60,7 @@ class AccessoriesTransformer $permissions_array['user_can_checkout'] = false; - if ($accessory->numRemaining() > 0) { + if (($accessory->qty - $accessory->checkouts_count) > 0) { $permissions_array['user_can_checkout'] = true; } diff --git a/app/Http/Transformers/ActionlogsTransformer.php b/app/Http/Transformers/ActionlogsTransformer.php index 96d74827d2..4e6341c8f3 100644 --- a/app/Http/Transformers/ActionlogsTransformer.php +++ b/app/Http/Transformers/ActionlogsTransformer.php @@ -141,6 +141,8 @@ class ActionlogsTransformer if ($actionlog->item) { if ($actionlog->itemType() == 'asset') { $file_url = route('show/assetfile', ['assetId' => $actionlog->item->id, 'fileId' => $actionlog->id]); + } elseif ($actionlog->itemType() == 'accessory') { + $file_url = route('show.accessoryfile', ['accessoryId' => $actionlog->item->id, 'fileId' => $actionlog->id]); } elseif ($actionlog->itemType() == 'license') { $file_url = route('show.licensefile', ['licenseId' => $actionlog->item->id, 'fileId' => $actionlog->id]); } elseif ($actionlog->itemType() == 'user') { @@ -158,7 +160,6 @@ class ActionlogsTransformer [ 'url' => $file_url, 'filename' => $actionlog->filename, - 'inlineable' => (bool) Helper::show_file_inline($actionlog->filename), ] : null, 'item' => ($actionlog->item) ? [ @@ -176,11 +177,17 @@ class ActionlogsTransformer 'next_audit_date' => ($actionlog->itemType()=='asset') ? Helper::getFormattedDateObject($actionlog->calcNextAuditDate(null, $actionlog->item), 'date'): null, 'days_to_next_audit' => $actionlog->daysUntilNextAudit($settings->audit_interval, $actionlog->item), 'action_type' => $actionlog->present()->actionType(), - 'admin' => ($actionlog->admin) ? [ - 'id' => (int) $actionlog->admin->id, - 'name' => e($actionlog->admin->getFullNameAttribute()), - 'first_name'=> e($actionlog->admin->first_name), - 'last_name'=> e($actionlog->admin->last_name) + 'admin' => ($actionlog->adminuser) ? [ + 'id' => (int) $actionlog->adminuser->id, + 'name' => e($actionlog->adminuser->getFullNameAttribute()), + 'first_name'=> e($actionlog->adminuser->first_name), + 'last_name'=> e($actionlog->adminuser->last_name) + ] : null, + 'created_by' => ($actionlog->adminuser) ? [ + 'id' => (int) $actionlog->adminuser->id, + 'name' => e($actionlog->adminuser->getFullNameAttribute()), + 'first_name'=> e($actionlog->adminuser->first_name), + 'last_name'=> e($actionlog->adminuser->last_name) ] : null, 'target' => ($actionlog->target) ? [ 'id' => (int) $actionlog->target->id, @@ -340,4 +347,4 @@ class ActionlogsTransformer -} \ No newline at end of file +} diff --git a/app/Http/Transformers/AssetMaintenancesTransformer.php b/app/Http/Transformers/AssetMaintenancesTransformer.php index 88ac447c25..81b4a9eabb 100644 --- a/app/Http/Transformers/AssetMaintenancesTransformer.php +++ b/app/Http/Transformers/AssetMaintenancesTransformer.php @@ -64,7 +64,14 @@ class AssetMaintenancesTransformer 'start_date' => Helper::getFormattedDateObject($assetmaintenance->start_date, 'date'), 'asset_maintenance_time' => $assetmaintenance->asset_maintenance_time, 'completion_date' => Helper::getFormattedDateObject($assetmaintenance->completion_date, 'date'), - 'user_id' => ($assetmaintenance->admin) ? ['id' => $assetmaintenance->admin->id, 'name'=> e($assetmaintenance->admin->getFullNameAttribute())] : null, + 'user_id' => ($assetmaintenance->adminuser) ? [ + 'id' => $assetmaintenance->adminuser->id, + 'name'=> e($assetmaintenance->adminuser->present()->fullName()) + ] : null, // legacy to not change the shape of the API + 'created_by' => ($assetmaintenance->adminuser) ? [ + 'id' => (int) $assetmaintenance->adminuser->id, + 'name'=> e($assetmaintenance->adminuser->present()->fullName()), + ] : null, 'created_at' => Helper::getFormattedDateObject($assetmaintenance->created_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($assetmaintenance->updated_at, 'datetime'), 'is_warranty'=> $assetmaintenance->is_warranty, diff --git a/app/Http/Transformers/AssetsTransformer.php b/app/Http/Transformers/AssetsTransformer.php index 17693fccf4..d7ee423249 100644 --- a/app/Http/Transformers/AssetsTransformer.php +++ b/app/Http/Transformers/AssetsTransformer.php @@ -80,6 +80,10 @@ class AssetsTransformer 'assigned_to' => $this->transformAssignedTo($asset), 'warranty_months' => ($asset->warranty_months > 0) ? e($asset->warranty_months.' '.trans('admin/hardware/form.months')) : null, 'warranty_expires' => ($asset->warranty_months > 0) ? Helper::getFormattedDateObject($asset->warranty_expires, 'date') : null, + 'created_by' => ($asset->adminuser) ? [ + 'id' => (int) $asset->adminuser->id, + 'name'=> e($asset->adminuser->present()->fullName()), + ] : null, 'created_at' => Helper::getFormattedDateObject($asset->created_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($asset->updated_at, 'datetime'), 'last_audit_date' => Helper::getFormattedDateObject($asset->last_audit_date, 'datetime'), diff --git a/app/Http/Transformers/CategoriesTransformer.php b/app/Http/Transformers/CategoriesTransformer.php index d5e1ceb51b..2dd82b3b70 100644 --- a/app/Http/Transformers/CategoriesTransformer.php +++ b/app/Http/Transformers/CategoriesTransformer.php @@ -62,6 +62,10 @@ class CategoriesTransformer 'consumables_count' => (int) $category->consumables_count, 'components_count' => (int) $category->components_count, 'licenses_count' => (int) $category->licenses_count, + 'created_by' => ($category->adminuser) ? [ + 'id' => (int) $category->adminuser->id, + 'name'=> e($category->adminuser->present()->fullName()), + ] : null, 'created_at' => Helper::getFormattedDateObject($category->created_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($category->updated_at, 'datetime'), ]; diff --git a/app/Http/Transformers/CompaniesTransformer.php b/app/Http/Transformers/CompaniesTransformer.php index fe8befc27a..530df32044 100644 --- a/app/Http/Transformers/CompaniesTransformer.php +++ b/app/Http/Transformers/CompaniesTransformer.php @@ -30,14 +30,18 @@ class CompaniesTransformer 'fax' => ($company->fax!='') ? e($company->fax): null, 'email' => ($company->email!='') ? e($company->email): null, 'image' => ($company->image) ? Storage::disk('public')->url('companies/'.e($company->image)) : null, - 'created_at' => Helper::getFormattedDateObject($company->created_at, 'datetime'), - 'updated_at' => Helper::getFormattedDateObject($company->updated_at, 'datetime'), 'assets_count' => (int) $company->assets_count, 'licenses_count' => (int) $company->licenses_count, 'accessories_count' => (int) $company->accessories_count, 'consumables_count' => (int) $company->consumables_count, 'components_count' => (int) $company->components_count, 'users_count' => (int) $company->users_count, + 'created_by' => ($company->adminuser) ? [ + 'id' => (int) $company->adminuser->id, + 'name'=> e($company->adminuser->present()->fullName()), + ] : null, + 'created_at' => Helper::getFormattedDateObject($company->created_at, 'datetime'), + 'updated_at' => Helper::getFormattedDateObject($company->updated_at, 'datetime'), ]; $permissions_array['available_actions'] = [ diff --git a/app/Http/Transformers/ComponentsTransformer.php b/app/Http/Transformers/ComponentsTransformer.php index d18870bdc3..f98edd6e3f 100644 --- a/app/Http/Transformers/ComponentsTransformer.php +++ b/app/Http/Transformers/ComponentsTransformer.php @@ -38,6 +38,8 @@ class ComponentsTransformer 'name' => e($component->category->name), ] : null, 'supplier' => ($component->supplier) ? ['id' => $component->supplier->id, 'name'=> e($component->supplier->name)] : null, + 'manufacturer' => ($component->manufacturer) ? ['id' => $component->manufacturer->id, 'name'=> e($component->manufacturer->name)] : null, + 'model_number' => ($component->model_number) ? e($component->model_number) : null, 'order_number' => e($component->order_number), 'purchase_date' => Helper::getFormattedDateObject($component->purchase_date, 'date'), 'purchase_cost' => Helper::formatCurrencyOutput($component->purchase_cost), @@ -47,6 +49,10 @@ class ComponentsTransformer 'name' => e($component->company->name), ] : null, 'notes' => ($component->notes) ? Helper::parseEscapedMarkedownInline($component->notes) : null, + 'created_by' => ($component->adminuser) ? [ + 'id' => (int) $component->adminuser->id, + 'name'=> e($component->adminuser->present()->fullName()), + ] : null, 'created_at' => Helper::getFormattedDateObject($component->created_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($component->updated_at, 'datetime'), 'user_can_checkout' => ($component->numRemaining() > 0) ? 1 : 0, diff --git a/app/Http/Transformers/ConsumablesTransformer.php b/app/Http/Transformers/ConsumablesTransformer.php index d0ae57eef0..b31e31ac96 100644 --- a/app/Http/Transformers/ConsumablesTransformer.php +++ b/app/Http/Transformers/ConsumablesTransformer.php @@ -40,6 +40,10 @@ class ConsumablesTransformer 'purchase_date' => Helper::getFormattedDateObject($consumable->purchase_date, 'date'), 'qty' => (int) $consumable->qty, 'notes' => ($consumable->notes) ? Helper::parseEscapedMarkedownInline($consumable->notes) : null, + 'created_by' => ($consumable->adminuser) ? [ + 'id' => (int) $consumable->adminuser->id, + 'name'=> e($consumable->adminuser->present()->fullName()), + ] : null, 'created_at' => Helper::getFormattedDateObject($consumable->created_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($consumable->updated_at, 'datetime'), ]; diff --git a/app/Http/Transformers/DepreciationReportTransformer.php b/app/Http/Transformers/DepreciationReportTransformer.php index 47d1cbc476..33d9a1f5fd 100644 --- a/app/Http/Transformers/DepreciationReportTransformer.php +++ b/app/Http/Transformers/DepreciationReportTransformer.php @@ -63,15 +63,12 @@ class DepreciationReportTransformer */ if (($asset->model) && ($asset->model->depreciation)) { $depreciated_value = Helper::formatCurrencyOutput($asset->getDepreciatedValue()); - if($asset->model->eol==0 || $asset->model->eol==null ){ - $monthly_depreciation = Helper::formatCurrencyOutput($asset->purchase_cost / $asset->model->depreciation->months); - } - else { - $monthly_depreciation = Helper::formatCurrencyOutput(($asset->model->eol > 0 ? ($asset->purchase_cost / $asset->model->eol) : 0)); - } + $monthly_depreciation =Helper::formatCurrencyOutput($asset->purchase_cost / $asset->model->depreciation->months); $diff = Helper::formatCurrencyOutput(($asset->purchase_cost - $asset->getDepreciatedValue())); } - + else if($asset->model->eol !== null) { + $monthly_depreciation = Helper::formatCurrencyOutput(($asset->model->eol > 0 ? ($asset->purchase_cost / $asset->model->eol) : 0)); + } if ($asset->assigned) { $checkout_target = $asset->assigned->name; diff --git a/app/Http/Transformers/DepreciationsTransformer.php b/app/Http/Transformers/DepreciationsTransformer.php index 87e2ddaca4..64d4c88f7e 100644 --- a/app/Http/Transformers/DepreciationsTransformer.php +++ b/app/Http/Transformers/DepreciationsTransformer.php @@ -28,6 +28,13 @@ class DepreciationsTransformer 'name' => e($depreciation->name), 'months' => $depreciation->months.' '.trans('general.months'), 'depreciation_min' => $depreciation->depreciation_type === 'percent' ? $depreciation->depreciation_min.'%' : $depreciation->depreciation_min, + 'assets_count' => $depreciation->assets_count, + 'models_count' => $depreciation->models_count, + 'licenses_count' => $depreciation->licenses_count, + 'created_by' => ($depreciation->adminuser) ? [ + 'id' => (int) $depreciation->adminuser->id, + 'name'=> e($depreciation->adminuser->present()->fullName()), + ] : null, 'created_at' => Helper::getFormattedDateObject($depreciation->created_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($depreciation->updated_at, 'datetime') ]; diff --git a/app/Http/Transformers/GroupsTransformer.php b/app/Http/Transformers/GroupsTransformer.php index bf7e2bfd70..03e96d5622 100644 --- a/app/Http/Transformers/GroupsTransformer.php +++ b/app/Http/Transformers/GroupsTransformer.php @@ -26,7 +26,10 @@ class GroupsTransformer 'name' => e($group->name), 'permissions' => json_decode($group->permissions), 'users_count' => (int) $group->users_count, - 'created_by' => ($group->admin) ? e($group->admin->present()->fullName) : null, + 'created_by' => ($group->adminuser) ? [ + 'id' => (int) $group->adminuser->id, + 'name'=> e($group->adminuser->present()->fullName()), + ] : null, 'created_at' => Helper::getFormattedDateObject($group->created_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($group->updated_at, 'datetime'), ]; diff --git a/app/Http/Transformers/LicensesTransformer.php b/app/Http/Transformers/LicensesTransformer.php index 4fad9b9a68..673ac06b3d 100644 --- a/app/Http/Transformers/LicensesTransformer.php +++ b/app/Http/Transformers/LicensesTransformer.php @@ -61,7 +61,7 @@ class LicensesTransformer 'checkin' => Gate::allows('checkin', License::class), 'clone' => Gate::allows('create', License::class), 'update' => Gate::allows('update', License::class), - 'delete' => (Gate::allows('delete', License::class) && ($license->seats == $license->availCount()->count())) ? true : false, + 'delete' => (Gate::allows('delete', License::class) && ($license->free_seats_count > 0)) ? true : false, ]; $array += $permissions_array; diff --git a/app/Http/Transformers/ManufacturersTransformer.php b/app/Http/Transformers/ManufacturersTransformer.php index 9c84fd50fe..d6954c1d24 100644 --- a/app/Http/Transformers/ManufacturersTransformer.php +++ b/app/Http/Transformers/ManufacturersTransformer.php @@ -36,6 +36,11 @@ class ManufacturersTransformer 'licenses_count' => (int) $manufacturer->licenses_count, 'consumables_count' => (int) $manufacturer->consumables_count, 'accessories_count' => (int) $manufacturer->accessories_count, + 'components_count' => (int) $manufacturer->components_count, + 'created_by' => ($manufacturer->adminuser) ? [ + 'id' => (int) $manufacturer->adminuser->id, + 'name'=> e($manufacturer->adminuser->present()->fullName()), + ] : null, 'created_at' => Helper::getFormattedDateObject($manufacturer->created_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($manufacturer->updated_at, 'datetime'), 'deleted_at' => Helper::getFormattedDateObject($manufacturer->deleted_at, 'datetime'), diff --git a/app/Http/Transformers/PredefinedKitsTransformer.php b/app/Http/Transformers/PredefinedKitsTransformer.php index a5d37e5c72..b5de12fc08 100644 --- a/app/Http/Transformers/PredefinedKitsTransformer.php +++ b/app/Http/Transformers/PredefinedKitsTransformer.php @@ -2,6 +2,7 @@ namespace App\Http\Transformers; +use App\Helpers\Helper; use App\Models\PredefinedKit; use App\Models\SnipeModel; use Illuminate\Support\Facades\Gate; @@ -30,6 +31,12 @@ class PredefinedKitsTransformer $array = [ 'id' => (int) $kit->id, 'name' => e($kit->name), + 'created_by' => ($kit->adminuser) ? [ + 'id' => (int) $kit->adminuser->id, + 'name'=> e($kit->adminuser->present()->fullName()), + ] : null, + 'created_at' => Helper::getFormattedDateObject($kit->created_at, 'datetime'), + 'updated_at' => Helper::getFormattedDateObject($kit->updated_at, 'datetime'), ]; $permissions_array['available_actions'] = [ diff --git a/app/Http/Transformers/StatuslabelsTransformer.php b/app/Http/Transformers/StatuslabelsTransformer.php index 41dd336068..751edb7016 100644 --- a/app/Http/Transformers/StatuslabelsTransformer.php +++ b/app/Http/Transformers/StatuslabelsTransformer.php @@ -30,6 +30,10 @@ class StatuslabelsTransformer 'default_label' => ($statuslabel->default_label == '1') ? true : false, 'assets_count' => (int) $statuslabel->assets_count, 'notes' => e($statuslabel->notes), + 'created_by' => ($statuslabel->adminuser) ? [ + 'id' => (int) $statuslabel->adminuser->id, + 'name'=> e($statuslabel->adminuser->present()->fullName()), + ] : null, 'created_at' => Helper::getFormattedDateObject($statuslabel->created_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($statuslabel->updated_at, 'datetime'), ]; diff --git a/app/Importer/AssetImporter.php b/app/Importer/AssetImporter.php index 781a6311fe..1112a04e35 100644 --- a/app/Importer/AssetImporter.php +++ b/app/Importer/AssetImporter.php @@ -177,7 +177,7 @@ class AssetImporter extends ItemImporter $this->log('Asset '.$this->item['name'].' with serial number '.$this->item['serial'].' was created'); // If we have a target to checkout to, lets do so. - //-- user_id is a property of the abstract class Importer, which this class inherits from and it's set by + //-- created_by is a property of the abstract class Importer, which this class inherits from and it's set by //-- the class that needs to use it (command importer or GUI importer inside the project). if (isset($target) && ($target !== false)) { if (!is_null($asset->assigned_to)){ @@ -186,7 +186,7 @@ class AssetImporter extends ItemImporter } } - $asset->fresh()->checkOut($target, $this->user_id, $checkout_date, null, 'Checkout from CSV Importer', $asset->name); + $asset->fresh()->checkOut($target, $this->created_by, $checkout_date, null, 'Checkout from CSV Importer', $asset->name); } return; diff --git a/app/Importer/ComponentImporter.php b/app/Importer/ComponentImporter.php index f72d4cbfd7..9687ec4f17 100644 --- a/app/Importer/ComponentImporter.php +++ b/app/Importer/ComponentImporter.php @@ -58,7 +58,7 @@ class ComponentImporter extends ItemImporter if (isset($this->item['asset_tag']) && ($asset = Asset::where('asset_tag', $this->item['asset_tag'])->first())) { $component->assets()->attach($component->id, [ 'component_id' => $component->id, - 'user_id' => $this->user_id, + 'created_by' => $this->created_by, 'created_at' => date('Y-m-d H:i:s'), 'assigned_qty' => 1, // Only assign the first one to the asset 'asset_id' => $asset->id, diff --git a/app/Importer/Importer.php b/app/Importer/Importer.php index c2214ef37d..6f2816c7af 100644 --- a/app/Importer/Importer.php +++ b/app/Importer/Importer.php @@ -21,8 +21,7 @@ abstract class Importer * Id of User performing import * @var */ - - protected $user_id; + protected $created_by; /** * Are we updating items in the import * @var bool @@ -149,21 +148,28 @@ abstract class Importer { $headerRow = $this->csv->fetchOne(); $this->csv->setHeaderOffset(0); //explicitly sets the CSV document header record - $results = $this->normalizeInputArray($this->csv->getRecords($headerRow)); $this->populateCustomFields($headerRow); - DB::transaction(function () use (&$results) { + DB::transaction(function () use ($headerRow) { + $importedItemsCount = 0; Model::unguard(); - $resultsCount = count($results); - foreach ($results as $row) { + + foreach ($this->csv->getRecords($headerRow) as $row) { + //Lowercase header values to ensure we're comparing values properly. + $row = array_change_key_case($row, CASE_LOWER); + $this->handle($row); + + $importedItemsCount++; + if ($this->progressCallback) { - call_user_func($this->progressCallback, $resultsCount); + call_user_func($this->progressCallback, $importedItemsCount); } $this->log('------------- Action Summary ----------------'); } + Model::reguard(); }); } @@ -236,22 +242,6 @@ abstract class Importer return $key; } - /** - * Used to lowercase header values to ensure we're comparing values properly. - * - * @param $results - * @return array - */ - public function normalizeInputArray($results) - { - $newArray = []; - foreach ($results as $index => $arrayToNormalize) { - $newArray[$index] = array_change_key_case($arrayToNormalize); - } - - return $newArray; - } - /** * Figure out the fieldname of the custom field * @@ -395,7 +385,7 @@ abstract class Importer } /** - * Matches a user by user_id if user_name provided is a number + * Matches a user by created_by if user_name provided is a number * @param string $user_name users full name from csv * @return User User Matching ID */ @@ -412,13 +402,13 @@ abstract class Importer /** * Sets the Id of User performing import. * - * @param mixed $user_id the user id + * @param mixed $created_by the user id * * @return self */ - public function setUserId($user_id) + public function setUserId($created_by) { - $this->user_id = $user_id; + $this->created_by = $created_by; return $this; } diff --git a/app/Importer/ItemImporter.php b/app/Importer/ItemImporter.php index 56c9a3cb09..16ae494c1d 100644 --- a/app/Importer/ItemImporter.php +++ b/app/Importer/ItemImporter.php @@ -94,7 +94,7 @@ class ItemImporter extends Importer $this->item['qty'] = $this->findCsvMatch($row, 'quantity'); $this->item['requestable'] = $this->findCsvMatch($row, 'requestable'); - $this->item['user_id'] = $this->user_id; + $this->item['created_by'] = $this->created_by; $this->item['serial'] = $this->findCsvMatch($row, 'serial'); // NO need to call this method if we're running the user import. // TODO: Merge these methods. @@ -309,7 +309,7 @@ class ItemImporter extends Importer $category = new Category(); $category->name = $asset_category; $category->category_type = $item_type; - $category->user_id = $this->user_id; + $category->created_by = $this->created_by; if ($category->save()) { $this->log('Category '.$asset_category.' was created'); @@ -433,7 +433,7 @@ class ItemImporter extends Importer //Otherwise create a manufacturer. $manufacturer = new Manufacturer(); $manufacturer->name = trim($item_manufacturer); - $manufacturer->user_id = $this->user_id; + $manufacturer->created_by = $this->created_by; if ($manufacturer->save()) { $this->log('Manufacturer '.$manufacturer->name.' was created'); @@ -474,7 +474,7 @@ class ItemImporter extends Importer $location->city = ''; $location->state = ''; $location->country = ''; - $location->user_id = $this->user_id; + $location->created_by = $this->created_by; if ($location->save()) { $this->log('Location '.$asset_location.' was created'); @@ -510,7 +510,7 @@ class ItemImporter extends Importer $supplier = new Supplier(); $supplier->name = $item_supplier; - $supplier->user_id = $this->user_id; + $supplier->created_by = $this->created_by; if ($supplier->save()) { $this->log('Supplier '.$item_supplier.' was created'); diff --git a/app/Importer/LicenseImporter.php b/app/Importer/LicenseImporter.php index b7c55cdba6..3f7bb9f85c 100644 --- a/app/Importer/LicenseImporter.php +++ b/app/Importer/LicenseImporter.php @@ -103,13 +103,13 @@ class LicenseImporter extends ItemImporter if ($checkout_target) { $targetLicense->assigned_to = $checkout_target->id; - $targetLicense->user_id = Auth::id(); + $targetLicense->created_by = auth()->id(); if ($asset) { $targetLicense->asset_id = $asset->id; } $targetLicense->save(); } elseif ($asset) { - $targetLicense->user_id = Auth::id(); + $targetLicense->created_by = auth()->id(); $targetLicense->asset_id = $asset->id; $targetLicense->save(); } diff --git a/app/Importer/LocationImporter.php b/app/Importer/LocationImporter.php index e344b6beaf..b3ef59d248 100644 --- a/app/Importer/LocationImporter.php +++ b/app/Importer/LocationImporter.php @@ -65,7 +65,7 @@ class LocationImporter extends ItemImporter $this->item['ldap_ou'] = trim($this->findCsvMatch($row, 'ldap_ou')); $this->item['manager'] = trim($this->findCsvMatch($row, 'manager')); $this->item['manager_username'] = trim($this->findCsvMatch($row, 'manager_username')); - $this->item['user_id'] = auth()->id(); + $this->item['created_by'] = auth()->id(); if ($this->findCsvMatch($row, 'parent_location')) { $this->item['parent_id'] = $this->createOrFetchLocation(trim($this->findCsvMatch($row, 'parent_location'))); diff --git a/app/Importer/UserImporter.php b/app/Importer/UserImporter.php index 4a8d76b68e..036bf15c9a 100644 --- a/app/Importer/UserImporter.php +++ b/app/Importer/UserImporter.php @@ -165,7 +165,7 @@ class UserImporter extends ItemImporter $department = new department(); $department->name = $department_name; - $department->user_id = $this->user_id; + $department->created_by = $this->created_by; if ($department->save()) { $this->log('department ' . $department_name . ' was created'); diff --git a/app/Listeners/CheckoutableListener.php b/app/Listeners/CheckoutableListener.php index 5968632fdc..8fa96acb6a 100644 --- a/app/Listeners/CheckoutableListener.php +++ b/app/Listeners/CheckoutableListener.php @@ -3,14 +3,22 @@ namespace App\Listeners; use App\Events\CheckoutableCheckedOut; +use App\Mail\CheckinAccessoryMail; +use App\Mail\CheckinLicenseMail; +use App\Mail\CheckoutAccessoryMail; +use App\Mail\CheckoutAssetMail; +use App\Mail\CheckinAssetMail; +use App\Mail\CheckoutConsumableMail; +use App\Mail\CheckoutLicenseMail; use App\Models\Accessory; use App\Models\Asset; use App\Models\CheckoutAcceptance; use App\Models\Component; use App\Models\Consumable; use App\Models\LicenseSeat; -use App\Models\Recipients\AdminRecipient; +use App\Models\Location; use App\Models\Setting; +use App\Models\User; use App\Notifications\CheckinAccessoryNotification; use App\Notifications\CheckinAssetNotification; use App\Notifications\CheckinLicenseSeatNotification; @@ -19,9 +27,11 @@ use App\Notifications\CheckoutAssetNotification; use App\Notifications\CheckoutConsumableNotification; use App\Notifications\CheckoutLicenseSeatNotification; use GuzzleHttp\Exception\ClientException; +use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\Notification; use Exception; use Illuminate\Support\Facades\Log; +use Osama\LaravelTeamsNotification\TeamsNotification; class CheckoutableListener { @@ -42,32 +52,56 @@ class CheckoutableListener /** * Make a checkout acceptance and attach it in the notification */ + $settings = Setting::getSettings(); $acceptance = $this->getCheckoutAcceptance($event); + $adminCcEmailsArray = []; + if($settings->admin_cc_email !== '') { + $adminCcEmail = $settings->admin_cc_email; + $adminCcEmailsArray = array_map('trim', explode(',', $adminCcEmail)); + } + $ccEmails = array_filter($adminCcEmailsArray); + $mailable = $this->getCheckoutMailType($event, $acceptance); + $notifiable = $this->getNotifiables($event); + + if (!$event->checkedOutTo->locale){ + $mailable->locale($event->checkedOutTo->locale); + } + // Send email notifications try { - if (! $event->checkedOutTo->locale) { - Notification::locale(Setting::getSettings()->locale)->send( - $this->getNotifiables($event), - $this->getCheckoutNotification($event, $acceptance) - ); - } else { - Notification::send( - $this->getNotifiables($event), - $this->getCheckoutNotification($event, $acceptance) - ); - } + /** + * Send an email if any of the following conditions are met: + * 1. The asset requires acceptance + * 2. The item has a EULA + * 3. The item should send an email at check-in/check-out + */ - if ($this->shouldSendWebhookNotification()) { - - //slack doesn't include the url in its messaging format so this is needed to hit the endpoint - - if(Setting::getSettings()->webhook_selected =='slack' || Setting::getSettings()->webhook_selected =='general') { - - - Notification::route('slack', Setting::getSettings()->webhook_endpoint) - ->notify($this->getCheckoutNotification($event)); - } - } + if ($event->checkoutable->requireAcceptance() || $event->checkoutable->getEula() || + (method_exists($event->checkoutable, 'checkin_email') && $event->checkoutable->checkin_email())) { + if (!empty($notifiable)) { + Mail::to($notifiable)->cc($ccEmails)->send($mailable); + } elseif (!empty($ccEmails)) { + Mail::cc($ccEmails)->send($mailable); + } + Log::info('Sending email, Locale: ' . ($event->checkedOutTo->locale ?? 'default')); + } + } catch (ClientException $e) { + Log::debug("Exception caught during checkout email: " . $e->getMessage()); + } catch (Exception $e) { + Log::debug("Exception caught during checkout email: " . $e->getMessage()); + } +// Send Webhook notification + try{ + if ($this->shouldSendWebhookNotification()) { + if (Setting::getSettings()->webhook_selected === 'microsoft') { + $message = $this->getCheckoutNotification($event)->toMicrosoftTeams(); + $notification = new TeamsNotification(Setting::getSettings()->webhook_endpoint); + $notification->success()->sendMessage($message[0], $message[1]); // Send the message to Microsoft Teams + } else { + Notification::route(Setting::getSettings()->webhook_selected, Setting::getSettings()->webhook_endpoint) + ->notify($this->getCheckoutNotification($event, $acceptance)); + } + } } catch (ClientException $e) { Log::debug("Exception caught during checkout notification: " . $e->getMessage()); } catch (Exception $e) { @@ -75,6 +109,7 @@ class CheckoutableListener } } + /** * Notify the user and post to webhook about the checked in checkoutable */ @@ -100,31 +135,51 @@ class CheckoutableListener } } } + $settings = Setting::getSettings(); + $adminCcEmailsArray = []; + if($settings->admin_cc_email !== '') { + $adminCcEmail = $settings->admin_cc_email; + $adminCcEmailsArray = array_map('trim', explode(',', $adminCcEmail)); + } + $ccEmails = array_filter($adminCcEmailsArray); + $mailable = $this->getCheckinMailType($event); + $notifiable = $this->getNotifiables($event); + + if (!$event->checkedOutTo->locale){ + $mailable->locale($event->checkedOutTo->locale); + } + // Send email notifications try { - // Use default locale - if (! $event->checkedOutTo->locale) { - Notification::locale(Setting::getSettings()->locale)->send( - $this->getNotifiables($event), - $this->getCheckinNotification($event) - ); - } else { - Notification::send( - $this->getNotifiables($event), - $this->getCheckinNotification($event) - ); - } - //slack doesn't include the url in its messaging format so this is needed to hit the endpoint - if(Setting::getSettings()->webhook_selected =='slack' || Setting::getSettings()->webhook_selected =='general') { + /** + * Send an email if any of the following conditions are met: + * 1. The asset requires acceptance + * 2. The item has a EULA + * 3. The item should send an email at check-in/check-out + */ + if ($event->checkoutable->requireAcceptance() || $event->checkoutable->getEula() || + (method_exists($event->checkoutable, 'checkin_email') && $event->checkoutable->checkin_email())) { + if (!empty($notifiable)) { + Mail::to($notifiable)->cc($ccEmails)->send($mailable); + } elseif (!empty($ccEmails)){ + Mail::cc($ccEmails)->send($mailable); + } + Log::info('Sending email, Locale: ' . $event->checkedOutTo->locale); + } + } catch (ClientException $e) { + Log::debug("Exception caught during checkin email: " . $e->getMessage()); + } catch (Exception $e) { + Log::debug("Exception caught during checkin email: " . $e->getMessage()); + } - if ($this->shouldSendWebhookNotification()) { - Notification::route('slack', Setting::getSettings()->webhook_endpoint) + // Send Webhook notification + try { + if ($this->shouldSendWebhookNotification()) { + Notification::route(Setting::getSettings()->webhook_selected, Setting::getSettings()->webhook_endpoint) ->notify($this->getCheckinNotification($event)); } - } - } catch (ClientException $e) { - Log::warning("Exception caught during checkout notification: " . $e->getMessage()); + Log::warning("Exception caught during checkin notification: " . $e->getMessage()); } catch (Exception $e) { Log::warning("Exception caught during checkin notification: " . $e->getMessage()); } @@ -153,33 +208,6 @@ class CheckoutableListener return $acceptance; } - /** - * Gets the entities to be notified of the passed event - * - * @param Event $event - * @return Collection - */ - private function getNotifiables($event) - { - $notifiables = collect(); - - /** - * Notify who checked out the item as long as the model can route notifications - */ - if (method_exists($event->checkedOutTo, 'routeNotificationFor')) { - $notifiables->push($event->checkedOutTo); - } - - /** - * Notify Admin users if the settings is activated - */ - if ((Setting::getSettings()) && (Setting::getSettings()->admin_cc_email != '')) { - $notifiables->push(new AdminRecipient()); - } - - return $notifiables; - } - /** * Get the appropriate notification for the event * @@ -228,7 +256,7 @@ class CheckoutableListener break; case Consumable::class: $notificationClass = CheckoutConsumableNotification::class; - break; + break; case LicenseSeat::class: $notificationClass = CheckoutLicenseSeatNotification::class; break; @@ -237,6 +265,43 @@ class CheckoutableListener return new $notificationClass($event->checkoutable, $event->checkedOutTo, $event->checkedOutBy, $acceptance, $event->note); } + private function getCheckoutMailType($event, $acceptance){ + $lookup = [ + Accessory::class => CheckoutAccessoryMail::class, + Asset::class => CheckoutAssetMail::class, + LicenseSeat::class => CheckoutLicenseMail::class, + Consumable::class => CheckoutConsumableMail::class, + ]; + $mailable= $lookup[get_class($event->checkoutable)]; + + return new $mailable($event->checkoutable, $event->checkedOutTo, $event->checkedOutBy, $event->note, $acceptance); + + } + private function getCheckinMailType($event){ + $lookup = [ + Accessory::class => CheckinAccessoryMail::class, + Asset::class => CheckinAssetMail::class, + LicenseSeat::class => CheckinLicenseMail::class, + ]; + + $mailable= $lookup[get_class($event->checkoutable)]; + + return new $mailable($event->checkoutable, $event->checkedOutTo, $event->checkedInBy, $event->note); + + } + private function getNotifiables($event){ + + if($event->checkedOutTo instanceof Asset){ + $event->checkedOutTo->load('assignedTo'); + return $event->checkedOutTo->assignedto?->email ?? ''; + } + else if($event->checkedOutTo instanceof Location) { + return $event->checkedOutTo->manager?->email ?? ''; + } + else{ + return $event->checkedOutTo->email; + } + } /** * Register the listeners for the subscriber. diff --git a/app/Listeners/LogListener.php b/app/Listeners/LogListener.php index b44fcdfcb4..6dbeb7312c 100644 --- a/app/Listeners/LogListener.php +++ b/app/Listeners/LogListener.php @@ -111,7 +111,7 @@ class LogListener $logaction->target_type = User::class; $logaction->action_type = 'merged'; $logaction->note = trans('general.merged_log_this_user_from', $to_from_array); - $logaction->user_id = $event->admin->id ?? null; + $logaction->created_by = $event->admin->id ?? null; $logaction->save(); // Add a record to the users being merged TO @@ -122,7 +122,7 @@ class LogListener $logaction->item_type = User::class; $logaction->action_type = 'merged'; $logaction->note = trans('general.merged_log_this_user_into', $to_from_array); - $logaction->user_id = $event->admin->id ?? null; + $logaction->created_by = $event->admin->id ?? null; $logaction->save(); diff --git a/app/Livewire/CustomFieldSetDefaultValuesForModel.php b/app/Livewire/CustomFieldSetDefaultValuesForModel.php index a4a9f9fe71..f45b62ce16 100644 --- a/app/Livewire/CustomFieldSetDefaultValuesForModel.php +++ b/app/Livewire/CustomFieldSetDefaultValuesForModel.php @@ -2,6 +2,8 @@ namespace App\Livewire; +use App\Models\CustomField; +use Livewire\Attributes\Computed; use Livewire\Component; use App\Models\CustomFieldset; @@ -12,37 +14,101 @@ class CustomFieldSetDefaultValuesForModel extends Component public $add_default_values; public $fieldset_id; - public $fields; public $model_id; - public function mount() + public array $selectedValues = []; + + public function mount($model_id = null) { - if(is_null($this->model_id)){ - return; - } - - $this->model = AssetModel::find($this->model_id); // It's possible to do some clever route-model binding here, but let's keep it simple, shall we? - $this->fieldset_id = $this->model->fieldset_id; + $this->model_id = $model_id; + $this->fieldset_id = $this->model?->fieldset_id; + $this->add_default_values = ($this->model?->defaultValues->count() > 0); - $this->fields = null; - - if ($fieldset = CustomFieldset::find($this->fieldset_id)) { - $this->fields = CustomFieldset::find($this->fieldset_id)->fields; - } - - $this->add_default_values = ($this->model->defaultValues->count() > 0); + $this->initializeSelectedValuesArray(); + $this->populatedSelectedValuesArray(); } - public function updatedFieldsetId() + #[Computed] + public function model() { - if (CustomFieldset::find($this->fieldset_id)) { - $this->fields = CustomFieldset::find($this->fieldset_id)->fields; + return AssetModel::find($this->model_id); + } + + #[Computed] + public function fields() + { + $customFieldset = CustomFieldset::find($this->fieldset_id); + + if ($customFieldset) { + return $customFieldset?->fields; } - + + return collect(); } public function render() { return view('livewire.custom-field-set-default-values-for-model'); } + + /** + * Livewire property binding plays nicer with arrays when it knows + * which keys will be present instead of them being + * dynamically added (this is especially true for checkboxes). + * + * Let's go ahead and initialize selectedValues with all the potential keys (custom field db_columns). + * + * @return void + */ + private function initializeSelectedValuesArray(): void + { + CustomField::all()->each(function ($field) { + $this->selectedValues[$field->db_column] = null; + + if ($field->element === 'checkbox') { + $this->selectedValues[$field->db_column] = []; + } + }); + } + + /** + * Populate the selectedValues array with the + * default values or old input for each field. + * + * @return void + */ + private function populatedSelectedValuesArray(): void + { + $this->fields->each(function ($field) { + $this->selectedValues[$field->db_column] = $this->getSelectedValueForField($field); + + // if the element is a checkbox and the value was just sent to null, make it + // an array since Livewire can't bind to non-array values for checkboxes. + if ($field->element === 'checkbox' && is_null($this->selectedValues[$field->db_column])) { + $this->selectedValues[$field->db_column] = []; + } + }); + } + + private function getSelectedValueForField(CustomField $field) + { + $defaultValue = $field->defaultValue($this->model_id); + + // if old() contains a value for default_values that means + // the user has submitted the form and we were redirected + // back with the old input. + // Let's use what they had previously set. + if (old('default_values')) { + $defaultValue = old('default_values.' . $field->id); + } + + // on first load the default value for checkboxes will be + // a comma-separated string but if we're loading the page + // with old input then it was already parsed into an array. + if ($field->element === 'checkbox' && is_string($defaultValue)) { + $defaultValue = explode(', ', $defaultValue); + } + + return $defaultValue; + } } diff --git a/app/Livewire/Importer.php b/app/Livewire/Importer.php index 5af99b35ba..164b6411d6 100644 --- a/app/Livewire/Importer.php +++ b/app/Livewire/Importer.php @@ -3,30 +3,25 @@ namespace App\Livewire; use App\Models\CustomField; -use Livewire\Component; - use App\Models\Import; use Illuminate\Support\Facades\Storage; - -use Illuminate\Foundation\Auth\Access\AuthorizesRequests; - +use Livewire\Attributes\Computed; +use Livewire\Component; class Importer extends Component { - use AuthorizesRequests; - - public $files; - - public $progress; //upload progress - '-1' means don't show + public $progress = -1; //upload progress - '-1' means don't show public $progress_message; - public $progress_bar_class; + public $progress_bar_class = 'progress-bar-warning'; public $message; //status/error message? public $message_type; //success/error? //originally from ImporterFile public $import_errors; // - public ?Import $activeFile = null; + public $activeFileId; + public $headerRow = []; + public $typeOfImport; public $importTypes; public $columnOptions; public $statusType; @@ -35,7 +30,6 @@ class Importer extends Component public $send_welcome; public $run_backup; public $field_map; // we need a separate variable for the field-mapping, because the keys in the normal array are too complicated for Livewire to understand - public $file_id; // TODO: I can't figure out *why* we need this, but it really seems like we do. I can't seem to pull the id from the activeFile for some reason? // Make these variables public - we set the properties in the constructor so we can localize them (versus the old static arrays) public $accessories_fields; @@ -51,10 +45,8 @@ class Importer extends Component 'files.*.file_path' => 'required|string', 'files.*.created_at' => 'required|string', 'files.*.filesize' => 'required|integer', - 'activeFile' => 'Import', - 'activeFile.import_type' => 'string', - 'activeFile.field_map' => 'array', - 'activeFile.header_row' => 'array', + 'headerRow' => 'array', + 'typeOfImport' => 'string', 'field_map' => 'array' ]; @@ -68,15 +60,13 @@ class Importer extends Component { $tmp = array(); if ($this->activeFile) { - $tmp = array_combine($this->activeFile->header_row, $this->field_map); + $tmp = array_combine($this->headerRow, $this->field_map); $tmp = array_filter($tmp); } return json_encode($tmp); } - - private function getColumns($type) { \Log::error($type); @@ -120,17 +110,15 @@ class Importer extends Component return $results; } - public function updating($name, $new_import_type) + public function updatingTypeOfImport($type) { - if ($name == "activeFile.import_type") { - // go through each header, find a matching field to try and map it to. - foreach ($this->activeFile->header_row as $i => $header) { + foreach ($this->headerRow as $i => $header) { // do we have something mapped already? if (array_key_exists($i, $this->field_map)) { // yes, we do. Is it valid for this type of import? // (e.g. the import type might have been changed...?) - if (array_key_exists($this->field_map[$i], $this->columnOptions[$new_import_type])) { + if (array_key_exists($this->field_map[$i], $this->columnOptions[$type])) { //yes, this key *is* valid. Continue on to the next field. continue; } else { @@ -140,9 +128,9 @@ class Importer extends Component } // TODO - strictly speaking, this isn't necessary here I don't think. } // first, check for exact matches - foreach ($this->columnOptions[$new_import_type] as $value => $text) { + foreach ($this->columnOptions[$type] as $v => $text) { if (strcasecmp($text, $header) === 0) { // case-INSENSITIVe on purpose! - $this->field_map[$i] = $value; + $this->field_map[$i] = $v; continue 2; //don't bother with the alias check, go to the next header } } @@ -154,7 +142,7 @@ class Importer extends Component // Make *absolutely* sure that this key actually _exists_ in this import type - // you can trigger this by importing accessories with a 'Warranty' column (which don't exist // in "Accessories"!) - if (array_key_exists($key, $this->columnOptions[$new_import_type])) { + if (array_key_exists($key, $this->columnOptions[$type])) { $this->field_map[$i] = $key; continue 3; // bust out of both of these loops; as well as the surrounding one - e.g. move on to the next header } @@ -163,20 +151,12 @@ class Importer extends Component } // and if you got here, we got nothing. Let's recommend 'null' $this->field_map[$i] = null; // Booooo :( - } } } - public function boot() { // FIXME - delete or undelete. - ///////$this->activeFile = null; // I do *not* understand why I have to do this, but, well, whatever. - } - - public function mount() { $this->authorize('import'); - $this->progress = -1; // '-1' means 'don't show the progressbar' - $this->progress_bar_class = 'progress-bar-warning'; $this->importTypes = [ 'asset' => trans('general.assets'), 'accessory' => trans('general.accessories'), @@ -191,7 +171,7 @@ class Importer extends Component /** * These are the item-type specific columns */ - $this->accessories_fields = [ + $this->accessories_fields = [ 'company' => trans('general.company'), 'location' => trans('general.location'), 'quantity' => trans('general.qty'), @@ -223,7 +203,6 @@ class Importer extends Component 'supplier' => trans('general.supplier'), 'purchase_cost' => trans('general.purchase_cost'), 'purchase_date' => trans('general.purchase_date'), - 'purchase_order' => trans('admin/licenses/form.purchase_order'), 'asset_notes' => trans('general.item_notes', ['item' => trans('admin/hardware/general.asset')]), 'model_notes' => trans('general.item_notes', ['item' => trans('admin/hardware/form.model')]), 'manufacturer' => trans('general.manufacturer'), @@ -314,7 +293,7 @@ class Importer extends Component 'manufacturer' => trans('general.manufacturer'), ]; - $this->users_fields = [ + $this->users_fields = [ 'id' => trans('general.id'), 'company' => trans('general.company'), 'location' => trans('general.location'), @@ -339,12 +318,12 @@ class Importer extends Component 'website' => trans('general.website'), 'avatar' => trans('general.image'), 'gravatar' => trans('general.importer.gravatar'), - 'start_date' => trans('general.start_date'), - 'end_date' => trans('general.end_date'), - 'employee_num' => trans('general.employee_number'), + 'start_date' => trans('general.start_date'), + 'end_date' => trans('general.end_date'), + 'employee_num' => trans('general.employee_number'), ]; - $this->locations_fields = [ + $this->locations_fields = [ 'name' => trans('general.item_name_var', ['item' => trans('general.location')]), 'address' => trans('general.address'), 'address2' => trans('general.importer.address2'), @@ -529,7 +508,7 @@ class Importer extends Component ]; $this->columnOptions[''] = $this->getColumns(''); //blank mode? I don't know what this is supposed to mean - foreach($this->importTypes AS $type => $name) { + foreach ($this->importTypes as $type => $name) { $this->columnOptions[$type] = $this->getColumns($type); } if ($this->activeFile) { @@ -541,7 +520,7 @@ class Importer extends Component { $this->clearMessage(); - $this->activeFile = Import::find($id); + $this->activeFileId = $id; if (!$this->activeFile) { $this->message = trans('admin/hardware/message.import.file_missing'); @@ -549,10 +528,13 @@ class Importer extends Component return; } - $this->field_map = null; - foreach($this->activeFile->header_row as $element) { + $this->headerRow = $this->activeFile->header_row; + $this->typeOfImport = $this->activeFile->import_type; - if(isset($this->activeFile->field_map[$element])) { + $this->field_map = null; + foreach ($this->headerRow as $element) { + + if (isset($this->activeFile->field_map[$element])) { $this->field_map[] = $this->activeFile->field_map[$element]; } else { $this->field_map[] = null; // re-inject the 'nulls' if a file was imported with some 'Do Not Import' settings @@ -567,16 +549,31 @@ class Importer extends Component public function destroy($id) { - // TODO: why don't we just do File::find($id)? This seems dumb. - foreach($this->files as $file) { - if ($id == $file->id) { - if (Storage::delete('private_uploads/imports/'.$file->file_path)) { - $file->delete(); + $this->authorize('import'); + $import = Import::find($id); + + // Check that the import wasn't deleted after while page was already loaded... + // @todo: next up...handle the file being missing for other interactions... + // for example having an import open in two tabs, deleting it, and then changing + // the import type in the other tab. The error message below wouldn't display in that case. + if (!$import) { + $this->message = trans('admin/hardware/message.import.file_already_deleted'); + $this->message_type = 'danger'; + + return; + } + + if (Storage::delete('private_uploads/imports/' . $import->file_path)) { + $import->delete(); $this->message = trans('admin/hardware/message.import.file_delete_success'); $this->message_type = 'success'; + + unset($this->files); + return; - } else { + } + $this->message = trans('admin/hardware/message.import.file_delete_error'); $this->message_type = 'danger'; } @@ -590,9 +587,20 @@ class Importer extends Component $this->message_type = null; } + #[Computed] + public function files() + { + return Import::orderBy('id', 'desc')->get(); + } + + #[Computed] + public function activeFile() + { + return Import::find($this->activeFileId); + } + public function render() { - $this->files = Import::orderBy('id','desc')->get(); //HACK - slows down renders. return view('livewire.importer') ->extends('layouts.default') ->section('content'); diff --git a/app/Livewire/OauthClients.php b/app/Livewire/OauthClients.php index fda91260c8..017e789060 100644 --- a/app/Livewire/OauthClients.php +++ b/app/Livewire/OauthClients.php @@ -47,10 +47,10 @@ class OauthClients extends Component { // test for safety // ->delete must be of type Client - thus the model binding - if ($clientId->user_id == auth()->id()) { + if ($clientId->created_by == auth()->id()) { app(ClientRepository::class)->delete($clientId); } else { - Log::warning('User ' . auth()->id() . ' attempted to delete client ' . $clientId->id . ' which belongs to user ' . $clientId->user_id); + Log::warning('User ' . auth()->id() . ' attempted to delete client ' . $clientId->id . ' which belongs to user ' . $clientId->created_by); $this->authorizationError = 'You are not authorized to delete this client.'; } } @@ -58,10 +58,10 @@ class OauthClients extends Component public function deleteToken($tokenId): void { $token = app(TokenRepository::class)->find($tokenId); - if ($token->user_id == auth()->id()) { + if ($token->created_by == auth()->id()) { app(TokenRepository::class)->revokeAccessToken($tokenId); } else { - Log::warning('User ' . auth()->id() . ' attempted to delete token ' . $tokenId . ' which belongs to user ' . $token->user_id); + Log::warning('User ' . auth()->id() . ' attempted to delete token ' . $tokenId . ' which belongs to user ' . $token->created_by); $this->authorizationError = 'You are not authorized to delete this token.'; } } @@ -84,12 +84,12 @@ class OauthClients extends Component ]); $client = app(ClientRepository::class)->find($editClientId->id); - if ($client->user_id == auth()->id()) { + if ($client->created_by == auth()->id()) { $client->name = $this->editName; $client->redirect = $this->editRedirect; $client->save(); } else { - Log::warning('User ' . auth()->id() . ' attempted to edit client ' . $editClientId->id . ' which belongs to user ' . $client->user_id); + Log::warning('User ' . auth()->id() . ' attempted to edit client ' . $editClientId->id . ' which belongs to user ' . $client->created_by); $this->authorizationError = 'You are not authorized to edit this client.'; } diff --git a/app/Livewire/SlackSettingsForm.php b/app/Livewire/SlackSettingsForm.php index 45b8b7b41e..64196b5dd9 100644 --- a/app/Livewire/SlackSettingsForm.php +++ b/app/Livewire/SlackSettingsForm.php @@ -4,10 +4,11 @@ namespace App\Livewire; use GuzzleHttp\Client; use Illuminate\Support\Facades\Http; +use Illuminate\Support\Str; use Livewire\Component; use App\Models\Setting; use App\Helpers\Helper; - +use Osama\LaravelTeamsNotification\TeamsNotification; class SlackSettingsForm extends Component { public $webhook_endpoint; @@ -19,6 +20,7 @@ class SlackSettingsForm extends Component public $webhook_placeholder; public $webhook_icon; public $webhook_selected; + public $teams_webhook_deprecated; public array $webhook_text; public Setting $setting; @@ -62,7 +64,7 @@ class SlackSettingsForm extends Component "name" => trans('admin/settings/general.ms_teams'), "icon" => "fa-brands fa-microsoft", "placeholder" => "https://abcd.webhook.office.com/webhookb2/XXXXXXX", - "link" => "https://learn.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook?tabs=dotnet#create-incoming-webhooks-1", + "link" => "https://support.microsoft.com/en-us/office/create-incoming-webhooks-with-workflows-for-microsoft-teams-8ae491c7-0394-4861-ba59-055e33f75498", "test" => "msTeamTestWebhook" ), ]; @@ -79,15 +81,17 @@ class SlackSettingsForm extends Component $this->webhook_channel = $this->setting->webhook_channel; $this->webhook_botname = $this->setting->webhook_botname; $this->webhook_options = $this->setting->webhook_selected; - if($this->webhook_selected == 'microsoft' || $this->webhook_selected == 'google'){ + $this->teams_webhook_deprecated = !Str::contains($this->webhook_endpoint, 'workflows'); + if($this->webhook_selected === 'microsoft' || $this->webhook_selected === 'google'){ $this->webhook_channel = '#NA'; } - if($this->setting->webhook_endpoint != null && $this->setting->webhook_channel != null){ $this->isDisabled= ''; } - + if($this->webhook_selected === 'microsoft' && $this->teams_webhook_deprecated) { + session()->flash('warning', 'The selected Microsoft Teams webhook URL will be deprecated Jan 31st, 2025. Please use a workflow URL. Microsofts Documentation on creating a workflow can be found here.'); + } } public function updated($field) { @@ -109,7 +113,6 @@ class SlackSettingsForm extends Component if($this->webhook_selected == 'microsoft' || $this->webhook_selected == 'google'){ $this->webhook_channel = '#NA'; } - } private function isButtonDisabled() { @@ -126,7 +129,9 @@ class SlackSettingsForm extends Component public function render() { $this->isButtonDisabled(); + return view('livewire.slack-settings-form'); + } public function testWebhook(){ @@ -236,20 +241,32 @@ class SlackSettingsForm extends Component } public function msTeamTestWebhook(){ - $payload = - [ - "@type" => "MessageCard", - "@context" => "http://schema.org/extensions", - "summary" => trans('mail.snipe_webhook_summary'), - "title" => trans('mail.snipe_webhook_test'), - "text" => trans('general.webhook_test_msg', ['app' => $this->webhook_name]), - ]; + try { - try { - $response = Http::withHeaders([ - 'content-type' => 'applications/json', - ])->post($this->webhook_endpoint, - $payload)->throw(); + if($this->teams_webhook_deprecated){ + //will use the deprecated webhook format + $payload = + [ + "@type" => "MessageCard", + "@context" => "http://schema.org/extensions", + "summary" => trans('mail.snipe_webhook_summary'), + "title" => trans('mail.snipe_webhook_test'), + "text" => trans('general.webhook_test_msg', ['app' => $this->webhook_name]), + ]; + $response = Http::withHeaders([ + 'content-type' => 'applications/json', + ])->post($this->webhook_endpoint, + $payload)->throw(); + } + else { + $notification = new TeamsNotification($this->webhook_endpoint); + $message = trans('general.webhook_test_msg', ['app' => $this->webhook_name]); + $notification->success()->sendMessage($message); + + $response = Http::withHeaders([ + 'content-type' => 'applications/json', + ])->post($this->webhook_endpoint); + } if(($response->getStatusCode() == 302)||($response->getStatusCode() == 301)){ return session()->flash('error' , trans('admin/settings/message.webhook.error_redirect', ['endpoint' => $this->webhook_endpoint])); diff --git a/app/Mail/CheckinAccessoryMail.php b/app/Mail/CheckinAccessoryMail.php new file mode 100644 index 0000000000..fc8d1455f9 --- /dev/null +++ b/app/Mail/CheckinAccessoryMail.php @@ -0,0 +1,70 @@ +item = $accessory; + $this->target = $checkedOutTo; + $this->admin = $checkedInby; + $this->note = $note; + $this->settings = Setting::getSettings(); + } + + /** + * Get the message envelope. + */ + public function envelope(): Envelope + { + $from = new Address(env('MAIL_FROM_ADDR','service@snipe-it.io')); + + return new Envelope( + from: $from, + subject: trans('mail.Accessory_Checkin_Notification'), + ); + } + + /** + * Get the message content definition. + */ + public function content(): Content + { + return new Content( + markdown: 'mail.markdown.checkin-accessory', + with: [ + 'item' => $this->item, + 'admin' => $this->admin, + 'note' => $this->note, + 'target' => $this->target, + ] + ); + } + + /** + * Get the attachments for the message. + * + * @return array + */ + public function attachments(): array + { + return []; + } +} diff --git a/app/Mail/CheckinAssetMail.php b/app/Mail/CheckinAssetMail.php new file mode 100644 index 0000000000..5dd8394a5a --- /dev/null +++ b/app/Mail/CheckinAssetMail.php @@ -0,0 +1,93 @@ +target = $checkedOutTo; + $this->item = $asset; + $this->admin = $checkedInBy; + $this->note = $note; + + $this->settings = Setting::getSettings(); + $this->expected_checkin = ''; + + if ($this->item->expected_checkin) { + $this->expected_checkin = Helper::getFormattedDateObject($this->item->expected_checkin, 'date', + false); + } + } + + /** + * Get the message envelope. + */ + public function envelope(): Envelope + { + $from = new Address(env('MAIL_FROM_ADDR','service@snipe-it.io')); + + return new Envelope( + from: $from, + subject: trans('mail.Asset_Checkin_Notification'), + ); + } + + /** + * Get the mail representation of the notification. + * + * @param mixed $notifiable + * @return Content + */ + public function content(): Content + { + $this->item->load('assetstatus'); + $fields = []; + + // Check if the item has custom fields associated with it + if (($this->item->model) && ($this->item->model->fieldset)) { + $fields = $this->item->model->fieldset->fields; + } + + return new Content( + markdown: 'mail.markdown.checkin-asset', + with: [ + 'item' => $this->item, + 'status' => $this->item->assetstatus?->name, + 'admin' => $this->admin, + 'note' => $this->note, + 'target' => $this->target, + 'fields' => $fields, + 'expected_checkin' => $this->expected_checkin, + ], + ); + } + + /** + * Get the attachments for the message. + * + * @return array + */ + public function attachments(): array + { + return []; + } +} diff --git a/app/Mail/CheckinLicenseMail.php b/app/Mail/CheckinLicenseMail.php new file mode 100644 index 0000000000..8957f367ef --- /dev/null +++ b/app/Mail/CheckinLicenseMail.php @@ -0,0 +1,71 @@ +target = $checkedOutTo; + $this->item = $licenseSeat; + $this->admin = $checkedInBy; + $this->note = $note; + $this->settings = Setting::getSettings(); + } + + /** + * Get the message envelope. + */ + public function envelope(): Envelope + { + $from = new Address(env('MAIL_FROM_ADDR','service@snipe-it.io')); + + return new Envelope( + from: $from, + subject: trans('mail.License_Checkin_Notification'), + ); + } + + /** + * Get the message content definition. + */ + public function content(): Content + { + return new Content( + markdown: 'mail.markdown.checkin-license', + with: [ + 'license_seat' => $this->item, + 'license' => $this->item->license, + 'admin' => $this->admin, + 'note' => $this->note, + 'target' => $this->target, + ] + ); + } + + /** + * Get the attachments for the message. + * + * @return array + */ + public function attachments(): array + { + return []; + } +} diff --git a/app/Mail/CheckoutAccessoryMail.php b/app/Mail/CheckoutAccessoryMail.php new file mode 100644 index 0000000000..f297c02754 --- /dev/null +++ b/app/Mail/CheckoutAccessoryMail.php @@ -0,0 +1,82 @@ +item = $accessory; + $this->admin = $checkedOutBy; + $this->note = $note; + $this->checkout_qty = $accessory->checkout_qty; + $this->target = $checkedOutTo; + $this->acceptance = $acceptance; + $this->settings = Setting::getSettings(); + } + + /** + * Get the message envelope. + */ + public function envelope(): Envelope + { + $from = new Address(env('MAIL_FROM_ADDR','service@snipe-it.io')); + + return new Envelope( + from: $from, + subject: (trans('mail.Accessory_Checkout_Notification')), + ); + } + + /** + * Get the message content definition. + */ + public function content(): Content + { + Log::debug($this->item->getImageUrl()); + $eula = $this->item->getEula(); + $req_accept = $this->item->requireAcceptance(); + $accept_url = is_null($this->acceptance) ? null : route('account.accept.item', $this->acceptance); + + return new Content( + markdown: 'mail.markdown.checkout-accessory', + with: [ + 'item' => $this->item, + 'admin' => $this->admin, + 'note' => $this->note, + 'target' => $this->target, + 'eula' => $eula, + 'req_accept' => $req_accept, + 'accept_url' => $accept_url, + 'checkout_qty' => $this->checkout_qty, + ], + ); + } + + /** + * Get the attachments for the message. + * + * @return array + */ + public function attachments(): array + { + return []; + } +} diff --git a/app/Mail/CheckoutAssetMail.php b/app/Mail/CheckoutAssetMail.php new file mode 100644 index 0000000000..fa1290e92d --- /dev/null +++ b/app/Mail/CheckoutAssetMail.php @@ -0,0 +1,110 @@ +item = $asset; + $this->admin = $checkedOutBy; + $this->note = $note; + $this->target = $checkedOutTo; + $this->acceptance = $acceptance; + + $this->settings = Setting::getSettings(); + + $this->last_checkout = ''; + $this->expected_checkin = ''; + + if ($this->item->last_checkout) { + $this->last_checkout = Helper::getFormattedDateObject($this->item->last_checkout, 'date', + false); + } + + if ($this->item->expected_checkin) { + $this->expected_checkin = Helper::getFormattedDateObject($this->item->expected_checkin, 'date', + false); + } + } + + /** + * Get the message envelope. + */ + public function envelope(): Envelope + { + $from = new Address(env('MAIL_FROM_ADDR', 'service@snipe-it.io')); + + return new Envelope( + from: $from, + subject: trans('mail.Asset_Checkout_Notification'), + ); + } + + /** + * Get the mail representation of the notification. + * + * @param mixed $notifiable + * @return Content + */ + public function content(): Content + { + $this->item->load('assetstatus'); + $eula = method_exists($this->item, 'getEula') ? $this->item->getEula() : ''; + $req_accept = method_exists($this->item, 'requireAcceptance') ? $this->item->requireAcceptance() : 0; + $fields = []; + + // Check if the item has custom fields associated with it + if (($this->item->model) && ($this->item->model->fieldset)) { + $fields = $this->item->model->fieldset->fields; + } + + $accept_url = is_null($this->acceptance) ? null : route('account.accept.item', $this->acceptance); + + return new Content( + markdown: 'mail.markdown.checkout-asset', + with: [ + 'item' => $this->item, + 'admin' => $this->admin, + 'status' => $this->item->assetstatus?->name, + 'note' => $this->note, + 'target' => $this->target, + 'fields' => $fields, + 'eula' => $eula, + 'req_accept' => $req_accept, + 'accept_url' => $accept_url, + 'last_checkout' => $this->last_checkout, + 'expected_checkin' => $this->expected_checkin, + ], + ); + } + + /** + * Get the attachments for the message. + * + * @return array + */ + public function attachments(): array + { + return []; + } +} diff --git a/app/Mail/CheckoutConsumableMail.php b/app/Mail/CheckoutConsumableMail.php new file mode 100644 index 0000000000..18fe228258 --- /dev/null +++ b/app/Mail/CheckoutConsumableMail.php @@ -0,0 +1,84 @@ +item = $consumable; + $this->admin = $checkedOutBy; + $this->note = $note; + $this->target = $checkedOutTo; + $this->acceptance = $acceptance; + $this->qty = $consumable->checkout_qty; + + $this->settings = Setting::getSettings(); + } + + /** + * Get the message envelope. + */ + public function envelope(): Envelope + { + $from = new Address(env('MAIL_FROM_ADDR','service@snipe-it.io')); + + return new Envelope( + from: $from, + subject: trans('mail.Confirm_consumable_delivery'), + ); + } + + /** + * Get the message content definition. + */ + public function content(): Content + { + + $eula = $this->item->getEula(); + $req_accept = $this->item->requireAcceptance(); + + $accept_url = is_null($this->acceptance) ? null : route('account.accept.item', $this->acceptance); + + return new Content( + markdown: 'mail.markdown.checkout-consumable', + with: [ + 'item' => $this->item, + 'admin' => $this->admin, + 'note' => $this->note, + 'target' => $this->target, + 'eula' => $eula, + 'req_accept' => $req_accept, + 'accept_url' => $accept_url, + 'qty' => $this->qty, + ] + ); + } + + /** + * Get the attachments for the message. + * + * @return array + */ + public function attachments(): array + { + return []; + } +} diff --git a/app/Mail/CheckoutLicenseMail.php b/app/Mail/CheckoutLicenseMail.php new file mode 100644 index 0000000000..7377ad340e --- /dev/null +++ b/app/Mail/CheckoutLicenseMail.php @@ -0,0 +1,80 @@ +item = $licenseSeat; + $this->admin = $checkedOutBy; + $this->note = $note; + $this->target = $checkedOutTo; + $this->acceptance = $acceptance; + + $this->settings = Setting::getSettings(); + } + + /** + * Get the message envelope. + */ + public function envelope(): Envelope + { + $from = new Address(env('MAIL_FROM_ADDR','service@snipe-it.io')); + + return new Envelope( + from: $from, + subject: trans('mail.Confirm_license_delivery'), + ); + } + + /** + * Get the message content definition. + */ + public function content(): Content + { + $eula = method_exists($this->item, 'getEula') ? $this->item->getEula() : ''; + $req_accept = method_exists($this->item, 'requireAcceptance') ? $this->item->requireAcceptance() : 0; + + $accept_url = is_null($this->acceptance) ? null : route('account.accept.item', $this->acceptance); + return new Content( + markdown: 'mail.markdown.checkout-license', + with: [ + 'license_seat' => $this->item, + 'license' => $this->item->license, + 'admin' => $this->admin, + 'note' => $this->note, + 'target' => $this->target, + 'eula' => $eula, + 'req_accept' => $req_accept, + 'accept_url' => $accept_url, + ] + ); + } + + /** + * Get the attachments for the message. + * + * @return array + */ + public function attachments(): array + { + return []; + } +} diff --git a/app/Models/Accessory.php b/app/Models/Accessory.php index c1366f67e6..fc1bb36ab4 100755 --- a/app/Models/Accessory.php +++ b/app/Models/Accessory.php @@ -62,7 +62,7 @@ class Accessory extends SnipeModel 'category_id' => 'required|integer|exists:categories,id', 'company_id' => 'integer|nullable', 'min_amt' => 'integer|min:0|nullable', - 'purchase_cost' => 'numeric|nullable|gte:0', + 'purchase_cost' => 'numeric|nullable|gte:0|max:9999999999999', 'purchase_date' => 'date_format:Y-m-d|nullable', ]; @@ -259,6 +259,18 @@ class Accessory extends SnipeModel ->with('assignedTo'); } + /** + * Establishes the accessory -> admin user relationship + * + * @author A. Gianotto + * @since [v7.0.13] + * @return \Illuminate\Database\Eloquent\Relations\Relation + */ + public function adminuser() + { + return $this->belongsTo(\App\Models\User::class, 'created_by'); + } + /** * Checks whether or not the accessory has users * @@ -410,6 +422,16 @@ class Accessory extends SnipeModel * ----------------------------------------------- **/ + + /** + * Query builder scope to order on created_by name + * + */ + public function scopeOrderByCreatedByName($query, $order) + { + return $query->leftJoin('users as admin_sort', 'accessories.created_by', '=', 'admin_sort.id')->select('accessories.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order); + } + /** * Query builder scope to order on company * diff --git a/app/Models/AccessoryCheckout.php b/app/Models/AccessoryCheckout.php index 7f42b354e1..bdfbf11d9d 100755 --- a/app/Models/AccessoryCheckout.php +++ b/app/Models/AccessoryCheckout.php @@ -22,7 +22,7 @@ class AccessoryCheckout extends Model { use Searchable; - protected $fillable = ['user_id', 'accessory_id', 'assigned_to', 'assigned_type', 'note']; + protected $fillable = ['created_by', 'accessory_id', 'assigned_to', 'assigned_type', 'note']; protected $table = 'accessories_checkout'; /** diff --git a/app/Models/Actionlog.php b/app/Models/Actionlog.php index 7f3b46e46c..008c5b1146 100755 --- a/app/Models/Actionlog.php +++ b/app/Models/Actionlog.php @@ -21,7 +21,7 @@ class Actionlog extends SnipeModel // This is to manually set the source (via setActionSource()) for determineActionSource() protected ?string $source = null; - protected $with = ['admin']; + protected $with = ['adminuser']; protected $presenter = \App\Presenters\ActionlogPresenter::class; use SoftDeletes; @@ -32,7 +32,7 @@ class Actionlog extends SnipeModel protected $fillable = [ 'created_at', 'item_type', - 'user_id', + 'created_by', 'item_id', 'action_type', 'note', @@ -52,9 +52,11 @@ class Actionlog extends SnipeModel 'action_type', 'note', 'log_meta', - 'user_id', + 'created_by', 'remote_ip', 'user_agent', + 'item_type', + 'target_type', 'action_source' ]; @@ -64,10 +66,10 @@ class Actionlog extends SnipeModel * @var array */ protected $searchableRelations = [ - 'company' => ['name'], - 'admin' => ['first_name','last_name','username', 'email'], - 'user' => ['first_name','last_name','username', 'email'], - 'assets' => ['asset_tag','name'], + 'company' => ['name'], + 'adminuser' => ['first_name','last_name','username', 'email'], + 'user' => ['first_name','last_name','username', 'email'], + 'assets' => ['asset_tag','name'], ]; /** @@ -198,9 +200,9 @@ class Actionlog extends SnipeModel * @since [v3.0] * @return \Illuminate\Database\Eloquent\Relations\Relation */ - public function admin() + public function adminuser() { - return $this->belongsTo(User::class, 'user_id') + return $this->belongsTo(User::class, 'created_by') ->withTrashed(); } @@ -374,8 +376,8 @@ class Actionlog extends SnipeModel $this->source = $source; } - public function scopeOrderAdmin($query, $order) + public function scopeOrderByCreatedBy($query, $order) { - return $query->leftJoin('users as admin_sort', 'action_logs.user_id', '=', 'admin_sort.id')->select('action_logs.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order); + return $query->leftJoin('users as admin_sort', 'action_logs.created_by', '=', 'admin_sort.id')->select('action_logs.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order); } } diff --git a/app/Models/Asset.php b/app/Models/Asset.php index 98d7275b15..ce8b870eb2 100644 --- a/app/Models/Asset.php +++ b/app/Models/Asset.php @@ -30,7 +30,7 @@ class Asset extends Depreciable { protected $presenter = AssetPresenter::class; - protected $with = ['model', 'admin']; + protected $with = ['model', 'adminuser']; use CompanyableTrait; use HasFactory, Loggable, Requestable, Presentable, SoftDeletes, ValidatingTrait, UniqueUndeletedTrait; @@ -43,16 +43,16 @@ class Asset extends Depreciable /** * Run after the checkout acceptance was declined by the user - * + * * @param User $acceptedBy * @param string $signature - */ + */ public function declinedCheckout(User $declinedBy, $signature) { $this->assigned_to = null; $this->assigned_type = null; - $this->accepted = null; - $this->save(); + $this->accepted = null; + $this->save(); } /** @@ -108,12 +108,11 @@ class Asset extends Depreciable 'expected_checkin' => ['nullable', 'date'], 'last_audit_date' => ['nullable', 'date_format:Y-m-d H:i:s'], 'next_audit_date' => ['nullable', 'date'], - //'after:last_audit_date'], 'location_id' => ['nullable', 'exists:locations,id'], 'rtd_location_id' => ['nullable', 'exists:locations,id'], 'purchase_date' => ['nullable', 'date', 'date_format:Y-m-d'], 'serial' => ['nullable', 'unique_undeleted:assets,serial'], - 'purchase_cost' => ['nullable', 'numeric', 'gte:0'], + 'purchase_cost' => ['nullable', 'numeric', 'gte:0', 'max:9999999999999'], 'supplier_id' => ['nullable', 'exists:suppliers,id'], 'asset_eol_date' => ['nullable', 'date'], 'eol_explicit' => ['nullable', 'boolean'], @@ -369,7 +368,7 @@ class Asset extends Depreciable if ($this->save()) { if (is_int($admin)) { $checkedOutBy = User::findOrFail($admin); - } elseif (get_class($admin) === \App\Models\User::class) { + } elseif ($admin && get_class($admin) === \App\Models\User::class) { $checkedOutBy = $admin; } else { $checkedOutBy = auth()->user(); @@ -710,15 +709,15 @@ class Asset extends Depreciable } /** - * Get action logs history for this asset + * Get user who created the item * * @author [A. Gianotto] [] * @since [v1.0] * @return \Illuminate\Database\Eloquent\Relations\Relation */ - public function admin() + public function adminuser() { - return $this->belongsTo(\App\Models\User::class, 'user_id'); + return $this->belongsTo(\App\Models\User::class, 'created_by'); } @@ -931,9 +930,20 @@ class Asset extends Depreciable * */ public function checkInvalidNextAuditDate() { - if (($this->last_audit_date) && ($this->next_audit_date) && ($this->last_audit_date > $this->next_audit_date)) { + + // Deliberately parse the dates as Y-m-d (without H:i:s) to compare them + if ($this->last_audit_date) { + $last = Carbon::parse($this->last_audit_date)->format('Y-m-d'); + } + + if ($this->next_audit_date) { + $next = Carbon::parse($this->next_audit_date)->format('Y-m-d'); + } + + if ((isset($last) && (isset($next))) && ($last > $next)) { return true; } + return false; } @@ -950,11 +960,12 @@ class Asset extends Depreciable { if (($this->model) && ($this->model->category)) { - if ($this->model->category->eula_text) { + if (($this->model->category->eula_text) && ($this->model->category->use_default_eula === 0)) { return Helper::parseEscapedMarkedown($this->model->category->eula_text); - } elseif ($this->model->category->use_default_eula == '1') { + } elseif ($this->model->category->use_default_eula === 1) { return Helper::parseEscapedMarkedown(Setting::getSettings()->default_eula_text); } else { + return false; } } @@ -1561,7 +1572,7 @@ class Asset extends Depreciable $leftJoin->on('assets_dept_users.id', '=', 'assets.assigned_to') ->where('assets.assigned_type', '=', User::class); })->where(function ($query) use ($search) { - $query->where('assets_dept_users.department_id', '=', $search); + $query->whereIn('assets_dept_users.department_id', $search); })->withTrashed()->whereNull('assets.deleted_at'); //workaround for laravel bug } @@ -1694,7 +1705,7 @@ class Asset extends Depreciable }); }); } - + /** * THIS CLUNKY BIT IS VERY IMPORTANT @@ -1715,7 +1726,7 @@ class Asset extends Depreciable * assets.location would fail, as that field doesn't exist -- plus we're already searching * against those relationships earlier in this method. * - * - snipe + * - snipe * */ @@ -1760,6 +1771,20 @@ class Asset extends Depreciable } + /** + * Query builder scope to order on created_by name + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderByCreatedByName($query, $order) + { + return $query->leftJoin('users as admin_sort', 'assets.created_by', '=', 'admin_sort.id')->select('assets.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order); + } + + /** * Query builder scope to order on assigned user * @@ -1811,7 +1836,9 @@ class Asset extends Depreciable public function scopeInCategory($query, $category_id) { return $query->join('models as category_models', 'assets.model_id', '=', 'category_models.id') - ->join('categories', 'category_models.category_id', '=', 'categories.id')->where('category_models.category_id', '=', $category_id); + ->join('categories', 'category_models.category_id', '=', 'categories.id') + ->whereIn('category_models.category_id', (!is_array($category_id) ? explode(',',$category_id): $category_id)); + //->whereIn('category_models.category_id', $category_id); } /** @@ -1825,7 +1852,7 @@ class Asset extends Depreciable public function scopeByManufacturer($query, $manufacturer_id) { return $query->join('models', 'assets.model_id', '=', 'models.id') - ->join('manufacturers', 'models.manufacturer_id', '=', 'manufacturers.id')->where('models.manufacturer_id', '=', $manufacturer_id); + ->join('manufacturers', 'models.manufacturer_id', '=', 'manufacturers.id')->whereIn('models.manufacturer_id', (!is_array($manufacturer_id) ? explode(',',$manufacturer_id): $manufacturer_id)); } diff --git a/app/Models/AssetMaintenance.php b/app/Models/AssetMaintenance.php index 5f66783cbb..246220f5c7 100644 --- a/app/Models/AssetMaintenance.php +++ b/app/Models/AssetMaintenance.php @@ -174,9 +174,9 @@ class AssetMaintenance extends Model implements ICompanyableChild * @author A. Gianotto * @version v3.0 */ - public function admin() + public function adminuser() { - return $this->belongsTo(\App\Models\User::class, 'user_id') + return $this->belongsTo(\App\Models\User::class, 'created_by') ->withTrashed(); } @@ -207,20 +207,6 @@ class AssetMaintenance extends Model implements ICompanyableChild } - /** - * Query builder scope to order on admin user - * - * @param \Illuminate\Database\Query\Builder $query Query builder instance - * @param string $order Order - * - * @return \Illuminate\Database\Query\Builder Modified query builder - */ - public function scopeOrderAdmin($query, $order) - { - return $query->leftJoin('users', 'asset_maintenances.user_id', '=', 'users.id') - ->orderBy('users.first_name', $order) - ->orderBy('users.last_name', $order); - } /** * Query builder scope to order on asset tag @@ -278,4 +264,12 @@ class AssetMaintenance extends Model implements ICompanyableChild ->leftjoin('status_labels as maintained_asset_status', 'maintained_asset_status.id', '=', 'maintained_asset.status_id') ->orderBy('maintained_asset_status.name', $order); } + + /** + * Query builder scope to order on the user that created it + */ + public function scopeOrderByCreatedBy($query, $order) + { + return $query->leftJoin('users as admin_sort', 'asset_maintenances.created_by', '=', 'admin_sort.id')->select('asset_maintenances.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order); + } } diff --git a/app/Models/AssetModel.php b/app/Models/AssetModel.php index 3c023507db..0c8f8e7b3c 100755 --- a/app/Models/AssetModel.php +++ b/app/Models/AssetModel.php @@ -36,7 +36,6 @@ class AssetModel extends SnipeModel protected $injectUniqueIdentifier = true; use ValidatingTrait; protected $table = 'models'; - protected $hidden = ['user_id', 'deleted_at']; protected $presenter = AssetModelPresenter::class; // Declare the rules for the model validation @@ -69,7 +68,6 @@ class AssetModel extends SnipeModel 'model_number', 'name', 'notes', - 'user_id', ]; use Searchable; @@ -79,7 +77,12 @@ class AssetModel extends SnipeModel * * @var array */ - protected $searchableAttributes = ['name', 'model_number', 'notes', 'eol']; + protected $searchableAttributes = [ + 'name', + 'model_number', + 'notes', + 'eol' + ]; /** * The relations and their attributes that should be included when searching the model. @@ -221,6 +224,18 @@ class AssetModel extends SnipeModel ->orderBy('created_at', 'desc'); } + /** + * Get user who created the item + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return \Illuminate\Database\Eloquent\Relations\Relation + */ + public function adminuser() + { + return $this->belongsTo(\App\Models\User::class, 'created_by'); + } + /** * ----------------------------------------------- diff --git a/app/Models/Category.php b/app/Models/Category.php index f21038bab0..5965404f59 100755 --- a/app/Models/Category.php +++ b/app/Models/Category.php @@ -29,17 +29,17 @@ class Category extends SnipeModel use SoftDeletes; protected $table = 'categories'; - protected $hidden = ['user_id', 'deleted_at']; + protected $hidden = ['created_by', 'deleted_at']; protected $casts = [ - 'user_id' => 'integer', + 'created_by' => 'integer', ]; /** * Category validation rules */ public $rules = [ - 'user_id' => 'numeric|nullable', + 'created_by' => 'numeric|nullable', 'name' => 'required|min:1|max:255|two_column_unique_undeleted:category_type', 'require_acceptance' => 'boolean', 'use_default_eula' => 'boolean', @@ -70,7 +70,7 @@ class Category extends SnipeModel 'name', 'require_acceptance', 'use_default_eula', - 'user_id', + 'created_by', ]; use Searchable; @@ -228,6 +228,11 @@ class Category extends SnipeModel return $this->hasMany(\App\Models\AssetModel::class, 'category_id'); } + public function adminuser() + { + return $this->belongsTo(\App\Models\User::class, 'created_by'); + } + /** * Checks for a category-specific EULA, and if that doesn't exist, * checks for a settings level EULA @@ -286,4 +291,9 @@ class Category extends SnipeModel { return $query->where('require_acceptance', '=', true); } + + public function scopeOrderByCreatedBy($query, $order) + { + return $query->leftJoin('users as admin_sort', 'categories.created_by', '=', 'admin_sort.id')->select('categories.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order); + } } diff --git a/app/Models/CheckoutRequest.php b/app/Models/CheckoutRequest.php index b717a332aa..d6a85f2972 100644 --- a/app/Models/CheckoutRequest.php +++ b/app/Models/CheckoutRequest.php @@ -13,7 +13,7 @@ class CheckoutRequest extends Model public function user() { - return $this->belongsTo(User::class); + return $this->belongsTo(User::class, 'user_id', 'id'); } public function requestingUser() diff --git a/app/Models/Company.php b/app/Models/Company.php index 657b34390b..8886da77f6 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -67,6 +67,7 @@ final class Company extends SnipeModel 'phone', 'fax', 'email', + 'created_by' ]; private static function isFullMultipleCompanySupportEnabled() @@ -115,7 +116,7 @@ final class Company extends SnipeModel if ($current_user->company_id != null) { return $current_user->company_id; } else { - return static::getIdFromInput($unescaped_input); + return null; } } } @@ -186,12 +187,15 @@ final class Company extends SnipeModel */ public function isDeletable() { + return Gate::allows('delete', $this) - && ($this->assets()->count() === 0) - && ($this->accessories()->count() === 0) - && ($this->consumables()->count() === 0) - && ($this->components()->count() === 0) - && ($this->users()->count() === 0); + && (($this->assets_count ?? $this->assets()->count()) === 0) + && (($this->accessories_count ?? $this->accessories()->count()) === 0) + && (($this->licenses_count ?? $this->licenses()->count()) === 0) + && (($this->components_count ?? $this->components()->count()) === 0) + && (($this->consumables_count ?? $this->consumables()->count()) === 0) + && (($this->accessories_count ?? $this->accessories()->count()) === 0) + && (($this->users_count ?? $this->users()->count()) === 0); } /** @@ -294,6 +298,12 @@ final class Company extends SnipeModel } + public function adminuser() + { + return $this->belongsTo(\App\Models\User::class, 'created_by'); + } + + /** * I legit do not know what this method does, but we can't remove it (yet). * @@ -329,4 +339,13 @@ final class Company extends SnipeModel } } + + /** + * Query builder scope to order on the user that created it + */ + public function scopeOrderByCreatedBy($query, $order) + { + return $query->leftJoin('users as admin_sort', 'companies.created_by', '=', 'admin_sort.id')->select('companies.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order); + } + } diff --git a/app/Models/CompanyableTrait.php b/app/Models/CompanyableTrait.php index df67f2be4f..04a620d8e3 100644 --- a/app/Models/CompanyableTrait.php +++ b/app/Models/CompanyableTrait.php @@ -8,9 +8,6 @@ trait CompanyableTrait * This trait is used to scope models to the current company. To use this scope on companyable models, * we use the "use Companyable;" statement at the top of the mode. * - * We CANNOT USE THIS ON USERS, as it causes an infinite loop and prevents users from logging in, since this scope will be - * applied to the currently logged in (or logging in) user in addition to the user model for viewing lists of users. - * * @see \App\Models\Company\Company::scopeCompanyables() * @return void */ diff --git a/app/Models/Component.php b/app/Models/Component.php index 536e06d0af..fb77bf0824 100644 --- a/app/Models/Component.php +++ b/app/Models/Component.php @@ -30,14 +30,15 @@ class Component extends SnipeModel * Category validation rules */ public $rules = [ - 'name' => 'required|min:3|max:255', + 'name' => 'required|min:3|max:191', 'qty' => 'required|integer|min:1', 'category_id' => 'required|integer|exists:categories,id', 'supplier_id' => 'nullable|integer|exists:suppliers,id', 'company_id' => 'integer|nullable|exists:companies,id', 'min_amt' => 'integer|min:0|nullable', 'purchase_date' => 'date_format:Y-m-d|nullable', - 'purchase_cost' => 'numeric|nullable|gte:0', + 'purchase_cost' => 'numeric|nullable|gte:0|max:9999999999999', + 'manufacturer_id' => 'integer|exists:manufacturers,id|nullable', ]; /** @@ -60,6 +61,8 @@ class Component extends SnipeModel 'company_id', 'supplier_id', 'location_id', + 'manufacturer_id', + 'model_number', 'name', 'purchase_cost', 'purchase_date', @@ -77,7 +80,15 @@ class Component extends SnipeModel * * @var array */ - protected $searchableAttributes = ['name', 'order_number', 'serial', 'purchase_cost', 'purchase_date', 'notes']; + protected $searchableAttributes = [ + 'name', + 'order_number', + 'serial', + 'purchase_cost', + 'purchase_date', + 'notes', + 'model_number', + ]; /** * The relations and their attributes that should be included when searching the model. @@ -89,6 +100,7 @@ class Component extends SnipeModel 'company' => ['name'], 'location' => ['name'], 'supplier' => ['name'], + 'manufacturer' => ['name'], ]; @@ -130,7 +142,7 @@ class Component extends SnipeModel */ public function assets() { - return $this->belongsToMany(\App\Models\Asset::class, 'components_assets')->withPivot('id', 'assigned_qty', 'created_at', 'user_id', 'note'); + return $this->belongsToMany(\App\Models\Asset::class, 'components_assets')->withPivot('id', 'assigned_qty', 'created_at', 'created_by', 'note'); } /** @@ -142,9 +154,9 @@ class Component extends SnipeModel * @since [v3.0] * @return \Illuminate\Database\Eloquent\Relations\Relation */ - public function admin() + public function adminuser() { - return $this->belongsTo(\App\Models\User::class, 'user_id'); + return $this->belongsTo(\App\Models\User::class, 'created_by'); } /** @@ -183,6 +195,19 @@ class Component extends SnipeModel return $this->belongsTo(\App\Models\Supplier::class, 'supplier_id'); } + + /** + * Establishes the item -> manufacturer relationship + * + * @author [A. Gianotto] [] + * @since [v3.0] + * @return \Illuminate\Database\Eloquent\Relations\Relation + */ + public function manufacturer() + { + return $this->belongsTo(\App\Models\Manufacturer::class, 'manufacturer_id'); + } + /** * Establishes the component -> action logs relationship * @@ -310,4 +335,22 @@ class Component extends SnipeModel { return $query->leftJoin('suppliers', 'components.supplier_id', '=', 'suppliers.id')->orderBy('suppliers.name', $order); } + + /** + * Query builder scope to order on manufacturer + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderManufacturer($query, $order) + { + return $query->leftJoin('manufacturers', 'components.manufacturer_id', '=', 'manufacturers.id')->orderBy('manufacturers.name', $order); + } + + public function scopeOrderByCreatedBy($query, $order) + { + return $query->leftJoin('users as admin_sort', 'components.created_by', '=', 'admin_sort.id')->select('components.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order); + } } diff --git a/app/Models/Consumable.php b/app/Models/Consumable.php index 944ac5bfde..30161e8429 100644 --- a/app/Models/Consumable.php +++ b/app/Models/Consumable.php @@ -50,7 +50,7 @@ class Consumable extends SnipeModel 'category_id' => 'required|integer', 'company_id' => 'integer|nullable', 'min_amt' => 'integer|min:0|max:99999|nullable', - 'purchase_cost' => 'numeric|nullable|gte:0', + 'purchase_cost' => 'numeric|nullable|gte:0|max:9999999999999', 'purchase_date' => 'date_format:Y-m-d|nullable', ]; @@ -154,9 +154,9 @@ class Consumable extends SnipeModel * @since [v3.0] * @return \Illuminate\Database\Eloquent\Relations\Relation */ - public function admin() + public function adminuser() { - return $this->belongsTo(User::class, 'user_id'); + return $this->belongsTo(User::class, 'created_by'); } /** @@ -256,7 +256,7 @@ class Consumable extends SnipeModel */ public function users() : Relation { - return $this->belongsToMany(User::class, 'consumables_users', 'consumable_id', 'assigned_to')->withPivot('user_id')->withTrashed()->withTimestamps(); + return $this->belongsToMany(User::class, 'consumables_users', 'consumable_id', 'assigned_to')->withPivot('created_by')->withTrashed()->withTimestamps(); } /** @@ -425,6 +425,20 @@ class Consumable extends SnipeModel return $query->leftJoin('companies', 'consumables.company_id', '=', 'companies.id')->orderBy('companies.name', $order); } + /** + * Query builder scope to order on remaining + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param string $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderRemaining($query, $order) + { + $order_by = 'consumables.qty - consumables_users_count ' . $order; + return $query->orderByRaw($order_by); + } + /** * Query builder scope to order on supplier * @@ -437,4 +451,9 @@ class Consumable extends SnipeModel { return $query->leftJoin('suppliers', 'consumables.supplier_id', '=', 'suppliers.id')->orderBy('suppliers.name', $order); } + + public function scopeOrderByCreatedBy($query, $order) + { + return $query->leftJoin('users as users_sort', 'consumables.created_by', '=', 'users_sort.id')->select('consumables.*')->orderBy('users_sort.first_name', $order)->orderBy('users_sort.last_name', $order); + } } diff --git a/app/Models/ConsumableAssignment.php b/app/Models/ConsumableAssignment.php index db0cfa4bd6..4c9a19703e 100644 --- a/app/Models/ConsumableAssignment.php +++ b/app/Models/ConsumableAssignment.php @@ -26,8 +26,8 @@ class ConsumableAssignment extends Model return $this->belongsTo(\App\Models\User::class, 'assigned_to'); } - public function admin() + public function adminuser() { - return $this->belongsTo(\App\Models\User::class, 'user_id'); + return $this->belongsTo(\App\Models\User::class, 'created_by'); } } diff --git a/app/Models/Department.php b/app/Models/Department.php index 62755d2aa0..855cb25f64 100644 --- a/app/Models/Department.php +++ b/app/Models/Department.php @@ -42,7 +42,7 @@ class Department extends SnipeModel * @var array */ protected $fillable = [ - 'user_id', + 'created_by', 'name', 'phone', 'fax', diff --git a/app/Models/Depreciation.php b/app/Models/Depreciation.php index 9faa1b86e2..11ee82c16a 100755 --- a/app/Models/Depreciation.php +++ b/app/Models/Depreciation.php @@ -75,4 +75,40 @@ class Depreciation extends SnipeModel { return $this->hasMany(\App\Models\License::class, 'depreciation_id'); } + + /** + * Establishes the depreciation -> assets relationship + * + * @author A. Gianotto + * @since [v5.0] + * @return \Illuminate\Database\Eloquent\Relations\Relation + */ + public function assets() + { + return $this->hasManyThrough(\App\Models\Asset::class, \App\Models\AssetModel::class, 'depreciation_id', 'model_id'); + } + + /** + * Get the user that created the depreciation + * + * @author A. Gianotto + * @since [v7.0.13] + * @return \Illuminate\Database\Eloquent\Relations\Relation + */ + public function adminuser() + { + return $this->belongsTo(\App\Models\User::class, 'created_by'); + } + + + /** + * ----------------------------------------------- + * BEGIN QUERY SCOPES + * ----------------------------------------------- + **/ + + public function scopeOrderByCreatedBy($query, $order) + { + return $query->leftJoin('users as admin_sort', 'depreciations.created_by', '=', 'admin_sort.id')->select('depreciations.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order); + } } diff --git a/app/Models/Group.php b/app/Models/Group.php index c6e6e56039..7278152df9 100755 --- a/app/Models/Group.php +++ b/app/Models/Group.php @@ -65,7 +65,7 @@ class Group extends SnipeModel * @since [v6.3.0] * @return \Illuminate\Database\Eloquent\Relations\Relation */ - public function admin() + public function adminuser() { return $this->belongsTo(\App\Models\User::class, 'created_by'); } @@ -81,4 +81,16 @@ class Group extends SnipeModel { return json_decode($this->permissions, true); } + + /** + * ----------------------------------------------- + * BEGIN QUERY SCOPES + * ----------------------------------------------- + **/ + + + public function scopeOrderByCreatedBy($query, $order) + { + return $query->leftJoin('users as admin_sort', 'permission_groups.created_by', '=', 'admin_sort.id')->select('permission_groups.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order); + } } diff --git a/app/Models/Import.php b/app/Models/Import.php index 81728c8a5e..052612a197 100644 --- a/app/Models/Import.php +++ b/app/Models/Import.php @@ -2,10 +2,13 @@ namespace App\Models; +use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Import extends Model { + use HasFactory; + protected $casts = [ 'header_row' => 'array', 'first_row' => 'array', diff --git a/app/Models/Ldap.php b/app/Models/Ldap.php index ecce46d82a..f71f926a93 100644 --- a/app/Models/Ldap.php +++ b/app/Models/Ldap.php @@ -283,9 +283,10 @@ class Ldap extends Model * @param $base_dn * @param $count * @param $filter + * @param $attributes * @return array|bool */ - public static function findLdapUsers($base_dn = null, $count = -1, $filter = null) + public static function findLdapUsers($base_dn = null, $count = -1, $filter = null, $attributes = []) { $ldapconn = self::connectToLdap(); self::bindAdminToLdap($ldapconn); @@ -319,7 +320,7 @@ class Ldap extends Model //if($count == -1) { //count is -1 means we have to employ paging to query the entire directory $ldap_controls = [['oid' => LDAP_CONTROL_PAGEDRESULTS, 'iscritical' => false, 'value' => ['size'=> $count == -1||$count>$page_size ? $page_size : $count, 'cookie' => $cookie]]]; //} - $search_results = ldap_search($ldapconn, $base_dn, $filter, [], 0, /* $page_size */ -1, -1, LDAP_DEREF_NEVER, $ldap_controls); // TODO - I hate the @, and I hate that we get a full page even if we ask for 10 records. Can we use an ldap_control? + $search_results = ldap_search($ldapconn, $base_dn, $filter, $attributes, 0, /* $page_size */ -1, -1, LDAP_DEREF_NEVER, $ldap_controls); // TODO - I hate the @, and I hate that we get a full page even if we ask for 10 records. Can we use an ldap_control? Log::debug("LDAP search executed successfully."); if (! $search_results) { return redirect()->route('users.index')->with('error', trans('admin/users/message.error.ldap_could_not_search').ldap_error($ldapconn)); // TODO this is never called in any routed context - only from the Artisan command. So this redirect will never work. @@ -340,7 +341,7 @@ class Ldap extends Model $cookie = ''; } // Empty cookie means last page - + // Get results from page $results = ldap_get_entries($ldapconn, $search_results); if (! $results) { diff --git a/app/Models/License.php b/app/Models/License.php index 554929c0ac..0997c1e57b 100755 --- a/app/Models/License.php +++ b/app/Models/License.php @@ -81,8 +81,7 @@ class License extends Depreciable 'serial', 'supplier_id', 'termination_date', - 'free_seat_count', - 'user_id', + 'created_by', 'min_amt', ]; @@ -184,8 +183,8 @@ class License extends Depreciable $logAction = new Actionlog; $logAction->item_type = self::class; $logAction->item_id = $license->id; - $logAction->user_id = Auth::id() ?: 1; // We don't have an id while running the importer from CLI. - $logAction->note = "deleted ${change} seats"; + $logAction->created_by = auth()->id() ?: 1; // We don't have an id while running the importer from CLI. + $logAction->note = "deleted {$change} seats"; $logAction->target_id = null; $logAction->logaction('delete seats'); @@ -196,7 +195,7 @@ class License extends Depreciable $licenseInsert = []; for ($i = $oldSeats; $i < $newSeats; $i++) { $licenseInsert[] = [ - 'user_id' => Auth::id(), + 'created_by' => auth()->id(), 'license_id' => $license->id, 'created_at' => now(), 'updated_at' => now() @@ -216,8 +215,8 @@ class License extends Depreciable $logAction = new Actionlog(); $logAction->item_type = self::class; $logAction->item_id = $license->id; - $logAction->user_id = Auth::id() ?: 1; // Importer. - $logAction->note = "added ${change} seats"; + $logAction->created_by = auth()->id() ?: 1; // Importer. + $logAction->note = "added {$change} seats"; $logAction->target_id = null; $logAction->logaction('add seats'); } @@ -434,7 +433,7 @@ class License extends Depreciable */ public function adminuser() { - return $this->belongsTo(\App\Models\User::class, 'user_id'); + return $this->belongsTo(\App\Models\User::class, 'created_by'); } /** @@ -739,14 +738,9 @@ class License extends Depreciable /** * Query builder scope to order on the user that created it - * - * @param \Illuminate\Database\Query\Builder $query Query builder instance - * @param text $order Order - * - * @return \Illuminate\Database\Query\Builder Modified query builder */ - public function scopeOrderCreatedBy($query, $order) + public function scopeOrderByCreatedBy($query, $order) { - return $query->leftJoin('users as users_sort', 'licenses.user_id', '=', 'users_sort.id')->select('licenses.*')->orderBy('users_sort.first_name', $order)->orderBy('users_sort.last_name', $order); + return $query->leftJoin('users as admin_sort', 'licenses.created_by', '=', 'admin_sort.id')->select('licenses.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order); } -} \ No newline at end of file +} diff --git a/app/Models/Location.php b/app/Models/Location.php index f08a51a985..014db3053e 100755 --- a/app/Models/Location.php +++ b/app/Models/Location.php @@ -33,7 +33,7 @@ class Location extends SnipeModel 'country' => 'min:2|max:191|nullable', 'zip' => 'max:10|nullable', 'manager_id' => 'exists:users,id|nullable', - 'parent_id' => 'non_circular:locations,id', + 'parent_id' => 'nullable|exists:locations,id|non_circular:locations,id', ]; protected $casts = [ @@ -42,7 +42,7 @@ class Location extends SnipeModel ]; /** - * Whether the model should inject it's identifier to the unique + * Whether the model should inject its identifier to the unique * validation rules before attempting validation. If this property * is not set in the model it will default to true. * diff --git a/app/Models/Loggable.php b/app/Models/Loggable.php index ae5d554882..72a7a7f262 100644 --- a/app/Models/Loggable.php +++ b/app/Models/Loggable.php @@ -37,7 +37,7 @@ trait Loggable $log = new Actionlog; $log = $this->determineLogItemType($log); if (auth()->user()) { - $log->user_id = auth()->id(); + $log->created_by = auth()->id(); } if (! isset($target)) { @@ -117,7 +117,6 @@ trait Loggable */ public function logCheckin($target, $note, $action_date = null, $originalValues = []) { - $settings = Setting::getSettings(); $log = new Actionlog; if($target != null){ @@ -149,7 +148,7 @@ trait Loggable } if (auth()->user()) { - $log->user_id = auth()->id(); + $log->created_by = auth()->id(); } $changed = []; @@ -171,39 +170,6 @@ trait Loggable $log->logaction('checkin from'); -// $params = [ -// 'target' => $target, -// 'item' => $log->item, -// 'admin' => $log->user, -// 'note' => $note, -// 'target_type' => $log->target_type, -// 'settings' => $settings, -// ]; -// -// -// $checkinClass = null; -// -// if (method_exists($target, 'notify')) { -// try { -// $target->notify(new static::$checkinClass($params)); -// } catch (\Exception $e) { -// Log::debug($e); -// } -// -// } -// -// // Send to the admin, if settings dictate -// $recipient = new \App\Models\Recipients\AdminRecipient(); -// -// if (($settings->admin_cc_email!='') && (static::$checkinClass!='')) { -// try { -// $recipient->notify(new static::$checkinClass($params)); -// } catch (\Exception $e) { -// Log::debug($e); -// } -// -// } - return $log; } @@ -225,14 +191,14 @@ trait Loggable } $log->location_id = ($location_id) ? $location_id : null; $log->note = $note; - $log->user_id = auth()->id(); + $log->created_by = auth()->id(); $log->filename = $filename; $log->logaction('audit'); $params = [ 'item' => $log->item, 'filename' => $log->filename, - 'admin' => $log->admin, + 'admin' => $log->adminuser, 'location' => ($location) ? $location->name : '', 'note' => $note, ]; @@ -248,9 +214,9 @@ trait Loggable */ public function logCreate($note = null) { - $user_id = -1; + $created_by = -1; if (auth()->user()) { - $user_id = auth()->id(); + $created_by = auth()->id(); } $log = new Actionlog; if (static::class == LicenseSeat::class) { @@ -262,7 +228,7 @@ trait Loggable } $log->location_id = null; $log->note = $note; - $log->user_id = $user_id; + $log->created_by = $created_by; $log->logaction('create'); $log->save(); @@ -284,7 +250,7 @@ trait Loggable $log->item_type = static::class; $log->item_id = $this->id; } - $log->user_id = auth()->id(); + $log->created_by = auth()->id(); $log->note = $note; $log->target_id = null; $log->created_at = date('Y-m-d H:i:s'); diff --git a/app/Models/Manufacturer.php b/app/Models/Manufacturer.php index 85907f7ddb..1b31f496d3 100755 --- a/app/Models/Manufacturer.php +++ b/app/Models/Manufacturer.php @@ -74,10 +74,11 @@ class Manufacturer extends SnipeModel public function isDeletable() { return Gate::allows('delete', $this) - && ($this->assets()->count() === 0) - && ($this->licenses()->count() === 0) - && ($this->consumables()->count() === 0) - && ($this->accessories()->count() === 0) + && (($this->assets_count ?? $this->assets()->count()) === 0) + && (($this->licenses_count ?? $this->licenses()->count()) === 0) + && (($this->consumables_count ?? $this->consumables()->count()) === 0) + && (($this->accessories_count ?? $this->accessories()->count()) === 0) + && (($this->components_count ?? $this->components()->count()) === 0) && ($this->deleted_at == ''); } @@ -105,4 +106,23 @@ class Manufacturer extends SnipeModel { return $this->hasMany(\App\Models\Consumable::class, 'manufacturer_id'); } + + public function components() + { + return $this->hasMany(\App\Models\Component::class, 'manufacturer_id'); + } + + public function adminuser() + { + return $this->belongsTo(\App\Models\User::class, 'created_by'); + } + + + /** + * Query builder scope to order on the user that created it + */ + public function scopeOrderByCreatedBy($query, $order) + { + return $query->leftJoin('users as admin_sort', 'manufacturers.created_by', '=', 'admin_sort.id')->select('manufacturers.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order); + } } diff --git a/app/Models/PredefinedKit.php b/app/Models/PredefinedKit.php index 1bf6cb098b..36790a1fc7 100644 --- a/app/Models/PredefinedKit.php +++ b/app/Models/PredefinedKit.php @@ -4,6 +4,7 @@ namespace App\Models; use App\Models\Traits\Searchable; use App\Presenters\Presentable; +use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Validation\Rule; use Watson\Validating\ValidatingTrait; @@ -16,6 +17,7 @@ use Watson\Validating\ValidatingTrait; class PredefinedKit extends SnipeModel { protected $presenter = \App\Presenters\PredefinedKitPresenter::class; + use HasFactory; use Presentable; protected $table = 'kits'; @@ -133,6 +135,13 @@ class PredefinedKit extends SnipeModel */ protected $searchableRelations = []; + + public function adminuser() + { + return $this->belongsTo(\App\Models\User::class, 'created_by'); + } + + /** * Establishes the kits -> models relationship * @return \Illuminate\Database\Eloquent\Relations\Relation @@ -179,4 +188,9 @@ class PredefinedKit extends SnipeModel * BEGIN QUERY SCOPES * ----------------------------------------------- **/ + + public function scopeOrderByCreatedBy($query, $order) + { + return $query->leftJoin('users as admin_sort', 'kits.created_by', '=', 'admin_sort.id')->select('kits.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order); + } } diff --git a/app/Models/Recipients/AdminRecipient.php b/app/Models/Recipients/AdminRecipient.php index 433bd00209..90e39d4ee5 100644 --- a/app/Models/Recipients/AdminRecipient.php +++ b/app/Models/Recipients/AdminRecipient.php @@ -6,9 +6,15 @@ use App\Models\Setting; class AdminRecipient extends Recipient { + + protected $email; public function __construct() { $settings = Setting::getSettings(); $this->email = trim($settings->admin_cc_email); } + + public function getEmail(){ + return $this->email; + } } diff --git a/app/Models/Requestable.php b/app/Models/Requestable.php index bf5c9c427b..4dead82bb3 100644 --- a/app/Models/Requestable.php +++ b/app/Models/Requestable.php @@ -29,19 +29,19 @@ trait Requestable public function request($qty = 1) { $this->requests()->save( - new CheckoutRequest(['user_id' => Auth::id(), 'qty' => $qty]) + new CheckoutRequest(['user_id' => auth()->id(), 'qty' => $qty]) ); } public function deleteRequest() { - $this->requests()->where('user_id', Auth::id())->delete(); + $this->requests()->where('user_id', auth()->id())->delete(); } public function cancelRequest($user_id = null) { if (!$user_id){ - $user_id = Auth::id(); + $user_id = auth()->id(); } $this->requests()->where('user_id', $user_id)->update(['canceled_at' => \Carbon\Carbon::now()]); diff --git a/app/Models/Setting.php b/app/Models/Setting.php index d775be81c5..6f585b95f8 100755 --- a/app/Models/Setting.php +++ b/app/Models/Setting.php @@ -51,36 +51,7 @@ class Setting extends Model */ protected $rules = [ 'brand' => 'required|min:1|numeric', - 'qr_text' => 'max:31|nullable', - 'alert_email' => 'email_array|nullable', - 'admin_cc_email' => 'email|nullable', - 'default_currency' => 'required', - 'locale' => 'required', - 'labels_per_page' => 'numeric', - 'labels_width' => 'numeric', - 'labels_height' => 'numeric', - 'labels_pmargin_left' => 'numeric|nullable', - 'labels_pmargin_right' => 'numeric|nullable', - 'labels_pmargin_top' => 'numeric|nullable', - 'labels_pmargin_bottom' => 'numeric|nullable', - 'labels_display_bgutter' => 'numeric|nullable', - 'labels_display_sgutter' => 'numeric|nullable', - 'labels_fontsize' => 'numeric|min:5', - 'labels_pagewidth' => 'numeric|nullable', - 'labels_pageheight' => 'numeric|nullable', - 'login_remote_user_enabled' => 'numeric|nullable', - 'login_common_disabled' => 'numeric|nullable', - 'login_remote_user_custom_logout_url' => 'string|nullable', - 'login_remote_user_header_name' => 'string|nullable', 'thumbnail_max_h' => 'numeric|max:500|min:25', - 'pwd_secure_min' => 'numeric|required|min:8', - 'alert_threshold' => 'numeric|nullable', - 'alert_interval' => 'numeric|nullable', - 'audit_warning_days' => 'numeric|nullable', - 'due_checkin_days' => 'numeric|nullable', - 'audit_interval' => 'numeric|nullable', - 'custom_forgot_pass_url' => 'url|nullable', - 'privacy_policy_link' => 'nullable|url', 'google_client_id' => 'nullable|ends_with:apps.googleusercontent.com' ]; diff --git a/app/Models/SnipeModel.php b/app/Models/SnipeModel.php index af12c3d29b..f26946d22a 100644 --- a/app/Models/SnipeModel.php +++ b/app/Models/SnipeModel.php @@ -21,6 +21,11 @@ class SnipeModel extends Model */ public function setPurchaseCostAttribute($value) { + if (is_float($value)) { + //value is *already* a floating-point number. Just assign it directly + $this->attributes['purchase_cost'] = $value; + return; + } $value = Helper::ParseCurrency($value); if ($value == 0) { diff --git a/app/Models/Statuslabel.php b/app/Models/Statuslabel.php index 0f8a0b6075..c1bcc3042d 100755 --- a/app/Models/Statuslabel.php +++ b/app/Models/Statuslabel.php @@ -64,6 +64,11 @@ class Statuslabel extends SnipeModel return $this->hasMany(\App\Models\Asset::class, 'status_id'); } + public function adminuser() + { + return $this->belongsTo(\App\Models\User::class, 'created_by'); + } + /** * Gets the status label type * @@ -161,4 +166,9 @@ class Statuslabel extends SnipeModel return $statustype; } + + public function scopeOrderByCreatedBy($query, $order) + { + return $query->leftJoin('users as admin_sort', 'status_labels.created_by', '=', 'admin_sort.id')->select('status_labels.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order); + } } diff --git a/app/Models/User.php b/app/Models/User.php index c03b0d33c0..5b3d876827 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -122,6 +122,7 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo 'jobtitle', 'employee_num', 'website', + 'locale', ]; /** diff --git a/app/Notifications/CheckinAccessoryNotification.php b/app/Notifications/CheckinAccessoryNotification.php index 7e033f1870..28e6c054f7 100644 --- a/app/Notifications/CheckinAccessoryNotification.php +++ b/app/Notifications/CheckinAccessoryNotification.php @@ -6,9 +6,11 @@ use App\Models\Accessory; use App\Models\Setting; use App\Models\User; use Illuminate\Bus\Queueable; +use Illuminate\Notifications\Channels\SlackWebhookChannel; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; +use Illuminate\Support\Str; use NotificationChannels\GoogleChat\Card; use NotificationChannels\GoogleChat\GoogleChatChannel; use NotificationChannels\GoogleChat\GoogleChatMessage; @@ -55,22 +57,9 @@ class CheckinAccessoryNotification extends Notification } if (Setting::getSettings()->webhook_selected == 'slack' || Setting::getSettings()->webhook_selected == 'general' ) { - $notifyBy[] = 'slack'; + $notifyBy[] = SlackWebhookChannel::class; } - /** - * Only send notifications to users that have email addresses - */ - if ($this->target instanceof User && $this->target->email != '') { - Log::debug('The target is a user'); - - if ($this->item->checkin_email()) { - $notifyBy[] = 'mail'; - } - } - - Log::debug('checkin_email on this category is '.$this->item->checkin_email()); - return $notifyBy; } @@ -103,18 +92,29 @@ class CheckinAccessoryNotification extends Notification $admin = $this->admin; $item = $this->item; $note = $this->note; + if(!Str::contains(Setting::getSettings()->webhook_endpoint, 'workflows')) { + return MicrosoftTeamsMessage::create() + ->to($this->settings->webhook_endpoint) + ->type('success') + ->addStartGroupToSection('activityTitle') + ->title(trans('Accessory_Checkin_Notification')) + ->addStartGroupToSection('activityText') + ->fact(htmlspecialchars_decode($item->present()->name), '', 'activityTitle') + ->fact(trans('mail.checked_into'), $item->location->name ? $item->location->name : '') + ->fact(trans('mail.Accessory_Checkin_Notification')." by ", $admin->present()->fullName()) + ->fact(trans('admin/consumables/general.remaining'), $item->numRemaining()) + ->fact(trans('mail.notes'), $note ?: ''); + } - return MicrosoftTeamsMessage::create() - ->to($this->settings->webhook_endpoint) - ->type('success') - ->addStartGroupToSection('activityTitle') - ->title(trans('Accessory_Checkin_Notification')) - ->addStartGroupToSection('activityText') - ->fact(htmlspecialchars_decode($item->present()->name), '', 'activityTitle') - ->fact(trans('mail.checked_into'), $item->location->name ? $item->location->name : '') - ->fact(trans('mail.Accessory_Checkin_Notification')." by ", $admin->present()->fullName()) - ->fact(trans('admin/consumables/general.remaining'), $item->numRemaining()) - ->fact(trans('mail.notes'), $note ?: ''); + $message = trans('mail.Accessory_Checkin_Notification'); + $details = [ + trans('mail.accessory_name') => htmlspecialchars_decode($item->present()->name), + trans('mail.checked_into') => $item->location->name ? $item->location->name : '', + trans('mail.Accessory_Checkin_Notification'). ' by' => $admin->present()->fullName(), + trans('admin/consumables/general.remaining')=> $item->numRemaining(), + trans('mail.notes') => $note ?: '', + ]; + return array($message, $details); } public function toGoogleChat() { @@ -142,24 +142,4 @@ class CheckinAccessoryNotification extends Notification ); } - - /** - * Get the mail representation of the notification. - * - * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage - */ - public function toMail() - { - Log::debug('to email called'); - - return (new MailMessage)->markdown('notifications.markdown.checkin-accessory', - [ - 'item' => $this->item, - 'admin' => $this->admin, - 'note' => $this->note, - 'target' => $this->target, - ]) - ->subject(trans('mail.Accessory_Checkin_Notification')); - } } diff --git a/app/Notifications/CheckinAssetNotification.php b/app/Notifications/CheckinAssetNotification.php index 77cd6d9b5a..fa4780c1fd 100644 --- a/app/Notifications/CheckinAssetNotification.php +++ b/app/Notifications/CheckinAssetNotification.php @@ -7,9 +7,11 @@ use App\Models\Asset; use App\Models\Setting; use App\Models\User; use Illuminate\Bus\Queueable; +use Illuminate\Notifications\Channels\SlackWebhookChannel; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; +use Illuminate\Support\Str; use NotificationChannels\GoogleChat\Card; use NotificationChannels\GoogleChat\GoogleChatChannel; use NotificationChannels\GoogleChat\GoogleChatMessage; @@ -50,7 +52,6 @@ class CheckinAssetNotification extends Notification */ public function via() { - $notifyBy = []; if (Setting::getSettings()->webhook_selected == 'google' && Setting::getSettings()->webhook_endpoint) { $notifyBy[] = GoogleChatChannel::class; @@ -62,15 +63,7 @@ class CheckinAssetNotification extends Notification } if (Setting::getSettings()->webhook_selected == 'slack' || Setting::getSettings()->webhook_selected == 'general' ) { Log::debug('use webhook'); - $notifyBy[] = 'slack'; - } - - /** - * Only send checkin notifications to users if the category - * has the corresponding checkbox checked. - */ - if ($this->item->checkin_email() && $this->target instanceof User && $this->target->email != '') { - $notifyBy[] = 'mail'; + $notifyBy[] = SlackWebhookChannel::class; } return $notifyBy; @@ -106,16 +99,30 @@ class CheckinAssetNotification extends Notification $item = $this->item; $note = $this->note; - return MicrosoftTeamsMessage::create() - ->to($this->settings->webhook_endpoint) - ->type('success') - ->title(trans('mail.Asset_Checkin_Notification')) - ->addStartGroupToSection('activityText') - ->fact(htmlspecialchars_decode($item->present()->name), '', 'activityText') - ->fact(trans('mail.checked_into'), $item->location->name ? $item->location->name : '') - ->fact(trans('mail.Asset_Checkin_Notification')." by ", $admin->present()->fullName()) - ->fact(trans('admin/hardware/form.status'), $item->assetstatus->name) - ->fact(trans('mail.notes'), $note ?: ''); + if(!Str::contains(Setting::getSettings()->webhook_endpoint, 'workflows')) { + return MicrosoftTeamsMessage::create() + ->to($this->settings->webhook_endpoint) + ->type('success') + ->title(trans('mail.Asset_Checkin_Notification')) + ->addStartGroupToSection('activityText') + ->fact(htmlspecialchars_decode($item->present()->name), '', 'activityText') + ->fact(trans('mail.checked_into'), $item->location->name ? $item->location->name : '') + ->fact(trans('mail.Asset_Checkin_Notification') . " by ", $admin->present()->fullName()) + ->fact(trans('admin/hardware/form.status'), $item->assetstatus->name) + ->fact(trans('mail.notes'), $note ?: ''); + } + + + $message = trans('mail.Asset_Checkin_Notification'); + $details = [ + trans('mail.asset') => htmlspecialchars_decode($item->present()->name), + trans('mail.checked_into') => $item->location->name ? $item->location->name : '', + trans('mail.Asset_Checkin_Notification')." by " => $admin->present()->fullName(), + trans('admin/hardware/form.status') => $item->assetstatus->name, + trans('mail.notes') => $note ?: '', + ]; + + return array($message, $details); } public function toGoogleChat() { @@ -142,35 +149,5 @@ class CheckinAssetNotification extends Notification ) ) ); - - } - - /** - * Get the mail representation of the notification. - * - * @return \Illuminate\Notifications\Messages\MailMessage - */ - public function toMail() - { - $fields = []; - - // Check if the item has custom fields associated with it - if (($this->item->model) && ($this->item->model->fieldset)) { - $fields = $this->item->model->fieldset->fields; - } - - $message = (new MailMessage)->markdown('notifications.markdown.checkin-asset', - [ - 'item' => $this->item, - 'status' => $this->item->assetstatus?->name, - 'admin' => $this->admin, - 'note' => $this->note, - 'target' => $this->target, - 'fields' => $fields, - 'expected_checkin' => $this->expected_checkin, - ]) - ->subject(trans('mail.Asset_Checkin_Notification')); - - return $message; } } diff --git a/app/Notifications/CheckinLicenseSeatNotification.php b/app/Notifications/CheckinLicenseSeatNotification.php index 289e63a162..1cb8706e67 100644 --- a/app/Notifications/CheckinLicenseSeatNotification.php +++ b/app/Notifications/CheckinLicenseSeatNotification.php @@ -6,9 +6,11 @@ use App\Models\LicenseSeat; use App\Models\Setting; use App\Models\User; use Illuminate\Bus\Queueable; +use Illuminate\Notifications\Channels\SlackWebhookChannel; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; +use Illuminate\Support\Str; use NotificationChannels\GoogleChat\Card; use NotificationChannels\GoogleChat\GoogleChatChannel; use NotificationChannels\GoogleChat\GoogleChatMessage; @@ -58,15 +60,7 @@ class CheckinLicenseSeatNotification extends Notification } if (Setting::getSettings()->webhook_selected == 'slack' || Setting::getSettings()->webhook_selected == 'general' ) { - $notifyBy[] = 'slack'; - } - - /** - * Only send checkin notifications to users if the category - * has the corresponding checkbox checked. - */ - if ($this->item->checkin_email() && $this->target instanceof User && $this->target->email != '') { - $notifyBy[] = 'mail'; + $notifyBy[] = SlackWebhookChannel::class; } return $notifyBy; @@ -109,18 +103,30 @@ class CheckinLicenseSeatNotification extends Notification $admin = $this->admin; $item = $this->item; $note = $this->note; + if(!Str::contains(Setting::getSettings()->webhook_endpoint, 'workflows')) { + return MicrosoftTeamsMessage::create() + ->to($this->settings->webhook_endpoint) + ->type('success') + ->addStartGroupToSection('activityTitle') + ->title(trans('mail.License_Checkin_Notification')) + ->addStartGroupToSection('activityText') + ->fact(htmlspecialchars_decode($item->present()->name), '', 'header') + ->fact(trans('mail.License_Checkin_Notification')." by ", $admin->present()->fullName() ?: 'CLI tool') + ->fact(trans('mail.checkedin_from'), $target->present()->fullName()) + ->fact(trans('admin/consumables/general.remaining'), $item->availCount()->count()) + ->fact(trans('mail.notes'), $note ?: ''); + } - return MicrosoftTeamsMessage::create() - ->to($this->settings->webhook_endpoint) - ->type('success') - ->addStartGroupToSection('activityTitle') - ->title(trans('mail.License_Checkin_Notification')) - ->addStartGroupToSection('activityText') - ->fact(htmlspecialchars_decode($item->present()->name), '', 'header') - ->fact(trans('mail.License_Checkin_Notification')." by ", $admin->present()->fullName() ?: 'CLI tool') - ->fact(trans('mail.checkedin_from'), $target->present()->fullName()) - ->fact(trans('admin/consumables/general.remaining'), $item->availCount()->count()) - ->fact(trans('mail.notes'), $note ?: ''); + $message = trans('mail.License_Checkin_Notification'); + $details = [ + trans('mail.checkedin_from')=> $target->present()->fullName(), + trans('mail.license_for') => htmlspecialchars_decode($item->present()->name), + trans('mail.License_Checkin_Notification')." by " => $admin->present()->fullName() ?: 'CLI tool', + trans('admin/consumables/general.remaining') => $item->availCount()->count(), + trans('mail.notes') => $note ?: '', + ]; + + return array($message, $details); } public function toGoogleChat() { @@ -149,23 +155,4 @@ class CheckinLicenseSeatNotification extends Notification ); } - - - /** - * Get the mail representation of the notification. - * - * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage - */ - public function toMail() - { - return (new MailMessage)->markdown('notifications.markdown.checkin-license', - [ - 'item' => $this->item, - 'admin' => $this->admin, - 'note' => $this->note, - 'target' => $this->target, - ]) - ->subject(trans('mail.License_Checkin_Notification')); - } } diff --git a/app/Notifications/CheckoutAccessoryNotification.php b/app/Notifications/CheckoutAccessoryNotification.php index 721ba7f6a4..116a5ac29f 100644 --- a/app/Notifications/CheckoutAccessoryNotification.php +++ b/app/Notifications/CheckoutAccessoryNotification.php @@ -9,6 +9,7 @@ use Illuminate\Bus\Queueable; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; +use Illuminate\Support\Str; use NotificationChannels\GoogleChat\Card; use NotificationChannels\GoogleChat\GoogleChatChannel; use NotificationChannels\GoogleChat\GoogleChatMessage; @@ -120,6 +121,7 @@ class CheckoutAccessoryNotification extends Notification $item = $this->item; $note = $this->note; + if(!Str::contains(Setting::getSettings()->webhook_endpoint, 'workflows')) { return MicrosoftTeamsMessage::create() ->to($this->settings->webhook_endpoint) ->type('success') @@ -133,7 +135,19 @@ class CheckoutAccessoryNotification extends Notification ->fact(trans('mail.Accessory_Checkout_Notification') . " by ", $admin->present()->fullName()) ->fact(trans('admin/consumables/general.remaining'), $item->numRemaining()) ->fact(trans('mail.notes'), $note ?: ''); + } + $message = trans('mail.Accessory_Checkout_Notification'); + $details = [ + trans('mail.assigned_to') => $target->present()->name, + trans('mail.accessory_name') => htmlspecialchars_decode($item->present()->name), + trans('general.qty') => $this->checkout_qty, + trans('mail.checkedout_from') => $item->location->name ? $item->location->name : '', + trans('mail.Accessory_Checkout_Notification'). ' by' => $admin->present()->fullName(), + trans('admin/consumables/general.remaining')=> $item->numRemaining(), + trans('mail.notes') => $note ?: '', + ]; + return array($message, $details); } public function toGoogleChat() { diff --git a/app/Notifications/CheckoutAssetNotification.php b/app/Notifications/CheckoutAssetNotification.php index 5ebde7e4f7..83011e5c8e 100644 --- a/app/Notifications/CheckoutAssetNotification.php +++ b/app/Notifications/CheckoutAssetNotification.php @@ -8,9 +8,10 @@ use App\Models\Setting; use App\Models\User; use Exception; use Illuminate\Bus\Queueable; -use Illuminate\Notifications\Messages\MailMessage; +use Illuminate\Notifications\Channels\SlackWebhookChannel; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; +use Illuminate\Support\Str; use NotificationChannels\GoogleChat\Card; use NotificationChannels\GoogleChat\Enums\Icon; use NotificationChannels\GoogleChat\Enums\ImageStyle; @@ -21,6 +22,9 @@ use NotificationChannels\GoogleChat\Widgets\KeyValue; use NotificationChannels\MicrosoftTeams\MicrosoftTeamsChannel; use NotificationChannels\MicrosoftTeams\MicrosoftTeamsMessage; use Illuminate\Support\Facades\Log; +use Osama\LaravelTeamsNotification\Logging\TeamsLoggingChannel; +use Osama\LaravelTeamsNotification\TeamsNotification; + class CheckoutAssetNotification extends Notification { use Queueable; @@ -32,14 +36,11 @@ class CheckoutAssetNotification extends Notification */ public function __construct(Asset $asset, $checkedOutTo, User $checkedOutBy, $acceptance, $note) { + $this->settings = Setting::getSettings(); $this->item = $asset; $this->admin = $checkedOutBy; $this->note = $note; $this->target = $checkedOutTo; - $this->acceptance = $acceptance; - - $this->settings = Setting::getSettings(); - $this->last_checkout = ''; $this->expected_checkin = ''; @@ -53,7 +54,6 @@ class CheckoutAssetNotification extends Notification false); } } - /** * Get the notification's delivery channels. * @@ -62,61 +62,34 @@ class CheckoutAssetNotification extends Notification public function via() { $notifyBy = []; - if (Setting::getSettings()->webhook_selected == 'google' && Setting::getSettings()->webhook_endpoint) { + + if (Setting::getSettings()->webhook_selected === 'google' && Setting::getSettings()->webhook_endpoint) { $notifyBy[] = GoogleChatChannel::class; } - if (Setting::getSettings()->webhook_selected == 'microsoft' && Setting::getSettings()->webhook_endpoint) { + if (Setting::getSettings()->webhook_selected === 'microsoft' && Setting::getSettings()->webhook_endpoint) { - $notifyBy[] = MicrosoftTeamsChannel::class; + $notifyBy[] = TeamsNotification::class; } - if (Setting::getSettings()->webhook_selected == 'slack' || Setting::getSettings()->webhook_selected == 'general' ) { + if (Setting::getSettings()->webhook_selected === 'slack' || Setting::getSettings()->webhook_selected === 'general' ) { Log::debug('use webhook'); - $notifyBy[] = 'slack'; - } - - /** - * Only send notifications to users that have email addresses - */ - if ($this->target instanceof User && $this->target->email != '') { - - /** - * Send an email if the asset requires acceptance, - * so the user can accept or decline the asset - */ - if ($this->item->requireAcceptance()) { - $notifyBy[1] = 'mail'; - } - - /** - * Send an email if the item has a EULA, since the user should always receive it - */ - if ($this->item->getEula()) { - $notifyBy[1] = 'mail'; - } - - /** - * Send an email if an email should be sent at checkin/checkout - */ - if ($this->item->checkin_email()) { - $notifyBy[1] = 'mail'; - } + $notifyBy[] = SlackWebhookChannel::class; } return $notifyBy; } - public function toSlack() + public function toSlack() :SlackMessage { $target = $this->target; $admin = $this->admin; $item = $this->item; $note = $this->note; - $botname = ($this->settings->webhook_botname) ? $this->settings->webhook_botname : 'Snipe-Bot'; + $botname = ($this->settings->webhook_botname) ?: 'Snipe-Bot'; $channel = ($this->settings->webhook_channel) ? $this->settings->webhook_channel : ''; $fields = [ @@ -124,7 +97,7 @@ class CheckoutAssetNotification extends Notification 'By' => '<'.$admin->present()->viewUrl().'|'.$admin->present()->fullName().'>', ]; - if (($this->expected_checkin) && ($this->expected_checkin != '')) { + if (($this->expected_checkin) && ($this->expected_checkin !== '')) { $fields['Expected Checkin'] = $this->expected_checkin; } @@ -138,24 +111,33 @@ class CheckoutAssetNotification extends Notification ->content($note); }); } - public function toMicrosoftTeams() + public function toMicrosoftTeams() : array { $target = $this->target; $admin = $this->admin; $item = $this->item; $note = $this->note; - return MicrosoftTeamsMessage::create() - ->to($this->settings->webhook_endpoint) - ->type('success') - ->title(trans('mail.Asset_Checkout_Notification')) - ->addStartGroupToSection('activityText') - ->fact(trans('mail.assigned_to'), $target->present()->name) - ->fact(htmlspecialchars_decode($item->present()->name), '', 'activityText') - ->fact(trans('mail.Asset_Checkout_Notification') . " by ", $admin->present()->fullName()) - ->fact(trans('mail.notes'), $note ?: ''); - + if(!Str::contains(Setting::getSettings()->webhook_endpoint, 'workflows')) { + return MicrosoftTeamsMessage::create() + ->to($this->settings->webhook_endpoint) + ->type('success') + ->title(trans('mail.Asset_Checkout_Notification')) + ->addStartGroupToSection('activityText') + ->fact(trans('mail.assigned_to'), $target->present()->name) + ->fact(htmlspecialchars_decode($item->present()->name), '', 'activityText') + ->fact(trans('mail.Asset_Checkout_Notification') . " by ", $admin->present()->fullName()) + ->fact(trans('mail.notes'), $note ?: ''); + } + $message = trans('mail.Asset_Checkout_Notification'); + $details = [ + trans('mail.assigned_to') => $target->present()->name, + trans('mail.asset') => htmlspecialchars_decode($item->present()->name), + trans('mail.Asset_Checkout_Notification'). ' by' => $admin->present()->fullName(), + trans('mail.notes') => $note ?: '', + ]; + return array($message, $details); } public function toGoogleChat() { @@ -184,43 +166,4 @@ public function toGoogleChat() ); } - - /** - * Get the mail representation of the notification. - * - * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage - */ - public function toMail() - { - $eula = method_exists($this->item, 'getEula') ? $this->item->getEula() : ''; - $req_accept = method_exists($this->item, 'requireAcceptance') ? $this->item->requireAcceptance() : 0; - - $fields = []; - - // Check if the item has custom fields associated with it - if (($this->item->model) && ($this->item->model->fieldset)) { - $fields = $this->item->model->fieldset->fields; - } - - $accept_url = is_null($this->acceptance) ? null : route('account.accept.item', $this->acceptance); - - $message = (new MailMessage)->markdown('notifications.markdown.checkout-asset', - [ - 'item' => $this->item, - 'admin' => $this->admin, - 'status' => $this->item->assetstatus?->name, - 'note' => $this->note, - 'target' => $this->target, - 'fields' => $fields, - 'eula' => $eula, - 'req_accept' => $req_accept, - 'accept_url' => $accept_url, - 'last_checkout' => $this->last_checkout, - 'expected_checkin' => $this->expected_checkin, - ]) - ->subject(trans('mail.Confirm_asset_delivery')); - - return $message; - } } diff --git a/app/Notifications/CheckoutConsumableNotification.php b/app/Notifications/CheckoutConsumableNotification.php index 6746795f2c..ba7c5646ab 100644 --- a/app/Notifications/CheckoutConsumableNotification.php +++ b/app/Notifications/CheckoutConsumableNotification.php @@ -6,9 +6,11 @@ use App\Models\Consumable; use App\Models\Setting; use App\Models\User; use Illuminate\Bus\Queueable; +use Illuminate\Notifications\Channels\SlackWebhookChannel; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; +use Illuminate\Support\Str; use NotificationChannels\GoogleChat\Card; use NotificationChannels\GoogleChat\GoogleChatChannel; use NotificationChannels\GoogleChat\GoogleChatMessage; @@ -38,6 +40,7 @@ class CheckoutConsumableNotification extends Notification $this->note = $note; $this->target = $checkedOutTo; $this->acceptance = $acceptance; + $this->qty = $consumable->checkout_qty; $this->settings = Setting::getSettings(); } @@ -61,35 +64,7 @@ class CheckoutConsumableNotification extends Notification } if (Setting::getSettings()->webhook_selected == 'slack' || Setting::getSettings()->webhook_selected == 'general' ) { - $notifyBy[] = 'slack'; - } - - /** - * Only send notifications to users that have email addresses - */ - if ($this->target instanceof User && $this->target->email != '') { - - /** - * Send an email if the asset requires acceptance, - * so the user can accept or decline the asset - */ - if ($this->item->requireAcceptance()) { - $notifyBy[1] = 'mail'; - } - - /** - * Send an email if the item has a EULA, since the user should always receive it - */ - if ($this->item->getEula()) { - $notifyBy[1] = 'mail'; - } - - /** - * Send an email if an email should be sent at checkin/checkout - */ - if ((method_exists($this->item, 'checkin_email')) && ($this->item->checkin_email())) { - $notifyBy[1] = 'mail'; - } + $notifyBy[] = SlackWebhookChannel::class; } return $notifyBy; @@ -126,17 +101,30 @@ class CheckoutConsumableNotification extends Notification $item = $this->item; $note = $this->note; - return MicrosoftTeamsMessage::create() - ->to($this->settings->webhook_endpoint) - ->type('success') - ->addStartGroupToSection('activityTitle') - ->title(trans('mail.Consumable_checkout_notification')) - ->addStartGroupToSection('activityText') - ->fact(htmlspecialchars_decode($item->present()->name), '', 'activityTitle') - ->fact(trans('mail.Consumable_checkout_notification')." by ", $admin->present()->fullName()) - ->fact(trans('mail.assigned_to'), $target->present()->fullName()) - ->fact(trans('admin/consumables/general.remaining'), $item->numRemaining()) - ->fact(trans('mail.notes'), $note ?: ''); + if(!Str::contains(Setting::getSettings()->webhook_endpoint, 'workflows')) { + return MicrosoftTeamsMessage::create() + ->to($this->settings->webhook_endpoint) + ->type('success') + ->addStartGroupToSection('activityTitle') + ->title(trans('mail.Consumable_checkout_notification')) + ->addStartGroupToSection('activityText') + ->fact(htmlspecialchars_decode($item->present()->name), '', 'activityTitle') + ->fact(trans('mail.Consumable_checkout_notification')." by ", $admin->present()->fullName()) + ->fact(trans('mail.assigned_to'), $target->present()->fullName()) + ->fact(trans('admin/consumables/general.remaining'), $item->numRemaining()) + ->fact(trans('mail.notes'), $note ?: ''); + } + + $message = trans('mail.Consumable_checkout_notification'); + $details = [ + trans('mail.assigned_to') => $target->present()->fullName(), + trans('mail.item') => htmlspecialchars_decode($item->present()->name), + trans('mail.Consumable_checkout_notification').' by' => $admin->present()->fullName(), + trans('admin/consumables/general.remaining') => $item->numRemaining(), + trans('mail.notes') => $note ?: '', + ]; + + return array($message, $details); } public function toGoogleChat() { @@ -165,30 +153,4 @@ class CheckoutConsumableNotification extends Notification ); } - - /** - * Get the mail representation of the notification. - * - * @return \Illuminate\Notifications\Messages\MailMessage - */ - public function toMail() - { - Log::debug($this->item->getImageUrl()); - $eula = $this->item->getEula(); - $req_accept = $this->item->requireAcceptance(); - - $accept_url = is_null($this->acceptance) ? null : route('account.accept.item', $this->acceptance); - - return (new MailMessage)->markdown('notifications.markdown.checkout-consumable', - [ - 'item' => $this->item, - 'admin' => $this->admin, - 'note' => $this->note, - 'target' => $this->target, - 'eula' => $eula, - 'req_accept' => $req_accept, - 'accept_url' => $accept_url, - ]) - ->subject(trans('mail.Confirm_consumable_delivery')); - } } diff --git a/app/Notifications/CheckoutLicenseSeatNotification.php b/app/Notifications/CheckoutLicenseSeatNotification.php index 8e0273c66e..1aed0d2004 100644 --- a/app/Notifications/CheckoutLicenseSeatNotification.php +++ b/app/Notifications/CheckoutLicenseSeatNotification.php @@ -6,9 +6,11 @@ use App\Models\LicenseSeat; use App\Models\Setting; use App\Models\User; use Illuminate\Bus\Queueable; +use Illuminate\Notifications\Channels\SlackWebhookChannel; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; +use Illuminate\Support\Str; use NotificationChannels\GoogleChat\Card; use NotificationChannels\GoogleChat\GoogleChatChannel; use NotificationChannels\GoogleChat\GoogleChatMessage; @@ -60,35 +62,7 @@ class CheckoutLicenseSeatNotification extends Notification } if (Setting::getSettings()->webhook_selected == 'slack' || Setting::getSettings()->webhook_selected == 'general' ) { - $notifyBy[] = 'slack'; - } - - /** - * Only send notifications to users that have email addresses - */ - if ($this->target instanceof User && $this->target->email != '') { - - /** - * Send an email if the asset requires acceptance, - * so the user can accept or decline the asset - */ - if ($this->item->requireAcceptance()) { - $notifyBy[1] = 'mail'; - } - - /** - * Send an email if the item has a EULA, since the user should always receive it - */ - if ($this->item->getEula()) { - $notifyBy[1] = 'mail'; - } - - /** - * Send an email if an email should be sent at checkin/checkout - */ - if ($this->item->checkin_email()) { - $notifyBy[1] = 'mail'; - } + $notifyBy[] = SlackWebhookChannel::class; } return $notifyBy; @@ -125,17 +99,29 @@ class CheckoutLicenseSeatNotification extends Notification $item = $this->item; $note = $this->note; - return MicrosoftTeamsMessage::create() - ->to($this->settings->webhook_endpoint) - ->type('success') - ->addStartGroupToSection('activityTitle') - ->title(trans('mail.License_Checkout_Notification')) - ->addStartGroupToSection('activityText') - ->fact(htmlspecialchars_decode($item->present()->name), '', 'activityTitle') - ->fact(trans('mail.License_Checkout_Notification')." by ", $admin->present()->fullName()) - ->fact(trans('mail.assigned_to'), $target->present()->fullName()) - ->fact(trans('admin/consumables/general.remaining'), $item->availCount()->count()) - ->fact(trans('mail.notes'), $note ?: ''); + if(!Str::contains(Setting::getSettings()->webhook_endpoint, 'workflows')) { + return MicrosoftTeamsMessage::create() + ->to($this->settings->webhook_endpoint) + ->type('success') + ->addStartGroupToSection('activityTitle') + ->title(trans('mail.License_Checkout_Notification')) + ->addStartGroupToSection('activityText') + ->fact(htmlspecialchars_decode($item->present()->name), '', 'activityTitle') + ->fact(trans('mail.License_Checkout_Notification')." by ", $admin->present()->fullName()) + ->fact(trans('mail.assigned_to'), $target->present()->fullName()) + ->fact(trans('admin/consumables/general.remaining'), $item->availCount()->count()) + ->fact(trans('mail.notes'), $note ?: ''); + } + + $message = trans('mail.License_Checkout_Notification'); + $details = [ + trans('mail.assigned_to') => $target->present()->fullName(), + trans('mail.license_for') => htmlspecialchars_decode($item->present()->name), + trans('mail.License_Checkout_Notification').' by' => $admin->present()->fullName(), + trans('admin/consumables/general.remaining') => $item->availCount()->count(), + trans('mail.notes') => $note ?: '', + ]; + return array($message, $details); } public function toGoogleChat() { @@ -164,29 +150,4 @@ class CheckoutLicenseSeatNotification extends Notification ); } - - /** - * Get the mail representation of the notification. - * - * @return \Illuminate\Notifications\Messages\MailMessage - */ - public function toMail() - { - $eula = method_exists($this->item, 'getEula') ? $this->item->getEula() : ''; - $req_accept = method_exists($this->item, 'requireAcceptance') ? $this->item->requireAcceptance() : 0; - - $accept_url = is_null($this->acceptance) ? null : route('account.accept.item', $this->acceptance); - - return (new MailMessage)->markdown('notifications.markdown.checkout-license', - [ - 'item' => $this->item, - 'admin' => $this->admin, - 'note' => $this->note, - 'target' => $this->target, - 'eula' => $eula, - 'req_accept' => $req_accept, - 'accept_url' => $accept_url, - ]) - ->subject(trans('mail.Confirm_license_delivery')); - } } diff --git a/app/Observers/AccessoryObserver.php b/app/Observers/AccessoryObserver.php index 661d00b4c2..0f8b2492cd 100644 --- a/app/Observers/AccessoryObserver.php +++ b/app/Observers/AccessoryObserver.php @@ -20,7 +20,7 @@ class AccessoryObserver $logAction->item_type = Accessory::class; $logAction->item_id = $accessory->id; $logAction->created_at = date('Y-m-d H:i:s'); - $logAction->user_id = Auth::id(); + $logAction->created_by = auth()->id(); $logAction->logaction('update'); } @@ -37,7 +37,7 @@ class AccessoryObserver $logAction->item_type = Accessory::class; $logAction->item_id = $accessory->id; $logAction->created_at = date('Y-m-d H:i:s'); - $logAction->user_id = Auth::id(); + $logAction->created_by = auth()->id(); if($accessory->imported) { $logAction->setActionSource('importer'); } @@ -56,7 +56,7 @@ class AccessoryObserver $logAction->item_type = Accessory::class; $logAction->item_id = $accessory->id; $logAction->created_at = date('Y-m-d H:i:s'); - $logAction->user_id = Auth::id(); + $logAction->created_by = auth()->id(); $logAction->logaction('delete'); } } diff --git a/app/Observers/AssetObserver.php b/app/Observers/AssetObserver.php index f77c4cc00f..0d01428ea8 100644 --- a/app/Observers/AssetObserver.php +++ b/app/Observers/AssetObserver.php @@ -62,7 +62,7 @@ class AssetObserver $logAction->item_type = Asset::class; $logAction->item_id = $asset->id; $logAction->created_at = date('Y-m-d H:i:s'); - $logAction->user_id = Auth::id(); + $logAction->created_by = auth()->id(); $logAction->log_meta = json_encode($changed); $logAction->logaction('update'); } @@ -108,7 +108,7 @@ class AssetObserver $logAction->item_type = Asset::class; // can we instead say $logAction->item = $asset ? $logAction->item_id = $asset->id; $logAction->created_at = date('Y-m-d H:i:s'); - $logAction->user_id = Auth::id(); + $logAction->created_by = auth()->id(); if($asset->imported) { $logAction->setActionSource('importer'); } @@ -127,7 +127,7 @@ class AssetObserver $logAction->item_type = Asset::class; $logAction->item_id = $asset->id; $logAction->created_at = date('Y-m-d H:i:s'); - $logAction->user_id = Auth::id(); + $logAction->created_by = auth()->id(); $logAction->logaction('delete'); } @@ -143,7 +143,7 @@ class AssetObserver $logAction->item_type = Asset::class; $logAction->item_id = $asset->id; $logAction->created_at = date('Y-m-d H:i:s'); - $logAction->user_id = Auth::id(); + $logAction->created_by = auth()->id(); $logAction->logaction('restore'); } diff --git a/app/Observers/ComponentObserver.php b/app/Observers/ComponentObserver.php index 44bf819353..cd2c58c367 100644 --- a/app/Observers/ComponentObserver.php +++ b/app/Observers/ComponentObserver.php @@ -20,7 +20,7 @@ class ComponentObserver $logAction->item_type = Component::class; $logAction->item_id = $component->id; $logAction->created_at = date('Y-m-d H:i:s'); - $logAction->user_id = Auth::id(); + $logAction->created_by = auth()->id(); $logAction->logaction('update'); } @@ -37,7 +37,7 @@ class ComponentObserver $logAction->item_type = Component::class; $logAction->item_id = $component->id; $logAction->created_at = date('Y-m-d H:i:s'); - $logAction->user_id = Auth::id(); + $logAction->created_by = auth()->id(); if($component->imported) { $logAction->setActionSource('importer'); } @@ -56,7 +56,7 @@ class ComponentObserver $logAction->item_type = Component::class; $logAction->item_id = $component->id; $logAction->created_at = date('Y-m-d H:i:s'); - $logAction->user_id = Auth::id(); + $logAction->created_by = auth()->id(); $logAction->logaction('delete'); } } diff --git a/app/Observers/ConsumableObserver.php b/app/Observers/ConsumableObserver.php index 377995ebb9..57471cee9c 100644 --- a/app/Observers/ConsumableObserver.php +++ b/app/Observers/ConsumableObserver.php @@ -34,7 +34,7 @@ class ConsumableObserver $logAction->item_type = Consumable::class; $logAction->item_id = $consumable->id; $logAction->created_at = date('Y-m-d H:i:s'); - $logAction->user_id = Auth::id(); + $logAction->created_by = auth()->id(); $logAction->log_meta = json_encode($changed); $logAction->logaction('update'); } @@ -53,7 +53,7 @@ class ConsumableObserver $logAction->item_type = Consumable::class; $logAction->item_id = $consumable->id; $logAction->created_at = date('Y-m-d H:i:s'); - $logAction->user_id = Auth::id(); + $logAction->created_by = auth()->id(); if($consumable->imported) { $logAction->setActionSource('importer'); } @@ -98,7 +98,7 @@ class ConsumableObserver $logAction->item_type = Consumable::class; $logAction->item_id = $consumable->id; $logAction->created_at = date('Y-m-d H:i:s'); - $logAction->user_id = Auth::id(); + $logAction->created_by = auth()->id(); $logAction->logaction('delete'); } } diff --git a/app/Observers/LicenseObserver.php b/app/Observers/LicenseObserver.php index de4863fafa..4e355bf639 100644 --- a/app/Observers/LicenseObserver.php +++ b/app/Observers/LicenseObserver.php @@ -20,7 +20,7 @@ class LicenseObserver $logAction->item_type = License::class; $logAction->item_id = $license->id; $logAction->created_at = date('Y-m-d H:i:s'); - $logAction->user_id = Auth::id(); + $logAction->created_by = auth()->id(); $logAction->logaction('update'); } @@ -37,7 +37,7 @@ class LicenseObserver $logAction->item_type = License::class; $logAction->item_id = $license->id; $logAction->created_at = date('Y-m-d H:i:s'); - $logAction->user_id = Auth::id(); + $logAction->created_by = auth()->id(); if($license->imported) { $logAction->setActionSource('importer'); } @@ -56,7 +56,7 @@ class LicenseObserver $logAction->item_type = License::class; $logAction->item_id = $license->id; $logAction->created_at = date('Y-m-d H:i:s'); - $logAction->user_id = Auth::id(); + $logAction->created_by = auth()->id(); $logAction->logaction('delete'); } } diff --git a/app/Observers/UserObserver.php b/app/Observers/UserObserver.php index c7c2a460cb..acde9ceaed 100644 --- a/app/Observers/UserObserver.php +++ b/app/Observers/UserObserver.php @@ -83,7 +83,7 @@ class UserObserver $logAction->target_type = User::class; // can we instead say $logAction->item = $asset ? $logAction->target_id = $user->id; $logAction->created_at = date('Y-m-d H:i:s'); - $logAction->user_id = Auth::id(); + $logAction->created_by = auth()->id(); $logAction->log_meta = json_encode($changed); $logAction->logaction('update'); } @@ -105,7 +105,7 @@ class UserObserver $logAction->item_type = User::class; // can we instead say $logAction->item = $asset ? $logAction->item_id = $user->id; $logAction->created_at = date('Y-m-d H:i:s'); - $logAction->user_id = Auth::id(); + $logAction->created_by = auth()->id(); $logAction->logaction('create'); } @@ -123,7 +123,7 @@ class UserObserver $logAction->target_type = User::class; // can we instead say $logAction->item = $asset ? $logAction->target_id = $user->id; $logAction->created_at = date('Y-m-d H:i:s'); - $logAction->user_id = Auth::id(); + $logAction->created_by = auth()->id(); $logAction->logaction('delete'); } @@ -141,7 +141,7 @@ class UserObserver $logAction->target_type = User::class; // can we instead say $logAction->item = $asset ? $logAction->target_id = $user->id; $logAction->created_at = date('Y-m-d H:i:s'); - $logAction->user_id = Auth::id(); + $logAction->created_by = auth()->id(); $logAction->logaction('restore'); } diff --git a/app/Presenters/AccessoryPresenter.php b/app/Presenters/AccessoryPresenter.php index 4ff3c699c7..04f55cf364 100644 --- a/app/Presenters/AccessoryPresenter.php +++ b/app/Presenters/AccessoryPresenter.php @@ -127,6 +127,29 @@ class AccessoryPresenter extends Presenter 'visible' => false, 'title' => trans('general.notes'), 'formatter' => 'notesFormatter' + ], [ + 'field' => 'created_by', + 'searchable' => false, + 'sortable' => true, + 'title' => trans('general.created_by'), + 'visible' => false, + 'formatter' => 'usersLinkObjFormatter', + ], [ + 'field' => 'created_at', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.created_at'), + 'visible' => false, + 'formatter' => 'dateDisplayFormatter', + ], [ + 'field' => 'updated_at', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.updated_at'), + 'visible' => false, + 'formatter' => 'dateDisplayFormatter', ], [ 'field' => 'change', 'searchable' => false, diff --git a/app/Presenters/ActionlogPresenter.php b/app/Presenters/ActionlogPresenter.php index ebbe3d7823..9251ce6347 100644 --- a/app/Presenters/ActionlogPresenter.php +++ b/app/Presenters/ActionlogPresenter.php @@ -7,7 +7,7 @@ namespace App\Presenters; */ class ActionlogPresenter extends Presenter { - public function admin() + public function adminuser() { if ($user = $this->model->user) { if (empty($user->deleted_at)) { @@ -42,27 +42,27 @@ class ActionlogPresenter extends Presenter // User related icons if ($this->itemType() == 'user') { - if ($this->actionType()=='2fa reset') { + if ($this->action_type == '2fa reset') { return 'fa-solid fa-mobile-screen'; } - if ($this->actionType()=='create new') { + if ($this->action_type == 'create new') { return 'fa-solid fa-user-plus'; } - if ($this->actionType()=='merged') { + if ($this->action_type == 'merged') { return 'fa-solid fa-people-arrows'; } - if ($this->actionType()=='delete') { + if ($this->action_type == 'delete') { return 'fa-solid fa-user-minus'; } - if ($this->actionType()=='delete') { + if ($this->action_type == 'delete') { return 'fa-solid fa-user-minus'; } - if ($this->actionType()=='update') { + if ($this->action_type == 'update') { return 'fa-solid fa-user-pen'; } @@ -70,31 +70,31 @@ class ActionlogPresenter extends Presenter } // Everything else - if ($this->actionType()=='create new') { + if ($this->action_type == 'create new') { return 'fa-solid fa-plus'; } - if ($this->actionType()=='delete') { + if ($this->action_type == 'delete') { return 'fa-solid fa-trash'; } - if ($this->actionType()=='update') { + if ($this->action_type == 'update') { return 'fa-solid fa-pen'; } - if ($this->actionType()=='restore') { + if ($this->action_type == 'restore') { return 'fa-solid fa-trash-arrow-up'; } - if ($this->actionType()=='upload') { + if ($this->action_type == 'upload') { return 'fas fa-paperclip'; } - if ($this->actionType()=='checkout') { + if ($this->action_type == 'checkout') { return 'fa-solid fa-rotate-left'; } - if ($this->actionType()=='checkin from') { + if ($this->action_type == 'checkin from') { return 'fa-solid fa-rotate-right'; } diff --git a/app/Presenters/AssetMaintenancesPresenter.php b/app/Presenters/AssetMaintenancesPresenter.php index 3908720dc3..ca49c931a4 100644 --- a/app/Presenters/AssetMaintenancesPresenter.php +++ b/app/Presenters/AssetMaintenancesPresenter.php @@ -117,12 +117,29 @@ class AssetMaintenancesPresenter extends Presenter 'title' => trans('admin/asset_maintenances/form.cost'), 'class' => 'text-right', ], [ - 'field' => 'user_id', - 'searchable' => true, + 'field' => 'created_by', + 'searchable' => false, 'sortable' => true, - 'title' => trans('general.admin'), + 'title' => trans('general.created_by'), + 'visible' => false, 'formatter' => 'usersLinkObjFormatter', ], [ + 'field' => 'created_at', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.created_at'), + 'visible' => false, + 'formatter' => 'dateDisplayFormatter', + ], [ + 'field' => 'updated_at', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.updated_at'), + 'visible' => false, + 'formatter' => 'dateDisplayFormatter', + ],[ 'field' => 'actions', 'searchable' => false, 'sortable' => false, diff --git a/app/Presenters/AssetModelPresenter.php b/app/Presenters/AssetModelPresenter.php index da93092b91..324cc7d096 100644 --- a/app/Presenters/AssetModelPresenter.php +++ b/app/Presenters/AssetModelPresenter.php @@ -135,19 +135,27 @@ class AssetModelPresenter extends Presenter 'formatter' => 'notesFormatter', ], [ + 'field' => 'created_by', + 'searchable' => false, + 'sortable' => true, + 'title' => trans('general.created_by'), + 'visible' => false, + 'formatter' => 'usersLinkObjFormatter', + ], [ 'field' => 'created_at', 'searchable' => true, 'sortable' => true, - 'visible' => false, + 'switchable' => true, 'title' => trans('general.created_at'), + 'visible' => false, 'formatter' => 'dateDisplayFormatter', - ], - [ + ], [ 'field' => 'updated_at', 'searchable' => true, 'sortable' => true, - 'visible' => false, + 'switchable' => true, 'title' => trans('general.updated_at'), + 'visible' => false, 'formatter' => 'dateDisplayFormatter', ], diff --git a/app/Presenters/AssetPresenter.php b/app/Presenters/AssetPresenter.php index b86135f33b..19bd2985e7 100644 --- a/app/Presenters/AssetPresenter.php +++ b/app/Presenters/AssetPresenter.php @@ -233,18 +233,28 @@ class AssetPresenter extends Presenter 'title' => trans('general.user_requests_count'), ], [ - 'field' => 'created_at', + 'field' => 'created_by', 'searchable' => false, 'sortable' => true, + 'title' => trans('general.created_by'), 'visible' => false, + 'formatter' => 'usersLinkObjFormatter', + ], + [ + 'field' => 'created_at', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, 'title' => trans('general.created_at'), + 'visible' => false, 'formatter' => 'dateDisplayFormatter', ], [ 'field' => 'updated_at', - 'searchable' => false, + 'searchable' => true, 'sortable' => true, - 'visible' => false, + 'switchable' => true, 'title' => trans('general.updated_at'), + 'visible' => false, 'formatter' => 'dateDisplayFormatter', ], [ 'field' => 'last_checkout', @@ -579,6 +589,6 @@ class AssetPresenter extends Presenter public function glyph() { - return ''; + return ''; } } diff --git a/app/Presenters/CategoryPresenter.php b/app/Presenters/CategoryPresenter.php index fbf431637c..f551c0ba1b 100644 --- a/app/Presenters/CategoryPresenter.php +++ b/app/Presenters/CategoryPresenter.php @@ -77,19 +77,28 @@ class CategoryPresenter extends Presenter "title" => trans('admin/categories/general.use_default_eula_column'), 'visible' => true, "formatter" => 'trueFalseFormatter', + ],[ + 'field' => 'created_by', + 'searchable' => false, + 'sortable' => true, + 'title' => trans('general.created_by'), + 'visible' => false, + 'formatter' => 'usersLinkObjFormatter', ], [ 'field' => 'created_at', 'searchable' => true, 'sortable' => true, - 'visible' => false, + 'switchable' => true, 'title' => trans('general.created_at'), + 'visible' => false, 'formatter' => 'dateDisplayFormatter', ], [ 'field' => 'updated_at', 'searchable' => true, 'sortable' => true, - 'visible' => false, + 'switchable' => true, 'title' => trans('general.updated_at'), + 'visible' => false, 'formatter' => 'dateDisplayFormatter', ], [ 'field' => 'actions', diff --git a/app/Presenters/CompanyPresenter.php b/app/Presenters/CompanyPresenter.php index 7603191fc1..6f9ece2141 100644 --- a/app/Presenters/CompanyPresenter.php +++ b/app/Presenters/CompanyPresenter.php @@ -65,54 +65,69 @@ class CompanyPresenter extends Presenter 'field' => 'users_count', 'searchable' => false, 'sortable' => true, - 'title' => '', + 'title' => trans('general.users'), 'visible' => true, + 'class' => 'css-users', ], [ 'field' => 'assets_count', 'searchable' => false, 'sortable' => true, - 'title' => '', + 'title' => trans('general.assets'), 'visible' => true, + 'class' => 'css-barcode', ], [ 'field' => 'licenses_count', 'searchable' => false, 'sortable' => true, + 'title' => trans('general.licenses'), 'visible' => true, - 'title' => ' ', + 'class' => 'css-license', ], [ 'field' => 'accessories_count', 'searchable' => false, 'sortable' => true, + 'title' => trans('general.accessories'), 'visible' => true, - 'title' => ' ', + 'class' => 'css-accessory', ], [ 'field' => 'consumables_count', 'searchable' => false, 'sortable' => true, + 'title' => trans('general.consumables'), 'visible' => true, - 'title' => ' ', + 'class' => 'css-consumable', ], [ 'field' => 'components_count', 'searchable' => false, 'sortable' => true, + 'title' => trans('general.components'), 'visible' => true, - 'title' => ' ', - ], [ - 'field' => 'updated_at', + 'class' => 'css-component', + ],[ + 'field' => 'created_by', 'searchable' => false, 'sortable' => true, + 'title' => trans('general.created_by'), 'visible' => false, - 'title' => trans('general.updated_at'), - 'formatter' => 'createdAtFormatter', + 'formatter' => 'usersLinkObjFormatter', ], [ 'field' => 'created_at', - 'searchable' => false, + 'searchable' => true, 'sortable' => true, - 'visible' => false, + 'switchable' => true, 'title' => trans('general.created_at'), - 'formatter' => 'createdAtFormatter', + 'visible' => false, + 'formatter' => 'dateDisplayFormatter', + ], [ + 'field' => 'updated_at', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.updated_at'), + 'visible' => false, + 'formatter' => 'dateDisplayFormatter', ], [ 'field' => 'actions', 'searchable' => false, diff --git a/app/Presenters/ComponentPresenter.php b/app/Presenters/ComponentPresenter.php index d142d7abc2..39a177592d 100644 --- a/app/Presenters/ComponentPresenter.php +++ b/app/Presenters/ComponentPresenter.php @@ -66,8 +66,20 @@ class ComponentPresenter extends Presenter 'title' => trans('general.supplier'), 'visible' => false, 'formatter' => 'suppliersLinkObjFormatter', - ], - [ + ], [ + 'field' => 'model_number', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/models/table.modelnumber'), + ], [ + 'field' => 'manufacturer', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.manufacturer'), + 'visible' => false, + 'formatter' => 'manufacturersLinkObjFormatter', + ], [ 'field' => 'qty', 'searchable' => false, 'sortable' => true, @@ -119,6 +131,27 @@ class ComponentPresenter extends Presenter 'visible' => false, 'title' => trans('general.notes'), 'formatter' => 'notesFormatter', + ],[ + 'field' => 'created_by', + 'searchable' => false, + 'sortable' => true, + 'title' => trans('general.created_by'), + 'visible' => false, + 'formatter' => 'usersLinkObjFormatter', + ],[ + 'field' => 'created_at', + 'searchable' => false, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.created_at'), + 'formatter' => 'dateDisplayFormatter', + ], [ + 'field' => 'updated_at', + 'searchable' => false, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.updated_at'), + 'formatter' => 'dateDisplayFormatter', ], ]; diff --git a/app/Presenters/ConsumablePresenter.php b/app/Presenters/ConsumablePresenter.php index d3e73de1cf..cab8bed8bb 100644 --- a/app/Presenters/ConsumablePresenter.php +++ b/app/Presenters/ConsumablePresenter.php @@ -75,13 +75,13 @@ class ConsumablePresenter extends Presenter ], [ 'field' => 'qty', 'searchable' => false, - 'sortable' => false, + 'sortable' => true, 'title' => trans('admin/components/general.total'), 'visible' => true, ], [ 'field' => 'remaining', 'searchable' => false, - 'sortable' => false, + 'sortable' => true, 'title' => trans('admin/components/general.remaining'), 'visible' => true, ], [ @@ -131,6 +131,27 @@ class ConsumablePresenter extends Presenter 'visible' => false, 'title' => trans('general.notes'), 'formatter' => 'notesFormatter', + ], [ + 'field' => 'created_by', + 'searchable' => false, + 'sortable' => true, + 'title' => trans('general.created_by'), + 'visible' => false, + 'formatter' => 'usersLinkObjFormatter', + ],[ + 'field' => 'created_at', + 'searchable' => false, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.created_at'), + 'formatter' => 'dateDisplayFormatter', + ], [ + 'field' => 'updated_at', + 'searchable' => false, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.updated_at'), + 'formatter' => 'dateDisplayFormatter', ], [ 'field' => 'change', 'searchable' => false, diff --git a/app/Presenters/DepreciationPresenter.php b/app/Presenters/DepreciationPresenter.php index 9df1fe1322..3f240fcc53 100644 --- a/app/Presenters/DepreciationPresenter.php +++ b/app/Presenters/DepreciationPresenter.php @@ -47,6 +47,48 @@ class DepreciationPresenter extends Presenter "visible" => true, ], [ + 'field' => 'assets_count', + 'searchable' => false, + 'sortable' => true, + 'title' => trans('general.assets'), + 'visible' => true, + ], + [ + 'field' => 'models_count', + 'searchable' => false, + 'sortable' => true, + 'title' => trans('general.asset_models'), + 'visible' => true, + ], [ + 'field' => 'licenses_count', + 'searchable' => false, + 'sortable' => true, + 'title' => trans('general.licenses'), + 'visible' => true, + ],[ + 'field' => 'created_by', + 'searchable' => false, + 'sortable' => true, + 'title' => trans('general.created_by'), + 'visible' => false, + 'formatter' => 'usersLinkObjFormatter', + ], [ + 'field' => 'created_at', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.created_at'), + 'visible' => false, + 'formatter' => 'dateDisplayFormatter', + ], [ + 'field' => 'updated_at', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.updated_at'), + 'visible' => false, + 'formatter' => 'dateDisplayFormatter', + ], [ 'field' => 'actions', 'searchable' => false, 'sortable' => false, diff --git a/app/Presenters/DepreciationReportPresenter.php b/app/Presenters/DepreciationReportPresenter.php index 50a8b73b54..1d4c459614 100644 --- a/app/Presenters/DepreciationReportPresenter.php +++ b/app/Presenters/DepreciationReportPresenter.php @@ -140,7 +140,7 @@ class DepreciationReportPresenter extends Presenter ], [ "field" => "book_value", "searchable" => true, - "sortable" => true, + "sortable" => false, "visible" => true, "title" => trans('admin/hardware/table.book_value'), "footerFormatter" => 'sumFormatter', @@ -394,6 +394,6 @@ class DepreciationReportPresenter extends Presenter public function glyph() { - return ''; + return ''; } } diff --git a/app/Presenters/LicensePresenter.php b/app/Presenters/LicensePresenter.php index 1545cabd30..4256c2c686 100644 --- a/app/Presenters/LicensePresenter.php +++ b/app/Presenters/LicensePresenter.php @@ -162,7 +162,7 @@ class LicensePresenter extends Presenter 'field' => 'created_by', 'searchable' => false, 'sortable' => true, - 'title' => trans('general.admin'), + 'title' => trans('general.created_by'), 'visible' => false, 'formatter' => 'usersLinkObjFormatter', ], [ diff --git a/app/Presenters/LocationPresenter.php b/app/Presenters/LocationPresenter.php index 56d710ac96..d6bbe0db11 100644 --- a/app/Presenters/LocationPresenter.php +++ b/app/Presenters/LocationPresenter.php @@ -235,7 +235,7 @@ class LocationPresenter extends Presenter public function glyph() { - return ''; + return ''; } public function fullName() diff --git a/app/Presenters/ManufacturerPresenter.php b/app/Presenters/ManufacturerPresenter.php index 3e36cbcde0..dfefec2998 100644 --- a/app/Presenters/ManufacturerPresenter.php +++ b/app/Presenters/ManufacturerPresenter.php @@ -94,38 +94,52 @@ class ManufacturerPresenter extends Presenter 'searchable' => false, 'sortable' => true, 'switchable' => true, - 'title' => ' ' - .'', + 'title' => trans('general.assets'), 'visible' => true, + 'class' => 'css-barcode', ], [ 'field' => 'licenses_count', 'searchable' => false, 'sortable' => true, 'switchable' => true, - 'title' => ' ' - .'', + 'title' => trans('general.licenses'), 'visible' => true, + 'class' => 'css-license', ], [ 'field' => 'consumables_count', 'searchable' => false, 'sortable' => true, 'switchable' => true, - 'title' => ' ' - .'', + 'title' => trans('general.consumables'), 'visible' => true, + 'class' => 'css-consumable', ], [ 'field' => 'accessories_count', 'searchable' => false, 'sortable' => true, 'switchable' => true, - 'title' => ' ' - .'', + 'title' => trans('general.accessories'), 'visible' => true, - ], - [ + 'class' => 'css-accessory', + ], [ + 'field' => 'components_count', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.components'), + 'visible' => true, + 'class' => 'css-component', + ], [ + 'field' => 'created_by', + 'searchable' => false, + 'sortable' => true, + 'title' => trans('general.created_by'), + 'visible' => false, + 'formatter' => 'usersLinkObjFormatter', + ], [ 'field' => 'created_at', 'searchable' => true, 'sortable' => true, @@ -133,9 +147,15 @@ class ManufacturerPresenter extends Presenter 'title' => trans('general.created_at'), 'visible' => false, 'formatter' => 'dateDisplayFormatter', - ], - - [ + ], [ + 'field' => 'updated_at', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.updated_at'), + 'visible' => false, + 'formatter' => 'dateDisplayFormatter', + ], [ 'field' => 'actions', 'searchable' => false, 'sortable' => false, diff --git a/app/Presenters/PredefinedKitPresenter.php b/app/Presenters/PredefinedKitPresenter.php index b234653adf..7ce7d8c23d 100644 --- a/app/Presenters/PredefinedKitPresenter.php +++ b/app/Presenters/PredefinedKitPresenter.php @@ -27,6 +27,29 @@ class PredefinedKitPresenter extends Presenter 'sortable' => true, 'title' => trans('general.name'), 'formatter' => 'kitsLinkFormatter', + ], [ + 'field' => 'created_by', + 'searchable' => false, + 'sortable' => true, + 'title' => trans('general.created_by'), + 'visible' => false, + 'formatter' => 'usersLinkObjFormatter', + ], [ + 'field' => 'created_at', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.created_at'), + 'visible' => false, + 'formatter' => 'dateDisplayFormatter', + ], [ + 'field' => 'updated_at', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.updated_at'), + 'visible' => false, + 'formatter' => 'dateDisplayFormatter', ], ]; diff --git a/app/Presenters/StatusLabelPresenter.php b/app/Presenters/StatusLabelPresenter.php new file mode 100644 index 0000000000..2e43400041 --- /dev/null +++ b/app/Presenters/StatusLabelPresenter.php @@ -0,0 +1,115 @@ + 'id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, + ], [ + 'field' => 'name', + 'searchable' => true, + 'sortable' => true, + 'switchable' => false, + 'title' => trans('general.name'), + 'visible' => true, + 'formatter' => 'statuslabelsAssetLinkFormatter', + ],[ + 'field' => 'type', + 'searchable' => false, + 'sortable' => false, + 'switchable' => false, + 'title' => trans('admin/statuslabels/table.status_type'), + 'visible' => true, + 'formatter' => 'statusLabelTypeFormatter', + ], [ + 'field' => 'assets_count', + 'searchable' => false, + 'sortable' => true, + 'switchable' => false, + 'title' => trans('general.assets'), + 'visible' => true, + ], [ + 'field' => 'color', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/statuslabels/table.color'), + 'visible' => true, + 'formatter' => 'colorSqFormatter', + ], [ + 'field' => 'show_in_nav', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/statuslabels/table.show_in_nav'), + 'visible' => true, + 'formatter' => 'trueFalseFormatter', + ], [ + 'field' => 'default_label', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/statuslabels/table.default_label'), + 'visible' => true, + 'formatter' => 'trueFalseFormatter', + ],[ + 'field' => 'notes', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.notes'), + 'visible' => false, + ], [ + 'field' => 'created_by', + 'searchable' => false, + 'sortable' => true, + 'title' => trans('general.created_by'), + 'visible' => false, + 'formatter' => 'usersLinkObjFormatter', + ], [ + 'field' => 'created_at', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.created_at'), + 'visible' => false, + 'formatter' => 'dateDisplayFormatter', + ], [ + 'field' => 'updated_at', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.updated_at'), + 'visible' => false, + 'formatter' => 'dateDisplayFormatter', + ], [ + 'field' => 'actions', + 'searchable' => false, + 'sortable' => false, + 'switchable' => false, + 'title' => trans('table.actions'), + 'formatter' => 'statuslabelsActionsFormatter', + ], + ]; + + return json_encode($layout); + } + + +} diff --git a/app/Presenters/UserPresenter.php b/app/Presenters/UserPresenter.php index 7054676a93..7ee05da0cb 100644 --- a/app/Presenters/UserPresenter.php +++ b/app/Presenters/UserPresenter.php @@ -188,6 +188,14 @@ class UserPresenter extends Presenter 'title' => trans('general.employee_number'), 'visible' => false, ], + [ + 'field' => 'locale', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.language'), + 'visible' => false, + ], [ 'field' => 'department', 'searchable' => true, @@ -353,6 +361,14 @@ class UserPresenter extends Presenter 'title' => trans('general.created_at'), 'visible' => false, 'formatter' => 'dateDisplayFormatter', + ], [ + 'field' => 'updated_at', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.updated_at'), + 'visible' => false, + 'formatter' => 'dateDisplayFormatter', ], [ 'field' => 'start_date', @@ -492,6 +508,6 @@ class UserPresenter extends Presenter public function glyph() { - return ''; + return ''; } } diff --git a/app/Providers/ValidationServiceProvider.php b/app/Providers/ValidationServiceProvider.php index 1f3abca8a6..76ba1b629a 100644 --- a/app/Providers/ValidationServiceProvider.php +++ b/app/Providers/ValidationServiceProvider.php @@ -31,6 +31,7 @@ class ValidationServiceProvider extends ServiceProvider Validator::extend('email_array', function ($attribute, $value, $parameters, $validator) { $value = str_replace(' ', '', $value); $array = explode(',', $value); + $email_to_validate = []; foreach ($array as $email) { //loop over values $email_to_validate['alert_email'][] = $email; @@ -38,7 +39,7 @@ class ValidationServiceProvider extends ServiceProvider $rules = ['alert_email.*'=>'email']; $messages = [ - 'alert_email.*'=>trans('validation.email_array'), + 'alert_email.*' => trans('validation.custom.email_array'), ]; $validator = Validator::make($email_to_validate, $rules, $messages); diff --git a/app/Rules/AssetCannotBeCheckedOutToNondeployableStatus.php b/app/Rules/AssetCannotBeCheckedOutToNondeployableStatus.php new file mode 100644 index 0000000000..c2c451b82b --- /dev/null +++ b/app/Rules/AssetCannotBeCheckedOutToNondeployableStatus.php @@ -0,0 +1,51 @@ + + */ + protected $data = []; + + + /** + * Set the data under validation. + * + * @param array $data + */ + public function setData(array $data): static + { + $this->data = $data; + return $this; + } + + /** + * Run the validation rule. + * + * @param \Closure(string): \Illuminate\Translation\PotentiallyTranslatedString $fail + */ + public function validate(string $attribute, mixed $value, Closure $fail): void + { + // Check to see if any of the assign-ish fields are set + if ((isset($this->data['assigned_to'])) || (isset($this->data['assigned_user'])) || (isset($this->data['assigned_location'])) || (isset($this->data['assigned_asset'])) || (isset($this->data['assigned_type']))) { + + if (($value) && ($label = Statuslabel::find($value)) && ($label->getStatuslabelType()!='deployable')) { + $fail(trans('admin/hardware/form.asset_not_deployable')); + } + + } + + + } +} diff --git a/app/Rules/UserCannotSwitchCompaniesIfItemsAssigned.php b/app/Rules/UserCannotSwitchCompaniesIfItemsAssigned.php new file mode 100644 index 0000000000..a433ee9a28 --- /dev/null +++ b/app/Rules/UserCannotSwitchCompaniesIfItemsAssigned.php @@ -0,0 +1,29 @@ +route('user')->id); + + if (($value) && ($user->allAssignedCount() > 0) && (Setting::getSettings()->full_multiple_companies_support=='1')) { + + // Check for assets with a different company_id than the selected company_id + $user_assets = $user->assets()->where('assets.company_id', '!=', $value)->count(); + if ($user_assets > 0) { + $fail(trans('admin/users/message.error.multi_company_items_assigned')); + } + } + } +} diff --git a/app/Services/PredefinedKitCheckoutService.php b/app/Services/PredefinedKitCheckoutService.php index d683875395..2cf4593687 100644 --- a/app/Services/PredefinedKitCheckoutService.php +++ b/app/Services/PredefinedKitCheckoutService.php @@ -157,7 +157,7 @@ class PredefinedKitCheckoutService } // licenses foreach ($license_seats_to_add as $licenseSeat) { - $licenseSeat->user_id = $admin->id; + $licenseSeat->created_by = $admin->id; $licenseSeat->assigned_to = $user->id; if ($licenseSeat->save()) { event(new CheckoutableCheckedOut($licenseSeat, $user, $admin, $note)); diff --git a/composer.json b/composer.json index a72d80839a..865878280c 100644 --- a/composer.json +++ b/composer.json @@ -38,7 +38,7 @@ "intervention/image": "^2.5", "javiereguiluz/easyslugger": "^1.0", "laravel-notification-channels/google-chat": "^3.0", - "laravel-notification-channels/microsoft-teams": "^1.1", + "laravel-notification-channels/microsoft-teams": "^1.2", "laravel/framework": "^10.0", "laravel/helpers": "^1.4", "laravel/passport": "^11.0", @@ -55,6 +55,7 @@ "nunomaduro/collision": "^7.0", "okvpn/clock-lts": "^1.0", "onelogin/php-saml": "^3.4", + "osa-eg/laravel-teams-notification": "^2.1", "paragonie/constant_time_encoding": "^2.3", "paragonie/sodium_compat": "^1.19", "phpdocumentor/reflection-docblock": "^5.1", @@ -74,7 +75,6 @@ "ext-exif": "*" }, "require-dev": { - "brianium/paratest": "^7.0", "fakerphp/faker": "^1.16", "larastan/larastan": "^2.9", "mockery/mockery": "^1.4", @@ -120,7 +120,9 @@ ], "post-create-project-cmd": [ "php artisan key:generate" - ] + ], + "coverage:herd:clover": "herd coverage vendor/bin/phpunit --coverage-clover tests/coverage/clover.xml", + "coverage:herd:html": "herd coverage vendor/bin/phpunit --coverage-html tests/coverage/html" }, "config": { "preferred-install": "dist", diff --git a/composer.lock b/composer.lock index 715070df0f..88bab2fa43 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3819ab4ef72eb77fabe494c0e746b83b", + "content-hash": "0750e3a427347b2a56a05a8b9b533d48", "packages": [ { "name": "alek13/slack", @@ -137,16 +137,16 @@ }, { "name": "aws/aws-crt-php", - "version": "v1.2.5", + "version": "v1.2.6", "source": { "type": "git", "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "0ea1f04ec5aa9f049f97e012d1ed63b76834a31b" + "reference": "a63485b65b6b3367039306496d49737cf1995408" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/0ea1f04ec5aa9f049f97e012d1ed63b76834a31b", - "reference": "0ea1f04ec5aa9f049f97e012d1ed63b76834a31b", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/a63485b65b6b3367039306496d49737cf1995408", + "reference": "a63485b65b6b3367039306496d49737cf1995408", "shasum": "" }, "require": { @@ -185,22 +185,22 @@ ], "support": { "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.5" + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.6" }, - "time": "2024-04-19T21:30:56+00:00" + "time": "2024-06-13T17:21:28+00:00" }, { "name": "aws/aws-sdk-php", - "version": "3.314.6", + "version": "3.323.4", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "d04da330b0201edab71edd33a03b8d5ad6e4a313" + "reference": "e66ee025b1d169fad3c784934f56648d3eec11ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/d04da330b0201edab71edd33a03b8d5ad6e4a313", - "reference": "d04da330b0201edab71edd33a03b8d5ad6e4a313", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/e66ee025b1d169fad3c784934f56648d3eec11ae", + "reference": "e66ee025b1d169fad3c784934f56648d3eec11ae", "shasum": "" }, "require": { @@ -253,7 +253,10 @@ ], "psr-4": { "Aws\\": "src/" - } + }, + "exclude-from-classmap": [ + "src/data/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -280,9 +283,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.314.6" + "source": "https://github.com/aws/aws-sdk-php/tree/3.323.4" }, - "time": "2024-06-20T18:09:51+00:00" + "time": "2024-10-09T18:10:22+00:00" }, { "name": "bacon/bacon-qr-code", @@ -340,23 +343,23 @@ }, { "name": "barryvdh/laravel-debugbar", - "version": "v3.13.5", + "version": "v3.14.3", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "92d86be45ee54edff735e46856f64f14b6a8bb07" + "reference": "c0bee7c08ae2429e4a9ed2bc75679b012db6e3bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/92d86be45ee54edff735e46856f64f14b6a8bb07", - "reference": "92d86be45ee54edff735e46856f64f14b6a8bb07", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/c0bee7c08ae2429e4a9ed2bc75679b012db6e3bd", + "reference": "c0bee7c08ae2429e4a9ed2bc75679b012db6e3bd", "shasum": "" }, "require": { "illuminate/routing": "^9|^10|^11", "illuminate/session": "^9|^10|^11", "illuminate/support": "^9|^10|^11", - "maximebf/debugbar": "~1.22.0", + "maximebf/debugbar": "~1.23.0", "php": "^8.0", "symfony/finder": "^6|^7" }, @@ -369,7 +372,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.13-dev" + "dev-master": "3.14-dev" }, "laravel": { "providers": [ @@ -408,7 +411,7 @@ ], "support": { "issues": "https://github.com/barryvdh/laravel-debugbar/issues", - "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.13.5" + "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.14.3" }, "funding": [ { @@ -420,7 +423,7 @@ "type": "github" } ], - "time": "2024-04-12T11:20:37+00:00" + "time": "2024-10-02T09:17:49+00:00" }, { "name": "barryvdh/laravel-dompdf", @@ -630,23 +633,23 @@ }, { "name": "dasprid/enum", - "version": "1.0.5", + "version": "1.0.6", "source": { "type": "git", "url": "https://github.com/DASPRiD/Enum.git", - "reference": "6faf451159fb8ba4126b925ed2d78acfce0dc016" + "reference": "8dfd07c6d2cf31c8da90c53b83c026c7696dda90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/6faf451159fb8ba4126b925ed2d78acfce0dc016", - "reference": "6faf451159fb8ba4126b925ed2d78acfce0dc016", + "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/8dfd07c6d2cf31c8da90c53b83c026c7696dda90", + "reference": "8dfd07c6d2cf31c8da90c53b83c026c7696dda90", "shasum": "" }, "require": { "php": ">=7.1 <9.0" }, "require-dev": { - "phpunit/phpunit": "^7 | ^8 | ^9", + "phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11", "squizlabs/php_codesniffer": "*" }, "type": "library", @@ -674,9 +677,9 @@ ], "support": { "issues": "https://github.com/DASPRiD/Enum/issues", - "source": "https://github.com/DASPRiD/Enum/tree/1.0.5" + "source": "https://github.com/DASPRiD/Enum/tree/1.0.6" }, - "time": "2023-08-25T16:18:39+00:00" + "time": "2024-08-09T14:30:48+00:00" }, { "name": "defuse/php-encryption", @@ -747,16 +750,16 @@ }, { "name": "dflydev/dot-access-data", - "version": "v3.0.2", + "version": "v3.0.3", "source": { "type": "git", "url": "https://github.com/dflydev/dflydev-dot-access-data.git", - "reference": "f41715465d65213d644d3141a6a93081be5d3549" + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/f41715465d65213d644d3141a6a93081be5d3549", - "reference": "f41715465d65213d644d3141a6a93081be5d3549", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", "shasum": "" }, "require": { @@ -816,9 +819,9 @@ ], "support": { "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", - "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.2" + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" }, - "time": "2022-10-27T11:44:00+00:00" + "time": "2024-07-08T12:26:09+00:00" }, { "name": "doctrine/cache", @@ -921,16 +924,16 @@ }, { "name": "doctrine/dbal", - "version": "3.8.6", + "version": "3.9.1", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "b7411825cf7efb7e51f9791dea19d86e43b399a1" + "reference": "d7dc08f98cba352b2bab5d32c5e58f7e745c11a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/b7411825cf7efb7e51f9791dea19d86e43b399a1", - "reference": "b7411825cf7efb7e51f9791dea19d86e43b399a1", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/d7dc08f98cba352b2bab5d32c5e58f7e745c11a7", + "reference": "d7dc08f98cba352b2bab5d32c5e58f7e745c11a7", "shasum": "" }, "require": { @@ -946,12 +949,12 @@ "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", "jetbrains/phpstorm-stubs": "2023.1", - "phpstan/phpstan": "1.11.5", + "phpstan/phpstan": "1.12.0", "phpstan/phpstan-strict-rules": "^1.6", - "phpunit/phpunit": "9.6.19", + "phpunit/phpunit": "9.6.20", "psalm/plugin-phpunit": "0.18.4", "slevomat/coding-standard": "8.13.1", - "squizlabs/php_codesniffer": "3.10.1", + "squizlabs/php_codesniffer": "3.10.2", "symfony/cache": "^5.4|^6.0|^7.0", "symfony/console": "^4.4|^5.4|^6.0|^7.0", "vimeo/psalm": "4.30.0" @@ -1014,7 +1017,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.8.6" + "source": "https://github.com/doctrine/dbal/tree/3.9.1" }, "funding": [ { @@ -1030,7 +1033,7 @@ "type": "tidelift" } ], - "time": "2024-06-19T10:38:17+00:00" + "time": "2024-09-01T13:49:23+00:00" }, { "name": "doctrine/deprecations", @@ -1472,16 +1475,16 @@ }, { "name": "dragonmantank/cron-expression", - "version": "v3.3.3", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a" + "reference": "8c784d071debd117328803d86b2097615b457500" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", - "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/8c784d071debd117328803d86b2097615b457500", + "reference": "8c784d071debd117328803d86b2097615b457500", "shasum": "" }, "require": { @@ -1494,10 +1497,14 @@ "require-dev": { "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^1.0", - "phpstan/phpstan-webmozart-assert": "^1.0", "phpunit/phpunit": "^7.0|^8.0|^9.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, "autoload": { "psr-4": { "Cron\\": "src/Cron/" @@ -1521,7 +1528,7 @@ ], "support": { "issues": "https://github.com/dragonmantank/cron-expression/issues", - "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.3" + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.4.0" }, "funding": [ { @@ -1529,7 +1536,7 @@ "type": "github" } ], - "time": "2023-08-10T19:36:49+00:00" + "time": "2024-10-09T13:47:03+00:00" }, { "name": "eduardokum/laravel-mail-auto-embed", @@ -1765,26 +1772,26 @@ }, { "name": "filp/whoops", - "version": "2.15.4", + "version": "2.16.0", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546" + "reference": "befcdc0e5dce67252aa6322d82424be928214fa2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546", - "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546", + "url": "https://api.github.com/repos/filp/whoops/zipball/befcdc0e5dce67252aa6322d82424be928214fa2", + "reference": "befcdc0e5dce67252aa6322d82424be928214fa2", "shasum": "" }, "require": { - "php": "^5.5.9 || ^7.0 || ^8.0", + "php": "^7.1 || ^8.0", "psr/log": "^1.0.1 || ^2.0 || ^3.0" }, "require-dev": { - "mockery/mockery": "^0.9 || ^1.0", - "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", - "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^4.0 || ^5.0" }, "suggest": { "symfony/var-dumper": "Pretty print complex values better with var-dumper available", @@ -1824,7 +1831,7 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.15.4" + "source": "https://github.com/filp/whoops/tree/2.16.0" }, "funding": [ { @@ -1832,7 +1839,7 @@ "type": "github" } ], - "time": "2023-11-03T12:00:00+00:00" + "time": "2024-09-25T12:00:00+00:00" }, { "name": "firebase/php-jwt", @@ -1970,24 +1977,24 @@ }, { "name": "graham-campbell/result-type", - "version": "v1.1.2", + "version": "v1.1.3", "source": { "type": "git", "url": "https://github.com/GrahamCampbell/Result-Type.git", - "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862" + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/fbd48bce38f73f8a4ec8583362e732e4095e5862", - "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.2" + "phpoption/phpoption": "^1.9.3" }, "require-dev": { - "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" }, "type": "library", "autoload": { @@ -2016,7 +2023,7 @@ ], "support": { "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.2" + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" }, "funding": [ { @@ -2028,26 +2035,26 @@ "type": "tidelift" } ], - "time": "2023-11-12T22:16:48+00:00" + "time": "2024-07-20T21:45:45+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.8.1", + "version": "7.9.2", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" + "reference": "d281ed313b989f213357e3be1a179f02196ac99b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", - "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0.1", - "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", + "guzzlehttp/promises": "^1.5.3 || ^2.0.3", + "guzzlehttp/psr7": "^2.7.0", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -2058,9 +2065,9 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", - "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "guzzle/client-integration-tests": "3.0.2", "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -2138,7 +2145,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.8.1" + "source": "https://github.com/guzzle/guzzle/tree/7.9.2" }, "funding": [ { @@ -2154,20 +2161,20 @@ "type": "tidelift" } ], - "time": "2023-12-03T20:35:24+00:00" + "time": "2024-07-24T11:22:20+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.0.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" + "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", - "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", + "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", "shasum": "" }, "require": { @@ -2175,7 +2182,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.36 || ^9.6.15" + "phpunit/phpunit": "^8.5.39 || ^9.6.20" }, "type": "library", "extra": { @@ -2221,7 +2228,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.2" + "source": "https://github.com/guzzle/promises/tree/2.0.3" }, "funding": [ { @@ -2237,20 +2244,20 @@ "type": "tidelift" } ], - "time": "2023-12-03T20:19:20+00:00" + "time": "2024-07-18T10:29:17+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.6.2", + "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", - "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", "shasum": "" }, "require": { @@ -2265,8 +2272,8 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.36 || ^9.6.15" + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -2337,7 +2344,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.6.2" + "source": "https://github.com/guzzle/psr7/tree/2.7.0" }, "funding": [ { @@ -2353,7 +2360,7 @@ "type": "tidelift" } ], - "time": "2023-12-03T20:05:35+00:00" + "time": "2024-07-18T11:15:46+00:00" }, { "name": "guzzlehttp/uri-template", @@ -2675,16 +2682,16 @@ }, { "name": "laravel/framework", - "version": "v10.48.14", + "version": "v10.48.22", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "27cb4736bb7e60a5311ec73160068dfbcf98336b" + "reference": "c4ea52bb044faef4a103d7dd81746c01b2ec860e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/27cb4736bb7e60a5311ec73160068dfbcf98336b", - "reference": "27cb4736bb7e60a5311ec73160068dfbcf98336b", + "url": "https://api.github.com/repos/laravel/framework/zipball/c4ea52bb044faef4a103d7dd81746c01b2ec860e", + "reference": "c4ea52bb044faef4a103d7dd81746c01b2ec860e", "shasum": "" }, "require": { @@ -2878,7 +2885,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-06-21T10:06:42+00:00" + "time": "2024-09-12T15:00:09+00:00" }, { "name": "laravel/helpers", @@ -3017,16 +3024,16 @@ }, { "name": "laravel/prompts", - "version": "v0.1.24", + "version": "v0.1.25", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "409b0b4305273472f3754826e68f4edbd0150149" + "reference": "7b4029a84c37cb2725fc7f011586e2997040bc95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/409b0b4305273472f3754826e68f4edbd0150149", - "reference": "409b0b4305273472f3754826e68f4edbd0150149", + "url": "https://api.github.com/repos/laravel/prompts/zipball/7b4029a84c37cb2725fc7f011586e2997040bc95", + "reference": "7b4029a84c37cb2725fc7f011586e2997040bc95", "shasum": "" }, "require": { @@ -3069,32 +3076,33 @@ "description": "Add beautiful and user-friendly forms to your command-line applications.", "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.1.24" + "source": "https://github.com/laravel/prompts/tree/v0.1.25" }, - "time": "2024-06-17T13:58:22+00:00" + "time": "2024-08-12T22:06:33+00:00" }, { "name": "laravel/serializable-closure", - "version": "v1.3.3", + "version": "v1.3.5", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "3dbf8a8e914634c48d389c1234552666b3d43754" + "reference": "1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/3dbf8a8e914634c48d389c1234552666b3d43754", - "reference": "3dbf8a8e914634c48d389c1234552666b3d43754", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c", + "reference": "1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c", "shasum": "" }, "require": { "php": "^7.3|^8.0" }, "require-dev": { - "nesbot/carbon": "^2.61", + "illuminate/support": "^8.0|^9.0|^10.0|^11.0", + "nesbot/carbon": "^2.61|^3.0", "pestphp/pest": "^1.21.3", "phpstan/phpstan": "^1.8.2", - "symfony/var-dumper": "^5.4.11" + "symfony/var-dumper": "^5.4.11|^6.2.0|^7.0.0" }, "type": "library", "extra": { @@ -3131,7 +3139,7 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2023-11-08T14:08:06+00:00" + "time": "2024-09-23T13:33:08+00:00" }, { "name": "laravel/slack-notification-channel", @@ -3196,16 +3204,16 @@ }, { "name": "laravel/socialite", - "version": "v5.15.0", + "version": "v5.16.0", "source": { "type": "git", "url": "https://github.com/laravel/socialite.git", - "reference": "c8234bfb286a8210df8d62f94562c71bfda4a446" + "reference": "40a2dc98c53d9dc6d55eadb0d490d3d72b73f1bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/c8234bfb286a8210df8d62f94562c71bfda4a446", - "reference": "c8234bfb286a8210df8d62f94562c71bfda4a446", + "url": "https://api.github.com/repos/laravel/socialite/zipball/40a2dc98c53d9dc6d55eadb0d490d3d72b73f1bf", + "reference": "40a2dc98c53d9dc6d55eadb0d490d3d72b73f1bf", "shasum": "" }, "require": { @@ -3264,20 +3272,20 @@ "issues": "https://github.com/laravel/socialite/issues", "source": "https://github.com/laravel/socialite" }, - "time": "2024-06-11T13:33:20+00:00" + "time": "2024-09-03T09:46:57+00:00" }, { "name": "laravel/tinker", - "version": "v2.9.0", + "version": "v2.10.0", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe" + "reference": "ba4d51eb56de7711b3a37d63aa0643e99a339ae5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/502e0fe3f0415d06d5db1f83a472f0f3b754bafe", - "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe", + "url": "https://api.github.com/repos/laravel/tinker/zipball/ba4d51eb56de7711b3a37d63aa0643e99a339ae5", + "reference": "ba4d51eb56de7711b3a37d63aa0643e99a339ae5", "shasum": "" }, "require": { @@ -3328,9 +3336,9 @@ ], "support": { "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.9.0" + "source": "https://github.com/laravel/tinker/tree/v2.10.0" }, - "time": "2024-01-04T16:10:04+00:00" + "time": "2024-09-23T13:32:56+00:00" }, { "name": "laravel/ui", @@ -3543,16 +3551,16 @@ }, { "name": "league/commonmark", - "version": "2.4.2", + "version": "2.5.3", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "91c24291965bd6d7c46c46a12ba7492f83b1cadf" + "reference": "b650144166dfa7703e62a22e493b853b58d874b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/91c24291965bd6d7c46c46a12ba7492f83b1cadf", - "reference": "91c24291965bd6d7c46c46a12ba7492f83b1cadf", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/b650144166dfa7703e62a22e493b853b58d874b0", + "reference": "b650144166dfa7703e62a22e493b853b58d874b0", "shasum": "" }, "require": { @@ -3565,8 +3573,8 @@ }, "require-dev": { "cebe/markdown": "^1.0", - "commonmark/cmark": "0.30.3", - "commonmark/commonmark.js": "0.30.0", + "commonmark/cmark": "0.31.1", + "commonmark/commonmark.js": "0.31.1", "composer/package-versions-deprecated": "^1.8", "embed/embed": "^4.4", "erusev/parsedown": "^1.0", @@ -3588,7 +3596,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "2.6-dev" } }, "autoload": { @@ -3645,7 +3653,7 @@ "type": "tidelift" } ], - "time": "2024-02-02T11:59:32+00:00" + "time": "2024-08-16T11:46:16+00:00" }, { "name": "league/config", @@ -3731,16 +3739,16 @@ }, { "name": "league/csv", - "version": "9.16.0", + "version": "9.17.0", "source": { "type": "git", "url": "https://github.com/thephpleague/csv.git", - "reference": "998280c6c34bd67d8125fdc8b45bae28d761b440" + "reference": "8cab815fb11ec93aa2f7b8a57b3daa1f1a364011" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/csv/zipball/998280c6c34bd67d8125fdc8b45bae28d761b440", - "reference": "998280c6c34bd67d8125fdc8b45bae28d761b440", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/8cab815fb11ec93aa2f7b8a57b3daa1f1a364011", + "reference": "8cab815fb11ec93aa2f7b8a57b3daa1f1a364011", "shasum": "" }, "require": { @@ -3748,17 +3756,16 @@ "php": "^8.1.2" }, "require-dev": { - "doctrine/collections": "^2.2.2", "ext-dom": "*", "ext-xdebug": "*", - "friendsofphp/php-cs-fixer": "^3.57.1", - "phpbench/phpbench": "^1.2.15", - "phpstan/phpstan": "^1.11.1", - "phpstan/phpstan-deprecation-rules": "^1.2.0", + "friendsofphp/php-cs-fixer": "^3.64.0", + "phpbench/phpbench": "^1.3.1", + "phpstan/phpstan": "^1.12.5", + "phpstan/phpstan-deprecation-rules": "^1.2.1", "phpstan/phpstan-phpunit": "^1.4.0", - "phpstan/phpstan-strict-rules": "^1.6.0", - "phpunit/phpunit": "^10.5.16 || ^11.1.3", - "symfony/var-dumper": "^6.4.6 || ^7.0.7" + "phpstan/phpstan-strict-rules": "^1.6.1", + "phpunit/phpunit": "^10.5.16 || ^11.4.0", + "symfony/var-dumper": "^6.4.8 || ^7.1.5" }, "suggest": { "ext-dom": "Required to use the XMLConverter and the HTMLConverter classes", @@ -3776,7 +3783,7 @@ "src/functions_include.php" ], "psr-4": { - "League\\Csv\\": "src" + "League\\Csv\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3815,7 +3822,7 @@ "type": "github" } ], - "time": "2024-05-24T11:04:54+00:00" + "time": "2024-10-10T10:30:28+00:00" }, { "name": "league/event", @@ -3873,16 +3880,16 @@ }, { "name": "league/flysystem", - "version": "3.28.0", + "version": "3.29.1", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c" + "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c", - "reference": "e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/edc1bb7c86fab0776c3287dbd19b5fa278347319", + "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319", "shasum": "" }, "require": { @@ -3950,22 +3957,22 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.28.0" + "source": "https://github.com/thephpleague/flysystem/tree/3.29.1" }, - "time": "2024-05-22T10:09:12+00:00" + "time": "2024-10-08T08:58:34+00:00" }, { "name": "league/flysystem-aws-s3-v3", - "version": "3.28.0", + "version": "3.29.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git", - "reference": "22071ef1604bc776f5ff2468ac27a752514665c8" + "reference": "c6ff6d4606e48249b63f269eba7fabdb584e76a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/22071ef1604bc776f5ff2468ac27a752514665c8", - "reference": "22071ef1604bc776f5ff2468ac27a752514665c8", + "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/c6ff6d4606e48249b63f269eba7fabdb584e76a9", + "reference": "c6ff6d4606e48249b63f269eba7fabdb584e76a9", "shasum": "" }, "require": { @@ -4005,22 +4012,22 @@ "storage" ], "support": { - "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.28.0" + "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.29.0" }, - "time": "2024-05-06T20:05:52+00:00" + "time": "2024-08-17T13:10:48+00:00" }, { "name": "league/flysystem-local", - "version": "3.28.0", + "version": "3.29.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "13f22ea8be526ea58c2ddff9e158ef7c296e4f40" + "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/13f22ea8be526ea58c2ddff9e158ef7c296e4f40", - "reference": "13f22ea8be526ea58c2ddff9e158ef7c296e4f40", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/e0e8d52ce4b2ed154148453d321e97c8e931bd27", + "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27", "shasum": "" }, "require": { @@ -4054,22 +4061,22 @@ "local" ], "support": { - "source": "https://github.com/thephpleague/flysystem-local/tree/3.28.0" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.29.0" }, - "time": "2024-05-06T20:05:52+00:00" + "time": "2024-08-09T21:24:39+00:00" }, { "name": "league/mime-type-detection", - "version": "1.15.0", + "version": "1.16.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301" + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", - "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", "shasum": "" }, "require": { @@ -4100,7 +4107,7 @@ "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.15.0" + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" }, "funding": [ { @@ -4112,7 +4119,7 @@ "type": "tidelift" } ], - "time": "2024-01-28T23:22:08+00:00" + "time": "2024-09-21T08:32:55+00:00" }, { "name": "league/oauth1-client", @@ -4454,16 +4461,16 @@ }, { "name": "livewire/livewire", - "version": "v3.5.1", + "version": "v3.5.12", "source": { "type": "git", "url": "https://github.com/livewire/livewire.git", - "reference": "da044261bb5c5449397f18fda3409f14acf47c0a" + "reference": "3c8d1f9d7d9098aaea663093ae168f2d5d2ae73d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/livewire/livewire/zipball/da044261bb5c5449397f18fda3409f14acf47c0a", - "reference": "da044261bb5c5449397f18fda3409f14acf47c0a", + "url": "https://api.github.com/repos/livewire/livewire/zipball/3c8d1f9d7d9098aaea663093ae168f2d5d2ae73d", + "reference": "3c8d1f9d7d9098aaea663093ae168f2d5d2ae73d", "shasum": "" }, "require": { @@ -4471,6 +4478,7 @@ "illuminate/routing": "^10.0|^11.0", "illuminate/support": "^10.0|^11.0", "illuminate/validation": "^10.0|^11.0", + "laravel/prompts": "^0.1.24|^0.2|^0.3", "league/mime-type-detection": "^1.9", "php": "^8.1", "symfony/console": "^6.0|^7.0", @@ -4479,7 +4487,6 @@ "require-dev": { "calebporzio/sushi": "^2.1", "laravel/framework": "^10.15.0|^11.0", - "laravel/prompts": "^0.1.6", "mockery/mockery": "^1.3.1", "orchestra/testbench": "^8.21.0|^9.0", "orchestra/testbench-dusk": "^8.24|^9.1", @@ -4518,7 +4525,7 @@ "description": "A front-end framework for Laravel.", "support": { "issues": "https://github.com/livewire/livewire/issues", - "source": "https://github.com/livewire/livewire/tree/v3.5.1" + "source": "https://github.com/livewire/livewire/tree/v3.5.12" }, "funding": [ { @@ -4526,7 +4533,7 @@ "type": "github" } ], - "time": "2024-06-18T11:10:42+00:00" + "time": "2024-10-15T19:35:06+00:00" }, { "name": "masterminds/html5", @@ -4597,16 +4604,16 @@ }, { "name": "maximebf/debugbar", - "version": "v1.22.3", + "version": "v1.23.2", "source": { "type": "git", "url": "https://github.com/maximebf/php-debugbar.git", - "reference": "7aa9a27a0b1158ed5ad4e7175e8d3aee9a818b96" + "reference": "689720d724c771ac4add859056744b7b3f2406da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/7aa9a27a0b1158ed5ad4e7175e8d3aee9a818b96", - "reference": "7aa9a27a0b1158ed5ad4e7175e8d3aee9a818b96", + "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/689720d724c771ac4add859056744b7b3f2406da", + "reference": "689720d724c771ac4add859056744b7b3f2406da", "shasum": "" }, "require": { @@ -4628,7 +4635,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.22-dev" + "dev-master": "1.23-dev" } }, "autoload": { @@ -4659,22 +4666,22 @@ ], "support": { "issues": "https://github.com/maximebf/php-debugbar/issues", - "source": "https://github.com/maximebf/php-debugbar/tree/v1.22.3" + "source": "https://github.com/maximebf/php-debugbar/tree/v1.23.2" }, - "time": "2024-04-03T19:39:26+00:00" + "time": "2024-09-16T11:23:09+00:00" }, { "name": "monolog/monolog", - "version": "3.6.0", + "version": "3.7.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654" + "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", - "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f4393b648b78a5408747de94fca38beb5f7e9ef8", + "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8", "shasum": "" }, "require": { @@ -4750,7 +4757,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.6.0" + "source": "https://github.com/Seldaek/monolog/tree/3.7.0" }, "funding": [ { @@ -4762,20 +4769,20 @@ "type": "tidelift" } ], - "time": "2024-04-12T21:02:21+00:00" + "time": "2024-06-28T09:40:51+00:00" }, { "name": "mtdowling/jmespath.php", - "version": "2.7.0", + "version": "2.8.0", "source": { "type": "git", "url": "https://github.com/jmespath/jmespath.php.git", - "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b" + "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/bbb69a935c2cbb0c03d7f481a238027430f6440b", - "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/a2a865e05d5f420b50cc2f85bb78d565db12a6bc", + "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc", "shasum": "" }, "require": { @@ -4792,7 +4799,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.7-dev" + "dev-master": "2.8-dev" } }, "autoload": { @@ -4826,9 +4833,9 @@ ], "support": { "issues": "https://github.com/jmespath/jmespath.php/issues", - "source": "https://github.com/jmespath/jmespath.php/tree/2.7.0" + "source": "https://github.com/jmespath/jmespath.php/tree/2.8.0" }, - "time": "2023-08-25T10:54:48+00:00" + "time": "2024-09-04T18:46:31+00:00" }, { "name": "neitanod/forceutf8", @@ -4980,24 +4987,24 @@ }, { "name": "nette/schema", - "version": "v1.3.0", + "version": "v1.3.2", "source": { "type": "git", "url": "https://github.com/nette/schema.git", - "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188" + "reference": "da801d52f0354f70a638673c4a0f04e16529431d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", - "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", + "url": "https://api.github.com/repos/nette/schema/zipball/da801d52f0354f70a638673c4a0f04e16529431d", + "reference": "da801d52f0354f70a638673c4a0f04e16529431d", "shasum": "" }, "require": { "nette/utils": "^4.0", - "php": "8.1 - 8.3" + "php": "8.1 - 8.4" }, "require-dev": { - "nette/tester": "^2.4", + "nette/tester": "^2.5.2", "phpstan/phpstan-nette": "^1.0", "tracy/tracy": "^2.8" }, @@ -5036,26 +5043,26 @@ ], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.3.0" + "source": "https://github.com/nette/schema/tree/v1.3.2" }, - "time": "2023-12-11T11:54:22+00:00" + "time": "2024-10-06T23:10:23+00:00" }, { "name": "nette/utils", - "version": "v4.0.4", + "version": "v4.0.5", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218" + "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/d3ad0aa3b9f934602cb3e3902ebccf10be34d218", - "reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218", + "url": "https://api.github.com/repos/nette/utils/zipball/736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", + "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", "shasum": "" }, "require": { - "php": ">=8.0 <8.4" + "php": "8.0 - 8.4" }, "conflict": { "nette/finder": "<3", @@ -5122,22 +5129,22 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.0.4" + "source": "https://github.com/nette/utils/tree/v4.0.5" }, - "time": "2024-01-17T16:50:36+00:00" + "time": "2024-08-07T15:39:19+00:00" }, { "name": "nikic/php-parser", - "version": "v4.19.1", + "version": "v4.19.4", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b" + "reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4e1b88d21c69391150ace211e9eaf05810858d0b", - "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/715f4d25e225bc47b293a8b997fe6ce99bf987d2", + "reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2", "shasum": "" }, "require": { @@ -5146,7 +5153,7 @@ }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "bin": [ "bin/php-parse" @@ -5178,9 +5185,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.4" }, - "time": "2024-03-17T08:10:35+00:00" + "time": "2024-09-29T15:01:53+00:00" }, { "name": "nunomaduro/collision", @@ -5366,16 +5373,16 @@ }, { "name": "nyholm/psr7", - "version": "1.8.1", + "version": "1.8.2", "source": { "type": "git", "url": "https://github.com/Nyholm/psr7.git", - "reference": "aa5fc277a4f5508013d571341ade0c3886d4d00e" + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Nyholm/psr7/zipball/aa5fc277a4f5508013d571341ade0c3886d4d00e", - "reference": "aa5fc277a4f5508013d571341ade0c3886d4d00e", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/a71f2b11690f4b24d099d6b16690a90ae14fc6f3", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3", "shasum": "" }, "require": { @@ -5428,7 +5435,7 @@ ], "support": { "issues": "https://github.com/Nyholm/psr7/issues", - "source": "https://github.com/Nyholm/psr7/tree/1.8.1" + "source": "https://github.com/Nyholm/psr7/tree/1.8.2" }, "funding": [ { @@ -5440,7 +5447,7 @@ "type": "github" } ], - "time": "2023-11-13T09:31:12+00:00" + "time": "2024-09-09T07:06:30+00:00" }, { "name": "okvpn/clock-lts", @@ -5565,6 +5572,71 @@ ], "time": "2024-05-30T15:14:26+00:00" }, + { + "name": "osa-eg/laravel-teams-notification", + "version": "v2.1.2", + "source": { + "type": "git", + "url": "https://github.com/osa-eg/laravel-teams-notification.git", + "reference": "76173689930aca92b5174a3b102e705279192c0f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/osa-eg/laravel-teams-notification/zipball/76173689930aca92b5174a3b102e705279192c0f", + "reference": "76173689930aca92b5174a3b102e705279192c0f", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": ">=6.5", + "illuminate/support": "^5.5 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0", + "monolog/monolog": ">=1.0", + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Osama\\LaravelTeamsNotification\\LaravelTeamsNotificationServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Osama\\LaravelTeamsNotification\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Osama Saad", + "email": "osaad96eg@gmail.com" + } + ], + "description": "A Laravel package to send notifications to Microsoft Teams", + "keywords": [ + "Teams", + "adaptive-card", + "laravel", + "logging", + "microsoft-teams-workflow", + "notification", + "teams-connector", + "teams-webhock", + "teams-workflow", + "teams_logging" + ], + "support": { + "issues": "https://github.com/osa-eg/laravel-teams-notification/issues", + "source": "https://github.com/osa-eg/laravel-teams-notification/tree/v2.1.2" + }, + "time": "2024-09-23T05:24:48+00:00" + }, { "name": "paragonie/constant_time_encoding", "version": "v2.7.0", @@ -6035,16 +6107,16 @@ }, { "name": "phpoption/phpoption", - "version": "1.9.2", + "version": "1.9.3", "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820" + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/80735db690fe4fc5c76dfa7f9b770634285fa820", - "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54", "shasum": "" }, "require": { @@ -6052,13 +6124,13 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" }, "type": "library", "extra": { "bamarni-bin": { "bin-links": true, - "forward-command": true + "forward-command": false }, "branch-alias": { "dev-master": "1.9-dev" @@ -6094,7 +6166,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.2" + "source": "https://github.com/schmittjoh/php-option/tree/1.9.3" }, "funding": [ { @@ -6106,20 +6178,20 @@ "type": "tidelift" } ], - "time": "2023-11-12T21:59:55+00:00" + "time": "2024-07-20T21:41:07+00:00" }, { "name": "phpseclib/phpseclib", - "version": "3.0.38", + "version": "3.0.42", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "b18b8788e51156c4dd97b7f220a31149a0052067" + "reference": "db92f1b1987b12b13f248fe76c3a52cadb67bb98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/b18b8788e51156c4dd97b7f220a31149a0052067", - "reference": "b18b8788e51156c4dd97b7f220a31149a0052067", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/db92f1b1987b12b13f248fe76c3a52cadb67bb98", + "reference": "db92f1b1987b12b13f248fe76c3a52cadb67bb98", "shasum": "" }, "require": { @@ -6200,7 +6272,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.38" + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.42" }, "funding": [ { @@ -6216,7 +6288,7 @@ "type": "tidelift" } ], - "time": "2024-06-17T10:11:32+00:00" + "time": "2024-09-16T03:06:04+00:00" }, { "name": "phpspec/prophecy", @@ -6289,16 +6361,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.29.1", + "version": "1.32.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4" + "reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fcaefacf2d5c417e928405b71b400d4ce10daaf4", - "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/6ca22b154efdd9e3c68c56f5d94670920a1c19a4", + "reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4", "shasum": "" }, "require": { @@ -6330,30 +6402,30 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.29.1" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.32.0" }, - "time": "2024-05-31T08:52:43+00:00" + "time": "2024-09-26T07:23:32+00:00" }, { "name": "pragmarx/google2fa", - "version": "v8.0.1", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/antonioribeiro/google2fa.git", - "reference": "80c3d801b31fe165f8fe99ea085e0a37834e1be3" + "reference": "6f8d87ebd5afbf7790bde1ffc7579c7c705e0fad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/80c3d801b31fe165f8fe99ea085e0a37834e1be3", - "reference": "80c3d801b31fe165f8fe99ea085e0a37834e1be3", + "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/6f8d87ebd5afbf7790bde1ffc7579c7c705e0fad", + "reference": "6f8d87ebd5afbf7790bde1ffc7579c7c705e0fad", "shasum": "" }, "require": { - "paragonie/constant_time_encoding": "^1.0|^2.0", + "paragonie/constant_time_encoding": "^1.0|^2.0|^3.0", "php": "^7.1|^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.18", + "phpstan/phpstan": "^1.9", "phpunit/phpunit": "^7.5.15|^8.5|^9.0" }, "type": "library", @@ -6382,9 +6454,9 @@ ], "support": { "issues": "https://github.com/antonioribeiro/google2fa/issues", - "source": "https://github.com/antonioribeiro/google2fa/tree/v8.0.1" + "source": "https://github.com/antonioribeiro/google2fa/tree/v8.0.3" }, - "time": "2022-06-13T21:57:56+00:00" + "time": "2024-09-05T11:56:40+00:00" }, { "name": "pragmarx/google2fa-laravel", @@ -6885,16 +6957,16 @@ }, { "name": "psr/log", - "version": "3.0.0", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { @@ -6929,9 +7001,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/3.0.0" + "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "time": "2021-07-14T16:46:02+00:00" + "time": "2024-09-11T13:17:53+00:00" }, { "name": "psr/simple-cache", @@ -7467,16 +7539,16 @@ }, { "name": "sabberworm/php-css-parser", - "version": "v8.5.1", + "version": "v8.6.0", "source": { "type": "git", "url": "https://github.com/MyIntervals/PHP-CSS-Parser.git", - "reference": "4a3d572b0f8b28bb6fd016ae8bbfc445facef152" + "reference": "d2fb94a9641be84d79c7548c6d39bbebba6e9a70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/4a3d572b0f8b28bb6fd016ae8bbfc445facef152", - "reference": "4a3d572b0f8b28bb6fd016ae8bbfc445facef152", + "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/d2fb94a9641be84d79c7548c6d39bbebba6e9a70", + "reference": "d2fb94a9641be84d79c7548c6d39bbebba6e9a70", "shasum": "" }, "require": { @@ -7526,22 +7598,22 @@ ], "support": { "issues": "https://github.com/MyIntervals/PHP-CSS-Parser/issues", - "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v8.5.1" + "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v8.6.0" }, - "time": "2024-02-15T16:41:13+00:00" + "time": "2024-07-01T07:33:21+00:00" }, { "name": "sebastian/comparator", - "version": "5.0.1", + "version": "5.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "2db5010a484d53ebf536087a70b4a5423c102372" + "reference": "2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", - "reference": "2db5010a484d53ebf536087a70b4a5423c102372", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53", + "reference": "2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53", "shasum": "" }, "require": { @@ -7552,7 +7624,7 @@ "sebastian/exporter": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^10.3" + "phpunit/phpunit": "^10.4" }, "type": "library", "extra": { @@ -7597,7 +7669,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1" + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.2" }, "funding": [ { @@ -7605,7 +7677,7 @@ "type": "github" } ], - "time": "2023-08-14T13:18:12+00:00" + "time": "2024-08-12T06:03:08+00:00" }, { "name": "sebastian/diff", @@ -7817,16 +7889,16 @@ }, { "name": "spatie/backtrace", - "version": "1.6.1", + "version": "1.6.2", "source": { "type": "git", "url": "https://github.com/spatie/backtrace.git", - "reference": "8373b9d51638292e3bfd736a9c19a654111b4a23" + "reference": "1a9a145b044677ae3424693f7b06479fc8c137a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/backtrace/zipball/8373b9d51638292e3bfd736a9c19a654111b4a23", - "reference": "8373b9d51638292e3bfd736a9c19a654111b4a23", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/1a9a145b044677ae3424693f7b06479fc8c137a9", + "reference": "1a9a145b044677ae3424693f7b06479fc8c137a9", "shasum": "" }, "require": { @@ -7864,7 +7936,7 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/backtrace/tree/1.6.1" + "source": "https://github.com/spatie/backtrace/tree/1.6.2" }, "funding": [ { @@ -7876,20 +7948,20 @@ "type": "other" } ], - "time": "2024-04-24T13:22:11+00:00" + "time": "2024-07-22T08:21:24+00:00" }, { "name": "spatie/db-dumper", - "version": "3.6.0", + "version": "3.7.0", "source": { "type": "git", "url": "https://github.com/spatie/db-dumper.git", - "reference": "faca5056830bccea04eadf07e8074669cb9e905e" + "reference": "22553ab8c34a9bb70645cb9bc2d9f236f3135705" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/db-dumper/zipball/faca5056830bccea04eadf07e8074669cb9e905e", - "reference": "faca5056830bccea04eadf07e8074669cb9e905e", + "url": "https://api.github.com/repos/spatie/db-dumper/zipball/22553ab8c34a9bb70645cb9bc2d9f236f3135705", + "reference": "22553ab8c34a9bb70645cb9bc2d9f236f3135705", "shasum": "" }, "require": { @@ -7927,7 +7999,7 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/db-dumper/tree/3.6.0" + "source": "https://github.com/spatie/db-dumper/tree/3.7.0" }, "funding": [ { @@ -7939,20 +8011,20 @@ "type": "github" } ], - "time": "2024-04-24T14:54:13+00:00" + "time": "2024-09-23T08:58:35+00:00" }, { "name": "spatie/error-solutions", - "version": "1.0.1", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/spatie/error-solutions.git", - "reference": "d60d4d2ef4b7701c86134ded959667cac6215233" + "reference": "ae7393122eda72eed7cc4f176d1e96ea444f2d67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/error-solutions/zipball/d60d4d2ef4b7701c86134ded959667cac6215233", - "reference": "d60d4d2ef4b7701c86134ded959667cac6215233", + "url": "https://api.github.com/repos/spatie/error-solutions/zipball/ae7393122eda72eed7cc4f176d1e96ea444f2d67", + "reference": "ae7393122eda72eed7cc4f176d1e96ea444f2d67", "shasum": "" }, "require": { @@ -8005,7 +8077,7 @@ ], "support": { "issues": "https://github.com/spatie/error-solutions/issues", - "source": "https://github.com/spatie/error-solutions/tree/1.0.1" + "source": "https://github.com/spatie/error-solutions/tree/1.1.1" }, "funding": [ { @@ -8013,20 +8085,20 @@ "type": "github" } ], - "time": "2024-06-21T10:09:00+00:00" + "time": "2024-07-25T11:06:04+00:00" }, { "name": "spatie/flare-client-php", - "version": "1.7.0", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/spatie/flare-client-php.git", - "reference": "097040ff51e660e0f6fc863684ac4b02c93fa234" + "reference": "180f8ca4c0d0d6fc51477bd8c53ce37ab5a96122" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/097040ff51e660e0f6fc863684ac4b02c93fa234", - "reference": "097040ff51e660e0f6fc863684ac4b02c93fa234", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/180f8ca4c0d0d6fc51477bd8c53ce37ab5a96122", + "reference": "180f8ca4c0d0d6fc51477bd8c53ce37ab5a96122", "shasum": "" }, "require": { @@ -8044,7 +8116,7 @@ "phpstan/extension-installer": "^1.1", "phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-phpunit": "^1.0", - "spatie/phpunit-snapshot-assertions": "^4.0|^5.0" + "spatie/pest-plugin-snapshots": "^1.0|^2.0" }, "type": "library", "extra": { @@ -8074,7 +8146,7 @@ ], "support": { "issues": "https://github.com/spatie/flare-client-php/issues", - "source": "https://github.com/spatie/flare-client-php/tree/1.7.0" + "source": "https://github.com/spatie/flare-client-php/tree/1.8.0" }, "funding": [ { @@ -8082,7 +8154,7 @@ "type": "github" } ], - "time": "2024-06-12T14:39:14+00:00" + "time": "2024-08-01T08:27:26+00:00" }, { "name": "spatie/ignition", @@ -8169,16 +8241,16 @@ }, { "name": "spatie/laravel-backup", - "version": "8.8.1", + "version": "8.8.2", "source": { "type": "git", "url": "https://github.com/spatie/laravel-backup.git", - "reference": "a9c2d2f726f4c60c2dc5d7c0c8380f72492638c2" + "reference": "5b672713283703a74c629ccd67b1d77eb57e24b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-backup/zipball/a9c2d2f726f4c60c2dc5d7c0c8380f72492638c2", - "reference": "a9c2d2f726f4c60c2dc5d7c0c8380f72492638c2", + "url": "https://api.github.com/repos/spatie/laravel-backup/zipball/5b672713283703a74c629ccd67b1d77eb57e24b9", + "reference": "5b672713283703a74c629ccd67b1d77eb57e24b9", "shasum": "" }, "require": { @@ -8252,7 +8324,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-backup/issues", - "source": "https://github.com/spatie/laravel-backup/tree/8.8.1" + "source": "https://github.com/spatie/laravel-backup/tree/8.8.2" }, "funding": [ { @@ -8264,7 +8336,7 @@ "type": "other" } ], - "time": "2024-06-04T11:31:33+00:00" + "time": "2024-08-07T11:07:52+00:00" }, { "name": "spatie/laravel-ignition", @@ -8359,16 +8431,16 @@ }, { "name": "spatie/laravel-package-tools", - "version": "1.16.4", + "version": "1.16.5", "source": { "type": "git", "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "ddf678e78d7f8b17e5cdd99c0c3413a4a6592e53" + "reference": "c7413972cf22ffdff97b68499c22baa04eddb6a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/ddf678e78d7f8b17e5cdd99c0c3413a4a6592e53", - "reference": "ddf678e78d7f8b17e5cdd99c0c3413a4a6592e53", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/c7413972cf22ffdff97b68499c22baa04eddb6a2", + "reference": "c7413972cf22ffdff97b68499c22baa04eddb6a2", "shasum": "" }, "require": { @@ -8407,7 +8479,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.16.4" + "source": "https://github.com/spatie/laravel-package-tools/tree/1.16.5" }, "funding": [ { @@ -8415,7 +8487,7 @@ "type": "github" } ], - "time": "2024-03-20T07:29:11+00:00" + "time": "2024-08-27T18:56:10+00:00" }, { "name": "spatie/laravel-signal-aware-command", @@ -8554,16 +8626,16 @@ }, { "name": "symfony/console", - "version": "v6.4.10", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "504974cbe43d05f83b201d6498c206f16fc0cdbc" + "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/504974cbe43d05f83b201d6498c206f16fc0cdbc", - "reference": "504974cbe43d05f83b201d6498c206f16fc0cdbc", + "url": "https://api.github.com/repos/symfony/console/zipball/72d080eb9edf80e36c19be61f72c98ed8273b765", + "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765", "shasum": "" }, "require": { @@ -8628,7 +8700,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.10" + "source": "https://github.com/symfony/console/tree/v6.4.12" }, "funding": [ { @@ -8644,7 +8716,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:30:32+00:00" + "time": "2024-09-20T08:15:52+00:00" }, { "name": "symfony/css-selector", @@ -8781,16 +8853,16 @@ }, { "name": "symfony/error-handler", - "version": "v6.4.8", + "version": "v6.4.10", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "ef836152bf13472dc5fb5b08b0c0c4cfeddc0fcc" + "reference": "231f1b2ee80f72daa1972f7340297d67439224f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/ef836152bf13472dc5fb5b08b0c0c4cfeddc0fcc", - "reference": "ef836152bf13472dc5fb5b08b0c0c4cfeddc0fcc", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/231f1b2ee80f72daa1972f7340297d67439224f0", + "reference": "231f1b2ee80f72daa1972f7340297d67439224f0", "shasum": "" }, "require": { @@ -8836,7 +8908,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.4.8" + "source": "https://github.com/symfony/error-handler/tree/v6.4.10" }, "funding": [ { @@ -8852,7 +8924,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-07-26T12:30:32+00:00" }, { "name": "symfony/event-dispatcher", @@ -9012,16 +9084,16 @@ }, { "name": "symfony/finder", - "version": "v6.4.8", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "3ef977a43883215d560a2cecb82ec8e62131471c" + "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/3ef977a43883215d560a2cecb82ec8e62131471c", - "reference": "3ef977a43883215d560a2cecb82ec8e62131471c", + "url": "https://api.github.com/repos/symfony/finder/zipball/d7eb6daf8cd7e9ac4976e9576b32042ef7253453", + "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453", "shasum": "" }, "require": { @@ -9056,7 +9128,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.8" + "source": "https://github.com/symfony/finder/tree/v6.4.11" }, "funding": [ { @@ -9072,20 +9144,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-08-13T14:27:37+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.4.8", + "version": "v6.4.14", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "27de8cc95e11db7a50b027e71caaab9024545947" + "reference": "ba020a321a95519303a3f09ec2824d34d601c388" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/27de8cc95e11db7a50b027e71caaab9024545947", - "reference": "27de8cc95e11db7a50b027e71caaab9024545947", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ba020a321a95519303a3f09ec2824d34d601c388", + "reference": "ba020a321a95519303a3f09ec2824d34d601c388", "shasum": "" }, "require": { @@ -9133,7 +9205,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.8" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.14" }, "funding": [ { @@ -9149,20 +9221,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-11-05T16:39:55+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.8", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "6c519aa3f32adcfd1d1f18d923f6b227d9acf3c1" + "reference": "96df83d51b5f78804f70c093b97310794fd6257b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/6c519aa3f32adcfd1d1f18d923f6b227d9acf3c1", - "reference": "6c519aa3f32adcfd1d1f18d923f6b227d9acf3c1", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/96df83d51b5f78804f70c093b97310794fd6257b", + "reference": "96df83d51b5f78804f70c093b97310794fd6257b", "shasum": "" }, "require": { @@ -9247,7 +9319,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.4.8" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.12" }, "funding": [ { @@ -9263,20 +9335,20 @@ "type": "tidelift" } ], - "time": "2024-06-02T16:06:25+00:00" + "time": "2024-09-21T06:02:57+00:00" }, { "name": "symfony/mailer", - "version": "v6.4.8", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "76326421d44c07f7824b19487cfbf87870b37efc" + "reference": "b6a25408c569ae2366b3f663a4edad19420a9c26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/76326421d44c07f7824b19487cfbf87870b37efc", - "reference": "76326421d44c07f7824b19487cfbf87870b37efc", + "url": "https://api.github.com/repos/symfony/mailer/zipball/b6a25408c569ae2366b3f663a4edad19420a9c26", + "reference": "b6a25408c569ae2366b3f663a4edad19420a9c26", "shasum": "" }, "require": { @@ -9327,7 +9399,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.8" + "source": "https://github.com/symfony/mailer/tree/v6.4.12" }, "funding": [ { @@ -9343,20 +9415,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-08T12:30:05+00:00" }, { "name": "symfony/mime", - "version": "v6.4.8", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "618597ab8b78ac86d1c75a9d0b35540cda074f33" + "reference": "abe16ee7790b16aa525877419deb0f113953f0e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/618597ab8b78ac86d1c75a9d0b35540cda074f33", - "reference": "618597ab8b78ac86d1c75a9d0b35540cda074f33", + "url": "https://api.github.com/repos/symfony/mime/zipball/abe16ee7790b16aa525877419deb0f113953f0e1", + "reference": "abe16ee7790b16aa525877419deb0f113953f0e1", "shasum": "" }, "require": { @@ -9370,7 +9442,7 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/mailer": "<5.4", - "symfony/serializer": "<6.3.2" + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", @@ -9380,7 +9452,7 @@ "symfony/process": "^5.4|^6.4|^7.0", "symfony/property-access": "^5.4|^6.0|^7.0", "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.3.2|^7.0" + "symfony/serializer": "^6.4.3|^7.0.3" }, "type": "library", "autoload": { @@ -9412,7 +9484,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.8" + "source": "https://github.com/symfony/mime/tree/v6.4.12" }, "funding": [ { @@ -9428,24 +9500,24 @@ "type": "tidelift" } ], - "time": "2024-06-01T07:50:16+00:00" + "time": "2024-09-20T08:18:25+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540" + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-ctype": "*" @@ -9491,7 +9563,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" }, "funding": [ { @@ -9507,24 +9579,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a" + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/64647a7c30b2283f5d49b874d84a18fc22054b7a", - "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -9569,7 +9641,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" }, "funding": [ { @@ -9585,26 +9657,25 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c" + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", - "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" }, "suggest": { "ext-intl": "For best performance" @@ -9653,7 +9724,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" }, "funding": [ { @@ -9669,24 +9740,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb" + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb", - "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -9734,7 +9805,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" }, "funding": [ { @@ -9750,24 +9821,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-mbstring": "*" @@ -9814,7 +9885,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" }, "funding": [ { @@ -9830,97 +9901,24 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:30:46+00:00" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.30.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "10112722600777e02d2745716b70c5db4ca70442" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/10112722600777e02d2745716b70c5db4ca70442", - "reference": "10112722600777e02d2745716b70c5db4ca70442", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.30.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-06-19T12:30:46+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "77fa7995ac1b21ab60769b7323d600a991a90433" + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433", - "reference": "77fa7995ac1b21ab60769b7323d600a991a90433", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -9967,7 +9965,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" }, "funding": [ { @@ -9983,24 +9981,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9" + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", - "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -10043,7 +10041,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" }, "funding": [ { @@ -10059,24 +10057,24 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:35:24+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "2ba1f33797470debcda07fe9dce20a0003df18e9" + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/2ba1f33797470debcda07fe9dce20a0003df18e9", - "reference": "2ba1f33797470debcda07fe9dce20a0003df18e9", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-uuid": "*" @@ -10122,7 +10120,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.31.0" }, "funding": [ { @@ -10138,20 +10136,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/process", - "version": "v6.4.8", + "version": "v6.4.14", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5" + "reference": "25214adbb0996d18112548de20c281be9f27279f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/8d92dd79149f29e89ee0f480254db595f6a6a2c5", - "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5", + "url": "https://api.github.com/repos/symfony/process/zipball/25214adbb0996d18112548de20c281be9f27279f", + "reference": "25214adbb0996d18112548de20c281be9f27279f", "shasum": "" }, "require": { @@ -10183,7 +10181,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.8" + "source": "https://github.com/symfony/process/tree/v6.4.14" }, "funding": [ { @@ -10199,7 +10197,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-11-06T09:25:01+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -10292,16 +10290,16 @@ }, { "name": "symfony/routing", - "version": "v6.4.8", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "8a40d0f9b01f0fbb80885d3ce0ad6714fb603a58" + "reference": "a7c8036bd159486228dc9be3e846a00a0dda9f9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/8a40d0f9b01f0fbb80885d3ce0ad6714fb603a58", - "reference": "8a40d0f9b01f0fbb80885d3ce0ad6714fb603a58", + "url": "https://api.github.com/repos/symfony/routing/zipball/a7c8036bd159486228dc9be3e846a00a0dda9f9f", + "reference": "a7c8036bd159486228dc9be3e846a00a0dda9f9f", "shasum": "" }, "require": { @@ -10355,7 +10353,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.8" + "source": "https://github.com/symfony/routing/tree/v6.4.12" }, "funding": [ { @@ -10371,7 +10369,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-20T08:32:26+00:00" }, { "name": "symfony/service-contracts", @@ -10458,16 +10456,16 @@ }, { "name": "symfony/string", - "version": "v6.4.10", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "ccf9b30251719567bfd46494138327522b9a9446" + "reference": "f8a1ccebd0997e16112dfecfd74220b78e5b284b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/ccf9b30251719567bfd46494138327522b9a9446", - "reference": "ccf9b30251719567bfd46494138327522b9a9446", + "url": "https://api.github.com/repos/symfony/string/zipball/f8a1ccebd0997e16112dfecfd74220b78e5b284b", + "reference": "f8a1ccebd0997e16112dfecfd74220b78e5b284b", "shasum": "" }, "require": { @@ -10524,7 +10522,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.10" + "source": "https://github.com/symfony/string/tree/v6.4.12" }, "funding": [ { @@ -10540,20 +10538,20 @@ "type": "tidelift" } ], - "time": "2024-07-22T10:21:14+00:00" + "time": "2024-09-20T08:15:52+00:00" }, { "name": "symfony/translation", - "version": "v6.4.8", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "a002933b13989fc4bd0b58e04bf7eec5210e438a" + "reference": "cf8360b8352b086be620fae8342c4d96e391a489" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/a002933b13989fc4bd0b58e04bf7eec5210e438a", - "reference": "a002933b13989fc4bd0b58e04bf7eec5210e438a", + "url": "https://api.github.com/repos/symfony/translation/zipball/cf8360b8352b086be620fae8342c4d96e391a489", + "reference": "cf8360b8352b086be620fae8342c4d96e391a489", "shasum": "" }, "require": { @@ -10619,7 +10617,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.8" + "source": "https://github.com/symfony/translation/tree/v6.4.12" }, "funding": [ { @@ -10635,7 +10633,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-16T06:02:54+00:00" }, { "name": "symfony/translation-contracts", @@ -10717,16 +10715,16 @@ }, { "name": "symfony/uid", - "version": "v6.4.8", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "35904eca37a84bb764c560cbfcac9f0ac2bcdbdf" + "reference": "2f16054e0a9b194b8ca581d4a64eee3f7d4a9d4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/35904eca37a84bb764c560cbfcac9f0ac2bcdbdf", - "reference": "35904eca37a84bb764c560cbfcac9f0ac2bcdbdf", + "url": "https://api.github.com/repos/symfony/uid/zipball/2f16054e0a9b194b8ca581d4a64eee3f7d4a9d4d", + "reference": "2f16054e0a9b194b8ca581d4a64eee3f7d4a9d4d", "shasum": "" }, "require": { @@ -10771,7 +10769,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v6.4.8" + "source": "https://github.com/symfony/uid/tree/v6.4.12" }, "funding": [ { @@ -10787,20 +10785,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-20T08:32:26+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.8", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "ad23ca4312395f0a8a8633c831ef4c4ee542ed25" + "reference": "ee14c8254a480913268b1e3b1cba8045ed122694" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/ad23ca4312395f0a8a8633c831ef4c4ee542ed25", - "reference": "ad23ca4312395f0a8a8633c831ef4c4ee542ed25", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/ee14c8254a480913268b1e3b1cba8045ed122694", + "reference": "ee14c8254a480913268b1e3b1cba8045ed122694", "shasum": "" }, "require": { @@ -10856,7 +10854,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.8" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.11" }, "funding": [ { @@ -10872,7 +10870,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-08-30T16:03:21+00:00" }, { "name": "tecnickcom/tc-lib-barcode", @@ -11045,16 +11043,16 @@ }, { "name": "tecnickcom/tcpdf", - "version": "6.7.5", + "version": "6.7.6", "source": { "type": "git", "url": "https://github.com/tecnickcom/TCPDF.git", - "reference": "951eabf0338ec2522bd0d5d9c79b08a3a3d36b36" + "reference": "4cf1ab192e87e6916d20f93077b2bdfa96a2f848" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/951eabf0338ec2522bd0d5d9c79b08a3a3d36b36", - "reference": "951eabf0338ec2522bd0d5d9c79b08a3a3d36b36", + "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/4cf1ab192e87e6916d20f93077b2bdfa96a2f848", + "reference": "4cf1ab192e87e6916d20f93077b2bdfa96a2f848", "shasum": "" }, "require": { @@ -11105,7 +11103,7 @@ ], "support": { "issues": "https://github.com/tecnickcom/TCPDF/issues", - "source": "https://github.com/tecnickcom/TCPDF/tree/6.7.5" + "source": "https://github.com/tecnickcom/TCPDF/tree/6.7.6" }, "funding": [ { @@ -11113,7 +11111,7 @@ "type": "custom" } ], - "time": "2024-04-20T17:25:10+00:00" + "time": "2024-10-06T10:54:28+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -11427,23 +11425,23 @@ }, { "name": "vlucas/phpdotenv", - "version": "v5.6.0", + "version": "v5.6.1", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4" + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", - "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2", "shasum": "" }, "require": { "ext-pcre": "*", - "graham-campbell/result-type": "^1.1.2", + "graham-campbell/result-type": "^1.1.3", "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.2", + "phpoption/phpoption": "^1.9.3", "symfony/polyfill-ctype": "^1.24", "symfony/polyfill-mbstring": "^1.24", "symfony/polyfill-php80": "^1.24" @@ -11460,7 +11458,7 @@ "extra": { "bamarni-bin": { "bin-links": true, - "forward-command": true + "forward-command": false }, "branch-alias": { "dev-master": "5.6-dev" @@ -11495,7 +11493,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.0" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.1" }, "funding": [ { @@ -11507,7 +11505,7 @@ "type": "tidelift" } ], - "time": "2023-11-12T22:43:29+00:00" + "time": "2024-07-20T21:52:34+00:00" }, { "name": "voku/portable-ascii", @@ -11857,101 +11855,6 @@ ], "time": "2024-04-13T18:00:56+00:00" }, - { - "name": "brianium/paratest", - "version": "v7.3.1", - "source": { - "type": "git", - "url": "https://github.com/paratestphp/paratest.git", - "reference": "551f46f52a93177d873f3be08a1649ae886b4a30" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paratestphp/paratest/zipball/551f46f52a93177d873f3be08a1649ae886b4a30", - "reference": "551f46f52a93177d873f3be08a1649ae886b4a30", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-simplexml": "*", - "fidry/cpu-core-counter": "^0.5.1 || ^1.0.0", - "jean85/pretty-package-versions": "^2.0.5", - "php": "~8.1.0 || ~8.2.0 || ~8.3.0", - "phpunit/php-code-coverage": "^10.1.7", - "phpunit/php-file-iterator": "^4.1.0", - "phpunit/php-timer": "^6.0", - "phpunit/phpunit": "^10.4.2", - "sebastian/environment": "^6.0.1", - "symfony/console": "^6.3.4 || ^7.0.0", - "symfony/process": "^6.3.4 || ^7.0.0" - }, - "require-dev": { - "doctrine/coding-standard": "^12.0.0", - "ext-pcov": "*", - "ext-posix": "*", - "infection/infection": "^0.27.6", - "phpstan/phpstan": "^1.10.40", - "phpstan/phpstan-deprecation-rules": "^1.1.4", - "phpstan/phpstan-phpunit": "^1.3.15", - "phpstan/phpstan-strict-rules": "^1.5.2", - "squizlabs/php_codesniffer": "^3.7.2", - "symfony/filesystem": "^6.3.1 || ^7.0.0" - }, - "bin": [ - "bin/paratest", - "bin/paratest.bat", - "bin/paratest_for_phpstorm" - ], - "type": "library", - "autoload": { - "psr-4": { - "ParaTest\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Brian Scaturro", - "email": "scaturrob@gmail.com", - "role": "Developer" - }, - { - "name": "Filippo Tessarotto", - "email": "zoeslam@gmail.com", - "role": "Developer" - } - ], - "description": "Parallel testing for PHP", - "homepage": "https://github.com/paratestphp/paratest", - "keywords": [ - "concurrent", - "parallel", - "phpunit", - "testing" - ], - "support": { - "issues": "https://github.com/paratestphp/paratest/issues", - "source": "https://github.com/paratestphp/paratest/tree/v7.3.1" - }, - "funding": [ - { - "url": "https://github.com/sponsors/Slamdunk", - "type": "github" - }, - { - "url": "https://paypal.me/filippotessarotto", - "type": "paypal" - } - ], - "time": "2023-10-31T09:24:17+00:00" - }, { "name": "clue/ndjson-react", "version": "v1.3.0", @@ -12083,30 +11986,38 @@ }, { "name": "composer/pcre", - "version": "3.1.4", + "version": "3.3.1", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "04229f163664973f68f38f6f73d917799168ef24" + "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/04229f163664973f68f38f6f73d917799168ef24", - "reference": "04229f163664973f68f38f6f73d917799168ef24", + "url": "https://api.github.com/repos/composer/pcre/zipball/63aaeac21d7e775ff9bc9d45021e1745c97521c4", + "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4", "shasum": "" }, "require": { "php": "^7.4 || ^8.0" }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, "require-dev": { - "phpstan/phpstan": "^1.3", + "phpstan/phpstan": "^1.11.10", "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^5" + "phpunit/phpunit": "^8 || ^9" }, "type": "library", "extra": { "branch-alias": { "dev-main": "3.x-dev" + }, + "phpstan": { + "includes": [ + "extension.neon" + ] } }, "autoload": { @@ -12134,7 +12045,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.1.4" + "source": "https://github.com/composer/pcre/tree/3.3.1" }, "funding": [ { @@ -12150,28 +12061,28 @@ "type": "tidelift" } ], - "time": "2024-05-27T13:40:54+00:00" + "time": "2024-08-27T18:44:43+00:00" }, { "name": "composer/semver", - "version": "3.4.0", + "version": "3.4.3", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", - "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.4", - "symfony/phpunit-bridge": "^4.2 || ^5" + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" }, "type": "library", "extra": { @@ -12215,7 +12126,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.0" + "source": "https://github.com/composer/semver/tree/3.4.3" }, "funding": [ { @@ -12231,7 +12142,7 @@ "type": "tidelift" } ], - "time": "2023-08-31T09:50:34+00:00" + "time": "2024-09-19T14:15:21+00:00" }, { "name": "composer/xdebug-handler", @@ -12571,16 +12482,16 @@ }, { "name": "felixfbecker/language-server-protocol", - "version": "v1.5.2", + "version": "v1.5.3", "source": { "type": "git", "url": "https://github.com/felixfbecker/php-language-server-protocol.git", - "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842" + "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842", - "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842", + "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/a9e113dbc7d849e35b8776da39edaf4313b7b6c9", + "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9", "shasum": "" }, "require": { @@ -12621,22 +12532,22 @@ ], "support": { "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", - "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2" + "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.3" }, - "time": "2022-03-02T22:36:06+00:00" + "time": "2024-04-30T00:40:11+00:00" }, { "name": "fidry/cpu-core-counter", - "version": "1.1.0", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/theofidry/cpu-core-counter.git", - "reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42" + "reference": "8520451a140d3f46ac33042715115e290cf5785f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/f92996c4d5c1a696a6a970e20f7c4216200fcc42", - "reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", + "reference": "8520451a140d3f46ac33042715115e290cf5785f", "shasum": "" }, "require": { @@ -12676,7 +12587,7 @@ ], "support": { "issues": "https://github.com/theofidry/cpu-core-counter/issues", - "source": "https://github.com/theofidry/cpu-core-counter/tree/1.1.0" + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" }, "funding": [ { @@ -12684,20 +12595,20 @@ "type": "github" } ], - "time": "2024-02-07T09:43:46+00:00" + "time": "2024-08-06T10:04:20+00:00" }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.59.3", + "version": "v3.64.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "30ba9ecc2b0e5205e578fe29973c15653d9bfd29" + "reference": "58dd9c931c785a79739310aef5178928305ffa67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/30ba9ecc2b0e5205e578fe29973c15653d9bfd29", - "reference": "30ba9ecc2b0e5205e578fe29973c15653d9bfd29", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/58dd9c931c785a79739310aef5178928305ffa67", + "reference": "58dd9c931c785a79739310aef5178928305ffa67", "shasum": "" }, "require": { @@ -12779,7 +12690,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.59.3" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.64.0" }, "funding": [ { @@ -12787,7 +12698,7 @@ "type": "github" } ], - "time": "2024-06-16T14:17:03+00:00" + "time": "2024-08-30T23:09:38+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -12840,81 +12751,22 @@ }, "time": "2020-07-09T08:09:16+00:00" }, - { - "name": "jean85/pretty-package-versions", - "version": "2.0.6", - "source": { - "type": "git", - "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/f9fdd29ad8e6d024f52678b570e5593759b550b4", - "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2.0.0", - "php": "^7.1|^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.2", - "jean85/composer-provided-replaced-stub-package": "^1.0", - "phpstan/phpstan": "^1.4", - "phpunit/phpunit": "^7.5|^8.5|^9.4", - "vimeo/psalm": "^4.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Jean85\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alessandro Lai", - "email": "alessandro.lai85@gmail.com" - } - ], - "description": "A library to get pretty versions strings of installed dependencies", - "keywords": [ - "composer", - "package", - "release", - "versions" - ], - "support": { - "issues": "https://github.com/Jean85/pretty-package-versions/issues", - "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.6" - }, - "time": "2024-03-08T09:58:59+00:00" - }, { "name": "justinrainbow/json-schema", - "version": "v5.2.13", + "version": "5.3.0", "source": { "type": "git", "url": "https://github.com/jsonrainbow/json-schema.git", - "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793" + "reference": "feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/fbbe7e5d79f618997bc3332a6f49246036c45793", - "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8", + "reference": "feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" }, "require-dev": { "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", @@ -12925,11 +12777,6 @@ "bin/validate-json" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0.x-dev" - } - }, "autoload": { "psr-4": { "JsonSchema\\": "src/JsonSchema/" @@ -12965,22 +12812,22 @@ ], "support": { "issues": "https://github.com/jsonrainbow/json-schema/issues", - "source": "https://github.com/jsonrainbow/json-schema/tree/v5.2.13" + "source": "https://github.com/jsonrainbow/json-schema/tree/5.3.0" }, - "time": "2023-09-26T02:20:38+00:00" + "time": "2024-07-06T21:00:26+00:00" }, { "name": "larastan/larastan", - "version": "v2.9.7", + "version": "v2.9.8", "source": { "type": "git", "url": "https://github.com/larastan/larastan.git", - "reference": "5c805f636095cc2e0b659e3954775cf8f1dad1bb" + "reference": "340badd89b0eb5bddbc503a4829c08cf9a2819d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/larastan/larastan/zipball/5c805f636095cc2e0b659e3954775cf8f1dad1bb", - "reference": "5c805f636095cc2e0b659e3954775cf8f1dad1bb", + "url": "https://api.github.com/repos/larastan/larastan/zipball/340badd89b0eb5bddbc503a4829c08cf9a2819d7", + "reference": "340badd89b0eb5bddbc503a4829c08cf9a2819d7", "shasum": "" }, "require": { @@ -12994,7 +12841,7 @@ "illuminate/support": "^9.52.16 || ^10.28.0 || ^11.0", "php": "^8.0.2", "phpmyadmin/sql-parser": "^5.9.0", - "phpstan/phpstan": "^1.11.1" + "phpstan/phpstan": "^1.11.2" }, "require-dev": { "doctrine/coding-standard": "^12.0", @@ -13049,7 +12896,7 @@ ], "support": { "issues": "https://github.com/larastan/larastan/issues", - "source": "https://github.com/larastan/larastan/tree/v2.9.7" + "source": "https://github.com/larastan/larastan/tree/v2.9.8" }, "funding": [ { @@ -13069,7 +12916,7 @@ "type": "patreon" } ], - "time": "2024-05-27T18:33:26+00:00" + "time": "2024-07-06T17:46:02+00:00" }, { "name": "league/container", @@ -13298,16 +13145,16 @@ }, { "name": "netresearch/jsonmapper", - "version": "v4.4.1", + "version": "v4.5.0", "source": { "type": "git", "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "132c75c7dd83e45353ebb9c6c9f591952995bbf0" + "reference": "8e76efb98ee8b6afc54687045e1b8dba55ac76e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/132c75c7dd83e45353ebb9c6c9f591952995bbf0", - "reference": "132c75c7dd83e45353ebb9c6c9f591952995bbf0", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8e76efb98ee8b6afc54687045e1b8dba55ac76e5", + "reference": "8e76efb98ee8b6afc54687045e1b8dba55ac76e5", "shasum": "" }, "require": { @@ -13343,9 +13190,9 @@ "support": { "email": "cweiske@cweiske.de", "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/v4.4.1" + "source": "https://github.com/cweiske/jsonmapper/tree/v4.5.0" }, - "time": "2024-01-31T06:18:54+00:00" + "time": "2024-09-08T10:13:13+00:00" }, { "name": "nunomaduro/phpinsights", @@ -13841,16 +13688,16 @@ }, { "name": "phpmyadmin/sql-parser", - "version": "5.9.0", + "version": "5.10.0", "source": { "type": "git", "url": "https://github.com/phpmyadmin/sql-parser.git", - "reference": "011fa18a4e55591fac6545a821921dd1d61c6984" + "reference": "91d980ab76c3f152481e367f62b921adc38af451" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpmyadmin/sql-parser/zipball/011fa18a4e55591fac6545a821921dd1d61c6984", - "reference": "011fa18a4e55591fac6545a821921dd1d61c6984", + "url": "https://api.github.com/repos/phpmyadmin/sql-parser/zipball/91d980ab76c3f152481e367f62b921adc38af451", + "reference": "91d980ab76c3f152481e367f62b921adc38af451", "shasum": "" }, "require": { @@ -13868,8 +13715,7 @@ "phpstan/extension-installer": "^1.1", "phpstan/phpstan": "^1.9.12", "phpstan/phpstan-phpunit": "^1.3.3", - "phpunit/php-code-coverage": "*", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "phpunit/phpunit": "^8.5 || ^9.6", "psalm/plugin-phpunit": "^0.16.1", "vimeo/psalm": "^4.11", "zumba/json-serializer": "~3.0.2" @@ -13925,20 +13771,20 @@ "type": "other" } ], - "time": "2024-01-20T20:34:02+00:00" + "time": "2024-08-29T20:56:34+00:00" }, { "name": "phpstan/phpstan", - "version": "1.11.5", + "version": "1.12.6", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "490f0ae1c92b082f154681d7849aee776a7c1443" + "reference": "dc4d2f145a88ea7141ae698effd64d9df46527ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/490f0ae1c92b082f154681d7849aee776a7c1443", - "reference": "490f0ae1c92b082f154681d7849aee776a7c1443", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/dc4d2f145a88ea7141ae698effd64d9df46527ae", + "reference": "dc4d2f145a88ea7141ae698effd64d9df46527ae", "shasum": "" }, "require": { @@ -13983,36 +13829,36 @@ "type": "github" } ], - "time": "2024-06-17T15:10:54+00:00" + "time": "2024-10-06T15:03:59+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "10.1.15", + "version": "10.1.16", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae" + "reference": "7e308268858ed6baedc8704a304727d20bc07c77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", - "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.18 || ^5.0", + "nikic/php-parser": "^4.19.1 || ^5.1.0", "php": ">=8.1", - "phpunit/php-file-iterator": "^4.0", - "phpunit/php-text-template": "^3.0", - "sebastian/code-unit-reverse-lookup": "^3.0", - "sebastian/complexity": "^3.0", - "sebastian/environment": "^6.0", - "sebastian/lines-of-code": "^2.0", - "sebastian/version": "^4.0", - "theseer/tokenizer": "^1.2.0" + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-text-template": "^3.0.1", + "sebastian/code-unit-reverse-lookup": "^3.0.0", + "sebastian/complexity": "^3.2.0", + "sebastian/environment": "^6.1.0", + "sebastian/lines-of-code": "^2.0.2", + "sebastian/version": "^4.0.1", + "theseer/tokenizer": "^1.2.3" }, "require-dev": { "phpunit/phpunit": "^10.1" @@ -14024,7 +13870,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.1-dev" + "dev-main": "10.1.x-dev" } }, "autoload": { @@ -14053,7 +13899,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.15" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" }, "funding": [ { @@ -14061,7 +13907,7 @@ "type": "github" } ], - "time": "2024-06-29T08:25:15+00:00" + "time": "2024-08-22T04:31:57+00:00" }, { "name": "phpunit/php-file-iterator", @@ -14308,16 +14154,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.29", + "version": "10.5.36", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "8e9e80872b4e8064401788ee8a32d40b4455318f" + "reference": "aa0a8ce701ea7ee314b0dfaa8970dc94f3f8c870" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/8e9e80872b4e8064401788ee8a32d40b4455318f", - "reference": "8e9e80872b4e8064401788ee8a32d40b4455318f", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/aa0a8ce701ea7ee314b0dfaa8970dc94f3f8c870", + "reference": "aa0a8ce701ea7ee314b0dfaa8970dc94f3f8c870", "shasum": "" }, "require": { @@ -14331,14 +14177,14 @@ "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.15", + "phpunit/php-code-coverage": "^10.1.16", "phpunit/php-file-iterator": "^4.1.0", "phpunit/php-invoker": "^4.0.0", "phpunit/php-text-template": "^3.0.1", "phpunit/php-timer": "^6.0.0", "sebastian/cli-parser": "^2.0.1", "sebastian/code-unit": "^2.0.0", - "sebastian/comparator": "^5.0.1", + "sebastian/comparator": "^5.0.2", "sebastian/diff": "^5.1.1", "sebastian/environment": "^6.1.0", "sebastian/exporter": "^5.1.2", @@ -14389,7 +14235,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.29" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.36" }, "funding": [ { @@ -14405,7 +14251,7 @@ "type": "tidelift" } ], - "time": "2024-07-30T11:08:00+00:00" + "time": "2024-10-08T15:36:51+00:00" }, { "name": "react/cache", @@ -14781,31 +14627,31 @@ }, { "name": "react/socket", - "version": "v1.15.0", + "version": "v1.16.0", "source": { "type": "git", "url": "https://github.com/reactphp/socket.git", - "reference": "216d3aec0b87f04a40ca04f481e6af01bdd1d038" + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/socket/zipball/216d3aec0b87f04a40ca04f481e6af01bdd1d038", - "reference": "216d3aec0b87f04a40ca04f481e6af01bdd1d038", + "url": "https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", "shasum": "" }, "require": { "evenement/evenement": "^3.0 || ^2.0 || ^1.0", "php": ">=5.3.0", - "react/dns": "^1.11", + "react/dns": "^1.13", "react/event-loop": "^1.2", - "react/promise": "^3 || ^2.6 || ^1.2.1", - "react/stream": "^1.2" + "react/promise": "^3.2 || ^2.6 || ^1.2.1", + "react/stream": "^1.4" }, "require-dev": { "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", - "react/async": "^4 || ^3 || ^2", + "react/async": "^4.3 || ^3.3 || ^2", "react/promise-stream": "^1.4", - "react/promise-timer": "^1.10" + "react/promise-timer": "^1.11" }, "type": "library", "autoload": { @@ -14849,7 +14695,7 @@ ], "support": { "issues": "https://github.com/reactphp/socket/issues", - "source": "https://github.com/reactphp/socket/tree/v1.15.0" + "source": "https://github.com/reactphp/socket/tree/v1.16.0" }, "funding": [ { @@ -14857,7 +14703,7 @@ "type": "open_collective" } ], - "time": "2023-12-15T11:02:10+00:00" + "time": "2024-07-26T10:38:09+00:00" }, { "name": "react/stream", @@ -15703,16 +15549,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.10.1", + "version": "3.10.3", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "8f90f7a53ce271935282967f53d0894f8f1ff877" + "reference": "62d32998e820bddc40f99f8251958aed187a5c9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/8f90f7a53ce271935282967f53d0894f8f1ff877", - "reference": "8f90f7a53ce271935282967f53d0894f8f1ff877", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/62d32998e820bddc40f99f8251958aed187a5c9c", + "reference": "62d32998e820bddc40f99f8251958aed187a5c9c", "shasum": "" }, "require": { @@ -15779,20 +15625,20 @@ "type": "open_collective" } ], - "time": "2024-05-22T21:24:41+00:00" + "time": "2024-09-18T10:38:58+00:00" }, { "name": "symfony/cache", - "version": "v6.4.8", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "287142df5579ce223c485b3872df3efae8390984" + "reference": "a463451b7f6ac4a47b98dbfc78ec2d3560c759d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/287142df5579ce223c485b3872df3efae8390984", - "reference": "287142df5579ce223c485b3872df3efae8390984", + "url": "https://api.github.com/repos/symfony/cache/zipball/a463451b7f6ac4a47b98dbfc78ec2d3560c759d8", + "reference": "a463451b7f6ac4a47b98dbfc78ec2d3560c759d8", "shasum": "" }, "require": { @@ -15859,7 +15705,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.4.8" + "source": "https://github.com/symfony/cache/tree/v6.4.12" }, "funding": [ { @@ -15875,7 +15721,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-16T16:01:33+00:00" }, { "name": "symfony/cache-contracts", @@ -16029,16 +15875,16 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.8", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "4d37529150e7081c51b3c5d5718c55a04a9503f3" + "reference": "f810e3cbdf7fdc35983968523d09f349fa9ada12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/4d37529150e7081c51b3c5d5718c55a04a9503f3", - "reference": "4d37529150e7081c51b3c5d5718c55a04a9503f3", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/f810e3cbdf7fdc35983968523d09f349fa9ada12", + "reference": "f810e3cbdf7fdc35983968523d09f349fa9ada12", "shasum": "" }, "require": { @@ -16075,7 +15921,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.8" + "source": "https://github.com/symfony/filesystem/tree/v6.4.12" }, "funding": [ { @@ -16091,20 +15937,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-16T16:01:33+00:00" }, { "name": "symfony/http-client", - "version": "v6.4.8", + "version": "v6.4.14", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "61faba993e620fc22d4f0ab3b6bcf8fbb0d44b05" + "reference": "05d88cbd816ad6e0202edd9a9963cb9d615b8826" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/61faba993e620fc22d4f0ab3b6bcf8fbb0d44b05", - "reference": "61faba993e620fc22d4f0ab3b6bcf8fbb0d44b05", + "url": "https://api.github.com/repos/symfony/http-client/zipball/05d88cbd816ad6e0202edd9a9963cb9d615b8826", + "reference": "05d88cbd816ad6e0202edd9a9963cb9d615b8826", "shasum": "" }, "require": { @@ -16168,7 +16014,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.4.8" + "source": "https://github.com/symfony/http-client/tree/v6.4.14" }, "funding": [ { @@ -16184,7 +16030,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-11-05T16:39:55+00:00" }, { "name": "symfony/http-client-contracts", @@ -16333,20 +16179,20 @@ }, { "name": "symfony/polyfill-php81", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af" + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/3fb075789fb91f9ad9af537c4012d523085bd5af", - "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -16389,7 +16235,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" }, "funding": [ { @@ -16405,7 +16251,7 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:30:46+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/stopwatch", @@ -16471,16 +16317,16 @@ }, { "name": "symfony/var-exporter", - "version": "v6.4.8", + "version": "v6.4.9", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "792ca836f99b340f2e9ca9497c7953948c49a504" + "reference": "f9a060622e0d93777b7f8687ec4860191e16802e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/792ca836f99b340f2e9ca9497c7953948c49a504", - "reference": "792ca836f99b340f2e9ca9497c7953948c49a504", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/f9a060622e0d93777b7f8687ec4860191e16802e", + "reference": "f9a060622e0d93777b7f8687ec4860191e16802e", "shasum": "" }, "require": { @@ -16528,7 +16374,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.8" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.9" }, "funding": [ { @@ -16544,7 +16390,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-06-24T15:53:56+00:00" }, { "name": "theseer/tokenizer", @@ -16598,16 +16444,16 @@ }, { "name": "vimeo/psalm", - "version": "5.25.0", + "version": "5.26.1", "source": { "type": "git", "url": "https://github.com/vimeo/psalm.git", - "reference": "01a8eb06b9e9cc6cfb6a320bf9fb14331919d505" + "reference": "d747f6500b38ac4f7dfc5edbcae6e4b637d7add0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/01a8eb06b9e9cc6cfb6a320bf9fb14331919d505", - "reference": "01a8eb06b9e9cc6cfb6a320bf9fb14331919d505", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/d747f6500b38ac4f7dfc5edbcae6e4b637d7add0", + "reference": "d747f6500b38ac4f7dfc5edbcae6e4b637d7add0", "shasum": "" }, "require": { @@ -16628,7 +16474,7 @@ "felixfbecker/language-server-protocol": "^1.5.2", "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1 || ^1.0.0", "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "nikic/php-parser": "^4.16", + "nikic/php-parser": "^4.17", "php": "^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0", "sebastian/diff": "^4.0 || ^5.0 || ^6.0", "spatie/array-to-xml": "^2.17.0 || ^3.0", @@ -16704,7 +16550,7 @@ "issues": "https://github.com/vimeo/psalm/issues", "source": "https://github.com/vimeo/psalm" }, - "time": "2024-06-16T15:08:35+00:00" + "time": "2024-09-08T18:53:08+00:00" } ], "aliases": [], @@ -16723,5 +16569,5 @@ "ext-pdo": "*" }, "platform-dev": [], - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.3.0" } diff --git a/config/app.php b/config/app.php index 060d82d525..39898ff437 100755 --- a/config/app.php +++ b/config/app.php @@ -280,7 +280,6 @@ return [ Illuminate\Redis\RedisServiceProvider::class, Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, Illuminate\Session\SessionServiceProvider::class, -// Illuminate\Translation\TranslationServiceProvider::class, //replaced on next line App\Providers\SnipeTranslationServiceProvider::class, //we REPLACE the default Laravel translator with our own Illuminate\Validation\ValidationServiceProvider::class, Illuminate\View\ViewServiceProvider::class, @@ -372,7 +371,9 @@ return [ 'Google2FA' => PragmaRX\Google2FALaravel\Facade::class, 'Image' => Intervention\Image\ImageServiceProvider::class, 'Carbon' => Carbon\Carbon::class, - 'Helper' => App\Helpers\Helper::class, // makes it much easier to use 'Helper::blah' in blades (which is where we usually use this) + 'Helper' => App\Helpers\Helper::class, + 'StorageHelper' => App\Helpers\StorageHelper::class, + 'Icon' => App\Helpers\IconHelper::class, 'Socialite' => Laravel\Socialite\Facades\Socialite::class, diff --git a/config/backup.php b/config/backup.php index 3571329b23..0890877339 100644 --- a/config/backup.php +++ b/config/backup.php @@ -237,4 +237,6 @@ return [ ], ], + 'sanitize_by_default' => env('DB_SANITIZE_BY_DEFAULT', false), + ]; diff --git a/config/version.php b/config/version.php index e00f58b0bb..2249e8dbd3 100644 --- a/config/version.php +++ b/config/version.php @@ -1,10 +1,10 @@ 'v7.0.11', - 'full_app_version' => 'v7.0.11 - build 14904-g6c0cf9447', - 'build_version' => '14904', + 'app_version' => 'v7.0.13', + 'full_app_version' => 'v7.0.13 - build 15666-g03b01689b', + 'build_version' => '15666', 'prerelease_version' => '', - 'hash_version' => 'g6c0cf9447', - 'full_hash' => 'v7.0.11-218-g6c0cf9447', + 'hash_version' => 'g03b01689b', + 'full_hash' => 'v7.0.13-144-g03b01689b', 'branch' => 'develop', ); \ No newline at end of file diff --git a/database/factories/AccessoryFactory.php b/database/factories/AccessoryFactory.php index 356b367ec4..6442472d5f 100644 --- a/database/factories/AccessoryFactory.php +++ b/database/factories/AccessoryFactory.php @@ -3,7 +3,6 @@ namespace Database\Factories; use App\Models\Accessory; -use App\Models\AccessoryCheckout; use App\Models\Category; use App\Models\Location; use App\Models\Manufacturer; @@ -34,7 +33,7 @@ class AccessoryFactory extends Factory $this->faker->randomElement(['Bluetooth', 'Wired']), $this->faker->randomElement(['Keyboard', 'Wired']) ), - 'user_id' => User::factory()->superuser(), + 'created_by' => User::factory()->superuser(), 'category_id' => Category::factory()->forAccessories(), 'model_number' => $this->faker->numberBetween(1000000, 50000000), 'location_id' => Location::factory(), @@ -129,7 +128,7 @@ class AccessoryFactory extends Factory $accessory->checkouts()->create([ 'accessory_id' => $accessory->id, 'created_at' => Carbon::now(), - 'user_id' => $user->id, + 'created_by' => $user->id, 'assigned_to' => $user->id, 'assigned_type' => User::class, 'note' => '', @@ -150,10 +149,25 @@ class AccessoryFactory extends Factory $accessory->checkouts()->create([ 'accessory_id' => $accessory->id, 'created_at' => Carbon::now(), - 'user_id' => 1, + 'created_by' => 1, 'assigned_to' => $user->id ?? User::factory()->create()->id, 'assigned_type' => User::class, ]); }); } + + public function checkedOutToUsers(array $users) + { + return $this->afterCreating(function (Accessory $accessory) use ($users) { + foreach ($users as $user) { + $accessory->checkouts()->create([ + 'accessory_id' => $accessory->id, + 'created_at' => Carbon::now(), + 'user_id' => 1, + 'assigned_to' => $user->id, + 'assigned_type' => User::class, + ]); + } + }); + } } diff --git a/database/factories/ActionlogFactory.php b/database/factories/ActionlogFactory.php index a88166d14b..ad07f7082b 100644 --- a/database/factories/ActionlogFactory.php +++ b/database/factories/ActionlogFactory.php @@ -29,7 +29,7 @@ class ActionlogFactory extends Factory return [ 'item_id' => Asset::factory(), 'item_type' => Asset::class, - 'user_id' => User::factory()->superuser(), + 'created_by' => User::factory()->superuser(), 'action_type' => 'uploaded', ]; } @@ -92,7 +92,7 @@ class ActionlogFactory extends Factory $licenseSeat->update([ 'assigned_to' => $target->id, - 'user_id' => 1, // not ideal but works + 'created_by' => 1, // not ideal but works ]); return [ diff --git a/database/factories/AssetFactory.php b/database/factories/AssetFactory.php index b1255baeee..4d6d20651c 100644 --- a/database/factories/AssetFactory.php +++ b/database/factories/AssetFactory.php @@ -36,7 +36,7 @@ class AssetFactory extends Factory 'status_id' => function () { return Statuslabel::where('name', 'Ready to Deploy')->first() ?? Statuslabel::factory()->rtd()->create(['name' => 'Ready to Deploy']); }, - 'user_id' => User::factory()->superuser(), + 'created_by' => User::factory()->superuser(), 'asset_tag' => $this->faker->unixTime('now'), 'notes' => 'Created by DB seeder', 'purchase_date' => $this->faker->dateTimeBetween('-1 years', 'now', date_default_timezone_get())->format('Y-m-d'), diff --git a/database/factories/AssetModelFactory.php b/database/factories/AssetModelFactory.php index 6790897567..8acecd55d7 100644 --- a/database/factories/AssetModelFactory.php +++ b/database/factories/AssetModelFactory.php @@ -28,7 +28,7 @@ class AssetModelFactory extends Factory public function definition() { return [ - 'user_id' => User::factory()->superuser(), + 'created_by' => User::factory()->superuser(), 'name' => $this->faker->catchPhrase(), 'category_id' => Category::factory(), 'model_number' => $this->faker->creditCardNumber(), diff --git a/database/factories/CategoryFactory.php b/database/factories/CategoryFactory.php index 2a89c12892..540dcb3085 100644 --- a/database/factories/CategoryFactory.php +++ b/database/factories/CategoryFactory.php @@ -29,7 +29,7 @@ class CategoryFactory extends Factory 'eula_text' => $this->faker->paragraph(), 'require_acceptance' => false, 'use_default_eula' => $this->faker->boolean(), - 'user_id' => User::factory()->superuser(), + 'created_by' => User::factory()->superuser(), ]; } diff --git a/database/factories/CompanyFactory.php b/database/factories/CompanyFactory.php index 607822fef1..5f1ac0c98a 100644 --- a/database/factories/CompanyFactory.php +++ b/database/factories/CompanyFactory.php @@ -23,6 +23,7 @@ class CompanyFactory extends Factory { return [ 'name' => $this->faker->unique()->company(), + 'created_by' => 1, ]; } } diff --git a/database/factories/ComponentFactory.php b/database/factories/ComponentFactory.php index 2557f29c77..786e780895 100644 --- a/database/factories/ComponentFactory.php +++ b/database/factories/ComponentFactory.php @@ -7,6 +7,7 @@ use App\Models\Asset; use App\Models\Category; use App\Models\Company; use App\Models\Component; +use App\Models\Manufacturer; use App\Models\Consumable; use App\Models\Location; use App\Models\User; @@ -30,6 +31,7 @@ class ComponentFactory extends Factory */ public function definition() { + return [ 'name' => $this->faker->text(20), 'category_id' => Category::factory(), @@ -42,12 +44,14 @@ class ComponentFactory extends Factory 'min_amt' => $this->faker->numberBetween($min = 1, $max = 2), 'company_id' => Company::factory(), 'supplier_id' => Supplier::factory(), + 'model_number' => $this->faker->numberBetween(1000000, 50000000), ]; } public function ramCrucial4() { - return $this->state(function () { + $manufacturer = Manufacturer::where('name', 'Crucial')->first() ?? Manufacturer::factory()->create(['name' => 'Crucial']); + return $this->state(function () use ($manufacturer) { return [ 'name' => 'Crucial 4GB DDR3L-1600 SODIMM', 'category_id' => function () { @@ -55,6 +59,7 @@ class ComponentFactory extends Factory }, 'qty' => 10, 'min_amt' => 2, + 'manufacturer_id' => $manufacturer->id, 'location_id' => Location::factory(), ]; }); @@ -62,7 +67,8 @@ class ComponentFactory extends Factory public function ramCrucial8() { - return $this->state(function () { + $manufacturer = Manufacturer::where('name', 'Crucial')->first() ?? Manufacturer::factory()->create(['name' => 'Crucial']); + return $this->state(function () use ($manufacturer) { return [ 'name' => 'Crucial 8GB DDR3L-1600 SODIMM Memory for Mac', 'category_id' => function () { @@ -70,13 +76,15 @@ class ComponentFactory extends Factory }, 'qty' => 10, 'min_amt' => 2, + 'manufacturer_id' => $manufacturer->id, ]; }); } public function ssdCrucial120() { - return $this->state(function () { + $manufacturer = Manufacturer::where('name', 'Crucial')->first() ?? Manufacturer::factory()->create(['name' => 'Crucial']); + return $this->state(function () use ($manufacturer) { return [ 'name' => 'Crucial BX300 120GB SATA Internal SSD', 'category_id' => function () { @@ -84,13 +92,15 @@ class ComponentFactory extends Factory }, 'qty' => 10, 'min_amt' => 2, + 'manufacturer_id' => $manufacturer->id, ]; }); } public function ssdCrucial240() { - return $this->state(function () { + $manufacturer = Manufacturer::where('name', 'Crucial')->first() ?? Manufacturer::factory()->create(['name' => 'Crucial']); + return $this->state(function () use ($manufacturer) { return [ 'name' => 'Crucial BX300 240GB SATA Internal SSD', 'category_id' => function () { @@ -98,6 +108,7 @@ class ComponentFactory extends Factory }, 'qty' => 10, 'min_amt' => 2, + 'manufacturer_id' => $manufacturer->id, ]; }); } @@ -108,7 +119,7 @@ class ComponentFactory extends Factory $component->assets()->attach($component->id, [ 'component_id' => $component->id, 'created_at' => Carbon::now(), - 'user_id' => 1, + 'created_by' => 1, 'asset_id' => $asset->id ?? Asset::factory()->create()->id, ]); }); diff --git a/database/factories/ConsumableFactory.php b/database/factories/ConsumableFactory.php index ca3a2faf95..4a4b3ef872 100644 --- a/database/factories/ConsumableFactory.php +++ b/database/factories/ConsumableFactory.php @@ -30,7 +30,7 @@ class ConsumableFactory extends Factory return [ 'name' => $this->faker->words(3, true), 'category_id' => Category::factory(), - 'user_id' => User::factory()->superuser(), + 'created_by' => User::factory()->superuser(), 'item_no' => $this->faker->numberBetween(1000000, 50000000), 'order_number' => $this->faker->numberBetween(1000000, 50000000), 'purchase_date' => $this->faker->dateTimeBetween('-1 years', 'now', date_default_timezone_get())->format('Y-m-d'), @@ -104,7 +104,7 @@ class ConsumableFactory extends Factory $consumable->users()->attach($consumable->id, [ 'consumable_id' => $consumable->id, - 'user_id' => $user->id, + 'created_by' => $user->id, 'assigned_to' => $user->id, 'note' => '', ]); @@ -124,7 +124,7 @@ class ConsumableFactory extends Factory $consumable->users()->attach($consumable->id, [ 'consumable_id' => $consumable->id, 'created_at' => Carbon::now(), - 'user_id' => User::factory()->create()->id, + 'created_by' => User::factory()->create()->id, 'assigned_to' => $user->id ?? User::factory()->create()->id, ]); }); diff --git a/database/factories/DepartmentFactory.php b/database/factories/DepartmentFactory.php index afcc9cbd33..011a632669 100644 --- a/database/factories/DepartmentFactory.php +++ b/database/factories/DepartmentFactory.php @@ -25,7 +25,7 @@ class DepartmentFactory extends Factory { return [ 'name' => $this->faker->unique()->word() . ' Department', - 'user_id' => User::factory()->superuser(), + 'created_by' => User::factory()->superuser(), 'location_id' => Location::factory(), ]; } diff --git a/database/factories/DepreciationFactory.php b/database/factories/DepreciationFactory.php index 6359e2326b..52258e784b 100644 --- a/database/factories/DepreciationFactory.php +++ b/database/factories/DepreciationFactory.php @@ -24,7 +24,7 @@ class DepreciationFactory extends Factory { return [ 'name' => $this->faker->unique()->catchPhrase(), - 'user_id' => User::factory()->superuser(), + 'created_by' => User::factory()->superuser(), 'months' => 36, ]; } diff --git a/database/factories/ImportFactory.php b/database/factories/ImportFactory.php new file mode 100644 index 0000000000..0b0f79aa44 --- /dev/null +++ b/database/factories/ImportFactory.php @@ -0,0 +1,146 @@ + + */ +class ImportFactory extends Factory +{ + /** + * @inheritdoc + */ + protected $model = Import::class; + + /** + * @inheritdoc + */ + public function definition() + { + return [ + 'name' => $this->faker->company, + 'file_path' => Str::random().'.csv', + 'filesize' => $this->faker->randomDigitNotNull(), + 'field_map' => null, + ]; + } + + /** + * Create an accessory import type. + * + * @return static + */ + public function accessory() + { + return $this->state(function (array $attributes) { + $fileBuilder = Importing\AccessoriesImportFileBuilder::new(); + + $attributes['name'] = "{$attributes['name']} Accessories"; + $attributes['import_type'] = 'accessory'; + $attributes['header_row'] = $fileBuilder->toCsv()[0]; + $attributes['first_row'] = $fileBuilder->firstRow(); + + return $attributes; + }); + } + + /** + * Create an asset import type. + * + * @return static + */ + public function asset() + { + return $this->state(function (array $attributes) { + $fileBuilder = Importing\AssetsImportFileBuilder::new(); + + $attributes['name'] = "{$attributes['name']} Assets"; + $attributes['import_type'] = 'asset'; + $attributes['header_row'] = $fileBuilder->toCsv()[0]; + $attributes['first_row'] = $fileBuilder->firstRow(); + + return $attributes; + }); + } + + /** + * Create a component import type. + * + * @return static + */ + public function component() + { + return $this->state(function (array $attributes) { + $fileBuilder = Importing\ComponentsImportFileBuilder::new(); + + $attributes['name'] = "{$attributes['name']} Components"; + $attributes['import_type'] = 'component'; + $attributes['header_row'] = $fileBuilder->toCsv()[0]; + $attributes['first_row'] = $fileBuilder->firstRow(); + + return $attributes; + }); + } + + /** + * Create a consumable import type. + * + * @return static + */ + public function consumable() + { + return $this->state(function (array $attributes) { + $fileBuilder = Importing\ConsumablesImportFileBuilder::new(); + + $attributes['name'] = "{$attributes['name']} Consumables"; + $attributes['import_type'] = 'consumable'; + $attributes['header_row'] = $fileBuilder->toCsv()[0]; + $attributes['first_row'] = $fileBuilder->firstRow(); + + return $attributes; + }); + } + + /** + * Create a license import type. + * + * @return static + */ + public function license() + { + return $this->state(function (array $attributes) { + $fileBuilder = Importing\LicensesImportFileBuilder::new(); + + $attributes['name'] = "{$attributes['name']} Licenses"; + $attributes['import_type'] = 'license'; + $attributes['header_row'] = $fileBuilder->toCsv()[0]; + $attributes['first_row'] = $fileBuilder->firstRow(); + + return $attributes; + }); + } + + /** + * Create a users import type. + * + * @return static + */ + public function users() + { + return $this->state(function (array $attributes) { + $fileBuilder = Importing\UsersImportFileBuilder::new(); + + $attributes['name'] = "{$attributes['name']} Employees"; + $attributes['import_type'] = 'user'; + $attributes['header_row'] = $fileBuilder->toCsv()[0]; + $attributes['first_row'] = $fileBuilder->firstRow(); + + return $attributes; + }); + } +} diff --git a/database/factories/LicenseFactory.php b/database/factories/LicenseFactory.php index 6360735c5f..1f5b105f42 100644 --- a/database/factories/LicenseFactory.php +++ b/database/factories/LicenseFactory.php @@ -25,7 +25,7 @@ class LicenseFactory extends Factory public function definition() { return [ - 'user_id' => User::factory()->superuser(), + 'created_by' => User::factory()->superuser(), 'name' => $this->faker->name(), 'license_email' => $this->faker->safeEmail(), 'serial' => $this->faker->uuid(), diff --git a/database/factories/ManufacturerFactory.php b/database/factories/ManufacturerFactory.php index 7d6892426d..47d4f672f3 100644 --- a/database/factories/ManufacturerFactory.php +++ b/database/factories/ManufacturerFactory.php @@ -24,7 +24,7 @@ class ManufacturerFactory extends Factory { return [ 'name' => $this->faker->unique()->company(), - 'user_id' => User::factory()->superuser(), + 'created_by' => User::factory()->superuser(), 'support_phone' => $this->faker->phoneNumber(), 'url' => $this->faker->url(), 'support_email' => $this->faker->safeEmail(), diff --git a/database/factories/PredefinedKitFactory.php b/database/factories/PredefinedKitFactory.php new file mode 100644 index 0000000000..32e192655f --- /dev/null +++ b/database/factories/PredefinedKitFactory.php @@ -0,0 +1,23 @@ + + */ +class PredefinedKitFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => $this->faker->words(3, true), + ]; + } +} diff --git a/database/factories/StatuslabelFactory.php b/database/factories/StatuslabelFactory.php index fa2e5d5e1a..1f04f4564e 100644 --- a/database/factories/StatuslabelFactory.php +++ b/database/factories/StatuslabelFactory.php @@ -26,7 +26,7 @@ class StatuslabelFactory extends Factory 'name' => $this->faker->sentence(), 'created_at' => $this->faker->dateTime(), 'updated_at' => $this->faker->dateTime(), - 'user_id' => User::factory()->superuser(), + 'created_by' => User::factory()->superuser(), 'deleted_at' => null, 'deployable' => 0, 'pending' => 0, diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index 656fc8672d..4b752b736f 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -7,6 +7,9 @@ use App\Models\User; use Illuminate\Database\Eloquent\Factories\Factory; use \Auth; +/** + * @extends Factory + */ class UserFactory extends Factory { /** @@ -35,6 +38,7 @@ class UserFactory extends Factory 'state' => $this->faker->stateAbbr(), 'username' => $this->faker->unique()->username(), 'zip' => $this->faker->postcode(), + 'created_by' => 1, ]; } @@ -141,6 +145,11 @@ class UserFactory extends Factory return $this->appendPermission(['assets.view.requestable' => '1']); } + public function deleteAssetModels() + { + return $this->appendPermission(['models.delete' => '1']); + } + public function viewAccessories() { return $this->appendPermission(['accessories.view' => '1']); @@ -201,6 +210,11 @@ class UserFactory extends Factory return $this->appendPermission(['consumables.checkout' => '1']); } + public function deleteDepartments() + { + return $this->appendPermission(['departments.delete' => '1']); + } + public function viewDepartments() { return $this->appendPermission(['departments.view' => '1']); @@ -266,6 +280,16 @@ class UserFactory extends Factory return $this->appendPermission(['components.checkout' => '1']); } + public function createCompanies() + { + return $this->appendPermission(['companies.create' => '1']); + } + + public function deleteCompanies() + { + return $this->appendPermission(['companies.delete' => '1']); + } + public function viewUsers() { return $this->appendPermission(['users.view' => '1']); @@ -286,6 +310,16 @@ class UserFactory extends Factory return $this->appendPermission(['users.delete' => '1']); } + public function deleteCategories() + { + return $this->appendPermission(['categories.delete' => '1']); + } + + public function deleteLocations() + { + return $this->appendPermission(['locations.delete' => '1']); + } + public function canEditOwnLocation() { return $this->appendPermission(['self.edit_location' => '1']); @@ -296,6 +330,46 @@ class UserFactory extends Factory return $this->appendPermission(['reports.view' => '1']); } + public function canImport() + { + return $this->appendPermission(['import' => '1']); + } + + public function deleteCustomFields() + { + return $this->appendPermission(['customfields.delete' => '1']); + } + + public function deleteCustomFieldsets() + { + return $this->appendPermission(['customfields.delete' => '1']); + } + + public function deleteDepreciations() + { + return $this->appendPermission(['depreciations.delete' => '1']); + } + + public function deleteManufacturers() + { + return $this->appendPermission(['manufacturers.delete' => '1']); + } + + public function deletePredefinedKits() + { + return $this->appendPermission(['kits.delete' => '1']); + } + + public function deleteStatusLabels() + { + return $this->appendPermission(['statuslabels.delete' => '1']); + } + + public function deleteSuppliers() + { + return $this->appendPermission(['suppliers.delete' => '1']); + } + private function appendPermission(array $permission) { return $this->state(function ($currentState) use ($permission) { diff --git a/database/migrations/2024_09_17_204302_change_user_id_to_created_by.php b/database/migrations/2024_09_17_204302_change_user_id_to_created_by.php new file mode 100644 index 0000000000..a57406ce10 --- /dev/null +++ b/database/migrations/2024_09_17_204302_change_user_id_to_created_by.php @@ -0,0 +1,93 @@ +add_to_table_list() as $add_table) { + if (!Schema::hasColumn($add_table, 'created_by')) { + Schema::table($add_table, function (Blueprint $add_table) { + $add_table->unsignedBigInteger('created_by')->nullable()->before('created_at'); + }); + } + } + + foreach ($this->existing_table_list() as $table) { + if (Schema::hasColumn($table, 'user_id')) { + Schema::table($table, function (Blueprint $table) { + $table->renameColumn('user_id', 'created_by'); + }); + } + } + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + foreach ($this->add_to_table_list() as $add_table) { + if (Schema::hasColumn($add_table, 'created_by')) { + Schema::table($add_table, function (Blueprint $add_table) { + $add_table->dropColumn('created_by'); + }); + } + } + + foreach ($this->existing_table_list() as $table) { + if (Schema::hasColumn($table, 'user_id')) { + Schema::table($table, function (Blueprint $table) { + $table->renameColumn('created_by', 'user_id'); + }); + } + } + } + + public function existing_table_list() { + return [ + 'accessories', + 'accessories_checkout', + 'action_logs', + 'asset_maintenances', + 'assets', + 'categories', + 'components', + 'components_assets', + 'consumables', + 'consumables_users', + 'custom_fields', + 'custom_fieldsets', + 'departments', + 'depreciations', + 'license_seats', + 'licenses', + 'locations', + 'manufacturers', + 'models', + 'settings', + 'status_labels', + 'suppliers', + 'users', + ]; + } + + public function add_to_table_list() { + return [ + 'companies', + 'imports', + 'kits', + 'kits_accessories', + 'kits_consumables', + 'kits_licenses', + 'kits_models', + 'users_groups', + ]; + } +}; diff --git a/database/migrations/2024_10_23_162301_add_manufacturer_id_model_number_to_consumables.php b/database/migrations/2024_10_23_162301_add_manufacturer_id_model_number_to_consumables.php new file mode 100644 index 0000000000..0180ac0edd --- /dev/null +++ b/database/migrations/2024_10_23_162301_add_manufacturer_id_model_number_to_consumables.php @@ -0,0 +1,30 @@ +integer('manufacturer_id')->after('purchase_cost')->nullable()->default(null); + $table->string('model_number')->after('purchase_cost')->nullable()->default(null); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('components', function (Blueprint $table) { + $table->dropColumn('manufacturer_id'); + $table->dropColumn('model_number'); + }); + } +}; diff --git a/database/migrations/2024_11_06_211457_add_manager_indexes_to_location_and_user.php b/database/migrations/2024_11_06_211457_add_manager_indexes_to_location_and_user.php new file mode 100644 index 0000000000..d1a151c126 --- /dev/null +++ b/database/migrations/2024_11_06_211457_add_manager_indexes_to_location_and_user.php @@ -0,0 +1,34 @@ +index('manager_id'); + }); + Schema::table('users', function (Blueprint $table) { + $table->index('manager_id'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('locations', function (Blueprint $table) { + $table->dropIndex(['manager_id']); + }); + Schema::table('users', function (Blueprint $table) { + $table->dropIndex(['manager_id']); + }); + } +}; diff --git a/database/migrations/2024_11_07_113631_improve_manager_indexes_on_users_and_locations.php b/database/migrations/2024_11_07_113631_improve_manager_indexes_on_users_and_locations.php new file mode 100644 index 0000000000..cc2963fecc --- /dev/null +++ b/database/migrations/2024_11_07_113631_improve_manager_indexes_on_users_and_locations.php @@ -0,0 +1,39 @@ +dropIndex(['manager_id']); + $table->index(['manager_id','deleted_at']); + }); + Schema::table('users', function (Blueprint $table) { + $table->dropIndex(['manager_id']); + $table->index(['manager_id','deleted_at']); + }); + + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('locations', function (Blueprint $table) { + $table->dropIndex(['manager_id','deleted_at']); + $table->index(['manager_id']); + }); + Schema::table('users', function (Blueprint $table) { + $table->dropIndex(['manager_id','deleted_at']); + $table->index(['manager_id']); + }); + } +}; diff --git a/database/seeders/AccessorySeeder.php b/database/seeders/AccessorySeeder.php index 2330a99733..5f4cca8cf6 100644 --- a/database/seeders/AccessorySeeder.php +++ b/database/seeders/AccessorySeeder.php @@ -35,25 +35,25 @@ class AccessorySeeder extends Seeder Accessory::factory()->appleUsbKeyboard()->create([ 'location_id' => $locationIds->random(), 'supplier_id' => $supplierIds->random(), - 'user_id' => $admin->id, + 'created_by' => $admin->id, ]); Accessory::factory()->appleBtKeyboard()->create([ 'location_id' => $locationIds->random(), 'supplier_id' => $supplierIds->random(), - 'user_id' => $admin->id, + 'created_by' => $admin->id, ]); Accessory::factory()->appleMouse()->create([ 'location_id' => $locationIds->random(), 'supplier_id' => $supplierIds->random(), - 'user_id' => $admin->id, + 'created_by' => $admin->id, ]); Accessory::factory()->microsoftMouse()->create([ 'location_id' => $locationIds->random(), 'supplier_id' => $supplierIds->random(), - 'user_id' => $admin->id, + 'created_by' => $admin->id, ]); diff --git a/database/seeders/ActionlogSeeder.php b/database/seeders/ActionlogSeeder.php index 28191d53b0..3903980007 100644 --- a/database/seeders/ActionlogSeeder.php +++ b/database/seeders/ActionlogSeeder.php @@ -27,16 +27,16 @@ class ActionlogSeeder extends Seeder Actionlog::factory() ->count(300) ->assetCheckoutToUser() - ->create(['user_id' => $admin->id]); + ->create(['created_by' => $admin->id]); Actionlog::factory() ->count(100) ->assetCheckoutToLocation() - ->create(['user_id' => $admin->id]); + ->create(['created_by' => $admin->id]); Actionlog::factory() ->count(20) ->licenseCheckoutToUser() - ->create(['user_id' => $admin->id]); + ->create(['created_by' => $admin->id]); } } diff --git a/database/seeders/AssetModelSeeder.php b/database/seeders/AssetModelSeeder.php index 1fc0b28cd3..f2902ffe7c 100755 --- a/database/seeders/AssetModelSeeder.php +++ b/database/seeders/AssetModelSeeder.php @@ -17,34 +17,34 @@ class AssetModelSeeder extends Seeder $admin = User::where('permissions->superuser', '1')->first() ?? User::factory()->firstAdmin()->create(); // Laptops - AssetModel::factory()->count(1)->mbp13Model()->create(['user_id' => $admin->id]); - AssetModel::factory()->count(1)->mbpAirModel()->create(['user_id' => $admin->id]); - AssetModel::factory()->count(1)->surfaceModel()->create(['user_id' => $admin->id]); - AssetModel::factory()->count(1)->xps13Model()->create(['user_id' => $admin->id]); - AssetModel::factory()->count(1)->spectreModel()->create(['user_id' => $admin->id]); - AssetModel::factory()->count(1)->zenbookModel()->create(['user_id' => $admin->id]); - AssetModel::factory()->count(1)->yogaModel()->create(['user_id' => $admin->id]); + AssetModel::factory()->count(1)->mbp13Model()->create(['created_by' => $admin->id]); + AssetModel::factory()->count(1)->mbpAirModel()->create(['created_by' => $admin->id]); + AssetModel::factory()->count(1)->surfaceModel()->create(['created_by' => $admin->id]); + AssetModel::factory()->count(1)->xps13Model()->create(['created_by' => $admin->id]); + AssetModel::factory()->count(1)->spectreModel()->create(['created_by' => $admin->id]); + AssetModel::factory()->count(1)->zenbookModel()->create(['created_by' => $admin->id]); + AssetModel::factory()->count(1)->yogaModel()->create(['created_by' => $admin->id]); // Desktops - AssetModel::factory()->count(1)->macproModel()->create(['user_id' => $admin->id]); - AssetModel::factory()->count(1)->lenovoI5Model()->create(['user_id' => $admin->id]); - AssetModel::factory()->count(1)->optiplexModel()->create(['user_id' => $admin->id]); + AssetModel::factory()->count(1)->macproModel()->create(['created_by' => $admin->id]); + AssetModel::factory()->count(1)->lenovoI5Model()->create(['created_by' => $admin->id]); + AssetModel::factory()->count(1)->optiplexModel()->create(['created_by' => $admin->id]); // Conference Phones - AssetModel::factory()->count(1)->polycomModel()->create(['user_id' => $admin->id]); - AssetModel::factory()->count(1)->polycomcxModel()->create(['user_id' => $admin->id]); + AssetModel::factory()->count(1)->polycomModel()->create(['created_by' => $admin->id]); + AssetModel::factory()->count(1)->polycomcxModel()->create(['created_by' => $admin->id]); // Tablets - AssetModel::factory()->count(1)->ipadModel()->create(['user_id' => $admin->id]); - AssetModel::factory()->count(1)->tab3Model()->create(['user_id' => $admin->id]); + AssetModel::factory()->count(1)->ipadModel()->create(['created_by' => $admin->id]); + AssetModel::factory()->count(1)->tab3Model()->create(['created_by' => $admin->id]); // Phones - AssetModel::factory()->count(1)->iphone11Model()->create(['user_id' => $admin->id]); - AssetModel::factory()->count(1)->iphone12Model()->create(['user_id' => $admin->id]); + AssetModel::factory()->count(1)->iphone11Model()->create(['created_by' => $admin->id]); + AssetModel::factory()->count(1)->iphone12Model()->create(['created_by' => $admin->id]); // Displays - AssetModel::factory()->count(1)->ultrafine()->create(['user_id' => $admin->id]); - AssetModel::factory()->count(1)->ultrasharp()->create(['user_id' => $admin->id]); + AssetModel::factory()->count(1)->ultrafine()->create(['created_by' => $admin->id]); + AssetModel::factory()->count(1)->ultrasharp()->create(['created_by' => $admin->id]); $src = public_path('/img/demo/models/'); $dst = 'models'.'/'; diff --git a/database/seeders/AssetSeeder.php b/database/seeders/AssetSeeder.php index 5fdc09bdb3..9d21e7f9fa 100644 --- a/database/seeders/AssetSeeder.php +++ b/database/seeders/AssetSeeder.php @@ -25,7 +25,7 @@ class AssetSeeder extends Seeder $this->ensureLocationsSeeded(); $this->ensureSuppliersSeeded(); - $this->admin = User::where('permissions->superuser', '1')->first() ?? User::factory()->firstAdmin()->create(); + $this->adminuser = User::where('permissions->superuser', '1')->first() ?? User::factory()->firstAdmin()->create(); $this->locationIds = Location::all()->pluck('id'); $this->supplierIds = Supplier::all()->pluck('id'); @@ -82,7 +82,7 @@ class AssetSeeder extends Seeder return fn($sequence) => [ 'rtd_location_id' => $this->locationIds->random(), 'supplier_id' => $this->supplierIds->random(), - 'user_id' => $this->admin->id, + 'created_by' => $this->adminuser->id, ]; } } diff --git a/database/seeders/CategorySeeder.php b/database/seeders/CategorySeeder.php index da542cff9e..137dea2aba 100755 --- a/database/seeders/CategorySeeder.php +++ b/database/seeders/CategorySeeder.php @@ -14,20 +14,20 @@ class CategorySeeder extends Seeder $admin = User::where('permissions->superuser', '1')->first() ?? User::factory()->firstAdmin()->create(); - Category::factory()->count(1)->assetLaptopCategory()->create(['user_id' => $admin->id]); - Category::factory()->count(1)->assetDesktopCategory()->create(['user_id' => $admin->id]); - Category::factory()->count(1)->assetTabletCategory()->create(['user_id' => $admin->id]); - Category::factory()->count(1)->assetMobileCategory()->create(['user_id' => $admin->id]); - Category::factory()->count(1)->assetDisplayCategory()->create(['user_id' => $admin->id]); - Category::factory()->count(1)->assetVoipCategory()->create(['user_id' => $admin->id]); - Category::factory()->count(1)->assetConferenceCategory()->create(['user_id' => $admin->id]); - Category::factory()->count(1)->accessoryKeyboardCategory()->create(['user_id' => $admin->id]); - Category::factory()->count(1)->accessoryMouseCategory()->create(['user_id' => $admin->id]); - Category::factory()->count(1)->consumablePaperCategory()->create(['user_id' => $admin->id]); - Category::factory()->count(1)->consumableInkCategory()->create(['user_id' => $admin->id]); - Category::factory()->count(1)->componentHddCategory()->create(['user_id' => $admin->id]); - Category::factory()->count(1)->componentRamCategory()->create(['user_id' => $admin->id]); - Category::factory()->count(1)->licenseGraphicsCategory()->create(['user_id' => $admin->id]); - Category::factory()->count(1)->licenseOfficeCategory()->create(['user_id' => $admin->id]); + Category::factory()->count(1)->assetLaptopCategory()->create(['created_by' => $admin->id]); + Category::factory()->count(1)->assetDesktopCategory()->create(['created_by' => $admin->id]); + Category::factory()->count(1)->assetTabletCategory()->create(['created_by' => $admin->id]); + Category::factory()->count(1)->assetMobileCategory()->create(['created_by' => $admin->id]); + Category::factory()->count(1)->assetDisplayCategory()->create(['created_by' => $admin->id]); + Category::factory()->count(1)->assetVoipCategory()->create(['created_by' => $admin->id]); + Category::factory()->count(1)->assetConferenceCategory()->create(['created_by' => $admin->id]); + Category::factory()->count(1)->accessoryKeyboardCategory()->create(['created_by' => $admin->id]); + Category::factory()->count(1)->accessoryMouseCategory()->create(['created_by' => $admin->id]); + Category::factory()->count(1)->consumablePaperCategory()->create(['created_by' => $admin->id]); + Category::factory()->count(1)->consumableInkCategory()->create(['created_by' => $admin->id]); + Category::factory()->count(1)->componentHddCategory()->create(['created_by' => $admin->id]); + Category::factory()->count(1)->componentRamCategory()->create(['created_by' => $admin->id]); + Category::factory()->count(1)->licenseGraphicsCategory()->create(['created_by' => $admin->id]); + Category::factory()->count(1)->licenseOfficeCategory()->create(['created_by' => $admin->id]); } } diff --git a/database/seeders/ConsumableSeeder.php b/database/seeders/ConsumableSeeder.php index 42527e1df8..de20141c7a 100644 --- a/database/seeders/ConsumableSeeder.php +++ b/database/seeders/ConsumableSeeder.php @@ -16,8 +16,8 @@ class ConsumableSeeder extends Seeder $admin = User::where('permissions->superuser', '1')->first() ?? User::factory()->firstAdmin()->create(); - Consumable::factory()->count(1)->cardstock()->create(['user_id' => $admin->id]); - Consumable::factory()->count(1)->paper()->create(['user_id' => $admin->id]); - Consumable::factory()->count(1)->ink()->create(['user_id' => $admin->id]); + Consumable::factory()->count(1)->cardstock()->create(['created_by' => $admin->id]); + Consumable::factory()->count(1)->paper()->create(['created_by' => $admin->id]); + Consumable::factory()->count(1)->ink()->create(['created_by' => $admin->id]); } } diff --git a/database/seeders/DepartmentSeeder.php b/database/seeders/DepartmentSeeder.php index 7406b97afb..7f20ee8cb9 100644 --- a/database/seeders/DepartmentSeeder.php +++ b/database/seeders/DepartmentSeeder.php @@ -23,32 +23,32 @@ class DepartmentSeeder extends Seeder Department::factory()->count(1)->hr()->create([ 'location_id' => $locationIds->random(), - 'user_id' => $admin->id, + 'created_by' => $admin->id, ]); Department::factory()->count(1)->engineering()->create([ 'location_id' => $locationIds->random(), - 'user_id' => $admin->id, + 'created_by' => $admin->id, ]); Department::factory()->count(1)->marketing()->create([ 'location_id' => $locationIds->random(), - 'user_id' => $admin->id, + 'created_by' => $admin->id, ]); Department::factory()->count(1)->client()->create([ 'location_id' => $locationIds->random(), - 'user_id' => $admin->id, + 'created_by' => $admin->id, ]); Department::factory()->count(1)->product()->create([ 'location_id' => $locationIds->random(), - 'user_id' => $admin->id, + 'created_by' => $admin->id, ]); Department::factory()->count(1)->silly()->create([ 'location_id' => $locationIds->random(), - 'user_id' => $admin->id, + 'created_by' => $admin->id, ]); } } diff --git a/database/seeders/DepreciationSeeder.php b/database/seeders/DepreciationSeeder.php index 349d8aff53..ed78c0b115 100644 --- a/database/seeders/DepreciationSeeder.php +++ b/database/seeders/DepreciationSeeder.php @@ -14,8 +14,8 @@ class DepreciationSeeder extends Seeder $admin = User::where('permissions->superuser', '1')->first() ?? User::factory()->firstAdmin()->create(); - Depreciation::factory()->count(1)->computer()->create(['user_id' => $admin->id]); - Depreciation::factory()->count(1)->display()->create(['user_id' => $admin->id]); - Depreciation::factory()->count(1)->mobilePhones()->create(['user_id' => $admin->id]); + Depreciation::factory()->count(1)->computer()->create(['created_by' => $admin->id]); + Depreciation::factory()->count(1)->display()->create(['created_by' => $admin->id]); + Depreciation::factory()->count(1)->mobilePhones()->create(['created_by' => $admin->id]); } } diff --git a/database/seeders/LicenseSeeder.php b/database/seeders/LicenseSeeder.php index 4868dd41e1..bc19727f7e 100644 --- a/database/seeders/LicenseSeeder.php +++ b/database/seeders/LicenseSeeder.php @@ -33,25 +33,25 @@ class LicenseSeeder extends Seeder License::factory()->count(1)->photoshop()->create([ 'category_id' => $categoryIds->random(), 'supplier_id' => $supplierIds->random(), - 'user_id' => $admin->id, + 'created_by' => $admin->id, ]); License::factory()->count(1)->acrobat()->create([ 'category_id' => $categoryIds->random(), 'supplier_id' => $supplierIds->random(), - 'user_id' => $admin->id, + 'created_by' => $admin->id, ]); License::factory()->count(1)->indesign()->create([ 'category_id' => $categoryIds->random(), 'supplier_id' => $supplierIds->random(), - 'user_id' => $admin->id, + 'created_by' => $admin->id, ]); License::factory()->count(1)->office()->create([ 'category_id' => $categoryIds->random(), 'supplier_id' => $supplierIds->random(), - 'user_id' => $admin->id, + 'created_by' => $admin->id, ]); } } diff --git a/database/seeders/ManufacturerSeeder.php b/database/seeders/ManufacturerSeeder.php index cbd70f4c3d..adc13dc73e 100644 --- a/database/seeders/ManufacturerSeeder.php +++ b/database/seeders/ManufacturerSeeder.php @@ -16,17 +16,17 @@ class ManufacturerSeeder extends Seeder $admin = User::where('permissions->superuser', '1')->first() ?? User::factory()->firstAdmin()->create(); - Manufacturer::factory()->count(1)->apple()->create(['user_id' => $admin->id]); - Manufacturer::factory()->count(1)->microsoft()->create(['user_id' => $admin->id]); - Manufacturer::factory()->count(1)->dell()->create(['user_id' => $admin->id]); - Manufacturer::factory()->count(1)->asus()->create(['user_id' => $admin->id]); - Manufacturer::factory()->count(1)->hp()->create(['user_id' => $admin->id]); - Manufacturer::factory()->count(1)->lenovo()->create(['user_id' => $admin->id]); - Manufacturer::factory()->count(1)->lg()->create(['user_id' => $admin->id]); - Manufacturer::factory()->count(1)->polycom()->create(['user_id' => $admin->id]); - Manufacturer::factory()->count(1)->adobe()->create(['user_id' => $admin->id]); - Manufacturer::factory()->count(1)->avery()->create(['user_id' => $admin->id]); - Manufacturer::factory()->count(1)->crucial()->create(['user_id' => $admin->id]); + Manufacturer::factory()->count(1)->apple()->create(['created_by' => $admin->id]); + Manufacturer::factory()->count(1)->microsoft()->create(['created_by' => $admin->id]); + Manufacturer::factory()->count(1)->dell()->create(['created_by' => $admin->id]); + Manufacturer::factory()->count(1)->asus()->create(['created_by' => $admin->id]); + Manufacturer::factory()->count(1)->hp()->create(['created_by' => $admin->id]); + Manufacturer::factory()->count(1)->lenovo()->create(['created_by' => $admin->id]); + Manufacturer::factory()->count(1)->lg()->create(['created_by' => $admin->id]); + Manufacturer::factory()->count(1)->polycom()->create(['created_by' => $admin->id]); + Manufacturer::factory()->count(1)->adobe()->create(['created_by' => $admin->id]); + Manufacturer::factory()->count(1)->avery()->create(['created_by' => $admin->id]); + Manufacturer::factory()->count(1)->crucial()->create(['created_by' => $admin->id]); $src = public_path('/img/demo/manufacturers/'); $dst = 'manufacturers'.'/'; diff --git a/database/seeders/StatuslabelSeeder.php b/database/seeders/StatuslabelSeeder.php index fbc6a9fb66..be36e7790d 100755 --- a/database/seeders/StatuslabelSeeder.php +++ b/database/seeders/StatuslabelSeeder.php @@ -16,22 +16,22 @@ class StatuslabelSeeder extends Seeder Statuslabel::factory()->rtd()->create([ 'name' => 'Ready to Deploy', - 'user_id' => $admin->id, + 'created_by' => $admin->id, ]); Statuslabel::factory()->pending()->create([ 'name' => 'Pending', - 'user_id' => $admin->id, + 'created_by' => $admin->id, ]); Statuslabel::factory()->archived()->create([ 'name' => 'Archived', - 'user_id' => $admin->id, + 'created_by' => $admin->id, ]); - Statuslabel::factory()->outForDiagnostics()->create(['user_id' => $admin->id]); - Statuslabel::factory()->outForRepair()->create(['user_id' => $admin->id]); - Statuslabel::factory()->broken()->create(['user_id' => $admin->id]); - Statuslabel::factory()->lost()->create(['user_id' => $admin->id]); + Statuslabel::factory()->outForDiagnostics()->create(['created_by' => $admin->id]); + Statuslabel::factory()->outForRepair()->create(['created_by' => $admin->id]); + Statuslabel::factory()->broken()->create(['created_by' => $admin->id]); + Statuslabel::factory()->lost()->create(['created_by' => $admin->id]); } } diff --git a/dev.docker-compose.yml b/dev.docker-compose.yml index 15272ce5c5..6cf4a1e2f2 100644 --- a/dev.docker-compose.yml +++ b/dev.docker-compose.yml @@ -1,3 +1,5 @@ +# Compose file to spin up a local Snipe-IT for development. + version: '3' services: @@ -7,44 +9,40 @@ services: dockerfile: Dockerfile.alpine container_name: snipeit ports: - - "8000:80" - volumes: - - ./storage/logs:/var/www/html/storage/logs + - "8000:80" depends_on: - - mariadb - - redis + redis: + # The default needs to be stated. + condition: service_started + mariadb: + condition: service_healthy + restart: true env_file: - - .env.docker - networks: - - snipeit-backend + - .env.dev.docker mariadb: - image: mariadb:10.6.4-focal + image: mariadb:11.5.2 volumes: - - db:/var/lib/mysql + - db:/var/lib/mysql env_file: - - .env.docker - networks: - - snipeit-backend + - .env.dev.docker ports: - "3306:3306" + healthcheck: + # https://mariadb.com/kb/en/using-healthcheck-sh/#compose-file-example + test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] + interval: 5s + timeout: 2s + retries: 5 redis: - image: redis:6.2.5-buster - networks: - - snipeit-backend + image: redis:7.4.0 mailhog: image: mailhog/mailhog:v1.0.1 ports: - # - 1025:1025 - - "8025:8025" - networks: - - snipeit-backend - + # - 1025:1025 + - "8025:8025" volumes: db: {} - -networks: - snipeit-backend: {} diff --git a/docker-compose.yml b/docker-compose.yml index c7c1983a4e..d830a94360 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,11 +1,13 @@ +# Compose file for production. + volumes: db_data: storage: services: app: - image: snipe/snipe-it:${APP_VERSION:-v6.4.1} - restart: always + image: snipe/snipe-it:${APP_VERSION:-v7.0.11} + restart: unless-stopped volumes: - storage:/var/lib/snipeit ports: @@ -18,8 +20,8 @@ services: - .env db: - image: mariadb:10.6.4-focal - restart: always + image: mariadb:11.5.2 + restart: unless-stopped volumes: - db_data:/var/lib/mysql environment: @@ -28,7 +30,8 @@ services: MYSQL_PASSWORD: ${DB_PASSWORD} MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} healthcheck: - test: mysqladmin ping -h 127.0.0.1 -u $$MYSQL_USER --password=$$MYSQL_PASSWORD + # https://mariadb.com/kb/en/using-healthcheck-sh/#compose-file-example + test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] interval: 5s timeout: 1s retries: 5 diff --git a/docker/entrypoint_alpine.sh b/docker/startup_alpine.sh similarity index 100% rename from docker/entrypoint_alpine.sh rename to docker/startup_alpine.sh diff --git a/docker/docker-entrypoint.sh b/docker/startup_alpine_fpm.sh similarity index 100% rename from docker/docker-entrypoint.sh rename to docker/startup_alpine_fpm.sh diff --git a/package-lock.json b/package-lock.json index d71c3f9fdd..5e6fe11052 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "bootstrap-colorpicker": "^2.5.3", "bootstrap-datepicker": "^1.10.0", "bootstrap-less": "^3.3.8", - "bootstrap-table": "1.23.0", + "bootstrap-table": "1.23.5", "canvas-confetti": "^1.9.3", "chart.js": "^2.9.4", "clipboard": "^2.0.11", @@ -23,10 +23,10 @@ "ekko-lightbox": "^5.1.1", "imagemin": "^8.0.1", "jquery-slimscroll": "^1.3.8", - "jquery-ui": "^1.13.3", + "jquery-ui": "^1.14.0", "jquery-validation": "^1.21.0", "jquery.iframe-transport": "^1.0.0", - "jspdf-autotable": "^3.8.2", + "jspdf-autotable": "^3.8.4", "less": "^4.2.0", "less-loader": "^6.0", "list.js": "^1.5.0", @@ -37,7 +37,7 @@ "signature_pad": "^4.2.0", "tableexport.jquery.plugin": "1.30.0", "tether": "^1.4.0", - "webpack": "^5.92.0" + "webpack": "^5.95.0" }, "devDependencies": { "all-contributors-cli": "^6.26.1", @@ -2106,8 +2106,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.56.10", - "license": "MIT", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -2115,15 +2116,17 @@ }, "node_modules/@types/eslint-scope": { "version": "3.7.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "node_modules/@types/estree": { - "version": "1.0.5", - "license": "MIT" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" }, "node_modules/@types/express": { "version": "4.17.21", @@ -2482,9 +2485,9 @@ } }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "bin": { "acorn": "bin/acorn" }, @@ -2499,14 +2502,6 @@ "acorn": "^8" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-node": { "version": "1.8.2", "license": "Apache-2.0", @@ -3693,9 +3688,9 @@ "license": "MIT" }, "node_modules/bootstrap-table": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/bootstrap-table/-/bootstrap-table-1.23.0.tgz", - "integrity": "sha512-fAIhu2CAqMsZWkzeFxXyh0yQA2DMBdB0tCdr1iF6bKr3c/Hf79cw5PykNt7NdtqLz/a0p192S8EKyT5lG4yrpw==", + "version": "1.23.5", + "resolved": "https://registry.npmjs.org/bootstrap-table/-/bootstrap-table-1.23.5.tgz", + "integrity": "sha512-9WByoSpJvA73gi2YYIlX6IWR74oZtBmSixul/Th8FTBtBd/kZRpbKESGTjhA3BA3AYTnfyY8Iy1KeRWPlV2GWQ==", "peerDependencies": { "jquery": "3" } @@ -3955,7 +3950,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.0", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "funding": [ { "type": "opencollective", @@ -3970,12 +3967,11 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -4082,7 +4078,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001616", + "version": "1.0.30001677", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001677.tgz", + "integrity": "sha512-fmfjsOlJUpMWu+mAAtZZZHz7UEwsUxIIvu1TJfO1HqFQvB/B+ii0xr9B5HpbZY/mC4XZ8SvjHJqtAY6pDPQEog==", "funding": [ { "type": "opencollective", @@ -4096,8 +4094,7 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/canvas-confetti": { "version": "1.9.3", @@ -5269,8 +5266,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.4.756", - "license": "ISC" + "version": "1.5.52", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.52.tgz", + "integrity": "sha512-xtoijJTZ+qeucLBDNztDOuQBE1ksqjvNjvqFoST3nGC7fSpqJ+X6BdTBaY5BHG+IhWWmpc6b/KfpeuEDupEPOQ==" }, "node_modules/elliptic": { "version": "6.5.5", @@ -5310,9 +5308,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", - "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -5403,8 +5401,9 @@ "license": "MIT" }, "node_modules/escalade": { - "version": "3.1.2", - "license": "MIT", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "engines": { "node": ">=6" } @@ -7067,10 +7066,11 @@ "license": "BSD-2-Clause" }, "node_modules/jquery-ui": { - "version": "1.13.3", - "license": "MIT", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.14.0.tgz", + "integrity": "sha512-mPfYKBoRCf0MzaT2cyW5i3IuZ7PfTITaasO5OFLAQxrHuI+ZxruPa+4/K1OMNT8oElLWGtIxc9aRbyw20BKr8g==", "dependencies": { - "jquery": ">=1.8.0 <4.0.0" + "jquery": ">=1.12.0 <5.0.0" } }, "node_modules/jquery-validation": { @@ -7181,8 +7181,9 @@ } }, "node_modules/jspdf-autotable": { - "version": "3.8.2", - "license": "MIT", + "version": "3.8.4", + "resolved": "https://registry.npmjs.org/jspdf-autotable/-/jspdf-autotable-3.8.4.tgz", + "integrity": "sha512-rSffGoBsJYX83iTRv8Ft7FhqfgEL2nLpGAIiqruEQQ3e4r0qdLFbPUB7N9HAle0I3XgpisvyW751VHCqKUVOgQ==", "peerDependencies": { "jspdf": "^2.5.1" } @@ -8110,8 +8111,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.14", - "license": "MIT" + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -8562,8 +8564,9 @@ "optional": true }, "node_modules/picocolors": { - "version": "1.0.0", - "license": "ISC" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -10716,7 +10719,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.15", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "funding": [ { "type": "opencollective", @@ -10731,10 +10736,9 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -10879,20 +10883,19 @@ "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.92.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz", - "integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==", + "version": "5.96.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", + "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", "@webassemblyjs/ast": "^1.12.1", "@webassemblyjs/wasm-edit": "^1.12.1", "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", diff --git a/package.json b/package.json index 468c6c2891..8ad15179a0 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "bootstrap-colorpicker": "^2.5.3", "bootstrap-datepicker": "^1.10.0", "bootstrap-less": "^3.3.8", - "bootstrap-table": "1.23.0", + "bootstrap-table": "1.23.5", "canvas-confetti": "^1.9.3", "chart.js": "^2.9.4", "clipboard": "^2.0.11", @@ -43,10 +43,10 @@ "ekko-lightbox": "^5.1.1", "imagemin": "^8.0.1", "jquery-slimscroll": "^1.3.8", - "jquery-ui": "^1.13.3", + "jquery-ui": "^1.14.0", "jquery-validation": "^1.21.0", "jquery.iframe-transport": "^1.0.0", - "jspdf-autotable": "^3.8.2", + "jspdf-autotable": "^3.8.4", "less": "^4.2.0", "less-loader": "^6.0", "list.js": "^1.5.0", @@ -57,6 +57,6 @@ "signature_pad": "^4.2.0", "tableexport.jquery.plugin": "1.30.0", "tether": "^1.4.0", - "webpack": "^5.92.0" + "webpack": "^5.95.0" } } diff --git a/public/css/build/app.css b/public/css/build/app.css index f70346905038f6fad5b9c162441013e2584d412a..d35eebb0a633f49ced37185a5c9d53b93b1997ad 100644 GIT binary patch delta 1322 zcmb7EL2DC16sDSj2GL?G(dywf9z>dnY1-OmOM_xsi?)Xm-P!EW$<8`EX;MoG zo&-;&gJ;2$-h>4`=s(bt7f+(#T`!*1+1+FtOImPGGw;3m-uK@7-hTcx@chfb>nE8E zb-ji(1bNt?f>^n^Rd z5oX)NmZgh`Y7U>GI)8*3J`t!hKybOM=K=B8*Mpj*x=v;PX9*Xt6|$lATHeJQRV+|d zk6Jw_vzxheK2i^|uq4s^Ay$)3g)fomP^JZSKn%m(5cT-Th?*;(4!)OPr7{3bE-cg( z*fXFi2wq2_K|Q^(eV}i!Qb;EanN&{YQm!vZ*ba%Sj39HL=? zS?FHd9QhKP>pjc16{*0YzNgF9H8Y||3ZULEjkW={^)autkLnhhj1DayO%$V(Uq@cU zcTlMZI7*}&qBR@uLx=_X2VfDsJrm)r7qZk3k};hsdGwTSj3As!_jJQ+<)Altru?ZUpdk9}KOAcVUo zlMNRWuNZHVUi=Rj#+FRRn!oFb`(qim=@QQKMc7EYp^L20?-blfmXD_f11W%p)J$wyq>B+=L>R@1sUQ zgeDZW8$9mm_Cn_j^`IuHY*RTrtk1=788+0dWj(xG!2(sZa_Vi0t!HA{P-|pkNkTcH zqrF2#AW^kWnU?>OKMeQ2z=7H+#MORkygh&KLv#Y5$%T!Y0{bPX2!gkfF{m$#hnM=k zFD2B=^h~VZmKAl9zMmNiWSSyzg%QN?9@nD^4s8)z{Y;;Y8PQNruw1sNP8Z|q+47{? zT8gXRORtgu7rz*|e%id>QijW?<+WP_=7(3B+cz^fdb7&)zTsWwWpGX~xZVrhiyAZ?tk@*}U9AK^Op5rZ*e_ diff --git a/public/css/dist/all.css b/public/css/dist/all.css index 8957c009958b53a481e4727f6d8c545aefa21e65..bd004f657a06a51d14b71f72a98be5107fab7b55 100644 GIT binary patch delta 6843 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 delta 5196 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 C?`6LL diff --git a/public/css/dist/bootstrap-table.css b/public/css/dist/bootstrap-table.css index 29f63a0968e0f1a682774b182b83d079f78d2607..8eb04d28a623122ec69b6af57990708588cc64d5 100644 GIT binary patch literal 12904 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 TeQ#a4tzQU;4R^sB+rR%8Ri3gK literal 10837 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 NU=MkK!XIwD{U4YpYl{E? diff --git a/public/js/build/app.js b/public/js/build/app.js index c5c6a5cd6b0dce71db851fb5ce9a652f2ec09342..3c80510129f314dbb9cc2ba1dba387ca0db1933c 100644 GIT binary patch delta 305 zcmbPr!uJ0G+YM6$1XMKAO7oISGV}8kG&B{exh5xyNKC#jAj8NtdAYEP5JEDwEUyHt zV4H}-isZDzl4B&*5R`V$_^0AR-GieZQD8F4J#`m>`=zd6B5f##1mlzQEGBveO4IwSm<%T`U>4lo`-0Jvkr^n~e)A1}2ijyw@>()o*jIn+%? zTejD}OMK2eB0g=O8bBj4+awN7RJ8&(9yp{>3@1xU(wWjlC4hqI*yf|c3dCBYf<`)& zOQitfWCp~gOkK3ICGj+KRlLnyJ{?X(h6PV@H>48rJ)0MbaziwgMX{k2=EF9BoplF4 z#&c%}-<~JWm7|ABIUb=F@lb2bE-PA0{W-1PlA`ZTq~4!AXEMekJn(4bX~-q-uS~wt zBcsN?c(0tlu#bl~i9`6oTDY9Ow%bDSHLE2<&8lT^L*$h!qM56RUQYdI*S;tVTmQwi zY6>l^luDtIC0KP`Op6gk+UJJH!DTk(@-U7rSfpjs>-My*=K~8kuogJXuprV^2J)Dg zLDa&i(}Q)xbqV$LXjVmhSU$5wN%zlv*b{lJs816kL%#1N`5*7O)5kpZi`v6G0r7fe z=-Sj`UEQaPwo7cT$7@?nshY*ipp6?8vKm%z*MehUpNw+DQ7$q5IJ2ZL4PT8D&l2IU l?fOmvaR@PkIE<`GFm3UL&13~_u|-#M|m@eA8vXRiPN diff --git a/public/js/build/app.js.LICENSE.txt b/public/js/build/app.js.LICENSE.txt index cb3342c83915fc836e3e014c75cfccfee4e7a4dd..931b6a988290c0947c4b383482c02ed16cd3af89 100644 GIT binary patch delta 16 XcmeC+?BLummx)kAA8gBMERfnJw15os0Yz{Td06aDt7vU6$!&Y-B`L{G zvD6AmMZjfu3)){Dv>>>Q;JCPehxLIXKAGJaadvimpeQV$_-NUR$V>L*rfpKjoz2Xd zIsdum{O9{$-+!|8Ld%KmEvvh@uB5Kyu9Pm*KJ$aSM@{w?6AzhKJaMw8c&exPCfdE* z98TFhm6PD0CCd$Ed(2;^uuU$osn}tyRsBthPD;EbY>m!*$y~HBnazOB9^Y?5!D&O% zcE~P8ry;WpjfTd@k!^F|DiOT5atQ7!L%FE4OyE070a$DJ%${=O7(PZ{Ek~=8lP58q z6_seOt5)%o1#&wnxrvlaDV;p6bn;{aEh#LXSX?ZS8z)fvOf<;?&(B98dSn6WOr}Q` zp(_@HK}p`km|I?(Un(N5%s zgPmv$^p%SyTK53jm}1zx{1VzhyVsz%P0+p`Wt5YGDA=&xt|?(sK{}YD1YT1DY;G)i z*}O?_X6{?jtZE8_#}+&uQb0NcDA|BA;rk89V~#0+J%_n;*t7xJY2~9x}w}W7e$m%JDC*>DWp}_ea$TFvFb8v3IdC;E&G4(g%ADM zRe!VWYiSLJbkg8e+LVC1prMFOgML4o5jo%|4f$Rr?2}uSYG#v94~80u9wb4{uY^V* zXj4LAH5dpJw_j-uDLz?O`~?D>z5{;;zpcT!Ft1)3WuH}DJ*du2R6i*sE*ITagWI{d z{cqlhS0#w27ULaU{oF><;0p%yP*C$~@)AW0HxM;Ulx3}YJ0l^*+vFu`AguZo5^N;? zpf6&$zcC~?MJHjlr%?^~1%AQ=qBkofrh_b#0})x%+Nn~9Kj(xvI=G`A|1*y1?+ti< zLINH1rP#0rtIm*S!qF5=y0XinnuL8`Y| zDCYQ+Ca8K>91R&M%&y8VY@(lHUf{TDdWz?<37)C9rb*rr;9)wFZljS={EIm>wU~b} zP8M{^6#hK}>C033DY?D;`0UAEayv`>&VNAshn*W!Rxm&_(wb3Z@LHpF`rHu8&YadV)TeAr z38gV*^G^uLCRYp$>sY>KBX%W5M^?1C;aPIPr)Z=C>i=MMz?m~bI-X$|lkbM3pEJfO z{aVOkEs*^hWi71GyT2APP0&3c*c}UkZR~Y0ZXC%=&=1R>&9cLhIVl$NR7M!n1X$lE z%z>kQLJqvm3j|X8h4FCCETqG{exVqC_)*9Nq_1W6dsM2m!6R6~}9opCodJZyO&=0VsI%Krz|rS6S#GNv4(EkF z%j$$qn{(Mx6N7l@M?4zVJ|Rl9_lo73#JS{z_m)czsj_ET&@XGQQlk{S!B#!mUcAO4nL%7e4UT+L!{xJSda}<)PmUZ=q~Ur_q57nw@<>bXj0^5^tiv z92PkTjQK*iVm@e}iaQfH2X6RG{1S4{W@p2~V{D^-Oe~~79~1v=gQ`Ap zEN$--KTZI9VL$`}3GF^FN^|2NZkb`7K4`^xF^l$AT63M|D2;jR>DXH9@3jn8i$?!t z%%%pSlqN@G>V?k^Tg#~Ewg?<-xh7a4@RrpEXP@N-s3@=?diWjd(n65_V?~+O#_P6O zVSgl|&sJ92u?t|sIcpC55a7+3^BxpNJ2aOAh*NxpY@1Ev%Jt z@)Dv-@4QdS5I}fL5Fmezv=?S}NiI0QjrBFXOUi?uE@=$B)g=`|cbAk8>mHVTP_{G4#zH9TaD1yYmWtb?Q#m8>30Xh}YoB#j- delta 11729 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 Z*ENlW5#%~yu9VcY#L}FSVjU1y697N;lf?i4 diff --git a/public/js/dist/bootstrap-table-locale-all.min.js b/public/js/dist/bootstrap-table-locale-all.min.js index b0ed3c69bd10dc1a711ede8b91a790fa7b61f173..760f77ba819698983822a09c66510308d6b8ef25 100644 GIT binary patch delta 23072 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 delta 4076 zcmeHK`)?H271mi|@6M*Kp@vZ6-DWbxfh9YBgpdFZ1;4;13)sfQB@GJKyR+W0XJ_nr z*j=1PkVFxnKyk0!tEP#Y(j;x#DuHgBsY+UcXp)we1XU_XRVA#dc}S%MOF>Rb6?*5j zyJM%1KOn#C?%eM?-#z!7Gv}Ut>1ycXGr=Qgpnm-Kf9Xjos=yCuby+24NP<=;XthXH zQLZ+r$VsHv4rp8~t_s73s0z!uPhl&4142@-MVcn|%MKk+LUZy{sI!IR|Ce5z8yGeO zHOK9W%dxfca@mlixcz}I!?uNSIj+XWI71UyO;^RF&NZrJ`X-1lD9u06#O+$A;)Z9c z@w?46WM~w2-qI{kPgy0)>H;evB*xiM)X!4?g+56X(&W@JSWO=;C6Cx4+K9ysHiE8?H5KwImOC&@5X9; zM6X)ho73t>1hr34``JDTrL-I?8`&%#m!1o@3##Q789oe8;#W7-nVnbRwg9NODH8$b zX!yhy#{J14mET@CWqxApCm}y|>~W8ZKj{qyoM`0Bww|QRrIMfYdORkH__pm{;PUNX zIU4j)!!Azi!U=Rz<69mm@a5fqoXvM|kB^_tSU%FEZl}oaYgll)$&P6@q!JFM*F7n~cI z#dIKxX}`2-#CLd!tj=G*Fj!2ag@;|-5u%1=`32jn!4f7&-kSY2tyeY(dG4pw=~| z)1vi*+-buu17_1a$Us>!)l=oPFwRxN4gWRY2N%%9D)Rr#@zQyTL>oT- z>pNcg0;~Xh_2m3H$+X<^l4*|K2rJ>Uf-k-5tb$L_cI3wBHs>xf8y3S(U;kL@T}084 z%C{GCZT>6<{#z@`IJheqHUIu4X!BiFQAXrDwidRGlKE?(+`WsOWj)NtK!@VZn+-kSPf-|=t!~e zF{r9yxtIs36zW5&h~GX{d&?Fv`4i=SXkc6@bcfHzxcW2A+ z)ZYfeTj-fsL!xXly$bf14Jwk7CHwA%17!7jh~vHTUF7@gVVPNZ1e(ED`{WO;P zo$u)JqGn$1fhT<-j)Yx;_o6TZh~L~CS-(+8bq#+Fv^ZJAEyIFUY z%P3kX{C##Anbcx|pG+Q>3(gaE6ueu_d_x9y7L~%@Imrk6z(VOTWmY{3Px*beP%E95=AR0szb00j-R#XRRV9(_hPYp0N?cStUOu-S20?l@+~=4;=AoR-=yN#if6P0$vqdK z!WB1j7vT}V9HC1$+WpZczdU2NGiUQ{SDGOAkP(MMC9+MP2YW4Cb_^_zg5^Jcn0Q$I|D~% fQTEVy^pm{RR~-A@=oHtTFs=1(a-D diff --git a/public/js/dist/bootstrap-table.js b/public/js/dist/bootstrap-table.js index bdc1127c52237d1ca3a1b15b3642ffd18efdabaf..a48e93b6349a4d1a5a00e6765630bd34375e8027 100644 GIT binary patch literal 2105599 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

iQ=1uTE+0?M$t8UXHz32*XjigA2&vD)#ykN= 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%0Aak;r--uLoXHtUYzAD0@6+2v9l`F7 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

!gDNL%cqV-Cn)^8JbOzGn;AkI^)UY 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�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%0AD7eUzh*p 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 L4-EAG(uDs9pnbBU literal 0 HcmV?d00001 diff --git a/public/vendor/livewire/livewire.esm.js b/public/vendor/livewire/livewire.esm.js index 0f6daa54ec..2d7ef4791c 100644 --- a/public/vendor/livewire/livewire.esm.js +++ b/public/vendor/livewire/livewire.esm.js @@ -1432,10 +1432,10 @@ var require_module_cjs = __commonJS({ }); } function cleanupElement(el) { - if (el._x_cleanups) { - while (el._x_cleanups.length) - el._x_cleanups.pop()(); - } + var _a, _b; + (_a = el._x_effects) == null ? void 0 : _a.forEach(dequeueJob); + while ((_b = el._x_cleanups) == null ? void 0 : _b.length) + el._x_cleanups.pop()(); } var observer = new MutationObserver(onMutate); var currentlyObserving = false; @@ -1673,27 +1673,23 @@ var require_module_cjs = __commonJS({ magics[name] = callback; } function injectMagics(obj, el) { + let memoizedUtilities = getUtilities(el); Object.entries(magics).forEach(([name, callback]) => { - let memoizedUtilities = null; - function getUtilities() { - if (memoizedUtilities) { - return memoizedUtilities; - } else { - let [utilities, cleanup] = getElementBoundUtilities(el); - memoizedUtilities = { interceptor, ...utilities }; - onElRemoved(el, cleanup); - return memoizedUtilities; - } - } Object.defineProperty(obj, `$${name}`, { get() { - return callback(el, getUtilities()); + return callback(el, memoizedUtilities); }, enumerable: false }); }); return obj; } + function getUtilities(el) { + let [utilities, cleanup] = getElementBoundUtilities(el); + let utils = { interceptor, ...utilities }; + onElRemoved(el, cleanup); + return utils; + } function tryCatch(el, expression, callback, ...args) { try { return callback(...args); @@ -2067,8 +2063,8 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); } function destroyTree(root, walker = walk) { walker(root, (el) => { - cleanupAttributes(el); cleanupElement(el); + cleanupAttributes(el); }); } function warnAboutMissingPlugins() { @@ -2561,7 +2557,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); } } function bindInputValue(el, value) { - if (el.type === "radio") { + if (isRadio(el)) { if (el.attributes.value === void 0) { el.value = value; } @@ -2572,7 +2568,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); el.checked = checkedAttrLooseCompare(el.value, value); } } - } else if (el.type === "checkbox") { + } else if (isCheckbox(el)) { if (Number.isInteger(value)) { el.value = value; } else if (!Array.isArray(value) && typeof value !== "boolean" && ![null, void 0].includes(value)) { @@ -2648,34 +2644,37 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); } return rawValue ? Boolean(rawValue) : null; } + var booleanAttributes = /* @__PURE__ */ new Set([ + "allowfullscreen", + "async", + "autofocus", + "autoplay", + "checked", + "controls", + "default", + "defer", + "disabled", + "formnovalidate", + "inert", + "ismap", + "itemscope", + "loop", + "multiple", + "muted", + "nomodule", + "novalidate", + "open", + "playsinline", + "readonly", + "required", + "reversed", + "selected", + "shadowrootclonable", + "shadowrootdelegatesfocus", + "shadowrootserializable" + ]); function isBooleanAttr(attrName) { - const booleanAttributes = [ - "disabled", - "checked", - "required", - "readonly", - "open", - "selected", - "autofocus", - "itemscope", - "multiple", - "novalidate", - "allowfullscreen", - "allowpaymentrequest", - "formnovalidate", - "autoplay", - "controls", - "loop", - "muted", - "playsinline", - "default", - "ismap", - "reversed", - "async", - "defer", - "nomodule" - ]; - return booleanAttributes.includes(attrName); + return booleanAttributes.has(attrName); } function attributeShouldntBePreservedIfFalsy(name) { return !["aria-pressed", "aria-checked", "aria-expanded", "aria-selected"].includes(name); @@ -2708,6 +2707,12 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); } return attr; } + function isCheckbox(el) { + return el.type === "checkbox" || el.localName === "ui-checkbox" || el.localName === "ui-switch"; + } + function isRadio(el) { + return el.type === "radio" || el.localName === "ui-radio"; + } function debounce2(func, wait) { var timeout; return function() { @@ -2776,10 +2781,10 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); return stores[name]; } stores[name] = value; + initInterceptors(stores[name]); if (typeof value === "object" && value !== null && value.hasOwnProperty("init") && typeof value.init === "function") { stores[name].init(); } - initInterceptors(stores[name]); } function getStores() { return stores; @@ -2861,7 +2866,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); get raw() { return raw; }, - version: "3.14.1", + version: "3.14.3", flushAndStopDeferringMutations, dontAutoEvaluateFunctions, disableEffectScheduling, @@ -3070,7 +3075,10 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); placeInDom(el._x_teleport, target2, modifiers); }); }; - cleanup(() => clone2.remove()); + cleanup(() => mutateDom(() => { + clone2.remove(); + destroyTree(clone2); + })); }); var teleportContainerDuringClone = document.createElement("div"); function getTarget(expression) { @@ -3294,7 +3302,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); setValue(getInputValue(el, modifiers, e, getValue())); }); if (modifiers.includes("fill")) { - if ([void 0, null, ""].includes(getValue()) || el.type === "checkbox" && Array.isArray(getValue()) || el.tagName.toLowerCase() === "select" && el.multiple) { + if ([void 0, null, ""].includes(getValue()) || isCheckbox(el) && Array.isArray(getValue()) || el.tagName.toLowerCase() === "select" && el.multiple) { setValue(getInputValue(el, modifiers, { target: el }, getValue())); } } @@ -3334,7 +3342,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); return mutateDom(() => { if (event instanceof CustomEvent && event.detail !== void 0) return event.detail !== null && event.detail !== void 0 ? event.detail : event.target.value; - else if (el.type === "checkbox") { + else if (isCheckbox(el)) { if (Array.isArray(currentValue)) { let newValue = null; if (modifiers.includes("number")) { @@ -3365,7 +3373,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); }); } else { let newValue; - if (el.type === "radio") { + if (isRadio(el)) { if (event.target.checked) { newValue = event.target.value; } else { @@ -3558,7 +3566,10 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); el._x_lookup = {}; effect3(() => loop(el, iteratorNames, evaluateItems, evaluateKey)); cleanup(() => { - Object.values(el._x_lookup).forEach((el2) => el2.remove()); + Object.values(el._x_lookup).forEach((el2) => mutateDom(() => { + destroyTree(el2); + el2.remove(); + })); delete el._x_prevKeys; delete el._x_lookup; }); @@ -3627,11 +3638,12 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); } for (let i = 0; i < removes.length; i++) { let key = removes[i]; - if (!!lookup[key]._x_effects) { - lookup[key]._x_effects.forEach(dequeueJob); - } - lookup[key].remove(); - lookup[key] = null; + if (!(key in lookup)) + continue; + mutateDom(() => { + destroyTree(lookup[key]); + lookup[key].remove(); + }); delete lookup[key]; } for (let i = 0; i < moves.length; i++) { @@ -3752,12 +3764,10 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); }); el._x_currentIfEl = clone2; el._x_undoIf = () => { - walk(clone2, (node) => { - if (!!node._x_effects) { - node._x_effects.forEach(dequeueJob); - } + mutateDom(() => { + destroyTree(clone2); + clone2.remove(); }); - clone2.remove(); delete el._x_currentIfEl; }; return clone2; @@ -3812,9 +3822,9 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); } }); -// ../alpine/packages/collapse/dist/module.cjs.js +// ../../../../usr/local/lib/node_modules/@alpinejs/collapse/dist/module.cjs.js var require_module_cjs2 = __commonJS({ - "../alpine/packages/collapse/dist/module.cjs.js"(exports, module) { + "../../../../usr/local/lib/node_modules/@alpinejs/collapse/dist/module.cjs.js"(exports, module) { var __defProp2 = Object.defineProperty; var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; var __getOwnPropNames2 = Object.getOwnPropertyNames; @@ -3887,7 +3897,7 @@ var require_module_cjs2 = __commonJS({ start: { height: current + "px" }, end: { height: full + "px" } }, () => el._x_isShown = true, () => { - if (Math.abs(el.getBoundingClientRect().height - full) < 1) { + if (el.getBoundingClientRect().height == full) { el.style.overflow = null; } }); @@ -3933,9 +3943,9 @@ var require_module_cjs2 = __commonJS({ } }); -// ../alpine/packages/focus/dist/module.cjs.js +// ../../../../usr/local/lib/node_modules/@alpinejs/focus/dist/module.cjs.js var require_module_cjs3 = __commonJS({ - "../alpine/packages/focus/dist/module.cjs.js"(exports, module) { + "../../../../usr/local/lib/node_modules/@alpinejs/focus/dist/module.cjs.js"(exports, module) { var __create2 = Object.create; var __defProp2 = Object.defineProperty; var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; @@ -4935,9 +4945,9 @@ var require_module_cjs3 = __commonJS({ } }); -// ../alpine/packages/persist/dist/module.cjs.js +// ../../../../usr/local/lib/node_modules/@alpinejs/persist/dist/module.cjs.js var require_module_cjs4 = __commonJS({ - "../alpine/packages/persist/dist/module.cjs.js"(exports, module) { + "../../../../usr/local/lib/node_modules/@alpinejs/persist/dist/module.cjs.js"(exports, module) { var __defProp2 = Object.defineProperty; var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; var __getOwnPropNames2 = Object.getOwnPropertyNames; @@ -5024,9 +5034,9 @@ var require_module_cjs4 = __commonJS({ } }); -// ../alpine/packages/intersect/dist/module.cjs.js +// ../../../../usr/local/lib/node_modules/@alpinejs/intersect/dist/module.cjs.js var require_module_cjs5 = __commonJS({ - "../alpine/packages/intersect/dist/module.cjs.js"(exports, module) { + "../../../../usr/local/lib/node_modules/@alpinejs/intersect/dist/module.cjs.js"(exports, module) { var __defProp2 = Object.defineProperty; var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; var __getOwnPropNames2 = Object.getOwnPropertyNames; @@ -5106,8 +5116,80 @@ var require_module_cjs5 = __commonJS({ } }); -// ../alpine/packages/anchor/dist/module.cjs.js +// node_modules/@alpinejs/resize/dist/module.cjs.js var require_module_cjs6 = __commonJS({ + "node_modules/@alpinejs/resize/dist/module.cjs.js"(exports, module) { + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all2) => { + for (var name in all2) + __defProp2(target, name, { get: all2[name], enumerable: true }); + }; + var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); + var module_exports = {}; + __export(module_exports, { + default: () => module_default, + resize: () => src_default + }); + module.exports = __toCommonJS(module_exports); + function src_default(Alpine19) { + Alpine19.directive("resize", Alpine19.skipDuringClone((el, { value, expression, modifiers }, { evaluateLater, cleanup }) => { + let evaluator = evaluateLater(expression); + let evaluate = (width, height) => { + evaluator(() => { + }, { scope: { "$width": width, "$height": height } }); + }; + let off = modifiers.includes("document") ? onDocumentResize(evaluate) : onElResize(el, evaluate); + cleanup(() => off()); + })); + } + function onElResize(el, callback) { + let observer = new ResizeObserver((entries) => { + let [width, height] = dimensions(entries); + callback(width, height); + }); + observer.observe(el); + return () => observer.disconnect(); + } + var documentResizeObserver; + var documentResizeObserverCallbacks = /* @__PURE__ */ new Set(); + function onDocumentResize(callback) { + documentResizeObserverCallbacks.add(callback); + if (!documentResizeObserver) { + documentResizeObserver = new ResizeObserver((entries) => { + let [width, height] = dimensions(entries); + documentResizeObserverCallbacks.forEach((i) => i(width, height)); + }); + documentResizeObserver.observe(document.documentElement); + } + return () => { + documentResizeObserverCallbacks.delete(callback); + }; + } + function dimensions(entries) { + let width, height; + for (let entry of entries) { + width = entry.borderBoxSize[0].inlineSize; + height = entry.borderBoxSize[0].blockSize; + } + return [width, height]; + } + var module_default = src_default; + } +}); + +// ../alpine/packages/anchor/dist/module.cjs.js +var require_module_cjs7 = __commonJS({ "../alpine/packages/anchor/dist/module.cjs.js"(exports, module) { var __defProp2 = Object.defineProperty; var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; @@ -6645,7 +6727,7 @@ var require_nprogress = __commonJS({ }); // ../alpine/packages/morph/dist/module.cjs.js -var require_module_cjs7 = __commonJS({ +var require_module_cjs8 = __commonJS({ "../alpine/packages/morph/dist/module.cjs.js"(exports, module) { var __defProp2 = Object.defineProperty; var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; @@ -7006,9 +7088,9 @@ var require_module_cjs7 = __commonJS({ } }); -// ../alpine/packages/mask/dist/module.cjs.js -var require_module_cjs8 = __commonJS({ - "../alpine/packages/mask/dist/module.cjs.js"(exports, module) { +// ../../../../usr/local/lib/node_modules/@alpinejs/mask/dist/module.cjs.js +var require_module_cjs9 = __commonJS({ + "../../../../usr/local/lib/node_modules/@alpinejs/mask/dist/module.cjs.js"(exports, module) { var __defProp2 = Object.defineProperty; var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; var __getOwnPropNames2 = Object.getOwnPropertyNames; @@ -8509,7 +8591,8 @@ var import_collapse = __toESM(require_module_cjs2()); var import_focus = __toESM(require_module_cjs3()); var import_persist2 = __toESM(require_module_cjs4()); var import_intersect = __toESM(require_module_cjs5()); -var import_anchor = __toESM(require_module_cjs6()); +var import_resize = __toESM(require_module_cjs6()); +var import_anchor = __toESM(require_module_cjs7()); // js/plugins/navigate/history.js var Snapshot = class { @@ -8660,7 +8743,7 @@ function extractDestinationFromLink(linkEl) { return createUrlObjectFromString(linkEl.getAttribute("href")); } function createUrlObjectFromString(urlString) { - return new URL(urlString, document.baseURI); + return urlString !== null && new URL(urlString, document.baseURI); } function getUriStringFromUrlObject(urlObject) { return urlObject.pathname + urlObject.search + urlObject.hash; @@ -8782,8 +8865,10 @@ function restoreScrollPositionOrScrollToTop() { } }; queueMicrotask(() => { - scroll(document.body); - document.querySelectorAll(["[x-navigate\\:scroll]", "[wire\\:scroll]"]).forEach(scroll); + queueMicrotask(() => { + scroll(document.body); + document.querySelectorAll(["[x-navigate\\:scroll]", "[wire\\:scroll]"]).forEach(scroll); + }); }); } @@ -8932,6 +9017,44 @@ function injectStyles() { document.head.appendChild(style); } +// js/plugins/navigate/popover.js +function packUpPersistedPopovers(persistedEl) { + persistedEl.querySelectorAll(":popover-open").forEach((el) => { + el.setAttribute("data-navigate-popover-open", ""); + let animations = el.getAnimations(); + el._pausedAnimations = animations.map((animation) => ({ + keyframes: animation.effect.getKeyframes(), + options: { + duration: animation.effect.getTiming().duration, + easing: animation.effect.getTiming().easing, + fill: animation.effect.getTiming().fill, + iterations: animation.effect.getTiming().iterations + }, + currentTime: animation.currentTime, + playState: animation.playState + })); + animations.forEach((i) => i.pause()); + }); +} +function unPackPersistedPopovers(persistedEl) { + persistedEl.querySelectorAll("[data-navigate-popover-open]").forEach((el) => { + el.removeAttribute("data-navigate-popover-open"); + queueMicrotask(() => { + if (!el.isConnected) + return; + el.showPopover(); + el.getAnimations().forEach((i) => i.finish()); + if (el._pausedAnimations) { + el._pausedAnimations.forEach(({ keyframes, options, currentTime, now, playState }) => { + let animation = el.animate(keyframes, options); + animation.currentTime = currentTime; + }); + delete el._pausedAnimations; + } + }); + }); +} + // js/plugins/navigate/page.js var oldBodyScriptTagHashes = []; var attributesExemptFromScriptTagHashing = [ @@ -9070,7 +9193,7 @@ var autofocus = false; function navigate_default(Alpine19) { Alpine19.navigate = (url) => { let destination = createUrlObjectFromString(url); - let prevented = fireEventForOtherLibariesToHookInto("alpine:navigate", { + let prevented = fireEventForOtherLibrariesToHookInto("alpine:navigate", { url: destination, history: false, cached: false @@ -9087,17 +9210,21 @@ function navigate_default(Alpine19) { let shouldPrefetchOnHover = modifiers.includes("hover"); shouldPrefetchOnHover && whenThisLinkIsHoveredFor(el, 60, () => { let destination = extractDestinationFromLink(el); + if (!destination) + return; prefetchHtml(destination, (html, finalDestination) => { storeThePrefetchedHtmlForWhenALinkIsClicked(html, destination, finalDestination); }); }); whenThisLinkIsPressed(el, (whenItIsReleased) => { let destination = extractDestinationFromLink(el); + if (!destination) + return; prefetchHtml(destination, (html, finalDestination) => { storeThePrefetchedHtmlForWhenALinkIsClicked(html, destination, finalDestination); }); whenItIsReleased(() => { - let prevented = fireEventForOtherLibariesToHookInto("alpine:navigate", { + let prevented = fireEventForOtherLibrariesToHookInto("alpine:navigate", { url: destination, history: false, cached: false @@ -9111,7 +9238,7 @@ function navigate_default(Alpine19) { function navigateTo(destination, shouldPushToHistoryState = true) { showProgressBar && showAndStartProgressBar(); fetchHtmlOrUsePrefetchedHtml(destination, (html, finalDestination) => { - fireEventForOtherLibariesToHookInto("alpine:navigating"); + fireEventForOtherLibrariesToHookInto("alpine:navigating"); restoreScroll && storeScrollInformationInHtmlBeforeNavigatingAway(); showProgressBar && finishAndHideProgressBar(); cleanupAlpineElementsOnThePageThatArentInsideAPersistedElement(); @@ -9119,6 +9246,7 @@ function navigate_default(Alpine19) { preventAlpineFromPickingUpDomChanges(Alpine19, (andAfterAllThis) => { enablePersist && storePersistantElementsForLater((persistedEl) => { packUpPersistedTeleports(persistedEl); + packUpPersistedPopovers(persistedEl); }); if (shouldPushToHistoryState) { updateUrlAndStoreLatestHtmlForFutureBackButtons(html, finalDestination); @@ -9129,6 +9257,7 @@ function navigate_default(Alpine19) { removeAnyLeftOverStaleTeleportTargets(document.body); enablePersist && putPersistantElementsBack((persistedEl, newStub) => { unPackPersistedTeleports(persistedEl); + unPackPersistedPopovers(persistedEl); }); restoreScrollPositionOrScrollToTop(); afterNewScriptsAreDoneLoading(() => { @@ -9137,7 +9266,7 @@ function navigate_default(Alpine19) { autofocus && autofocusElementsWithTheAutofocusAttribute(); }); nowInitializeAlpineOnTheNewPage(Alpine19); - fireEventForOtherLibariesToHookInto("alpine:navigated"); + fireEventForOtherLibrariesToHookInto("alpine:navigated"); }); }); }); @@ -9147,7 +9276,7 @@ function navigate_default(Alpine19) { whenTheBackOrForwardButtonIsClicked((ifThePageBeingVisitedHasntBeenCached) => { ifThePageBeingVisitedHasntBeenCached((url) => { let destination = createUrlObjectFromString(url); - let prevented = fireEventForOtherLibariesToHookInto("alpine:navigate", { + let prevented = fireEventForOtherLibrariesToHookInto("alpine:navigate", { url: destination, history: true, cached: false @@ -9159,7 +9288,7 @@ function navigate_default(Alpine19) { }); }, (html, url, currentPageUrl, currentPageKey) => { let destination = createUrlObjectFromString(url); - let prevented = fireEventForOtherLibariesToHookInto("alpine:navigate", { + let prevented = fireEventForOtherLibrariesToHookInto("alpine:navigate", { url: destination, history: true, cached: true @@ -9167,29 +9296,31 @@ function navigate_default(Alpine19) { if (prevented) return; storeScrollInformationInHtmlBeforeNavigatingAway(); - fireEventForOtherLibariesToHookInto("alpine:navigating"); + fireEventForOtherLibrariesToHookInto("alpine:navigating"); updateCurrentPageHtmlInSnapshotCacheForLaterBackButtonClicks(currentPageUrl, currentPageKey); preventAlpineFromPickingUpDomChanges(Alpine19, (andAfterAllThis) => { enablePersist && storePersistantElementsForLater((persistedEl) => { packUpPersistedTeleports(persistedEl); + packUpPersistedPopovers(persistedEl); }); swapCurrentPageWithNewHtml(html, () => { removeAnyLeftOverStaleProgressBars(); removeAnyLeftOverStaleTeleportTargets(document.body); enablePersist && putPersistantElementsBack((persistedEl, newStub) => { unPackPersistedTeleports(persistedEl); + unPackPersistedPopovers(persistedEl); }); restoreScrollPositionOrScrollToTop(); andAfterAllThis(() => { autofocus && autofocusElementsWithTheAutofocusAttribute(); nowInitializeAlpineOnTheNewPage(Alpine19); - fireEventForOtherLibariesToHookInto("alpine:navigated"); + fireEventForOtherLibrariesToHookInto("alpine:navigated"); }); }); }); }); setTimeout(() => { - fireEventForOtherLibariesToHookInto("alpine:navigated"); + fireEventForOtherLibrariesToHookInto("alpine:navigated"); }); } function fetchHtmlOrUsePrefetchedHtml(fromDestination, callback) { @@ -9206,7 +9337,7 @@ function preventAlpineFromPickingUpDomChanges(Alpine19, callback) { }); }); } -function fireEventForOtherLibariesToHookInto(name, detail) { +function fireEventForOtherLibrariesToHookInto(name, detail) { let event = new CustomEvent(name, { cancelable: true, bubbles: true, @@ -9441,8 +9572,8 @@ function fromQueryString(search) { } // js/lifecycle.js -var import_morph = __toESM(require_module_cjs7()); -var import_mask = __toESM(require_module_cjs8()); +var import_morph = __toESM(require_module_cjs8()); +var import_mask = __toESM(require_module_cjs9()); var import_alpinejs5 = __toESM(require_module_cjs()); function start() { setTimeout(() => ensureLivewireScriptIsntMisplaced()); @@ -9451,6 +9582,7 @@ function start() { import_alpinejs5.default.plugin(import_morph.default); import_alpinejs5.default.plugin(history2); import_alpinejs5.default.plugin(import_intersect.default); + import_alpinejs5.default.plugin(import_resize.default); import_alpinejs5.default.plugin(import_collapse.default); import_alpinejs5.default.plugin(import_anchor.default); import_alpinejs5.default.plugin(import_focus.default); @@ -9721,6 +9853,7 @@ function morph2(component, el, html) { }, lookahead: false }); + trigger("morphed", { el, component }); } function isntElement(el) { return typeof el.hasAttribute !== "function"; @@ -10790,3 +10923,4 @@ focus-trap/dist/focus-trap.js: * @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE *) */ +//# sourceMappingURL=livewire.esm.js.map diff --git a/public/vendor/livewire/livewire.esm.js.map b/public/vendor/livewire/livewire.esm.js.map new file mode 100644 index 0000000000..c4af6b08ae --- /dev/null +++ b/public/vendor/livewire/livewire.esm.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../alpine/packages/alpinejs/dist/module.cjs.js", "../../../../../usr/local/lib/node_modules/@alpinejs/collapse/dist/module.cjs.js", "../../../../../usr/local/lib/node_modules/@alpinejs/focus/dist/module.cjs.js", "../../../../../usr/local/lib/node_modules/@alpinejs/persist/dist/module.cjs.js", "../../../../../usr/local/lib/node_modules/@alpinejs/intersect/dist/module.cjs.js", "../node_modules/@alpinejs/resize/dist/module.cjs.js", "../../alpine/packages/anchor/dist/module.cjs.js", "../node_modules/nprogress/nprogress.js", "../../alpine/packages/morph/dist/module.cjs.js", "../../../../../usr/local/lib/node_modules/@alpinejs/mask/dist/module.cjs.js", "../js/utils.js", "../js/features/supportFileUploads.js", "../js/features/supportEntangle.js", "../js/hooks.js", "../js/request/modal.js", "../js/request/pool.js", "../js/request/commit.js", "../js/request/bus.js", "../js/request/index.js", "../js/$wire.js", "../js/component.js", "../js/store.js", "../js/events.js", "../js/directives.js", "../js/lifecycle.js", "../js/plugins/navigate/history.js", "../js/plugins/navigate/links.js", "../js/plugins/navigate/fetch.js", "../js/plugins/navigate/prefetch.js", "../js/plugins/navigate/teleport.js", "../js/plugins/navigate/scroll.js", "../js/plugins/navigate/persist.js", "../js/plugins/navigate/bar.js", "../js/plugins/navigate/popover.js", "../js/plugins/navigate/page.js", "../js/plugins/navigate/index.js", "../js/plugins/history/index.js", "../js/index.js", "../js/features/supportListeners.js", "../js/features/supportScriptsAndAssets.js", "../js/features/supportJsEvaluation.js", "../js/morph.js", "../js/features/supportMorphDom.js", "../js/features/supportDispatches.js", "../js/features/supportDisablingFormsDuringRequest.js", "../js/features/supportPropsAndModelables.js", "../js/features/supportFileDownloads.js", "../js/features/supportLazyLoading.js", "../js/features/supportQueryString.js", "../js/features/supportLaravelEcho.js", "../js/features/supportIsolating.js", "../js/features/supportNavigate.js", "../js/features/supportRedirects.js", "../js/directives/wire-transition.js", "../js/debounce.js", "../js/directives/wire-wildcard.js", "../js/directives/wire-navigate.js", "../js/directives/wire-confirm.js", "../js/directives/shared.js", "../js/directives/wire-offline.js", "../js/directives/wire-loading.js", "../js/directives/wire-stream.js", "../js/directives/wire-replace.js", "../js/directives/wire-ignore.js", "../js/directives/wire-dirty.js", "../js/directives/wire-model.js", "../js/directives/wire-init.js", "../js/directives/wire-poll.js"], + "sourcesContent": ["var __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __commonJS = (cb, mod) => function __require() {\n return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n};\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n // If the importer is in node compatibility mode or this is not an ESM\n // file that has been converted to a CommonJS file using a Babel-\n // compatible transform (i.e. \"__esModule\" has not been set), then set\n // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// node_modules/@vue/shared/dist/shared.cjs.js\nvar require_shared_cjs = __commonJS({\n \"node_modules/@vue/shared/dist/shared.cjs.js\"(exports) {\n \"use strict\";\n Object.defineProperty(exports, \"__esModule\", { value: true });\n function makeMap(str, expectsLowerCase) {\n const map = /* @__PURE__ */ Object.create(null);\n const list = str.split(\",\");\n for (let i = 0; i < list.length; i++) {\n map[list[i]] = true;\n }\n return expectsLowerCase ? (val) => !!map[val.toLowerCase()] : (val) => !!map[val];\n }\n var PatchFlagNames = {\n [\n 1\n /* TEXT */\n ]: `TEXT`,\n [\n 2\n /* CLASS */\n ]: `CLASS`,\n [\n 4\n /* STYLE */\n ]: `STYLE`,\n [\n 8\n /* PROPS */\n ]: `PROPS`,\n [\n 16\n /* FULL_PROPS */\n ]: `FULL_PROPS`,\n [\n 32\n /* HYDRATE_EVENTS */\n ]: `HYDRATE_EVENTS`,\n [\n 64\n /* STABLE_FRAGMENT */\n ]: `STABLE_FRAGMENT`,\n [\n 128\n /* KEYED_FRAGMENT */\n ]: `KEYED_FRAGMENT`,\n [\n 256\n /* UNKEYED_FRAGMENT */\n ]: `UNKEYED_FRAGMENT`,\n [\n 512\n /* NEED_PATCH */\n ]: `NEED_PATCH`,\n [\n 1024\n /* DYNAMIC_SLOTS */\n ]: `DYNAMIC_SLOTS`,\n [\n 2048\n /* DEV_ROOT_FRAGMENT */\n ]: `DEV_ROOT_FRAGMENT`,\n [\n -1\n /* HOISTED */\n ]: `HOISTED`,\n [\n -2\n /* BAIL */\n ]: `BAIL`\n };\n var slotFlagsText = {\n [\n 1\n /* STABLE */\n ]: \"STABLE\",\n [\n 2\n /* DYNAMIC */\n ]: \"DYNAMIC\",\n [\n 3\n /* FORWARDED */\n ]: \"FORWARDED\"\n };\n var GLOBALS_WHITE_LISTED = \"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt\";\n var isGloballyWhitelisted = /* @__PURE__ */ makeMap(GLOBALS_WHITE_LISTED);\n var range = 2;\n function generateCodeFrame(source, start2 = 0, end = source.length) {\n let lines = source.split(/(\\r?\\n)/);\n const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);\n lines = lines.filter((_, idx) => idx % 2 === 0);\n let count = 0;\n const res = [];\n for (let i = 0; i < lines.length; i++) {\n count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0);\n if (count >= start2) {\n for (let j = i - range; j <= i + range || end > count; j++) {\n if (j < 0 || j >= lines.length)\n continue;\n const line = j + 1;\n res.push(`${line}${\" \".repeat(Math.max(3 - String(line).length, 0))}| ${lines[j]}`);\n const lineLength = lines[j].length;\n const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0;\n if (j === i) {\n const pad = start2 - (count - (lineLength + newLineSeqLength));\n const length = Math.max(1, end > count ? lineLength - pad : end - start2);\n res.push(` | ` + \" \".repeat(pad) + \"^\".repeat(length));\n } else if (j > i) {\n if (end > count) {\n const length = Math.max(Math.min(end - count, lineLength), 1);\n res.push(` | ` + \"^\".repeat(length));\n }\n count += lineLength + newLineSeqLength;\n }\n }\n break;\n }\n }\n return res.join(\"\\n\");\n }\n var specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\n var isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs);\n var isBooleanAttr2 = /* @__PURE__ */ makeMap(specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`);\n var unsafeAttrCharRE = /[>/=\"'\\u0009\\u000a\\u000c\\u0020]/;\n var attrValidationCache = {};\n function isSSRSafeAttrName(name) {\n if (attrValidationCache.hasOwnProperty(name)) {\n return attrValidationCache[name];\n }\n const isUnsafe = unsafeAttrCharRE.test(name);\n if (isUnsafe) {\n console.error(`unsafe attribute name: ${name}`);\n }\n return attrValidationCache[name] = !isUnsafe;\n }\n var propsToAttrMap = {\n acceptCharset: \"accept-charset\",\n className: \"class\",\n htmlFor: \"for\",\n httpEquiv: \"http-equiv\"\n };\n var isNoUnitNumericStyleProp = /* @__PURE__ */ makeMap(`animation-iteration-count,border-image-outset,border-image-slice,border-image-width,box-flex,box-flex-group,box-ordinal-group,column-count,columns,flex,flex-grow,flex-positive,flex-shrink,flex-negative,flex-order,grid-row,grid-row-end,grid-row-span,grid-row-start,grid-column,grid-column-end,grid-column-span,grid-column-start,font-weight,line-clamp,line-height,opacity,order,orphans,tab-size,widows,z-index,zoom,fill-opacity,flood-opacity,stop-opacity,stroke-dasharray,stroke-dashoffset,stroke-miterlimit,stroke-opacity,stroke-width`);\n var isKnownAttr = /* @__PURE__ */ makeMap(`accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`);\n function normalizeStyle(value) {\n if (isArray(value)) {\n const res = {};\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n const normalized = normalizeStyle(isString(item) ? parseStringStyle(item) : item);\n if (normalized) {\n for (const key in normalized) {\n res[key] = normalized[key];\n }\n }\n }\n return res;\n } else if (isObject(value)) {\n return value;\n }\n }\n var listDelimiterRE = /;(?![^(]*\\))/g;\n var propertyDelimiterRE = /:(.+)/;\n function parseStringStyle(cssText) {\n const ret = {};\n cssText.split(listDelimiterRE).forEach((item) => {\n if (item) {\n const tmp = item.split(propertyDelimiterRE);\n tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());\n }\n });\n return ret;\n }\n function stringifyStyle(styles) {\n let ret = \"\";\n if (!styles) {\n return ret;\n }\n for (const key in styles) {\n const value = styles[key];\n const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);\n if (isString(value) || typeof value === \"number\" && isNoUnitNumericStyleProp(normalizedKey)) {\n ret += `${normalizedKey}:${value};`;\n }\n }\n return ret;\n }\n function normalizeClass(value) {\n let res = \"\";\n if (isString(value)) {\n res = value;\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const normalized = normalizeClass(value[i]);\n if (normalized) {\n res += normalized + \" \";\n }\n }\n } else if (isObject(value)) {\n for (const name in value) {\n if (value[name]) {\n res += name + \" \";\n }\n }\n }\n return res.trim();\n }\n var HTML_TAGS = \"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot\";\n var SVG_TAGS = \"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistanceLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view\";\n var VOID_TAGS = \"area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr\";\n var isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);\n var isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS);\n var isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS);\n var escapeRE = /[\"'&<>]/;\n function escapeHtml(string) {\n const str = \"\" + string;\n const match = escapeRE.exec(str);\n if (!match) {\n return str;\n }\n let html = \"\";\n let escaped;\n let index;\n let lastIndex = 0;\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34:\n escaped = \""\";\n break;\n case 38:\n escaped = \"&\";\n break;\n case 39:\n escaped = \"'\";\n break;\n case 60:\n escaped = \"<\";\n break;\n case 62:\n escaped = \">\";\n break;\n default:\n continue;\n }\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n lastIndex = index + 1;\n html += escaped;\n }\n return lastIndex !== index ? html + str.substring(lastIndex, index) : html;\n }\n var commentStripRE = /^-?>||--!>| looseEqual(item, val));\n }\n var toDisplayString = (val) => {\n return val == null ? \"\" : isObject(val) ? JSON.stringify(val, replacer, 2) : String(val);\n };\n var replacer = (_key, val) => {\n if (isMap(val)) {\n return {\n [`Map(${val.size})`]: [...val.entries()].reduce((entries, [key, val2]) => {\n entries[`${key} =>`] = val2;\n return entries;\n }, {})\n };\n } else if (isSet(val)) {\n return {\n [`Set(${val.size})`]: [...val.values()]\n };\n } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {\n return String(val);\n }\n return val;\n };\n var babelParserDefaultPlugins = [\n \"bigInt\",\n \"optionalChaining\",\n \"nullishCoalescingOperator\"\n ];\n var EMPTY_OBJ = Object.freeze({});\n var EMPTY_ARR = Object.freeze([]);\n var NOOP = () => {\n };\n var NO = () => false;\n var onRE = /^on[^a-z]/;\n var isOn = (key) => onRE.test(key);\n var isModelListener = (key) => key.startsWith(\"onUpdate:\");\n var extend = Object.assign;\n var remove = (arr, el) => {\n const i = arr.indexOf(el);\n if (i > -1) {\n arr.splice(i, 1);\n }\n };\n var hasOwnProperty = Object.prototype.hasOwnProperty;\n var hasOwn = (val, key) => hasOwnProperty.call(val, key);\n var isArray = Array.isArray;\n var isMap = (val) => toTypeString(val) === \"[object Map]\";\n var isSet = (val) => toTypeString(val) === \"[object Set]\";\n var isDate = (val) => val instanceof Date;\n var isFunction = (val) => typeof val === \"function\";\n var isString = (val) => typeof val === \"string\";\n var isSymbol = (val) => typeof val === \"symbol\";\n var isObject = (val) => val !== null && typeof val === \"object\";\n var isPromise = (val) => {\n return isObject(val) && isFunction(val.then) && isFunction(val.catch);\n };\n var objectToString = Object.prototype.toString;\n var toTypeString = (value) => objectToString.call(value);\n var toRawType = (value) => {\n return toTypeString(value).slice(8, -1);\n };\n var isPlainObject = (val) => toTypeString(val) === \"[object Object]\";\n var isIntegerKey = (key) => isString(key) && key !== \"NaN\" && key[0] !== \"-\" && \"\" + parseInt(key, 10) === key;\n var isReservedProp = /* @__PURE__ */ makeMap(\n // the leading comma is intentional so empty string \"\" is also included\n \",key,ref,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"\n );\n var cacheStringFunction = (fn) => {\n const cache = /* @__PURE__ */ Object.create(null);\n return (str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n };\n };\n var camelizeRE = /-(\\w)/g;\n var camelize = cacheStringFunction((str) => {\n return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : \"\");\n });\n var hyphenateRE = /\\B([A-Z])/g;\n var hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, \"-$1\").toLowerCase());\n var capitalize = cacheStringFunction((str) => str.charAt(0).toUpperCase() + str.slice(1));\n var toHandlerKey = cacheStringFunction((str) => str ? `on${capitalize(str)}` : ``);\n var hasChanged = (value, oldValue) => value !== oldValue && (value === value || oldValue === oldValue);\n var invokeArrayFns = (fns, arg) => {\n for (let i = 0; i < fns.length; i++) {\n fns[i](arg);\n }\n };\n var def = (obj, key, value) => {\n Object.defineProperty(obj, key, {\n configurable: true,\n enumerable: false,\n value\n });\n };\n var toNumber = (val) => {\n const n = parseFloat(val);\n return isNaN(n) ? val : n;\n };\n var _globalThis;\n var getGlobalThis = () => {\n return _globalThis || (_globalThis = typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : {});\n };\n exports.EMPTY_ARR = EMPTY_ARR;\n exports.EMPTY_OBJ = EMPTY_OBJ;\n exports.NO = NO;\n exports.NOOP = NOOP;\n exports.PatchFlagNames = PatchFlagNames;\n exports.babelParserDefaultPlugins = babelParserDefaultPlugins;\n exports.camelize = camelize;\n exports.capitalize = capitalize;\n exports.def = def;\n exports.escapeHtml = escapeHtml;\n exports.escapeHtmlComment = escapeHtmlComment;\n exports.extend = extend;\n exports.generateCodeFrame = generateCodeFrame;\n exports.getGlobalThis = getGlobalThis;\n exports.hasChanged = hasChanged;\n exports.hasOwn = hasOwn;\n exports.hyphenate = hyphenate;\n exports.invokeArrayFns = invokeArrayFns;\n exports.isArray = isArray;\n exports.isBooleanAttr = isBooleanAttr2;\n exports.isDate = isDate;\n exports.isFunction = isFunction;\n exports.isGloballyWhitelisted = isGloballyWhitelisted;\n exports.isHTMLTag = isHTMLTag;\n exports.isIntegerKey = isIntegerKey;\n exports.isKnownAttr = isKnownAttr;\n exports.isMap = isMap;\n exports.isModelListener = isModelListener;\n exports.isNoUnitNumericStyleProp = isNoUnitNumericStyleProp;\n exports.isObject = isObject;\n exports.isOn = isOn;\n exports.isPlainObject = isPlainObject;\n exports.isPromise = isPromise;\n exports.isReservedProp = isReservedProp;\n exports.isSSRSafeAttrName = isSSRSafeAttrName;\n exports.isSVGTag = isSVGTag;\n exports.isSet = isSet;\n exports.isSpecialBooleanAttr = isSpecialBooleanAttr;\n exports.isString = isString;\n exports.isSymbol = isSymbol;\n exports.isVoidTag = isVoidTag;\n exports.looseEqual = looseEqual;\n exports.looseIndexOf = looseIndexOf;\n exports.makeMap = makeMap;\n exports.normalizeClass = normalizeClass;\n exports.normalizeStyle = normalizeStyle;\n exports.objectToString = objectToString;\n exports.parseStringStyle = parseStringStyle;\n exports.propsToAttrMap = propsToAttrMap;\n exports.remove = remove;\n exports.slotFlagsText = slotFlagsText;\n exports.stringifyStyle = stringifyStyle;\n exports.toDisplayString = toDisplayString;\n exports.toHandlerKey = toHandlerKey;\n exports.toNumber = toNumber;\n exports.toRawType = toRawType;\n exports.toTypeString = toTypeString;\n }\n});\n\n// node_modules/@vue/shared/index.js\nvar require_shared = __commonJS({\n \"node_modules/@vue/shared/index.js\"(exports, module2) {\n \"use strict\";\n if (false) {\n module2.exports = null;\n } else {\n module2.exports = require_shared_cjs();\n }\n }\n});\n\n// node_modules/@vue/reactivity/dist/reactivity.cjs.js\nvar require_reactivity_cjs = __commonJS({\n \"node_modules/@vue/reactivity/dist/reactivity.cjs.js\"(exports) {\n \"use strict\";\n Object.defineProperty(exports, \"__esModule\", { value: true });\n var shared = require_shared();\n var targetMap = /* @__PURE__ */ new WeakMap();\n var effectStack = [];\n var activeEffect;\n var ITERATE_KEY = Symbol(\"iterate\");\n var MAP_KEY_ITERATE_KEY = Symbol(\"Map key iterate\");\n function isEffect(fn) {\n return fn && fn._isEffect === true;\n }\n function effect3(fn, options = shared.EMPTY_OBJ) {\n if (isEffect(fn)) {\n fn = fn.raw;\n }\n const effect4 = createReactiveEffect(fn, options);\n if (!options.lazy) {\n effect4();\n }\n return effect4;\n }\n function stop2(effect4) {\n if (effect4.active) {\n cleanup(effect4);\n if (effect4.options.onStop) {\n effect4.options.onStop();\n }\n effect4.active = false;\n }\n }\n var uid = 0;\n function createReactiveEffect(fn, options) {\n const effect4 = function reactiveEffect() {\n if (!effect4.active) {\n return fn();\n }\n if (!effectStack.includes(effect4)) {\n cleanup(effect4);\n try {\n enableTracking();\n effectStack.push(effect4);\n activeEffect = effect4;\n return fn();\n } finally {\n effectStack.pop();\n resetTracking();\n activeEffect = effectStack[effectStack.length - 1];\n }\n }\n };\n effect4.id = uid++;\n effect4.allowRecurse = !!options.allowRecurse;\n effect4._isEffect = true;\n effect4.active = true;\n effect4.raw = fn;\n effect4.deps = [];\n effect4.options = options;\n return effect4;\n }\n function cleanup(effect4) {\n const { deps } = effect4;\n if (deps.length) {\n for (let i = 0; i < deps.length; i++) {\n deps[i].delete(effect4);\n }\n deps.length = 0;\n }\n }\n var shouldTrack = true;\n var trackStack = [];\n function pauseTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = false;\n }\n function enableTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = true;\n }\n function resetTracking() {\n const last = trackStack.pop();\n shouldTrack = last === void 0 ? true : last;\n }\n function track(target, type, key) {\n if (!shouldTrack || activeEffect === void 0) {\n return;\n }\n let depsMap = targetMap.get(target);\n if (!depsMap) {\n targetMap.set(target, depsMap = /* @__PURE__ */ new Map());\n }\n let dep = depsMap.get(key);\n if (!dep) {\n depsMap.set(key, dep = /* @__PURE__ */ new Set());\n }\n if (!dep.has(activeEffect)) {\n dep.add(activeEffect);\n activeEffect.deps.push(dep);\n if (activeEffect.options.onTrack) {\n activeEffect.options.onTrack({\n effect: activeEffect,\n target,\n type,\n key\n });\n }\n }\n }\n function trigger(target, type, key, newValue, oldValue, oldTarget) {\n const depsMap = targetMap.get(target);\n if (!depsMap) {\n return;\n }\n const effects = /* @__PURE__ */ new Set();\n const add2 = (effectsToAdd) => {\n if (effectsToAdd) {\n effectsToAdd.forEach((effect4) => {\n if (effect4 !== activeEffect || effect4.allowRecurse) {\n effects.add(effect4);\n }\n });\n }\n };\n if (type === \"clear\") {\n depsMap.forEach(add2);\n } else if (key === \"length\" && shared.isArray(target)) {\n depsMap.forEach((dep, key2) => {\n if (key2 === \"length\" || key2 >= newValue) {\n add2(dep);\n }\n });\n } else {\n if (key !== void 0) {\n add2(depsMap.get(key));\n }\n switch (type) {\n case \"add\":\n if (!shared.isArray(target)) {\n add2(depsMap.get(ITERATE_KEY));\n if (shared.isMap(target)) {\n add2(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n } else if (shared.isIntegerKey(key)) {\n add2(depsMap.get(\"length\"));\n }\n break;\n case \"delete\":\n if (!shared.isArray(target)) {\n add2(depsMap.get(ITERATE_KEY));\n if (shared.isMap(target)) {\n add2(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n }\n break;\n case \"set\":\n if (shared.isMap(target)) {\n add2(depsMap.get(ITERATE_KEY));\n }\n break;\n }\n }\n const run = (effect4) => {\n if (effect4.options.onTrigger) {\n effect4.options.onTrigger({\n effect: effect4,\n target,\n key,\n type,\n newValue,\n oldValue,\n oldTarget\n });\n }\n if (effect4.options.scheduler) {\n effect4.options.scheduler(effect4);\n } else {\n effect4();\n }\n };\n effects.forEach(run);\n }\n var isNonTrackableKeys = /* @__PURE__ */ shared.makeMap(`__proto__,__v_isRef,__isVue`);\n var builtInSymbols = new Set(Object.getOwnPropertyNames(Symbol).map((key) => Symbol[key]).filter(shared.isSymbol));\n var get2 = /* @__PURE__ */ createGetter();\n var shallowGet = /* @__PURE__ */ createGetter(false, true);\n var readonlyGet = /* @__PURE__ */ createGetter(true);\n var shallowReadonlyGet = /* @__PURE__ */ createGetter(true, true);\n var arrayInstrumentations = /* @__PURE__ */ createArrayInstrumentations();\n function createArrayInstrumentations() {\n const instrumentations = {};\n [\"includes\", \"indexOf\", \"lastIndexOf\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw2(this);\n for (let i = 0, l = this.length; i < l; i++) {\n track(arr, \"get\", i + \"\");\n }\n const res = arr[key](...args);\n if (res === -1 || res === false) {\n return arr[key](...args.map(toRaw2));\n } else {\n return res;\n }\n };\n });\n [\"push\", \"pop\", \"shift\", \"unshift\", \"splice\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n pauseTracking();\n const res = toRaw2(this)[key].apply(this, args);\n resetTracking();\n return res;\n };\n });\n return instrumentations;\n }\n function createGetter(isReadonly2 = false, shallow = false) {\n return function get3(target, key, receiver) {\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_raw\" && receiver === (isReadonly2 ? shallow ? shallowReadonlyMap : readonlyMap : shallow ? shallowReactiveMap : reactiveMap).get(target)) {\n return target;\n }\n const targetIsArray = shared.isArray(target);\n if (!isReadonly2 && targetIsArray && shared.hasOwn(arrayInstrumentations, key)) {\n return Reflect.get(arrayInstrumentations, key, receiver);\n }\n const res = Reflect.get(target, key, receiver);\n if (shared.isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {\n return res;\n }\n if (!isReadonly2) {\n track(target, \"get\", key);\n }\n if (shallow) {\n return res;\n }\n if (isRef(res)) {\n const shouldUnwrap = !targetIsArray || !shared.isIntegerKey(key);\n return shouldUnwrap ? res.value : res;\n }\n if (shared.isObject(res)) {\n return isReadonly2 ? readonly(res) : reactive3(res);\n }\n return res;\n };\n }\n var set2 = /* @__PURE__ */ createSetter();\n var shallowSet = /* @__PURE__ */ createSetter(true);\n function createSetter(shallow = false) {\n return function set3(target, key, value, receiver) {\n let oldValue = target[key];\n if (!shallow) {\n value = toRaw2(value);\n oldValue = toRaw2(oldValue);\n if (!shared.isArray(target) && isRef(oldValue) && !isRef(value)) {\n oldValue.value = value;\n return true;\n }\n }\n const hadKey = shared.isArray(target) && shared.isIntegerKey(key) ? Number(key) < target.length : shared.hasOwn(target, key);\n const result = Reflect.set(target, key, value, receiver);\n if (target === toRaw2(receiver)) {\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (shared.hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n }\n return result;\n };\n }\n function deleteProperty(target, key) {\n const hadKey = shared.hasOwn(target, key);\n const oldValue = target[key];\n const result = Reflect.deleteProperty(target, key);\n if (result && hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n }\n function has(target, key) {\n const result = Reflect.has(target, key);\n if (!shared.isSymbol(key) || !builtInSymbols.has(key)) {\n track(target, \"has\", key);\n }\n return result;\n }\n function ownKeys(target) {\n track(target, \"iterate\", shared.isArray(target) ? \"length\" : ITERATE_KEY);\n return Reflect.ownKeys(target);\n }\n var mutableHandlers = {\n get: get2,\n set: set2,\n deleteProperty,\n has,\n ownKeys\n };\n var readonlyHandlers = {\n get: readonlyGet,\n set(target, key) {\n {\n console.warn(`Set operation on key \"${String(key)}\" failed: target is readonly.`, target);\n }\n return true;\n },\n deleteProperty(target, key) {\n {\n console.warn(`Delete operation on key \"${String(key)}\" failed: target is readonly.`, target);\n }\n return true;\n }\n };\n var shallowReactiveHandlers = /* @__PURE__ */ shared.extend({}, mutableHandlers, {\n get: shallowGet,\n set: shallowSet\n });\n var shallowReadonlyHandlers = /* @__PURE__ */ shared.extend({}, readonlyHandlers, {\n get: shallowReadonlyGet\n });\n var toReactive = (value) => shared.isObject(value) ? reactive3(value) : value;\n var toReadonly = (value) => shared.isObject(value) ? readonly(value) : value;\n var toShallow = (value) => value;\n var getProto = (v) => Reflect.getPrototypeOf(v);\n function get$1(target, key, isReadonly2 = false, isShallow = false) {\n target = target[\n \"__v_raw\"\n /* RAW */\n ];\n const rawTarget = toRaw2(target);\n const rawKey = toRaw2(key);\n if (key !== rawKey) {\n !isReadonly2 && track(rawTarget, \"get\", key);\n }\n !isReadonly2 && track(rawTarget, \"get\", rawKey);\n const { has: has2 } = getProto(rawTarget);\n const wrap = isShallow ? toShallow : isReadonly2 ? toReadonly : toReactive;\n if (has2.call(rawTarget, key)) {\n return wrap(target.get(key));\n } else if (has2.call(rawTarget, rawKey)) {\n return wrap(target.get(rawKey));\n } else if (target !== rawTarget) {\n target.get(key);\n }\n }\n function has$1(key, isReadonly2 = false) {\n const target = this[\n \"__v_raw\"\n /* RAW */\n ];\n const rawTarget = toRaw2(target);\n const rawKey = toRaw2(key);\n if (key !== rawKey) {\n !isReadonly2 && track(rawTarget, \"has\", key);\n }\n !isReadonly2 && track(rawTarget, \"has\", rawKey);\n return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);\n }\n function size(target, isReadonly2 = false) {\n target = target[\n \"__v_raw\"\n /* RAW */\n ];\n !isReadonly2 && track(toRaw2(target), \"iterate\", ITERATE_KEY);\n return Reflect.get(target, \"size\", target);\n }\n function add(value) {\n value = toRaw2(value);\n const target = toRaw2(this);\n const proto = getProto(target);\n const hadKey = proto.has.call(target, value);\n if (!hadKey) {\n target.add(value);\n trigger(target, \"add\", value, value);\n }\n return this;\n }\n function set$1(key, value) {\n value = toRaw2(value);\n const target = toRaw2(this);\n const { has: has2, get: get3 } = getProto(target);\n let hadKey = has2.call(target, key);\n if (!hadKey) {\n key = toRaw2(key);\n hadKey = has2.call(target, key);\n } else {\n checkIdentityKeys(target, has2, key);\n }\n const oldValue = get3.call(target, key);\n target.set(key, value);\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (shared.hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n return this;\n }\n function deleteEntry(key) {\n const target = toRaw2(this);\n const { has: has2, get: get3 } = getProto(target);\n let hadKey = has2.call(target, key);\n if (!hadKey) {\n key = toRaw2(key);\n hadKey = has2.call(target, key);\n } else {\n checkIdentityKeys(target, has2, key);\n }\n const oldValue = get3 ? get3.call(target, key) : void 0;\n const result = target.delete(key);\n if (hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n }\n function clear() {\n const target = toRaw2(this);\n const hadItems = target.size !== 0;\n const oldTarget = shared.isMap(target) ? new Map(target) : new Set(target);\n const result = target.clear();\n if (hadItems) {\n trigger(target, \"clear\", void 0, void 0, oldTarget);\n }\n return result;\n }\n function createForEach(isReadonly2, isShallow) {\n return function forEach(callback, thisArg) {\n const observed = this;\n const target = observed[\n \"__v_raw\"\n /* RAW */\n ];\n const rawTarget = toRaw2(target);\n const wrap = isShallow ? toShallow : isReadonly2 ? toReadonly : toReactive;\n !isReadonly2 && track(rawTarget, \"iterate\", ITERATE_KEY);\n return target.forEach((value, key) => {\n return callback.call(thisArg, wrap(value), wrap(key), observed);\n });\n };\n }\n function createIterableMethod(method, isReadonly2, isShallow) {\n return function(...args) {\n const target = this[\n \"__v_raw\"\n /* RAW */\n ];\n const rawTarget = toRaw2(target);\n const targetIsMap = shared.isMap(rawTarget);\n const isPair = method === \"entries\" || method === Symbol.iterator && targetIsMap;\n const isKeyOnly = method === \"keys\" && targetIsMap;\n const innerIterator = target[method](...args);\n const wrap = isShallow ? toShallow : isReadonly2 ? toReadonly : toReactive;\n !isReadonly2 && track(rawTarget, \"iterate\", isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY);\n return {\n // iterator protocol\n next() {\n const { value, done } = innerIterator.next();\n return done ? { value, done } : {\n value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\n done\n };\n },\n // iterable protocol\n [Symbol.iterator]() {\n return this;\n }\n };\n };\n }\n function createReadonlyMethod(type) {\n return function(...args) {\n {\n const key = args[0] ? `on key \"${args[0]}\" ` : ``;\n console.warn(`${shared.capitalize(type)} operation ${key}failed: target is readonly.`, toRaw2(this));\n }\n return type === \"delete\" ? false : this;\n };\n }\n function createInstrumentations() {\n const mutableInstrumentations2 = {\n get(key) {\n return get$1(this, key);\n },\n get size() {\n return size(this);\n },\n has: has$1,\n add,\n set: set$1,\n delete: deleteEntry,\n clear,\n forEach: createForEach(false, false)\n };\n const shallowInstrumentations2 = {\n get(key) {\n return get$1(this, key, false, true);\n },\n get size() {\n return size(this);\n },\n has: has$1,\n add,\n set: set$1,\n delete: deleteEntry,\n clear,\n forEach: createForEach(false, true)\n };\n const readonlyInstrumentations2 = {\n get(key) {\n return get$1(this, key, true);\n },\n get size() {\n return size(this, true);\n },\n has(key) {\n return has$1.call(this, key, true);\n },\n add: createReadonlyMethod(\n \"add\"\n /* ADD */\n ),\n set: createReadonlyMethod(\n \"set\"\n /* SET */\n ),\n delete: createReadonlyMethod(\n \"delete\"\n /* DELETE */\n ),\n clear: createReadonlyMethod(\n \"clear\"\n /* CLEAR */\n ),\n forEach: createForEach(true, false)\n };\n const shallowReadonlyInstrumentations2 = {\n get(key) {\n return get$1(this, key, true, true);\n },\n get size() {\n return size(this, true);\n },\n has(key) {\n return has$1.call(this, key, true);\n },\n add: createReadonlyMethod(\n \"add\"\n /* ADD */\n ),\n set: createReadonlyMethod(\n \"set\"\n /* SET */\n ),\n delete: createReadonlyMethod(\n \"delete\"\n /* DELETE */\n ),\n clear: createReadonlyMethod(\n \"clear\"\n /* CLEAR */\n ),\n forEach: createForEach(true, true)\n };\n const iteratorMethods = [\"keys\", \"values\", \"entries\", Symbol.iterator];\n iteratorMethods.forEach((method) => {\n mutableInstrumentations2[method] = createIterableMethod(method, false, false);\n readonlyInstrumentations2[method] = createIterableMethod(method, true, false);\n shallowInstrumentations2[method] = createIterableMethod(method, false, true);\n shallowReadonlyInstrumentations2[method] = createIterableMethod(method, true, true);\n });\n return [\n mutableInstrumentations2,\n readonlyInstrumentations2,\n shallowInstrumentations2,\n shallowReadonlyInstrumentations2\n ];\n }\n var [mutableInstrumentations, readonlyInstrumentations, shallowInstrumentations, shallowReadonlyInstrumentations] = /* @__PURE__ */ createInstrumentations();\n function createInstrumentationGetter(isReadonly2, shallow) {\n const instrumentations = shallow ? isReadonly2 ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly2 ? readonlyInstrumentations : mutableInstrumentations;\n return (target, key, receiver) => {\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_raw\") {\n return target;\n }\n return Reflect.get(shared.hasOwn(instrumentations, key) && key in target ? instrumentations : target, key, receiver);\n };\n }\n var mutableCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, false)\n };\n var shallowCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, true)\n };\n var readonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, false)\n };\n var shallowReadonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, true)\n };\n function checkIdentityKeys(target, has2, key) {\n const rawKey = toRaw2(key);\n if (rawKey !== key && has2.call(target, rawKey)) {\n const type = shared.toRawType(target);\n console.warn(`Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`);\n }\n }\n var reactiveMap = /* @__PURE__ */ new WeakMap();\n var shallowReactiveMap = /* @__PURE__ */ new WeakMap();\n var readonlyMap = /* @__PURE__ */ new WeakMap();\n var shallowReadonlyMap = /* @__PURE__ */ new WeakMap();\n function targetTypeMap(rawType) {\n switch (rawType) {\n case \"Object\":\n case \"Array\":\n return 1;\n case \"Map\":\n case \"Set\":\n case \"WeakMap\":\n case \"WeakSet\":\n return 2;\n default:\n return 0;\n }\n }\n function getTargetType(value) {\n return value[\n \"__v_skip\"\n /* SKIP */\n ] || !Object.isExtensible(value) ? 0 : targetTypeMap(shared.toRawType(value));\n }\n function reactive3(target) {\n if (target && target[\n \"__v_isReadonly\"\n /* IS_READONLY */\n ]) {\n return target;\n }\n return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers, reactiveMap);\n }\n function shallowReactive(target) {\n return createReactiveObject(target, false, shallowReactiveHandlers, shallowCollectionHandlers, shallowReactiveMap);\n }\n function readonly(target) {\n return createReactiveObject(target, true, readonlyHandlers, readonlyCollectionHandlers, readonlyMap);\n }\n function shallowReadonly(target) {\n return createReactiveObject(target, true, shallowReadonlyHandlers, shallowReadonlyCollectionHandlers, shallowReadonlyMap);\n }\n function createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {\n if (!shared.isObject(target)) {\n {\n console.warn(`value cannot be made reactive: ${String(target)}`);\n }\n return target;\n }\n if (target[\n \"__v_raw\"\n /* RAW */\n ] && !(isReadonly2 && target[\n \"__v_isReactive\"\n /* IS_REACTIVE */\n ])) {\n return target;\n }\n const existingProxy = proxyMap.get(target);\n if (existingProxy) {\n return existingProxy;\n }\n const targetType = getTargetType(target);\n if (targetType === 0) {\n return target;\n }\n const proxy = new Proxy(target, targetType === 2 ? collectionHandlers : baseHandlers);\n proxyMap.set(target, proxy);\n return proxy;\n }\n function isReactive2(value) {\n if (isReadonly(value)) {\n return isReactive2(value[\n \"__v_raw\"\n /* RAW */\n ]);\n }\n return !!(value && value[\n \"__v_isReactive\"\n /* IS_REACTIVE */\n ]);\n }\n function isReadonly(value) {\n return !!(value && value[\n \"__v_isReadonly\"\n /* IS_READONLY */\n ]);\n }\n function isProxy(value) {\n return isReactive2(value) || isReadonly(value);\n }\n function toRaw2(observed) {\n return observed && toRaw2(observed[\n \"__v_raw\"\n /* RAW */\n ]) || observed;\n }\n function markRaw(value) {\n shared.def(value, \"__v_skip\", true);\n return value;\n }\n var convert = (val) => shared.isObject(val) ? reactive3(val) : val;\n function isRef(r) {\n return Boolean(r && r.__v_isRef === true);\n }\n function ref(value) {\n return createRef(value);\n }\n function shallowRef(value) {\n return createRef(value, true);\n }\n var RefImpl = class {\n constructor(value, _shallow = false) {\n this._shallow = _shallow;\n this.__v_isRef = true;\n this._rawValue = _shallow ? value : toRaw2(value);\n this._value = _shallow ? value : convert(value);\n }\n get value() {\n track(toRaw2(this), \"get\", \"value\");\n return this._value;\n }\n set value(newVal) {\n newVal = this._shallow ? newVal : toRaw2(newVal);\n if (shared.hasChanged(newVal, this._rawValue)) {\n this._rawValue = newVal;\n this._value = this._shallow ? newVal : convert(newVal);\n trigger(toRaw2(this), \"set\", \"value\", newVal);\n }\n }\n };\n function createRef(rawValue, shallow = false) {\n if (isRef(rawValue)) {\n return rawValue;\n }\n return new RefImpl(rawValue, shallow);\n }\n function triggerRef(ref2) {\n trigger(toRaw2(ref2), \"set\", \"value\", ref2.value);\n }\n function unref(ref2) {\n return isRef(ref2) ? ref2.value : ref2;\n }\n var shallowUnwrapHandlers = {\n get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)),\n set: (target, key, value, receiver) => {\n const oldValue = target[key];\n if (isRef(oldValue) && !isRef(value)) {\n oldValue.value = value;\n return true;\n } else {\n return Reflect.set(target, key, value, receiver);\n }\n }\n };\n function proxyRefs(objectWithRefs) {\n return isReactive2(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);\n }\n var CustomRefImpl = class {\n constructor(factory) {\n this.__v_isRef = true;\n const { get: get3, set: set3 } = factory(() => track(this, \"get\", \"value\"), () => trigger(this, \"set\", \"value\"));\n this._get = get3;\n this._set = set3;\n }\n get value() {\n return this._get();\n }\n set value(newVal) {\n this._set(newVal);\n }\n };\n function customRef(factory) {\n return new CustomRefImpl(factory);\n }\n function toRefs(object) {\n if (!isProxy(object)) {\n console.warn(`toRefs() expects a reactive object but received a plain one.`);\n }\n const ret = shared.isArray(object) ? new Array(object.length) : {};\n for (const key in object) {\n ret[key] = toRef(object, key);\n }\n return ret;\n }\n var ObjectRefImpl = class {\n constructor(_object, _key) {\n this._object = _object;\n this._key = _key;\n this.__v_isRef = true;\n }\n get value() {\n return this._object[this._key];\n }\n set value(newVal) {\n this._object[this._key] = newVal;\n }\n };\n function toRef(object, key) {\n return isRef(object[key]) ? object[key] : new ObjectRefImpl(object, key);\n }\n var ComputedRefImpl = class {\n constructor(getter, _setter, isReadonly2) {\n this._setter = _setter;\n this._dirty = true;\n this.__v_isRef = true;\n this.effect = effect3(getter, {\n lazy: true,\n scheduler: () => {\n if (!this._dirty) {\n this._dirty = true;\n trigger(toRaw2(this), \"set\", \"value\");\n }\n }\n });\n this[\n \"__v_isReadonly\"\n /* IS_READONLY */\n ] = isReadonly2;\n }\n get value() {\n const self2 = toRaw2(this);\n if (self2._dirty) {\n self2._value = this.effect();\n self2._dirty = false;\n }\n track(self2, \"get\", \"value\");\n return self2._value;\n }\n set value(newValue) {\n this._setter(newValue);\n }\n };\n function computed(getterOrOptions) {\n let getter;\n let setter;\n if (shared.isFunction(getterOrOptions)) {\n getter = getterOrOptions;\n setter = () => {\n console.warn(\"Write operation failed: computed value is readonly\");\n };\n } else {\n getter = getterOrOptions.get;\n setter = getterOrOptions.set;\n }\n return new ComputedRefImpl(getter, setter, shared.isFunction(getterOrOptions) || !getterOrOptions.set);\n }\n exports.ITERATE_KEY = ITERATE_KEY;\n exports.computed = computed;\n exports.customRef = customRef;\n exports.effect = effect3;\n exports.enableTracking = enableTracking;\n exports.isProxy = isProxy;\n exports.isReactive = isReactive2;\n exports.isReadonly = isReadonly;\n exports.isRef = isRef;\n exports.markRaw = markRaw;\n exports.pauseTracking = pauseTracking;\n exports.proxyRefs = proxyRefs;\n exports.reactive = reactive3;\n exports.readonly = readonly;\n exports.ref = ref;\n exports.resetTracking = resetTracking;\n exports.shallowReactive = shallowReactive;\n exports.shallowReadonly = shallowReadonly;\n exports.shallowRef = shallowRef;\n exports.stop = stop2;\n exports.toRaw = toRaw2;\n exports.toRef = toRef;\n exports.toRefs = toRefs;\n exports.track = track;\n exports.trigger = trigger;\n exports.triggerRef = triggerRef;\n exports.unref = unref;\n }\n});\n\n// node_modules/@vue/reactivity/index.js\nvar require_reactivity = __commonJS({\n \"node_modules/@vue/reactivity/index.js\"(exports, module2) {\n \"use strict\";\n if (false) {\n module2.exports = null;\n } else {\n module2.exports = require_reactivity_cjs();\n }\n }\n});\n\n// packages/alpinejs/builds/module.js\nvar module_exports = {};\n__export(module_exports, {\n Alpine: () => src_default,\n default: () => module_default\n});\nmodule.exports = __toCommonJS(module_exports);\n\n// packages/alpinejs/src/scheduler.js\nvar flushPending = false;\nvar flushing = false;\nvar queue = [];\nvar lastFlushedIndex = -1;\nfunction scheduler(callback) {\n queueJob(callback);\n}\nfunction queueJob(job) {\n if (!queue.includes(job))\n queue.push(job);\n queueFlush();\n}\nfunction dequeueJob(job) {\n let index = queue.indexOf(job);\n if (index !== -1 && index > lastFlushedIndex)\n queue.splice(index, 1);\n}\nfunction queueFlush() {\n if (!flushing && !flushPending) {\n flushPending = true;\n queueMicrotask(flushJobs);\n }\n}\nfunction flushJobs() {\n flushPending = false;\n flushing = true;\n for (let i = 0; i < queue.length; i++) {\n queue[i]();\n lastFlushedIndex = i;\n }\n queue.length = 0;\n lastFlushedIndex = -1;\n flushing = false;\n}\n\n// packages/alpinejs/src/reactivity.js\nvar reactive;\nvar effect;\nvar release;\nvar raw;\nvar shouldSchedule = true;\nfunction disableEffectScheduling(callback) {\n shouldSchedule = false;\n callback();\n shouldSchedule = true;\n}\nfunction setReactivityEngine(engine) {\n reactive = engine.reactive;\n release = engine.release;\n effect = (callback) => engine.effect(callback, { scheduler: (task) => {\n if (shouldSchedule) {\n scheduler(task);\n } else {\n task();\n }\n } });\n raw = engine.raw;\n}\nfunction overrideEffect(override) {\n effect = override;\n}\nfunction elementBoundEffect(el) {\n let cleanup = () => {\n };\n let wrappedEffect = (callback) => {\n let effectReference = effect(callback);\n if (!el._x_effects) {\n el._x_effects = /* @__PURE__ */ new Set();\n el._x_runEffects = () => {\n el._x_effects.forEach((i) => i());\n };\n }\n el._x_effects.add(effectReference);\n cleanup = () => {\n if (effectReference === void 0)\n return;\n el._x_effects.delete(effectReference);\n release(effectReference);\n };\n return effectReference;\n };\n return [wrappedEffect, () => {\n cleanup();\n }];\n}\nfunction watch(getter, callback) {\n let firstTime = true;\n let oldValue;\n let effectReference = effect(() => {\n let value = getter();\n JSON.stringify(value);\n if (!firstTime) {\n queueMicrotask(() => {\n callback(value, oldValue);\n oldValue = value;\n });\n } else {\n oldValue = value;\n }\n firstTime = false;\n });\n return () => release(effectReference);\n}\n\n// packages/alpinejs/src/mutation.js\nvar onAttributeAddeds = [];\nvar onElRemoveds = [];\nvar onElAddeds = [];\nfunction onElAdded(callback) {\n onElAddeds.push(callback);\n}\nfunction onElRemoved(el, callback) {\n if (typeof callback === \"function\") {\n if (!el._x_cleanups)\n el._x_cleanups = [];\n el._x_cleanups.push(callback);\n } else {\n callback = el;\n onElRemoveds.push(callback);\n }\n}\nfunction onAttributesAdded(callback) {\n onAttributeAddeds.push(callback);\n}\nfunction onAttributeRemoved(el, name, callback) {\n if (!el._x_attributeCleanups)\n el._x_attributeCleanups = {};\n if (!el._x_attributeCleanups[name])\n el._x_attributeCleanups[name] = [];\n el._x_attributeCleanups[name].push(callback);\n}\nfunction cleanupAttributes(el, names) {\n if (!el._x_attributeCleanups)\n return;\n Object.entries(el._x_attributeCleanups).forEach(([name, value]) => {\n if (names === void 0 || names.includes(name)) {\n value.forEach((i) => i());\n delete el._x_attributeCleanups[name];\n }\n });\n}\nfunction cleanupElement(el) {\n var _a, _b;\n (_a = el._x_effects) == null ? void 0 : _a.forEach(dequeueJob);\n while ((_b = el._x_cleanups) == null ? void 0 : _b.length)\n el._x_cleanups.pop()();\n}\nvar observer = new MutationObserver(onMutate);\nvar currentlyObserving = false;\nfunction startObservingMutations() {\n observer.observe(document, { subtree: true, childList: true, attributes: true, attributeOldValue: true });\n currentlyObserving = true;\n}\nfunction stopObservingMutations() {\n flushObserver();\n observer.disconnect();\n currentlyObserving = false;\n}\nvar queuedMutations = [];\nfunction flushObserver() {\n let records = observer.takeRecords();\n queuedMutations.push(() => records.length > 0 && onMutate(records));\n let queueLengthWhenTriggered = queuedMutations.length;\n queueMicrotask(() => {\n if (queuedMutations.length === queueLengthWhenTriggered) {\n while (queuedMutations.length > 0)\n queuedMutations.shift()();\n }\n });\n}\nfunction mutateDom(callback) {\n if (!currentlyObserving)\n return callback();\n stopObservingMutations();\n let result = callback();\n startObservingMutations();\n return result;\n}\nvar isCollecting = false;\nvar deferredMutations = [];\nfunction deferMutations() {\n isCollecting = true;\n}\nfunction flushAndStopDeferringMutations() {\n isCollecting = false;\n onMutate(deferredMutations);\n deferredMutations = [];\n}\nfunction onMutate(mutations) {\n if (isCollecting) {\n deferredMutations = deferredMutations.concat(mutations);\n return;\n }\n let addedNodes = /* @__PURE__ */ new Set();\n let removedNodes = /* @__PURE__ */ new Set();\n let addedAttributes = /* @__PURE__ */ new Map();\n let removedAttributes = /* @__PURE__ */ new Map();\n for (let i = 0; i < mutations.length; i++) {\n if (mutations[i].target._x_ignoreMutationObserver)\n continue;\n if (mutations[i].type === \"childList\") {\n mutations[i].addedNodes.forEach((node) => node.nodeType === 1 && addedNodes.add(node));\n mutations[i].removedNodes.forEach((node) => node.nodeType === 1 && removedNodes.add(node));\n }\n if (mutations[i].type === \"attributes\") {\n let el = mutations[i].target;\n let name = mutations[i].attributeName;\n let oldValue = mutations[i].oldValue;\n let add = () => {\n if (!addedAttributes.has(el))\n addedAttributes.set(el, []);\n addedAttributes.get(el).push({ name, value: el.getAttribute(name) });\n };\n let remove = () => {\n if (!removedAttributes.has(el))\n removedAttributes.set(el, []);\n removedAttributes.get(el).push(name);\n };\n if (el.hasAttribute(name) && oldValue === null) {\n add();\n } else if (el.hasAttribute(name)) {\n remove();\n add();\n } else {\n remove();\n }\n }\n }\n removedAttributes.forEach((attrs, el) => {\n cleanupAttributes(el, attrs);\n });\n addedAttributes.forEach((attrs, el) => {\n onAttributeAddeds.forEach((i) => i(el, attrs));\n });\n for (let node of removedNodes) {\n if (addedNodes.has(node))\n continue;\n onElRemoveds.forEach((i) => i(node));\n }\n addedNodes.forEach((node) => {\n node._x_ignoreSelf = true;\n node._x_ignore = true;\n });\n for (let node of addedNodes) {\n if (removedNodes.has(node))\n continue;\n if (!node.isConnected)\n continue;\n delete node._x_ignoreSelf;\n delete node._x_ignore;\n onElAddeds.forEach((i) => i(node));\n node._x_ignore = true;\n node._x_ignoreSelf = true;\n }\n addedNodes.forEach((node) => {\n delete node._x_ignoreSelf;\n delete node._x_ignore;\n });\n addedNodes = null;\n removedNodes = null;\n addedAttributes = null;\n removedAttributes = null;\n}\n\n// packages/alpinejs/src/scope.js\nfunction scope(node) {\n return mergeProxies(closestDataStack(node));\n}\nfunction addScopeToNode(node, data2, referenceNode) {\n node._x_dataStack = [data2, ...closestDataStack(referenceNode || node)];\n return () => {\n node._x_dataStack = node._x_dataStack.filter((i) => i !== data2);\n };\n}\nfunction closestDataStack(node) {\n if (node._x_dataStack)\n return node._x_dataStack;\n if (typeof ShadowRoot === \"function\" && node instanceof ShadowRoot) {\n return closestDataStack(node.host);\n }\n if (!node.parentNode) {\n return [];\n }\n return closestDataStack(node.parentNode);\n}\nfunction mergeProxies(objects) {\n return new Proxy({ objects }, mergeProxyTrap);\n}\nvar mergeProxyTrap = {\n ownKeys({ objects }) {\n return Array.from(\n new Set(objects.flatMap((i) => Object.keys(i)))\n );\n },\n has({ objects }, name) {\n if (name == Symbol.unscopables)\n return false;\n return objects.some(\n (obj) => Object.prototype.hasOwnProperty.call(obj, name) || Reflect.has(obj, name)\n );\n },\n get({ objects }, name, thisProxy) {\n if (name == \"toJSON\")\n return collapseProxies;\n return Reflect.get(\n objects.find(\n (obj) => Reflect.has(obj, name)\n ) || {},\n name,\n thisProxy\n );\n },\n set({ objects }, name, value, thisProxy) {\n const target = objects.find(\n (obj) => Object.prototype.hasOwnProperty.call(obj, name)\n ) || objects[objects.length - 1];\n const descriptor = Object.getOwnPropertyDescriptor(target, name);\n if ((descriptor == null ? void 0 : descriptor.set) && (descriptor == null ? void 0 : descriptor.get))\n return descriptor.set.call(thisProxy, value) || true;\n return Reflect.set(target, name, value);\n }\n};\nfunction collapseProxies() {\n let keys = Reflect.ownKeys(this);\n return keys.reduce((acc, key) => {\n acc[key] = Reflect.get(this, key);\n return acc;\n }, {});\n}\n\n// packages/alpinejs/src/interceptor.js\nfunction initInterceptors(data2) {\n let isObject = (val) => typeof val === \"object\" && !Array.isArray(val) && val !== null;\n let recurse = (obj, basePath = \"\") => {\n Object.entries(Object.getOwnPropertyDescriptors(obj)).forEach(([key, { value, enumerable }]) => {\n if (enumerable === false || value === void 0)\n return;\n if (typeof value === \"object\" && value !== null && value.__v_skip)\n return;\n let path = basePath === \"\" ? key : `${basePath}.${key}`;\n if (typeof value === \"object\" && value !== null && value._x_interceptor) {\n obj[key] = value.initialize(data2, path, key);\n } else {\n if (isObject(value) && value !== obj && !(value instanceof Element)) {\n recurse(value, path);\n }\n }\n });\n };\n return recurse(data2);\n}\nfunction interceptor(callback, mutateObj = () => {\n}) {\n let obj = {\n initialValue: void 0,\n _x_interceptor: true,\n initialize(data2, path, key) {\n return callback(this.initialValue, () => get(data2, path), (value) => set(data2, path, value), path, key);\n }\n };\n mutateObj(obj);\n return (initialValue) => {\n if (typeof initialValue === \"object\" && initialValue !== null && initialValue._x_interceptor) {\n let initialize = obj.initialize.bind(obj);\n obj.initialize = (data2, path, key) => {\n let innerValue = initialValue.initialize(data2, path, key);\n obj.initialValue = innerValue;\n return initialize(data2, path, key);\n };\n } else {\n obj.initialValue = initialValue;\n }\n return obj;\n };\n}\nfunction get(obj, path) {\n return path.split(\".\").reduce((carry, segment) => carry[segment], obj);\n}\nfunction set(obj, path, value) {\n if (typeof path === \"string\")\n path = path.split(\".\");\n if (path.length === 1)\n obj[path[0]] = value;\n else if (path.length === 0)\n throw error;\n else {\n if (obj[path[0]])\n return set(obj[path[0]], path.slice(1), value);\n else {\n obj[path[0]] = {};\n return set(obj[path[0]], path.slice(1), value);\n }\n }\n}\n\n// packages/alpinejs/src/magics.js\nvar magics = {};\nfunction magic(name, callback) {\n magics[name] = callback;\n}\nfunction injectMagics(obj, el) {\n let memoizedUtilities = getUtilities(el);\n Object.entries(magics).forEach(([name, callback]) => {\n Object.defineProperty(obj, `$${name}`, {\n get() {\n return callback(el, memoizedUtilities);\n },\n enumerable: false\n });\n });\n return obj;\n}\nfunction getUtilities(el) {\n let [utilities, cleanup] = getElementBoundUtilities(el);\n let utils = { interceptor, ...utilities };\n onElRemoved(el, cleanup);\n return utils;\n}\n\n// packages/alpinejs/src/utils/error.js\nfunction tryCatch(el, expression, callback, ...args) {\n try {\n return callback(...args);\n } catch (e) {\n handleError(e, el, expression);\n }\n}\nfunction handleError(error2, el, expression = void 0) {\n error2 = Object.assign(\n error2 != null ? error2 : { message: \"No error message given.\" },\n { el, expression }\n );\n console.warn(`Alpine Expression Error: ${error2.message}\n\n${expression ? 'Expression: \"' + expression + '\"\\n\\n' : \"\"}`, el);\n setTimeout(() => {\n throw error2;\n }, 0);\n}\n\n// packages/alpinejs/src/evaluator.js\nvar shouldAutoEvaluateFunctions = true;\nfunction dontAutoEvaluateFunctions(callback) {\n let cache = shouldAutoEvaluateFunctions;\n shouldAutoEvaluateFunctions = false;\n let result = callback();\n shouldAutoEvaluateFunctions = cache;\n return result;\n}\nfunction evaluate(el, expression, extras = {}) {\n let result;\n evaluateLater(el, expression)((value) => result = value, extras);\n return result;\n}\nfunction evaluateLater(...args) {\n return theEvaluatorFunction(...args);\n}\nvar theEvaluatorFunction = normalEvaluator;\nfunction setEvaluator(newEvaluator) {\n theEvaluatorFunction = newEvaluator;\n}\nfunction normalEvaluator(el, expression) {\n let overriddenMagics = {};\n injectMagics(overriddenMagics, el);\n let dataStack = [overriddenMagics, ...closestDataStack(el)];\n let evaluator = typeof expression === \"function\" ? generateEvaluatorFromFunction(dataStack, expression) : generateEvaluatorFromString(dataStack, expression, el);\n return tryCatch.bind(null, el, expression, evaluator);\n}\nfunction generateEvaluatorFromFunction(dataStack, func) {\n return (receiver = () => {\n }, { scope: scope2 = {}, params = [] } = {}) => {\n let result = func.apply(mergeProxies([scope2, ...dataStack]), params);\n runIfTypeOfFunction(receiver, result);\n };\n}\nvar evaluatorMemo = {};\nfunction generateFunctionFromString(expression, el) {\n if (evaluatorMemo[expression]) {\n return evaluatorMemo[expression];\n }\n let AsyncFunction = Object.getPrototypeOf(async function() {\n }).constructor;\n let rightSideSafeExpression = /^[\\n\\s]*if.*\\(.*\\)/.test(expression.trim()) || /^(let|const)\\s/.test(expression.trim()) ? `(async()=>{ ${expression} })()` : expression;\n const safeAsyncFunction = () => {\n try {\n let func2 = new AsyncFunction(\n [\"__self\", \"scope\"],\n `with (scope) { __self.result = ${rightSideSafeExpression} }; __self.finished = true; return __self.result;`\n );\n Object.defineProperty(func2, \"name\", {\n value: `[Alpine] ${expression}`\n });\n return func2;\n } catch (error2) {\n handleError(error2, el, expression);\n return Promise.resolve();\n }\n };\n let func = safeAsyncFunction();\n evaluatorMemo[expression] = func;\n return func;\n}\nfunction generateEvaluatorFromString(dataStack, expression, el) {\n let func = generateFunctionFromString(expression, el);\n return (receiver = () => {\n }, { scope: scope2 = {}, params = [] } = {}) => {\n func.result = void 0;\n func.finished = false;\n let completeScope = mergeProxies([scope2, ...dataStack]);\n if (typeof func === \"function\") {\n let promise = func(func, completeScope).catch((error2) => handleError(error2, el, expression));\n if (func.finished) {\n runIfTypeOfFunction(receiver, func.result, completeScope, params, el);\n func.result = void 0;\n } else {\n promise.then((result) => {\n runIfTypeOfFunction(receiver, result, completeScope, params, el);\n }).catch((error2) => handleError(error2, el, expression)).finally(() => func.result = void 0);\n }\n }\n };\n}\nfunction runIfTypeOfFunction(receiver, value, scope2, params, el) {\n if (shouldAutoEvaluateFunctions && typeof value === \"function\") {\n let result = value.apply(scope2, params);\n if (result instanceof Promise) {\n result.then((i) => runIfTypeOfFunction(receiver, i, scope2, params)).catch((error2) => handleError(error2, el, value));\n } else {\n receiver(result);\n }\n } else if (typeof value === \"object\" && value instanceof Promise) {\n value.then((i) => receiver(i));\n } else {\n receiver(value);\n }\n}\n\n// packages/alpinejs/src/directives.js\nvar prefixAsString = \"x-\";\nfunction prefix(subject = \"\") {\n return prefixAsString + subject;\n}\nfunction setPrefix(newPrefix) {\n prefixAsString = newPrefix;\n}\nvar directiveHandlers = {};\nfunction directive(name, callback) {\n directiveHandlers[name] = callback;\n return {\n before(directive2) {\n if (!directiveHandlers[directive2]) {\n console.warn(String.raw`Cannot find directive \\`${directive2}\\`. \\`${name}\\` will use the default order of execution`);\n return;\n }\n const pos = directiveOrder.indexOf(directive2);\n directiveOrder.splice(pos >= 0 ? pos : directiveOrder.indexOf(\"DEFAULT\"), 0, name);\n }\n };\n}\nfunction directiveExists(name) {\n return Object.keys(directiveHandlers).includes(name);\n}\nfunction directives(el, attributes, originalAttributeOverride) {\n attributes = Array.from(attributes);\n if (el._x_virtualDirectives) {\n let vAttributes = Object.entries(el._x_virtualDirectives).map(([name, value]) => ({ name, value }));\n let staticAttributes = attributesOnly(vAttributes);\n vAttributes = vAttributes.map((attribute) => {\n if (staticAttributes.find((attr) => attr.name === attribute.name)) {\n return {\n name: `x-bind:${attribute.name}`,\n value: `\"${attribute.value}\"`\n };\n }\n return attribute;\n });\n attributes = attributes.concat(vAttributes);\n }\n let transformedAttributeMap = {};\n let directives2 = attributes.map(toTransformedAttributes((newName, oldName) => transformedAttributeMap[newName] = oldName)).filter(outNonAlpineAttributes).map(toParsedDirectives(transformedAttributeMap, originalAttributeOverride)).sort(byPriority);\n return directives2.map((directive2) => {\n return getDirectiveHandler(el, directive2);\n });\n}\nfunction attributesOnly(attributes) {\n return Array.from(attributes).map(toTransformedAttributes()).filter((attr) => !outNonAlpineAttributes(attr));\n}\nvar isDeferringHandlers = false;\nvar directiveHandlerStacks = /* @__PURE__ */ new Map();\nvar currentHandlerStackKey = Symbol();\nfunction deferHandlingDirectives(callback) {\n isDeferringHandlers = true;\n let key = Symbol();\n currentHandlerStackKey = key;\n directiveHandlerStacks.set(key, []);\n let flushHandlers = () => {\n while (directiveHandlerStacks.get(key).length)\n directiveHandlerStacks.get(key).shift()();\n directiveHandlerStacks.delete(key);\n };\n let stopDeferring = () => {\n isDeferringHandlers = false;\n flushHandlers();\n };\n callback(flushHandlers);\n stopDeferring();\n}\nfunction getElementBoundUtilities(el) {\n let cleanups = [];\n let cleanup = (callback) => cleanups.push(callback);\n let [effect3, cleanupEffect] = elementBoundEffect(el);\n cleanups.push(cleanupEffect);\n let utilities = {\n Alpine: alpine_default,\n effect: effect3,\n cleanup,\n evaluateLater: evaluateLater.bind(evaluateLater, el),\n evaluate: evaluate.bind(evaluate, el)\n };\n let doCleanup = () => cleanups.forEach((i) => i());\n return [utilities, doCleanup];\n}\nfunction getDirectiveHandler(el, directive2) {\n let noop = () => {\n };\n let handler4 = directiveHandlers[directive2.type] || noop;\n let [utilities, cleanup] = getElementBoundUtilities(el);\n onAttributeRemoved(el, directive2.original, cleanup);\n let fullHandler = () => {\n if (el._x_ignore || el._x_ignoreSelf)\n return;\n handler4.inline && handler4.inline(el, directive2, utilities);\n handler4 = handler4.bind(handler4, el, directive2, utilities);\n isDeferringHandlers ? directiveHandlerStacks.get(currentHandlerStackKey).push(handler4) : handler4();\n };\n fullHandler.runCleanups = cleanup;\n return fullHandler;\n}\nvar startingWith = (subject, replacement) => ({ name, value }) => {\n if (name.startsWith(subject))\n name = name.replace(subject, replacement);\n return { name, value };\n};\nvar into = (i) => i;\nfunction toTransformedAttributes(callback = () => {\n}) {\n return ({ name, value }) => {\n let { name: newName, value: newValue } = attributeTransformers.reduce((carry, transform) => {\n return transform(carry);\n }, { name, value });\n if (newName !== name)\n callback(newName, name);\n return { name: newName, value: newValue };\n };\n}\nvar attributeTransformers = [];\nfunction mapAttributes(callback) {\n attributeTransformers.push(callback);\n}\nfunction outNonAlpineAttributes({ name }) {\n return alpineAttributeRegex().test(name);\n}\nvar alpineAttributeRegex = () => new RegExp(`^${prefixAsString}([^:^.]+)\\\\b`);\nfunction toParsedDirectives(transformedAttributeMap, originalAttributeOverride) {\n return ({ name, value }) => {\n let typeMatch = name.match(alpineAttributeRegex());\n let valueMatch = name.match(/:([a-zA-Z0-9\\-_:]+)/);\n let modifiers = name.match(/\\.[^.\\]]+(?=[^\\]]*$)/g) || [];\n let original = originalAttributeOverride || transformedAttributeMap[name] || name;\n return {\n type: typeMatch ? typeMatch[1] : null,\n value: valueMatch ? valueMatch[1] : null,\n modifiers: modifiers.map((i) => i.replace(\".\", \"\")),\n expression: value,\n original\n };\n };\n}\nvar DEFAULT = \"DEFAULT\";\nvar directiveOrder = [\n \"ignore\",\n \"ref\",\n \"data\",\n \"id\",\n \"anchor\",\n \"bind\",\n \"init\",\n \"for\",\n \"model\",\n \"modelable\",\n \"transition\",\n \"show\",\n \"if\",\n DEFAULT,\n \"teleport\"\n];\nfunction byPriority(a, b) {\n let typeA = directiveOrder.indexOf(a.type) === -1 ? DEFAULT : a.type;\n let typeB = directiveOrder.indexOf(b.type) === -1 ? DEFAULT : b.type;\n return directiveOrder.indexOf(typeA) - directiveOrder.indexOf(typeB);\n}\n\n// packages/alpinejs/src/utils/dispatch.js\nfunction dispatch(el, name, detail = {}) {\n el.dispatchEvent(\n new CustomEvent(name, {\n detail,\n bubbles: true,\n // Allows events to pass the shadow DOM barrier.\n composed: true,\n cancelable: true\n })\n );\n}\n\n// packages/alpinejs/src/utils/walk.js\nfunction walk(el, callback) {\n if (typeof ShadowRoot === \"function\" && el instanceof ShadowRoot) {\n Array.from(el.children).forEach((el2) => walk(el2, callback));\n return;\n }\n let skip = false;\n callback(el, () => skip = true);\n if (skip)\n return;\n let node = el.firstElementChild;\n while (node) {\n walk(node, callback, false);\n node = node.nextElementSibling;\n }\n}\n\n// packages/alpinejs/src/utils/warn.js\nfunction warn(message, ...args) {\n console.warn(`Alpine Warning: ${message}`, ...args);\n}\n\n// packages/alpinejs/src/lifecycle.js\nvar started = false;\nfunction start() {\n if (started)\n warn(\"Alpine has already been initialized on this page. Calling Alpine.start() more than once can cause problems.\");\n started = true;\n if (!document.body)\n warn(\"Unable to initialize. Trying to load Alpine before `` is available. Did you forget to add `defer` in Alpine's ` @stop diff --git a/resources/views/hardware/bulk-delete.blade.php b/resources/views/hardware/bulk-delete.blade.php index df988f5ad2..59ba82ff5c 100644 --- a/resources/views/hardware/bulk-delete.blade.php +++ b/resources/views/hardware/bulk-delete.blade.php @@ -28,11 +28,11 @@ - - - - - + + + + + @@ -47,6 +47,8 @@ @endif diff --git a/resources/views/hardware/quickscan.blade.php b/resources/views/hardware/quickscan.blade.php index e4f6c8a55e..867eeaa2b0 100644 --- a/resources/views/hardware/quickscan.blade.php +++ b/resources/views/hardware/quickscan.blade.php @@ -51,12 +51,9 @@ - - - @@ -67,7 +64,7 @@
- +
{!! $errors->first('next_audit_date', '') !!}
@@ -83,16 +80,14 @@ - - - - - @@ -116,7 +111,8 @@ diff --git a/resources/views/hardware/requested.blade.php b/resources/views/hardware/requested.blade.php index 83ea30090f..969bf991a6 100644 --- a/resources/views/hardware/requested.blade.php +++ b/resources/views/hardware/requested.blade.php @@ -40,8 +40,8 @@ }'> - - + + @@ -102,7 +102,13 @@
{{ trans('admin/hardware/table.id') }}{{ trans('general.asset_name') }}{{ trans('admin/hardware/table.location')}}{{ trans('admin/hardware/table.assigned_to') }}{{ trans('admin/hardware/table.id') }}{{ trans('general.asset_name') }}{{ trans('admin/hardware/table.location')}}{{ trans('admin/hardware/table.assigned_to') }}
+ + {{ $asset->assigned_to }} @if ($asset->assignedTo) {{ $asset->assignedTo->present()->name()}} @endif @@ -58,8 +60,12 @@ diff --git a/resources/views/hardware/bulk-restore.blade.php b/resources/views/hardware/bulk-restore.blade.php index e4bfb6e4dd..a998642685 100644 --- a/resources/views/hardware/bulk-restore.blade.php +++ b/resources/views/hardware/bulk-restore.blade.php @@ -53,7 +53,7 @@ diff --git a/resources/views/hardware/bulk.blade.php b/resources/views/hardware/bulk.blade.php index f621d88fa8..cc44993af5 100755 --- a/resources/views/hardware/bulk.blade.php +++ b/resources/views/hardware/bulk.blade.php @@ -48,7 +48,7 @@
@@ -60,25 +60,25 @@
- +
{!! $errors->first('purchase_date', ' :message') !!}
- +
- +
{!! $errors->first('expected_checkin', '') !!} @@ -86,11 +86,38 @@
+ +
+ +
+
+ + +
+ {!! $errors->first('asset_eol_date', ' :message') !!} +
+
+ +
+
+ +
+
+ +
+
+
@@ -178,7 +205,7 @@
- +
{!! $errors->first('next_audit_date', '
diff --git a/resources/views/hardware/checkin.blade.php b/resources/views/hardware/checkin.blade.php index 12a0627aec..5686e74dd4 100755 --- a/resources/views/hardware/checkin.blade.php +++ b/resources/views/hardware/checkin.blade.php @@ -53,7 +53,7 @@ {{ $asset->model->name }} @else - + {{ trans('admin/hardware/general.model_invalid')}} {{ trans('admin/hardware/general.model_invalid_fix')}} diff --git a/resources/views/hardware/checkout.blade.php b/resources/views/hardware/checkout.blade.php index 17b971a5ba..943b4ba798 100755 --- a/resources/views/hardware/checkout.blade.php +++ b/resources/views/hardware/checkout.blade.php @@ -50,7 +50,7 @@ {{ $asset->model->name }} @else - + {{ trans('admin/hardware/general.model_invalid')}} @@ -89,12 +89,12 @@ @include ('partials.forms.checkout-selector', ['user_select' => 'true','asset_select' => 'true', 'location_select' => 'true']) - @include ('partials.forms.edit.user-select', ['translated_name' => trans('general.user'), 'fieldname' => 'assigned_user', 'required'=>'true']) + @include ('partials.forms.edit.user-select', ['translated_name' => trans('general.user'), 'fieldname' => 'assigned_user']) - @include ('partials.forms.edit.asset-select', ['translated_name' => trans('general.asset'), 'fieldname' => 'assigned_asset', 'unselect' => 'true', 'style' => 'display:none;', 'required'=>'true']) + @include ('partials.forms.edit.asset-select', ['translated_name' => trans('general.asset'), 'fieldname' => 'assigned_asset', 'unselect' => 'true', 'style' => 'display:none;']) - @include ('partials.forms.edit.location-select', ['translated_name' => trans('general.location'), 'fieldname' => 'assigned_location', 'style' => 'display:none;', 'required'=>'true']) + @include ('partials.forms.edit.location-select', ['translated_name' => trans('general.location'), 'fieldname' => 'assigned_location', 'style' => 'display:none;']) @@ -109,8 +109,8 @@ - + +
{!! $errors->first('checkout_at', '') !!}
@@ -128,8 +128,9 @@ - + + + {!! $errors->first('expected_checkin', '') !!} @@ -153,13 +154,13 @@
@if ($asset->requireAcceptance()) - + {{ trans('admin/categories/general.required_acceptance') }}
@endif @if ($asset->getEula()) - + {{ trans('admin/categories/general.required_eula') }}
@endif diff --git a/resources/views/hardware/edit.blade.php b/resources/views/hardware/edit.blade.php index f31326cc4d..efd5d24b9c 100755 --- a/resources/views/hardware/edit.blade.php +++ b/resources/views/hardware/edit.blade.php @@ -28,8 +28,7 @@ @if ($item->id) -
- +
{!! $errors->first('asset_tags', ' :message') !!} @@ -37,14 +36,14 @@
@else -
+
{!! $errors->first('asset_tags', ' :message') !!} {!! $errors->first('asset_tag', ' :message') !!}
@endif @@ -103,7 +102,7 @@
- + {{ trans('admin/hardware/form.optional_infos') }} @@ -124,7 +123,7 @@
- +
@@ -153,7 +152,7 @@
- + {{ trans('admin/hardware/form.order_details') }} @@ -255,17 +254,15 @@ $("#assigned_user").show(); $("#selected_status_status").removeClass('text-danger'); - $("#selected_status_status").removeClass('text-warning'); $("#selected_status_status").addClass('text-success'); - $("#selected_status_status").html(' {{ trans('admin/hardware/form.asset_deployable')}}'); + $("#selected_status_status").html(' {{ trans('admin/hardware/form.asset_deployable')}}'); } else { $("#assignto_selector").hide(); - $("#selected_status_status").removeClass('text-danger'); $("#selected_status_status").removeClass('text-success'); - $("#selected_status_status").addClass('text-warning'); - $("#selected_status_status").html(' {{ trans('admin/hardware/form.asset_not_deployable')}} '); + $("#selected_status_status").addClass('text-danger'); + $("#selected_status_status").html(' {{ (($item->assigned_to!='') && ($item->assigned_type!='') && ($item->deleted_at == '')) ? trans('admin/hardware/form.asset_not_deployable_checkin') : trans('admin/hardware/form.asset_not_deployable') }} '); } } }); @@ -303,7 +300,7 @@ e.preventDefault(); - var auto_tag = $("#asset_tag").val().replace(/[^\d]/g, ''); + var auto_tag = $("#asset_tag").val().replace(/^{{ preg_quote(App\Models\Setting::getSettings()->auto_increment_prefix) }}/g, ''); var box_html = ''; const zeroPad = (num, places) => String(num).padStart(places, '0'); @@ -324,7 +321,7 @@ box_html += ''; box_html += '
'; box_html += '
'; - box_html += ''; + box_html += ''; box_html += '
'; box_html += '
'; box_html += '
'; diff --git a/resources/views/hardware/quickscan-checkin.blade.php b/resources/views/hardware/quickscan-checkin.blade.php index ec6ef5719f..de892399cc 100644 --- a/resources/views/hardware/quickscan-checkin.blade.php +++ b/resources/views/hardware/quickscan-checkin.blade.php @@ -69,7 +69,7 @@
@@ -99,7 +99,7 @@
ImageItem Name{{ trans('general.image') }}{{ trans('general.name') }} {{ trans('admin/hardware/table.location') }} {{ trans('admin/hardware/form.expected_checkin') }} {{ trans('admin/hardware/table.requesting_user') }} {{ Form::open([ 'method' => 'POST', - 'route' => ['account/request-item', $request->itemType(), $request->requestable->id, true, $request->requestingUser()->id], + 'route' => [ + 'account/request-item', + $request->itemType(), + $request->requestable->id, + true, + $request->requestingUser()->id + ], ]) }} {{ Form::close() }} diff --git a/resources/views/hardware/view.blade.php b/resources/views/hardware/view.blade.php index 4961cfce25..6a260cf254 100755 --- a/resources/views/hardware/view.blade.php +++ b/resources/views/hardware/view.blade.php @@ -27,7 +27,7 @@ [ 'warning' => trans('admin/hardware/message.warning_audit_date_mismatch', [ - 'last_audit_date' => Helper::getFormattedDateObject($asset->last_audit_date, 'date', false), + 'last_audit_date' => Helper::getFormattedDateObject($asset->last_audit_date, 'datetime', false), 'next_audit_date' => Helper::getFormattedDateObject($asset->next_audit_date, 'date', false) ] ) @@ -44,7 +44,7 @@
  • @@ -53,7 +53,7 @@
  • @@ -98,7 +98,7 @@
  • +
  • - - {{ trans('button.upload') }} + +
  • @endcan @@ -150,19 +155,20 @@ @if ($asset->deleted_at!='')
    - - {{ trans('admin/users/message.user_deleted_warning') }} + + {{ trans('general.asset_deleted_warning') }}
    @endif +
    -
    +
    @if (($asset->image) || (($asset->model) && ($asset->model->image!=''))) @@ -172,24 +178,36 @@
    + @if ($asset->deleted_at=='') + @can('update', $asset) + + @endcan + @if (($asset->assetstatus) && ($asset->assetstatus->deployable=='1')) @if (($asset->assigned_to != '') && ($asset->deleted_at=='')) - @can('checkin', \App\Models\Asset::class) -
    + @can('checkin', $asset) +
    model ? ' data-tooltip="true" title="'.trans('admin/hardware/general.model_invalid_fix').'"' : '') !!}> - - {{ trans('admin/hardware/general.checkin') }} - + + + {{ trans('admin/hardware/general.checkin') }} +
    @endcan @elseif (($asset->assigned_to == '') && ($asset->deleted_at=='')) - @can('checkout', \App\Models\Asset::class) + @can('checkout', $asset)
    model ? ' data-tooltip="true" title="'.trans('admin/hardware/general.model_invalid_fix').'"' : '') !!}> - - {{ trans('admin/hardware/general.checkout') }} + + + {{ trans('admin/hardware/general.checkout') }}
    @@ -197,19 +215,13 @@ @endif @endif - @if ($asset->deleted_at=='') - @can('update', $asset) - - @endcan + @can('audit', \App\Models\Asset::class)
    model ? ' data-tooltip="true" title="'.trans('admin/hardware/general.model_invalid_fix').'"' : '') !!}> - + + {{ trans('general.audit') }} @@ -219,22 +231,49 @@ @can('create', $asset) @endcan +
    + {{ Form::open([ + 'method' => 'POST', + 'route' => ['hardware/bulkedit'], + 'class' => 'form-inline', + 'target'=>'_blank', + 'id' => 'bulkForm']) }} + + + + {{ Form::close() }} +
    + @can('delete', $asset)
    + @if ($asset->deleted_at=='') - {{ trans('general.delete') }} @else
    @csrf - +
    @endif
    @@ -244,36 +283,54 @@

    {{ trans('admin/hardware/form.checkedout_to') }} +

    -

    + +

      + @if (($asset->checkedOutToUser()) && ($asset->assignedTo->present()->gravatar())) - {{ $asset->assignedTo->present()->fullName() }} +
    • + {{ $asset->assignedTo->present()->fullName() }} + {!! $asset->assignedTo->present()->nameUrl() !!} +
    • + @else +
    • + + {!! $asset->assignedTo->present()->nameUrl() !!} +
    • @endif -

      - {!! $asset->assignedTo->present()->glyph() . ' ' .$asset->assignedTo->present()->nameUrl() !!} -
        + @if ((isset($asset->assignedTo->employee_num)) && ($asset->assignedTo->employee_num!='')) +
      • + + {{ $asset->assignedTo->employee_num }} +
      • + @endif @if ((isset($asset->assignedTo->email)) && ($asset->assignedTo->email!=''))
      • - + {{ $asset->assignedTo->email }}
      • @endif @if ((isset($asset->assignedTo)) && ($asset->assignedTo->phone!=''))
      • - + {{ $asset->assignedTo->phone }}
      • @endif @if((isset($asset->assignedTo)) && ($asset->assignedTo->department)) -
      • {{ trans('admin/hardware/general.user_department') }}: {{ $asset->assignedTo->department->name}}
      • +
      • + + {{ $asset->assignedTo->department->name}}
      • @endif @if (isset($asset->location)) -
      • {{ $asset->location->name }}
      • +
      • + + {{ $asset->location->name }}
      • {{ $asset->location->address }} @if ($asset->location->address2!='') {{ $asset->location->address2 }} @@ -288,11 +345,13 @@
      • @endif
      • - {{ trans('admin/hardware/form.checkout_date') }}: {{ Helper::getFormattedDateObject($asset->last_checkout, 'date', false) }} + + {{ trans('admin/hardware/form.checkout_date') }}: {{ Helper::getFormattedDateObject($asset->last_checkout, 'date', false) }}
      • @if (isset($asset->expected_checkin))
      • - {{ trans('admin/hardware/form.expected_checkin') }}: {{ Helper::getFormattedDateObject($asset->expected_checkin, 'date', false) }} + + {{ trans('admin/hardware/form.expected_checkin') }}: {{ Helper::getFormattedDateObject($asset->expected_checkin, 'date', false) }}
      • @endif
      @@ -312,7 +371,7 @@ -
      +
      @@ -354,20 +413,21 @@
      @if (($asset->assignedTo) && ($asset->deleted_at=='')) - + {{ $asset->assetstatus->name }} - - {!! $asset->assignedTo->present()->glyph() !!} + + + {!! $asset->assignedTo->present()->nameUrl() !!} @else @if (($asset->assetstatus) && ($asset->assetstatus->deployable=='1')) - + @elseif (($asset->assetstatus) && ($asset->assetstatus->pending=='1')) - + @else - + @endif {{ $asset->assetstatus->name }} @@ -438,7 +498,7 @@
      {!! $asset->checkInvalidNextAuditDate() ? '' : '' !!} - {{ Helper::getFormattedDateObject($audit_log->created_at, 'date', false) }} + {{ Helper::getFormattedDateObject($audit_log->created_at, 'datetime', false) }} @if ($audit_log->user) (by {{ link_to_route('users.show', $audit_log->user->present()->fullname(), [$audit_log->user->id]) }}) @endif @@ -484,38 +544,39 @@ @if (($asset->model) && ($asset->model->manufacturer) && ($asset->model->manufacturer->url!=''))
    • - + {{ $asset->present()->dynamicUrl($asset->model->manufacturer->url) }} - +
    • @endif @if (($asset->model) && ($asset->model->manufacturer) && ($asset->model->manufacturer->support_url!=''))
    • - + {{ $asset->present()->dynamicUrl($asset->model->manufacturer->support_url) }} - +
    • @endif @if (($asset->model) && ($asset->model->manufacturer) && ($asset->model->manufacturer->warranty_lookup_url!=''))
    • - + {{ $asset->present()->dynamicUrl($asset->model->manufacturer->warranty_lookup_url) }} - + + {{ trans('admin/hardware/general.mfg_warranty_lookup', ['manufacturer' => $asset->model->manufacturer->name]) }}
    • @endif @if (($asset->model) && ($asset->model->manufacturer->support_phone))
    • - + {{ $asset->model->manufacturer->support_phone }} @@ -524,7 +585,7 @@ @if (($asset->model) && ($asset->model->manufacturer->support_email))
    • - + {{ $asset->model->manufacturer->support_email }} @@ -602,6 +663,16 @@
    • + +
      +
      + {{ trans('admin/hardware/general.requestable') }} +
      +
      + {!! ($asset->requestable=='1') ? ' '.trans('general.yes') : ' '.trans('general.no') !!} +
      +
      + @if (($asset->model) && ($asset->model->fieldset)) @foreach($asset->model->fieldset->fields as $field)
      @@ -612,6 +683,7 @@
      @if (($field->field_encrypted=='1') && ($asset->{$field->db_column_name()}!='')) + @endif @@ -783,7 +855,8 @@ @if (($asset->model) && ($asset->model->manufacturer) && ($asset->model->manufacturer->warranty_lookup_url!='')) - + + {{ trans('admin/hardware/general.mfg_warranty_lookup', ['manufacturer' => $asset->model->manufacturer->name]) }} @endif
      @@ -876,14 +949,13 @@ @else {{ trans('general.na_no_purchase_date') }} @endif - @if ($asset->eol_explicit) - + @if ($asset->eol_explicit =='1') + + + @endif
    @@ -1027,29 +1099,10 @@ {{ ($asset->userRequests) ? (int) $asset->userRequests->count() : '0' }}
    -
    -
    - - {{ trans('general.label') }} - -
    -
    - {{ Form::open([ - 'method' => 'POST', - 'route' => ['hardware/bulkedit'], - 'class' => 'form-inline', - 'id' => 'bulkForm']) }} - - - - - {{ Form::close() }} - -
    -
    +
    @@ -1092,8 +1145,8 @@
    @else -

    - +
    + {{ trans('general.no_results') }}
    @endif @@ -1129,7 +1182,7 @@ {{ Helper::formatCurrencyOutput($component->purchase_cost) }} each {{ $component->serial }} - {{ trans('general.checkin') }} + {{ trans('general.checkin') }} purchase_cost *$component->pivot->assigned_qty) ?> @@ -1147,8 +1200,8 @@ @else -
    - +
    + {{ trans('general.no_results') }}
    @endif @@ -1211,8 +1264,8 @@ @else -
    - +
    + {{ trans('general.no_results') }}
    @endif @@ -1309,100 +1362,11 @@
    - - @if ($asset->uploads->count() > 0) - - - - - - - - - - - - - - - - @foreach ($asset->uploads as $file) - - - - - - - - - - - @endforeach - -
    {{trans('general.file_type')}}{{ trans('general.image') }}{{ trans('general.file_name') }}{{ trans('general.filesize') }}{{ trans('general.notes') }}{{ trans('general.download') }}{{ trans('general.created_at') }}{{ trans('table.actions') }}
    - @if ( Helper::checkUploadIsImage($file->get_src('assets'))) - - - - @endif - - @if (Storage::exists('private_uploads/assets/'.$file->filename)) - {{ $file->filename }} - @else - {{ $file->filename }} - @endif - - {{ @Helper::formatFilesizeUnits(Storage::exists('private_uploads/assets/'.$file->filename) ? Storage::size('private_uploads/assets/'.$file->filename) : '') }} - - @if ($file->note) - {{ $file->note }} - @endif - - @if (($file->filename) && (Storage::exists('private_uploads/assets/'.$file->filename))) - - - - - - - - @endif - - @if ($file->created_at) - {{ Helper::getFormattedDateObject($file->created_at, 'datetime', false) }} - @endif - - @can('update', \App\Models\Asset::class) - - @endcan -
    - - @else - -
    - - {{ trans('general.no_results') }} -
    - @endif - +
    @@ -1412,99 +1376,11 @@
    - @if (($asset->model) && ($asset->model->uploads->count() > 0)) - - - - - - - - - - - - - - - - @foreach ($asset->model->uploads as $file) - - - - - - - - - - - @endforeach - -
    {{trans('general.file_type')}}{{ trans('general.image') }}{{ trans('general.file_name') }}{{ trans('general.filesize') }}{{ trans('general.notes') }}{{ trans('general.download') }}{{ trans('general.created_at') }}{{ trans('table.actions') }}
    - @if ( Helper::checkUploadIsImage($file->get_src('assetmodels'))) - - - - @endif - - @if (Storage::exists('private_uploads/assetmodels/'.$file->filename)) - {{ $file->filename }} - @else - {{ $file->filename }} - @endif - - {{ (Storage::exists('private_uploads/assetmodels/'.$file->filename)) ? Helper::formatFilesizeUnits(Storage::size('private_uploads/assetmodels/'.$file->filename)) : '' }} - - @if ($file->note) - {{ $file->note }} - @endif - - @if (($file->filename) && (Storage::exists('private_uploads/assetmodels/'.$file->filename))) - - - - - - - - - @endif - - @if ($file->created_at) - {{ Helper::getFormattedDateObject($file->created_at, 'datetime', false) }} - @endif - - @can('update', \App\Models\AssetModel::class) - - @endcan -
    - - @else - -
    - - {{ trans('general.no_results') }} -
    - @endif +
    diff --git a/resources/views/kits/checkout.blade.php b/resources/views/kits/checkout.blade.php index 265329259c..212f72c118 100644 --- a/resources/views/kits/checkout.blade.php +++ b/resources/views/kits/checkout.blade.php @@ -33,7 +33,7 @@
    - +
    {!! $errors->first('checkout_at', ' :message') !!}
    @@ -47,7 +47,7 @@
    - +
    {!! $errors->first('expected_checkin', ' :message') !!}
    @@ -68,7 +68,7 @@
    diff --git a/resources/views/layouts/default.blade.php b/resources/views/layouts/default.blade.php index 2c38e59111..4d4289ab22 100644 --- a/resources/views/layouts/default.blade.php +++ b/resources/views/layouts/default.blade.php @@ -145,7 +145,7 @@ dir="{{ Helper::determineLanguageDirection() }}"> @can('index', \App\Models\Asset::class) @@ -153,7 +153,7 @@ dir="{{ Helper::determineLanguageDirection() }}"> @can('view', \App\Models\License::class) @@ -161,7 +161,7 @@ dir="{{ Helper::determineLanguageDirection() }}"> @can('index', \App\Models\Accessory::class) @@ -169,7 +169,7 @@ dir="{{ Helper::determineLanguageDirection() }}"> @can('index', \App\Models\Consumable::class) @@ -177,7 +177,7 @@ dir="{{ Helper::determineLanguageDirection() }}"> @can('view', \App\Models\Component::class) @@ -189,15 +189,15 @@ dir="{{ Helper::determineLanguageDirection() }}"> action="{{ route('findbytag/hardware') }}" method="get">
    - - + +
    -
    @@ -216,7 +216,7 @@ dir="{{ Helper::determineLanguageDirection() }}"> @can('create', \App\Models\Asset::class)
  • - + {{ trans('general.asset') }}
  • @@ -224,7 +224,7 @@ dir="{{ Helper::determineLanguageDirection() }}"> @can('create', \App\Models\License::class)
  • - + {{ trans('general.license') }}
  • @@ -232,7 +232,7 @@ dir="{{ Helper::determineLanguageDirection() }}"> @can('create', \App\Models\Accessory::class)
  • - + {{ trans('general.accessory') }}
  • @@ -240,7 +240,7 @@ dir="{{ Helper::determineLanguageDirection() }}"> @can('create', \App\Models\Consumable::class)
  • - + {{ trans('general.consumable') }}
  • @@ -248,7 +248,7 @@ dir="{{ Helper::determineLanguageDirection() }}"> @can('create', \App\Models\Component::class)
  • - + {{ trans('general.component') }}
  • @@ -256,7 +256,7 @@ dir="{{ Helper::determineLanguageDirection() }}"> @can('create', \App\Models\User::class)
  • - + {{ trans('general.user') }}
  • @@ -268,18 +268,25 @@ dir="{{ Helper::determineLanguageDirection() }}"> @can('admin') @if ($snipeSettings->show_alerts_in_menu=='1') - +
    @@ -191,16 +193,16 @@ @endcan @if ($license->supplier->url) -
    {{ $license->supplier->url }} +
    {{ $license->supplier->url }} @endif @if ($license->supplier->phone) -
    +
    {{ $license->supplier->phone }} @endif @if ($license->supplier->email) -
    {{ $license->supplier->email }} +
    {{ $license->supplier->email }} @endif @if ($license->supplier->address) @@ -462,100 +464,13 @@ @can('licenses.files', $license)
    -
    - - - - - - - - - - - - - - - @if ($license->uploads->count() > 0) - @foreach ($license->uploads as $file) - - - - - + - - - - - - @endforeach - @else - - - - @endif - -
    {{trans('general.file_type')}}{{ trans('general.image') }}{{ trans('general.file_name') }}{{ trans('general.filesize') }}{{ trans('general.notes') }}{{ trans('general.download') }}{{ trans('general.created_at') }}{{ trans('table.actions') }}
    - - {{ Helper::filetype_icon($file->filename) }} - - @if ($file->filename) - @if ((Storage::exists('private_uploads/licenses/'.$file->filename)) && ( Helper::checkUploadIsImage($file->get_src('licenses')))) - - @endif - @endif - - @if (Storage::exists('private_uploads/licenses/'.$file->filename)) - {{ $file->filename }} - @else - {{ $file->filename }} - @endif - - {{ (Storage::exists('private_uploads/licenses/'.$file->filename)) ? Helper::formatFilesizeUnits(Storage::size('private_uploads/licenses/'.$file->filename)) : '' }} - - @if ($file->note) - {{ $file->note }} - @endif - - @if ($file->filename) - - - {{ trans('general.download') }} - - - - - - - @endif - {{ $file->created_at }} - - - {{ trans('general.delete') }} - -
    {{ trans('general.no_results') }}
    -
    @endcan @@ -610,48 +525,64 @@
    @can('update', $license) - {{ trans('admin/licenses/general.edit') }} - {{ trans('admin/licenses/general.clone') }} + + + {{ trans('admin/licenses/general.edit') }} + + + + {{ trans('admin/licenses/general.clone') }} @endcan @can('checkout', $license) @if ($license->availCount()->count() > 0) - + + + {{ trans('general.checkout') }} - + + + {{ trans('admin/licenses/general.bulk.checkout_all.button') }} @else - - {{ trans('general.checkout') }} - + + + + {{ trans('general.checkout') }} + + - - {{ trans('admin/licenses/general.bulk.checkout_all.button') }} - - + + + {{ trans('admin/licenses/general.bulk.checkout_all.button') }} + + @endif @endcan @can('checkin', $license) - + @if (($license->seats - $license->availCount()->count()) <= 0 ) - + + {{ trans('admin/licenses/general.bulk.checkin_all.button') }} @elseif (! $license->reassignable) - + + {{ trans('admin/licenses/general.bulk.checkin_all.button') }} @else - + + {{ trans('admin/licenses/general.bulk.checkin_all.button') }} @endif @@ -660,12 +591,14 @@ @can('delete', $license) @if ($license->availCount()->count() == $license->seats) - @else - + + {{ trans('general.delete') }} diff --git a/resources/views/livewire/custom-field-set-default-values-for-model.blade.php b/resources/views/livewire/custom-field-set-default-values-for-model.blade.php index 7f61db8cea..8f68644099 100644 --- a/resources/views/livewire/custom-field-set-default-values-for-model.blade.php +++ b/resources/views/livewire/custom-field-set-default-values-for-model.blade.php @@ -9,18 +9,20 @@ {!! $errors->first('custom_fieldset', '') !!}
    + @if ($fieldset_id) + {{ Form::checkbox('add_default_values', 1, old('add_default_values', $add_default_values), ['data-livewire-component' => $this->getId(), 'id' => 'add_default_values', 'wire:model.live' => 'add_default_values', 'disabled' => $this->fields->isEmpty()]) }} + {{ trans('admin/models/general.add_default_values') }} + + @endif
    - @if ($this->add_default_values ) {{-- 'if the checkbox is enabled *AND* there are more than 0 fields in the fieldsset' --}} - @if ($fields) + @if ($add_default_values) + @if ($this->fields) - @foreach ($fields as $field) -
    + @foreach ($this->fields as $field) +
    @@ -30,30 +32,57 @@
    - - + +
    @elseif ($field->element == "text") - + @elseif($field->element == "textarea") - + @elseif($field->element == "listbox") - @foreach(explode("\r\n", $field->field_values) as $field_value) - + @endforeach @@ -61,16 +90,30 @@ @elseif($field->element == "radio") @foreach(explode("\r\n", $field->field_values) as $field_value) - + @endforeach @elseif($field->element == "checkbox") @foreach(explode("\r\n", $field->field_values) as $field_value) -
    + @endforeach - - @endif + + @endif @endif diff --git a/resources/views/livewire/importer.blade.php b/resources/views/livewire/importer.blade.php index 7371dd2fe8..be590593ba 100644 --- a/resources/views/livewire/importer.blade.php +++ b/resources/views/livewire/importer.blade.php @@ -119,9 +119,9 @@ - @foreach($files as $currentFile) + @foreach($this->files as $currentFile) - + {{ $currentFile->file_path }} {{ Helper::getFormattedDateObject($currentFile->created_at, 'datetime', false) }} {{ Helper::formatFilesizeUnits($currentFile->filesize) }} @@ -130,25 +130,25 @@ {{ trans('general.import') }} - + - @if( $currentFile && $activeFile && ($currentFile->id == $activeFile->id)) + @if( $currentFile && $this->activeFile && ($currentFile->id == $this->activeFile->id))
    -
    - @if($activeFile->header_row) + @if(! empty($headerRow)) - @foreach($activeFile->header_row as $index => $header) + @foreach($headerRow as $index => $header)
    - {{ Form::select('field_map.'.$index, $columnOptions[$activeFile->import_type], @$field_map[$index], + {{ Form::select('field_map.'.$index, $columnOptions[$typeOfImport], @$field_map[$index], [ 'class' => 'mappings livewire-select2', 'placeholder' => trans('general.importer.do_not_import'), @@ -241,9 +241,9 @@ ]) }}
    - @if (($activeFile->first_row) && (array_key_exists($index, $activeFile->first_row))) + @if (($this->activeFile->first_row) && (array_key_exists($index, $this->activeFile->first_row)))
    -

    {{ str_limit($activeFile->first_row[$index], 50, '...') }}

    +

    {{ str_limit($this->activeFile->first_row[$index], 50, '...') }}

    @else @php @@ -259,7 +259,7 @@
    @@ -275,10 +275,10 @@ @else - @endif {{-- end of if ... activeFile->import_type --}} + @endif {{-- end of if ... $typeOfImport --}}
    @@ -336,7 +336,7 @@ // we have to hook up to the `` at the root of this display, // because the #import button isn't visible until you click an import_type $('#upload-table').on('click', '#import', function () { - if (!$wire.$get('activeFile.import_type')) { + if (!$wire.$get('typeOfImport')) { $wire.$set('statusType', 'error'); $wire.$set('statusText', "An import type is required... "); //TODO: translate? return; @@ -348,15 +348,15 @@ // console.warn("Here is the mappings:") // console.dir(mappings) // console.warn("Uh, active file id is, I guess: "+$wire.$get('activeFile.id')) - var this_file = $wire.$get('file_id'); // okay, I actually don't know what I'm doing here. + var file_id = $wire.$get('activeFileId'); $.post({ {{-- I want to do something like: route('api.imports.importFile', $activeFile->id) }} --}} - url: "api/v1/imports/process/"+this_file, // maybe? Good a guess as any..FIXME. HARDCODED DUMB FILE + url: "api/v1/imports/process/"+file_id, // maybe? Good a guess as any..FIXME. HARDCODED DUMB FILE contentType: 'application/json', data: JSON.stringify({ 'import-update': !!$wire.$get('update'), 'send-welcome': !!$wire.$get('send_welcome'), - 'import-type': $wire.$get('activeFile.import_type'), + 'import-type': $wire.$get('typeOfImport'), 'run-backup': !!$wire.$get('run_backup'), 'column-mappings': mappings }), @@ -396,7 +396,7 @@ } } - $wire.$set('activeFile', null); //$wire.$set('hideDetails') + $wire.$set('activeFileId', null); //$wire.$set('hideDetails') }); }) return false; diff --git a/resources/views/livewire/oauth-clients.blade.php b/resources/views/livewire/oauth-clients.blade.php index 7caf5f6a2f..fdd3b800b6 100644 --- a/resources/views/livewire/oauth-clients.blade.php +++ b/resources/views/livewire/oauth-clients.blade.php @@ -3,6 +3,7 @@

    + {{ trans('admin/settings/general.oauth_clients') }}

    @if ($authorizationError) diff --git a/resources/views/livewire/slack-settings-form.blade.php b/resources/views/livewire/slack-settings-form.blade.php index a5de8585e3..76b3987229 100644 --- a/resources/views/livewire/slack-settings-form.blade.php +++ b/resources/views/livewire/slack-settings-form.blade.php @@ -15,7 +15,14 @@
    {{csrf_field()}} - + @if (session()->has('warning')) +
    + {!! session('warning') !!} + @php + session()->forget('warning'); // Clear the session flash immediately + @endphp +
    + @endif
    @@ -153,7 +160,7 @@ + {{ $save_button }}
    diff --git a/resources/views/locations/bulk-delete.blade.php b/resources/views/locations/bulk-delete.blade.php index deab1e7fbd..e75d5f5f73 100644 --- a/resources/views/locations/bulk-delete.blade.php +++ b/resources/views/locations/bulk-delete.blade.php @@ -51,7 +51,7 @@
    diff --git a/resources/views/locations/edit.blade.php b/resources/views/locations/edit.blade.php index 95ba245359..4b4e655a52 100755 --- a/resources/views/locations/edit.blade.php +++ b/resources/views/locations/edit.blade.php @@ -25,9 +25,15 @@ -
    - {{ Form::text('currency', old('currency', $item->currency), array('class' => 'form-control','placeholder' => 'USD', 'maxlength'=>'3', 'style'=>'width: 60px;', 'aria-label'=>'currency')) }} - {!! $errors->first('currency', '') !!} +
    + + @error('currency') + + + {{ $message }} + + @enderror +
    @@ -39,9 +45,14 @@ -
    - {{ Form::text('ldap_ou', old('ldap_ou', $item->ldap_ou), array('class' => 'form-control')) }} - {!! $errors->first('ldap_ou', '') !!} +
    + + @error('ldap_ou') + + + {{ $message }} + + @enderror
    @endif diff --git a/resources/views/locations/view.blade.php b/resources/views/locations/view.blade.php index c6aa083bf5..a0d3b8c742 100644 --- a/resources/views/locations/view.blade.php +++ b/resources/views/locations/view.blade.php @@ -9,6 +9,10 @@ @parent @stop +@section('header_right') + + {{ trans('general.back') }} +@endsection {{-- Page content --}} @section('content') @@ -21,7 +25,7 @@
  • - - - + @if ($location->image!='') +
    + {{ $location->name }} +
    + @endif + @if (($location->state!='') && ($location->country!='') && (config('services.google.maps_api_key'))) +
    + Map +
    + @endif - @if ($location->image!='') -
    - {{ $location->name }} -
    - @endif
    -
      - @if ($location->address!='') -
    • {{ $location->address }}
    • - @endif - @if ($location->address2!='') -
    • {{ $location->address2 }}
    • - @endif - @if (($location->city!='') || ($location->state!='') || ($location->zip!='')) -
    • {{ $location->city }} {{ $location->state }} {{ $location->zip }}
    • - @endif - @if ($location->manager) -
    • {{ trans('admin/users/table.manager') }}: {!! $location->manager->present()->nameUrl() !!}
    • - @endif - @if ($location->parent) -
    • {{ trans('admin/locations/table.parent') }}: {!! $location->parent->present()->nameUrl() !!}
    • - @endif +
        + @if ($location->address!='') +
      • {{ $location->address }}
      • + @endif + @if ($location->address2!='') +
      • {{ $location->address2 }}
      • + @endif + @if (($location->city!='') || ($location->state!='') || ($location->zip!='')) +
      • {{ $location->city }} {{ $location->state }} {{ $location->zip }}
      • + @endif + @if ($location->manager) +
      • {{ trans('admin/users/table.manager') }}: {!! $location->manager->present()->nameUrl() !!}
      • + @endif + @if ($location->parent) +
      • {{ trans('admin/locations/table.parent') }}: {!! $location->parent->present()->nameUrl() !!}
      • + @endif @if ($location->ldap_ou)
      • {{ trans('admin/locations/table.ldap_ou') }}: {{ $location->ldap_ou }}
      • @endif -
      - @if (($location->state!='') && ($location->country!='') && (config('services.google.maps_api_key'))) -
      - Map -
      - @endif + @if ((($location->address!='') && ($location->city!='')) || ($location->state!='') || ($location->country!='')) +
    • + + {!! trans('admin/locations/message.open_map', ['map_provider_icon' => '']) !!} + + +
    • +
    • + + {!! trans('admin/locations/message.open_map', ['map_provider_icon' => '']) !!} + +
    • + @endif +
    + @can('update', $location) + + @endcan + + + + + @can('delete', $location) +
    + + @if ($location->deleted_at=='') + + @if ($location->isDeletable()) + + @else + + + {{ trans('general.delete') }} + + @endif + + @else +
    + @csrf + +
    + @endif +
    + @endcan + - -
    -
  • +
    + @stop @section('moar_scripts') + + + @include ('partials.bootstrap-table', [ - 'exportFile' => 'locations-export', - 'search' => true - ]) +'exportFile' => 'locations-export', +'search' => true +]) @stop diff --git a/resources/views/notifications/markdown/checkin-accessory.blade.php b/resources/views/mail/markdown/checkin-accessory.blade.php similarity index 100% rename from resources/views/notifications/markdown/checkin-accessory.blade.php rename to resources/views/mail/markdown/checkin-accessory.blade.php diff --git a/resources/views/notifications/markdown/checkin-asset.blade.php b/resources/views/mail/markdown/checkin-asset.blade.php similarity index 100% rename from resources/views/notifications/markdown/checkin-asset.blade.php rename to resources/views/mail/markdown/checkin-asset.blade.php diff --git a/resources/views/notifications/markdown/checkin-license.blade.php b/resources/views/mail/markdown/checkin-license.blade.php similarity index 54% rename from resources/views/notifications/markdown/checkin-license.blade.php rename to resources/views/mail/markdown/checkin-license.blade.php index 0f14c4bfda..d6e146a962 100644 --- a/resources/views/notifications/markdown/checkin-license.blade.php +++ b/resources/views/mail/markdown/checkin-license.blade.php @@ -6,15 +6,15 @@ @component('mail::table') | | | | ------------- | ------------- | -| **{{ trans('mail.asset_name') }}** | {{ $item->name }} | -@if (isset($item->manufacturer)) -| **{{ trans('general.manufacturer') }}** | {{ $item->manufacturer->name }} | +| **{{ trans('mail.asset_name') }}** | {{ $license->name }} | +@if (isset($license->manufacturer)) +| **{{ trans('general.manufacturer') }}** | {{ $license->manufacturer->name }} | @endif -@if ($target->can('update', $item)) -| **Key** | {{ $item->serial }} | +@if (($target instanceof \App\Models\User && $target->can('view', $license)) ||($target instanceof \App\Models\Asset && $license_seat->user->can('view', $license))) +| **Key** | {{ $license->serial }} | @endif @if (isset($item->category)) -| **{{ trans('general.category') }}** | {{ $item->category->name }} | +| **{{ trans('general.category') }}** | {{ $license->category->name }} | @endif @if ($admin) | **{{ trans('general.administrator') }}** | {{ $admin->present()->fullName() }} | diff --git a/resources/views/notifications/markdown/checkout-accessory.blade.php b/resources/views/mail/markdown/checkout-accessory.blade.php similarity index 100% rename from resources/views/notifications/markdown/checkout-accessory.blade.php rename to resources/views/mail/markdown/checkout-accessory.blade.php diff --git a/resources/views/notifications/markdown/checkout-asset.blade.php b/resources/views/mail/markdown/checkout-asset.blade.php similarity index 99% rename from resources/views/notifications/markdown/checkout-asset.blade.php rename to resources/views/mail/markdown/checkout-asset.blade.php index 9b5fc26dc2..aae0b21584 100644 --- a/resources/views/notifications/markdown/checkout-asset.blade.php +++ b/resources/views/mail/markdown/checkout-asset.blade.php @@ -73,4 +73,4 @@ {{ $snipeSettings->site_name }} -@endcomponent +@endcomponent \ No newline at end of file diff --git a/resources/views/notifications/markdown/checkout-consumable.blade.php b/resources/views/mail/markdown/checkout-consumable.blade.php similarity index 89% rename from resources/views/notifications/markdown/checkout-consumable.blade.php rename to resources/views/mail/markdown/checkout-consumable.blade.php index 06e73243ca..0c8571acf5 100644 --- a/resources/views/notifications/markdown/checkout-consumable.blade.php +++ b/resources/views/mail/markdown/checkout-consumable.blade.php @@ -11,9 +11,15 @@ | **{{ trans('mail.checkout_date') }}** | {{ $checkout_date }} | @endif | **{{ trans('general.consumable') }}** | {{ $item->name }} | +@if (isset($qty)) +| **{{ trans('general.qty') }}** | {{ $qty }} | +@endif @if (isset($item->manufacturer)) | **{{ trans('general.manufacturer') }}** | {{ $item->manufacturer->name }} | @endif +@if (isset($qty)) +| **{{ trans('general.qty') }}** | {{ $qty }} | +@endif @if (isset($item->model_no)) | **{{ trans('general.model_no') }}** | {{ $item->model_no }} | @endif diff --git a/resources/views/notifications/markdown/checkout-license.blade.php b/resources/views/mail/markdown/checkout-license.blade.php similarity index 68% rename from resources/views/notifications/markdown/checkout-license.blade.php rename to resources/views/mail/markdown/checkout-license.blade.php index 08e1e5c763..2c4cd39cc4 100644 --- a/resources/views/notifications/markdown/checkout-license.blade.php +++ b/resources/views/mail/markdown/checkout-license.blade.php @@ -9,15 +9,15 @@ @if (isset($checkout_date)) | **{{ trans('mail.checkout_date') }}** | {{ $checkout_date }} | @endif -| **{{ trans('general.license') }}** | {{ $item->name }} | -@if (isset($item->manufacturer)) -| **{{ trans('general.manufacturer') }}** | {{ $item->manufacturer->name }} | +| **{{ trans('general.license') }}** | {{ $license->name}} | +@if (isset($license->manufacturer)) +| **{{ trans('general.manufacturer') }}** | {{ $license->manufacturer->name }} | @endif -@if (isset($item->category)) -| **{{ trans('general.category') }}** | {{ $item->category->name }} | +@if (isset($license->category)) +| **{{ trans('general.category') }}** | {{ $license->category->name }} | @endif -@if ($target->can('view', $item)) -| **Key** | {{ $item->serial }} | +@if (($target instanceof \App\Models\User && $target->can('view', $license)) || ($target instanceof \App\Models\Asset && $license_seat->user->can('view', $license))) +| **Key** | {{ $license->serial }} | @endif @if ($note) | **{{ trans('mail.additional_notes') }}** | {{ $note }} | diff --git a/resources/views/manufacturers/index.blade.php b/resources/views/manufacturers/index.blade.php index e7afd91ddf..c8fd3184d0 100755 --- a/resources/views/manufacturers/index.blade.php +++ b/resources/views/manufacturers/index.blade.php @@ -37,7 +37,6 @@ data-pagination="true" data-id-table="manufacturersTable" data-search="true" - data-show-footer="true" data-side-pagination="server" data-show-columns="true" data-show-fullscreen="true" diff --git a/resources/views/manufacturers/view.blade.php b/resources/views/manufacturers/view.blade.php index 5e7bccc633..e900a1b010 100644 --- a/resources/views/manufacturers/view.blade.php +++ b/resources/views/manufacturers/view.blade.php @@ -35,7 +35,6 @@
  • - @@ -43,15 +42,13 @@ {{ trans('general.assets') }} {!! ($manufacturer->assets()->AssetsForShow()->count() > 0 ) ? ''.number_format($manufacturer->assets()->AssetsForShow()->count()).'' : '' !!} -
  • - -
  • + +
  • + +
  • + + + +
  • @@ -190,12 +199,35 @@ class="table table-striped snipe-table" data-url="{{ route('api.consumables.index', ['manufacturer_id' => $manufacturer->id]) }}" data-export-options='{ - "fileName": "export-manufacturers-{{ str_slug($manufacturer->name) }}-consumabled-{{ date('Y-m-d') }}", + "fileName": "export-manufacturers-{{ str_slug($manufacturer->name) }}-consumables-{{ date('Y-m-d') }}", "ignoreColumn": ["actions","image","change","checkbox","checkincheckout","icon"] }'> + +
    + + +
    diff --git a/resources/views/modals/category.blade.php b/resources/views/modals/category.blade.php index c07b092ace..4dfe26d026 100644 --- a/resources/views/modals/category.blade.php +++ b/resources/views/modals/category.blade.php @@ -11,19 +11,10 @@ {{ csrf_field() }} -
    -
    -
    - -
    -
    + @include('modals.partials.name') - + @include('modals.partials.footer') diff --git a/resources/views/modals/location.blade.php b/resources/views/modals/location.blade.php index d705f5500e..9580f4bbf9 100644 --- a/resources/views/modals/location.blade.php +++ b/resources/views/modals/location.blade.php @@ -9,11 +9,7 @@
    -
    -
    -
    -
    + @include('modals.partials.name', ['item' => new \App\Models\Location(), 'required' => 'true'])
    @@ -26,10 +22,6 @@
    - - + @include('modals.partials.footer') diff --git a/resources/views/modals/manufacturer.blade.php b/resources/views/modals/manufacturer.blade.php index 60cf8363e4..38c6e32af8 100644 --- a/resources/views/modals/manufacturer.blade.php +++ b/resources/views/modals/manufacturer.blade.php @@ -8,20 +8,13 @@ - diff --git a/resources/views/modals/model.blade.php b/resources/views/modals/model.blade.php index abbd50ee97..fb1650eee7 100644 --- a/resources/views/modals/model.blade.php +++ b/resources/views/modals/model.blade.php @@ -9,40 +9,13 @@
    -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - -
    -
    -
    - -
    -
    - -
    -
    -
    -
    - -
    -
    -
    {{ Form::select('fieldset_id', Helper::customFieldsetList(),old('fieldset_id'), array('class'=>'select2', 'id'=>'modal-fieldset_id', 'style'=>'width:350px')) }}
    -
    - -
    + @include('modals.partials.footer') diff --git a/resources/views/modals/partials/categories-select.blade.php b/resources/views/modals/partials/categories-select.blade.php new file mode 100644 index 0000000000..116a0808e9 --- /dev/null +++ b/resources/views/modals/partials/categories-select.blade.php @@ -0,0 +1,11 @@ + +@php + $required = $required ?? ''; +@endphp +
    +
    +
    + +
    +
    + \ No newline at end of file diff --git a/resources/views/modals/partials/fieldset-select.blade.php b/resources/views/modals/partials/fieldset-select.blade.php new file mode 100644 index 0000000000..3f4efc24b6 --- /dev/null +++ b/resources/views/modals/partials/fieldset-select.blade.php @@ -0,0 +1,6 @@ + +
    +
    +
    {{ Form::select('fieldset_id', Helper::customFieldsetList(),old('fieldset_id'), array('class'=>'select2', 'id'=>'modal-fieldset_id', 'style'=>'width:100%;')) }}
    +
    + \ No newline at end of file diff --git a/resources/views/modals/partials/footer.blade.php b/resources/views/modals/partials/footer.blade.php new file mode 100644 index 0000000000..354d189b9e --- /dev/null +++ b/resources/views/modals/partials/footer.blade.php @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/resources/views/modals/partials/manufacturer-select.blade.php b/resources/views/modals/partials/manufacturer-select.blade.php new file mode 100644 index 0000000000..810292067e --- /dev/null +++ b/resources/views/modals/partials/manufacturer-select.blade.php @@ -0,0 +1,8 @@ + +
    +
    +
    + +
    +
    + \ No newline at end of file diff --git a/resources/views/modals/partials/model-number.blade.php b/resources/views/modals/partials/model-number.blade.php new file mode 100644 index 0000000000..2691f30d48 --- /dev/null +++ b/resources/views/modals/partials/model-number.blade.php @@ -0,0 +1,6 @@ + +
    +
    +
    +
    + \ No newline at end of file diff --git a/resources/views/modals/partials/name.blade.php b/resources/views/modals/partials/name.blade.php new file mode 100644 index 0000000000..6a64ed525f --- /dev/null +++ b/resources/views/modals/partials/name.blade.php @@ -0,0 +1,10 @@ + +@php + $required = $required ?? ''; +@endphp +
    +
    +
    +
    + \ No newline at end of file diff --git a/resources/views/modals/statuslabel.blade.php b/resources/views/modals/statuslabel.blade.php index 7e07854197..e7076f1bbb 100644 --- a/resources/views/modals/statuslabel.blade.php +++ b/resources/views/modals/statuslabel.blade.php @@ -10,21 +10,18 @@
    -
    -
    + @include('partials.forms.edit.name', ['required' => 'true', 'item' => new \App\Models\Statuslabel(),'translated_name' => trans('admin/statuslabels/table.name') ])
    -
    - diff --git a/resources/views/modals/supplier.blade.php b/resources/views/modals/supplier.blade.php index 0dd10595bf..806b57c1de 100644 --- a/resources/views/modals/supplier.blade.php +++ b/resources/views/modals/supplier.blade.php @@ -10,15 +10,12 @@
    -
    -
    + @include('partials.forms.edit.name', [ 'item' => new \App\Models\Supplier(), 'translated_name' => trans('admin/suppliers/table.name')])
    - diff --git a/resources/views/modals/user.blade.php b/resources/views/modals/user.blade.php index 4e428f35f7..5672119fa1 100644 --- a/resources/views/modals/user.blade.php +++ b/resources/views/modals/user.blade.php @@ -25,11 +25,10 @@ - - diff --git a/resources/views/models/bulk-delete.blade.php b/resources/views/models/bulk-delete.blade.php index 570be2bce8..79b41b2064 100644 --- a/resources/views/models/bulk-delete.blade.php +++ b/resources/views/models/bulk-delete.blade.php @@ -55,7 +55,7 @@ diff --git a/resources/views/models/bulk-edit.blade.php b/resources/views/models/bulk-edit.blade.php index 91b9e5f882..8a053b048f 100644 --- a/resources/views/models/bulk-edit.blade.php +++ b/resources/views/models/bulk-edit.blade.php @@ -108,7 +108,7 @@ diff --git a/resources/views/models/custom_fields_form.blade.php b/resources/views/models/custom_fields_form.blade.php index d3773f97c7..8d414f337d 100644 --- a/resources/views/models/custom_fields_form.blade.php +++ b/resources/views/models/custom_fields_form.blade.php @@ -47,7 +47,7 @@
    - +
    diff --git a/resources/views/models/custom_fields_form_bulk_edit.blade.php b/resources/views/models/custom_fields_form_bulk_edit.blade.php index 251ec8478f..e048b38d09 100644 --- a/resources/views/models/custom_fields_form_bulk_edit.blade.php +++ b/resources/views/models/custom_fields_form_bulk_edit.blade.php @@ -63,7 +63,7 @@
    - +
    diff --git a/resources/views/models/view.blade.php b/resources/views/models/view.blade.php index 7192e1edae..f26b9babd4 100755 --- a/resources/views/models/view.blade.php +++ b/resources/views/models/view.blade.php @@ -41,9 +41,9 @@ -
    @if ((isset($user_select)) && ($user_select!='false')) @endif @if ((isset($asset_select)) && ($asset_select!='false')) diff --git a/resources/views/partials/forms/edit/accessory-select.blade.php b/resources/views/partials/forms/edit/accessory-select.blade.php index 12be9bf7b7..d34b6b2fe0 100644 --- a/resources/views/partials/forms/edit/accessory-select.blade.php +++ b/resources/views/partials/forms/edit/accessory-select.blade.php @@ -1,8 +1,8 @@
    {{ Form::label($fieldname, $translated_name, array('class' => 'col-md-3 control-label')) }} -
    - @if ((!isset($unselect)) && ($accessory_id = old($fieldname, (isset($accessory) ? $accessory->id : (isset($item) ? $item->{$fieldname} : '')))))
    - {{ Form::label('city', trans('general.city'), array('class' => 'col-md-3 control-label', 'maxlength'=>'191')) }} + {{ Form::label('city', trans('general.city'), array('class' => 'col-md-3 control-label')) }}
    - {{Form::text('city', old('city', $item->city), array('class' => 'form-control', 'aria-label'=>'city')) }} + {{Form::text('city', old('city', $item->city), array('class' => 'form-control', 'aria-label'=>'city', 'maxlength'=>'191')) }} {!! $errors->first('city', '') !!}
    - {{ Form::label('state', trans('general.state'), array('class' => 'col-md-3 control-label', 'maxlength'=>'191')) }} + {{ Form::label('state', trans('general.state'), array('class' => 'col-md-3 control-label')) }}
    - {{Form::text('state', old('state', $item->state), array('class' => 'form-control', 'aria-label'=>'state')) }} + {{Form::text('state', old('state', $item->state), array('class' => 'form-control', 'aria-label'=>'state', 'maxlength'=>'191')) }} {!! $errors->first('state', '') !!}
    @@ -35,6 +35,7 @@ {{ Form::label('country', trans('general.country'), array('class' => 'col-md-3 control-label')) }}
    {!! Form::countries('country', old('country', $item->country), 'select2') !!} +

    {{ trans('general.countries_manually_entered_help') }}

    {!! $errors->first('country', '') !!}
    diff --git a/resources/views/partials/forms/edit/asset-select.blade.php b/resources/views/partials/forms/edit/asset-select.blade.php index 86dba8206f..9867a8e552 100644 --- a/resources/views/partials/forms/edit/asset-select.blade.php +++ b/resources/views/partials/forms/edit/asset-select.blade.php @@ -1,8 +1,9 @@ -
    +
    {{ Form::label($fieldname, $translated_name, array('class' => 'col-md-3 control-label')) }} -
    - @if ((!isset($unselect)) && ($asset_id = old($fieldname, (isset($asset) ? $asset->id : (isset($item) ? $item->{$fieldname} : ''))))) + @else + @if(isset($asset_ids)) + @foreach($asset_ids as $asset_id) + + @endforeach + @endif @endif @endif diff --git a/resources/views/partials/forms/edit/category-select.blade.php b/resources/views/partials/forms/edit/category-select.blade.php index 66800deedf..f610f68470 100644 --- a/resources/views/partials/forms/edit/category-select.blade.php +++ b/resources/views/partials/forms/edit/category-select.blade.php @@ -3,14 +3,12 @@ {{ Form::label($fieldname, $translated_name, array('class' => 'col-md-3 control-label')) }} -
    +
    diff --git a/resources/views/partials/forms/edit/category.blade.php b/resources/views/partials/forms/edit/category.blade.php index 715c54184e..158cc3508b 100644 --- a/resources/views/partials/forms/edit/category.blade.php +++ b/resources/views/partials/forms/edit/category.blade.php @@ -1,8 +1,8 @@
    -
    - {{ Form::select('category_id', $category_list , old('category_id', $item->category_id), array('class'=>'select2', 'style'=>'width:100%')) }} +
    + {{ Form::select('category_id', $category_list , old('category_id', $item->category_id), array('class'=>'select2', 'style'=>'width:100%', 'required' => Helper::checkIfRequired($item, 'category_id') ? true : '')) }} {!! $errors->first('category_id', '') !!}
    diff --git a/resources/views/partials/forms/edit/company-select.blade.php b/resources/views/partials/forms/edit/company-select.blade.php index 9aaa5cafdf..59de71a6ab 100644 --- a/resources/views/partials/forms/edit/company-select.blade.php +++ b/resources/views/partials/forms/edit/company-select.blade.php @@ -10,7 +10,7 @@ {{ (\App\Models\Company::find($company_id)) ? \App\Models\Company::find($company_id)->name : '' }} @else - + {!! (!isset($multiple) || ($multiple=='false')) ? '' : '' !!} @endif
    @@ -20,14 +20,14 @@
    {{ Form::label($fieldname, $translated_name, array('class' => 'col-md-3 control-label')) }} -
    +
    diff --git a/resources/views/partials/forms/edit/company.blade.php b/resources/views/partials/forms/edit/company.blade.php index 4e64dbd1a8..22cb623584 100644 --- a/resources/views/partials/forms/edit/company.blade.php +++ b/resources/views/partials/forms/edit/company.blade.php @@ -3,8 +3,8 @@
    {{ Form::label('company_id', trans('general.company'), array('class' => 'col-md-3 control-label', 'for' => 'company_id')) }}
    -
    - {{ Form::select('company_id', $company_list , old('company_id', $item->company_id), array('class'=>'select2', 'style'=>'width:100%')) }} +
    + {{ Form::select('company_id', $company_list , old('company_id', $item->company_id), array('class'=>'select2', 'style'=>'width:100%', 'required' => Helper::checkIfRequired($item, 'company_id') ? true : '')) }} {!! $errors->first('company_id', '') !!}
    diff --git a/resources/views/partials/forms/edit/datepicker.blade.php b/resources/views/partials/forms/edit/datepicker.blade.php index 9d2a714bb7..3bd0200d0a 100644 --- a/resources/views/partials/forms/edit/datepicker.blade.php +++ b/resources/views/partials/forms/edit/datepicker.blade.php @@ -4,7 +4,7 @@
    - +
    {!! $errors->first($fieldname, '') !!}
    diff --git a/resources/views/partials/forms/edit/department-select.blade.php b/resources/views/partials/forms/edit/department-select.blade.php index c695d04ef4..7d67416f5f 100644 --- a/resources/views/partials/forms/edit/department-select.blade.php +++ b/resources/views/partials/forms/edit/department-select.blade.php @@ -8,8 +8,6 @@ - @else - @endif
    diff --git a/resources/views/partials/forms/edit/email.blade.php b/resources/views/partials/forms/edit/email.blade.php index 0e10b7d766..171367a830 100644 --- a/resources/views/partials/forms/edit/email.blade.php +++ b/resources/views/partials/forms/edit/email.blade.php @@ -1,7 +1,7 @@
    - {{ Form::label('email', trans('admin/suppliers/table.email'), array('class' => 'col-md-3 control-label')) }} -
    - {{Form::text('email', old('email', $item->email), array('class' => 'form-control')) }} + +
    + {!! $errors->first('email', '') !!}
    -
    +
    \ No newline at end of file diff --git a/resources/views/partials/forms/edit/eol_date.blade.php b/resources/views/partials/forms/edit/eol_date.blade.php index fb461cf44e..5efba06a85 100644 --- a/resources/views/partials/forms/edit/eol_date.blade.php +++ b/resources/views/partials/forms/edit/eol_date.blade.php @@ -3,8 +3,8 @@
    - - + +
    {!! $errors->first('asset_eol_date', '') !!}
    diff --git a/resources/views/partials/forms/edit/fax.blade.php b/resources/views/partials/forms/edit/fax.blade.php index 6e8a1d7fd4..7ed4d3070d 100644 --- a/resources/views/partials/forms/edit/fax.blade.php +++ b/resources/views/partials/forms/edit/fax.blade.php @@ -1,7 +1,7 @@
    {{ Form::label('fax', trans('admin/suppliers/table.fax'), array('class' => 'col-md-3 control-label')) }}
    - {{Form::text('fax', old('fax', $item->fax), array('class' => 'form-control')) }} + {!! $errors->first('fax', '') !!}
    \ No newline at end of file diff --git a/resources/views/partials/forms/edit/item_number.blade.php b/resources/views/partials/forms/edit/item_number.blade.php index 1c9654cb45..1adeb89be4 100644 --- a/resources/views/partials/forms/edit/item_number.blade.php +++ b/resources/views/partials/forms/edit/item_number.blade.php @@ -1,8 +1,8 @@
    -
    - +
    + {!! $errors->first('item_no', '') !!}
    diff --git a/resources/views/partials/forms/edit/kit-select.blade.php b/resources/views/partials/forms/edit/kit-select.blade.php index a9b6525202..d8c6ba1013 100644 --- a/resources/views/partials/forms/edit/kit-select.blade.php +++ b/resources/views/partials/forms/edit/kit-select.blade.php @@ -2,8 +2,8 @@ {{ Form::label($fieldname, $translated_name, array('class' => 'col-md-3 control-label')) }} -
    - @if ($kit_id = old($fieldname, (isset($item)) ? $item->{$fieldname} : ''))