Compare commits

...

156 Commits

Author SHA1 Message Date
snipe 5a1225a8bf Merge branch 'develop' 2017-09-29 03:48:37 -07:00
snipe c6069b905b Bumped version 2017-09-29 03:47:50 -07:00
snipe 2e76620cf8 More specific required check 2017-09-29 03:44:23 -07:00
snipe a4b30279ee Fixes #4067 - Make unrequired custom fields nullable 2017-09-29 03:30:13 -07:00
snipe db59d4b2c4 Merge branch 'develop' 2017-09-29 02:08:06 -07:00
snipe faf3802971 Fixes #4011 - do not send email to user on license checkout 2017-09-29 02:00:49 -07:00
snipe 7fe2a1f802 Fixes #4051 - use delete method for deleting user files 2017-09-29 01:48:16 -07:00
snipe 3d57d1bd1d Merge branch 'develop' 2017-09-29 01:30:30 -07:00
snipe ba8bcce8eb Hopefully fixes #4020 2017-09-29 01:21:08 -07:00
snipe 8247a73182 Merge branch 'develop' 2017-09-28 22:22:37 -07:00
snipe aab409dec2 Fixes #4061 - bulk checkout error 2017-09-28 22:22:21 -07:00
snipe 70a9b7bf05 Merge branch 'develop' 2017-09-28 21:21:01 -07:00
snipe d9824a0454 Bumped version 2017-09-28 21:20:37 -07:00
snipe e759a249bd Merge branch 'develop' 2017-09-28 21:18:39 -07:00
snipe 42c2a66946 Small UI tweaks for accessories 2017-09-28 21:18:16 -07:00
snipe 4d32f2b337 Fixes #4059 - accessories view 2017-09-28 21:18:00 -07:00
snipe 0e29744ec2 Don’t try to send an email if the user doesn’t have an email address 2017-09-28 20:57:33 -07:00
snipe 51236a2ad9 Fixes #4056 - check for assets before deleting user 2017-09-28 19:57:52 -07:00
snipe 9b6726a630 Fixes #4056 - check for assets before deleting user 2017-09-28 19:57:03 -07:00
snipe cbdd05144a Merge branch 'develop' 2017-09-28 19:50:34 -07:00
snipe 507f1f196c Added integrity hashes 2017-09-28 18:46:16 -07:00
snipe b60febeea2 Removed space in XSS header because safari was getting angry 2017-09-28 18:45:54 -07:00
snipe b3e0d8f675 Disallow / in robots 2017-09-28 17:47:48 -07:00
snipe 9b84a0d516 *eyeroll* 2017-09-28 17:34:47 -07:00
snipe adac5ac544 Check for valid asset 2017-09-28 17:32:37 -07:00
snipe 1775995f26 Is this space necessary? Getting weird results from netsparker 2017-09-28 17:25:04 -07:00
snipe df4700b411 Merge branch 'develop' 2017-09-28 17:17:03 -07:00
snipe 26a7701cda Added referrer-policy header 2017-09-28 17:12:58 -07:00
snipe a34085f1d9 Added mode=block to XSSProtect header 2017-09-28 16:28:27 -07:00
snipe 8e682c715e Merge branch 'develop' 2017-09-28 16:07:04 -07:00
snipe 915c19ebda Merge branch 'develop' of github.com:snipe/snipe-it into develop 2017-09-28 16:03:41 -07:00
snipe 7fded367c4 Adds rel="noopener" to footer links 2017-09-28 16:03:36 -07:00
Daniel Meltzer 0a4743210c Pass urls to vue. Should fix subdirectory issues. (#4054) 2017-09-28 16:03:04 -07:00
Daniel Meltzer af19e5d976 Fix old route (#4053)
Looks like we missed in the v4 port.  Fixes the unrelated issue in #4052
2017-09-28 16:02:50 -07:00
snipe 3d7277398c Fixes #4057 - sig file in lightbox 2017-09-28 15:13:05 -07:00
snipe a7ad48a02a Make fields nullable for licenses 2017-09-27 22:11:20 -07:00
snipe 469a3fc608 Merge branch 'develop' 2017-09-27 17:48:32 -07:00
snipe 0fb4ff77f4 Restoring older SnipeModel attribute setters
In case needed by API - needs investigation
2017-09-27 16:39:20 -07:00
snipe ac83dba2bb Fixes #4034 - save login note 2017-09-27 16:35:54 -07:00
snipe 979ecf961d Added back button to oauth page 2017-09-27 16:33:51 -07:00
snipe 13dcdf41b8 Fixes #4045 - missing back button 2017-09-27 16:32:37 -07:00
snipe fc96fa756e Fix redirect default on password reset 2017-09-27 16:23:21 -07:00
snipe ea9a502152 Added empty regsitration controller
When using the default Laravel auth routes, it expects a registration controller, even though we don’t have a concept of registration. This blank controller just prevents route caching from throwing errors.
2017-09-27 16:23:01 -07:00
snipe d844734b6c Use named login route 2017-09-27 16:22:02 -07:00
snipe ec8a3d2e56 Fixes #4027 - proper redirect on fieldset delete 2017-09-27 16:02:29 -07:00
snipe 5410dc4255 Fixed link to contributing docs in readme 2017-09-27 15:30:20 -07:00
snipe d1112bbc99 Fix created_at date display for groups index 2017-09-27 15:28:02 -07:00
snipe ecf041fa10 Fixes #4043 - standardize groups API response 2017-09-27 15:18:29 -07:00
snipe 0ab9bc1db8 Added normalization midddleware, removed 2017-09-27 15:18:05 -07:00
snipe 73e788b94b Make min_amt fillable 2017-09-27 14:50:56 -07:00
snipe e91a537552 Use more modern Request handler 2017-09-27 14:50:48 -07:00
snipe ef8c1abf28 Fixes #3113 and #4040 2017-09-27 14:50:17 -07:00
snipe bd0498aa69 Fixes #4016 - signature file missing from history tab 2017-09-27 12:58:08 -07:00
snipe ea45033588 Merge branch 'develop' 2017-09-26 16:03:09 -07:00
snipe 5e1df7049c Make collation and charset for mysql an env variable 2017-09-26 16:02:55 -07:00
snipe e27e1a78c3 Fix for case where a fieldset is assigned to a model, but no fields are assigned 2017-09-26 16:01:23 -07:00
snipe d585a34a26 Prevent users from running this as root/admin user 2017-09-26 13:11:01 -07:00
snipe 4edaba648e Tweaks to upgrade script 2017-09-26 13:05:34 -07:00
snipe 9dca7396f3 Merge branch 'develop' 2017-09-26 11:12:55 -07:00
snipe 4324242475 Bumped version 2017-09-26 11:12:36 -07:00
snipe eca5a05335 Fix forgotten password missing route (???) 2017-09-26 11:08:47 -07:00
snipe aa4d3c3ffb Fix forgotten password missing route (???) 2017-09-26 11:07:47 -07:00
snipe d442feb687 Add @gizzmojr as a contributor 2017-09-25 22:18:25 -07:00
snipe 0a88141b18 Merge branch 'develop' of github.com:snipe/snipe-it into develop 2017-09-25 22:17:38 -07:00
snipe d5e6d82ca1 Bumped version 2017-09-25 22:17:00 -07:00
gizzmojr f2a62857cb Clear audit input field (#4010) 2017-09-25 22:15:29 -07:00
snipe b354ca817d Bumped version 2017-09-25 22:10:06 -07:00
snipe 4b9bfc178d One more try on #4001 2017-09-25 22:05:57 -07:00
snipe abc2f7e789 Bumped build number 2017-09-25 21:57:16 -07:00
snipe 29cc9a0815 Tweaks to upgrade script 2017-09-25 21:50:41 -07:00
snipe f2ee7dcabb Fixes #4001 - license checkout not working 2017-09-25 21:40:43 -07:00
snipe 26203801f6 Fixes #4009 - zip not populating on locations listing page 2017-09-25 20:45:05 -07:00
snipe fbe9539130 Proto upgrade script 2017-09-25 20:30:18 -07:00
snipe 43ec959385 Add @richardhofman6 as a contributor 2017-09-25 16:58:47 -07:00
snipe 9b6276f281 Bumped version 2017-09-25 16:04:23 -07:00
snipe 0715791229 Include oauth keys in backup 2017-09-25 15:45:33 -07:00
snipe 0a0661bf41 Additional fixes for #3995 in atypical blades 2017-09-25 15:41:02 -07:00
snipe 6ee939d29b Allegedly fixes #3995 - subdirectory issues with JS/CSS 2017-09-25 15:39:18 -07:00
snipe c3afbc0e53 Run backups before purging and importing 2017-09-25 15:00:23 -07:00
snipe 38326314ca Merge branch 'develop' 2017-09-25 11:53:33 -07:00
snipe 865950e766 Fixes #4000 - user_id blank 2017-09-25 11:53:10 -07:00
snipe d49b67d033 Fix for assigned user location
Was breaking requestable page
2017-09-25 11:26:04 -07:00
snipe 6b63808e34 Fix for asset location null on user 2017-09-25 11:25:15 -07:00
snipe 34dfcb5add Merge branch 'develop' 2017-09-22 17:23:38 -07:00
snipe 30019a144a Disable login note editing on demo 2017-09-22 17:23:22 -07:00
snipe 3e222b674a Merge branch 'develop'
# Conflicts:
#	resources/views/hardware/view.blade.php
2017-09-22 17:04:43 -07:00
snipe e316444c63 Show suppliers link - force cache break? 2017-09-22 17:03:57 -07:00
snipe b29d7beb3a Merge branch 'develop'
# Conflicts:
#	.gitignore
#	Dockerfile
#	README.md
#	app/Http/Controllers/AccessoriesController.php
#	app/Http/Controllers/AssetMaintenancesController.php
#	app/Http/Controllers/AssetsController.php
#	app/Http/Controllers/ConsumablesController.php
#	app/Http/Controllers/GroupsController.php
#	app/Http/Controllers/LicensesController.php
#	app/Http/Controllers/ReportsController.php
#	app/Http/Controllers/UsersController.php
#	app/Http/routes.php
#	app/Models/Depreciation.php
#	app/Models/Location.php
#	config/version.php
#	resources/views/account/view-assets.blade.php
#	resources/views/hardware/edit.blade.php
#	resources/views/hardware/view.blade.php
#	resources/views/partials/modals.blade.php
#	resources/views/reports/custom.blade.php
#	snipeit.sh
2017-09-22 16:12:18 -07:00
snipe f0a49fefd7 Bumped version 2017-09-22 15:50:24 -07:00
snipe 998c4a5fe5 Make model number nullable 2017-09-22 04:43:28 -07:00
snipe 626a6408d0 Additional Danish and Polish translations 2017-09-18 19:12:37 -07:00
snipe 126a5671fe Set timeout for LDAP server 2017-09-18 19:11:38 -07:00
snipe aff104fa5d Bumped version for beta 2017-09-18 18:10:43 -07:00
Daniel Meltzer a5764351f7 Migrate weird assigned_type issues, Issue #3972 (#3973)
For a while, prior to 987536930, we did not null assigned_type on
checkin.  This migration manually nulls all assigned_type fields if
assigned_to is unset.  Add a test to AssetTest for this as well...kind
of.  We need to extract an Asset::checkin() method for 4.1 that mirrors
Asset::checkOut() to really test this.

This also fixes a separate (but related) issue.  The Asset importer did
not set assigned_type when importing and creating users.  In this
instance, we assume that if assigned_to is set and assigned_type is not,
then the item was checked out to a user and update the DB accordingly.
Also add a check in ImporterTest for this issue.
2017-09-18 16:40:13 -07:00
snipe 348becbbec Production assets generated 2017-09-18 13:01:54 -07:00
Daniel Meltzer 922d6937ae Custom field import repair (#3968)
* There is no notes field on accessories.  Fixes Importer Test.

* Fix notification test.  We should see a checkout not allowed exception when trying to check out to a location if the asset requires acceptance.

* Fix Custom field import.

Add a test for custom field import, and fix a few issues related to
importing custom fields.  This will restore v3 functionality.

* Add UI support for mapping custom fields.

This still requires the field mappings to be created/assigned in
advance, but will fetch all custom field names and allow them to be
selected when setting up custom field mappings.

This commit also updates laravel-mix to v1.4.3 and other node
dependencies to fix some build issues.

* Fix some requestable asset page/assetloc issues.  I'd love to know why laravel expections relationships to be in lower case... but thats a question for another day.
2017-09-18 12:29:08 -07:00
snipe c53dae4b72 Possible fix for #3919 - allow later versions of mcrypted base64 keys 2017-09-14 16:43:41 -07:00
snipe 17ad7f7800 Merge branch 'master' of github.com:snipe/snipe-it 2017-09-14 14:14:45 -07:00
snipe 6232a077b5 Fix more enum fuckery 2017-09-14 14:06:53 -07:00
snipe e7d72beb88 Also check for $snipeSettings in the first place
Since the preflight also uses this basic blade
2017-09-12 13:08:43 -07:00
snipe 01e3f4a4db Use site name if provided in the settings table for basic template 2017-09-12 13:01:51 -07:00
snipe 1b76880b0e Add @imanghafoori1 as a contributor 2017-09-12 12:30:21 -07:00
Iman ed4ea7f1f4 No new feature,No bug fix, Only refactoring (#3949)
* No change in logic !

Just exchanging the if and else code blocks and negating condition.

* remove unneeded else{} block

* Re-indented the code
2017-09-12 12:28:42 -07:00
snipe 81e358a01d Small maintenance fixes 2017-09-08 17:49:01 -07:00
snipe 6c283de60a Check for status_id key - related to #3928
TODO: Fix for model number
2017-09-08 17:24:28 -07:00
snipe 4e7a6c0ccf Fixes #3928 - adds correct key generation and passport install 2017-09-08 17:23:19 -07:00
KeenRivals fd515654ff Fix broken user's manual link (#3902)
snipe-it-manual.readme.io goes to a 404 page
2017-08-29 13:50:57 -07:00
Robin Temme 5347b19910 Update Maintained Badge (#3877)
The maintenance badge was outdated and displayed "no!". As I guess this was not it's intended purpose, I changed it to the new path, and it now displays "yes".
2017-08-23 12:05:29 -07:00
snipe 29f1cf2b48 Increase depreciation max 2017-07-19 19:41:21 -07:00
Sorvani f56862c684 change CentOS 7 to pull from git (#3734)
The package setup for CentOS 7 already installs git so use it for the install. This makes later updates easier for the end users. They can simply use git pull like the instructions say for updating.
2017-07-11 20:28:31 -07:00
snipe 1052be670d Increase size of state field 2017-06-15 21:04:10 -07:00
Daniel Nemanic 30a9704625 Update UsersController.php (#3640)
If a user is disabled in your Active Directory, it should be deactivated in the licensing too.

The standard state is now deactivated for synced accounts.
Maybe we can change this throw a Setting for a standard state.

The codes comes from this site:
http://www.netvision.com/ad_useraccountcontrol.php
2017-06-12 15:29:55 -07:00
Lee Thoong Ching 9a9b6ae228 Update snipeit.sh (#3620)
To support Oracle Linux ( equivalent to redhat which check os version and type )
2017-06-01 20:54:23 -07:00
morph027 7c8dc9fe2d docker: use ubuntu:xenial with php7.0 (#3616)
Nice, thanks! I'll patch this over to develop as well.
2017-06-01 20:50:09 -07:00
snipe b81dd18576 Fixed delete_at 2017-05-19 03:00:19 -07:00
snipe dac4b58892 Show warning on deleted items 2017-05-19 02:58:55 -07:00
snipe 71fd430f8e Fixes issue with older, deleted asset tags caching QR codes 2017-05-19 02:51:35 -07:00
snipe 5265821bcc Bumped version 2017-05-18 22:24:03 -07:00
snipe cb494a74ca Merge branch 'master' of github.com:snipe/snipe-it 2017-05-18 22:20:57 -07:00
snipe c526ffbf68 Bumped version 2017-05-18 22:20:52 -07:00
snipe 6f5fe83a91 Fixed missing language string in asset display 2017-05-18 22:20:43 -07:00
Nate Felton 5a3816c907 Fixing a regression for RHEL 6 with snipe/snipe-it#2993 (#3572) 2017-05-12 17:19:41 -07:00
snipe c8796cf045 Only prompt for checkin if there is an assigned user 2017-05-10 03:37:30 -07:00
snipe f4095c6dd0 Bumped version 2017-05-09 15:32:34 -07:00
snipe ee2c67a65f Added missing logging back in 2017-05-09 15:30:45 -07:00
snipe 5614578710 Don’t make the item clickable if it’s been deleted 2017-05-09 15:30:19 -07:00
snipe 08ef78356d Update Crowdin configuration file 2017-04-06 20:59:25 -07:00
Manasses Ferreira 47ac59abef We noted that the barcode folder was not being created. (what is done now in the entrypoint.sh) At the same time, a wrong directory was being created. (which explains the deleted line in Dockerfile) (#3456) 2017-03-31 13:48:50 -07:00
snipe 265a896211 Bumped version 2017-02-22 22:38:33 -08:00
snipe f7e4fca70d Add model_number to accessory search 2017-02-22 22:34:56 -08:00
snipe bb4c443cd9 Added notes to custom report 2017-02-03 02:20:56 -08:00
snipe 7b1d2ee050 Fixed typo 2017-01-17 11:57:24 -08:00
snipe b3f70a046f Don’t require superadmin for checkin and delete user 2017-01-17 09:19:14 -08:00
morph027 734e87f85f Installer fine tuning (#2993)
* used shellcheck to lint snipeit.sh

* do not depend on lsb-release command

* add lsb codename

* really use perms()

* more fixes

* quiet apt

* silent logging using log()

* start mysql if not running

* added curl to ubuntu

* added logfile to log function

* update apt index after adding mariadb repo

* fixed typo

* review fixes
2017-01-10 23:07:06 -08:00
snipe f371c5fd62 Merge branch 'master' of github.com:snipe/snipe-it 2017-01-10 19:02:18 -08:00
snipe 4b3edbd2f5 Fixed #3130 - model ID not being saved weith model info on modal for create asset 2017-01-10 19:02:13 -08:00
Byron Wolfman 1f3106b9da Use debian base container and clean up apt-get (#3011)
* Use debian base container and clean up apt-get

Attempt to slim down the docker image by replacing ubuntu:trusty with debian:jessie and clean up after apt-get invocation. Building against the 3.6.0 commit shows a healthy reduction of 44MB, or 9%, compared to the ubuntu-based image.

* Use debian:jessie-slim for an even smaller image

If we're using a debian base image for sizing reasons, we may as well go the full distance and use debian-slim.
2017-01-10 16:22:06 -08:00
snipe 9fd3a9a82d Removed logging 2017-01-06 03:12:49 -08:00
snipe a6e6991a2d Removed second number_format 2017-01-06 03:11:27 -08:00
snipe 93ba0717d8 Removed number_format 2017-01-06 03:02:38 -08:00
snipe a8839e0ef4 Fixes #3104, #2914 and #2918 - auto-increment incorrectly generating next ID 2017-01-06 02:52:10 -08:00
snipe 3e4152c966 Bumped version 2017-01-06 00:04:26 -08:00
snipe 1bf34d73f5 Use correct authorize rule in middleware for user delete 2017-01-06 00:02:46 -08:00
snipe d1e360d64d Fix logic to use gate instead of asking if superuser 2017-01-06 00:02:19 -08:00
snipe 3b5b19848c Added oauth keys to gitignore 2017-01-06 00:01:55 -08:00
snipe 93ba90e837 Merge remote-tracking branch 'origin/develop' 2016-12-12 19:24:00 -08:00
snipe fc70d79a17 Merge remote-tracking branch 'origin/develop' 2016-12-12 19:07:07 -08:00
snipe 65016a2383 Merge remote-tracking branch 'origin/develop' 2016-12-05 16:12:41 -08:00
snipe dbcb2ccb46 Merge remote-tracking branch 'origin/develop' 2016-12-05 15:09:49 -08:00
snipe 2afcfcc87c Set DB_SSL to false for config 2016-12-03 17:32:44 -08:00
snipe 1afef9416a Merge remote-tracking branch 'origin/develop'
# Conflicts:
#	config/version.php
2016-12-03 17:15:02 -08:00
snipe 4049143ebf Bumped version 2016-12-01 06:11:03 -08:00
snipe 4df53bdf8d Merge remote-tracking branch 'origin/develop'
# Conflicts:
#	config/version.php
#	resources/views/account/view-assets.blade.php
2016-12-01 06:10:50 -08:00
snipe d49a1ea304 More graceful error message if log doesn’t exist 2016-12-01 06:05:14 -08:00
snipe 521f4facd5 Bumped version 2016-12-01 05:56:24 -08:00
snipe b4653dfc15 Ignore npm log 2016-12-01 05:55:29 -08:00
124 changed files with 1230 additions and 775 deletions
+27
View File
@@ -728,6 +728,33 @@
"contributions": [
"code"
]
},
{
"login": "imanghafoori1",
"name": "Iman",
"avatar_url": "https://avatars0.githubusercontent.com/u/6961695?v=4",
"profile": "https://github.com/imanghafoori1",
"contributions": [
"code"
]
},
{
"login": "richardhofman6",
"name": "Richard Hofman",
"avatar_url": "https://avatars1.githubusercontent.com/u/6551003?v=4",
"profile": "https://github.com/richardhofman6",
"contributions": [
"code"
]
},
{
"login": "gizzmojr",
"name": "gizzmojr",
"avatar_url": "https://avatars0.githubusercontent.com/u/3697569?v=4",
"profile": "https://github.com/gizzmojr",
"contributions": [
"code"
]
}
]
}
+3
View File
@@ -19,6 +19,8 @@ DB_USERNAME=null
DB_PASSWORD=null
DB_PREFIX=null
DB_DUMP_PATH='/usr/bin'
DB_CHARSET=utf8mb4
DB_COLLATION=utf8mb4_unicode_ci
# --------------------------------------------
# OPTIONAL: SSL DATABASE SETTINGS
@@ -61,6 +63,7 @@ ENCRYPT=false
COOKIE_NAME=snipeit_session
COOKIE_DOMAIN=null
SECURE_COOKIES=false
REFERRER_POLICY=strict-origin
# --------------------------------------------
+3 -3
View File
@@ -1,5 +1,5 @@
[![Build Status](https://travis-ci.org/snipe/snipe-it.svg?branch=develop)](https://travis-ci.org/snipe/snipe-it) [![Stories in Ready](https://badge.waffle.io/snipe/snipe-it.png?label=ready+for+dev&title=Ready+for+development)](http://waffle.io/snipe/snipe-it) [![Maintenance](https://img.shields.io/maintenance/yes/2017.svg)]() [![Crowdin](https://d322cqt584bo4o.cloudfront.net/snipe-it/localized.png)](https://crowdin.com/project/snipe-it) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/snipe/snipe-it?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Docker Pulls](https://img.shields.io/docker/pulls/snipe/snipe-it.svg)](https://hub.docker.com/r/snipe/snipe-it/) [![Twitter Follow](https://img.shields.io/twitter/follow/snipeyhead.svg?style=social)](https://twitter.com/snipeyhead) [![Zenhub](https://raw.githubusercontent.com/ZenHubIO/support/master/zenhub-badge.png)](https://zenhub.io) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/553ce52037fc43ea99149785afcfe641)](https://www.codacy.com/app/snipe/snipe-it?utm_source=github.com&utm_medium=referral&utm_content=snipe/snipe-it&utm_campaign=Badge_Grade)
[![All Contributors](https://img.shields.io/badge/all_contributors-78-orange.svg?style=flat-square)](#contributors)
[![All Contributors](https://img.shields.io/badge/all_contributors-81-orange.svg?style=flat-square)](#contributors)
## Snipe-IT - Open Source Asset Management System
@@ -67,7 +67,7 @@ Thanks goes to all of these wonderful people ([emoji key](https://github.com/ken
| [<img src="https://avatars0.githubusercontent.com/u/8341172?v=3" width="110px;"/><br /><sub>Jay Richards</sub>](http://www.cordeos.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=technogenus "Code") | [<img src="https://avatars2.githubusercontent.com/u/7295127?v=3" width="110px;"/><br /><sub>Alexander Innes</sub>](https://necurity.co.uk)<br />[💻](https://github.com/snipe/snipe-it/commits?author=leostat "Code") | [<img src="https://avatars2.githubusercontent.com/u/334485?v=3" width="110px;"/><br /><sub>Danny Garcia</sub>](https://buzzedword.codes)<br />[💻](https://github.com/snipe/snipe-it/commits?author=buzzedword "Code") | [<img src="https://avatars2.githubusercontent.com/u/366855?v=3" width="110px;"/><br /><sub>archpoint</sub>](https://github.com/archpoint)<br />[💻](https://github.com/snipe/snipe-it/commits?author=archpoint "Code") | [<img src="https://avatars1.githubusercontent.com/u/67991?v=3" width="110px;"/><br /><sub>Jake McGraw</sub>](http://www.jakemcgraw.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jakemcgraw "Code") | [<img src="https://avatars1.githubusercontent.com/u/1714374?v=3" width="110px;"/><br /><sub>FleischKarussel</sub>](https://github.com/FleischKarussel)<br />[📖](https://github.com/snipe/snipe-it/commits?author=FleischKarussel "Documentation") | [<img src="https://avatars3.githubusercontent.com/u/319644?v=3" width="110px;"/><br /><sub>Dylan Yi</sub>](https://github.com/feeva)<br />[💻](https://github.com/snipe/snipe-it/commits?author=feeva "Code") |
| [<img src="https://avatars2.githubusercontent.com/u/857740?v=3" width="110px;"/><br /><sub>Gil Rutkowski</sub>](http://FlashingCursor.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=flashingcursor "Code") | [<img src="https://avatars3.githubusercontent.com/u/129360?v=3" width="110px;"/><br /><sub>Desmond Morris</sub>](http://www.desmondmorris.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=desmondmorris "Code") | [<img src="https://avatars2.githubusercontent.com/u/52936?v=3" width="110px;"/><br /><sub>Nick Peelman</sub>](http://peelman.us)<br />[💻](https://github.com/snipe/snipe-it/commits?author=peelman "Code") | [<img src="https://avatars0.githubusercontent.com/u/53161?v=3" width="110px;"/><br /><sub>Abraham Vegh</sub>](https://abrahamvegh.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=abrahamvegh "Code") | [<img src="https://avatars0.githubusercontent.com/u/2818680?v=3" width="110px;"/><br /><sub>Mohamed Rashid</sub>](https://github.com/rashivkp)<br />[📖](https://github.com/snipe/snipe-it/commits?author=rashivkp "Documentation") | [<img src="https://avatars3.githubusercontent.com/u/1509456?v=3" width="110px;"/><br /><sub>Kasey</sub>](http://hinchk.github.io)<br />[💻](https://github.com/snipe/snipe-it/commits?author=HinchK "Code") | [<img src="https://avatars2.githubusercontent.com/u/10522541?v=3" width="110px;"/><br /><sub>Brett</sub>](https://github.com/BrettFagerlund)<br />[⚠️](https://github.com/snipe/snipe-it/commits?author=BrettFagerlund "Tests") |
| [<img src="https://avatars2.githubusercontent.com/u/16108587?v=3" width="110px;"/><br /><sub>Jason Spriggs</sub>](http://jasonspriggs.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jasonspriggs "Code") | [<img src="https://avatars2.githubusercontent.com/u/1134568?v=3" width="110px;"/><br /><sub>Nate Felton</sub>](http://n8felton.wordpress.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=n8felton "Code") | [<img src="https://avatars2.githubusercontent.com/u/14036694?v=3" width="110px;"/><br /><sub>Manasses Ferreira</sub>](http://homepages.dcc.ufmg.br/~manassesferreira)<br />[💻](https://github.com/snipe/snipe-it/commits?author=manassesferreira "Code") | [<img src="https://avatars0.githubusercontent.com/u/15913949?v=3" width="110px;"/><br /><sub>Steve</sub>](https://github.com/steveelwood)<br />[⚠️](https://github.com/snipe/snipe-it/commits?author=steveelwood "Tests") | [<img src="https://avatars1.githubusercontent.com/u/3361683?v=3" width="110px;"/><br /><sub>matc</sub>](http://twitter.com/matc)<br />[⚠️](https://github.com/snipe/snipe-it/commits?author=matc "Tests") | [<img src="https://avatars3.githubusercontent.com/u/7405702?v=3" width="110px;"/><br /><sub>Cole R. Davis</sub>](http://www.davisracingteam.com)<br />[⚠️](https://github.com/snipe/snipe-it/commits?author=VanillaNinjaD "Tests") | [<img src="https://avatars2.githubusercontent.com/u/10167681?v=3" width="110px;"/><br /><sub>gibsonjoshua55</sub>](https://github.com/gibsonjoshua55)<br />[💻](https://github.com/snipe/snipe-it/commits?author=gibsonjoshua55 "Code") |
| [<img src="https://avatars2.githubusercontent.com/u/2809241?v=4" width="110px;"/><br /><sub>Robin Temme</sub>](https://github.com/zwerch)<br />[💻](https://github.com/snipe/snipe-it/commits?author=zwerch "Code") |
| [<img src="https://avatars2.githubusercontent.com/u/2809241?v=4" width="110px;"/><br /><sub>Robin Temme</sub>](https://github.com/zwerch)<br />[💻](https://github.com/snipe/snipe-it/commits?author=zwerch "Code") | [<img src="https://avatars0.githubusercontent.com/u/6961695?v=4" width="110px;"/><br /><sub>Iman</sub>](https://github.com/imanghafoori1)<br />[💻](https://github.com/snipe/snipe-it/commits?author=imanghafoori1 "Code") | [<img src="https://avatars1.githubusercontent.com/u/6551003?v=4" width="110px;"/><br /><sub>Richard Hofman</sub>](https://github.com/richardhofman6)<br />[💻](https://github.com/snipe/snipe-it/commits?author=richardhofman6 "Code") | [<img src="https://avatars0.githubusercontent.com/u/3697569?v=4" width="110px;"/><br /><sub>gizzmojr</sub>](https://github.com/gizzmojr)<br />[💻](https://github.com/snipe/snipe-it/commits?author=gizzmojr "Code") |
<!-- ALL-CONTRIBUTORS-LIST:END -->
This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind welcome!
@@ -76,7 +76,7 @@ This project follows the [all-contributors](https://github.com/kentcdodds/all-co
### Contributing
Please see the documentation on [contributing and developing for Snipe-IT](https://snipe-it.readme.io/docs/contributing).
Please see the documentation on [contributing and developing for Snipe-IT](https://snipe-it.readme.io/docs/contributing-overview).
Please note that this project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms.
+16 -3
View File
@@ -47,6 +47,7 @@ class RecryptFromMcrypt extends Command
// Check and see if they have a legacy app key listed in their .env
// If not, we can try to use the current APP_KEY if looks like it's old
$legacy_key = env('LEGACY_APP_KEY');
$key_parts = explode(':', $legacy_key);
$errors = array();
if (!$legacy_key) {
@@ -54,11 +55,23 @@ class RecryptFromMcrypt extends Command
return false;
}
// Check that the app key is 32 characters
// Do some basic legacy app key length checks
if (strlen($legacy_key) == 32) {
$this->comment('INFO: Your LEGACY_APP_KEY is 32 characters. Okay to continue.');
$legacy_length_check = true;
} elseif (array_key_exists('1', $key_parts) && (strlen($key_parts[1])==44)) {
$legacy_length_check = true;
} else {
$this->error('ERROR: Your LEGACY_APP_KEY is not the correct length (32 characters). Please locate your old APP_KEY and use that as your LEGACY_APP_KEY in your .env file to continue.');
$legacy_length_check = false;
}
// Check that the app key is 32 characters
if ($legacy_length_check === true) {
$this->comment('INFO: Your LEGACY_APP_KEY looks correct. Okay to continue.');
} else {
$this->error('ERROR: Your LEGACY_APP_KEY is not the correct length (32 characters or base64 followed by 44 characters for later versions). Please locate your old APP_KEY and use that as your LEGACY_APP_KEY in your .env file to continue.');
return false;
}
@@ -274,7 +274,7 @@ class AccessoriesController extends Controller
$data['note'] = $logaction->note;
$data['require_acceptance'] = $accessory->requireAcceptance();
// TODO: Port this to new mail notifications
if (($accessory->requireAcceptance()=='1') || ($accessory->getEula())) {
if ((($accessory->requireAcceptance()=='1') || ($accessory->getEula())) && ($user->email!='')) {
Mail::send('emails.accept-accessory', $data, function ($m) use ($user) {
$m->to($user->email, $user->first_name . ' ' . $user->last_name);
@@ -351,7 +351,7 @@ class AccessoriesController extends Controller
$data['item_tag'] = '';
$data['note'] = e($logaction->note);
if (($accessory->checkin_email()=='1')) {
if ((($accessory->checkin_email()=='1')) && ($user->email!='')) {
Mail::send('emails.checkin-asset', $data, function ($m) use ($user) {
$m->to($user->email, $user->first_name . ' ' . $user->last_name);
@@ -129,9 +129,8 @@ class AccessoriesController extends Controller
{
$this->authorize('view', Accessory::class);
$accessory = Accessory::findOrFail($id)->with('users')->first();
$accessories_users = $accessory->users;
$total = $accessories_users->count();
return (new AccessoriesTransformer)->transformCheckedoutAccessories($accessories_users, $total);
$total = $accessory->users->count();
return (new AccessoriesTransformer)->transformCheckedoutAccessory($accessory, $total);
}
@@ -2,9 +2,11 @@
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Transformers\CustomFieldsTransformer;
use App\Models\CustomField;
use App\Models\CustomFieldset;
use Illuminate\Http\Request;
class CustomFieldsController extends Controller
{
@@ -16,6 +18,15 @@ class CustomFieldsController extends Controller
* @since [v3.0]
* @return Array
*/
public function index()
{
$this->authorize('index', CustomFields::class);
$fields = CustomField::get();
$total = count($fields);
return (new CustomFieldsTransformer)->transformCustomFields($fields, $total);
}
public function postReorder(Request $request, $id)
{
$fieldset = CustomFieldset::find($id);
@@ -73,7 +73,7 @@ class GroupsController extends Controller
{
$this->authorize('view', Group::class);
$group = Group::findOrFail($id);
return $group;
return (new GroupsTransformer)->transformGroup($group);
}
@@ -13,6 +13,7 @@ use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Session;
use League\Csv\Reader;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Artisan;
class ImportController extends Controller
{
@@ -94,6 +95,8 @@ class ImportController extends Controller
public function process(ItemImportRequest $request, $import_id)
{
$this->authorize('create', Asset::class);
// Run a backup immediately before processing
Artisan::call('backup:run');
$errors = $request->import(Import::find($import_id));
$redirectTo = "hardware.index";
switch ($request->get('import-type')) {
@@ -82,7 +82,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::guard('api')->user();
$model->user_id = Auth::id();
$model->requestable = Input::has('requestable');
if ($request->input('custom_fieldset')!='') {
+9 -2
View File
@@ -412,6 +412,13 @@ class AssetsController extends Controller
$asset->delete();
$logaction = new Actionlog();
$logaction->item_type = Asset::class;
$logaction->item_id = $asset->id;
$logaction->created_at = date("Y-m-d H:i:s");
$logaction->user_id = Auth::user()->id;
$log = $logaction->logaction('deleted');
// Redirect to the asset management page
return redirect()->route('hardware.index')->with('success', trans('admin/hardware/message.delete.success'));
}
@@ -643,7 +650,7 @@ class AssetsController extends Controller
if ($settings->qr_code == '1') {
$asset = Asset::find($assetId);
$size = Helper::barcodeDimensions($settings->barcode_type);
$qr_file = public_path().'/uploads/barcodes/qr-'.str_slug($asset->asset_tag).'.png';
$qr_file = public_path().'/uploads/barcodes/qr-'.str_slug($asset->asset_tag).'-'.str_slug($asset->id).'.png';
if (isset($asset->id,$asset->asset_tag)) {
@@ -1223,7 +1230,7 @@ class AssetsController extends Controller
foreach ($asset_ids as $asset_id) {
$asset = Asset::find($asset_id);
$this->authorize('checkout', $asset);
$error = $asset->checkOutToUser($user, $admin, $checkout_at, $expected_checkin, e(Input::get('note')), null);
$error = $asset->checkOut($user, $admin, $checkout_at, $expected_checkin, e(Input::get('note')), null);
if ($error) {
array_merge_recursive($errors, $asset->getErrors()->toArray());
@@ -0,0 +1,15 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ResetsPasswords;
class RegisterController extends Controller
{
public function __construct()
{
$this->middleware('guest');
}
}
@@ -25,7 +25,7 @@ class ResetPasswordController extends Controller
*
* @var string
*/
protected $redirectTo = '/home';
protected $redirectTo = '/';
/**
* Create a new controller instance.
+11 -11
View File
@@ -74,20 +74,20 @@ class ComponentsController extends Controller
* @since [v3.0]
* @return \Illuminate\Http\RedirectResponse
*/
public function store()
public function store(Request $request)
{
$this->authorize('create', Component::class);
$component = new Component();
$component->name = Input::get('name');
$component->category_id = Input::get('category_id');
$component->location_id = Input::get('location_id');
$component->company_id = Company::getIdForCurrentUser(Input::get('company_id'));
$component->order_number = Input::get('order_number');
$component->min_amt = Input::get('min_amt');
$component->serial = Input::get('serial');
$component->purchase_date = Input::get('purchase_date');
$component->purchase_cost = request('purchase_cost');
$component->qty = Input::get('qty');
$component->name = $request->input('name');
$component->category_id = $request->input('category_id');
$component->location_id = $request->input('location_id');
$component->company_id = Company::getIdForCurrentUser($request->input('company_id'));
$component->order_number = $request->input('order_number', null);
$component->min_amt = $request->input('min_amt', null);
$component->serial = $request->input('serial', null);
$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();
if ($component->save()) {
@@ -37,19 +37,25 @@ class CustomFieldsetsController extends Controller
public function show($id)
{
$cfset = CustomFieldset::with('fields')->where('id', '=', $id)->orderBy('id', 'ASC')->first();
$custom_fields_list = ["" => "Add New Field to Fieldset"] + CustomField::pluck("name", "id")->toArray();
$maxid = 0;
foreach ($cfset->fields() as $field) {
if ($field->pivot->order > $maxid) {
$maxid=$field->pivot->order;
}
if (isset($custom_fields_list[$field->id])) {
unset($custom_fields_list[$field->id]);
if ($cfset) {
$custom_fields_list = ["" => "Add New Field to Fieldset"] + CustomField::pluck("name", "id")->toArray();
$maxid = 0;
foreach ($cfset->fields() as $field) {
if ($field->pivot->order > $maxid) {
$maxid=$field->pivot->order;
}
if (isset($custom_fields_list[$field->id])) {
unset($custom_fields_list[$field->id]);
}
}
return view("custom_fields.fieldsets.view")->with("custom_fieldset", $cfset)->with("maxid", $maxid+1)->with("custom_fields_list", $custom_fields_list);
}
return view("custom_fields.fieldsets.view")->with("custom_fieldset", $cfset)->with("maxid", $maxid+1)->with("custom_fields_list", $custom_fields_list);
return redirect()->route("fields.index")->with("error", trans('admin/custom_fields/message.fieldset.does_not_exist'));
}
@@ -133,16 +139,21 @@ class CustomFieldsetsController extends Controller
*/
public function destroy($id)
{
//
$fieldset = CustomFieldset::find($id);
$models = AssetModel::where("fieldset_id", "=", $id);
if ($models->count() == 0) {
$fieldset->delete();
return redirect()->route("fields.show")->with("success", trans('admin/custom_fields/message.fieldset.delete.success'));
} else {
return redirect()->route("fields.show")->with("error", trans('admin/custom_fields/message.fieldset.delete.in_use'));
if ($fieldset) {
$models = AssetModel::where("fieldset_id", "=", $id);
if ($models->count() == 0) {
$fieldset->delete();
return redirect()->route("fields.index")->with("success", trans('admin/custom_fields/message.fieldset.delete.success'));
} else {
return redirect()->route("fields.index")->with("error", trans('admin/custom_fields/message.fieldset.delete.in_use'));
}
}
return redirect()->route("fields.index")->with("error", trans('admin/custom_fields/message.fieldset.does_not_exist'));
}
+6 -3
View File
@@ -279,7 +279,7 @@ class LicensesController extends Controller
// Declare the rules for the form validation
$rules = [
'note' => 'string',
'note' => 'string|nullable',
'asset_id' => 'required_without:assigned_to',
];
@@ -306,8 +306,8 @@ class LicensesController extends Controller
return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.asset_does_not_exist'));
}
if (($target->assigned_to!='') && (($target->assigned_to!=$assigned_to)) && ($target!='')) {
return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.owner_doesnt_match_asset'));
if (($request->has('assigned_to')) && ($request->has('asset_id'))) {
return redirect()->back()->withInput()->with('error', trans('admin/licenses/message.select_asset_or_person'));
}
}
@@ -440,7 +440,10 @@ class LicensesController extends Controller
*/
public function show($licenseId = null)
{
$license = License::find($licenseId);
$license = $license->load('assignedusers', 'licenseSeats.user', 'licenseSeats.asset');
if (isset($license->id)) {
$license = $license->load('assignedusers', 'licenseSeats.user', 'licenseSeats.asset');
$this->authorize('view', $license);
+3 -3
View File
@@ -463,7 +463,7 @@ class ReportsController extends Controller
}
if (e(Input::get('notes')) == '1') {
$header[] = 'Notes';
$header[] = trans('general.notes');
}
@@ -604,9 +604,9 @@ class ReportsController extends Controller
if (e(Input::get('notes')) == '1') {
if ($asset->notes) {
$row[] = '"' .$asset->notes. '"';
$row[] = '"' .$asset->notes . '"';
} else {
$row[] = ''; // Empty string if unassigned
$row[] = '';
}
}
+6 -1
View File
@@ -338,7 +338,10 @@ class SettingsController extends Controller
$setting->email_format = $request->input('email_format');
$setting->username_format = $request->input('username_format');
$setting->require_accept_signature = $request->input('require_accept_signature');
$setting->login_note = $request->input('login_note');
if (!config('app.lock_passwords')) {
$setting->login_note = $request->input('login_note');
}
$setting->default_eula_text = $request->input('default_eula_text');
$setting->thumbnail_max_h = $request->input('thumbnail_max_h');
@@ -992,6 +995,8 @@ class SettingsController extends Controller
{
if (!config('app.lock_passwords')) {
if (Input::get('confirm_purge')=='DELETE') {
// Run a backup immediately before processing
Artisan::call('backup:run');
Artisan::call('snipeit:purge', ['--force'=>'true','--no-interaction'=>true]);
$output = Artisan::output();
return view('settings/purge')
+9 -8
View File
@@ -370,14 +370,20 @@ class UsersController extends Controller
// Authorize takes care of many of our logic checks now.
$this->authorize('delete', User::class);
if ($user->assets()->count() > 0) {
// Check if we are not trying to delete ourselves
if ($user->id === Auth::user()->id) {
// Redirect to the user management page
return redirect()->route('users.index')->with('error', 'This user still has ' . $user->assets()->count() . ' assets associated with them.');
}
if (count($user->assets) > 0) {
// Redirect to the user management page
return redirect()->route('users.index')->with('error', 'This user still has ' . count($user->assets) . ' assets associated with them.');
}
if ($user->licenses()->count() > 0) {
// Redirect to the user management page
return redirect()->route('users.index')->with('error', 'This user still has ' . $user->licenses()->count() . ' licenses associated with them.');
return redirect()->route('users.index')->with('error', 'This user still has ' . $user->assets()->count() . ' assets associated with them.');
}
if ($user->accessories()->count() > 0) {
@@ -532,10 +538,7 @@ class UsersController extends Controller
if (($key = array_search(Auth::user()->id, $user_raw_array)) !== false) {
unset($user_raw_array[$key]);
}
if (!Auth::user()->isSuperUser()) {
return redirect()->route('users.index')->with('error', trans('admin/users/message.insufficient_permissions'));
}
if (!config('app.lock_passwords')) {
@@ -836,7 +839,6 @@ class UsersController extends Controller
'permissions' => '{"user":1}',
'notes' => 'Imported user'
);
//dd($newuser);
DB::table('users')->insert($newuser);
@@ -928,7 +930,6 @@ class UsersController extends Controller
$user = User::find($userId);
$destinationPath = config('app.private_uploads').'/users';
// the license is valid
if (isset($user->id)) {
$this->authorize('update', $user);
$log = Actionlog::find($fileId);
+2
View File
@@ -19,10 +19,12 @@ class Kernel extends HttpKernel
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\FrameGuard::class,
\App\Http\Middleware\XssProtectHeader::class,
\App\Http\Middleware\ReferrerPolicyHeader::class,
\App\Http\Middleware\NosniffGuard::class,
\App\Http\Middleware\CheckForSetup::class,
\Fideloper\Proxy\TrustProxies::class,
\App\Http\Middleware\CheckForDebug::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
/**
@@ -0,0 +1,21 @@
<?php
namespace App\Http\Middleware;
use Closure;
class ReferrerPolicyHeader
{
/**
* Handle the given request and get the response.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return \Illuminate\Http\Response
*/
public function handle($request, Closure $next)
{
$response = $next($request);
$response->headers->set('Referrer-Policy', config('app.referrer_policy'));
return $response;
}
}
+2 -1
View File
@@ -14,8 +14,9 @@ class XssProtectHeader
*/
public function handle($request, Closure $next)
{
$mode = '1;mode=block';
$response = $next($request);
$response->headers->set('X-XSS-Protection', '1');
$response->headers->set('X-XSS-Protection', $mode);
return $response;
}
}
@@ -59,13 +59,30 @@ class AccessoriesTransformer
}
public function transformCheckedoutAccessories (Collection $accessories_users, $total)
public function transformCheckedoutAccessory (Accessory $accessory, $total)
{
$array = array();
foreach ($accessories_users as $user) {
$array[] = (new UsersTransformer)->transformUser($user);
foreach ($accessory->users as $user) {
$array[] = [
'assigned_pivot_id' => $user->pivot->id,
'id' => (int) $user->id,
'username' => e($user->username),
'name' => e($user->getFullNameAttribute()),
'first_name'=> e($user->first_name),
'last_name'=> e($user->last_name),
'employee_number' => e($user->employee_num),
'type' => 'user',
'available_actions' => ['checkin' => true]
];
}
return (new DatatablesTransformer)->transformDatatables($array, $total);
}
@@ -52,7 +52,8 @@ class ActionlogsTransformer
'type' => e($actionlog->targetType()),
] : null,
'note' => e($actionlog->note),
'note' => ($actionlog->note) ? e($actionlog->note): null,
'signature_file' => ($actionlog->accept_signature) ? route('log.signature.view', ['filename' => $actionlog->accept_signature ]) : null,
];
+4 -2
View File
@@ -33,7 +33,8 @@ class AssetsTransformer
'model_number' => ($asset->model) ? e($asset->model->model_number) : null,
'status_label' => ($asset->assetstatus) ? [
'id' => (int) $asset->assetstatus->id,
'name'=> e($asset->assetstatus->name)
'name'=> e($asset->assetstatus->name),
'status_type' => e($asset->assetstatus->getStatuslabelType()),
] : null,
'category' => ($asset->model->category) ? [
'id' => (int) $asset->model->category->id,
@@ -75,8 +76,9 @@ class AssetsTransformer
];
if ($asset->model->fieldset) {
if (($asset->model->fieldset) && (count($asset->model->fieldset->fields)> 0)) {
$fields_array = array();
foreach ($asset->model->fieldset->fields as $field) {
if ($field->isFieldDecryptable($asset->{$field->convertUnicodeDbSlug()})) {
@@ -25,7 +25,7 @@ class CustomFieldsTransformer
'name' => e($field->name),
'db_column_name' => e($field->db_column_name()),
'format' => e($field->format),
'required' => $field->pivot->required,
'required' => $field->pivot ? $field->pivot->required : false,
'created_at' => Helper::getFormattedDateObject($field->created_at, 'datetime'),
'updated_at' => Helper::getFormattedDateObject($field->updated_at, 'datetime'),
];
+1 -1
View File
@@ -23,7 +23,7 @@ class GroupsTransformer
$array = [
'id' => (int) $group->id,
'name' => e($group->name),
'permissions' => $group->permissions,
'permissions' => json_decode($group->permissions),
'users_count' => (int) $group->users_count,
'created_at' => Helper::getFormattedDateObject($group->created_at, 'datetime'),
'updated_at' => Helper::getFormattedDateObject($group->updated_at, 'datetime'),
@@ -33,8 +33,9 @@ class LicensesTransformer
'depreciation' => ($license->depreciation) ? ['id' => (int) $license->depreciation->id,'name'=> e($license->depreciation->name)] : null,
'notes' => e($license->notes),
'expiration_date' => Helper::getFormattedDateObject($license->expiration_date, 'date'),
'total_seats' => (int) $license->total_seats,
'remaining_qty' => $license->remaincount(),
'total_seats' => (int) $license->seats,
'next_seat' => ($license->freeSeat()) ? (int) $license->freeSeat()->id : null,
'remaining_qty' => (int) $license->remaincount(),
'min_qty' => $license->remaincount(),
'license_name' => e($license->license_name),
'license_email' => e($license->license_email),
@@ -36,9 +36,11 @@ class LocationsTransformer
'address' => e($location->address),
'city' => e($location->city),
'state' => e($location->state),
'country' => e($location->country),
'zip' => e($location->zip),
'assets_checkedout' => $location->assets()->count(),
'assets_default' => $location->assignedassets()->count(),
'country' => e($location->country),
'created_at' => Helper::getFormattedDateObject($location->created_at, 'datetime'),
'updated_at' => Helper::getFormattedDateObject($location->updated_at, 'datetime'),
'parent' => ($location->parent) ? [
+3 -1
View File
@@ -63,7 +63,9 @@ class AssetImporter extends ItemImporter
$this->item['image'] = $this->findCsvMatch($row, "image");
$this->item['warranty_months'] = intval($this->findCsvMatch($row, "warranty"));
$this->item['model_id'] = $this->createOrFetchAssetModel($row);
if (!$this->item['status_id'] && !$editingAsset) {
// If no status ID is found
if (!array_key_exists('status_id', $this->item) && !$editingAsset) {
$this->log("No status field found, defaulting to first status.");
$this->item['status_id'] = $this->defaultStatusLabelId;
}
+9 -3
View File
@@ -109,7 +109,15 @@ abstract class Importer
{
$headerRow = $this->csv->fetchOne();
$results = $this->normalizeInputArray($this->csv->fetchAssoc());
$this->customFields = CustomField::All(['name']);
// Stolen From https://adamwathan.me/2016/07/14/customizing-keys-when-mapping-collections/
// This 'inverts' the fields such that we have a collection of fields indexed by name.
$cFs = CustomField::All();
$this->customFields = $cFs->reduce(function ($nameLookup, $field) {
$nameLookup[$field['name']] = $field;
return $nameLookup;
});
DB::transaction(function () use (&$results) {
Model::unguard();
$resultsCount = sizeof($results);
@@ -161,8 +169,6 @@ abstract class Importer
*/
public function lookupCustomKey($key)
{
// dd($this->fieldMap);
if (array_key_exists($key, $this->fieldMap)) {
$this->log("Found a match in our custom map: {$key} is " . $this->fieldMap[$key]);
return $this->fieldMap[$key];
+2
View File
@@ -10,6 +10,7 @@ use App\Models\Location;
use App\Models\Manufacturer;
use App\Models\Statuslabel;
use App\Models\Supplier;
use App\Models\User;
class ItemImporter extends Importer
{
@@ -68,6 +69,7 @@ class ItemImporter extends Importer
if(get_class($this) !== UserImporter::class) {
if ($this->item["user"] = $this->createOrFetchUser($row)) {
$this->item['assigned_to'] = $this->item['user']->id;
$this->item['assigned_type'] = User::class;
}
}
}
-1
View File
@@ -61,7 +61,6 @@ class Accessory extends SnipeModel
'purchase_date',
'model_number',
'manufacturer_id',
'notes',
'qty',
'requestable'
];
+30 -28
View File
@@ -79,6 +79,7 @@ class Asset extends Depreciable
protected $fillable = [
'asset_tag',
'assigned_to',
'assigned_type',
'company_id',
'image',
'model_id',
@@ -253,18 +254,20 @@ class Asset extends Depreciable
public function assetLoc()
{
if (!empty($this->assignedType())) {
// dd($this->assignedType());
if ($this->assignedType() == self::ASSET) {
return $this->assignedTo->assetloc(); // Recurse until we have a final location
return $this->assignedto->assetloc(); // Recurse until we have a final location
}
if ($this->assignedType() == self::LOCATION) {
return $this->assignedTo();
}
if ($this->assignedType() == self::USER) {
if (!$this->assignedTo) {
return $this->defaultLoc();
}
return $this->assignedTo->userLoc();
}
if (!$this->assignedTo) {
return $this->defaultLoc();
}
}
return $this->defaultLoc();
}
@@ -722,7 +725,8 @@ class Asset extends Depreciable
/**
* Query builder scope to search on text for complex Bootstrap Tables API
* Query builder scope to search on text for complex Bootstrap Tables API.
* This is really horrible, but I can't think of a less-awful way to do it.
*
* @param \Illuminate\Database\Query\Builder $query Query builder instance
* @param text $search Search term
@@ -733,7 +737,16 @@ class Asset extends Depreciable
{
$search = explode(' OR ', $search);
return $query->where(function ($query) use ($search) {
return $query->leftJoin('users',function ($leftJoin) {
$leftJoin->on("users.id", "=", "assets.assigned_to")
->where("assets.assigned_type", "=", User::class);
})->leftJoin('locations',function ($leftJoin) {
$leftJoin->on("locations.id","=","assets.assigned_to")
->where("assets.assigned_type","=",Location::class);
})->leftJoin('assets as assigned_assets',function ($leftJoin) {
$leftJoin->on('assigned_assets.id', '=', 'assets.assigned_to')
->where('assets.assigned_type', '=', Asset::class);
})->where(function ($query) use ($search) {
foreach ($search as $search) {
$query->whereHas('model', function ($query) use ($search) {
$query->whereHas('category', function ($query) use ($search) {
@@ -766,26 +779,15 @@ class Asset extends Depreciable
$query->whereHas('defaultLoc', function ($query) use ($search) {
$query->where('locations.name', 'LIKE', '%'.$search.'%');
});
//FIXME: This needs attention to work with checkout to not-users.
// })->orWhere(function ($query) use ($search) {
// $query->whereHas('assignedTo', function ($query) use ($search) {
// $query->where(function ($query) use ($search) {
// $query->where('assets.assigned_type', '=', User::class)
// ->join('users', 'users.id', '=', 'assets.assigned_to')
// ->where(function($query) use ($search) {
// $query->where('users.first_name', 'LIKE', '%'.$search.'%')
// ->orWhere('users.last_name', 'LIKE', '%'.$search.'%');
// });
// })->orWhere(function ($query) use ($search) {
// $query->where('assets.assigned_type', '=', Location::class)
// ->join('locations', 'locations.id', '=', 'assets.assigned_to')
// ->where('locations.name', 'LIKE', '%'.$search.'%');
// })->orWhere(function ($query) use ($search) {
// $query->where('assets.assigned_type', '=', Asset::class)
// ->join('assets as assigned_asset', 'assigned_assets.id', '=', 'assets.assigned_to')
// ->where('assigned_assets.name', 'LIKE', '%'.$search.'%');
// });
// });
})->orWhere(function ($query) use ($search) {
$query->whereHas('assignedTo', function ($query) use ($search) {
$query->where('users.first_name', 'LIKE', '%'.$search.'%')
->orWhere('users.last_name', 'LIKE', '%'.$search.'%')
->orWhere('users.username', 'LIKE', '%'.$search.'%')
->orWhere('locations.name', 'LIKE', '%'.$search.'%')
->orWhere('assigned_assets.name', 'LIKE', '%'.$search.'%');
});
})->orWhere('assets.name', 'LIKE', '%'.$search.'%')
->orWhere('assets.asset_tag', 'LIKE', '%'.$search.'%')
->orWhere('assets.serial', 'LIKE', '%'.$search.'%')
@@ -793,9 +795,9 @@ class Asset extends Depreciable
->orWhere('assets.notes', 'LIKE', '%'.$search.'%');
}
foreach (CustomField::all() as $field) {
$query->orWhere($field->db_column_name(), 'LIKE', "%$search%");
$query->orWhere('assets.'.$field->db_column_name(), 'LIKE', "%$search%");
}
});
})->withTrashed()->whereNull("assets.deleted_at"); //workaround for laravel bug
}
+1 -1
View File
@@ -26,7 +26,7 @@ class AssetModel extends SnipeModel
// Declare the rules for the model validation
protected $rules = array(
'name' => 'required|min:1|max:255',
'model_number' => 'min:1|max:255',
'model_number' => 'max:255|nullable',
'category_id' => 'required|integer|exists:categories,id',
'manufacturer_id' => 'required|integer|exists:manufacturers,id',
'eol' => 'integer:min:0|max:240|nullable',
+1
View File
@@ -53,6 +53,7 @@ class Component extends SnipeModel
'name',
'purchase_cost',
'purchase_date',
'min_amt',
'qty',
];
+1 -3
View File
@@ -47,9 +47,7 @@ class CustomFieldset extends Model
if (($field->field_encrypted!='1') ||
(($field->field_encrypted =='1') && (Gate::allows('admin')) )) {
if ($field->pivot->required) {
$rule[]="required";
}
$rule[] = ($field->pivot->required=='1') ? "required" : "nullable";
}
array_push($rule, $field->attributes['format']);
+1
View File
@@ -48,6 +48,7 @@ class Ldap extends Model
// Needed for AD
ldap_set_option($connection, LDAP_OPT_REFERRALS, 0);
ldap_set_option($connection, LDAP_OPT_PROTOCOL_VERSION, $ldap_version);
ldap_set_option($connection, LDAP_OPT_NETWORK_TIMEOUT, 20);
if ($ldap_use_tls=='1') {
ldap_start_tls($connection);
+9 -6
View File
@@ -31,10 +31,10 @@ class License extends Depreciable
protected $rules = array(
'name' => 'required|string|min:3|max:255',
'seats' => 'required|min:1|max:1000000|integer',
'license_email' => 'email|min:0|max:120',
'license_name' => 'string|min:0|max:100',
'note' => 'string',
'notes' => 'string|min:0',
'license_email' => 'email|nullable|max:120',
'license_name' => 'string|nullable|max:100',
'note' => 'string|nullable',
'notes' => 'string|nullable',
'company_id' => 'integer|nullable',
);
@@ -332,14 +332,17 @@ class License extends Depreciable
return $this->belongsTo('\App\Models\Supplier', 'supplier_id');
}
/*
* Get the next available free seat - used by
* the API to populate next_seat
*/
public function freeSeat()
{
$seat = LicenseSeat::where('license_id', '=', $this->id)
return $this->licenseseats()
->whereNull('deleted_at')
->whereNull('assigned_to')
->whereNull('asset_id')
->first();
return $seat->id;
}
public static function getExpiringLicenses($days = 60)
+7 -4
View File
@@ -43,20 +43,23 @@ trait Loggable
$log->target_type = get_class($target);
$log->target_id = $target->id;
$class = get_class($target);
if ($class == Location::class) {
$target_class = get_class($target);
// Figure out what the target is
if ($target_class == Location::class) {
// We can checkout to a location
$log->location_id = $target->id;
} else if ($class== Asset::class) {
} elseif ($target_class== Asset::class) {
$log->location_id = $target->rtd_location_id;
} else {
$log->location_id = $target->location_id;
}
$log->note = $note;
$log->logaction('checkout');
$params = [
'item' => $this,
'item' => $log->item,
'target' => $target,
'admin' => $log->user,
'note' => $note,
+19
View File
@@ -77,6 +77,25 @@ class SnipeModel extends Model
return;
}
public function setMinAmtAttribute($value)
{
if ($value == '') {
$value = null;
}
$this->attributes['min_amt'] = $value;
return;
}
public function setParentIdAttribute($value)
{
if ($value == '') {
$value = null;
}
$this->attributes['parent_id'] = $value;
return;
}
//
public function getDisplayNameAttribute()
{
+28 -25
View File
@@ -44,7 +44,9 @@ class CheckoutNotification extends Notification
}
$item = $this->params['item'];
$notifyBy[]='mail';
if (class_basename(get_class($this->params['item']))!='License') {
$notifyBy[] = 'mail';
}
// if ((method_exists($item, 'requireAcceptance') && ($item->requireAcceptance()=='1'))
// || (method_exists($item, 'getEula') && ($item->getEula()))
// ) {
@@ -81,30 +83,31 @@ class CheckoutNotification extends Notification
*/
public function toMail($notifiable)
{
//TODO: Expand for non assets.
$item = $this->params['item'];
$admin_user = $this->params['admin'];
$target = $this->params['target'];
$data = [
'eula' => method_exists($item, 'getEula') ? $item->getEula() : '',
'first_name' => $target->present()->fullName(),
'item_name' => $item->present()->name(),
'checkout_date' => $item->last_checkout,
'expected_checkin' => $item->expected_checkin,
'item_tag' => $item->asset_tag,
'note' => $this->params['note'],
'item_serial' => $item->serial,
'require_acceptance' => $item->requireAcceptance(),
'log_id' => $this->params['log_id'],
];
return (new MailMessage)
->view('emails.accept-asset', $data)
->subject(trans('mail.Confirm_asset_delivery'));
// \Mail::send('emails.accept-asset', $data, function ($m) use ($target) {
// $m->to($target->email, $target->first_name . ' ' . $target->last_name);
// $m->replyTo(config('mail.reply_to.address'), config('mail.reply_to.name'));
// $m->subject(trans('mail.Confirm_asset_delivery'));
// });
//TODO: Expand for non assets.
$item = $this->params['item'];
$admin_user = $this->params['admin'];
$target = $this->params['target'];
$data = [
'eula' => method_exists($item, 'getEula') ? $item->getEula() : '',
'first_name' => $target->present()->fullName(),
'item_name' => $item->present()->name(),
'checkout_date' => $item->last_checkout,
'expected_checkin' => $item->expected_checkin,
'item_tag' => $item->asset_tag,
'note' => $this->params['note'],
'item_serial' => $item->serial,
'require_acceptance' => method_exists($item, 'requireAcceptance') ? $item->requireAcceptance() : '',
'log_id' => $this->params['log_id'],
];
return (new MailMessage)
->view('emails.accept-asset', $data)
->subject(trans('mail.Confirm_asset_delivery'));
}
/**
+10
View File
@@ -146,6 +146,16 @@ class LicensePresenter extends Presenter
return (string)link_to_route('licenses.show', $this->name, $this->id);
}
/**
* Link to this licenses Name
* @return string
*/
public function fullName()
{
return 'poop';
}
/**
* Link to this licenses serial
* @return string
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1 +1 @@
{"version":3,"file":"css/AdminLTE.css","sources":[],"mappings":";;;;;;","sourceRoot":""}
{"version":3,"file":"css/AdminLTE.css","sources":[],"mappings":";;;;;;A","sourceRoot":""}
+3 -3
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1 +1 @@
{"version":3,"file":"css/app.css","sources":[],"mappings":";;;;;;;;","sourceRoot":""}
{"version":3,"file":"css/app.css","sources":[],"mappings":";;;;;;;;A","sourceRoot":""}
File diff suppressed because one or more lines are too long
+10 -21
View File
@@ -1,23 +1,12 @@
{
"/build/vue.js": "/build/vue.js",
"/mix.js": "/mix.js",
"/build/app.css": "/build/app.535d8af1016a2377e449920c617f0197.css",
"/build/AdminLTE.css": "/build/AdminLTE.3d8a2b2e33baa060b1b324363ad5e1c2.css",
"/build/overrides.css": "/build/overrides.617623c6a96be3e0cbd11c5d4039ec10.css",
"/css/all.css": "/css/all.css",
"/js/all.js": "/js/all.js",
"/css/app.css": "/css/app.css",
"/css/dist/all.css": "/css/dist/all.css",
"/js/dist/all.js": "/js/dist/all.js",
"/css/AdminLTE.css": "/css/AdminLTE.css",
"/css/overrides.css": "/css/overrides.css",
"/css/skin-blue.css": "/css/skin-blue.css",
"/vue.js": "/vue.js",
"/vue.js.map": "/vue.js.map",
"/mix.js.map": "/mix.js.map",
"/css/AdminLTE.css.map": "/css/AdminLTE.css.map",
"/css/app.css.map": "/css/app.css.map",
"/css/overrides.css.map": "/css/overrides.css.map",
"public/css/dist/all.css": "public/css/dist/all.css",
"public/js/dist/all.js": "public/js/dist/all.js"
"/vue.js": "/vue.js",
"/css/AdminLTE.css": "/css/AdminLTE.css",
"/css/app.css": "/css/app.css",
"/css/overrides.css": "/css/overrides.css",
"/vue.js.map": "/vue.js.map",
"/css/AdminLTE.css.map": "/css/AdminLTE.css.map",
"/css/app.css.map": "/css/app.css.map",
"/css/overrides.css.map": "/css/overrides.css.map",
"/public/css/dist/all.css": "/public/css/dist/all.css",
"/public/js/dist/all.js": "/public/js/dist/all.js"
}
+1 -63
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+15
View File
@@ -155,6 +155,21 @@ return [
'allow_iframing' => env('ALLOW_IFRAMING', false),
/*
|--------------------------------------------------------------------------
| REFERRER-POLICY
|--------------------------------------------------------------------------
|
| This is an additional security header that browsers use to determine
| whether they should report back URL referrer information.
|
| Read more: https://www.w3.org/TR/referrer-policy/
|
*/
'referrer_policy' => env('REFERRER_POLICY', 'strict-origin'),
/*
|--------------------------------------------------------------------------
| Demo Mode Lockdown
+2 -2
View File
@@ -65,8 +65,8 @@ return [
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'charset' => env('DB_CHARSET', 'utf8mb4'),
'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
'prefix' => env('DB_PREFIX', null),
'strict' => false,
'engine' => null,
+2
View File
@@ -22,6 +22,8 @@ return [
base_path('public/uploads'),
base_path('config'),
base_path('storage/private_uploads'),
base_path('storage/oauth-private.key'),
base_path('storage/oauth-public.key'),
],
/*
+4 -4
View File
@@ -1,7 +1,7 @@
<?php
return array (
'app_version' => 'v4',
'build_version' => 'beta5',
'hash_version' => '7',
'full_hash' => 'v4-beta5-7-gae8c9d6',
'app_version' => 'v4.0.6',
'build_version' => '47',
'hash_version' => 'g2e76620',
'full_hash' => 'v4.0.6-47-g2e76620',
);
@@ -0,0 +1,17 @@
<?php
$factory->define(App\Models\CustomField::class, function (Faker\Generator $faker) {
return [
'name' => $faker->catchPhrase,
'format' => 'IP',
'element' => 'text',
];
});
$factory->define(App\Models\CustomFieldset::class, function (Faker\Generator $faker) {
return [
'name' => $faker->catchPhrase,
'user_id' => Auth::id()
];
});
-8
View File
@@ -97,14 +97,6 @@ $factory->define(App\Models\Consumable::class, function (Faker\Generator $faker)
];
});
$factory->define(App\Models\CustomField::class, function (Faker\Generator $faker) {
return [
'name' => $faker->catchPhrase,
'format' => 'IP',
'element' => 'text',
];
});
$factory->define(App\Models\Department::class, function (Faker\Generator $faker) {
return [
'name' => $faker->catchPhrase,
@@ -12,10 +12,13 @@ class AddSoftDeletedToLog extends Migration {
*/
public function up()
{
Schema::table('asset_logs', function ($table) {
$table->string('asset_type',100)->nullable()->change();
});
$platform = Schema::getConnection()->getDoctrineSchemaManager()->getDatabasePlatform();
$platform->registerDoctrineTypeMapping('enum', 'string');
Schema::table('asset_logs', function ($table) {
$table->string('asset_type',100)->nullable()->change();
});
// DB::statement('ALTER TABLE ' . DB::getTablePrefix() . 'asset_logs MODIFY column asset_type varchar(100) null');
// DB::statement('ALTER TABLE ' . DB::getTablePrefix() . 'asset_logs MODIFY column added_on timestamp default "0000-00-00 00:00:00"');
@@ -0,0 +1,36 @@
<?php
use App\Models\Asset;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class FixAssignedTypeNotBeingNulled extends Migration
{
/**
* Run the migrations.
* There was a point in the v4 beta process where assigned_type was not nulled on checkin
* This manually nulls all assets where there is an assigned_type but not an assigned_to.
* @return void
*/
public function up()
{
// There was a point in the v4 beta process where assigned_type was not nulled on checkin
// This manually nulls all assets where there is an assigned_type but not an assigned_to.
Asset::whereNotNull('assigned_type')->whereNull('assigned_to')->update(['assigned_type' => null]);
// Additionally, the importer did not set assigned_type when importing.
// In the case where we have an assigned_to but not an assigned_type, set the assigned_type to User.
Asset::whereNotNull('assigned_to')->whereNull('assigned_type')->update(['assigned_type' => 'App\Models\User']);
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}
+7 -5
View File
@@ -10,14 +10,14 @@
"production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js "
},
"devDependencies": {
"axios": "^0.15.3",
"axios": "^0.16.2",
"babel-preset-latest": "^6.24.1",
"cross-env": "^3.2.4",
"cross-env": "^5.0.5",
"jquery": "^3.1.1",
"laravel-mix": "0.12.1",
"laravel-mix": "1.4.3",
"lodash": "^4.17.4",
"vue": "2.3.3",
"vue-template-compiler": "2.3.3"
"vue": "2.4.4",
"vue-template-compiler": "2.4.4"
},
"dependencies": {
"blueimp-file-upload": "^9.18.0",
@@ -32,6 +32,8 @@
"jquery-ui": "^1.12.1",
"jquery-ui-bundle": "^1.12.1",
"jquery.iframe-transport": "^1.0.0",
"less": "^2.7.2",
"less-loader": "^4.0.5",
"papaparse": "^4.3.3",
"select2": "^4.0.3",
"tether": "^1.4.0",
+5 -7
View File
File diff suppressed because one or more lines are too long
+25 -25
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,2 +1,2 @@
User-agent: *
Disallow:
Disallow: /
@@ -67,7 +67,7 @@ tr {
<script>
export default {
props: ['file'],
props: ['file', 'customFieldUrl', 'importProcessUrl'],
data() {
return {
activeFile: this.file,
@@ -130,20 +130,28 @@ tr {
{id: 'jobtitle', text: 'Job Title' },
{id: 'phone_number', text: 'Phone Number' },
],
customFields: [],
},
columnMappings: this.file.field_map || {},
activeColumn: null,
}
},
created() {
this.fetchCustomFields();
window.eventHub.$on('showDetails', this.toggleExtendedDisplay)
this.populateSelect2ActiveItems();
},
computed: {
processUrl() {
// Because we need to pass a parameter to the laravel route function
// We get a url 'http://localhost/api/v1/imports/process/DUMMYTEXT'
// But we want to customize that to /api/v1/imports/process/this_file
return this.importProcessUrl.replace('DUMMYTEXT', this.file.id)
},
columns() {
switch(this.options.importType) {
case 'asset':
return this.columnOptions.general.concat(this.columnOptions.assets);
return this.columnOptions.general.concat(this.columnOptions.assets).concat(this.columnOptions.customFields);
case 'license':
return this.columnOptions.general.concat(this.columnOptions.licenses);
case 'user':
@@ -153,24 +161,36 @@ tr {
}
},
methods: {
fetchCustomFields() {
this.$http.get(this.customFieldUrl)
.then( ({data}) => {
data = data.rows;
data.forEach((item) => {
this.columnOptions.customFields.push({
'id': item.db_column_name,
'text': item.name,
})
})
});
},
postSave() {
this.statusText = "Processing...";
this.$http.post('/api/v1/imports/process/'+this.file.id, {
this.$http.post(this.processUrl, {
'import-update': this.options.update,
'import-type': this.options.importType,
'column-mappings': this.columnMappings
}).then( (response) => {
}).then( ({body}) => {
// Success
this.statusText = "Success... Redirecting.";
window.location.href = response.body.messages.redirect_url;
}, (response) => {
window.location.href = body.messages.redirect_url;
}, ({body}) => {
// Failure
if(response.body.status == 'import-errors') {
window.eventHub.$emit('importErrors', response.body.messages);
if(body.status == 'import-errors') {
window.eventHub.$emit('importErrors', body.messages);
this.statusText = "Error";
} else {
this.$emit('alert', {
message: response.body.messages,
message: body.messages,
type: "danger",
visible: true,
})
@@ -208,4 +228,4 @@ tr {
select2: require('../select2.vue')
}
}
</script>
</script>
@@ -11,6 +11,8 @@ th {
<script>
require('blueimp-file-upload');
export default {
props: ['importUrl'],
/*
* The component's data.
*/
@@ -72,7 +74,7 @@ th {
methods: {
fetchFiles() {
this.$http.get('/api/v1/imports')
this.$http.get(this.importUrl)
.then( ({data}) => this.files = data, // Success
//Fail
(response) => {
@@ -82,7 +84,7 @@ th {
});
},
deleteFile(file, key) {
this.$http.delete("/api/v1/imports/"+file.id)
this.$http.delete(this.importUrl+"/"+file.id)
.then((response) => this.files.splice(key, 1), // Success, remove file from array.
(response) => {// Fail
this.alert.type="danger";
@@ -1,14 +1,14 @@
<?php
return [
'asset_maintenance_type' => 'Maintenance Type',
'title' => 'Title',
'start_date' => 'Started',
'completion_date' => 'Completed',
'cost' => 'Cost',
'is_warranty' => 'Warranty Improvement',
'asset_maintenance_time' => 'Days',
'notes' => 'Notes',
'update' => 'Update',
'create' => 'Create'
'asset_maintenance_type' => 'Vedligeholdelsestype',
'title' => 'Titel',
'start_date' => 'Start dato',
'completion_date' => 'Gennemført',
'cost' => 'Omkostninger',
'is_warranty' => 'Garantiforbedring',
'asset_maintenance_time' => 'Dage',
'notes' => 'Noter',
'update' => 'Opdatering',
'create' => 'Opret'
];
@@ -1,11 +1,11 @@
<?php
return [
'asset_maintenances' => 'Asset Maintenances',
'edit' => 'Edit Asset Maintenance',
'delete' => 'Delete Asset Maintenance',
'view' => 'View Asset Maintenance Details',
'repair' => 'Repair',
'maintenance' => 'Maintenance',
'upgrade' => 'Upgrade'
'asset_maintenances' => 'Aktiv vedligeholdelse',
'edit' => 'Redigere aktiv vedligeholdelse',
'delete' => 'Slette aktiv vedligeholdelse',
'view' => 'Se aktiv vedligeholdelse detaljer',
'repair' => 'Repar',
'maintenance' => 'Vedligeholdelse',
'upgrade' => 'Opgradér'
];
@@ -3,6 +3,6 @@
return [
'title' => 'Asset Maintenance',
'asset_name' => 'Asset Name',
'is_warranty' => 'Warranty',
'dl_csv' => 'Download CSV'
'is_warranty' => 'Garanti',
'dl_csv' => 'Hent CSV'
];
@@ -1,6 +1,6 @@
<?php
return [
'about_companies_title' => 'About Companies',
'about_companies_text' => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
'select_company' => 'Select Company',
'about_companies_title' => 'Om virksomheder',
'about_companies_text' => 'Virksomheder kan bruges som en simpel id-felt, eller kan bruges til at begrænse synligheden af aktiver, brugere, osv. hvis fuld selskab understøttelse er aktiveret i din Admin indstillinger.',
'select_company' => 'Vælg firma',
];
@@ -1,18 +1,18 @@
<?php
return array(
'does_not_exist' => 'Company does not exist.',
'assoc_users' => 'This company is currently associated with at least one model and cannot be deleted. Please update your models to no longer reference this company and try again. ',
'does_not_exist' => 'Virksomheden eksisterer ikke.',
'assoc_users' => 'Denne virksomhed er knyttet til mindst én model og kan ikke slettes. Opdater venligst dine modeller for at ikke længere henvise til dette selskab, og prøv igen. ',
'create' => array(
'error' => 'Company was not created, please try again.',
'success' => 'Company created successfully.'
'error' => 'Virksomheden blev ikke oprettet, prøve igen.',
'success' => 'Virksomhed oprettet.'
),
'update' => array(
'error' => 'Company was not updated, please try again',
'success' => 'Company updated successfully.'
'error' => 'Virksomheden blev ikke opdateret, prøv igen',
'success' => 'Virksomheden blev opdateret.'
),
'delete' => array(
'confirm' => 'Are you sure you wish to delete this company?',
'error' => 'There was an issue deleting the company. Please try again.',
'success' => 'The Company was deleted successfully.'
'confirm' => 'Er du sikker på du vil slette denne virksomhed?',
'error' => 'Der opstod et problem under sletning af virksomheden. Prøv igen.',
'success' => 'Virksomheden blev slettet.'
)
);
+5 -5
View File
@@ -1,9 +1,9 @@
<?php
return array(
'companies' => 'Companies',
'create' => 'Create Company',
'title' => 'Company',
'update' => 'Update Company',
'name' => 'Company Name',
'companies' => 'Virksomheder',
'create' => 'Oprette virksomhed',
'title' => 'Virksomheden',
'update' => 'Opdater virksomhed',
'name' => 'Virksomhedens navn',
'id' => 'ID',
);
@@ -1,30 +1,30 @@
<?php
return array(
'custom_fields' => 'Custom Fields',
'field' => 'Field',
'about_fieldsets_title' => 'About Fieldsets',
'custom_fields' => 'Brugerdefinerede felter',
'field' => 'Felt',
'about_fieldsets_title' => 'Om Feltsæt',
'about_fieldsets_text' => 'Fieldsets allow you to create groups of custom fields that are frequently re-used used for specific asset model types.',
'custom_format' => 'Custom format...',
'encrypt_field' => 'Encrypt the value of this field in the database',
'encrypt_field_help' => 'WARNING: Encrypting a field makes it unsearchable.',
'encrypted' => 'Encrypted',
'fieldset' => 'Fieldset',
'qty_fields' => 'Qty Fields',
'fieldsets' => 'Fieldsets',
'fieldset_name' => 'Fieldset Name',
'field_name' => 'Field Name',
'field_values' => 'Field Values',
'custom_format' => 'Brugerdefineret format...',
'encrypt_field' => 'Kryptere værdien af dette felt i databasen',
'encrypt_field_help' => 'Advarsel: Kryptere et felt gør det uransagelige.',
'encrypted' => 'Krypteret',
'fieldset' => 'Feltsæt',
'qty_fields' => 'Antal felter',
'fieldsets' => 'Feltsæt',
'fieldset_name' => 'Feltsættets navn',
'field_name' => 'Feltnavn',
'field_values' => 'Feltværdier',
'field_values_help' => 'Add selectable options, one per line. Blank lines other than the first line will be ignored.',
'field_element' => 'Form Element',
'field_element' => 'Form-elementet',
'field_element_short' => 'Element',
'field_format' => 'Format',
'field_custom_format' => 'Custom Format',
'required' => 'Required',
'field_custom_format' => 'Brugerdefineret Format',
'required' => 'Påkrævet',
'req' => 'Req.',
'used_by_models' => 'Used By Models',
'order' => 'Order',
'create_fieldset' => 'New Fieldset',
'create_field' => 'New Custom Field',
'value_encrypted' => 'The value of this field is encrypted in the database. Only admin users will be able to view the decrypted value',
'used_by_models' => 'Bruges af modeller',
'order' => 'Ordre',
'create_fieldset' => 'Nyt Feltsæt',
'create_field' => 'Nyt Brugerdefinerede Felt',
'value_encrypted' => 'Værdien af dette felt er krypteret i databasen. Kun admins vil være i stand til at se den krypteret værdi',
);
@@ -3,48 +3,48 @@
return array(
'field' => array(
'invalid' => 'That field does not exist.',
'already_added' => 'Field already added',
'invalid' => 'Dette felt findes ikke.',
'already_added' => 'Feltet allerede tilføjet',
'create' => array(
'error' => 'Field was not created, please try again.',
'success' => 'Field created successfully.',
'assoc_success' => 'Field successfully added to fieldset.'
'error' => 'Feltet blev ikke oprettet, prøve igen.',
'success' => 'Feltet oprettet.',
'assoc_success' => 'Felt tilføjet til feltsættet.'
),
'update' => array(
'error' => 'Field was not updated, please try again',
'success' => 'Field updated successfully.'
'error' => 'Feltet blev ikke opdateret, prøv igen',
'success' => 'Feltet opdateret.'
),
'delete' => array(
'confirm' => 'Are you sure you wish to delete this field?',
'error' => 'There was an issue deleting the field. Please try again.',
'success' => 'The field was deleted successfully.',
'in_use' => 'Field is still in use.',
'confirm' => 'Er du sikker på du ønsker at slette feltet?',
'error' => 'Der opstod et problem under sletning af feltet. Prøv venligst igen.',
'success' => 'Feltet blev slettet.',
'in_use' => 'Feltet er stadig i brug.',
)
),
'fieldset' => array(
'does_not_exist' => 'Fieldset does not exist',
'does_not_exist' => 'Feltsættet findes ikke',
'create' => array(
'error' => 'Fieldset was not created, please try again.',
'success' => 'Fieldset created successfully.'
'error' => 'Feltsættet blev ikke opdateret, prøv igen.',
'success' => 'Feltsættet oprettet.'
),
'update' => array(
'error' => 'Fieldset was not updated, please try again',
'success' => 'Fieldset updated successfully.'
'error' => 'Feltsættet blev ikke opdateret, prøv igen',
'success' => 'Feltsættet opdateret.'
),
'delete' => array(
'confirm' => 'Are you sure you wish to delete this fieldset?',
'error' => 'There was an issue deleting the fieldset. Please try again.',
'success' => 'The fieldset was deleted successfully.',
'in_use' => 'Fieldset is still in use.',
'confirm' => 'Er du sikker på du vil slette dette feltsæt?',
'error' => 'Der opstod et problem under sletning af feltsættet. Prøv venligst igen.',
'success' => 'Feltsættet blev slettet.',
'in_use' => 'Feltsættet er stadig i brug.',
)
),
@@ -2,20 +2,20 @@
return array(
'does_not_exist' => 'Department does not exist.',
'assoc_users' => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
'does_not_exist' => 'Afdeling findes ikke.',
'assoc_users' => 'Denne afdeling er i øjeblikket knyttet til mindst én bruger og kan ikke slettes. Opdater venligst dine brugere for at ikke længere referere til denne afdeling, og prøv igen. ',
'create' => array(
'error' => 'Department was not created, please try again.',
'success' => 'Department created successfully.'
'error' => 'Afdelingen blev ikke oprettet, prøve igen.',
'success' => 'Afdeling oprettet.'
),
'update' => array(
'error' => 'Department was not updated, please try again',
'success' => 'Department updated successfully.'
'error' => 'Afdelingen blev ikke opdateret, prøv igen',
'success' => 'Afdeling opdateret.'
),
'delete' => array(
'confirm' => 'Are you sure you wish to delete this department?',
'error' => 'There was an issue deleting the department. Please try again.',
'success' => 'The department was deleted successfully.'
'confirm' => 'Er du sikker på du vil slette denne afdeling?',
'error' => 'Der var et problem sletningen af afdelingen. Prøv venligst igen.',
'success' => 'Afdelingen blev slettet.'
)
);
@@ -3,9 +3,9 @@
return array(
'id' => 'ID',
'name' => 'Department Name',
'name' => 'Afdelingsnavn',
'manager' => 'Manager',
'location' => 'Location',
'create' => 'Create Department',
'update' => 'Update Department',
'location' => 'Placering',
'create' => 'Oprette afdeling',
'update' => 'Opdater afdeling',
);
+4 -4
View File
@@ -1,11 +1,11 @@
<?php
return array(
'about_groups_title' => 'About Groups',
'about_groups' => 'Groups are used to generalize user permissions.',
'about_groups_title' => 'Om grupper',
'about_groups' => 'Grupper bruges til at generalisere brugertilladelser.',
'group_management' => 'Gruppehåndtering',
'create' => 'Create New Group',
'update' => 'Edit Group',
'create' => 'Opret Ny Gruppe',
'update' => 'Rediger Gruppe',
'group_name' => 'Gruppenavn',
'group_admin' => 'Gruppeadministrator',
'allow' => 'Tillad',
+7 -7
View File
@@ -1,21 +1,21 @@
<?php
return array(
'about_licenses_title' => 'About Licenses',
'about_licenses_title' => 'Om licenser',
'about_licenses' => 'Licenses are used to track software. They have a specified number of seats that can be checked out to individuals',
'checkin' => 'Checkin License Seat',
'checkout_history' => 'Checkout History',
'checkout' => 'Checkout License Seat',
'edit' => 'Edit License',
'edit' => 'Redigere licens',
'filetype_info' => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
'clone' => 'Clone License',
'clone' => 'Klon licens',
'history_for' => 'History for ',
'in_out' => 'In/Out',
'info' => 'License Info',
'info' => 'Licens Info',
'license_seats' => 'License Seats',
'seat' => 'Seat',
'seats' => 'Seats',
'software_licenses' => 'Software Licenses',
'user' => 'User',
'view' => 'View License',
'software_licenses' => 'Softwarelicenser',
'user' => 'Bruger',
'view' => 'Se licens',
);
+11 -11
View File
@@ -3,23 +3,23 @@
return array(
'assets_user' => 'Assets assigned to :name',
'assets_user' => 'Aktiver tildelt :navn',
'bulk_update_warn' => 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.',
'bulk_update_help' => 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.',
'current_assets' => 'Assets currently checked out to this user',
'clone' => 'Clone User',
'contact_user' => 'Contact :name',
'edit' => 'Edit User',
'filetype_info' => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
'clone' => 'Klon bruger',
'contact_user' => 'Kontakt :navn',
'edit' => 'Redigér bruger',
'filetype_info' => 'Tilladte filtyper er png, gif, jpg, jpeg, doc, docx, pdf, txt, zip og rar.',
'history_user' => 'History for :name',
'info' => 'Info',
'restore_user' => 'Click here to restore them.',
'last_login' => 'Last Login',
'info' => 'Information',
'restore_user' => 'Klik her for at gendanne dem.',
'last_login' => 'Sidste Login',
'ldap_config_text' => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
'software_user' => 'Software Checked out to :name',
'view_user' => 'View User :name',
'usercsv' => 'CSV file',
'view_user' => 'Se bruger :navn',
'usercsv' => 'CSV-fil',
'two_factor_admin_optin_help' => 'Your current admin settings allow selective enforcement of two-factor authentication. ',
'two_factor_enrolled' => '2FA Device Enrolled ',
'two_factor_active' => '2FA Active ',
'two_factor_active' => '2FA aktiv ',
);
+26 -26
View File
@@ -2,37 +2,37 @@
return array(
'activated' => 'Aktiv',
'allow' => 'Allow',
'checkedout' => 'Assets',
'created_at' => 'Created',
'createuser' => 'Create User',
'deny' => 'Deny',
'allow' => 'Tillad',
'checkedout' => 'Aktiver',
'created_at' => 'Oprettet',
'createuser' => 'Opret bruger',
'deny' => 'Afvis',
'email' => 'Email',
'employee_num' => 'Employee No.',
'first_name' => 'First Name',
'employee_num' => 'Medarbejder nr.',
'first_name' => 'Fornavn',
'groupnotes' => 'Select a group to assign to the user, remember that a user takes on the permissions of the group they are assigned.',
'id' => 'Id',
'id' => 'ID',
'inherit' => 'Inherit',
'job' => 'Job Title',
'last_login' => 'Last Login',
'last_name' => 'Last Name',
'location' => 'Location',
'job' => 'Job Titel',
'last_login' => 'Sidste Login',
'last_name' => 'Efternavn',
'location' => 'Placering',
'lock_passwords' => 'Login details cannot be changed on this installation.',
'manager' => 'Manager',
'managed_locations' => 'Managed Locations',
'name' => 'Name',
'notes' => 'Notes',
'password_confirm' => 'Confirm Password',
'password' => 'Password',
'phone' => 'Phone',
'show_current' => 'Show Current Users',
'show_deleted' => 'Show Deleted Users',
'title' => 'Title',
'managed_locations' => 'Administrerede placeringer',
'name' => 'Navn',
'notes' => 'Noter',
'password_confirm' => 'Bekræft adgangskode',
'password' => 'Adgangskode',
'phone' => 'Telefon',
'show_current' => 'Vis nuværende brugere',
'show_deleted' => 'Vis slettede brugere',
'title' => 'Titel',
'to_restore_them' => 'to restore them.',
'updateuser' => 'Update User',
'username' => 'Username',
'user_deleted_text' => 'This user has been marked as deleted.',
'updateuser' => 'Opdatere bruger',
'username' => 'Brugernavn',
'user_deleted_text' => 'Denne bruger er blevet markeret som slettede.',
'username_note' => '(This is used for Active Directory binding only, not for login.)',
'cloneuser' => 'Clone User',
'viewusers' => 'View Users',
'cloneuser' => 'Klon bruger',
'viewusers' => 'Se brugere',
);
+6 -6
View File
@@ -1,12 +1,12 @@
<?php
return [
'send_password_link' => 'Send Password Reset Link',
'email_reset_password' => 'Email Password Reset',
'reset_password' => 'Reset Password',
'send_password_link' => 'Send Link til nulstilling af adgangskode',
'email_reset_password' => 'Nulstil adgangskode',
'reset_password' => 'Nulstil adgangskode',
'login' => 'Login',
'login_prompt' => 'Please Login',
'forgot_password' => 'I forgot my password',
'remember_me' => 'Remember Me',
'login_prompt' => 'Log venligst ind',
'forgot_password' => 'Jeg har glemt min adgangskode',
'remember_me' => 'Husk mig',
];
+13 -13
View File
@@ -54,21 +54,21 @@ return array(
'read_the_terms' => 'Please read the terms of use below.',
'read_the_terms_and_click' => 'Please read the terms of use below, and click on the link at the bottom to confirm that you read
and agree to the terms of use, and have received the asset.',
'requested' => 'Requested:',
'requested' => 'Anmodede om:',
'reset_link' => 'Your Password Reset Link',
'reset_password' => 'Click here to reset your password:',
'reset_password' => 'Klik her for at nulstille adgangskoden:',
'serial' => 'Serial:',
'supplier' => 'Supplier',
'tag' => 'Tag',
'test_email' => 'Test Email from Snipe-IT',
'test_mail_text' => 'This is a test from the Snipe-IT Asset Management System. If you got this, mail is working :)',
'supplier' => 'Leverandør',
'tag' => 'Mærkat',
'test_email' => 'Test E-mail fra Snipe-IT',
'test_mail_text' => 'Dette er en test fra Snipe-IT Asset Management System. Hvis du fik dette, virker mailen :)',
'the_following_item' => 'The following item has been checked in: ',
'There_are' => '{1} There is|[2,Inf] There are',
'to_reset' => 'To reset your :web password, complete this form:',
'There_are' => '{1} Der er| [2,Inf] Der er',
'to_reset' => 'Nulstille din :web-adgangskode, udfylde denne formular:',
'type' => 'Type',
'user' => 'User:',
'username' => 'Username:',
'welcome' => 'Welcome :name',
'welcome_to' => 'Welcome to :web!',
'your_credentials' => 'Your Snipe-IT credentials',
'user' => 'Bruger:',
'username' => 'Brugernavn:',
'welcome' => 'Velkommen :navn',
'welcome_to' => 'Velkommen til :web!',
'your_credentials' => 'Dine Snipe-IT Legitimationsoplysninger',
);
@@ -14,6 +14,7 @@ return array(
'cost' => 'Purchase Cost',
'create' => 'Create Asset',
'date' => 'Purchase Date',
'depreciation' => 'Depreciation',
'depreciates_on' => 'Depreciates On',
'default_location' => 'Default Location',
'eol_date' => 'EOL Date',
@@ -7,6 +7,7 @@ return array(
'asset_does_not_exist' => 'The asset you are trying to associate with this license does not exist.',
'owner_doesnt_match_asset' => 'The asset you are trying to associate with this license is owned by somene other than the person selected in the assigned to dropdown.',
'assoc_users' => 'This license is currently checked out to a user and cannot be deleted. Please check the license in first, and then try deleting again. ',
'select_asset_or_person' => 'You must select an asset or a user, but not both.',
'create' => array(
@@ -12,8 +12,8 @@
'success' => 'Konserwacja aktywa utworzona pomyślnie.'
],
'edit' => [
'error' => 'Asset Maintenance was not edited, please try again.',
'success' => 'Asset Maintenance edited successfully.'
'error' => 'Konserwacja aktywa nie została edytowana, spróbuj ponownie.',
'success' => 'Edycja konserwacji aktywa zakończona pomyślnie.'
],
'asset_maintenance_incomplete' => 'Nieukończone',
'warranty' => 'Gwarancja',
@@ -2,7 +2,7 @@
return array(
'about_categories_title' => 'O Kategoriach',
'about_categories' => 'Categories help you organize your items. Some example categories might be &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, and so on, but you can use categories any way that makes sense for you.',
'about_categories' => 'Kategorie pozwolą lepiej zorganizować twoje aktywa. Przykłady kategorii to np. &quot; Stacje robocze&quot;, &quot;Laptopy&quot;, &quot;Telefony&quot;, &quot;Tablety&quot;, i inne dowolnie przez Ciebie wymyślone.',
'asset_categories' => 'Kategorie aktywów',
'category_name' => 'Nazwa kategorii',
'checkin_email' => 'Wyślij email przy przypisywaniu do użytkownika.',
@@ -28,7 +28,7 @@ return array(
'fieldset' => array(
'does_not_exist' => 'Fieldset does not exist',
'does_not_exist' => 'Zestaw pól nie istnieje',
'create' => array(
'error' => 'Zestaw pól nie został utworzony, spróbuj ponownie.',
@@ -2,20 +2,20 @@
return array(
'does_not_exist' => 'Department does not exist.',
'assoc_users' => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
'does_not_exist' => 'Wydział nie istnieje.',
'assoc_users' => 'Ten wydział obecnie jest skojarzony z co najmniej jednym użytkownikiem i nie może zostać usunięty. Uaktualnij użytkowników tak, aby nie było relacji z tym wydziałem i spróbuj ponownie. ',
'create' => array(
'error' => 'Department was not created, please try again.',
'success' => 'Department created successfully.'
'error' => 'Wydział nie został utworzony. Spróbuj ponownie.',
'success' => 'Wydział utworzony pomyślnie.'
),
'update' => array(
'error' => 'Department was not updated, please try again',
'success' => 'Department updated successfully.'
'error' => 'Wydział nie został utworzony. Spróbuj ponownie',
'success' => 'Wydział utworzony pomyślnie.'
),
'delete' => array(
'confirm' => 'Are you sure you wish to delete this department?',
'error' => 'There was an issue deleting the department. Please try again.',
'success' => 'The department was deleted successfully.'
'confirm' => 'Czy na pewno usunąć wybrany wydział?',
'error' => 'Podczas usuwania wydziału napotkano problem. Spróbuj ponownie.',
'success' => 'Wydział usunięty pomyślnie.'
)
);
@@ -3,9 +3,9 @@
return array(
'id' => 'ID',
'name' => 'Department Name',
'manager' => 'Manager',
'location' => 'Location',
'create' => 'Create Department',
'update' => 'Update Department',
'name' => 'Nazwa wydziału',
'manager' => 'Menedżer',
'location' => 'Lokalizacja',
'create' => 'Utwórz wydział',
'update' => 'Aktualizuj wydział',
);
+1 -1
View File
@@ -7,7 +7,7 @@ return array(
'asset' => 'Nabytek',
'bulk_checkout' => 'Przypisane aktywa do użytkownika',
'checkin' => 'Potwierdzanie zasobu/aktywa',
'checkout' => 'Checkout Asset',
'checkout' => 'Przypisz zasób',
'clone' => 'Klonuj zasób',
'deployable' => 'Gotowe do wdrożenia',
'deleted' => 'To aktywo zostało usunięte. <a href="/hardware/:asset_id/restore">Kliknij tutaj, aby je przywrócić</a>.',
+3 -3
View File
@@ -25,8 +25,8 @@ return array(
),
'audit' => array(
'error' => 'Asset audit was unsuccessful. Please try again.',
'success' => 'Asset audit successfully logged.'
'error' => 'Audyt aktywów nie powiódł się. Proszę spróbować ponownie.',
'success' => 'Audyt aktywów pomyślnie zarejestrowany.'
),
@@ -54,7 +54,7 @@ return array(
'delete' => array(
'confirm' => 'Czy na pewno chcesz usunąć?',
'error' => 'Nie można usunąć. Proszę spróbować ponownie.',
'nothing_updated' => 'No assets were selected, so nothing was deleted.',
'nothing_updated' => 'Aktywa nie zostały wybrane, więc nic nie zostało usunięte.',
'success' => 'Nabytek został usunięty.'
),
+1 -1
View File
@@ -23,7 +23,7 @@ return array(
'error' => 'Plik(i) nie zostały wysłane. Spróbuj ponownie.',
'success' => 'Plik(i) zostały wysłane poprawnie.',
'nofiles' => 'Nie wybrałeś żadnych plików do przesłania, albo plik, który próbujesz przekazać jest zbyt duży',
'invalidfiles' => 'One or more of your files is too large or is a filetype that is not allowed. Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
'invalidfiles' => 'Jeden lub więcej z wybranych przez ciebie plików jest za duży lub jego typ nie jest dopuszczony. Dopuszczalne typy plików: png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, rar, rtf, xml, and lic.',
),
'update' => array(
+2 -2
View File
@@ -2,7 +2,7 @@
return array(
'about_locations_title' => 'O Lokalizacjach',
'about_locations' => 'Locations are used to track location information for users, assets, and other items',
'about_locations' => 'Lokalizacje są używane do śledzenia informacji o lokalizacji użytkowników, aktywów i innych elementów',
'assets_rtd' => 'Aktywa', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
'assets_checkedout' => 'Aktywa przypisane',
'id' => 'ID',
@@ -17,5 +17,5 @@ return array(
'locations' => 'Lokalizacje',
'parent' => 'Rodzic',
'currency' => 'Waluta lokalna',
'ldap_ou' => 'LDAP Search OU',
'ldap_ou' => 'OU wyszukiwania LDAP',
);
@@ -2,15 +2,15 @@
return array(
'about_manufacturers_title' => 'O Producentach',
'about_manufacturers_text' => 'Manufacturers are the companies that create your assets. You can store important support contact information about them here, which will be displayed on your asset detail pages.',
'about_manufacturers_text' => 'Producentami są firmy, które wytwarzają Twoje aktywa. Możesz przechowywać informacje o tych firmach, które będą wyświetlane na stronach szczegółów aktywów.',
'asset_manufacturers' => 'Producenci aktywów',
'create' => 'Stwórz Producenta',
'id' => 'ID',
'name' => 'Name',
'support_email' => 'Support Email',
'support_phone' => 'Support Phone',
'support_url' => 'Support URL',
'name' => 'Nazwa',
'support_email' => 'Email wsparcia technicznego',
'support_phone' => 'Telefon wsparcia technicznego',
'support_url' => 'Adres WWW wsparcia technicznego',
'update' => 'Zaktualizuj Producenta',
'url' => 'URL',
'url' => 'Adres WWW',
);
+1 -1
View File
@@ -2,7 +2,7 @@
return array(
'about_models_title' => 'O Modelach aktywów',
'about_models_text' => 'Asset Models are a way to group identical assets. "MBP 2013", "IPhone 6s", etc.',
'about_models_text' => 'Modele aktywów są sposobem grupowania identycznych aktywów. "MBP 2013", "IPhone 6s", itp.',
'deleted' => 'Model został usunięty. <a href="/hardware/models/:model_id/restore">Kliknij aby przywrócić</a>.',
'restore' => 'Przywróć Model',
'requestable' => 'Użytkownicy mogą zażądać tego modelu',
+1 -1
View File
@@ -10,7 +10,7 @@ return array(
'alert_interval' => 'Próg wygasających alarmów (w dniach)',
'alert_inv_threshold' => 'Inwentarz progu alarmów',
'asset_ids' => 'ID Aktywa',
'audit_interval' => 'Audit Interval',
'audit_interval' => 'Interwał audytu',
'audit_interval_help' => 'If you are required to regularly physically audit your assets, enter the interval in months.',
'audit_warning_days' => 'Audit Warning Threshold',
'audit_warning_days_help' => 'How many days in advance should we warn you when assets are due for auditing?',
+1 -1
View File
@@ -11,5 +11,5 @@ return array(
'request' => 'Zamówienie',
'submit' => 'Zatwierdź',
'upload' => 'Wgraj',
'select_file' => 'Select File...',
'select_file' => 'Wybierz plik...',
);
+15 -15
View File
@@ -18,8 +18,8 @@
'asset_report' => 'Raporty Aktywów',
'asset_tag' => 'Krótka nazwa',
'assets_available' => 'Aktywa dostępne',
'audit' => 'Audit',
'audit_report' => 'Audit Log',
'audit' => 'Audyt',
'audit_report' => 'Dziennik zdarzeń',
'assets' => 'Aktywa',
'avatar_delete' => 'Skasuj Avatara',
'avatar_upload' => 'Wgraj Avatara',
@@ -38,12 +38,12 @@
'checkin_from' => 'Formularz odebrania',
'checkout' => 'Przypisz',
'city' => 'Miasto',
'click_here' => 'Click here',
'click_here' => 'Kliknij tutaj',
'companies' => 'Firmy',
'company' => 'Firma',
'component' => 'Składnik',
'components' => 'Składniki',
'complete' => 'Complete',
'complete' => 'Ukończone',
'consumable' => 'Materiał eksploatacyjny',
'consumables' => 'Materiały eksploatacyjne',
'country' => 'Kraj',
@@ -51,21 +51,21 @@
'created' => 'Item Created',
'created_asset' => 'Utworzone aktywa',
'created_at' => 'Utworzone',
'updated_at' => 'Updated at',
'updated_at' => 'Zaktualizowano',
'currency' => 'PLN', // this is deprecated
'current' => 'Lista urzytkowników',
'custom_report' => 'Raport niestandardowy składnik aktywów',
'dashboard' => 'Panel główny',
'days' => 'days',
'days' => 'dni',
'days_to_next_audit' => 'Days to Next Audit',
'date' => 'Data',
'debug_warning' => 'Ostrzeżenie!',
'debug_warning_text' => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
'debug_warning_text' => 'Ta aplikacja jest uruchomiona w trybie produkcyjnym z włączonym debugowaniem. Jeśli aplikacja jest dostępna na zewnątrz, może to zagrażać ujawnieniem wrażliwych danych. Wyłącz tryb debugowania przez ustawienie wartości <code>APP_DEBUG</code> w pliku <code>.env</code> na <code>false</code>.',
'delete' => 'Kasuj',
'deleted' => 'Usunięte',
'delete_seats' => 'Usunięte miejsca',
'departments' => 'Departments',
'department' => 'Department',
'departments' => 'Lokalizacje',
'department' => 'Lokalizacja',
'deployed' => 'Rozmieszczone',
'depreciation_report' => 'Raport Amortyzacji',
'download' => 'Pobieranie',
@@ -99,7 +99,7 @@
'insufficient_permissions' => 'Brak uprawnień!',
'language' => 'Język',
'last' => 'Ostatni',
'last_login' => 'Last Login',
'last_login' => 'Ostatnie logowanie',
'last_name' => 'Nazwisko',
'license' => 'Licencja',
'license_report' => 'Raport Licencji',
@@ -108,7 +108,7 @@
'list_all' => 'Pokaż Wszystkie',
'loading' => 'Wczytywanie',
'lock_passwords' => 'Tego pola nie można edytować dla tej instalacji.',
'feature_disabled' => 'This feature has been disabled for the demo installation.',
'feature_disabled' => 'Ta funkcja została wyłączona dla instalacji demo.',
'location' => 'Lokalizacja',
'locations' => 'Lokalizacje',
'logout' => 'Wyloguj się',
@@ -160,7 +160,7 @@
'select_model' => 'Wybierz Model',
'select_supplier' => 'Wybierz dostawcę',
'select_user' => 'Wybierz użytkownika',
'select_date' => 'Select Date (YYYY-MM-DD)',
'select_date' => 'Wybierz Datę (RRRR MM-DD)',
'select_statuslabel' => 'Wybierz status',
'select_company' => 'Wybierz firmę',
'select_asset' => 'Wybierz aktywa',
@@ -174,10 +174,10 @@
'status' => 'Status',
'supplier' => 'Dostawca',
'suppliers' => 'Dostawcy',
'sure_to_delete' => 'Are you sure you wish to delete',
'sure_to_delete' => 'Czy na pewno chcesz usunąć',
'submit' => 'Zatwierdź',
'target' => 'Target',
'time_and_date_display' => 'Time and Date Display',
'target' => 'Cel',
'time_and_date_display' => 'Wyświetlanie daty i czasu',
'total_assets' => 'Ogółem aktywów',
'total_licenses' => 'Ogółem licencji',
'total_accessories' => 'Ogółem akcesorii',
@@ -11,9 +11,9 @@ return array(
'alert_inv_threshold' => 'Limite de Alerta de Inventário',
'asset_ids' => 'ID do ativo',
'audit_interval' => 'Audit Interval',
'audit_interval_help' => 'If you are required to regularly physically audit your assets, enter the interval in months.',
'audit_interval_help' => 'Se você precisa verificar fisicamente seus ativos com frequência, insira um intervalo em meses.',
'audit_warning_days' => 'Audit Warning Threshold',
'audit_warning_days_help' => 'How many days in advance should we warn you when assets are due for auditing?',
'audit_warning_days_help' => 'Com quantos dias de antecedência deseja ser avisado sobre a verificação de seus ativos?',
'auto_increment_assets' => 'Gerar ID de ativo crescente',
'auto_increment_prefix' => 'Prefixo (opcional)',
'auto_incrementing_help' => 'Permitir auto insercao dessa ID de ativo antes de configurar isso',
@@ -80,7 +80,7 @@ return array(
'pwd_secure_complexity' => 'Password Complexity',
'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
'pwd_secure_min' => 'Password minimum characters',
'pwd_secure_min_help' => 'Minimum permitted value is 5',
'pwd_secure_min_help' => 'Valor mínimo permitido é 5',
'pwd_secure_uncommon' => 'Prevent common passwords',
'pwd_secure_uncommon_help' => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
'qr_help' => 'Habilite os Códigos QR primeiro para definir isto',
+61 -44
View File
@@ -2,59 +2,76 @@
{{-- Page title --}}
@section('title')
{{ trans('admin/hardware/general.checkin') }}
{{ trans('admin/accessories/general.checkin') }}
@parent
@stop
@section('header_right')
<a href="{{ URL::previous() }}" class="btn btn-primary pull-right">
{{ trans('general.back') }}</a>
@stop
{{-- Page content --}}
@section('content')
<div class="row header">
<div class="col-md-12">
<a href="{{ URL::previous() }}" class="btn-flat gray pull-right"><i class="fa fa-arrow-left icon-white"></i> {{ trans('general.back') }}</a>
<h3> {{ trans('general.checkin') }}</h3>
</div>
</div>
<div class="row form-wrapper">
<!-- left column -->
<div class="col-md-10 column">
<form class="form-horizontal" method="post" action="" autocomplete="off">
<!-- CSRF Token -->
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
<div class="row">
<div class="col-md-9">
<form class="form-horizontal" method="post" action="" autocomplete="off">
<!-- CSRF Token -->
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
@if ($accessory->name)
<!-- accessory name -->
<div class="form-group">
<label class="col-sm-2 control-label">{{ trans('admin/hardware/form.name') }}</label>
<div class="col-md-6">
<p class="form-control-static">{{ $accessory->name }}</p>
</div>
</div>
@endif
<div class="box box-default">
@if ($accessory->id)
<div class="box-header with-border">
<h3 class="box-title">{{ $accessory->name }}</h3>
</div><!-- /.box-header -->
@endif
<!-- Note -->
<div class="form-group {{ $errors->has('note') ? 'error' : '' }}">
<label for="note" class="col-md-2 control-label">{{ trans('admin/hardware/form.notes') }}</label>
<div class="col-md-7">
<textarea class="col-md-6 form-control" id="note" name="note">
{{ Input::old('note', $accessory->note) }}
</textarea>
{!! $errors->first('note', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
</div>
</div>
<!-- Form actions -->
<div class="form-group">
<label class="col-md-2 control-label"></label>
<div class="col-md-7">
<a class="btn btn-link" href="{{ URL::previous() }}">{{ trans('button.cancel') }}</a>
<button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i>{{ trans('general.checkin') }}</button>
<div class="box-body">
<form class="form-horizontal" method="post" action="" autocomplete="off">
<!-- CSRF Token -->
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
@if ($accessory->name)
<!-- accessory name -->
<div class="form-group">
<label class="col-sm-2 control-label">{{ trans('admin/hardware/form.name') }}</label>
<div class="col-md-6">
<p class="form-control-static">{{ $accessory->name }}</p>
</div>
</div>
@endif
<!-- Note -->
<div class="form-group {{ $errors->has('note') ? 'error' : '' }}">
<label for="note" class="col-md-2 control-label">{{ trans('admin/hardware/form.notes') }}</label>
<div class="col-md-7">
<textarea class="col-md-6 form-control" id="note" name="note">
{{ Input::old('note', $accessory->note) }}
</textarea>
{!! $errors->first('note', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
</div>
</div>
<!-- Form actions -->
<div class="form-group">
<label class="col-md-2 control-label"></label>
<div class="col-md-7">
<a class="btn btn-link" href="{{ URL::previous() }}">{{ trans('button.cancel') }}</a>
<button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i>{{ trans('general.checkin') }}</button>
</div>
</div>
</form>
</div>
</div>
</form>
</div> <!-- .col-md-10.column -->
</div> <!-- .row.form-wrapper -->
<div class="box-footer text-right">
<button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.save') }}</button>
</div>
</div> <!-- .box.box-default -->
</form>
</div> <!-- .col-md-9-->
</div> <!-- .row -->
@stop
@@ -2,7 +2,7 @@
{{-- Page title --}}
@section('title')
{{ trans('admin/hardware/general.checkout') }}
{{ trans('admin/accessories/general.checkout') }}
@parent
@stop
@section('header_right')

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