Compare commits

...

125 Commits

Author SHA1 Message Date
snipe 8d0fda88b7 Tagged 8.4.0 release
# Conflicts:
#	config/version.php
2026-02-23 20:41:11 +00:00
snipe 9188f89a2a Tagged v8.4.0 2026-02-23 20:40:40 +00:00
snipe 91a95dbc66 Merge remote-tracking branch 'origin/develop' 2026-02-23 14:44:08 +00:00
snipe a86ffc29d1 Added display name to search term in advanced search 2026-02-23 14:43:55 +00:00
snipe a15adc806b Merge remote-tracking branch 'origin/develop' 2026-02-23 14:30:54 +00:00
snipe 9ed5540c49 Merge pull request #18597 from uberbrady/improve_ldap_binding
Improve LDAP escaping to better reflect modern PHP standards
2026-02-23 13:38:28 +00:00
Brady Wetherington 3a7e00ccc3 Improve LDAP escaping to better reflect modern PHP standards 2026-02-23 13:01:00 +00:00
snipe f328da37bc Merge remote-tracking branch 'origin/develop' 2026-02-23 11:41:54 +00:00
snipe f82cdabccd More info anel refinements 2026-02-23 11:41:45 +00:00
snipe b9c9cc0046 Merge pull request #18596 from grokability/add-with-trashed-to-formattednamelink
Adds withTrashed() to `adminuser` and updates presenter to show strikethrough
2026-02-23 11:00:43 +00:00
snipe 27ece84d52 Adds withTrashed() to adminuser and updates presenter to show strikethrough 2026-02-23 10:49:44 +00:00
snipe 3adc8f279b Merge remote-tracking branch 'origin/develop' 2026-02-21 13:17:52 +00:00
snipe 1299186fb8 Merge pull request #18591 from grokability/#18017-show-more-info-in-bulk-audit
Fixed #18017 - show status on bulk audit
2026-02-21 13:17:31 +00:00
snipe d837e4845b Show note 2026-02-21 13:16:58 +00:00
snipe 39be0c5590 Fixed #18017 - show status on bulk audit 2026-02-21 13:08:23 +00:00
snipe 41c75022a9 Merge remote-tracking branch 'origin/develop' 2026-02-21 12:53:42 +00:00
snipe d2bb10e96d Merge pull request #18590 from grokability/optionally-update-audit-dates
Added checkbox to determine if existing audit dates should be changed
2026-02-21 12:53:12 +00:00
snipe f139a616c7 Added checkbox to determine if existing audit dates should be changed 2026-02-21 12:49:36 +00:00
snipe 84924a68b7 Merge remote-tracking branch 'origin/develop' 2026-02-20 15:01:15 +00:00
snipe d5099d973b Move copy icon to right side 2026-02-20 15:00:04 +00:00
snipe 82b18a3207 Updated requestable icon 2026-02-20 14:15:50 +00:00
snipe 5a3a63e0a4 Merge remote-tracking branch 'origin/develop' 2026-02-20 13:10:55 +00:00
snipe 10aee6bb5f Fixed tab pane name 2026-02-20 13:10:14 +00:00
snipe 980cc5704f Switched branch name to master 2026-02-20 13:08:23 +00:00
snipe 28054a9112 Merge remote-tracking branch 'origin/develop' 2026-02-20 13:07:33 +00:00
snipe c1b11ab9bf Small fixes for accessories/checkedout tab 2026-02-20 13:05:31 +00:00
snipe c226a061f5 Tagged pre-release 2026-02-20 12:42:09 +00:00
snipe c0be738aef Removed unneeded return check 2026-02-20 12:13:01 +00:00
snipe 7a312f5868 Merge remote-tracking branch 'origin/develop' 2026-02-20 12:12:04 +00:00
snipe e6987ec148 Early return on non-existent acceptance 2026-02-20 12:11:49 +00:00
snipe 973fa7a58b Merge pull request #18575 from spencerrlongg/encrypted-custom-fields-api
Adds field_encrypted To Fields API Response
2026-02-20 12:11:00 +00:00
snipe 5ce493180d Merge remote-tracking branch 'origin/develop' 2026-02-20 11:56:33 +00:00
snipe b6195ba3ae Default active tab fix 2026-02-20 11:56:23 +00:00
snipe d3bd213f29 Fixed typo in tooltip text 2026-02-20 09:49:06 +00:00
snipe bbdc78a13c Merge remote-tracking branch 'origin/develop' 2026-02-20 09:36:48 +00:00
snipe 9502dd8bd7 Back out :class 2026-02-20 09:36:38 +00:00
snipe 43971b9625 Merge remote-tracking branch 'origin/develop' 2026-02-19 19:15:59 +00:00
snipe 3c3ccae7c9 Allow context overwrites in FCO specific tables 2026-02-19 19:14:26 +00:00
snipe f27a3a2c61 Build prod JS assets 2026-02-19 15:13:19 +00:00
snipe b96d0d55c9 Merge remote-tracking branch 'origin/develop' 2026-02-19 15:12:52 +00:00
snipe 9789ca42f8 Highlight inventory in red if below min 2026-02-19 15:11:27 +00:00
snipe da26bc5165 Updated JS assets 2026-02-19 14:55:45 +00:00
snipe 0b67626961 Merge pull request #18580 from grokability/fixes-for-alert-menu
Quick fix for alert menu 1001 queries
2026-02-19 14:54:50 +00:00
snipe 546c8ce7d5 Quick fix for alert menu 1001 queries 2026-02-19 14:52:01 +00:00
snipe c76a888d11 Merge pull request #18579 from uberbrady/fix_npm_install_jspdf
Careful upgrade to minimize too many version changes
2026-02-19 14:25:34 +00:00
Brady Wetherington 38c495a4ac Careful upgrade to minimize too many version changes 2026-02-19 14:11:15 +00:00
snipe f699935f5f Merge remote-tracking branch 'origin/develop' 2026-02-19 12:05:17 +00:00
snipe d0ce5e0c57 Merge pull request #18578 from grokability/#18435-fixed-currency-selection-selectbox
Fixed #18435 - correct option value for currency format selector
2026-02-19 12:05:01 +00:00
snipe 7a0e5b57db Fixed currency selector 2026-02-19 12:01:56 +00:00
snipe 8336cf5baa Merge remote-tracking branch 'origin/develop' 2026-02-19 11:42:54 +00:00
snipe c31f1d2cce Nicer row selected color 2026-02-19 11:42:45 +00:00
snipe d3d90abba7 Merge remote-tracking branch 'origin/develop' 2026-02-19 11:31:05 +00:00
snipe ea98ee07e5 Fixed #18577 - set url back parameter as default in form component 2026-02-19 11:30:53 +00:00
snipe a38bfada57 Merge pull request #18572 from uberbrady/fix_cross_company_created_by_in_asset_acceptance
Fixed #18571 - fix cross-company created_by in asset acceptance
2026-02-19 11:24:28 +00:00
snipe bdaf13da4c Merge remote-tracking branch 'origin/develop'
# Conflicts:
#	resources/views/maintenances/view.blade.php
2026-02-19 11:11:18 +00:00
snipe e5ff19aec4 Fixd required field color 2026-02-19 11:02:12 +00:00
spencerrlongg 65e6519f97 adds field_encrypted to fields api response 2026-02-18 17:53:04 -06:00
snipe e92e550e9c Null operator for maintenances 2026-02-18 16:32:40 +00:00
snipe b751fe7903 Fixed incorrect translation string 2026-02-18 16:30:37 +00:00
snipe a6e34522eb Partially convert maintenances into new blade components 2026-02-18 16:26:13 +00:00
snipe 735e6f3471 Merge pull request #18570 from grokability/convert-consumables-to-new-blade-components
Converted consumables to new blade component
2026-02-18 16:02:32 +00:00
snipe c9f41c950a Added copy+paste, added additional fields 2026-02-18 15:57:40 +00:00
Brady Wetherington 091c710940 Make User parameter nullable 2026-02-18 15:25:05 +00:00
snipe 276f412a3c Small tweaks to info panel 2026-02-18 15:22:46 +00:00
snipe 6f6e5c847a Converted consumables to new blade component 2026-02-18 14:44:08 +00:00
snipe 6ef0274bb3 Merge pull request #18569 from grokability/updated-csvs
Small importer improvements, added larger CSV samples
2026-02-18 14:22:23 +00:00
snipe 7ef6a72ec4 Updated CSVs 2026-02-18 14:06:33 +00:00
snipe e2b8c69cf6 Use iconhelper for dynamic icon 2026-02-18 14:06:24 +00:00
snipe 1254d12d83 Tweaks to info panel 2026-02-18 14:06:14 +00:00
snipe b68642a827 Added alias strings 2026-02-18 14:04:51 +00:00
snipe c5214b976b Added string 2026-02-18 14:04:44 +00:00
snipe e611121244 Added tag color to main importer, added aliases 2026-02-18 14:04:38 +00:00
snipe 3aa7f0b7fe Added tag_color to importer 2026-02-18 14:04:19 +00:00
snipe 3d38eee71d Added/updated icons 2026-02-18 14:04:00 +00:00
snipe 90e6e309f9 Removed redundant icon helper 2026-02-18 14:03:53 +00:00
snipe 885314b87a Added large components sample CSV 2026-02-18 12:01:59 +00:00
snipe ef013a7026 Updated components sample 2026-02-18 12:01:48 +00:00
snipe 0353ade90e Trim off whitespace for headers 2026-02-18 12:01:34 +00:00
snipe d90c9282ac Updated strings 2026-02-18 11:13:52 +00:00
snipe d56970eaa3 Merge pull request #18566 from grokability/fixed-new-vs-update-on-custom-fieldset-creation
Fixed new vs update button label on custom fieldset creation, fixed breadcrumbs on new custom fieldset creation screen
2026-02-17 22:23:06 +00:00
snipe 8b3f18ec59 Better breadcrumbs for fieldset creation 2026-02-17 22:17:38 +00:00
snipe 170d20ddb5 Fixed new vs update button on custom fieldset create vs edit 2026-02-17 22:17:27 +00:00
snipe 70407dac85 Merge pull request #18565 from grokability/#18555-component-clone
Added #18555 - ability to clone components
2026-02-17 16:22:02 +00:00
snipe c2334d87de Merge pull request #18564 from uberbrady/fix_component_counts
Fixed #18557 - Tweak numRemaining to not re-query for un-checked-out components
2026-02-17 15:44:00 +00:00
snipe 0662e3351e Added #18555 - ability to clone components 2026-02-17 15:43:43 +00:00
Brady Wetherington 6b90b3743e Tweak numRemaining to not re-query for un-checked-out components 2026-02-17 15:27:04 +00:00
snipe dd1d456106 Alphabetize dictionary 2026-02-17 15:21:24 +00:00
snipe dceead8302 Show footer by default if the transformer asks for it 2026-02-17 15:09:29 +00:00
snipe 832f449868 Merge pull request #18561 from grokability/#18512-comment-out-first-checkout
Fixes #18512 (first checkout) temporarily
2026-02-17 14:18:05 +00:00
snipe 33a104f142 Fixes #18512 temporarily 2026-02-17 14:11:14 +00:00
snipe 28f19689ec Fixed focus color for input fields 2026-02-17 13:38:43 +00:00
snipe ce6ee32e89 Made seats a numeric field 2026-02-17 13:38:29 +00:00
snipe fdf42ba321 Add class to checkedout blade 2026-02-17 13:18:27 +00:00
snipe aadd158108 Added active class to accessory tab 2026-02-17 13:18:14 +00:00
snipe d6592819e8 Show only active licenses 2026-02-17 13:17:49 +00:00
snipe 8f34c06196 Added order_number to API for accessories, consumables, components 2026-02-17 13:08:09 +00:00
snipe 9cdc73917b Merge pull request #18537 from grokability/more-refactoring-tables-and-tabs
WIP - More refactoring of tabs, tab panes, and tables
2026-02-17 12:39:31 +00:00
snipe 2976159499 Check for parent (only really matters in locations) 2026-02-17 12:32:07 +00:00
snipe e302ccf985 Added plain clone translation 2026-02-17 12:31:35 +00:00
snipe 08915e8607 Use isDeletable in transformers 2026-02-17 12:31:26 +00:00
snipe 32b2131bff Fixed asset model deletable check 2026-02-17 12:31:12 +00:00
snipe 50cf15fb71 Added isDeletable() method 2026-02-17 12:31:01 +00:00
snipe f07ef6d7c5 Added restore and clone blade 2026-02-17 12:28:48 +00:00
snipe 666025d7f6 Use more generic text 2026-02-17 12:28:27 +00:00
snipe 671601365c Use new button blade components 2026-02-17 12:28:16 +00:00
snipe 263b04cd69 Merge pull request #13506 from matmair/develop-1
Fixed: wrong index reference in MoveUploadsToNewDisk.php
2026-02-17 11:08:24 +00:00
snipe 57b98ca782 Fixed copypasta 2026-02-13 19:03:44 +00:00
snipe 46df19d7cd Don’t use fixed columns on unaccepted asset report 2026-02-13 18:27:18 +00:00
snipe fa18524223 Fixed unaccepted report to account for much older items that might not exist 2026-02-13 18:23:59 +00:00
snipe 3ebc0532ca Added isDeleteable to Accessories 2026-02-13 18:07:22 +00:00
snipe 4f59752b8b Added rtd tab icon 2026-02-13 17:30:11 +00:00
snipe 668ab221cc Removed uploads for manufacturers since we don’t have them? 2026-02-13 17:29:56 +00:00
snipe ad90e005c4 Added history tabs 2026-02-13 17:28:07 +00:00
snipe 952b3d6884 Converted components view to blade component
This effing sucked
2026-02-13 17:27:45 +00:00
snipe 19ca1f7578 Converted to object-specific elements in indexes 2026-02-13 17:27:14 +00:00
snipe ef02fab94b Added checkout blade 2026-02-13 17:22:35 +00:00
snipe 144b5e7558 Switch to accessory table on accessory view 2026-02-13 17:22:22 +00:00
snipe aff0a60138 Added presenter for component history 2026-02-13 17:22:07 +00:00
snipe 92a641f01a Added snipe_component because wtf laravel 2026-02-13 17:21:59 +00:00
snipe 5b6951b88d Tightened up licenses index list 2026-02-11 15:22:58 +00:00
snipe 56313e4436 Covert assets table 2026-02-11 14:54:30 +00:00
snipe 7810ae74d1 Fixed translation string 2026-02-11 14:30:42 +00:00
snipe 3ac1012757 Set fixed number for assets 2026-02-11 14:30:32 +00:00
snipe 91aec08ce0 More refactoring of tabs, tab panes, and tables 2026-02-11 13:18:32 +00:00
Matthias Mair 68dad1d3ae fixed wrong index reference in MoveUploadsToNewDisk.php
usage of undefined reference fixed
2023-08-22 20:39:21 +02:00
1006 changed files with 17185 additions and 131601 deletions
@@ -113,7 +113,7 @@ class MoveUploadsToNewDisk extends Command
$filename = basename($private_upload[$x]);
try {
Storage::put($private_type . '/' . $filename, file_get_contents($private_upload[$i]));
Storage::put($private_type . '/' . $filename, file_get_contents($private_upload[$x]));
$new_url = Storage::url($private_type . '/' . $filename, $filename);
$this->info($type_count . '. PRIVATE: ' . $filename . ' was copied to ' . $new_url);
} catch (\Exception $e) {
+3 -40
View File
@@ -775,11 +775,11 @@ class Helper
public static function checkLowInventory()
{
$alert_threshold = \App\Models\Setting::getSettings()->alert_threshold;
$consumables = Consumable::withCount('consumableAssignments as consumable_assignments_count')->whereNotNull('min_amt')->get();
$consumables = Consumable::withCount('consumableAssignments as consumables_users_count')->whereNotNull('min_amt')->get();
$accessories = Accessory::withCount('checkouts as checkouts_count')->whereNotNull('min_amt')->get();
$components = Component::whereNotNull('min_amt')->get();
$components = Component::withCount('assets as sum_unconstrained_assets')->whereNotNull('min_amt')->get();
$asset_models = AssetModel::where('min_amt', '>', 0)->withCount(['availableAssets', 'assets'])->get();
$licenses = License::where('min_amt', '>', 0)->get();
$licenses = License::withCount('availCount as licenses_available')->where('min_amt', '>', 0)->get();
$items_array = [];
$all_count = 0;
@@ -1404,43 +1404,6 @@ class Helper
}
/**
* Generic helper (largely used by livewire right now) that returns the font-awesome icon
* for the object type.
*
* @author A. Gianotto <snipe@snipe.net>
* @since 6.1.0
*
* @return string
*/
public static function iconTypeByItem($item) {
switch ($item) {
case 'asset':
return 'fas fa-barcode';
case 'accessory':
return 'fas fa-keyboard';
case 'component':
return 'fas fa-hdd';
case 'consumable':
return 'fas fa-tint';
case 'license':
return 'far fa-save';
case 'location':
return 'fas fa-map-marker-alt';
case 'user':
return 'fas fa-user';
case 'supplier':
return 'fa-solid fa-store';
case 'manufacturer':
return 'fa-solid fa-building';
case 'category':
return 'fa-solid fa-table-columns';
}
}
/*
* This is a shorter way to see if the app is in demo mode.
*
+8 -1
View File
@@ -36,6 +36,8 @@ class IconHelper
return 'fa-solid fa-user';
case 'users':
return 'fas fa-users';
case 'supplier':
return 'fa-solid fa-store';
case 'restore':
return 'fa-solid fa-trash-arrow-up';
case 'external-link':
@@ -87,8 +89,11 @@ class IconHelper
case 'licenses':
case 'license':
return 'far fa-save';
case 'requests':
case 'requestable':
return 'fas fa-laptop';
case 'request':
case 'requested':
return 'fa-solid fa-bell-concierge';
case 'reports':
return 'fas fa-chart-bar';
case 'heart':
@@ -254,6 +259,8 @@ class IconHelper
case 'min-qty':
return 'fa-solid fa-chart-pie';
}
}
}
@@ -74,16 +74,16 @@ class AcceptanceController extends Controller
*/
public function store(Request $request, $id) : RedirectResponse
{
$acceptance = CheckoutAcceptance::find($id);
if (!$acceptance = CheckoutAcceptance::find($id)) {
return redirect()->route('account.accept')->with('error', trans('admin/hardware/message.does_not_exist'));
}
$assigned_user = User::find($acceptance->assigned_to_id);
$settings = Setting::getSettings();
$sig_filename='';
if (is_null($acceptance)) {
return redirect()->route('account.accept')->with('error', trans('admin/hardware/message.does_not_exist'));
}
if (! $acceptance->isPending()) {
return redirect()->route('account.accept')->with('error', trans('admin/users/message.error.asset_already_accepted'));
}
@@ -53,6 +53,7 @@ class AccessoriesController extends Controller
'company_id',
'notes',
'checkouts_count',
'order_number',
'qty',
// These are *relationships* so we wouldn't normally include them in this array,
// since they would normally create a `column not found` error,
@@ -91,6 +92,10 @@ class AccessoriesController extends Controller
$accessories->where('accessories.company_id', '=', $request->input('company_id'));
}
if ($request->filled('order_number')) {
$accessories->where('accessories.order_number', '=', $request->input('order_number'));
}
if ($request->filled('category_id')) {
$accessories->where('category_id', '=', $request->input('category_id'));
}
+12 -10
View File
@@ -154,15 +154,15 @@ class AssetsController extends Controller
}
$assets = Asset::select('assets.*')
->addSelect([
'first_checkout_at' => Actionlog::query()
->select('created_at')
->whereColumn('item_id', 'assets.id')
->where('item_type', Asset::class)
->where('action_type', 'checkout')
->orderBy('created_at')
->limit(1),
])
// ->addSelect([
// 'first_checkout_at' => Actionlog::query()
// ->select('created_at')
// ->whereColumn('item_id', 'assets.id')
// ->where('item_type', Asset::class)
// ->where('action_type', 'checkout')
// ->orderBy('created_at')
// ->limit(1),
// ])
->with(
'model',
'location',
@@ -1148,7 +1148,9 @@ class AssetsController extends Controller
$payload = [
'id' => $asset->id,
'asset_tag' => $asset->asset_tag,
'note' => $request->input('note'),
'note' => e($request->input('note')),
'status_label' => e($asset->assetstatus->display_name),
'status_type' => $asset->assetstatus->getStatuslabelType(),
'next_audit_date' => Helper::getFormattedDateObject($asset->next_audit_date),
];
@@ -87,6 +87,10 @@ class ComponentsController extends Controller
$components->where('components.company_id', '=', $request->input('company_id'));
}
if ($request->filled('order_number')) {
$components->where('components.order_number', '=', $request->input('order_number'));
}
if ($request->filled('category_id')) {
$components->where('category_id', '=', $request->input('category_id'));
}
@@ -86,6 +86,10 @@ class ConsumablesController extends Controller
$consumables->where('consumables.company_id', '=', $request->input('company_id'));
}
if ($request->filled('order_number')) {
$consumables->where('consumables.order_number', '=', $request->input('order_number'));
}
if ($request->filled('category_id')) {
$consumables->where('category_id', '=', $request->input('category_id'));
}
@@ -32,7 +32,7 @@ class LicensesController extends Controller
$licenses->ExpiredLicenses();
} elseif ($request->input('status')=='expiring') {
$licenses->ExpiringLicenses($settings->alert_interval);
} else {
} elseif ($request->input('status')=='active') {
$licenses->ActiveLicenses();
}
@@ -7,8 +7,8 @@ use App\Http\Requests\ImageUploadRequest;
use App\Models\Company;
use App\Models\Component;
use App\Helpers\Helper;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Input;
use Illuminate\Contracts\View\View;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Log;
@@ -226,6 +226,20 @@ class ComponentsController extends Controller
public function show(Component $component)
{
$this->authorize('view', $component);
return view('components/view', compact('component'));
return view('components/view', compact('component'))->with('snipe_component', $component);
}
public function getClone(Component $component) : View | RedirectResponse
{
$this->authorize('create', Component::class);
$cloned_component = clone $component;
$cloned_component->id = null;
$cloned_component->deleted_at = null;
// Show the page
return view('components/edit')
->with('item', $cloned_component)
->with('component', $cloned_component);
}
}
+13 -14
View File
@@ -403,24 +403,23 @@ class SettingsController extends Controller
return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error'));
}
// Check if the audit interval has changed - if it has, we want to update ALL of the assets audit dates
if ($request->input('audit_interval') != $setting->audit_interval) {
// This could be a negative number if the user is trying to set the audit interval to a lower number than it was before
$audit_diff_months = ((int)$request->input('audit_interval') - (int)($setting->audit_interval));
// Check if the audit interval has changed - if it has, check if we should update all of the assets audit dates
if ((($request->input('audit_interval') != $setting->audit_interval)) && ($request->input('update_existing_dates') == 1)) {
// Batch update the dates. We have to use this method to avoid time limit exceeded errors on very large datasets,
// but it DOES mean this change doesn't get logged in the action logs, since it skips the observer.
// @see https://stackoverflow.com/questions/54879160/laravel-observer-not-working-on-bulk-insert
$affected = Asset::whereNotNull('next_audit_date')
->whereNull('deleted_at')
->update(
['next_audit_date' => DB::raw('DATE_ADD(next_audit_date, INTERVAL '.$audit_diff_months.' MONTH)')]
);
Log::debug($affected .' assets affected by audit interval update');
// This could be a negative number if the user is trying to set the audit interval to a lower number than it was before
$audit_diff_months = ((int)$request->input('audit_interval') - (int)($setting->audit_interval));
// Batch update the dates. We have to use this method to avoid time limit exceeded errors on very large datasets,
// but it DOES mean this change doesn't get logged in the action logs, since it skips the observer.
// @see https://stackoverflow.com/questions/54879160/laravel-observer-not-working-on-bulk-insert
$affected = Asset::whereNotNull('next_audit_date')
->whereNull('deleted_at')
->update(
['next_audit_date' => DB::raw('DATE_ADD(next_audit_date, INTERVAL ' . $audit_diff_months . ' MONTH)')]
);
Log::debug($affected . ' assets affected by audit interval update');
}
$alert_email = rtrim($request->input('alert_email'), ',');
+1 -1
View File
@@ -104,7 +104,7 @@ class AssetsTransformer
'next_audit_date' => Helper::getFormattedDateObject($asset->next_audit_date, 'date'),
'deleted_at' => Helper::getFormattedDateObject($asset->deleted_at, 'datetime'),
'purchase_date' => Helper::getFormattedDateObject($asset->purchase_date, 'date'),
'first_checkout' => Helper::getFormattedDateObject($asset->first_checkout_at, 'datetime'),
// 'first_checkout' => Helper::getFormattedDateObject($asset->first_checkout_at, 'datetime'),
'age' => $asset->purchase_date ? $asset->purchase_date->locale(app()->getLocale())->diffForHumans() : '',
'last_checkout' => Helper::getFormattedDateObject($asset->last_checkout, 'datetime'),
'last_checkin' => Helper::getFormattedDateObject($asset->last_checkin, 'datetime'),
@@ -74,6 +74,7 @@ class ComponentsTransformer
'checkout' => Gate::allows('checkout', Component::class),
'checkin' => Gate::allows('checkin', Component::class),
'update' => Gate::allows('update', Component::class),
'clone' => Gate::allows('create', Component::class),
'delete' => $component->isDeletable(),
];
$array += $permissions_array;
@@ -44,6 +44,7 @@ class CustomFieldsTransformer
'db_column_name' => e($field->db_column_name()),
'format' => e($field->format),
'field_values' => ($field->field_values) ? e($field->field_values) : null,
'field_encrypted' => $field->field_encrypted,
'field_values_array' => ($field->field_values) ? explode("\r\n", e($field->field_values)) : null,
'type' => e($field->element),
'required' => (($field->pivot) && ($field->pivot->required=='1')) ? true : false,
@@ -40,7 +40,7 @@ class StatuslabelsTransformer
$permissions_array['available_actions'] = [
'update' => Gate::allows('update', Statuslabel::class) ? true : false,
'delete' => (Gate::allows('delete', Statuslabel::class) && ($statuslabel->assets_count == 0)) ? true : false,
'delete' => (Gate::allows('delete', Statuslabel::class) && ($statuslabel->isDeletable())) ? true : false,
];
$array += $permissions_array;
@@ -56,7 +56,7 @@ class SuppliersTransformer
$permissions_array['available_actions'] = [
'update' => Gate::allows('update', Supplier::class),
'delete' => (Gate::allows('delete', Supplier::class) && ($supplier->assets_count == 0) && ($supplier->licenses_count == 0) && ($supplier->accessories_count == 0)),
'delete' => (Gate::allows('delete', Supplier::class) && ($supplier->isDeletable())),
];
$array += $permissions_array;
+1
View File
@@ -70,6 +70,7 @@ class CategoryImporter extends ItemImporter
$this->item['use_default_eula'] = trim(($this->fetchHumanBoolean($this->findCsvMatch($row, 'use_default_eula'))) == 1) ? 1 : 0;
$this->item['require_acceptance'] = trim(($this->fetchHumanBoolean($this->findCsvMatch($row, 'require_acceptance'))) == 1) ? 1 : 0;
$this->item['checkin_email'] = trim(($this->fetchHumanBoolean($this->findCsvMatch($row, 'checkin_email'))) == 1) ? 1 : 0;
$this->item['tag_color'] = trim($this->findCsvMatch($row, 'tag_color'));
Log::debug('Item array is: ');
+1
View File
@@ -72,6 +72,7 @@ class ManufacturerImporter extends ItemImporter
$this->item['support_url'] = trim($this->findCsvMatch($row, 'support_url'));
$this->item['warranty_lookup_url'] = trim($this->findCsvMatch($row, 'warranty_lookup_url'));
$this->item['notes'] = trim($this->findCsvMatch($row, 'notes'));
$this->item['tag_color'] = trim($this->findCsvMatch($row, 'tag_color'));
Log::debug('Item array is: ');
+1
View File
@@ -76,6 +76,7 @@ class SupplierImporter extends ItemImporter
$this->item['contact'] = trim($this->findCsvMatch($row, 'contact'));
$this->item['url'] = trim($this->findCsvMatch($row, 'url'));
$this->item['notes'] = trim($this->findCsvMatch($row, 'notes'));
$this->item['tag_color'] = trim($this->findCsvMatch($row, 'tag_color'));
Log::debug('Item array is: ');
+41 -17
View File
@@ -150,10 +150,15 @@ class Importer extends Component
// if you got here, we didn't find a match. Try the $aliases_fields
foreach ($this->aliases_fields as $key => $alias_values) {
foreach ($alias_values as $alias_value) {
// Trim off any trailing spaces
$key = trim($key);
$header = trim($header);
if (strcasecmp($alias_value, $header) === 0) { // aLsO CaSe-INSENSitiVE!
// Make *absolutely* sure that this key actually _exists_ in this import type -
// you can trigger this by importing accessories with a 'Warranty' column (which don't exist
// in "Accessories"!)
if (array_key_exists($key, $this->columnOptions[$type])) {
$this->field_map[$i] = $key;
continue 3; // bust out of both of these loops and the surrounding one - e.g. move on to the next header
@@ -262,7 +267,7 @@ class Importer extends Component
'order_number' => trans('general.order_number'),
'purchase_cost' => trans('general.purchase_cost'),
'purchase_date' => trans('general.purchase_date'),
'quantity' => trans('general.qty'),
'qty' => trans('general.qty'),
'supplier' => trans('general.supplier'),
];
@@ -278,7 +283,7 @@ class Importer extends Component
'order_number' => trans('general.order_number'),
'purchase_cost' => trans('general.purchase_cost'),
'purchase_date' => trans('general.purchase_date'),
'quantity' => trans('general.qty'),
'qty' => trans('general.qty'),
'serial' => trans('general.serial_number'),
'supplier' => trans('general.supplier'),
];
@@ -372,12 +377,14 @@ class Importer extends Component
'city' => trans('general.city'),
'notes' => trans('general.notes'),
'state' => trans('general.state'),
'country' => trans('general.country'),
'zip' => trans('general.zip'),
'phone' => trans('general.phone'),
'fax' => trans('general.fax'),
'url' => trans('general.url'),
'contact' => trans('general.contact'),
'email' => trans('general.email'),
'tag_color' => trans('general.tag_color'),
];
$this->manufacturers_fields = [
@@ -389,6 +396,7 @@ class Importer extends Component
'support_email' => trans('admin/manufacturers/table.support_email'),
'warranty_lookup_url' => trans('admin/manufacturers/table.warranty_lookup_url'),
'url' => trans('general.url'),
'tag_color' => trans('general.tag_color'),
];
$this->categories_fields = [
@@ -400,6 +408,8 @@ class Importer extends Component
'use_default_eula' => trans('admin/categories/general.use_default_eula_column'),
'require_acceptance' => trans('admin/categories/general.import_require_acceptance'),
'checkin_email' => trans('admin/categories/general.import_checkin_email'),
'alert_on_response' => trans('admin/categories/general.import_alert_on_response'),
'tag_color' => trans('general.tag_color'),
];
@@ -409,16 +419,25 @@ class Importer extends Component
'category' => trans('general.category'),
'eol' => trans('general.eol'),
'fieldset' => trans('admin/models/general.fieldset'),
'name' => trans('general.item_name_var', ['item' => trans('general.asset_model')]),
'name' => trans('general.name'),
'manufacturer' => trans('general.manufacturer'),
'min_amt' => trans('mail.min_QTY'),
'model_number' => trans('general.model_no'),
'notes' => trans('general.item_notes', ['item' => trans('admin/hardware/form.model')]),
'requestable' => trans('admin/models/general.requestable'),
'notes' => trans('general.notes'),
'requestable' => trans('general.requestable'),
'require_serial' => trans('admin/hardware/general.require_serial'),
'tag_color' => trans('general.tag_color'),
'depreciation' => trans('general.depreciation'),
];
// "real fieldnames" to a list of aliases for that field
/**
* These are the "real fieldnames" with a list of possible aliases,
* like misspellings, slight mis-phrasings, user-specific language, etc. that
* could be in the imported file header.
* This just makes the user's experience a little better when they're using
* their own CSV template.
*/
$this->aliases_fields = [
'item_name' =>
[
@@ -439,6 +458,20 @@ class Importer extends Component
'item no.',
'item #',
],
'order_number' => [
'order #',
'order no.',
'order num',
'order number',
'order',
],
'eula_text' => [
'eula',
],
'checkin_email' => [
'checkin email',
],
'asset_model' =>
[
'model name',
@@ -456,16 +489,6 @@ class Importer extends Component
'EOL',
'eol months',
],
'depreciation' =>
[
'Depreciation',
'depreciation',
],
'requestable' =>
[
'requestable',
'Requestable',
],
'gravatar' =>
[
'gravatar',
@@ -542,7 +565,8 @@ class Importer extends Component
],
'require_serial' =>
[
'serial required',
trans('admin/models/general.importer.require_serial'),
trans('admin/models/general.importer.serial_reqiured'),
],
'model_number' =>
[
+1 -1
View File
@@ -25,7 +25,7 @@ class CheckoutAssetMail extends BaseMailable
* Create a new message instance.
* @throws \Exception
*/
public function __construct(Asset $asset, $checkedOutTo, User $checkedOutBy, $acceptance, $note, bool $firstTimeSending = true)
public function __construct(Asset $asset, $checkedOutTo, ?User $checkedOutBy, $acceptance, $note, bool $firstTimeSending = true)
{
$this->item = $asset;
$this->admin = $checkedOutBy;
+4 -1
View File
@@ -119,6 +119,9 @@ class Accessory extends SnipeModel
}
public function isDeletable() {
return $this->checkouts_count === 0;
}
/**
* Sets the requestable attribute on the accessory
*
@@ -268,7 +271,7 @@ class Accessory extends SnipeModel
*/
public function adminuser()
{
return $this->belongsTo(\App\Models\User::class, 'created_by');
return $this->belongsTo(\App\Models\User::class, 'created_by')->withTrashed();
}
/**
+1 -1
View File
@@ -58,7 +58,7 @@ class AccessoryCheckout extends Model
*/
public function adminuser()
{
return $this->belongsTo(User::class, 'created_by');
return $this->belongsTo(User::class, 'created_by')->withTrashed();
}
/**
+2 -1
View File
@@ -907,7 +907,7 @@ class Asset extends Depreciable
*/
public function adminuser()
{
return $this->belongsTo(\App\Models\User::class, 'created_by');
return $this->belongsTo(\App\Models\User::class, 'created_by')->withTrashed();
}
@@ -1271,6 +1271,7 @@ class Asset extends Depreciable
$query = $query
->orWhere('assets_users.first_name', 'LIKE', '%'.$term.'%')
->orWhere('assets_users.last_name', 'LIKE', '%'.$term.'%')
->orWhere('assets_users.display_name', 'LIKE', '%'.$term.'%')
->orWhere('assets_users.jobtitle', 'LIKE', '%'.$term.'%')
->orWhere('assets_users.username', 'LIKE', '%'.$term.'%')
->orWhere('assets_users.employee_num', 'LIKE', '%'.$term.'%')
+1 -1
View File
@@ -234,7 +234,7 @@ class AssetModel extends SnipeModel
public function isDeletable()
{
return Gate::allows('delete', $this)
&& ($this->assets_count == 0)
&& (($this->assets_count ?? $this->assets()->count()) === 0)
&& ($this->deleted_at == '');
}
+1 -1
View File
@@ -242,7 +242,7 @@ class Category extends SnipeModel
public function adminuser()
{
return $this->belongsTo(\App\Models\User::class, 'created_by');
return $this->belongsTo(\App\Models\User::class, 'created_by')->withTrashed();
}
/**
+1 -1
View File
@@ -46,7 +46,7 @@ class Checkoutable
$category = optional($unaccepted_row->license?->category?->present())->nameUrl() ?? '';
$company = optional($unaccepted_row->license?->company?->present())?->nameUrl() ?? '';
$model = '';
$name = $unaccepted_row->license->present()->nameUrl() ?? '';
$name = $unaccepted_row->license?->present()->nameUrl() ?? '';
}
if($unaccepted_row instanceof Consumable){
$category = optional($unaccepted_row->category?->present())->nameUrl() ?? '';
+1 -1
View File
@@ -320,7 +320,7 @@ final class Company extends SnipeModel
public function adminuser()
{
return $this->belongsTo(\App\Models\User::class, 'created_by');
return $this->belongsTo(\App\Models\User::class, 'created_by')->withTrashed();
}
+12 -5
View File
@@ -167,7 +167,7 @@ class Component extends SnipeModel
*/
public function adminuser()
{
return $this->belongsTo(\App\Models\User::class, 'created_by');
return $this->belongsTo(\App\Models\User::class, 'created_by')->withTrashed();
}
/**
@@ -264,14 +264,21 @@ class Component extends SnipeModel
// In case there are elements checked out to assets that belong to a different company
// than this asset and full multiple company support is on we'll remove the global scope,
// so they are included in the count.
if (is_null($this->sum_unconstrained_assets) || $recalculate) {
// This, in a components-listing context, is mostly important for when it sets a 'zero' which
// is *not* null - so we don't have to keep recalculating for un-checked-out components
// the 'sum' query returns NULL when there are zero checkouts - which can inadvertently re-trigger the following query
// for un-checked-out components. So we have to do this very careful process of fetching the 'attributes'
// of the component, then see if sum_unconstrained_assets exists as an attribute. If it doesn't, we run the
// query. But if it *does* exist as an attribute - even a null - we skip the query, because that means that this
// component was fetched using withCount() - and that count *is* accurate, even if null. We just do a quick
// null-coalesce at the end to zero for the null case.
$raw_attributes = $this->getAttributes();
if (!array_key_exists('sum_unconstrained_assets', $raw_attributes) || $recalculate) {
// This part should *only* run if the component was fetched *without* withCount() (or you've asked to recalculate)
// NOTE: doing this will add a 'pseudo-attribute' to the component in question, so we need to _remove_ this
// before we save - so that gets handled in the 'saving' callback defined in the 'booted' method, above.
$this->sum_unconstrained_assets = $this->unconstrainedAssets()->sum('assigned_qty') ?? 0;
}
return $this->sum_unconstrained_assets;
return $this->sum_unconstrained_assets ?? 0;
}
+9 -1
View File
@@ -13,6 +13,7 @@ use App\Presenters\Presentable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Storage;
use Watson\Validating\ValidatingTrait;
@@ -131,6 +132,13 @@ class Consumable extends SnipeModel
$this->attributes['requestable'] = filter_var($value, FILTER_VALIDATE_BOOLEAN);
}
public function isDeletable()
{
return Gate::allows('delete', $this)
&& ($this->numCheckedOut() === 0)
&& ($this->deleted_at == '');
}
/**
* Establishes the consumable -> admin user relationship
*
@@ -140,7 +148,7 @@ class Consumable extends SnipeModel
*/
public function adminuser()
{
return $this->belongsTo(User::class, 'created_by');
return $this->belongsTo(User::class, 'created_by')->withTrashed();
}
/**
+1 -1
View File
@@ -29,6 +29,6 @@ class ConsumableAssignment extends Model
public function adminuser()
{
return $this->belongsTo(\App\Models\User::class, 'created_by');
return $this->belongsTo(\App\Models\User::class, 'created_by')->withTrashed();
}
}
+8
View File
@@ -7,6 +7,7 @@ use App\Models\Traits\CompanyableTrait;
use App\Models\Traits\Searchable;
use App\Presenters\Presentable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Support\Facades\Gate;
use Watson\Validating\ValidatingTrait;
class Department extends SnipeModel
@@ -77,6 +78,13 @@ class Department extends SnipeModel
*/
protected $searchableRelations = [];
public function isDeletable()
{
return Gate::allows('delete', $this) && (($this->users_count ?? $this->users()->count()) === 0);
}
/**
* Establishes the department -> company relationship
*
+1 -1
View File
@@ -108,7 +108,7 @@ class Depreciation extends SnipeModel
*/
public function adminuser()
{
return $this->belongsTo(\App\Models\User::class, 'created_by');
return $this->belongsTo(\App\Models\User::class, 'created_by')->withTrashed();
}
+1 -1
View File
@@ -68,7 +68,7 @@ class Group extends SnipeModel
*/
public function adminuser()
{
return $this->belongsTo(\App\Models\User::class, 'created_by');
return $this->belongsTo(\App\Models\User::class, 'created_by')->withTrashed();
}
/**
+1 -1
View File
@@ -24,6 +24,6 @@ class Import extends Model
*/
public function adminuser()
{
return $this->belongsTo(\App\Models\User::class, 'created_by');
return $this->belongsTo(\App\Models\User::class, 'created_by')->withTrashed();
}
}
+2 -2
View File
@@ -195,7 +195,7 @@ class Ldap extends Model
$connection = self::connectToLdap();
$ldap_username_field = $settings->ldap_username_field;
$baseDn = $settings->ldap_basedn;
$userDn = $ldap_username_field.'='.$username.','.$settings->ldap_basedn;
$userDn = $ldap_username_field . '=' . ldap_escape($username, '', LDAP_ESCAPE_DN) . ',' . $settings->ldap_basedn;
if ($settings->is_ad == '1') {
// Check if they are using the userprincipalname for the username field.
@@ -213,7 +213,7 @@ class Ldap extends Model
}
}
$filterQuery = $settings->ldap_auth_filter_query.$username;
$filterQuery = $settings->ldap_auth_filter_query . ldap_escape($username, '', LDAP_ESCAPE_FILTER);
$filter = Setting::getSettings()->ldap_filter; //FIXME - this *does* respect the ldap filter, but I believe that AdLdap2 did *not*.
$filterQuery = "({$filter}({$filterQuery}))";
+3 -3
View File
@@ -389,7 +389,7 @@ class License extends Depreciable
*/
public function category()
{
return $this->belongsTo(\App\Models\Category::class, 'category_id');
return $this->belongsTo(\App\Models\Category::class, 'category_id')->withTrashed();
}
/**
@@ -401,7 +401,7 @@ class License extends Depreciable
*/
public function manufacturer()
{
return $this->belongsTo(\App\Models\Manufacturer::class, 'manufacturer_id');
return $this->belongsTo(\App\Models\Manufacturer::class, 'manufacturer_id')->withTrashed();
}
/**
@@ -478,7 +478,7 @@ class License extends Depreciable
*/
public function adminuser()
{
return $this->belongsTo(\App\Models\User::class, 'created_by');
return $this->belongsTo(\App\Models\User::class, 'created_by')->withTrashed();
}
/**
+1 -1
View File
@@ -69,7 +69,7 @@ class LicenseSeat extends SnipeModel implements ICompanyableChild
protected function name(): Attribute
{
return Attribute:: make(
get: fn(mixed $value) => $this->license->name,
get: fn(mixed $value) => $this->license?->name,
);
}
+1 -1
View File
@@ -149,7 +149,7 @@ class Location extends SnipeModel
*/
public function adminuser()
{
return $this->belongsTo(\App\Models\User::class, 'created_by');
return $this->belongsTo(\App\Models\User::class, 'created_by')->withTrashed();
}
/**
+9 -1
View File
@@ -10,7 +10,9 @@ use App\Models\Traits\Searchable;
use App\Presenters\Presentable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\Gate;
use Watson\Validating\ValidatingTrait;
use App\Presenters\MaintenancesPresenter;
/**
* Model for Asset Maintenances.
@@ -27,7 +29,7 @@ class Maintenance extends SnipeModel implements ICompanyableChild
use Loggable, Presentable;
protected $presenter = MaintenancesPresenter::class;
protected $table = 'maintenances';
protected $rules = [
'asset_id' => 'required|integer',
@@ -118,6 +120,12 @@ class Maintenance extends SnipeModel implements ICompanyableChild
];
}
public function isDeletable()
{
return Gate::allows('delete', $this);
}
public function setIsWarrantyAttribute($value)
{
if ($value == '') {
+1 -1
View File
@@ -116,7 +116,7 @@ class Manufacturer extends SnipeModel
public function adminuser()
{
return $this->belongsTo(\App\Models\User::class, 'created_by');
return $this->belongsTo(\App\Models\User::class, 'created_by')->withTrashed();
}
+14 -1
View File
@@ -4,21 +4,27 @@ namespace App\Models;
use App\Http\Traits\UniqueUndeletedTrait;
use App\Models\Traits\Searchable;
use App\Presenters\Presentable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\Gate;
use Watson\Validating\ValidatingTrait;
class Statuslabel extends SnipeModel
{
use HasFactory;
use SoftDeletes;
use ValidatingTrait;
use UniqueUndeletedTrait;
use Presentable;
protected $injectUniqueIdentifier = true;
protected $table = 'status_labels';
protected $hidden = ['user_id', 'deleted_at'];
protected $presenter = \App\Presenters\StatusLabelPresenter::class;
protected $rules = [
'name' => 'required|max:255|string|unique_undeleted',
@@ -52,6 +58,13 @@ class Statuslabel extends SnipeModel
*/
protected $searchableRelations = [];
public function isDeletable()
{
return Gate::allows('delete', $this)
&& (($this->assets_count ?? $this->assets()->count()) === 0)
&& ($this->deleted_at == '');
}
/**
* Establishes the status label -> assets relationship
*
@@ -66,7 +79,7 @@ class Statuslabel extends SnipeModel
public function adminuser()
{
return $this->belongsTo(\App\Models\User::class, 'created_by');
return $this->belongsTo(\App\Models\User::class, 'created_by')->withTrashed();
}
/**
+1 -1
View File
@@ -158,7 +158,7 @@ class Supplier extends SnipeModel
*/
public function adminuser()
{
return $this->belongsTo(\App\Models\User::class, 'created_by');
return $this->belongsTo(\App\Models\User::class, 'created_by')->withTrashed();
}
/**
+3 -3
View File
@@ -304,10 +304,10 @@ class AssetModelPresenter extends Presenter
public function formattedNameLink() {
if (auth()->user()->can('models.view', $this)) {
return '<a href="'.route('models.show', e($this->id)).'">'.e($this->name).'</a>';
if (auth()->user()->can('view', ['\App\Models\AssetModel', $this])) {
return '<a href="'.route('models.show', e($this->id)).'" class="'. (($this->deleted_at!='') ? 'deleted' : '').'">'.e($this->display_name).'</a>';
}
return $this->name;
return '<span class="'. (($this->deleted_at!='') ? 'deleted' : '').'">'.e($this->display_name).'</span>';
}
}
+8 -7
View File
@@ -151,14 +151,15 @@ class AssetPresenter extends Presenter
'visible' => false,
'title' => trans('general.purchase_date'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'first_checkout',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('general.first_checkout'),
'formatter' => 'dateDisplayFormatter',
],
// [
// 'field' => 'first_checkout',
// 'searchable' => true,
// 'sortable' => true,
// 'visible' => false,
// 'title' => trans('general.first_checkout'),
// 'formatter' => 'dateDisplayFormatter',
// ],
[
'field' => 'age',
'searchable' => false,
+9 -3
View File
@@ -157,10 +157,16 @@ class CategoryPresenter extends Presenter
public function formattedNameLink() {
if (auth()->user()->can('view', ['\App\Models\Category', $this])) {
return ($this->tag_color ? "<i class='fa-solid fa-fw fa-square' style='color: ".e($this->tag_color)."' aria-hidden='true'></i>" : '').'<a href="'.route('categories.show', e($this->id)).'">'.e($this->name).'</a>';
// We use soft-deletes for categories, but we don't give you a way to restore them right now. This would be the method we'd use when that happens
// if (auth()->user()->can('view', ['\App\Models\Category', $this])) {
// return ($this->tag_color ? "<i class='fa-solid fa-fw fa-square' style='color: ".e($this->tag_color)."' aria-hidden='true'></i>" : '').'<a href="'.route('models.show', e($this->id)).'" class="'. (($this->deleted_at!='') ? 'deleted' : '').'">'.e($this->display_name).'</a>';
// }
if ((auth()->user()->can('view', ['\App\Models\Category', $this])) && ($this->deleted_at=='')) {
return ($this->tag_color ? "<i class='fa-solid fa-fw fa-square' style='color: ".e($this->tag_color)."' aria-hidden='true'></i>" : '').'<a href="'.route('categories.show', e($this->id)).'">'.e($this->name).'</a>';
}
return ($this->tag_color ? "<i class='fa-solid fa-fw fa-square' style='color: ".e($this->tag_color)."' aria-hidden='true'></i>" : '').e($this->name);
return ($this->tag_color ? "<i class='fa-solid fa-fw fa-square' style='color: ".e($this->tag_color)."' aria-hidden='true'></i>" : '').'<span class="'. (($this->deleted_at!='') ? 'deleted' : '').'">'.e($this->display_name).'</span>';
}
}
+57
View File
@@ -191,6 +191,63 @@ class ComponentPresenter extends Presenter
return json_encode($layout);
}
public static function checkedOut() {
$layout = [
[
'field' => 'id',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.id'),
'visible' => false,
],
[
'field' => 'name',
'searchable' => true,
'sortable' => true,
'title' => trans('general.name'),
'visible' => true,
'formatter' => 'hardwareLinkFormatter',
],
[
'field' => 'qty',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.qty'),
'visible' => true,
],
[
'field' => 'note',
'searchable' => true,
'sortable' => true,
'visible' => true,
'title' => trans('general.notes'),
'formatter' => 'notesFormatter',
],[
'field' => 'created_at',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('general.created_at'),
'formatter' => 'dateDisplayFormatter',
],
$layout[] = [
'field' => 'available_actions',
'searchable' => false,
'sortable' => false,
'switchable' => false,
'title' => trans('general.checkin').'/'.trans('general.checkout'),
'visible' => true,
'formatter' => 'componentsInOutFormatter',
'printIgnore' => true,
],
];
return json_encode($layout);
}
/**
* Generate html link to this items name.
* @return string
+52
View File
@@ -187,6 +187,58 @@ class ConsumablePresenter extends Presenter
return json_encode($layout);
}
public static function checkedOut()
{
$layout = [
[
'field' => 'avatar',
'searchable' => false,
'sortable' => false,
'title' => trans('general.image'),
'visible' => true,
'formatter' => 'imageFormatter',
],
[
'field' => 'user',
'searchable' => false,
'sortable' => false,
'title' => trans('general.name'),
'visible' => true,
'formatter' => 'usersLinkObjFormatter',
],
[
'field' => 'created_at',
'searchable' => false,
'sortable' => false,
'title' => trans('general.date'),
'visible' => true,
'formatter' => 'dateDisplayFormatter',
],
[
'field' => 'note',
'searchable' => false,
'sortable' => false,
'title' => trans('general.notes'),
'visible' => true,
],
[
'field' => 'created_by',
'searchable' => false,
'sortable' => false,
'title' => trans('general.created_by'),
'visible' => true,
'formatter' => 'usersLinkObjFormatter',
],
];
return json_encode($layout);
}
/**
* Url to view this item.
* @return string
+2 -2
View File
@@ -551,9 +551,9 @@ class UserPresenter extends Presenter
public function formattedNameLink() {
if (auth()->user()->can('view', ['\App\Models\User', $this])) {
return ($this->tag_color ? "<i class='fa-solid fa-fw fa-square' style='color: ".e($this->tag_color)."' aria-hidden='true'></i>" : '').'<a href="'.route('users.show', e($this->id)).'">'.e($this->display_name).'</a>';
return '<a href="'.route('users.show', e($this->id)).'" class="'. (($this->deleted_at!='') ? 'deleted' : '').'">'.e($this->display_name).'</a>';
}
return ($this->tag_color ? "<i class='fa-solid fa-fw fa-square' style='color: ".e($this->tag_color)."' aria-hidden='true'></i>" : '').e($this->display_name);
return '<span class="'. (($this->deleted_at!='') ? 'deleted' : '').'">'.e($this->display_name).'</span>';
}
}
+8 -1
View File
@@ -214,6 +214,12 @@ class BreadcrumbsServiceProvider extends ServiceProvider
->push(trans('general.breadcrumb_button_actions.edit_item', ['name' => $component->name]), route('components.edit', $component))
);
Breadcrumbs::for('components.clone.create', fn (Trail $trail, Component $component) =>
$trail->parent('components.index', route('components.index'))
->push($component->display_name, route('components.show', $component))
->push(trans('general.clone'), route('components.create'))
);
/**
* Consumables Breadcrumbs
@@ -262,9 +268,10 @@ class BreadcrumbsServiceProvider extends ServiceProvider
Breadcrumbs::for('fieldsets.create', fn (Trail $trail) =>
$trail->parent('fields.index', route('fields.index'))
->push(trans('general.create'), route('fieldsets.create'))
->push(trans('admin/custom_fields/general.create_fieldset'), route('fieldsets.create'))
);
Breadcrumbs::for('fieldsets.show', fn (Trail $trail, CustomFieldset $fieldset) =>
$trail->parent('fields.index', route('fields.index'))
->push($fieldset->name, route('fields.index'))
+5 -5
View File
@@ -1,10 +1,10 @@
<?php
return array (
'app_version' => 'v8.3.7',
'full_app_version' => 'v8.3.7 - build 21025-ga8c268760',
'build_version' => '21025',
'app_version' => 'v8.4.0',
'full_app_version' => 'v8.4.0 - build 21280-g91a95dbc6',
'build_version' => '21280',
'prerelease_version' => '',
'hash_version' => 'ga8c268760',
'full_hash' => 'v8.3.7-220-ga8c268760',
'hash_version' => 'g91a95dbc6',
'full_hash' => 'v8.4.0-475-g91a95dbc6',
'branch' => 'master',
);
+2 -2
View File
@@ -28,10 +28,10 @@ class AssetModelFactory extends Factory
public function definition()
{
return [
'created_by' => User::factory()->superuser(),
'name' => $this->faker->catchPhrase(),
'category_id' => Category::factory(),
'created_by' => User::factory()->superuser(),
'model_number' => $this->faker->creditCardNumber(),
'name' => $this->faker->catchPhrase(),
'notes' => 'Created by demo seeder',
'require_serial' => 0,
+4 -4
View File
@@ -23,15 +23,15 @@ class CategoryFactory extends Factory
public function definition()
{
return [
'name' => $this->faker->catchPhrase(),
'category_type' => 'asset',
'checkin_email' => true,
'eula_text' => $this->faker->paragraph(),
'require_acceptance' => false,
'use_default_eula' => false,
'created_by' => User::factory()->superuser(),
'eula_text' => $this->faker->paragraph(),
'name' => $this->faker->catchPhrase(),
'notes' => 'Created by DB seeder',
'require_acceptance' => false,
'tag_color' => $this->faker->hexColor(),
'use_default_eula' => false,
];
}
+10 -9
View File
@@ -33,18 +33,19 @@ class ComponentFactory extends Factory
{
return [
'name' => $this->faker->text(20),
'category_id' => Category::factory(),
'location_id' => Location::factory(),
'serial' => $this->faker->uuid(),
'qty' => $this->faker->numberBetween(3, 10),
'order_number' => $this->faker->numberBetween(1000000, 50000000),
'purchase_date' => $this->faker->dateTime()->format('Y-m-d'),
'purchase_cost' => $this->faker->randomFloat(2),
'min_amt' => $this->faker->numberBetween($min = 1, $max = 2),
'company_id' => Company::factory(),
'supplier_id' => Supplier::factory(),
'created_by' => User::factory()->superuser(),
'location_id' => Location::factory(),
'min_amt' => $this->faker->numberBetween($min = 1, $max = 2),
'model_number' => $this->faker->numberBetween(1000000, 50000000),
'name' => $this->faker->text(20),
'order_number' => $this->faker->numberBetween(1000000, 50000000),
'purchase_cost' => $this->faker->randomFloat(2),
'purchase_date' => $this->faker->dateTime()->format('Y-m-d'),
'qty' => $this->faker->numberBetween(3, 10),
'serial' => $this->faker->uuid(),
'supplier_id' => Supplier::factory(),
];
}
+6 -6
View File
@@ -28,16 +28,16 @@ class ConsumableFactory extends Factory
public function definition()
{
return [
'name' => $this->faker->words(3, true),
'category_id' => Category::factory(),
'company_id' => Company::factory(),
'created_by' => User::factory()->superuser(),
'item_no' => $this->faker->numberBetween(1000000, 50000000),
'order_number' => $this->faker->numberBetween(1000000, 50000000),
'purchase_date' => $this->faker->dateTimeBetween('-1 years', 'now', date_default_timezone_get())->format('Y-m-d'),
'purchase_cost' => $this->faker->randomFloat(2, 1, 50),
'qty' => $this->faker->numberBetween(5, 10),
'min_amt' => $this->faker->numberBetween($min = 1, $max = 2),
'company_id' => Company::factory(),
'name' => $this->faker->words(3, true),
'order_number' => $this->faker->numberBetween(1000000, 50000000),
'purchase_cost' => $this->faker->randomFloat(2, 1, 50),
'purchase_date' => $this->faker->dateTimeBetween('-1 years', 'now', date_default_timezone_get())->format('Y-m-d'),
'qty' => $this->faker->numberBetween(5, 10),
'supplier_id' => Supplier::factory(),
];
}
@@ -3,6 +3,7 @@
namespace Database\Factories;
use App\Models\CustomField;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
class CustomFieldFactory extends Factory
@@ -27,6 +28,7 @@ class CustomFieldFactory extends Factory
'element' => 'text',
'auto_add_to_fieldsets' => '0',
'show_in_requestable_list' => '0',
'created_by' => User::factory()->superuser(),
];
}
+1 -1
View File
@@ -24,9 +24,9 @@ class DepartmentFactory extends Factory
public function definition()
{
return [
'name' => $this->faker->unique()->word() . ' Department',
'created_by' => User::factory()->superuser(),
'location_id' => Location::factory(),
'name' => $this->faker->unique()->word() . ' Department',
'notes' => 'Created by DB seeder',
'tag_color' => $this->faker->hexColor(),
];
+1 -1
View File
@@ -23,9 +23,9 @@ class DepreciationFactory extends Factory
public function definition()
{
return [
'name' => $this->faker->unique()->catchPhrase(),
'created_by' => User::factory()->superuser(),
'months' => 36,
'name' => $this->faker->unique()->catchPhrase(),
];
}
+3 -1
View File
@@ -3,6 +3,7 @@
namespace Database\Factories;
use App\Models\Group;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
class GroupFactory extends Factory
@@ -22,9 +23,10 @@ class GroupFactory extends Factory
public function definition()
{
return [
'created_by' => User::factory()->superuser(),
'name' => $this->faker->name(),
'permissions' => json_encode([]),
'notes' => 'Created by DB seeder',
'permissions' => json_encode([]),
];
}
}
+12 -12
View File
@@ -25,19 +25,19 @@ class LicenseFactory extends Factory
public function definition()
{
return [
'created_by' => User::factory()->superuser(),
'name' => $this->faker->name(),
'license_email' => $this->faker->safeEmail(),
'serial' => $this->faker->uuid(),
'notes' => 'Created by DB seeder',
'seats' => $this->faker->numberBetween(1, 10),
'purchase_date' => $this->faker->dateTimeBetween('-1 years', 'now', date_default_timezone_get())->format('Y-m-d'),
'order_number' => $this->faker->numberBetween(1000000, 50000000),
'expiration_date' => null,
'reassignable' => $this->faker->boolean(),
'termination_date' => null,
'supplier_id' => Supplier::factory(),
'category_id' => Category::factory(),
'created_by' => User::factory()->superuser(),
'expiration_date' => null,
'license_email' => $this->faker->safeEmail(),
'name' => $this->faker->name(),
'notes' => 'Created by DB seeder',
'order_number' => $this->faker->numberBetween(1000000, 50000000),
'purchase_date' => $this->faker->dateTimeBetween('-1 years', 'now', date_default_timezone_get())->format('Y-m-d'),
'reassignable' => $this->faker->boolean(),
'seats' => $this->faker->numberBetween(1, 10),
'serial' => $this->faker->uuid(),
'supplier_id' => Supplier::factory(),
'termination_date' => null,
];
}
+5 -3
View File
@@ -2,6 +2,7 @@
namespace Database\Factories;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
class LocationFactory extends Factory
@@ -14,17 +15,18 @@ class LocationFactory extends Factory
public function definition()
{
return [
'name' => $this->faker->city(),
'address' => $this->faker->streetAddress(),
'address2' => $this->faker->secondaryAddress(),
'city' => $this->faker->city(),
'state' => $this->faker->stateAbbr(),
'country' => $this->faker->countryCode(),
'created_by' => User::factory()->superuser(),
'currency' => $this->faker->currencyCode(),
'zip' => $this->faker->postcode(),
'image' => rand(1, 9).'.jpg',
'name' => $this->faker->city(),
'notes' => 'Created by DB seeder',
'state' => $this->faker->stateAbbr(),
'tag_color' => $this->faker->hexColor(),
'zip' => $this->faker->postcode(),
];
}
+4 -4
View File
@@ -23,13 +23,13 @@ class ManufacturerFactory extends Factory
public function definition()
{
return [
'name' => $this->faker->unique()->company(),
'created_by' => User::factory()->superuser(),
'support_phone' => $this->faker->phoneNumber(),
'url' => $this->faker->url(),
'support_email' => $this->faker->safeEmail(),
'name' => $this->faker->unique()->company(),
'notes' => 'Created by DB seeder',
'support_email' => $this->faker->safeEmail(),
'support_phone' => $this->faker->phoneNumber(),
'tag_color' => $this->faker->hexColor(),
'url' => $this->faker->url(),
];
}
+4 -4
View File
@@ -23,15 +23,15 @@ class StatuslabelFactory extends Factory
public function definition()
{
return [
'name' => $this->faker->sentence(),
'archived' => 0,
'created_at' => $this->faker->dateTime(),
'updated_at' => $this->faker->dateTime(),
'created_by' => User::factory()->superuser(),
'deleted_at' => null,
'deployable' => 0,
'pending' => 0,
'archived' => 0,
'name' => $this->faker->sentence(),
'notes' => '',
'pending' => 0,
'updated_at' => $this->faker->dateTime(),
];
}
+9 -7
View File
@@ -3,6 +3,7 @@
namespace Database\Factories;
use App\Models\Supplier;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
class SupplierFactory extends Factory
@@ -22,20 +23,21 @@ class SupplierFactory extends Factory
public function definition()
{
return [
'name' => $this->faker->company(),
'address' => $this->faker->streetAddress(),
'address2' => $this->faker->secondaryAddress(),
'city' => $this->faker->city(),
'state' => $this->faker->stateAbbr(),
'zip' => $this->faker->postCode(),
'country' => $this->faker->countryCode(),
'contact' => $this->faker->name(),
'phone' => $this->faker->phoneNumber(),
'fax' => $this->faker->phoneNumber(),
'country' => $this->faker->countryCode(),
'created_by' => User::factory()->superuser(),
'email' => $this->faker->safeEmail(),
'url' => $this->faker->url(),
'fax' => $this->faker->phoneNumber(),
'name' => $this->faker->company(),
'notes' => $this->faker->text(191), // Supplier notes can be a max of 255 characters.
'phone' => $this->faker->phoneNumber(),
'state' => $this->faker->stateAbbr(),
'tag_color' => $this->faker->hexColor(),
'url' => $this->faker->url(),
'zip' => $this->faker->postCode(),
];
}
}
+4 -4
View File
@@ -25,22 +25,22 @@ class UserFactory extends Factory
'city' => $this->faker->city(),
'company_id' => Company::factory(),
'country' => $this->faker->country(),
'created_by' => 1,
'display_name' => null,
'email' => $this->faker->safeEmail(),
'employee_num' => $this->faker->numberBetween(3500, 35050),
'first_name' => $this->faker->firstName(),
'last_name' => $this->faker->lastName(),
'display_name' => null,
'jobtitle' => $this->faker->jobTitle(),
'last_name' => $this->faker->lastName(),
'locale' => 'en-US',
'mobile' => $this->faker->phoneNumber(),
'notes' => 'Created by DB seeder',
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
'permissions' => '{}',
'phone' => $this->faker->phoneNumber(),
'mobile' => $this->faker->phoneNumber(),
'state' => $this->faker->stateAbbr(),
'username' => $this->faker->unique()->username(),
'zip' => $this->faker->postcode(),
'created_by' => 1,
];
}
+4 -4
View File
@@ -6816,11 +6816,11 @@
}
},
"node_modules/jspdf-autotable": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/jspdf-autotable/-/jspdf-autotable-5.0.2.tgz",
"integrity": "sha512-YNKeB7qmx3pxOLcNeoqAv3qTS7KuvVwkFe5AduCawpop3NOkBUtqDToxNc225MlNecxT4kP2Zy3z/y/yvGdXUQ==",
"version": "5.0.7",
"resolved": "https://registry.npmjs.org/jspdf-autotable/-/jspdf-autotable-5.0.7.tgz",
"integrity": "sha512-2wr7H6liNDBYNwt25hMQwXkEWFOEopgKIvR1Eukuw6Zmprm/ZcnmLTQEjW7Xx3FCbD3v7pflLcnMAv/h1jFDQw==",
"peerDependencies": {
"jspdf": "^2 || ^3"
"jspdf": "^2 || ^3 || ^4"
}
},
"node_modules/jspdf/node_modules/core-js": {
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1573
View File
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
+6 -24574
View File
File diff suppressed because one or more lines are too long
+1 -414
View File
File diff suppressed because one or more lines are too long
+1 -135
View File
@@ -1,135 +1 @@
#signature-pad {
padding-top: 250px;
margin: auto;
}
.m-signature-pad {
position: relative;
font-size: 10px;
width: 100%;
height: 300px;
border: 1px solid #e8e8e8;
background-color: #fff;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.27), 0 0 40px rgba(0, 0, 0, 0.08) inset;
border-radius: 4px;
}
.m-signature-pad:before, .m-signature-pad:after {
position: absolute;
z-index: -1;
content: "";
width: 40%;
height: 10px;
left: 20px;
bottom: 10px;
background: transparent;
-webkit-transform: skew(-3deg) rotate(-3deg);
-moz-transform: skew(-3deg) rotate(-3deg);
-ms-transform: skew(-3deg) rotate(-3deg);
-o-transform: skew(-3deg) rotate(-3deg);
transform: skew(-3deg) rotate(-3deg);
box-shadow: 0 8px 12px rgba(0, 0, 0, 0.4);
}
.m-signature-pad:after {
left: auto;
right: 20px;
-webkit-transform: skew(3deg) rotate(3deg);
-moz-transform: skew(3deg) rotate(3deg);
-ms-transform: skew(3deg) rotate(3deg);
-o-transform: skew(3deg) rotate(3deg);
transform: skew(3deg) rotate(3deg);
}
.m-signature-pad--body {
position: absolute;
top: 20px;
bottom: 60px;
border: 1px solid #f4f4f4;
background-color: white;
}
.m-signature-pad--body
canvas {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
border-radius: 4px;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.02) inset;
}
.m-signature-pad--footer {
position: absolute;
left: 20px;
right: 20px;
bottom: 20px;
height: 40px;
}
.m-signature-pad--footer
.description {
color: #C3C3C3;
text-align: center;
font-size: 1.2em;
margin-top: 1.8em;
}
.m-signature-pad--footer
.button {
position: absolute;
bottom: 0;
}
.m-signature-pad--footer
.button.clear {
left: 0;
}
.m-signature-pad--footer
.button.save {
right: 0;
}
@media screen and (max-width: 1024px) {
.m-signature-pad {
top: 0;
left: 0;
right: 0;
bottom: 0;
width: auto;
height: auto;
min-width: 250px;
min-height: 140px;
margin: 5%;
}
}
@media screen and (min-device-width: 768px) and (max-device-width: 1024px) {
.m-signature-pad {
margin: 10%;
}
}
@media screen and (max-height: 320px) {
.m-signature-pad--body {
left: 0;
right: 0;
top: 0;
bottom: 32px;
}
.m-signature-pad--footer {
left: 20px;
right: 20px;
bottom: 4px;
height: 28px;
}
.m-signature-pad--footer
.description {
font-size: 1em;
margin-top: 1em;
}
}
#signature-pad{padding-top:250px;margin:auto}.m-signature-pad{position:relative;font-size:10px;width:100%;height:300px;border:1px solid #e8e8e8;background-color:#fff;box-shadow:0 1px 4px rgba(0,0,0,.27),0 0 40px rgba(0,0,0,.08) inset;border-radius:4px}.m-signature-pad:after,.m-signature-pad:before{position:absolute;z-index:-1;content:"";width:40%;height:10px;left:20px;bottom:10px;background:0 0;-webkit-transform:skew(-3deg) rotate(-3deg);-moz-transform:skew(-3deg) rotate(-3deg);-ms-transform:skew(-3deg) rotate(-3deg);-o-transform:skew(-3deg) rotate(-3deg);transform:skew(-3deg) rotate(-3deg);box-shadow:0 8px 12px rgba(0,0,0,.4)}.m-signature-pad:after{left:auto;right:20px;-webkit-transform:skew(3deg) rotate(3deg);-moz-transform:skew(3deg) rotate(3deg);-ms-transform:skew(3deg) rotate(3deg);-o-transform:skew(3deg) rotate(3deg);transform:skew(3deg) rotate(3deg)}.m-signature-pad--body{position:absolute;top:20px;bottom:60px;border:1px solid #f4f4f4;background-color:#fff}.m-signature-pad--body canvas{position:absolute;left:0;top:0;width:100%;height:100%;border-radius:4px;box-shadow:0 0 5px rgba(0,0,0,.02) inset}.m-signature-pad--footer{position:absolute;left:20px;right:20px;bottom:20px;height:40px}.m-signature-pad--footer .description{color:#c3c3c3;text-align:center;font-size:1.2em;margin-top:1.8em}.m-signature-pad--footer .button{position:absolute;bottom:0}.m-signature-pad--footer .button.clear{left:0}.m-signature-pad--footer .button.save{right:0}@media screen and (max-width:1024px){.m-signature-pad{top:0;left:0;right:0;bottom:0;width:auto;height:auto;min-width:250px;min-height:140px;margin:5%}}@media screen and (min-device-width:768px) and (max-device-width:1024px){.m-signature-pad{margin:10%}}@media screen and (max-height:320px){.m-signature-pad--body{left:0;right:0;top:0;bottom:32px}.m-signature-pad--footer{left:20px;right:20px;bottom:4px;height:28px}.m-signature-pad--footer .description{font-size:1em;margin-top:1em}}
+2 -53350
View File
File diff suppressed because one or more lines are too long
+3 -17
View File
@@ -28,17 +28,6 @@
* https://github.com/select2/select2/blob/master/LICENSE.md
*/
/*!
* Sizzle CSS Selector Engine v2.3.5
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://js.foundation/
*
* Date: 2020-03-14
*/
/*!
* clipboard.js v2.0.11
* https://clipboardjs.com/
@@ -47,17 +36,14 @@
*/
/*!
* jQuery JavaScript Library v3.5.1
* jQuery JavaScript Library v3.7.1
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
* Date: 2020-05-04T22:49Z
* Date: 2023-08-28T13:37Z
*/
/*!
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -38849
View File
File diff suppressed because one or more lines are too long
+5 -5
View File
@@ -1,9 +1,9 @@
{
"/js/dist/all.js": "/js/dist/all.js?id=584e7af6b28899d4794d25aef996d231",
"/css/build/overrides.css": "/css/build/overrides.css?id=69b145f1bb0fb5c3de63350ef73207b4",
"/css/build/app.css": "/css/build/app.css?id=ca045cda8d9164ddb2f7a0ec6fd92a40",
"/css/build/AdminLTE.css": "/css/build/AdminLTE.css?id=ee0ed88465dd878588ed044eefb67723",
"/css/dist/all.css": "/css/dist/all.css?id=6b276946025b2c383b315d655683db02",
"/js/dist/all.js": "/js/dist/all.js?id=2dd258bb47be82b0a9237c513bddf2d1",
"/css/build/overrides.css": "/css/build/overrides.css?id=955f1204631dbea12cd1b6cdf5c12b50",
"/css/build/app.css": "/css/build/app.css?id=92f5873bc1425b14b040c51ad53db7a3",
"/css/build/AdminLTE.css": "/css/build/AdminLTE.css?id=bdf169bc2141f453390614c138cdce95",
"/css/dist/all.css": "/css/dist/all.css?id=16a8374df57adb2112750e84644c6aaa",
"/css/dist/signature-pad.css": "/css/dist/signature-pad.css?id=6a89d3cd901305e66ced1cf5f13147f7",
"/css/dist/signature-pad.min.css": "/css/dist/signature-pad.min.css?id=6a89d3cd901305e66ced1cf5f13147f7",
"/js/select2/i18n/af.js": "/js/select2/i18n/af.js?id=4f6fcd73488ce79fae1b7a90aceaecde",
@@ -5,7 +5,7 @@ return [
'manage' => 'crwdns6501:0crwdne6501:0',
'field' => 'crwdns1487:0crwdne1487:0',
'about_fieldsets_title' => 'crwdns1488:0crwdne1488:0',
'about_fieldsets_text' => 'crwdns14306:0crwdne14306:0',
'about_fieldsets_text' => 'crwdns14356:0crwdne14356:0',
'custom_format' => 'crwdns6505:0crwdne6505:0',
'encrypt_field' => 'crwdns1792:0crwdne1792:0',
'encrypt_field_help' => 'crwdns1683:0crwdne1683:0',
+1 -1
View File
@@ -16,7 +16,7 @@ return array(
'seats' => 'crwdns917:0crwdne917:0',
'termination_date' => 'crwdns1146:0crwdne1146:0',
'to_email' => 'crwdns919:0crwdne919:0',
'to_name' => 'crwdns920:0crwdne920:0',
'to_name' => 'crwdns14498:0crwdne14498:0',
'update' => 'crwdns921:0crwdne921:0',
'checkout_help' => 'crwdns922:0crwdne922:0'
);
@@ -41,6 +41,9 @@ return [
'backups_logged_out' => 'crwdns6774:0crwdne6774:0',
'backups_large' => 'crwdns6335:0crwdne6335:0',
'barcode_settings' => 'crwdns1295:0crwdne1295:0',
'color_preferences' => 'crwdns14456:0crwdne14456:0',
'color_settings_help' => 'crwdns14458:0crwdne14458:0',
'color_reset' => 'crwdns14460:0crwdne14460:0',
'confirm_purge' => 'crwdns1611:0crwdne1611:0',
'confirm_purge_help' => 'crwdns5852:0crwdne5852:0',
'custom_css' => 'crwdns1419:0crwdne1419:0',
@@ -75,11 +78,19 @@ return [
'footer_text_help' => 'crwdns1988:0crwdne1988:0',
'footer_text_placeholder' => 'crwdns12965:0crwdne12965:0',
'general_settings' => 'crwdns1297:0crwdne1297:0',
'api_url' => 'crwdns14464:0crwdne14464:0',
'scim_url' => 'crwdns14466:0crwdne14466:0',
'general_settings_help' => 'crwdns6341:0crwdne6341:0',
'generate_backup' => 'crwdns1427:0crwdne1427:0',
'google_workspaces' => 'crwdns12080:0crwdne12080:0',
'header_color' => 'crwdns1196:0crwdne1196:0',
'header_color_help' => 'crwdns14334:0crwdne14334:0',
'header_color' => 'crwdns14366:0crwdne14366:0',
'header_color_help' => 'crwdns14368:0crwdne14368:0',
'link_dark_color' => 'crwdns14370:0crwdne14370:0',
'nav_link_color' => 'crwdns14372:0crwdne14372:0',
'nav_link_color_help' => 'crwdns14374:0crwdne14374:0',
'link_dark_color_help' => 'crwdns14376:0crwdne14376:0',
'link_light_color' => 'crwdns14378:0crwdne14378:0',
'link_light_color_help' => 'crwdns14380:0crwdne14380:0',
'info' => 'crwdns831:0crwdne831:0',
'label_logo_size' => 'crwdns5866:0crwdne5866:0',
'laravel' => 'crwdns1119:0crwdne1119:0',
@@ -350,7 +361,7 @@ return [
'labels_title' => 'crwdns6461:0crwdne6461:0',
'labels_title_help' => 'crwdns14274:0crwdne14274:0',
'labels_help' => 'crwdns12840:0crwdne12840:0',
'purge_help' => 'crwdns6469:0crwdne6469:0',
'purge_help' => 'crwdns14390:0crwdne14390:0',
'ldap_extension_warning' => 'crwdns6471:0crwdne6471:0',
'ldap_ad' => 'crwdns6473:0crwdne6473:0',
'ldap_test_label' => 'crwdns12892:0crwdne12892:0',
@@ -360,13 +371,14 @@ return [
'employee_number' => 'crwdns6475:0crwdne6475:0',
'create_admin_user' => 'crwdns6477:0crwdne6477:0',
'create_admin_success' => 'crwdns6479:0crwdne6479:0',
'create_admin_redirect' => 'crwdns6481:0crwdne6481:0',
'create_admin_redirect' => 'crwdns14408:0crwdne14408:0',
'setup_migrations' => 'crwdns6483:0crwdne6483:0',
'setup_no_migrations' => 'crwdns6485:0crwdne6485:0',
'setup_successful_migrations' => 'crwdns6487:0crwdne6487:0',
'setup_migration_output' => 'crwdns6489:0crwdne6489:0',
'setup_migration_create_user' => 'crwdns6491:0crwdne6491:0',
'setup_migration_create_user' => 'crwdns14410:0crwdne14410:0',
'ldap_settings_link' => 'crwdns6493:0crwdne6493:0',
'setup_create_user_page_explanation' => 'crwdns14412:0crwdne14412:0',
'slack_test' => 'crwdns6495:0crwdne6495:0',
'status_label_name' => 'crwdns12969:0crwdne12969:0',
'super_admin_only' => 'crwdns12971:0crwdne12971:0',
@@ -375,7 +387,7 @@ return [
'label2_template' => 'crwdns11727:0crwdne11727:0',
'label2_template_help' => 'crwdns11729:0crwdne11729:0',
'label2_title' => 'crwdns11731:0crwdne11731:0',
'label2_title_help' => 'crwdns11733:0crwdne11733:0',
'label2_title_help' => 'crwdns14486:0crwdne14486:0',
'label2_title_help_phold' => 'crwdns11767:0{COMPANY}crwdne11767:0',
'label2_asset_logo' => 'crwdns11737:0crwdne11737:0',
'label2_asset_logo_help' => 'crwdns11739:0crwdne11739:0',
@@ -390,6 +402,7 @@ return [
'select_template' => 'crwdns14284:0crwdne14284:0',
'label2_fields' => 'crwdns11753:0crwdne11753:0',
'label2_fields_help' => 'crwdns14286:0crwdne14286:0',
"label2_label_preview" => 'crwdns14494:0crwdne14494:0',
'purge_barcodes' => 'crwdns12985:0crwdne12985:0',
'help_asterisk_bold' => 'crwdns11757:0crwdne11757:0',
'help_blank_to_use' => 'crwdns11759:0crwdne11759:0',
@@ -490,11 +503,13 @@ return [
'general' => 'crwdns13220:0crwdne13220:0',
'intervals' => 'crwdns13222:0crwdne13222:0',
'logos' => 'crwdns13212:0crwdne13212:0',
'display' => 'crwdns14382:0crwdne14382:0',
'mapping' => 'crwdns13736:0crwdne13736:0',
'test' => 'crwdns13738:0crwdne13738:0',
'misc' => 'crwdns13208:0crwdne13208:0',
'misc_display' => 'crwdns13200:0crwdne13200:0',
'profiles' => 'crwdns13196:0crwdne13196:0',
'your_details' => 'crwdns14384:0crwdne14384:0',
'server' => 'crwdns13740:0crwdne13740:0',
'scoping' => 'crwdns13192:0crwdne13192:0',
'security' => 'crwdns13218:0crwdne13218:0',
+1 -1
View File
@@ -37,7 +37,7 @@ return [
'superadmin_permission_warning' => 'crwdns6751:0crwdne6751:0',
'admin_permission_warning' => 'crwdns6753:0crwdne6753:0',
'remove_group_memberships' => 'crwdns6755:0crwdne6755:0',
'warning_deletion_information' => 'crwdns10534:0crwdne10534:0',
'warning_deletion_information' => 'crwdns14444:0crwdne14444:0',
'update_user_assets_status' => 'crwdns10488:0crwdne10488:0',
'checkin_user_properties' => 'crwdns6763:0crwdne6763:0',
'remote_label' => 'crwdns6828:0crwdne6828:0',
+2 -1
View File
@@ -6,7 +6,8 @@ return array(
'declined' => 'crwdns14256:0crwdne14256:0',
'bulk_manager_warn' => 'crwdns1849:0crwdne1849:0',
'user_exists' => 'crwdns787:0crwdne787:0',
'user_not_found' => 'crwdns12744:0crwdne12744:0',
'cannot_delete' => 'crwdns14468:0crwdne14468:0',
'user_not_found' => 'crwdns14470:0crwdne14470:0',
'user_login_required' => 'crwdns789:0crwdne789:0',
'user_has_no_assets_assigned' => 'crwdns11868:0crwdne11868:0',
'user_password_required' => 'crwdns790:0crwdne790:0',
+1
View File
@@ -22,6 +22,7 @@ return [
'add_maintenance' => 'crwdns6307:0crwdne6307:0',
'append' => 'crwdns6309:0crwdne6309:0',
'new' => 'crwdns6311:0crwdne6311:0',
'show_hide_info' => 'crwdns14496:0crwdne14496:0',
'var' => [
'clone' => 'crwdns12598:0crwdne12598:0',
'edit' => 'crwdns12600:0crwdne12600:0',
+32 -15
View File
@@ -100,7 +100,11 @@ return [
'created_at' => 'crwdns10458:0crwdne10458:0',
'created_by' => 'crwdns10460:0crwdne10460:0',
'record_created' => 'crwdns5946:0crwdne5946:0',
'updated_at' => 'crwdns1856:0crwdne1856:0',
'updated_at' => 'crwdns14488:0crwdne14488:0',
'updated_plain' => 'crwdns14490:0crwdne14490:0',
'deleted_plain' => 'crwdns14500:0crwdne14500:0',
'purchased_plain' => 'crwdns14502:0crwdne14502:0',
'created_plain' => 'crwdns14492:0crwdne14492:0',
'currency' => 'crwdns1043:0crwdne1043:0', // this is deprecated
'currency_text' => 'crwdns12935:0crwdne12935:0', //
'current' => 'crwdns1044:0crwdne1044:0',
@@ -116,7 +120,7 @@ return [
'debug_warning_text' => 'crwdns1828:0crwdne1828:0',
'delete' => 'crwdns1046:0crwdne1046:0',
'delete_confirm' => 'crwdns2020:0crwdne2020:0',
'delete_confirm_no_undo' => 'crwdns14308:0crwdne14308:0',
'delete_confirm_no_undo' => 'crwdns14358:0crwdne14358:0',
'deleted' => 'crwdns1047:0crwdne1047:0',
'delete_seats' => 'crwdns1430:0crwdne1430:0',
'deletion_failed' => 'crwdns6117:0crwdne6117:0',
@@ -129,7 +133,7 @@ return [
'details' => 'crwdns1994:0crwdne1994:0',
'download' => 'crwdns1181:0crwdne1181:0',
'download_all' => 'crwdns6032:0crwdne6032:0',
'editprofile' => 'crwdns1051:0crwdne1051:0',
'editprofile' => 'crwdns14392:0crwdne14392:0',
'eol' => 'crwdns1052:0crwdne1052:0',
'email_domain' => 'crwdns1642:0crwdne1642:0',
'employee_number' => 'crwdns6776:0crwdne6776:0',
@@ -138,13 +142,13 @@ return [
'exclude_archived' => 'crwdns10514:0crwdne10514:0',
'exclude_deleted' => 'crwdns10516:0crwdne10516:0',
'example' => 'crwdns10462:0crwdne10462:0',
'files' => 'crwdns1996:0crwdne1996:0',
'file_name' => 'crwdns13518:0crwdne13518:0',
'file_type' => 'crwdns5970:0crwdne5970:0',
'filesize' => 'crwdns6788:0crwdne6788:0',
'file_uploads' => 'crwdns1154:0crwdne1154:0',
'file_upload' => 'crwdns6123:0crwdne6123:0',
'first_checkout' => 'crwdns14484:0crwdne14484:0',
'generate' => 'crwdns1140:0crwdne1140:0',
'generate_labels' => 'crwdns6125:0crwdne6125:0',
'github_markdown' => 'crwdns1981:0crwdne1981:0',
@@ -160,12 +164,13 @@ return [
'image_upload' => 'crwdns1058:0crwdne1058:0',
'filetypes_accepted_help' => 'crwdns12622:0crwdne12622:0',
'filetypes_size_help' => 'crwdns12624:0crwdne12624:0',
'image_filetypes_help' => 'crwdns14310:0crwdne14310:0',
'image_filetypes_help' => 'crwdns14360:0crwdne14360:0',
'unaccepted_image_type' => 'crwdns11365:0crwdne11365:0',
'import' => 'crwdns1411:0crwdne1411:0',
'documentation' => 'crwdns14462:0crwdne14462:0',
'import_this_file' => 'crwdns11922:0crwdne11922:0',
'importing' => 'crwdns6034:0crwdne6034:0',
'importing_help' => 'crwdns13750:0crwdne13750:0',
'importing_help' => 'crwdns14450:0crwdne14450:0',
'import-history' => 'crwdns1694:0crwdne1694:0',
'asset_maintenance' => 'crwdns1335:0crwdne1335:0',
'asset_maintenance_report' => 'crwdns1336:0crwdne1336:0',
@@ -205,7 +210,7 @@ return [
'manufacturers' => 'crwdns1068:0crwdne1068:0',
'markdown' => 'crwdns1574:0crwdne1574:0',
'min_amt' => 'crwdns1575:0crwdne1575:0',
'min_amt_help' => 'crwdns6139:0crwdne6139:0',
'min_amt_help' => 'crwdns14472:0crwdne14472:0',
'model_no' => 'crwdns1069:0crwdne1069:0',
'months' => 'crwdns1070:0crwdne1070:0',
'moreinfo' => 'crwdns1071:0crwdne1071:0',
@@ -241,7 +246,7 @@ return [
'previous' => 'crwdns1278:0crwdne1278:0',
'previous_page' => 'crwdns13476:0crwdne13476:0',
'processing' => 'crwdns1279:0crwdne1279:0',
'profile' => 'crwdns14342:0crwdne14342:0',
'profile' => 'crwdns14476:0crwdne14476:0',
'purchase_cost' => 'crwdns1830:0crwdne1830:0',
'purchase_date' => 'crwdns1831:0crwdne1831:0',
'qty' => 'crwdns1328:0crwdne1328:0',
@@ -263,7 +268,7 @@ return [
'rtd' => 'crwdns14338:0crwdne14338:0',
'requested_date' => 'crwdns6149:0crwdne6149:0',
'requested_assets' => 'crwdns6151:0crwdne6151:0',
'requested_assets_menu' => 'crwdns14312:0crwdne14312:0',
'requested_assets_menu' => 'crwdns14474:0crwdne14474:0',
'request_canceled' => 'crwdns1703:0crwdne1703:0',
'request_item' => 'crwdns12204:0crwdne12204:0',
'external_link_tooltip' => 'crwdns12206:0crwdne12206:0',
@@ -331,6 +336,7 @@ return [
'password' => 'crwdns13512:0crwdne13512:0',
'accepted' => 'crwdns1342:0crwdne1342:0',
'declined' => 'crwdns1343:0crwdne1343:0',
'declined_date' => 'crwdns14478:0crwdne14478:0',
'declined_note' => 'crwdns12184:0crwdne12184:0',
'unassigned' => 'crwdns11769:0crwdne11769:0',
'unaccepted_asset_report' => 'crwdns14314:0crwdne14314:0',
@@ -350,7 +356,7 @@ return [
'file_not_inlineable' => 'crwdns13624:0crwdne13624:0',
'open_new_window' => 'crwdns13520:0crwdne13520:0',
'file_upload_success' => 'crwdns11187:0crwdne11187:0',
'no_files_uploaded' => 'crwdns11189:0crwdne11189:0',
'no_files_uploaded' => 'crwdns14480:0crwdne14480:0',
'token_expired' => 'crwdns1578:0crwdne1578:0',
'login_enabled' => 'crwdns5984:0crwdne5984:0',
'login_disabled' => 'crwdns13618:0crwdne13618:0',
@@ -384,9 +390,10 @@ return [
'setup_step_3' => 'crwdns6181:0crwdne6181:0',
'setup_step_4' => 'crwdns6183:0crwdne6183:0',
'setup_config_check' => 'crwdns6185:0crwdne6185:0',
'setup_create_database' => 'crwdns12640:0crwdne12640:0',
'setup_create_admin' => 'crwdns12676:0crwdne12676:0',
'setup_done' => 'crwdns6191:0crwdne6191:0',
'setup_create_database' => 'crwdns14400:0crwdne14400:0',
'setup_create_admin' => 'crwdns14402:0crwdne14402:0',
'setup_next' => 'crwdns14404:0crwdne14404:0',
'setup_done' => 'crwdns14406:0crwdne14406:0',
'bulk_edit_about_to' => 'crwdns6193:0crwdne6193:0',
'checked_out' => 'crwdns6195:0crwdne6195:0',
'checked_out_to' => 'crwdns6197:0crwdne6197:0',
@@ -452,6 +459,7 @@ return [
'accessory_information' => 'crwdns6289:0crwdne6289:0',
'accessory_name' => 'crwdns6291:0crwdne6291:0',
'clone_item' => 'crwdns6293:0crwdne6293:0',
'clone' => 'crwdns14504:0crwdne14504:0',
'checkout_tooltip' => 'crwdns6295:0crwdne6295:0',
'checkin_tooltip' => 'crwdns12208:0crwdne12208:0',
'checkout_user_tooltip' => 'crwdns6299:0crwdne6299:0',
@@ -463,7 +471,7 @@ return [
'backup_delete_not_allowed' => 'crwdns10468:0crwdne10468:0',
'additional_files' => 'crwdns10470:0crwdne10470:0',
'shitty_browser' => 'crwdns10508:0crwdne10508:0',
'bulk_soft_delete' =>'crwdns10524:0crwdne10524:0',
'bulk_soft_delete' =>'crwdns14446:0crwdne14446:0',
'bulk_checkin_delete_success' => 'crwdns10526:0crwdne10526:0',
'bulk_checkin_success' => 'crwdns10528:0crwdne10528:0',
'set_to_null' => 'crwdns12738:0crwdne12738:0',
@@ -535,6 +543,12 @@ return [
'serial_number' => 'crwdns11633:0crwdne11633:0',
'item_notes' => 'crwdns11635:0crwdne11635:0',
'item_name_var' => 'crwdns11637:0crwdne11637:0',
'light_mode' => 'crwdns14362:0crwdne14362:0',
'dark_mode' => 'crwdns14364:0crwdne14364:0',
'light_dark' => 'crwdns14394:0crwdne14394:0',
'system_default' => 'crwdns14452:0crwdne14452:0',
'system_default_help' => 'crwdns14454:0crwdne14454:0',
'theme' => 'crwdns14398:0crwdne14398:0',
'error_user_company' => 'crwdns11833:0crwdne11833:0',
'error_user_company_multiple' => 'crwdns13828:0crwdne13828:0',
'error_user_company_accept_view' => 'crwdns11787:0crwdne11787:0',
@@ -619,6 +633,7 @@ return [
'something_went_wrong' => 'crwdns12306:0crwdne12306:0',
'close' => 'crwdns12308:0crwdne12308:0',
'expires' => 'crwdns12310:0crwdne12310:0',
'filename' => 'crwdns14482:0crwdne14482:0',
'map_fields'=> 'crwdns12784:0crwdne12784:0',
'remaining_var' => 'crwdns12612:0crwdne12612:0',
'label' => 'crwdns12690:0crwdne12690:0',
@@ -637,10 +652,12 @@ return [
'use_cloned_image' => 'crwdns13522:0crwdne13522:0',
'use_cloned_image_help' => 'crwdns13524:0crwdne13524:0',
'use_cloned_no_image_help' => 'crwdns13526:0crwdne13526:0',
'footer_credit' => 'crwdns13282:0crwdne13282:0',
'footer_credit' => 'crwdns14414:0crwdne14414:0',
'set_password' => 'crwdns13494:0crwdne13494:0',
'upload_deleted' => 'crwdns13768:0crwdne13768:0',
'child_locations' => 'crwdns13796:0crwdne13796:0',
'append' => 'crwdns14416:0crwdne14416:0',
'optional' => 'crwdns14448:0crwdne14448:0',
// Add form placeholders here
'placeholders' => [
+24
View File
@@ -0,0 +1,24 @@
<?php
return array(
'disabled_assoc' => [
'accessory' => 'crwdns14418:0crwdne14418:0',
'asset' => 'crwdns14420:0crwdne14420:0',
'category' => 'crwdns14422:0crwdne14422:0',
'company' => 'crwdns14424:0crwdne14424:0',
'component' => 'crwdns14426:0crwdne14426:0',
'custom_field' => 'crwdns14428:0crwdne14428:0',
'department' => 'crwdns14430:0crwdne14430:0',
'location' => 'crwdns14432:0crwdne14432:0',
'manufacturer' => 'crwdns14434:0crwdne14434:0',
'supplier' => 'crwdns14436:0crwdne14436:0',
'user' => 'crwdns14438:0crwdne14438:0',
'user_self' => 'crwdns14440:0crwdne14440:0',
],
'checkin_all' => [
'user' => 'crwdns14442:0crwdne14442:0'
],
);
+4 -1
View File
@@ -230,7 +230,10 @@ return [
|
*/
'attributes' => [],
'attributes' => [
'serials.*' => 'crwdns14386:0crwdne14386:0',
'asset_tags.*' => 'crwdns14388:0crwdne14388:0',
],
/*
|--------------------------------------------------------------------------
@@ -5,7 +5,7 @@ return [
'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.',
'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.',
+1 -1
View File
@@ -16,7 +16,7 @@ return array(
'seats' => 'sitplekke',
'termination_date' => 'Termyn Datum',
'to_email' => 'Gelisensieer om te e-pos',
'to_name' => 'Gelisensieer om te Noem',
'to_name' => 'Gelisensieer om',
'update' => 'Update Lisensie',
'checkout_help' => 'U moet \'n lisensie na \'n hardeware bate of \'n persoon nagaan. Jy kan albei kies, maar die eienaar van die bate moet ooreenstem met die persoon waarna jy die bate nagaan.'
);
@@ -41,6 +41,9 @@ return [
'backups_logged_out' => 'All existing users, including 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',
'color_preferences' => 'Color & Theme Settings',
'color_settings_help' => 'These settings will be used throughout Snipe-IT. Users are able to override the link colors by editing their account preferences to meet their individual readability requirements.',
'color_reset' => 'Reset to Default',
'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.)',
'custom_css' => 'Aangepaste CSS',
@@ -75,11 +78,19 @@ return [
'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.',
'footer_text_placeholder' => 'Optional footer text',
'general_settings' => 'Algemene instellings',
'api_url' => 'API Base URL',
'scim_url' => 'SCIM Base URL',
'general_settings_help' => 'Default EULA and more',
'generate_backup' => 'Genereer rugsteun',
'google_workspaces' => 'Google Workspaces',
'header_color' => 'Opskrif Kleur',
'header_color_help' => 'Scroll up to the top of the screen to preview the header color.',
'header_color' => 'Primary Theme Color',
'header_color_help' => 'Selecting a new color here will let you preview the color with your logo selection (if you have a site logo uploaded) in the header, however it will not be saved until you click the Save button.',
'link_dark_color' => 'Link Color for Dark Mode',
'nav_link_color' => 'Header Nav Link Color',
'nav_link_color_help' => 'Select a color for the links in your top level navigation. This color should be high enough contrast against your header color to be easily readable.',
'link_dark_color_help' => 'Select a color that will provide enough contrast for people that use Snipe-IT in dark mode.',
'link_light_color' => 'Link Color for Light Mode',
'link_light_color_help' => 'Select a color that will provide enough contrast for people that use Snipe-IT in light mode.',
'info' => 'Met hierdie instellings kan u sekere aspekte van u installasie aanpas.',
'label_logo_size' => 'Square logos look best - will be displayed in the top right of each asset label. ',
'laravel' => 'Laravel Weergawe',
@@ -350,7 +361,7 @@ return [
'labels_title' => 'Update Label Settings',
'labels_title_help' => 'Changes made here must be saved before they will be reflected in the labels or the preview below.',
'labels_help' => 'Barcodes &amp; label settings',
'purge_help' => 'Verwyder verwyderde rekords',
'purge_help' => 'Permanently delete soft-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',
'ldap_test_label' => 'Test LDAP Sync',
@@ -360,13 +371,14 @@ return [
'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!',
'create_admin_redirect' => 'Go To Dashboard',
'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',
'setup_migration_create_user' => 'Save User and Finish',
'ldap_settings_link' => 'LDAP Settings Page',
'setup_create_user_page_explanation' => 'Here you will create your first superadmin user and set some basic application setting defaults. (These can always be changed later in the Admin Settings section.) ',
'slack_test' => 'Test <i class="fab fa-slack"></i> Integration',
'status_label_name' => 'Status Label Name',
'super_admin_only' => 'Super Admin Only',
@@ -375,7 +387,7 @@ return [
'label2_template' => 'Template',
'label2_template_help' => 'Select which template to use for label generation',
'label2_title' => 'Titel',
'label2_title_help' => 'The title to show on labels that support it',
'label2_title_help' => 'The title to show on labels that support it. <br>This will occupy the first Label Field row.',
'label2_title_help_phold' => 'The placeholder <code>{COMPANY}</code> will be replaced with the asset&apos;s company name',
'label2_asset_logo' => 'Use Asset Logo',
'label2_asset_logo_help' => 'Use the logo of the asset&apos;s assigned company, rather than the value at <code>:setting_name</code>',
@@ -390,6 +402,7 @@ return [
'select_template' => 'Select a Template',
'label2_fields' => 'Field Definitions',
'label2_fields_help' => 'Fields can be added, removed, and reordered in the left column. For each field, multiple options for Label and DataSource can be added, removed, and reordered in the right column. Field changes made here will be reflected immediately in the preview below but must be saved for them to apply to new labels.',
"label2_label_preview" => 'Label Preview',
'purge_barcodes' => 'Purge Barcodes',
'help_asterisk_bold' => 'Text entered as <code>**text**</code> will be displayed as bold',
'help_blank_to_use' => 'Leave blank to use the value from <code>:setting_name</code>',
@@ -490,11 +503,13 @@ return [
'general' => 'General',
'intervals' => 'Intervals & Thresholds',
'logos' => 'Logos & Display',
'display' => 'Display Preferences',
'mapping' => 'LDAP Field Mapping',
'test' => 'Test LDAP Connection',
'misc' => 'Miscellaneous',
'misc_display' => 'Miscellaneous Display Options',
'profiles' => 'User Profiles',
'your_details' => 'Your Details',
'server' => 'Server Settings',
'scoping' => 'Scoping',
'security' => 'Security Preferences',
+1 -1
View File
@@ -37,7 +37,7 @@ return [
'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_information' => 'You are about to checkin ALL items from the :count user(s) listed below. Super admin names are highlighted in red.',
'warning_deletion_information' => 'You are about to checkin ALL items from the :count user(s) listed below.',
'update_user_assets_status' => 'Update all assets for these users to this status',
'checkin_user_properties' => 'Check in all properties associated with these users',
'remote_label' => 'This is a remote user',
+2 -1
View File
@@ -6,7 +6,8 @@ return array(
'declined' => 'You have successfully declined this item.',
'bulk_manager_warn' => 'Jou gebruikers is suksesvol opgedateer, maar jou bestuurderinskrywing is nie gestoor nie, want die bestuurder wat jy gekies het, was ook in die gebruikerslys om geredigeer te word, en gebruikers mag nie hul eie bestuurder wees nie. Kies asseblief u gebruikers weer, behalwe die bestuurder.',
'user_exists' => 'Gebruiker bestaan reeds!',
'user_not_found' => 'User does not exist or you do not have permission view them.',
'cannot_delete' => 'User does not exist or you do not have permission to delete them.',
'user_not_found' => 'User does not exist or you do not have permission to view them.',
'user_login_required' => 'Die aanmeldingsveld is nodig',
'user_has_no_assets_assigned' => 'No assets currently assigned to user.',
'user_password_required' => 'Die wagwoord is nodig.',
+1
View File
@@ -22,6 +22,7 @@ return [
'add_maintenance' => 'Add Maintenance',
'append' => 'Append',
'new' => 'Nuwe',
'show_hide_info' => 'Show/Hide More Information',
'var' => [
'clone' => 'Clone :item_type',
'edit' => 'Edit :item_type',
+32 -15
View File
@@ -100,7 +100,11 @@ return [
'created_at' => 'Created At',
'created_by' => 'Created By',
'record_created' => 'Record Created',
'updated_at' => 'Opgedateer op',
'updated_at' => 'Updated At',
'updated_plain' => 'Updated',
'deleted_plain' => 'geskrap',
'purchased_plain' => 'gekoop',
'created_plain' => 'Geskep',
'currency' => '$', // this is deprecated
'currency_text' => 'Currency', //
'current' => 'Huidige',
@@ -116,7 +120,7 @@ return [
'debug_warning_text' => 'Hierdie program word uitgevoer in die produksiemodus met debugging aangeskakel. Dit kan sensitiewe data blootstel indien u aansoek vir die buitewêreld toeganklik is. Deaktiveer debug-modus deur die <code>APP_DEBUG</code>-waarde in jou <code>.env</code>-lêer te stel na <code>false</code>.',
'delete' => 'verwyder',
'delete_confirm' => 'Are you sure you wish to delete :item?',
'delete_confirm_no_undo' => 'Are you sure you wish to delete :item? This cannot be undone.',
'delete_confirm_no_undo' => 'Are you sure, you wish to delete :item? This cannot be undone.',
'deleted' => 'geskrap',
'delete_seats' => 'Plekke verwyder',
'deletion_failed' => 'Deletion failed',
@@ -129,7 +133,7 @@ return [
'details' => 'Details',
'download' => 'Aflaai',
'download_all' => 'Download All',
'editprofile' => 'Wysig jou profiel',
'editprofile' => 'Edit Profile',
'eol' => 'EOL',
'email_domain' => 'E-pos Domein',
'employee_number' => 'Employee Number',
@@ -138,13 +142,13 @@ return [
'exclude_archived' => 'Exclude Archived Assets',
'exclude_deleted' => 'Exclude Deleted Assets',
'example' => 'Example: ',
'files' => 'Files',
'file_name' => 'File Name',
'file_type' => 'File Type',
'filesize' => 'File Size',
'file_uploads' => 'Lêeroplaaie',
'file_upload' => 'File Upload',
'first_checkout' => '1<sup>st</sup> Checkout',
'generate' => 'genereer',
'generate_labels' => 'Generate Labels',
'github_markdown' => 'This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
@@ -160,12 +164,13 @@ return [
'image_upload' => 'Laai prent op',
'filetypes_accepted_help' => 'Accepted filetype is :types. The maximum size allowed is :size.|Accepted filetypes are :types. The maximum upload size allowed is :size.',
'filetypes_size_help' => 'The maximum upload size allowed is :size.',
'image_filetypes_help' => 'Accepted filetypes are jpg, webp, png, gif, svg, and avif. The maximum upload size allowed is :size.',
'image_filetypes_help' => 'Accepted Filetypes are jpg, webp, png, gif, svg, and avif. The maximum upload size allowed is :size.',
'unaccepted_image_type' => 'This image file was not readable. Accepted filetypes are jpg, webp, png, gif, and svg. The mimetype of this file is: :mimetype.',
'import' => 'invoer',
'documentation' => 'Open documentation in a new link',
'import_this_file' => 'Map fields and process this file',
'importing' => 'Importing',
'importing_help' => 'The CSV should be comma-delimited and formatted with headers that match the ones in the <a href="https://snipe-it.readme.io/docs/importing" target="_new">sample CSVs in the documentation</a>.',
'importing_help' => 'The CSV should be comma-delimited and formatted with headers that match the ones in the <a href="https://snipe-it.readme.io/docs/importing" target="_new">sample CSVs in the documentation <i class="fa fa-external-link"></i></a>.',
'import-history' => 'Invoer Geskiedenis',
'asset_maintenance' => 'Bate Onderhoud',
'asset_maintenance_report' => 'Asset Maintenance Report',
@@ -205,7 +210,7 @@ return [
'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 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.',
'min_amt_help' => 'Minimum number of this item that should be available for checkout before an alert gets triggered. Leave blank if you do not wish to receive alerts for low inventory.',
'model_no' => 'Model Nr.',
'months' => 'maande',
'moreinfo' => 'Meer inligting',
@@ -241,7 +246,7 @@ return [
'previous' => 'vorige',
'previous_page' => 'Previous Page',
'processing' => 'verwerking',
'profile' => 'Your Profile',
'profile' => 'View Profile',
'purchase_cost' => 'Aankoopskoste',
'purchase_date' => 'Aankoop datum',
'qty' => 'HOEV',
@@ -263,7 +268,7 @@ return [
'rtd' => 'Klaar om te implementeer',
'requested_date' => 'Requested Date',
'requested_assets' => 'Requested Assets',
'requested_assets_menu' => 'Requestable Items',
'requested_assets_menu' => 'Requested Items',
'request_canceled' => 'Versoek gekanselleer',
'request_item' => 'Request this item',
'external_link_tooltip' => 'External link to',
@@ -331,6 +336,7 @@ return [
'password' => 'wagwoord',
'accepted' => 'aanvaarde',
'declined' => 'afgeneem',
'declined_date' => 'Date Declined',
'declined_note' => 'Declined Notes',
'unassigned' => 'Unassigned',
'unaccepted_asset_report' => 'Unaccepted Items',
@@ -350,7 +356,7 @@ return [
'file_not_inlineable' => 'The requested file cannot be opened inline in your browser. You can download it instead.',
'open_new_window' => 'Open this file in a new window',
'file_upload_success' => 'File upload success!',
'no_files_uploaded' => 'File upload success!',
'no_files_uploaded' => 'No files were uploaded.',
'token_expired' => 'Jou vormsessie het verval. Probeer asseblief weer.',
'login_enabled' => 'Login Enabled',
'login_disabled' => 'Login Disabled',
@@ -384,9 +390,10 @@ return [
'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 an admin user',
'setup_done' => 'Finished!',
'setup_create_database' => 'Create Database Tables',
'setup_create_admin' => 'Create an Admin User',
'setup_next' => 'volgende',
'setup_done' => 'Setup Complete!',
'bulk_edit_about_to' => 'You are about to edit the following: ',
'checked_out' => 'Gekontroleer',
'checked_out_to' => 'Checked out to',
@@ -453,6 +460,7 @@ return [
'accessory_information' => 'Accessory Information:',
'accessory_name' => 'Toebehore Naam:',
'clone_item' => 'Clone Item',
'clone' => 'Clone',
'checkout_tooltip' => 'Check this item out',
'checkin_tooltip' => 'Check this item in so that it is available for re-issue, re-imaging, etc',
'checkout_user_tooltip' => 'Check this item out to a user',
@@ -464,7 +472,7 @@ return [
'backup_delete_not_allowed' => 'Deleting backups has been disabled in the .env file. Contact support or your systems administrator.',
'additional_files' => 'Additional Files',
'shitty_browser' => 'No signature detected. If you are using an older browser, please use a more modern browser to complete your asset acceptance.',
'bulk_soft_delete' =>'Also soft-delete these users. Their asset history will remain intact unless/until you purge deleted records in the Admin Settings.',
'bulk_soft_delete' =>'Also soft-delete these users. Their item history will remain intact unless/until you purge deleted records in the Admin Settings.',
'bulk_checkin_delete_success' => 'Your selected users have been deleted and their items have been checked in.',
'bulk_checkin_success' => 'The items for the selected users have been checked in.',
'set_to_null' => 'Delete values for this selection|Delete values for all :selection_count selections ',
@@ -536,6 +544,12 @@ return [
'serial_number' => 'Serial Number',
'item_notes' => ':item Notes',
'item_name_var' => ':item Name',
'light_mode' => 'Light Mode',
'dark_mode' => 'Dark Mode',
'light_dark' => 'Light/Dark Mode',
'system_default' => 'Use System Settings',
'system_default_help' => 'This will reset your light/dark mode preferences to use the defaults set in your computer operating system preferences.',
'theme' => 'Theme',
'error_user_company' => 'Checkout target company and asset company do not match',
'error_user_company_multiple' => 'One or more of the checkout target company and asset company do not match',
'error_user_company_accept_view' => 'An Asset assigned to you belongs to a different company so you can\'t accept nor deny it, please check with your manager',
@@ -620,6 +634,7 @@ return [
'something_went_wrong' => 'Something went wrong with your request.',
'close' => 'Close',
'expires' => 'verstryk',
'filename' => 'File Name',
'map_fields'=> 'Map :item_type Fields',
'remaining_var' => ':count Remaining',
'label' => 'Label',
@@ -638,10 +653,12 @@ return [
'use_cloned_image' => 'Clone image from original',
'use_cloned_image_help' => 'You may clone the original image or you can upload a new one using the upload field below.',
'use_cloned_no_image_help' => 'This item does not have an associated image and instead inherits from the model or category it belongs to. If you would like to use a specific image for this item, you can upload a new one below.',
'footer_credit' => '<a target="_blank" href="https://snipeitapp.com" rel="noopener">Snipe-IT</a> is open source software, made with <i class="fa fa-heart" aria-hidden="true" style="color: #a94442; font-size: 10px" /></i><span class="sr-only">love</span> by <a href="https://bsky.app/profile/snipeitapp.com" rel="noopener">@snipeitapp.com</a>.',
'footer_credit' => '<a target="_blank" href="https://snipeitapp.com" rel="noopener">Snipe-IT</a> is open source software, made with <i class="fa fa-heart" aria-hidden="true" style="color: #a94442; font-size: 10px" /></i><span class="sr-only">love</span> by Grokability, Inc.',
'set_password' => 'Set a Password',
'upload_deleted' => 'Upload Deleted',
'child_locations' => 'Child Locations',
'append' => 'Append',
'optional' => 'OPTIONAL',
// Add form placeholders here
'placeholders' => [
+24
View File
@@ -0,0 +1,24 @@
<?php
return array(
'disabled_assoc' => [
'accessory' => 'This accessory cannot be deleted because it still has items, users, or locations associated with it',
'asset' => 'This asset cannot be deleted because it still has items associated with it',
'category' => 'This category cannot be deleted because it still has items associated with it',
'company' => 'This company cannot be deleted because it still has items or users associated with it',
'component' => 'This component cannot be deleted because it still has items associated with it',
'custom_field' => 'This custom field cannot be deleted because it is still associated with at least one fieldset',
'department' => 'This department cannot be deleted because it still has users associated with it',
'location' => 'This location cannot be deleted because it still has items or users associated with it',
'manufacturer' => 'This manufacturer cannot be deleted because it still has items associated with it',
'supplier' => 'This supplier cannot be deleted because it still has items associated with it',
'user' => 'This user cannot be deleted because it still has items associated with it',
'user_self' => 'You cannot delete yourself',
],
'checkin_all' => [
'user' => 'Checkin all items for this user and optionally delete them. You will be able to confirm this on the next page.'
],
);
+4 -1
View File
@@ -230,7 +230,10 @@ return [
|
*/
'attributes' => [],
'attributes' => [
'serials.*' => 'Serial Number',
'asset_tags.*' => 'Bate-tag',
],
/*
|--------------------------------------------------------------------------
@@ -5,7 +5,7 @@ return [
'manage' => 'Manage',
'field' => 'Field',
'about_fieldsets_title' => 'About Fieldsets',
'about_fieldsets_text' => 'Fieldsets allow you to create groups of custom fields that are frequently re-used used for specific asset model types.',
'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' => 'Encrypt the value of this field in the database',
'encrypt_field_help' => 'WARNING: Encrypting a field makes it unsearchable.',
+1 -1
View File
@@ -16,7 +16,7 @@ return array(
'seats' => 'Seats',
'termination_date' => 'Termination Date',
'to_email' => 'Licensed to Email',
'to_name' => 'Licensed to Name',
'to_name' => 'Licensed To',
'update' => 'Update License',
'checkout_help' => 'You must check a license out to a hardware asset or a person. You can select both, but the owner of the asset must match the person you\'re checking the asset out to.'
);

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