Merge remote-tracking branch 'origin/develop'

Signed-off-by: snipe <snipe@snipe.net>

# Conflicts:
#	public/css/build/app.css
#	public/css/build/overrides.css
#	public/css/dist/all.css
#	public/js/build/app.js
#	public/js/dist/all.js
#	public/mix-manifest.json
This commit is contained in:
snipe
2025-03-12 21:26:34 +00:00
24 changed files with 158 additions and 54 deletions

View File

@@ -37,8 +37,10 @@ class AccessoriesTransformer
'purchase_date' => ($accessory->purchase_date) ? Helper::getFormattedDateObject($accessory->purchase_date, 'date') : null,
'purchase_cost' => Helper::formatCurrencyOutput($accessory->purchase_cost),
'order_number' => ($accessory->order_number) ? e($accessory->order_number) : null,
'min_qty' => ($accessory->min_amt) ? (int) $accessory->min_amt : null,
'remaining_qty' => (int) ($accessory->qty - $accessory->checkouts_count),
'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,
'remaining_qty' => (int) ($accessory->qty - $accessory->checkouts_count), // Legacy - should phase out - replaced by below, for the bootstrap table formatter
'remaining' => (int) ($accessory->qty - $accessory->checkouts_count),
'checkouts_count' => $accessory->checkouts_count,
'created_by' => ($accessory->adminuser) ? [
'id' => (int) $accessory->adminuser->id,

View File

@@ -46,8 +46,9 @@ class AssetModelsTransformer
'name'=> e($assetmodel->manufacturer->name),
] : null,
'image' => ($assetmodel->image != '') ? Storage::disk('public')->url('models/'.e($assetmodel->image)) : null,
'model_number' => e($assetmodel->model_number),
'model_number' => ($assetmodel->model_number ? e($assetmodel->model_number): null),
'min_amt' => ($assetmodel->min_amt) ? (int) $assetmodel->min_amt : null,
'remaining' => (int) ($assetmodel->assets_count - $assetmodel->min_amt),
'depreciation' => ($assetmodel->depreciation) ? [
'id' => (int) $assetmodel->depreciation->id,
'name'=> e($assetmodel->depreciation->name),

View File

@@ -38,6 +38,7 @@ class LicensesTransformer
'expiration_date' => Helper::getFormattedDateObject($license->expiration_date, 'date'),
'seats' => (int) $license->seats,
'free_seats_count' => (int) $license->free_seats_count,
'remaining' => (int) $license->free_seats_count,
'min_amt' => ($license->min_amt) ? (int) ($license->min_amt) : null,
'license_name' => ($license->license_name) ? e($license->license_name) : null,
'license_email' => ($license->license_email) ? e($license->license_email) : null,

View File

@@ -78,28 +78,36 @@ class AccessoryPresenter extends Presenter
'sortable' => true,
'title' => trans('general.location'),
'formatter' => 'locationsLinkObjFormatter',
], [
'field' => 'min_amt',
'searchable' => false,
'sortable' => true,
'title' => trans('general.min_amt'),
'formatter' => 'minAmtFormatter',
'class' => 'text-right text-padding-number-cell',
], [
'field' => 'qty',
'searchable' => false,
'sortable' => true,
'title' => trans('admin/accessories/general.total'),
'footerFormatter' => 'qtySumFormatter',
'class' => 'text-right text-padding-number-cell',
], [
'field' => 'remaining_qty',
'field' => 'remaining',
'searchable' => false,
'sortable' => false,
'visible' => false,
'title' => trans('admin/accessories/general.remaining'),
'footerFormatter' => 'qtySumFormatter',
'class' => 'text-right text-padding-number-cell',
],[
'field' => 'checkouts_count',
'searchable' => false,
'sortable' => true,
'visible' => true,
'title' => trans('general.checked_out'),
], [
'field' => 'min_qty',
'searchable' => false,
'sortable' => true,
'title' => trans('general.min_amt'),
'footerFormatter' => 'qtySumFormatter',
'class' => 'text-right text-padding-number-cell',
], [
'field' => 'purchase_date',
'searchable' => true,
@@ -113,7 +121,7 @@ class AccessoryPresenter extends Presenter
'sortable' => true,
'title' => trans('general.purchase_cost'),
'footerFormatter' => 'sumFormatterQuantity',
'class' => 'text-right',
'class' => 'text-right text-padding-number-cell',
], [
'field' => 'order_number',
'searchable' => true,

View File

@@ -74,7 +74,10 @@ class AssetModelPresenter extends Presenter
'switchable' => true,
'title' => trans('mail.min_QTY'),
'visible' => true,
'formatter' => 'minAmtFormatter',
'class' => 'text-right text-padding-number-cell',
],
[
'field' => 'assets_count',
'searchable' => false,
@@ -82,6 +85,19 @@ class AssetModelPresenter extends Presenter
'switchable' => true,
'title' => trans('admin/models/table.numassets'),
'visible' => true,
'class' => 'text-right text-padding-number-cell',
'footerFormatter' => 'qtySumFormatter',
],
[
'field' => 'remaining',
'searchable' => false,
'sortable' => false,
'switchable' => true,
'title' => trans('general.remaining'),
'visible' => true,
'class' => 'text-right text-padding-number-cell',
'footerFormatter' => 'qtySumFormatter',
],
[
'field' => 'depreciation',

View File

@@ -79,24 +79,30 @@ class ComponentPresenter extends Presenter
'title' => trans('general.manufacturer'),
'visible' => false,
'formatter' => 'manufacturersLinkObjFormatter',
], [
'field' => 'min_amt',
'searchable' => false,
'sortable' => true,
'title' => trans('general.min_amt'),
'visible' => true,
'class' => 'text-right text-padding-number-cell',
'formatter' => 'minAmtFormatter',
], [
'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' => false,
'title' => trans('admin/components/general.remaining'),
'visible' => true,
], [
'field' => 'min_amt',
'searchable' => false,
'sortable' => false,
'title' => trans('general.min_amt'),
'visible' => true,
'class' => 'text-right text-padding-number-cell',
'footerFormatter' => 'qtySumFormatter',
], [
'field' => 'location',
'searchable' => true,

View File

@@ -72,25 +72,31 @@ class ConsumablePresenter extends Presenter
'searchable' => true,
'sortable' => true,
'title' => trans('admin/consumables/general.item_no'),
], [
'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' => 'min_amt',
'searchable' => false,
'sortable' => false,
'title' => trans('general.min_amt'),
'visible' => true,
], [
'field' => 'location',
'searchable' => true,
'sortable' => true,
@@ -123,7 +129,7 @@ class ConsumablePresenter extends Presenter
'title' => trans('general.purchase_cost'),
'visible' => true,
'footerFormatter' => 'sumFormatterQuantity',
'class' => 'text-right',
'class' => 'text-right text-padding-number-cell',
], [
'field' => 'notes',
'searchable' => true,

View File

@@ -80,24 +80,28 @@ class LicensePresenter extends Presenter
'sortable' => true,
'title' => trans('general.manufacturer'),
'formatter' => 'manufacturersLinkObjFormatter',
], [
'field' => 'seats',
'searchable' => false,
'sortable' => true,
'title' => trans('admin/accessories/general.total'),
], [
'field' => 'free_seats_count',
'searchable' => false,
'sortable' => true,
'title' => trans('admin/accessories/general.remaining'),
],
[
], [
'field' => 'min_amt',
'searchable' => false,
'sortable' => true,
'title' => trans('mail.min_QTY'),
'formatter' => 'minAmtFormatter',
],[
'class' => 'text-right text-padding-number-cell',
], [
'field' => 'seats',
'searchable' => false,
'sortable' => true,
'title' => trans('admin/accessories/general.total'),
'class' => 'text-right text-padding-number-cell',
'footerFormatter' => 'qtySumFormatter',
], [
'field' => 'free_seats_count',
'searchable' => false,
'sortable' => true,
'title' => trans('admin/accessories/general.remaining'),
'class' => 'text-right text-padding-number-cell',
'footerFormatter' => 'qtySumFormatter',
], [
'field' => 'purchase_date',
'searchable' => true,
'sortable' => true,

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,9 +1,9 @@
{
"/js/build/app.js": "/js/build/app.js?id=5572f3bd32a6131651ab3022edd76941",
"/js/build/app.js": "/js/build/app.js?id=970945c192cb3217d5f371a1931d7d77",
"/css/dist/skins/skin-black-dark.css": "/css/dist/skins/skin-black-dark.css?id=d34ae2483cbe2c77478c45f4006eba55",
"/css/dist/skins/_all-skins.css": "/css/dist/skins/_all-skins.css?id=6bf62cdec2477f3176df196fd0c99662",
"/css/build/overrides.css": "/css/build/overrides.css?id=4f85f2e6fd839b8812dd68d001aae4a3",
"/css/build/app.css": "/css/build/app.css?id=50f697122a35791df98a58bcf0665220",
"/css/build/overrides.css": "/css/build/overrides.css?id=655ce786ac4a9de0c5e40757ddd9a1bd",
"/css/build/app.css": "/css/build/app.css?id=57a9bc8e5cc7737a84bee2f7abcb95c5",
"/css/build/AdminLTE.css": "/css/build/AdminLTE.css?id=a67bd93bed52e6a29967fe472de66d6c",
"/css/dist/skins/skin-yellow.css": "/css/dist/skins/skin-yellow.css?id=fc7adb943668ac69fe4b646625a7571f",
"/css/dist/skins/skin-yellow-dark.css": "/css/dist/skins/skin-yellow-dark.css?id=53edc92eb2d272744bc7404ec259930e",
@@ -19,7 +19,7 @@
"/css/dist/skins/skin-blue.css": "/css/dist/skins/skin-blue.css?id=091d9625203be910caca3e229afe438f",
"/css/dist/skins/skin-blue-dark.css": "/css/dist/skins/skin-blue-dark.css?id=18787b3f00a3be7be38ee4e26cbd2a07",
"/css/dist/skins/skin-black.css": "/css/dist/skins/skin-black.css?id=1f33ca3d860461c1127ec465ab3ebb6b",
"/css/dist/all.css": "/css/dist/all.css?id=baad37c1b095168a326c5bb16b0feb38",
"/css/dist/all.css": "/css/dist/all.css?id=8c095763cd1a12d882e050d89d314ef9",
"/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",
@@ -111,5 +111,5 @@
"/css/dist/bootstrap-table.css": "/css/dist/bootstrap-table.css?id=ceded08e0cc745a83c13647035b03406",
"/js/build/vendor.js": "/js/build/vendor.js?id=89dffa552c6e3abe3a2aac6c9c7b466b",
"/js/dist/bootstrap-table.js": "/js/dist/bootstrap-table.js?id=61285c8ac5ea7b46002ea8c451c94e60",
"/js/dist/all.js": "/js/dist/all.js?id=074c4b862b013dbffef2b075b6aae802"
"/js/dist/all.js": "/js/dist/all.js?id=1a7bd87b50e85aa4f2c4fd6f5ed7722c"
}

View File

@@ -1163,4 +1163,15 @@ input[type="radio"]:checked::before {
/** this is needed to override ekko-lightboxes card view styles **/
.bootstrap-table .fixed-table-container .table tbody tr .card-view {
display: table-row !important;
}
}
td.text-right.text-padding-number-cell {
padding-right: 30px !important;
white-space: nowrap;
}
th.text-right.text-padding-number-footer-cell {
padding-right: 20px !important;
white-space: nowrap;
}

View File

@@ -34,6 +34,7 @@
data-show-refresh="true"
data-show-footer="true"
data-sort-order="asc"
data-footer-style="footerStyle"
id="accessoriesTable"
class="table table-striped snipe-table"
data-url="{{route('api.accessories.index') }}"

View File

@@ -25,6 +25,7 @@
data-id-table="componentsTable"
data-search="true"
data-side-pagination="server"
data-footer-style="footerStyle"
data-show-columns="true"
data-show-fullscreen="true"
data-show-export="true"

View File

@@ -27,6 +27,7 @@
data-id-table="consumablesTable"
data-search="true"
data-side-pagination="server"
data-footer-style="footerStyle"
data-show-columns="true"
data-show-export="true"
data-show-fullscreen="true"

View File

@@ -238,7 +238,7 @@
<tr>
<th data-field="icon" data-visible="true" style="width: 40px;" class="hidden-xs" data-formatter="iconFormatter"><span class="sr-only">{{ trans('admin/hardware/table.icon') }}</span></th>
<th class="col-sm-3" data-visible="true" data-field="created_at" data-formatter="dateDisplayFormatter">{{ trans('general.date') }}</th>
<th class="col-sm-2" data-visible="true" data-field="admin" data-formatter="usersLinkObjFormatter">{{ trans('general.admin') }}</th>
<th class="col-sm-2" data-visible="true" data-field="admin" data-formatter="usersLinkObjFormatter">{{ trans('general.created_by') }}</th>
<th class="col-sm-2" data-visible="true" data-field="action_type">{{ trans('general.action') }}</th>
<th class="col-sm-3" data-visible="true" data-field="item" data-formatter="polymorphicItemFormatter">{{ trans('general.item') }}</th>
<th class="col-sm-2" data-visible="true" data-field="target" data-formatter="polymorphicItemFormatter">{{ trans('general.target') }}</th>

View File

@@ -33,6 +33,7 @@
data-pagination="true"
data-search="true"
data-side-pagination="server"
data-footer-style="footerStyle"
data-show-columns="true"
data-show-fullscreen="true"
data-show-export="true"

View File

@@ -45,6 +45,7 @@
data-search="true"
data-show-footer="true"
data-side-pagination="server"
data-footer-style="footerStyle"
data-show-columns="true"
data-toolbar="#modelsBulkEditToolbar"
data-bulk-button-id="#bulkModelsEditButton"

View File

@@ -13,6 +13,7 @@
<script nonce="{{ csrf_token() }}">
$(function () {
var blockedFields = "searchable,sortable,switchable,title,visible,formatter,class".split(",");
var keyBlocked = function(key) {
@@ -241,7 +242,35 @@
});
// This specifies the footer columns that should have special styles associated
// (usually numbers)
window.footerStyle = column => ({
remaining: {
classes: 'text-padding-number-footer-cell'
},
qty: {
classes: 'text-padding-number-footer-cell',
},
purchase_cost: {
classes: 'text-padding-number-footer-cell'
},
checkouts_count: {
classes: 'text-padding-number-footer-cell'
},
assets_count: {
classes: 'text-padding-number-footer-cell'
},
seats: {
classes: 'text-padding-number-footer-cell'
},
free_seats_count: {
classes: 'text-padding-number-footer-cell'
},
}[column.field]);
// This only works for model index pages because it uses the row's model ID
function genericRowLinkFormatter(destination) {
@@ -664,14 +693,16 @@
function minAmtFormatter(row, value) {
if ((row) && (row!=undefined)) {
if (value.free_seats_count <= value.min_amt) {
return '<span class="text-danger text-bold" data-tooltip="true" title="{{ trans('admin/licenses/general.below_threshold_short') }}">' + value.min_amt + '</span>';
if (value.remaining <= value.min_amt) {
return '<span class="text-danger text-bold" data-tooltip="true" title="{{ trans('admin/licenses/general.below_threshold_short') }}"><x-icon type="warning" class="text-yellow" /> ' + value.min_amt + '</span>';
}
return value.min_amt
}
return '--';
}
// Create a linked phone number in the table list
function phoneFormatter(value) {
@@ -906,6 +937,19 @@
return parseFloat(decimalfixed);
}
function qtySumFormatter(data) {
var currentField = this.field;
var total = 0;
var fieldname = this.field;
$.each(data, function() {
var r = this;
total += this[currentField];
});
return total;
}
function sumFormatter(data) {
if (Array.isArray(data)) {
var field = this.field;