Compare commits
173 Commits
settings-l
...
form-row-c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6f233bc218 | ||
|
|
448f4b94af | ||
|
|
7c58fb93a9 | ||
|
|
80e4e4a40e | ||
|
|
7161d56ae2 | ||
|
|
1e85c7b575 | ||
|
|
03130f0947 | ||
|
|
4812e25e5c | ||
|
|
e6c49da11c | ||
|
|
6f3ee1914a | ||
|
|
9232ee781e | ||
|
|
3d675d375c | ||
|
|
d2edc77197 | ||
|
|
53716cbe90 | ||
|
|
8ce3fe0df0 | ||
|
|
affee0a990 | ||
|
|
6d5f515f48 | ||
|
|
d96844498f | ||
|
|
08609d4f56 | ||
|
|
be344c440f | ||
|
|
96cc2c9ee9 | ||
|
|
fb1a89442c | ||
|
|
359e0197bf | ||
|
|
6dbb836a01 | ||
|
|
3426afe5a8 | ||
|
|
4bbf923eb6 | ||
|
|
e2c3480194 | ||
|
|
73159076f6 | ||
|
|
90d040573d | ||
|
|
155481a442 | ||
|
|
2f31bfc5fe | ||
|
|
8d0c88dc74 | ||
|
|
07256fd833 | ||
|
|
776cd43a58 | ||
|
|
acb5309aab | ||
|
|
c68f81db3c | ||
|
|
ac8e341b37 | ||
|
|
36122b3966 | ||
|
|
79bcf472f0 | ||
|
|
55d86da846 | ||
|
|
e4f8c1ba3f | ||
|
|
c36236b7dc | ||
|
|
63994333d0 | ||
|
|
da4c7d8934 | ||
|
|
186721eca0 | ||
|
|
f53d939c86 | ||
|
|
23e6909708 | ||
|
|
cf421fe1c1 | ||
|
|
4d80e806e4 | ||
|
|
60a7b7f7ff | ||
|
|
90263eab06 | ||
|
|
9d8f251fc4 | ||
|
|
2b4986571c | ||
|
|
890d13bd52 | ||
|
|
e698e71137 | ||
|
|
d064a5530a | ||
|
|
ab4fbf6c19 | ||
|
|
728afa8361 | ||
|
|
b77019c16e | ||
|
|
6703448b80 | ||
|
|
776ba19a1f | ||
|
|
1f499e0d44 | ||
|
|
0a6eb61103 | ||
|
|
32a2eed5ec | ||
|
|
40a70d39d0 | ||
|
|
5697054e98 | ||
|
|
def5969e1c | ||
|
|
78a418630d | ||
|
|
6d76e7b2d4 | ||
|
|
f052c8b44c | ||
|
|
0e6991d56d | ||
|
|
06eab5f8a4 | ||
|
|
4a481e79c4 | ||
|
|
ee4abbcbaa | ||
|
|
dcc82d742f | ||
|
|
19cb2089d7 | ||
|
|
04923b06b0 | ||
|
|
e16755d491 | ||
|
|
742b0769a4 | ||
|
|
df68dca9dc | ||
|
|
4a5bf78d58 | ||
|
|
7947237489 | ||
|
|
1115205164 | ||
|
|
d5d01136c4 | ||
|
|
3d47277614 | ||
|
|
b937bea04f | ||
|
|
fff14632bc | ||
|
|
9bdf1a620f | ||
|
|
60099aa989 | ||
|
|
f3976e5dd8 | ||
|
|
d7d6893304 | ||
|
|
99549ce805 | ||
|
|
7eb15fe04d | ||
|
|
e2019a13ab | ||
|
|
4b7a06761a | ||
|
|
8f4a1f5801 | ||
|
|
891bec9cdb | ||
|
|
c5252ea583 | ||
|
|
82d553c180 | ||
|
|
71e34355b9 | ||
|
|
2bad8c72e4 | ||
|
|
6134ca01ac | ||
|
|
be8193ebff | ||
|
|
430ee46645 | ||
|
|
76fbbf29e8 | ||
|
|
3108159d95 | ||
|
|
f282a1ead7 | ||
|
|
324bc4957d | ||
|
|
c3b5c4dfae | ||
|
|
4ab5d97e86 | ||
|
|
b4696ef11e | ||
|
|
294ffb72a4 | ||
|
|
8c534d29d3 | ||
|
|
d6cb262f9d | ||
|
|
5211e2ae20 | ||
|
|
90832fd1ad | ||
|
|
889cbc69e1 | ||
|
|
15948370d4 | ||
|
|
63c5177b37 | ||
|
|
4fbfaf6b9f | ||
|
|
9e68497b63 | ||
|
|
0b9e13bf1e | ||
|
|
485d343e0f | ||
|
|
07f0e8a3be | ||
|
|
cc5afb1cd8 | ||
|
|
c69f1c0890 | ||
|
|
a8733bdedf | ||
|
|
4222e4eb51 | ||
|
|
5db4441f5c | ||
|
|
2bcfe97211 | ||
|
|
4e74c97c84 | ||
|
|
71a46c9bd6 | ||
|
|
1a7c7fdebf | ||
|
|
65ff3d414a | ||
|
|
9fa38b70c8 | ||
|
|
470172f53f | ||
|
|
81261d9e36 | ||
|
|
3ab2e20119 | ||
|
|
b773d576ea | ||
|
|
23feb64b5a | ||
|
|
87fe9d9d3d | ||
|
|
b1ef3f51cb | ||
|
|
e1b6488f8e | ||
|
|
a472dede2b | ||
|
|
263cc3f7a1 | ||
|
|
598612d4bf | ||
|
|
a07d83e583 | ||
|
|
d355812433 | ||
|
|
1afc14f5ab | ||
|
|
8947b667ae | ||
|
|
6b41796d44 | ||
|
|
6efe8eb55b | ||
|
|
4c8f8918e8 | ||
|
|
4cb5bb1855 | ||
|
|
eb007e025a | ||
|
|
18aefa9dee | ||
|
|
2ec540bd36 | ||
|
|
1374ec408a | ||
|
|
8f8fed2b79 | ||
|
|
a1e6f01fe9 | ||
|
|
d7496f22e5 | ||
|
|
7de25a1c37 | ||
|
|
78da89340c | ||
|
|
60606115fe | ||
|
|
6e90c8f6e6 | ||
|
|
a3bd58bda6 | ||
|
|
df3e8ec0f3 | ||
|
|
3fc651d659 | ||
|
|
c0a99d6b52 | ||
|
|
cba090f8eb | ||
|
|
3c81257325 | ||
|
|
b082fb6692 | ||
|
|
a384245368 |
@@ -190,6 +190,7 @@ APP_ALLOW_INSECURE_HOSTS=false
|
||||
GOOGLE_MAPS_API=
|
||||
LDAP_MEM_LIM=500M
|
||||
LDAP_TIME_LIM=600
|
||||
BACKUP_TIME_LIMIT=600
|
||||
IMPORT_TIME_LIMIT=600
|
||||
IMPORT_MEMORY_LIMIT=500M
|
||||
REPORT_TIME_LIMIT=12000
|
||||
|
||||
2
.github/workflows/tests-mysql.yml
vendored
2
.github/workflows/tests-mysql.yml
vendored
@@ -82,7 +82,7 @@ jobs:
|
||||
|
||||
- name: Upload Laravel logs as artifacts
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: laravel-logs-php-${{ matrix.php-version }}-run-${{ github.run_attempt }}
|
||||
path: |
|
||||
|
||||
2
.github/workflows/tests-postgres.yml
vendored
2
.github/workflows/tests-postgres.yml
vendored
@@ -81,7 +81,7 @@ jobs:
|
||||
|
||||
- name: Upload Laravel logs as artifacts
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: laravel-logs-php-${{ matrix.php-version }}-run-${{ github.run_attempt }}
|
||||
path: |
|
||||
|
||||
2
.github/workflows/tests-sqlite.yml
vendored
2
.github/workflows/tests-sqlite.yml
vendored
@@ -67,7 +67,7 @@ jobs:
|
||||
|
||||
- name: Upload Laravel logs as artifacts
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: laravel-logs-php-${{ matrix.php-version }}-run-${{ github.run_attempt }}
|
||||
path: |
|
||||
|
||||
@@ -8,8 +8,6 @@ use Symfony\Component\Console\Input\InputOption;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Symfony\Component\Console\Helper\ProgressIndicator;
|
||||
|
||||
ini_set('max_execution_time', env('IMPORT_TIME_LIMIT', 600)); //600 seconds = 10 minutes
|
||||
ini_set('memory_limit', env('IMPORT_MEMORY_LIMIT', '500M'));
|
||||
|
||||
/**
|
||||
* Class ObjectImportCommand
|
||||
@@ -52,6 +50,9 @@ class ObjectImportCommand extends Command
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
ini_set('max_execution_time', env('IMPORT_TIME_LIMIT', 600)); //600 seconds = 10 minutes
|
||||
ini_set('memory_limit', env('IMPORT_MEMORY_LIMIT', '500M'));
|
||||
|
||||
$this->progressIndicator = new ProgressIndicator($this->output);
|
||||
|
||||
$filename = $this->argument('filename');
|
||||
|
||||
@@ -57,7 +57,7 @@ class SendExpirationAlerts extends Command
|
||||
|
||||
if ($assets->count() > 0) {
|
||||
|
||||
Mail::to($recipients)->locale($settings->use_locale)->send(new ExpiringAssetsMail($assets, $alert_interval));
|
||||
Mail::to($recipients)->send(new ExpiringAssetsMail($assets, $alert_interval));
|
||||
|
||||
$this->table(
|
||||
[
|
||||
@@ -91,7 +91,7 @@ class SendExpirationAlerts extends Command
|
||||
->orderBy('termination_date', 'ASC')
|
||||
->get();
|
||||
if ($licenses->count() > 0) {
|
||||
Mail::to($recipients)->locale($settings->use_locale)->send(new ExpiringLicenseMail($licenses, $alert_interval));
|
||||
Mail::to($recipients)->send(new ExpiringLicenseMail($licenses, $alert_interval));
|
||||
|
||||
$this->table(
|
||||
[
|
||||
|
||||
@@ -16,7 +16,7 @@ class SendUpcomingAuditReport extends Command
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signature = 'snipeit:upcoming-audits';
|
||||
protected $signature = 'snipeit:upcoming-audits {--with-output : Display the results in a table in your console in addition to sending the email}';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
@@ -47,43 +47,69 @@ class SendUpcomingAuditReport extends Command
|
||||
$today = Carbon::now();
|
||||
$interval_date = $today->copy()->addDays($interval);
|
||||
|
||||
$assets = Asset::whereNull('deleted_at')->dueOrOverdueForAudit($settings)->orderBy('assets.next_audit_date', 'asc')->get();
|
||||
$this->info($assets->count() . ' assets must be audited in on or before ' . $interval_date . ' is deadline');
|
||||
|
||||
|
||||
if ((count($assets) !== 0) && ($assets->count() > 0) && ($settings->alert_email != '')) {
|
||||
// Send a rollup to the admin, if settings dictate
|
||||
$recipients = collect(explode(',', $settings->alert_email))
|
||||
->map(fn($item) => trim($item))
|
||||
->filter(fn($item) => !empty($item))
|
||||
->all();
|
||||
|
||||
|
||||
$this->info('Sending Admin SendUpcomingAuditNotification to: ' . $settings->alert_email);
|
||||
Mail::to($recipients)->locale($settings->use_locale)->send(new SendUpcomingAuditMail($assets, $settings->audit_warning_days));
|
||||
|
||||
$this->table(
|
||||
[
|
||||
trans('general.id'),
|
||||
trans('general.name'),
|
||||
trans('general.last_audit'),
|
||||
trans('general.next_audit_date'),
|
||||
trans('mail.Days'),
|
||||
trans('mail.supplier'),
|
||||
trans('mail.assigned_to'),
|
||||
|
||||
],
|
||||
$assets->map(fn($item) => [
|
||||
trans('general.id') => $item->id,
|
||||
trans('general.name') => $item->display_name,
|
||||
trans('general.last_audit') => $item->last_audit_formatted_date,
|
||||
trans('general.next_audit_date') => $item->next_audit_formatted_date,
|
||||
trans('mail.Days') => round($item->next_audit_diff_in_days),
|
||||
trans('mail.supplier') => $item->supplier ? $item->supplier->name : '',
|
||||
trans('mail.assigned_to') => $item->assignedTo ? $item->assignedTo->display_name : '',
|
||||
])
|
||||
);
|
||||
$assets_query = Asset::whereNull('deleted_at')->dueOrOverdueForAudit($settings)->orderBy('assets.next_audit_date', 'asc')->with('supplier');
|
||||
$asset_count = $assets_query->count();
|
||||
$this->info(number_format($asset_count) . ' assets must be audited on or before ' . $interval_date);
|
||||
if (!$this->option('with-output')) {
|
||||
$this->info('Run this command with the --with-output option to see the full list in the console.');
|
||||
}
|
||||
|
||||
|
||||
if ($asset_count > 0) {
|
||||
|
||||
$assets_for_email = $assets_query->limit(30)->get();
|
||||
|
||||
// Send a rollup to the admin, if settings dictate
|
||||
if ($settings->alert_email != '') {
|
||||
|
||||
$recipients = collect(explode(',', $settings->alert_email))
|
||||
->map(fn($item) => trim($item))
|
||||
->filter(fn($item) => !empty($item))
|
||||
->all();
|
||||
|
||||
Mail::to($recipients)->send(new SendUpcomingAuditMail($assets_for_email, $settings->audit_warning_days, $asset_count));
|
||||
$this->info('Audit notification sent to: ' . $settings->alert_email);
|
||||
|
||||
} else {
|
||||
$this->info('There is no admin alert email set so no email will be sent.');
|
||||
}
|
||||
|
||||
|
||||
|
||||
if ($this->option('with-output')) {
|
||||
|
||||
|
||||
// Get the full list if the user wants output in the console
|
||||
$assets_for_output = $assets_query->limit(null)->get();
|
||||
|
||||
$this->table(
|
||||
[
|
||||
trans('general.id'),
|
||||
trans('general.name'),
|
||||
trans('general.last_audit'),
|
||||
trans('general.next_audit_date'),
|
||||
trans('mail.Days'),
|
||||
trans('mail.supplier'),
|
||||
trans('mail.assigned_to'),
|
||||
|
||||
],
|
||||
$assets_for_output->map(fn($item) => [
|
||||
trans('general.id') => $item->id,
|
||||
trans('general.name') => $item->display_name,
|
||||
trans('general.last_audit') => $item->last_audit_formatted_date,
|
||||
trans('general.next_audit_date') => $item->next_audit_formatted_date,
|
||||
trans('mail.Days') => round($item->next_audit_diff_in_days),
|
||||
trans('mail.supplier') => $item->supplier ? $item->supplier->name : '',
|
||||
trans('mail.assigned_to') => $item->assignedTo ? $item->assignedTo->display_name : '',
|
||||
])
|
||||
);
|
||||
}
|
||||
|
||||
} else {
|
||||
$this->info('There are no assets due for audit in the next ' . $interval . ' days.');
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,6 +37,8 @@ class SystemBackup extends Command
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
ini_set('max_execution_time', env('BACKUP_TIME_LIMIT', 600)); //600 seconds = 10 minutes
|
||||
|
||||
if ($this->option('filename')) {
|
||||
$filename = $this->option('filename');
|
||||
|
||||
|
||||
@@ -40,6 +40,8 @@ class IconHelper
|
||||
return 'fa-solid fa-trash-arrow-up';
|
||||
case 'external-link':
|
||||
return 'fa fa-external-link';
|
||||
case 'link':
|
||||
return 'fa fa-link';
|
||||
case 'email':
|
||||
return 'fa-regular fa-envelope';
|
||||
case 'phone':
|
||||
@@ -140,7 +142,7 @@ class IconHelper
|
||||
case 'more-files':
|
||||
return 'fa-solid fa-laptop-file';
|
||||
case 'maintenances':
|
||||
return 'fas fa-wrench';
|
||||
return 'fa-solid fa-screwdriver-wrench';
|
||||
case 'seats':
|
||||
return 'far fa-list-alt';
|
||||
case 'globe-us':
|
||||
@@ -195,6 +197,10 @@ class IconHelper
|
||||
case 'note':
|
||||
case 'notes':
|
||||
return 'fas fa-sticky-note';
|
||||
case 'tip':
|
||||
return 'fa-solid fa-lightbulb';
|
||||
case 'highlight':
|
||||
return 'fa-solid fa-highlighter';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -116,8 +116,6 @@ class AcceptanceController extends Controller
|
||||
|
||||
$item = $acceptance->checkoutable_type::find($acceptance->checkoutable_id);
|
||||
|
||||
|
||||
|
||||
// If signatures are required, make sure we have one
|
||||
if (Setting::getSettings()->require_accept_signature == '1') {
|
||||
|
||||
@@ -164,11 +162,9 @@ class AcceptanceController extends Controller
|
||||
'signature' => (($sig_filename && array_key_exists('1', $encoded_image))) ? $encoded_image[1] : null,
|
||||
'logo' => ($encoded_logo) ?? null,
|
||||
'date_settings' => $settings->date_display_format,
|
||||
'admin' => auth()->user()->present()?->fullName,
|
||||
'qty' => $acceptance->qty ?? 1,
|
||||
];
|
||||
|
||||
|
||||
if ($request->input('asset_acceptance') == 'accepted') {
|
||||
|
||||
|
||||
|
||||
@@ -240,10 +240,6 @@ class BulkAssetsController extends Controller
|
||||
$custom_fields_to_null[str_replace('null', '', $key)] = $value;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if (! $request->filled('ids') || count($request->input('ids')) == 0) {
|
||||
return redirect($bulk_back_url)->with('error', trans('admin/hardware/message.update.no_assets_selected'));
|
||||
@@ -274,6 +270,7 @@ class BulkAssetsController extends Controller
|
||||
|| ($request->filled('company_id'))
|
||||
|| ($request->filled('status_id'))
|
||||
|| ($request->filled('model_id'))
|
||||
|| ($request->filled('notes'))
|
||||
|| ($request->filled('next_audit_date'))
|
||||
|| ($request->filled('asset_eol_date'))
|
||||
|| ($request->filled('null_name'))
|
||||
|
||||
@@ -45,6 +45,7 @@ abstract class Controller extends BaseController
|
||||
'accessories' => Accessory::class,
|
||||
'maintenances' => Maintenance::class,
|
||||
'assets' => Asset::class,
|
||||
'audits' => Asset::class,
|
||||
'components' => Component::class,
|
||||
'consumables' => Consumable::class,
|
||||
'hardware' => Asset::class,
|
||||
@@ -58,6 +59,7 @@ abstract class Controller extends BaseController
|
||||
'accessories' => 'private_uploads/accessories/',
|
||||
'maintenances' => 'private_uploads/maintenances/',
|
||||
'assets' => 'private_uploads/assets/',
|
||||
'audits' => 'private_uploads/audits/',
|
||||
'components' => 'private_uploads/components/',
|
||||
'consumables' => 'private_uploads/consumables/',
|
||||
'hardware' => 'private_uploads/assets/',
|
||||
@@ -71,6 +73,7 @@ abstract class Controller extends BaseController
|
||||
'accessories' => 'accessory',
|
||||
'maintenances' => 'maintenance',
|
||||
'assets' => 'asset',
|
||||
'audits' => 'audits',
|
||||
'components' => 'component',
|
||||
'consumables' => 'consumable',
|
||||
'hardware' => 'asset',
|
||||
|
||||
@@ -65,6 +65,7 @@ class GroupsController extends Controller
|
||||
$group->notes = $request->input('notes');
|
||||
|
||||
if ($group->save()) {
|
||||
$group->users()->sync($request->input('associated_users'));
|
||||
return redirect()->route('groups.index')->with('success', trans('admin/groups/message.success.create'));
|
||||
}
|
||||
|
||||
@@ -88,7 +89,10 @@ class GroupsController extends Controller
|
||||
$groupPermissions = [];
|
||||
}
|
||||
$selected_array = Helper::selectedPermissionsArray($permissions, $groupPermissions);
|
||||
return view('groups.edit', compact('group', 'permissions', 'selected_array', 'groupPermissions'));
|
||||
$associated_users = $group->users()->get();
|
||||
|
||||
//dd($associated_users->toArray());
|
||||
return view('groups.edit', compact('group', 'permissions', 'selected_array', 'groupPermissions'))->with('associated_users', $associated_users);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -105,8 +109,10 @@ class GroupsController extends Controller
|
||||
$group->permissions = json_encode($request->input('permission'));
|
||||
$group->notes = $request->input('notes');
|
||||
|
||||
|
||||
if (! config('app.lock_passwords')) {
|
||||
if ($group->save()) {
|
||||
$group->users()->sync($request->input('associated_users'));
|
||||
return redirect()->route('groups.index')->with('success', trans('admin/groups/message.success.update'));
|
||||
}
|
||||
|
||||
|
||||
@@ -68,6 +68,12 @@ class MaintenancesController extends Controller
|
||||
{
|
||||
$this->authorize('update', Asset::class);
|
||||
|
||||
\Log::error(print_r($request->input('selected_assets[]'), true));
|
||||
|
||||
if (!$request->filled('selected_assets')) {
|
||||
return redirect()->back()->withInput()->with('error', 'No assets were selected.');
|
||||
}
|
||||
|
||||
$assets = Asset::whereIn('id', $request->input('selected_assets'))->get();
|
||||
|
||||
// Loop through the selected assets
|
||||
|
||||
@@ -436,10 +436,8 @@ class ReportsController extends Controller
|
||||
// Open output stream
|
||||
$handle = fopen('php://output', 'w');
|
||||
stream_set_timeout($handle, 2000);
|
||||
|
||||
if ($request->filled('use_bom')) {
|
||||
fprintf($handle, chr(0xEF).chr(0xBB).chr(0xBF));
|
||||
}
|
||||
|
||||
fprintf($handle, chr(0xEF).chr(0xBB).chr(0xBF));
|
||||
|
||||
$header = [];
|
||||
|
||||
|
||||
@@ -109,7 +109,7 @@ class SettingsSamlRequest extends FormRequest
|
||||
];
|
||||
|
||||
$pkey = openssl_pkey_new([
|
||||
'private_key_bits' => config('app.saml_key_size'),
|
||||
'private_key_bits' => (int) config('app.saml_key_size'),
|
||||
'private_key_type' => OPENSSL_KEYTYPE_RSA,
|
||||
]);
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ class StoreNotificationSettings extends FormRequest
|
||||
],
|
||||
'alert_threshold' => 'numeric|nullable',
|
||||
'alert_interval' => 'numeric|nullable|gt:0',
|
||||
'audit_warning_days' => 'numeric|nullable',
|
||||
'audit_warning_days' => 'numeric|nullable|gte:0',
|
||||
'due_checkin_days' => 'numeric|nullable|gt:0',
|
||||
'audit_interval' => 'numeric|nullable|gt:0',
|
||||
];
|
||||
|
||||
@@ -149,6 +149,7 @@ class ActionlogsTransformer
|
||||
'filename' => $actionlog->filename,
|
||||
'inlineable' => StorageHelper::allowSafeInline($actionlog->uploads_file_path()),
|
||||
'exists_on_disk' => Storage::exists($actionlog->uploads_file_path()) ? true : false,
|
||||
'mediatype' => StorageHelper::getMediaType($actionlog->uploads_file_path()),
|
||||
] : null,
|
||||
|
||||
'item' => ($actionlog->item) ? [
|
||||
|
||||
@@ -68,7 +68,7 @@ class AssetModelsTransformer
|
||||
'default_fieldset_values' => $default_field_values,
|
||||
'eol' => ($assetmodel->eol > 0) ? $assetmodel->eol.' months' : 'None',
|
||||
'requestable' => ($assetmodel->requestable == '1') ? true : false,
|
||||
'require_serial' => $assetmodel->require_serial,
|
||||
'require_serial' => ($assetmodel->require_serial == '1') ? true : false,
|
||||
'notes' => Helper::parseEscapedMarkedownInline($assetmodel->notes),
|
||||
'created_by' => ($assetmodel->adminuser) ? [
|
||||
'id' => (int) $assetmodel->adminuser->id,
|
||||
|
||||
@@ -44,7 +44,7 @@ class AssetImporter extends ItemImporter
|
||||
foreach ($this->customFields as $customField) {
|
||||
$customFieldValue = $this->array_smart_custom_field_fetch($row, $customField);
|
||||
|
||||
if ($customFieldValue) {
|
||||
if (!is_null($customFieldValue)) {
|
||||
if ($customField->field_encrypted == 1) {
|
||||
$this->item['custom_fields'][$customField->db_column_name()] = Crypt::encrypt($customFieldValue);
|
||||
$this->log('Custom Field '.$customField->name.': '.Crypt::encrypt($customFieldValue));
|
||||
|
||||
@@ -87,7 +87,7 @@ class CheckoutAssetMail extends Mailable
|
||||
$name = $this->target->assignedto?->display_name;
|
||||
}
|
||||
else if($this->target instanceof Location){
|
||||
$name = $this->target->manager->name;
|
||||
$name = $this->target->manager?->name;
|
||||
}
|
||||
|
||||
// Check if the item has custom fields associated with it
|
||||
|
||||
@@ -17,10 +17,11 @@ class SendUpcomingAuditMail extends Mailable
|
||||
/**
|
||||
* Create a new message instance.
|
||||
*/
|
||||
public function __construct($params, $threshold)
|
||||
public function __construct($params, $threshold, $total)
|
||||
{
|
||||
$this->assets = $params;
|
||||
$this->threshold = $threshold;
|
||||
$this->total = $total;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -32,7 +33,7 @@ class SendUpcomingAuditMail extends Mailable
|
||||
|
||||
return new Envelope(
|
||||
from: $from,
|
||||
subject: trans_choice('mail.upcoming-audits', $this->assets->count(), ['count' => $this->assets->count(), 'threshold' => $this->threshold]),
|
||||
subject: trans_choice('mail.upcoming-audits', $this->total, ['count' => $this->total, 'threshold' => $this->threshold]),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -49,6 +50,7 @@ class SendUpcomingAuditMail extends Mailable
|
||||
with: [
|
||||
'assets' => $this->assets,
|
||||
'threshold' => $this->threshold,
|
||||
'total' => $this->total,
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ use App\Helpers\Helper;
|
||||
use App\Models\Traits\Acceptable;
|
||||
use App\Models\Traits\CompanyableTrait;
|
||||
use App\Models\Traits\HasUploads;
|
||||
use App\Models\Traits\Loggable;
|
||||
use App\Models\Traits\Searchable;
|
||||
use App\Presenters\Presentable;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
|
||||
@@ -478,6 +478,10 @@ class Actionlog extends SnipeModel
|
||||
$object = 'models';
|
||||
}
|
||||
|
||||
if ($this->action_type == 'audit') {
|
||||
$object = 'audits';
|
||||
}
|
||||
|
||||
return route('ui.files.show', [
|
||||
'object_type' => $object,
|
||||
'id' => $this->item_id,
|
||||
|
||||
@@ -9,6 +9,8 @@ use App\Http\Traits\UniqueUndeletedTrait;
|
||||
use App\Models\Traits\Acceptable;
|
||||
use App\Models\Traits\CompanyableTrait;
|
||||
use App\Models\Traits\HasUploads;
|
||||
use App\Models\Traits\Loggable;
|
||||
use App\Models\Traits\Requestable;
|
||||
use App\Models\Traits\Searchable;
|
||||
use App\Presenters\AssetPresenter;
|
||||
use App\Presenters\Presentable;
|
||||
@@ -399,6 +401,12 @@ class Asset extends Depreciable
|
||||
|
||||
}
|
||||
|
||||
protected function expectedCheckinFormattedDate(): Attribute
|
||||
{
|
||||
return Attribute:: make(
|
||||
get: fn(mixed $value, array $attributes) => array_key_exists('expected_checkin', $attributes) ? Helper::getFormattedDateObject($attributes['expected_checkin'], 'date', false) : null,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Establishes the asset -> company relationship
|
||||
@@ -931,25 +939,37 @@ class Asset extends Depreciable
|
||||
*/
|
||||
public static function getExpiringWarrantyOrEol($days = 30)
|
||||
{
|
||||
|
||||
return self::where('archived', '=', '0')
|
||||
$now = now();
|
||||
$end = now()->addDays($days);
|
||||
|
||||
$expired_assets = self::query()
|
||||
->where('archived', '=', '0')
|
||||
->NotArchived()
|
||||
->whereNull('deleted_at')
|
||||
->where(function ($query) use ($days) {
|
||||
// Check for manual asset EOL first
|
||||
$query->where(function ($query) use ($days) {
|
||||
$query->whereNotNull('asset_eol_date')
|
||||
->whereBetween('asset_eol_date', [Carbon::now(), Carbon::now()->addDays($days)]);
|
||||
// Otherwise use the warranty months + purchase date + threshold
|
||||
})->orWhere(function ($query) use ($days) {
|
||||
$query->whereNotNull('purchase_date')
|
||||
->whereNotNull('warranty_months')
|
||||
->whereBetween('purchase_date', [Carbon::now(), Carbon::now()->addMonths('assets.warranty_months')->addDays($days)]);
|
||||
});
|
||||
})
|
||||
->orderBy('asset_eol_date', 'ASC')
|
||||
->orderBy('purchase_date', 'ASC')
|
||||
->whereNotNull('asset_eol_date')
|
||||
->whereBetween('asset_eol_date', [$now, $end])
|
||||
->get();
|
||||
|
||||
$assets_with_warranties = self::query()
|
||||
->where('archived', '=', '0')
|
||||
->NotArchived()
|
||||
->whereNull('deleted_at')
|
||||
->whereNotNull('purchase_date')
|
||||
->whereNotNull('warranty_months')
|
||||
->get();
|
||||
|
||||
$expired_warranties = $assets_with_warranties->filter(function ($asset) use ($now, $end) {
|
||||
$expiration_window = Carbon::parse($asset->purchase_date)->addMonths((int) $asset->warranty_months);
|
||||
|
||||
return $expiration_window->betweenIncluded($now, $end);
|
||||
});
|
||||
return $expired_assets->concat($expired_warranties)
|
||||
->unique('id')
|
||||
->sortBy([
|
||||
['asset_eol_date', 'ASC'],
|
||||
['purchase_date', 'ASC']
|
||||
])
|
||||
->values();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -2,16 +2,18 @@
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use App\Http\Traits\TwoColumnUniqueUndeletedTrait;
|
||||
use App\Models\Traits\HasUploads;
|
||||
use App\Models\Traits\Loggable;
|
||||
use App\Models\Traits\Requestable;
|
||||
use App\Models\Traits\Searchable;
|
||||
use App\Presenters\AssetModelPresenter;
|
||||
use App\Presenters\Presentable;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Watson\Validating\ValidatingTrait;
|
||||
use \App\Presenters\AssetModelPresenter;
|
||||
use App\Http\Traits\TwoColumnUniqueUndeletedTrait;
|
||||
|
||||
/**
|
||||
* Model for Asset Models. Asset Models contain higher level
|
||||
|
||||
@@ -190,6 +190,11 @@ class CheckoutAcceptance extends Model
|
||||
}
|
||||
|
||||
$pdf->Ln();
|
||||
|
||||
// Check for CJK in the translation string for date. (This is a good proxy for the rest of the document)
|
||||
Helper::hasRtl(trans('general.date')) ? $pdf->setRTL(true) : $pdf->setRTL(false);
|
||||
Helper::isCjk(trans('general.date')) ? $pdf->SetFont('cid0cs', '', 9) : $pdf->SetFont('dejavusans', '', 8, '', true);
|
||||
|
||||
$pdf->writeHTML(trans('general.date') . ': ' . Helper::getFormattedDateObject(now(), 'datetime', false), true, 0, true, 0, '');
|
||||
|
||||
if ($data['company_name'] != null) {
|
||||
@@ -224,7 +229,6 @@ class CheckoutAcceptance extends Model
|
||||
foreach ($eula_lines as $eula_line) {
|
||||
Helper::hasRtl($eula_line) ? $pdf->setRTL(true) : $pdf->setRTL(false);
|
||||
Helper::isCjk($eula_line) ? $pdf->SetFont('cid0cs', '', 9) : $pdf->SetFont('dejavusans', '', 8, '', true);
|
||||
|
||||
$pdf->writeHTML(Helper::parseEscapedMarkedown($eula_line), true, 0, true, 0, '');
|
||||
}
|
||||
$pdf->Ln();
|
||||
@@ -239,8 +243,11 @@ class CheckoutAcceptance extends Model
|
||||
$pdf->Ln();
|
||||
}
|
||||
|
||||
Helper::hasRtl(trans('general.notes')) ? $pdf->setRTL(true) : $pdf->setRTL(false);
|
||||
Helper::isCjk(trans('general.notes')) ? $pdf->SetFont('cid0cs', '', 9) : $pdf->SetFont('dejavusans', '', 8, '', true);
|
||||
|
||||
if ($data['note'] != null) {
|
||||
Helper::isCjk($data['note']) ? $pdf->SetFont('cid0cs', '', 9) : $pdf->SetFont('dejavusans', '', 8, '', true);
|
||||
Helper::isCjk(trans('general.notes')) ? $pdf->SetFont('cid0cs', '', 9) : $pdf->SetFont('dejavusans', '', 8, '', true);
|
||||
$pdf->writeHTML(trans('general.notes') . ': ' . e($data['note']), true, 0, true, 0, '');
|
||||
$pdf->Ln();
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ namespace App\Models;
|
||||
use App\Helpers\Helper;
|
||||
use App\Models\Traits\CompanyableTrait;
|
||||
use App\Models\Traits\HasUploads;
|
||||
use App\Models\Traits\Loggable;
|
||||
use App\Models\Traits\Searchable;
|
||||
use App\Presenters\Presentable;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
|
||||
@@ -6,6 +6,7 @@ use App\Helpers\Helper;
|
||||
use App\Models\Traits\Acceptable;
|
||||
use App\Models\Traits\CompanyableTrait;
|
||||
use App\Models\Traits\HasUploads;
|
||||
use App\Models\Traits\Loggable;
|
||||
use App\Models\Traits\Searchable;
|
||||
use App\Presenters\ConsumablePresenter;
|
||||
use App\Presenters\Presentable;
|
||||
|
||||
@@ -104,6 +104,78 @@ class Ldap extends Model
|
||||
return $connection;
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds user via Admin search *first*, and _then_ try to bind as that user, returning the user attributes on success,
|
||||
* or false on failure. This enables login when the DN is harder to programmatically 'guess' due to having users in
|
||||
* various different OU's or other LDAP entities.
|
||||
*/
|
||||
public static function findAndBindMultiOU(string $baseDn, string $filterQuery, string $password, int $slow_failure = 3): array|false
|
||||
{
|
||||
/**
|
||||
* If you *don't* set the slow_failure variable, do note that we might permit timing attacks in here - if
|
||||
* your find results come back 'slow' when a user *does* exist, but fast if they *don't* exist, then you
|
||||
* can use this to enumerate users.
|
||||
*
|
||||
* Even if that's *not* true, we still might have an issue: if we don't find the user, then we don't even _try_
|
||||
* to bind as them. Again, that could permit a timing attack.
|
||||
*
|
||||
* Instead of checking every little thing, we just wrap everything in a try/catch in order to unify the
|
||||
* 'slow_failure' treatment. All failures are re-raised as exceptions so that all failures exit from the
|
||||
* same place.
|
||||
*/
|
||||
$connection = null;
|
||||
$admin_conn = null;
|
||||
try {
|
||||
/**
|
||||
* First we get an 'admin' connection, which will need search permissions. That was already a requirement
|
||||
* here, so that's not a big lift. But it _is_ possible to configure LDAP to only login, and *not* to be
|
||||
* able to import lists of users. In that case, this function *will not work* - and you should use the
|
||||
* legacy 'findAndBindUserLdap' method, below. Otherwise, it looks like this would attempt an anonymous
|
||||
* bind - which you might want, but you probably don't.
|
||||
*
|
||||
**/
|
||||
$admin_conn = self::connectToLdap();
|
||||
self::bindAdminToLdap($admin_conn);
|
||||
$results = ldap_search($admin_conn, $baseDn, $filterQuery);
|
||||
$entry_count = ldap_count_entries($admin_conn, $results);
|
||||
if ($entry_count != 1) {
|
||||
throw new \Exception('Wrong number of entries found: ' . $entry_count);
|
||||
}
|
||||
$entry = ldap_first_entry($admin_conn, $results);
|
||||
$user = ldap_get_attributes($admin_conn, $entry);
|
||||
$userDn = ldap_get_dn($admin_conn, $entry);
|
||||
if (!$userDn) {
|
||||
throw new \Exception("No user DN found");
|
||||
}
|
||||
\Log::debug("FOUND DN IS: $userDn");
|
||||
// The temptation now is to do ldap_unbind on the $admin_conn, but that gets handled in the 'finally' below.
|
||||
// I don't know if that means a separate 'connection' is maintained to the LDAP server or not, and would
|
||||
// definitely prefer to not do that if we can avoid it. But I don't know enough about the LDAP protocol to
|
||||
// be certain that that happens.
|
||||
|
||||
//now we try to log in (bind) as that found user
|
||||
$connection = self::connectToLdap();
|
||||
$bind_results = ldap_bind($connection, $userDn, $password);
|
||||
if (!$bind_results) {
|
||||
throw new \Exception("Unable to bind as user");
|
||||
}
|
||||
return array_change_key_case($user);
|
||||
} catch (\Exception $e) {
|
||||
\Log::debug("Exception on fast find-and-bind: " . $e->getMessage());
|
||||
if ($slow_failure) {
|
||||
sleep($slow_failure);
|
||||
}
|
||||
return false; //TODO - make this null instead for a slightly nicer type signature
|
||||
} finally {
|
||||
if ($admin_conn) {
|
||||
ldap_unbind($admin_conn);
|
||||
}
|
||||
if ($connection) {
|
||||
ldap_unbind($connection);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Binds/authenticates the user to LDAP, and returns their attributes.
|
||||
@@ -147,25 +219,27 @@ class Ldap extends Model
|
||||
|
||||
Log::debug('Filter query: '.$filterQuery);
|
||||
|
||||
// only try this if we have an Admin username set; otherwise use the 'legacy' method
|
||||
if (($settings->ldap_uname) && ($baseDn)) {
|
||||
// in the fallowing call, we pick a slow-failure of 0 because we might need to fall through to 'legacy'
|
||||
$fast_bind = self::findAndBindMultiOU($baseDn, $filterQuery, $password, 0);
|
||||
if ($fast_bind) {
|
||||
\Log::debug("Fast bind worked");
|
||||
return $fast_bind;
|
||||
}
|
||||
\Log::debug("Fast bind failed; falling through to legacy bind");
|
||||
}
|
||||
|
||||
if (! $ldapbind = @ldap_bind($connection, $userDn, $password)) {
|
||||
Log::debug("Status of binding user: $userDn to directory: (directly!) ".($ldapbind ? "success" : "FAILURE"));
|
||||
if (! $ldapbind = self::bindAdminToLdap($connection)) {
|
||||
/*
|
||||
* TODO PLEASE:
|
||||
*
|
||||
* this isn't very clear, so it's important to note: the $ldapbind value is never correctly returned - we never 'return true' from self::bindAdminToLdap() (the function
|
||||
* just "falls off the end" without ever explictly returning 'true')
|
||||
*
|
||||
* but it *does* have an interesting side-effect of checking for the LDAP password being incorrectly encrypted with the wrong APP_KEY, so I'm leaving it in for now.
|
||||
*
|
||||
* If it *did* correctly return 'true' on a succesful bind, it would _probably_ allow users to log in with an incorrect password. Which would be horrible!
|
||||
*
|
||||
* Let's definitely fix this at the next refactor!!!!
|
||||
*
|
||||
*/
|
||||
Log::debug("Status of binding Admin user: $userDn to directory instead: ".($ldapbind ? "success" : "FAILURE"));
|
||||
return false;
|
||||
// replicate the old bad-decryption-key detection behavior here
|
||||
try {
|
||||
Crypt::decrypt(Setting::getSettings()->ldap_pword);
|
||||
} catch (\Exception $e) {
|
||||
throw new \Exception('Your app key has changed! Could not decrypt LDAP password using your current app key, so LDAP authentication has been disabled. Login with a local account, update the LDAP password and re-enable it in Admin > Settings.');
|
||||
}
|
||||
//regardless of anything else; stuff isn't working. Return false.
|
||||
return false;
|
||||
}
|
||||
|
||||
if (! $results = ldap_search($connection, $baseDn, $filterQuery)) {
|
||||
|
||||
@@ -5,6 +5,7 @@ namespace App\Models;
|
||||
use App\Helpers\Helper;
|
||||
use App\Models\Traits\CompanyableTrait;
|
||||
use App\Models\Traits\HasUploads;
|
||||
use App\Models\Traits\Loggable;
|
||||
use App\Models\Traits\Searchable;
|
||||
use App\Presenters\Presentable;
|
||||
use Carbon\Carbon;
|
||||
|
||||
@@ -4,6 +4,7 @@ namespace App\Models;
|
||||
|
||||
use App\Models\Traits\Acceptable;
|
||||
use App\Models\Traits\CompanyableChildTrait;
|
||||
use App\Models\Traits\Loggable;
|
||||
use App\Notifications\CheckinLicenseNotification;
|
||||
use App\Notifications\CheckoutLicenseNotification;
|
||||
use App\Presenters\Presentable;
|
||||
@@ -75,7 +76,7 @@ class LicenseSeat extends SnipeModel implements ICompanyableChild
|
||||
protected function displayName(): Attribute
|
||||
{
|
||||
return Attribute:: make(
|
||||
get: fn(mixed $value) => $this->license->name,
|
||||
get: fn(mixed $value) => $this->license?->name,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ namespace App\Models;
|
||||
use App\Http\Traits\UniqueUndeletedTrait;
|
||||
use App\Models\Traits\CompanyableTrait;
|
||||
use App\Models\Traits\HasUploads;
|
||||
use App\Models\Traits\Loggable;
|
||||
use App\Models\Traits\Searchable;
|
||||
use App\Presenters\Presentable;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
|
||||
@@ -5,6 +5,7 @@ namespace App\Models;
|
||||
use App\Helpers\Helper;
|
||||
use App\Models\Traits\CompanyableChildTrait;
|
||||
use App\Models\Traits\HasUploads;
|
||||
use App\Models\Traits\Loggable;
|
||||
use App\Models\Traits\Searchable;
|
||||
use App\Presenters\Presentable;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
namespace App\Models;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Database\Eloquent\Casts\Attribute;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Notifications\Notifiable;
|
||||
@@ -121,36 +120,6 @@ class Setting extends Model
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the locale to use in some places in the app where we don't
|
||||
* have access to the user context (i.e. email notifications where the alert address
|
||||
* might not be an actual user object or it's being run via cli.)
|
||||
*
|
||||
* @return \Illuminate\Database\Eloquent\Casts\Attribute
|
||||
*/
|
||||
protected function useLocale(): Attribute
|
||||
{
|
||||
|
||||
return Attribute:: make(
|
||||
get: function(mixed $value, array $attributes) {
|
||||
|
||||
// Use current user's language
|
||||
if ((request()->user()) && (request()->user()->locale)) {
|
||||
return request()->user()->locale;
|
||||
|
||||
// Fall back to app settings
|
||||
} elseif ($attributes['locale'] != '') {
|
||||
return $attributes['locale'];
|
||||
}
|
||||
|
||||
// Fall back to env
|
||||
return config('app.locale');
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current Laravel version.
|
||||
*
|
||||
|
||||
@@ -20,6 +20,13 @@ class SnipeModel extends Model
|
||||
$this->attributes['purchase_date'] = $value;
|
||||
}
|
||||
|
||||
protected function purchaseDateForDatepicker(): Attribute
|
||||
{
|
||||
return Attribute:: make(
|
||||
get: fn(mixed $value, array $attributes) => array_key_exists('purchase_date', $attributes) ? Carbon::parse($attributes['purchase_date'])->format('Y-m-d') : null,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
protected function purchaseDateFormatted(): Attribute
|
||||
{
|
||||
|
||||
@@ -1,8 +1,14 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
namespace App\Models\Traits;
|
||||
|
||||
use App\Models\Actionlog;
|
||||
use App\Models\Asset;
|
||||
use App\Models\License;
|
||||
use App\Models\LicenseSeat;
|
||||
use App\Models\Location;
|
||||
use App\Models\Setting;
|
||||
use App\Models\User;
|
||||
use App\Notifications\AuditNotification;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
@@ -1,8 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
namespace App\Models\Traits;
|
||||
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use App\Models\CheckoutRequest;
|
||||
use App\Models\User;
|
||||
|
||||
// $asset->requests
|
||||
// $asset->isRequestedBy($user)
|
||||
@@ -5,6 +5,7 @@ namespace App\Models;
|
||||
use App\Http\Traits\UniqueUndeletedTrait;
|
||||
use App\Models\Traits\CompanyableTrait;
|
||||
use App\Models\Traits\HasUploads;
|
||||
use App\Models\Traits\Loggable;
|
||||
use App\Models\Traits\Searchable;
|
||||
use App\Presenters\Presentable;
|
||||
use App\Presenters\UserPresenter;
|
||||
@@ -224,6 +225,26 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo
|
||||
return false;
|
||||
}
|
||||
|
||||
public function hasIndividualPermissions()
|
||||
{
|
||||
$permissions = [];
|
||||
|
||||
if (is_object($this->permissions)) {
|
||||
$permissions = json_decode(json_encode($this->permissions), true);
|
||||
}
|
||||
|
||||
if (is_string($this->permissions)) {
|
||||
$permissions = json_decode($this->permissions, true);
|
||||
}
|
||||
|
||||
foreach ($permissions as $permission) {
|
||||
if ($permission != 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Internally check the user permission for the given section
|
||||
*
|
||||
|
||||
@@ -34,7 +34,6 @@ use Illuminate\Notifications\Notification;
|
||||
$this->file = $params['file'] ?? null;
|
||||
$this->qty = $params['qty'] ?? null;
|
||||
$this->note = $params['note'] ?? null;
|
||||
$this->admin = $params['admin'] ?? null;
|
||||
|
||||
}
|
||||
|
||||
@@ -77,7 +76,6 @@ use Illuminate\Notifications\Notification;
|
||||
'accepted_date' => $this->accepted_date,
|
||||
'assigned_to' => $this->assigned_to,
|
||||
'company_name' => $this->company_name,
|
||||
'admin' => $this->admin,
|
||||
'qty' => $this->qty,
|
||||
'intro_text' => trans('mail.acceptance_asset_accepted'),
|
||||
])
|
||||
|
||||
@@ -32,7 +32,6 @@ use Illuminate\Notifications\Notification;
|
||||
$this->settings = Setting::getSettings();
|
||||
$this->file = $params['file'] ?? null;
|
||||
$this->qty = $params['qty'] ?? null;
|
||||
$this->admin = $params['admin'] ?? null;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -70,7 +69,6 @@ use Illuminate\Notifications\Notification;
|
||||
'accepted_date' => $this->accepted_date,
|
||||
'assigned_to' => $this->assigned_to,
|
||||
'company_name' => $this->company_name,
|
||||
'admin' => $this->admin,
|
||||
'qty' => $this->qty,
|
||||
'intro_text' => trans_choice('mail.acceptance_asset_accepted_to_user', $this->qty, ['qty' => $this->qty, 'site_name' => $this->settings->site_name]),
|
||||
])
|
||||
|
||||
@@ -31,6 +31,7 @@ class AcceptanceAssetDeclinedNotification extends Notification
|
||||
$this->company_name = $params['company_name'];
|
||||
$this->settings = Setting::getSettings();
|
||||
$this->qty = $params['qty'] ?? null;
|
||||
$this->admin = $params['admin'] ?? null;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -70,7 +71,8 @@ class AcceptanceAssetDeclinedNotification extends Notification
|
||||
'declined_date' => $this->declined_date,
|
||||
'assigned_to' => $this->assigned_to,
|
||||
'company_name' => $this->company_name,
|
||||
'qty' => $this->qty,
|
||||
'qty' => $this->qty,
|
||||
'admin' => $this->admin,
|
||||
'intro_text' => trans('mail.acceptance_asset_declined'),
|
||||
])
|
||||
->subject(trans('mail.acceptance_asset_declined'));
|
||||
|
||||
@@ -93,8 +93,8 @@ class CheckoutAssetNotification extends Notification
|
||||
$channel = ($this->settings->webhook_channel) ? $this->settings->webhook_channel : '';
|
||||
|
||||
$fields = [
|
||||
trans('general.to') => '<'.$target->present()->viewUrl().'|'.$target->display_name.'>',
|
||||
trans('general.by') => '<'.$admin->present()->viewUrl().'|'.$admin->display_name.'>',
|
||||
trans('general.to_user') => '<'.$target->present()->viewUrl().'|'.$target->display_name.'>',
|
||||
trans('general.by_user') => '<'.$admin->present()->viewUrl().'|'.$admin->display_name.'>',
|
||||
];
|
||||
|
||||
if ($item->location) {
|
||||
|
||||
@@ -24,6 +24,7 @@ use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Facades\URL;
|
||||
use Illuminate\Support\Facades\Blade;
|
||||
|
||||
/**
|
||||
* This service provider handles setting the observers on models
|
||||
@@ -42,6 +43,9 @@ class AppServiceProvider extends ServiceProvider
|
||||
*/
|
||||
public function boot(UrlGenerator $url)
|
||||
{
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* This is a workaround for proxies/reverse proxies that don't always pass the proper headers.
|
||||
*
|
||||
@@ -76,6 +80,9 @@ class AppServiceProvider extends ServiceProvider
|
||||
Consumable::observe(ConsumableObserver::class);
|
||||
License::observe(LicenseObserver::class);
|
||||
Setting::observe(SettingObserver::class);
|
||||
|
||||
// https://laravel.com/docs/11.x/blade#html-entity-encoding
|
||||
Blade::withoutDoubleEncoding();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -18,9 +18,10 @@ $dump_options = [
|
||||
//'add_extra_option' => '--optionname=optionvalue',
|
||||
];
|
||||
|
||||
// Some versions of mysql do not support the --skip-ssl option and will fail if it is even set
|
||||
// For modern versions of mysqldump, use --ssl-mode=DISABLED
|
||||
if (env('DB_DUMP_SKIP_SSL') == 'true') {
|
||||
$dump_options['skip_ssl'] = true;
|
||||
// Correctly add the option as a string to the 'add_extra_option' key.
|
||||
$dump_options['add_extra_option'] = '--ssl-mode=DISABLED';
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -9,11 +9,9 @@
|
||||
|
||||
return [
|
||||
|
||||
'Global' => [
|
||||
'Superuser' => [
|
||||
[
|
||||
'permission' => 'superuser',
|
||||
'label' => 'Super User',
|
||||
'note' => 'Determines whether the user has full access to all aspects of the admin. This setting overrides any more specific permissions throughout the system. ',
|
||||
'display' => true,
|
||||
],
|
||||
],
|
||||
@@ -21,17 +19,13 @@ return [
|
||||
'Admin' => [
|
||||
[
|
||||
'permission' => 'admin',
|
||||
'label' => '',
|
||||
'note' => 'Determines whether the user has access to most aspects of the admin. ',
|
||||
'display' => true,
|
||||
],
|
||||
],
|
||||
|
||||
'CSV Import' => [
|
||||
'Import' => [
|
||||
[
|
||||
'permission' => 'import',
|
||||
'label' => '',
|
||||
'note' => 'This will allow users to import even if access to users, assets, etc is denied elsewhere.',
|
||||
'display' => true,
|
||||
],
|
||||
],
|
||||
@@ -39,8 +33,6 @@ return [
|
||||
'Reports' => [
|
||||
[
|
||||
'permission' => 'reports.view',
|
||||
'label' => 'View',
|
||||
'note' => 'Determines whether the user has the ability to view reports.',
|
||||
'display' => true,
|
||||
],
|
||||
],
|
||||
@@ -48,68 +40,48 @@ return [
|
||||
'Assets' => [
|
||||
[
|
||||
'permission' => 'assets.view',
|
||||
'label' => 'View ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'assets.create',
|
||||
'label' => 'Create ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'assets.edit',
|
||||
'label' => 'Edit ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'assets.delete',
|
||||
'label' => 'Delete ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'assets.checkout',
|
||||
'label' => 'Checkout ',
|
||||
'note' => '',
|
||||
'display' => false,
|
||||
],
|
||||
|
||||
[
|
||||
'permission' => 'assets.checkin',
|
||||
'label' => 'Checkin ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
|
||||
[
|
||||
'permission' => 'assets.checkout',
|
||||
'label' => 'Checkout ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
|
||||
[
|
||||
'permission' => 'assets.audit',
|
||||
'label' => 'Audit ',
|
||||
'note' => 'Allows the user to mark an asset as physically inventoried.',
|
||||
'display' => true,
|
||||
],
|
||||
|
||||
|
||||
[
|
||||
'permission' => 'assets.view.requestable',
|
||||
'label' => 'View Requestable Assets',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
|
||||
[
|
||||
'permission' => 'assets.view.encrypted_custom_fields',
|
||||
'label' => 'View and Modify Encrypted Custom Fields',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
|
||||
@@ -118,44 +90,30 @@ return [
|
||||
'Accessories' => [
|
||||
[
|
||||
'permission' => 'accessories.view',
|
||||
'label' => 'View ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'accessories.create',
|
||||
'label' => 'Create ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'accessories.edit',
|
||||
'label' => 'Edit ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'accessories.delete',
|
||||
'label' => 'Delete ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'accessories.checkout',
|
||||
'label' => 'Checkout ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'accessories.checkin',
|
||||
'label' => 'Checkin ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'accessories.files',
|
||||
'label' => 'View and Modify Accessory Files',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
|
||||
@@ -164,38 +122,26 @@ return [
|
||||
'Consumables' => [
|
||||
[
|
||||
'permission' => 'consumables.view',
|
||||
'label' => 'View',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'consumables.create',
|
||||
'label' => 'Create ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'consumables.edit',
|
||||
'label' => 'Edit ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'consumables.delete',
|
||||
'label' => 'Delete ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'consumables.checkout',
|
||||
'label' => 'Checkout ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'consumables.files',
|
||||
'label' => 'View and Modify Consumable Files',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
],
|
||||
@@ -204,50 +150,34 @@ return [
|
||||
'Licenses' => [
|
||||
[
|
||||
'permission' => 'licenses.view',
|
||||
'label' => 'View',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'licenses.create',
|
||||
'label' => 'Create ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'licenses.edit',
|
||||
'label' => 'Edit ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'licenses.delete',
|
||||
'label' => 'Delete ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'licenses.checkout',
|
||||
'label' => 'Checkout ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'licenses.checkin',
|
||||
'label' => 'Checkin ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'licenses.keys',
|
||||
'label' => 'View License Keys',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'licenses.files',
|
||||
'label' => 'View and Modify License Files',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
],
|
||||
@@ -256,44 +186,30 @@ return [
|
||||
'Components' => [
|
||||
[
|
||||
'permission' => 'components.view',
|
||||
'label' => 'View',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'components.create',
|
||||
'label' => 'Create ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'components.edit',
|
||||
'label' => 'Edit ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'components.delete',
|
||||
'label' => 'Delete ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'components.checkout',
|
||||
'label' => 'Checkout ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'components.checkin',
|
||||
'label' => 'Checkin ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'components.files',
|
||||
'label' => 'View and Modify Component Files',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
|
||||
@@ -302,26 +218,18 @@ return [
|
||||
'Kits' => [
|
||||
[
|
||||
'permission' => 'kits.view',
|
||||
'label' => 'View ',
|
||||
'note' => 'These are predefined kits that can be used to quickly checkout assets, licenses, etc.',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'kits.create',
|
||||
'label' => 'Create ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'kits.edit',
|
||||
'label' => 'Edit ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'kits.delete',
|
||||
'label' => 'Delete ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
],
|
||||
@@ -329,26 +237,18 @@ return [
|
||||
'Users' => [
|
||||
[
|
||||
'permission' => 'users.view',
|
||||
'label' => 'View ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'users.create',
|
||||
'label' => 'Create Users',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'users.edit',
|
||||
'label' => 'Edit Users',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'users.delete',
|
||||
'label' => 'Delete Users',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
|
||||
@@ -357,26 +257,18 @@ return [
|
||||
'Models' => [
|
||||
[
|
||||
'permission' => 'models.view',
|
||||
'label' => 'View ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'models.create',
|
||||
'label' => 'Create ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'models.edit',
|
||||
'label' => 'Edit ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'models.delete',
|
||||
'label' => 'Delete ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
|
||||
@@ -385,26 +277,18 @@ return [
|
||||
'Categories' => [
|
||||
[
|
||||
'permission' => 'categories.view',
|
||||
'label' => 'View ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'categories.create',
|
||||
'label' => 'Create ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'categories.edit',
|
||||
'label' => 'Edit ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'categories.delete',
|
||||
'label' => 'Delete ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
],
|
||||
@@ -412,26 +296,18 @@ return [
|
||||
'Departments' => [
|
||||
[
|
||||
'permission' => 'departments.view',
|
||||
'label' => 'View ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'departments.create',
|
||||
'label' => 'Create ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'departments.edit',
|
||||
'label' => 'Edit ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'departments.delete',
|
||||
'label' => 'Delete ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
],
|
||||
@@ -439,26 +315,18 @@ return [
|
||||
'Status Labels' => [
|
||||
[
|
||||
'permission' => 'statuslabels.view',
|
||||
'label' => 'View ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'statuslabels.create',
|
||||
'label' => 'Create ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'statuslabels.edit',
|
||||
'label' => 'Edit ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'statuslabels.delete',
|
||||
'label' => 'Delete ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
],
|
||||
@@ -466,26 +334,18 @@ return [
|
||||
'Custom Fields' => [
|
||||
[
|
||||
'permission' => 'customfields.view',
|
||||
'label' => 'View',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'customfields.create',
|
||||
'label' => 'Create',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'customfields.edit',
|
||||
'label' => 'Edit',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'customfields.delete',
|
||||
'label' => 'Delete',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
],
|
||||
@@ -493,26 +353,18 @@ return [
|
||||
'Suppliers' => [
|
||||
[
|
||||
'permission' => 'suppliers.view',
|
||||
'label' => 'View ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'suppliers.create',
|
||||
'label' => 'Create ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'suppliers.edit',
|
||||
'label' => 'Edit ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'suppliers.delete',
|
||||
'label' => 'Delete ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
],
|
||||
@@ -521,26 +373,18 @@ return [
|
||||
'Manufacturers' => [
|
||||
[
|
||||
'permission' => 'manufacturers.view',
|
||||
'label' => 'View ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'manufacturers.create',
|
||||
'label' => 'Create ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'manufacturers.edit',
|
||||
'label' => 'Edit ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'manufacturers.delete',
|
||||
'label' => 'Delete ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
],
|
||||
@@ -548,26 +392,18 @@ return [
|
||||
'Depreciations' => [
|
||||
[
|
||||
'permission' => 'depreciations.view',
|
||||
'label' => 'View ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'depreciations.create',
|
||||
'label' => 'Create ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'depreciations.edit',
|
||||
'label' => 'Edit ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'depreciations.delete',
|
||||
'label' => 'Delete ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
],
|
||||
@@ -575,26 +411,18 @@ return [
|
||||
'Locations' => [
|
||||
[
|
||||
'permission' => 'locations.view',
|
||||
'label' => 'View ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'locations.create',
|
||||
'label' => 'Create ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'locations.edit',
|
||||
'label' => 'Edit ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'locations.delete',
|
||||
'label' => 'Delete ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
],
|
||||
@@ -602,66 +430,46 @@ return [
|
||||
'Companies' => [
|
||||
[
|
||||
'permission' => 'companies.view',
|
||||
'label' => 'View ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'companies.create',
|
||||
'label' => 'Create ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'companies.edit',
|
||||
'label' => 'Edit ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
[
|
||||
'permission' => 'companies.delete',
|
||||
'label' => 'Delete ',
|
||||
'note' => '',
|
||||
'display' => true,
|
||||
],
|
||||
],
|
||||
|
||||
|
||||
|
||||
|
||||
'Self' => [
|
||||
'User (Self) Accounts' => [
|
||||
[
|
||||
'permission' => 'self.two_factor',
|
||||
'label' => 'Two-Factor Authentication',
|
||||
'note' => 'The user may disable/enable two-factor authentication themselves if two-factor is enabled and set to selective.',
|
||||
'display' => true,
|
||||
],
|
||||
|
||||
[
|
||||
'permission' => 'self.api',
|
||||
'label' => 'Create API Keys',
|
||||
'note' => 'The user create personal API keys to utilize the REST API.',
|
||||
'display' => true,
|
||||
],
|
||||
|
||||
[
|
||||
'permission' => 'self.edit_location',
|
||||
'label' => 'Profile Edit Location',
|
||||
'note' => 'The user may update their own location in their profile. Note that this is not affected by any additional Users permissions you grant to this user or group.',
|
||||
'display' => true,
|
||||
],
|
||||
|
||||
[
|
||||
'permission' => 'self.checkout_assets',
|
||||
'label' => 'Self-Checkout',
|
||||
'note' => 'This user may check out assets that are marked for self-checkout.',
|
||||
'display' => true,
|
||||
],
|
||||
|
||||
[
|
||||
'permission' => 'self.view_purchase_cost',
|
||||
'label' => 'View Purchase-Cost Column',
|
||||
'note' => 'This user can see the purchase cost column of items assigned to them.',
|
||||
'display' => true,
|
||||
],
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
<?php
|
||||
return array (
|
||||
'app_version' => 'v8.3.3',
|
||||
'full_app_version' => 'v8.3.3 - build 20183-g3339d1999',
|
||||
'build_version' => '20183',
|
||||
'app_version' => 'v8.3.4',
|
||||
'full_app_version' => 'v8.3.4 - build 20218-g3ab2e2011',
|
||||
'build_version' => '20218',
|
||||
'prerelease_version' => '',
|
||||
'hash_version' => 'g3339d1999',
|
||||
'full_hash' => 'v8.3.3-114-g3339d1999',
|
||||
'branch' => 'develop',
|
||||
'hash_version' => 'g3ab2e2011',
|
||||
'full_hash' => 'v8.3.4-149-g3ab2e2011',
|
||||
'branch' => 'master',
|
||||
);
|
||||
19
package-lock.json
generated
19
package-lock.json
generated
@@ -3643,11 +3643,17 @@
|
||||
}
|
||||
},
|
||||
"node_modules/cipher-base": {
|
||||
"version": "1.0.4",
|
||||
"version": "1.0.7",
|
||||
"resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz",
|
||||
"integrity": "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"inherits": "^2.0.1",
|
||||
"safe-buffer": "^5.0.1"
|
||||
"inherits": "^2.0.4",
|
||||
"safe-buffer": "^5.2.1",
|
||||
"to-buffer": "^1.2.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.10"
|
||||
}
|
||||
},
|
||||
"node_modules/ckeditor": {
|
||||
@@ -10293,9 +10299,10 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/to-buffer": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.1.tgz",
|
||||
"integrity": "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==",
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz",
|
||||
"integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"isarray": "^2.0.5",
|
||||
"safe-buffer": "^5.2.1",
|
||||
|
||||
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
2
public/css/dist/all.css
vendored
2
public/css/dist/all.css
vendored
File diff suppressed because one or more lines are too long
2
public/css/dist/skins/_all-skins.css
vendored
2
public/css/dist/skins/_all-skins.css
vendored
File diff suppressed because one or more lines are too long
2
public/css/dist/skins/_all-skins.css.map
vendored
2
public/css/dist/skins/_all-skins.css.map
vendored
File diff suppressed because one or more lines are too long
2
public/css/dist/skins/_all-skins.min.css
vendored
2
public/css/dist/skins/_all-skins.min.css
vendored
File diff suppressed because one or more lines are too long
2
public/css/dist/skins/skin-contrast.css
vendored
2
public/css/dist/skins/skin-contrast.css
vendored
@@ -1,3 +1,3 @@
|
||||
.skin-contrast .main-header .navbar{background-color:#001f3f}.skin-contrast .main-header .navbar .nav>li>a{color:#fff}.skin-contrast .main-header .navbar .nav .open>a,.skin-contrast .main-header .navbar .nav .open>a:focus,.skin-contrast .main-header .navbar .nav .open>a:hover,.skin-contrast .main-header .navbar .nav>.active>a,.skin-contrast .main-header .navbar .nav>li>a:active,.skin-contrast .main-header .navbar .nav>li>a:focus,.skin-contrast .main-header .navbar .nav>li>a:hover,.skin-contrast .main-header .navbar .sidebar-toggle:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-contrast .main-header .navbar .sidebar-toggle{color:#fff}.skin-contrast .main-header .navbar .sidebar-toggle:hover{background-color:#001226}@media (max-width:767px){.skin-contrast .main-header .navbar .dropdown-menu li.divider{background-color:hsla(0,0%,100%,.1)}.skin-contrast .main-header .navbar .dropdown-menu li a{color:#fff}.skin-contrast .main-header .navbar .dropdown-menu li a:hover{background:#001226}}.skin-contrast .main-header li.user-header{background-color:#001f3f}.skin-contrast .content-header{background:transparent}.skin-contrast .left-side,.skin-contrast .main-sidebar,.skin-contrast .wrapper{background-color:#222d32}.skin-contrast .user-panel>.info,.skin-contrast .user-panel>.info>a{color:#fff}.skin-contrast .sidebar-menu>li.header{background:#1a2226;color:#4b646f}.skin-contrast .sidebar-menu>li>a{border-left:3px solid transparent}.skin-contrast .sidebar-menu>li.active>a,.skin-contrast .sidebar-menu>li:hover>a{background:#1e282c;border-left-color:#001f3f;color:#fff}.skin-contrast .sidebar-menu>li>.treeview-menu{background:#2c3b41;margin:0 1px}.skin-contrast .sidebar a{color:#b8c7ce}.skin-contrast .sidebar a:hover{text-decoration:none}.skin-contrast .treeview-menu>li>a{color:#8aa4af}.skin-contrast .treeview-menu>li.active>a,.skin-contrast .treeview-menu>li>a:hover{color:#fff}.skin-contrast .sidebar-form{border:1px solid #374850;border-radius:3px;margin:10px}.skin-contrast .sidebar-form .btn,.skin-contrast .sidebar-form input[type=text]{background-color:#374850;border:1px solid transparent;box-shadow:none;height:35px;transition:all .3s ease-in-out}.skin-contrast .sidebar-form input[type=text]{border-bottom-left-radius:2px;border-bottom-right-radius:0;border-top-left-radius:2px;border-top-right-radius:0;color:#666}.skin-contrast .sidebar-form input[type=text]:focus,.skin-contrast .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-contrast .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-contrast .sidebar-form .btn{border-bottom-left-radius:0;border-bottom-right-radius:2px;border-top-left-radius:0;border-top-right-radius:2px;color:#999}.skin-contrast.layout-top-nav .main-header>.logo .logo-variant{background-color:none}.btn .btn-primary:link,.btn.btn-primary,.btn:hover .btn-primary:link,.btn:hover.btn-primary{background-color:#00060c;border-color:#000;color:#fff}.btn:hovera.btn-primary:hover,.btna.btn-primary:hover{background-color:#000;border-color:#000;color:#fff}.btn.btn-white:link,.btn:hover.btn-white:link{background-color:#00060c;color:#fff}.btn.btn-white:hover,.btn:hover.btn-white:hover{background-color:#000;color:#fff}a.btn.btn-link.text-left{border:1px solid #000;color:#001f3f}a,a.btn.btn-link.text-left:hover,a:hover{color:#001f3f}a:hover{text-decoration:underline}a:visited{color:#001f3f}a.btn:hover{color:#fff;text-decoration:underline}.text-primary{color:#000}.skin-contrast .treeview-menu>li>a{color:#fff}.bg-teal{background-color:#1b6a6a!important}.bg-orange{background-color:#995400!important}.bg-purple{background-color:#3a3767!important}.bg-maroon{background-color:#7d1038!important}.pagination>li>a{color:#00060c!important}.pagination>.active>a{background-color:#001f3f;color:#fff!important}btn-success{background-color:#000d07}input::-webkit-input-placeholder{color:#b5bbc8!important}input::-moz-placeholder{color:#b5bbc8!important}input::-ms-input-placeholder{color:#b5bbc8!important}.select2-default,.select2-selection__placeholder{color:#37383c!important}.callout.callout-info{background-color:#23536f!important}.fixed-table-container tbody .selected td{background-color:#fff8af}.search-highlight,.search-highlight:hover{background-color:#e9d15b}
|
||||
.skin-contrast .main-header .navbar{background-color:#001f3f}.skin-contrast .main-header .navbar .nav>li>a{color:#fff}.skin-contrast .main-header .navbar .nav .open>a,.skin-contrast .main-header .navbar .nav .open>a:focus,.skin-contrast .main-header .navbar .nav .open>a:hover,.skin-contrast .main-header .navbar .nav>.active>a,.skin-contrast .main-header .navbar .nav>li>a:active,.skin-contrast .main-header .navbar .nav>li>a:focus,.skin-contrast .main-header .navbar .nav>li>a:hover,.skin-contrast .main-header .navbar .sidebar-toggle:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-contrast .main-header .navbar .sidebar-toggle{color:#fff}.skin-contrast .main-header .navbar .sidebar-toggle:hover{background-color:#001226}@media (max-width:767px){.skin-contrast .main-header .navbar .dropdown-menu li.divider{background-color:hsla(0,0%,100%,.1)}.skin-contrast .main-header .navbar .dropdown-menu li a{color:#fff}.skin-contrast .main-header .navbar .dropdown-menu li a:hover{background:#001226}}.skin-contrast .main-header li.user-header{background-color:#001f3f}.skin-contrast .content-header{background:transparent}.skin-contrast .left-side,.skin-contrast .main-sidebar,.skin-contrast .wrapper{background-color:#222d32}.skin-contrast .user-panel>.info,.skin-contrast .user-panel>.info>a{color:#fff}.skin-contrast .sidebar-menu>li.header{background:#1a2226;color:#4b646f}.skin-contrast .sidebar-menu>li>a{border-left:3px solid transparent}.skin-contrast .sidebar-menu>li.active>a,.skin-contrast .sidebar-menu>li:hover>a{background:#1e282c;border-left-color:#001f3f;color:#fff}.skin-contrast .sidebar-menu>li>.treeview-menu{background:#2c3b41;margin:0 1px}.skin-contrast .sidebar a{color:#b8c7ce}.skin-contrast .sidebar a:hover{text-decoration:none}.skin-contrast .treeview-menu>li>a{color:#8aa4af}.skin-contrast .treeview-menu>li.active>a,.skin-contrast .treeview-menu>li>a:hover{color:#fff}.skin-contrast .sidebar-form{border:1px solid #374850;border-radius:3px;margin:10px}.skin-contrast .sidebar-form .btn,.skin-contrast .sidebar-form input[type=text]{background-color:#374850;border:1px solid transparent;box-shadow:none;height:35px;transition:all .3s ease-in-out}.skin-contrast .sidebar-form input[type=text]{border-bottom-left-radius:2px;border-bottom-right-radius:0;border-top-left-radius:2px;border-top-right-radius:0;color:#666}.skin-contrast .sidebar-form input[type=text]:focus,.skin-contrast .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-contrast .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-contrast .sidebar-form .btn{border-bottom-left-radius:0;border-bottom-right-radius:2px;border-top-left-radius:0;border-top-right-radius:2px;color:#999}.skin-contrast.layout-top-nav .main-header>.logo .logo-variant{background-color:none}.btn .btn-default:link:hover,.btn .btn-default:link:visited,.btn.btn-default:hover,.btn.btn-default:visited,.btn:hover .btn-default:link:hover,.btn:hover .btn-default:link:visited,.btn:hover.btn-default:hover,.btn:hover.btn-default:visited{color:#00060c}.btn .btn-primary:link,.btn.btn-primary,.btn:hover .btn-primary:link,.btn:hover.btn-primary{background-color:#00060c;border-color:#000;color:#fff}.btn:hovera.btn-primary:hover,.btna.btn-primary:hover{background-color:#000;border-color:#000;color:#fff}.btn.btn-white:link,.btn:hover.btn-white:link{background-color:#00060c;color:#fff}.btn.btn-white:hover,.btn:hover.btn-white:hover{background-color:#000;color:#fff}a.btn.btn-link.text-left{border:1px solid #000;color:#001f3f}a,a.btn.btn-link.text-left:hover,a:hover{color:#001f3f}a:hover{text-decoration:underline}a:visited{color:#001f3f}a.btn:hover{color:#fff;text-decoration:underline}a.btn:visited{color:#fff;text-decoration:none}.text-primary{color:#000}.skin-contrast .treeview-menu>li>a{color:#fff}.bg-teal{background-color:#1b6a6a!important}.bg-orange{background-color:#995400!important}.bg-purple{background-color:#3a3767!important}.bg-maroon{background-color:#7d1038!important}.pagination>li>a{color:#00060c!important}.pagination>.active>a{background-color:#001f3f;color:#fff!important}.btn-success{background-color:#000d07}input::-webkit-input-placeholder{color:#b5bbc8!important}input::-moz-placeholder{color:#b5bbc8!important}input::-ms-input-placeholder{color:#b5bbc8!important}.select2-default,.select2-selection__placeholder{color:#37383c!important}.callout.callout-info{background-color:#23536f!important}.fixed-table-container tbody .selected td{background-color:#fff8af}.search-highlight,.search-highlight:hover{background-color:#e9d15b}
|
||||
|
||||
/*# sourceMappingURL=skin-contrast.css.map*/
|
||||
2
public/css/dist/skins/skin-contrast.css.map
vendored
2
public/css/dist/skins/skin-contrast.css.map
vendored
File diff suppressed because one or more lines are too long
2
public/css/dist/skins/skin-contrast.min.css
vendored
2
public/css/dist/skins/skin-contrast.min.css
vendored
@@ -1 +1 @@
|
||||
.skin-contrast .main-header .navbar{background-color:#001f3f}.skin-contrast .main-header .navbar .nav>li>a{color:#fff}.skin-contrast .main-header .navbar .nav .open>a,.skin-contrast .main-header .navbar .nav .open>a:focus,.skin-contrast .main-header .navbar .nav .open>a:hover,.skin-contrast .main-header .navbar .nav>.active>a,.skin-contrast .main-header .navbar .nav>li>a:active,.skin-contrast .main-header .navbar .nav>li>a:focus,.skin-contrast .main-header .navbar .nav>li>a:hover,.skin-contrast .main-header .navbar .sidebar-toggle:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-contrast .main-header .navbar .sidebar-toggle{color:#fff}.skin-contrast .main-header .navbar .sidebar-toggle:hover{background-color:#001226}@media (max-width:767px){.skin-contrast .main-header .navbar .dropdown-menu li.divider{background-color:hsla(0,0%,100%,.1)}.skin-contrast .main-header .navbar .dropdown-menu li a{color:#fff}.skin-contrast .main-header .navbar .dropdown-menu li a:hover{background:#001226}}.skin-contrast .main-header li.user-header{background-color:#001f3f}.skin-contrast .content-header{background:0 0}.skin-contrast .left-side,.skin-contrast .main-sidebar,.skin-contrast .wrapper{background-color:#222d32}.skin-contrast .user-panel>.info,.skin-contrast .user-panel>.info>a{color:#fff}.skin-contrast .sidebar-menu>li.header{background:#1a2226;color:#4b646f}.skin-contrast .sidebar-menu>li>a{border-left:3px solid transparent}.skin-contrast .sidebar-menu>li.active>a,.skin-contrast .sidebar-menu>li:hover>a{background:#1e282c;border-left-color:#001f3f;color:#fff}.skin-contrast .sidebar-menu>li>.treeview-menu{background:#2c3b41;margin:0 1px}.skin-contrast .sidebar a{color:#b8c7ce}.skin-contrast .sidebar a:hover{text-decoration:none}.skin-contrast .treeview-menu>li>a{color:#8aa4af}.skin-contrast .treeview-menu>li.active>a,.skin-contrast .treeview-menu>li>a:hover{color:#fff}.skin-contrast .sidebar-form{border:1px solid #374850;border-radius:3px;margin:10px}.skin-contrast .sidebar-form .btn,.skin-contrast .sidebar-form input[type=text]{background-color:#374850;border:1px solid transparent;box-shadow:none;height:35px;transition:all .3s ease-in-out}.skin-contrast .sidebar-form input[type=text]{border-bottom-left-radius:2px;border-bottom-right-radius:0;border-top-left-radius:2px;border-top-right-radius:0;color:#666}.skin-contrast .sidebar-form input[type=text]:focus,.skin-contrast .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-contrast .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-contrast .sidebar-form .btn{border-bottom-left-radius:0;border-bottom-right-radius:2px;border-top-left-radius:0;border-top-right-radius:2px;color:#999}.skin-contrast.layout-top-nav .main-header>.logo .logo-variant{background-color:none}.btn .btn-primary:link,.btn.btn-primary,.btn:hover .btn-primary:link,.btn:hover.btn-primary{background-color:#00060c;border-color:#000;color:#fff}.btn:hovera.btn-primary:hover,.btna.btn-primary:hover{background-color:#000;border-color:#000;color:#fff}.btn.btn-white:link,.btn:hover.btn-white:link{background-color:#00060c;color:#fff}.btn.btn-white:hover,.btn:hover.btn-white:hover{background-color:#000;color:#fff}a.btn.btn-link.text-left{border:1px solid #000;color:#001f3f}a,a.btn.btn-link.text-left:hover,a:hover{color:#001f3f}a:hover{text-decoration:underline}a:visited{color:#001f3f}a.btn:hover{color:#fff;text-decoration:underline}.text-primary{color:#000}.skin-contrast .treeview-menu>li>a{color:#fff}.bg-teal{background-color:#1b6a6a!important}.bg-orange{background-color:#995400!important}.bg-purple{background-color:#3a3767!important}.bg-maroon{background-color:#7d1038!important}.pagination>li>a{color:#00060c!important}.pagination>.active>a{background-color:#001f3f;color:#fff!important}btn-success{background-color:#000d07}input::-webkit-input-placeholder{color:#b5bbc8!important}input::-moz-placeholder{color:#b5bbc8!important}input::-ms-input-placeholder{color:#b5bbc8!important}.select2-default,.select2-selection__placeholder{color:#37383c!important}.callout.callout-info{background-color:#23536f!important}.fixed-table-container tbody .selected td{background-color:#fff8af}.search-highlight,.search-highlight:hover{background-color:#e9d15b}
|
||||
.skin-contrast .main-header .navbar{background-color:#001f3f}.skin-contrast .main-header .navbar .nav>li>a{color:#fff}.skin-contrast .main-header .navbar .nav .open>a,.skin-contrast .main-header .navbar .nav .open>a:focus,.skin-contrast .main-header .navbar .nav .open>a:hover,.skin-contrast .main-header .navbar .nav>.active>a,.skin-contrast .main-header .navbar .nav>li>a:active,.skin-contrast .main-header .navbar .nav>li>a:focus,.skin-contrast .main-header .navbar .nav>li>a:hover,.skin-contrast .main-header .navbar .sidebar-toggle:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-contrast .main-header .navbar .sidebar-toggle{color:#fff}.skin-contrast .main-header .navbar .sidebar-toggle:hover{background-color:#001226}@media (max-width:767px){.skin-contrast .main-header .navbar .dropdown-menu li.divider{background-color:hsla(0,0%,100%,.1)}.skin-contrast .main-header .navbar .dropdown-menu li a{color:#fff}.skin-contrast .main-header .navbar .dropdown-menu li a:hover{background:#001226}}.skin-contrast .main-header li.user-header{background-color:#001f3f}.skin-contrast .content-header{background:0 0}.skin-contrast .left-side,.skin-contrast .main-sidebar,.skin-contrast .wrapper{background-color:#222d32}.skin-contrast .user-panel>.info,.skin-contrast .user-panel>.info>a{color:#fff}.skin-contrast .sidebar-menu>li.header{background:#1a2226;color:#4b646f}.skin-contrast .sidebar-menu>li>a{border-left:3px solid transparent}.skin-contrast .sidebar-menu>li.active>a,.skin-contrast .sidebar-menu>li:hover>a{background:#1e282c;border-left-color:#001f3f;color:#fff}.skin-contrast .sidebar-menu>li>.treeview-menu{background:#2c3b41;margin:0 1px}.skin-contrast .sidebar a{color:#b8c7ce}.skin-contrast .sidebar a:hover{text-decoration:none}.skin-contrast .treeview-menu>li>a{color:#8aa4af}.skin-contrast .treeview-menu>li.active>a,.skin-contrast .treeview-menu>li>a:hover{color:#fff}.skin-contrast .sidebar-form{border:1px solid #374850;border-radius:3px;margin:10px}.skin-contrast .sidebar-form .btn,.skin-contrast .sidebar-form input[type=text]{background-color:#374850;border:1px solid transparent;box-shadow:none;height:35px;transition:all .3s ease-in-out}.skin-contrast .sidebar-form input[type=text]{border-bottom-left-radius:2px;border-bottom-right-radius:0;border-top-left-radius:2px;border-top-right-radius:0;color:#666}.skin-contrast .sidebar-form input[type=text]:focus,.skin-contrast .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-contrast .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-contrast .sidebar-form .btn{border-bottom-left-radius:0;border-bottom-right-radius:2px;border-top-left-radius:0;border-top-right-radius:2px;color:#999}.skin-contrast.layout-top-nav .main-header>.logo .logo-variant{background-color:none}.btn .btn-default:link:hover,.btn .btn-default:link:visited,.btn.btn-default:hover,.btn.btn-default:visited,.btn:hover .btn-default:link:hover,.btn:hover .btn-default:link:visited,.btn:hover.btn-default:hover,.btn:hover.btn-default:visited{color:#00060c}.btn .btn-primary:link,.btn.btn-primary,.btn:hover .btn-primary:link,.btn:hover.btn-primary{background-color:#00060c;border-color:#000;color:#fff}.btn:hovera.btn-primary:hover,.btna.btn-primary:hover{background-color:#000;border-color:#000;color:#fff}.btn.btn-white:link,.btn:hover.btn-white:link{background-color:#00060c;color:#fff}.btn.btn-white:hover,.btn:hover.btn-white:hover{background-color:#000;color:#fff}a.btn.btn-link.text-left{border:1px solid #000;color:#001f3f}a,a.btn.btn-link.text-left:hover,a:hover{color:#001f3f}a:hover{text-decoration:underline}a:visited{color:#001f3f}a.btn:hover{color:#fff;text-decoration:underline}a.btn:visited{color:#fff;text-decoration:none}.text-primary{color:#000}.skin-contrast .treeview-menu>li>a{color:#fff}.bg-teal{background-color:#1b6a6a!important}.bg-orange{background-color:#995400!important}.bg-purple{background-color:#3a3767!important}.bg-maroon{background-color:#7d1038!important}.pagination>li>a{color:#00060c!important}.pagination>.active>a{background-color:#001f3f;color:#fff!important}.btn-success{background-color:#000d07}input::-webkit-input-placeholder{color:#b5bbc8!important}input::-moz-placeholder{color:#b5bbc8!important}input::-ms-input-placeholder{color:#b5bbc8!important}.select2-default,.select2-selection__placeholder{color:#37383c!important}.callout.callout-info{background-color:#23536f!important}.fixed-table-container tbody .selected td{background-color:#fff8af}.search-highlight,.search-highlight:hover{background-color:#e9d15b}
|
||||
|
||||
2
public/js/dist/all.js
vendored
2
public/js/dist/all.js
vendored
File diff suppressed because one or more lines are too long
2
public/js/dist/all.js.map
vendored
2
public/js/dist/all.js.map
vendored
File diff suppressed because one or more lines are too long
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"/js/dist/all.js": "/js/dist/all.js?id=5c191843e0bb9292ec6b7f0a3c5765b3",
|
||||
"/js/dist/all.js": "/js/dist/all.js?id=6ffdb46d7dcfceb395f453e15cfbc4be",
|
||||
"/css/dist/skins/skin-black-dark.css": "/css/dist/skins/skin-black-dark.css?id=bf1a348eae3e60c62b8879953f7df14c",
|
||||
"/css/dist/skins/_all-skins.css": "/css/dist/skins/_all-skins.css?id=146086d653897e2557af5e68f6f8c56f",
|
||||
"/css/build/overrides.css": "/css/build/overrides.css?id=3f6ab7e6902cca7d96e637b82dc95e65",
|
||||
"/css/build/app.css": "/css/build/app.css?id=5876cf8fb09a66f8f9e0b2472c9cc9f8",
|
||||
"/css/dist/skins/_all-skins.css": "/css/dist/skins/_all-skins.css?id=f712d11cfca345b58c1d8a35df03d38d",
|
||||
"/css/build/overrides.css": "/css/build/overrides.css?id=3a3b20a7cde391756b707a67a3e297e4",
|
||||
"/css/build/app.css": "/css/build/app.css?id=86244e556cc26877415e9ab63e8b7e33",
|
||||
"/css/build/AdminLTE.css": "/css/build/AdminLTE.css?id=bdf169bc2141f453390614c138cdce95",
|
||||
"/css/dist/skins/skin-yellow.css": "/css/dist/skins/skin-yellow.css?id=e1e6e1c64cf14fc350585aaeb0e42f6b",
|
||||
"/css/dist/skins/skin-yellow-dark.css": "/css/dist/skins/skin-yellow-dark.css?id=08ae1b3e66008966ce5d600ea3ad04a2",
|
||||
@@ -15,11 +15,11 @@
|
||||
"/css/dist/skins/skin-orange-dark.css": "/css/dist/skins/skin-orange-dark.css?id=71905ff04c78d92dc6f0b8354b458ffd",
|
||||
"/css/dist/skins/skin-green.css": "/css/dist/skins/skin-green.css?id=d68df5bc23ddddc710f7acf2201b2caf",
|
||||
"/css/dist/skins/skin-green-dark.css": "/css/dist/skins/skin-green-dark.css?id=436c77b84b2797f9683a7cdc4f8f6b8d",
|
||||
"/css/dist/skins/skin-contrast.css": "/css/dist/skins/skin-contrast.css?id=8c61ef8889d392838fb977c7a1b1f6bb",
|
||||
"/css/dist/skins/skin-contrast.css": "/css/dist/skins/skin-contrast.css?id=fbd34e1e2d119358e781195c3fe26b69",
|
||||
"/css/dist/skins/skin-blue.css": "/css/dist/skins/skin-blue.css?id=68a92d85c8e351dfb38a835307f126ec",
|
||||
"/css/dist/skins/skin-blue-dark.css": "/css/dist/skins/skin-blue-dark.css?id=cbb20ad6182b658f34117bf96a621b63",
|
||||
"/css/dist/skins/skin-black.css": "/css/dist/skins/skin-black.css?id=84e2ee950ae04444988b37038e5a3951",
|
||||
"/css/dist/all.css": "/css/dist/all.css?id=88a000a091cb26a138368945df92ab83",
|
||||
"/css/dist/all.css": "/css/dist/all.css?id=d025bd7724d6b3510b3818f6f120f6ef",
|
||||
"/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",
|
||||
@@ -93,12 +93,12 @@
|
||||
"/js/dist/bootstrap-table-locale-all.min.js": "/js/dist/bootstrap-table-locale-all.min.js?id=d300041b9e5038b45b68e036add83be4",
|
||||
"/js/dist/bootstrap-table-en-US.min.js": "/js/dist/bootstrap-table-en-US.min.js?id=6d0de12d91548ba2cd80b868838ce5fa",
|
||||
"/js/dist/Chart.min.js": "/js/dist/Chart.min.js?id=9b1ae20c4c7048d6e4a1b2e1aee7fb31",
|
||||
"/css/dist/skins/_all-skins.min.css": "/css/dist/skins/_all-skins.min.css?id=146086d653897e2557af5e68f6f8c56f",
|
||||
"/css/dist/skins/_all-skins.min.css": "/css/dist/skins/_all-skins.min.css?id=f712d11cfca345b58c1d8a35df03d38d",
|
||||
"/css/dist/skins/skin-black-dark.min.css": "/css/dist/skins/skin-black-dark.min.css?id=bf1a348eae3e60c62b8879953f7df14c",
|
||||
"/css/dist/skins/skin-black.min.css": "/css/dist/skins/skin-black.min.css?id=84e2ee950ae04444988b37038e5a3951",
|
||||
"/css/dist/skins/skin-blue-dark.min.css": "/css/dist/skins/skin-blue-dark.min.css?id=cbb20ad6182b658f34117bf96a621b63",
|
||||
"/css/dist/skins/skin-blue.min.css": "/css/dist/skins/skin-blue.min.css?id=68a92d85c8e351dfb38a835307f126ec",
|
||||
"/css/dist/skins/skin-contrast.min.css": "/css/dist/skins/skin-contrast.min.css?id=8c61ef8889d392838fb977c7a1b1f6bb",
|
||||
"/css/dist/skins/skin-contrast.min.css": "/css/dist/skins/skin-contrast.min.css?id=fbd34e1e2d119358e781195c3fe26b69",
|
||||
"/css/dist/skins/skin-green-dark.min.css": "/css/dist/skins/skin-green-dark.min.css?id=436c77b84b2797f9683a7cdc4f8f6b8d",
|
||||
"/css/dist/skins/skin-green.min.css": "/css/dist/skins/skin-green.min.css?id=d68df5bc23ddddc710f7acf2201b2caf",
|
||||
"/css/dist/skins/skin-orange-dark.min.css": "/css/dist/skins/skin-orange-dark.min.css?id=71905ff04c78d92dc6f0b8354b458ffd",
|
||||
|
||||
@@ -579,6 +579,8 @@ function htmlEntities(str) {
|
||||
|
||||
})(jQuery);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Universal Livewire Select2 integration
|
||||
*
|
||||
@@ -610,3 +612,105 @@ document.addEventListener('livewire:init', () => {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
// Check/Uncheck all radio buttons in the permissions group
|
||||
$('.header-row input:radio').change(function() {
|
||||
value = $(this).attr('value');
|
||||
area = $(this).data('checker-group');
|
||||
$('.radiochecker-'+area+'[value='+value+']').prop('checked', true);
|
||||
});
|
||||
|
||||
// Generic toggleable callouts with remember state
|
||||
$(".remember-toggle").on("click",function(){
|
||||
var toggleable_callout_id = $(this).attr('id');
|
||||
var toggle_content_class = 'toggle-content-'+$(this).attr('id');
|
||||
var toggle_arrow = '#toggle-arrow-' + toggleable_callout_id;
|
||||
var toggle_cookie_name='toggle_state_'+toggleable_callout_id;
|
||||
|
||||
console.log('Callout ID: ' + toggleable_callout_id);
|
||||
console.log('Content ID: '+toggle_content_class);
|
||||
console.log('Arrow ID: '+toggle_arrow);
|
||||
console.log('Cookie Name: '+toggle_cookie_name);
|
||||
|
||||
$('.'+toggle_content_class).fadeToggle(100);
|
||||
$(toggle_arrow).toggleClass('fa-caret-right fa-caret-down');
|
||||
var toggle_open = $(toggle_arrow).hasClass('fa-caret-down');
|
||||
console.log('Cookie will set open state to: '+toggle_open);
|
||||
document.cookie=toggle_cookie_name+"="+toggle_open+';path=/';
|
||||
});
|
||||
|
||||
var all_cookies = document.cookie.split(';')
|
||||
for (var i in all_cookies) {
|
||||
var trimmed_cookie = all_cookies[i].trim(' ')
|
||||
elems = all_cookies[i].split('=', 2);
|
||||
|
||||
|
||||
// We have to do more here since we don't know the name of the selector
|
||||
if (trimmed_cookie.startsWith('toggle_state_')) {
|
||||
console.log(trimmed_cookie + ' matches toggle_state_');
|
||||
var toggle_selector_name = elems[0].replace(' toggle_state_','');
|
||||
if (elems[1] == 'true') {
|
||||
console.log('Selector name for cookie click trigger: '+toggle_selector_name);
|
||||
$('#'+toggle_selector_name+'.remember-toggle').trigger('click')
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This handles the show/hide of superuser and admin specific permissions
|
||||
* on the group edit and user edit pages
|
||||
*/
|
||||
if ($("#superuser_allow").is(':checked')) {
|
||||
|
||||
// Hide here instead of fadeout on pageload to prevent what looks like Flash Of Unstyled Content (FOUC)
|
||||
$(".nonsuperuser").hide();
|
||||
$(".nonsuperuser").attr('display','none');
|
||||
}
|
||||
|
||||
|
||||
$(".superuser").change(function() {
|
||||
if ($(this).val() == '1') {
|
||||
$(".nonsuperuser").fadeOut();
|
||||
$(".nonsuperuser").attr('display','none');
|
||||
$(".nonadmin").fadeOut();
|
||||
$(".nonadmin").attr('display','none');
|
||||
} else if ($(this).val() != '1') {
|
||||
$(".nonsuperuser").fadeIn();
|
||||
$(".nonsuperuser").attr('display','block');
|
||||
|
||||
// If the superuser button has been set to deny, we need to
|
||||
// check that the admin button isn't set to allow, before we show non-admin stuff
|
||||
if ($("#admin_allow").is(':checked')) {
|
||||
|
||||
// Hide here instead of fadeout on pageload to prevent what looks like Flash Of Unstyled Content (FOUC)
|
||||
$(".nonadmin").hide();
|
||||
$(".nonadmin").attr('display','none');
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
if ($("#admin_allow").is(':checked')) {
|
||||
|
||||
// Hide here instead of fadeout on pageload to prevent what looks like Flash Of Unstyled Content (FOUC)
|
||||
$(".nonadmin").hide();
|
||||
$(".nonadmin").attr('display','none');
|
||||
}
|
||||
|
||||
$(".admin").change(function() {
|
||||
if ($(this).val() == '1') {
|
||||
$(".nonadmin").fadeOut();
|
||||
$(".nonadmin").attr('display','none');
|
||||
} else if ($(this).val() != '1') {
|
||||
$(".nonadmin").fadeIn();
|
||||
$(".nonadmin").attr('display','block');
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -1175,10 +1175,6 @@ input[type="radio"]:checked::before {
|
||||
display: table-row !important;
|
||||
}
|
||||
|
||||
.form-control-static {
|
||||
padding-top: 0px;
|
||||
}
|
||||
|
||||
|
||||
td.text-right.text-padding-number-cell {
|
||||
padding-right: 30px !important;
|
||||
@@ -1264,4 +1260,105 @@ caption.tableCaption {
|
||||
|
||||
input[name="columnsSearch"] {
|
||||
width: 120px;
|
||||
}
|
||||
|
||||
.callout.callout-legend {
|
||||
background-color: #f4f4f4;
|
||||
border-left: 5px solid #959495;
|
||||
padding: 15px 30px 15px 15px;
|
||||
font-size: 100%;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
.callout.callout-legend h4 {
|
||||
color: #333;
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
margin-top: 5px;
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
.callout.callout-legend a {
|
||||
color: #333333;
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
p.callout-subtext {
|
||||
color:#333;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
p.callout-subtext a:hover, p.callout-subtext a:visited, p.callout-subtext a:link {
|
||||
color: #31708f;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/**
|
||||
This just hides the padding on the right side of the mark tag for a less weird visual experience
|
||||
*/
|
||||
mark {
|
||||
padding-right: 0px;
|
||||
}
|
||||
|
||||
/**
|
||||
Radio toggle styles for permission settings and check/uncheck all
|
||||
*/
|
||||
.radio-toggle-wrapper {
|
||||
display: flex;
|
||||
padding: 2px;
|
||||
background-color: #e9e9e9;
|
||||
margin-bottom: 3px;
|
||||
border-radius: 4px;
|
||||
border: 1px #d6d6d6 solid;
|
||||
}
|
||||
|
||||
.radio-slider-inputs {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.radio-slider-inputs input[type=radio] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.radio-slider-inputs label {
|
||||
display: block;
|
||||
margin-bottom: 0px;
|
||||
padding: 6px 8px;
|
||||
color: #fff;
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
transition : all .4s 0s ease;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.radio-slider-inputs label {
|
||||
color: #9a9999;
|
||||
border-radius: 4px;
|
||||
border: 1px transparent solid;
|
||||
}
|
||||
|
||||
.radio-slider-inputs .allow:checked + label {
|
||||
background-color: green;
|
||||
color: white;
|
||||
border-radius: 4px;
|
||||
border: 1px transparent solid;
|
||||
}
|
||||
|
||||
.radio-slider-inputs .inherit:checked + label {
|
||||
background-color: rgba(255, 204, 51, 0.11);
|
||||
color: #9a9999;
|
||||
border-radius: 4px;
|
||||
border: 1px white solid;
|
||||
}
|
||||
|
||||
.radio-slider-inputs .deny:checked + label {
|
||||
background-color: #a94442;
|
||||
color: white;
|
||||
border-radius: 4px;
|
||||
border: 1px transparent solid;
|
||||
}
|
||||
|
||||
.remember-toggle {
|
||||
cursor: pointer;
|
||||
}
|
||||
@@ -61,13 +61,21 @@
|
||||
.btn, .btn:hover {
|
||||
|
||||
|
||||
&.btn-default, .btn-default:link {
|
||||
&:hover {
|
||||
color: darken(@navy, 10%)
|
||||
}
|
||||
&:visited {
|
||||
color: darken(@navy, 10%)
|
||||
}
|
||||
}
|
||||
|
||||
&.btn-primary, .btn-primary:link {
|
||||
background-color: darken(@navy, 10%);
|
||||
border-color: darken(@navy, 20%);
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
|
||||
&a.btn-primary:hover {
|
||||
background-color: darken(@navy, 20%);
|
||||
border-color: darken(@navy, 20%);
|
||||
@@ -109,6 +117,11 @@ a.btn {
|
||||
color: #fff;
|
||||
text-decoration: underline;
|
||||
}
|
||||
&:visited {
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
.text-primary {
|
||||
@@ -144,7 +157,7 @@ a.btn {
|
||||
color: #FFF!important;
|
||||
}
|
||||
|
||||
btn-success {
|
||||
.btn-success {
|
||||
background-color: darken(@green, 30%);
|
||||
}
|
||||
|
||||
@@ -168,6 +181,7 @@ input::-ms-input-placeholder { /* IE 10+ */
|
||||
background-color: darken(@blue, 20%)!important;
|
||||
}
|
||||
|
||||
|
||||
.fixed-table-container tbody .selected td {
|
||||
background-color: #fff8af;
|
||||
}
|
||||
|
||||
@@ -18,9 +18,11 @@ return array(
|
||||
),
|
||||
|
||||
'delete' => array(
|
||||
'confirm' => 'crwdns631:0crwdne631:0',
|
||||
'error' => 'crwdns632:0crwdne632:0',
|
||||
'success' => 'crwdns633:0crwdne633:0'
|
||||
'confirm' => 'crwdns631:0crwdne631:0',
|
||||
'error' => 'crwdns632:0crwdne632:0',
|
||||
'success' => 'crwdns13884:0crwdne13884:0',
|
||||
'bulk_success' => 'crwdns13886:0crwdne13886:0',
|
||||
'partial_success' => 'crwdns13888:0crwdne13888:0',
|
||||
)
|
||||
|
||||
);
|
||||
|
||||
@@ -5,7 +5,7 @@ return [
|
||||
'manage' => 'crwdns6501:0crwdne6501:0',
|
||||
'field' => 'crwdns1487:0crwdne1487:0',
|
||||
'about_fieldsets_title' => 'crwdns1488:0crwdne1488:0',
|
||||
'about_fieldsets_text' => 'crwdns13746:0crwdne13746:0',
|
||||
'about_fieldsets_text' => 'crwdns13838:0crwdne13838:0',
|
||||
'custom_format' => 'crwdns6505:0crwdne6505:0',
|
||||
'encrypt_field' => 'crwdns1792:0crwdne1792:0',
|
||||
'encrypt_field_help' => 'crwdns1683:0crwdne1683:0',
|
||||
|
||||
@@ -22,9 +22,11 @@ return array(
|
||||
),
|
||||
|
||||
'delete' => array(
|
||||
'confirm' => 'crwdns901:0crwdne901:0',
|
||||
'confirm' => 'crwdns901:0crwdne901:0',
|
||||
'error' => 'crwdns1126:0crwdne1126:0',
|
||||
'success' => 'crwdns903:0crwdne903:0'
|
||||
'success' => 'crwdns13890:0crwdne13890:0',
|
||||
'bulk_success' => 'crwdns13892:0crwdne13892:0',
|
||||
'partial_success' => 'crwdns13894:0crwdne13894:0',
|
||||
)
|
||||
|
||||
);
|
||||
|
||||
@@ -37,7 +37,7 @@ return [
|
||||
'backups_clean_helptext' => "crwdns12714:0crwdne12714:0",
|
||||
'backups_upload' => 'crwdns6327:0crwdne6327:0',
|
||||
'backups_path' => 'crwdns6329:0crwdne6329:0',
|
||||
'backups_restore_warning' => 'crwdns13156:0crwdne13156:0',
|
||||
'backups_restore_warning' => 'crwdns13840:0crwdne13840:0',
|
||||
'backups_logged_out' => 'crwdns6774:0crwdne6774:0',
|
||||
'backups_large' => 'crwdns6335:0crwdne6335:0',
|
||||
'barcode_settings' => 'crwdns1295:0crwdne1295:0',
|
||||
|
||||
@@ -20,9 +20,9 @@ return array(
|
||||
'confirm' => 'crwdns867:0crwdne867:0',
|
||||
'error' => 'crwdns868:0crwdne868:0',
|
||||
'success' => 'crwdns869:0crwdne869:0',
|
||||
'assoc_assets' => 'crwdns1959:0crwdne1959:0',
|
||||
'assoc_licenses' => 'crwdns1960:0crwdne1960:0',
|
||||
'assoc_maintenances' => 'crwdns13582:0crwdne13582:0',
|
||||
'not_found' => 'crwdns13842:0crwdne13842:0',
|
||||
'bulk_success' => 'crwdns13844:0crwdne13844:0',
|
||||
'partial_success' => 'crwdns13882:0crwdne13882:0',
|
||||
)
|
||||
|
||||
);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'show_all' => 'crwdns13848:0crwdne13848:0',
|
||||
'2FA_reset' => 'crwdns12148:0crwdne12148:0',
|
||||
'accessories' => 'crwdns1200:0crwdne1200:0',
|
||||
'activated' => 'crwdns1540:0crwdne1540:0',
|
||||
@@ -628,6 +629,24 @@ return [
|
||||
'notes' => 'crwdns12878:0crwdne12878:0',
|
||||
],
|
||||
|
||||
'bulk_delete_associations' => [
|
||||
'general_assoc_warning' => 'crwdns13850:0crwdne13850:0',
|
||||
'assoc_assets' => 'crwdns13852:0crwdne13852:0',
|
||||
'asset_models' => 'crwdns13854:0crwdne13854:0',
|
||||
'assoc_maintenances' => 'crwdns13856:0crwdne13856:0',
|
||||
'assoc_accessories' => 'crwdns13858:0crwdne13858:0',
|
||||
'assoc_consumables' => 'crwdns13860:0crwdne13860:0',
|
||||
'assoc_components' => 'crwdns13862:0crwdne13862:0',
|
||||
'assoc_licenses' => 'crwdns13864:0crwdne13864:0',
|
||||
'assoc_assets_no_count' => 'crwdns13866:0crwdne13866:0',
|
||||
'asset_models_no_count' => 'crwdns13868:0crwdne13868:0',
|
||||
'assoc_maintenances_no_count' => 'crwdns13870:0crwdne13870:0',
|
||||
'assoc_accessories_no_count' => 'crwdns13872:0crwdne13872:0',
|
||||
'assoc_consumables_no_count' => 'crwdns13874:0crwdne13874:0',
|
||||
'assoc_components_no_count' => 'crwdns13876:0crwdne13876:0',
|
||||
'assoc_licenses_no_count' => 'crwdns13878:0crwdne13878:0',
|
||||
],
|
||||
|
||||
'breadcrumb_button_actions' => [
|
||||
'edit_item' => 'crwdns12914:0crwdne12914:0',
|
||||
'checkout_item' => 'crwdns12916:0crwdne12916:0',
|
||||
|
||||
@@ -18,9 +18,11 @@ return array(
|
||||
),
|
||||
|
||||
'delete' => array(
|
||||
'confirm' => 'Is jy seker jy wil hierdie kategorie uitvee?',
|
||||
'error' => 'Daar was \'n probleem met die verwydering van die kategorie. Probeer asseblief weer.',
|
||||
'success' => 'Die kategorie is suksesvol verwyder.'
|
||||
'confirm' => 'Is jy seker jy wil hierdie kategorie uitvee?',
|
||||
'error' => 'Daar was \'n probleem met die verwydering van die kategorie. Probeer asseblief weer.',
|
||||
'success' => 'Category was deleted successfully.',
|
||||
'bulk_success' => 'Categories were deleted successfully.',
|
||||
'partial_success' => 'Category deleted successfully. See additional information below. | :count categories were deleted successfully. See additional information below.',
|
||||
)
|
||||
|
||||
);
|
||||
|
||||
@@ -5,7 +5,7 @@ return [
|
||||
'manage' => 'Manage',
|
||||
'field' => 'veld',
|
||||
'about_fieldsets_title' => 'Oor Fieldsets',
|
||||
'about_fieldsets_text' => 'Fieldsets allow you to create groups of custom fields that are frequently re-used for specific asset model types.',
|
||||
'about_fieldsets_text' => 'Veldstelle stel jou in staat om groepe van persoonlike velde te skep wat gereeld hergebruik word vir spesifieke tipe bates.',
|
||||
'custom_format' => '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.',
|
||||
|
||||
@@ -22,9 +22,11 @@ return array(
|
||||
),
|
||||
|
||||
'delete' => array(
|
||||
'confirm' => 'Is jy seker jy wil hierdie vervaardiger uitvee?',
|
||||
'confirm' => 'Is jy seker jy wil hierdie vervaardiger uitvee?',
|
||||
'error' => 'Daar was \'n probleem met die verwydering van die vervaardiger. Probeer asseblief weer.',
|
||||
'success' => 'Die vervaardiger is suksesvol verwyder.'
|
||||
'success' => 'Manufacturer deleted successfully.',
|
||||
'bulk_success' => 'Manufacturers deleted successfully.',
|
||||
'partial_success' => 'Manufacturer deleted successfully. See additional information below. | :count manufacturers were deleted successfully. See additional information below.',
|
||||
)
|
||||
|
||||
);
|
||||
|
||||
@@ -37,7 +37,7 @@ return [
|
||||
'backups_clean_helptext' => "This can be useful if you're changing between database versions",
|
||||
'backups_upload' => 'Upload Backup',
|
||||
'backups_path' => 'Backups on the server are stored in <code>:path</code>',
|
||||
'backups_restore_warning' => 'Use the restore button <small><span class="btn btn-xs btn-warning"><i class="text-white fas fa-retweet" aria-hidden="true"></i></span></small> to restore from a previous backup. (This does not currently work with S3 file storage or Docker.)<br><br>Your <strong>entire :app_name database and any uploaded files will be completely replaced</strong> by what\'s in the backup file ',
|
||||
'backups_restore_warning' => 'Use the restore button <small><span class="btn btn-xs btn-warning"><i class="text-white fas fa-retweet" aria-hidden="true"></i></span></small> to restore from a previous backup. (This does not currently work with S3 file storage.)<br><br>Your <strong>entire :app_name database and any uploaded files will be completely replaced</strong> by what\'s in the backup file ',
|
||||
'backups_logged_out' => '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',
|
||||
|
||||
@@ -20,9 +20,9 @@ return array(
|
||||
'confirm' => 'Is jy seker jy wil hierdie verskaffer uitvee?',
|
||||
'error' => 'Daar was \'n probleem met die verwydering van die verskaffer. Probeer asseblief weer.',
|
||||
'success' => 'Verskaffer is suksesvol verwyder.',
|
||||
'assoc_assets' => 'This supplier is currently associated with :asset_count asset(s) and cannot be deleted. Please update your assets to no longer reference this supplier and try again. ',
|
||||
'assoc_licenses' => 'This supplier is currently associated with :licenses_count licences(s) and cannot be deleted. Please update your licenses to no longer reference this supplier and try again. ',
|
||||
'assoc_maintenances' => 'This supplier is currently associated with :maintenances_count asset maintenances(s) and cannot be deleted. Please update your asset maintenances to no longer reference this supplier and try again. ',
|
||||
'not_found' => 'Supplier not found.',
|
||||
'bulk_success' => 'Suppliers were deleted successfully.',
|
||||
'partial_success' => 'Supplier deleted successfully. See additional information below. | :count suppliers were deleted successfully. See additional information below.',
|
||||
)
|
||||
|
||||
);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'show_all' => 'Show All',
|
||||
'2FA_reset' => '2FA reset',
|
||||
'accessories' => 'bykomstighede',
|
||||
'activated' => 'geaktiveer',
|
||||
@@ -629,6 +630,24 @@ return [
|
||||
'notes' => 'Add a note',
|
||||
],
|
||||
|
||||
'bulk_delete_associations' => [
|
||||
'general_assoc_warning' => ':item_name still has associated items. Please remove them before deleting this :item.',
|
||||
'assoc_assets' => ':item_name is currently associated with :asset_count asset(s) and cannot be deleted. Please update your assets to no longer reference this :item and try again.',
|
||||
'asset_models' => ':item_name is currently associated with :asset_count asset(s) and cannot be deleted. Please update your asset models to no longer reference this :item and try again.',
|
||||
'assoc_maintenances' => ':item_name is currently associated with :maintenance_count maintenance(s) and cannot be deleted. Please update your maintenances to no longer reference this :item and try again.',
|
||||
'assoc_accessories' => ':item_name is currently associated with :accessory_count accessory(ies) and cannot be deleted. Please update your accessories to no longer reference this :item and try again.',
|
||||
'assoc_consumables' => ':item_name is currently associated with :consumable_count consumable(s) and cannot be deleted. Please update your consumables to no longer reference this :item and try again.',
|
||||
'assoc_components' => ':item_name is currently associated with :component_count component(s) and cannot be deleted. Please update your components to no longer reference this :item and try again.',
|
||||
'assoc_licenses' => ':item_name is currently associated with :license_count license(s) and cannot be deleted. Please update your licenses to no longer reference this :item and try again.',
|
||||
'assoc_assets_no_count' => ':item_name is currently associated with other assets and cannot be deleted. Please update your assets to no longer reference this :item and try again.',
|
||||
'asset_models_no_count' => ':item_name is currently associated with other asset models and cannot be deleted. Please update your assets to no longer reference this :item and try again.',
|
||||
'assoc_maintenances_no_count' => ':item_name is currently associated with other maintenances and cannot be deleted. Please update your maintenances to no longer reference this :item and try again.',
|
||||
'assoc_accessories_no_count' => ':item_name is currently associated with other accessories and cannot be deleted. Please update your accessories to no longer reference this :item and try again.',
|
||||
'assoc_consumables_no_count' => ':item_name is currently associated with other consumables and cannot be deleted. Please update your consumables to no longer reference this :item and try again.',
|
||||
'assoc_components_no_count' => ':item_name is currently associated with other components and cannot be deleted. Please update your components to no longer reference this :item and try again.',
|
||||
'assoc_licenses_no_count' => ':item_name is currently associated with other licenses and cannot be deleted. Please update your licenses to no longer reference this :item and try again.',
|
||||
],
|
||||
|
||||
'breadcrumb_button_actions' => [
|
||||
'edit_item' => 'Edit :name',
|
||||
'checkout_item' => 'Checkout :name',
|
||||
|
||||
@@ -18,9 +18,11 @@ return array(
|
||||
),
|
||||
|
||||
'delete' => array(
|
||||
'confirm' => 'Are you sure you wish to delete this category?',
|
||||
'error' => 'There was an issue deleting the category. Please try again.',
|
||||
'success' => 'The category was deleted successfully.'
|
||||
'confirm' => 'Are you sure you wish to delete this category?',
|
||||
'error' => 'There was an issue deleting the category. Please try again.',
|
||||
'success' => 'Category was deleted successfully.',
|
||||
'bulk_success' => 'Categories were deleted successfully.',
|
||||
'partial_success' => 'Category deleted successfully. See additional information below. | :count categories were deleted successfully. See additional information below.',
|
||||
)
|
||||
|
||||
);
|
||||
|
||||
@@ -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 for specific asset model types.',
|
||||
'about_fieldsets_text' => 'Fieldsets allow you to create groups of custom fields that are frequently re-used used for specific asset model types.',
|
||||
'custom_format' => 'Custom Regex format...',
|
||||
'encrypt_field' => 'Encrypt the value of this field in the database',
|
||||
'encrypt_field_help' => 'WARNING: Encrypting a field makes it unsearchable.',
|
||||
|
||||
@@ -22,9 +22,11 @@ return array(
|
||||
),
|
||||
|
||||
'delete' => array(
|
||||
'confirm' => 'Are you sure you wish to delete this manufacturer?',
|
||||
'confirm' => 'Are you sure you wish to delete this manufacturer?',
|
||||
'error' => 'There was an issue deleting the manufacturer. Please try again.',
|
||||
'success' => 'The Manufacturer was deleted successfully.'
|
||||
'success' => 'Manufacturer deleted successfully.',
|
||||
'bulk_success' => 'Manufacturers deleted successfully.',
|
||||
'partial_success' => 'Manufacturer deleted successfully. See additional information below. | :count manufacturers were deleted successfully. See additional information below.',
|
||||
)
|
||||
|
||||
);
|
||||
|
||||
@@ -37,7 +37,7 @@ return [
|
||||
'backups_clean_helptext' => "This can be useful if you're changing between database versions",
|
||||
'backups_upload' => 'Upload Backup',
|
||||
'backups_path' => 'Backups on the server are stored in <code>:path</code>',
|
||||
'backups_restore_warning' => 'Use the restore button <small><span class="btn btn-xs btn-warning"><i class="text-white fas fa-retweet" aria-hidden="true"></i></span></small> to restore from a previous backup. (This does not currently work with S3 file storage or Docker.)<br><br>Your <strong>entire :app_name database and any uploaded files will be completely replaced</strong> by what\'s in the backup file ',
|
||||
'backups_restore_warning' => 'Use the restore button <small><span class="btn btn-xs btn-warning"><i class="text-white fas fa-retweet" aria-hidden="true"></i></span></small> to restore from a previous backup. (This does not currently work with S3 file storage.)<br><br>Your <strong>entire :app_name database and any uploaded files will be completely replaced</strong> by what\'s in the backup file ',
|
||||
'backups_logged_out' => '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 Settings',
|
||||
|
||||
@@ -20,9 +20,9 @@ return array(
|
||||
'confirm' => 'Are you sure you wish to delete this supplier?',
|
||||
'error' => 'There was an issue deleting the supplier. Please try again.',
|
||||
'success' => 'Supplier was deleted successfully.',
|
||||
'assoc_assets' => 'This supplier is currently associated with :asset_count asset(s) and cannot be deleted. Please update your assets to no longer reference this supplier and try again. ',
|
||||
'assoc_licenses' => 'This supplier is currently associated with :licenses_count licences(s) and cannot be deleted. Please update your licenses to no longer reference this supplier and try again. ',
|
||||
'assoc_maintenances' => 'This supplier is currently associated with :maintenances_count asset maintenances(s) and cannot be deleted. Please update your asset maintenances to no longer reference this supplier and try again. ',
|
||||
'not_found' => 'Supplier not found.',
|
||||
'bulk_success' => 'Suppliers were deleted successfully.',
|
||||
'partial_success' => 'Supplier deleted successfully. See additional information below. | :count suppliers were deleted successfully. See additional information below.',
|
||||
)
|
||||
|
||||
);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'show_all' => 'Show All',
|
||||
'2FA_reset' => '2FA reset',
|
||||
'accessories' => 'መለዋወጫዎች',
|
||||
'activated' => 'Activated',
|
||||
@@ -629,6 +630,24 @@ return [
|
||||
'notes' => 'Add a note',
|
||||
],
|
||||
|
||||
'bulk_delete_associations' => [
|
||||
'general_assoc_warning' => ':item_name still has associated items. Please remove them before deleting this :item.',
|
||||
'assoc_assets' => ':item_name is currently associated with :asset_count asset(s) and cannot be deleted. Please update your assets to no longer reference this :item and try again.',
|
||||
'asset_models' => ':item_name is currently associated with :asset_count asset(s) and cannot be deleted. Please update your asset models to no longer reference this :item and try again.',
|
||||
'assoc_maintenances' => ':item_name is currently associated with :maintenance_count maintenance(s) and cannot be deleted. Please update your maintenances to no longer reference this :item and try again.',
|
||||
'assoc_accessories' => ':item_name is currently associated with :accessory_count accessory(ies) and cannot be deleted. Please update your accessories to no longer reference this :item and try again.',
|
||||
'assoc_consumables' => ':item_name is currently associated with :consumable_count consumable(s) and cannot be deleted. Please update your consumables to no longer reference this :item and try again.',
|
||||
'assoc_components' => ':item_name is currently associated with :component_count component(s) and cannot be deleted. Please update your components to no longer reference this :item and try again.',
|
||||
'assoc_licenses' => ':item_name is currently associated with :license_count license(s) and cannot be deleted. Please update your licenses to no longer reference this :item and try again.',
|
||||
'assoc_assets_no_count' => ':item_name is currently associated with other assets and cannot be deleted. Please update your assets to no longer reference this :item and try again.',
|
||||
'asset_models_no_count' => ':item_name is currently associated with other asset models and cannot be deleted. Please update your assets to no longer reference this :item and try again.',
|
||||
'assoc_maintenances_no_count' => ':item_name is currently associated with other maintenances and cannot be deleted. Please update your maintenances to no longer reference this :item and try again.',
|
||||
'assoc_accessories_no_count' => ':item_name is currently associated with other accessories and cannot be deleted. Please update your accessories to no longer reference this :item and try again.',
|
||||
'assoc_consumables_no_count' => ':item_name is currently associated with other consumables and cannot be deleted. Please update your consumables to no longer reference this :item and try again.',
|
||||
'assoc_components_no_count' => ':item_name is currently associated with other components and cannot be deleted. Please update your components to no longer reference this :item and try again.',
|
||||
'assoc_licenses_no_count' => ':item_name is currently associated with other licenses and cannot be deleted. Please update your licenses to no longer reference this :item and try again.',
|
||||
],
|
||||
|
||||
'breadcrumb_button_actions' => [
|
||||
'edit_item' => 'Edit :name',
|
||||
'checkout_item' => 'Checkout :name',
|
||||
|
||||
@@ -18,9 +18,11 @@ return array(
|
||||
),
|
||||
|
||||
'delete' => array(
|
||||
'confirm' => 'هل أنت متأكد أنك تريد حذف هذا التصنيف؟',
|
||||
'error' => 'حدث خطأ أثناء محاولة حذف التصنيف. الرجاء المحاولة مرة أخرى.',
|
||||
'success' => 'تم حذف التصنيف بنجاح.'
|
||||
'confirm' => 'هل أنت متأكد أنك تريد حذف هذا التصنيف؟',
|
||||
'error' => 'حدث خطأ أثناء محاولة حذف التصنيف. الرجاء المحاولة مرة أخرى.',
|
||||
'success' => 'Category was deleted successfully.',
|
||||
'bulk_success' => 'Categories were deleted successfully.',
|
||||
'partial_success' => 'Category deleted successfully. See additional information below. | :count categories were deleted successfully. See additional information below.',
|
||||
)
|
||||
|
||||
);
|
||||
|
||||
@@ -5,7 +5,7 @@ return [
|
||||
'manage' => 'إدارة',
|
||||
'field' => 'حقل',
|
||||
'about_fieldsets_title' => 'حول مجموعة الحقول',
|
||||
'about_fieldsets_text' => 'مجموعات الحقول تسمح لك بإنشاء مجموعات من الحقول المخصصة التي يعاد استخدامها في كثير من الأحيان لأنواع معينة من نماذج الأصول.',
|
||||
'about_fieldsets_text' => '(مجموعات الحقول) تسمح لك بإنشاء مجموعات من الحقول اللتي يمكن إعادة إستخدامها مع موديل محدد.',
|
||||
'custom_format' => 'تنسيق Regex المخصص...',
|
||||
'encrypt_field' => 'تشفير قيمة هذا الحقل في قاعدة البيانات',
|
||||
'encrypt_field_help' => 'تحذير: تشفير الحقل يجعله غير قابل للبحث.',
|
||||
|
||||
@@ -22,9 +22,11 @@ return array(
|
||||
),
|
||||
|
||||
'delete' => array(
|
||||
'confirm' => 'هل أنت متأكد من رغبتك في حذف هذه الشركة المصنعة؟',
|
||||
'confirm' => 'هل أنت متأكد من رغبتك في حذف هذه الشركة المصنعة؟',
|
||||
'error' => 'لقد حدثت مشكلة اثناء عملية حذف الشركة المصنعة، الرجاء المحاولة مرة اخرى.',
|
||||
'success' => 'تم حذف الشركة المصنعة بنجاح.'
|
||||
'success' => 'Manufacturer deleted successfully.',
|
||||
'bulk_success' => 'Manufacturers deleted successfully.',
|
||||
'partial_success' => 'Manufacturer deleted successfully. See additional information below. | :count manufacturers were deleted successfully. See additional information below.',
|
||||
)
|
||||
|
||||
);
|
||||
|
||||
@@ -37,7 +37,7 @@ return [
|
||||
'backups_clean_helptext' => "This can be useful if you're changing between database versions",
|
||||
'backups_upload' => 'تحميل نسخة احتياطية',
|
||||
'backups_path' => 'يتم تخزين النسخ الاحتياطي على الخادم في <code>:path</code>',
|
||||
'backups_restore_warning' => 'Use the restore button <small><span class="btn btn-xs btn-warning"><i class="text-white fas fa-retweet" aria-hidden="true"></i></span></small> to restore from a previous backup. (This does not currently work with S3 file storage or Docker.)<br><br>Your <strong>entire :app_name database and any uploaded files will be completely replaced</strong> by what\'s in the backup file ',
|
||||
'backups_restore_warning' => 'Use the restore button <small><span class="btn btn-xs btn-warning"><i class="text-white fas fa-retweet" aria-hidden="true"></i></span></small> to restore from a previous backup. (This does not currently work with S3 file storage.)<br><br>Your <strong>entire :app_name database and any uploaded files will be completely replaced</strong> by what\'s in the backup file ',
|
||||
'backups_logged_out' => 'سيتم تسجيل الخروج من جميع المستخدمين الحاليين، بما في ذلك انت، بمجرد اكتمال الاستعادة.',
|
||||
'backups_large' => 'قد تنتهي النسخ الاحتياطية الكبيرة جدا عند محاولة الاستعادة وقد تكون هناك حاجة إلى تشغيلها عبر سطر الأوامر. ',
|
||||
'barcode_settings' => 'إعدادات الباركود',
|
||||
|
||||
@@ -20,9 +20,9 @@ return array(
|
||||
'confirm' => 'هل أنت متأكد من رغبتك في حذف هذا المورد؟',
|
||||
'error' => 'حدثت مشكلة أثناء حذف المورد. حاول مرة اخرى.',
|
||||
'success' => 'تم حذف المورد بنجاح.',
|
||||
'assoc_assets' => 'هذا المورد مرتبط حاليا مع :asset_count من الأصول على الاقل ولا يمكن حذفه. الرجاء تحديث الأصول لكي لا تشير الى هذا المورد ثم حاول مرة أخرى. ',
|
||||
'assoc_licenses' => 'هذا المورد مرتبط حاليا مع :licenses_count من التراخيص ولا يمكن حذفه. الرجاء تحديث التراخيص الخاصة بك لكي لا تشير الى هذا المورد وحاول مرة أخرى. ',
|
||||
'assoc_maintenances' => 'This supplier is currently associated with :maintenances_count asset maintenances(s) and cannot be deleted. Please update your asset maintenances to no longer reference this supplier and try again. ',
|
||||
'not_found' => 'Supplier not found.',
|
||||
'bulk_success' => 'Suppliers were deleted successfully.',
|
||||
'partial_success' => 'Supplier deleted successfully. See additional information below. | :count suppliers were deleted successfully. See additional information below.',
|
||||
)
|
||||
|
||||
);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'show_all' => 'Show All',
|
||||
'2FA_reset' => '2FA reset',
|
||||
'accessories' => 'ملحقات',
|
||||
'activated' => 'مفعل',
|
||||
@@ -629,6 +630,24 @@ return [
|
||||
'notes' => 'Add a note',
|
||||
],
|
||||
|
||||
'bulk_delete_associations' => [
|
||||
'general_assoc_warning' => ':item_name still has associated items. Please remove them before deleting this :item.',
|
||||
'assoc_assets' => ':item_name is currently associated with :asset_count asset(s) and cannot be deleted. Please update your assets to no longer reference this :item and try again.',
|
||||
'asset_models' => ':item_name is currently associated with :asset_count asset(s) and cannot be deleted. Please update your asset models to no longer reference this :item and try again.',
|
||||
'assoc_maintenances' => ':item_name is currently associated with :maintenance_count maintenance(s) and cannot be deleted. Please update your maintenances to no longer reference this :item and try again.',
|
||||
'assoc_accessories' => ':item_name is currently associated with :accessory_count accessory(ies) and cannot be deleted. Please update your accessories to no longer reference this :item and try again.',
|
||||
'assoc_consumables' => ':item_name is currently associated with :consumable_count consumable(s) and cannot be deleted. Please update your consumables to no longer reference this :item and try again.',
|
||||
'assoc_components' => ':item_name is currently associated with :component_count component(s) and cannot be deleted. Please update your components to no longer reference this :item and try again.',
|
||||
'assoc_licenses' => ':item_name is currently associated with :license_count license(s) and cannot be deleted. Please update your licenses to no longer reference this :item and try again.',
|
||||
'assoc_assets_no_count' => ':item_name is currently associated with other assets and cannot be deleted. Please update your assets to no longer reference this :item and try again.',
|
||||
'asset_models_no_count' => ':item_name is currently associated with other asset models and cannot be deleted. Please update your assets to no longer reference this :item and try again.',
|
||||
'assoc_maintenances_no_count' => ':item_name is currently associated with other maintenances and cannot be deleted. Please update your maintenances to no longer reference this :item and try again.',
|
||||
'assoc_accessories_no_count' => ':item_name is currently associated with other accessories and cannot be deleted. Please update your accessories to no longer reference this :item and try again.',
|
||||
'assoc_consumables_no_count' => ':item_name is currently associated with other consumables and cannot be deleted. Please update your consumables to no longer reference this :item and try again.',
|
||||
'assoc_components_no_count' => ':item_name is currently associated with other components and cannot be deleted. Please update your components to no longer reference this :item and try again.',
|
||||
'assoc_licenses_no_count' => ':item_name is currently associated with other licenses and cannot be deleted. Please update your licenses to no longer reference this :item and try again.',
|
||||
],
|
||||
|
||||
'breadcrumb_button_actions' => [
|
||||
'edit_item' => 'Edit :name',
|
||||
'checkout_item' => 'Checkout :name',
|
||||
|
||||
@@ -18,9 +18,11 @@ return array(
|
||||
),
|
||||
|
||||
'delete' => array(
|
||||
'confirm' => 'Желаете ли да изтриете тази категория?',
|
||||
'error' => 'Проблем при изтриване на категорията. Моля опитайте отново.',
|
||||
'success' => 'Категорията бе изтрита успешно.'
|
||||
'confirm' => 'Желаете ли да изтриете тази категория?',
|
||||
'error' => 'Проблем при изтриване на категорията. Моля опитайте отново.',
|
||||
'success' => 'Category was deleted successfully.',
|
||||
'bulk_success' => 'Categories were deleted successfully.',
|
||||
'partial_success' => 'Category deleted successfully. See additional information below. | :count categories were deleted successfully. See additional information below.',
|
||||
)
|
||||
|
||||
);
|
||||
|
||||
@@ -5,7 +5,7 @@ return [
|
||||
'manage' => 'Управление',
|
||||
'field' => 'Поле',
|
||||
'about_fieldsets_title' => 'Относно Fieldsets',
|
||||
'about_fieldsets_text' => '"Група от полета" позволяват създаването на групи от персонализирани полета, които се използват и преизползват често за специфични типове модели на активи.',
|
||||
'about_fieldsets_text' => 'Fieldsets позволяват създаването на групи от персонализирани полета, които се използват и преизползват често за специфични типове модели на активи.',
|
||||
'custom_format' => 'Персонализиран формат...',
|
||||
'encrypt_field' => 'Шифроване на стойността на това поле в базата данни',
|
||||
'encrypt_field_help' => 'ВНИМАНИЕ: Шифроване на поле го прави невалидно за търсене.',
|
||||
|
||||
@@ -22,9 +22,11 @@ return array(
|
||||
),
|
||||
|
||||
'delete' => array(
|
||||
'confirm' => 'Сигурни ли сте, че искате да изтриете този производител?',
|
||||
'confirm' => 'Сигурни ли сте, че искате да изтриете този производител?',
|
||||
'error' => 'Възникна проблем при изтриването на проиводителя. Моля, опитайте отново.',
|
||||
'success' => 'Производителят е изтрит.'
|
||||
'success' => 'Manufacturer deleted successfully.',
|
||||
'bulk_success' => 'Manufacturers deleted successfully.',
|
||||
'partial_success' => 'Manufacturer deleted successfully. See additional information below. | :count manufacturers were deleted successfully. See additional information below.',
|
||||
)
|
||||
|
||||
);
|
||||
|
||||
@@ -37,7 +37,7 @@ return [
|
||||
'backups_clean_helptext' => "Това може да е полесно при смяна на версията на базата",
|
||||
'backups_upload' => 'Качване на архив',
|
||||
'backups_path' => 'Архивите на сървъра са записани в <code>:path</code>',
|
||||
'backups_restore_warning' => 'Използвайте бутона за възстановяване <small><span class="btn btn-xs btn-warning"><i class="text-white fas fa-retweet" aria-hidden="true"></i></span></small> ,за да възстановите архивно копие. (Това не работи с S3 файлова система или Docker.)<br><br>Вашата <strong>цяла :app_name датабаза и всички качени файлове ще бъдат заменени</strong> от съдържанието на архива. ',
|
||||
'backups_restore_warning' => 'Use the restore button <small><span class="btn btn-xs btn-warning"><i class="text-white fas fa-retweet" aria-hidden="true"></i></span></small> to restore from a previous backup. (This does not currently work with S3 file storage.)<br><br>Your <strong>entire :app_name database and any uploaded files will be completely replaced</strong> by what\'s in the backup file ',
|
||||
'backups_logged_out' => 'Всички потребители, включително и вие, ще бъдат отписани след възстановяването.',
|
||||
'backups_large' => 'Много големите архиви може да не могат да се възстановят поради изтичане на времето на сесията и ще трябва да се възстановят ръчно през команден ред. ',
|
||||
'barcode_settings' => 'Настройки на баркод',
|
||||
|
||||
@@ -20,9 +20,9 @@ return array(
|
||||
'confirm' => 'Сигурни ли сте, че искате да изтриете този доставчик?',
|
||||
'error' => 'Възникна проблем при изтриване на доставчика. Моля, опитайте отново.',
|
||||
'success' => 'Доставчикът е изтрит.',
|
||||
'assoc_assets' => 'Този доставчик е текущо асоцииран с :asset_count актива и не може да бъде изтрит. Моля, променете връзките на моделите по отношение на този доставчик и опитайте отново. ',
|
||||
'assoc_licenses' => 'Този доставчик е текущо асоцииран с :licenses_count лиценза и не може да бъде изтрит. Моля, променете връзките на лицензите по отношение на този доставчик и опитайте отново. ',
|
||||
'assoc_maintenances' => 'This supplier is currently associated with :maintenances_count asset maintenances(s) and cannot be deleted. Please update your asset maintenances to no longer reference this supplier and try again. ',
|
||||
'not_found' => 'Supplier not found.',
|
||||
'bulk_success' => 'Suppliers were deleted successfully.',
|
||||
'partial_success' => 'Supplier deleted successfully. See additional information below. | :count suppliers were deleted successfully. See additional information below.',
|
||||
)
|
||||
|
||||
);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'show_all' => 'Show All',
|
||||
'2FA_reset' => '2FA нулиране',
|
||||
'accessories' => 'Аксесоари',
|
||||
'activated' => 'Активирано',
|
||||
@@ -629,6 +630,24 @@ return [
|
||||
'notes' => 'Добавете бележка',
|
||||
],
|
||||
|
||||
'bulk_delete_associations' => [
|
||||
'general_assoc_warning' => ':item_name still has associated items. Please remove them before deleting this :item.',
|
||||
'assoc_assets' => ':item_name is currently associated with :asset_count asset(s) and cannot be deleted. Please update your assets to no longer reference this :item and try again.',
|
||||
'asset_models' => ':item_name is currently associated with :asset_count asset(s) and cannot be deleted. Please update your asset models to no longer reference this :item and try again.',
|
||||
'assoc_maintenances' => ':item_name is currently associated with :maintenance_count maintenance(s) and cannot be deleted. Please update your maintenances to no longer reference this :item and try again.',
|
||||
'assoc_accessories' => ':item_name is currently associated with :accessory_count accessory(ies) and cannot be deleted. Please update your accessories to no longer reference this :item and try again.',
|
||||
'assoc_consumables' => ':item_name is currently associated with :consumable_count consumable(s) and cannot be deleted. Please update your consumables to no longer reference this :item and try again.',
|
||||
'assoc_components' => ':item_name is currently associated with :component_count component(s) and cannot be deleted. Please update your components to no longer reference this :item and try again.',
|
||||
'assoc_licenses' => ':item_name is currently associated with :license_count license(s) and cannot be deleted. Please update your licenses to no longer reference this :item and try again.',
|
||||
'assoc_assets_no_count' => ':item_name is currently associated with other assets and cannot be deleted. Please update your assets to no longer reference this :item and try again.',
|
||||
'asset_models_no_count' => ':item_name is currently associated with other asset models and cannot be deleted. Please update your assets to no longer reference this :item and try again.',
|
||||
'assoc_maintenances_no_count' => ':item_name is currently associated with other maintenances and cannot be deleted. Please update your maintenances to no longer reference this :item and try again.',
|
||||
'assoc_accessories_no_count' => ':item_name is currently associated with other accessories and cannot be deleted. Please update your accessories to no longer reference this :item and try again.',
|
||||
'assoc_consumables_no_count' => ':item_name is currently associated with other consumables and cannot be deleted. Please update your consumables to no longer reference this :item and try again.',
|
||||
'assoc_components_no_count' => ':item_name is currently associated with other components and cannot be deleted. Please update your components to no longer reference this :item and try again.',
|
||||
'assoc_licenses_no_count' => ':item_name is currently associated with other licenses and cannot be deleted. Please update your licenses to no longer reference this :item and try again.',
|
||||
],
|
||||
|
||||
'breadcrumb_button_actions' => [
|
||||
'edit_item' => 'Редактирай :name',
|
||||
'checkout_item' => 'Изпиши :name',
|
||||
|
||||
@@ -18,9 +18,11 @@ return array(
|
||||
),
|
||||
|
||||
'delete' => array(
|
||||
'confirm' => 'Are you sure you wish to delete this category?',
|
||||
'error' => 'There was an issue deleting the category. Please try again.',
|
||||
'success' => 'The category was deleted successfully.'
|
||||
'confirm' => 'Are you sure you wish to delete this category?',
|
||||
'error' => 'There was an issue deleting the category. Please try again.',
|
||||
'success' => 'Category was deleted successfully.',
|
||||
'bulk_success' => 'Categories were deleted successfully.',
|
||||
'partial_success' => 'Category deleted successfully. See additional information below. | :count categories were deleted successfully. See additional information below.',
|
||||
)
|
||||
|
||||
);
|
||||
|
||||
@@ -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 for specific asset model types.',
|
||||
'about_fieldsets_text' => 'Fieldsets allow you to create groups of custom fields that are frequently re-used used for specific asset model types.',
|
||||
'custom_format' => 'Custom Regex format...',
|
||||
'encrypt_field' => 'Encrypt the value of this field in the database',
|
||||
'encrypt_field_help' => 'WARNING: Encrypting a field makes it unsearchable.',
|
||||
|
||||
@@ -22,9 +22,11 @@ return array(
|
||||
),
|
||||
|
||||
'delete' => array(
|
||||
'confirm' => 'Are you sure you wish to delete this manufacturer?',
|
||||
'confirm' => 'Are you sure you wish to delete this manufacturer?',
|
||||
'error' => 'There was an issue deleting the manufacturer. Please try again.',
|
||||
'success' => 'The Manufacturer was deleted successfully.'
|
||||
'success' => 'Manufacturer deleted successfully.',
|
||||
'bulk_success' => 'Manufacturers deleted successfully.',
|
||||
'partial_success' => 'Manufacturer deleted successfully. See additional information below. | :count manufacturers were deleted successfully. See additional information below.',
|
||||
)
|
||||
|
||||
);
|
||||
|
||||
@@ -37,7 +37,7 @@ return [
|
||||
'backups_clean_helptext' => "This can be useful if you're changing between database versions",
|
||||
'backups_upload' => 'Upload Backup',
|
||||
'backups_path' => 'Backups on the server are stored in <code>:path</code>',
|
||||
'backups_restore_warning' => 'Use the restore button <small><span class="btn btn-xs btn-warning"><i class="text-white fas fa-retweet" aria-hidden="true"></i></span></small> to restore from a previous backup. (This does not currently work with S3 file storage or Docker.)<br><br>Your <strong>entire :app_name database and any uploaded files will be completely replaced</strong> by what\'s in the backup file ',
|
||||
'backups_restore_warning' => 'Use the restore button <small><span class="btn btn-xs btn-warning"><i class="text-white fas fa-retweet" aria-hidden="true"></i></span></small> to restore from a previous backup. (This does not currently work with S3 file storage.)<br><br>Your <strong>entire :app_name database and any uploaded files will be completely replaced</strong> by what\'s in the backup file ',
|
||||
'backups_logged_out' => '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 Settings',
|
||||
|
||||
@@ -20,9 +20,9 @@ return array(
|
||||
'confirm' => 'Are you sure you wish to delete this supplier?',
|
||||
'error' => 'There was an issue deleting the supplier. Please try again.',
|
||||
'success' => 'Supplier was deleted successfully.',
|
||||
'assoc_assets' => 'This supplier is currently associated with :asset_count asset(s) and cannot be deleted. Please update your assets to no longer reference this supplier and try again. ',
|
||||
'assoc_licenses' => 'This supplier is currently associated with :licenses_count licences(s) and cannot be deleted. Please update your licenses to no longer reference this supplier and try again. ',
|
||||
'assoc_maintenances' => 'This supplier is currently associated with :maintenances_count asset maintenances(s) and cannot be deleted. Please update your asset maintenances to no longer reference this supplier and try again. ',
|
||||
'not_found' => 'Supplier not found.',
|
||||
'bulk_success' => 'Suppliers were deleted successfully.',
|
||||
'partial_success' => 'Supplier deleted successfully. See additional information below. | :count suppliers were deleted successfully. See additional information below.',
|
||||
)
|
||||
|
||||
);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user