Compare commits

..

179 Commits

Author SHA1 Message Date
snipe
885ab64c2e Merge branch 'master' of https://github.com/snipe/snipe-it 2022-02-13 12:01:59 -07:00
snipe
8624531f78 Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2022-02-13 12:01:37 -07:00
snipe
db0c0e7908 Merge pull request #10665 from snipe/fixes/adds_gate_to_supplier_view
Adds gate to supplier
2022-02-13 10:56:55 -08:00
snipe
d77a47765e Adds gate to supplier
Signed-off-by: snipe <snipe@snipe.net>
2022-02-13 11:53:45 -07:00
snipe
05c0819776 Updated language string
Signed-off-by: snipe <snipe@snipe.net>
2022-02-11 15:55:42 -08:00
snipe
16f963fa3d Merge branch 'master' of https://github.com/snipe/snipe-it 2022-02-11 13:07:29 -08:00
snipe
e032cf1fda Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2022-02-11 13:07:26 -08:00
snipe
10c26f38c4 Merge pull request #10662 from snipe/fixes/tighter_security_on_select_lists
Added additional gate for selectlists
2022-02-11 12:48:55 -08:00
snipe
d6b8222371 Refactor to combine permissions
Signed-off-by: snipe <snipe@snipe.net>
2022-02-11 12:48:30 -08:00
snipe
2c5abaaea4 Fixed copypasta
Signed-off-by: snipe <snipe@snipe.net>
2022-02-11 12:32:09 -08:00
snipe
c1a0653847 Restrict to update or create gate methods for select lists
Signed-off-by: snipe <snipe@snipe.net>
2022-02-11 12:31:11 -08:00
snipe
9226c8292d Fixed typos in comments
Signed-off-by: snipe <snipe@snipe.net>
2022-02-11 12:02:14 -08:00
snipe
5fafa81dc1 Forgot components
Signed-off-by: snipe <snipe@snipe.net>
2022-02-11 11:57:29 -08:00
snipe
b30d1dce89 Removed selectlist
Signed-off-by: snipe <snipe@snipe.net>
2022-02-11 11:55:24 -08:00
snipe
2dad27eed6 Added additional gate for selectlists
Signed-off-by: snipe <snipe@snipe.net>
2022-02-11 11:46:14 -08:00
snipe
f5ffda8053 Ahem.
Signed-off-by: snipe <snipe@snipe.net>
2022-02-10 22:43:51 -08:00
snipe
5703b95de3 Merge pull request #10657 from snipe/fixes/handle_deleted_auditor
Fixed - Check for valid user before trying to present the auditor name
2022-02-10 20:14:24 -08:00
snipe
d406dc43c2 Check for valid user before trying to present the auditor name
Signed-off-by: snipe <snipe@snipe.net>
2022-02-10 20:13:02 -08:00
snipe
2ce44bd4e6 Line break for easier debugging
Signed-off-by: snipe <snipe@snipe.net>
2022-02-10 20:06:55 -08:00
snipe
ed931ef0cd Merge pull request #10654 from inietov/fixes/trying_to_get_property_checkin_email_of_non-object
Fixes  ErrorException: Trying to get property 'checkin_email' of non-object [sc-17568]
2022-02-10 12:23:50 -08:00
Ivan Nieto Vivanco
bf4ee18123 Validates if model and model->category exist before return the checkin_email property 2022-02-10 11:58:55 -06:00
snipe
70af10ae6c Merge pull request #10640 from JonathonReinhart/10552-add-checkin-api-date
Fix #10552: Add checkin_at parameter to /hardware/:id/checkin API
2022-02-10 09:54:20 -08:00
snipe
9892e5bf60 Merge pull request #10646 from snipe/fixes/check_field_exist_before_detaching
Check that the field exists before trying to detach it from the fieldset
2022-02-09 16:33:02 -08:00
snipe
b9a8d45c07 Better messaging
Signed-off-by: snipe <snipe@snipe.net>
2022-02-09 16:30:42 -08:00
snipe
7794c2f44b Check that the fieldset exists before trying to detach it from the fieldset
Signed-off-by: snipe <snipe@snipe.net>
2022-02-09 16:16:16 -08:00
snipe
eedc14401a Switch to searching on semicolon instead of &
Signed-off-by: snipe <snipe@snipe.net>
2022-02-09 15:55:22 -08:00
snipe
4e14d70427 Added jobtitle to unescaper
Signed-off-by: snipe <snipe@snipe.net>
2022-02-09 15:50:44 -08:00
snipe
2a71690aaf Added license_name to unescaper
Signed-off-by: snipe <snipe@snipe.net>
2022-02-09 15:17:57 -08:00
snipe
e4da00ca82 Catch potential validation errors on unescape tool
Signed-off-by: snipe <snipe@snipe.net>
2022-02-09 15:09:49 -08:00
snipe
4fd14e5859 Added slightly more output because wtf?
Signed-off-by: snipe <snipe@snipe.net>
2022-02-09 15:05:28 -08:00
snipe
441f1fbb64 Remove html_entities_decode restriction
Signed-off-by: snipe <snipe@snipe.net>
2022-02-09 14:56:36 -08:00
snipe
bf194d7794 Regenerate JS assets
Signed-off-by: snipe <snipe@snipe.net>
2022-02-09 14:43:30 -08:00
snipe
d06e3dd892 Merge branch 'master' of https://github.com/snipe/snipe-it 2022-02-09 14:40:33 -08:00
snipe
6b25b53462 Merge pull request #10628 from inietov/fixes/default_values_dont_allow_checkbox_radio
Fixes #10299 Default Values do not allow Checkbox/Radio Buttons
2022-02-09 14:39:46 -08:00
Ivan Nieto Vivanco
6d79c9f3e2 Save the default values for custom fields with same format than Assets do for actual values 2022-02-09 13:41:33 -06:00
Ivan Nieto Vivanco
a36957dd77 Finish the implementation of custom fields default values for checkboxes 2022-02-09 13:12:42 -06:00
Ivan Nieto Vivanco
2f3499e4b9 Show checkboxes a little less assy, actually save the data checked by them 2022-02-09 10:49:10 -06:00
Jonathon Reinhart
3536d08477 Add checkin_at parameter to /hardware/:id/checkin API
Fixes #10552
2022-02-08 20:23:09 -05:00
snipe
ee3166cdc2 Add @savornicesei as a contributor 2022-02-08 15:38:20 -08:00
snipe
7a117a22c8 Merge pull request #10637 from uberbrady/report_invalid_json
Alert when invalid JSON is submitted to something that wants it
2022-02-08 12:17:20 -08:00
Brady Wetherington
9a66f6a254 Remove extraneous backslash 2022-02-08 12:09:40 -08:00
Brady Wetherington
5e94726ec1 Properly alert when invalid JSON is submitted to something that wants JSON 2022-02-08 12:05:05 -08:00
snipe
66c3559e1c Merge pull request #10636 from inietov/fixes/inconsistencies_between_checkout_checkin_dates_master
Fixes #10627 Inconsistencies between checkout/checkin dates on asset history and activity log for master branch
2022-02-08 10:19:16 -08:00
Ivan Nieto Vivanco
413e44be2f Add custom date to checkin actionlogs and show it in the history of the asset tab 2022-02-08 11:58:23 -06:00
snipe
ebc35c4519 Merge pull request #10630 from JonathonReinhart/10629-checkin-API-error-status
Fix /hardware/{id}/checkin API response on error
2022-02-08 08:54:17 -08:00
Jonathon Reinhart
cd963179fd Fix /hardware/{id}/checkin API response on error
Fixes #10629
2022-02-08 01:08:42 -05:00
Ivan Nieto Vivanco
796a0ebdaa Add initial support for default values in checkboxes customfields 2022-02-07 22:17:40 -06:00
snipe
474f24e40e Merge branch 'master' of https://github.com/snipe/snipe-it 2022-02-07 18:27:59 -08:00
snipe
b3a0f86431 Temp fix for weird JSON format in history
Signed-off-by: snipe <snipe@snipe.net>
2022-02-07 18:27:55 -08:00
snipe
1a31231569 Merge pull request #10623 from uberbrady/fix_secure_hosts_in_subdirectory
Fixes #10577 - Fix "secure hostnames" feature for subdirectory-based Snipe-IT installs
2022-02-07 11:33:33 -08:00
Brady Wetherington
f1d4087317 Fix "secure hostnames" feature for subdirectory-based Snipe-IT installs 2022-02-07 11:26:54 -08:00
snipe
f4069e00cd Merge pull request #10611 from uberbrady/master
D'oh! Migration fails on empty settings table :(
2022-02-03 20:07:01 -08:00
Brady Wetherington
8650faf0d8 D'oh! Migration fails on empty settings table :( 2022-02-03 20:04:33 -08:00
snipe
796ef741e8 Merge pull request #10610 from uberbrady/fixes/ldap_active_status
Fixes #10563 - Rework the LDAP sync command to better handle the active flag
2022-02-03 19:45:41 -08:00
Brady Wetherington
36ae6f9430 Yanked debugging code, tightened up comments. 2022-02-03 19:41:16 -08:00
Brady Wetherington
1945b97b72 Just trying to really tighten up on the LDAP Active Flag and how we parse it. 2022-02-03 19:04:56 -08:00
Brady Wetherington
392e61688d Rework the LDAP sync command to better handle the active flag 2022-02-03 15:01:45 -08:00
snipe
db82e06665 Fixed migration with invalid LDAP prepopulation value
Signed-off-by: snipe <snipe@snipe.net>
2022-02-02 18:22:51 -08:00
snipe
ac5c6123bc Fixes #10563 - LDAP active flag - hopefully?
Signed-off-by: snipe <snipe@snipe.net>
2022-02-02 18:07:34 -08:00
snipe
8add47739e Merge pull request #10604 from inietov/fixes/column_activated_cannot_be_null
Fixes: Column activated cannot be null [sc-18528]
2022-02-02 12:21:31 -08:00
Ivan Nieto Vivanco
eac8e0bdba Add a casting to a truthy/falsy that needs to be integer 2022-02-02 13:54:57 -06:00
snipe
2815e0d36e Fixed audit email template (applies #10592 to master)
Signed-off-by: snipe <snipe@snipe.net>
2022-02-01 17:27:32 -08:00
snipe
2e998b110f Add @TenOfTens as a contributor 2022-02-01 13:40:31 -08:00
snipe
f45c963428 Merge pull request #10586 from inietov/fixes/bulkedit_does_not_show_in_history
Fixes Bulk edit doesn't show in Asset's history nor Activity report [sc-16550]
2022-01-31 23:07:02 -08:00
Ivan Nieto Vivanco
2fec40d7df Adds actionlog for bulk edits 2022-02-01 00:00:12 -06:00
snipe
215beb9d8a Merge pull request #10580 from misilot/fix-10176-webui-master
Replace .my.cnf with column-statistics.cnf at the system level for mysqldump (master)
2022-01-29 07:16:24 -08:00
Tom Misilo
b0c61ee044 Replace .my.cnf with column-statistics.cnf at the system level for mysqldump
Fixes #10176

The `column-statistics.cnf` file is copied to `/etc/mysql/conf.d/column-statistics.cnf` for each Dockerfile that exists.

This puts it as a system level mysql client change, so the web ui interface also works.
2022-01-29 07:28:12 -06:00
snipe
16fb2213b5 Updated language strings
Signed-off-by: snipe <snipe@snipe.net>
2022-01-28 12:40:03 -08:00
snipe
a0d0645453 Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2022-01-28 12:38:42 -08:00
snipe
1ef336a08b Merge pull request #10576 from snipe/features/add_custom_fields_search
Added #9576 - Lookup Asset by Custom Field via API [sc-18632]
2022-01-28 09:51:28 -08:00
snipe
aa3aa78204 Adds Lookup Asset by Custom Field via API [sc-18632]
Signed-off-by: snipe <snipe@snipe.net>
2022-01-28 09:08:48 -08:00
snipe
db0a078c0b Merge pull request #10573 from uberbrady/fix_force_root_url
Add some guardrails around very-badly formatted APP_URL settings
2022-01-27 11:29:29 -08:00
Brady Wetherington
1cf1278b3b Fix whitespace issues 2022-01-27 11:28:51 -08:00
Brady Wetherington
70648dedd3 Add some guardrails around very-badly formatted APP_URL settings 2022-01-27 11:21:46 -08:00
snipe
9634dde0dd Merge pull request #10567 from inietov/fixes/importing_and_checking_out_licenses_master
Fixes Importing licenses without product key duplicates the license
2022-01-27 10:58:06 -08:00
snipe
077caa29f8 Merge pull request #10570 from inietov/fixes/donked_layout_required_field_error_depreciation
Fixes donked layout required field error depreciation [sc-17111]
2022-01-26 21:23:51 -08:00
Ivan Nieto Vivanco
a87478d3ac Set the actual field we are evaluating as required (months) 2022-01-26 23:02:27 -06:00
Ivan Nieto Vivanco
44349db597 Fixes the appearance of some error messages 2022-01-26 22:58:02 -06:00
snipe
c70ae19c28 Merge pull request #10529 from uberbrady/fix_insecure_host_headers
Force UrlGenerator's Root URL to be the base of APP_URL unless overriden (v5)
2022-01-26 16:59:55 -08:00
Ivan Nieto Vivanco
55fdc86e02 Tweak query in the License Importer to not require a Product Key 2022-01-26 17:51:04 -06:00
snipe
0721ab8bbf Regenerated production assets
Signed-off-by: snipe <snipe@snipe.net>
2022-01-20 11:01:04 -08:00
snipe
00c8a1ee21 Merge pull request #10533 from inietov/feature/add_remaining_address_field_to_user_import
Add Zip field in the User Importer [sc-18556]
2022-01-19 12:07:18 -08:00
Ivan Nieto Vivanco
1fc71a4111 Add Zip field in the User Importer 2022-01-19 13:35:54 -06:00
Brady Wetherington
0c4768fd2a Force UrlGenerator's Root URL to be the base of APP_URL unless overriden
(For v5)
2022-01-18 15:52:59 -08:00
snipe
f9647614ab Merge pull request #10527 from inietov/fixes/pdo_exception_syntax_error_when_sendexpirationalers_is_called
Fixes PDO exeception syntax error when Expiring Alerts Threshold is not set
2022-01-18 12:43:08 -08:00
Ivan Nieto Vivanco
a05795420a Respect the default value of 60 days in expiring licenses 2022-01-18 14:34:14 -06:00
Ivan Nieto Vivanco
42d86bf57b Adds default values if the expiring alerts threshold is null 2022-01-18 14:21:49 -06:00
snipe
201b52baf8 Merge pull request #10523 from inietov/fixes/depreciation_report_shows_assets_that_not_deprecate_master
Fixes bug where the depreciation report shows assets that not deprecate for master
2022-01-18 10:37:21 -08:00
Ivan Nieto Vivanco
f510b9c2a9 Add query to filter non-deprecable assets when the Depreciation Report is called 2022-01-15 14:21:31 -06:00
snipe
75bd365ca1 Merge pull request #10521 from inietov/fixes/sc-14356/importer_creating_duplicate_asset_models_master
Fixes an issue where importer is creating duplicate asset models for Master Branch
2022-01-15 07:46:39 -08:00
Ivan Nieto Vivanco
153c30eda8 Add to Importer the capacity to search Models only with Model Name since Model Number is not required 2022-01-15 04:32:47 -06:00
snipe
be7e6ed847 Merge pull request #10502 from uberbrady/ldap_useraccountcontrol_dont_req_preauth
Add new UserAccountControl to permitted UAC's for AD.
2022-01-13 17:01:47 -08:00
snipe
115109f612 Merge pull request #10510 from misilot/fix-10176-master
Looks great, thanks!
2022-01-13 13:22:22 -08:00
Thomas Misilo
037a912e21 Adding .my.cnf to disable column-statistics backup
Fixes #10176

The ```.my.cnf``` file is copied to ```/root/.my.cnf``` for each
Dockerfile that exists
2022-01-13 15:16:59 -06:00
snipe
984db1ef44 Apply personal API token fix to master
Signed-off-by: snipe <snipe@snipe.net>
2022-01-13 01:39:56 -08:00
Brady Wetherington
c8fe929e09 Add new UserAccountControl to permitted UAC's for AD. 2022-01-12 12:07:51 -08:00
snipe
181dc5127f Add @UniversalSuperBox as a contributor 2022-01-11 15:03:08 -08:00
snipe
303fc39966 Regenerated assets to pikc up #10089 changes
Signed-off-by: snipe <snipe@snipe.net>
2022-01-11 14:38:17 -08:00
snipe
730c2a6821 Merge pull request #10496 from UniversalSuperBox/fix/improve-asset-card-view
Fixed #10089 (partially): Back to master: Added some BS tables style overrides for mobile
2022-01-11 14:10:18 -08:00
snipe
bc10761b49 Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2022-01-11 12:44:16 -08:00
snipe
cf14a0222c Merge pull request #10498 from Haxatron/master
Fix access control
2022-01-10 19:24:31 -08:00
snipe
b18b3812df Back to master: Added some BS tables style overrides for mobile
This repeats 06e8e826, which alone improves the mobile view immensely,
on master.
2022-01-10 15:23:43 -06:00
Haxatron
bb095641c2 Update BulkAssetModelsController.php
https://huntr.dev/bounties/efdf2ead-f9d1-4767-9f02-d11f762d15e7
2022-01-06 09:50:11 +08:00
snipe
b78e610ce3 Merge pull request #10480 from snipe/fixes/check_for_valid_custom_field
Fixed format property on invalid custom field object when trying to edit a field that doesn't exist
2022-01-03 19:28:25 -08:00
snipe
884b6b0270 Fixes format property on invalid custom field object
Signed-off-by: snipe <snipe@snipe.net>
2022-01-03 19:14:50 -08:00
snipe
7a1ab1292c Merge pull request #10479 from adagioajanes/fixes/auto_asset_tag_phrasing
Fixed auto asset tag phrasing
2021-12-31 15:17:59 -08:00
Alex Janes
87bb741013 Merge branch 'snipe:master' into fixes/auto_asset_tag_phrasing 2021-12-31 16:34:57 -05:00
Alex Janes
5fe2083688 Adjusted the phrasing around auto-incrementing asset tags. 2021-12-31 16:33:30 -05:00
snipe
2ee84c2675 Added a few more comments
Signed-off-by: snipe <snipe@snipe.net>
2021-12-30 18:33:28 -08:00
snipe
39a5b6b426 Merge pull request #10478 from snipe/fixes/whitelist_modal_views
Added allow list to modal view options
2021-12-30 18:29:30 -08:00
snipe
c6ce928567 Added allow list to modal view options
Signed-off-by: snipe <snipe@snipe.net>
2021-12-30 18:16:49 -08:00
snipe
950a23b0f4 Merge pull request #10476 from snipe/fixes/custom_fieldsets_index
Fixed missing index for fieldsets
2021-12-30 13:18:13 -08:00
snipe
b4fac3e4ae Fixed missing index for fieldsets
Signed-off-by: snipe <snipe@snipe.net>
2021-12-30 13:16:44 -08:00
snipe
548e483ef8 Merge pull request #10475 from snipe/fixes/wrong_default_sort_on_kits
Fixed assets_count doesnt exist as a column on kits
2021-12-30 13:02:12 -08:00
snipe
bad6b862ca assets_count doesnt exist as a column
Signed-off-by: snipe <snipe@snipe.net>
2021-12-30 12:59:16 -08:00
snipe
4e336e11ee Merge pull request #10470 from snipe/increase_address_length_for_supplier
Fixed #10469 - increased size of supplier address field
2021-12-27 12:29:13 -08:00
snipe
8588e9ebf1 Fixed #10469 - increased size of supplier address field
Signed-off-by: snipe <snipe@snipe.net>
2021-12-27 12:28:02 -08:00
snipe
11524d0f7d Merge pull request #10463 from adagioajanes/fixes/pass_total_to_GroupsTransformer
Fixed #10461: Groups management page did not paginate correctly
2021-12-24 10:39:22 -08:00
Alex Janes
d0bfd8dfd2 Fixed the collection of the groups total to GroupsTransformer.php. Groups page should now paginate correctly. 2021-12-23 20:54:34 -05:00
snipe
312200bf44 Removed duplicate "department" entry in importer, pulls #10460 to master
Signed-off-by: snipe <snipe@snipe.net>
2021-12-21 13:37:20 -08:00
snipe
04f4bb83e9 Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2021-12-16 20:37:22 -08:00
snipe
9b2dd6522f Switch GET to POST for asset request
Signed-off-by: snipe <snipe@snipe.net>
2021-12-16 20:36:08 -08:00
snipe
a05fe9c1f7 Add @exula as a contributor 2021-12-15 09:30:36 -08:00
snipe
395401e9db Merge pull request #10439 from exula/exula-fix-slack-settings
Update SettingsController.php to save Slack Settings
2021-12-15 08:36:18 -08:00
Bradley Coudriet
dbdc1c7f3f Update SettingsController.php to save Slack Settings
This goes with #10438 that I just submitted about Slack Settings not saving.

This adds the necessary code to actually save the Slack Settings,
As they are already validated by the SlackSettingsRequest, this seems like an easy and low-impact fix.
2021-12-15 10:38:51 -05:00
snipe
ace4a00e29 Merge pull request #10433 from inietov/features/adding_title_to_custom_report_master
Add title column to custom reports on master branch
2021-12-14 10:28:18 -08:00
Ivan Nieto Vivanco
c80aa2a289 Add title column to custom reports 2021-12-14 12:05:33 -06:00
snipe
25e2e7ecc6 Merge pull request #10418 from inietov/fixes/bulk_edit_count_more_users_than_selected
Fixes bulk edit message counts more users than the actual selected users number
2021-12-13 14:13:14 -08:00
snipe
02be4773de Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2021-12-13 12:07:34 -08:00
snipe
c988d84271 Merge pull request #10426 from snipe/fixes/added_escape_to_asset_api_assigned_to
Added escape to assigned_to API response
2021-12-13 12:06:08 -08:00
snipe
9d5d1a9f9a Added escape to assigned_to API response
Signed-off-by: snipe <snipe@snipe.net>
2021-12-13 12:03:03 -08:00
snipe
3a7cef15bd Merge pull request #10423 from misilot/automated-image-build-github-actions
Automatic Building of Docker Images and Pushing to DockerHub
2021-12-13 11:32:57 -08:00
snipe
44d3a425cb Merge pull request #10422 from misilot/docker-alpine-build-automatic
Adds an automatic build for Alpine Linux based Image
2021-12-13 11:32:42 -08:00
snipe
1854d7d668 Updated language strings
Signed-off-by: snipe <snipe@snipe.net>
2021-12-13 11:28:01 -08:00
snipe
e5f4048e9e Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2021-12-13 11:01:02 -08:00
Thomas Misilo
5e58f60845 Adds an automatic build for Alpine Linux based Image
This Fixes #10339, and allows for automatic building of the Alpine Linux
image, and push to docker-hub.

This will push a "latest-alpine" based on the master branch, a
"develop-alpine" based on the develop branch, and a v##.##.##-alpine
image based on any released version.

`DOCKER_USERNAME` and `DOCKER_ACCESS_TOKEN` do both need
to be added to the repository as secrets.
2021-12-13 10:39:55 -06:00
Thomas Misilo
a7760b331b Automatic Building of Docker Images and Pushing to DockerHub
This allows for building and pushing of the Snipe-IT docker images
directly from GitHub to DockerHub.

This will push a "latest" based on the master branch, a
"develop" based on the develop branch, and a v##.##.##
image based on any released version.

`DOCKER_USERNAME` and `DOCKER_ACCESS_TOKEN` do both need
to be added to the repository as secrets.
2021-12-13 10:39:04 -06:00
Ivan Nieto Vivanco
a419a690d4 Add a variable to better control the selected user's ids 2021-12-11 18:01:38 -06:00
snipe
39b0dc136c Added LDAP strings back
Signed-off-by: snipe <snipe@snipe.net>
2021-12-11 10:14:35 -08:00
snipe
d0e7879c89 Merge pull request #10415 from uberbrady/fix_actionlog_memory_exhaustion
Remove 'actionlog' from the ::with() clause in the asset query API
2021-12-10 19:10:40 -08:00
Brady Wetherington
acfb41f129 Remove 'actionlog' from the ::with() clause in the asset query API 2021-12-10 18:42:56 -08:00
snipe
5381aa3fbd Merge branch 'master' of https://github.com/snipe/snipe-it 2021-12-10 15:17:45 -08:00
snipe
e20a10a6a1 Add @Haxatron as a contributor 2021-12-10 15:17:26 -08:00
snipe
949141a8e7 Merge pull request #10414 from snipe/added_model_to_accessory_report
Added model number to accessory report
2021-12-10 15:10:02 -08:00
snipe
e1bf3b50f4 Added model number to accessory report
Signed-off-by: snipe <snipe@snipe.net>
2021-12-10 15:09:29 -08:00
snipe
cf5e3da3a5 Merge pull request #10406 from Haxatron/fix-access-control
security fix
2021-12-09 11:23:35 -08:00
Haxatron
1699c09758 Update AssetModelsController.php 2021-12-09 21:42:18 +08:00
Haxatron
918e7c8dae Fix access control - https://huntr.dev/bounties/19453ef1-4d77-4cff-b7e8-1bc8f3af0862/ 2021-12-09 12:57:04 +08:00
snipe
86afe6c4b1 Cleanup slack validation
Signed-off-by: snipe <snipe@snipe.net>
2021-12-08 18:03:56 -08:00
snipe
ff97b359ad Removed form request on ajax, cleaned up some other things
Signed-off-by: snipe <snipe@snipe.net>
2021-12-08 17:58:46 -08:00
snipe
81b66d0039 Change validation failure to 422 to make it consistent with Laravel's default
Signed-off-by: snipe <snipe@snipe.net>
2021-12-08 17:54:35 -08:00
snipe
8fa690b635 Reverting form request because it doesn't seem to work (????!!)
Signed-off-by: snipe <snipe@snipe.net>
2021-12-08 17:54:15 -08:00
snipe
8c1cd87831 Added slacksettingsrequest as use statement
Signed-off-by: snipe <snipe@snipe.net>
2021-12-08 15:56:22 -08:00
snipe
cde2bad297 Small mods to slack jquery
Signed-off-by: snipe <snipe@snipe.net>
2021-12-08 15:56:05 -08:00
snipe
80d36cd72b Added slack settings request
Signed-off-by: snipe <snipe@snipe.net>
2021-12-08 15:53:05 -08:00
snipe
a579353198 Add @bestlong as a contributor 2021-11-24 20:04:26 -08:00
snipe
7360e15d4e Add @sneak-it as a contributor 2021-11-24 20:04:05 -08:00
snipe
9dc2fa61b8 Add @adamboutcher as a contributor 2021-11-24 20:03:52 -08:00
snipe
80fd49a59e Add @leitwerk-ag as a contributor 2021-11-24 20:03:40 -08:00
snipe
d30fa9199c Merge branch 'master' of https://github.com/snipe/snipe-it 2021-11-24 19:58:52 -08:00
snipe
8028b39b43 Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2021-11-24 19:58:43 -08:00
snipe
ff81e6d536 Merge pull request #10361 from snipe/fixes/xss_in_accessories_checkout_notes
Escape notes in transformCheckedOutAccessory
2021-11-24 19:56:36 -08:00
snipe
00fad35c2a Escape notes in transformCheckedOutAccessory
Signed-off-by: snipe <snipe@snipe.net>
2021-11-24 19:54:45 -08:00
snipe
3b68a6f1be Merge pull request #10345 from leitwerk-ag/master
Fixed #10344 and #9135: don't prepand fields with a whitespace in text based export formats
2021-11-24 19:43:21 -08:00
snipe
bc91aef47d Merge pull request #10352 from adamboutcher/install_rocky
Improved Installer: Added Rocky Linux Support
2021-11-24 19:42:37 -08:00
snipe
3debe78574 Merge pull request #10350 from inietov/fixes/trim_custom_fields_names
Apply trim() function when storing Custom Fields names
2021-11-24 19:42:04 -08:00
snipe
fc1b3b31b5 Merge pull request #10358 from sneak-it/bullseye
Improved Installer: Add Debian 11 (Bullseye) install script support
2021-11-24 19:41:37 -08:00
snipe
4afd598df7 Merge pull request #10356 from bestlong/fix_modal_dialog_html_typo
fix modal-title html tag unpaired.
2021-11-24 19:39:58 -08:00
snipe
d1d3f893ac Merge pull request #10360 from snipe/fixes/escaped_characters_on_asset_create_checkout
Removed escaping on input save for asset checkout on creation
2021-11-24 19:20:54 -08:00
snipe
830d07f84f Removed escaping on input save for asset checkout on creation
Signed-off-by: snipe <snipe@snipe.net>
2021-11-24 19:19:32 -08:00
snipe
0e30b9aef7 Merge pull request #10355 from inietov/fixes/customfields_with_date_format_doesnt_display_default_value_master
Fixes Default Values - Date not applying for master branch
2021-11-24 18:22:02 -08:00
sneaK
b937aedc30 Add Debian 11 (Bullseye) install script support 2021-11-24 10:24:05 -05:00
Shao Yu-Lung
55d05eeae3 fix modal-title html tag unpaired. 2021-11-24 10:28:10 +08:00
Ivan Nieto Vivanco
d95d3dc282 Add the call to defaultValue() function in custom fields with date format 2021-11-23 17:21:46 -06:00
Adam
ab06c26527 Rocky Linux Support
Addition to enable Rocky Linux installation.
2021-11-23 16:13:38 +00:00
Ivan Nieto Vivanco
1ca770895a Apply trim() function when storing Custom Fields names 2021-11-22 18:43:21 -06:00
Klaus J. Mueller
a85fa14f9c fix #10344 and #9135 2021-11-22 17:58:26 +01:00
snipe
b058d84f2c Merge pull request #10322 from snipe/uberbrady-patch-2
Change the `[END]` directive in `.htaccess` to `[L]`
2021-11-17 18:01:52 -08:00
Brady Wetherington
5fb05d8b1c Change the [END] directive in .htaccess to [L]
This allows backwards-compatibility with older Apache versions (which we _used_ to have), and should do the exact same thing.
2021-11-17 15:29:51 -08:00
1834 changed files with 32695 additions and 11237 deletions

View File

@@ -2468,6 +2468,87 @@
"contributions": [
"code"
]
},
{
"login": "leitwerk-ag",
"name": "LEITWERK AG",
"avatar_url": "https://avatars.githubusercontent.com/u/24418301?v=4",
"profile": "https://www.leitwerk.de/",
"contributions": [
"code"
]
},
{
"login": "adamboutcher",
"name": "Adam",
"avatar_url": "https://avatars.githubusercontent.com/u/1911435?v=4",
"profile": "http://www.aboutcher.co.uk",
"contributions": [
"code"
]
},
{
"login": "sneak-it",
"name": "Ian",
"avatar_url": "https://avatars.githubusercontent.com/u/16104273?v=4",
"profile": "https://snksrv.com",
"contributions": [
"code"
]
},
{
"login": "bestlong",
"name": "Shao Yu-Lung (Allen)",
"avatar_url": "https://avatars.githubusercontent.com/u/4023909?v=4",
"profile": "http://blog.bestlong.idv.tw/",
"contributions": [
"code"
]
},
{
"login": "Haxatron",
"name": "Haxatron",
"avatar_url": "https://avatars.githubusercontent.com/u/76475453?v=4",
"profile": "https://github.com/Haxatron",
"contributions": [
"code"
]
},
{
"login": "exula",
"name": "Bradley Coudriet",
"avatar_url": "https://avatars.githubusercontent.com/u/3842948?v=4",
"profile": "http://bjcpgd.cias.rit.edu",
"contributions": [
"code"
]
},
{
"login": "UniversalSuperBox",
"name": "Dalton Durst",
"avatar_url": "https://avatars.githubusercontent.com/u/21966173?v=4",
"profile": "https://daltondur.st",
"contributions": [
"code"
]
},
{
"login": "TenOfTens",
"name": "TenOfTens",
"avatar_url": "https://avatars.githubusercontent.com/u/48162670?v=4",
"profile": "https://github.com/TenOfTens",
"contributions": [
"code"
]
},
{
"login": "savornicesei",
"name": "Simona Avornicesei",
"avatar_url": "https://avatars.githubusercontent.com/u/917232?v=4",
"profile": "http://www.avornicesei.com",
"contributions": [
"test"
]
}
]
}

View File

@@ -145,6 +145,7 @@ APP_LOG_MAX_FILES=10
APP_LOCKED=false
APP_CIPHER=AES-256-CBC
APP_FORCE_TLS=false
APP_ALLOW_INSECURE_HOSTS=false
GOOGLE_MAPS_API=
LDAP_MEM_LIM=500M
LDAP_TIME_LIM=600

82
.github/workflows/docker-alpine.yml vendored Normal file
View File

@@ -0,0 +1,82 @@
# Snipe-IT (Alpine) Docker image build for hub.docker.com
name: Docker images (Alpine)
# Run this Build for all pushes to 'master' or develop branch, or tagged releases.
# Also run for PRs to ensure PR doesn't break Docker build process
on:
push:
branches:
- master
- develop
tags:
- 'v**'
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
pull_request:
jobs:
docker:
# Ensure this job never runs on forked repos. It's only executed for 'snipe/snipe-it'
if: github.repository == 'snipe/snipe-it'
runs-on: ubuntu-latest
env:
# Define tags to use for Docker images based on Git tags/branches (for docker/metadata-action)
# For a new commit on default branch (master), use the literal tag 'latest' on Docker image.
# For a new commit on other branches, use the branch name as the tag for Docker image.
# For a new tag, copy that tag name as the tag for Docker image.
IMAGE_TAGS: |
type=raw,value=latest,enable=${{ endsWith(github.ref, github.event.repository.default_branch) }},suffix=-alpine
type=ref,event=branch,enable=${{ !endsWith(github.ref, github.event.repository.default_branch) }},suffix=-alpine
type=ref,event=tag,suffix=-alpine
# Define default tag "flavor" for docker/metadata-action per
# https://github.com/docker/metadata-action#flavor-input
# We turn off 'latest' tag by default.
TAGS_FLAVOR: |
latest=false
steps:
# https://github.com/actions/checkout
- name: Checkout codebase
uses: actions/checkout@v2
# https://github.com/docker/setup-buildx-action
- name: Setup Docker Buildx
uses: docker/setup-buildx-action@v1
# https://github.com/docker/login-action
- name: Login to DockerHub
# Only login if not a PR, as PRs only trigger a Docker build and not a push
if: github.event_name != 'pull_request'
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
###############################################
# Build/Push the 'snipe/snipe-it' image
###############################################
# https://github.com/docker/metadata-action
# Get Metadata for docker_build step below
- name: Sync metadata (tags, labels) from GitHub to Docker for 'snipe-it' image
id: meta_build
uses: docker/metadata-action@v3
with:
images: snipe/snipe-it
tags: ${{ env.IMAGE_TAGS }}
flavor: ${{ env.TAGS_FLAVOR }}
# https://github.com/docker/build-push-action
- name: Build and push 'snipe-it' image
id: docker_build
uses: docker/build-push-action@v2
with:
context: .
file: ./Dockerfile.alpine
platforms: linux/amd64
# For pull requests, we run the Docker build (to ensure no PR changes break the build),
# but we ONLY do an image push to DockerHub if it's NOT a PR
push: ${{ github.event_name != 'pull_request' }}
# Use tags / labels provided by 'docker/metadata-action' above
tags: ${{ steps.meta_build.outputs.tags }}
labels: ${{ steps.meta_build.outputs.labels }}

82
.github/workflows/docker.yml vendored Normal file
View File

@@ -0,0 +1,82 @@
# Snipe-IT Docker image build for hub.docker.com
name: Docker images
# Run this Build for all pushes to 'master' or develop branch, or tagged releases.
# Also run for PRs to ensure PR doesn't break Docker build process
on:
push:
branches:
- master
- develop
tags:
- 'v**'
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
pull_request:
jobs:
docker:
# Ensure this job never runs on forked repos. It's only executed for 'snipe/snipe-it'
if: github.repository == 'snipe/snipe-it'
runs-on: ubuntu-latest
env:
# Define tags to use for Docker images based on Git tags/branches (for docker/metadata-action)
# For a new commit on default branch (master), use the literal tag 'latest' on Docker image.
# For a new commit on other branches, use the branch name as the tag for Docker image.
# For a new tag, copy that tag name as the tag for Docker image.
IMAGE_TAGS: |
type=raw,value=latest,enable=${{ endsWith(github.ref, github.event.repository.default_branch) }}
type=ref,event=branch,enable=${{ !endsWith(github.ref, github.event.repository.default_branch) }}
type=ref,event=tag
# Define default tag "flavor" for docker/metadata-action per
# https://github.com/docker/metadata-action#flavor-input
# We turn off 'latest' tag by default.
TAGS_FLAVOR: |
latest=false
steps:
# https://github.com/actions/checkout
- name: Checkout codebase
uses: actions/checkout@v2
# https://github.com/docker/setup-buildx-action
- name: Setup Docker Buildx
uses: docker/setup-buildx-action@v1
# https://github.com/docker/login-action
- name: Login to DockerHub
# Only login if not a PR, as PRs only trigger a Docker build and not a push
if: github.event_name != 'pull_request'
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
###############################################
# Build/Push the 'snipe/snipe-it' image
###############################################
# https://github.com/docker/metadata-action
# Get Metadata for docker_build step below
- name: Sync metadata (tags, labels) from GitHub to Docker for 'snipe-it' image
id: meta_build
uses: docker/metadata-action@v3
with:
images: snipe/snipe-it
tags: ${{ env.IMAGE_TAGS }}
flavor: ${{ env.TAGS_FLAVOR }}
# https://github.com/docker/build-push-action
- name: Build and push 'snipe-it' image
id: docker_build
uses: docker/build-push-action@v2
with:
context: .
file: ./Dockerfile
platforms: linux/amd64
# For pull requests, we run the Docker build (to ensure no PR changes break the build),
# but we ONLY do an image push to DockerHub if it's NOT a PR
push: ${{ github.event_name != 'pull_request' }}
# Use tags / labels provided by 'docker/metadata-action' above
tags: ${{ steps.meta_build.outputs.tags }}
labels: ${{ steps.meta_build.outputs.labels }}

View File

@@ -77,6 +77,8 @@ COPY . /var/www/html
RUN a2enmod rewrite
COPY docker/column-statistics.cnf /etc/mysql/conf.d/column-statistics.cnf
############ INITIAL APPLICATION SETUP #####################
WORKDIR /var/www/html

View File

@@ -32,6 +32,8 @@ RUN apk add --no-cache \
mysql-client \
tini
COPY docker/column-statistics.cnf /etc/mysql/conf.d/column-statistics.cnf
# Where apache's PID lives
RUN mkdir -p /run/apache2 && chown apache:apache /run/apache2

View File

@@ -98,5 +98,6 @@ VOLUME [ "/var/lib/snipeit" ]
COPY --chown=www-data:www-data docker/docker-secrets.env /var/www/html/.env
COPY --chmod=655 docker/docker-entrypoint.sh /usr/local/bin/docker-snipeit-entrypoint
COPY docker/column-statistics.cnf /etc/mysql/conf.d/column-statistics.cnf
ENTRYPOINT [ "/usr/local/bin/docker-snipeit-entrypoint" ]
CMD [ "/usr/local/bin/docker-php-entrypoint", "php-fpm" ]

View File

@@ -1,5 +1,5 @@
![Build Status](https://app.chipperci.com/projects/0e5f8979-31eb-4ee6-9abf-050b76ab0383/status/master) [![Crowdin](https://d322cqt584bo4o.cloudfront.net/snipe-it/localized.svg)](https://crowdin.com/project/snipe-it) [![Docker Pulls](https://img.shields.io/docker/pulls/snipe/snipe-it.svg)](https://hub.docker.com/r/snipe/snipe-it/) [![Twitter Follow](https://img.shields.io/twitter/follow/snipeitapp.svg?style=social)](https://twitter.com/snipeitapp) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/553ce52037fc43ea99149785afcfe641)](https://www.codacy.com/app/snipe/snipe-it?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=snipe/snipe-it&amp;utm_campaign=Badge_Grade)
[![All Contributors](https://img.shields.io/badge/all_contributors-271-orange.svg?style=flat-square)](#contributors) [![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/yZFtShAcKk) [![huntr](https://cdn.huntr.dev/huntr_security_badge_mono.svg)](https://huntr.dev)
[![All Contributors](https://img.shields.io/badge/all_contributors-280-orange.svg?style=flat-square)](#contributors) [![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/yZFtShAcKk) [![huntr](https://cdn.huntr.dev/huntr_security_badge_mono.svg)](https://huntr.dev)
## Snipe-IT - Open Source Asset Management System
@@ -129,7 +129,8 @@ Thanks goes to all of these wonderful people ([emoji key](https://github.com/ken
| [<img src="https://avatars.githubusercontent.com/u/36065681?v=4" width="110px;"/><br /><sub>David Valin Alonso</sub>](https://github.com/deivishome)<br />[💻](https://github.com/snipe/snipe-it/commits?author=deivishome "Code") | [<img src="https://avatars.githubusercontent.com/u/8290389?v=4" width="110px;"/><br /><sub>andreaci</sub>](https://github.com/andreaci)<br />[💻](https://github.com/snipe/snipe-it/commits?author=andreaci "Code") | [<img src="https://avatars.githubusercontent.com/u/1828542?v=4" width="110px;"/><br /><sub>Jelle Sebreghts</sub>](http://www.jellesebreghts.be)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Jelle-S "Code") | [<img src="https://avatars.githubusercontent.com/u/11180862?v=4" width="110px;"/><br /><sub>Michael Pietsch</sub>](https://github.com/Skywalker-11)<br /> | [<img src="https://avatars.githubusercontent.com/u/22068886?v=4" width="110px;"/><br /><sub>Masudul Haque Shihab</sub>](https://github.com/sh1hab)<br />[💻](https://github.com/snipe/snipe-it/commits?author=sh1hab "Code") | [<img src="https://avatars.githubusercontent.com/u/16099942?v=4" width="110px;"/><br /><sub>Supapong Areeprasertkul</sub>](http://www.freedomdive.com/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=zybersup "Code") | [<img src="https://avatars.githubusercontent.com/u/207358?v=4" width="110px;"/><br /><sub>Peter Sarossy</sub>](https://github.com/psarossy)<br />[💻](https://github.com/snipe/snipe-it/commits?author=psarossy "Code") |
| [<img src="https://avatars.githubusercontent.com/u/11823649?v=4" width="110px;"/><br /><sub>Renee Margaret McConahy</sub>](https://github.com/nepella)<br />[💻](https://github.com/snipe/snipe-it/commits?author=nepella "Code") | [<img src="https://avatars.githubusercontent.com/u/5553884?v=4" width="110px;"/><br /><sub>JohnnyPicnic</sub>](https://github.com/JohnnyPicnic)<br />[💻](https://github.com/snipe/snipe-it/commits?author=JohnnyPicnic "Code") | [<img src="https://avatars.githubusercontent.com/u/8799594?v=4" width="110px;"/><br /><sub>markbrule</sub>](https://github.com/markbrule)<br />[💻](https://github.com/snipe/snipe-it/commits?author=markbrule "Code") | [<img src="https://avatars.githubusercontent.com/u/1962801?v=4" width="110px;"/><br /><sub>Mike Campbell</sub>](https://github.com/mikecmpbll)<br />[💻](https://github.com/snipe/snipe-it/commits?author=mikecmpbll "Code") | [<img src="https://avatars.githubusercontent.com/u/11973217?v=4" width="110px;"/><br /><sub>tbrconnect</sub>](https://github.com/tbrconnect)<br />[💻](https://github.com/snipe/snipe-it/commits?author=tbrconnect "Code") | [<img src="https://avatars.githubusercontent.com/u/12447225?v=4" width="110px;"/><br /><sub>kcoyo</sub>](https://github.com/kcoyo)<br />[💻](https://github.com/snipe/snipe-it/commits?author=kcoyo "Code") | [<img src="https://avatars.githubusercontent.com/u/494017?v=4" width="110px;"/><br /><sub>Travis Miller</sub>](https://travismiller.com/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=travismiller "Code") |
| [<img src="https://avatars.githubusercontent.com/u/8735148?v=4" width="110px;"/><br /><sub>Petri Asikainen</sub>](https://github.com/PetriAsi)<br />[💻](https://github.com/snipe/snipe-it/commits?author=PetriAsi "Code") | [<img src="https://avatars.githubusercontent.com/u/11424540?v=4" width="110px;"/><br /><sub>derdeagle</sub>](https://github.com/derdeagle)<br />[💻](https://github.com/snipe/snipe-it/commits?author=derdeagle "Code") | [<img src="https://avatars.githubusercontent.com/u/176950?v=4" width="110px;"/><br /><sub>Mike Frysinger</sub>](https://wh0rd.org/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=vapier "Code") | [<img src="https://avatars.githubusercontent.com/u/22044358?v=4" width="110px;"/><br /><sub>ALPHA</sub>](https://github.com/AL4AL)<br />[💻](https://github.com/snipe/snipe-it/commits?author=AL4AL "Code") | [<img src="https://avatars.githubusercontent.com/u/1042587?v=4" width="110px;"/><br /><sub>FliegenKLATSCH</sub>](https://www.ifern.de)<br />[💻](https://github.com/snipe/snipe-it/commits?author=FliegenKLATSCH "Code") | [<img src="https://avatars.githubusercontent.com/u/442138?v=4" width="110px;"/><br /><sub>Jeremy Price</sub>](https://github.com/jerm)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jerm "Code") | [<img src="https://avatars.githubusercontent.com/u/84392209?v=4" width="110px;"/><br /><sub>Toreg87</sub>](https://github.com/Toreg87)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Toreg87 "Code") |
| [<img src="https://avatars.githubusercontent.com/u/67638596?v=4" width="110px;"/><br /><sub>Matthew Nickson</sub>](https://github.com/Computroniks)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Computroniks "Code") | [<img src="https://avatars.githubusercontent.com/u/1646397?v=4" width="110px;"/><br /><sub>Jethro Nederhof</sub>](https://jethron.id.au)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jethron "Code") | [<img src="https://avatars.githubusercontent.com/u/23289826?v=4" width="110px;"/><br /><sub>Oskar Stenberg</sub>](https://github.com/01ste02)<br />[💻](https://github.com/snipe/snipe-it/commits?author=01ste02 "Code") | [<img src="https://avatars.githubusercontent.com/u/82208283?v=4" width="110px;"/><br /><sub>Robert-Azelis</sub>](https://github.com/Robert-Azelis)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Robert-Azelis "Code") | [<img src="https://avatars.githubusercontent.com/u/60648387?v=4" width="110px;"/><br /><sub>Alexander William Smith</sub>](https://github.com/alwism)<br />[💻](https://github.com/snipe/snipe-it/commits?author=alwism "Code") |
| [<img src="https://avatars.githubusercontent.com/u/67638596?v=4" width="110px;"/><br /><sub>Matthew Nickson</sub>](https://github.com/Computroniks)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Computroniks "Code") | [<img src="https://avatars.githubusercontent.com/u/1646397?v=4" width="110px;"/><br /><sub>Jethro Nederhof</sub>](https://jethron.id.au)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jethron "Code") | [<img src="https://avatars.githubusercontent.com/u/23289826?v=4" width="110px;"/><br /><sub>Oskar Stenberg</sub>](https://github.com/01ste02)<br />[💻](https://github.com/snipe/snipe-it/commits?author=01ste02 "Code") | [<img src="https://avatars.githubusercontent.com/u/82208283?v=4" width="110px;"/><br /><sub>Robert-Azelis</sub>](https://github.com/Robert-Azelis)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Robert-Azelis "Code") | [<img src="https://avatars.githubusercontent.com/u/60648387?v=4" width="110px;"/><br /><sub>Alexander William Smith</sub>](https://github.com/alwism)<br />[💻](https://github.com/snipe/snipe-it/commits?author=alwism "Code") | [<img src="https://avatars.githubusercontent.com/u/24418301?v=4" width="110px;"/><br /><sub>LEITWERK AG</sub>](https://www.leitwerk.de/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=leitwerk-ag "Code") | [<img src="https://avatars.githubusercontent.com/u/1911435?v=4" width="110px;"/><br /><sub>Adam</sub>](http://www.aboutcher.co.uk)<br />[💻](https://github.com/snipe/snipe-it/commits?author=adamboutcher "Code") |
| [<img src="https://avatars.githubusercontent.com/u/16104273?v=4" width="110px;"/><br /><sub>Ian</sub>](https://snksrv.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=sneak-it "Code") | [<img src="https://avatars.githubusercontent.com/u/4023909?v=4" width="110px;"/><br /><sub>Shao Yu-Lung (Allen)</sub>](http://blog.bestlong.idv.tw/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=bestlong "Code") | [<img src="https://avatars.githubusercontent.com/u/76475453?v=4" width="110px;"/><br /><sub>Haxatron</sub>](https://github.com/Haxatron)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Haxatron "Code") | [<img src="https://avatars.githubusercontent.com/u/3842948?v=4" width="110px;"/><br /><sub>Bradley Coudriet</sub>](http://bjcpgd.cias.rit.edu)<br />[💻](https://github.com/snipe/snipe-it/commits?author=exula "Code") | [<img src="https://avatars.githubusercontent.com/u/21966173?v=4" width="110px;"/><br /><sub>Dalton Durst</sub>](https://daltondur.st)<br />[💻](https://github.com/snipe/snipe-it/commits?author=UniversalSuperBox "Code") | [<img src="https://avatars.githubusercontent.com/u/48162670?v=4" width="110px;"/><br /><sub>TenOfTens</sub>](https://github.com/TenOfTens)<br />[💻](https://github.com/snipe/snipe-it/commits?author=TenOfTens "Code") | [<img src="https://avatars.githubusercontent.com/u/917232?v=4" width="110px;"/><br /><sub>Simona Avornicesei</sub>](http://www.avornicesei.com)<br />[⚠️](https://github.com/snipe/snipe-it/commits?author=savornicesei "Tests") |
<!-- ALL-CONTRIBUTORS-LIST:END -->
This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind welcome!

View File

@@ -40,7 +40,7 @@ class FixDoubleEscape extends Command
$tables = [
'\App\Models\Asset' => ['name'],
'\App\Models\License' => ['name'],
'\App\Models\License' => ['name', 'license_name'],
'\App\Models\Consumable' => ['name'],
'\App\Models\Accessory' => ['name'],
'\App\Models\Component' => ['name'],
@@ -53,7 +53,7 @@ class FixDoubleEscape extends Command
'\App\Models\Group' => ['name'],
'\App\Models\Department' => ['name'],
'\App\Models\Location' => ['name'],
'\App\Models\User' => ['first_name', 'last_name'],
'\App\Models\User' => ['first_name', 'last_name', 'jobtitle'],
];
$count = array();
@@ -69,10 +69,14 @@ class FixDoubleEscape extends Command
$count[$classname]['classname']++;
$count[$classname][$field] = 0;
foreach($classname::where("$field",'LIKE','%&%')->get() as $row) {
$this->info('Updating '.$field.' for '.$classname);
$row->{$field} = html_entity_decode($row->{$field},ENT_QUOTES);
$row->save();
foreach($classname::where("$field",'LIKE','%;%')->get() as $row) {
$fixed = html_entity_decode($row->{$field});
if ($row->save()) {
$this->info('Updating '.$field.' for '.$classname.' to '.$row->{$field}.' to '.$fixed);
} else {
$this->error('Could NOT update '.$field.' for '.$classname.' to '.$row->{$field}.' to '.$fixed.': '.$row->getErrors());
}
$count[$classname][$field]++;
}

View File

@@ -49,7 +49,7 @@ class LdapSync extends Command
$ldap_result_last_name = Setting::getSettings()->ldap_lname_field;
$ldap_result_first_name = Setting::getSettings()->ldap_fname_field;
$ldap_result_active_flag = Setting::getSettings()->ldap_active_flag_field;
$ldap_result_active_flag = Setting::getSettings()->ldap_active_flag;
$ldap_result_emp_num = Setting::getSettings()->ldap_emp_num;
$ldap_result_email = Setting::getSettings()->ldap_email;
$ldap_result_phone = Setting::getSettings()->ldap_phone_field;
@@ -170,7 +170,6 @@ class LdapSync extends Command
$pass = bcrypt($tmp_pass);
for ($i = 0; $i < $results["count"]; $i++) {
if (empty($ldap_result_active_flag) || $results[$i][$ldap_result_active_flag][0] == "TRUE") {
$item = array();
$item["username"] = isset($results[$i][$ldap_result_username][0]) ? $results[$i][$ldap_result_username][0] : "";
@@ -192,6 +191,7 @@ class LdapSync extends Command
$user = User::where('username', $item["username"])->first();
if ($user) {
// Updating an existing user.
$item["createorupdate"] = 'updated';
@@ -199,7 +199,7 @@ class LdapSync extends Command
// Creating a new user.
$user = new User;
$user->password = $pass;
$user->activated = 0;
$user->activated = 1; // newly created users can log in by default, unless AD's UAC is in use, or an active flag is set (below)
$item["createorupdate"] = 'created';
}
@@ -213,8 +213,19 @@ class LdapSync extends Command
$user->country = $item["country"];
$user->department_id = $department->id;
// Sync activated state for Active Directory.
if ( array_key_exists('useraccountcontrol', $results[$i]) ) {
if ( !empty($ldap_result_active_flag)) { // IF we have an 'active' flag set....
// ....then *most* things that are truthy will activate the user. Anything falsey will deactivate them.
// (Specifically, we don't handle a value of '0.0' correctly)
$raw_value = @$results[$i][$ldap_result_active_flag][0];
$filter_var = filter_var($raw_value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
$boolean_cast = (bool)$raw_value;
$user->activated = $filter_var ?? $boolean_cast; // if filter_var() was true or false, use that. If it's null, use the $boolean_cast
} elseif ( array_key_exists('useraccountcontrol', $results[$i]) ) {
// ....otherwise, (ie if no 'active' LDAP flag is defined), IF the UAC setting exists,
// ....then use the UAC setting on the account to determine can-log-in vs. cannot-log-in
/* The following is _probably_ the correct logic, but we can't use it because
some users may have been dependent upon the previous behavior, and this
could cause additional access to be available to users they don't want
@@ -240,16 +251,14 @@ class LdapSync extends Command
'262688', // 0x40220 NORMAL_ACCOUNT, PASSWD_NOTREQD, SMARTCARD_REQUIRED
'328192', // 0x50200 NORMAL_ACCOUNT, SMARTCARD_REQUIRED, DONT_EXPIRE_PASSWORD
'328224', // 0x50220 NORMAL_ACCOUNT, PASSWD_NOT_REQD, SMARTCARD_REQUIRED, DONT_EXPIRE_PASSWORD
'4194816',// 0x400200 NORMAL_ACCOUNT, DONT_REQ_PREAUTH
'4260352',// 0x410200 NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD, DONT_REQ_PREAUTH
'1049088',// 0x100200 NORMAL_ACCOUNT, NOT_DELEGATED
];
$user->activated = ( in_array($results[$i]['useraccountcontrol'][0], $enabled_accounts) ) ? 1 : 0;
}
// If we're not using AD, and there isn't an activated flag set, activate all users
elseif (empty($ldap_result_active_flag)) {
$user->activated = 1;
}
} /* implied 'else' here - leave the $user->activated flag alone. Newly-created accounts will be active.
already-existing accounts will be however the administrator has set them */
if ($item['ldap_location_override'] == true) {
$user->location_id = $item['location_id'];
@@ -279,7 +288,6 @@ class LdapSync extends Command
}
array_push($summary, $item);
}
}

View File

@@ -8,6 +8,7 @@ use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use App\Helpers\Helper;
use Illuminate\Validation\ValidationException;
use Log;
use JsonException;
class Handler extends ExceptionHandler
@@ -26,6 +27,7 @@ class Handler extends ExceptionHandler
\Illuminate\Validation\ValidationException::class,
\Intervention\Image\Exception\NotSupportedException::class,
\League\OAuth2\Server\Exception\OAuthServerException::class,
JsonException::class
];
/**
@@ -60,6 +62,12 @@ class Handler extends ExceptionHandler
return redirect()->back()->with('error', trans('general.token_expired'));
}
// Invalid JSON exception
// TODO: don't understand why we have to do this when we have the invalidJson() method, below, but, well, whatever
if ($e instanceof JsonException) {
return response()->json(Helper::formatStandardApiResponse('error', null, 'invalid JSON'), 422);
}
// Handle Ajax requests that fail because the model doesn't exist
if ($request->ajax() || $request->wantsJson()) {
@@ -121,6 +129,6 @@ class Handler extends ExceptionHandler
*/
protected function invalidJson($request, ValidationException $exception)
{
return response()->json(Helper::formatStandardApiResponse('error', null, $exception->errors(), 400));
return response()->json(Helper::formatStandardApiResponse('error', null, $exception->errors(), 422));
}
}

View File

@@ -234,6 +234,7 @@ class AssetModelsController extends Controller
public function selectlist(Request $request)
{
$this->authorize('view.selectlists');
$assetmodels = AssetModel::select([
'models.id',
'models.name',

View File

@@ -55,7 +55,7 @@ class AssetsController extends Controller
{
\Log::debug(Route::currentRouteName());
$filter_non_deprecable_assets = false;
/**
* This looks MAD janky (and it is), but the AssetsController@index does a LOT of heavy lifting throughout the
@@ -69,6 +69,7 @@ class AssetsController extends Controller
* which would have been far worse of a mess. *sad face* - snipe (Sept 1, 2021)
*/
if (Route::currentRouteName()=='api.depreciation-report.index') {
$filter_non_deprecable_assets = true;
$transformer = 'App\Http\Transformers\DepreciationReportTransformer';
$this->authorize('reports.view');
} else {
@@ -115,13 +116,28 @@ class AssetsController extends Controller
}
$assets = Company::scopeCompanyables(Asset::select('assets.*'),"company_id","assets")
->with('location', 'assetstatus', 'assetlog', 'company', 'defaultLoc','assignedTo',
'model.category', 'model.manufacturer', 'model.fieldset','supplier');
->with('location', 'assetstatus', 'company', 'defaultLoc','assignedTo',
'model.category', 'model.manufacturer', 'model.fieldset','supplier'); //it might be tempting to add 'assetlog' here, but don't. It blows up update-heavy users.
if ($filter_non_deprecable_assets) {
$non_deprecable_models = AssetModel::select('id')->whereNotNull('depreciation_id')->get();
$assets->InModelList($non_deprecable_models->toArray());
}
// These are used by the API to query against specific ID numbers.
// They are also used by the individual searches on detail pages like
// locations, etc.
// Search custom fields by column name
foreach ($all_custom_fields as $field) {
if ($request->filled($field->db_column_name())) {
$assets->where($field->db_column_name(), '=', $request->input($field->db_column_name()));
}
}
if ($request->filled('status_id')) {
$assets->where('assets.status_id', '=', $request->input('status_id'));
}
@@ -844,13 +860,18 @@ class AssetsController extends Controller
$asset->status_id = $request->input('status_id');
}
$checkin_at = null;
if ($request->filled('checkin_at')) {
$checkin_at = $request->input('checkin_at');
}
if ($asset->save()) {
event(new CheckoutableCheckedIn($asset, $target, Auth::user(), $request->input('note')));
event(new CheckoutableCheckedIn($asset, $target, Auth::user(), $request->input('note'), $checkin_at));
return response()->json(Helper::formatStandardApiResponse('success', ['asset'=> e($asset->asset_tag)], trans('admin/hardware/message.checkin.success')));
}
return response()->json(Helper::formatStandardApiResponse('success', ['asset'=> e($asset->asset_tag)], trans('admin/hardware/message.checkin.error')));
return response()->json(Helper::formatStandardApiResponse('error', ['asset'=> e($asset->asset_tag)], trans('admin/hardware/message.checkin.error')));
}

View File

@@ -148,7 +148,7 @@ class CategoriesController extends Controller
*/
public function selectlist(Request $request, $category_type = 'asset')
{
$this->authorize('view.selectlists');
$categories = Category::select([
'id',
'name',

View File

@@ -159,7 +159,7 @@ class CompaniesController extends Controller
*/
public function selectlist(Request $request)
{
$this->authorize('view.selectlists');
$companies = Company::select([
'companies.id',
'companies.name',

View File

@@ -168,6 +168,7 @@ class DepartmentsController extends Controller
public function selectlist(Request $request)
{
$this->authorize('view.selectlists');
$departments = Department::select([
'id',
'name',

View File

@@ -223,6 +223,8 @@ class LocationsController extends Controller
public function selectlist(Request $request)
{
$this->authorize('view.selectlists');
$locations = Location::select([
'locations.id',
'locations.name',

View File

@@ -155,6 +155,7 @@ class ManufacturersController extends Controller
public function selectlist(Request $request)
{
$this->authorize('view.selectlists');
$manufacturers = Manufacturer::select([
'id',
'name',

View File

@@ -31,8 +31,8 @@ class PredefinedKitsController extends Controller
$offset = $request->input('offset', 0);
$limit = $request->input('limit', 50);
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
$sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'assets_count';
$order = $request->input('order') === 'desc' ? 'desc' : 'asc';
$sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'name';
$kits->orderBy($sort, $order);
$total = $kits->count();

View File

@@ -17,6 +17,7 @@ use GuzzleHttp\Client;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;
use App\Models\Ldap; // forward-port of v4 LDAP model for Sync
use App\Http\Requests\SlackSettingsRequest;
class SettingsController extends Controller
@@ -165,31 +166,41 @@ class SettingsController extends Controller
public function slacktest(Request $request)
{
$slack = new Client([
'base_url' => e($request->input('slack_endpoint')),
'defaults' => [
'exceptions' => false
]
$validator = Validator::make($request->all(), [
'slack_endpoint' => 'url|required_with:slack_channel|starts_with:https://hooks.slack.com/|nullable',
'slack_channel' => 'required_with:slack_endpoint|starts_with:#|nullable',
]);
$payload = json_encode(
[
'channel' => e($request->input('slack_channel')),
'text' => trans('general.slack_test_msg'),
'username' => e($request->input('slack_botname')),
'icon_emoji' => ':heart:'
]);
try {
$slack->post($request->input('slack_endpoint'),['body' => $payload]);
return response()->json(['message' => 'Success'], 200);
} catch (\Exception $e) {
return response()->json(['message' => 'Oops! Please check the channel name and webhook endpoint URL. Slack responded with: '.$e->getMessage()], 400);
if ($validator->fails()) {
return response()->json(['message' => 'Validation failed', 'errors' => $validator->errors()], 422);
}
return response()->json(['message' => 'Something went wrong :( '], 400);
// If validation passes, continue to the curl request
$slack = new Client([
'base_url' => e($request->input('slack_endpoint')),
'defaults' => [
'exceptions' => false,
],
]);
$payload = json_encode(
[
'channel' => e($request->input('slack_channel')),
'text' => trans('general.slack_test_msg'),
'username' => e($request->input('slack_botname')),
'icon_emoji' => ':heart:',
]);
try {
$slack->post($request->input('slack_endpoint'), ['body' => $payload]);
return response()->json(['message' => 'Success'], 200);
} catch (\Exception $e) {
return response()->json(['message' => 'Please check the channel name and webhook endpoint URL ('.$request->input('slack_endpoint').'). Slack responded with: '.$e->getMessage()], 400);
}
//}
return response()->json(['message' => 'Something went wrong :( '], 400);
}

View File

@@ -155,6 +155,8 @@ class SuppliersController extends Controller
public function selectlist(Request $request)
{
$this->authorize('view.selectlists');
$suppliers = Supplier::select([
'id',
'name',

View File

@@ -155,7 +155,6 @@ class AssetModelsController extends Controller
$model->requestable = $request->input('requestable', '0');
$this->removeCustomFieldsDefaultValues($model);
if ($request->input('custom_fieldset')=='') {
@@ -168,7 +167,6 @@ class AssetModelsController extends Controller
}
}
if ($model->save()) {
return redirect()->route("models.index")->with('success', trans('admin/models/message.update.success'));
}
@@ -269,6 +267,7 @@ class AssetModelsController extends Controller
*/
public function getClone($modelId = null)
{
$this->authorize('create', AssetModel::class);
// Check if the model exists
if (is_null($model_to_clone = AssetModel::find($modelId))) {
return redirect()->route('models.index')->with('error', trans('admin/models/message.does_not_exist'));
@@ -462,7 +461,9 @@ class AssetModelsController extends Controller
private function assignCustomFieldsDefaultValues(AssetModel $model, array $defaultValues)
{
foreach ($defaultValues as $customFieldId => $defaultValue) {
if ($defaultValue) {
if(is_array($defaultValue)){
$model->defaultValues()->attach($customFieldId, ['default_value' => implode(', ', $defaultValue)]);
}elseif ($defaultValue) {
$model->defaultValues()->attach($customFieldId, ['default_value' => $defaultValue]);
}
}

View File

@@ -196,7 +196,7 @@ class AssetsController extends Controller
}
if (isset($target)) {
$asset->checkOut($target, Auth::user(), date('Y-m-d H:i:s'), $request->input('expected_checkin', null), 'Checked out on asset creation', e($request->get('name')), $location);
$asset->checkOut($target, Auth::user(), date('Y-m-d H:i:s'), $request->input('expected_checkin', null), 'Checked out on asset creation', $request->get('name'), $location);
}
$success = true;

View File

@@ -5,6 +5,7 @@ namespace App\Http\Controllers\Assets;
use App\Helpers\Helper;
use App\Http\Controllers\CheckInOutRequest;
use App\Http\Controllers\Controller;
use App\Models\Actionlog;
use App\Models\Asset;
use App\Models\Setting;
use Illuminate\Http\Request;
@@ -121,6 +122,24 @@ class BulkAssetsController extends Controller
}
}
$changed = [];
$asset = Asset::where('id' ,$assetId)->get();
foreach ($this->update_array as $key => $value) {
if ($this->update_array[$key] != $asset->toArray()[0][$key]) {
$changed[$key]['old'] = $asset->toArray()[0][$key];
$changed[$key]['new'] = $this->update_array[$key];
}
}
$logAction = new Actionlog();
$logAction->item_type = Asset::class;
$logAction->item_id = $assetId;
$logAction->created_at = date("Y-m-d H:i:s");
$logAction->user_id = Auth::id();
$logAction->log_meta = json_encode($changed);
$logAction->logaction('update');
DB::table('assets')
->where('id', $assetId)
->update($this->update_array);

View File

@@ -32,6 +32,7 @@ class BulkAssetModelsController extends Controller
// If deleting....
if ($request->input('bulk_actions')=='delete') {
$this->authorize('delete', AssetModel::class);
$valid_count = 0;
foreach ($models as $model) {
if ($model->assets_count == 0) {
@@ -42,7 +43,7 @@ class BulkAssetModelsController extends Controller
// Otherwise display the bulk edit screen
}
$this->authorize('update', AssetModel::class);
$nochange = ['NC' => 'No Change'];
return view('models/bulk-edit', compact('models'))
->with('fieldset_list', $nochange + Helper::customFieldsetList())
@@ -63,7 +64,8 @@ class BulkAssetModelsController extends Controller
*/
public function update(Request $request)
{
$this->authorize('update', AssetModel::class);
$models_raw_array = $request->input('ids');
$update_array = array();
@@ -103,6 +105,8 @@ class BulkAssetModelsController extends Controller
*/
public function destroy(Request $request)
{
$this->authorize('delete', AssetModel::class);
$models_raw_array = $request->input('ids');
if ((is_array($models_raw_array)) && (count($models_raw_array) > 0)) {

View File

@@ -92,7 +92,7 @@ class CustomFieldsController extends Controller
$this->authorize('create', CustomField::class);
$field = new CustomField([
"name" => $request->get("name"),
"name" => trim($request->get("name")),
"element" => $request->get("element"),
"help_text" => $request->get("help_text"),
"field_values" => $request->get("field_values"),
@@ -133,12 +133,23 @@ class CustomFieldsController extends Controller
$this->authorize('update', $field);
if ($field->fieldset()->detach($fieldset_id)) {
return redirect()->route('fieldsets.show', ['fieldset' => $fieldset_id])
->with("success", trans('admin/custom_fields/message.field.delete.success'));
// Check that the field exists - this is mostly related to the demo, where we
// rewrite the data every x minutes, so it's possible someone might be disassociating
// a field from a fieldset just as we're wiping the database
if (($field) && ($fieldset_id)) {
if ($field->fieldset()->detach($fieldset_id)) {
return redirect()->route('fieldsets.show', ['fieldset' => $fieldset_id])
->with("success", trans('admin/custom_fields/message.field.delete.success'));
} else {
return redirect()->back()->withErrors(['message' => "Field is in use and cannot be deleted."]);
}
}
return redirect()->back()->withErrors(['message' => "Field is in-use"]);
return redirect()->back()->withErrors(['message' => "Error deleting field from fieldset"]);
}
/**
@@ -178,20 +189,25 @@ class CustomFieldsController extends Controller
*/
public function edit($id)
{
$field = CustomField::find($id);
if ($field = CustomField::find($id)) {
$this->authorize('update', $field);
$this->authorize('update', $field);
$customFormat = '';
if((stripos($field->format, 'regex') === 0) && ($field->format !== CustomField::PREDEFINED_FORMATS['MAC'])) {
$customFormat = $field->format;
}
$customFormat = '';
if((stripos($field->format, 'regex') === 0) && ($field->format !== CustomField::PREDEFINED_FORMATS['MAC'])) {
$customFormat = $field->format;
}
return view("custom_fields.fields.edit",[
'field' => $field,
'customFormat' => $customFormat,
'predefinedFormats' => Helper::predefined_formats()
]);
return view("custom_fields.fields.edit",[
'field' => $field,
'customFormat' => $customFormat,
'predefinedFormats' => Helper::predefined_formats()
]);
}
return redirect()->route("fields.index")
->with("error", trans('admin/custom_fields/message.field.invalid'));
}
@@ -212,7 +228,7 @@ class CustomFieldsController extends Controller
$this->authorize('update', $field);
$field->name = e($request->get("name"));
$field->name = trim(e($request->get("name")));
$field->element = e($request->get("element"));
$field->field_values = e($request->get("field_values"));
$field->user_id = Auth::id();

View File

@@ -23,6 +23,12 @@ use Redirect;
class CustomFieldsetsController extends Controller
{
public function index()
{
return redirect()->route("fields.index")
->with("error", trans('admin/custom_fields/message.fieldset.does_not_exist'));
}
/**
* Validates and stores a new custom field.
*

View File

@@ -6,15 +6,49 @@ use App\Helpers\Helper;
class ModalController extends Controller
{
function show($type, $itemId = null) {
$view = view("modals.${type}");
if($type == "statuslabel") {
$view->with('statuslabel_types', Helper::statusTypeList());
/**
* Load the modal views after confirming they are in the allowed_types array.
* The allowed types away just prevents shithead skiddies from fuzzing the urls
* with automated scripts and junking up the logs. - snipe
*
* @version v5.3.7-pre
* @author [Brady Wetherington] [<uberbrady@gmail.com>]
* @author [A. Gianotto] [<snipe@snipe.net]
* @return View
*/
function show ($type, $itemId = null) {
// These values should correspond to a file in resources/views/modals/
$allowed_types = [
'category',
'kit-model',
'kit-license',
'kit-consumable',
'kit-accessory',
'location',
'manufacturer',
'model',
'statuslabel',
'supplier',
'upload-file',
'user',
];
if (in_array($type, $allowed_types)) {
$view = view("modals.${type}");
if ($type == "statuslabel") {
$view->with('statuslabel_types', Helper::statusTypeList());
}
if (in_array($type, ['kit-model', 'kit-license', 'kit-consumable', 'kit-accessory'])) {
$view->with('kitId', $itemId);
}
return $view;
}
if(in_array($type, ['kit-model', 'kit-license', 'kit-consumable', 'kit-accessory'])) {
$view->with('kitId', $itemId);
}
return $view;
abort(404,'Page not found');
}
}

View File

@@ -113,6 +113,12 @@ class ProfileController extends Controller
* @return View
*/
public function api() {
// Make sure the self.api permission has been granted
if (!Gate::allows('self.api')) {
abort(403);
}
return view('account/api');
}

View File

@@ -515,6 +515,10 @@ class ReportsController extends Controller
$header[] = trans('general.department');
}
if ($request->filled('title')) {
$header[] = trans('admin/users/table.title');
}
if ($request->filled('status')) {
$header[] = trans('general.status');
}
@@ -754,7 +758,6 @@ class ReportsController extends Controller
}
}
if ($request->filled('department')) {
if ($asset->checkedOutToUser()) {
$row[] = (($asset->assignedto) && ($asset->assignedto->department)) ? $asset->assignedto->department->name : '';
@@ -763,6 +766,14 @@ class ReportsController extends Controller
}
}
if ($request->filled('title')) {
if ($asset->checkedOutToUser()) {
$row[] = ($asset->assignedto) ? $asset->assignedto->jobtitle : '';
} else {
$row[] = ''; // Empty string if unassigned
}
}
if ($request->filled('status')) {
$row[] = ($asset->assetstatus) ? $asset->assetstatus->name.' ('.$asset->present()->statusMeta.')' : '';
}

View File

@@ -22,6 +22,7 @@ use Input;
use Redirect;
use Response;
use App\Helpers\StorageHelper;
use App\Http\Requests\SlackSettingsRequest;
/**
* This controller handles all actions related to Settings for
@@ -667,25 +668,16 @@ class SettingsController extends Controller
*
* @return View
*/
public function postSlack(Request $request)
public function postSlack(SlackSettingsRequest $request)
{
if (is_null($setting = Setting::getSettings())) {
return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error'));
}
$validatedData = $request->validate([
'slack_channel' => 'regex:/(?<!\w)#\w+/|required_with:slack_endpoint|nullable',
]);
if ($validatedData) {
$setting->slack_endpoint = $request->input('slack_endpoint');
$setting->slack_channel = $request->input('slack_channel');
$setting->slack_botname = $request->input('slack_botname');
}
$setting->slack_endpoint = $request->input('slack_endpoint');
$setting->slack_channel = $request->input('slack_channel');
$setting->slack_botname = $request->input('slack_botname');
if ($setting->save()) {
return redirect()->route('settings.index')
->with('success', trans('admin/settings/message.update.success'));

View File

@@ -184,6 +184,7 @@ class SuppliersController extends Controller
*/
public function show($supplierId = null)
{
$this->authorize('view', Supplier::class);
$supplier = Supplier::find($supplierId);
if (isset($supplier->id)) {

View File

@@ -34,7 +34,8 @@ class BulkUsersController extends Controller
// Make sure there were users selected
if (($request->filled('ids')) && (count($request->input('ids')) > 0)) {
// Get the list of affected users
$users = User::whereIn('id', array_keys(request('ids')))
$user_raw_array = request('ids');
$users = User::whereIn('id', $user_raw_array)
->with('groups', 'assets', 'licenses', 'accessories')->get();
if ($request->input('bulk_actions') == 'edit') {

View File

@@ -484,7 +484,6 @@ class UsersController extends Controller
$user->first_name = '';
$user->last_name = '';
$user->email = substr($user->email, ($pos = strpos($user->email, '@')) !== false ? $pos : 0);
$user->id = null;
// Get this user groups

View File

@@ -179,7 +179,7 @@ class ViewAssetsController extends Controller
$logaction->logaction('request canceled');
$settings->notify(new RequestAssetCancelation($data));
return redirect()->route('requestable-assets')
->with('success')->with('success', trans('admin/hardware/message.requests.cancel-success'));
->with('success')->with('success', trans('admin/hardware/message.requests.cancel'));
}
$logaction->logaction('requested');

View File

@@ -8,6 +8,14 @@ abstract class Request extends FormRequest
{
protected $rules = [];
public function json($key = null, $default = null)
{
if ($this->ajax() || $this->wantsJson()) {
json_decode($this->getContent(), false, 512, JSON_THROW_ON_ERROR); // ignore output, just throw
}
return parent::json($key, $default);
}
public function rules()
{
return $this->rules;

View File

@@ -0,0 +1,33 @@
<?php
namespace App\Http\Requests;
class SlackSettingsRequest extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'slack_endpoint' => 'url|required_with:slack_channel|starts_with:"https://hooks.slack.com"|nullable',
'slack_channel' => 'required_with:slack_endpoint|starts_with:#|nullable',
'slack_botname' => 'string|nullable',
];
}
}

View File

@@ -82,7 +82,7 @@ class AccessoriesTransformer
'first_name'=> e($user->first_name),
'last_name'=> e($user->last_name),
'employee_number' => e($user->employee_num),
'checkout_notes' => $user->pivot->note,
'checkout_notes' => e($user->pivot->note),
'last_checkout' => Helper::getFormattedDateObject($user->pivot->created_at, 'datetime'),
'type' => 'user',
'available_actions' => ['checkin' => true]

View File

@@ -36,7 +36,11 @@ class ActionlogsTransformer
if (is_array($meta_value)) {
foreach ($meta_value as $meta_value_key => $meta_value_value) {
$clean_meta[$key][$meta_value_key] = e($meta_value_value);
if (is_scalar($meta_value_value)) {
$clean_meta[$key][$meta_value_key] = e($meta_value_value);
} else {
$clean_meta[$key][$meta_value_key] = 'invalid scalar: '.print_r($meta_value_value, true);
}
}
} else {

View File

@@ -170,7 +170,7 @@ class AssetsTransformer
}
return $asset->assigned ? [
'id' => $asset->assigned->id,
'name' => $asset->assigned->display_name,
'name' => e($asset->assigned->display_name),
'type' => $asset->assignedType()
] : null;
}

View File

@@ -9,13 +9,13 @@ use Illuminate\Database\Eloquent\Collection;
class GroupsTransformer
{
public function transformGroups (Collection $groups)
public function transformGroups (Collection $groups, $total = null)
{
$array = array();
foreach ($groups as $group) {
$array[] = self::transformGroup($group);
}
return (new DatatablesTransformer)->transformDatatables($array);
return (new DatatablesTransformer)->transformDatatables($array, $total);
}
public function transformGroup (Group $group)

View File

@@ -177,7 +177,7 @@ class ItemImporter extends Importer
*/
public function createOrFetchAssetModel(array $row)
{
$condition = array();
$asset_model_name = $this->findCsvMatch($row, "asset_model");
$asset_modelNumber = $this->findCsvMatch($row, "model_number");
// TODO: At the moment, this means we can't update the model number if the model name stays the same.
@@ -189,8 +189,16 @@ class ItemImporter extends Importer
} elseif ((empty($asset_model_name)) && (empty($asset_modelNumber))) {
$asset_model_name ='Unknown';
}
if ((!empty($asset_model_name)) && (empty($asset_modelNumber))) {
$condition[] = ['name', '=', $asset_model_name];
} elseif ((!empty($asset_model_name)) && (!empty($asset_modelNumber))) {
$condition[] = ['name', '=', $asset_model_name];
$condition[] = ['model_number', '=', $asset_modelNumber];
}
$editingModel = $this->updating;
$asset_model = AssetModel::where(['name' => $asset_model_name, 'model_number' => $asset_modelNumber])->first();
$asset_model = AssetModel::where($condition)->first();
if ($asset_model) {
if (!$this->updating) {
@@ -200,7 +208,11 @@ class ItemImporter extends Importer
$this->log("Matching Model found, updating it.");
$item = $this->sanitizeItemForStoring($asset_model, $editingModel);
$item['name'] = $asset_model_name;
$item['model_number'] = $asset_modelNumber;
if(!empty($asset_modelNumber)){
$item['model_number'] = $asset_modelNumber;
}
$asset_model->update($item);
$asset_model->save();
$this->log("Asset Model Updated");

View File

@@ -32,7 +32,6 @@ class LicenseImporter extends ItemImporter
{
$editingLicense = false;
$license = License::where('name', $this->item['name'])
->where('serial', $this->item['serial'])
->first();
if ($license) {
if (!$this->updating) {

View File

@@ -52,6 +52,7 @@ class UserImporter extends ItemImporter
$this->item['city'] = $this->findCsvMatch($row, 'city');
$this->item['state'] = $this->findCsvMatch($row, 'state');
$this->item['country'] = $this->findCsvMatch($row, 'country');
$this->item['zip'] = $this->findCsvMatch($row, 'zip');
$this->item['activated'] = ($this->fetchHumanBoolean($this->findCsvMatch($row, 'activated')) == 1) ? '1' : 0;
$this->item['employee_num'] = $this->findCsvMatch($row, 'employee_num');
$this->item['department_id'] = $this->createOrFetchDepartment($this->findCsvMatch($row, 'department'));

View File

@@ -665,13 +665,15 @@ class Asset extends Depreciable
*/
public static function getExpiringWarrantee($days = 30)
{
$days = (is_null($days)) ? 30 : $days;
return Asset::where('archived', '=', '0')
->whereNotNull('warranty_months')
->whereNotNull('purchase_date')
->whereNull('deleted_at')
->whereRaw(\DB::raw('DATE_ADD(`purchase_date`,INTERVAL `warranty_months` MONTH) <= DATE(NOW() + INTERVAL '
. $days
. ' DAY) AND DATE_ADD(`purchase_date`,INTERVAL `warranty_months` MONTH) > NOW()'))
. ' DAY) AND DATE_ADD(`purchase_date`, INTERVAL `warranty_months` MONTH) > NOW()'))
->orderBy('purchase_date', 'ASC')
->get();
}
@@ -814,7 +816,9 @@ class Asset extends Depreciable
*/
public function checkin_email()
{
return $this->model->category->checkin_email;
if (($this->model) && ($this->model->category)) {
return $this->model->category->checkin_email;
}
}
/**

View File

@@ -627,6 +627,7 @@ class License extends Depreciable
*/
public static function getExpiringLicenses($days = 60)
{
$days = (is_null($days)) ? 60 : $days;
return License::whereNotNull('expiration_date')
->whereNull('deleted_at')

View File

@@ -115,6 +115,7 @@ trait Loggable
$log->location_id = null;
$log->note = $note;
$log->action_date = $action_date;
if (Auth::user()) {
$log->user_id = Auth::user()->id;

View File

@@ -52,10 +52,7 @@ class Setting extends Model
'admin_cc_email' => 'email|nullable',
'default_currency' => 'required',
'locale' => 'required',
'slack_endpoint' => 'url|required_with:slack_channel|nullable',
'labels_per_page' => 'numeric',
'slack_channel' => 'regex:/^[\#\@]?\w+/|required_with:slack_endpoint|nullable',
'slack_botname' => 'string|nullable',
'labels_width' => 'numeric',
'labels_height' => 'numeric',
'labels_pmargin_left' => 'numeric|nullable',

View File

@@ -14,8 +14,8 @@ class Supplier extends SnipeModel
protected $rules = array(
'name' => 'required|min:1|max:255|unique_undeleted',
'address' => 'max:50|nullable',
'address2' => 'max:50|nullable',
'address' => 'max:250|nullable',
'address2' => 'max:250|nullable',
'city' => 'max:255|nullable',
'state' => 'max:32|nullable',
'country' => 'max:3|nullable',

View File

@@ -43,6 +43,17 @@ class AppServiceProvider extends ServiceProvider
\Log::warning("'APP_FORCE_TLS' is set to true, but 'APP_URL' does not start with 'https://'. Will not force TLS on connections.");
}
}
// TODO - isn't it somehow 'gauche' to check the environment directly; shouldn't we be using config() somehow?
if ( ! env('APP_ALLOW_INSECURE_HOSTS')) { // unless you set APP_ALLOW_INSECURE_HOSTS, you should PROHIBIT forging domain parts of URL via Host: headers
$url_parts = parse_url(config('app.url'));
if ($url_parts && array_key_exists('scheme', $url_parts) && array_key_exists('host', $url_parts)) { // check for the *required* parts of a bare-minimum URL
\URL::forceRootUrl(config('app.url'));
} else {
\Log::error("Your APP_URL in your .env is misconfigured - it is: ".config('app.url').". Many things will work strangely unless you fix it.");
}
}
Schema::defaultStringLength(191);
Asset::observe(AssetObserver::class);
Accessory::observe(AccessoryObserver::class);

View File

@@ -156,6 +156,8 @@ class AuthServiceProvider extends ServiceProvider
return $user->hasAccess('self.checkout_assets');
});
// This is largely used to determine whether to display the gear icon sidenav
// in the left-side navigation
Gate::define('backend.interact', function ($user) {
return $user->can('view', Statuslabel::class)
|| $user->can('view', AssetModel::class)
@@ -168,7 +170,21 @@ class AuthServiceProvider extends ServiceProvider
|| $user->can('view', Manufacturer::class)
|| $user->can('view', CustomField::class)
|| $user->can('view', CustomFieldset::class)
|| $user->can('view', Depreciation::class);
|| $user->can('view', Depreciation::class);
});
// This determines whether or not an API user should be able to get the selectlists.
// This can seem a little confusing, since view properties may not have been granted
// to the logged in API user, but creating assets, licenses, etc won't work
// if the user can't view and interact with the select lists.
Gate::define('view.selectlists', function ($user) {
return $user->can(['create','update'], Asset::class)
|| $user->can(['create','update'], License::class)
|| $user->can(['create','update'], Component::class)
|| $user->can(['create','update'], Consumable::class)
|| $user->can(['create','update'], Accessory::class)
|| $user->can(['create','update'], User::class);
});
}
}

View File

@@ -47,6 +47,7 @@ class LdapAd extends LdapAdConfiguration
'262688', // 0x40220 NORMAL_ACCOUNT, PASSWD_NOTREQD, SMARTCARD_REQUIRED
'328192', // 0x50200 NORMAL_ACCOUNT, SMARTCARD_REQUIRED, DONT_EXPIRE_PASSWORD
'328224', // 0x50220 NORMAL_ACCOUNT, PASSWD_NOT_REQD, SMARTCARD_REQUIRED, DONT_EXPIRE_PASSWORD
'4194816',// 0x400200 NORMAL_ACCOUNT, DONT_REQ_PREAUTH
'4260352',// 0x410200 NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD, DONT_REQ_PREAUTH
'1049088',// 0x100200 NORMAL_ACCOUNT, NOT_DELEGATED
'1114624',// 0x110200 NORMAL_ACCOUNT, NOT_DELEGATED, DONT_EXPIRE_PASSWORD

View File

@@ -1,10 +1,10 @@
<?php
return array (
'app_version' => 'v5.3.2',
'full_app_version' => 'v5.3.2 - build 6508-g7ce5993f5',
'build_version' => '6508',
'app_version' => 'v5.3.10',
'full_app_version' => 'v5.3.10 - build 6684-g05c081977',
'build_version' => '6684',
'prerelease_version' => '',
'hash_version' => 'g7ce5993f5',
'full_hash' => 'v5.3.2-15-g7ce5993f5',
'hash_version' => 'g05c081977',
'full_hash' => 'v5.3.10-1-g05c081977',
'branch' => 'master',
);

View File

@@ -22,12 +22,12 @@ class UpdateGroupFieldForReporting extends Migration {
if (Schema::hasTable('permission_groups')) {
Group::where('id', 1)->update(['permissions' => '{"users-poop":1,"reports":1}']);
Group::where('id', 2)->update(['permissions' => '{"users-pop":1,"reports":1}']);
Group::where('id', 1)->update(['permissions' => '{"users-foo":1,"reports":1}']);
Group::where('id', 2)->update(['permissions' => '{"users-foo":1,"reports":1}']);
} elseif (Schema::hasTable('groups')) {
DB::update('update '.DB::getTablePrefix().'groups set permissions = ? where id = ?', ['{"admin-farts":1,"users":1,"reports":1}', 1]);
DB::update('update '.DB::getTablePrefix().'groups set permissions = ? where id = ?', ['{"users-farts":1,"reports":1}', 2]);
DB::update('update '.DB::getTablePrefix().'groups set permissions = ? where id = ?', ['{"admin-foo":1,"users":1,"reports":1}', 1]);
DB::update('update '.DB::getTablePrefix().'groups set permissions = ? where id = ?', ['{"users-foo":1,"reports":1}', 2]);
}
}

View File

@@ -23,7 +23,7 @@ class AddLdapFieldsToSettings extends Migration {
$table->string('ldap_username_field')->nullable()->default('samaccountname');
$table->string('ldap_lname_field')->nullable()->default('sn');
$table->string('ldap_fname_field')->nullable()->default('givenname');
$table->string('ldap_auth_filter_query')->nullable()->default('uid=samaccountname');
$table->string('ldap_auth_filter_query')->nullable()->default('uid=');
$table->integer('ldap_version')->nullable()->default(3);
$table->string('ldap_active_flag')->nullable()->default(NULL);
$table->string('ldap_emp_num')->nullable()->default(NULL);

View File

@@ -0,0 +1,36 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class ChangeSupplierAddressLength extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('suppliers', function (Blueprint $table) {
//
$table->string('address', 250)->nullable()->change();
$table->string('address2', 250)->nullable()->change();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('suppliers', function (Blueprint $table) {
//
$table->text('address', 50)->nullable()->default(null)->change();
$table->text('address2', 50)->nullable()->default(null)->change();
});
}
}

View File

@@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use App\Models\Setting;
class BlankOutLdapActiveFlag extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
if ($s = Setting::getSettings()) {
$s->ldap_active_flag = '';
$s->save();
}
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}

View File

@@ -0,0 +1,2 @@
[mysqldump]
column-statistics=0

12
package-lock.json generated
View File

@@ -4233,7 +4233,7 @@
"deep-equal": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
"integrity": "sha1-tcmMlCzv+vfLBR4k4UNKJaLmB2o=",
"integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
"dev": true,
"requires": {
"is-arguments": "^1.0.4",
@@ -11630,8 +11630,7 @@
"picomatch": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
"optional": true
"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg=="
},
"pify": {
"version": "2.3.0",
@@ -14237,7 +14236,6 @@
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
"integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
"optional": true,
"requires": {
"is-extglob": "^2.1.1"
}
@@ -14251,8 +14249,7 @@
"normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"optional": true
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
},
"readdirp": {
"version": "3.4.0",
@@ -18337,8 +18334,7 @@
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
"dev": true,
"optional": true
"dev": true
},
"pify": {
"version": "2.3.0",

View File

@@ -6,7 +6,7 @@
RewriteEngine On
# Needed for https://letsencrypt.org/ certificates.
RewriteRule ^\.well-known/acme-challenge/ - [END]
RewriteRule ^\.well-known/acme-challenge/ - [L]
# Uncomment these two lines to force SSL redirect in Apache
# RewriteCond %{HTTPS} off

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,8 +1,8 @@
{
"/js/build/app.js": "/js/build/app.js?id=fa8e6e2c8e6ebd812d15",
"/js/build/app.js": "/js/build/app.js?id=45f6fb8b6b6121469cd6",
"/css/build/AdminLTE.css": "/css/build/AdminLTE.css?id=89f2b7816c4e00784b59",
"/css/build/app.css": "/css/build/app.css?id=5d0d4ed9f5ea4d02b6fe",
"/css/build/overrides.css": "/css/build/overrides.css?id=1a11d122b620ebdc8354",
"/css/build/app.css": "/css/build/app.css?id=423186da9bf73779ce2a",
"/css/build/overrides.css": "/css/build/overrides.css?id=e0c3caf0357a7ab0a2e9",
"/css/dist/skins/skin-blue.css": "/css/dist/skins/skin-blue.css?id=2da78d31ca46509e2927",
"/css/dist/skins/skin-red.css": "/css/dist/skins/skin-red.css?id=0845c3960331dcd5db3c",
"/css/dist/skins/skin-contrast.css": "/css/dist/skins/skin-contrast.css?id=83a9d7106a863eb4536d",
@@ -18,15 +18,15 @@
"/css/dist/skins/skin-blue-dark.css": "/css/dist/skins/skin-blue-dark.css?id=0409748eb4bb77fe171a",
"/css/dist/skins/skin-orange-dark.css": "/css/dist/skins/skin-orange-dark.css?id=7abb3dcd41ad0d4700b7",
"/css/dist/skins/skin-orange.css": "/css/dist/skins/skin-orange.css?id=96477616f4a4b4ff1db8",
"/css/dist/all.css": "/css/dist/all.css?id=d428302ff341ffec8b1b",
"/css/dist/all.css": "/css/dist/all.css?id=23d12dde43fa52cbc84d",
"/css/blue.png": "/css/blue.png?id=e83a6c29e04fe851f212",
"/css/blue@2x.png": "/css/blue@2x.png?id=51135dd4d24f88f5de0b",
"/css/dist/signature-pad.css": "/css/dist/signature-pad.css?id=6a89d3cd901305e66ced",
"/css/dist/signature-pad.min.css": "/css/dist/signature-pad.min.css?id=6a89d3cd901305e66ced",
"/css/dist/bootstrap-table.css": "/css/dist/bootstrap-table.css?id=93c24b4c89490bbfd73e",
"/css/dist/bootstrap-table.css": "/css/dist/bootstrap-table.css?id=810d7e520c3057ee500e",
"/js/build/vendor.js": "/js/build/vendor.js?id=b93877b4a88a76e1b18b",
"/js/dist/bootstrap-table.js": "/js/dist/bootstrap-table.js?id=75760107ce879b26f156",
"/js/dist/all.js": "/js/dist/all.js?id=5999105216485cd776ad",
"/js/dist/bootstrap-table.js": "/js/dist/bootstrap-table.js?id=473d249fc27f1b907d07",
"/js/dist/all.js": "/js/dist/all.js?id=7fbd7aad35364c6060e6",
"/css/dist/skins/skin-green.min.css": "/css/dist/skins/skin-green.min.css?id=1f137fd2dcbac676d291",
"/css/dist/skins/skin-green-dark.min.css": "/css/dist/skins/skin-green-dark.min.css?id=af88a4cc8e58dc298963",
"/css/dist/skins/skin-black.min.css": "/css/dist/skins/skin-black.min.css?id=5ef650950378aeb72dfa",

View File

@@ -46,6 +46,14 @@
<input v-if="field.type == 'text'" class="form-control m-b-xs" type="text" :value="getValue(field)" :id="'default-value' + field.id" :name="'default_values[' + field.id + ']'">
<textarea v-if="field.type == 'textarea'" class="form-control" :value="getValue(field)" :id="'default-value' + field.id" :name="'default_values[' + field.id + ']'"></textarea><br>
<div v-if="field.type == 'checkbox'" v-for="field_value in field.field_values_array">
<input v-if="field.type == 'checkbox'" class="" type="checkbox" :name="'default_values[' + field.id + '][]'" :value="field_value" :checked="getValue(field).split(', ').includes(field_value)"> <label>{{ field_value }}</label>
</div>
<div v-if="field.type == 'radio'" v-for="field_value in field.field_values_array">
<input v-if="field.type == 'radio'" class="" type="radio" :name="'default_values[' + field.id + ']'" :value="field_value" :checked="getValue(field).split(', ').includes(field_value)"> <label>{{ field_value }}</label>
</div>
<select v-if="field.type == 'listbox'" class="form-control m-b-xs" :name="'default_values[' + field.id + ']'">
<option value=""></option>
<option v-for="field_value in field.field_values_array" :value="field_value" :selected="getValue(field) == field_value">{{ field_value }}</option>

View File

@@ -178,11 +178,11 @@
{id: 'phone_number', text: 'Phone Number' },
{id: 'manager_first_name', text: 'Manager First Name' },
{id: 'manager_last_name', text: 'Manager Last Name' },
{id: 'department', text: 'Department' },
{id: 'activated', text: 'Activated' },
{id: 'address', text: 'Address' },
{id: 'city', text: 'City' },
{id: 'state', text: 'State' },
{id: 'zip', text: 'ZIP' },
{id: 'country', text: 'Country' },
],

View File

@@ -466,7 +466,16 @@ h4 {
display: table-cell;
}
.card-view-title {
min-width: 40% !important;
line-height: 3.0!important;
padding-right: 20px;
}
.card-view {
display: table-row;
flex-direction: column;
}
/**

View File

@@ -5,17 +5,17 @@
'delete' => [
'confirm' => 'Is jy seker jy wil hierdie bate instandhouding uitvee?',
'error' => 'Daar was \'n probleem met die verwydering van die bate-instandhouding. Probeer asseblief weer.',
'success' => 'Die bate-instandhouding is suksesvol verwyder.'
'success' => 'Die bate-instandhouding is suksesvol verwyder.',
],
'create' => [
'error' => 'Asset Maintenance is nie geskep nie, probeer asseblief weer.',
'success' => 'Bate Onderhoud geskep suksesvol.'
'success' => 'Bate Onderhoud geskep suksesvol.',
],
'edit' => [
'error' => 'Bateonderhoud is nie geredigeer nie, probeer asseblief weer.',
'success' => 'Bate Onderhoud suksesvol geredigeer.'
'success' => 'Bate Onderhoud suksesvol geredigeer.',
],
'asset_maintenance_incomplete' => 'Nog nie voltooi nie',
'warranty' => 'waarborg',
'not_warranty' => 'Nie waarborg nie',
];
];

View File

@@ -4,5 +4,5 @@
'title' => 'Bate Onderhoud',
'asset_name' => 'Bate Naam',
'is_warranty' => 'waarborg',
'dl_csv' => 'Laai CSV af'
'dl_csv' => 'Laai CSV af',
];

View File

@@ -18,5 +18,6 @@ return array(
'update' => 'Opdateer kategorie',
'use_default_eula' => 'Gebruik eerder die <a href="#" data-toggle="modal" data-target="#eulaModal">primary standaard EULA</a>.',
'use_default_eula_disabled' => '<del>Gebruik die primêre standaardverlof in plaas daarvan.</del> Geen primêre standaard EULA is ingestel nie. Voeg asseblief een by Instellings.',
'use_default_eula_column' => 'Use default EULA',
);

View File

@@ -1,4 +1,7 @@
<?php
return [
'select_company' => 'Kies Maatskappy',
'about_companies' => 'About Companies',
'about_companies_description' => ' You can use companies as a simple informative field, or you can use them to restrict asset visibility and availability to users with a specific company by enabling Full Company Support in your Admin Settings.',
];

View File

@@ -1,18 +1,19 @@
<?php
return array(
return [
'does_not_exist' => 'Maatskappy bestaan nie.',
'assoc_users' => 'Hierdie maatskappy is tans geassosieer met ten minste een model en kan nie verwyder word nie. Dateer asseblief jou modelle op om nie meer hierdie maatskappy te verwys nie en probeer weer.',
'create' => array(
'create' => [
'error' => 'Maatskappy is nie geskep nie, probeer asseblief weer.',
'success' => 'Maatskappy geskep suksesvol.'
),
'update' => array(
'success' => 'Maatskappy geskep suksesvol.',
],
'update' => [
'error' => 'Maatskappy is nie opgedateer nie, probeer asseblief weer',
'success' => 'Maatskappy suksesvol opgedateer.'
),
'delete' => array(
'success' => 'Maatskappy suksesvol opgedateer.',
],
'delete' => [
'confirm' => 'Is jy seker jy wil hierdie maatskappy uitvee?',
'error' => 'Daar was \'n probleem met die verwydering van die maatskappy. Probeer asseblief weer.',
'success' => 'Die maatskappy is suksesvol verwyder.'
)
);
'success' => 'Die maatskappy is suksesvol verwyder.',
],
];

View File

@@ -1,11 +1,12 @@
<?php
return array(
return [
'custom_fields' => 'Aangepaste velde',
'manage' => 'Manage',
'field' => 'veld',
'about_fieldsets_title' => 'Oor Fieldsets',
'about_fieldsets_text' => 'Veldstelle stel jou in staat om groepe van persoonlike velde te skep wat gereeld hergebruik word vir spesifieke tipe bates.',
'custom_format' => 'Gepasmaakte formaat ...',
'about_fieldsets_text' => 'Fieldsets allow you to create groups of custom fields that are frequently re-used for specific asset model types.',
'custom_format' => 'Custom Regex format...',
'encrypt_field' => 'Enkripteer die waarde van hierdie veld in die databasis',
'encrypt_field_help' => 'WAARSKUWING: Om \'n veld te enkripteer, maak dit onondersoekbaar.',
'encrypted' => 'encrypted',
@@ -26,7 +27,19 @@ return array(
'used_by_models' => 'Gebruik deur modelle',
'order' => 'Orde',
'create_fieldset' => 'Nuwe Fieldset',
'create_fieldset_title' => 'Create a new fieldset',
'create_field' => 'Nuwe aangepaste veld',
'create_field_title' => 'Create a new custom field',
'value_encrypted' => 'Die waarde van hierdie veld is geïnkripteer in die databasis. Slegs admingebruikers sal die gedecodeerde waarde kan sien',
'show_in_email' => 'Include the value of this field in checkout emails sent to the user? Encrypted fields cannot be included in emails.',
);
'help_text' => 'Help Text',
'help_text_description' => 'This is optional text that will appear below the form elements while editing an asset to provide context on the field.',
'about_custom_fields_title' => 'About Custom Fields',
'about_custom_fields_text' => 'Custom fields allow you to add arbitrary attributes to assets.',
'add_field_to_fieldset' => 'Add Field to Fieldset',
'make_optional' => 'Required - click to make optional',
'make_required' => 'Optional - click to make required',
'reorder' => 'Reorder',
'db_field' => 'DB Field',
'db_convert_warning' => 'WARNING. This field is in the custom fields table as <code> :db_column </code> but should be :expected </code>.'
];

View File

@@ -1,13 +1,16 @@
<?php
return array(
return [
'about_asset_depreciations' => 'Oor bate afskrywing',
'about_depreciations' => 'U kan bate-afskrywings opstel om bates te deprecieer gebaseer op reguit-waardevermindering.',
'asset_depreciations' => 'Bate afskrywing',
'create' => 'Skep waardevermindering',
'depreciation_name' => 'Waardevermindering Naam',
'depreciation_min' => 'Floor Value of Depreciation',
'number_of_months' => 'Aantal maande',
'update' => 'Werk waardevermindering op',
'depreciation_min' => 'Minimum Value after Depreciation'
);
'depreciation_min' => 'Minimum Value after Depreciation',
'no_depreciations_warning' => '<strong>Warning: </strong>
You do not currently have any depreciations set up.
Please set up at least one depreciation to view the depreciation report.',
];

View File

@@ -1,10 +1,11 @@
<?php
return array(
return [
'id' => 'ID',
'months' => 'maande',
'term' => 'termyn',
'title' => 'naam',
'depreciation_min' => 'Floor Value',
);
];

View File

@@ -1,6 +1,6 @@
<?php
return array(
return [
'about_groups_title' => 'Oor groepe',
'about_groups' => 'Groepe word gebruik om gebruikersregte te veralgemeen.',
'group_management' => 'Groepbestuur',
@@ -10,5 +10,7 @@ return array(
'group_admin' => 'Groep Admin',
'allow' => 'laat',
'deny' => 'ontken',
);
'permission' => 'Permission',
'grant' => 'Grant',
'no_permissions' => 'This group has no permissions.'
];

View File

@@ -1,12 +1,12 @@
<?php
return array(
'bulk_delete' => 'Bevestig bates vir die verwydering van grootmaat',
return [
'bulk_delete' => 'Bevestig bates vir die verwydering van grootmaat',
'bulk_delete_help' => 'Hersien die bates vir grootmaatverwydering hieronder. Sodra dit verwyder is, kan hierdie bates herstel word, maar hulle word nie meer geassosieer met enige gebruikers wat hulle tans toegewys is nie.',
'bulk_delete_warn' => 'Jy is op die punt om te verwyder: bate_count bates.',
'bulk_update' => 'Grootskaalse opdateringsbates',
'bulk_update_help' => 'Met hierdie vorm kan u verskeie bates gelyktydig bywerk. Vul slegs die velde in wat u moet verander. Enige velde wat leeg is, bly onveranderd.',
'bulk_update_warn' => 'Jy is op die punt om die eienskappe van: bate_count bates te wysig.',
'bulk_update' => 'Grootskaalse opdateringsbates',
'bulk_update_help' => 'Met hierdie vorm kan u verskeie bates gelyktydig bywerk. Vul slegs die velde in wat u moet verander. Enige velde wat leeg is, bly onveranderd.',
'bulk_update_warn' => 'Jy is op die punt om die eienskappe van: bate_count bates te wysig.',
'checkedout_to' => 'Gekontroleer na',
'checkout_date' => 'Checkout Datum',
'checkin_date' => 'Incheckdatum',
@@ -38,7 +38,12 @@ return array(
'tag' => 'Bate-tag',
'update' => 'Asset Update',
'warranty' => 'waarborg',
'warranty_expires' => 'Warranty Expires',
'warranty_expires' => 'Warranty Expires',
'years' => 'jaar',
)
;
'asset_location' => 'Update Asset Location',
'asset_location_update_default_current' => 'Update default location AND actual location',
'asset_location_update_default' => 'Update only default location',
'asset_not_deployable' => 'That asset status is not deployable. This asset cannot be checked out.',
'asset_deployable' => 'That status is deployable. This asset can be checked out.',
'processing_spinner' => 'Processing...',
];

View File

@@ -1,9 +1,9 @@
<?php
return array(
return [
'about_assets_title' => 'Oor bates',
'about_assets_text' => 'Bates is items opgespoor volgens reeksnommer of bate-tag. Hulle is geneig om hoër waarde items te wees waar die identifisering van \'n spesifieke item saak maak.',
'archived' => 'argief',
'archived' => 'argief',
'asset' => 'bate',
'bulk_checkout' => 'Checkout Assets',
'checkin' => 'Kontrole bate',
@@ -15,8 +15,29 @@ return array(
'model_deleted' => 'This Assets model has been deleted. You must restore the model before you can restore the Asset.',
'requestable' => 'Requestable',
'requested' => 'versoek',
'not_requestable' => 'Not Requestable',
'requestable_status_warning' => 'Do not change requestable status',
'restore' => 'Herstel bate',
'pending' => 'hangende',
'undeployable' => 'Undeployable',
'view' => 'Bekyk bate',
);
'csv_error' => 'You have an error in your CSV file:',
'import_text' => '
<p>
Upload a CSV that contains asset history. The assets and users MUST already exist in the system, or they will be skipped. Matching assets for history import happens against the asset tag. We will try to find a matching user based on the user\'s name you provide, and the criteria you select below. If you do not select any criteria below, it will simply try to match on the username format you configured in the Admin &gt; General Settings.
</p>
<p>Fields included in the CSV must match the headers: <strong>Asset Tag, Name, Checkout Date, Checkin Date</strong>. Any additional fields will be ignored. </p>
<p>Checkin Date: blank or future checkin dates will checkout items to associated user. Excluding the Checkin Date column will create a checkin date with todays date.</p>
',
'csv_import_match_f-l' => 'Try to match users by firstname.lastname (jane.smith) format',
'csv_import_match_initial_last' => 'Try to match users by first initial last name (jsmith) format',
'csv_import_match_first' => 'Try to match users by first name (jane) format',
'csv_import_match_email' => 'Try to match users by email as username',
'csv_import_match_username' => 'Try to match users by username',
'error_messages' => 'Error messages:',
'success_messages' => 'Success messages:',
'alert_details' => 'Please see below for details.',
'custom_export' => 'Custom Export'
];

View File

@@ -1,82 +1,82 @@
<?php
return array(
return [
'undeployable' => '<strong>Waarskuwing: </strong> Hierdie bate is gemerk as tans onbruikbaar. As hierdie status verander het, verander asseblief die batestatus.',
'does_not_exist' => 'Bate bestaan nie.',
'does_not_exist_or_not_requestable' => 'Goeie probeerslag. Daardie bate bestaan nie of is nie versoekbaar nie.',
'does_not_exist_or_not_requestable' => 'That asset does not exist or is not requestable.',
'assoc_users' => 'Hierdie bate word tans na \'n gebruiker nagegaan en kan nie uitgevee word nie. Gaan asseblief die bate eers in, en probeer dan weer uitvee.',
'create' => array(
'create' => [
'error' => 'Bate is nie geskep nie, probeer asseblief weer. :(',
'success' => 'Bate geskep suksesvol. :)'
),
'success' => 'Bate geskep suksesvol. :)',
],
'update' => array(
'update' => [
'error' => 'Bate is nie opgedateer nie, probeer asseblief weer',
'success' => 'Bate is suksesvol opgedateer.',
'nothing_updated' => 'Geen velde is gekies nie, dus niks is opgedateer nie.',
),
],
'restore' => array(
'restore' => [
'error' => 'Bate is nie herstel nie, probeer asseblief weer',
'success' => 'Bate herstel suksesvol.'
),
'success' => 'Bate herstel suksesvol.',
],
'audit' => array(
'audit' => [
'error' => 'Bate-oudit was onsuksesvol. Probeer asseblief weer.',
'success' => 'Bate oudit suksesvol aangemeld.'
),
'success' => 'Bate oudit suksesvol aangemeld.',
],
'deletefile' => array(
'deletefile' => [
'error' => 'Lêer nie verwyder nie. Probeer asseblief weer.',
'success' => 'Lêer suksesvol uitgevee.',
),
],
'upload' => array(
'upload' => [
'error' => 'Lêer (s) nie opgelaai nie. Probeer asseblief weer.',
'success' => 'Lêer (s) suksesvol opgelaai.',
'nofiles' => 'Jy het nie enige lêers vir oplaai gekies nie, of die lêer wat jy probeer oplaai is te groot',
'invalidfiles' => 'Een of meer van jou lêers is te groot of is \'n filetipe wat nie toegelaat word nie. Toegelate filetipes is png, gif, jpg, doc, docx, pdf en txt.',
),
],
'import' => array(
'import' => [
'error' => 'Sommige items is nie korrek ingevoer nie.',
'errorDetail' => 'Die volgende items is nie ingevoer as gevolg van foute nie.',
'success' => "Jou lêer is ingevoer",
'file_delete_success' => "Jou lêer is suksesvol verwyder",
'file_delete_error' => "Die lêer kon nie uitgevee word nie",
),
'success' => 'Jou lêer is ingevoer',
'file_delete_success' => 'Jou lêer is suksesvol verwyder',
'file_delete_error' => 'Die lêer kon nie uitgevee word nie',
],
'delete' => array(
'delete' => [
'confirm' => 'Is jy seker jy wil hierdie bate uitvee?',
'error' => 'Daar was \'n probleem met die verwydering van die bate. Probeer asseblief weer.',
'nothing_updated' => 'Geen bates is gekies nie, so niks is verwyder nie.',
'success' => 'Die bate is suksesvol verwyder.'
),
'success' => 'Die bate is suksesvol verwyder.',
],
'checkout' => array(
'checkout' => [
'error' => 'Bate is nie nagegaan nie, probeer asseblief weer',
'success' => 'Die bate is suksesvol nagegaan.',
'user_does_not_exist' => 'Die gebruiker is ongeldig. Probeer asseblief weer.',
'not_available' => 'Die bate is nie beskikbaar vir die kassa nie!',
'no_assets_selected' => 'You must select at least one asset from the list'
),
'no_assets_selected' => 'You must select at least one asset from the list',
],
'checkin' => array(
'checkin' => [
'error' => 'Bate is nie nagegaan nie, probeer asseblief weer',
'success' => 'Die bate is suksesvol nagegaan.',
'user_does_not_exist' => 'Die gebruiker is ongeldig. Probeer asseblief weer.',
'already_checked_in' => 'Daardie bate is reeds nagegaan.',
),
],
'requests' => array(
'requests' => [
'error' => 'Bate is nie aangevra nie, probeer asseblief weer',
'success' => 'Die bate is suksesvol aangevra.',
'canceled' => 'Afhandeling versoek suksesvol gekanselleer'
)
'canceled' => 'Afhandeling versoek suksesvol gekanselleer',
],
);
];

View File

@@ -1,13 +1,14 @@
<?php
return array(
return [
'asset_tag' => 'Bate-tag',
'asset_model' => 'model',
'book_value' => 'waarde',
'book_value' => 'Current Value',
'change' => 'In uit',
'checkout_date' => 'Checkout Datum',
'checkoutto' => 'Gekontroleer',
'current_value' => 'Current Value',
'diff' => 'diff',
'dl_csv' => 'Laai CSV af',
'eol' => 'EOL',
@@ -18,8 +19,12 @@ return array(
'serial' => 'Serial',
'status' => 'status',
'title' => 'bate',
'image' => 'Toestelbeeld',
'image' => 'Toestelbeeld',
'days_without_acceptance' => 'Dae sonder aanvaarding',
'monthly_depreciation' => 'Monthly Depreciation'
);
'monthly_depreciation' => 'Monthly Depreciation',
'assigned_to' => 'Assigned To',
'requesting_user' => 'Requesting User',
'requested_date' => 'Requested Date',
'changed' => 'Changed',
'icon' => 'Icon',
];

View File

@@ -1,6 +1,6 @@
<?php
return array(
return [
'about_kits_title' => 'About Predefined Kits',
'about_kits_text' => 'Predefined Kits let you quickly check out a collection of items (assets, licenses, etc) to a user. This can be helpful when your onboarding process is consistent across many users and all users receive the same items.',
'checkout' => 'Checkout Kit ',
@@ -13,5 +13,38 @@ return array(
'none_licenses' => 'There are not enough available seats for :license to checkout. :qty are required. ',
'none_consumables' => 'There are not enough available units of :consumable to checkout. :qty are required. ',
'none_accessory' => 'There are not enough available units of :accessory to checkout. :qty are required. ',
);
'append_accessory' => 'Append Accessory',
'update_appended_accessory' => 'Update appended Accessory',
'append_consumable' => 'Append Consumable',
'update_appended_consumable' => 'Update appended Consumable',
'append_license' => 'Append license',
'update_appended_license' => 'Update appended license',
'append_model' => 'Append model',
'update_appended_model' => 'Update appended model',
'license_error' => 'License already attached to kit',
'license_added_success' => 'License added successfully',
'license_updated' => 'License was successfully updated',
'license_none' => 'License does not exist',
'license_detached' => 'License was successfully detached',
'consumable_added_success' => 'Consumable added successfully',
'consumable_updated' => 'Consumable was successfully updated',
'consumable_error' => 'Consumable already attached to kit',
'consumable_deleted' => 'Delete was successful',
'consumable_none' => 'Consumable does not exist',
'consumable_detached' => 'Consumable was successfully detached',
'accessory_added_success' => 'Accessory added successfully',
'accessory_updated' => 'Accessory was successfully updated',
'accessory_detached' => 'Accessory was successfully detached',
'accessory_error' => 'Accessory already attached to kit',
'accessory_deleted' => 'Delete was successful',
'accessory_none' => 'Accessory does not exist',
'checkout_success' => 'Checkout was successful',
'checkout_error' => 'Checkout error',
'kit_none' => 'Kit does not exist',
'kit_created' => 'Kit was successfully created',
'kit_updated' => 'Kit was successfully updated',
'kit_not_found' => 'Kit not found',
'kit_deleted' => 'Kit was successfully deleted',
'kit_model_updated' => 'Model was successfully updated',
'kit_model_detached' => 'Model was successfully detached',
];

View File

@@ -1,6 +1,6 @@
<?php
return array(
return [
'about_locations_title' => 'Oor plekke',
'about_locations' => 'Plekke word gebruik om ligginginligting vir gebruikers, bates en ander items op te spoor',
'assets_rtd' => 'bates', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
@@ -20,4 +20,21 @@ return array(
'parent' => 'Ouer',
'currency' => 'Ligging Geld',
'ldap_ou' => 'LDAP soek OU',
);
'user_name' => 'User Name',
'department' => 'Department',
'location' => 'Location',
'asset_tag' => 'Assets Tag',
'asset_name' => 'Name',
'asset_category' => 'Category',
'asset_manufacturer' => 'Manufacturer',
'asset_model' => 'Model',
'asset_serial' => 'Serial',
'asset_location' => 'Location',
'asset_checked_out' => 'Checked Out',
'asset_expected_checkin' => 'Expected Checkin',
'date' => 'Date:',
'signed_by_asset_auditor' => 'Signed By (Asset Auditor):',
'signed_by_finance_auditor' => 'Signed By (Finance Auditor):',
'signed_by_location_manager' => 'Signed By (Location Manager):',
'signed_by' => 'Signed Off By:',
];

View File

@@ -1,5 +1,10 @@
<?php
return array(
'info' => 'Kies die opsies wat jy wil hê vir jou bateverslag.'
);
return [
'info' => 'Kies die opsies wat jy wil hê vir jou bateverslag.',
'deleted_user' => 'Deleted user',
'send_reminder' => 'Send reminder',
'reminder_sent' => 'Reminder sent',
'acceptance_deleted' => 'Acceptance request deleted',
'acceptance_request' => 'Acceptance request'
];

View File

@@ -1,30 +1,39 @@
<?php
return array(
return [
'ad' => 'Aktiewe gids',
'ad_domain' => 'Active Directory-domein',
'ad_domain_help' => 'Dit is soms dieselfde as jou e-pos domein, maar nie altyd nie.',
'ad_append_domain_label' => 'Append domain name',
'ad_append_domain' => 'Append domain name to username field',
'ad_append_domain_help' => 'User isn\'t required to write "username@domain.local", they can just type "username".' ,
'ad_append_domain_help' => 'User isn\'t required to write "username@domain.local", they can just type "username".',
'admin_cc_email' => 'CC Email',
'admin_cc_email_help' => 'If you would like to send a copy of checkin/checkout emails that are sent to users to an additional email account, enter it here. Otherwise leave this field blank.',
'is_ad' => 'Dit is \'n Active Directory-bediener',
'alerts' => 'Alerts',
'alert_title' => 'Update Alert Settings',
'alert_email' => 'Stuur kennisgewings aan',
'alert_email_help' => 'Email addresses or distribution lists you want alerts to be sent to, comma separated',
'alerts_enabled' => 'Alerts aangeskakel',
'alert_interval' => 'Uitgaande Alert Drempel (in dae)',
'alert_inv_threshold' => 'Voorraadwaarskuwingsdrempel',
'allow_user_skin' => 'Allow user skin',
'allow_user_skin_help_text' => 'Checking this box will allow a user to override the UI skin with a different one.' ,
'allow_user_skin_help_text' => 'Checking this box will allow a user to override the UI skin with a different one.',
'asset_ids' => 'Bate ID\'s',
'audit_interval' => 'Ouditinterval',
'audit_interval_help' => 'As u gereeld u bates fisies moet kontroleer, vul die interval in maande in.',
'audit_warning_days' => 'Oudit Waarskuwing Drempel',
'audit_warning_days_help' => 'Hoeveel dae vooruit moet ons u waarsku wanneer bates verskuldig is vir ouditering?',
'auto_increment_assets' => 'Genereer outomaties inkrementele bate-ID\'s',
'auto_increment_assets' => 'Generate auto-incrementing asset tags',
'auto_increment_prefix' => 'Voorvoegsel (opsioneel)',
'auto_incrementing_help' => 'Aktiveer outomaties inkrementering van bate ID\'s om dit te stel',
'auto_incrementing_help' => 'Enable auto-incrementing asset tags first to set this',
'backups' => 'rugsteun',
'backups_restoring' => 'Restoring from Backup',
'backups_upload' => 'Upload Backup',
'backups_path' => 'Backups on the server are stored in <code>:path</code>',
'backups_restore_warning' => 'Use the restore button <small><span class="btn btn-xs btn-warning"><i class="text-white fas fa-retweet" aria-hidden="true"></i></span></small> to restore from a previous backup. (This does not currently work with S3 file storage or Docker.<br><br>Your <strong>entire :app_name database and any uploaded files will be completely replaced</strong> by what\'s in the backup file. ',
'backups_logged_out' => 'You will be logged out once your restore is complete.',
'backups_large' => 'Very large backups may time out on the restore attempt and may still need to be run via command line. ',
'barcode_settings' => 'Barcode-instellings',
'confirm_purge' => 'Bevestig skoonmaak',
'confirm_purge_help' => 'Enter the text "DELETE" in the box below to purge your deleted records. This action cannot be undone and will PERMANENTLY delete all soft-deleted items and users. (You should make a backup first, just to be safe.)',
@@ -47,6 +56,7 @@ return array(
'barcode_type' => '2D Barcode Type',
'alt_barcode_type' => '1D barcode tipe',
'email_logo_size' => 'Square logos in email look best. ',
'enabled' => 'Enabled',
'eula_settings' => 'EULA-instellings',
'eula_markdown' => 'Hierdie EULA laat <a href="https://help.github.com/articles/github-flavored-markdown/">Github-geurde markdown</a> toe.',
'favicon' => 'Favicon',
@@ -55,15 +65,23 @@ return array(
'footer_text' => 'Additional Footer Text ',
'footer_text_help' => 'This text will appear in the right-side footer. Links are allowed using <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>. Line breaks, headers, images, etc may result in unpredictable results.',
'general_settings' => 'Algemene instellings',
'general_settings_keywords' => 'company support, signature, acceptance, email format, username format, images, per page, thumbnail, eula, tos, dashboard, privacy',
'general_settings_help' => 'Default EULA and more',
'generate_backup' => 'Genereer rugsteun',
'header_color' => 'Opskrif Kleur',
'info' => 'Met hierdie instellings kan u sekere aspekte van u installasie aanpas.',
'label_logo' => 'Label Logo',
'label_logo_size' => 'Square logos look best - will be displayed in the top right of each asset label. ',
'laravel' => 'Laravel Weergawe',
'ldap' => 'LDAP',
'ldap_help' => 'LDAP/Active Directory',
'ldap_client_tls_key' => 'LDAP Client TLS Key',
'ldap_client_tls_cert' => 'LDAP Client-Side TLS Certificate',
'ldap_enabled' => 'LDAP aangeskakel',
'ldap_integration' => 'LDAP-integrasie',
'ldap_settings' => 'LDAP-instellings',
'ldap_client_tls_cert_help' => 'Client-Side TLS Certificate and Key for LDAP connections are usually only useful in Google Workspace configurations with "Secure LDAP." Both are required.',
'ldap_client_tls_key' => 'LDAP Client-Side TLS key',
'ldap_login_test_help' => 'Enter a valid LDAP username and password from the base DN you specified above to test whether your LDAP login is configured correctly. YOU MUST SAVE YOUR UPDATED LDAP SETTINGS FIRST.',
'ldap_login_sync_help' => 'This only tests that LDAP can sync correctly. If your LDAP Authentication query is not correct, users may still not be able to login. YOU MUST SAVE YOUR UPDATED LDAP SETTINGS FIRST.',
'ldap_server' => 'LDAP-bediener',
@@ -92,9 +110,17 @@ return array(
'ldap_activated_flag_help' => 'This flag is used to determine whether a user can login to Snipe-IT and does not affect the ability to check items in or out to them.',
'ldap_emp_num' => 'LDAP Werknemersnommer',
'ldap_email' => 'LDAP-e-pos',
'license' => 'Software License',
'ldap_test' => 'Test LDAP',
'ldap_test_sync' => 'Test LDAP Synchronization',
'license' => 'Software License',
'load_remote_text' => 'Remote Scripts',
'load_remote_help_text' => 'Hierdie Snipe-IT installasie kan skrifte van die buitewêreld laai.',
'login' => 'Login Attempts',
'login_attempt' => 'Login Attempt',
'login_ip' => 'IP Address',
'login_success' => 'Success?',
'login_user_agent' => 'User Agent',
'login_help' => 'List of attempted logins',
'login_note' => 'Login Nota',
'login_note_help' => 'Voeg opsioneel \'n paar sinne op jou aanmeldskerm, byvoorbeeld om mense te help wat \'n verlore of gesteelde toestel gevind het. Hierdie veld aanvaar <a href="https://help.github.com/articles/github-flavored-markdown/">Gitub-gegeurde markdown</a>',
'login_remote_user_text' => 'Remote User login options',
@@ -115,16 +141,28 @@ return array(
'optional' => 'opsioneel',
'per_page' => 'Resultate per bladsy',
'php' => 'PHP weergawe',
'php_info' => 'PHP Info',
'php_overview' => 'PHP',
'php_overview_keywords' => 'phpinfo, system, info',
'php_overview_help' => 'PHP System info',
'php_gd_info' => 'Jy moet php-gd installeer om QR-kodes te vertoon, sien installeringsinstruksies.',
'php_gd_warning' => 'PHP Image Processing en GD plugin is NIE geïnstalleer nie.',
'pwd_secure_complexity' => 'Wagwoord Kompleksiteit',
'pwd_secure_complexity_help' => 'Kies watter wagwoord kompleksiteit reëls jy wil afdwing.',
'pwd_secure_complexity_disallow_same_pwd_as_user_fields' => 'Password cannot be the same as first name, last name, email, or username',
'pwd_secure_complexity_letters' => 'Require at least one letter',
'pwd_secure_complexity_numbers' => 'Require at least one number',
'pwd_secure_complexity_symbols' => 'Require at least one symbol',
'pwd_secure_complexity_case_diff' => 'Require at least one uppercase and one lowercase',
'pwd_secure_min' => 'Wagwoord minimum karakters',
'pwd_secure_min_help' => 'Minimum permitted value is 8',
'pwd_secure_uncommon' => 'Voorkom algemene wagwoorde',
'pwd_secure_uncommon_help' => 'Dit sal gebruikers nie toelaat om algemene wagwoorde te gebruik van die top 10,000 wagwoorde wat in oortredings gerapporteer is nie.',
'qr_help' => 'Aktiveer QR-kodes eers om dit te stel',
'qr_text' => 'QR Kode Teks',
'saml' => 'SAML',
'saml_title' => 'Update SAML settings',
'saml_help' => 'SAML settings',
'saml_enabled' => 'SAML enabled',
'saml_integration' => 'SAML Integration',
'saml_sp_entityid' => 'Entity ID',
@@ -136,7 +174,7 @@ return array(
'saml_idp_metadata_help' => 'You can specify the IdP metadata using a URL or XML file.',
'saml_attr_mapping_username' => 'Attribute Mapping - Username',
'saml_attr_mapping_username_help' => 'NameID will be used if attribute mapping is unspecified or invalid.',
'saml_forcelogin_label' => 'SAML Force Login',
'saml_forcelogin_label' => 'SAML Default Login',
'saml_forcelogin' => 'Make SAML the primary login',
'saml_forcelogin_help' => 'You can use \'/login?nosaml\' to get to the normal login page.',
'saml_slo_label' => 'SAML Single Log Out',
@@ -144,6 +182,7 @@ return array(
'saml_slo_help' => 'This will cause the user to be first redirected to the IdP on logout. Leave unchecked if the IdP doesn\'t correctly support SP-initiated SAML SLO.',
'saml_custom_settings' => 'SAML Custom Settings',
'saml_custom_settings_help' => 'You can specify additional settings to the onelogin/php-saml library. Use at your own risk.',
'saml_download' => 'Download Metadata',
'setting' => 'omgewing',
'settings' => 'instellings',
'show_alerts_in_menu' => 'Show alerts in top menu',
@@ -154,6 +193,9 @@ return array(
'show_images_in_email' => 'Show images in emails',
'show_images_in_email_help' => 'Uncheck this box if your Snipe-IT installation is behind a VPN or closed network and users outside the network will not be able to load images served from this installation in their emails.',
'site_name' => 'Site Naam',
'slack' => 'Slack',
'slack_title' => 'Update Slack Settings',
'slack_help' => 'Slack settings',
'slack_botname' => 'Slack Botname',
'slack_channel' => 'Slack Channel',
'slack_endpoint' => 'Slack Endpoint',
@@ -170,6 +212,8 @@ return array(
'update' => 'Opdateer instellings',
'value' => 'waarde',
'brand' => 'Handelsmerk',
'brand_keywords' => 'footer, logo, print, theme, skin, header, colors, color, css',
'brand_help' => 'Logo, Site Name',
'web_brand' => 'Web Branding Type',
'about_settings_title' => 'Oor instellings',
'about_settings_text' => 'Met hierdie instellings kan u sekere aspekte van u installasie aanpas.',
@@ -181,6 +225,7 @@ return array(
'privacy_policy' => 'Privacy Policy',
'privacy_policy_link_help' => 'If a url is included here, a link to your privacy policy will be included in the app footer and in any emails that the system sends out, in compliance with GDPR. ',
'purge' => 'Verwyder verwyderde rekords',
'purge_deleted' => 'Purge Deleted ',
'labels_display_bgutter' => 'Etiket onderkant goot',
'labels_display_sgutter' => 'Label side goot',
'labels_fontsize' => 'Etiket lettergrootte',
@@ -226,4 +271,51 @@ return array(
'unique_serial_help_text' => 'Checking this box will enforce a uniqueness constraint on asset serials',
'zerofill_count' => 'Lengte van bate-etikette, insluitend zerofill',
'username_format_help' => 'This setting will only be used by the import process if a username is not provided and we have to generate a username for you.',
);
'oauth_title' => 'OAuth API Settings',
'oauth' => 'OAuth',
'oauth_help' => 'Oauth Endpoint Settings',
'asset_tag_title' => 'Update Asset Tag Settings',
'barcode_title' => 'Update Barcode Settings',
'barcodes' => 'Barcodes',
'barcodes_help_overview' => 'Barcode &amp; QR settings',
'barcodes_help' => 'This will attempt to delete cached barcodes. This would typically only be used if your barcode settings have changed, or if your Snipe-IT URL has changed. Barcodes will be re-generated when accessed next.',
'barcodes_spinner' => 'Attempting to delete files...',
'barcode_delete_cache' => 'Delete Barcode Cache',
'branding_title' => 'Update Branding Settings',
'general_title' => 'Update General Settings',
'mail_test' => 'Send Test',
'mail_test_help' => 'This will attempt to send a test mail to :replyto.',
'filter_by_keyword' => 'Filter by setting keyword',
'security' => 'Security',
'security_title' => 'Update Security Settings',
'security_keywords' => 'password, passwords, requirements, two factor, two-factor, common passwords, remote login, logout, authentication',
'security_help' => 'Two-factor, Password Restrictions',
'groups_keywords' => 'permissions, permission groups, authorization',
'groups_help' => 'Account permission groups',
'localization' => 'Localization',
'localization_title' => 'Update Localization Settings',
'localization_keywords' => 'localization, currency, local, locale, time zone, timezone, international, internatinalization, language, languages, translation',
'localization_help' => 'Language, date display',
'notifications' => 'Notifications',
'notifications_help' => 'Email alerts, audit settings',
'asset_tags_help' => 'Incrementing and prefixes',
'labels' => 'Labels',
'labels_title' => 'Update Label Settings',
'labels_help' => 'Label sizes &amp; settings',
'purge' => 'Purge',
'purge_keywords' => 'permanently delete',
'purge_help' => 'Purge Deleted Records',
'ldap_extension_warning' => 'It does not look like the LDAP extension is installed or enabled on this server. You can still save your settings, but you will need to enable the LDAP extension for PHP before LDAP syncing or login will work.',
'ldap_ad' => 'LDAP/AD',
'employee_number' => 'Employee Number',
'create_admin_user' => 'Create a User ::',
'create_admin_success' => 'Success! Your admin user has been added!',
'create_admin_redirect' => 'Click here to go to your app login!',
'setup_migrations' => 'Database Migrations ::',
'setup_no_migrations' => 'There was nothing to migrate. Your database tables were already set up!',
'setup_successful_migrations' => 'Your database tables have been created',
'setup_migration_output' => 'Migration output:',
'setup_migration_create_user' => 'Next: Create User',
'ldap_settings_link' => 'LDAP Settings Page',
'slack_test' => 'Test <i class="fab fa-slack"></i> Integration',
];

View File

@@ -1,22 +1,43 @@
<?php
return array(
return [
'update' => array(
'update' => [
'error' => '\'N Fout het voorgekom tydens opdatering.',
'success' => 'Stellings suksesvol opgedateer.'
),
'backup' => array(
'success' => 'Stellings suksesvol opgedateer.',
],
'backup' => [
'delete_confirm' => 'Is jy seker jy wil hierdie rugsteunlêer uitvee? Hierdie handeling kan nie ongedaan gemaak word nie.',
'file_deleted' => 'Die rugsteunlêer is suksesvol verwyder.',
'generated' => '\'N Nuwe rugsteunlêer is suksesvol geskep.',
'file_not_found' => 'Daardie rugsteunlêer kon nie op die bediener gevind word nie.',
),
'purge' => array(
'restore_warning' => 'Yes, restore it. I acknowledge that this will overwrite any existing data currently in the database. This will also log out all of your existing users (including you).',
'restore_confirm' => 'Are you sure you wish to restore your database from :filename?'
],
'purge' => [
'error' => '\'N Fout het voorgekom tydens suiwering.',
'validation_failed' => 'Jou skoonmaakbevestiging is verkeerd. Tik asseblief die woord "DELETE" in die bevestigingsboks.',
'success' => 'Geskrapte rekords verwyder.'
),
);
'success' => 'Geskrapte rekords verwyder.',
],
'mail' => [
'sending' => 'Sending Test Email...',
'success' => 'Mail sent!',
'error' => 'Mail could not be sent.',
'additional' => 'No additional error message provided. Check your mail settings and your app log.'
],
'ldap' => [
'testing' => 'Testing LDAP Connection, Binding & Query ...',
'500' => '500 Server Error. Please check your server logs for more information.',
'error' => 'Something went wrong :(',
'sync_success' => 'A sample of 10 users returned from the LDAP server based on your settings:',
'testing_authentication' => 'Testing LDAP Authentication...',
'authentication_success' => 'User authenticated against LDAP successfully!'
],
'slack' => [
'sending' => 'Sending Slack test message...',
'success_pt1' => 'Success! Check the ',
'success_pt2' => ' channel for your test message, and be sure to click SAVE below to store your settings.',
'500' => '500 Server Error.',
'error' => 'Something went wrong.',
]
];

View File

@@ -1,32 +1,31 @@
<?php
return array(
return [
'does_not_exist' => 'Statuslabel bestaan nie.',
'assoc_assets' => 'Hierdie statusetiket word tans geassosieer met ten minste een bate en kan nie uitgevee word nie. Dateer asseblief jou bates op om nie meer hierdie status te verwys nie en probeer weer.',
'create' => array(
'create' => [
'error' => 'Statuslabel is nie geskep nie, probeer asseblief weer.',
'success' => 'Status Label suksesvol geskep.'
),
'success' => 'Status Label suksesvol geskep.',
],
'update' => array(
'update' => [
'error' => 'Statuslabel is nie opgedateer nie, probeer asseblief weer',
'success' => 'Status Label suksesvol opgedateer.'
),
'success' => 'Status Label suksesvol opgedateer.',
],
'delete' => array(
'delete' => [
'confirm' => 'Is jy seker jy wil hierdie Status Label uitvee?',
'error' => 'Daar was \'n probleem met die verwydering van die statusetiket. Probeer asseblief weer.',
'success' => 'Die statusetiket is suksesvol verwyder.'
),
'success' => 'Die statusetiket is suksesvol verwyder.',
],
'help' => array(
'help' => [
'undeployable' => 'Hierdie bates kan nie aan enigiemand toegewys word nie.',
'deployable' => 'Hierdie bates kan nagegaan word. Sodra hulle toegewys is, sal hulle \'n meta-status van <i class="fa fa-circle text-blue"></i> <strong>Deployed</strong> aanvaar.',
'deployable' => 'These assets can be checked out. Once they are assigned, they will assume a meta status of <i class="fas fa-circle text-blue"></i> <strong>Deployed</strong>.',
'archived' => 'Hierdie bates kan nie nagegaan word nie en sal eers in die Argief-aansig verskyn. Dit is nuttig vir die behoud van inligting oor bates vir begrotings / historiese doeleindes, maar om hulle uit die dag-tot-dag-bate lys te hou.',
'pending' => 'Hierdie bates kan nog nie aan iemand toegewys word nie, wat dikwels gebruik word vir items wat buite herstel is, maar sal na verwagting terugkeer.',
),
],
);
];

View File

@@ -1,7 +1,6 @@
<?php
return array(
return [
'activated_help_text' => 'This user can login',
'activated_disabled_help_text' => 'You cannot edit activation status for your own account.',
'assets_user' => 'Bates toegewys aan: naam',
@@ -13,7 +12,7 @@ return array(
'edit' => 'Wysig gebruiker',
'filetype_info' => 'Toegelate filetipes is png, gif, jpg, jpeg, doc, docx, pdf, txt, zip en rar.',
'history_user' => 'Geskiedenis vir: naam',
'info' => 'info',
'info' => 'info',
'restore_user' => 'Klik hier om dit te herstel.',
'last_login' => 'Laaste Aanmelding',
'ldap_config_text' => 'LDAP-konfigurasie-instellings kan Admin> Instellings gevind word. Die (opsionele) gekose ligging sal vir alle ingevoerde gebruikers gestel word.',
@@ -25,4 +24,14 @@ return array(
'two_factor_admin_optin_help' => 'Jou huidige administrasie-instellings laat selektiewe handhawing van twee-faktor-verifikasie toe.',
'two_factor_enrolled' => '2FA-toestel ingeskryf',
'two_factor_active' => '2FA aktief',
);
'user_deactivated' => 'User is de-activated',
'activation_status_warning' => 'Do not change activation status',
'group_memberships_helpblock' => 'Only superadmins may edit group memberships.',
'superadmin_permission_warning' => 'Only superadmins may grant a user superadmin access.',
'admin_permission_warning' => 'Only users with admins rights or greater may grant a user admin access.',
'remove_group_memberships' => 'Remove Group Memberships',
'warning_deletion' => 'WARNING:',
'warning_deletion_information' => 'You are about to delete the :count user(s) listed below. Super admin names are highlighted in red.',
'update_user_asssets_status' => 'Update all assets for these users to this status',
'checkin_user_properties' => 'Check in all properties associated with these users',
];

View File

@@ -13,6 +13,7 @@ return array(
'user_deleted_warning' => 'Hierdie gebruiker is verwyder. Jy sal hierdie gebruiker moet herstel om hulle te wysig of nuwe bates toe te ken.',
'ldap_not_configured' => 'LDAP-integrasie is nie vir hierdie installasie gekonfigureer nie.',
'password_resets_sent' => 'The selected users who are activated and have a valid email addresses have been sent a password reset link.',
'password_reset_sent' => 'A password reset link has been sent to :email!',
'success' => array(

View File

@@ -1,6 +1,6 @@
<?php
return array(
return [
'actions' => 'aksies',
'add' => 'Voeg nuwe',
'cancel' => 'kanselleer',
@@ -8,10 +8,17 @@ return array(
'delete' => 'verwyder',
'edit' => 'wysig',
'restore' => 'herstel',
'remove' => 'Remove',
'request' => 'versoek',
'submit' => 'Indien',
'upload' => 'oplaai',
'select_file' => 'Kies lêer ...',
'select_file' => 'Kies lêer ...',
'select_files' => 'Select Files...',
'generate_labels' => '{1} Generate Label|[2,*] Generate Labels',
);
'send_password_link' => 'Send Password Reset Link',
'go' => 'Go',
'bulk_actions' => 'Bulk Actions',
'add_maintenance' => 'Add Maintenance',
'append' => 'Append',
'new' => 'New',
];

View File

@@ -19,7 +19,10 @@
'asset' => 'bate',
'asset_report' => 'Asset Report',
'asset_tag' => 'Bate-tag',
'assets_available' => 'bates beskikbaar',
'asset_tags' => 'Asset Tags',
'assets_available' => 'Assets available',
'accept_assets' => 'Accept Assets :name',
'accept_assets_menu' => 'Accept Assets',
'audit' => 'oudit',
'audit_report' => 'Ouditlogboek',
'assets' => 'bates',
@@ -30,6 +33,10 @@
'bulkaudit' => 'Grootmaat Oudit',
'bulkaudit_status' => 'Ouditstatus',
'bulk_checkout' => 'Grootmaat Checkout',
'bulk_edit' => 'Bulk Edit',
'bulk_delete' => 'Bulk Delete',
'bulk_actions' => 'Bulk Actions',
'bulk_checkin_delete' => 'Bulk Checkin &amp; Delete',
'bystatus' => 'by Status',
'cancel' => 'kanselleer',
'categories' => 'kategorieë',
@@ -44,13 +51,13 @@
'checkins_count' => 'Checkins',
'user_requests_count' => 'Requests',
'city' => 'Stad',
'click_here' => 'Klik hier',
'click_here' => 'Klik hier',
'clear_selection' => 'Clear Selection',
'companies' => 'maatskappye',
'company' => 'maatskappy',
'component' => 'komponent',
'components' => 'komponente',
'complete' => 'volledige',
'complete' => 'volledige',
'consumable' => 'verbruikbare',
'consumables' => 'Consumables',
'country' => 'land',
@@ -62,6 +69,8 @@
'updated_at' => 'Opgedateer op',
'currency' => '$', // this is deprecated
'current' => 'Huidige',
'current_password' => 'Current Password',
'customize_report' => 'Customize Report',
'custom_report' => 'Aangepaste bateverslag',
'dashboard' => 'Dashboard',
'days' => 'dae',
@@ -73,19 +82,22 @@
'delete_confirm' => 'Are you sure you wish to delete :item?',
'deleted' => 'geskrap',
'delete_seats' => 'Plekke verwyder',
'deletion_failed' => 'Deletion failed',
'departments' => 'departemente',
'department' => 'Departement',
'department' => 'Departement',
'deployed' => 'ontplooi',
'depreciation' => 'waardevermindering',
'depreciations' => 'Depreciations',
'depreciation_report' => 'Waardeverminderingsverslag',
'details' => 'Details',
'download' => 'Aflaai',
'download_all' => 'Download All',
'depreciation' => 'waardevermindering',
'download_all' => 'Download All',
'editprofile' => 'Wysig jou profiel',
'eol' => 'EOL',
'email_domain' => 'E-pos Domein',
'email_format' => 'E-pos formaat',
'email_domain_help' => 'Dit word gebruik om e-posadresse te genereer wanneer u dit invoer',
'error' => 'Error',
'filastname_format' => 'Eerste Voorletter (jsmith@voorbeeld.com)',
'firstname_lastname_format' => 'Vir Naam Van (jane.smith@example.com)',
'firstname_lastname_underscore_format' => 'First Name Last Name (jane_smith@example.com)',
@@ -102,16 +114,21 @@
'file_name' => 'lêer',
'file_type' => 'File Type',
'file_uploads' => 'Lêeroplaaie',
'file_upload' => 'File Upload',
'generate' => 'genereer',
'github_markdown' => 'This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
'generate_labels' => 'Generate Labels',
'github_markdown' => 'This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
'groups' => 'groepe',
'gravatar_email' => 'Gravatar e-pos adres',
'gravatar_url' => '<a href="http://gravatar.com"><small>Change your avatar at Gravatar.com</small></a>.',
'history' => 'Geskiedenis',
'history_for' => 'Geskiedenis vir',
'id' => 'ID',
'image' => 'Image',
'image_delete' => 'Vee prent uit',
'image_upload' => 'Laai prent op',
'filetypes_accepted_help' => 'Accepted filetype is :types. Max upload size allowed is :size.|Accepted filetypes are :types. Max upload size allowed is :size.',
'filetypes_size_help' => 'Max upload size allowed is :size.',
'image_filetypes_help' => 'Accepted filetypes are jpg, webp, png, gif, and svg. Max upload size allowed is :size.',
'import' => 'invoer',
'importing' => 'Importing',
@@ -121,6 +138,7 @@
'asset_maintenance_report' => 'Asset Maintenance Report',
'asset_maintenances' => 'Asset Maintenances',
'item' => 'item',
'item_name' => 'Item Name',
'insufficient_permissions' => 'Onvoldoende toestemmings!',
'kits' => 'Predefined Kits',
'language' => 'Taal',
@@ -132,7 +150,7 @@
'licenses_available' => 'lisensies beskikbaar',
'licenses' => 'lisensies',
'list_all' => 'Lys almal',
'loading' => 'laai',
'loading' => 'Loading... please wait....',
'lock_passwords' => 'This field value will not be saved in a demo installation.',
'feature_disabled' => 'Hierdie funksie is afgeskakel vir die demo-installasie.',
'location' => 'plek',
@@ -141,15 +159,17 @@
'logout' => 'Teken uit',
'lookup_by_tag' => 'Opsoek deur Asset Tag',
'maintenances' => 'Maintenances',
'manage_api_keys' => 'Manage API Keys',
'manufacturer' => 'vervaardiger',
'manufacturers' => 'vervaardigers',
'markdown' => 'Hierdie veld laat <a href="https://help.github.com/articles/github-flavored-markdown/">Gitub-gegeurde markdown</a> toe.',
'min_amt' => 'Min. HOEV',
'min_amt_help' => 'Minimum aantal items wat beskikbaar moet wees voordat \'n waarskuwing geaktiveer word.',
'min_amt_help' => 'Minimum number of items that should be available before an alert gets triggered. Leave Min. QTY blank if you do not want to receive alerts for low inventory.',
'model_no' => 'Model Nr.',
'months' => 'maande',
'moreinfo' => 'Meer inligting',
'name' => 'naam',
'new_password' => 'New Password',
'next' => 'volgende',
'next_audit_date' => 'Volgende ouditdatum',
'last_audit' => 'Laaste Oudit',
@@ -171,19 +191,26 @@
'purchase_date' => 'Aankoop datum',
'qty' => 'HOEV',
'quantity' => 'hoeveelheid',
'quantity_minimum' => 'You have :count items below or almost below minimum quantity levels',
'ready_to_deploy' => 'Klaar om te implementeer',
'recent_activity' => 'Onlangse aktiwiteite',
'remaining' => 'Remaining',
'remove_company' => 'Verwyder Maatskappyvereniging',
'reports' => 'Berigte',
'restored' => 'restored',
'restore' => 'Restore',
'requestable_models' => 'Requestable Models',
'requested' => 'versoek',
'requested_date' => 'Requested Date',
'requested_assets' => 'Requested Assets',
'requested_assets_menu' => 'Requested Assets',
'request_canceled' => 'Versoek gekanselleer',
'save' => 'Save',
'select' => 'Kies',
'select_all' => 'Select All',
'search' => 'Soek',
'select_category' => 'Kies \'n kategorie',
'select_department' => 'Kies \'n Departement',
'select_department' => 'Kies \'n Departement',
'select_depreciation' => 'Kies \'n waardeverminderingstipe',
'select_location' => 'Kies \'n plek',
'select_manufacturer' => 'Kies \'n vervaardiger',
@@ -200,6 +227,7 @@
'sign_in' => 'Teken in',
'signature' => 'Handtekening',
'skin' => 'Skin',
'slack_msg_note' => 'A slack message will be sent',
'slack_test_msg' => 'Oh hai! Looks like your Slack integration with Snipe-IT is working!',
'some_features_disabled' => 'DEMO MODE: Sommige funksies is afgeskakel vir hierdie installasie.',
'site_name' => 'Site Naam',
@@ -211,6 +239,7 @@
'sure_to_delete' => 'Is jy seker jy wil verwyder',
'submit' => 'Indien',
'target' => 'teiken',
'toggle_navigation' => 'Toogle Navigation',
'time_and_date_display' => 'Tyd en datum vertoon',
'total_assets' => 'totale bates',
'total_licenses' => 'totale lisensies',
@@ -230,6 +259,7 @@
'users' => 'gebruikers',
'viewall' => 'View All',
'viewassets' => 'Bekyk Toegewysde Bates',
'viewassetsfor' => 'View Assets for :name',
'website' => 'webwerf',
'welcome' => 'Welkom, naam',
'years' => 'jaar',
@@ -243,8 +273,78 @@
'accept' => 'Accept :asset',
'i_accept' => 'I accept',
'i_decline' => 'I decline',
'accept_decline' => 'Accept/Decline',
'sign_tos' => 'Sign below to indicate that you agree to the terms of service:',
'clear_signature' => 'Clear Signature',
'show_help' => 'Show help',
'hide_help' => 'Hide help',
];
'view_all' => 'view all',
'hide_deleted' => 'Hide Deleted',
'email' => 'Email',
'do_not_change' => 'Do Not Change',
'bug_report' => 'Report a Bug',
'user_manual' => 'User\'s Manual',
'setup_step_1' => 'Step 1',
'setup_step_2' => 'Step 2',
'setup_step_3' => 'Step 3',
'setup_step_4' => 'Step 4',
'setup_config_check' => 'Configuration Check',
'setup_create_database' => 'Create Database Tables',
'setup_create_admin' => 'Create Admin User',
'setup_done' => 'Finished!',
'bulk_edit_about_to' => 'You are about to edit the following: ',
'checked_out' => 'Checked Out',
'checked_out_to' => 'Checked out to',
'fields' => 'Fields',
'last_checkout' => 'Last Checkout',
'due_to_checkin' => 'The following :count items are due to be checked in soon:',
'expected_checkin' => 'Expected Checkin',
'reminder_checked_out_items' => 'This is a reminder of the items currently checked out to you. If you feel this list is inaccurate (something is missing, or something appears here that you believe you never received), please email :reply_to_name at :reply_to_address.',
'changed' => 'Changed',
'to' => 'To',
'report_fields_info' => '<p>Select the fields you would like to include in your custom report, and click Generate. The file (custom-asset-report-YYYY-mm-dd.csv) will download automatically, and you can open it in Excel.</p>
<p>If you would like to export only certain assets, use the options below to fine-tune your results.</p>',
'range' => 'Range',
'bom_remark' => 'Add a BOM (byte-order mark) to this CSV',
'improvements' => 'Improvements',
'information' => 'Information',
'permissions' => 'Permissions',
'managed_ldap' => '(Managed via LDAP)',
'export' => 'Export',
'ldap_sync' => 'LDAP Sync',
'ldap_user_sync' => 'LDAP User Sync',
'synchronize' => 'Synchronize',
'sync_results' => 'Synchronization Results',
'license_serial' => 'Serial/Product Key',
'invalid_category' => 'Invalid category',
'dashboard_info' => 'This is your dashboard. There are many like it, but this one is yours.',
'60_percent_warning' => '60% Complete (warning)',
'dashboard_empty' => 'It looks like you haven not added anything yet, so we do not have anything awesome to display. Get started by adding some assets, accessories, consumables, or licenses now!',
'new_asset' => 'New Asset',
'new_license' => 'New License',
'new_accessory' => 'New Accessory',
'new_consumable' => 'New Consumable',
'collapse' => 'Collapse',
'assigned' => 'Assigned',
'asset_count' => 'Asset Count',
'accessories_count' => 'Accessories Count',
'consumables_count' => 'Consumables Count',
'components_count' => 'Components Count',
'licenses_count' => 'Licenses Count',
'notification_error' => 'Error:',
'notification_error_hint' => 'Please check the form below for errors',
'notification_success' => 'Success:',
'notification_warning' => 'Warning:',
'notification_info' => 'Info:',
'asset_information' => 'Asset Information',
'model_name' => 'Model Name:',
'asset_name' => 'Asset Name:',
'consumable_information' => 'Consumable Information:',
'consumable_name' => 'Consumable Name:',
'accessory_information' => 'Accessory Information:',
'accessory_name' => 'Accessory Name:',
'clone_item' => 'Clone Item',
'checkout_tooltip' => 'Check this item out',
'checkin_tooltip' => 'Check this item in',
'checkout_user_tooltip' => 'Check this item out to a user',
];

View File

@@ -1,6 +1,6 @@
<?php
return array(
return [
/*
|--------------------------------------------------------------------------
@@ -13,9 +13,9 @@ return array(
|
*/
"more_info_title" => "More Info",
'more_info_title' => 'More Info',
"audit_help" => "Checking this box will edit the asset record to reflect this new location. Leaving it unchecked will simply note the location in the audit log.<br><br>Note that is this asset is checked out, it will not change the location of the person, asset or location it is checked out to.",
'audit_help' => 'Checking this box will edit the asset record to reflect this new location. Leaving it unchecked will simply note the location in the audit log.<br><br>Note that is this asset is checked out, it will not change the location of the person, asset or location it is checked out to.',
'assets' => 'Assets are items tracked by serial number or asset tag. They tend to be higher value items where identifying a specific item matters.',
@@ -31,6 +31,4 @@ return array(
'depreciations' => 'You can set up asset depreciations to depreciate assets based on straight-line depreciation.',
);
];

View File

@@ -1,6 +1,6 @@
<?php
return array(
return [
'a_user_canceled' => '\'N Gebruiker het \'n itemversoek op die webwerf gekanselleer',
'a_user_requested' => '\'N Gebruiker het \'n item op die webwerf versoek',
'accessory_name' => 'Toebehore Naam:',
@@ -59,7 +59,7 @@ return array(
'test_mail_text' => 'Dit is \'n toets van die Snipe-IT Batebestuurstelsel. As jy dit het, werk die pos :)',
'the_following_item' => 'Die volgende item is nagegaan:',
'low_inventory_alert' => 'There is :count item that is below minimum inventory or will soon be low.|There are :count items that are below minimum inventory or will soon be low.',
'assets_warrantee_alert' => 'There is :count asset with a warrantee expiring in the next :threshold days.|There are :count assets with warrantees expiring in the next :threshold days.',
'assets_warrantee_alert' => 'There is :count asset with a warranty expiring in the next :threshold days.|There are :count assets with warranties expiring in the next :threshold days.',
'license_expiring_alert' => 'There is :count license expiring in the next :threshold days.|There are :count licenses expiring in the next :threshold days.',
'to_reset' => 'Om jou webadres te herstel, voltooi hierdie vorm:',
'type' => 'tipe',
@@ -75,5 +75,5 @@ return array(
'Expected_Checkin_Report' => 'Expected asset checkin report',
'Expected_Checkin_Notification' => 'Reminder: :name checkin deadline approaching',
'Expected_Checkin_Date' => 'An asset checked out to you is due to be checked back in on :date',
'your_assets' => 'View Your Assets'
);
'your_assets' => 'View Your Assets',
];

View File

@@ -4,4 +4,3 @@ return [
'sent' => 'Jou wagwoord skakel is gestuur!',
'user' => 'No matching active user found with that email.',
];

View File

@@ -1,6 +1,6 @@
<?php
return array(
return [
/*
|--------------------------------------------------------------------------
@@ -64,6 +64,7 @@ return array(
'string' => 'Die: kenmerk moet ten minste wees: min karakters.',
'array' => 'Die: Attribuut moet ten minste: min items hê.',
],
'starts_with' => 'The :attribute must start with one of the following: :values.',
'not_in' => 'Die gekose: attribuut is ongeldig.',
'numeric' => 'Die: Attribuut moet \'n nommer wees.',
'present' => 'Die: attribuut veld moet teenwoordig wees.',
@@ -88,8 +89,8 @@ return array(
'unique' => 'Die: Attribuut is reeds geneem.',
'uploaded' => 'Die: kenmerk kon nie opgelaai word nie.',
'url' => 'Die: Attribuutformaat is ongeldig.',
"unique_undeleted" => "The :attribute must be unique.",
"non_circular" => "The :attribute must not create a circular reference.",
'unique_undeleted' => 'The :attribute must be unique.',
'non_circular' => 'The :attribute must not create a circular reference.',
/*
|--------------------------------------------------------------------------
@@ -102,7 +103,6 @@ return array(
|
*/
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
@@ -115,11 +115,11 @@ return array(
*/
'custom' => [
'alpha_space' => "Die: attribuut veld bevat 'n karakter wat nie toegelaat word nie.",
"email_array" => "Een of meer e-posadresse is ongeldig.",
"hashed_pass" => "Jou huidige wagwoord is verkeerd",
'alpha_space' => 'Die: attribuut veld bevat \'n karakter wat nie toegelaat word nie.',
'email_array' => 'Een of meer e-posadresse is ongeldig.',
'hashed_pass' => 'Jou huidige wagwoord is verkeerd',
'dumbpwd' => 'Daardie wagwoord is te algemeen.',
"statuslabel_type" => "U moet 'n geldige statusetiket tipe kies",
'statuslabel_type' => 'U moet \'n geldige statusetiket tipe kies',
],
/*
@@ -135,4 +135,4 @@ return array(
'attributes' => [],
);
];

View File

@@ -5,17 +5,17 @@
'delete' => [
'confirm' => 'Are you sure you wish to delete this asset maintenance?',
'error' => 'There was an issue deleting the asset maintenance. Please try again.',
'success' => 'The asset maintenance was deleted successfully.'
'success' => 'The asset maintenance was deleted successfully.',
],
'create' => [
'error' => 'Asset Maintenance was not created, please try again.',
'success' => 'Asset Maintenance created successfully.'
'success' => 'Asset Maintenance created successfully.',
],
'edit' => [
'error' => 'Asset Maintenance was not edited, please try again.',
'success' => 'Asset Maintenance edited successfully.'
'success' => 'Asset Maintenance edited successfully.',
],
'asset_maintenance_incomplete' => 'Not Completed Yet',
'warranty' => 'Warranty',
'not_warranty' => 'Not Warranty',
];
];

View File

@@ -4,5 +4,5 @@
'title' => 'Asset Maintenance',
'asset_name' => 'Asset Name',
'is_warranty' => 'Warranty',
'dl_csv' => 'Download CSV'
'dl_csv' => 'Download CSV',
];

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