mirror of
https://github.com/retspen/webvirtcloud
synced 2026-11-08 11:16:47 +00:00
sortable.js 0.8.0 (abandoned since 2014) sorted only a table's first
body: in the grouped VM list the first host's row moved among its VMs
and the other hosts never sorted, and memory sorted as text ("1024 MB"
before "512 MB"). tablesort 5.7.1 sorts each table body on its own and
keeps a row marked data-sort-method="none" in place, so hosts stay in
name order with their row on top and their VMs sort below it. Memory,
vCPUs and volume sizes sort by their numbers (data-sort). Headers are
reachable by keyboard and carry aria-sort.
base.html loads tablesort for every table marked data-sortable; the
per-page sortable includes and sortable-theme-bootstrap.css go, so these
tables take the theme's table style like the others. The grouped list's
row numbers go (meaningless once sorted). The VM owners and VM logs
tables were marked sortable but never loaded the script; they stay
unsorted.
97 lines
3.8 KiB
HTML
97 lines
3.8 KiB
HTML
{% load static %}
|
|
{% load django_bootstrap5 %}
|
|
{% load i18n %}
|
|
<!DOCTYPE html>
|
|
{% get_current_language as LANGUAGE_CODE %}<html lang="{{ LANGUAGE_CODE }}">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
|
<meta name="description" content="WebVirtCloud panel for manage virtual machine">
|
|
<meta name="author" content="anatoliy.guskov@gmail.com">
|
|
|
|
<title>{% block title %}{% endblock %}</title>
|
|
|
|
<!-- Bootstrap Core CSS -->
|
|
{# error pages render without app_settings: they get zephyr #}
|
|
{% with theme=app_settings.BOOTSTRAP_THEME|default:"zephyr" %}<link href="{% static "css/themes/"|add:theme|add:".min.css" %}" rel="stylesheet" id="wvc_css">{% endwith %}
|
|
|
|
<!-- WebVirtCloud CSS -->
|
|
<link href="{% static "css/webvirtcloud.css" %}" rel="stylesheet">
|
|
|
|
<!-- Aditional CSS -->
|
|
{% block style %}{% endblock %}
|
|
|
|
<!-- Custom Fonts -->
|
|
<link href="{% static "css/bootstrap-icons.min.css" %}" rel="stylesheet" type="text/css">
|
|
|
|
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
|
|
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
|
|
<!--[if lt IE 9]>
|
|
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
|
|
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
|
|
<![endif]-->
|
|
<link rel="shortcut icon" href="{% static 'favicon.ico' %}">
|
|
</head>
|
|
|
|
<body{% block body_attrs %}{% endblock %}>
|
|
|
|
{% if request.user.is_authenticated %}
|
|
{% include 'navbar.html' %}
|
|
{% endif %}
|
|
|
|
<div role="main" class="container">
|
|
<div>
|
|
<div>
|
|
<div class="float-end">
|
|
{% block page_heading_extra %}
|
|
{% endblock page_heading_extra %}
|
|
</div>
|
|
<h3 class="ms-0 page-header">
|
|
{% block page_heading %}
|
|
{% endblock page_heading %}
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
<div id="messages">{% bootstrap_messages %}</div>
|
|
{% block content %}{% endblock %}
|
|
</div>
|
|
|
|
<!-- Bootstrap core JavaScript
|
|
================================================== -->
|
|
<!-- Placed at the end of the document so the pages load faster -->
|
|
<!-- jQuery -->
|
|
<script src="{% static 'js/jquery.js' %}"></script>
|
|
<!-- Bootstrap Core JavaScript -->
|
|
<script src="{% static 'js/bootstrap.bundle.min.js' %}"></script>
|
|
<!-- JavaScript Cookie -->
|
|
<script src="{% static 'js/js.cookie.js' %}"></script>
|
|
<!-- Table sorting -->
|
|
<script src="{% static 'js/tablesort.min.js' %}"></script>
|
|
<script src="{% static 'js/tablesort.number.min.js' %}"></script>
|
|
<script src="{% static 'js/sort_tables.js' %}"></script>
|
|
<script>
|
|
// After a refused submission, start at the error. The places an error
|
|
// can be, most specific first: a refused field, its form's summary, an
|
|
// open dialog's copy of the messages (the page's are behind it), the
|
|
// page's messages. A page that sets itself up first has
|
|
// data-error-focus="manual" and calls this when it is ready.
|
|
const ERROR_PLACES = [".is-invalid", ".form-errors", ".modal.show .modal-messages .alert-danger",
|
|
"#messages .alert-danger"];
|
|
|
|
function focusFirstError() {
|
|
for (const selector of ERROR_PLACES) {
|
|
const target = [...document.querySelectorAll(selector)].find(e => e.offsetParent !== null);
|
|
if (target) {
|
|
if (!target.matches("input, select, textarea")) target.tabIndex = -1;
|
|
target.focus();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
window.focusFirstError = focusFirstError;
|
|
if (document.body.dataset.errorFocus !== "manual") focusFirstError();
|
|
</script>
|
|
{% block script %}{% endblock %}
|
|
</body>
|
|
</html>
|