Merge pull request #409 from eReuse/feature/4106-pagination
Feature/4106 pagination
This commit is contained in:
commit
6eb820b69d
|
@ -64,9 +64,17 @@ class DeviceListMixin(GenericMixin):
|
||||||
def get_context(self, lot_id=None, all_devices=False):
|
def get_context(self, lot_id=None, all_devices=False):
|
||||||
super().get_context()
|
super().get_context()
|
||||||
|
|
||||||
|
page = int(request.args.get('page', 1))
|
||||||
|
per_page = int(request.args.get('per_page', PER_PAGE))
|
||||||
|
filter = request.args.get('filter', "All+Computers")
|
||||||
|
# import pdb; pdb.set_trace()
|
||||||
|
|
||||||
lots = self.context['lots']
|
lots = self.context['lots']
|
||||||
form_filter = FilterForm(lots, lot_id, all_devices=all_devices)
|
form_filter = FilterForm(lots, lot_id, all_devices=all_devices)
|
||||||
devices = form_filter.search()
|
devices = form_filter.search().paginate(page=page, per_page=per_page)
|
||||||
|
devices.first = per_page * devices.page - per_page + 1
|
||||||
|
devices.last = len(devices.items) + devices.first - 1
|
||||||
|
|
||||||
lot = None
|
lot = None
|
||||||
form_transfer = ''
|
form_transfer = ''
|
||||||
form_delivery = ''
|
form_delivery = ''
|
||||||
|
@ -95,6 +103,7 @@ class DeviceListMixin(GenericMixin):
|
||||||
'tags': self.get_user_tags(),
|
'tags': self.get_user_tags(),
|
||||||
'list_devices': self.get_selected_devices(form_new_action),
|
'list_devices': self.get_selected_devices(form_new_action),
|
||||||
'all_devices': all_devices,
|
'all_devices': all_devices,
|
||||||
|
'filter': filter,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -161,17 +170,8 @@ class DeviceListView(DeviceListMixin):
|
||||||
|
|
||||||
|
|
||||||
class AllDeviceListView(DeviceListMixin):
|
class AllDeviceListView(DeviceListMixin):
|
||||||
template_name = 'inventory/all_device_list.html'
|
|
||||||
|
|
||||||
def dispatch_request(self):
|
def dispatch_request(self):
|
||||||
self.get_context(all_devices=True)
|
self.get_context(all_devices=True)
|
||||||
# import pdb; pdb.set_trace()
|
|
||||||
page = int(request.args.get('page', 1))
|
|
||||||
per_page = int(request.args.get('per_page', PER_PAGE))
|
|
||||||
devices = self.context['devices'].paginate(page=page, per_page=per_page)
|
|
||||||
devices.first = per_page * devices.page - per_page + 1
|
|
||||||
devices.last = len(devices.items) + devices.first - 1
|
|
||||||
self.context['devices'] = devices
|
|
||||||
return flask.render_template(self.template_name, **self.context)
|
return flask.render_template(self.template_name, **self.context)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1210,43 +1210,17 @@ class SnapshotListView(GenericMixin):
|
||||||
return flask.render_template(self.template_name, **self.context)
|
return flask.render_template(self.template_name, **self.context)
|
||||||
|
|
||||||
def get_snapshots_log(self):
|
def get_snapshots_log(self):
|
||||||
|
page = int(request.args.get('page', 1))
|
||||||
|
per_page = int(request.args.get('per_page', PER_PAGE))
|
||||||
|
|
||||||
snapshots_log = SnapshotsLog.query.filter(
|
snapshots_log = SnapshotsLog.query.filter(
|
||||||
SnapshotsLog.owner == g.user
|
SnapshotsLog.owner == g.user
|
||||||
).order_by(SnapshotsLog.created.desc())
|
).order_by(SnapshotsLog.created.desc())
|
||||||
logs = {}
|
|
||||||
for snap in snapshots_log:
|
|
||||||
try:
|
|
||||||
system_uuid = snap.snapshot.device.system_uuid or ''
|
|
||||||
except AttributeError:
|
|
||||||
system_uuid = ''
|
|
||||||
|
|
||||||
if snap.snapshot_uuid not in logs:
|
snapshots_log = snapshots_log.paginate(page=page, per_page=per_page)
|
||||||
logs[snap.snapshot_uuid] = {
|
snapshots_log.first = per_page * snapshots_log.page - per_page + 1
|
||||||
'sid': snap.sid,
|
snapshots_log.last = len(snapshots_log.items) + snapshots_log.first - 1
|
||||||
'snapshot_uuid': snap.snapshot_uuid,
|
return snapshots_log
|
||||||
'version': snap.version,
|
|
||||||
'device': snap.get_device(),
|
|
||||||
'system_uuid': system_uuid,
|
|
||||||
'status': snap.get_status(),
|
|
||||||
'severity': snap.severity,
|
|
||||||
'created': snap.created,
|
|
||||||
'type_device': snap.get_type_device(),
|
|
||||||
'original_dhid': snap.get_original_dhid(),
|
|
||||||
'new_device': snap.get_new_device(),
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
|
|
||||||
if snap.created > logs[snap.snapshot_uuid]['created']:
|
|
||||||
logs[snap.snapshot_uuid]['created'] = snap.created
|
|
||||||
|
|
||||||
if snap.severity > logs[snap.snapshot_uuid]['severity']:
|
|
||||||
logs[snap.snapshot_uuid]['severity'] = snap.severity
|
|
||||||
logs[snap.snapshot_uuid]['status'] = snap.get_status()
|
|
||||||
|
|
||||||
result = sorted(logs.values(), key=lambda d: d['created'])
|
|
||||||
result.reverse()
|
|
||||||
|
|
||||||
return result
|
|
||||||
|
|
||||||
|
|
||||||
class SnapshotDetailView(GenericMixin):
|
class SnapshotDetailView(GenericMixin):
|
||||||
|
@ -1376,10 +1350,17 @@ class PlaceholderLogListView(GenericMixin):
|
||||||
return flask.render_template(self.template_name, **self.context)
|
return flask.render_template(self.template_name, **self.context)
|
||||||
|
|
||||||
def get_placeholders_log(self):
|
def get_placeholders_log(self):
|
||||||
|
page = int(request.args.get('page', 1))
|
||||||
|
per_page = int(request.args.get('per_page', PER_PAGE))
|
||||||
|
|
||||||
placeholder_log = PlaceholdersLog.query.filter(
|
placeholder_log = PlaceholdersLog.query.filter(
|
||||||
PlaceholdersLog.owner == g.user
|
PlaceholdersLog.owner == g.user
|
||||||
).order_by(PlaceholdersLog.created.desc())
|
).order_by(PlaceholdersLog.created.desc())
|
||||||
|
|
||||||
|
placeholder_log = placeholder_log.paginate(page=page, per_page=per_page)
|
||||||
|
placeholder_log.first = per_page * placeholder_log.page - per_page + 1
|
||||||
|
placeholder_log.last = len(placeholder_log.items) + placeholder_log.first - 1
|
||||||
|
|
||||||
return placeholder_log
|
return placeholder_log
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -78,6 +78,12 @@ class SnapshotsLog(Thing):
|
||||||
snapshots.append(s)
|
snapshots.append(s)
|
||||||
return snapshots and 'Update' or 'New Device'
|
return snapshots and 'Update' or 'New Device'
|
||||||
|
|
||||||
|
def get_system_uuid(self):
|
||||||
|
try:
|
||||||
|
return self.snapshot.device.system_uuid or ''
|
||||||
|
except AttributeError:
|
||||||
|
return ''
|
||||||
|
|
||||||
|
|
||||||
class PlaceholdersLog(Thing):
|
class PlaceholdersLog(Thing):
|
||||||
"""A Placeholder log."""
|
"""A Placeholder log."""
|
||||||
|
|
|
@ -1,671 +0,0 @@
|
||||||
{% extends "ereuse_devicehub/base_site.html" %}
|
|
||||||
{% block main %}
|
|
||||||
|
|
||||||
<div class="pagetitle">
|
|
||||||
<h1>Inventory</h1>
|
|
||||||
<nav>
|
|
||||||
<ol class="breadcrumb">
|
|
||||||
<li class="breadcrumb-item"><a href="{{ url_for('inventory.alldevicelist')}}">Inventory</a></li>
|
|
||||||
{% if not lot %}
|
|
||||||
<li class="breadcrumb-item active">All devices</li>
|
|
||||||
{% elif lot.is_temporary %}
|
|
||||||
<li class="breadcrumb-item active">Temporary Lot</li>
|
|
||||||
<li class="breadcrumb-item active">{{ lot.name }}</li>
|
|
||||||
{% elif lot.is_incoming %}
|
|
||||||
<li class="breadcrumb-item active">Incoming Lot</li>
|
|
||||||
<li class="breadcrumb-item active">{{ lot.name }}</li>
|
|
||||||
{% elif lot.is_outgoing %}
|
|
||||||
<li class="breadcrumb-item active">Outgoing Lot</li>
|
|
||||||
<li class="breadcrumb-item active">{{ lot.name }}</li>
|
|
||||||
{% endif %}
|
|
||||||
</ol>
|
|
||||||
</nav>
|
|
||||||
</div><!-- End Page Title -->
|
|
||||||
|
|
||||||
<section class="section profile">
|
|
||||||
<div class="row">
|
|
||||||
|
|
||||||
<div class="col-xl-12">
|
|
||||||
|
|
||||||
<div class="card">
|
|
||||||
{% if lot %}
|
|
||||||
<div class="card-body pt-3">
|
|
||||||
<!-- Bordered Tabs -->
|
|
||||||
|
|
||||||
<div class="d-flex align-items-center justify-content-between row">
|
|
||||||
<div class="col-sm-12 col-md-5">
|
|
||||||
<h3>
|
|
||||||
<a href="{{ url_for('inventory.lot_edit', id=lot.id) }}">{{ lot.name }}</a>
|
|
||||||
</h3>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-sm-12 col-md-7 d-md-flex justify-content-md-end"><!-- lot actions -->
|
|
||||||
{% if lot.is_temporary or not lot.transfer.closed %}
|
|
||||||
|
|
||||||
{% if lot and lot.is_temporary %}
|
|
||||||
<a type="button" href="{{ url_for('inventory.lot_new_transfer', lot_id=lot.id, type_id='outgoing') }}" class="btn btn-primary doTransfer" >
|
|
||||||
Create Outgoing Lot
|
|
||||||
</a>
|
|
||||||
<a type="button" href="{{ url_for('inventory.lot_new_transfer', lot_id=lot.id, type_id='incoming') }}" class="btn btn-primary doTransfer">
|
|
||||||
Create Incoming Lot
|
|
||||||
</a>
|
|
||||||
{% endif %}
|
|
||||||
<a class="text-danger" href="javascript:removeLot()">
|
|
||||||
<i class="bi bi-trash"></i> Delete Lot
|
|
||||||
</a>
|
|
||||||
<span class="d-none" id="activeRemoveLotModal" data-bs-toggle="modal" data-bs-target="#btnRemoveLots"></span>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
<div class="card-body pt-3" style="min-height: 650px;">
|
|
||||||
<!-- Bordered Tabs -->
|
|
||||||
{% if lot %}
|
|
||||||
<ul class="nav nav-tabs nav-tabs-bordered">
|
|
||||||
|
|
||||||
<li class="nav-item">
|
|
||||||
<button class="nav-link active" data-bs-toggle="tab" data-bs-target="#devices-list">Devices</button>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
{% if lot and not lot.is_temporary %}
|
|
||||||
<li class="nav-item">
|
|
||||||
<button class="nav-link" data-bs-toggle="tab" data-bs-target="#trade-documents-list">Documents</button>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
{% if lot.transfer %}
|
|
||||||
<li class="nav-item">
|
|
||||||
<button class="nav-link" data-bs-toggle="tab" data-bs-target="#edit-transfer">
|
|
||||||
Transfer ({% if lot.transfer.closed %}<span class="text-danger">Closed</span>{% else %}<span class="text-success">Open</span>{% endif %})
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<button class="nav-link" data-bs-toggle="tab" data-bs-target="#edit-delivery-note">
|
|
||||||
Delivery Note
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<button class="nav-link" data-bs-toggle="tab" data-bs-target="#edit-receiver-note">
|
|
||||||
Receiver Note
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
{% endif %}
|
|
||||||
<div class="tab-content pt-1">
|
|
||||||
<div id="devices-list" class="tab-pane fade devices-list active show">
|
|
||||||
<label class="btn btn-primary " for="SelectAllBTN"><input type="checkbox" id="SelectAllBTN" autocomplete="off"></label>
|
|
||||||
<div class="btn-group dropdown ml-1">
|
|
||||||
<button id="btnLots" type="button" onclick="processSelectedDevices()" class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
|
|
||||||
<i class="bi bi-folder2"></i>
|
|
||||||
Lots
|
|
||||||
<span class="caret"></span>
|
|
||||||
</button>
|
|
||||||
<span class="d-none" id="activeTradeModal" data-bs-toggle="modal" data-bs-target="#tradeLotModal"></span>
|
|
||||||
|
|
||||||
<ul class="dropdown-menu" aria-labelledby="btnLots" id="dropDownLotsSelector">
|
|
||||||
<div class="row w-100">
|
|
||||||
<div class="input-group mb-3 mx-2">
|
|
||||||
<div class="input-group-prepend">
|
|
||||||
<span class="input-group-text" id="basic-addon1"><i class="bi bi-search"></i></span>
|
|
||||||
</div>
|
|
||||||
<input type="text" class="form-control" id="lots-search" placeholder="search" aria-label="search" aria-describedby="basic-addon1">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<h6 class="dropdown-header">Select lots where to store the selected devices</h6>
|
|
||||||
<ul class="mx-3" id="LotsSelector"></ul>
|
|
||||||
<li><hr /></li>
|
|
||||||
<li>
|
|
||||||
<a href="#" class="dropdown-item" id="ApplyDeviceLots">
|
|
||||||
<i class="bi bi-check"></i>
|
|
||||||
Apply
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div class="btn-group dropdown m-1" uib-dropdown="">
|
|
||||||
<button id="btnActions" type="button" class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
|
|
||||||
<i class="bi bi-plus"></i>
|
|
||||||
Actions
|
|
||||||
</button>
|
|
||||||
<span class="d-none" id="activeActionModal" data-bs-toggle="modal" data-bs-target="#actionModal"></span>
|
|
||||||
<span class="d-none" id="activeAllocateModal" data-bs-toggle="modal" data-bs-target="#allocateModal"></span>
|
|
||||||
<span class="d-none" id="activeDatawipeModal" data-bs-toggle="modal" data-bs-target="#datawipeModal"></span>
|
|
||||||
<ul class="dropdown-menu" aria-labelledby="btnActions">
|
|
||||||
<li>
|
|
||||||
Status actions
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="javascript:newAction('Recycling')" class="dropdown-item">
|
|
||||||
<i class="bi bi-recycle"></i>
|
|
||||||
Recycling
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="javascript:newAction('Use')" class="dropdown-item">
|
|
||||||
<i class="bi bi-play-circle-fill"></i>
|
|
||||||
Use
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="javascript:newAction('Refurbish')" class="dropdown-item">
|
|
||||||
<i class="bi bi-tools"></i>
|
|
||||||
Refurbish
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="javascript:newAction('Management')" class="dropdown-item">
|
|
||||||
<i class="bi bi-mastodon"></i>
|
|
||||||
Management
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
Allocation
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="javascript:newAllocate('Allocate')" class="dropdown-item">
|
|
||||||
<i class="bi bi-house-fill"></i>
|
|
||||||
Allocate
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="javascript:newAllocate('Deallocate')" class="dropdown-item">
|
|
||||||
<i class="bi bi-house"></i>
|
|
||||||
Deallocate
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
Physical actions
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="javascript:newAction('ToPrepare')" class="dropdown-item">
|
|
||||||
<i class="bi bi-tools"></i>
|
|
||||||
ToPrepare
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="javascript:newAction('Prepare')" class="dropdown-item">
|
|
||||||
<i class="bi bi-egg"></i>
|
|
||||||
Prepare
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="javascript:newDataWipe('DataWipe')" class="dropdown-item">
|
|
||||||
<i class="bi bi-eraser-fill"></i>
|
|
||||||
DataWipe
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="javascript:newAction('ToRepair')" class="dropdown-item">
|
|
||||||
<i class="bi bi-screwdriver"></i>
|
|
||||||
ToRepair
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="javascript:newAction('Ready')" class="dropdown-item">
|
|
||||||
<i class="bi bi-check2-all"></i>
|
|
||||||
Ready
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="btn-group dropdown m-1" uib-dropdown="">
|
|
||||||
<button id="btnExport" type="button" class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
|
|
||||||
<i class="bi bi-reply"></i>
|
|
||||||
Exports
|
|
||||||
</button>
|
|
||||||
<span class="d-none" id="exportAlertModal" data-bs-toggle="modal" data-bs-target="#exportErrorModal"></span>
|
|
||||||
<ul class="dropdown-menu" aria-labelledby="btnExport">
|
|
||||||
<li>
|
|
||||||
<a href="javascript:export_file('devices')" class="dropdown-item">
|
|
||||||
<i class="bi bi-file-spreadsheet"></i>
|
|
||||||
Devices Spreadsheet
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="javascript:export_file('devices_lots')" class="dropdown-item">
|
|
||||||
<i class="bi bi-file-spreadsheet"></i>
|
|
||||||
Devices Lots Spreadsheet
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="javascript:export_file('obada_standard')" class="dropdown-item">
|
|
||||||
<i class="bi bi-file-spreadsheet"></i>
|
|
||||||
Obada Standard Spreadsheet
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="javascript:export_file('certificates')" class="dropdown-item">
|
|
||||||
<i class="bi bi-eraser-fill"></i>
|
|
||||||
Erasure Certificate
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="btn-group dropdown m-1" uib-dropdown="">
|
|
||||||
<button id="btnTags" type="button" class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
|
|
||||||
<i class="bi bi-tag"></i>
|
|
||||||
Labels
|
|
||||||
</button>
|
|
||||||
<ul class="dropdown-menu" aria-labelledby="btnTags">
|
|
||||||
<li>
|
|
||||||
<form id="print_labels" method="post" action="{{ url_for('labels.print_labels') }}">
|
|
||||||
{% for f in form_print_labels %}
|
|
||||||
{{ f }}
|
|
||||||
{% endfor %}
|
|
||||||
<a href="javascript:$('#print_labels').submit()" class="dropdown-item">
|
|
||||||
<i class="bi bi-printer"></i>
|
|
||||||
Print labels
|
|
||||||
</a>
|
|
||||||
</form>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="btn-group dropdown m-1" uib-dropdown="">
|
|
||||||
<button id="btnSnapshot" type="button" class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
|
|
||||||
<i class="bi bi-laptop"></i>
|
|
||||||
Placeholders
|
|
||||||
</button>
|
|
||||||
<ul class="dropdown-menu" aria-labelledby="btnSnapshot">
|
|
||||||
<li>
|
|
||||||
{% if lot %}
|
|
||||||
<a href="{{ url_for('inventory.lot_upload_placeholder', lot_id=lot.id) }}" class="dropdown-item">
|
|
||||||
{% else %}
|
|
||||||
<a href="{{ url_for('inventory.upload_placeholder') }}" class="dropdown-item">
|
|
||||||
{% endif %}
|
|
||||||
<i class="bi bi-upload"></i>
|
|
||||||
Upload Spreadsheet
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
{% if lot %}
|
|
||||||
<a href="{{ url_for('inventory.lot_device_add', lot_id=lot.id) }}" class="dropdown-item">
|
|
||||||
{% else %}
|
|
||||||
<a href="{{ url_for('inventory.device_add') }}" class="dropdown-item">
|
|
||||||
{% endif %}
|
|
||||||
<i class="bi bi-plus"></i>
|
|
||||||
Create a new
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="btn-group dropdown m-1" uib-dropdown="">
|
|
||||||
<button id="btnSnapshot" type="button" class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
|
|
||||||
<i class="bi bi-laptop"></i>
|
|
||||||
Snapshots
|
|
||||||
</button>
|
|
||||||
<ul class="dropdown-menu" aria-labelledby="btnSnapshot">
|
|
||||||
<li>
|
|
||||||
{% if lot %}
|
|
||||||
<a href="{{ url_for('inventory.lot_upload_snapshot', lot_id=lot.id) }}" class="dropdown-item">
|
|
||||||
{% else %}
|
|
||||||
<a href="{{ url_for('inventory.upload_snapshot') }}" class="dropdown-item">
|
|
||||||
{% endif %}
|
|
||||||
<i class="bi bi-upload"></i>
|
|
||||||
Upload files
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="select-devices-info" class="alert alert-info mb-0 mt-3 d-none" role="alert">
|
|
||||||
If this text is showing is because there are an error
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="tab-content pt-2">
|
|
||||||
<form method="get">
|
|
||||||
<div class="d-flex mt-4 mb-4">
|
|
||||||
{% for f in form_filter %}
|
|
||||||
{{ f }}
|
|
||||||
{% endfor %}
|
|
||||||
<input type="submit" class="ms-2 btn btn-primary" value="Filter" />
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
<p class="mt-3">
|
|
||||||
Displaying devices of type
|
|
||||||
<em>{{ form_filter.filter.data or "Computer" }}</em>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<div class="dataTable-top" style="float: left;">
|
|
||||||
<div class="dataTable-dropdown">
|
|
||||||
<label>
|
|
||||||
<select class="dataTable-selector">
|
|
||||||
<option value="5"{% if devices.per_page == 5 %} selected="selected"{% endif %}>
|
|
||||||
5
|
|
||||||
</option>
|
|
||||||
<option value="10"{% if devices.per_page == 10 %} selected="selected"{% endif %}>
|
|
||||||
10
|
|
||||||
</option>
|
|
||||||
<option value="15"{% if devices.per_page == 15 %} selected="selected"{% endif %}>
|
|
||||||
15
|
|
||||||
</option>
|
|
||||||
<option value="20"{% if devices.per_page == 20 %} selected="selected"{% endif %}>
|
|
||||||
20
|
|
||||||
</option>
|
|
||||||
<option value="25"{% if devices.per_page == 25 %} selected="selected"{% endif %}>
|
|
||||||
25
|
|
||||||
</option>
|
|
||||||
<option value="50"{% if devices.per_page == 50 %} selected="selected"{% endif %}>
|
|
||||||
50
|
|
||||||
</option>
|
|
||||||
<option value="100"{% if devices.per_page == 100 %} selected="selected"{% endif %}>
|
|
||||||
100
|
|
||||||
</option>
|
|
||||||
</select> entries per page
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
<div class="dataTable-search">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="dataTable-container">
|
|
||||||
<table class="table">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th scope="col">Select</th>
|
|
||||||
<th scope="col">Title</th>
|
|
||||||
<th scope="col">DHID</th>
|
|
||||||
<th scope="col">PHID</th>
|
|
||||||
<th scope="col">Type</th>
|
|
||||||
<th scope="col">Unique Identifiers</th>
|
|
||||||
<th scope="col">Lifecycle Status</th>
|
|
||||||
<th scope="col">Allocated Status</th>
|
|
||||||
<th scope="col">Physical Status</th>
|
|
||||||
<th scope="col" data-type="date" data-format="YYYY-MM-DD">Updated in</th>
|
|
||||||
<th scope="col" data-type="date" data-format="YYYY-MM-DD hh:mm:ss">Registered in</th>
|
|
||||||
<th scope="col"></th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for dev in devices.items %}
|
|
||||||
{% if dev.placeholder and (not dev.parent_id or dev.parent.placeholder.kangaroo) %}
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<input type="checkbox" class="deviceSelect" data="{{ dev.id }}"
|
|
||||||
data-device-type="{{ dev.type }}" data-device-manufacturer="{{ dev.manufacturer }}"
|
|
||||||
data-device-dhid="{{ dev.devicehub_id }}" data-device-vname="{{ dev.verbose_name }}"
|
|
||||||
{% if form_new_allocate.type.data and dev.id in list_devices %}
|
|
||||||
checked="checked"
|
|
||||||
{% endif %}
|
|
||||||
/>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="{{ url_for('inventory.device_details', id=dev.devicehub_id)}}">
|
|
||||||
{% if dev.get_type_logo() %}
|
|
||||||
<i class="{{ dev.get_type_logo() }}" title="{{ dev.type }}"></i>
|
|
||||||
{% endif %}
|
|
||||||
{{ dev.verbose_name }}
|
|
||||||
</a>
|
|
||||||
{% if dev.lots | length > 0 %}
|
|
||||||
<h6 class="d-inline">
|
|
||||||
{% for lot in dev.get_lots_for_template() %}
|
|
||||||
<span class="badge rounded-pill bg-light text-dark">{{ lot }}</span>
|
|
||||||
{% endfor %}
|
|
||||||
</h6>
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="{{ url_for('inventory.device_details', id=dev.devicehub_id)}}">
|
|
||||||
{{ dev.devicehub_id }}
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
{{ dev.binding and dev.binding.phid or dev.placeholder and dev.placeholder.phid or '' }}
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
{{ dev.is_abstract() }}
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
{% for t in dev.tags | sort(attribute="id") %}
|
|
||||||
<a href="{{ url_for('labels.label_details', id=t.id)}}">{{ t.id }}</a>
|
|
||||||
{% if not loop.last %},{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
</td>
|
|
||||||
<td>{% if dev.status %}{{ dev.status.type }}{% endif %}</td>
|
|
||||||
<td>{% if dev.allocated_status %}{{ dev.allocated_status.type }}{% endif %}</td>
|
|
||||||
<td>{% if dev.physical_status %}{{ dev.physical_status.type }}{% endif %}</td>
|
|
||||||
<td>{{ dev.get_updated.strftime('%Y-%m-%d %H:%M:%S')}}</td>
|
|
||||||
<td>{{ dev.created.strftime('%Y-%m-%d %H:%M:%S')}}</td>
|
|
||||||
<td>
|
|
||||||
<a href="{{ dev.public_link }}" target="_blank">
|
|
||||||
<i class="bi bi-box-arrow-up-right"></i>
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<div class="dataTable-bottom">
|
|
||||||
<div class="dataTable-info">
|
|
||||||
Showing {{ devices.first }} to {{ devices.last }} of {{ devices.total }} entries
|
|
||||||
</div>
|
|
||||||
<nav class="dataTable-pagination">
|
|
||||||
<ul class="dataTable-pagination-list">
|
|
||||||
{% if devices.has_prev %}
|
|
||||||
<li class="pager">
|
|
||||||
<a href="{{ url_for('inventory.alldevicelist', page=devices.prev_num, per_page=devices.per_page) }}">‹</a>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
{% for page in devices.iter_pages() %}
|
|
||||||
{% if page %}
|
|
||||||
{% if page == devices.page %}
|
|
||||||
<li class="active"><a href="javascript:void()">{{ page }}</a></li>
|
|
||||||
{% else %}
|
|
||||||
<li class="">
|
|
||||||
<a href="{{ url_for('inventory.alldevicelist', page=page, per_page=devices.per_page) }}">
|
|
||||||
{{ page }}
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
{% if devices.has_next %}
|
|
||||||
<li class="pager">
|
|
||||||
<a href="{{ url_for('inventory.alldevicelist', page=devices.next_num, per_page=devices.per_page) }}">›</a>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% if lot and not lot.is_temporary %}
|
|
||||||
<div id="trade-documents-list" class="tab-pane fade trade-documents-list">
|
|
||||||
<div class="btn-group dropdown ml-1 mt-1" uib-dropdown="">
|
|
||||||
<a href="{{ url_for('inventory.trade_document_add', lot_id=lot.id)}}" class="btn btn-primary">
|
|
||||||
<i class="bi bi-plus"></i>
|
|
||||||
Add new document
|
|
||||||
<span class="caret"></span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h5 class="card-title">Documents</h5>
|
|
||||||
<table class="table">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th scope="col">File</th>
|
|
||||||
<th scope="col" data-type="date" data-format="YYYY-MM-DD hh:mm">Uploaded on</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for doc in lot.documents %}
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
{% if doc.get_url() %}
|
|
||||||
<a href="{{ doc.get_url() }}" target="_blank">{{ doc.file_name}}</a>
|
|
||||||
{% else %}
|
|
||||||
{{ doc.file_name}}
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
{{ doc.created.strftime('%Y-%m-%d %H:%M')}}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
{% for doc in lot.trade.documents %}
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
{% if doc.get_url() %}
|
|
||||||
<a href="{{ doc.get_url() }}" target="_blank">{{ doc.file_name}}</a>
|
|
||||||
{% else %}
|
|
||||||
{{ doc.file_name}}
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
{{ doc.created.strftime('%Y-%m-%d %H:%M')}}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<div id="edit-transfer" class="tab-pane fade edit-transfer">
|
|
||||||
<h5 class="card-title">Transfer</h5>
|
|
||||||
<form method="post" action="{{ url_for('inventory.edit_transfer', lot_id=lot.id) }}" class="row g-3 needs-validation" novalidate>
|
|
||||||
{{ form_transfer.csrf_token }}
|
|
||||||
|
|
||||||
{% for field in form_transfer %}
|
|
||||||
{% if field != form_transfer.csrf_token %}
|
|
||||||
<div class="col-12">
|
|
||||||
{% if field != form_transfer.type %}
|
|
||||||
{{ field.label(class_="form-label") }}
|
|
||||||
{% if field == form_transfer.code %}
|
|
||||||
<span class="text-danger">*</span>
|
|
||||||
{% endif %}
|
|
||||||
{{ field }}
|
|
||||||
<small class="text-muted">{{ field.description }}</small>
|
|
||||||
{% if field.errors %}
|
|
||||||
<p class="text-danger">
|
|
||||||
{% for error in field.errors %}
|
|
||||||
{{ error }}<br/>
|
|
||||||
{% endfor %}
|
|
||||||
</p>
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<a href="{{ url_for('inventory.lotdevicelist', lot_id=lot.id) }}" class="btn btn-danger">Cancel</a>
|
|
||||||
<button class="btn btn-primary" type="submit">Save</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
<div id="edit-delivery-note" class="tab-pane fade edit-delivery-note">
|
|
||||||
<h5 class="card-title">Delivery Note</h5>
|
|
||||||
<form method="post" action="{{ url_for('inventory.delivery_note', lot_id=lot.id) }}" class="row g-3 needs-validation" novalidate>
|
|
||||||
{{ form_delivery.csrf_token }}
|
|
||||||
|
|
||||||
{% for field in form_delivery %}
|
|
||||||
{% if field != form_delivery.csrf_token %}
|
|
||||||
<div class="col-12">
|
|
||||||
{% if field != form_delivery.type %}
|
|
||||||
{{ field.label(class_="form-label") }}
|
|
||||||
{{ field }}
|
|
||||||
<small class="text-muted">{{ field.description }}</small>
|
|
||||||
{% if field.errors %}
|
|
||||||
<p class="text-danger">
|
|
||||||
{% for error in field.errors %}
|
|
||||||
{{ error }}<br/>
|
|
||||||
{% endfor %}
|
|
||||||
</p>
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
{% if lot.transfer and form_receiver.is_editable() %}
|
|
||||||
<div>
|
|
||||||
<a href="{{ url_for('inventory.lotdevicelist', lot_id=lot.id) }}" class="btn btn-danger">Cancel</a>
|
|
||||||
<button class="btn btn-primary" type="submit">Save</button>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
<div id="edit-receiver-note" class="tab-pane fade edit-receiver-note">
|
|
||||||
<h5 class="card-title">Receiver Note</h5>
|
|
||||||
<form method="post" action="{{ url_for('inventory.receiver_note', lot_id=lot.id) }}" class="row g-3 needs-validation" novalidate>
|
|
||||||
{{ form_receiver.csrf_token }}
|
|
||||||
|
|
||||||
{% for field in form_receiver %}
|
|
||||||
{% if field != form_receiver.csrf_token %}
|
|
||||||
<div class="col-12">
|
|
||||||
{% if field != form_receiver.type %}
|
|
||||||
{{ field.label(class_="form-label") }}
|
|
||||||
{{ field }}
|
|
||||||
<small class="text-muted">{{ field.description }}</small>
|
|
||||||
{% if field.errors %}
|
|
||||||
<p class="text-danger">
|
|
||||||
{% for error in field.errors %}
|
|
||||||
{{ error }}<br/>
|
|
||||||
{% endfor %}
|
|
||||||
</p>
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
{% if lot.transfer and form_receiver.is_editable() %}
|
|
||||||
<div>
|
|
||||||
<a href="{{ url_for('inventory.lotdevicelist', lot_id=lot.id) }}" class="btn btn-danger">Cancel</a>
|
|
||||||
<button class="btn btn-primary" type="submit">Save</button>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
</div><!-- End Bordered Tabs -->
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="NotificationsContainer" style="position: absolute; bottom: 0; right: 0; margin: 10px; margin-top: 70px; width: calc(100% - 310px);"></div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
{% include "inventory/lot_delete_modal.html" %}
|
|
||||||
{% include "inventory/actions.html" %}
|
|
||||||
{% include "inventory/allocate.html" %}
|
|
||||||
{% include "inventory/data_wipe.html" %}
|
|
||||||
{% include "inventory/trade.html" %}
|
|
||||||
{% include "inventory/alert_export_error.html" %}
|
|
||||||
{% include "inventory/alert_lots_changes.html" %}
|
|
||||||
|
|
||||||
<!-- Custom Code -->
|
|
||||||
<script>
|
|
||||||
$(document).ready(() => {
|
|
||||||
$(".dataTable-selector").on("change", function() {
|
|
||||||
const per_page = $('.dataTable-selector').val();
|
|
||||||
window.location.href = "{{ url_for('inventory.alldevicelist', page=1) }}&per_page="+per_page;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
<script>
|
|
||||||
let table = new simpleDatatables.DataTable("table", {
|
|
||||||
footer: false,
|
|
||||||
paging: false,
|
|
||||||
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
{% if config['DEBUG'] %}
|
|
||||||
<script src="{{ url_for('static', filename='js/main_inventory.js') }}"></script>
|
|
||||||
{% else %}
|
|
||||||
<script src="{{ url_for('static', filename='js/main_inventory.build.js') }}"></script>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
|
|
||||||
{% endblock main %}
|
|
|
@ -7,7 +7,11 @@
|
||||||
<ol class="breadcrumb">
|
<ol class="breadcrumb">
|
||||||
<li class="breadcrumb-item"><a href="{{ url_for('inventory.devicelist')}}">Inventory</a></li>
|
<li class="breadcrumb-item"><a href="{{ url_for('inventory.devicelist')}}">Inventory</a></li>
|
||||||
{% if not lot %}
|
{% if not lot %}
|
||||||
<li class="breadcrumb-item active">Unassigned</li>
|
{% if all_devices %}
|
||||||
|
<li class="breadcrumb-item active">All devices</li>
|
||||||
|
{% else %}
|
||||||
|
<li class="breadcrumb-item active">Unassigned</li>
|
||||||
|
{% endif %}
|
||||||
{% elif lot.is_temporary %}
|
{% elif lot.is_temporary %}
|
||||||
<li class="breadcrumb-item active">Temporary Lot</li>
|
<li class="breadcrumb-item active">Temporary Lot</li>
|
||||||
<li class="breadcrumb-item active">{{ lot.name }}</li>
|
<li class="breadcrumb-item active">{{ lot.name }}</li>
|
||||||
|
@ -226,10 +230,17 @@
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
|
{% if not all_devices %}
|
||||||
<span class="dropdown-item" style="color: #999ea4;">
|
<span class="dropdown-item" style="color: #999ea4;">
|
||||||
<i class="bi bi-file-spreadsheet"></i>
|
<i class="bi bi-file-spreadsheet"></i>
|
||||||
Devices Lots Spreadsheet
|
Devices Lots Spreadsheet
|
||||||
</span>
|
</span>
|
||||||
|
{% else %}
|
||||||
|
<a href="javascript:export_file('devices_lots')" class="dropdown-item">
|
||||||
|
<i class="bi bi-file-spreadsheet"></i>
|
||||||
|
Devices Lots Spreadsheet
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="javascript:export_file('obada_standard')" class="dropdown-item">
|
<a href="javascript:export_file('obada_standard')" class="dropdown-item">
|
||||||
|
@ -324,6 +335,8 @@
|
||||||
{% for f in form_filter %}
|
{% for f in form_filter %}
|
||||||
{{ f }}
|
{{ f }}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
<input type="hidden" class="d-none" value="1" name="page" />
|
||||||
|
<input type="hidden" class="d-none" value="{{ devices.per_page }}" name="per_page" />
|
||||||
<input type="submit" class="ms-2 btn btn-primary" value="Filter" />
|
<input type="submit" class="ms-2 btn btn-primary" value="Filter" />
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
@ -333,6 +346,38 @@
|
||||||
<em>{{ form_filter.filter.data or "Computer" }}</em>
|
<em>{{ form_filter.filter.data or "Computer" }}</em>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<div class="dataTable-top" style="float: left;">
|
||||||
|
<div class="dataTable-dropdown">
|
||||||
|
<label>
|
||||||
|
<select class="dataTable-selector">
|
||||||
|
<option value="5"{% if devices.per_page == 5 %} selected="selected"{% endif %}>
|
||||||
|
5
|
||||||
|
</option>
|
||||||
|
<option value="10"{% if devices.per_page == 10 %} selected="selected"{% endif %}>
|
||||||
|
10
|
||||||
|
</option>
|
||||||
|
<option value="15"{% if devices.per_page == 15 %} selected="selected"{% endif %}>
|
||||||
|
15
|
||||||
|
</option>
|
||||||
|
<option value="20"{% if devices.per_page == 20 %} selected="selected"{% endif %}>
|
||||||
|
20
|
||||||
|
</option>
|
||||||
|
<option value="25"{% if devices.per_page == 25 %} selected="selected"{% endif %}>
|
||||||
|
25
|
||||||
|
</option>
|
||||||
|
<option value="50"{% if devices.per_page == 50 %} selected="selected"{% endif %}>
|
||||||
|
50
|
||||||
|
</option>
|
||||||
|
<option value="100"{% if devices.per_page == 100 %} selected="selected"{% endif %}>
|
||||||
|
100
|
||||||
|
</option>
|
||||||
|
</select> entries per page
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="dataTable-search">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="dataTable-container">
|
||||||
<table class="table">
|
<table class="table">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
@ -351,7 +396,7 @@
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for dev in devices %}
|
{% for dev in devices.items %}
|
||||||
{% if dev.placeholder and (not dev.parent_id or dev.parent.placeholder.kangaroo) %}
|
{% if dev.placeholder and (not dev.parent_id or dev.parent.placeholder.kangaroo) %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
|
@ -410,6 +455,57 @@
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<div class="dataTable-bottom">
|
||||||
|
<div class="dataTable-info">
|
||||||
|
Showing {{ devices.first }} to {{ devices.last }} of {{ devices.total }} entries
|
||||||
|
</div>
|
||||||
|
<nav class="dataTable-pagination">
|
||||||
|
<ul class="dataTable-pagination-list">
|
||||||
|
{% if devices.has_prev %}
|
||||||
|
<li class="pager">
|
||||||
|
{% if all_devices %}
|
||||||
|
<a href="{{ url_for('inventory.alldevicelist', page=devices.prev_num, per_page=devices.per_page, filter=filter) }}">‹</a>
|
||||||
|
{% elif lot %}
|
||||||
|
<a href="{{ url_for('inventory.lotdevicelist', lot_id=lot.id, page=devices.prev_num, per_page=devices.per_page, filter=filter) }}">‹</a>
|
||||||
|
{% else %}
|
||||||
|
<a href="{{ url_for('inventory.devicelist', page=devices.prev_num, per_page=devices.per_page, filter=filter) }}">‹</a>
|
||||||
|
{% endif %}
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% for page in devices.iter_pages() %}
|
||||||
|
{% if page %}
|
||||||
|
{% if page == devices.page %}
|
||||||
|
<li class="active"><a href="javascript:void()">{{ page }}</a></li>
|
||||||
|
{% else %}
|
||||||
|
<li class="">
|
||||||
|
{% if all_devices %}
|
||||||
|
<a href="{{ url_for('inventory.alldevicelist', page=page, per_page=devices.per_page, filter=filter) }}">
|
||||||
|
{% elif lot %}
|
||||||
|
<a href="{{ url_for('inventory.lotdevicelist', lot_id=lot.id, page=page, per_page=devices.per_page, filter=filter) }}">
|
||||||
|
{% else %}
|
||||||
|
<a href="{{ url_for('inventory.devicelist', page=page, per_page=devices.per_page, filter=filter) }}">
|
||||||
|
{% endif %}
|
||||||
|
{{ page }}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% if devices.has_next %}
|
||||||
|
<li class="pager">
|
||||||
|
{% if all_devices %}
|
||||||
|
<a href="{{ url_for('inventory.alldevicelist', page=devices.next_num, per_page=devices.per_page, filter=filter) }}">›</a>
|
||||||
|
{% elif lot %}
|
||||||
|
<a href="{{ url_for('inventory.lotdevicelist', lot_id=lot.id, page=devices.next_num, per_page=devices.per_page, filter=filter) }}">›</a>
|
||||||
|
{% else %}
|
||||||
|
<a href="{{ url_for('inventory.devicelist', page=devices.next_num, per_page=devices.per_page, filter=filter) }}">›</a>
|
||||||
|
{% endif %}
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -581,10 +677,25 @@
|
||||||
{% include "inventory/alert_lots_changes.html" %}
|
{% include "inventory/alert_lots_changes.html" %}
|
||||||
|
|
||||||
<!-- Custom Code -->
|
<!-- Custom Code -->
|
||||||
|
<script>
|
||||||
|
$(document).ready(() => {
|
||||||
|
$(".dataTable-selector").on("change", function() {
|
||||||
|
const per_page = $('.dataTable-selector').val();
|
||||||
|
{% if all_devices %}
|
||||||
|
window.location.href = "{{ url_for('inventory.alldevicelist', page=1) }}&filter={{ filter }}&per_page="+per_page;
|
||||||
|
{% elif lot %}
|
||||||
|
window.location.href = "{{ url_for('inventory.lotdevicelist', lot_id=lot.id, page=1) }}&filter={{ filter }}&per_page="+per_page;
|
||||||
|
{% else %}
|
||||||
|
window.location.href = "{{ url_for('inventory.devicelist', page=1) }}&filter={{ filter }}&per_page="+per_page;
|
||||||
|
{% endif %}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
<script>
|
<script>
|
||||||
let table = new simpleDatatables.DataTable("table", {
|
let table = new simpleDatatables.DataTable("table", {
|
||||||
perPageSelect: [5, 10, 15, 20, 25, 50, 100],
|
footer: false,
|
||||||
perPage: 20
|
paging: false,
|
||||||
|
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
{% if config['DEBUG'] %}
|
{% if config['DEBUG'] %}
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="{{ url_for('inventory.device_erasure_list') }}" class="nav-link{% if not orphans %} active{% endif %}">
|
<a href="{{ url_for('inventory.device_erasure_list') }}" class="nav-link{% if not orphans %} active{% endif %}">
|
||||||
All hard drivers
|
All hard drives
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,38 @@
|
||||||
<div class="tab-content pt-5">
|
<div class="tab-content pt-5">
|
||||||
<div id="devices-list" class="tab-pane fade devices-list active show">
|
<div id="devices-list" class="tab-pane fade devices-list active show">
|
||||||
<div class="tab-content pt-2">
|
<div class="tab-content pt-2">
|
||||||
|
<div class="dataTable-top" style="float: left;">
|
||||||
|
<div class="dataTable-dropdown">
|
||||||
|
<label>
|
||||||
|
<select class="dataTable-selector">
|
||||||
|
<option value="5"{% if placeholders_log.per_page == 5 %} selected="selected"{% endif %}>
|
||||||
|
5
|
||||||
|
</option>
|
||||||
|
<option value="10"{% if placeholders_log.per_page == 10 %} selected="selected"{% endif %}>
|
||||||
|
10
|
||||||
|
</option>
|
||||||
|
<option value="15"{% if placeholders_log.per_page == 15 %} selected="selected"{% endif %}>
|
||||||
|
15
|
||||||
|
</option>
|
||||||
|
<option value="20"{% if placeholders_log.per_page == 20 %} selected="selected"{% endif %}>
|
||||||
|
20
|
||||||
|
</option>
|
||||||
|
<option value="25"{% if placeholders_log.per_page == 25 %} selected="selected"{% endif %}>
|
||||||
|
25
|
||||||
|
</option>
|
||||||
|
<option value="50"{% if placeholders_log.per_page == 50 %} selected="selected"{% endif %}>
|
||||||
|
50
|
||||||
|
</option>
|
||||||
|
<option value="100"{% if placeholders_log.per_page == 100 %} selected="selected"{% endif %}>
|
||||||
|
100
|
||||||
|
</option>
|
||||||
|
</select> entries per page
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="dataTable-search">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="dataTable-container">
|
||||||
<table class="table">
|
<table class="table">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
@ -34,7 +66,7 @@
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for log in placeholders_log %}
|
{% for log in placeholders_log.items %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
{{ log.phid }}
|
{{ log.phid }}
|
||||||
|
@ -58,6 +90,38 @@
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<div class="dataTable-bottom">
|
||||||
|
<div class="dataTable-info">
|
||||||
|
Showing {{ placeholders_log.first }} to {{ placeholders_log.last }} of {{ placeholders_log.total }} entries
|
||||||
|
</div>
|
||||||
|
<nav class="dataTable-pagination">
|
||||||
|
<ul class="dataTable-pagination-list">
|
||||||
|
{% if placeholders_log.has_prev %}
|
||||||
|
<li class="pager">
|
||||||
|
<a href="{{ url_for('inventory.placeholder_logs', page=placeholders_log.prev_num, per_page=placeholders_log.per_page) }}">‹</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% for page in placeholders_log.iter_pages() %}
|
||||||
|
{% if page %}
|
||||||
|
{% if page == placeholders_log.page %}
|
||||||
|
<li class="active"><a href="javascript:void()">{{ page }}</a></li>
|
||||||
|
{% else %}
|
||||||
|
<li class="">
|
||||||
|
<a href="{{ url_for('inventory.placeholder_logs', page=page, per_page=placeholders_log.per_page) }}">
|
||||||
|
{{ page }}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% if placeholders_log.has_next %}
|
||||||
|
<li class="pager">
|
||||||
|
<a href="{{ url_for('inventory.placeholder_logs', page=placeholders_log.next_num, per_page=placeholders_log.per_page) }}">›</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -75,6 +139,18 @@
|
||||||
|
|
||||||
<!-- Custom Code -->
|
<!-- Custom Code -->
|
||||||
<script>
|
<script>
|
||||||
const table = new simpleDatatables.DataTable("table")
|
$(document).ready(() => {
|
||||||
|
$(".dataTable-selector").on("change", function() {
|
||||||
|
const per_page = $('.dataTable-selector').val();
|
||||||
|
window.location.href = "{{ url_for('inventory.placeholder_logs', page=1) }}&per_page="+per_page;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
let table = new simpleDatatables.DataTable("table", {
|
||||||
|
footer: false,
|
||||||
|
paging: false,
|
||||||
|
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
{% endblock main %}
|
{% endblock main %}
|
||||||
|
|
|
@ -22,6 +22,38 @@
|
||||||
<div class="tab-content pt-5">
|
<div class="tab-content pt-5">
|
||||||
<div id="devices-list" class="tab-pane fade devices-list active show">
|
<div id="devices-list" class="tab-pane fade devices-list active show">
|
||||||
<div class="tab-content pt-2">
|
<div class="tab-content pt-2">
|
||||||
|
<div class="dataTable-top" style="float: left;">
|
||||||
|
<div class="dataTable-dropdown">
|
||||||
|
<label>
|
||||||
|
<select class="dataTable-selector">
|
||||||
|
<option value="5"{% if snapshots_log.per_page == 5 %} selected="selected"{% endif %}>
|
||||||
|
5
|
||||||
|
</option>
|
||||||
|
<option value="10"{% if snapshots_log.per_page == 10 %} selected="selected"{% endif %}>
|
||||||
|
10
|
||||||
|
</option>
|
||||||
|
<option value="15"{% if snapshots_log.per_page == 15 %} selected="selected"{% endif %}>
|
||||||
|
15
|
||||||
|
</option>
|
||||||
|
<option value="20"{% if snapshots_log.per_page == 20 %} selected="selected"{% endif %}>
|
||||||
|
20
|
||||||
|
</option>
|
||||||
|
<option value="25"{% if snapshots_log.per_page == 25 %} selected="selected"{% endif %}>
|
||||||
|
25
|
||||||
|
</option>
|
||||||
|
<option value="50"{% if snapshots_log.per_page == 50 %} selected="selected"{% endif %}>
|
||||||
|
50
|
||||||
|
</option>
|
||||||
|
<option value="100"{% if snapshots_log.per_page == 100 %} selected="selected"{% endif %}>
|
||||||
|
100
|
||||||
|
</option>
|
||||||
|
</select> entries per page
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="dataTable-search">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="dataTable-container">
|
||||||
<table class="table">
|
<table class="table">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
@ -39,7 +71,7 @@
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for snap in snapshots_log %}
|
{% for snap in snapshots_log.items %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
{% if snap.sid and snap.snapshot_uuid %}
|
{% if snap.sid and snap.snapshot_uuid %}
|
||||||
|
@ -59,26 +91,26 @@
|
||||||
{{ snap.version }}
|
{{ snap.version }}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{% if snap.device %}
|
{% if snap.get_device() %}
|
||||||
<a href="{{ url_for('inventory.device_details', id=snap.device) }}">
|
<a href="{{ url_for('inventory.device_details', id=snap.device) }}">
|
||||||
{{ snap.device }}
|
{{ snap.get_device() }}
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{{ snap.system_uuid }}
|
{{ snap.get_system_uuid() }}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{{ snap.status }}
|
{{ snap.get_status() }}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{{ snap.new_device }}
|
{{ snap.get_new_device() }}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{{ snap.type_device }}
|
{{ snap.get_type_device() }}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{{ snap.original_dhid }}
|
{{ snap.get_original_dhid() }}
|
||||||
</td>
|
</td>
|
||||||
<td>{{ snap.created.strftime('%Y-%m-%d %H:%M') }}</td>
|
<td>{{ snap.created.strftime('%Y-%m-%d %H:%M') }}</td>
|
||||||
<td>
|
<td>
|
||||||
|
@ -93,6 +125,38 @@
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
<div class="dataTable-bottom">
|
||||||
|
<div class="dataTable-info">
|
||||||
|
Showing {{ snapshots_log.first }} to {{ snapshots_log.last }} of {{ snapshots_log.total }} entries
|
||||||
|
</div>
|
||||||
|
<nav class="dataTable-pagination">
|
||||||
|
<ul class="dataTable-pagination-list">
|
||||||
|
{% if snapshots_log.has_prev %}
|
||||||
|
<li class="pager">
|
||||||
|
<a href="{{ url_for('inventory.snapshotslist', page=snapshots_log.prev_num, per_page=snapshots_log.per_page) }}">‹</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% for page in snapshots_log.iter_pages() %}
|
||||||
|
{% if page %}
|
||||||
|
{% if page == snapshots_log.page %}
|
||||||
|
<li class="active"><a href="javascript:void()">{{ page }}</a></li>
|
||||||
|
{% else %}
|
||||||
|
<li class="">
|
||||||
|
<a href="{{ url_for('inventory.snapshotslist', page=page, per_page=snapshots_log.per_page) }}">
|
||||||
|
{{ page }}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% if snapshots_log.has_next %}
|
||||||
|
<li class="pager">
|
||||||
|
<a href="{{ url_for('inventory.snapshotslist', page=snapshots_log.next_num, per_page=snapshots_log.per_page) }}">›</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -109,6 +173,18 @@
|
||||||
|
|
||||||
<!-- Custom Code -->
|
<!-- Custom Code -->
|
||||||
<script>
|
<script>
|
||||||
const table = new simpleDatatables.DataTable("table")
|
$(document).ready(() => {
|
||||||
|
$(".dataTable-selector").on("change", function() {
|
||||||
|
const per_page = $('.dataTable-selector').val();
|
||||||
|
window.location.href = "{{ url_for('inventory.snapshotslist', page=1) }}&per_page="+per_page;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
let table = new simpleDatatables.DataTable("table", {
|
||||||
|
footer: false,
|
||||||
|
paging: false,
|
||||||
|
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
{% endblock main %}
|
{% endblock main %}
|
||||||
|
|
Reference in New Issue