From 384652b3df38ce81e7a571777530e44def1c24be Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 16 Sep 2025 10:10:49 -0700 Subject: [PATCH 01/42] add total cost to accessories --- app/Http/Transformers/AccessoriesTransformer.php | 1 + app/Models/Accessory.php | 4 ++++ app/Presenters/AccessoryPresenter.php | 6 ++++++ resources/lang/en-US/general.php | 1 + resources/views/accessories/view.blade.php | 12 ++++++++++++ 5 files changed, 24 insertions(+) diff --git a/app/Http/Transformers/AccessoriesTransformer.php b/app/Http/Transformers/AccessoriesTransformer.php index 491871e122..c7af414d08 100644 --- a/app/Http/Transformers/AccessoriesTransformer.php +++ b/app/Http/Transformers/AccessoriesTransformer.php @@ -36,6 +36,7 @@ class AccessoriesTransformer 'qty' => ($accessory->qty) ? (int) $accessory->qty : null, 'purchase_date' => ($accessory->purchase_date) ? Helper::getFormattedDateObject($accessory->purchase_date, 'date') : null, 'purchase_cost' => Helper::formatCurrencyOutput($accessory->purchase_cost), + 'total_cost' => Helper::formatCurrencyOutput($accessory->totalCostSum()), 'order_number' => ($accessory->order_number) ? e($accessory->order_number) : null, 'min_qty' => ($accessory->min_amt) ? (int) $accessory->min_amt : null, // Legacy - should phase out - replaced by below, for the bootstrap table formatter 'min_amt' => ($accessory->min_amt) ? (int) $accessory->min_amt : null, diff --git a/app/Models/Accessory.php b/app/Models/Accessory.php index 29984a1c2b..8efd68ef7e 100755 --- a/app/Models/Accessory.php +++ b/app/Models/Accessory.php @@ -357,6 +357,10 @@ class Accessory extends SnipeModel $accessory_checkout->limit(1)->delete(); } + public function totalCostSum() { + + return $this->purchase_cost !== null ? $this->qty * $this->purchase_cost : null; + } /** * ----------------------------------------------- diff --git a/app/Presenters/AccessoryPresenter.php b/app/Presenters/AccessoryPresenter.php index 6d04e18b6a..d4aaa768c3 100644 --- a/app/Presenters/AccessoryPresenter.php +++ b/app/Presenters/AccessoryPresenter.php @@ -121,6 +121,12 @@ class AccessoryPresenter extends Presenter 'searchable' => true, 'sortable' => true, 'title' => trans('general.unit_cost'), + 'class' => 'text-right text-padding-number-cell', + ], [ + 'field' => 'total_cost', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.total_cost'), 'footerFormatter' => 'sumFormatterQuantity', 'class' => 'text-right text-padding-number-cell', ], [ diff --git a/resources/lang/en-US/general.php b/resources/lang/en-US/general.php index b7c62a8aa7..61b7c9f809 100644 --- a/resources/lang/en-US/general.php +++ b/resources/lang/en-US/general.php @@ -309,6 +309,7 @@ return [ 'total_licenses' => 'total licenses', 'total_accessories' => 'total accessories', 'total_consumables' => 'total consumables', + 'total_cost' => 'Total Cost', 'type' => 'Type', 'undeployable' => 'Un-deployable', 'unknown_admin' => 'Unknown Admin', diff --git a/resources/views/accessories/view.blade.php b/resources/views/accessories/view.blade.php index e0f276e755..9851d46140 100644 --- a/resources/views/accessories/view.blade.php +++ b/resources/views/accessories/view.blade.php @@ -244,6 +244,18 @@ @endif + @if ($accessory->purchase_cost) +
+
+ + {{ trans('general.total_cost') }} + +
+
+ {{ Helper::formatCurrencyOutput($accessory->totalCostSum()) }} +
+
+ @endif
From 14b829aa30fe9a5027d769360378c9ae48ed854e Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 16 Sep 2025 10:37:32 -0700 Subject: [PATCH 02/42] add total cost to components and consumables --- .../Transformers/ComponentsTransformer.php | 1 + .../Transformers/ConsumablesTransformer.php | 1 + app/Models/Component.php | 3 + app/Models/Consumable.php | 3 + app/Presenters/ComponentPresenter.php | 46 ++++++++------ app/Presenters/ConsumablePresenter.php | 62 ++++++++++--------- resources/views/components/view.blade.php | 7 +++ resources/views/consumables/view.blade.php | 12 ++++ 8 files changed, 85 insertions(+), 50 deletions(-) diff --git a/app/Http/Transformers/ComponentsTransformer.php b/app/Http/Transformers/ComponentsTransformer.php index f7f8c337bf..82e4448277 100644 --- a/app/Http/Transformers/ComponentsTransformer.php +++ b/app/Http/Transformers/ComponentsTransformer.php @@ -43,6 +43,7 @@ class ComponentsTransformer 'order_number' => e($component->order_number), 'purchase_date' => Helper::getFormattedDateObject($component->purchase_date, 'date'), 'purchase_cost' => Helper::formatCurrencyOutput($component->purchase_cost), + 'total_cost' => Helper::formatCurrencyOutput($component->totalCostSum()), 'remaining' => (int) $component->numRemaining(), 'company' => ($component->company) ? [ 'id' => (int) $component->company->id, diff --git a/app/Http/Transformers/ConsumablesTransformer.php b/app/Http/Transformers/ConsumablesTransformer.php index 4c7dbf9cc5..2739b3b8f0 100644 --- a/app/Http/Transformers/ConsumablesTransformer.php +++ b/app/Http/Transformers/ConsumablesTransformer.php @@ -37,6 +37,7 @@ class ConsumablesTransformer 'remaining' => $consumable->numRemaining(), 'order_number' => e($consumable->order_number), 'purchase_cost' => Helper::formatCurrencyOutput($consumable->purchase_cost), + 'total_cost' => Helper::formatCurrencyOutput($consumable->totalCostSum()), 'purchase_date' => Helper::getFormattedDateObject($consumable->purchase_date, 'date'), 'qty' => (int) $consumable->qty, 'notes' => ($consumable->notes) ? Helper::parseEscapedMarkedownInline($consumable->notes) : null, diff --git a/app/Models/Component.php b/app/Models/Component.php index ddcb3ad575..6352981418 100644 --- a/app/Models/Component.php +++ b/app/Models/Component.php @@ -288,7 +288,10 @@ class Component extends SnipeModel return $this->qty - $this->numCheckedOut(); } + public function totalCostSum() { + return $this->purchase_cost !== null ? $this->qty * $this->purchase_cost : null; + } /** * ----------------------------------------------- * BEGIN MUTATORS diff --git a/app/Models/Consumable.php b/app/Models/Consumable.php index 8c6e43c490..806b10d317 100644 --- a/app/Models/Consumable.php +++ b/app/Models/Consumable.php @@ -312,7 +312,10 @@ class Consumable extends SnipeModel return $remaining; } + public function totalCostSum() { + return $this->purchase_cost !== null ? $this->qty * $this->purchase_cost : null; + } /** * ----------------------------------------------- * BEGIN MUTATORS diff --git a/app/Presenters/ComponentPresenter.php b/app/Presenters/ComponentPresenter.php index be15144623..5e33d72d1c 100644 --- a/app/Presenters/ComponentPresenter.php +++ b/app/Presenters/ComponentPresenter.php @@ -79,6 +79,25 @@ class ComponentPresenter extends Presenter 'title' => trans('general.manufacturer'), 'visible' => false, 'formatter' => 'manufacturersLinkObjFormatter', + ], [ + 'field' => 'location', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.location'), + 'formatter' => 'locationsLinkObjFormatter', + ], [ + 'field' => 'order_number', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.order_number'), + 'visible' => true, + ], [ + 'field' => 'purchase_date', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.purchase_date'), + 'visible' => true, + 'formatter' => 'dateDisplayFormatter', ], [ 'field' => 'min_amt', 'searchable' => false, @@ -103,33 +122,20 @@ class ComponentPresenter extends Presenter 'visible' => true, 'class' => 'text-right text-padding-number-cell', 'footerFormatter' => 'qtySumFormatter', - ], [ - 'field' => 'location', - 'searchable' => true, - 'sortable' => true, - 'title' => trans('general.location'), - 'formatter' => 'locationsLinkObjFormatter', - ], [ - 'field' => 'order_number', - 'searchable' => true, - 'sortable' => true, - 'title' => trans('general.order_number'), - 'visible' => true, - ], [ - 'field' => 'purchase_date', - 'searchable' => true, - 'sortable' => true, - 'title' => trans('general.purchase_date'), - 'visible' => true, - 'formatter' => 'dateDisplayFormatter', ], [ 'field' => 'purchase_cost', 'searchable' => true, 'sortable' => true, 'title' => trans('general.unit_cost'), 'visible' => true, - 'footerFormatter' => 'sumFormatterQuantity', 'class' => 'text-right', + ], [ + 'field' => 'total_cost', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.total_cost'), + 'footerFormatter' => 'sumFormatterQuantity', + 'class' => 'text-right text-padding-number-cell', ], [ 'field' => 'notes', 'searchable' => true, diff --git a/app/Presenters/ConsumablePresenter.php b/app/Presenters/ConsumablePresenter.php index da167c0d2c..3a5ff2cad3 100644 --- a/app/Presenters/ConsumablePresenter.php +++ b/app/Presenters/ConsumablePresenter.php @@ -73,36 +73,7 @@ class ConsumablePresenter extends Presenter 'sortable' => true, 'title' => trans('admin/consumables/general.item_no'), ], [ - 'field' => 'qty', - 'searchable' => false, - 'sortable' => true, - 'title' => trans('admin/components/general.total'), - 'visible' => true, - 'class' => 'text-right text-padding-number-cell', - 'footerFormatter' => 'qtySumFormatter', - ], [ - 'field' => 'remaining', - 'searchable' => false, - 'sortable' => true, - 'title' => trans('admin/components/general.remaining'), - 'visible' => true, - 'class' => 'text-right text-padding-number-cell', - 'footerFormatter' => 'qtySumFormatter', - ], [ - 'field' => 'min_amt', - 'searchable' => false, - 'sortable' => true, - 'title' => trans('general.min_amt'), - 'visible' => true, - 'formatter' => 'minAmtFormatter', - 'class' => 'text-right text-padding-number-cell', - ], [ - 'field' => 'location', - 'searchable' => true, - 'sortable' => true, - 'title' => trans('general.location'), - 'formatter' => 'locationsLinkObjFormatter', - ], [ + 'field' => 'manufacturer', 'searchable' => true, 'sortable' => true, @@ -122,6 +93,30 @@ class ConsumablePresenter extends Presenter 'title' => trans('general.purchase_date'), 'visible' => true, 'formatter' => 'dateDisplayFormatter', + ], [ + 'field' => 'min_amt', + 'searchable' => false, + 'sortable' => true, + 'title' => trans('general.min_amt'), + 'visible' => true, + 'formatter' => 'minAmtFormatter', + 'class' => 'text-right text-padding-number-cell', + ], [ + 'field' => 'qty', + 'searchable' => false, + 'sortable' => true, + 'title' => trans('admin/components/general.total'), + 'visible' => true, + 'class' => 'text-right text-padding-number-cell', + 'footerFormatter' => 'qtySumFormatter', + ], [ + 'field' => 'remaining', + 'searchable' => false, + 'sortable' => true, + 'title' => trans('admin/components/general.remaining'), + 'visible' => true, + 'class' => 'text-right text-padding-number-cell', + 'footerFormatter' => 'qtySumFormatter', ], [ 'field' => 'purchase_cost', 'searchable' => true, @@ -130,6 +125,13 @@ class ConsumablePresenter extends Presenter 'visible' => true, 'footerFormatter' => 'sumFormatterQuantity', 'class' => 'text-right text-padding-number-cell', + ], [ + 'field' => 'total_cost', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.total_cost'), + 'footerFormatter' => 'sumFormatterQuantity', + 'class' => 'text-right text-padding-number-cell', ], [ 'field' => 'notes', 'searchable' => true, diff --git a/resources/views/components/view.blade.php b/resources/views/components/view.blade.php index 6c0d8840ad..dfce30e796 100644 --- a/resources/views/components/view.blade.php +++ b/resources/views/components/view.blade.php @@ -207,6 +207,13 @@ {{ Helper::formatCurrencyOutput($component->purchase_cost) }}
@endif + @if ($component->purchase_cost) +
{{ trans('general.total_cost') }}: + {{ $snipeSettings->default_currency }} + + {{ Helper::formatCurrencyOutput($component->totalCostSum()) }}
+ @endif + @if ($component->order_number)
{{ trans('general.order_number') }}: {{ $component->order_number }}
diff --git a/resources/views/consumables/view.blade.php b/resources/views/consumables/view.blade.php index 376a4ddfed..a38ecaf7a4 100644 --- a/resources/views/consumables/view.blade.php +++ b/resources/views/consumables/view.blade.php @@ -281,6 +281,18 @@
@endif + @if ($consumable->purchase_cost) +
+
+ {{ trans('general.total_cost') }} +
+
+ {{ $snipeSettings->default_currency }} + {{ Helper::formatCurrencyOutput($consumable->totalCostSum()) }} +
+
+ @endif + @if ($consumable->order_number)
From 4ca1db8a1bd65f8e6568cc4501e7e04b49d60c12 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 16 Sep 2025 10:43:02 -0700 Subject: [PATCH 03/42] remove footer formatter from consumable purchase cost --- app/Presenters/ConsumablePresenter.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/Presenters/ConsumablePresenter.php b/app/Presenters/ConsumablePresenter.php index 3a5ff2cad3..9d79a97178 100644 --- a/app/Presenters/ConsumablePresenter.php +++ b/app/Presenters/ConsumablePresenter.php @@ -123,7 +123,6 @@ class ConsumablePresenter extends Presenter 'sortable' => true, 'title' => trans('general.unit_cost'), 'visible' => true, - 'footerFormatter' => 'sumFormatterQuantity', 'class' => 'text-right text-padding-number-cell', ], [ 'field' => 'total_cost', From 11e5f851f00786bbc910fa5d0a81375472cd9bf4 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 16 Sep 2025 10:49:33 -0700 Subject: [PATCH 04/42] typo --- app/Presenters/ConsumablePresenter.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/Presenters/ConsumablePresenter.php b/app/Presenters/ConsumablePresenter.php index 9d79a97178..2b2eec5b2e 100644 --- a/app/Presenters/ConsumablePresenter.php +++ b/app/Presenters/ConsumablePresenter.php @@ -67,6 +67,12 @@ class ConsumablePresenter extends Presenter 'searchable' => true, 'sortable' => true, 'title' => trans('general.model_no'), + ], [ + 'field' => 'location', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.location'), + 'formatter' => 'locationsLinkObjFormatter', ], [ 'field' => 'item_no', 'searchable' => true, From 1f79776b8f95ae1a1f0e08894e8b36196d9a5233 Mon Sep 17 00:00:00 2001 From: snipe Date: Tue, 16 Sep 2025 19:21:39 +0100 Subject: [PATCH 05/42] Pull HTML tags out before converting markdown --- app/Helpers/Helper.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Helpers/Helper.php b/app/Helpers/Helper.php index ef05b2f67a..963bc8ea77 100644 --- a/app/Helpers/Helper.php +++ b/app/Helpers/Helper.php @@ -95,7 +95,7 @@ class Helper $Parsedown->setSafeMode(true); if ($str) { - return $Parsedown->text($str); + return $Parsedown->text(strip_tags($str)); } } @@ -105,7 +105,7 @@ class Helper $Parsedown->setSafeMode(true); if ($str) { - return $Parsedown->line($str); + return $Parsedown->line(strip_tags($str)); } } From 33a4c88c3abc6f96368d2ca651df24a0f018185a Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 17 Sep 2025 11:44:28 +0100 Subject: [PATCH 06/42] Added table to deleted_at clauses to resolve ambiguity --- app/Models/License.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Models/License.php b/app/Models/License.php index d84f42f0a1..8630080d14 100755 --- a/app/Models/License.php +++ b/app/Models/License.php @@ -724,7 +724,7 @@ class License extends Depreciable public static function getExpiringLicenses($days = 60) { - return self::whereNull('deleted_at') + return self::whereNull('licenses.deleted_at') // The termination date is null or within range ->where(function ($query) use ($days) { @@ -752,7 +752,7 @@ class License extends Depreciable public function scopeActiveLicenses($query) { - return $query->whereNull('deleted_at') + return $query->whereNull('licenses.deleted_at') // The termination date is null or within range ->where(function ($query) { @@ -768,7 +768,7 @@ class License extends Depreciable public function scopeExpiredLicenses($query) { - return $query->whereNull('deleted_at') + return $query->whereNull('licenses.deleted_at') // The termination date is null or within range ->where(function ($query) { From e81f63f46b5103a9f7dc3c5b382c532ff8232cc2 Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 17 Sep 2025 14:03:48 +0100 Subject: [PATCH 07/42] Fixed #8859 - adds purchase sums on model view --- resources/views/models/view.blade.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/views/models/view.blade.php b/resources/views/models/view.blade.php index 19101cb568..359b947efa 100755 --- a/resources/views/models/view.blade.php +++ b/resources/views/models/view.blade.php @@ -90,6 +90,7 @@ data-cookie-id-table="assetListingTable" data-id-table="assetListingTable" data-side-pagination="server" + data-show-footer="true" data-toolbar="#assetsBulkEditToolbar" data-bulk-button-id="#bulkAssetEditButton" data-bulk-form-id="#assetsBulkForm" From ca567eec8afc464085deaef330ab4d93a6684532 Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 17 Sep 2025 21:08:13 +0100 Subject: [PATCH 08/42] Small adjustments for layout --- .../Account/AcceptanceController.php | 77 +++++++++++-------- app/Models/LicenseSeat.php | 16 ++++ .../AcceptanceAssetAcceptedNotification.php | 14 ++-- ...eptanceAssetAcceptedToUserNotification.php | 11 ++- .../markdown/asset-acceptance.blade.php | 3 + 5 files changed, 81 insertions(+), 40 deletions(-) diff --git a/app/Http/Controllers/Account/AcceptanceController.php b/app/Http/Controllers/Account/AcceptanceController.php index de973f284d..8cf970e675 100644 --- a/app/Http/Controllers/Account/AcceptanceController.php +++ b/app/Http/Controllers/Account/AcceptanceController.php @@ -83,7 +83,7 @@ class AcceptanceController extends Controller public function store(Request $request, $id) : RedirectResponse { $acceptance = CheckoutAcceptance::find($id); - + $settings = Setting::getSettings(); if (is_null($acceptance)) { return redirect()->route('account.accept')->with('error', trans('admin/hardware/message.does_not_exist')); } @@ -146,35 +146,31 @@ class AcceptanceController extends Controller $assigned_user = User::find($acceptance->assigned_to_id); - /** - * Gather the data for the PDF. We fire this whether there is a signature required or not, - * since we want the moment-in-time proof of what the EULA was when they accepted it. - */ - $branding_settings = SettingsController::getPDFBranding(); - $path_logo = ""; // Check for the PDF logo path and use that, otherwise use the regular logo path - if (!is_null($branding_settings->acceptance_pdf_logo)) { - $path_logo = public_path() . '/uploads/' . $branding_settings->acceptance_pdf_logo; - } elseif (!is_null($branding_settings->logo)) { - $path_logo = public_path() . '/uploads/' . $branding_settings->logo; + if (!is_null($settings->acceptance_pdf_logo)) { + $path_logo = public_path() . '/uploads/' . $settings->acceptance_pdf_logo; + } elseif (!is_null($settings->logo)) { + $path_logo = public_path() . '/uploads/' . $settings->logo; } $data = [ 'item_tag' => $item->asset_tag, - 'item_model' => $item->model ? $item->model->name : $item->display_name, + 'item_name' => $item->name, // this handles licenses seats, which don't have a 'name' field + 'item_model' => $item->model?->name, 'item_serial' => $item->serial, 'item_status' => $item->assetstatus?->name, 'eula' => $item->getEula(), 'note' => $request->input('note'), - 'check_out_date' => Carbon::parse($acceptance->created_at)->format('Y-m-d H:i:s'), - 'accepted_date' => Carbon::parse($acceptance->accepted_at)->format('Y-m-d H:i:s'), + 'check_out_date' => Helper::getFormattedDateObject($acceptance->created_at, 'datetime', false), + 'accepted_date' => Helper::getFormattedDateObject(now()->format('Y-m-d H:i:s'), 'datetime', false), 'assigned_to' => $assigned_user->display_name, - 'company_name' => $branding_settings->site_name, + 'site_name' => $settings->site_name, + 'company_name' => $item->company?->name?? $settings->site_name, 'signature' => ($sig_filename) ? storage_path() . '/private_uploads/signatures/' . $sig_filename : null, 'logo' => $path_logo, - 'date_settings' => $branding_settings->date_display_format, + 'date_settings' => $settings->date_display_format, 'admin' => auth()->user()->present()?->fullName, 'qty' => $acceptance->qty ?? 1, ]; @@ -192,26 +188,40 @@ class AcceptanceController extends Controller $pdf->SetAuthor($data['assigned_to']); $pdf->SetTitle('Asset Acceptance: '.$data['item_tag']); $pdf->SetSubject('Asset Acceptance: '.$data['item_tag']); - $pdf->SetKeywords('Snipe-IT, assets, acceptance, eula', 'tos'); + $pdf->SetKeywords('Snipe-IT, assets, acceptance, eula, tos'); $pdf->SetFont('dejavusans', '', 8, '', true); $pdf->SetPrintHeader(false); $pdf->SetPrintFooter(false); - $pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN)); - $pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA)); $pdf->AddPage(); - $pdf->writeHTML('', true, 0, true, 0, ''); + if ($data['logo']) { + $pdf->writeHTML('', true, 0, true, 0, ''); + } - if ($data['item_tag']) { - $pdf->writeHTML("" . trans('general.asset_tag') . ': ' . $data['item_tag'], true, 0, true, 0, ''); + if ($data['site_name']) { + $pdf->writeHTML($data['site_name'], true, 0, true, 0, 'C'); } - $pdf->writeHTML("".trans('general.asset_model').': '.$data['item_model'], true, 0, true, 0, ''); - if ($data['item_serial']) { - $pdf->writeHTML("".trans('admin/hardware/form.serial').': '.$data['item_serial'], true, 0, true, 0, ''); - } - $pdf->writeHTML("".trans('general.assigned_date').': '.$data['check_out_date'], true, 0, true, 0, ''); - $pdf->writeHTML("".trans('general.assignee').': '.$data['assigned_to'], true, 0, true, 0, ''); $pdf->Ln(); + $pdf->writeHTML(trans('general.date') . ': ' . Helper::getFormattedDateObject(now(), 'datetime', false), true, 0, true, 0, ''); + + if ($data['company_name'] != null) { + $pdf->writeHTML(trans('general.company') . ': ' . e($data['company_name']), true, 0, true, 0, ''); + } + if ($data['item_tag'] != null) { + $pdf->writeHTML(trans('general.asset_tag') . ': ' . e($data['item_tag']), true, 0, true, 0, ''); + } + if ($data['item_name'] != null) { + $pdf->writeHTML(trans('general.name') . ': ' . e($data['item_name']), true, 0, true, 0, ''); + } + if ($data['item_model'] != null) { + $pdf->writeHTML(trans('general.asset_model') . ': ' . e($data['item_model']), true, 0, true, 0, ''); + } + if ($data['item_serial'] != null) { + $pdf->writeHTML(trans('admin/hardware/form.serial').': '.e($data['item_serial']), true, 0, true, 0, ''); + } + $pdf->Ln(); + $pdf->writeHTML('
', true, 0, true, 0, ''); + // Break the EULA into lines based on newlines, and check each line for RTL or CJK characters $eula_lines = preg_split("/\r\n|\n|\r/", $item->getEula()); @@ -229,25 +239,28 @@ class AcceptanceController extends Controller if ($data['note'] != null) { Helper::isCjk($data['note']) ? $pdf->SetFont('cid0cs', '', 9) : $pdf->SetFont('dejavusans', '', 8, '', true); - $pdf->writeHTML("".trans('general.notes') . ': ' . $data['note'], true, 0, true, 0, ''); + $pdf->writeHTML(trans('general.notes') . ': ' . e($data['note']), true, 0, true, 0, ''); $pdf->Ln(); } if ($data['signature'] != null) { - $pdf->writeHTML('', true, 0, true, 0, ''); $pdf->writeHTML('
', true, 0, true, 0, ''); } - $pdf->writeHTML("".trans('general.accepted_date').': '.$data['accepted_date'], true, 0, true, 0, ''); + $pdf->writeHTML(trans('general.assignee').': '.e($data['assigned_to']), true, 0, true, 0, ''); + $pdf->writeHTML(trans('general.assigned_date').': '.e($data['check_out_date']), true, 0, true, 0, ''); + $pdf->writeHTML(trans('general.accepted_date').': '.e($data['accepted_date']), true, 0, true, 0, ''); + // close line height div + $pdf->writeHTML('
', true, 0, true, 0, ''); $pdf_content = $pdf->Output($pdf_filename, 'S'); Storage::put('private_uploads/eula-pdfs/' .$pdf_filename, $pdf_content); - $acceptance->accept($sig_filename, $item->getEula(), $pdf_filename, $request->input('note')); + $acceptance->accept($sig_filename, $item->getEula(), $pdf_filename, $request->input('note')); // Send the PDF to the signing user if (($request->input('send_copy') == '1') && ($assigned_user->email !='')) { diff --git a/app/Models/LicenseSeat.php b/app/Models/LicenseSeat.php index 9ddd3fb431..39cb53f9d8 100755 --- a/app/Models/LicenseSeat.php +++ b/app/Models/LicenseSeat.php @@ -7,6 +7,7 @@ use App\Models\Traits\CompanyableChildTrait; use App\Notifications\CheckinLicenseNotification; use App\Notifications\CheckoutLicenseNotification; use App\Presenters\Presentable; +use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\SoftDeletes; @@ -64,6 +65,21 @@ class LicenseSeat extends SnipeModel implements ICompanyableChild return $this->license->getEula(); } + protected function name(): Attribute + { + return Attribute:: make( + get: fn(mixed $value) => $this->license->name, + ); + } + + protected function displayName(): Attribute + { + return Attribute:: make( + get: fn(mixed $value) => $this->license->name, + ); + } + + /** * Establishes the seat -> license relationship * diff --git a/app/Notifications/AcceptanceAssetAcceptedNotification.php b/app/Notifications/AcceptanceAssetAcceptedNotification.php index df7d745de4..6e33a8a823 100644 --- a/app/Notifications/AcceptanceAssetAcceptedNotification.php +++ b/app/Notifications/AcceptanceAssetAcceptedNotification.php @@ -2,6 +2,7 @@ namespace App\Notifications; +use AllowDynamicProperties; use App\Helpers\Helper; use App\Models\Setting; use Illuminate\Bus\Queueable; @@ -10,7 +11,7 @@ use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; -class AcceptanceAssetAcceptedNotification extends Notification +#[AllowDynamicProperties] class AcceptanceAssetAcceptedNotification extends Notification { use Queueable; @@ -22,16 +23,18 @@ class AcceptanceAssetAcceptedNotification extends Notification public function __construct($params) { $this->item_tag = $params['item_tag']; + $this->item_name = $params['item_name']; $this->item_model = $params['item_model']; $this->item_serial = $params['item_serial']; $this->item_status = $params['item_status']; - $this->accepted_date = Helper::getFormattedDateObject($params['accepted_date'], 'date', false); + $this->accepted_date = Helper::getFormattedDateObject($params['accepted_date'], 'datetime', false); $this->assigned_to = $params['assigned_to']; - $this->note = $params['note']; $this->company_name = $params['company_name']; - $this->admin = $params['admin'] ?? null; $this->settings = Setting::getSettings(); + $this->file = $params['file'] ?? null; $this->qty = $params['qty'] ?? null; + $this->note = $params['note'] ?? null; + $this->admin = $params['admin'] ?? null; } @@ -66,6 +69,7 @@ class AcceptanceAssetAcceptedNotification extends Notification $message = (new MailMessage)->markdown('notifications.markdown.asset-acceptance', [ 'item_tag' => $this->item_tag, + 'item_name' => $this->item_name, 'item_model' => $this->item_model, 'item_serial' => $this->item_serial, 'item_status' => $this->item_status, @@ -73,9 +77,9 @@ class AcceptanceAssetAcceptedNotification extends 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'), - 'admin' => $this->admin, ]) ->subject(trans('mail.acceptance_asset_accepted')); diff --git a/app/Notifications/AcceptanceAssetAcceptedToUserNotification.php b/app/Notifications/AcceptanceAssetAcceptedToUserNotification.php index 57e7b3fad4..246eb3777b 100644 --- a/app/Notifications/AcceptanceAssetAcceptedToUserNotification.php +++ b/app/Notifications/AcceptanceAssetAcceptedToUserNotification.php @@ -2,13 +2,14 @@ namespace App\Notifications; +use AllowDynamicProperties; use App\Helpers\Helper; use App\Models\Setting; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Notification; -class AcceptanceAssetAcceptedToUserNotification extends Notification +#[AllowDynamicProperties] class AcceptanceAssetAcceptedToUserNotification extends Notification { use Queueable; @@ -20,16 +21,18 @@ class AcceptanceAssetAcceptedToUserNotification extends Notification public function __construct($params) { $this->item_tag = $params['item_tag']; + $this->item_name = $params['item_name']; $this->item_model = $params['item_model']; $this->item_serial = $params['item_serial']; $this->item_status = $params['item_status']; - $this->accepted_date = Helper::getFormattedDateObject($params['accepted_date'], 'date', false); + $this->accepted_date = Helper::getFormattedDateObject($params['accepted_date'], 'datetime', false); $this->assigned_to = $params['assigned_to']; - $this->note = $params['note']; + $this->note = $params['note'] ?? null; $this->company_name = $params['company_name']; $this->settings = Setting::getSettings(); $this->file = $params['file'] ?? null; $this->qty = $params['qty'] ?? null; + $this->admin = $params['admin'] ?? null; } /** @@ -59,6 +62,7 @@ class AcceptanceAssetAcceptedToUserNotification extends Notification $message = (new MailMessage)->markdown('notifications.markdown.asset-acceptance', [ 'item_tag' => $this->item_tag, + 'item_name' => $this->item_name, 'item_model' => $this->item_model, 'item_serial' => $this->item_serial, 'item_status' => $this->item_status, @@ -66,6 +70,7 @@ class AcceptanceAssetAcceptedToUserNotification extends 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_to_user', ['site_name' => $this->company_name ?? $this->settings->site_name]), ]) diff --git a/resources/views/notifications/markdown/asset-acceptance.blade.php b/resources/views/notifications/markdown/asset-acceptance.blade.php index db2705e52a..52c13500d0 100644 --- a/resources/views/notifications/markdown/asset-acceptance.blade.php +++ b/resources/views/notifications/markdown/asset-acceptance.blade.php @@ -6,6 +6,9 @@ @component('mail::table') | | | | ------------- | ------------- | +@if (isset($item_name)) +| **{{ trans('general.name') }}** | {{ $item_name }} | +@endif | **{{ trans('mail.user') }}** | {{ $assigned_to }} | @if (isset($user->location)) | **{{ trans('general.location') }}** | {{ $user->location->name }} | From 89cfafd933ec24917fbab85559ea237b824a9d6e Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 17 Sep 2025 13:40:34 -0700 Subject: [PATCH 09/42] Scaffold test --- .../Checkouts/Ui/BulkAssetCheckoutTest.php | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php b/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php index f05c4389e6..433f89d040 100644 --- a/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php +++ b/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php @@ -89,4 +89,21 @@ class BulkAssetCheckoutTest extends TestCase $this->fail('Asset checkout email was sent when the entire checkout failed.'); } } + + public function test_adheres_to_full_multiple_company_support() + { + $this->markTestIncomplete(); + + // create two companies + + // create an asset for each company + + // create a user for one company + + // create a super admin and act as them + + // attempt to bulk checkout both items to the user in the company + + // ensure bulk checkout is blocked + } } From 1d3dfa1fa4f378950de467dc6e64e373f2bfa53f Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 17 Sep 2025 21:43:17 +0100 Subject: [PATCH 10/42] Pull the acceptance stuff into the model --- .../Account/AcceptanceController.php | 248 +++++------------- app/Models/CheckoutAcceptance.php | 94 +++++++ 2 files changed, 161 insertions(+), 181 deletions(-) diff --git a/app/Http/Controllers/Account/AcceptanceController.php b/app/Http/Controllers/Account/AcceptanceController.php index 8cf970e675..be0391a123 100644 --- a/app/Http/Controllers/Account/AcceptanceController.php +++ b/app/Http/Controllers/Account/AcceptanceController.php @@ -13,11 +13,6 @@ use App\Models\Company; use App\Models\Contracts\Acceptable; use App\Models\Setting; use App\Models\User; -use App\Models\AssetModel; -use App\Models\Accessory; -use App\Models\License; -use App\Models\Component; -use App\Models\Consumable; use App\Notifications\AcceptanceAssetAcceptedNotification; use App\Notifications\AcceptanceAssetAcceptedToUserNotification; use App\Notifications\AcceptanceAssetDeclinedNotification; @@ -26,12 +21,9 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Str; -use App\Http\Controllers\SettingsController; -use Carbon\Carbon; use \Illuminate\Contracts\View\View; use \Illuminate\Http\RedirectResponse; use Illuminate\Support\Facades\Log; -use TCPDF; use App\Helpers\Helper; class AcceptanceController extends Controller @@ -83,7 +75,12 @@ class AcceptanceController extends Controller public function store(Request $request, $id) : RedirectResponse { $acceptance = CheckoutAcceptance::find($id); + $assigned_user = User::find($acceptance->assigned_to_id); $settings = Setting::getSettings(); + $path_logo = ''; + $sig_filename=''; + + if (is_null($acceptance)) { return redirect()->route('account.accept')->with('error', trans('admin/hardware/message.does_not_exist')); } @@ -118,149 +115,71 @@ class AcceptanceController extends Controller Storage::makeDirectory('private_uploads/eula-pdfs', 775); } - $item = $acceptance->checkoutable_type::find($acceptance->checkoutable_id); - $checkout_type_shortname = strtolower(str_replace('App\Models\\', '', $acceptance->checkoutable_type)); - $pdf_filename = 'accepted-'.$acceptance->checkoutable_id.'-'.$checkout_type_shortname.'-eula-'.date('Y-m-d-h-i-s').'.pdf'; - $sig_filename=''; + + + + // If signatures are required, make sure we have one + if (Setting::getSettings()->require_accept_signature == '1') { + + // The item was accepted, check for a signature + if ($request->filled('signature_output')) { + $sig_filename = 'siglog-' . Str::uuid() . '-' . date('Y-m-d-his') . '.png'; + $data_uri = $request->input('signature_output'); + $encoded_image = explode(',', $data_uri); + $decoded_image = base64_decode($encoded_image[1]); + Storage::put('private_uploads/signatures/' . $sig_filename, (string)$decoded_image); + + // No image data is present, kick them back. + // This mostly only applies to users on super-duper crapola browsers *cough* IE *cough* + } else { + return redirect()->back()->with('error', trans('general.shitty_browser')); + } + } + + + // Check for the PDF logo path and use that, otherwise use the regular logo path + if (!is_null($settings->acceptance_pdf_logo)) { + $path_logo = public_path() . '/uploads/' . $settings->acceptance_pdf_logo; + } elseif (!is_null($settings->logo)) { + $path_logo = public_path() . '/uploads/' . $settings->logo; + } + + + // Get the data array ready for the notifications and PDF generation + $data = [ + 'item_tag' => $item->asset_tag, + 'item_name' => $item->name, // this handles licenses seats, which don't have a 'name' field + 'item_model' => $item->model?->name, + 'item_serial' => $item->serial, + 'item_status' => $item->assetstatus?->name, + 'eula' => $item->getEula(), + 'note' => $request->input('note'), + 'check_out_date' => Helper::getFormattedDateObject($acceptance->created_at, 'datetime', false), + 'accepted_date' => Helper::getFormattedDateObject(now()->format('Y-m-d H:i:s'), 'datetime', false), + 'declined_date' => Helper::getFormattedDateObject(now()->format('Y-m-d H:i:s'), 'datetime', false), + 'assigned_to' => $assigned_user->display_name, + 'site_name' => $settings->site_name, + 'company_name' => $item->company?->name?? $settings->site_name, + 'signature' => ($sig_filename) ? storage_path() . '/private_uploads/signatures/' . $sig_filename : null, + 'logo' => $path_logo, + 'date_settings' => $settings->date_display_format, + 'admin' => auth()->user()->present()?->fullName, + 'qty' => $acceptance->qty ?? 1, + ]; + if ($request->input('asset_acceptance') == 'accepted') { - if (Setting::getSettings()->require_accept_signature == '1') { - // The item was accepted, check for a signature - if ($request->filled('signature_output')) { - $sig_filename = 'siglog-' . Str::uuid() . '-' . date('Y-m-d-his') . '.png'; - $data_uri = $request->input('signature_output'); - $encoded_image = explode(',', $data_uri); - $decoded_image = base64_decode($encoded_image[1]); - Storage::put('private_uploads/signatures/' . $sig_filename, (string)$decoded_image); - - // No image data is present, kick them back. - // This mostly only applies to users on super-duper crapola browsers *cough* IE *cough* - } else { - return redirect()->back()->with('error', trans('general.shitty_browser')); - } - } - - $assigned_user = User::find($acceptance->assigned_to_id); - - - $path_logo = ""; - - // Check for the PDF logo path and use that, otherwise use the regular logo path - if (!is_null($settings->acceptance_pdf_logo)) { - $path_logo = public_path() . '/uploads/' . $settings->acceptance_pdf_logo; - } elseif (!is_null($settings->logo)) { - $path_logo = public_path() . '/uploads/' . $settings->logo; - } - - $data = [ - 'item_tag' => $item->asset_tag, - 'item_name' => $item->name, // this handles licenses seats, which don't have a 'name' field - 'item_model' => $item->model?->name, - 'item_serial' => $item->serial, - 'item_status' => $item->assetstatus?->name, - 'eula' => $item->getEula(), - 'note' => $request->input('note'), - 'check_out_date' => Helper::getFormattedDateObject($acceptance->created_at, 'datetime', false), - 'accepted_date' => Helper::getFormattedDateObject(now()->format('Y-m-d H:i:s'), 'datetime', false), - 'assigned_to' => $assigned_user->display_name, - 'site_name' => $settings->site_name, - 'company_name' => $item->company?->name?? $settings->site_name, - 'signature' => ($sig_filename) ? storage_path() . '/private_uploads/signatures/' . $sig_filename : null, - 'logo' => $path_logo, - 'date_settings' => $settings->date_display_format, - 'admin' => auth()->user()->present()?->fullName, - 'qty' => $acceptance->qty ?? 1, - ]; - - // set some language dependent data: - $lg = Array(); - $lg['a_meta_charset'] = 'UTF-8'; - $lg['w_page'] = 'page'; - - $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false); - $pdf->setRTL(false); - $pdf->setLanguageArray($lg); - $pdf->SetFontSubsetting(true); - $pdf->SetCreator('Snipe-IT'); - $pdf->SetAuthor($data['assigned_to']); - $pdf->SetTitle('Asset Acceptance: '.$data['item_tag']); - $pdf->SetSubject('Asset Acceptance: '.$data['item_tag']); - $pdf->SetKeywords('Snipe-IT, assets, acceptance, eula, tos'); - $pdf->SetFont('dejavusans', '', 8, '', true); - $pdf->SetPrintHeader(false); - $pdf->SetPrintFooter(false); - - $pdf->AddPage(); - if ($data['logo']) { - $pdf->writeHTML('', true, 0, true, 0, ''); - } - - if ($data['site_name']) { - $pdf->writeHTML($data['site_name'], true, 0, true, 0, 'C'); - } - $pdf->Ln(); - $pdf->writeHTML(trans('general.date') . ': ' . Helper::getFormattedDateObject(now(), 'datetime', false), true, 0, true, 0, ''); - - if ($data['company_name'] != null) { - $pdf->writeHTML(trans('general.company') . ': ' . e($data['company_name']), true, 0, true, 0, ''); - } - if ($data['item_tag'] != null) { - $pdf->writeHTML(trans('general.asset_tag') . ': ' . e($data['item_tag']), true, 0, true, 0, ''); - } - if ($data['item_name'] != null) { - $pdf->writeHTML(trans('general.name') . ': ' . e($data['item_name']), true, 0, true, 0, ''); - } - if ($data['item_model'] != null) { - $pdf->writeHTML(trans('general.asset_model') . ': ' . e($data['item_model']), true, 0, true, 0, ''); - } - if ($data['item_serial'] != null) { - $pdf->writeHTML(trans('admin/hardware/form.serial').': '.e($data['item_serial']), true, 0, true, 0, ''); - } - $pdf->Ln(); - $pdf->writeHTML('
', true, 0, true, 0, ''); - - - // Break the EULA into lines based on newlines, and check each line for RTL or CJK characters - $eula_lines = preg_split("/\r\n|\n|\r/", $item->getEula()); - - 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(); - $pdf->Ln(); - $pdf->setRTL(false); - $pdf->writeHTML('

', true, 0, true, 0, ''); - - if ($data['note'] != null) { - Helper::isCjk($data['note']) ? $pdf->SetFont('cid0cs', '', 9) : $pdf->SetFont('dejavusans', '', 8, '', true); - $pdf->writeHTML(trans('general.notes') . ': ' . e($data['note']), true, 0, true, 0, ''); - $pdf->Ln(); - } - - if ($data['signature'] != null) { - $pdf->writeHTML('', true, 0, true, 0, ''); - $pdf->writeHTML('
', true, 0, true, 0, ''); - } - - $pdf->writeHTML(trans('general.assignee').': '.e($data['assigned_to']), true, 0, true, 0, ''); - $pdf->writeHTML(trans('general.assigned_date').': '.e($data['check_out_date']), true, 0, true, 0, ''); - $pdf->writeHTML(trans('general.accepted_date').': '.e($data['accepted_date']), true, 0, true, 0, ''); - - // close line height div - $pdf->writeHTML('
', true, 0, true, 0, ''); - - $pdf_content = $pdf->Output($pdf_filename, 'S'); + $pdf_filename = 'accepted-'.$acceptance->checkoutable_id.'-'.$acceptance->display_checkoutable_type.'-eula-'.date('Y-m-d-h-i-s').'.pdf'; + // Generate the PDF content + $pdf_content = $acceptance->generateAcceptancePdf($data, $acceptance); Storage::put('private_uploads/eula-pdfs/' .$pdf_filename, $pdf_content); - - $acceptance->accept($sig_filename, $item->getEula(), $pdf_filename, $request->input('note')); + // Log the acceptance + // $acceptance->accept($sig_filename, $item->getEula(), $pdf_filename, $request->input('note')); // Send the PDF to the signing user if (($request->input('send_copy') == '1') && ($assigned_user->email !='')) { @@ -282,45 +201,9 @@ class AcceptanceController extends Controller $return_msg = trans('admin/users/message.accepted'); - // Item was not accepted + // Item was declined } else { - if (Setting::getSettings()->require_accept_signature == '1') { - - // The item was declined, check for a signature - if ($request->filled('signature_output')) { - $sig_filename = 'siglog-' . Str::uuid() . '-' . date('Y-m-d-his') . '.png'; - $data_uri = $request->input('signature_output'); - $encoded_image = explode(',', $data_uri); - $decoded_image = base64_decode($encoded_image[1]); - Storage::put('private_uploads/signatures/' . $sig_filename, (string)$decoded_image); - - // No image data is present, kick them back. - // This mostly only applies to users on super-duper crapola browsers *cough* IE *cough* - } else { - return redirect()->back()->with('error', trans('general.shitty_browser')); - } - } - - // Format the data to send the declined notification - $branding_settings = SettingsController::getPDFBranding(); - $assigned_to = User::find($acceptance->assigned_to_id)->present()->fullName; - - $data = [ - 'item_tag' => $item->asset_tag, - 'item_model' => $item->model ? $item->model->name : $item->display_name, - 'item_serial' => $item->serial, - 'item_status' => $item->assetstatus?->name, - 'note' => $request->input('note'), - 'declined_date' => Carbon::parse($acceptance->declined_at)->format('Y-m-d'), - 'signature' => ($sig_filename) ? storage_path() . '/private_uploads/signatures/' . $sig_filename : null, - 'assigned_to' => $assigned_to, - 'company_name' => $branding_settings->site_name, - 'date_settings' => $branding_settings->date_display_format, - 'qty' => $acceptance->qty ?? 1, - ]; - - for ($i = 0; $i < ($acceptance->qty ?? 1); $i++) { $acceptance->decline($sig_filename, $request->input('note')); } @@ -331,6 +214,8 @@ class AcceptanceController extends Controller $return_msg = trans('admin/users/message.declined'); } + + // Send an email notification if one is requested if ($acceptance->alert_on_response_id) { try { $recipient = User::find($acceptance->alert_on_response_id); @@ -349,9 +234,10 @@ class AcceptanceController extends Controller Log::warning($e); } } - return redirect()->to('account/accept')->with('success', $return_msg); } + + } diff --git a/app/Models/CheckoutAcceptance.php b/app/Models/CheckoutAcceptance.php index 2ad6c0e558..4cfd79d092 100644 --- a/app/Models/CheckoutAcceptance.php +++ b/app/Models/CheckoutAcceptance.php @@ -2,11 +2,14 @@ namespace App\Models; +use App\Helpers\Helper; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Notifications\Notifiable; +use TCPDF; class CheckoutAcceptance extends Model { @@ -153,4 +156,95 @@ class CheckoutAcceptance extends Model { return $query->whereNull('accepted_at')->whereNotNull('declined_at'); } + + protected function displayCheckoutableType(): Attribute + { + return Attribute:: make( + get: fn(mixed $value) => strtolower(str_replace('App\Models\\', '', $this->checkoutable_type)), + ); + } + + public function generateAcceptancePdf($data, $pdf_filename) { + + // set some language dependent data: + $lg = Array(); + $lg['a_meta_charset'] = 'UTF-8'; + $lg['w_page'] = 'page'; + + $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false); + $pdf->setRTL(false); + $pdf->setLanguageArray($lg); + $pdf->SetFontSubsetting(true); + $pdf->SetCreator('Snipe-IT Asset Management System'); + $pdf->SetAuthor($data['assigned_to']); + $pdf->SetTitle('Asset Acceptance: '.$data['item_tag']); + $pdf->SetSubject('Asset Acceptance: '.$data['item_tag']); + $pdf->SetKeywords('Snipe-IT, assets, acceptance, eula, tos'); + $pdf->SetFont('dejavusans', '', 8, '', true); + $pdf->SetPrintHeader(false); + $pdf->SetPrintFooter(false); + + $pdf->AddPage(); + if ($data['logo']) { + $pdf->writeHTML('', true, 0, true, 0, ''); + } + + if ($data['site_name']) { + $pdf->writeHTML($data['site_name'], true, 0, true, 0, 'C'); + } + $pdf->Ln(); + $pdf->writeHTML(trans('general.date') . ': ' . Helper::getFormattedDateObject(now(), 'datetime', false), true, 0, true, 0, ''); + + if ($data['company_name'] != null) { + $pdf->writeHTML(trans('general.company') . ': ' . e($data['company_name']), true, 0, true, 0, ''); + } + if ($data['item_tag'] != null) { + $pdf->writeHTML(trans('general.asset_tag') . ': ' . e($data['item_tag']), true, 0, true, 0, ''); + } + if ($data['item_name'] != null) { + $pdf->writeHTML(trans('general.name') . ': ' . e($data['item_name']), true, 0, true, 0, ''); + } + if ($data['item_model'] != null) { + $pdf->writeHTML(trans('general.asset_model') . ': ' . e($data['item_model']), true, 0, true, 0, ''); + } + if ($data['item_serial'] != null) { + $pdf->writeHTML(trans('admin/hardware/form.serial').': '.e($data['item_serial']), true, 0, true, 0, ''); + } + $pdf->Ln(); + $pdf->writeHTML('
', true, 0, true, 0, ''); + + + // Break the EULA into lines based on newlines, and check each line for RTL or CJK characters + $eula_lines = preg_split("/\r\n|\n|\r/", $data['eula']); + + 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(); + $pdf->Ln(); + $pdf->setRTL(false); + $pdf->Ln(); + + if ($data['signature'] != null) { + $pdf->writeHTML('', true, 0, true, 0, ''); + $pdf->writeHTML('
', true, 0, true, 0, ''); + } + + if ($data['note'] != null) { + Helper::isCjk($data['note']) ? $pdf->SetFont('cid0cs', '', 9) : $pdf->SetFont('dejavusans', '', 8, '', true); + $pdf->writeHTML(trans('general.notes') . ': ' . e($data['note']), true, 0, true, 0, ''); + $pdf->Ln(); + } + + $pdf->writeHTML(trans('general.assignee').': '.e($data['assigned_to']), true, 0, true, 0, ''); + $pdf->writeHTML(trans('general.assigned_date').': '.e($data['check_out_date']), true, 0, true, 0, ''); + $pdf->writeHTML(trans('general.accepted_date').': '.e($data['accepted_date']), true, 0, true, 0, ''); + + return $pdf->Output($pdf_filename, 'S'); + + + } } From 89b36ba63f00bfa2c53c9d936517fa3bcb96bc03 Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 17 Sep 2025 21:43:40 +0100 Subject: [PATCH 11/42] Derp. Uncomment the acceptance. --- app/Http/Controllers/Account/AcceptanceController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Account/AcceptanceController.php b/app/Http/Controllers/Account/AcceptanceController.php index be0391a123..36904e6b20 100644 --- a/app/Http/Controllers/Account/AcceptanceController.php +++ b/app/Http/Controllers/Account/AcceptanceController.php @@ -179,7 +179,7 @@ class AcceptanceController extends Controller Storage::put('private_uploads/eula-pdfs/' .$pdf_filename, $pdf_content); // Log the acceptance - // $acceptance->accept($sig_filename, $item->getEula(), $pdf_filename, $request->input('note')); + $acceptance->accept($sig_filename, $item->getEula(), $pdf_filename, $request->input('note')); // Send the PDF to the signing user if (($request->input('send_copy') == '1') && ($assigned_user->email !='')) { From d2157868f2b4fa2ac91b180108add764223840a1 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 17 Sep 2025 13:49:32 -0700 Subject: [PATCH 12/42] Populate failing test --- .../Checkouts/Ui/BulkAssetCheckoutTest.php | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php b/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php index 433f89d040..e7089bd188 100644 --- a/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php +++ b/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php @@ -4,6 +4,7 @@ namespace Tests\Feature\Checkouts\Ui; use App\Mail\CheckoutAssetMail; use App\Models\Asset; +use App\Models\Company; use App\Models\User; use Illuminate\Support\Facades\Mail; use PHPUnit\Framework\ExpectationFailedException; @@ -92,18 +93,39 @@ class BulkAssetCheckoutTest extends TestCase public function test_adheres_to_full_multiple_company_support() { - $this->markTestIncomplete(); + // $this->markTestIncomplete(); + $this->settings->enableMultipleFullCompanySupport(); // create two companies + [$companyA, $companyB] = Company::factory()->count(2)->create(); // create an asset for each company + $assetForCompanyA = Asset::factory()->for($companyA)->create(); + $assetForCompanyB = Asset::factory()->for($companyB)->create(); + + $this->assertNull($assetForCompanyA->assigned_to, 'Asset should not be assigned before attempting this test case.'); + $this->assertNull($assetForCompanyB->assigned_to, 'Asset should not be assigned before attempting this test case.'); // create a user for one company + $userInCompanyA = User::factory()->for($companyA)->create(); // create a super admin and act as them + $admin = User::factory()->superuser()->create(); // attempt to bulk checkout both items to the user in the company + $this->actingAs($admin) + ->post(route('hardware.bulkcheckout.store'), [ + 'selected_assets' => [ + $assetForCompanyA->id, + $assetForCompanyB->id, + ], + 'checkout_to_type' => 'user', + 'assigned_user' => $userInCompanyA->id, + ]); + // @todo: assert session has error message and redirect back // ensure bulk checkout is blocked + $this->assertNull($assetForCompanyA->fresh()->assigned_to, 'Asset was checked out across companies.'); + $this->assertNull($assetForCompanyB->fresh()->assigned_to, 'Asset was checked out across companies.'); } } From e29b0aa6a4bbb3a05b4b8b5f398b1ea8621cc4e1 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 17 Sep 2025 13:55:54 -0700 Subject: [PATCH 13/42] Add todo --- tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php b/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php index e7089bd188..8d90e15b5a 100644 --- a/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php +++ b/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php @@ -128,4 +128,6 @@ class BulkAssetCheckoutTest extends TestCase $this->assertNull($assetForCompanyA->fresh()->assigned_to, 'Asset was checked out across companies.'); $this->assertNull($assetForCompanyB->fresh()->assigned_to, 'Asset was checked out across companies.'); } + + // @todo: another test for asset to asset and asset to location ❓ } From 8ea339f0ef0facf5c14a8a1f98c136a2418b0656 Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 17 Sep 2025 22:00:49 +0100 Subject: [PATCH 14/42] More small tweaks --- app/Http/Controllers/Account/AcceptanceController.php | 10 +--------- app/Models/CheckoutAcceptance.php | 7 +++---- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/app/Http/Controllers/Account/AcceptanceController.php b/app/Http/Controllers/Account/AcceptanceController.php index 36904e6b20..735946c3f5 100644 --- a/app/Http/Controllers/Account/AcceptanceController.php +++ b/app/Http/Controllers/Account/AcceptanceController.php @@ -138,14 +138,6 @@ class AcceptanceController extends Controller } - // Check for the PDF logo path and use that, otherwise use the regular logo path - if (!is_null($settings->acceptance_pdf_logo)) { - $path_logo = public_path() . '/uploads/' . $settings->acceptance_pdf_logo; - } elseif (!is_null($settings->logo)) { - $path_logo = public_path() . '/uploads/' . $settings->logo; - } - - // Get the data array ready for the notifications and PDF generation $data = [ 'item_tag' => $item->asset_tag, @@ -162,7 +154,7 @@ class AcceptanceController extends Controller 'site_name' => $settings->site_name, 'company_name' => $item->company?->name?? $settings->site_name, 'signature' => ($sig_filename) ? storage_path() . '/private_uploads/signatures/' . $sig_filename : null, - 'logo' => $path_logo, + 'logo' => ($settings->acceptance_pdf_logo) ? public_path() . '/uploads/' . $settings->acceptance_pdf_logo : null, 'date_settings' => $settings->date_display_format, 'admin' => auth()->user()->present()?->fullName, 'qty' => $acceptance->qty ?? 1, diff --git a/app/Models/CheckoutAcceptance.php b/app/Models/CheckoutAcceptance.php index 4cfd79d092..85fa472ffe 100644 --- a/app/Models/CheckoutAcceptance.php +++ b/app/Models/CheckoutAcceptance.php @@ -185,13 +185,12 @@ class CheckoutAcceptance extends Model $pdf->SetPrintFooter(false); $pdf->AddPage(); - if ($data['logo']) { + if ($data['logo'] != null) { $pdf->writeHTML('', true, 0, true, 0, ''); + } else { + $pdf->writeHTML('

'.$data['site_name'].'



', true, 0, true, 0, 'C'); } - if ($data['site_name']) { - $pdf->writeHTML($data['site_name'], true, 0, true, 0, 'C'); - } $pdf->Ln(); $pdf->writeHTML(trans('general.date') . ': ' . Helper::getFormattedDateObject(now(), 'datetime', false), true, 0, true, 0, ''); From e639d7726b0669e22503e302084dfb345e84572b Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 17 Sep 2025 14:32:27 -0700 Subject: [PATCH 15/42] Disallow bulk checkout across companies --- .../Controllers/Assets/BulkAssetsController.php | 15 +++++++++++++++ .../Checkouts/Ui/BulkAssetCheckoutTest.php | 4 ++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Assets/BulkAssetsController.php b/app/Http/Controllers/Assets/BulkAssetsController.php index 6c75ae06db..90e306d8c3 100644 --- a/app/Http/Controllers/Assets/BulkAssetsController.php +++ b/app/Http/Controllers/Assets/BulkAssetsController.php @@ -647,6 +647,21 @@ class BulkAssetsController extends Controller $assets = Asset::findOrFail($asset_ids); + if (Setting::getSettings()->full_multiple_companies_support && $target->company_id) { + $company_ids = $assets->pluck('company_id')->unique(); + + // if there is more than one unique company id or the singular company id does not match + // then the checkout is invalid + if ($company_ids->count() > 1 || $company_ids->first() != $target->company_id) { + // keep the session data around for the redirect so the assets select is re-populated + session()->reflash(); + + return redirect(route('hardware.bulkcheckout.show')) + // @todo: improve message and translate + ->with('error', 'One or more of the assets has a company mismatch.'); + } + } + if (request('checkout_to_type') == 'asset') { foreach ($asset_ids as $asset_id) { if ($target->id == $asset_id) { diff --git a/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php b/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php index 8d90e15b5a..b28e38f018 100644 --- a/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php +++ b/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php @@ -121,8 +121,8 @@ class BulkAssetCheckoutTest extends TestCase ], 'checkout_to_type' => 'user', 'assigned_user' => $userInCompanyA->id, - ]); - // @todo: assert session has error message and redirect back + ]) + ->assertRedirectToRoute('hardware.bulkcheckout.show'); // ensure bulk checkout is blocked $this->assertNull($assetForCompanyA->fresh()->assigned_to, 'Asset was checked out across companies.'); From 764b363bbcaf58db4be89c6a9d37dc67f59d534f Mon Sep 17 00:00:00 2001 From: snipe Date: Thu, 18 Sep 2025 13:38:37 +0100 Subject: [PATCH 16/42] A few small tweaks to acceptance screen design --- app/Models/CheckoutAcceptance.php | 11 +++-- .../views/account/accept/create.blade.php | 49 +++++++++++++------ 2 files changed, 39 insertions(+), 21 deletions(-) diff --git a/app/Models/CheckoutAcceptance.php b/app/Models/CheckoutAcceptance.php index 85fa472ffe..f23c6d7f4b 100644 --- a/app/Models/CheckoutAcceptance.php +++ b/app/Models/CheckoutAcceptance.php @@ -132,8 +132,7 @@ class CheckoutAcceptance extends Model /** * Filter checkout acceptences by the user * - * @param Illuminate\Database\Eloquent\Builder $query - * @param User $user + * @param User $user * @return \Illuminate\Database\Eloquent\Builder */ public function scopeForUser(Builder $query, User $user) @@ -144,7 +143,6 @@ class CheckoutAcceptance extends Model /** * Filter to only get pending acceptances * - * @param Illuminate\Database\Eloquent\Builder $query * @return \Illuminate\Database\Eloquent\Builder */ public function scopePending(Builder $query) @@ -209,6 +207,7 @@ class CheckoutAcceptance extends Model if ($data['item_serial'] != null) { $pdf->writeHTML(trans('admin/hardware/form.serial').': '.e($data['item_serial']), true, 0, true, 0, ''); } + $pdf->writeHTML(trans('general.assignee').': '.e($data['assigned_to']), true, 0, true, 0, ''); $pdf->Ln(); $pdf->writeHTML('
', true, 0, true, 0, ''); @@ -228,8 +227,10 @@ class CheckoutAcceptance extends Model $pdf->Ln(); if ($data['signature'] != null) { - $pdf->writeHTML('', true, 0, true, 0, ''); + $pdf->writeHTML('', true, 0, true, 0, ''); $pdf->writeHTML('
', true, 0, true, 0, ''); + $pdf->writeHTML(e($data['assigned_to']), true, 0, true, 0, 'C'); + $pdf->Ln(); } if ($data['note'] != null) { @@ -238,7 +239,7 @@ class CheckoutAcceptance extends Model $pdf->Ln(); } - $pdf->writeHTML(trans('general.assignee').': '.e($data['assigned_to']), true, 0, true, 0, ''); + $pdf->writeHTML(trans('general.assigned_date').': '.e($data['check_out_date']), true, 0, true, 0, ''); $pdf->writeHTML(trans('general.accepted_date').': '.e($data['accepted_date']), true, 0, true, 0, ''); diff --git a/resources/views/account/accept/create.blade.php b/resources/views/account/accept/create.blade.php index cb6a47a4ed..2b91d18f97 100644 --- a/resources/views/account/accept/create.blade.php +++ b/resources/views/account/accept/create.blade.php @@ -20,11 +20,21 @@ } .m-signature-pad--body { - border-style: solid; + border-style: dashed; border-color: grey; - border-width: thin; + border-width: thick; + padding-top: 0px; } + + .m-signature-pad { + box-shadow: none; + background-color: inherit; + border: none; + + } + + @@ -90,30 +100,37 @@ -
+
@endif - @if (auth()->user()->email!='') - - @endif - + + From be4ace293ed134197e29bfb519b4acf4aade3ff9 Mon Sep 17 00:00:00 2001 From: snipe Date: Thu, 18 Sep 2025 13:51:57 +0100 Subject: [PATCH 17/42] Use trans_choice for user acceptance --- app/Models/CheckoutAcceptance.php | 3 +++ .../AcceptanceAssetAcceptedToUserNotification.php | 4 ++-- resources/lang/en-US/mail.php | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/Models/CheckoutAcceptance.php b/app/Models/CheckoutAcceptance.php index f23c6d7f4b..b5c5ee9efe 100644 --- a/app/Models/CheckoutAcceptance.php +++ b/app/Models/CheckoutAcceptance.php @@ -207,6 +207,9 @@ class CheckoutAcceptance extends Model if ($data['item_serial'] != null) { $pdf->writeHTML(trans('admin/hardware/form.serial').': '.e($data['item_serial']), true, 0, true, 0, ''); } + if (($data['qty'] != null) && ($data['qty'] > 1)) { + $pdf->writeHTML(trans('general.qty').': '.e($data['qty']), true, 0, true, 0, ''); + } $pdf->writeHTML(trans('general.assignee').': '.e($data['assigned_to']), true, 0, true, 0, ''); $pdf->Ln(); $pdf->writeHTML('
', true, 0, true, 0, ''); diff --git a/app/Notifications/AcceptanceAssetAcceptedToUserNotification.php b/app/Notifications/AcceptanceAssetAcceptedToUserNotification.php index 246eb3777b..1f53443449 100644 --- a/app/Notifications/AcceptanceAssetAcceptedToUserNotification.php +++ b/app/Notifications/AcceptanceAssetAcceptedToUserNotification.php @@ -72,10 +72,10 @@ use Illuminate\Notifications\Notification; 'company_name' => $this->company_name, 'admin' => $this->admin, 'qty' => $this->qty, - 'intro_text' => trans('mail.acceptance_asset_accepted_to_user', ['site_name' => $this->company_name ?? $this->settings->site_name]), + 'intro_text' => trans_choice('mail.acceptance_asset_accepted_to_user', $this->qty, ['qty' => $this->qty, 'site_name' => $this->settings->site_name]), ]) ->attach($pdf_path) - ->subject(trans('mail.acceptance_asset_accepted_to_user', ['site_name' => $this->settings->site_name])); + ->subject(trans_choice('mail.acceptance_asset_accepted_to_user', $this->qty, ['qty' => $this->qty, 'site_name' => $this->settings->site_name])); return $message; } diff --git a/resources/lang/en-US/mail.php b/resources/lang/en-US/mail.php index 15a5bdd206..707390e4f0 100644 --- a/resources/lang/en-US/mail.php +++ b/resources/lang/en-US/mail.php @@ -31,7 +31,7 @@ return [ 'Low_Inventory_Report' => 'Low Inventory Report', 'a_user_canceled' => 'A user has canceled an item request on the website', 'a_user_requested' => 'A user has requested an item on the website', - 'acceptance_asset_accepted_to_user' => 'You have accepted an item assigned to you by :site_name', + 'acceptance_asset_accepted_to_user' => 'You have accepted an item assigned to you by :site_name|You have accepted :qty items assigned to you by :site_name', 'acceptance_asset_accepted' => 'A user has accepted an item', 'acceptance_asset_declined' => 'A user has declined an item', 'send_pdf_copy' => 'Send a copy of this acceptance to my email address', From 4b2b2cb68e89cebd3ca3ada50d5c1f86cb88f331 Mon Sep 17 00:00:00 2001 From: snipe Date: Thu, 18 Sep 2025 13:58:30 +0100 Subject: [PATCH 18/42] Fixed #17891 - missing maintenance file deletion route --- routes/web.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/web.php b/routes/web.php index a68923c4b2..30d11e9a96 100644 --- a/routes/web.php +++ b/routes/web.php @@ -725,7 +725,7 @@ Route::group(['middleware' => 'web'], function () { 'destroy' ] )->name('ui.files.destroy') - ->where(['object_type' => 'assets|hardware|models|users|locations|accessories|consumables|licenses|components']); + ->where(['object_type' => 'assets|maintenances|hardware|models|users|locations|accessories|consumables|licenses|components']); }); From 5216dd75bf9d2539eba0c1c6e073d10254172b42 Mon Sep 17 00:00:00 2001 From: snipe Date: Thu, 18 Sep 2025 14:49:15 +0100 Subject: [PATCH 19/42] Bumped version --- config/version.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/config/version.php b/config/version.php index 536e65ac78..f979c2b883 100644 --- a/config/version.php +++ b/config/version.php @@ -1,10 +1,10 @@ 'v8.3.1', - 'full_app_version' => 'v8.3.1 - build 19577-g7dd493da3', - 'build_version' => '19577', + 'app_version' => 'v8.3.2', + 'full_app_version' => 'v8.3.2 - build 19905-g028b4e7b7', + 'build_version' => '19905', 'prerelease_version' => '', - 'hash_version' => 'g7dd493da3', - 'full_hash' => 'v8.3.1-15-g7dd493da3', + 'hash_version' => 'g028b4e7b7', + 'full_hash' => 'v8.3.2-319-g028b4e7b7', 'branch' => 'develop', ); \ No newline at end of file From b2ad9d404ed9b59aa4313b0617db3d2f4a6cc507 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 18 Sep 2025 12:38:11 -0700 Subject: [PATCH 20/42] Fix re-population of assets --- app/Http/Controllers/Assets/BulkAssetsController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Assets/BulkAssetsController.php b/app/Http/Controllers/Assets/BulkAssetsController.php index 90e306d8c3..74b342c2f3 100644 --- a/app/Http/Controllers/Assets/BulkAssetsController.php +++ b/app/Http/Controllers/Assets/BulkAssetsController.php @@ -653,8 +653,8 @@ class BulkAssetsController extends Controller // if there is more than one unique company id or the singular company id does not match // then the checkout is invalid if ($company_ids->count() > 1 || $company_ids->first() != $target->company_id) { - // keep the session data around for the redirect so the assets select is re-populated - session()->reflash(); + // re-add the asset ids so the assets select is re-populated + $request->session()->flashInput(['selected_assets' => $asset_ids]); return redirect(route('hardware.bulkcheckout.show')) // @todo: improve message and translate From 47e9e4704dca657bfb7e702c691534da036d6b28 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 18 Sep 2025 12:56:36 -0700 Subject: [PATCH 21/42] Improve error message --- app/Http/Controllers/Assets/BulkAssetsController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Assets/BulkAssetsController.php b/app/Http/Controllers/Assets/BulkAssetsController.php index 74b342c2f3..db0190e626 100644 --- a/app/Http/Controllers/Assets/BulkAssetsController.php +++ b/app/Http/Controllers/Assets/BulkAssetsController.php @@ -658,7 +658,7 @@ class BulkAssetsController extends Controller return redirect(route('hardware.bulkcheckout.show')) // @todo: improve message and translate - ->with('error', 'One or more of the assets has a company mismatch.'); + ->with('error', 'One or more of the checkout target company and asset company do not match'); } } From a02a96d5c41babaca467387bea6a220017481001 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 18 Sep 2025 12:57:56 -0700 Subject: [PATCH 22/42] Extract translation string --- app/Http/Controllers/Assets/BulkAssetsController.php | 3 +-- resources/lang/en-US/general.php | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Assets/BulkAssetsController.php b/app/Http/Controllers/Assets/BulkAssetsController.php index db0190e626..463c7d2dbd 100644 --- a/app/Http/Controllers/Assets/BulkAssetsController.php +++ b/app/Http/Controllers/Assets/BulkAssetsController.php @@ -657,8 +657,7 @@ class BulkAssetsController extends Controller $request->session()->flashInput(['selected_assets' => $asset_ids]); return redirect(route('hardware.bulkcheckout.show')) - // @todo: improve message and translate - ->with('error', 'One or more of the checkout target company and asset company do not match'); + ->with('error', trans('general.error_user_company_multiple')); } } diff --git a/resources/lang/en-US/general.php b/resources/lang/en-US/general.php index 61b7c9f809..5941682bfc 100644 --- a/resources/lang/en-US/general.php +++ b/resources/lang/en-US/general.php @@ -519,6 +519,7 @@ return [ 'item_notes' => ':item Notes', 'item_name_var' => ':item Name', 'error_user_company' => 'Checkout target company and asset company do not match', + 'error_user_company_multiple' => 'One or more of the checkout target company and asset company do not match', 'error_user_company_accept_view' => 'An Asset assigned to you belongs to a different company so you can\'t accept nor deny it, please check with your manager', 'importer' => [ 'checked_out_to_fullname' => 'Checked Out to: Full Name', From c58e999fbb251bf6dce5d15a027fb535bf30a3a7 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 18 Sep 2025 13:11:06 -0700 Subject: [PATCH 23/42] Scaffold tests --- .../Feature/Checkouts/Ui/BulkAssetCheckoutTest.php | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php b/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php index b28e38f018..2303bb9ef8 100644 --- a/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php +++ b/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php @@ -91,9 +91,8 @@ class BulkAssetCheckoutTest extends TestCase } } - public function test_adheres_to_full_multiple_company_support() + public function test_adheres_to_full_multiple_company_support_when_checking_out_to_user() { - // $this->markTestIncomplete(); $this->settings->enableMultipleFullCompanySupport(); // create two companies @@ -129,5 +128,14 @@ class BulkAssetCheckoutTest extends TestCase $this->assertNull($assetForCompanyB->fresh()->assigned_to, 'Asset was checked out across companies.'); } - // @todo: another test for asset to asset and asset to location ❓ + public function test_adheres_to_full_multiple_company_support_when_checking_out_to_asset() + { + $this->markTestIncomplete(); + } + + public function test_adheres_to_full_multiple_company_support_when_checking_out_to_location() + { + $this->markTestIncomplete(); + + } } From 27d13a113aa9171ad1f225f1be2e2bdacac4bd7c Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 18 Sep 2025 14:01:44 -0700 Subject: [PATCH 24/42] Implement test --- .../Checkouts/Ui/BulkAssetCheckoutTest.php | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php b/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php index 2303bb9ef8..2c95db26c5 100644 --- a/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php +++ b/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php @@ -130,7 +130,41 @@ class BulkAssetCheckoutTest extends TestCase public function test_adheres_to_full_multiple_company_support_when_checking_out_to_asset() { - $this->markTestIncomplete(); + $this->settings->enableMultipleFullCompanySupport(); + + // create two companies + [$companyA, $companyB] = Company::factory()->count(2)->create(); + + // create an asset for each company + $assetForCompanyA = Asset::factory()->for($companyA)->create(); + $assetForCompanyB = Asset::factory()->for($companyB)->create(); + + $this->assertNull($assetForCompanyA->assigned_to, 'Asset should not be assigned before attempting this test case.'); + $this->assertNull($assetForCompanyB->assigned_to, 'Asset should not be assigned before attempting this test case.'); + + // create an asset for one company + $targetAssetForCompanyA = Asset::factory()->for($companyA)->create(); + + // create a super admin and act as them + $admin = User::factory()->superuser()->create(); + + // attempt to bulk checkout both items to the user in the company + $response = $this->actingAs($admin) + ->post(route('hardware.bulkcheckout.store'), [ + 'selected_assets' => [ + $assetForCompanyA->id, + $assetForCompanyB->id, + ], + 'checkout_to_type' => 'asset', + 'assigned_asset' => $targetAssetForCompanyA->id, + ]); + + // ensure bulk checkout is blocked + $this->assertNull($assetForCompanyA->fresh()->assigned_to, 'Asset was checked out across companies.'); + $this->assertNull($assetForCompanyB->fresh()->assigned_to, 'Asset was checked out across companies.'); + + // ensure redirected back + $response->assertRedirectToRoute('hardware.bulkcheckout.show'); } public function test_adheres_to_full_multiple_company_support_when_checking_out_to_location() From 59d0f0d292e8192534fa1a24fdaef5a1654fa8cc Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 18 Sep 2025 14:05:13 -0700 Subject: [PATCH 25/42] Re-order assertions --- tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php b/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php index 2c95db26c5..397215f2f3 100644 --- a/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php +++ b/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php @@ -112,7 +112,7 @@ class BulkAssetCheckoutTest extends TestCase $admin = User::factory()->superuser()->create(); // attempt to bulk checkout both items to the user in the company - $this->actingAs($admin) + $response = $this->actingAs($admin) ->post(route('hardware.bulkcheckout.store'), [ 'selected_assets' => [ $assetForCompanyA->id, @@ -120,12 +120,14 @@ class BulkAssetCheckoutTest extends TestCase ], 'checkout_to_type' => 'user', 'assigned_user' => $userInCompanyA->id, - ]) - ->assertRedirectToRoute('hardware.bulkcheckout.show'); + ]); // ensure bulk checkout is blocked $this->assertNull($assetForCompanyA->fresh()->assigned_to, 'Asset was checked out across companies.'); $this->assertNull($assetForCompanyB->fresh()->assigned_to, 'Asset was checked out across companies.'); + + // ensure redirected back + $response->assertRedirectToRoute('hardware.bulkcheckout.show'); } public function test_adheres_to_full_multiple_company_support_when_checking_out_to_asset() From 17aab4c4906b339407e9f33402795832bd5e23ff Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 18 Sep 2025 14:20:05 -0700 Subject: [PATCH 26/42] Implement test --- .../Checkouts/Ui/BulkAssetCheckoutTest.php | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php b/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php index 397215f2f3..56866d201c 100644 --- a/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php +++ b/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php @@ -5,6 +5,7 @@ namespace Tests\Feature\Checkouts\Ui; use App\Mail\CheckoutAssetMail; use App\Models\Asset; use App\Models\Company; +use App\Models\Location; use App\Models\User; use Illuminate\Support\Facades\Mail; use PHPUnit\Framework\ExpectationFailedException; @@ -171,7 +172,40 @@ class BulkAssetCheckoutTest extends TestCase public function test_adheres_to_full_multiple_company_support_when_checking_out_to_location() { - $this->markTestIncomplete(); + $this->settings->enableMultipleFullCompanySupport(); + // create two companies + [$companyA, $companyB] = Company::factory()->count(2)->create(); + + // create an asset for each company + $assetForCompanyA = Asset::factory()->for($companyA)->create(); + $assetForCompanyB = Asset::factory()->for($companyB)->create(); + + $this->assertNull($assetForCompanyA->assigned_to, 'Asset should not be assigned before attempting this test case.'); + $this->assertNull($assetForCompanyB->assigned_to, 'Asset should not be assigned before attempting this test case.'); + + // create a location for one company + $locationForCompanyA = Location::factory()->for($companyA)->create(); + + // create a super admin and act as them + $admin = User::factory()->superuser()->create(); + + // attempt to bulk checkout both items to the user in the company + $response = $this->actingAs($admin) + ->post(route('hardware.bulkcheckout.store'), [ + 'selected_assets' => [ + $assetForCompanyA->id, + $assetForCompanyB->id, + ], + 'checkout_to_type' => 'location', + 'assigned_location' => $locationForCompanyA->id, + ]); + + // ensure bulk checkout is blocked + $this->assertNull($assetForCompanyA->fresh()->assigned_to, 'Asset was checked out across companies.'); + $this->assertNull($assetForCompanyB->fresh()->assigned_to, 'Asset was checked out across companies.'); + + // ensure redirected back + $response->assertRedirectToRoute('hardware.bulkcheckout.show'); } } From 2960ea15f5c61f74de7ca77d9ca5776bb745930e Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 18 Sep 2025 14:29:12 -0700 Subject: [PATCH 27/42] Consolidate to data provider --- .../Checkouts/Ui/BulkAssetCheckoutTest.php | 118 +++++------------- 1 file changed, 34 insertions(+), 84 deletions(-) diff --git a/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php b/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php index 56866d201c..f9b9398bd2 100644 --- a/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php +++ b/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php @@ -8,6 +8,7 @@ use App\Models\Company; use App\Models\Location; use App\Models\User; use Illuminate\Support\Facades\Mail; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\ExpectationFailedException; use Tests\TestCase; @@ -92,47 +93,41 @@ class BulkAssetCheckoutTest extends TestCase } } - public function test_adheres_to_full_multiple_company_support_when_checking_out_to_user() + public static function checkoutTargets() { - $this->settings->enableMultipleFullCompanySupport(); + yield 'Checkout to user' => [ + function () { + return [ + 'type' => 'user', + 'target' => User::factory()->forCompany()->create(), + ]; + } + ]; - // create two companies - [$companyA, $companyB] = Company::factory()->count(2)->create(); + yield 'Checkout to asset' => [ + function () { + return [ + 'type' => 'asset', + 'target' => Asset::factory()->forCompany()->create(), + ]; + } + ]; - // create an asset for each company - $assetForCompanyA = Asset::factory()->for($companyA)->create(); - $assetForCompanyB = Asset::factory()->for($companyB)->create(); - - $this->assertNull($assetForCompanyA->assigned_to, 'Asset should not be assigned before attempting this test case.'); - $this->assertNull($assetForCompanyB->assigned_to, 'Asset should not be assigned before attempting this test case.'); - - // create a user for one company - $userInCompanyA = User::factory()->for($companyA)->create(); - - // create a super admin and act as them - $admin = User::factory()->superuser()->create(); - - // attempt to bulk checkout both items to the user in the company - $response = $this->actingAs($admin) - ->post(route('hardware.bulkcheckout.store'), [ - 'selected_assets' => [ - $assetForCompanyA->id, - $assetForCompanyB->id, - ], - 'checkout_to_type' => 'user', - 'assigned_user' => $userInCompanyA->id, - ]); - - // ensure bulk checkout is blocked - $this->assertNull($assetForCompanyA->fresh()->assigned_to, 'Asset was checked out across companies.'); - $this->assertNull($assetForCompanyB->fresh()->assigned_to, 'Asset was checked out across companies.'); - - // ensure redirected back - $response->assertRedirectToRoute('hardware.bulkcheckout.show'); + yield 'Checkout to location' => [ + function () { + return [ + 'type' => 'location', + 'target' => Location::factory()->forCompany()->create(), + ]; + } + ]; } - public function test_adheres_to_full_multiple_company_support_when_checking_out_to_asset() + #[DataProvider('checkoutTargets')] + public function test_adheres_to_full_multiple_company_support_when_checking_out_to_user($data) { + ['type' => $type, 'target' => $target] = $data(); + $this->settings->enableMultipleFullCompanySupport(); // create two companies @@ -145,60 +140,15 @@ class BulkAssetCheckoutTest extends TestCase $this->assertNull($assetForCompanyA->assigned_to, 'Asset should not be assigned before attempting this test case.'); $this->assertNull($assetForCompanyB->assigned_to, 'Asset should not be assigned before attempting this test case.'); - // create an asset for one company - $targetAssetForCompanyA = Asset::factory()->for($companyA)->create(); - - // create a super admin and act as them - $admin = User::factory()->superuser()->create(); - - // attempt to bulk checkout both items to the user in the company - $response = $this->actingAs($admin) + // attempt to bulk checkout both items to the target + $response = $this->actingAs(User::factory()->superuser()->create()) ->post(route('hardware.bulkcheckout.store'), [ 'selected_assets' => [ $assetForCompanyA->id, $assetForCompanyB->id, ], - 'checkout_to_type' => 'asset', - 'assigned_asset' => $targetAssetForCompanyA->id, - ]); - - // ensure bulk checkout is blocked - $this->assertNull($assetForCompanyA->fresh()->assigned_to, 'Asset was checked out across companies.'); - $this->assertNull($assetForCompanyB->fresh()->assigned_to, 'Asset was checked out across companies.'); - - // ensure redirected back - $response->assertRedirectToRoute('hardware.bulkcheckout.show'); - } - - public function test_adheres_to_full_multiple_company_support_when_checking_out_to_location() - { - $this->settings->enableMultipleFullCompanySupport(); - - // create two companies - [$companyA, $companyB] = Company::factory()->count(2)->create(); - - // create an asset for each company - $assetForCompanyA = Asset::factory()->for($companyA)->create(); - $assetForCompanyB = Asset::factory()->for($companyB)->create(); - - $this->assertNull($assetForCompanyA->assigned_to, 'Asset should not be assigned before attempting this test case.'); - $this->assertNull($assetForCompanyB->assigned_to, 'Asset should not be assigned before attempting this test case.'); - - // create a location for one company - $locationForCompanyA = Location::factory()->for($companyA)->create(); - - // create a super admin and act as them - $admin = User::factory()->superuser()->create(); - - // attempt to bulk checkout both items to the user in the company - $response = $this->actingAs($admin) - ->post(route('hardware.bulkcheckout.store'), [ - 'selected_assets' => [ - $assetForCompanyA->id, - $assetForCompanyB->id, - ], - 'checkout_to_type' => 'location', - 'assigned_location' => $locationForCompanyA->id, + 'checkout_to_type' => $type, + "assigned_$type" => $target->id, ]); // ensure bulk checkout is blocked From 2dc11a84bfeb5a39fba7418e1683dc8bf92677a6 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 18 Sep 2025 17:05:08 -0700 Subject: [PATCH 28/42] Fix test name --- tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php b/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php index f9b9398bd2..8750087394 100644 --- a/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php +++ b/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php @@ -124,7 +124,7 @@ class BulkAssetCheckoutTest extends TestCase } #[DataProvider('checkoutTargets')] - public function test_adheres_to_full_multiple_company_support_when_checking_out_to_user($data) + public function test_adheres_to_full_multiple_company_support($data) { ['type' => $type, 'target' => $target] = $data(); From 5c08f3a27eb3e9c420a9eebec899181e884f383c Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 18 Sep 2025 17:14:33 -0700 Subject: [PATCH 29/42] Add failing test --- .../Checkouts/Ui/BulkAssetCheckoutTest.php | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php b/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php index f05c4389e6..0791b3b422 100644 --- a/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php +++ b/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php @@ -89,4 +89,32 @@ class BulkAssetCheckoutTest extends TestCase $this->fail('Asset checkout email was sent when the entire checkout failed.'); } } + + public function test_prevents_checkouts_checked_out_items() + { + $asset = Asset::factory()->create(); + $checkedOutAsset = Asset::factory()->assignedToUser()->create(); + $existingUserId = $checkedOutAsset->assigned_to; + + $target = User::factory()->create(); + + $response = $this->actingAs(User::factory()->superuser()->create()) + ->post(route('hardware.bulkcheckout.store'), [ + 'selected_assets' => [ + $asset->id, + $checkedOutAsset->id, + ], + 'checkout_to_type' => 'user', + 'assigned_user' => $target->id, + ]); + + $this->assertEquals( + $existingUserId, + $checkedOutAsset->fresh()->assigned_to, + 'Asset was checked out when it should have been prevented.' + ); + + // ensure redirected back + $response->assertRedirectToRoute('hardware.bulkcheckout.show'); + } } From ac8a9e38f0ab7c99dc745b2a56f4bf774b282b2e Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 18 Sep 2025 17:18:27 -0700 Subject: [PATCH 30/42] Implement fix --- app/Http/Controllers/Assets/BulkAssetsController.php | 8 ++++++++ resources/lang/en-US/general.php | 1 + 2 files changed, 9 insertions(+) diff --git a/app/Http/Controllers/Assets/BulkAssetsController.php b/app/Http/Controllers/Assets/BulkAssetsController.php index 6c75ae06db..8ba3ccf99d 100644 --- a/app/Http/Controllers/Assets/BulkAssetsController.php +++ b/app/Http/Controllers/Assets/BulkAssetsController.php @@ -647,6 +647,14 @@ class BulkAssetsController extends Controller $assets = Asset::findOrFail($asset_ids); + if ($assets->pluck('assigned_to')->unique()->filter()->isNotEmpty()) { + // re-add the asset ids so the assets select is re-populated + $request->session()->flashInput(['selected_assets' => $asset_ids]); + + return redirect(route('hardware.bulkcheckout.show')) + ->with('error', trans('general.error_assets_already_checked_out')); + } + if (request('checkout_to_type') == 'asset') { foreach ($asset_ids as $asset_id) { if ($target->id == $asset_id) { diff --git a/resources/lang/en-US/general.php b/resources/lang/en-US/general.php index 61b7c9f809..42751c5cf9 100644 --- a/resources/lang/en-US/general.php +++ b/resources/lang/en-US/general.php @@ -520,6 +520,7 @@ return [ 'item_name_var' => ':item Name', 'error_user_company' => 'Checkout target company and asset company do not match', 'error_user_company_accept_view' => 'An Asset assigned to you belongs to a different company so you can\'t accept nor deny it, please check with your manager', + 'error_assets_already_checked_out' => 'One or more of the assets are already checked out', 'importer' => [ 'checked_out_to_fullname' => 'Checked Out to: Full Name', 'checked_out_to_first_name' => 'Checked Out to: First Name', From 7a3596c86d543cd80ea3c557aae658b7c02b2aca Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 18 Sep 2025 17:21:27 -0700 Subject: [PATCH 31/42] Test against other types --- .../Assets/BulkAssetsController.php | 1 + .../Checkouts/Ui/BulkAssetCheckoutTest.php | 43 ++++++++++++++++--- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/Assets/BulkAssetsController.php b/app/Http/Controllers/Assets/BulkAssetsController.php index 8ba3ccf99d..4b9ccb6753 100644 --- a/app/Http/Controllers/Assets/BulkAssetsController.php +++ b/app/Http/Controllers/Assets/BulkAssetsController.php @@ -647,6 +647,7 @@ class BulkAssetsController extends Controller $assets = Asset::findOrFail($asset_ids); + // Prevent checking out assets that are already checked out if ($assets->pluck('assigned_to')->unique()->filter()->isNotEmpty()) { // re-add the asset ids so the assets select is re-populated $request->session()->flashInput(['selected_assets' => $asset_ids]); diff --git a/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php b/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php index 0791b3b422..c9619dbd69 100644 --- a/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php +++ b/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php @@ -4,8 +4,10 @@ namespace Tests\Feature\Checkouts\Ui; use App\Mail\CheckoutAssetMail; use App\Models\Asset; +use App\Models\Location; use App\Models\User; use Illuminate\Support\Facades\Mail; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\ExpectationFailedException; use Tests\TestCase; @@ -90,22 +92,53 @@ class BulkAssetCheckoutTest extends TestCase } } - public function test_prevents_checkouts_checked_out_items() + public static function checkoutTargets() { + yield 'Checkout to user' => [ + function () { + return [ + 'type' => 'user', + 'target' => User::factory()->forCompany()->create(), + ]; + } + ]; + + yield 'Checkout to asset' => [ + function () { + return [ + 'type' => 'asset', + 'target' => Asset::factory()->forCompany()->create(), + ]; + } + ]; + + yield 'Checkout to location' => [ + function () { + return [ + 'type' => 'location', + 'target' => Location::factory()->forCompany()->create(), + ]; + } + ]; + } + + #[DataProvider('checkoutTargets')] + public function test_prevents_checkouts_checked_out_items($data) + { + ['type' => $type, 'target' => $target] = $data(); + $asset = Asset::factory()->create(); $checkedOutAsset = Asset::factory()->assignedToUser()->create(); $existingUserId = $checkedOutAsset->assigned_to; - $target = User::factory()->create(); - $response = $this->actingAs(User::factory()->superuser()->create()) ->post(route('hardware.bulkcheckout.store'), [ 'selected_assets' => [ $asset->id, $checkedOutAsset->id, ], - 'checkout_to_type' => 'user', - 'assigned_user' => $target->id, + 'checkout_to_type' => $type, + "assigned_$type" => $target->id, ]); $this->assertEquals( From 52239a88b5f90ea567011fac8a54acf3b3b3c065 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 18 Sep 2025 17:27:17 -0700 Subject: [PATCH 32/42] Improve test name --- tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php b/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php index c9619dbd69..2f325ba68a 100644 --- a/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php +++ b/tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php @@ -123,7 +123,7 @@ class BulkAssetCheckoutTest extends TestCase } #[DataProvider('checkoutTargets')] - public function test_prevents_checkouts_checked_out_items($data) + public function test_prevents_checkouts_of_checked_out_items($data) { ['type' => $type, 'target' => $target] = $data(); From c3748da0b1545c20e734722ac52a6eddd277d561 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 19 Sep 2025 12:16:56 +0100 Subject: [PATCH 33/42] Fixed #17804 - make columns searchable in column picker --- public/css/build/app.css | 3 +++ public/css/build/app.css.map | 2 +- public/css/build/overrides.css | 3 +++ public/css/build/overrides.css.map | 2 +- public/css/dist/all.css | 6 ++++++ public/mix-manifest.json | 6 +++--- resources/assets/less/overrides.less | 4 ++++ resources/views/hardware/index.blade.php | 3 +++ 8 files changed, 24 insertions(+), 5 deletions(-) diff --git a/public/css/build/app.css b/public/css/build/app.css index 542c2e035e..c98f550291 100644 --- a/public/css/build/app.css +++ b/public/css/build/app.css @@ -1501,6 +1501,9 @@ caption.tableCaption { white-space: preserve; display: inline-block; } +input[name="columnsSearch"] { + width: 120px; +} /*# sourceMappingURL=app.css.map*/ \ No newline at end of file diff --git a/public/css/build/app.css.map b/public/css/build/app.css.map index 3d856a04b4..c6083d3cb8 100644 --- a/public/css/build/app.css.map +++ b/public/css/build/app.css.map @@ -1 +1 @@ -{"version":3,"file":"css/build/app.css","mappings":"AACA;EACE;EAGA;AAFF;AAKA;EACE;IACE;EAHF;EAMA;IACE;EAJF;AACF;AAOA;EACE;AALF;AAOA;EACE;EACA;EACA;EACA;EACA;AALF;AASA;EACE;AAPF;AAUA;EACE;EACA;AARF;AAWA;EACE;AATF;AAYA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;AAVF;AAaA;EACE;EACA;EACA;EACA;EACA;AAXF;AAcA;EACE;AAZF;AAeA;EACE;AAbF;AAgBA;EACE;EACA;AAdF;AAiBA;EACE;AAfF;AAkBA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAhBF;AAmBA;EACE;AAjBF;AAoBA;EACE;AAlBF;AAqBA;EACE;AAnBF;AAsBA;EACE;AApBF;AAuBA;EACE;EACA;EACA;AArBF;AAwBA;EACE;EACA;EACA;AAtBF;AA6BA;EACE;AA3BF;AA8BA;EACE;EACA;AA5BF;AA+BA;EACE;AA7BF;AA+BA;EACE;EACA;AA7BF;AAgCA;;EAEE;EACA;AA9BF;AAiCA;EACE;EACA;AA/BF;AAiCA;EACE;AA/BF;AAkCA;EACE;EACA;EACA;AAhCF;AAmCA;EACE;AAjCF;AAoCA;EACE;AAlCF;AAqCA;EACE;AAnCF;AAsCA;EACE;AApCF;AAuCA;EACE;AArCF;AAwCA;;;;;EAKE;AAtCF;AAyCA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAvCF;AA0CA;EACE;EACA;EACA;EACA;EACA;EACA;AAxCF;AA2CA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAzCF;AA4CA;EACE;AA1CF;AA6CA;EACE;EACA;EACA;EACA;AA3CF;AA8CA;EACE;EACA;AA5CF;AA+CA;EACE;EACA;EACA;EACA;EACA;AA7CF;AAgDA;EACE;EACA;AA9CF;AAiDA;EACE;EACA;EACA;EACA;AA/CF;AAkDA;EACE;EACA;AAhDF;AACA,cAAc;AAmDd;EACE;EACA;EACA;AAjDF;AAmDA;EACE;EACA;AAjDF;AAsDA;EACE;EACA;EACA;AApDF;AAuDA;EACE;EACA;AArDF;AAwDA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAtDF;AAyDA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAvDF;AA0DA;EACE;EACA;EACA;EACA;EACA;AAxDF;AA2DA;EACE;EACA;EACA;AAzDF;AA4DA;EACE;AA1DF;AA6DA;EACE;AA3DF;AA8DA;EACE;AA5DF;AA+DA;EACE;AA7DF;AAgEA;EACE;AA9DF;AAiEA;EACE;AA/DF;AAkEA;EACE;EACA;AAhEF;AAmEA;EACE;AAjEF;AAoEA;EACE;AAlEF;AACA,kBAAkB;AAqElB;EACE;EAEA;EACA;EACA;EApEA,gCAAgC;AAClC;AAuEA;EACE;AArEF;AAwEA;EACE;EACA;EACA;AAtEF;AAwEA;EACE;EACA;EACA;AAtEF;AAyEA;;;EACE;AArEF;AAwEA;EACE;EACA;AAtEF;AAyEA;EACE;IACE;EAvEF;EA0EA;IACE;IACA;IACA;EAxEF;AACF;AA2EA;;EAEE;EACA;EACA;AAzEF;AA4EA;EACE;AA1EF;AA6EA;;EAEE;AA3EF;AA8EA;EACE;AA5EF;AA+EA;EACE;AA7EF;AAgFA;EACE;EACA;EACA;AA9EF;AAiFA;EACE;EACA;AA/EF;AAkFA;EACE;EACA;EACA;AAhFF;AAmFA;EACE;AAjFF;ACvXA;EAkBE;ADwWF;ACtWA;EACE;EACA;EACA;EACA;EACA;ADwWF;ACvWE;;;EACE;AD2WJ;ACxWA;EACE;AD0WF;ACvWA;EACE;EACA;ADyWF;ACtWA;EACE;ADwWF;ACpWA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;ADsWF;ACnWA;EACE;EACA;EACA;EACA;EACA;ADqWF;AClWA;EACE;ADoWF;ACjWA;EACE;ADmWF;AChWA;EACE;EACA;ADkWF;AC9VA;EACE;ADgWF;AC7VA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AD+VF;AC7VA;EACE;AD+VF;AC7VA;EACE;AD+VF;AC3VA;EACE;AD6VF;AC3VA;EACE;AD6VF;ACzVA;EACE;EACA;EACA;AD2VF;ACxVA;EACE;EACA;EACA;AD0VF;ACnUA;EACE;ADqUF;AClUA;EACE;EACA;EACA;ADoUF;ACjUA;EACE;EACA;ADmUF;AChUA;EACE;ADkUF;AC/TA;EACE;EACA;ADiUF;AC9TA;;EACE;EACA;ADiUF;AC9TA;EACE;EACA;ADgUF;AC9TA;EACE;ADgUF;AC7TA;EACE;EACA;EACA;AD+TF;AC5TA;EACE;AD8TF;AC3TA;EACE;AD6TF;AC1TA;EACE;AD4TF;AC1TA;EACE;AD4TF;ACzTA;EACE;AD2TF;ACxTA;;;;EACE;AD6TF;AC1TA;;;;;EACE;ADgUF;AC7TA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AD+TF;AC7TA;EACE;EACA;EACA;EACA;EACA;EACA;AD+TF;AC7TA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AD+TF;AC7TA;EACE;AD+TF;AC7TA;EACE;EACA;EACA;EACA;AD+TF;AC7TA;EACE;EACA;AD+TF;AC7TA;EACE;EACA;EACA;EACA;EACA;AD+TF;AC7TA;EACE;EACA;AD+TF;AC7TA;EACE;EACA;EACA;EACA;AD+TF;AC5TA;EACE;EACA;AD8TF;ACzTA;EAAY;AD4TZ;AACA,cAAc;AC1Td;EAAY;EAAkC;AD8T9C;AC7TA;EAA8B;EAAY;ADiU1C;AC/TA;EAAiD;EAAgB;EAAiB;ADoUlF;ACnUA;EAA8C;EAAa;ADuU3D;ACtUA;EAA+C;EAAoB;EAAa;EAAc;EAAgB;EAAqB;EAAW;EAAW;EAAmB;EAAoB;ADkVhM;ACjVA;EAAqD;EAAc;EAAa;EAAc;EAAqB;EAAqB;EAAoB;EAAU;AD2VtK;AC1VA;EAA0C;EAAoB;EAAoB;EAAa;EAAkB;ADiWjH;AChWA;EAA0D;EAAW;EAAkB;ADqWvF;ACpWA;EAAmE;ADuWnE;ACtWA;EAAiE;ADyWjE;ACxWA;EAA6E;AD2W7E;AC1WA;EAA4E;AD6W5E;AC5WA;EAAwD;AD+WxD;AC9WA;EAA8D;ADiX9D;AChXA;EAAuD;EAAW;ADoXlE;ACnXA;EAAsD;ADsXtD;ACrXA;EAAuD;ADwXvD;AACA,kBAAkB;ACtXlB;EACE;EACA;EACA;EACA;EACA;EDwXA,gCAAgC;AAClC;ACrXA;EAkBE;ADsWF;ACnWA;EACE;ADqWF;ACjWA;;EACE;ADoWF;AClWA;;EACE;ADqWF;AClWA;EACE;EAIA;ADiWF;AC9VA;EACE;EACA;ADgWF;AC7VA;EACE;AD+VF;AC5VA;EACE;AD8VF;AC3VA;EAEE;IACE;IACA;ED4VF;ECzVA;IACE;IACA;IACA;ED2VF;ECxVA;IACE;ED0VF;ECvVA;;IACE;ED0VF;ECvVA;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EDyVF;EACA,+CAA+C;ECtV/C;IACE;EDwVF;ECrVA;IACE;EDuVF;ECpVA;IACE;EDsVF;ECnVA;IACE;EDqVF;EACA,qCAAqC;EClVrC;;IACE;EDqVF;EACA,QAAQ;EClVR;;IACE;IACA;IACA;EDqVF;EClVA;IACE;EDoVF;ECjVA;IACE;EDmVF;EChVA;IACE;IACA;IACA;EDkVF;EC/UA;IACE;IACA;EDiVF;EC9UA;;IACE;EDiVF;EC/UA;;;;;;;;;;;;IACE;ED4VF;ECzVA;IACE;ED2VF;ECzVA;IACE;ED2VF;ECzVA;IACE;ED2VF;ECzVA;IACE;ED2VF;ECzVA;IACE;ED2VF;ECzVA;IACE;ED2VF;ECzVA;IACE;ED2VF;ECzVA;IACE;ED2VF;ECzVA;IACE;ED2VF;ECzVA;IACE;ED2VF;ECzVA;IACE;ED2VF;ECzVA;IACE;ED2VF;AACF;ACtVA;EACE;ADwVF;ACrVA;EACI;EACA;ADuVJ;ACpVA;EACE;ADsVF;ACnVA;EACE;EACA;EACA;ADqVF;AChVA;EACE;EACA;OAAA;EACA;EACA;ADkVF;AC/UA;;EACE;EACA;EACA;ADkVF;AC/UA;;;EACE;ADmVF;AChVA;;EACE;ADmVF;AChVA;EACE;ADkVF;AC/UA;EACE;ADiVF;AC9UA;EACE;EACA;EACA;ADgVF;AC7UA;EACE;EACA;AD+UF;AC5UA;EACE;EACA;EACA;AD8UF;AC1UA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;AD4UF;AC1UA;;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AD6UF;AC1UA;EACE;AD4UF;ACzUA;EACE;AD2UF;ACxUA;EACE;AD0UF;ACvUA;EACE;ADyUF;ACtUA;EACE;ADwUF;ACpUA;EACE;EACA;EACA;EACA;EACA;EAGA;ADoUF;ACjUA;EACE;EACA;EACA;EACA;ADmUF;AChUA;EACE;EACA;EACA;EACA;ADkUF;AC9TA;EACE;EACA;EACA;EACA;EACA;EACA;ADgUF;AACA;;;;EAIE;AC7TF;EACE;EACA;EACA;EACA;AD+TF;AC5TA;EACE;EACA;EACA;EACA;EACA;AD8TF;AC3TA;EACE;EACA;EACA;AD6TF;AC1TA;EACE;EACA;EACA;AD4TF;ACxTA;EACE;AD0TF;AACA;;EAEE;ACrTF;EACE;IACE;IACA;EDuTF;ECpTA;IACE;EDsTF;ECnTA;IACE;EDqTF;EClTA;IACE;EDoTF;AACF;ACjTA;EACE;EACA;EACA;ADmTF;AChTA;EACE;EACA;ADkTF;AACA;;;;;;;;;;;EAWE;AC7SF;;;;;;;;;;;;;;;EAgBE;EACA;EACA;EACA;EACA;EACA;AD8SF;AC1SA;;;;;;;;;;;;;;;;EAiBE;EACA;EACA;EACA;AD2SF;AACA;;;EAGE;ACxSF;EAEE;EAAkB;EAAoC;AD2SxD;ACxSA;EAEE;EAAkB;EAAoC;AD2SxD;ACxSA;EAEE;EAAkB;EAAoC;AD2SxD;ACxSA;EAEE;EAAkB;EAAoC;AD2SxD;ACxSA;EAEE;EAAkB;EAAoC;AD2SxD;ACxSA;EACE;EAAkB;EAAoC;AD4SxD;ACzSA;EACE;EAAkB;EAAoC;EAAiB;AD8SzE;AC3SA;EAEE;EAAkB;EAAoC;AD8SxD;AC3SA;EAEE;EAAkB;EAClB;EACA;AD6SF;AC1SA;EACE;EACA;EACA;EACA;AD4SF;AC1SA;EACE;EACA;EACA;EACA;AD4SF;AC1SA;EACE;EACA;EACA;EACA;AD4SF;AC1SA;EACE;EACA;EACA;EACA;AD4SF;ACzSA;EACE;EACA;EACA;EACA;AD2SF;ACxSA;EACE;EACA;EACA;EACA;AD0SF;ACvSA;EACE;EACA;EACA;EACA;ADySF;ACrSA;EACE;EACA;EACA;EACA;ADuSF;ACnSA;;;EACE;ADuSF;ACpSA;;EACE;EACA;EACA;EACA;ADuSF;ACpSA;;EACE;ADuSF;ACpSA;EACE;ADsSF;ACnSA;EACE;IACE;EDqSF;ECnSA;IACE;EDqSF;AACF;ACnSA;EACE;IACE;EDqSF;ECnSA;IACE;EDqSF;ECnSA;IACE;EDqSF;AACF;AClSA;EACE;IACE;EDoSF;AACF;AClSA;EACE;IACE;EDoSF;EClSA;IACE;IACA;EDoSF;EClSA;IACE;IACA;EDoSF;EClSA;IACE;IACA;EDoSF;AACF;AClSA;EACE;IACE;EDoSF;AACF;ACjSA;EACE;IACE;EDmSF;AACF;ACjSA;EACE;IACE;IACA;IACA;IACA;IACA;EDmSF;AACF;AACA,oDAAoD;AC/RpD;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;ADiSF;AC9RA;EACE;EACA;ADgSF;AACA,8CAA8C;AAC9C,8CAA8C;AAC9C,8CAA8C;AC5R9C;ED8RE,kCAAkC;EC5RlC;EACA;OAAA;ED8RA,+CAA+C;EC5R/C;ED8RA,+BAA+B;EC5R/B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;ED8RA,6BAA6B;AAC/B;AACA,yFAAyF;AC1RzF;ED4RE,2EAA2E;ECpR3E;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EDqRA,+BAA+B;ECnR/B;ADqRF;AACA,wEAAwE;AClRxE;EACE;ADoRF;AACA,wEAAwE;ACjRxE;;EACE;EACA;EACA;EACA;EACA;ADoRF;AACA,6EAA6E;ACjR7E;;EACE;EACA;EACA;EACA;ADoRF;AACA,+EAA+E;ACjR/E;;EACE;EACA;EACA;EACA;ADoRF;AACA,qCAAqC;AC/QrC;EACE;KAAA;UAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;ADiRF;AC9QA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;ADgRF;AC7QA;EACE;AD+QF;AACA;;;;EAIE;AC3QF;EACE;AD6QF;AC1QA;EACE;EACA;EACA;EACA;AD4QF;ACzQA;EACE;AD2QF;ACxQA;EACE;AD0QF;ACvQA;EACE;ADyQF;ACtQA;EACE;ADwQF;AACA,8CAA8C;AAC9C,8CAA8C;AAC9C,8CAA8C;AAC9C;;;EAGE;ACnQF;EACE;EACA;EACA;EACA;EACA;ADqQF;AClQA;;EAEE;EACA;EACA;ADoQF;ACjQA;EACE;ADmQF;AChQA;EACE;ADkQF;AChQA;EACE;ADkQF;AC/PA;EACE;EACA;EACA;ADiQF;AACA,kEAAkE;AC9PlE;EACE;ADgQF;AC7PA;EACE;AD+PF;AC3PA;EACE;EACA;AD6PF;AC1PA;EACE;EACA;AD4PF;ACzPA;EACE;EACA;EACA;EACA;EACA;EACA;AD2PF;ACxPA;;EACE;AD2PF;ACxPA;EACE;EAQA;EACA;EACA;ADmPF;AChPA;EACE;EACA;ADkPF;AC/OA;EACE;ADiPF;AC9OA;EACE;EACA;ADgPF;AC5OA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AD8OF;AC5OA;;;;;EAKE;AD8OF;AC3OA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;AD6OF","sources":["webpack:///./resources/assets/less/app.less","webpack:///./resources/assets/less/overrides.less"],"sourcesContent":["\nbody {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\", \"Oxygen\",\n \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\",\n sans-serif;\n font-size: 13px;\n}\n// Moved from default.blade.php\n@media (max-width: 400px) {\n .navbar-left {\n margin: 2px;\n }\n\n .nav::after {\n clear: none;\n }\n}\n\n.skin-blue .main-header .logo {\n background-color: inherit !important;\n}\n.main-header .logo {\n width: 100% !important;\n white-space: nowrap;\n text-align: left;\n display: block;\n clear: both;\n //text-overflow: hidden;\n}\n\n.huge {\n font-size: 40px;\n}\n\n.btn-file {\n position: relative;\n overflow: hidden;\n}\n\n.dropdown-menu > li > a {\n color: #354044;\n}\n\n#sort tr.cansort {\n border-radius: 2px;\n padding: 10px;\n background: #f4f4f4;\n margin-bottom: 3px;\n border-left: 2px solid #e6e7e8;\n color: #444;\n cursor: move;\n}\n\n.user-image-inline {\n float: left;\n width: 25px;\n height: 25px;\n border-radius: 50%;\n margin-right: 10px;\n}\n\n.input-group .input-group-addon {\n background-color: #f4f4f4;\n}\n\na.accordion-header {\n color: #333;\n}\n\n.dynamic-form-row {\n padding: 10px;\n margin: 20px;\n}\n\n.handle {\n padding-left: 10px;\n}\n\n.btn-file input[type=\"file\"] {\n position: absolute;\n top: 0;\n right: 0;\n min-width: 100%;\n min-height: 100%;\n font-size: 100px;\n text-align: right;\n filter: alpha(opacity=0);\n opacity: 0;\n outline: none;\n background: white;\n cursor: inherit;\n display: block;\n}\n\n.main-footer {\n font-size: 13px;\n}\n\n.main-header {\n max-height: 150px;\n}\n\n.navbar-nav > .user-menu > .dropdown-menu {\n width: inherit;\n}\n\n.main-header .logo {\n padding: 0px 5px 0px 15px;\n}\n\n.sidebar-toggle {\n margin-left: -48px;\n z-index: 100;\n background-color: inherit;\n}\n\n.sidebar-toggle-mobile {\n z-index: 100;\n width: 50px;\n padding-top: 10px;\n}\n\n// .skin-blue .main-header .navbar .dropdown-menu li a {\n// //color: inherit;\n// }\n\n.main-header .sidebar-toggle:before {\n content: \"\\f0c9\";\n}\n\n.direct-chat-contacts {\n padding: 10px;\n height: 150px;\n}\n\n.select2-container {\n width: 100%;\n}\n.error input {\n color: #a94442;\n border: 2px solid #a94442 !important;\n}\n\n.error label,\n.alert-msg {\n color: #a94442;\n display: block;\n}\n\n.input-group[class*=\"col-\"] {\n padding-right: 15px;\n padding-left: 15px;\n}\n.control-label.multiline {\n padding-top: 10px;\n}\n\n.btn-outline {\n color: inherit;\n background-color: transparent;\n transition: all 0.5s;\n}\n\n.btn-primary.btn-outline {\n color: #428bca;\n}\n\n.btn-success.btn-outline {\n color: #5cb85c;\n}\n\n.btn-info.btn-outline {\n color: #5bc0de;\n}\n\n.btn-warning.btn-outline {\n color: #f0ad4e;\n}\n\n.btn-danger.btn-outline {\n color: #d9534f;\n}\n\n.btn-primary.btn-outline:hover,\n.btn-success.btn-outline:hover,\n.btn-info.btn-outline:hover,\n.btn-warning.btn-outline:hover,\n.btn-danger.btn-outline:hover {\n color: #fff;\n}\n\n.slideout-menu {\n position: fixed;\n top: 0;\n right: -250px;\n width: 250px;\n height: 100%;\n background: #333;\n z-index: 100;\n margin-top: 100px;\n color: white;\n padding: 10px;\n}\n\n.slideout-menu h3 {\n position: relative;\n padding: 5px 5px;\n color: #fff;\n font-size: 1.2em;\n font-weight: 400;\n border-bottom: 4px solid #222;\n}\n\n.slideout-menu .slideout-menu-toggle {\n position: absolute;\n top: 12px;\n right: 10px;\n display: inline-block;\n padding: 6px 9px 5px;\n font-family: Arial, sans-serif;\n font-weight: bold;\n line-height: 1;\n background: #222;\n color: #999;\n text-decoration: none;\n vertical-align: top;\n}\n\n.slideout-menu .slideout-menu-toggle:hover {\n color: #fff;\n}\n\n.slideout-menu ul {\n list-style: none;\n font-weight: 300;\n border-top: 1px solid #151515;\n border-bottom: 1px solid #454545;\n}\n\n.slideout-menu ul li {\n border-top: 1px solid #454545;\n border-bottom: 1px solid #151515;\n}\n\n.slideout-menu ul li a {\n position: relative;\n display: block;\n padding: 10px;\n color: #999;\n text-decoration: none;\n}\n\n.slideout-menu ul li a:hover {\n background: #000;\n color: #fff;\n}\n\n.slideout-menu ul li a i {\n position: absolute;\n top: 15px;\n right: 10px;\n opacity: 0.5;\n}\n\n.btn-box-tool-lg {\n font-size: 16px;\n color: orange;\n}\n\n/*Form Wizard*/\n.bs-wizard {\n margin-top: 20px;\n border-bottom: solid 1px #e0e0e0;\n padding: 0 0 10px 0;\n}\n.bs-wizard > .bs-wizard-step {\n padding: 0;\n position: relative;\n}\n\n// .bs-wizard > .bs-wizard-step + .bs-wizard-step {}\n\n.bs-wizard > .bs-wizard-step .bs-wizard-stepnum {\n color: #595959;\n font-size: 16px;\n margin-bottom: 5px;\n}\n\n.bs-wizard > .bs-wizard-step .bs-wizard-info {\n color: #999;\n font-size: 14px;\n}\n\n.bs-wizard > .bs-wizard-step > .bs-wizard-dot {\n position: absolute;\n width: 30px;\n height: 30px;\n display: block;\n background: #fbe8aa;\n top: 45px;\n left: 50%;\n margin-top: -15px;\n margin-left: -15px;\n border-radius: 50%;\n}\n\n.bs-wizard > .bs-wizard-step > .bs-wizard-dot:after {\n content: \" \";\n width: 14px;\n height: 14px;\n background: #fbbd19;\n border-radius: 50px;\n position: absolute;\n top: 8px;\n left: 8px;\n}\n\n.bs-wizard > .bs-wizard-step > .progress {\n position: relative;\n border-radius: 0px;\n height: 8px;\n box-shadow: none;\n margin: 20px 0;\n}\n\n.bs-wizard > .bs-wizard-step > .progress > .progress-bar {\n width: 0px;\n box-shadow: none;\n background: #fbe8aa;\n}\n\n.bs-wizard > .bs-wizard-step.complete > .progress > .progress-bar {\n width: 100%;\n}\n\n.bs-wizard > .bs-wizard-step.active > .progress > .progress-bar {\n width: 50%;\n}\n\n.bs-wizard > .bs-wizard-step:first-child.active > .progress > .progress-bar {\n width: 0%;\n}\n\n.bs-wizard > .bs-wizard-step:last-child.active > .progress > .progress-bar {\n width: 100%;\n}\n\n.bs-wizard > .bs-wizard-step.disabled > .bs-wizard-dot {\n background-color: #f5f5f5;\n}\n\n.bs-wizard > .bs-wizard-step.disabled > .bs-wizard-dot:after {\n opacity: 0;\n}\n\n.bs-wizard > .bs-wizard-step:first-child > .progress {\n left: 50%;\n width: 50%;\n}\n\n.bs-wizard > .bs-wizard-step:last-child > .progress {\n width: 50%;\n}\n\n.bs-wizard > .bs-wizard-step.disabled a.bs-wizard-dot {\n pointer-events: none;\n}\n/*END Form Wizard*/\n\n.left-navblock {\n display: inline-block;\n // float: left;\n text-align: left;\n color: white;\n padding: 0px;\n /* adjust based on your layout */\n}\n\na.logo.no-hover a:hover {\n background-color: transparent;\n}\n\n.index-block {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.index-block:hover{\n overflow: visible;\n white-space: normal;\n height:auto;\n}\n\ninput:required, select:required, textarea:required {\n border-right: 6px solid orange;\n}\n\n.sidebar-menu {\n font-size: 14px;\n white-space: normal;\n}\n\n@media print {\n a[href]:after {\n content: none;\n }\n\n .tab-content > .tab-pane {\n display: block !important;\n opacity: 1 !important;\n visibility: visible !important;\n }\n}\n\nimg.navbar-brand-img,\n.navbar-brand > img {\n float: left;\n padding: 5px 5px 5px 0;\n max-height: 50px;\n}\n\n.input-daterange {\n border-radius: 0px;\n}\n\n.btn.bg-maroon,\n.btn.bg-purple {\n min-width: 90px;\n}\n\n[hidden] {\n display: none !important;\n}\n\n#toolbar {\n margin-top: 10px;\n}\n\n#uploadPreview {\n border-color: grey;\n border-width: 1px;\n border-style: solid;\n}\n\n.icon-med {\n font-size: 20px;\n color: #889195;\n}\n\n#login-logo {\n padding-top: 20px;\n padding-bottom: 10px;\n max-width: 200px;\n}\n\n.left-navblock {\n max-width: 500px;\n}\n\n@import \"overrides.less\";",".skin-red\n.skin-purple\n.skin-blue\n.skin-black\n.skin-orange\n.skin-yellow\n.skin-green\n.skin-red-dark\n.skin-purple-dark\n.skin-blue-dark\n.skin-black-dark\n.skin-orange-dark\n.skin-yellow-dark\n.skin-green-dark\n.skin-contrast\n.main-header\n\n.logo {\n background-color: inherit;\n}\n.main-header .logo {\n width: 100% !important;\n white-space: nowrap;\n text-align: left;\n display: block;\n clear: both;\n &a:link, a:hover, a:visited {\n color: #fff\n }\n}\n.huge {\n font-size: 40px;\n}\n\n.btn-file {\n position: relative;\n overflow: hidden;\n}\n\n.dropdown-menu>li>a {\n color: #354044;\n}\n\n\n#sort tr.cansort {\n border-radius: 2px;\n padding: 10px;\n background: #f4f4f4;\n margin-bottom: 3px;\n border-inline: 2px solid #e6e7e8;\n color: #444;\n cursor: move;\n}\n\n.user-image-inline {\n float: left;\n width: 25px;\n height: 25px;\n border-radius: 50%;\n margin-right: 10px;\n}\n\n.input-group .input-group-addon {\n background-color: #f4f4f4;\n}\n\na.accordion-header {\n color: #333;\n}\n\n.dynamic-form-row {\n padding: 10px;\n margin: 20px;\n}\n\n\n.handle {\n padding-left: 10px;\n}\n\n.btn-file input[type=file] {\n position: absolute;\n top: 0;\n right: 0;\n min-width: 100%;\n min-height: 100%;\n font-size: 100px;\n text-align: right;\n filter: alpha(opacity=0);\n opacity: 0;\n outline: none;\n background: white;\n cursor: inherit;\n display: block;\n}\n.main-footer {\n font-size: 13px;\n}\n.main-header {\n max-height: 150px;\n}\n\n\n.navbar-nav>.user-menu>.dropdown-menu {\n width: inherit;\n}\n.main-header .logo {\n padding: 0px 5px 0px 15px;\n}\n\n\n.sidebar-toggle {\n margin-left: -48px;\n z-index: 100;\n background-color: inherit;\n}\n\n.sidebar-toggle-mobile {\n z-index: 100;\n width: 50px;\n padding-top: 10px;\n}\n\n.skin-red\n.skin-purple\n.skin-blue\n.skin-black\n.skin-orange\n.skin-yellow\n.skin-green\n.skin-red-dark\n.skin-purple-dark\n.skin-blue-dark\n.skin-black-dark\n.skin-orange-dark\n.skin-yellow-dark\n.skin-green-dark\n.skin-contrast\n.main-header\n.navbar\n.dropdown-menu li a {\n //color: inherit;\n}\n.pull-text-right{\n text-align: right !important;\n}\n\n.main-header .sidebar-toggle:before {\n content: \"\\f0c9\";\n font-weight: 900;\n font-family: 'Font Awesome\\ 5 Free';\n}\n\n.direct-chat-contacts {\n padding: 10px;\n height: 150px;\n}\n\n.select2-container {\n width: 100%;\n}\n\n.error input {\n color: #a94442;\n border: 2px solid #a94442 !important;\n}\n\n.error label, .alert-msg {\n color: #a94442;\n display: block;\n}\n\n.input-group[class*=\"col-\"] {\n padding-right: 15px;\n padding-left: 15px;\n}\n.control-label.multiline {\n padding-top: 10px;\n}\n\n.btn-outline {\n color: inherit;\n background-color: transparent;\n transition: all .5s;\n}\n\n.btn-primary.btn-outline {\n color: #428bca;\n}\n\n.btn-success.btn-outline {\n color: #5cb85c;\n}\n\n.btn-info.btn-outline {\n color: #5bc0de;\n}\n.btn-warning{\n background-color:#f39c12 !important;\n}\n\n.btn-warning.btn-outline {\n color: #f0ad4e;\n}\n\n.btn-danger.btn-outline, a.link-danger:link, a.link-danger:visited, a.link-danger:hover {\n color: #dd4b39;\n}\n\n.btn-primary.btn-outline:hover, .btn-success.btn-outline:hover, .btn-info.btn-outline:hover, .btn-warning.btn-outline:hover, .btn-danger.btn-outline:hover {\n color: #fff;\n}\n\n.slideout-menu {\n position: fixed;\n top: 0;\n right: -250px;\n width: 250px;\n height: 100%;\n background: #333;\n z-index: 100;\n margin-top: 100px;\n color: white;\n padding: 10px;\n}\n.slideout-menu h3 {\n position: relative;\n padding: 5px 5px;\n color: #fff;\n font-size: 1.2em;\n font-weight: 400;\n border-bottom: 4px solid #222;\n}\n.slideout-menu .slideout-menu-toggle {\n position: absolute;\n top: 12px;\n right: 10px;\n display: inline-block;\n padding: 6px 9px 5px;\n font-family: Arial, sans-serif;\n font-weight: bold;\n line-height: 1;\n background: #222;\n color: #999;\n text-decoration: none;\n vertical-align: top;\n}\n.slideout-menu .slideout-menu-toggle:hover {\n color: #fff;\n}\n.slideout-menu ul {\n list-style: none;\n font-weight: 300;\n border-top: 1px solid #151515;\n border-bottom: 1px solid #454545;\n}\n.slideout-menu ul li {\n border-top: 1px solid #454545;\n border-bottom: 1px solid #151515;\n}\n.slideout-menu ul li a {\n position: relative;\n display: block;\n padding: 10px;\n color: #999;\n text-decoration: none;\n}\n.slideout-menu ul li a:hover {\n background: #000;\n color: #fff;\n}\n.slideout-menu ul li a i {\n position: absolute;\n top: 15px;\n right: 10px;\n opacity: .5;\n}\n\n.btn-box-tool-lg {\n font-size: 16px;\n color: orange;\n}\n\n\n\n.bs-wizard {margin-top: 20px;}\n\n/*Form Wizard*/\n.bs-wizard {border-bottom: solid 1px #e0e0e0; padding: 0 0 10px 0;}\n.bs-wizard > .bs-wizard-step {padding: 0; position: relative;}\n.bs-wizard > .bs-wizard-step + .bs-wizard-step {}\n.bs-wizard > .bs-wizard-step .bs-wizard-stepnum {color: #595959; font-size: 16px; margin-bottom: 5px;}\n.bs-wizard > .bs-wizard-step .bs-wizard-info {color: #999; font-size: 14px;}\n.bs-wizard > .bs-wizard-step > .bs-wizard-dot {position: absolute; width: 30px; height: 30px; display: block; background: #fbe8aa; top: 45px; left: 50%; margin-top: -15px; margin-left: -15px; border-radius: 50%;}\n.bs-wizard > .bs-wizard-step > .bs-wizard-dot:after {content: ' '; width: 14px; height: 14px; background: #fbbd19; border-radius: 50px; position: absolute; top: 8px; left: 8px; }\n.bs-wizard > .bs-wizard-step > .progress {position: relative; border-radius: 0px; height: 8px; box-shadow: none; margin: 20px 0;}\n.bs-wizard > .bs-wizard-step > .progress > .progress-bar {width:0px; box-shadow: none; background: #fbe8aa;}\n.bs-wizard > .bs-wizard-step.complete > .progress > .progress-bar {width:100%;}\n.bs-wizard > .bs-wizard-step.active > .progress > .progress-bar {width:50%;}\n.bs-wizard > .bs-wizard-step:first-child.active > .progress > .progress-bar {width:0%;}\n.bs-wizard > .bs-wizard-step:last-child.active > .progress > .progress-bar {width: 100%;}\n.bs-wizard > .bs-wizard-step.disabled > .bs-wizard-dot {background-color: #f5f5f5;}\n.bs-wizard > .bs-wizard-step.disabled > .bs-wizard-dot:after {opacity: 0;}\n.bs-wizard > .bs-wizard-step:first-child > .progress {left: 50%; width: 50%;}\n.bs-wizard > .bs-wizard-step:last-child > .progress {width: 50%;}\n.bs-wizard > .bs-wizard-step.disabled a.bs-wizard-dot{ pointer-events: none; }\n/*END Form Wizard*/\n\n.left-navblock {\n display: inline-block;\n float: left;\n text-align: left;\n color: white;\n padding: 0px;\n /* adjust based on your layout */\n\n}\n.skin-red\n.skin-purple\n.skin-blue\n.skin-black\n.skin-orange\n.skin-yellow\n.skin-green\n.skin-red-dark\n.skin-purple-dark\n.skin-blue-dark\n.skin-black-dark\n.skin-orange-dark\n.skin-yellow-dark\n.skin-green-dark\n.skin-contrast\n.main-header\n.navbar\n.dropdown-menu li a {\n color: #333;\n}\n\na.logo.no-hover a:hover {\n background-color: transparent;\n}\n\n\ninput:required, select:required {\n border-right: 5px solid orange;\n}\nselect:required + .select2-container .select2-selection, select:required + .select2-container .select2-selection .select2-selection--multiple {\n border-right: 5px solid orange !important;\n}\n\nbody {\n font-family: -apple-system, BlinkMacSystemFont,\n \"Segoe UI\", \"Roboto\", \"Oxygen\", \"Ubuntu\", \"Cantarell\",\n \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\",\n sans-serif;\n font-size: 13px;\n}\n\n.sidebar-menu {\n font-size: 14px;\n white-space: normal;\n}\n\n.modal-warning .modal-help {\n color: #fff8af;\n}\n\n.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading {\n z-index: 0 !important;\n}\n\n@media print {\n\n @page {\n size: A4;\n margin: 0mm;\n }\n\n .tab-content > .tab-pane {\n display: block !important;\n opacity: 1 !important;\n visibility: visible !important;\n }\n\n .img-responsive {\n width: 200px;\n }\n\n html, body {\n width: 1024px;\n }\n\n body {\n margin: 0 auto;\n line-height: 1em;\n word-spacing:1px;\n letter-spacing:0.2px;\n font: 15px \"Times New Roman\", Times, serif;\n background:white;\n color:black;\n width: 100%;\n float: none;\n }\n\n /* avoid page-breaks inside a listingContainer*/\n .listingContainer {\n page-break-inside: avoid;\n }\n\n h1 {\n font: 28px \"Times New Roman\", Times, serif;\n }\n\n h2 {\n font: 24px \"Times New Roman\", Times, serif;\n }\n\n h3 {\n font: 20px \"Times New Roman\", Times, serif;\n }\n\n /* Improve colour contrast of links */\n a:link, a:visited {\n color: #781351\n }\n\n /* URL */\n a:link, a:visited {\n background: transparent;\n color:#333;\n text-decoration:none;\n }\n\n a[href]:after {\n content: \"\" !important;\n }\n\n a[href^=\"http://\"] {\n color:#000;\n }\n\n #header {\n height:75px;\n font-size: 24pt;\n color:black\n }\n\n div.row-new-striped {\n margin: 0px;\n padding: 0px;\n }\n\n .pagination-detail, .fixed-table-toolbar {\n visibility: hidden;\n }\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 .col-sm-pull-3 .col-sm-push-9 {\n float: left;\n }\n\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666666666666%;\n }\n .col-sm-10 {\n width: 83.33333333333334%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666666666666%;\n }\n .col-sm-7 {\n width: 58.333333333333336%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666666666667%;\n }\n .col-sm-4 {\n width: 33.33333333333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.666666666666664%;\n }\n .col-sm-1 {\n width: 8.333333333333332%;\n }\n\n}\n\n\n.select2-selection__choice__remove {\n color: white !important;\n}\n\n.select2-selection--multiple {\n border-color: #d2d6de !important;\n overflow-y: auto;\n}\n\n.select2-selection__choice {\n border-radius: 0px !important;\n}\n\n.select2-search select2-search--inline {\n height: 35px !important;\n float: left;\n margin: 0;\n}\n\n\n\n.select2-results__option {\n padding: 5px;\n user-select: none;\n -webkit-user-select: none;\n margin: 0px;\n}\n\nimg.navbar-brand-img, .navbar-brand>img {\n float: left;\n padding: 5px 5px 5px 0;\n max-height: 50px;\n}\n\n.input-daterange, .input-daterange input:first-child, .input-daterange input:last-child {\n border-radius: 0px !important;\n}\n\n.btn.bg-maroon, .btn.bg-purple{\n min-width:90px;\n}\n\n[hidden] {\n display: none !important;\n}\n\n#toolbar {\n margin-top: 10px;\n}\n\n#uploadPreview {\n border-color: grey;\n border-width: 1px;\n border-style: solid\n}\n\n.icon-med {\n font-size: 14px;\n color: #889195;\n}\n\n#login-logo {\n padding-top: 20px;\n padding-bottom: 10px;\n max-width: 200px\n}\n\n// accessibility skip link\na.skip-main {\n left:-999px;\n position:absolute;\n top:auto;\n width:1px;\n height:1px;\n overflow:hidden;\n z-index:-999;\n}\na.skip-main:focus, a.skip-main:active {\n color: #fff;\n background-color:#000;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow:auto;\n margin: 10px 35%;\n padding:5px;\n border-radius: 15px;\n border:4px solid yellow;\n text-align:center;\n font-size:1.2em;\n z-index:999;\n}\n\nh2 {\n font-size: 22px;\n}\n\nh2.task_menu {\n font-size: 14px;\n}\n\nh2 small {\n font-size: 85%;\n}\n\nh3 {\n font-size: 20px;\n}\n\nh4 {\n font-size: 16px;\n}\n\n\n.row-striped {\n vertical-align: top;\n line-height: 2.6;\n padding: 0px;\n margin-left: 20px;\n box-sizing: border-box;\n //border-left: 1px solid #dddddd;\n //border-right: 1px solid #dddddd;\n display: table;\n}\n\n.row-striped .row:nth-of-type(odd) div {\n background-color: #f9f9f9;\n border-top: 1px solid #dddddd;\n display: table-cell;\n word-wrap: break-word;\n}\n\n.row-striped .row:nth-of-type(even) div {\n background: #FFFFFF;\n border-top: 1px solid #dddddd;\n display: table-cell;\n word-wrap: break-word;\n}\n\n\n.row-new-striped {\n vertical-align: top;\n padding: 3px;\n display: table;\n width: 100%;\n word-wrap: break-word;\n table-layout:fixed;\n}\n\n/**\n* NEW STRIPING\n* This section is for the new row striping for nicer \n* display for non-table data as of v6\n**/\n.row-new-striped > .row:nth-of-type(even) {\n background: #FFFFFF;\n border-top: 1px solid #dddddd;\n line-height: 1.9;\n display: table-row;\n}\n\n.row-new-striped > .row:nth-of-type(odd) {\n background-color: #F8F8F8;\n border-top: 1px solid #dddddd;\n display: table-row;\n line-height: 1.9;\n padding: 2px;\n}\n\n.row-new-striped div {\n display: table-cell;\n border-top: 1px solid #dddddd;\n padding: 6px;\n}\n\n.row-new-striped div {\n display: table-cell;\n border-top: 1px solid #dddddd;\n padding: 6px;\n}\n\n\n.row-new-striped div[class^=\"col\"]:first-child {\n font-weight: bold;\n}\n\n\n\n/**\n* This just adds a little extra padding on mobile\n**/\n@media only screen and (max-width: 520px) {\n h1.pagetitle {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n\n .firstnav {\n padding-top: 120px !important;\n }\n\n .product {\n width: 400px;\n }\n\n .product img {\n min-width: 400px;\n }\n}\n\n.card-view-title {\n min-width: 40% !important;\n line-height: 3.0!important;\n padding-right: 20px;\n}\n\n.card-view {\n display: table-row;\n flex-direction: column;\n}\n\n// ---------------\n\n/**\n\n COLUMN SELECTOR ICONS\n -----------------------------\n This is kind of weird, but it is necessary to prevent the column-selector code from barfing, since\n any HTML used in the UserPresenter \"title\" attribute breaks the column selector HTML.\n\n Instead, we use CSS to add the icon into the table header, which leaves the column selector\n \"title\" text as-is and hides the icon.\n\n See https://github.com/grokability/snipe-it/issues/7989\n */\nth.css-accessory > .th-inner,\nth.css-accessory-alt > .th-inner,\nth.css-barcode > .th-inner,\nth.css-component > .th-inner,\nth.css-consumable > .th-inner,\nth.css-envelope > .th-inner,\nth.css-house-flag > .th-inner,\nth.css-house-laptop > .th-inner,\nth.css-house-user > .th-inner,\nth.css-license > .th-inner,\nth.css-location > .th-inner,\nth.css-users > .th-inner,\nth.css-currency > .th-inner,\nth.css-child-locations > .th-inner,\nth.css-history > .th-inner\n{\n font-size: 0px;\n line-height: 0.75 !important;\n text-align: left;\n text-rendering: auto;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n\nth.css-location > .th-inner::before,\nth.css-accessory > .th-inner::before,\nth.css-accessory-alt > .th-inner::before,\nth.css-barcode > .th-inner::before,\nth.css-component > .th-inner::before,\nth.css-consumable > .th-inner::before,\nth.css-envelope > .th-inner::before,\nth.css-house-flag > .th-inner::before,\nth.css-house-laptop > .th-inner::before,\nth.css-house-user > .th-inner::before,\nth.css-license > .th-inner::before,\nth.css-location > .th-inner::before,\nth.css-users > .th-inner::before,\nth.css-currency > .th-inner::before,\nth.css-child-locations > .th-inner::before,\nth.css-history > .th-inner::before\n{\n display: inline-block;\n font-size: 20px;\n font-family: \"Font Awesome 5 Free\";\n font-weight: 900;\n}\n\n/**\nBEGIN ICON TABLE HEADERS\nSet the font-weight css property as 900 (For Solid), 400 (Regular or Brands), 300 (Light for pro icons).\n**/\nth.css-barcode > .th-inner::before\n{\n content: \"\\f02a\"; font-family: \"Font Awesome 5 Free\"; font-weight: 900;\n}\n\nth.css-license > .th-inner::before\n{\n content: \"\\f0c7\"; font-family: \"Font Awesome 5 Free\"; font-weight: 400;\n}\n\nth.css-consumable > .th-inner::before\n{\n content: \"\\f043\"; font-family: \"Font Awesome 5 Free\"; font-weight: 900;\n}\n\nth.css-envelope > .th-inner::before\n{\n content: \"\\f0e0\"; font-family: \"Font Awesome 5 Free\"; font-weight: 400;\n}\n\nth.css-accessory > .th-inner::before\n{\n content: \"\\f11c\"; font-family: \"Font Awesome 5 Free\"; font-weight: 400;\n}\n\nth.css-users > .th-inner::before {\n content: \"\\f0c0\"; font-family: \"Font Awesome 5 Free\"; font-size: 15px;\n}\n\nth.css-location > .th-inner::before {\n content: \"\\f3c5\"; font-family: \"Font Awesome 5 Free\"; font-size: 19px; margin-bottom: 0px;\n}\n\nth.css-component > .th-inner::before\n{\n content: \"\\f0a0\"; font-family: \"Font Awesome 5 Free\"; font-weight: 500;\n}\n\nth.css-padlock > .th-inner::before\n{\n content: \"\\f023\"; font-family: \"Font Awesome 5 Free\";\n font-weight: 800;\n padding-right: 3px;\n}\n\nth.css-house-user > .th-inner::before {\n content: \"\\e1b0\";\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\nth.css-house-flag > .th-inner::before {\n content: \"\\e50d\";\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\nth.css-house-laptop > .th-inner::before {\n content: \"\\e066\";\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\nth.css-accessory-alt > .th-inner::before {\n content: \"\\f11c\";\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\n\nth.css-child-locations > .th-inner::before {\n content: \"\\f64f\"; // change this to f51e for coins\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\n\nth.css-currency > .th-inner::before {\n content: \"\\24\"; // change this to f51e for coins\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\n\nth.css-history > .th-inner::before {\n content: \"\\f1da\"; // change this to f51e for coins\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\n\n\n.small-box .inner {\n padding-left: 15px;\n padding-right: 15px;\n padding-top: 15px;\n color: #fff;\n}\n\n\n.small-box > a:link, .small-box > a:visited, .small-box > a:hover {\n color: #fff;\n}\n\n.select2-container--default .select2-selection--single, .select2-selection .select2-selection--single {\n border: 1px solid #d2d6de;\n border-radius: 0;\n padding: 6px 12px;\n height: 34px;\n}\n\n.form-group.has-error label, .form-group.has-error .help-block {\n color: #a94442;\n}\n\n.select2-container--default .select2-selection--multiple {\n border-radius: 0px;\n}\n\n@media screen and (max-width: 511px){\n .tab-content .tab-pane .alert-block {\n margin-top: 120px\n }\n .sidebar-menu{\n margin-top:160px;\n }\n}\n@media screen and (max-width: 912px) and (min-width: 512px){\n .sidebar-menu {\n margin-top:100px\n }\n .navbar-custom-menu > .navbar-nav > li.dropdown.user.user-menu {\n float:right;\n }\n .navbar-custom-menu > .navbar-nav > li > .dropdown-menu {\n margin-right:-39px;\n }\n}\n\n@media screen and (max-width: 1268px) and (min-width: 912px){\n .sidebar-menu {\n margin-top:50px\n }\n}\n@media screen and (max-width: 992px){\n .info-stack-container {\n flex-direction: column;\n }\n .col-md-3.col-xs-12.col-sm-push-9.info-stack{\n left:auto;\n order:1;\n }\n .col-md-9.col-xs-12.col-sm-pull-3.info-stack{\n right:auto;\n order:2;\n }\n .info-stack-container > .col-md-9.col-xs-12.col-sm-pull-3.info-stack > .row-new-striped > .row > .col-sm-2{\n width:auto;\n float:none;\n }\n}\n@media screen and (max-width: 992px){\n .row-new-striped div{\n width:100%;\n }\n}\n\n@media screen and (max-width: 1318px) and (min-width: 1200px){\n .admin.box{\n height:170px;\n }\n}\n@media screen and (max-width: 1494px) and (min-width: 1200px){\n .dashboard.small-box{\n white-space: nowrap;\n text-overflow: ellipsis;\n max-width: 188px;\n display: block;\n overflow: hidden;\n }\n}\n\n/** Form-stuff overrides for checkboxes and stuff **/\n\nlabel.form-control {\n display: grid;\n grid-template-columns: 1.8em auto;\n gap: 0.5em;\n border: 0px;\n padding-left: 0px;\n background-color: inherit;\n color: inherit;\n font-size: inherit;\n font-weight: inherit;\n}\n\nlabel.form-control--disabled {\n color: #959495;\n cursor: not-allowed;\n}\n\n\n/** --------------------------------------- **/\n/** Start checkbox styles to replace iCheck **/\n/** --------------------------------------- **/\ninput[type=\"checkbox\"] {\n /* Add if not using autoprefixer */\n -webkit-appearance: none;\n appearance: none;\n /* For iOS < 15 to remove gradient background */\n background-color: #fff;\n /* Not removed via appearance */\n margin: 0;\n font: inherit;\n color: #959495;\n width: 1.8em;\n height: 1.8em;\n border: 0.05em solid;\n border-radius: 0em;\n transform: translateY(-0.075em);\n display: grid;\n place-content: center;\n /*Windows High Contrast Mode*/\n}\n\n/** This sets the display of a checkbox, and what the \"fill\" checkmark should look like */\n\ninput[type=\"checkbox\"]::before {\n\n /** If you want to use the non-checkbox, filled square, use this instead **/\n content: \"\";\n width: 1em;\n height: 1em;\n transform: scale(0);\n transition: 120ms transform ease-in-out;\n box-shadow: inset 1em 1em rgb(211, 211, 211);\n\n content: \"\";\n width: 1em;\n height: 1em;\n clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%);\n transform: scale(0);\n transform-origin: bottom left;\n transition: 120ms transform ease-in-out;\n box-shadow: inset 1em 1em #428bca;\n /* Windows High Contrast Mode */\n background-color: CanvasText;\n}\n\n/** This sets the size of the scale up for the shape we defined above **/\ninput[type=\"checkbox\"]:checked::before {\n transform: scale(1);\n}\n\n/** This sets the scale and color of the DISABLED but CHECKED checkbox */\ninput[type=checkbox]:disabled::before, input[type=radio]:disabled::before {\n content: \"\";\n width: 1em;\n height: 1em;\n transform: scale(1);\n box-shadow: inset 1em 1em rgb(211, 211, 211);\n}\n\n/* This sets the scale and style of a DISABLED checkbox that is NOT checked */\ninput[type=checkbox]:disabled:not(:checked)::before, input[type=radio]:disabled:not(:checked)::before {\n content: \"\";\n transform: scale(0);\n cursor: not-allowed;\n pointer-events:none;\n}\n\n/** this is the color of the checkbox and content on a disabled, checked box **/\ninput[type=checkbox]:disabled, input[type=radio]:disabled {\n --form-control-color: rgb(211, 211, 211);\n color: #959495;\n cursor: not-allowed;\n pointer-events:none;\n}\n\n\n/** Radio styles to replace iCheck **/\n\ninput[type=\"radio\"] {\n appearance: none;\n background-color: #fff;\n margin: 0;\n font: inherit;\n color: #959495;\n width: 1.8em;\n height: 1.8em;\n border: 0.05em solid;\n border-radius: 50%;\n transform: translateY(-0.075em);\n display: grid;\n place-content: center;\n}\n\ninput[type=\"radio\"]::before {\n content: \"\";\n width: 1em;\n height: 1em;\n border-radius: 50%;\n transform: scale(0);\n transition: 120ms transform ease-in-out;\n box-shadow: inset 1em 1em #428bca;\n}\n\ninput[type=\"radio\"]:checked::before {\n transform: scale(1);\n}\n\n\n/**\n* This addresses the column selector in bootstrap-table. Without these two lines, the\n* checkbox and the with the label text that BS tables generates will\n* end up on two different lines and it looks assy.\n */\n.dropdown-item-marker input[type=checkbox] {\n font-size: 10px;\n}\n\n.bootstrap-table .fixed-table-toolbar li.dropdown-item-marker label {\n font-weight: normal;\n display: grid;\n grid-template-columns: .1em auto;\n gap: 1.5em;\n}\n\n.container.row-striped .col-md-6 {\n overflow-wrap:anywhere;\n}\n\n.nav-tabs-custom > .nav-tabs > li {\n z-index: 1;\n}\n\n.select2-container .select2-search--inline .select2-search__field{\n padding-left:15px;\n}\n\n.nav-tabs-custom > .nav-tabs > li.active {\n font-weight: bold;\n}\n\n/** --------------------------------------- **/\n/** End checkbox styles to replace iCheck **/\n/** --------------------------------------- **/\n\n/**\n/** Separator styles with text in the middle. Currently only used by the login page but\n/** could be used elsewhere.\n */\n\n.separator {\n display: flex;\n align-items: center;\n text-align: center;\n padding-top: 20px;\n color: #959495;\n}\n\n.separator::before,\n.separator::after {\n content: '';\n flex: 1;\n border-bottom: 1px solid #959495;\n}\n\n.separator:not(:empty)::before {\n margin-right: .25em;\n}\n\n.separator:not(:empty)::after {\n margin-left: .25em;\n}\n.datepicker.dropdown-menu {\n z-index: 1030 !important;\n}\n\n.sidebar-menu > li .badge {\n margin-top: 0px;\n filter: brightness(70%);\n font-size: 70%;\n}\n\n/** this is needed to override ekko-lightboxes card view styles **/\n.bootstrap-table .fixed-table-container .table tbody tr .card-view {\n display: table-row !important;\n}\n\n.form-control-static {\n padding-top: 0px;\n}\n\n\ntd.text-right.text-padding-number-cell {\n padding-right: 30px !important;\n white-space: nowrap;\n}\n\nth.text-right.text-padding-number-footer-cell {\n padding-right: 20px !important;\n white-space: nowrap;\n}\n\ncode.single-line {\n white-space: pre-wrap;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n overflow: hidden;\n max-width: 400px;\n}\n\np.monospace, span.monospace {\n font-family: monospace, monospace;\n}\n\nlegend.highlight {\n background: repeating-linear-gradient(\n 45deg,\n #222d32,\n #222d32 10px,\n #444 10px,\n #444 11px\n );\n\n color: #fff;\n font-size: 18px;\n padding: 6px 6px 6px 10px;\n}\n\nlegend.highlight a {\n color: #fff;\n cursor: pointer;\n}\n\nfieldset.bottom-padded {\n padding-bottom: 20px;\n}\n\ncaption.tableCaption {\n font-size: 18px;\n padding-left: 8px;\n}\n\n// via https://github.com/grokability/snipe-it/issues/11754\n.sidebar-toggle.btn {\n border-radius: 3px;\n box-shadow: none;\n border-top: 0px solid transparent;\n border-bottom: 0px solid transparent;\n padding-left: 15px;\n padding-right: 15px;\n padding-top: 12px;\n padding-bottom: 12px;\n margin-left: -47px;\n margin-top: 2px;\n}\n.popover.help-popover,\n.popover.help-popover .popover-content,\n.popover.help-popover .popover-body,\n.popover.help-popover .popover-title,\n.popover.help-popover .popover-header {\n color: #000;\n}\n\n.visually-hidden {\n width: 1px;\n height: 1px;\n margin: -1px;\n overflow: hidden;\n clip: rect(0,0,0,0);\n white-space: preserve;\n display: inline-block;\n}"],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"css/build/app.css","mappings":"AACA;EACE;EAGA;AAFF;AAKA;EACE;IACE;EAHF;EAMA;IACE;EAJF;AACF;AAOA;EACE;AALF;AAOA;EACE;EACA;EACA;EACA;EACA;AALF;AASA;EACE;AAPF;AAUA;EACE;EACA;AARF;AAWA;EACE;AATF;AAYA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;AAVF;AAaA;EACE;EACA;EACA;EACA;EACA;AAXF;AAcA;EACE;AAZF;AAeA;EACE;AAbF;AAgBA;EACE;EACA;AAdF;AAiBA;EACE;AAfF;AAkBA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAhBF;AAmBA;EACE;AAjBF;AAoBA;EACE;AAlBF;AAqBA;EACE;AAnBF;AAsBA;EACE;AApBF;AAuBA;EACE;EACA;EACA;AArBF;AAwBA;EACE;EACA;EACA;AAtBF;AA6BA;EACE;AA3BF;AA8BA;EACE;EACA;AA5BF;AA+BA;EACE;AA7BF;AA+BA;EACE;EACA;AA7BF;AAgCA;;EAEE;EACA;AA9BF;AAiCA;EACE;EACA;AA/BF;AAiCA;EACE;AA/BF;AAkCA;EACE;EACA;EACA;AAhCF;AAmCA;EACE;AAjCF;AAoCA;EACE;AAlCF;AAqCA;EACE;AAnCF;AAsCA;EACE;AApCF;AAuCA;EACE;AArCF;AAwCA;;;;;EAKE;AAtCF;AAyCA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAvCF;AA0CA;EACE;EACA;EACA;EACA;EACA;EACA;AAxCF;AA2CA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAzCF;AA4CA;EACE;AA1CF;AA6CA;EACE;EACA;EACA;EACA;AA3CF;AA8CA;EACE;EACA;AA5CF;AA+CA;EACE;EACA;EACA;EACA;EACA;AA7CF;AAgDA;EACE;EACA;AA9CF;AAiDA;EACE;EACA;EACA;EACA;AA/CF;AAkDA;EACE;EACA;AAhDF;AACA,cAAc;AAmDd;EACE;EACA;EACA;AAjDF;AAmDA;EACE;EACA;AAjDF;AAsDA;EACE;EACA;EACA;AApDF;AAuDA;EACE;EACA;AArDF;AAwDA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAtDF;AAyDA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAvDF;AA0DA;EACE;EACA;EACA;EACA;EACA;AAxDF;AA2DA;EACE;EACA;EACA;AAzDF;AA4DA;EACE;AA1DF;AA6DA;EACE;AA3DF;AA8DA;EACE;AA5DF;AA+DA;EACE;AA7DF;AAgEA;EACE;AA9DF;AAiEA;EACE;AA/DF;AAkEA;EACE;EACA;AAhEF;AAmEA;EACE;AAjEF;AAoEA;EACE;AAlEF;AACA,kBAAkB;AAqElB;EACE;EAEA;EACA;EACA;EApEA,gCAAgC;AAClC;AAuEA;EACE;AArEF;AAwEA;EACE;EACA;EACA;AAtEF;AAwEA;EACE;EACA;EACA;AAtEF;AAyEA;;;EACE;AArEF;AAwEA;EACE;EACA;AAtEF;AAyEA;EACE;IACE;EAvEF;EA0EA;IACE;IACA;IACA;EAxEF;AACF;AA2EA;;EAEE;EACA;EACA;AAzEF;AA4EA;EACE;AA1EF;AA6EA;;EAEE;AA3EF;AA8EA;EACE;AA5EF;AA+EA;EACE;AA7EF;AAgFA;EACE;EACA;EACA;AA9EF;AAiFA;EACE;EACA;AA/EF;AAkFA;EACE;EACA;EACA;AAhFF;AAmFA;EACE;AAjFF;ACvXA;EAkBE;ADwWF;ACtWA;EACE;EACA;EACA;EACA;EACA;ADwWF;ACvWE;;;EACE;AD2WJ;ACxWA;EACE;AD0WF;ACvWA;EACE;EACA;ADyWF;ACtWA;EACE;ADwWF;ACpWA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;ADsWF;ACnWA;EACE;EACA;EACA;EACA;EACA;ADqWF;AClWA;EACE;ADoWF;ACjWA;EACE;ADmWF;AChWA;EACE;EACA;ADkWF;AC9VA;EACE;ADgWF;AC7VA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AD+VF;AC7VA;EACE;AD+VF;AC7VA;EACE;AD+VF;AC3VA;EACE;AD6VF;AC3VA;EACE;AD6VF;ACzVA;EACE;EACA;EACA;AD2VF;ACxVA;EACE;EACA;EACA;AD0VF;ACnUA;EACE;ADqUF;AClUA;EACE;EACA;EACA;ADoUF;ACjUA;EACE;EACA;ADmUF;AChUA;EACE;ADkUF;AC/TA;EACE;EACA;ADiUF;AC9TA;;EACE;EACA;ADiUF;AC9TA;EACE;EACA;ADgUF;AC9TA;EACE;ADgUF;AC7TA;EACE;EACA;EACA;AD+TF;AC5TA;EACE;AD8TF;AC3TA;EACE;AD6TF;AC1TA;EACE;AD4TF;AC1TA;EACE;AD4TF;ACzTA;EACE;AD2TF;ACxTA;;;;EACE;AD6TF;AC1TA;;;;;EACE;ADgUF;AC7TA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AD+TF;AC7TA;EACE;EACA;EACA;EACA;EACA;EACA;AD+TF;AC7TA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AD+TF;AC7TA;EACE;AD+TF;AC7TA;EACE;EACA;EACA;EACA;AD+TF;AC7TA;EACE;EACA;AD+TF;AC7TA;EACE;EACA;EACA;EACA;EACA;AD+TF;AC7TA;EACE;EACA;AD+TF;AC7TA;EACE;EACA;EACA;EACA;AD+TF;AC5TA;EACE;EACA;AD8TF;ACzTA;EAAY;AD4TZ;AACA,cAAc;AC1Td;EAAY;EAAkC;AD8T9C;AC7TA;EAA8B;EAAY;ADiU1C;AC/TA;EAAiD;EAAgB;EAAiB;ADoUlF;ACnUA;EAA8C;EAAa;ADuU3D;ACtUA;EAA+C;EAAoB;EAAa;EAAc;EAAgB;EAAqB;EAAW;EAAW;EAAmB;EAAoB;ADkVhM;ACjVA;EAAqD;EAAc;EAAa;EAAc;EAAqB;EAAqB;EAAoB;EAAU;AD2VtK;AC1VA;EAA0C;EAAoB;EAAoB;EAAa;EAAkB;ADiWjH;AChWA;EAA0D;EAAW;EAAkB;ADqWvF;ACpWA;EAAmE;ADuWnE;ACtWA;EAAiE;ADyWjE;ACxWA;EAA6E;AD2W7E;AC1WA;EAA4E;AD6W5E;AC5WA;EAAwD;AD+WxD;AC9WA;EAA8D;ADiX9D;AChXA;EAAuD;EAAW;ADoXlE;ACnXA;EAAsD;ADsXtD;ACrXA;EAAuD;ADwXvD;AACA,kBAAkB;ACtXlB;EACE;EACA;EACA;EACA;EACA;EDwXA,gCAAgC;AAClC;ACrXA;EAkBE;ADsWF;ACnWA;EACE;ADqWF;ACjWA;;EACE;ADoWF;AClWA;;EACE;ADqWF;AClWA;EACE;EAIA;ADiWF;AC9VA;EACE;EACA;ADgWF;AC7VA;EACE;AD+VF;AC5VA;EACE;AD8VF;AC3VA;EAEE;IACE;IACA;ED4VF;ECzVA;IACE;IACA;IACA;ED2VF;ECxVA;IACE;ED0VF;ECvVA;;IACE;ED0VF;ECvVA;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EDyVF;EACA,+CAA+C;ECtV/C;IACE;EDwVF;ECrVA;IACE;EDuVF;ECpVA;IACE;EDsVF;ECnVA;IACE;EDqVF;EACA,qCAAqC;EClVrC;;IACE;EDqVF;EACA,QAAQ;EClVR;;IACE;IACA;IACA;EDqVF;EClVA;IACE;EDoVF;ECjVA;IACE;EDmVF;EChVA;IACE;IACA;IACA;EDkVF;EC/UA;IACE;IACA;EDiVF;EC9UA;;IACE;EDiVF;EC/UA;;;;;;;;;;;;IACE;ED4VF;ECzVA;IACE;ED2VF;ECzVA;IACE;ED2VF;ECzVA;IACE;ED2VF;ECzVA;IACE;ED2VF;ECzVA;IACE;ED2VF;ECzVA;IACE;ED2VF;ECzVA;IACE;ED2VF;ECzVA;IACE;ED2VF;ECzVA;IACE;ED2VF;ECzVA;IACE;ED2VF;ECzVA;IACE;ED2VF;ECzVA;IACE;ED2VF;AACF;ACtVA;EACE;ADwVF;ACrVA;EACI;EACA;ADuVJ;ACpVA;EACE;ADsVF;ACnVA;EACE;EACA;EACA;ADqVF;AChVA;EACE;EACA;OAAA;EACA;EACA;ADkVF;AC/UA;;EACE;EACA;EACA;ADkVF;AC/UA;;;EACE;ADmVF;AChVA;;EACE;ADmVF;AChVA;EACE;ADkVF;AC/UA;EACE;ADiVF;AC9UA;EACE;EACA;EACA;ADgVF;AC7UA;EACE;EACA;AD+UF;AC5UA;EACE;EACA;EACA;AD8UF;AC1UA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;AD4UF;AC1UA;;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AD6UF;AC1UA;EACE;AD4UF;ACzUA;EACE;AD2UF;ACxUA;EACE;AD0UF;ACvUA;EACE;ADyUF;ACtUA;EACE;ADwUF;ACpUA;EACE;EACA;EACA;EACA;EACA;EAGA;ADoUF;ACjUA;EACE;EACA;EACA;EACA;ADmUF;AChUA;EACE;EACA;EACA;EACA;ADkUF;AC9TA;EACE;EACA;EACA;EACA;EACA;EACA;ADgUF;AACA;;;;EAIE;AC7TF;EACE;EACA;EACA;EACA;AD+TF;AC5TA;EACE;EACA;EACA;EACA;EACA;AD8TF;AC3TA;EACE;EACA;EACA;AD6TF;AC1TA;EACE;EACA;EACA;AD4TF;ACxTA;EACE;AD0TF;AACA;;EAEE;ACrTF;EACE;IACE;IACA;EDuTF;ECpTA;IACE;EDsTF;ECnTA;IACE;EDqTF;EClTA;IACE;EDoTF;AACF;ACjTA;EACE;EACA;EACA;ADmTF;AChTA;EACE;EACA;ADkTF;AACA;;;;;;;;;;;EAWE;AC7SF;;;;;;;;;;;;;;;EAgBE;EACA;EACA;EACA;EACA;EACA;AD8SF;AC1SA;;;;;;;;;;;;;;;;EAiBE;EACA;EACA;EACA;AD2SF;AACA;;;EAGE;ACxSF;EAEE;EAAkB;EAAoC;AD2SxD;ACxSA;EAEE;EAAkB;EAAoC;AD2SxD;ACxSA;EAEE;EAAkB;EAAoC;AD2SxD;ACxSA;EAEE;EAAkB;EAAoC;AD2SxD;ACxSA;EAEE;EAAkB;EAAoC;AD2SxD;ACxSA;EACE;EAAkB;EAAoC;AD4SxD;ACzSA;EACE;EAAkB;EAAoC;EAAiB;AD8SzE;AC3SA;EAEE;EAAkB;EAAoC;AD8SxD;AC3SA;EAEE;EAAkB;EAClB;EACA;AD6SF;AC1SA;EACE;EACA;EACA;EACA;AD4SF;AC1SA;EACE;EACA;EACA;EACA;AD4SF;AC1SA;EACE;EACA;EACA;EACA;AD4SF;AC1SA;EACE;EACA;EACA;EACA;AD4SF;ACzSA;EACE;EACA;EACA;EACA;AD2SF;ACxSA;EACE;EACA;EACA;EACA;AD0SF;ACvSA;EACE;EACA;EACA;EACA;ADySF;ACrSA;EACE;EACA;EACA;EACA;ADuSF;ACnSA;;;EACE;ADuSF;ACpSA;;EACE;EACA;EACA;EACA;ADuSF;ACpSA;;EACE;ADuSF;ACpSA;EACE;ADsSF;ACnSA;EACE;IACE;EDqSF;ECnSA;IACE;EDqSF;AACF;ACnSA;EACE;IACE;EDqSF;ECnSA;IACE;EDqSF;ECnSA;IACE;EDqSF;AACF;AClSA;EACE;IACE;EDoSF;AACF;AClSA;EACE;IACE;EDoSF;EClSA;IACE;IACA;EDoSF;EClSA;IACE;IACA;EDoSF;EClSA;IACE;IACA;EDoSF;AACF;AClSA;EACE;IACE;EDoSF;AACF;ACjSA;EACE;IACE;EDmSF;AACF;ACjSA;EACE;IACE;IACA;IACA;IACA;IACA;EDmSF;AACF;AACA,oDAAoD;AC/RpD;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;ADiSF;AC9RA;EACE;EACA;ADgSF;AACA,8CAA8C;AAC9C,8CAA8C;AAC9C,8CAA8C;AC5R9C;ED8RE,kCAAkC;EC5RlC;EACA;OAAA;ED8RA,+CAA+C;EC5R/C;ED8RA,+BAA+B;EC5R/B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;ED8RA,6BAA6B;AAC/B;AACA,yFAAyF;AC1RzF;ED4RE,2EAA2E;ECpR3E;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EDqRA,+BAA+B;ECnR/B;ADqRF;AACA,wEAAwE;AClRxE;EACE;ADoRF;AACA,wEAAwE;ACjRxE;;EACE;EACA;EACA;EACA;EACA;ADoRF;AACA,6EAA6E;ACjR7E;;EACE;EACA;EACA;EACA;ADoRF;AACA,+EAA+E;ACjR/E;;EACE;EACA;EACA;EACA;ADoRF;AACA,qCAAqC;AC/QrC;EACE;KAAA;UAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;ADiRF;AC9QA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;ADgRF;AC7QA;EACE;AD+QF;AACA;;;;EAIE;AC3QF;EACE;AD6QF;AC1QA;EACE;EACA;EACA;EACA;AD4QF;ACzQA;EACE;AD2QF;ACxQA;EACE;AD0QF;ACvQA;EACE;ADyQF;ACtQA;EACE;ADwQF;AACA,8CAA8C;AAC9C,8CAA8C;AAC9C,8CAA8C;AAC9C;;;EAGE;ACnQF;EACE;EACA;EACA;EACA;EACA;ADqQF;AClQA;;EAEE;EACA;EACA;ADoQF;ACjQA;EACE;ADmQF;AChQA;EACE;ADkQF;AChQA;EACE;ADkQF;AC/PA;EACE;EACA;EACA;ADiQF;AACA,kEAAkE;AC9PlE;EACE;ADgQF;AC7PA;EACE;AD+PF;AC3PA;EACE;EACA;AD6PF;AC1PA;EACE;EACA;AD4PF;ACzPA;EACE;EACA;EACA;EACA;EACA;EACA;AD2PF;ACxPA;;EACE;AD2PF;ACxPA;EACE;EAQA;EACA;EACA;ADmPF;AChPA;EACE;EACA;ADkPF;AC/OA;EACE;ADiPF;AC9OA;EACE;EACA;ADgPF;AC5OA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AD8OF;AC5OA;;;;;EAKE;AD8OF;AC3OA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;AD6OF;AC1OA;EACE;AD4OF","sources":["webpack:///./resources/assets/less/app.less","webpack:///./resources/assets/less/overrides.less"],"sourcesContent":["\nbody {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\", \"Oxygen\",\n \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\",\n sans-serif;\n font-size: 13px;\n}\n// Moved from default.blade.php\n@media (max-width: 400px) {\n .navbar-left {\n margin: 2px;\n }\n\n .nav::after {\n clear: none;\n }\n}\n\n.skin-blue .main-header .logo {\n background-color: inherit !important;\n}\n.main-header .logo {\n width: 100% !important;\n white-space: nowrap;\n text-align: left;\n display: block;\n clear: both;\n //text-overflow: hidden;\n}\n\n.huge {\n font-size: 40px;\n}\n\n.btn-file {\n position: relative;\n overflow: hidden;\n}\n\n.dropdown-menu > li > a {\n color: #354044;\n}\n\n#sort tr.cansort {\n border-radius: 2px;\n padding: 10px;\n background: #f4f4f4;\n margin-bottom: 3px;\n border-left: 2px solid #e6e7e8;\n color: #444;\n cursor: move;\n}\n\n.user-image-inline {\n float: left;\n width: 25px;\n height: 25px;\n border-radius: 50%;\n margin-right: 10px;\n}\n\n.input-group .input-group-addon {\n background-color: #f4f4f4;\n}\n\na.accordion-header {\n color: #333;\n}\n\n.dynamic-form-row {\n padding: 10px;\n margin: 20px;\n}\n\n.handle {\n padding-left: 10px;\n}\n\n.btn-file input[type=\"file\"] {\n position: absolute;\n top: 0;\n right: 0;\n min-width: 100%;\n min-height: 100%;\n font-size: 100px;\n text-align: right;\n filter: alpha(opacity=0);\n opacity: 0;\n outline: none;\n background: white;\n cursor: inherit;\n display: block;\n}\n\n.main-footer {\n font-size: 13px;\n}\n\n.main-header {\n max-height: 150px;\n}\n\n.navbar-nav > .user-menu > .dropdown-menu {\n width: inherit;\n}\n\n.main-header .logo {\n padding: 0px 5px 0px 15px;\n}\n\n.sidebar-toggle {\n margin-left: -48px;\n z-index: 100;\n background-color: inherit;\n}\n\n.sidebar-toggle-mobile {\n z-index: 100;\n width: 50px;\n padding-top: 10px;\n}\n\n// .skin-blue .main-header .navbar .dropdown-menu li a {\n// //color: inherit;\n// }\n\n.main-header .sidebar-toggle:before {\n content: \"\\f0c9\";\n}\n\n.direct-chat-contacts {\n padding: 10px;\n height: 150px;\n}\n\n.select2-container {\n width: 100%;\n}\n.error input {\n color: #a94442;\n border: 2px solid #a94442 !important;\n}\n\n.error label,\n.alert-msg {\n color: #a94442;\n display: block;\n}\n\n.input-group[class*=\"col-\"] {\n padding-right: 15px;\n padding-left: 15px;\n}\n.control-label.multiline {\n padding-top: 10px;\n}\n\n.btn-outline {\n color: inherit;\n background-color: transparent;\n transition: all 0.5s;\n}\n\n.btn-primary.btn-outline {\n color: #428bca;\n}\n\n.btn-success.btn-outline {\n color: #5cb85c;\n}\n\n.btn-info.btn-outline {\n color: #5bc0de;\n}\n\n.btn-warning.btn-outline {\n color: #f0ad4e;\n}\n\n.btn-danger.btn-outline {\n color: #d9534f;\n}\n\n.btn-primary.btn-outline:hover,\n.btn-success.btn-outline:hover,\n.btn-info.btn-outline:hover,\n.btn-warning.btn-outline:hover,\n.btn-danger.btn-outline:hover {\n color: #fff;\n}\n\n.slideout-menu {\n position: fixed;\n top: 0;\n right: -250px;\n width: 250px;\n height: 100%;\n background: #333;\n z-index: 100;\n margin-top: 100px;\n color: white;\n padding: 10px;\n}\n\n.slideout-menu h3 {\n position: relative;\n padding: 5px 5px;\n color: #fff;\n font-size: 1.2em;\n font-weight: 400;\n border-bottom: 4px solid #222;\n}\n\n.slideout-menu .slideout-menu-toggle {\n position: absolute;\n top: 12px;\n right: 10px;\n display: inline-block;\n padding: 6px 9px 5px;\n font-family: Arial, sans-serif;\n font-weight: bold;\n line-height: 1;\n background: #222;\n color: #999;\n text-decoration: none;\n vertical-align: top;\n}\n\n.slideout-menu .slideout-menu-toggle:hover {\n color: #fff;\n}\n\n.slideout-menu ul {\n list-style: none;\n font-weight: 300;\n border-top: 1px solid #151515;\n border-bottom: 1px solid #454545;\n}\n\n.slideout-menu ul li {\n border-top: 1px solid #454545;\n border-bottom: 1px solid #151515;\n}\n\n.slideout-menu ul li a {\n position: relative;\n display: block;\n padding: 10px;\n color: #999;\n text-decoration: none;\n}\n\n.slideout-menu ul li a:hover {\n background: #000;\n color: #fff;\n}\n\n.slideout-menu ul li a i {\n position: absolute;\n top: 15px;\n right: 10px;\n opacity: 0.5;\n}\n\n.btn-box-tool-lg {\n font-size: 16px;\n color: orange;\n}\n\n/*Form Wizard*/\n.bs-wizard {\n margin-top: 20px;\n border-bottom: solid 1px #e0e0e0;\n padding: 0 0 10px 0;\n}\n.bs-wizard > .bs-wizard-step {\n padding: 0;\n position: relative;\n}\n\n// .bs-wizard > .bs-wizard-step + .bs-wizard-step {}\n\n.bs-wizard > .bs-wizard-step .bs-wizard-stepnum {\n color: #595959;\n font-size: 16px;\n margin-bottom: 5px;\n}\n\n.bs-wizard > .bs-wizard-step .bs-wizard-info {\n color: #999;\n font-size: 14px;\n}\n\n.bs-wizard > .bs-wizard-step > .bs-wizard-dot {\n position: absolute;\n width: 30px;\n height: 30px;\n display: block;\n background: #fbe8aa;\n top: 45px;\n left: 50%;\n margin-top: -15px;\n margin-left: -15px;\n border-radius: 50%;\n}\n\n.bs-wizard > .bs-wizard-step > .bs-wizard-dot:after {\n content: \" \";\n width: 14px;\n height: 14px;\n background: #fbbd19;\n border-radius: 50px;\n position: absolute;\n top: 8px;\n left: 8px;\n}\n\n.bs-wizard > .bs-wizard-step > .progress {\n position: relative;\n border-radius: 0px;\n height: 8px;\n box-shadow: none;\n margin: 20px 0;\n}\n\n.bs-wizard > .bs-wizard-step > .progress > .progress-bar {\n width: 0px;\n box-shadow: none;\n background: #fbe8aa;\n}\n\n.bs-wizard > .bs-wizard-step.complete > .progress > .progress-bar {\n width: 100%;\n}\n\n.bs-wizard > .bs-wizard-step.active > .progress > .progress-bar {\n width: 50%;\n}\n\n.bs-wizard > .bs-wizard-step:first-child.active > .progress > .progress-bar {\n width: 0%;\n}\n\n.bs-wizard > .bs-wizard-step:last-child.active > .progress > .progress-bar {\n width: 100%;\n}\n\n.bs-wizard > .bs-wizard-step.disabled > .bs-wizard-dot {\n background-color: #f5f5f5;\n}\n\n.bs-wizard > .bs-wizard-step.disabled > .bs-wizard-dot:after {\n opacity: 0;\n}\n\n.bs-wizard > .bs-wizard-step:first-child > .progress {\n left: 50%;\n width: 50%;\n}\n\n.bs-wizard > .bs-wizard-step:last-child > .progress {\n width: 50%;\n}\n\n.bs-wizard > .bs-wizard-step.disabled a.bs-wizard-dot {\n pointer-events: none;\n}\n/*END Form Wizard*/\n\n.left-navblock {\n display: inline-block;\n // float: left;\n text-align: left;\n color: white;\n padding: 0px;\n /* adjust based on your layout */\n}\n\na.logo.no-hover a:hover {\n background-color: transparent;\n}\n\n.index-block {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.index-block:hover{\n overflow: visible;\n white-space: normal;\n height:auto;\n}\n\ninput:required, select:required, textarea:required {\n border-right: 6px solid orange;\n}\n\n.sidebar-menu {\n font-size: 14px;\n white-space: normal;\n}\n\n@media print {\n a[href]:after {\n content: none;\n }\n\n .tab-content > .tab-pane {\n display: block !important;\n opacity: 1 !important;\n visibility: visible !important;\n }\n}\n\nimg.navbar-brand-img,\n.navbar-brand > img {\n float: left;\n padding: 5px 5px 5px 0;\n max-height: 50px;\n}\n\n.input-daterange {\n border-radius: 0px;\n}\n\n.btn.bg-maroon,\n.btn.bg-purple {\n min-width: 90px;\n}\n\n[hidden] {\n display: none !important;\n}\n\n#toolbar {\n margin-top: 10px;\n}\n\n#uploadPreview {\n border-color: grey;\n border-width: 1px;\n border-style: solid;\n}\n\n.icon-med {\n font-size: 20px;\n color: #889195;\n}\n\n#login-logo {\n padding-top: 20px;\n padding-bottom: 10px;\n max-width: 200px;\n}\n\n.left-navblock {\n max-width: 500px;\n}\n\n@import \"overrides.less\";",".skin-red\n.skin-purple\n.skin-blue\n.skin-black\n.skin-orange\n.skin-yellow\n.skin-green\n.skin-red-dark\n.skin-purple-dark\n.skin-blue-dark\n.skin-black-dark\n.skin-orange-dark\n.skin-yellow-dark\n.skin-green-dark\n.skin-contrast\n.main-header\n\n.logo {\n background-color: inherit;\n}\n.main-header .logo {\n width: 100% !important;\n white-space: nowrap;\n text-align: left;\n display: block;\n clear: both;\n &a:link, a:hover, a:visited {\n color: #fff\n }\n}\n.huge {\n font-size: 40px;\n}\n\n.btn-file {\n position: relative;\n overflow: hidden;\n}\n\n.dropdown-menu>li>a {\n color: #354044;\n}\n\n\n#sort tr.cansort {\n border-radius: 2px;\n padding: 10px;\n background: #f4f4f4;\n margin-bottom: 3px;\n border-inline: 2px solid #e6e7e8;\n color: #444;\n cursor: move;\n}\n\n.user-image-inline {\n float: left;\n width: 25px;\n height: 25px;\n border-radius: 50%;\n margin-right: 10px;\n}\n\n.input-group .input-group-addon {\n background-color: #f4f4f4;\n}\n\na.accordion-header {\n color: #333;\n}\n\n.dynamic-form-row {\n padding: 10px;\n margin: 20px;\n}\n\n\n.handle {\n padding-left: 10px;\n}\n\n.btn-file input[type=file] {\n position: absolute;\n top: 0;\n right: 0;\n min-width: 100%;\n min-height: 100%;\n font-size: 100px;\n text-align: right;\n filter: alpha(opacity=0);\n opacity: 0;\n outline: none;\n background: white;\n cursor: inherit;\n display: block;\n}\n.main-footer {\n font-size: 13px;\n}\n.main-header {\n max-height: 150px;\n}\n\n\n.navbar-nav>.user-menu>.dropdown-menu {\n width: inherit;\n}\n.main-header .logo {\n padding: 0px 5px 0px 15px;\n}\n\n\n.sidebar-toggle {\n margin-left: -48px;\n z-index: 100;\n background-color: inherit;\n}\n\n.sidebar-toggle-mobile {\n z-index: 100;\n width: 50px;\n padding-top: 10px;\n}\n\n.skin-red\n.skin-purple\n.skin-blue\n.skin-black\n.skin-orange\n.skin-yellow\n.skin-green\n.skin-red-dark\n.skin-purple-dark\n.skin-blue-dark\n.skin-black-dark\n.skin-orange-dark\n.skin-yellow-dark\n.skin-green-dark\n.skin-contrast\n.main-header\n.navbar\n.dropdown-menu li a {\n //color: inherit;\n}\n.pull-text-right{\n text-align: right !important;\n}\n\n.main-header .sidebar-toggle:before {\n content: \"\\f0c9\";\n font-weight: 900;\n font-family: 'Font Awesome\\ 5 Free';\n}\n\n.direct-chat-contacts {\n padding: 10px;\n height: 150px;\n}\n\n.select2-container {\n width: 100%;\n}\n\n.error input {\n color: #a94442;\n border: 2px solid #a94442 !important;\n}\n\n.error label, .alert-msg {\n color: #a94442;\n display: block;\n}\n\n.input-group[class*=\"col-\"] {\n padding-right: 15px;\n padding-left: 15px;\n}\n.control-label.multiline {\n padding-top: 10px;\n}\n\n.btn-outline {\n color: inherit;\n background-color: transparent;\n transition: all .5s;\n}\n\n.btn-primary.btn-outline {\n color: #428bca;\n}\n\n.btn-success.btn-outline {\n color: #5cb85c;\n}\n\n.btn-info.btn-outline {\n color: #5bc0de;\n}\n.btn-warning{\n background-color:#f39c12 !important;\n}\n\n.btn-warning.btn-outline {\n color: #f0ad4e;\n}\n\n.btn-danger.btn-outline, a.link-danger:link, a.link-danger:visited, a.link-danger:hover {\n color: #dd4b39;\n}\n\n.btn-primary.btn-outline:hover, .btn-success.btn-outline:hover, .btn-info.btn-outline:hover, .btn-warning.btn-outline:hover, .btn-danger.btn-outline:hover {\n color: #fff;\n}\n\n.slideout-menu {\n position: fixed;\n top: 0;\n right: -250px;\n width: 250px;\n height: 100%;\n background: #333;\n z-index: 100;\n margin-top: 100px;\n color: white;\n padding: 10px;\n}\n.slideout-menu h3 {\n position: relative;\n padding: 5px 5px;\n color: #fff;\n font-size: 1.2em;\n font-weight: 400;\n border-bottom: 4px solid #222;\n}\n.slideout-menu .slideout-menu-toggle {\n position: absolute;\n top: 12px;\n right: 10px;\n display: inline-block;\n padding: 6px 9px 5px;\n font-family: Arial, sans-serif;\n font-weight: bold;\n line-height: 1;\n background: #222;\n color: #999;\n text-decoration: none;\n vertical-align: top;\n}\n.slideout-menu .slideout-menu-toggle:hover {\n color: #fff;\n}\n.slideout-menu ul {\n list-style: none;\n font-weight: 300;\n border-top: 1px solid #151515;\n border-bottom: 1px solid #454545;\n}\n.slideout-menu ul li {\n border-top: 1px solid #454545;\n border-bottom: 1px solid #151515;\n}\n.slideout-menu ul li a {\n position: relative;\n display: block;\n padding: 10px;\n color: #999;\n text-decoration: none;\n}\n.slideout-menu ul li a:hover {\n background: #000;\n color: #fff;\n}\n.slideout-menu ul li a i {\n position: absolute;\n top: 15px;\n right: 10px;\n opacity: .5;\n}\n\n.btn-box-tool-lg {\n font-size: 16px;\n color: orange;\n}\n\n\n\n.bs-wizard {margin-top: 20px;}\n\n/*Form Wizard*/\n.bs-wizard {border-bottom: solid 1px #e0e0e0; padding: 0 0 10px 0;}\n.bs-wizard > .bs-wizard-step {padding: 0; position: relative;}\n.bs-wizard > .bs-wizard-step + .bs-wizard-step {}\n.bs-wizard > .bs-wizard-step .bs-wizard-stepnum {color: #595959; font-size: 16px; margin-bottom: 5px;}\n.bs-wizard > .bs-wizard-step .bs-wizard-info {color: #999; font-size: 14px;}\n.bs-wizard > .bs-wizard-step > .bs-wizard-dot {position: absolute; width: 30px; height: 30px; display: block; background: #fbe8aa; top: 45px; left: 50%; margin-top: -15px; margin-left: -15px; border-radius: 50%;}\n.bs-wizard > .bs-wizard-step > .bs-wizard-dot:after {content: ' '; width: 14px; height: 14px; background: #fbbd19; border-radius: 50px; position: absolute; top: 8px; left: 8px; }\n.bs-wizard > .bs-wizard-step > .progress {position: relative; border-radius: 0px; height: 8px; box-shadow: none; margin: 20px 0;}\n.bs-wizard > .bs-wizard-step > .progress > .progress-bar {width:0px; box-shadow: none; background: #fbe8aa;}\n.bs-wizard > .bs-wizard-step.complete > .progress > .progress-bar {width:100%;}\n.bs-wizard > .bs-wizard-step.active > .progress > .progress-bar {width:50%;}\n.bs-wizard > .bs-wizard-step:first-child.active > .progress > .progress-bar {width:0%;}\n.bs-wizard > .bs-wizard-step:last-child.active > .progress > .progress-bar {width: 100%;}\n.bs-wizard > .bs-wizard-step.disabled > .bs-wizard-dot {background-color: #f5f5f5;}\n.bs-wizard > .bs-wizard-step.disabled > .bs-wizard-dot:after {opacity: 0;}\n.bs-wizard > .bs-wizard-step:first-child > .progress {left: 50%; width: 50%;}\n.bs-wizard > .bs-wizard-step:last-child > .progress {width: 50%;}\n.bs-wizard > .bs-wizard-step.disabled a.bs-wizard-dot{ pointer-events: none; }\n/*END Form Wizard*/\n\n.left-navblock {\n display: inline-block;\n float: left;\n text-align: left;\n color: white;\n padding: 0px;\n /* adjust based on your layout */\n\n}\n.skin-red\n.skin-purple\n.skin-blue\n.skin-black\n.skin-orange\n.skin-yellow\n.skin-green\n.skin-red-dark\n.skin-purple-dark\n.skin-blue-dark\n.skin-black-dark\n.skin-orange-dark\n.skin-yellow-dark\n.skin-green-dark\n.skin-contrast\n.main-header\n.navbar\n.dropdown-menu li a {\n color: #333;\n}\n\na.logo.no-hover a:hover {\n background-color: transparent;\n}\n\n\ninput:required, select:required {\n border-right: 5px solid orange;\n}\nselect:required + .select2-container .select2-selection, select:required + .select2-container .select2-selection .select2-selection--multiple {\n border-right: 5px solid orange !important;\n}\n\nbody {\n font-family: -apple-system, BlinkMacSystemFont,\n \"Segoe UI\", \"Roboto\", \"Oxygen\", \"Ubuntu\", \"Cantarell\",\n \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\",\n sans-serif;\n font-size: 13px;\n}\n\n.sidebar-menu {\n font-size: 14px;\n white-space: normal;\n}\n\n.modal-warning .modal-help {\n color: #fff8af;\n}\n\n.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading {\n z-index: 0 !important;\n}\n\n@media print {\n\n @page {\n size: A4;\n margin: 0mm;\n }\n\n .tab-content > .tab-pane {\n display: block !important;\n opacity: 1 !important;\n visibility: visible !important;\n }\n\n .img-responsive {\n width: 200px;\n }\n\n html, body {\n width: 1024px;\n }\n\n body {\n margin: 0 auto;\n line-height: 1em;\n word-spacing:1px;\n letter-spacing:0.2px;\n font: 15px \"Times New Roman\", Times, serif;\n background:white;\n color:black;\n width: 100%;\n float: none;\n }\n\n /* avoid page-breaks inside a listingContainer*/\n .listingContainer {\n page-break-inside: avoid;\n }\n\n h1 {\n font: 28px \"Times New Roman\", Times, serif;\n }\n\n h2 {\n font: 24px \"Times New Roman\", Times, serif;\n }\n\n h3 {\n font: 20px \"Times New Roman\", Times, serif;\n }\n\n /* Improve colour contrast of links */\n a:link, a:visited {\n color: #781351\n }\n\n /* URL */\n a:link, a:visited {\n background: transparent;\n color:#333;\n text-decoration:none;\n }\n\n a[href]:after {\n content: \"\" !important;\n }\n\n a[href^=\"http://\"] {\n color:#000;\n }\n\n #header {\n height:75px;\n font-size: 24pt;\n color:black\n }\n\n div.row-new-striped {\n margin: 0px;\n padding: 0px;\n }\n\n .pagination-detail, .fixed-table-toolbar {\n visibility: hidden;\n }\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 .col-sm-pull-3 .col-sm-push-9 {\n float: left;\n }\n\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666666666666%;\n }\n .col-sm-10 {\n width: 83.33333333333334%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666666666666%;\n }\n .col-sm-7 {\n width: 58.333333333333336%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666666666667%;\n }\n .col-sm-4 {\n width: 33.33333333333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.666666666666664%;\n }\n .col-sm-1 {\n width: 8.333333333333332%;\n }\n\n}\n\n\n.select2-selection__choice__remove {\n color: white !important;\n}\n\n.select2-selection--multiple {\n border-color: #d2d6de !important;\n overflow-y: auto;\n}\n\n.select2-selection__choice {\n border-radius: 0px !important;\n}\n\n.select2-search select2-search--inline {\n height: 35px !important;\n float: left;\n margin: 0;\n}\n\n\n\n.select2-results__option {\n padding: 5px;\n user-select: none;\n -webkit-user-select: none;\n margin: 0px;\n}\n\nimg.navbar-brand-img, .navbar-brand>img {\n float: left;\n padding: 5px 5px 5px 0;\n max-height: 50px;\n}\n\n.input-daterange, .input-daterange input:first-child, .input-daterange input:last-child {\n border-radius: 0px !important;\n}\n\n.btn.bg-maroon, .btn.bg-purple{\n min-width:90px;\n}\n\n[hidden] {\n display: none !important;\n}\n\n#toolbar {\n margin-top: 10px;\n}\n\n#uploadPreview {\n border-color: grey;\n border-width: 1px;\n border-style: solid\n}\n\n.icon-med {\n font-size: 14px;\n color: #889195;\n}\n\n#login-logo {\n padding-top: 20px;\n padding-bottom: 10px;\n max-width: 200px\n}\n\n// accessibility skip link\na.skip-main {\n left:-999px;\n position:absolute;\n top:auto;\n width:1px;\n height:1px;\n overflow:hidden;\n z-index:-999;\n}\na.skip-main:focus, a.skip-main:active {\n color: #fff;\n background-color:#000;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow:auto;\n margin: 10px 35%;\n padding:5px;\n border-radius: 15px;\n border:4px solid yellow;\n text-align:center;\n font-size:1.2em;\n z-index:999;\n}\n\nh2 {\n font-size: 22px;\n}\n\nh2.task_menu {\n font-size: 14px;\n}\n\nh2 small {\n font-size: 85%;\n}\n\nh3 {\n font-size: 20px;\n}\n\nh4 {\n font-size: 16px;\n}\n\n\n.row-striped {\n vertical-align: top;\n line-height: 2.6;\n padding: 0px;\n margin-left: 20px;\n box-sizing: border-box;\n //border-left: 1px solid #dddddd;\n //border-right: 1px solid #dddddd;\n display: table;\n}\n\n.row-striped .row:nth-of-type(odd) div {\n background-color: #f9f9f9;\n border-top: 1px solid #dddddd;\n display: table-cell;\n word-wrap: break-word;\n}\n\n.row-striped .row:nth-of-type(even) div {\n background: #FFFFFF;\n border-top: 1px solid #dddddd;\n display: table-cell;\n word-wrap: break-word;\n}\n\n\n.row-new-striped {\n vertical-align: top;\n padding: 3px;\n display: table;\n width: 100%;\n word-wrap: break-word;\n table-layout:fixed;\n}\n\n/**\n* NEW STRIPING\n* This section is for the new row striping for nicer \n* display for non-table data as of v6\n**/\n.row-new-striped > .row:nth-of-type(even) {\n background: #FFFFFF;\n border-top: 1px solid #dddddd;\n line-height: 1.9;\n display: table-row;\n}\n\n.row-new-striped > .row:nth-of-type(odd) {\n background-color: #F8F8F8;\n border-top: 1px solid #dddddd;\n display: table-row;\n line-height: 1.9;\n padding: 2px;\n}\n\n.row-new-striped div {\n display: table-cell;\n border-top: 1px solid #dddddd;\n padding: 6px;\n}\n\n.row-new-striped div {\n display: table-cell;\n border-top: 1px solid #dddddd;\n padding: 6px;\n}\n\n\n.row-new-striped div[class^=\"col\"]:first-child {\n font-weight: bold;\n}\n\n\n\n/**\n* This just adds a little extra padding on mobile\n**/\n@media only screen and (max-width: 520px) {\n h1.pagetitle {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n\n .firstnav {\n padding-top: 120px !important;\n }\n\n .product {\n width: 400px;\n }\n\n .product img {\n min-width: 400px;\n }\n}\n\n.card-view-title {\n min-width: 40% !important;\n line-height: 3.0!important;\n padding-right: 20px;\n}\n\n.card-view {\n display: table-row;\n flex-direction: column;\n}\n\n// ---------------\n\n/**\n\n COLUMN SELECTOR ICONS\n -----------------------------\n This is kind of weird, but it is necessary to prevent the column-selector code from barfing, since\n any HTML used in the UserPresenter \"title\" attribute breaks the column selector HTML.\n\n Instead, we use CSS to add the icon into the table header, which leaves the column selector\n \"title\" text as-is and hides the icon.\n\n See https://github.com/grokability/snipe-it/issues/7989\n */\nth.css-accessory > .th-inner,\nth.css-accessory-alt > .th-inner,\nth.css-barcode > .th-inner,\nth.css-component > .th-inner,\nth.css-consumable > .th-inner,\nth.css-envelope > .th-inner,\nth.css-house-flag > .th-inner,\nth.css-house-laptop > .th-inner,\nth.css-house-user > .th-inner,\nth.css-license > .th-inner,\nth.css-location > .th-inner,\nth.css-users > .th-inner,\nth.css-currency > .th-inner,\nth.css-child-locations > .th-inner,\nth.css-history > .th-inner\n{\n font-size: 0px;\n line-height: 0.75 !important;\n text-align: left;\n text-rendering: auto;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n\nth.css-location > .th-inner::before,\nth.css-accessory > .th-inner::before,\nth.css-accessory-alt > .th-inner::before,\nth.css-barcode > .th-inner::before,\nth.css-component > .th-inner::before,\nth.css-consumable > .th-inner::before,\nth.css-envelope > .th-inner::before,\nth.css-house-flag > .th-inner::before,\nth.css-house-laptop > .th-inner::before,\nth.css-house-user > .th-inner::before,\nth.css-license > .th-inner::before,\nth.css-location > .th-inner::before,\nth.css-users > .th-inner::before,\nth.css-currency > .th-inner::before,\nth.css-child-locations > .th-inner::before,\nth.css-history > .th-inner::before\n{\n display: inline-block;\n font-size: 20px;\n font-family: \"Font Awesome 5 Free\";\n font-weight: 900;\n}\n\n/**\nBEGIN ICON TABLE HEADERS\nSet the font-weight css property as 900 (For Solid), 400 (Regular or Brands), 300 (Light for pro icons).\n**/\nth.css-barcode > .th-inner::before\n{\n content: \"\\f02a\"; font-family: \"Font Awesome 5 Free\"; font-weight: 900;\n}\n\nth.css-license > .th-inner::before\n{\n content: \"\\f0c7\"; font-family: \"Font Awesome 5 Free\"; font-weight: 400;\n}\n\nth.css-consumable > .th-inner::before\n{\n content: \"\\f043\"; font-family: \"Font Awesome 5 Free\"; font-weight: 900;\n}\n\nth.css-envelope > .th-inner::before\n{\n content: \"\\f0e0\"; font-family: \"Font Awesome 5 Free\"; font-weight: 400;\n}\n\nth.css-accessory > .th-inner::before\n{\n content: \"\\f11c\"; font-family: \"Font Awesome 5 Free\"; font-weight: 400;\n}\n\nth.css-users > .th-inner::before {\n content: \"\\f0c0\"; font-family: \"Font Awesome 5 Free\"; font-size: 15px;\n}\n\nth.css-location > .th-inner::before {\n content: \"\\f3c5\"; font-family: \"Font Awesome 5 Free\"; font-size: 19px; margin-bottom: 0px;\n}\n\nth.css-component > .th-inner::before\n{\n content: \"\\f0a0\"; font-family: \"Font Awesome 5 Free\"; font-weight: 500;\n}\n\nth.css-padlock > .th-inner::before\n{\n content: \"\\f023\"; font-family: \"Font Awesome 5 Free\";\n font-weight: 800;\n padding-right: 3px;\n}\n\nth.css-house-user > .th-inner::before {\n content: \"\\e1b0\";\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\nth.css-house-flag > .th-inner::before {\n content: \"\\e50d\";\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\nth.css-house-laptop > .th-inner::before {\n content: \"\\e066\";\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\nth.css-accessory-alt > .th-inner::before {\n content: \"\\f11c\";\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\n\nth.css-child-locations > .th-inner::before {\n content: \"\\f64f\"; // change this to f51e for coins\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\n\nth.css-currency > .th-inner::before {\n content: \"\\24\"; // change this to f51e for coins\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\n\nth.css-history > .th-inner::before {\n content: \"\\f1da\"; // change this to f51e for coins\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\n\n\n.small-box .inner {\n padding-left: 15px;\n padding-right: 15px;\n padding-top: 15px;\n color: #fff;\n}\n\n\n.small-box > a:link, .small-box > a:visited, .small-box > a:hover {\n color: #fff;\n}\n\n.select2-container--default .select2-selection--single, .select2-selection .select2-selection--single {\n border: 1px solid #d2d6de;\n border-radius: 0;\n padding: 6px 12px;\n height: 34px;\n}\n\n.form-group.has-error label, .form-group.has-error .help-block {\n color: #a94442;\n}\n\n.select2-container--default .select2-selection--multiple {\n border-radius: 0px;\n}\n\n@media screen and (max-width: 511px){\n .tab-content .tab-pane .alert-block {\n margin-top: 120px\n }\n .sidebar-menu{\n margin-top:160px;\n }\n}\n@media screen and (max-width: 912px) and (min-width: 512px){\n .sidebar-menu {\n margin-top:100px\n }\n .navbar-custom-menu > .navbar-nav > li.dropdown.user.user-menu {\n float:right;\n }\n .navbar-custom-menu > .navbar-nav > li > .dropdown-menu {\n margin-right:-39px;\n }\n}\n\n@media screen and (max-width: 1268px) and (min-width: 912px){\n .sidebar-menu {\n margin-top:50px\n }\n}\n@media screen and (max-width: 992px){\n .info-stack-container {\n flex-direction: column;\n }\n .col-md-3.col-xs-12.col-sm-push-9.info-stack{\n left:auto;\n order:1;\n }\n .col-md-9.col-xs-12.col-sm-pull-3.info-stack{\n right:auto;\n order:2;\n }\n .info-stack-container > .col-md-9.col-xs-12.col-sm-pull-3.info-stack > .row-new-striped > .row > .col-sm-2{\n width:auto;\n float:none;\n }\n}\n@media screen and (max-width: 992px){\n .row-new-striped div{\n width:100%;\n }\n}\n\n@media screen and (max-width: 1318px) and (min-width: 1200px){\n .admin.box{\n height:170px;\n }\n}\n@media screen and (max-width: 1494px) and (min-width: 1200px){\n .dashboard.small-box{\n white-space: nowrap;\n text-overflow: ellipsis;\n max-width: 188px;\n display: block;\n overflow: hidden;\n }\n}\n\n/** Form-stuff overrides for checkboxes and stuff **/\n\nlabel.form-control {\n display: grid;\n grid-template-columns: 1.8em auto;\n gap: 0.5em;\n border: 0px;\n padding-left: 0px;\n background-color: inherit;\n color: inherit;\n font-size: inherit;\n font-weight: inherit;\n}\n\nlabel.form-control--disabled {\n color: #959495;\n cursor: not-allowed;\n}\n\n\n/** --------------------------------------- **/\n/** Start checkbox styles to replace iCheck **/\n/** --------------------------------------- **/\ninput[type=\"checkbox\"] {\n /* Add if not using autoprefixer */\n -webkit-appearance: none;\n appearance: none;\n /* For iOS < 15 to remove gradient background */\n background-color: #fff;\n /* Not removed via appearance */\n margin: 0;\n font: inherit;\n color: #959495;\n width: 1.8em;\n height: 1.8em;\n border: 0.05em solid;\n border-radius: 0em;\n transform: translateY(-0.075em);\n display: grid;\n place-content: center;\n /*Windows High Contrast Mode*/\n}\n\n/** This sets the display of a checkbox, and what the \"fill\" checkmark should look like */\n\ninput[type=\"checkbox\"]::before {\n\n /** If you want to use the non-checkbox, filled square, use this instead **/\n content: \"\";\n width: 1em;\n height: 1em;\n transform: scale(0);\n transition: 120ms transform ease-in-out;\n box-shadow: inset 1em 1em rgb(211, 211, 211);\n\n content: \"\";\n width: 1em;\n height: 1em;\n clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%);\n transform: scale(0);\n transform-origin: bottom left;\n transition: 120ms transform ease-in-out;\n box-shadow: inset 1em 1em #428bca;\n /* Windows High Contrast Mode */\n background-color: CanvasText;\n}\n\n/** This sets the size of the scale up for the shape we defined above **/\ninput[type=\"checkbox\"]:checked::before {\n transform: scale(1);\n}\n\n/** This sets the scale and color of the DISABLED but CHECKED checkbox */\ninput[type=checkbox]:disabled::before, input[type=radio]:disabled::before {\n content: \"\";\n width: 1em;\n height: 1em;\n transform: scale(1);\n box-shadow: inset 1em 1em rgb(211, 211, 211);\n}\n\n/* This sets the scale and style of a DISABLED checkbox that is NOT checked */\ninput[type=checkbox]:disabled:not(:checked)::before, input[type=radio]:disabled:not(:checked)::before {\n content: \"\";\n transform: scale(0);\n cursor: not-allowed;\n pointer-events:none;\n}\n\n/** this is the color of the checkbox and content on a disabled, checked box **/\ninput[type=checkbox]:disabled, input[type=radio]:disabled {\n --form-control-color: rgb(211, 211, 211);\n color: #959495;\n cursor: not-allowed;\n pointer-events:none;\n}\n\n\n/** Radio styles to replace iCheck **/\n\ninput[type=\"radio\"] {\n appearance: none;\n background-color: #fff;\n margin: 0;\n font: inherit;\n color: #959495;\n width: 1.8em;\n height: 1.8em;\n border: 0.05em solid;\n border-radius: 50%;\n transform: translateY(-0.075em);\n display: grid;\n place-content: center;\n}\n\ninput[type=\"radio\"]::before {\n content: \"\";\n width: 1em;\n height: 1em;\n border-radius: 50%;\n transform: scale(0);\n transition: 120ms transform ease-in-out;\n box-shadow: inset 1em 1em #428bca;\n}\n\ninput[type=\"radio\"]:checked::before {\n transform: scale(1);\n}\n\n\n/**\n* This addresses the column selector in bootstrap-table. Without these two lines, the\n* checkbox and the with the label text that BS tables generates will\n* end up on two different lines and it looks assy.\n */\n.dropdown-item-marker input[type=checkbox] {\n font-size: 10px;\n}\n\n.bootstrap-table .fixed-table-toolbar li.dropdown-item-marker label {\n font-weight: normal;\n display: grid;\n grid-template-columns: .1em auto;\n gap: 1.5em;\n}\n\n.container.row-striped .col-md-6 {\n overflow-wrap:anywhere;\n}\n\n.nav-tabs-custom > .nav-tabs > li {\n z-index: 1;\n}\n\n.select2-container .select2-search--inline .select2-search__field{\n padding-left:15px;\n}\n\n.nav-tabs-custom > .nav-tabs > li.active {\n font-weight: bold;\n}\n\n/** --------------------------------------- **/\n/** End checkbox styles to replace iCheck **/\n/** --------------------------------------- **/\n\n/**\n/** Separator styles with text in the middle. Currently only used by the login page but\n/** could be used elsewhere.\n */\n\n.separator {\n display: flex;\n align-items: center;\n text-align: center;\n padding-top: 20px;\n color: #959495;\n}\n\n.separator::before,\n.separator::after {\n content: '';\n flex: 1;\n border-bottom: 1px solid #959495;\n}\n\n.separator:not(:empty)::before {\n margin-right: .25em;\n}\n\n.separator:not(:empty)::after {\n margin-left: .25em;\n}\n.datepicker.dropdown-menu {\n z-index: 1030 !important;\n}\n\n.sidebar-menu > li .badge {\n margin-top: 0px;\n filter: brightness(70%);\n font-size: 70%;\n}\n\n/** this is needed to override ekko-lightboxes card view styles **/\n.bootstrap-table .fixed-table-container .table tbody tr .card-view {\n display: table-row !important;\n}\n\n.form-control-static {\n padding-top: 0px;\n}\n\n\ntd.text-right.text-padding-number-cell {\n padding-right: 30px !important;\n white-space: nowrap;\n}\n\nth.text-right.text-padding-number-footer-cell {\n padding-right: 20px !important;\n white-space: nowrap;\n}\n\ncode.single-line {\n white-space: pre-wrap;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n overflow: hidden;\n max-width: 400px;\n}\n\np.monospace, span.monospace {\n font-family: monospace, monospace;\n}\n\nlegend.highlight {\n background: repeating-linear-gradient(\n 45deg,\n #222d32,\n #222d32 10px,\n #444 10px,\n #444 11px\n );\n\n color: #fff;\n font-size: 18px;\n padding: 6px 6px 6px 10px;\n}\n\nlegend.highlight a {\n color: #fff;\n cursor: pointer;\n}\n\nfieldset.bottom-padded {\n padding-bottom: 20px;\n}\n\ncaption.tableCaption {\n font-size: 18px;\n padding-left: 8px;\n}\n\n// via https://github.com/grokability/snipe-it/issues/11754\n.sidebar-toggle.btn {\n border-radius: 3px;\n box-shadow: none;\n border-top: 0px solid transparent;\n border-bottom: 0px solid transparent;\n padding-left: 15px;\n padding-right: 15px;\n padding-top: 12px;\n padding-bottom: 12px;\n margin-left: -47px;\n margin-top: 2px;\n}\n.popover.help-popover,\n.popover.help-popover .popover-content,\n.popover.help-popover .popover-body,\n.popover.help-popover .popover-title,\n.popover.help-popover .popover-header {\n color: #000;\n}\n\n.visually-hidden {\n width: 1px;\n height: 1px;\n margin: -1px;\n overflow: hidden;\n clip: rect(0,0,0,0);\n white-space: preserve;\n display: inline-block;\n}\n\ninput[name=\"columnsSearch\"] {\n width: 120px;\n}"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/css/build/overrides.css b/public/css/build/overrides.css index 07bf247401..1ca3a32741 100644 --- a/public/css/build/overrides.css +++ b/public/css/build/overrides.css @@ -1125,6 +1125,9 @@ caption.tableCaption { white-space: preserve; display: inline-block; } +input[name="columnsSearch"] { + width: 120px; +} /*# sourceMappingURL=overrides.css.map*/ \ No newline at end of file diff --git a/public/css/build/overrides.css.map b/public/css/build/overrides.css.map index ae304fe92a..66b4379a52 100644 --- a/public/css/build/overrides.css.map +++ b/public/css/build/overrides.css.map @@ -1 +1 @@ -{"version":3,"file":"css/build/overrides.css","mappings":"AAAA;EAkBE;AAhBF;AAkBA;EACE;EACA;EACA;EACA;EACA;AAhBF;AAiBE;;;EACE;AAbJ;AAgBA;EACE;AAdF;AAiBA;EACE;EACA;AAfF;AAkBA;EACE;AAhBF;AAoBA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;AAlBF;AAqBA;EACE;EACA;EACA;EACA;EACA;AAnBF;AAsBA;EACE;AApBF;AAuBA;EACE;AArBF;AAwBA;EACE;EACA;AAtBF;AA0BA;EACE;AAxBF;AA2BA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAzBF;AA2BA;EACE;AAzBF;AA2BA;EACE;AAzBF;AA6BA;EACE;AA3BF;AA6BA;EACE;AA3BF;AA+BA;EACE;EACA;EACA;AA7BF;AAgCA;EACE;EACA;EACA;AA9BF;AAqDA;EACE;AAnDF;AAsDA;EACE;EACA;EACA;AApDF;AAuDA;EACE;EACA;AArDF;AAwDA;EACE;AAtDF;AAyDA;EACE;EACA;AAvDF;AA0DA;;EACE;EACA;AAvDF;AA0DA;EACE;EACA;AAxDF;AA0DA;EACE;AAxDF;AA2DA;EACE;EACA;EACA;AAzDF;AA4DA;EACE;AA1DF;AA6DA;EACE;AA3DF;AA8DA;EACE;AA5DF;AA8DA;EACE;AA5DF;AA+DA;EACE;AA7DF;AAgEA;;;;EACE;AA3DF;AA8DA;;;;;EACE;AAxDF;AA2DA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAzDF;AA2DA;EACE;EACA;EACA;EACA;EACA;EACA;AAzDF;AA2DA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAzDF;AA2DA;EACE;AAzDF;AA2DA;EACE;EACA;EACA;EACA;AAzDF;AA2DA;EACE;EACA;AAzDF;AA2DA;EACE;EACA;EACA;EACA;EACA;AAzDF;AA2DA;EACE;EACA;AAzDF;AA2DA;EACE;EACA;EACA;EACA;AAzDF;AA4DA;EACE;EACA;AA1DF;AA+DA;EAAY;AA5DZ;AACA,cAAc;AA8Dd;EAAY;EAAkC;AA1D9C;AA2DA;EAA8B;EAAY;AAvD1C;AAyDA;EAAiD;EAAgB;EAAiB;AApDlF;AAqDA;EAA8C;EAAa;AAjD3D;AAkDA;EAA+C;EAAoB;EAAa;EAAc;EAAgB;EAAqB;EAAW;EAAW;EAAmB;EAAoB;AAtChM;AAuCA;EAAqD;EAAc;EAAa;EAAc;EAAqB;EAAqB;EAAoB;EAAU;AA7BtK;AA8BA;EAA0C;EAAoB;EAAoB;EAAa;EAAkB;AAvBjH;AAwBA;EAA0D;EAAW;EAAkB;AAnBvF;AAoBA;EAAmE;AAjBnE;AAkBA;EAAiE;AAfjE;AAgBA;EAA6E;AAb7E;AAcA;EAA4E;AAX5E;AAYA;EAAwD;AATxD;AAUA;EAA8D;AAP9D;AAQA;EAAuD;EAAW;AAJlE;AAKA;EAAsD;AAFtD;AAGA;EAAuD;AAAvD;AACA,kBAAkB;AAElB;EACE;EACA;EACA;EACA;EACA;EAAA,gCAAgC;AAClC;AAGA;EAkBE;AAlBF;AAqBA;EACE;AAnBF;AAuBA;;EACE;AApBF;AAsBA;;EACE;AAnBF;AAsBA;EACE;EAIA;AAvBF;AA0BA;EACE;EACA;AAxBF;AA2BA;EACE;AAzBF;AA4BA;EACE;AA1BF;AA6BA;EAEE;IACE;IACA;EA5BF;EA+BA;IACE;IACA;IACA;EA7BF;EAgCA;IACE;EA9BF;EAiCA;;IACE;EA9BF;EAiCA;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EA/BF;EACA,+CAA+C;EAkC/C;IACE;EAhCF;EAmCA;IACE;EAjCF;EAoCA;IACE;EAlCF;EAqCA;IACE;EAnCF;EACA,qCAAqC;EAsCrC;;IACE;EAnCF;EACA,QAAQ;EAsCR;;IACE;IACA;IACA;EAnCF;EAsCA;IACE;EApCF;EAuCA;IACE;EArCF;EAwCA;IACE;IACA;IACA;EAtCF;EAyCA;IACE;IACA;EAvCF;EA0CA;;IACE;EAvCF;EAyCA;;;;;;;;;;;;IACE;EA5BF;EA+BA;IACE;EA7BF;EA+BA;IACE;EA7BF;EA+BA;IACE;EA7BF;EA+BA;IACE;EA7BF;EA+BA;IACE;EA7BF;EA+BA;IACE;EA7BF;EA+BA;IACE;EA7BF;EA+BA;IACE;EA7BF;EA+BA;IACE;EA7BF;EA+BA;IACE;EA7BF;EA+BA;IACE;EA7BF;EA+BA;IACE;EA7BF;AACF;AAkCA;EACE;AAhCF;AAmCA;EACI;EACA;AAjCJ;AAoCA;EACE;AAlCF;AAqCA;EACE;EACA;EACA;AAnCF;AAwCA;EACE;EACA;OAAA;EACA;EACA;AAtCF;AAyCA;;EACE;EACA;EACA;AAtCF;AAyCA;;;EACE;AArCF;AAwCA;;EACE;AArCF;AAwCA;EACE;AAtCF;AAyCA;EACE;AAvCF;AA0CA;EACE;EACA;EACA;AAxCF;AA2CA;EACE;EACA;AAzCF;AA4CA;EACE;EACA;EACA;AA1CF;AA8CA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;AA5CF;AA8CA;;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AA3CF;AA8CA;EACE;AA5CF;AA+CA;EACE;AA7CF;AAgDA;EACE;AA9CF;AAiDA;EACE;AA/CF;AAkDA;EACE;AAhDF;AAoDA;EACE;EACA;EACA;EACA;EACA;EAGA;AApDF;AAuDA;EACE;EACA;EACA;EACA;AArDF;AAwDA;EACE;EACA;EACA;EACA;AAtDF;AA0DA;EACE;EACA;EACA;EACA;EACA;EACA;AAxDF;AACA;;;;EAIE;AA2DF;EACE;EACA;EACA;EACA;AAzDF;AA4DA;EACE;EACA;EACA;EACA;EACA;AA1DF;AA6DA;EACE;EACA;EACA;AA3DF;AA8DA;EACE;EACA;EACA;AA5DF;AAgEA;EACE;AA9DF;AACA;;EAEE;AAmEF;EACE;IACE;IACA;EAjEF;EAoEA;IACE;EAlEF;EAqEA;IACE;EAnEF;EAsEA;IACE;EApEF;AACF;AAuEA;EACE;EACA;EACA;AArEF;AAwEA;EACE;EACA;AAtEF;AACA;;;;;;;;;;;EAWE;AA2EF;;;;;;;;;;;;;;;EAgBE;EACA;EACA;EACA;EACA;EACA;AA1EF;AA8EA;;;;;;;;;;;;;;;;EAiBE;EACA;EACA;EACA;AA7EF;AACA;;;EAGE;AAgFF;EAEE;EAAkB;EAAoC;AA7ExD;AAgFA;EAEE;EAAkB;EAAoC;AA7ExD;AAgFA;EAEE;EAAkB;EAAoC;AA7ExD;AAgFA;EAEE;EAAkB;EAAoC;AA7ExD;AAgFA;EAEE;EAAkB;EAAoC;AA7ExD;AAgFA;EACE;EAAkB;EAAoC;AA5ExD;AA+EA;EACE;EAAkB;EAAoC;EAAiB;AA1EzE;AA6EA;EAEE;EAAkB;EAAoC;AA1ExD;AA6EA;EAEE;EAAkB;EAClB;EACA;AA3EF;AA8EA;EACE;EACA;EACA;EACA;AA5EF;AA8EA;EACE;EACA;EACA;EACA;AA5EF;AA8EA;EACE;EACA;EACA;EACA;AA5EF;AA8EA;EACE;EACA;EACA;EACA;AA5EF;AA+EA;EACE;EACA;EACA;EACA;AA7EF;AAgFA;EACE;EACA;EACA;EACA;AA9EF;AAiFA;EACE;EACA;EACA;EACA;AA/EF;AAmFA;EACE;EACA;EACA;EACA;AAjFF;AAqFA;;;EACE;AAjFF;AAoFA;;EACE;EACA;EACA;EACA;AAjFF;AAoFA;;EACE;AAjFF;AAoFA;EACE;AAlFF;AAqFA;EACE;IACE;EAnFF;EAqFA;IACE;EAnFF;AACF;AAqFA;EACE;IACE;EAnFF;EAqFA;IACE;EAnFF;EAqFA;IACE;EAnFF;AACF;AAsFA;EACE;IACE;EApFF;AACF;AAsFA;EACE;IACE;EApFF;EAsFA;IACE;IACA;EApFF;EAsFA;IACE;IACA;EApFF;EAsFA;IACE;IACA;EApFF;AACF;AAsFA;EACE;IACE;EApFF;AACF;AAuFA;EACE;IACE;EArFF;AACF;AAuFA;EACE;IACE;IACA;IACA;IACA;IACA;EArFF;AACF;AACA,oDAAoD;AAyFpD;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAvFF;AA0FA;EACE;EACA;AAxFF;AACA,8CAA8C;AAC9C,8CAA8C;AAC9C,8CAA8C;AA4F9C;EA1FE,kCAAkC;EA4FlC;EACA;OAAA;EA1FA,+CAA+C;EA4F/C;EA1FA,+BAA+B;EA4F/B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EA1FA,6BAA6B;AAC/B;AACA,yFAAyF;AA8FzF;EA5FE,2EAA2E;EAoG3E;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAnGA,+BAA+B;EAqG/B;AAnGF;AACA,wEAAwE;AAsGxE;EACE;AApGF;AACA,wEAAwE;AAuGxE;;EACE;EACA;EACA;EACA;EACA;AApGF;AACA,6EAA6E;AAuG7E;;EACE;EACA;EACA;EACA;AApGF;AACA,+EAA+E;AAuG/E;;EACE;EACA;EACA;EACA;AApGF;AACA,qCAAqC;AAyGrC;EACE;KAAA;UAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAvGF;AA0GA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;AAxGF;AA2GA;EACE;AAzGF;AACA;;;;EAIE;AA6GF;EACE;AA3GF;AA8GA;EACE;EACA;EACA;EACA;AA5GF;AA+GA;EACE;AA7GF;AAgHA;EACE;AA9GF;AAiHA;EACE;AA/GF;AAkHA;EACE;AAhHF;AACA,8CAA8C;AAC9C,8CAA8C;AAC9C,8CAA8C;AAC9C;;;EAGE;AAqHF;EACE;EACA;EACA;EACA;EACA;AAnHF;AAsHA;;EAEE;EACA;EACA;AApHF;AAuHA;EACE;AArHF;AAwHA;EACE;AAtHF;AAwHA;EACE;AAtHF;AAyHA;EACE;EACA;EACA;AAvHF;AACA,kEAAkE;AA0HlE;EACE;AAxHF;AA2HA;EACE;AAzHF;AA6HA;EACE;EACA;AA3HF;AA8HA;EACE;EACA;AA5HF;AA+HA;EACE;EACA;EACA;EACA;EACA;EACA;AA7HF;AAgIA;;EACE;AA7HF;AAgIA;EACE;EAQA;EACA;EACA;AArIF;AAwIA;EACE;EACA;AAtIF;AAyIA;EACE;AAvIF;AA0IA;EACE;EACA;AAxIF;AA4IA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AA1IF;AA4IA;;;;;EAKE;AA1IF;AA6IA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;AA3IF","sources":["webpack:///./resources/assets/less/overrides.less"],"sourcesContent":[".skin-red\n.skin-purple\n.skin-blue\n.skin-black\n.skin-orange\n.skin-yellow\n.skin-green\n.skin-red-dark\n.skin-purple-dark\n.skin-blue-dark\n.skin-black-dark\n.skin-orange-dark\n.skin-yellow-dark\n.skin-green-dark\n.skin-contrast\n.main-header\n\n.logo {\n background-color: inherit;\n}\n.main-header .logo {\n width: 100% !important;\n white-space: nowrap;\n text-align: left;\n display: block;\n clear: both;\n &a:link, a:hover, a:visited {\n color: #fff\n }\n}\n.huge {\n font-size: 40px;\n}\n\n.btn-file {\n position: relative;\n overflow: hidden;\n}\n\n.dropdown-menu>li>a {\n color: #354044;\n}\n\n\n#sort tr.cansort {\n border-radius: 2px;\n padding: 10px;\n background: #f4f4f4;\n margin-bottom: 3px;\n border-inline: 2px solid #e6e7e8;\n color: #444;\n cursor: move;\n}\n\n.user-image-inline {\n float: left;\n width: 25px;\n height: 25px;\n border-radius: 50%;\n margin-right: 10px;\n}\n\n.input-group .input-group-addon {\n background-color: #f4f4f4;\n}\n\na.accordion-header {\n color: #333;\n}\n\n.dynamic-form-row {\n padding: 10px;\n margin: 20px;\n}\n\n\n.handle {\n padding-left: 10px;\n}\n\n.btn-file input[type=file] {\n position: absolute;\n top: 0;\n right: 0;\n min-width: 100%;\n min-height: 100%;\n font-size: 100px;\n text-align: right;\n filter: alpha(opacity=0);\n opacity: 0;\n outline: none;\n background: white;\n cursor: inherit;\n display: block;\n}\n.main-footer {\n font-size: 13px;\n}\n.main-header {\n max-height: 150px;\n}\n\n\n.navbar-nav>.user-menu>.dropdown-menu {\n width: inherit;\n}\n.main-header .logo {\n padding: 0px 5px 0px 15px;\n}\n\n\n.sidebar-toggle {\n margin-left: -48px;\n z-index: 100;\n background-color: inherit;\n}\n\n.sidebar-toggle-mobile {\n z-index: 100;\n width: 50px;\n padding-top: 10px;\n}\n\n.skin-red\n.skin-purple\n.skin-blue\n.skin-black\n.skin-orange\n.skin-yellow\n.skin-green\n.skin-red-dark\n.skin-purple-dark\n.skin-blue-dark\n.skin-black-dark\n.skin-orange-dark\n.skin-yellow-dark\n.skin-green-dark\n.skin-contrast\n.main-header\n.navbar\n.dropdown-menu li a {\n //color: inherit;\n}\n.pull-text-right{\n text-align: right !important;\n}\n\n.main-header .sidebar-toggle:before {\n content: \"\\f0c9\";\n font-weight: 900;\n font-family: 'Font Awesome\\ 5 Free';\n}\n\n.direct-chat-contacts {\n padding: 10px;\n height: 150px;\n}\n\n.select2-container {\n width: 100%;\n}\n\n.error input {\n color: #a94442;\n border: 2px solid #a94442 !important;\n}\n\n.error label, .alert-msg {\n color: #a94442;\n display: block;\n}\n\n.input-group[class*=\"col-\"] {\n padding-right: 15px;\n padding-left: 15px;\n}\n.control-label.multiline {\n padding-top: 10px;\n}\n\n.btn-outline {\n color: inherit;\n background-color: transparent;\n transition: all .5s;\n}\n\n.btn-primary.btn-outline {\n color: #428bca;\n}\n\n.btn-success.btn-outline {\n color: #5cb85c;\n}\n\n.btn-info.btn-outline {\n color: #5bc0de;\n}\n.btn-warning{\n background-color:#f39c12 !important;\n}\n\n.btn-warning.btn-outline {\n color: #f0ad4e;\n}\n\n.btn-danger.btn-outline, a.link-danger:link, a.link-danger:visited, a.link-danger:hover {\n color: #dd4b39;\n}\n\n.btn-primary.btn-outline:hover, .btn-success.btn-outline:hover, .btn-info.btn-outline:hover, .btn-warning.btn-outline:hover, .btn-danger.btn-outline:hover {\n color: #fff;\n}\n\n.slideout-menu {\n position: fixed;\n top: 0;\n right: -250px;\n width: 250px;\n height: 100%;\n background: #333;\n z-index: 100;\n margin-top: 100px;\n color: white;\n padding: 10px;\n}\n.slideout-menu h3 {\n position: relative;\n padding: 5px 5px;\n color: #fff;\n font-size: 1.2em;\n font-weight: 400;\n border-bottom: 4px solid #222;\n}\n.slideout-menu .slideout-menu-toggle {\n position: absolute;\n top: 12px;\n right: 10px;\n display: inline-block;\n padding: 6px 9px 5px;\n font-family: Arial, sans-serif;\n font-weight: bold;\n line-height: 1;\n background: #222;\n color: #999;\n text-decoration: none;\n vertical-align: top;\n}\n.slideout-menu .slideout-menu-toggle:hover {\n color: #fff;\n}\n.slideout-menu ul {\n list-style: none;\n font-weight: 300;\n border-top: 1px solid #151515;\n border-bottom: 1px solid #454545;\n}\n.slideout-menu ul li {\n border-top: 1px solid #454545;\n border-bottom: 1px solid #151515;\n}\n.slideout-menu ul li a {\n position: relative;\n display: block;\n padding: 10px;\n color: #999;\n text-decoration: none;\n}\n.slideout-menu ul li a:hover {\n background: #000;\n color: #fff;\n}\n.slideout-menu ul li a i {\n position: absolute;\n top: 15px;\n right: 10px;\n opacity: .5;\n}\n\n.btn-box-tool-lg {\n font-size: 16px;\n color: orange;\n}\n\n\n\n.bs-wizard {margin-top: 20px;}\n\n/*Form Wizard*/\n.bs-wizard {border-bottom: solid 1px #e0e0e0; padding: 0 0 10px 0;}\n.bs-wizard > .bs-wizard-step {padding: 0; position: relative;}\n.bs-wizard > .bs-wizard-step + .bs-wizard-step {}\n.bs-wizard > .bs-wizard-step .bs-wizard-stepnum {color: #595959; font-size: 16px; margin-bottom: 5px;}\n.bs-wizard > .bs-wizard-step .bs-wizard-info {color: #999; font-size: 14px;}\n.bs-wizard > .bs-wizard-step > .bs-wizard-dot {position: absolute; width: 30px; height: 30px; display: block; background: #fbe8aa; top: 45px; left: 50%; margin-top: -15px; margin-left: -15px; border-radius: 50%;}\n.bs-wizard > .bs-wizard-step > .bs-wizard-dot:after {content: ' '; width: 14px; height: 14px; background: #fbbd19; border-radius: 50px; position: absolute; top: 8px; left: 8px; }\n.bs-wizard > .bs-wizard-step > .progress {position: relative; border-radius: 0px; height: 8px; box-shadow: none; margin: 20px 0;}\n.bs-wizard > .bs-wizard-step > .progress > .progress-bar {width:0px; box-shadow: none; background: #fbe8aa;}\n.bs-wizard > .bs-wizard-step.complete > .progress > .progress-bar {width:100%;}\n.bs-wizard > .bs-wizard-step.active > .progress > .progress-bar {width:50%;}\n.bs-wizard > .bs-wizard-step:first-child.active > .progress > .progress-bar {width:0%;}\n.bs-wizard > .bs-wizard-step:last-child.active > .progress > .progress-bar {width: 100%;}\n.bs-wizard > .bs-wizard-step.disabled > .bs-wizard-dot {background-color: #f5f5f5;}\n.bs-wizard > .bs-wizard-step.disabled > .bs-wizard-dot:after {opacity: 0;}\n.bs-wizard > .bs-wizard-step:first-child > .progress {left: 50%; width: 50%;}\n.bs-wizard > .bs-wizard-step:last-child > .progress {width: 50%;}\n.bs-wizard > .bs-wizard-step.disabled a.bs-wizard-dot{ pointer-events: none; }\n/*END Form Wizard*/\n\n.left-navblock {\n display: inline-block;\n float: left;\n text-align: left;\n color: white;\n padding: 0px;\n /* adjust based on your layout */\n\n}\n.skin-red\n.skin-purple\n.skin-blue\n.skin-black\n.skin-orange\n.skin-yellow\n.skin-green\n.skin-red-dark\n.skin-purple-dark\n.skin-blue-dark\n.skin-black-dark\n.skin-orange-dark\n.skin-yellow-dark\n.skin-green-dark\n.skin-contrast\n.main-header\n.navbar\n.dropdown-menu li a {\n color: #333;\n}\n\na.logo.no-hover a:hover {\n background-color: transparent;\n}\n\n\ninput:required, select:required {\n border-right: 5px solid orange;\n}\nselect:required + .select2-container .select2-selection, select:required + .select2-container .select2-selection .select2-selection--multiple {\n border-right: 5px solid orange !important;\n}\n\nbody {\n font-family: -apple-system, BlinkMacSystemFont,\n \"Segoe UI\", \"Roboto\", \"Oxygen\", \"Ubuntu\", \"Cantarell\",\n \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\",\n sans-serif;\n font-size: 13px;\n}\n\n.sidebar-menu {\n font-size: 14px;\n white-space: normal;\n}\n\n.modal-warning .modal-help {\n color: #fff8af;\n}\n\n.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading {\n z-index: 0 !important;\n}\n\n@media print {\n\n @page {\n size: A4;\n margin: 0mm;\n }\n\n .tab-content > .tab-pane {\n display: block !important;\n opacity: 1 !important;\n visibility: visible !important;\n }\n\n .img-responsive {\n width: 200px;\n }\n\n html, body {\n width: 1024px;\n }\n\n body {\n margin: 0 auto;\n line-height: 1em;\n word-spacing:1px;\n letter-spacing:0.2px;\n font: 15px \"Times New Roman\", Times, serif;\n background:white;\n color:black;\n width: 100%;\n float: none;\n }\n\n /* avoid page-breaks inside a listingContainer*/\n .listingContainer {\n page-break-inside: avoid;\n }\n\n h1 {\n font: 28px \"Times New Roman\", Times, serif;\n }\n\n h2 {\n font: 24px \"Times New Roman\", Times, serif;\n }\n\n h3 {\n font: 20px \"Times New Roman\", Times, serif;\n }\n\n /* Improve colour contrast of links */\n a:link, a:visited {\n color: #781351\n }\n\n /* URL */\n a:link, a:visited {\n background: transparent;\n color:#333;\n text-decoration:none;\n }\n\n a[href]:after {\n content: \"\" !important;\n }\n\n a[href^=\"http://\"] {\n color:#000;\n }\n\n #header {\n height:75px;\n font-size: 24pt;\n color:black\n }\n\n div.row-new-striped {\n margin: 0px;\n padding: 0px;\n }\n\n .pagination-detail, .fixed-table-toolbar {\n visibility: hidden;\n }\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 .col-sm-pull-3 .col-sm-push-9 {\n float: left;\n }\n\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666666666666%;\n }\n .col-sm-10 {\n width: 83.33333333333334%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666666666666%;\n }\n .col-sm-7 {\n width: 58.333333333333336%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666666666667%;\n }\n .col-sm-4 {\n width: 33.33333333333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.666666666666664%;\n }\n .col-sm-1 {\n width: 8.333333333333332%;\n }\n\n}\n\n\n.select2-selection__choice__remove {\n color: white !important;\n}\n\n.select2-selection--multiple {\n border-color: #d2d6de !important;\n overflow-y: auto;\n}\n\n.select2-selection__choice {\n border-radius: 0px !important;\n}\n\n.select2-search select2-search--inline {\n height: 35px !important;\n float: left;\n margin: 0;\n}\n\n\n\n.select2-results__option {\n padding: 5px;\n user-select: none;\n -webkit-user-select: none;\n margin: 0px;\n}\n\nimg.navbar-brand-img, .navbar-brand>img {\n float: left;\n padding: 5px 5px 5px 0;\n max-height: 50px;\n}\n\n.input-daterange, .input-daterange input:first-child, .input-daterange input:last-child {\n border-radius: 0px !important;\n}\n\n.btn.bg-maroon, .btn.bg-purple{\n min-width:90px;\n}\n\n[hidden] {\n display: none !important;\n}\n\n#toolbar {\n margin-top: 10px;\n}\n\n#uploadPreview {\n border-color: grey;\n border-width: 1px;\n border-style: solid\n}\n\n.icon-med {\n font-size: 14px;\n color: #889195;\n}\n\n#login-logo {\n padding-top: 20px;\n padding-bottom: 10px;\n max-width: 200px\n}\n\n// accessibility skip link\na.skip-main {\n left:-999px;\n position:absolute;\n top:auto;\n width:1px;\n height:1px;\n overflow:hidden;\n z-index:-999;\n}\na.skip-main:focus, a.skip-main:active {\n color: #fff;\n background-color:#000;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow:auto;\n margin: 10px 35%;\n padding:5px;\n border-radius: 15px;\n border:4px solid yellow;\n text-align:center;\n font-size:1.2em;\n z-index:999;\n}\n\nh2 {\n font-size: 22px;\n}\n\nh2.task_menu {\n font-size: 14px;\n}\n\nh2 small {\n font-size: 85%;\n}\n\nh3 {\n font-size: 20px;\n}\n\nh4 {\n font-size: 16px;\n}\n\n\n.row-striped {\n vertical-align: top;\n line-height: 2.6;\n padding: 0px;\n margin-left: 20px;\n box-sizing: border-box;\n //border-left: 1px solid #dddddd;\n //border-right: 1px solid #dddddd;\n display: table;\n}\n\n.row-striped .row:nth-of-type(odd) div {\n background-color: #f9f9f9;\n border-top: 1px solid #dddddd;\n display: table-cell;\n word-wrap: break-word;\n}\n\n.row-striped .row:nth-of-type(even) div {\n background: #FFFFFF;\n border-top: 1px solid #dddddd;\n display: table-cell;\n word-wrap: break-word;\n}\n\n\n.row-new-striped {\n vertical-align: top;\n padding: 3px;\n display: table;\n width: 100%;\n word-wrap: break-word;\n table-layout:fixed;\n}\n\n/**\n* NEW STRIPING\n* This section is for the new row striping for nicer \n* display for non-table data as of v6\n**/\n.row-new-striped > .row:nth-of-type(even) {\n background: #FFFFFF;\n border-top: 1px solid #dddddd;\n line-height: 1.9;\n display: table-row;\n}\n\n.row-new-striped > .row:nth-of-type(odd) {\n background-color: #F8F8F8;\n border-top: 1px solid #dddddd;\n display: table-row;\n line-height: 1.9;\n padding: 2px;\n}\n\n.row-new-striped div {\n display: table-cell;\n border-top: 1px solid #dddddd;\n padding: 6px;\n}\n\n.row-new-striped div {\n display: table-cell;\n border-top: 1px solid #dddddd;\n padding: 6px;\n}\n\n\n.row-new-striped div[class^=\"col\"]:first-child {\n font-weight: bold;\n}\n\n\n\n/**\n* This just adds a little extra padding on mobile\n**/\n@media only screen and (max-width: 520px) {\n h1.pagetitle {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n\n .firstnav {\n padding-top: 120px !important;\n }\n\n .product {\n width: 400px;\n }\n\n .product img {\n min-width: 400px;\n }\n}\n\n.card-view-title {\n min-width: 40% !important;\n line-height: 3.0!important;\n padding-right: 20px;\n}\n\n.card-view {\n display: table-row;\n flex-direction: column;\n}\n\n// ---------------\n\n/**\n\n COLUMN SELECTOR ICONS\n -----------------------------\n This is kind of weird, but it is necessary to prevent the column-selector code from barfing, since\n any HTML used in the UserPresenter \"title\" attribute breaks the column selector HTML.\n\n Instead, we use CSS to add the icon into the table header, which leaves the column selector\n \"title\" text as-is and hides the icon.\n\n See https://github.com/grokability/snipe-it/issues/7989\n */\nth.css-accessory > .th-inner,\nth.css-accessory-alt > .th-inner,\nth.css-barcode > .th-inner,\nth.css-component > .th-inner,\nth.css-consumable > .th-inner,\nth.css-envelope > .th-inner,\nth.css-house-flag > .th-inner,\nth.css-house-laptop > .th-inner,\nth.css-house-user > .th-inner,\nth.css-license > .th-inner,\nth.css-location > .th-inner,\nth.css-users > .th-inner,\nth.css-currency > .th-inner,\nth.css-child-locations > .th-inner,\nth.css-history > .th-inner\n{\n font-size: 0px;\n line-height: 0.75 !important;\n text-align: left;\n text-rendering: auto;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n\nth.css-location > .th-inner::before,\nth.css-accessory > .th-inner::before,\nth.css-accessory-alt > .th-inner::before,\nth.css-barcode > .th-inner::before,\nth.css-component > .th-inner::before,\nth.css-consumable > .th-inner::before,\nth.css-envelope > .th-inner::before,\nth.css-house-flag > .th-inner::before,\nth.css-house-laptop > .th-inner::before,\nth.css-house-user > .th-inner::before,\nth.css-license > .th-inner::before,\nth.css-location > .th-inner::before,\nth.css-users > .th-inner::before,\nth.css-currency > .th-inner::before,\nth.css-child-locations > .th-inner::before,\nth.css-history > .th-inner::before\n{\n display: inline-block;\n font-size: 20px;\n font-family: \"Font Awesome 5 Free\";\n font-weight: 900;\n}\n\n/**\nBEGIN ICON TABLE HEADERS\nSet the font-weight css property as 900 (For Solid), 400 (Regular or Brands), 300 (Light for pro icons).\n**/\nth.css-barcode > .th-inner::before\n{\n content: \"\\f02a\"; font-family: \"Font Awesome 5 Free\"; font-weight: 900;\n}\n\nth.css-license > .th-inner::before\n{\n content: \"\\f0c7\"; font-family: \"Font Awesome 5 Free\"; font-weight: 400;\n}\n\nth.css-consumable > .th-inner::before\n{\n content: \"\\f043\"; font-family: \"Font Awesome 5 Free\"; font-weight: 900;\n}\n\nth.css-envelope > .th-inner::before\n{\n content: \"\\f0e0\"; font-family: \"Font Awesome 5 Free\"; font-weight: 400;\n}\n\nth.css-accessory > .th-inner::before\n{\n content: \"\\f11c\"; font-family: \"Font Awesome 5 Free\"; font-weight: 400;\n}\n\nth.css-users > .th-inner::before {\n content: \"\\f0c0\"; font-family: \"Font Awesome 5 Free\"; font-size: 15px;\n}\n\nth.css-location > .th-inner::before {\n content: \"\\f3c5\"; font-family: \"Font Awesome 5 Free\"; font-size: 19px; margin-bottom: 0px;\n}\n\nth.css-component > .th-inner::before\n{\n content: \"\\f0a0\"; font-family: \"Font Awesome 5 Free\"; font-weight: 500;\n}\n\nth.css-padlock > .th-inner::before\n{\n content: \"\\f023\"; font-family: \"Font Awesome 5 Free\";\n font-weight: 800;\n padding-right: 3px;\n}\n\nth.css-house-user > .th-inner::before {\n content: \"\\e1b0\";\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\nth.css-house-flag > .th-inner::before {\n content: \"\\e50d\";\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\nth.css-house-laptop > .th-inner::before {\n content: \"\\e066\";\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\nth.css-accessory-alt > .th-inner::before {\n content: \"\\f11c\";\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\n\nth.css-child-locations > .th-inner::before {\n content: \"\\f64f\"; // change this to f51e for coins\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\n\nth.css-currency > .th-inner::before {\n content: \"\\24\"; // change this to f51e for coins\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\n\nth.css-history > .th-inner::before {\n content: \"\\f1da\"; // change this to f51e for coins\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\n\n\n.small-box .inner {\n padding-left: 15px;\n padding-right: 15px;\n padding-top: 15px;\n color: #fff;\n}\n\n\n.small-box > a:link, .small-box > a:visited, .small-box > a:hover {\n color: #fff;\n}\n\n.select2-container--default .select2-selection--single, .select2-selection .select2-selection--single {\n border: 1px solid #d2d6de;\n border-radius: 0;\n padding: 6px 12px;\n height: 34px;\n}\n\n.form-group.has-error label, .form-group.has-error .help-block {\n color: #a94442;\n}\n\n.select2-container--default .select2-selection--multiple {\n border-radius: 0px;\n}\n\n@media screen and (max-width: 511px){\n .tab-content .tab-pane .alert-block {\n margin-top: 120px\n }\n .sidebar-menu{\n margin-top:160px;\n }\n}\n@media screen and (max-width: 912px) and (min-width: 512px){\n .sidebar-menu {\n margin-top:100px\n }\n .navbar-custom-menu > .navbar-nav > li.dropdown.user.user-menu {\n float:right;\n }\n .navbar-custom-menu > .navbar-nav > li > .dropdown-menu {\n margin-right:-39px;\n }\n}\n\n@media screen and (max-width: 1268px) and (min-width: 912px){\n .sidebar-menu {\n margin-top:50px\n }\n}\n@media screen and (max-width: 992px){\n .info-stack-container {\n flex-direction: column;\n }\n .col-md-3.col-xs-12.col-sm-push-9.info-stack{\n left:auto;\n order:1;\n }\n .col-md-9.col-xs-12.col-sm-pull-3.info-stack{\n right:auto;\n order:2;\n }\n .info-stack-container > .col-md-9.col-xs-12.col-sm-pull-3.info-stack > .row-new-striped > .row > .col-sm-2{\n width:auto;\n float:none;\n }\n}\n@media screen and (max-width: 992px){\n .row-new-striped div{\n width:100%;\n }\n}\n\n@media screen and (max-width: 1318px) and (min-width: 1200px){\n .admin.box{\n height:170px;\n }\n}\n@media screen and (max-width: 1494px) and (min-width: 1200px){\n .dashboard.small-box{\n white-space: nowrap;\n text-overflow: ellipsis;\n max-width: 188px;\n display: block;\n overflow: hidden;\n }\n}\n\n/** Form-stuff overrides for checkboxes and stuff **/\n\nlabel.form-control {\n display: grid;\n grid-template-columns: 1.8em auto;\n gap: 0.5em;\n border: 0px;\n padding-left: 0px;\n background-color: inherit;\n color: inherit;\n font-size: inherit;\n font-weight: inherit;\n}\n\nlabel.form-control--disabled {\n color: #959495;\n cursor: not-allowed;\n}\n\n\n/** --------------------------------------- **/\n/** Start checkbox styles to replace iCheck **/\n/** --------------------------------------- **/\ninput[type=\"checkbox\"] {\n /* Add if not using autoprefixer */\n -webkit-appearance: none;\n appearance: none;\n /* For iOS < 15 to remove gradient background */\n background-color: #fff;\n /* Not removed via appearance */\n margin: 0;\n font: inherit;\n color: #959495;\n width: 1.8em;\n height: 1.8em;\n border: 0.05em solid;\n border-radius: 0em;\n transform: translateY(-0.075em);\n display: grid;\n place-content: center;\n /*Windows High Contrast Mode*/\n}\n\n/** This sets the display of a checkbox, and what the \"fill\" checkmark should look like */\n\ninput[type=\"checkbox\"]::before {\n\n /** If you want to use the non-checkbox, filled square, use this instead **/\n content: \"\";\n width: 1em;\n height: 1em;\n transform: scale(0);\n transition: 120ms transform ease-in-out;\n box-shadow: inset 1em 1em rgb(211, 211, 211);\n\n content: \"\";\n width: 1em;\n height: 1em;\n clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%);\n transform: scale(0);\n transform-origin: bottom left;\n transition: 120ms transform ease-in-out;\n box-shadow: inset 1em 1em #428bca;\n /* Windows High Contrast Mode */\n background-color: CanvasText;\n}\n\n/** This sets the size of the scale up for the shape we defined above **/\ninput[type=\"checkbox\"]:checked::before {\n transform: scale(1);\n}\n\n/** This sets the scale and color of the DISABLED but CHECKED checkbox */\ninput[type=checkbox]:disabled::before, input[type=radio]:disabled::before {\n content: \"\";\n width: 1em;\n height: 1em;\n transform: scale(1);\n box-shadow: inset 1em 1em rgb(211, 211, 211);\n}\n\n/* This sets the scale and style of a DISABLED checkbox that is NOT checked */\ninput[type=checkbox]:disabled:not(:checked)::before, input[type=radio]:disabled:not(:checked)::before {\n content: \"\";\n transform: scale(0);\n cursor: not-allowed;\n pointer-events:none;\n}\n\n/** this is the color of the checkbox and content on a disabled, checked box **/\ninput[type=checkbox]:disabled, input[type=radio]:disabled {\n --form-control-color: rgb(211, 211, 211);\n color: #959495;\n cursor: not-allowed;\n pointer-events:none;\n}\n\n\n/** Radio styles to replace iCheck **/\n\ninput[type=\"radio\"] {\n appearance: none;\n background-color: #fff;\n margin: 0;\n font: inherit;\n color: #959495;\n width: 1.8em;\n height: 1.8em;\n border: 0.05em solid;\n border-radius: 50%;\n transform: translateY(-0.075em);\n display: grid;\n place-content: center;\n}\n\ninput[type=\"radio\"]::before {\n content: \"\";\n width: 1em;\n height: 1em;\n border-radius: 50%;\n transform: scale(0);\n transition: 120ms transform ease-in-out;\n box-shadow: inset 1em 1em #428bca;\n}\n\ninput[type=\"radio\"]:checked::before {\n transform: scale(1);\n}\n\n\n/**\n* This addresses the column selector in bootstrap-table. Without these two lines, the\n* checkbox and the with the label text that BS tables generates will\n* end up on two different lines and it looks assy.\n */\n.dropdown-item-marker input[type=checkbox] {\n font-size: 10px;\n}\n\n.bootstrap-table .fixed-table-toolbar li.dropdown-item-marker label {\n font-weight: normal;\n display: grid;\n grid-template-columns: .1em auto;\n gap: 1.5em;\n}\n\n.container.row-striped .col-md-6 {\n overflow-wrap:anywhere;\n}\n\n.nav-tabs-custom > .nav-tabs > li {\n z-index: 1;\n}\n\n.select2-container .select2-search--inline .select2-search__field{\n padding-left:15px;\n}\n\n.nav-tabs-custom > .nav-tabs > li.active {\n font-weight: bold;\n}\n\n/** --------------------------------------- **/\n/** End checkbox styles to replace iCheck **/\n/** --------------------------------------- **/\n\n/**\n/** Separator styles with text in the middle. Currently only used by the login page but\n/** could be used elsewhere.\n */\n\n.separator {\n display: flex;\n align-items: center;\n text-align: center;\n padding-top: 20px;\n color: #959495;\n}\n\n.separator::before,\n.separator::after {\n content: '';\n flex: 1;\n border-bottom: 1px solid #959495;\n}\n\n.separator:not(:empty)::before {\n margin-right: .25em;\n}\n\n.separator:not(:empty)::after {\n margin-left: .25em;\n}\n.datepicker.dropdown-menu {\n z-index: 1030 !important;\n}\n\n.sidebar-menu > li .badge {\n margin-top: 0px;\n filter: brightness(70%);\n font-size: 70%;\n}\n\n/** this is needed to override ekko-lightboxes card view styles **/\n.bootstrap-table .fixed-table-container .table tbody tr .card-view {\n display: table-row !important;\n}\n\n.form-control-static {\n padding-top: 0px;\n}\n\n\ntd.text-right.text-padding-number-cell {\n padding-right: 30px !important;\n white-space: nowrap;\n}\n\nth.text-right.text-padding-number-footer-cell {\n padding-right: 20px !important;\n white-space: nowrap;\n}\n\ncode.single-line {\n white-space: pre-wrap;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n overflow: hidden;\n max-width: 400px;\n}\n\np.monospace, span.monospace {\n font-family: monospace, monospace;\n}\n\nlegend.highlight {\n background: repeating-linear-gradient(\n 45deg,\n #222d32,\n #222d32 10px,\n #444 10px,\n #444 11px\n );\n\n color: #fff;\n font-size: 18px;\n padding: 6px 6px 6px 10px;\n}\n\nlegend.highlight a {\n color: #fff;\n cursor: pointer;\n}\n\nfieldset.bottom-padded {\n padding-bottom: 20px;\n}\n\ncaption.tableCaption {\n font-size: 18px;\n padding-left: 8px;\n}\n\n// via https://github.com/grokability/snipe-it/issues/11754\n.sidebar-toggle.btn {\n border-radius: 3px;\n box-shadow: none;\n border-top: 0px solid transparent;\n border-bottom: 0px solid transparent;\n padding-left: 15px;\n padding-right: 15px;\n padding-top: 12px;\n padding-bottom: 12px;\n margin-left: -47px;\n margin-top: 2px;\n}\n.popover.help-popover,\n.popover.help-popover .popover-content,\n.popover.help-popover .popover-body,\n.popover.help-popover .popover-title,\n.popover.help-popover .popover-header {\n color: #000;\n}\n\n.visually-hidden {\n width: 1px;\n height: 1px;\n margin: -1px;\n overflow: hidden;\n clip: rect(0,0,0,0);\n white-space: preserve;\n display: inline-block;\n}"],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"css/build/overrides.css","mappings":"AAAA;EAkBE;AAhBF;AAkBA;EACE;EACA;EACA;EACA;EACA;AAhBF;AAiBE;;;EACE;AAbJ;AAgBA;EACE;AAdF;AAiBA;EACE;EACA;AAfF;AAkBA;EACE;AAhBF;AAoBA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;AAlBF;AAqBA;EACE;EACA;EACA;EACA;EACA;AAnBF;AAsBA;EACE;AApBF;AAuBA;EACE;AArBF;AAwBA;EACE;EACA;AAtBF;AA0BA;EACE;AAxBF;AA2BA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAzBF;AA2BA;EACE;AAzBF;AA2BA;EACE;AAzBF;AA6BA;EACE;AA3BF;AA6BA;EACE;AA3BF;AA+BA;EACE;EACA;EACA;AA7BF;AAgCA;EACE;EACA;EACA;AA9BF;AAqDA;EACE;AAnDF;AAsDA;EACE;EACA;EACA;AApDF;AAuDA;EACE;EACA;AArDF;AAwDA;EACE;AAtDF;AAyDA;EACE;EACA;AAvDF;AA0DA;;EACE;EACA;AAvDF;AA0DA;EACE;EACA;AAxDF;AA0DA;EACE;AAxDF;AA2DA;EACE;EACA;EACA;AAzDF;AA4DA;EACE;AA1DF;AA6DA;EACE;AA3DF;AA8DA;EACE;AA5DF;AA8DA;EACE;AA5DF;AA+DA;EACE;AA7DF;AAgEA;;;;EACE;AA3DF;AA8DA;;;;;EACE;AAxDF;AA2DA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAzDF;AA2DA;EACE;EACA;EACA;EACA;EACA;EACA;AAzDF;AA2DA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAzDF;AA2DA;EACE;AAzDF;AA2DA;EACE;EACA;EACA;EACA;AAzDF;AA2DA;EACE;EACA;AAzDF;AA2DA;EACE;EACA;EACA;EACA;EACA;AAzDF;AA2DA;EACE;EACA;AAzDF;AA2DA;EACE;EACA;EACA;EACA;AAzDF;AA4DA;EACE;EACA;AA1DF;AA+DA;EAAY;AA5DZ;AACA,cAAc;AA8Dd;EAAY;EAAkC;AA1D9C;AA2DA;EAA8B;EAAY;AAvD1C;AAyDA;EAAiD;EAAgB;EAAiB;AApDlF;AAqDA;EAA8C;EAAa;AAjD3D;AAkDA;EAA+C;EAAoB;EAAa;EAAc;EAAgB;EAAqB;EAAW;EAAW;EAAmB;EAAoB;AAtChM;AAuCA;EAAqD;EAAc;EAAa;EAAc;EAAqB;EAAqB;EAAoB;EAAU;AA7BtK;AA8BA;EAA0C;EAAoB;EAAoB;EAAa;EAAkB;AAvBjH;AAwBA;EAA0D;EAAW;EAAkB;AAnBvF;AAoBA;EAAmE;AAjBnE;AAkBA;EAAiE;AAfjE;AAgBA;EAA6E;AAb7E;AAcA;EAA4E;AAX5E;AAYA;EAAwD;AATxD;AAUA;EAA8D;AAP9D;AAQA;EAAuD;EAAW;AAJlE;AAKA;EAAsD;AAFtD;AAGA;EAAuD;AAAvD;AACA,kBAAkB;AAElB;EACE;EACA;EACA;EACA;EACA;EAAA,gCAAgC;AAClC;AAGA;EAkBE;AAlBF;AAqBA;EACE;AAnBF;AAuBA;;EACE;AApBF;AAsBA;;EACE;AAnBF;AAsBA;EACE;EAIA;AAvBF;AA0BA;EACE;EACA;AAxBF;AA2BA;EACE;AAzBF;AA4BA;EACE;AA1BF;AA6BA;EAEE;IACE;IACA;EA5BF;EA+BA;IACE;IACA;IACA;EA7BF;EAgCA;IACE;EA9BF;EAiCA;;IACE;EA9BF;EAiCA;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EA/BF;EACA,+CAA+C;EAkC/C;IACE;EAhCF;EAmCA;IACE;EAjCF;EAoCA;IACE;EAlCF;EAqCA;IACE;EAnCF;EACA,qCAAqC;EAsCrC;;IACE;EAnCF;EACA,QAAQ;EAsCR;;IACE;IACA;IACA;EAnCF;EAsCA;IACE;EApCF;EAuCA;IACE;EArCF;EAwCA;IACE;IACA;IACA;EAtCF;EAyCA;IACE;IACA;EAvCF;EA0CA;;IACE;EAvCF;EAyCA;;;;;;;;;;;;IACE;EA5BF;EA+BA;IACE;EA7BF;EA+BA;IACE;EA7BF;EA+BA;IACE;EA7BF;EA+BA;IACE;EA7BF;EA+BA;IACE;EA7BF;EA+BA;IACE;EA7BF;EA+BA;IACE;EA7BF;EA+BA;IACE;EA7BF;EA+BA;IACE;EA7BF;EA+BA;IACE;EA7BF;EA+BA;IACE;EA7BF;EA+BA;IACE;EA7BF;AACF;AAkCA;EACE;AAhCF;AAmCA;EACI;EACA;AAjCJ;AAoCA;EACE;AAlCF;AAqCA;EACE;EACA;EACA;AAnCF;AAwCA;EACE;EACA;OAAA;EACA;EACA;AAtCF;AAyCA;;EACE;EACA;EACA;AAtCF;AAyCA;;;EACE;AArCF;AAwCA;;EACE;AArCF;AAwCA;EACE;AAtCF;AAyCA;EACE;AAvCF;AA0CA;EACE;EACA;EACA;AAxCF;AA2CA;EACE;EACA;AAzCF;AA4CA;EACE;EACA;EACA;AA1CF;AA8CA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;AA5CF;AA8CA;;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AA3CF;AA8CA;EACE;AA5CF;AA+CA;EACE;AA7CF;AAgDA;EACE;AA9CF;AAiDA;EACE;AA/CF;AAkDA;EACE;AAhDF;AAoDA;EACE;EACA;EACA;EACA;EACA;EAGA;AApDF;AAuDA;EACE;EACA;EACA;EACA;AArDF;AAwDA;EACE;EACA;EACA;EACA;AAtDF;AA0DA;EACE;EACA;EACA;EACA;EACA;EACA;AAxDF;AACA;;;;EAIE;AA2DF;EACE;EACA;EACA;EACA;AAzDF;AA4DA;EACE;EACA;EACA;EACA;EACA;AA1DF;AA6DA;EACE;EACA;EACA;AA3DF;AA8DA;EACE;EACA;EACA;AA5DF;AAgEA;EACE;AA9DF;AACA;;EAEE;AAmEF;EACE;IACE;IACA;EAjEF;EAoEA;IACE;EAlEF;EAqEA;IACE;EAnEF;EAsEA;IACE;EApEF;AACF;AAuEA;EACE;EACA;EACA;AArEF;AAwEA;EACE;EACA;AAtEF;AACA;;;;;;;;;;;EAWE;AA2EF;;;;;;;;;;;;;;;EAgBE;EACA;EACA;EACA;EACA;EACA;AA1EF;AA8EA;;;;;;;;;;;;;;;;EAiBE;EACA;EACA;EACA;AA7EF;AACA;;;EAGE;AAgFF;EAEE;EAAkB;EAAoC;AA7ExD;AAgFA;EAEE;EAAkB;EAAoC;AA7ExD;AAgFA;EAEE;EAAkB;EAAoC;AA7ExD;AAgFA;EAEE;EAAkB;EAAoC;AA7ExD;AAgFA;EAEE;EAAkB;EAAoC;AA7ExD;AAgFA;EACE;EAAkB;EAAoC;AA5ExD;AA+EA;EACE;EAAkB;EAAoC;EAAiB;AA1EzE;AA6EA;EAEE;EAAkB;EAAoC;AA1ExD;AA6EA;EAEE;EAAkB;EAClB;EACA;AA3EF;AA8EA;EACE;EACA;EACA;EACA;AA5EF;AA8EA;EACE;EACA;EACA;EACA;AA5EF;AA8EA;EACE;EACA;EACA;EACA;AA5EF;AA8EA;EACE;EACA;EACA;EACA;AA5EF;AA+EA;EACE;EACA;EACA;EACA;AA7EF;AAgFA;EACE;EACA;EACA;EACA;AA9EF;AAiFA;EACE;EACA;EACA;EACA;AA/EF;AAmFA;EACE;EACA;EACA;EACA;AAjFF;AAqFA;;;EACE;AAjFF;AAoFA;;EACE;EACA;EACA;EACA;AAjFF;AAoFA;;EACE;AAjFF;AAoFA;EACE;AAlFF;AAqFA;EACE;IACE;EAnFF;EAqFA;IACE;EAnFF;AACF;AAqFA;EACE;IACE;EAnFF;EAqFA;IACE;EAnFF;EAqFA;IACE;EAnFF;AACF;AAsFA;EACE;IACE;EApFF;AACF;AAsFA;EACE;IACE;EApFF;EAsFA;IACE;IACA;EApFF;EAsFA;IACE;IACA;EApFF;EAsFA;IACE;IACA;EApFF;AACF;AAsFA;EACE;IACE;EApFF;AACF;AAuFA;EACE;IACE;EArFF;AACF;AAuFA;EACE;IACE;IACA;IACA;IACA;IACA;EArFF;AACF;AACA,oDAAoD;AAyFpD;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAvFF;AA0FA;EACE;EACA;AAxFF;AACA,8CAA8C;AAC9C,8CAA8C;AAC9C,8CAA8C;AA4F9C;EA1FE,kCAAkC;EA4FlC;EACA;OAAA;EA1FA,+CAA+C;EA4F/C;EA1FA,+BAA+B;EA4F/B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EA1FA,6BAA6B;AAC/B;AACA,yFAAyF;AA8FzF;EA5FE,2EAA2E;EAoG3E;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAnGA,+BAA+B;EAqG/B;AAnGF;AACA,wEAAwE;AAsGxE;EACE;AApGF;AACA,wEAAwE;AAuGxE;;EACE;EACA;EACA;EACA;EACA;AApGF;AACA,6EAA6E;AAuG7E;;EACE;EACA;EACA;EACA;AApGF;AACA,+EAA+E;AAuG/E;;EACE;EACA;EACA;EACA;AApGF;AACA,qCAAqC;AAyGrC;EACE;KAAA;UAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAvGF;AA0GA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;AAxGF;AA2GA;EACE;AAzGF;AACA;;;;EAIE;AA6GF;EACE;AA3GF;AA8GA;EACE;EACA;EACA;EACA;AA5GF;AA+GA;EACE;AA7GF;AAgHA;EACE;AA9GF;AAiHA;EACE;AA/GF;AAkHA;EACE;AAhHF;AACA,8CAA8C;AAC9C,8CAA8C;AAC9C,8CAA8C;AAC9C;;;EAGE;AAqHF;EACE;EACA;EACA;EACA;EACA;AAnHF;AAsHA;;EAEE;EACA;EACA;AApHF;AAuHA;EACE;AArHF;AAwHA;EACE;AAtHF;AAwHA;EACE;AAtHF;AAyHA;EACE;EACA;EACA;AAvHF;AACA,kEAAkE;AA0HlE;EACE;AAxHF;AA2HA;EACE;AAzHF;AA6HA;EACE;EACA;AA3HF;AA8HA;EACE;EACA;AA5HF;AA+HA;EACE;EACA;EACA;EACA;EACA;EACA;AA7HF;AAgIA;;EACE;AA7HF;AAgIA;EACE;EAQA;EACA;EACA;AArIF;AAwIA;EACE;EACA;AAtIF;AAyIA;EACE;AAvIF;AA0IA;EACE;EACA;AAxIF;AA4IA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AA1IF;AA4IA;;;;;EAKE;AA1IF;AA6IA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;AA3IF;AA8IA;EACE;AA5IF","sources":["webpack:///./resources/assets/less/overrides.less"],"sourcesContent":[".skin-red\n.skin-purple\n.skin-blue\n.skin-black\n.skin-orange\n.skin-yellow\n.skin-green\n.skin-red-dark\n.skin-purple-dark\n.skin-blue-dark\n.skin-black-dark\n.skin-orange-dark\n.skin-yellow-dark\n.skin-green-dark\n.skin-contrast\n.main-header\n\n.logo {\n background-color: inherit;\n}\n.main-header .logo {\n width: 100% !important;\n white-space: nowrap;\n text-align: left;\n display: block;\n clear: both;\n &a:link, a:hover, a:visited {\n color: #fff\n }\n}\n.huge {\n font-size: 40px;\n}\n\n.btn-file {\n position: relative;\n overflow: hidden;\n}\n\n.dropdown-menu>li>a {\n color: #354044;\n}\n\n\n#sort tr.cansort {\n border-radius: 2px;\n padding: 10px;\n background: #f4f4f4;\n margin-bottom: 3px;\n border-inline: 2px solid #e6e7e8;\n color: #444;\n cursor: move;\n}\n\n.user-image-inline {\n float: left;\n width: 25px;\n height: 25px;\n border-radius: 50%;\n margin-right: 10px;\n}\n\n.input-group .input-group-addon {\n background-color: #f4f4f4;\n}\n\na.accordion-header {\n color: #333;\n}\n\n.dynamic-form-row {\n padding: 10px;\n margin: 20px;\n}\n\n\n.handle {\n padding-left: 10px;\n}\n\n.btn-file input[type=file] {\n position: absolute;\n top: 0;\n right: 0;\n min-width: 100%;\n min-height: 100%;\n font-size: 100px;\n text-align: right;\n filter: alpha(opacity=0);\n opacity: 0;\n outline: none;\n background: white;\n cursor: inherit;\n display: block;\n}\n.main-footer {\n font-size: 13px;\n}\n.main-header {\n max-height: 150px;\n}\n\n\n.navbar-nav>.user-menu>.dropdown-menu {\n width: inherit;\n}\n.main-header .logo {\n padding: 0px 5px 0px 15px;\n}\n\n\n.sidebar-toggle {\n margin-left: -48px;\n z-index: 100;\n background-color: inherit;\n}\n\n.sidebar-toggle-mobile {\n z-index: 100;\n width: 50px;\n padding-top: 10px;\n}\n\n.skin-red\n.skin-purple\n.skin-blue\n.skin-black\n.skin-orange\n.skin-yellow\n.skin-green\n.skin-red-dark\n.skin-purple-dark\n.skin-blue-dark\n.skin-black-dark\n.skin-orange-dark\n.skin-yellow-dark\n.skin-green-dark\n.skin-contrast\n.main-header\n.navbar\n.dropdown-menu li a {\n //color: inherit;\n}\n.pull-text-right{\n text-align: right !important;\n}\n\n.main-header .sidebar-toggle:before {\n content: \"\\f0c9\";\n font-weight: 900;\n font-family: 'Font Awesome\\ 5 Free';\n}\n\n.direct-chat-contacts {\n padding: 10px;\n height: 150px;\n}\n\n.select2-container {\n width: 100%;\n}\n\n.error input {\n color: #a94442;\n border: 2px solid #a94442 !important;\n}\n\n.error label, .alert-msg {\n color: #a94442;\n display: block;\n}\n\n.input-group[class*=\"col-\"] {\n padding-right: 15px;\n padding-left: 15px;\n}\n.control-label.multiline {\n padding-top: 10px;\n}\n\n.btn-outline {\n color: inherit;\n background-color: transparent;\n transition: all .5s;\n}\n\n.btn-primary.btn-outline {\n color: #428bca;\n}\n\n.btn-success.btn-outline {\n color: #5cb85c;\n}\n\n.btn-info.btn-outline {\n color: #5bc0de;\n}\n.btn-warning{\n background-color:#f39c12 !important;\n}\n\n.btn-warning.btn-outline {\n color: #f0ad4e;\n}\n\n.btn-danger.btn-outline, a.link-danger:link, a.link-danger:visited, a.link-danger:hover {\n color: #dd4b39;\n}\n\n.btn-primary.btn-outline:hover, .btn-success.btn-outline:hover, .btn-info.btn-outline:hover, .btn-warning.btn-outline:hover, .btn-danger.btn-outline:hover {\n color: #fff;\n}\n\n.slideout-menu {\n position: fixed;\n top: 0;\n right: -250px;\n width: 250px;\n height: 100%;\n background: #333;\n z-index: 100;\n margin-top: 100px;\n color: white;\n padding: 10px;\n}\n.slideout-menu h3 {\n position: relative;\n padding: 5px 5px;\n color: #fff;\n font-size: 1.2em;\n font-weight: 400;\n border-bottom: 4px solid #222;\n}\n.slideout-menu .slideout-menu-toggle {\n position: absolute;\n top: 12px;\n right: 10px;\n display: inline-block;\n padding: 6px 9px 5px;\n font-family: Arial, sans-serif;\n font-weight: bold;\n line-height: 1;\n background: #222;\n color: #999;\n text-decoration: none;\n vertical-align: top;\n}\n.slideout-menu .slideout-menu-toggle:hover {\n color: #fff;\n}\n.slideout-menu ul {\n list-style: none;\n font-weight: 300;\n border-top: 1px solid #151515;\n border-bottom: 1px solid #454545;\n}\n.slideout-menu ul li {\n border-top: 1px solid #454545;\n border-bottom: 1px solid #151515;\n}\n.slideout-menu ul li a {\n position: relative;\n display: block;\n padding: 10px;\n color: #999;\n text-decoration: none;\n}\n.slideout-menu ul li a:hover {\n background: #000;\n color: #fff;\n}\n.slideout-menu ul li a i {\n position: absolute;\n top: 15px;\n right: 10px;\n opacity: .5;\n}\n\n.btn-box-tool-lg {\n font-size: 16px;\n color: orange;\n}\n\n\n\n.bs-wizard {margin-top: 20px;}\n\n/*Form Wizard*/\n.bs-wizard {border-bottom: solid 1px #e0e0e0; padding: 0 0 10px 0;}\n.bs-wizard > .bs-wizard-step {padding: 0; position: relative;}\n.bs-wizard > .bs-wizard-step + .bs-wizard-step {}\n.bs-wizard > .bs-wizard-step .bs-wizard-stepnum {color: #595959; font-size: 16px; margin-bottom: 5px;}\n.bs-wizard > .bs-wizard-step .bs-wizard-info {color: #999; font-size: 14px;}\n.bs-wizard > .bs-wizard-step > .bs-wizard-dot {position: absolute; width: 30px; height: 30px; display: block; background: #fbe8aa; top: 45px; left: 50%; margin-top: -15px; margin-left: -15px; border-radius: 50%;}\n.bs-wizard > .bs-wizard-step > .bs-wizard-dot:after {content: ' '; width: 14px; height: 14px; background: #fbbd19; border-radius: 50px; position: absolute; top: 8px; left: 8px; }\n.bs-wizard > .bs-wizard-step > .progress {position: relative; border-radius: 0px; height: 8px; box-shadow: none; margin: 20px 0;}\n.bs-wizard > .bs-wizard-step > .progress > .progress-bar {width:0px; box-shadow: none; background: #fbe8aa;}\n.bs-wizard > .bs-wizard-step.complete > .progress > .progress-bar {width:100%;}\n.bs-wizard > .bs-wizard-step.active > .progress > .progress-bar {width:50%;}\n.bs-wizard > .bs-wizard-step:first-child.active > .progress > .progress-bar {width:0%;}\n.bs-wizard > .bs-wizard-step:last-child.active > .progress > .progress-bar {width: 100%;}\n.bs-wizard > .bs-wizard-step.disabled > .bs-wizard-dot {background-color: #f5f5f5;}\n.bs-wizard > .bs-wizard-step.disabled > .bs-wizard-dot:after {opacity: 0;}\n.bs-wizard > .bs-wizard-step:first-child > .progress {left: 50%; width: 50%;}\n.bs-wizard > .bs-wizard-step:last-child > .progress {width: 50%;}\n.bs-wizard > .bs-wizard-step.disabled a.bs-wizard-dot{ pointer-events: none; }\n/*END Form Wizard*/\n\n.left-navblock {\n display: inline-block;\n float: left;\n text-align: left;\n color: white;\n padding: 0px;\n /* adjust based on your layout */\n\n}\n.skin-red\n.skin-purple\n.skin-blue\n.skin-black\n.skin-orange\n.skin-yellow\n.skin-green\n.skin-red-dark\n.skin-purple-dark\n.skin-blue-dark\n.skin-black-dark\n.skin-orange-dark\n.skin-yellow-dark\n.skin-green-dark\n.skin-contrast\n.main-header\n.navbar\n.dropdown-menu li a {\n color: #333;\n}\n\na.logo.no-hover a:hover {\n background-color: transparent;\n}\n\n\ninput:required, select:required {\n border-right: 5px solid orange;\n}\nselect:required + .select2-container .select2-selection, select:required + .select2-container .select2-selection .select2-selection--multiple {\n border-right: 5px solid orange !important;\n}\n\nbody {\n font-family: -apple-system, BlinkMacSystemFont,\n \"Segoe UI\", \"Roboto\", \"Oxygen\", \"Ubuntu\", \"Cantarell\",\n \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\",\n sans-serif;\n font-size: 13px;\n}\n\n.sidebar-menu {\n font-size: 14px;\n white-space: normal;\n}\n\n.modal-warning .modal-help {\n color: #fff8af;\n}\n\n.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading {\n z-index: 0 !important;\n}\n\n@media print {\n\n @page {\n size: A4;\n margin: 0mm;\n }\n\n .tab-content > .tab-pane {\n display: block !important;\n opacity: 1 !important;\n visibility: visible !important;\n }\n\n .img-responsive {\n width: 200px;\n }\n\n html, body {\n width: 1024px;\n }\n\n body {\n margin: 0 auto;\n line-height: 1em;\n word-spacing:1px;\n letter-spacing:0.2px;\n font: 15px \"Times New Roman\", Times, serif;\n background:white;\n color:black;\n width: 100%;\n float: none;\n }\n\n /* avoid page-breaks inside a listingContainer*/\n .listingContainer {\n page-break-inside: avoid;\n }\n\n h1 {\n font: 28px \"Times New Roman\", Times, serif;\n }\n\n h2 {\n font: 24px \"Times New Roman\", Times, serif;\n }\n\n h3 {\n font: 20px \"Times New Roman\", Times, serif;\n }\n\n /* Improve colour contrast of links */\n a:link, a:visited {\n color: #781351\n }\n\n /* URL */\n a:link, a:visited {\n background: transparent;\n color:#333;\n text-decoration:none;\n }\n\n a[href]:after {\n content: \"\" !important;\n }\n\n a[href^=\"http://\"] {\n color:#000;\n }\n\n #header {\n height:75px;\n font-size: 24pt;\n color:black\n }\n\n div.row-new-striped {\n margin: 0px;\n padding: 0px;\n }\n\n .pagination-detail, .fixed-table-toolbar {\n visibility: hidden;\n }\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 .col-sm-pull-3 .col-sm-push-9 {\n float: left;\n }\n\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666666666666%;\n }\n .col-sm-10 {\n width: 83.33333333333334%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666666666666%;\n }\n .col-sm-7 {\n width: 58.333333333333336%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666666666667%;\n }\n .col-sm-4 {\n width: 33.33333333333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.666666666666664%;\n }\n .col-sm-1 {\n width: 8.333333333333332%;\n }\n\n}\n\n\n.select2-selection__choice__remove {\n color: white !important;\n}\n\n.select2-selection--multiple {\n border-color: #d2d6de !important;\n overflow-y: auto;\n}\n\n.select2-selection__choice {\n border-radius: 0px !important;\n}\n\n.select2-search select2-search--inline {\n height: 35px !important;\n float: left;\n margin: 0;\n}\n\n\n\n.select2-results__option {\n padding: 5px;\n user-select: none;\n -webkit-user-select: none;\n margin: 0px;\n}\n\nimg.navbar-brand-img, .navbar-brand>img {\n float: left;\n padding: 5px 5px 5px 0;\n max-height: 50px;\n}\n\n.input-daterange, .input-daterange input:first-child, .input-daterange input:last-child {\n border-radius: 0px !important;\n}\n\n.btn.bg-maroon, .btn.bg-purple{\n min-width:90px;\n}\n\n[hidden] {\n display: none !important;\n}\n\n#toolbar {\n margin-top: 10px;\n}\n\n#uploadPreview {\n border-color: grey;\n border-width: 1px;\n border-style: solid\n}\n\n.icon-med {\n font-size: 14px;\n color: #889195;\n}\n\n#login-logo {\n padding-top: 20px;\n padding-bottom: 10px;\n max-width: 200px\n}\n\n// accessibility skip link\na.skip-main {\n left:-999px;\n position:absolute;\n top:auto;\n width:1px;\n height:1px;\n overflow:hidden;\n z-index:-999;\n}\na.skip-main:focus, a.skip-main:active {\n color: #fff;\n background-color:#000;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow:auto;\n margin: 10px 35%;\n padding:5px;\n border-radius: 15px;\n border:4px solid yellow;\n text-align:center;\n font-size:1.2em;\n z-index:999;\n}\n\nh2 {\n font-size: 22px;\n}\n\nh2.task_menu {\n font-size: 14px;\n}\n\nh2 small {\n font-size: 85%;\n}\n\nh3 {\n font-size: 20px;\n}\n\nh4 {\n font-size: 16px;\n}\n\n\n.row-striped {\n vertical-align: top;\n line-height: 2.6;\n padding: 0px;\n margin-left: 20px;\n box-sizing: border-box;\n //border-left: 1px solid #dddddd;\n //border-right: 1px solid #dddddd;\n display: table;\n}\n\n.row-striped .row:nth-of-type(odd) div {\n background-color: #f9f9f9;\n border-top: 1px solid #dddddd;\n display: table-cell;\n word-wrap: break-word;\n}\n\n.row-striped .row:nth-of-type(even) div {\n background: #FFFFFF;\n border-top: 1px solid #dddddd;\n display: table-cell;\n word-wrap: break-word;\n}\n\n\n.row-new-striped {\n vertical-align: top;\n padding: 3px;\n display: table;\n width: 100%;\n word-wrap: break-word;\n table-layout:fixed;\n}\n\n/**\n* NEW STRIPING\n* This section is for the new row striping for nicer \n* display for non-table data as of v6\n**/\n.row-new-striped > .row:nth-of-type(even) {\n background: #FFFFFF;\n border-top: 1px solid #dddddd;\n line-height: 1.9;\n display: table-row;\n}\n\n.row-new-striped > .row:nth-of-type(odd) {\n background-color: #F8F8F8;\n border-top: 1px solid #dddddd;\n display: table-row;\n line-height: 1.9;\n padding: 2px;\n}\n\n.row-new-striped div {\n display: table-cell;\n border-top: 1px solid #dddddd;\n padding: 6px;\n}\n\n.row-new-striped div {\n display: table-cell;\n border-top: 1px solid #dddddd;\n padding: 6px;\n}\n\n\n.row-new-striped div[class^=\"col\"]:first-child {\n font-weight: bold;\n}\n\n\n\n/**\n* This just adds a little extra padding on mobile\n**/\n@media only screen and (max-width: 520px) {\n h1.pagetitle {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n\n .firstnav {\n padding-top: 120px !important;\n }\n\n .product {\n width: 400px;\n }\n\n .product img {\n min-width: 400px;\n }\n}\n\n.card-view-title {\n min-width: 40% !important;\n line-height: 3.0!important;\n padding-right: 20px;\n}\n\n.card-view {\n display: table-row;\n flex-direction: column;\n}\n\n// ---------------\n\n/**\n\n COLUMN SELECTOR ICONS\n -----------------------------\n This is kind of weird, but it is necessary to prevent the column-selector code from barfing, since\n any HTML used in the UserPresenter \"title\" attribute breaks the column selector HTML.\n\n Instead, we use CSS to add the icon into the table header, which leaves the column selector\n \"title\" text as-is and hides the icon.\n\n See https://github.com/grokability/snipe-it/issues/7989\n */\nth.css-accessory > .th-inner,\nth.css-accessory-alt > .th-inner,\nth.css-barcode > .th-inner,\nth.css-component > .th-inner,\nth.css-consumable > .th-inner,\nth.css-envelope > .th-inner,\nth.css-house-flag > .th-inner,\nth.css-house-laptop > .th-inner,\nth.css-house-user > .th-inner,\nth.css-license > .th-inner,\nth.css-location > .th-inner,\nth.css-users > .th-inner,\nth.css-currency > .th-inner,\nth.css-child-locations > .th-inner,\nth.css-history > .th-inner\n{\n font-size: 0px;\n line-height: 0.75 !important;\n text-align: left;\n text-rendering: auto;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n\nth.css-location > .th-inner::before,\nth.css-accessory > .th-inner::before,\nth.css-accessory-alt > .th-inner::before,\nth.css-barcode > .th-inner::before,\nth.css-component > .th-inner::before,\nth.css-consumable > .th-inner::before,\nth.css-envelope > .th-inner::before,\nth.css-house-flag > .th-inner::before,\nth.css-house-laptop > .th-inner::before,\nth.css-house-user > .th-inner::before,\nth.css-license > .th-inner::before,\nth.css-location > .th-inner::before,\nth.css-users > .th-inner::before,\nth.css-currency > .th-inner::before,\nth.css-child-locations > .th-inner::before,\nth.css-history > .th-inner::before\n{\n display: inline-block;\n font-size: 20px;\n font-family: \"Font Awesome 5 Free\";\n font-weight: 900;\n}\n\n/**\nBEGIN ICON TABLE HEADERS\nSet the font-weight css property as 900 (For Solid), 400 (Regular or Brands), 300 (Light for pro icons).\n**/\nth.css-barcode > .th-inner::before\n{\n content: \"\\f02a\"; font-family: \"Font Awesome 5 Free\"; font-weight: 900;\n}\n\nth.css-license > .th-inner::before\n{\n content: \"\\f0c7\"; font-family: \"Font Awesome 5 Free\"; font-weight: 400;\n}\n\nth.css-consumable > .th-inner::before\n{\n content: \"\\f043\"; font-family: \"Font Awesome 5 Free\"; font-weight: 900;\n}\n\nth.css-envelope > .th-inner::before\n{\n content: \"\\f0e0\"; font-family: \"Font Awesome 5 Free\"; font-weight: 400;\n}\n\nth.css-accessory > .th-inner::before\n{\n content: \"\\f11c\"; font-family: \"Font Awesome 5 Free\"; font-weight: 400;\n}\n\nth.css-users > .th-inner::before {\n content: \"\\f0c0\"; font-family: \"Font Awesome 5 Free\"; font-size: 15px;\n}\n\nth.css-location > .th-inner::before {\n content: \"\\f3c5\"; font-family: \"Font Awesome 5 Free\"; font-size: 19px; margin-bottom: 0px;\n}\n\nth.css-component > .th-inner::before\n{\n content: \"\\f0a0\"; font-family: \"Font Awesome 5 Free\"; font-weight: 500;\n}\n\nth.css-padlock > .th-inner::before\n{\n content: \"\\f023\"; font-family: \"Font Awesome 5 Free\";\n font-weight: 800;\n padding-right: 3px;\n}\n\nth.css-house-user > .th-inner::before {\n content: \"\\e1b0\";\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\nth.css-house-flag > .th-inner::before {\n content: \"\\e50d\";\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\nth.css-house-laptop > .th-inner::before {\n content: \"\\e066\";\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\nth.css-accessory-alt > .th-inner::before {\n content: \"\\f11c\";\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\n\nth.css-child-locations > .th-inner::before {\n content: \"\\f64f\"; // change this to f51e for coins\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\n\nth.css-currency > .th-inner::before {\n content: \"\\24\"; // change this to f51e for coins\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\n\nth.css-history > .th-inner::before {\n content: \"\\f1da\"; // change this to f51e for coins\n font-family: \"Font Awesome 5 Free\";\n font-size: 19px;\n margin-bottom: 0px;\n}\n\n\n.small-box .inner {\n padding-left: 15px;\n padding-right: 15px;\n padding-top: 15px;\n color: #fff;\n}\n\n\n.small-box > a:link, .small-box > a:visited, .small-box > a:hover {\n color: #fff;\n}\n\n.select2-container--default .select2-selection--single, .select2-selection .select2-selection--single {\n border: 1px solid #d2d6de;\n border-radius: 0;\n padding: 6px 12px;\n height: 34px;\n}\n\n.form-group.has-error label, .form-group.has-error .help-block {\n color: #a94442;\n}\n\n.select2-container--default .select2-selection--multiple {\n border-radius: 0px;\n}\n\n@media screen and (max-width: 511px){\n .tab-content .tab-pane .alert-block {\n margin-top: 120px\n }\n .sidebar-menu{\n margin-top:160px;\n }\n}\n@media screen and (max-width: 912px) and (min-width: 512px){\n .sidebar-menu {\n margin-top:100px\n }\n .navbar-custom-menu > .navbar-nav > li.dropdown.user.user-menu {\n float:right;\n }\n .navbar-custom-menu > .navbar-nav > li > .dropdown-menu {\n margin-right:-39px;\n }\n}\n\n@media screen and (max-width: 1268px) and (min-width: 912px){\n .sidebar-menu {\n margin-top:50px\n }\n}\n@media screen and (max-width: 992px){\n .info-stack-container {\n flex-direction: column;\n }\n .col-md-3.col-xs-12.col-sm-push-9.info-stack{\n left:auto;\n order:1;\n }\n .col-md-9.col-xs-12.col-sm-pull-3.info-stack{\n right:auto;\n order:2;\n }\n .info-stack-container > .col-md-9.col-xs-12.col-sm-pull-3.info-stack > .row-new-striped > .row > .col-sm-2{\n width:auto;\n float:none;\n }\n}\n@media screen and (max-width: 992px){\n .row-new-striped div{\n width:100%;\n }\n}\n\n@media screen and (max-width: 1318px) and (min-width: 1200px){\n .admin.box{\n height:170px;\n }\n}\n@media screen and (max-width: 1494px) and (min-width: 1200px){\n .dashboard.small-box{\n white-space: nowrap;\n text-overflow: ellipsis;\n max-width: 188px;\n display: block;\n overflow: hidden;\n }\n}\n\n/** Form-stuff overrides for checkboxes and stuff **/\n\nlabel.form-control {\n display: grid;\n grid-template-columns: 1.8em auto;\n gap: 0.5em;\n border: 0px;\n padding-left: 0px;\n background-color: inherit;\n color: inherit;\n font-size: inherit;\n font-weight: inherit;\n}\n\nlabel.form-control--disabled {\n color: #959495;\n cursor: not-allowed;\n}\n\n\n/** --------------------------------------- **/\n/** Start checkbox styles to replace iCheck **/\n/** --------------------------------------- **/\ninput[type=\"checkbox\"] {\n /* Add if not using autoprefixer */\n -webkit-appearance: none;\n appearance: none;\n /* For iOS < 15 to remove gradient background */\n background-color: #fff;\n /* Not removed via appearance */\n margin: 0;\n font: inherit;\n color: #959495;\n width: 1.8em;\n height: 1.8em;\n border: 0.05em solid;\n border-radius: 0em;\n transform: translateY(-0.075em);\n display: grid;\n place-content: center;\n /*Windows High Contrast Mode*/\n}\n\n/** This sets the display of a checkbox, and what the \"fill\" checkmark should look like */\n\ninput[type=\"checkbox\"]::before {\n\n /** If you want to use the non-checkbox, filled square, use this instead **/\n content: \"\";\n width: 1em;\n height: 1em;\n transform: scale(0);\n transition: 120ms transform ease-in-out;\n box-shadow: inset 1em 1em rgb(211, 211, 211);\n\n content: \"\";\n width: 1em;\n height: 1em;\n clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%);\n transform: scale(0);\n transform-origin: bottom left;\n transition: 120ms transform ease-in-out;\n box-shadow: inset 1em 1em #428bca;\n /* Windows High Contrast Mode */\n background-color: CanvasText;\n}\n\n/** This sets the size of the scale up for the shape we defined above **/\ninput[type=\"checkbox\"]:checked::before {\n transform: scale(1);\n}\n\n/** This sets the scale and color of the DISABLED but CHECKED checkbox */\ninput[type=checkbox]:disabled::before, input[type=radio]:disabled::before {\n content: \"\";\n width: 1em;\n height: 1em;\n transform: scale(1);\n box-shadow: inset 1em 1em rgb(211, 211, 211);\n}\n\n/* This sets the scale and style of a DISABLED checkbox that is NOT checked */\ninput[type=checkbox]:disabled:not(:checked)::before, input[type=radio]:disabled:not(:checked)::before {\n content: \"\";\n transform: scale(0);\n cursor: not-allowed;\n pointer-events:none;\n}\n\n/** this is the color of the checkbox and content on a disabled, checked box **/\ninput[type=checkbox]:disabled, input[type=radio]:disabled {\n --form-control-color: rgb(211, 211, 211);\n color: #959495;\n cursor: not-allowed;\n pointer-events:none;\n}\n\n\n/** Radio styles to replace iCheck **/\n\ninput[type=\"radio\"] {\n appearance: none;\n background-color: #fff;\n margin: 0;\n font: inherit;\n color: #959495;\n width: 1.8em;\n height: 1.8em;\n border: 0.05em solid;\n border-radius: 50%;\n transform: translateY(-0.075em);\n display: grid;\n place-content: center;\n}\n\ninput[type=\"radio\"]::before {\n content: \"\";\n width: 1em;\n height: 1em;\n border-radius: 50%;\n transform: scale(0);\n transition: 120ms transform ease-in-out;\n box-shadow: inset 1em 1em #428bca;\n}\n\ninput[type=\"radio\"]:checked::before {\n transform: scale(1);\n}\n\n\n/**\n* This addresses the column selector in bootstrap-table. Without these two lines, the\n* checkbox and the with the label text that BS tables generates will\n* end up on two different lines and it looks assy.\n */\n.dropdown-item-marker input[type=checkbox] {\n font-size: 10px;\n}\n\n.bootstrap-table .fixed-table-toolbar li.dropdown-item-marker label {\n font-weight: normal;\n display: grid;\n grid-template-columns: .1em auto;\n gap: 1.5em;\n}\n\n.container.row-striped .col-md-6 {\n overflow-wrap:anywhere;\n}\n\n.nav-tabs-custom > .nav-tabs > li {\n z-index: 1;\n}\n\n.select2-container .select2-search--inline .select2-search__field{\n padding-left:15px;\n}\n\n.nav-tabs-custom > .nav-tabs > li.active {\n font-weight: bold;\n}\n\n/** --------------------------------------- **/\n/** End checkbox styles to replace iCheck **/\n/** --------------------------------------- **/\n\n/**\n/** Separator styles with text in the middle. Currently only used by the login page but\n/** could be used elsewhere.\n */\n\n.separator {\n display: flex;\n align-items: center;\n text-align: center;\n padding-top: 20px;\n color: #959495;\n}\n\n.separator::before,\n.separator::after {\n content: '';\n flex: 1;\n border-bottom: 1px solid #959495;\n}\n\n.separator:not(:empty)::before {\n margin-right: .25em;\n}\n\n.separator:not(:empty)::after {\n margin-left: .25em;\n}\n.datepicker.dropdown-menu {\n z-index: 1030 !important;\n}\n\n.sidebar-menu > li .badge {\n margin-top: 0px;\n filter: brightness(70%);\n font-size: 70%;\n}\n\n/** this is needed to override ekko-lightboxes card view styles **/\n.bootstrap-table .fixed-table-container .table tbody tr .card-view {\n display: table-row !important;\n}\n\n.form-control-static {\n padding-top: 0px;\n}\n\n\ntd.text-right.text-padding-number-cell {\n padding-right: 30px !important;\n white-space: nowrap;\n}\n\nth.text-right.text-padding-number-footer-cell {\n padding-right: 20px !important;\n white-space: nowrap;\n}\n\ncode.single-line {\n white-space: pre-wrap;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n overflow: hidden;\n max-width: 400px;\n}\n\np.monospace, span.monospace {\n font-family: monospace, monospace;\n}\n\nlegend.highlight {\n background: repeating-linear-gradient(\n 45deg,\n #222d32,\n #222d32 10px,\n #444 10px,\n #444 11px\n );\n\n color: #fff;\n font-size: 18px;\n padding: 6px 6px 6px 10px;\n}\n\nlegend.highlight a {\n color: #fff;\n cursor: pointer;\n}\n\nfieldset.bottom-padded {\n padding-bottom: 20px;\n}\n\ncaption.tableCaption {\n font-size: 18px;\n padding-left: 8px;\n}\n\n// via https://github.com/grokability/snipe-it/issues/11754\n.sidebar-toggle.btn {\n border-radius: 3px;\n box-shadow: none;\n border-top: 0px solid transparent;\n border-bottom: 0px solid transparent;\n padding-left: 15px;\n padding-right: 15px;\n padding-top: 12px;\n padding-bottom: 12px;\n margin-left: -47px;\n margin-top: 2px;\n}\n.popover.help-popover,\n.popover.help-popover .popover-content,\n.popover.help-popover .popover-body,\n.popover.help-popover .popover-title,\n.popover.help-popover .popover-header {\n color: #000;\n}\n\n.visually-hidden {\n width: 1px;\n height: 1px;\n margin: -1px;\n overflow: hidden;\n clip: rect(0,0,0,0);\n white-space: preserve;\n display: inline-block;\n}\n\ninput[name=\"columnsSearch\"] {\n width: 120px;\n}"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/css/dist/all.css b/public/css/dist/all.css index 2c5aec8584..4f0251968a 100644 --- a/public/css/dist/all.css +++ b/public/css/dist/all.css @@ -22837,6 +22837,9 @@ caption.tableCaption { white-space: preserve; display: inline-block; } +input[name="columnsSearch"] { + width: 120px; +} /*# sourceMappingURL=app.css.map*/ @@ -24449,6 +24452,9 @@ caption.tableCaption { white-space: preserve; display: inline-block; } +input[name="columnsSearch"] { + width: 120px; +} /*# sourceMappingURL=overrides.css.map*/ \ No newline at end of file diff --git a/public/mix-manifest.json b/public/mix-manifest.json index 99bbd47641..5a456020e0 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -2,8 +2,8 @@ "/js/dist/all.js": "/js/dist/all.js?id=76d88f0f91b852f7eecbce357ab5858b", "/css/dist/skins/skin-black-dark.css": "/css/dist/skins/skin-black-dark.css?id=42f97cd5b9ee7521b04a448e7fc16ac9", "/css/dist/skins/_all-skins.css": "/css/dist/skins/_all-skins.css?id=d81a7ed323f68a7c5e3e9115f7fb5404", - "/css/build/overrides.css": "/css/build/overrides.css?id=d8bef2b8ef03ee8dbb120749211eafc0", - "/css/build/app.css": "/css/build/app.css?id=1bf6a5e78cbccff6e6d32640c28c54b8", + "/css/build/overrides.css": "/css/build/overrides.css?id=d6ec1f1e36c57f8cd96218d2a59a2580", + "/css/build/app.css": "/css/build/app.css?id=d591faf82795dc8151a6d3f84c26f5a4", "/css/build/AdminLTE.css": "/css/build/AdminLTE.css?id=ee0ed88465dd878588ed044eefb67723", "/css/dist/skins/skin-yellow.css": "/css/dist/skins/skin-yellow.css?id=3d8a3d2035ea28aaad4a703c2646f515", "/css/dist/skins/skin-yellow-dark.css": "/css/dist/skins/skin-yellow-dark.css?id=3979929a3423ff35b96b1fc84299fdf3", @@ -19,7 +19,7 @@ "/css/dist/skins/skin-blue.css": "/css/dist/skins/skin-blue.css?id=b2cd9f59d7e8587939ce27b2d3363d82", "/css/dist/skins/skin-blue-dark.css": "/css/dist/skins/skin-blue-dark.css?id=7277edd636cf46aa7786a4449ce0ead7", "/css/dist/skins/skin-black.css": "/css/dist/skins/skin-black.css?id=cbd06cc1d58197ccc81d4376bbaf0d28", - "/css/dist/all.css": "/css/dist/all.css?id=dd5f7ab27ec80569b90d63a883718ff9", + "/css/dist/all.css": "/css/dist/all.css?id=ff957e6cef08b72d32cf28fe50da645a", "/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", diff --git a/resources/assets/less/overrides.less b/resources/assets/less/overrides.less index 0a9fc7c4c6..fdc7702f67 100644 --- a/resources/assets/less/overrides.less +++ b/resources/assets/less/overrides.less @@ -1260,4 +1260,8 @@ caption.tableCaption { clip: rect(0,0,0,0); white-space: preserve; display: inline-block; +} + +input[name="columnsSearch"] { + width: 120px; } \ No newline at end of file diff --git a/resources/views/hardware/index.blade.php b/resources/views/hardware/index.blade.php index fa67078b7b..444c807188 100755 --- a/resources/views/hardware/index.blade.php +++ b/resources/views/hardware/index.blade.php @@ -47,6 +47,8 @@ {{-- Page content --}} @section('content') + +
@@ -66,6 +68,7 @@ data-show-footer="true" data-sort-order="asc" data-sort-name="name" + data-show-columns-search="true" data-toolbar="#assetsBulkEditToolbar" data-bulk-button-id="#bulkAssetEditButton" data-bulk-form-id="#assetsBulkForm" From 2462bc05b3cfc0d6ce39c5c195e3663e81f31bc4 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 19 Sep 2025 12:41:30 +0100 Subject: [PATCH 34/42] Added column search to additional views --- resources/views/categories/view.blade.php | 1 + resources/views/companies/view.blade.php | 1 + resources/views/depreciations/view.blade.php | 1 + resources/views/hardware/checkin-due.blade.php | 1 + resources/views/hardware/view.blade.php | 1 + resources/views/locations/view.blade.php | 3 +++ resources/views/manufacturers/view.blade.php | 1 + resources/views/models/view.blade.php | 1 + resources/views/statuslabels/view.blade.php | 1 + resources/views/suppliers/view.blade.php | 1 + resources/views/users/view.blade.php | 1 + 11 files changed, 13 insertions(+) diff --git a/resources/views/categories/view.blade.php b/resources/views/categories/view.blade.php index 7de415e11c..be11551d4c 100644 --- a/resources/views/categories/view.blade.php +++ b/resources/views/categories/view.blade.php @@ -61,6 +61,7 @@ @if ($category->category_type=='asset') data-columns="{{ \App\Presenters\AssetPresenter::dataTableLayout() }}" + data-show-columns-search="true" data-cookie-id-table="categoryAssetsTable" id="categoryAssetsTable" data-buttons="assetButtons" diff --git a/resources/views/companies/view.blade.php b/resources/views/companies/view.blade.php index 37088b2538..fe3347e81f 100644 --- a/resources/views/companies/view.blade.php +++ b/resources/views/companies/view.blade.php @@ -94,6 +94,7 @@ data-cookie-id-table="assetsListingTable" data-id-table="assetsListingTable" data-side-pagination="server" + data-show-columns-search="true" data-sort-order="asc" data-toolbar="#assetsBulkEditToolbar" data-bulk-button-id="#bulkAssetEditButton" diff --git a/resources/views/depreciations/view.blade.php b/resources/views/depreciations/view.blade.php index 591353ba28..59df3010dd 100644 --- a/resources/views/depreciations/view.blade.php +++ b/resources/views/depreciations/view.blade.php @@ -65,6 +65,7 @@
Date: Mon, 22 Sep 2025 15:23:14 +0200 Subject: [PATCH 35/42] fix typo --- resources/views/settings/backups.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/settings/backups.blade.php b/resources/views/settings/backups.blade.php index baa1d1ebd3..034d9e703c 100644 --- a/resources/views/settings/backups.blade.php +++ b/resources/views/settings/backups.blade.php @@ -150,7 +150,7 @@

- {!! trans('admin/settings/general.backups_path', ['path'=> 'storage/app/backup']) !!} + {!! trans('admin/settings/general.backups_path', ['path'=> 'storage/app/backups']) !!}

@if (config('app.lock_passwords')===true) From d8171eb0566f260986cc969f165aa7a14ff5704b Mon Sep 17 00:00:00 2001 From: snipe Date: Tue, 23 Sep 2025 13:24:56 +0100 Subject: [PATCH 36/42] Remove duplicate PUT route for hardware assets Removed duplicate route definition for updating hardware assets. --- routes/api.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/routes/api.php b/routes/api.php index 988cedb645..5fc5c85a35 100644 --- a/routes/api.php +++ b/routes/api.php @@ -583,9 +583,7 @@ Route::group(['prefix' => 'v1', 'middleware' => ['api', 'api-throttle:api']], fu // the model name to be the parameter - and i think it's a good differentiation in the code while we convert the others. Route::patch('/hardware/{asset}', [Api\AssetsController::class, 'update'])->name('api.assets.update'); Route::put('/hardware/{asset}', [Api\AssetsController::class, 'update'])->name('api.assets.put-update'); - - Route::put('/hardware/{asset}', [Api\AssetsController::class, 'update'])->name('api.assets.put-update'); - + Route::resource('hardware', Api\AssetsController::class, ['names' => [ From c46227ee945ce2b2c15a329cbcf1c7fdbc7a4c5d Mon Sep 17 00:00:00 2001 From: Brady Wetherington Date: Wed, 24 Sep 2025 14:28:49 +0100 Subject: [PATCH 37/42] Fix to the checkout-selector issue --- resources/views/hardware/checkout.blade.php | 2 +- .../partials/forms/checkout-selector.blade.php | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/resources/views/hardware/checkout.blade.php b/resources/views/hardware/checkout.blade.php index a881bf041a..1b2bc3b83b 100755 --- a/resources/views/hardware/checkout.blade.php +++ b/resources/views/hardware/checkout.blade.php @@ -94,7 +94,7 @@
@include ('partials.forms.checkout-selector', ['user_select' => 'true','asset_select' => 'true', 'location_select' => 'true']) - @include ('partials.forms.edit.user-select', ['translated_name' => trans('general.user'), 'fieldname' => 'assigned_user', 'style' => session('checkout_to_type') == 'user' ? '' : 'display: none;']) + @include ('partials.forms.edit.user-select', ['translated_name' => trans('general.user'), 'fieldname' => 'assigned_user', 'style' => (session('checkout_to_type') ?? 'user') == 'user' ? '' : 'display: none;']) @include ('partials.forms.edit.asset-select', ['translated_name' => trans('general.select_asset'), 'fieldname' => 'assigned_asset', 'company_id' => $asset->company_id, 'unselect' => 'true', 'style' => session('checkout_to_type') == 'asset' ? '' : 'display: none;']) @include ('partials.forms.edit.location-select', ['translated_name' => trans('general.location'), 'fieldname' => 'assigned_location', 'style' => session('checkout_to_type') == 'location' ? '' : 'display: none;']) diff --git a/resources/views/partials/forms/checkout-selector.blade.php b/resources/views/partials/forms/checkout-selector.blade.php index f516433ab9..dc27bc191f 100644 --- a/resources/views/partials/forms/checkout-selector.blade.php +++ b/resources/views/partials/forms/checkout-selector.blade.php @@ -4,22 +4,25 @@
@if ((isset($user_select)) && ($user_select!='false')) -
@include ('partials.forms.checkout-selector', ['user_select' => 'true','asset_select' => 'true', 'location_select' => 'true']) - @include ('partials.forms.edit.user-select', ['translated_name' => trans('general.user'), 'fieldname' => 'assigned_user', 'style' => (session('checkout_to_type') ?? 'user') == 'user' ? '' : 'display: none;']) + @include ('partials.forms.edit.user-select', ['translated_name' => trans('general.user'), 'fieldname' => 'assigned_user', 'style' => (session('checkout_to_type') ?: 'user') == 'user' ? '' : 'display: none;']) @include ('partials.forms.edit.asset-select', ['translated_name' => trans('general.select_asset'), 'fieldname' => 'assigned_asset', 'company_id' => $asset->company_id, 'unselect' => 'true', 'style' => session('checkout_to_type') == 'asset' ? '' : 'display: none;']) @include ('partials.forms.edit.location-select', ['translated_name' => trans('general.location'), 'fieldname' => 'assigned_location', 'style' => session('checkout_to_type') == 'location' ? '' : 'display: none;']) diff --git a/resources/views/partials/forms/checkout-selector.blade.php b/resources/views/partials/forms/checkout-selector.blade.php index dc27bc191f..d6151499a0 100644 --- a/resources/views/partials/forms/checkout-selector.blade.php +++ b/resources/views/partials/forms/checkout-selector.blade.php @@ -4,9 +4,9 @@
@if ((isset($user_select)) && ($user_select!='false')) -