diff --git a/app/inventory/views.py b/app/inventory/views.py index 77ec12e9d24bb668b62f495c87b118f91f5de9dd..9a4692e84a3f5b0fee7524127c6a2c8a5e2d5377 100644 --- a/app/inventory/views.py +++ b/app/inventory/views.py @@ -201,20 +201,6 @@ def edit_item(ics_id): return render_template('inventory/edit_item.html', form=form) -@bp.route('/qrcodes/<kind>') -@login_required -def qrcodes(kind='Action'): - try: - model = getattr(models, kind) - except AttributeError: - raise utils.CSEntryError(f"Unknown model '{kind}'", status_code=422) - items = db.session.query(model).order_by(model.name) - images = [{'name': item.name, - 'data': item.base64_image()} - for item in items] - return render_template('inventory/qrcodes.html', kind=kind, images=images) - - @bp.route('/attributes/<kind>', methods=('GET', 'POST')) @login_groups_accepted('admin', 'create') def attributes(kind): @@ -235,15 +221,15 @@ def attributes(kind): return render_template('inventory/attributes.html', kind=kind, form=form) -@bp.route('/_retrieve_attributes_name/<kind>') +@bp.route('/_retrieve_attributes/<kind>') @login_required -def retrieve_attributes_name(kind): +def retrieve_attributes(kind): try: model = getattr(models, kind) except AttributeError: raise utils.CSEntryError(f"Unknown model '{kind}'", status_code=422) items = db.session.query(model).order_by(model.name) - data = [(item.name, item.description) for item in items] + data = [(item.base64_image(), item.name, item.description) for item in items] return jsonify(data=data) diff --git a/app/static/js/attributes.js b/app/static/js/attributes.js index d2aadc073a1d6894c01b6a9cb0b08bff9211eeb9..bfbf354c7a2ec2e26789e244fe3293b6b793041f 100644 --- a/app/static/js/attributes.js +++ b/app/static/js/attributes.js @@ -4,11 +4,23 @@ $(document).ready(function() { "ajax": function(data, callback, settings) { var kind = $('li a.nav-link.active').text(); $.getJSON( - $SCRIPT_ROOT + "/inventory/_retrieve_attributes_name/" + kind, + $SCRIPT_ROOT + "/inventory/_retrieve_attributes/" + kind, function(json) { callback(json); }); }, + "order": [[1, 'asc']], + "columnDefs": [ + { + "targets": [0], + "orderable": false, + "render": function(data, type, row) { + // render QR code from base64 string + return '<img class="img-fluid" src="data:image/png;base64,' + data + '">'; + }, + "width": "6%", + } + ], "paging": false }); diff --git a/app/templates/base-fluid.html b/app/templates/base-fluid.html index 509133e295b3f4ac46c00e9be6f6c8b293d34a60..b425f067f81b27cb9aabdebe7be148eab3076b48 100644 --- a/app/templates/base-fluid.html +++ b/app/templates/base-fluid.html @@ -14,8 +14,6 @@ href="{{ url_for('inventory.list_items') }}">Items</a> <a class="list-group-item list-group-item-action {{ is_active(path.startswith("/inventory/attributes")) }}" href="{{ url_for('inventory.attributes', kind='Manufacturer') }}">Attributes</a> - <a class="list-group-item list-group-item-action {{ is_active(path.startswith("/inventory/qrcodes")) }}" - href="{{ url_for('inventory.qrcodes', kind='Action') }}">QR Codes</a> <a class="list-group-item list-group-item-action {{ is_active(path.startswith("/inventory/scanner")) }}" href="{{ url_for('inventory.scanner') }}">Scanner setup</a> {% elif path.startswith("/network") %} diff --git a/app/templates/inventory/attributes.html b/app/templates/inventory/attributes.html index 03501ee95ca0b9e945db79803b8cdd5639e48ac4..6a9d453542d002d96370fcadbe6e9e43e73e4b71 100644 --- a/app/templates/inventory/attributes.html +++ b/app/templates/inventory/attributes.html @@ -5,7 +5,7 @@ {% block main %} <ul class="nav nav-tabs"> - {% for attribute in ('Manufacturer', 'Model', 'Location') %} + {% for attribute in ('Manufacturer', 'Model', 'Location', 'Status') %} <li class="nav-item"> <a class="nav-link {% if attribute == kind %}active{% endif %}" href="{{ url_for('inventory.attributes', kind=attribute) }}">{{ attribute }}</a> </li> @@ -14,22 +14,25 @@ <br> - <form id="attributeForm" method="POST"> - {{ form.hidden_tag() }} - {{ render_field(form.name) }} - {{ render_field(form.description) }} - <div class="form-group row"> - <div class="col-sm-10"> - <button type="submit" class="btn btn-primary">Create</button> + {% if kind in ('Manufacturer', 'Model', 'Location') or (current_user.is_authenticated and current_user.is_admin) %} + <form id="attributeForm" method="POST"> + {{ form.hidden_tag() }} + {{ render_field(form.name) }} + {{ render_field(form.description) }} + <div class="form-group row"> + <div class="col-sm-10"> + <button type="submit" class="btn btn-primary">Create</button> + </div> </div> - </div> - </form> + </form> - <hr class="separator"> + <hr class="separator"> + {%- endif %} <table id="attributes_table" class="table table-bordered table-hover table-sm" cellspacing="0" width="100%"> <thead> <tr> + <th></th> <th>Name</th> <th>Description</th> </tr> diff --git a/app/templates/inventory/qrcodes.html b/app/templates/inventory/qrcodes.html deleted file mode 100644 index 606f1350f04180e375836d897e097af166703260..0000000000000000000000000000000000000000 --- a/app/templates/inventory/qrcodes.html +++ /dev/null @@ -1,28 +0,0 @@ -{% extends "base-fluid.html" %} - -{% block title %}QR Codes - CSEntry{% endblock %} - -{% block main %} - <ul class="nav nav-tabs"> - {% for item in ('Action', 'Manufacturer', 'Model', 'Location', 'Status') %} - <li class="nav-item"> - <a class="nav-link {% if kind == item %}active{% endif %}" href="{{ url_for('inventory.qrcodes', kind=item) }}">{{ item }}</a> - </li> - {% endfor %} - </ul> - - <br> - - <div class="row"> - {% for image in images %} - <div class="col-md-3"> - <div class="card"> - <img class="card-img-top" src="data:image/png;base64,{{ image.data }}"> - <div class="card-body"> - <h4 class="card-title">{{ image.name }}</h4> - </div> - </div> - </div> - {% endfor %} - </div> -{%- endblock %}