1
0
Fork 0
mirror of https://github.com/retspen/webvirtcloud synced 2024-11-01 03:54:15 +00:00

Merge pull request #595 from catborise/master

various updates
This commit is contained in:
catborise 2023-08-17 13:52:04 +03:00 committed by GitHub
commit a02df250bf
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
137 changed files with 7047 additions and 8583 deletions

1
.gitignore vendored
View file

@ -16,3 +16,4 @@ webvirtcloud/settings.py
.coverage .coverage
htmlcov htmlcov
*.log *.log
templates/webvirtcloud.code-workspace

View file

@ -1,7 +1,7 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load i18n %} {% load i18n %}
{% load icons %} {% load bootstrap_icons %}
{% load qr_code %} {% load qr_code %}
{% block title %}{% trans "User Profile" %} - {{ user }}{% endblock %} {% block title %}{% trans "User Profile" %} - {{ user }}{% endblock %}
@ -10,14 +10,14 @@
{% block page_heading_extra %} {% block page_heading_extra %}
{% if otp_enabled %} {% if otp_enabled %}
<a href="{% url 'accounts:admin_email_otp' user.id %}" class="btn btn-secondary" title="{% trans "Email OTP QR code" %}"> <a href="{% url 'accounts:admin_email_otp' user.id %}" class="btn btn-secondary" title="{% trans "Email OTP QR code" %}">
{% icon 'qrcode' %} {% bs_icon 'qr-code' %}
</a> </a>
{% endif %} {% endif %}
<a href="{% url 'admin:user_update' user.id %}?next={% url 'accounts:account' user.id %}" class="btn btn-primary" title="{% trans "Edit user" %}"> <a href="{% url 'admin:user_update' user.id %}?next={% url 'accounts:account' user.id %}" class="btn btn-primary" title="{% trans "Edit user" %}">
{% icon 'pencil' %} {% bs_icon 'pencil' %}
</a> </a>
<a href="{% url 'accounts:user_instance_create' user.id %}" class="btn btn-success" title="{% trans "Create user instance" %}"> <a href="{% url 'accounts:user_instance_create' user.id %}" class="btn btn-success" title="{% trans "Create user instance" %}">
{% icon 'plus' %} {% bs_icon 'plus-circle-fill' %}
</a> </a>
{% endblock page_heading_extra %} {% endblock page_heading_extra %}
@ -58,12 +58,12 @@
<td>{{ inst.is_delete }}</td> <td>{{ inst.is_delete }}</td>
<td style="width:5px;"> <td style="width:5px;">
<a href="{% url 'accounts:user_instance_update' inst.id %}" class="btn btn-sm btn-secondary" title="{% trans "edit" %}"> <a href="{% url 'accounts:user_instance_update' inst.id %}" class="btn btn-sm btn-secondary" title="{% trans "edit" %}">
{% icon 'pencil' %} {% bs_icon 'pencil' %}
</a> </a>
</td> </td>
<td style="width:5px;"> <td style="width:5px;">
<a class="btn btn-sm btn-secondary" href="{% url 'accounts:user_instance_delete' inst.id %}" title="{% trans "Delete" %}"> <a class="btn btn-sm btn-secondary" href="{% url 'accounts:user_instance_delete' inst.id %}" title="{% trans "Delete" %}">
{% icon 'trash' %} {% bs_icon 'trash' %}
</a> </a>
</td> </td>
</tr> </tr>

View file

@ -2,7 +2,7 @@
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% load i18n %} {% load i18n %}
{% load icons %} {% load bootstrap_icons %}
{% block title %}{%trans "Change Password" %}{% endblock title %} {% block title %}{%trans "Change Password" %}{% endblock title %}
@ -21,10 +21,10 @@
</div> </div>
<div class="card-footer"> <div class="card-footer">
<div class="float-end"> <div class="float-end">
<a class="btn btn-primary" href="javascript:history.back()">{% icon 'times' %} <a class="btn btn-primary" href="javascript:history.back()">{% bs_icon 'x' %}
{% trans "Cancel" %}</a> {% trans "Cancel" %}</a>
<button type="submit" form="password-change" class="btn btn-success"> <button type="submit" form="password-change" class="btn btn-success">
{% icon 'check' %} {% trans "Change" %} {% bs_icon 'check2' %} {% trans "Change" %}
</button> </button>
</div> </div>
</div> </div>

View file

@ -1,6 +1,6 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% load icons %} {% load bootstrap_icons %}
{% load i18n %} {% load i18n %}
{% block title %}{{ title }}{% endblock %} {% block title %}{{ title }}{% endblock %}
@ -22,9 +22,9 @@
</div> </div>
<div class="card-footer"> <div class="card-footer">
<div class="mb-0 float-end"> <div class="mb-0 float-end">
<a class="btn btn-primary" href="javascript:history.back()">{% icon 'arrow-left' %} {% trans "Cancel" %}</a> <a class="btn btn-primary" href="javascript:history.back()">{% bs_icon 'arrow-left' %} {% trans "Cancel" %}</a>
<button type="submit" form="create-update" class="btn btn-success"> <button type="submit" form="create-update" class="btn btn-success">
{% icon 'envelope-o' %} {% trans "Send" %} {% bs_icon 'envelope-open' %} {% trans "Send" %}
</button> </button>
</div> </div>
</div> </div>

View file

@ -1,7 +1,7 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load i18n %} {% load i18n %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% load icons %} {% load bootstrap_icons %}
{% load tags_fingerprint %} {% load tags_fingerprint %}
{% block title %}{% trans "Profile" %}: {{ request.user.first_name }} {{ request.user.last_name}}{% endblock %} {% block title %}{% trans "Profile" %}: {{ request.user.first_name }} {{ request.user.last_name}}{% endblock %}
@ -30,12 +30,12 @@
{% bootstrap_form profile_form layout='horizontal' %} {% bootstrap_form profile_form layout='horizontal' %}
{% if perms.accounts.change_password %} {% if perms.accounts.change_password %}
<a href="{% url 'accounts:change_password' %}" class="btn btn-primary"> <a href="{% url 'accounts:change_password' %}" class="btn btn-primary">
{% icon 'lock' %} {% trans "Change Password" %} {% bs_icon 'lock' %} {% trans "Change Password" %}
</a> </a>
{% endif %} {% endif %}
<div class="mb-0 float-end"> <div class="mb-0 float-end">
<button type="submit" class="btn btn-primary"> <button type="submit" class="btn btn-primary">
{% icon 'pencil' %} {% trans "Update" %} {% bs_icon 'pencil' %} {% trans "Update" %}
</button> </button>
</div> </div>
</form> </form>
@ -53,7 +53,7 @@
<td>{{ key.keyname }} ({% ssh_to_fingerprint key.keypublic %})</td> <td>{{ key.keyname }} ({% ssh_to_fingerprint key.keypublic %})</td>
<td> <td>
<a href="{% url 'accounts:ssh_key_delete' key.id %}" title="{% trans "Delete" %}" class="btn btn-sm btn-secondary"> <a href="{% url 'accounts:ssh_key_delete' key.id %}" title="{% trans "Delete" %}" class="btn btn-sm btn-secondary">
{% icon 'trash' %} {% bs_icon 'trash' %}
</a> </a>
</td> </td>
</tr> </tr>
@ -73,7 +73,7 @@
{% bootstrap_form ssh_key_form layout='horizontal' %} {% bootstrap_form ssh_key_form layout='horizontal' %}
<div class="mb-0 float-end"> <div class="mb-0 float-end">
<button type="submit" class="btn btn-primary"> <button type="submit" class="btn btn-primary">
{% icon 'plus' %} {% trans "Add" %} {% bs_icon 'plus-circle-fill' %} {% trans "Add" %}
</button> </button>
</div> </div>
</form> </form>

View file

@ -4,6 +4,7 @@ from django.urls import path
from django_otp.forms import OTPAuthenticationForm from django_otp.forms import OTPAuthenticationForm
from . import views from . import views
from .views import CustomLoginView
app_name = "accounts" app_name = "accounts"
@ -50,5 +51,5 @@ if settings.OTP_ENABLED:
] ]
else: else:
urlpatterns += ( urlpatterns += (
path("login/", LoginView.as_view(template_name="login.html"), name="login"), path("login/", CustomLoginView.as_view(template_name="login.html"), name="login"),
) )

View file

@ -1,11 +1,12 @@
from admin.decorators import superuser_only from admin.decorators import superuser_only
from django.conf import settings from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.contrib.auth import get_user_model, update_session_auth_hash from django.contrib.auth import get_user_model, update_session_auth_hash, login as auth_login
from django.contrib.auth.decorators import permission_required from django.contrib.auth.decorators import permission_required
from django.contrib.auth.forms import PasswordChangeForm from django.contrib.auth.forms import PasswordChangeForm
from django.shortcuts import get_object_or_404, redirect, render from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse from django.urls import reverse
from django.http import HttpResponseRedirect
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from instances.models import Instance from instances.models import Instance
@ -14,7 +15,20 @@ from accounts.models import *
from . import forms from . import forms
from .utils import get_user_totp_device, send_email_with_otp from .utils import get_user_totp_device, send_email_with_otp
from django.contrib.auth.views import LoginView
from logs.views import addlogmsg
class CustomLoginView(LoginView):
def form_valid(self, form):
username = form.cleaned_data['username']
addlogmsg(username, "-", "-", "Logged In")
auth_login(self.request, form.get_user())
return HttpResponseRedirect(self.get_success_url())
def form_invalid(self, form):
username = form.cleaned_data['username']
addlogmsg(username, "-", "-", "Failed Login Attempt")
return self.render_to_response(self.get_context_data(form=form))
def profile(request): def profile(request):
publickeys = UserSSHKey.objects.filter(user_id=request.user.id) publickeys = UserSSHKey.objects.filter(user_id=request.user.id)

View file

@ -1,13 +1,13 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load i18n %} {% load i18n %}
{% load static %} {% load static %}
{% load icons %} {% load bootstrap_icons %}
{% block title %}{% trans "Users" %}{% endblock %} {% block title %}{% trans "Users" %}{% endblock %}
{% block content %} {% block content %}
<div class="row"> <div class="row">
<div class="col-lg-12"> <div class="col-lg-12">
<a href="{% url 'admin:group_create' %}" class="btn btn-success btn-header float-end"> <a href="{% url 'admin:group_create' %}" class="btn btn-success btn-header float-end">
{% icon 'plus' %} {% bs_icon 'plus-circle-fill' %}
</a> </a>
{% include 'search_block.html' %} {% include 'search_block.html' %}
<h1 class="page-header">{% trans "Groups" %}</h1> <h1 class="page-header">{% trans "Groups" %}</h1>
@ -17,7 +17,7 @@
{% if not groups %} {% if not groups %}
<div class="col-lg-12"> <div class="col-lg-12">
<div class="alert alert-warning shadow-sm"> <div class="alert alert-warning shadow-sm">
{% icon 'exclamation-triangle '%} <strong>{% trans "Warning" %}:</strong> {% trans "You don't have any groups" %} {% bs_icon 'exclamation-triangle '%} <strong>{% trans "Warning" %}:</strong> {% trans "You don't have any groups" %}
</div> </div>
</div> </div>
{% else %} {% else %}
@ -38,10 +38,10 @@
<td> <td>
<div class="float-end btn-group"> <div class="float-end btn-group">
<a class="btn btn-primary" href="{% url 'admin:group_update' group.id %}" title="{%trans "Edit" %}"> <a class="btn btn-primary" href="{% url 'admin:group_update' group.id %}" title="{%trans "Edit" %}">
{% icon 'pencil' %} {% bs_icon 'pencil' %}
</a> </a>
<a class="btn btn-danger" href="{% url 'admin:group_delete' group.id %}" title="{%trans "Delete" %}"> <a class="btn btn-danger" href="{% url 'admin:group_delete' group.id %}" title="{%trans "Delete" %}">
{% icon 'times' %} {% bs_icon 'x' %}
</a> </a>
</div> </div>
</td> </td>

View file

@ -1,6 +1,7 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load i18n %} {% load i18n %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% load bootstrap_icons %}
{% block title %}{% trans "Logs" %}{% endblock %} {% block title %}{% trans "Logs" %}{% endblock %}
@ -18,7 +19,7 @@
{% if not logs %} {% if not logs %}
<div class="col-lg-12"> <div class="col-lg-12">
<div class="alert alert-warning shadow-sm"> <div class="alert alert-warning shadow-sm">
<i class="fa fa-exclamation-triangle"></i> <strong>{% trans "Warning" %}:</strong> {% trans "You don't have any Logs" %} {% bs_icon 'exclamation-triangle'%} <strong>{% trans "Warning" %}:</strong> {% trans "You don't have any Logs" %}
</div> </div>
</div> </div>
{% else %} {% else %}

View file

@ -1,6 +1,6 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% load icons %} {% load bootstrap_icons %}
{% load i18n %} {% load i18n %}
{% block title %}{{ title }}{% endblock %} {% block title %}{{ title }}{% endblock %}
@ -16,9 +16,10 @@
{% bootstrap_form attributes_form layout='horizontal' %} {% bootstrap_form attributes_form layout='horizontal' %}
</form> </form>
<div class="float-end"> <div class="float-end">
<a class="btn btn-primary" href="javascript:history.back()">{% icon 'times' %} {% trans "Cancel" %}</a> <a class="btn btn-primary" href="javascript:history.back()">
{% bs_icon 'x-square-fill' %} {% trans "Cancel" %}</a>
<button type="submit" form="create-update" class="btn btn-success"> <button type="submit" form="create-update" class="btn btn-success">
{% icon 'check' %} {% trans "Save" %} {% bs_icon 'check2' %} {% trans "Save" %}
</button> </button>
</div> </div>
</div> </div>

View file

@ -2,7 +2,7 @@
{% load i18n %} {% load i18n %}
{% load static %} {% load static %}
{% load common_tags %} {% load common_tags %}
{% load icons %} {% load bootstrap_icons %}
{% block title %}{{ title }}{% endblock %} {% block title %}{{ title }}{% endblock %}
@ -10,7 +10,7 @@
{% block page_heading_extra %} {% block page_heading_extra %}
<a href="{% url 'admin:user_create' %}" class="btn btn-success btn-header float-end"> <a href="{% url 'admin:user_create' %}" class="btn btn-success btn-header float-end">
{% icon 'plus' %} {% bs_icon 'plus-circle-fill' %}
</a> </a>
{% include 'search_block.html' %} {% include 'search_block.html' %}
{% endblock page_heading_extra %} {% endblock page_heading_extra %}
@ -20,7 +20,7 @@
{% if not users %} {% if not users %}
<div class="col-lg-12"> <div class="col-lg-12">
<div class="alert alert-warning shadow-sm"> <div class="alert alert-warning shadow-sm">
{% icon 'exclamation-triangle '%} <strong>{% trans "Warning" %}:</strong> {% trans "You don't have any user" %} {% bs_icon 'exclamation-triangle '%} <strong>{% trans "Warning" %}:</strong> {% trans "You don't have any user" %}
</div> </div>
</div> </div>
{% else %} {% else %}
@ -50,19 +50,19 @@
{% trans "Blocked" %} {% trans "Blocked" %}
{% endif %} {% endif %}
</td> </td>
<td>{% if user.is_staff %}{% icon 'check' %}{% endif %}</td> <td>{% if user.is_staff %}{% bs_icon 'check' %}{% endif %}</td>
<td>{% if user.is_superuser %}{% icon 'check' %}</span>{% endif %}</td> <td>{% if user.is_superuser %}{% bs_icon 'check' %}</span>{% endif %}</td>
<td>{% if can_clone %}{% icon 'check' %}{% endif %}</td> <td>{% if can_clone %}{% bs_icon 'check' %}{% endif %}</td>
<td> <td>
<div class="float-end btn-group"> <div class="float-end btn-group">
<a class="btn btn-success" title="{%trans "View Profile" %}" href="{% url 'accounts:account' user.id %}">{% icon 'eye' %}</a> <a class="btn btn-success" title="{%trans "View Profile" %}" href="{% url 'accounts:account' user.id %}">{% bs_icon 'eye-fill' %}</a>
<a class="btn btn-primary" title="{%trans "Edit" %}" href="{% url 'admin:user_update' user.id %}">{% icon 'pencil' %}</a> <a class="btn btn-primary" title="{%trans "Edit" %}" href="{% url 'admin:user_update' user.id %}">{% bs_icon 'pencil-fill' %}</a>
{% if user.is_active %} {% if user.is_active %}
<a class="btn btn-warning" title="{%trans "Block" %}" href="{% url 'admin:user_block' user.id %}">{% icon 'stop' %}</a> <a class="btn btn-warning" title="{%trans "Block" %}" href="{% url 'admin:user_block' user.id %}">{% bs_icon 'stop-fill' %}</a>
{% else %} {% else %}
<a class="btn btn-success" title="{%trans "Unblock" %}" href="{% url 'admin:user_unblock' user.id %}">{% icon 'play' %}</a> <a class="btn btn-success" title="{%trans "Unblock" %}" href="{% url 'admin:user_unblock' user.id %}">{% bs_icon 'play-fill' %}</a>
{% endif %} {% endif %}
<a class="btn btn-danger" title="{%trans "Delete" %}" href="{% url 'admin:user_delete' user.id %}">{% icon 'times' %}</a> <a class="btn btn-danger" title="{%trans "Delete" %}" href="{% url 'admin:user_delete' user.id %}">{% bs_icon 'x-circle-fill' %}</a>
</div> </div>
</td> </td>
</tr> </tr>

View file

@ -1,6 +1,6 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% load icons %} {% load bootstrap_icons %}
{% load i18n %} {% load i18n %}
{% block title %}{% trans "Add Compute" %}{% endblock %} {% block title %}{% trans "Add Compute" %}{% endblock %}
@ -18,9 +18,10 @@
{% bootstrap_form form layout='horizontal' %} {% bootstrap_form form layout='horizontal' %}
</form> </form>
<div class="float-end"> <div class="float-end">
<a class="btn btn-primary" href="javascript:history.back()">{% icon 'times' %} {% trans "Cancel" %}</a> <a class="btn btn-primary" href="javascript:history.back()">
{% bs_icon 'x-square-fill' %} {% trans "Cancel" %}</a>
<button type="submit" form="create-update" class="btn btn-success"> <button type="submit" form="create-update" class="btn btn-success">
{% icon 'check' %} {% trans "Save" %} {% bs_icon 'check-circle-fill' %} {% trans "Save" %}
</button> </button>
</div> </div>
</div> </div>

View file

@ -1,7 +1,7 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load i18n %} {% load i18n %}
{% load static %} {% load static %}
{% load icons %} {% load bootstrap_icons %}
{% block title %}{% trans "Instances" %} - {{ compute.name }}{% endblock %} {% block title %}{% trans "Instances" %} - {{ compute.name }}{% endblock %}
{% block style %} {% block style %}
<link rel="stylesheet" href="{% static "css/sortable-theme-bootstrap.css" %}" /> <link rel="stylesheet" href="{% static "css/sortable-theme-bootstrap.css" %}" />
@ -11,7 +11,7 @@
{% block page_heading_extra %} {% block page_heading_extra %}
<a href="{% url 'instances:create_instance_select_type' compute.id %}" <a href="{% url 'instances:create_instance_select_type' compute.id %}"
class="btn btn-success btn-header float-end"> class="btn btn-success btn-header float-end">
{% icon 'plus' %} {% bs_icon 'plus-circle-fill' %}
</a> </a>
{% if instances %} {% if instances %}
{% include 'search_block.html' %} {% include 'search_block.html' %}
@ -24,25 +24,25 @@
<nav aria-label="breadcrumb"> <nav aria-label="breadcrumb">
<ol class="breadcrumb shadow-sm"> <ol class="breadcrumb shadow-sm">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'overview' compute.id %}">{% icon 'dashboard' %} {% trans "Overview" %}</a> <a href="{% url 'overview' compute.id %}">{% bs_icon 'laptop' %} {% trans "Overview" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<span class="fw-bold">{% icon 'server' %} {% trans "Instances" %}</span> <span class="fw-bold">{% bs_icon 'server' %} {% trans "Instances" %}</span>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'storages' compute.id %}">{% icon 'hdd-o' %} {% trans "Storages" %}</a> <a href="{% url 'storages' compute.id %}">{% bs_icon 'device-hdd' %} {% trans "Storages" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'networks' compute.id %}">{% icon 'sitemap' %} {% trans "Networks" %}</a> <a href="{% url 'networks' compute.id %}">{% bs_icon 'hdd-network' %} {% trans "Networks" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'interfaces' compute.id %}">{% icon 'wifi' %} {% trans "Interfaces" %}</a> <a href="{% url 'interfaces' compute.id %}">{% bs_icon 'wifi' %} {% trans "Interfaces" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'nwfilters' compute.id %}">{% icon 'filter' %} {% trans "NWFilters" %}</a> <a href="{% url 'nwfilters' compute.id %}">{% bs_icon 'filter' %} {% trans "NWFilters" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'virtsecrets' compute.id %}">{% icon 'key' %} {% trans "Secrets" %}</a> <a href="{% url 'virtsecrets' compute.id %}">{% bs_icon 'key' %} {% trans "Secrets" %}</a>
</li> </li>
</ol> </ol>
</nav> </nav>
@ -52,7 +52,7 @@
<div class="col-lg-12"> <div class="col-lg-12">
{% if not instances %} {% if not instances %}
<div class="alert alert-warning shadow-sm fade show"> <div class="alert alert-warning shadow-sm fade show">
{% icon 'exclamation-triangle' %} <strong>{% trans "Warning" %}:</strong> {% bs_icon 'exclamation-triangle' %} <strong>{% trans "Warning" %}:</strong>
{% trans "Hypervisor doesn't have any Instances" %} {% trans "Hypervisor doesn't have any Instances" %}
</div> </div>
</div> </div>
@ -64,7 +64,7 @@
<th scope="col">{% trans 'User' %}</th> <th scope="col">{% trans 'User' %}</th>
<th scope="col">{% trans 'Status' %}</th> <th scope="col">{% trans 'Status' %}</th>
<th scope="col">{% trans 'VCPU' %}</th> <th scope="col">{% trans 'VCPU' %}</th>
<th scope="col">{% trans 'Memory' %}</th> <th scope="col" class="text-end">{% trans 'Memory' %}</th>
<th scope="col" data-sortable="false">{% trans 'Actions' %}</th> <th scope="col" data-sortable="false">{% trans 'Actions' %}</th>
</tr> </tr>
</thead> </thead>
@ -87,15 +87,18 @@
</em> </em>
</td> </td>
<td> <td>
{% if instance.proxy.instance.info.0 == 1 %}<span {% if instance.proxy.instance.info.0 == 1 %}
class="text-success">{% trans "Active" %}</span>{% endif %} <span class="text-success">{% trans "Active" %}</span>
{% if instance.proxy.instance.info.0 == 5 %}<span {% endif %}
class="text-danger">{% trans "Off" %}</span>{% endif %} {% if instance.proxy.instance.info.0 == 5 %}
{% if instance.proxy.instance.info.0 == 3 %}<span <span class="text-danger">{% trans "Off" %}</span>
class="text-warning">{% trans "Suspended" %}</span>{% endif %} {% endif %}
{% if instance.proxy.instance.info.0 == 3 %}
<span class="text-warning">{% trans "Suspended" %}</span>
{% endif %}
</td> </td>
<td>{{ instance.proxy.instance.info.3 }}</td> <td>{{ instance.proxy.instance.info.3 }}</td>
<td>{% widthratio instance.proxy.instance.info.1 1024 1 %} MiB</td> <td><p class="text-end">{% widthratio instance.proxy.instance.info.1 1024 1 %} MiB</p></td>
<td class="text-nowrap"> <td class="text-nowrap">
{% include 'instance_actions.html' %} {% include 'instance_actions.html' %}
</td> </td>

View file

@ -2,7 +2,7 @@
{% load i18n %} {% load i18n %}
{% load static %} {% load static %}
{% load common_tags %} {% load common_tags %}
{% load icons %} {% load bootstrap_icons %}
{% block title %}{% trans "Computes" %}{% endblock %} {% block title %}{% trans "Computes" %}{% endblock %}
{% block content %} {% block content %}
<div class="row"> <div class="row">
@ -16,7 +16,7 @@
{% if not computes %} {% if not computes %}
<div class="col-lg-12"> <div class="col-lg-12">
<div class="alert alert-warning shadow-sm"> <div class="alert alert-warning shadow-sm">
{% icon 'exclamation-triangle '%} <strong>{% trans "Warning" %}:</strong> {% trans "You don't have any computes" %} {% bs_icon 'exclamation-triangle '%} <strong>{% trans "Warning" %}:</strong> {% trans "You don't have any computes" %}
</div> </div>
</div> </div>
{% else %} {% else %}
@ -45,12 +45,12 @@
<td class="col-sm-2"> <td class="col-sm-2">
<div class="float-end btn-group"> <div class="float-end btn-group">
{% if compute.status is True %} {% if compute.status is True %}
<a class="btn btn-success" title="{%trans "Overview" %}" href="{% url 'overview' compute.id %}">{% icon 'eye' %}</a> <a class="btn btn-success" title="{%trans "Overview" %}" href="{% url 'overview' compute.id %}">{% bs_icon 'eye-fill' %}</a>
{% else %} {% else %}
<a class="btn btn-light" title="{%trans "Overview" %}">{% icon 'eye' %}</a> <a class="btn btn-light" title="{%trans "Overview" %}">{% bs_icon 'eye' %}</a>
{% endif %} {% endif %}
<a class="btn btn-primary" title="{%trans "Edit" %}" href="{% url 'compute_update' compute.id %}">{% icon 'pencil' %}</a> <a class="btn btn-primary" title="{%trans "Edit" %}" href="{% url 'compute_update' compute.id %}">{% bs_icon 'pencil-fill' %}</a>
<a class="btn btn-danger" title="{%trans "Delete" %}" href="{% url 'compute_delete' compute.id %}">{% icon 'times' %}</a> <a class="btn btn-danger" title="{%trans "Delete" %}" href="{% url 'compute_delete' compute.id %}">{% bs_icon 'x-circle-fill' %}</a>
</div> </div>
</td> </td>
</tr> </tr>

View file

@ -1,10 +1,11 @@
{% load i18n %} {% load i18n %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% load icons %} {% load bootstrap_icons %}
<div class="btn-group float-end mt-1" role="group" aria-label="Add host button group"> <div class="btn-group float-end mt-1" role="group" aria-label="Add host button group">
<a href="{% url 'add_tcp_host' %}" class="btn btn-success">{% trans "TCP" %}</a> <a href="{% url 'add_tcp_host' %}" class="btn btn-success">{% trans "TCP" %}</a>
<a href="{% url 'add_ssh_host' %}" class="btn btn-success">{% trans "SSH" %}</a> <a href="{% url 'add_ssh_host' %}" class="btn btn-success">{% trans "SSH" %}</a>
<a href="{% url 'add_tls_host' %}" class="btn btn-success">{% trans "TLS" %}</a> <a href="{% url 'add_tls_host' %}" class="btn btn-success">{% trans "TLS" %}</a>
<a href="{% url 'add_socket_host' %}" class="btn btn-success">{% trans "Local" %}</a> <a href="{% url 'add_socket_host' %}" class="btn btn-success">{% trans "Local" %}</a>
<a href="#" class="btn btn-success disabled" title="{% trans "Add new host" %}">{% icon "plus" %}</a> <a href="#" class="btn btn-success disabled" title="{% trans "Add new host" %}">{% bs_icon "plus-circle-fill" %}</a>
</div> </div>

View file

@ -1,7 +1,7 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load i18n %} {% load i18n %}
{% load static %} {% load static %}
{% load icons %} {% load bootstrap_icons %}
{% block title %}{% trans "Overview" %} - {{ compute.name }}{% endblock %} {% block title %}{% trans "Overview" %} - {{ compute.name }}{% endblock %}
@ -12,25 +12,25 @@
<nav aria-label="breadcrumb"> <nav aria-label="breadcrumb">
<ol class="breadcrumb shadow-sm"> <ol class="breadcrumb shadow-sm">
<li class="breadcrumb-item" aria-current="page"> <li class="breadcrumb-item" aria-current="page">
<span class="fw-bold">{% icon 'dashboard' %} {% trans "Overview" %}</span> <span class="fw-bold">{% bs_icon 'laptop' %} {% trans "Overview" %}</span>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'instances' compute.id %}">{% icon 'server' %} {% trans "Instances" %}</a> <a href="{% url 'instances' compute.id %}">{% bs_icon 'server' %} {% trans "Instances" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'storages' compute.id %}">{% icon 'hdd-o' %} {% trans "Storages" %}</a> <a href="{% url 'storages' compute.id %}">{% bs_icon 'device-hdd' %} {% trans "Storages" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'networks' compute.id %}">{% icon 'sitemap' %} {% trans "Networks" %}</a> <a href="{% url 'networks' compute.id %}">{% bs_icon 'hdd-network' %} {% trans "Networks" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'interfaces' compute.id %}">{% icon 'wifi' %} {% trans "Interfaces" %}</a> <a href="{% url 'interfaces' compute.id %}">{% bs_icon 'wifi' %} {% trans "Interfaces" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'nwfilters' compute.id %}">{% icon 'filter' %} {% trans "NWFilters" %}</a> <a href="{% url 'nwfilters' compute.id %}">{% bs_icon 'filter' %} {% trans "NWFilters" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'virtsecrets' compute.id %}">{% icon 'key' %} {% trans "Secrets" %}</a> <a href="{% url 'virtsecrets' compute.id %}">{% bs_icon 'key' %} {% trans "Secrets" %}</a>
</li> </li>
</ol> </ol>
</nav> </nav>
@ -96,7 +96,7 @@
<div class="my-3 card border-success"> <div class="my-3 card border-success">
<div class="card-body"> <div class="card-body">
<h5 class="card-title"> <h5 class="card-title">
<i class="fa fa-long-arrow-right"></i> {% bs_icon 'arrow-right' %}
{% trans "CPU Utilization" %} {% trans "CPU Utilization" %}
</h5> </h5>
<canvas id="cpuChart" width="735" height="160"></canvas> <canvas id="cpuChart" width="735" height="160"></canvas>
@ -106,7 +106,7 @@
<div class="my-3 card border-primary"> <div class="my-3 card border-primary">
<div class="card-body"> <div class="card-body">
<h5 class="card-title "> <h5 class="card-title ">
<i class="fa fa-long-arrow-right"></i> {% trans "RAM Utilization" %} {% bs_icon 'arrow-right'%} {% trans "RAM Utilization" %}
</h5> </h5>
<canvas id="memChart" width="735" height="160"></canvas> <canvas id="memChart" width="735" height="160"></canvas>
</div> </div>

View file

@ -1,22 +1,22 @@
Django==3.2.20 Django==3.2.20
django_bootstrap5==23.3 django_bootstrap5==23.3
django-bootstrap-icons==0.8.3
django-login-required-middleware==0.9.0 django-login-required-middleware==0.9.0
django-otp==1.2.2 django-otp==1.2.2
django-icons==23.3
django-qr-code==3.1.1 django-qr-code==3.1.1
gunicorn==20.1.0 gunicorn==21.2.0
libsass==0.22.0 libsass==0.22.0
libvirt-python==9.5.0 libvirt-python==9.6.0
lxml==4.9.3 lxml==4.9.3
qrcode==7.4.2 qrcode==7.4.2
rwlock==0.0.7 rwlock==0.0.7
websockify==0.10.0 websockify==0.10.0
zipp==3.13.0 zipp==3.16.2
ldap3==2.9.1 ldap3==2.9.1
python-engineio==4.5.1 python-engineio==4.5.1
python-socketio==5.8.0 python-socketio==5.8.0
eventlet==0.33.3 eventlet==0.33.3
djangorestframework==3.14.0 djangorestframework==3.14.0
drf-nested-routers==0.93.4 drf-nested-routers==0.93.4
drf-yasg==1.21.6 drf-yasg==1.21.7
markdown>=3.4.1 markdown>=3.4.1

View file

@ -1,8 +1,9 @@
-r ../conf/requirements.txt -r ../conf/requirements.txt
coverage==7.2.7 coverage==7.3.0
django-debug-toolbar==4.1.0 django-debug-toolbar==4.2.0
pycodestyle==2.10.0 django-debug-toolbar-template-profiler
pyflakes==3.0.1 pycodestyle==2.11.0
pylint==2.17.4 pyflakes==3.1.0
yapf==0.33.0 pylint==2.17.5
yapf==0.40.1
black==23.7.0 black==23.7.0

View file

@ -1 +1,14 @@
@import "dev/scss/bootswatch/zephyr/bootswatch"; // Override importing Google APIs for inter font
$web-font-path: '' !default;
/* inter-regular - latin */
@font-face {
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
font-family: 'Inter';
font-style: normal;
font-weight: 400;
src: url('/static/fonts/inter-v12-latin-regular.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
}
@import "dev/scss/bootswatch/zephyr/bootswatch";

View file

@ -252,6 +252,7 @@ class CreateInstance(models.Model):
error_messages={"required": _("No Network pool has been choosen")}, error_messages={"required": _("No Network pool has been choosen")},
) )
nwfilter = models.CharField(max_length=256, blank=True) nwfilter = models.CharField(max_length=256, blank=True)
net_model = models.CharField(max_length=256, blank=True)
storage = models.CharField(max_length=256, blank=True) storage = models.CharField(max_length=256, blank=True)
template = models.CharField(max_length=256, blank=True) template = models.CharField(max_length=256, blank=True)
images = models.CharField(max_length=256, blank=True) images = models.CharField(max_length=256, blank=True)

View file

@ -1,7 +1,8 @@
{% load i18n %} {% load i18n %}
{% load bootstrap_icons %}
{% if request.user.is_superuser %} {% if request.user.is_superuser %}
<button type="button" class="btn btn-success float-end" data-bs-toggle="modal" data-bs-target="#addInstanceNetwork"> <button type="button" class="btn btn-success float-end" data-bs-toggle="modal" data-bs-target="#addInstanceNetwork">
<span class="fa fa-plus" aria-hidden="true"></span> <span aria-hidden="true">{% bs_icon 'plus'%} </span>
</button> </button>
<!-- Modal pool --> <!-- Modal pool -->
@ -44,6 +45,16 @@
</select> </select>
</div> </div>
</div> </div>
<div class="row">
<label class="col-sm-4 col-form-label">{% trans "NIC Type" %} </label>
<div class="col-sm-6">
<select class="form-select" name="add-net-model">
{% for model in net_models_host %}
<option value="{{ model }}" {% if model == 'default' %} selected {% endif %}>{{ model }}</option>
{% endfor %}
</select>
</div>
</div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">{% trans "Close" %}</button> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">{% trans "Close" %}</button>

View file

@ -1,7 +1,8 @@
{% load i18n %} {% load i18n %}
{% load bootstrap_icons %}
{% if request.user.is_superuser %} {% if request.user.is_superuser %}
<a href="#addInstanceOwner" type="button" class="btn btn-success float-end" data-bs-toggle="modal"> <a href="#addInstanceOwner" type="button" class="btn btn-success float-end" data-bs-toggle="modal">
<span class="fa fa-plus" aria-hidden="true"></span> <span aria-hidden="true">{% bs_icon 'plus'%} </span>
</a> </a>
<!-- Modal pool --> <!-- Modal pool -->

View file

@ -1,7 +1,8 @@
{% load i18n %} {% load i18n %}
{% load bootstrap_icons %}
{% if request.user.is_superuser %} {% if request.user.is_superuser %}
<a href="#addvol" type="button" class="btn btn-success float-end" data-bs-toggle="modal" title="{% trans "Add Volume" %}"> <a href="#addvol" type="button" class="btn btn-success float-end" data-bs-toggle="modal" title="{% trans "Add Volume" %}">
<span class="fa fa-plus" aria-hidden="true"></span> <span aria-hidden="true">{% bs_icon 'plus'%} </span>
</a> </a>
<!-- Modal pool --> <!-- Modal pool -->

View file

@ -1,6 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load i18n %} {% load i18n %}
{% load icons %}
{% load static %} {% load static %}
{% block title %}{% trans "Instances" %}{% endblock %} {% block title %}{% trans "Instances" %}{% endblock %}
{% block style %} {% block style %}

View file

@ -1,5 +1,5 @@
{% load i18n %} {% load i18n %}
{% load icons %} {% load bootstrap_icons %}
<table class="table table-hover sortable-theme-bootstrap" data-sortable> <table class="table table-hover sortable-theme-bootstrap" data-sortable>
<thead> <thead>
<tr> <tr>
@ -20,7 +20,7 @@
{% if compute.status is True and compute.instance_set.count > 0 %} {% if compute.status is True and compute.instance_set.count > 0 %}
<tr class="table-secondary fw-bold border-bottom border-dark"> <tr class="table-secondary fw-bold border-bottom border-dark">
<td> <td>
<span id="collapse_host_instances_{{ compute.id }}" class="fa fa-chevron-up" onclick="hide_host_instances('{{ compute.id }}');"></span> <span id="collapse_host_instances_{{ compute.id }}" onclick="hide_host_instances('{{ compute.id }}');">{% bs_icon 'chevron-up'%} </span>
</td> </td>
<td> <td>
<a class="link-dark" href="{% url 'overview' compute.id %}">{{ compute.name }}</a> <a class="link-dark" href="{% url 'overview' compute.id %}">{{ compute.name }}</a>

View file

@ -31,10 +31,10 @@
<a href="{% url 'overview' instance.compute.id %}">{{ instance.compute.name }}</a><br> <a href="{% url 'overview' instance.compute.id %}">{{ instance.compute.name }}</a><br>
<small><em> <small><em>
{% if instance.userinstance_set.all.count > 0 %} {% if instance.userinstance_set.all.count > 0 %}
{{ instance.userinstance_set.all.0.user }} {{ instance.userinstance_set.all.0.user }}
{% if instance.userinstance_set.all.count > 1 %} {% if instance.userinstance_set.all.count > 1 %}
(+{{ instance.userinstance_set.all.count|add:"-1" }}) (+{{ instance.userinstance_set.all.count|add:"-1" }})
{% endif %} {% endif %}
{% endif %} {% endif %}
</em></small> </em></small>
</td> </td>

View file

@ -1,4 +1,5 @@
{% load i18n %} {% load i18n %}
{% load bootstrap_icons %}
<nav class="navbar navbar-expand-sm fixed-bottom navbar-light bg-light" aria-label="Instance bottom navbar"> <nav class="navbar navbar-expand-sm fixed-bottom navbar-light bg-light" aria-label="Instance bottom navbar">
<div class="container"> <div class="container">
<a class="navbar-brand" href="#">{% trans 'HOST' %}</a> <a class="navbar-brand" href="#">{% trans 'HOST' %}</a>
@ -9,15 +10,15 @@
<ul class="navbar-nav"> <ul class="navbar-nav">
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{% url 'overview' compute.id %}"> <a class="nav-link" href="{% url 'overview' compute.id %}">
<i class="fa fa-server"></i> {% bs_icon 'server'%}
{{ compute.name }} {% if compute.name != compute.hostname %} - {{ compute.hostname }}{% endif %} {{ compute.name }} {% if compute.name != compute.hostname %} - {{ compute.hostname }}{% endif %}
</a> </a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{% url 'instances' compute.id %}"><i class="fa fa-desktop"></i> {% trans "Instances" %}</a> <a class="nav-link" href="{% url 'instances' compute.id %}">{% bs_icon 'laptop'%} {% trans "Instances" %}</a>
</li> </li>
<li class="nav-item active"> <li class="nav-item active">
<a class="nav-link" href="{% url 'instances:instance' instance.id %}"><i class="fa fa-hdd-o"></i> {{ instance.name }}</a> <a class="nav-link" href="{% url 'instances:instance' instance.id %}">{% bs_icon 'device-hdd'%} {{ instance.name }}</a>
</li> </li>
</ul> </ul>
</div> </div>

View file

@ -1,8 +1,9 @@
{% load i18n %} {% load i18n %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% load bootstrap_icons %}
{% if request.user.is_superuser %} {% if request.user.is_superuser %}
<button href="#addFlavor" type="button" class="btn btn-success btn-header float-end" data-bs-toggle="modal"> <button href="#addFlavor" type="button" class="btn btn-success btn-header float-end" data-bs-toggle="modal">
<span class="fa fa-plus" aria-hidden="true"></span> <span aria-hidden="true">{% bs_icon 'plus'%} </span>
</button> </button>
<!-- Modal Flavor --> <!-- Modal Flavor -->

View file

@ -1,6 +1,7 @@
{% load i18n %} {% load i18n %}
{% load bootstrap_icons %}
<a href="#AddInstance" type="button" class="btn btn-success btn-header float-end" data-bs-toggle="modal"> <a href="#AddInstance" type="button" class="btn btn-success btn-header float-end" data-bs-toggle="modal">
<span class="fa fa-plus" aria-hidden="true"></span> <span aria-hidden="true">{% bs_icon 'plus-circle-fill'%} </span>
</a> </a>
<!-- Modal pool --> <!-- Modal pool -->
@ -28,7 +29,7 @@
<tbody> <tbody>
{% for compute in computes %} {% for compute in computes %}
{% if compute.status is True %} {% if compute.status is True %}
<tr> <tr style="text-decoration: none">
<td>{{ compute.name }}</td> <td>{{ compute.name }}</td>
<td>{{ compute.cpu_count }}</td> <td>{{ compute.cpu_count }}</td>
<td> <td>

View file

@ -1,7 +1,7 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load i18n %} {% load i18n %}
{% load static %} {% load static %}
{% load icons %} {% load bootstrap_icons %}
{% block title %}{% trans "Create new instance" %}{% endblock %} {% block title %}{% trans "Create new instance" %}{% endblock %}
{% block style %} {% block style %}
@ -37,7 +37,7 @@
<ul class="nav nav-tabs" role="tablist" aria-label="Instance create method"> <ul class="nav nav-tabs" role="tablist" aria-label="Instance create method">
<li class="nav-item" role="presentation"> <li class="nav-item" role="presentation">
<button class="nav-link float-end" data-bs-toggle="tab" data-bs-target="#" type="button" role="tab" aria-controls="go_compute" onclick="goto_compute()"> <button class="nav-link float-end" data-bs-toggle="tab" data-bs-target="#" type="button" role="tab" aria-controls="go_compute" onclick="goto_compute()">
<span class="fa fa-arrow-left"></span> <span>{% bs_icon 'arrow-left'%} </span>
</button> </button>
</li> </li>
<li class="nav-item" role="presentation"> <li class="nav-item" role="presentation">
@ -64,7 +64,7 @@
{% if not flavors %} {% if not flavors %}
<div class="col-lg-12"> <div class="col-lg-12">
<div class="alert alert-warning shadow-sm"> <div class="alert alert-warning shadow-sm">
<i class="fa fa-exclamation-triangle"></i> <strong>{% trans "Warning" %}:</strong> {% trans "Hypervisor doesn't have any Flavors" %} {% bs_icon 'exclamation-triangle'%} <strong>{% trans "Warning" %}:</strong> {% trans "Hypervisor doesn't have any Flavors" %}
</div> </div>
</div> </div>
{% else %} {% else %}
@ -173,7 +173,7 @@
<label class="col-sm-4 col-form-label">{% trans "Advanced" %}</label> <label class="col-sm-4 col-form-label">{% trans "Advanced" %}</label>
<div class="d-grid col-sm-7"> <div class="d-grid col-sm-7">
<button class="btn btn-outline-light" type="button" data-bs-toggle="collapse" data-bs-target="#flav-add-collapse" aria-expanded="false" aria-controls="flav-add-collapse"> <button class="btn btn-outline-light" type="button" data-bs-toggle="collapse" data-bs-target="#flav-add-collapse" aria-expanded="false" aria-controls="flav-add-collapse">
<span class="fa fa-caret-down"></span> <span>{% bs_icon 'caret-down'%} </span>
</button> </button>
</div> </div>
</div> </div>
@ -195,6 +195,16 @@
</select> </select>
</div> </div>
</div> </div>
<div class="row">
<label class="col-sm-4 col-form-label">{% trans "NIC Type" %} </label>
<div class="col-sm-7">
<select class="form-select" name="net_model">
{% for model in net_models_host %}
<option value="{{ model }}" {% if model == 'default' %} selected {% endif %}>{{ model }}</option>
{% endfor %}
</select>
</div>
</div>
<div class="row"> <div class="row">
<label class="col-sm-4 col-form-label">{% trans "HDD cache mode" %}</label> <label class="col-sm-4 col-form-label">{% trans "HDD cache mode" %}</label>
<div class="col-sm-7"> <div class="col-sm-7">
@ -303,14 +313,14 @@
</div> </div>
</div> </div>
<a data-bs-toggle="modal" href="#addVMflavor{{ forloop.counter }}" class="btn btn-sm btn-secondary"> <a data-bs-toggle="modal" href="#addVMflavor{{ forloop.counter }}" class="btn btn-sm btn-secondary">
<span class="fa fa-plus"></span> <span >{% bs_icon 'plus'%} </span>
</a> </a>
</td> </td>
<td style="width:5px;"> <td style="width:5px;">
<form action="{% url 'instances:flavor_delete' flavor.id %}" method="post" role="form" aria-label="Delete flavor form"> <form action="{% url 'instances:flavor_delete' flavor.id %}" method="post" role="form" aria-label="Delete flavor form">
{% csrf_token %} {% csrf_token %}
<button type="submit" class="btn btn-sm btn-secondary" name="delete_flavor" onclick="return confirm('{% trans "Are you sure?" %}')"> <button type="submit" class="btn btn-sm btn-secondary" name="delete_flavor" onclick="return confirm('{% trans "Are you sure?" %}')">
{% icon 'trash' %} {% bs_icon 'trash' %}
</button> </button>
</form> </form>
</td> </td>
@ -422,13 +432,12 @@
{% endfor %} {% endfor %}
</select> </select>
</div> </div>
<input id="mac" type="hidden" name="mac" value=""/>
</div> </div>
<div class="row"> <div class="row">
<label class="col-sm-3 col-form-label">{% trans "Advanced" %}</label> <label class="col-sm-3 col-form-label">{% trans "Advanced" %}</label>
<div class="d-grid col-sm-7"> <div class="d-grid col-sm-7">
<button class="btn btn-outline-light" type="button" data-bs-toggle="collapse" data-bs-target="#custadvcollapse" aria-expanded="false" aria-controls="custadvcollapse"> <button class="btn btn-outline-light" type="button" data-bs-toggle="collapse" data-bs-target="#custadvcollapse" aria-expanded="false" aria-controls="custadvcollapse">
<span class="fa fa-caret-down"></span> <span>{% bs_icon 'caret-down'%} </span>
</button> </button>
</div> </div>
</div> </div>
@ -462,6 +471,16 @@
</select> </select>
</div> </div>
</div> </div>
<div class="row">
<label class="col-sm-3 col-form-label">{% trans "NIC Type" %} </label>
<div class="col-sm-7">
<select class="form-select" name="net_model">
{% for model in net_models_host %}
<option value="{{ model }}" {% if model == 'default' %} selected {% endif %}>{{ model }}</option>
{% endfor %}
</select>
</div>
</div>
{% if dom_caps.graphics_support == 'yes' %} {% if dom_caps.graphics_support == 'yes' %}
<div class="row"> <div class="row">
<label class="col-sm-3 col-form-label">{% trans "Graphics" %}</label> <label class="col-sm-3 col-form-label">{% trans "Graphics" %}</label>
@ -670,7 +689,7 @@
<label class="col-sm-3 col-form-label">{% trans "Advanced" %}</label> <label class="col-sm-3 col-form-label">{% trans "Advanced" %}</label>
<div class="d-grid col-sm-7"> <div class="d-grid col-sm-7">
<button class="btn btn-outline-light" type="button" data-bs-toggle="collapse" data-bs-target="#tempAdvCollapse" aria-expanded="false" aria-controls="tempAdvCollapse"> <button class="btn btn-outline-light" type="button" data-bs-toggle="collapse" data-bs-target="#tempAdvCollapse" aria-expanded="false" aria-controls="tempAdvCollapse">
<span class="fa fa-caret-down"></span> <span>{% bs_icon 'caret-down'%} </span>
</button> </button>
</div> </div>
</div> </div>
@ -704,6 +723,16 @@
</select> </select>
</div> </div>
</div> </div>
<div class="row">
<label class="col-sm-3 col-form-label">{% trans "NIC Type" %} </label>
<div class="col-sm-7">
<select class="form-select" name="net_model">
{% for model in net_models_host %}
<option value="{{ model }}" {% if model == 'default' %} selected {% endif %}>{{ model }}</option>
{% endfor %}
</select>
</div>
</div>
{% if dom_caps.graphics_support == 'yes' %} {% if dom_caps.graphics_support == 'yes' %}
<div class="row"> <div class="row">
<label class="col-sm-3 col-form-label">{% trans "Graphics" %}</label> <label class="col-sm-3 col-form-label">{% trans "Graphics" %}</label>
@ -865,7 +894,7 @@
'{% endfor %}' + '{% endfor %}' +
'</select>' + '</select>' +
' -> ' + value + ' ' + ' -> ' + value + ' ' +
'<a class="btn-link float-end" onclick="javascript:$(\'#image-control\').multiselect(\'deselect\', \'' + value + '\', true)"><i class="fa fa-remove"></i></a></li>'; '<a class="btn-link float-end" onclick="javascript:$(\'#image-control\').multiselect(\'deselect\', \'' + value + '\', true)"> X </a></li>';
selected_list_html += li; selected_list_html += li;
counter++; counter++;
}); });
@ -899,7 +928,7 @@
let li = '<li><input type="text" class="input-xs" name="mac'+ net_counter +'" maxlength="17" required pattern="[a-zA-Z0-9:]+" onchange="populate_mac(' + net_counter +')">' + let li = '<li><input type="text" class="input-xs" name="mac'+ net_counter +'" maxlength="17" required pattern="[a-zA-Z0-9:]+" onchange="populate_mac(' + net_counter +')">' +
' eth' + net_counter + ' eth' + net_counter +
' -> ' + value + ' ' + ' -> ' + value + ' ' +
'<a class="btn-link float-end" onclick="$(\'#network-control\').multiselect(\'deselect\', \'' + value + '\', true)"><i class="fa fa-remove"></i></a></li>'; '<a class="btn-link float-end" onclick="$(\'#network-control\').multiselect(\'deselect\', \'' + value + '\', true)"> X </a></li>';
random_mac(net_counter); random_mac(net_counter);
selected_list_html += li; selected_list_html += li;
net_counter++; net_counter++;

View file

@ -1,6 +1,7 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load static %} {% load static %}
{% load i18n %} {% load i18n %}
{% load bootstrap_icons %}
{% block title %}{% trans "Instance" %} - {{ instance.name }}{% endblock %} {% block title %}{% trans "Instance" %} - {{ instance.name }}{% endblock %}
@ -22,7 +23,8 @@
<span class="badge bg-warning">{% trans "Suspend" %}</span> <span class="badge bg-warning">{% trans "Suspend" %}</span>
{% endif %} {% endif %}
| |
<span {%if instance.guest_agent %} <span
{%if instance.guest_agent %}
{% if instance.guest_agent_ready %} {% if instance.guest_agent_ready %}
class="badge bg-success" class="badge bg-success"
title="{% trans "Guest Agent Enabled & Connected" %}" title="{% trans "Guest Agent Enabled & Connected" %}"
@ -33,10 +35,11 @@
{% else %} {% else %}
class="badge bg-danger" class="badge bg-danger"
title="{% trans "Guest Agent Not Enabled & Not Connected" %}" title="{% trans "Guest Agent Not Enabled & Not Connected" %}"
{% endif %}><i class="fa fa-plug"></i></span> {% endif %}>{% bs_icon 'broadcast' size='1em' %}
</span>
| |
{% if instance.snapshots %} {% if instance.snapshots %}
<i class="fa fa-camera link-primary" title="There are {{ instance.snapshots|length }} snapshot(s)"></i> {% bs_icon 'camera'%} <i title="There are {{ instance.snapshots|length }} snapshot(s)"></i>
| |
{% endif %} {% endif %}
{% if instance.cur_vcpu %} {% if instance.cur_vcpu %}
@ -56,12 +59,12 @@
{% endfor %} {% endfor %}
{% endfor %} {% endfor %}
{% if instance.guest_agent_ready %} {% if instance.guest_agent_ready %}
<a class="link-secondary" title="{% trans 'Show Instance OS details' %}" onclick="get_osinfo();"> <a class="link-warning" title="{% trans 'Show Instance OS details' %}" onclick="get_osinfo();">
<span class="fa fa-info-circle"></span> <span>{% bs_icon 'info-circle' %} </span>
</a> </a>
{% endif %} {% endif %}
<a class="link-secondary" href="{% url 'instances:instance' instance.id %}" title="{% trans 'Refresh instance info' %}"> <a class="link-success" href="{% url 'instances:instance' instance.id %}" title="{% trans 'Refresh instance info' %}">
<span class="fa fa-refresh"></span> <span>{% bs_icon 'repeat'%} </span>
</a> </a>
</div> </div>
{% if user_quota_msg %} {% if user_quota_msg %}
@ -77,45 +80,45 @@
<ul class="nav nav-pills nav-fill" id="navbtn" role="tablist" aria-label="Instance actions"> <ul class="nav nav-pills nav-fill" id="navbtn" role="tablist" aria-label="Instance actions">
<li class="nav-item" role="presentation"> <li class="nav-item" role="presentation">
<button class="nav-link action-button active" id="power-tab" aria-controls="power" data-bs-toggle="pill" data-bs-target="#power" type="button" role="tab" aria-selected="true"> <button class="nav-link action-button active" id="power-tab" aria-controls="power" data-bs-toggle="pill" data-bs-target="#power" type="button" role="tab" aria-selected="true">
<span id="action-block" class="fa fa-power-off fa-2x" aria-hidden="true"></span> <span id="action-block" aria-hidden="true">{% bs_icon 'power' size='2em'%} </span>
{% trans "Power" %} {% trans "Power" %}
</button> </button>
</li> </li>
<li class="nav-item" role="presentation"> <li class="nav-item" role="presentation">
<button class="nav-link action-button" id="access-tab" aria-controls="access" data-bs-toggle="pill" data-bs-target="#access" type="button" role="tab" aria-selected="false"> <button class="nav-link action-button" id="access-tab" aria-controls="access" data-bs-toggle="pill" data-bs-target="#access" type="button" role="tab" aria-selected="false">
<span id="action-block" class="fa fa-lock" aria-hidden="true"></span> <span id="action-block" aria-hidden="true">{% bs_icon 'lock' size='2em'%} </span>
{% trans "Access" %} {% trans "Access" %}
</button> </button>
</li> </li>
<li class="nav-item" role="presentation"> <li class="nav-item" role="presentation">
<button class="nav-link action-button" id="resize-tab" aria-controls="resize" data-bs-toggle="pill" data-bs-target="#resize" type="button" role="tab" aria-selected="false"> <button class="nav-link action-button" id="resize-tab" aria-controls="resize" data-bs-toggle="pill" data-bs-target="#resize" type="button" role="tab" aria-selected="false">
<span id="action-block" class="fa fa-expand" aria-hidden="true"></span> <span id="action-block" aria-hidden="true">{% bs_icon 'arrows-angle-expand' size='2em'%} </span>
{% trans "Resize" %} {% trans "Resize" %}
</button> </button>
</li> </li>
{% if allow_admin_or_not_template and 'instances.snapshot_instances' in perms %} {% if allow_admin_or_not_template and 'instances.snapshot_instances' in perms %}
<li class="nav-item" role="presentation"> <li class="nav-item" role="presentation">
<button class="nav-link action-button" id="snapshots-tab" aria-controls="snapshots" data-bs-toggle="pill" data-bs-target="#snapshots" type="button" role="tab" aria-selected="false"> <button class="nav-link action-button" id="snapshots-tab" aria-controls="snapshots" data-bs-toggle="pill" data-bs-target="#snapshots" type="button" role="tab" aria-selected="false">
<span id="action-block" class="fa fa-camera" aria-hidden="true"></span> <span id="action-block" aria-hidden="true">{% bs_icon 'camera' size='2em'%} </span>
{% trans "Snapshot" %} {% trans "Snapshot" %}
</button> </button>
</li> </li>
{% endif %} {% endif %}
<li class="nav-item" role="presentation"> <li class="nav-item" role="presentation">
<button class="nav-link action-button" id="settings-tab" aria-controls="settings" data-bs-toggle="pill" data-bs-target="#settings" type="button" role="tab" aria-selected="false"> <button class="nav-link action-button" id="settings-tab" aria-controls="settings" data-bs-toggle="pill" data-bs-target="#settings" type="button" role="tab" aria-selected="false">
<span id="action-block" class="fa fa-cog" aria-hidden="true"></span> <span id="action-block" aria-hidden="true">{% bs_icon 'gear-wide-connected' size='2em'%} </span>
{% trans "Settings" %} {% trans "Settings" %}
</button> </button>
</li> </li>
<li class="nav-item" role="presentation"> <li class="nav-item" role="presentation">
<button class="nav-link action-button" id="graphics-tab" aria-controls="graphics" data-bs-toggle="pill" data-bs-target="#graphics" type="button" role="tab" aria-selected="false"> <button class="nav-link action-button" id="graphics-tab" aria-controls="graphics" data-bs-toggle="pill" data-bs-target="#graphics" type="button" role="tab" aria-selected="false">
<span id="action-block" class="fa fa-bar-chart" aria-hidden="true"></span> <span id="action-block" aria-hidden="true">{% bs_icon 'bar-chart-line' size='2em'%} </span>
{% trans "Stats" %} {% trans "Stats" %}
</button> </button>
</li> </li>
<li class="nav-item" role="presentation"> <li class="nav-item" role="presentation">
<button class="nav-link action-button" id="undefine-tab" aria-controls="undefine" data-bs-toggle="pill" data-bs-target="#undefine" type="button" role="tab" aria-selected="false"> <button class="nav-link action-button" id="undefine-tab" aria-controls="undefine" data-bs-toggle="pill" data-bs-target="#undefine" type="button" role="tab" aria-selected="false">
<span id="action-block" class="fa fa-trash" aria-hidden="true"></span> <span id="action-block" aria-hidden="true">{% bs_icon 'trash' size='2em'%} </span>
{% trans "Destroy" %} {% trans "Destroy" %}
</button> </button>
</li> </li>

View file

@ -1,45 +1,45 @@
{% load i18n %} {% load i18n %}
{% load icons %} {% load bootstrap_icons %}
<form action="" method="post" role="form" aria-label="Shortcut instance action form">{% csrf_token %} <form action="" method="post" role="form" aria-label="Shortcut instance action form">{% csrf_token %}
{% if instance.proxy.instance.info.0 == 5 %} {% if instance.proxy.instance.info.0 == 5 %}
{% if instance.is_template %} {% if instance.is_template %}
<a href="{% url 'instances:instance' instance.id %}#clone" class="btn btn-sm btn-secondary" title="{% trans "Clone" %}"> <a href="{% url 'instances:instance' instance.id %}#clone" class="btn btn-sm btn-secondary" title="{% trans "Clone" %}">
{% icon 'clone' %} {% bs_icon 'clone' %}
</a> </a>
{% else %} {% else %}
<a class="btn btn-sm btn-secondary" href="{% url 'instances:poweron' instance.id %}" onclick="showPleaseWaitDialog()" title="{% trans "Power On" %}"> <a class="btn btn-sm btn-secondary" href="{% url 'instances:poweron' instance.id %}" onclick="showPleaseWaitDialog()" title="{% trans "Power On" %}">
{% icon 'play' %} {% bs_icon 'play-fill' %}
</a> </a>
{% endif %} {% endif %}
<a class="btn btn-sm btn-secondary disabled" title="{% trans "Suspend" %}">{% icon 'pause' %}</a> <a class="btn btn-sm btn-secondary disabled" title="{% trans "Suspend" %}">{% bs_icon 'pause-fill' %}</a>
<a class="btn btn-sm btn-secondary disabled" title="{% trans "Power Off" %}">{% icon 'power-off' %}</a> <a class="btn btn-sm btn-secondary disabled" title="{% trans "Power Off" %}">{% bs_icon 'power' %}</a>
<a class="btn btn-sm btn-secondary disabled" title="{% trans "Power Cycle" %}">{% icon 'refresh' %}</a> <a class="btn btn-sm btn-secondary disabled" title="{% trans "Power Cycle" %}">{% bs_icon 'repeat' %}</a>
<button class="btn btn-sm btn-secondary disabled" title="{% trans "VNC Console" %}" disabled> <button class="btn btn-sm btn-secondary disabled" title="{% trans "VNC Console" %}" disabled>
<span class="fa fa-eye"></span> <span>{% bs_icon 'eye-fill' %}</span>
</button> </button>
{% endif %} {% endif %}
{% if instance.proxy.instance.info.0 == 3 %} {% if instance.proxy.instance.info.0 == 3 %}
<a class="btn btn-sm btn-secondary" href="{% url 'instances:resume' instance.id %}" title="{% trans "Resume" %}"> <a class="btn btn-sm btn-secondary" href="{% url 'instances:resume' instance.id %}" title="{% trans "Resume" %}">
{% icon 'play' %} {% bs_icon 'play-fill' %}
</a> </a>
<a class="btn btn-sm btn-secondary disabled" title="{% trans "Suspend" %}">{% icon 'pause' %}</a> <a class="btn btn-sm btn-secondary disabled" title="{% trans "Suspend" %}">{% bs_icon 'pause-fill' %}</a>
<a class="btn btn-sm btn-secondary" href="{% url 'instances:force_off' instance.id %}" title="{% trans "Force Off" %}"> <a class="btn btn-sm btn-secondary" href="{% url 'instances:force_off' instance.id %}" title="{% trans "Force Off" %}">
{% icon 'power-off' %} {% bs_icon 'power' %}
</a> </a>
<a class="btn btn-sm btn-secondary disabled" title="{% trans "Power Cycle" %}">{% icon 'refresh' %}</a> <a class="btn btn-sm btn-secondary disabled" title="{% trans "Power Cycle" %}">{% bs_icon 'repeat' %}</a>
<button class="btn btn-sm btn-secondary disabled" title="{% trans "VNC Console" %}" disabled> <button class="btn btn-sm btn-secondary disabled" title="{% trans "VNC Console" %}" disabled>
<span class="fa fa-eye"></span> <span>{% bs_icon 'eye-fill' %}</span>
</button> </button>
{% endif %} {% endif %}
{% if instance.proxy.instance.info.0 == 1 %} {% if instance.proxy.instance.info.0 == 1 %}
<a class="btn btn-sm btn-secondary disabled" onclick="showPleaseWaitDialog()" title="{% trans "Power On" %}">{% icon 'play' %}</a> <a class="btn btn-sm btn-secondary disabled" onclick="showPleaseWaitDialog()" title="{% trans "Power On" %}">{% bs_icon 'play-fill' %}</a>
<a class="btn btn-sm btn-secondary" href="{% url 'instances:suspend' instance.id %}" <a class="btn btn-sm btn-secondary" href="{% url 'instances:suspend' instance.id %}"
title="{% trans "Suspend" %}">{% icon 'pause' %}</a> title="{% trans "Suspend" %}">{% bs_icon 'pause-fill' %}</a>
<a class="btn btn-sm btn-secondary" href="{% url 'instances:poweroff' instance.id %}">{% icon 'power-off' %}</a> <a class="btn btn-sm btn-secondary" href="{% url 'instances:poweroff' instance.id %}">{% bs_icon 'power' %}</a>
<a class="btn btn-sm btn-secondary" href="{% url 'instances:powercycle' instance.id %}">{% icon 'refresh' %}</a> <a class="btn btn-sm btn-secondary" href="{% url 'instances:powercycle' instance.id %}">{% bs_icon 'repeat' %}</a>
<button class="btn btn-sm btn-secondary" type="button" onclick='open_console("{{ instance.compute.id }}-{{ instance.get_uuid }}")' <button class="btn btn-sm btn-secondary" type="button" onclick='open_console("{{ instance.compute.id }}-{{ instance.get_uuid }}")'
title="{% trans "Console" %}"> title="{% trans "Console" %}">
<span class="fa fa-eye"></span> <span>{% bs_icon 'eye-fill' %}</span>
</button> </button>
{% endif %} {% endif %}
</form> </form>

View file

@ -1,7 +1,8 @@
{% load i18n %} {% load i18n %}
{% load bootstrap_icons %}
{% if request.user.is_superuser %} {% if request.user.is_superuser %}
<button href="#editvol{{ id }}" type="button" class="btn btn-sm btn-secondary" data-bs-toggle="modal" title="{% trans "Edit Volume" %}"> <button href="#editvol{{ id }}" type="button" class="btn btn-sm btn-secondary" data-bs-toggle="modal" title="{% trans "Edit Volume" %}">
<i class="fa fa-edit" aria-hidden="true"></i> {% bs_icon 'pencil-square' %}
</button> </button>
<!-- Modal pool --> <!-- Modal pool -->

View file

@ -1,6 +1,6 @@
{% load i18n %} {% load i18n %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% load icons %} {% load bootstrap_icons %}
<div class="tab-pane" id="settings" role="tabpanel"> <div class="tab-pane" id="settings" role="tabpanel">
<!-- Nav tabs --> <!-- Nav tabs -->
<ul class="nav nav-tabs" role="tablist" aria-label="Instance settings"> <ul class="nav nav-tabs" role="tablist" aria-label="Instance settings">
@ -8,7 +8,7 @@
{% if instance.guest_agent_ready %} {% if instance.guest_agent_ready %}
<li class="nav-item" role="presentation"> <li class="nav-item" role="presentation">
<button class="px-1 nav-link" data-bs-toggle="tab" id="osinfo-tab" data-bs-target="#osinfo" type="button" role="tab" aria-controls="osinfo" aria-selected="false" onclick="get_osinfo();"> <button class="px-1 nav-link" data-bs-toggle="tab" id="osinfo-tab" data-bs-target="#osinfo" type="button" role="tab" aria-controls="osinfo" aria-selected="false" onclick="get_osinfo();">
<span class="fa fa-info-circle"></span> <span>{% bs_icon 'info-circle' %} </span>
</button> </button>
</li> </li>
{% endif %} {% endif %}
@ -134,10 +134,10 @@
</div> </div>
<div> <div>
<div class="row mt-4"> <div class="row mt-4">
<a href="#" id="boot_order_up" class="btn btn-light shadow-sm"><span class="fa fa-arrow-up" title="{% trans 'up: move selected devices' %}"></span></a> <a href="#" id="boot_order_up" class="btn btn-light shadow-sm"><span title="{% trans 'up: move selected devices' %}">{% bs_icon 'arrow-up' %} </span></a>
</div> </div>
<div class="row mt-2"> <div class="row mt-2">
<a href="#" id="boot_order_down" class="btn btn-light shadow-sm"><span class="fa fa-arrow-down" title="{% trans 'down: move selected devices' %}"></span></a> <a href="#" id="boot_order_down" class="btn btn-light shadow-sm"><span title="{% trans 'down: move selected devices' %}">{% bs_icon 'arrow-down' %} </span></a>
</div> </div>
</div> </div>
</div> </div>
@ -158,7 +158,7 @@
type="submit" type="button" type="submit" type="button"
title="{% trans 'Add CD-ROM' %}" title="{% trans 'Add CD-ROM' %}"
{% if instance.status != 5 %} disabled {% endif %}> {% if instance.status != 5 %} disabled {% endif %}>
<span class="fa fa-plus"></span> <span>{% bs_icon 'plus' %} </span>
</button> </button>
</p> </p>
</form> </form>
@ -199,7 +199,7 @@
{% endif %} {% endif %}
{% if instance.status == 5 and allow_admin_or_not_template %} {% if instance.status == 5 and allow_admin_or_not_template %}
<a href="{% url 'instances:detach_cdrom' instance.id cd.dev %}" class="btn btn-sm btn-danger float-end" title="{% trans "Detach CD-ROM (remove device)" %}"> <a href="{% url 'instances:detach_cdrom' instance.id cd.dev %}" class="btn btn-sm btn-danger float-end" title="{% trans "Detach CD-ROM (remove device)" %}">
{% icon 'remove' %} {% bs_icon 'dash-circle' %}
</a> </a>
{% endif %} {% endif %}
@ -274,7 +274,7 @@
<strong>IO Mode:</strong> {{ disk.io }} <br/> <strong>IO Mode:</strong> {{ disk.io }} <br/>
<strong>Discard:</strong> {{ disk.discard }} <br/> <strong>Discard:</strong> {{ disk.discard }} <br/>
<strong>Detect Zeroes:</strong> {{ disk.detect_zeroes }}"> <strong>Detect Zeroes:</strong> {{ disk.detect_zeroes }}">
<span class="fa fa-info"></span> <span>{% bs_icon 'info' %} </span>
</button> </button>
{{ disk.dev }} {{ disk.dev }}
</td> </td>
@ -307,11 +307,11 @@
<input type="hidden" name="name" value="{{ disk.image }}"> <input type="hidden" name="name" value="{{ disk.image }}">
{% if instance.status == 5 %} {% if instance.status == 5 %}
<button type="submit" class="btn btn-sm btn-secondary" value="{{ disk.dev }}" title="{% trans "Detach" %}" onclick="return confirm('{% trans "Are you sure to detach volume?" %}')"> <button type="submit" class="btn btn-sm btn-secondary" value="{{ disk.dev }}" title="{% trans "Detach" %}" onclick="return confirm('{% trans "Are you sure to detach volume?" %}')">
{% icon 'eject' %} {% bs_icon 'eject' %}
</button> </button>
{% else %} {% else %}
<button class="btn btn-sm btn-secondary disabled" value="{{ disk.dev }}" title="{% trans "Detach" %}" onclick="return confirm('{% trans "Are you sure? This may lead data corruption!" %}')"> <button class="btn btn-sm btn-secondary disabled" value="{{ disk.dev }}" title="{% trans "Detach" %}" onclick="return confirm('{% trans "Are you sure? This may lead data corruption!" %}')">
{% icon 'eject' %} {% bs_icon 'eject' %}
</button> </button>
{% endif %} {% endif %}
</form> </form>
@ -323,11 +323,11 @@
<input type="hidden" name="name" value="{{ disk.image }}"> <input type="hidden" name="name" value="{{ disk.image }}">
{% if instance.status == 5 %} {% if instance.status == 5 %}
<button type="submit" class="btn btn-sm btn-secondary" title="{% trans "Delete" %}" onclick="return confirm('{% trans "Are you sure to delete volume?" %}')"> <button type="submit" class="btn btn-sm btn-secondary" title="{% trans "Delete" %}" onclick="return confirm('{% trans "Are you sure to delete volume?" %}')">
<i class="fa fa-trash"></i> {% bs_icon 'trash' %}
</button> </button>
{% else %} {% else %}
<button class="btn btn-sm btn-secondary disabled" title="{% trans "Delete" %}" onclick="return confirm('{% trans "Are you sure? This may lead data corruption!" %}')"> <button class="btn btn-sm btn-secondary disabled" title="{% trans "Delete" %}" onclick="return confirm('{% trans "Are you sure? This may lead data corruption!" %}')">
<i class="fa fa-trash"></i> {% bs_icon 'trash' %}
</button> </button>
{% endif %} {% endif %}
</form> </form>
@ -393,7 +393,7 @@
title="{% trans "Edit NIC" %}" title="{% trans "Edit NIC" %}"
data-bs-target="#editInstanceNetwork{{ forloop.counter0 }}" data-bs-target="#editInstanceNetwork{{ forloop.counter0 }}"
data-bs-toggle="modal"> data-bs-toggle="modal">
<span class="fa fa-edit" aria-hidden="true"></span> <span aria-hidden="true">{% bs_icon 'pencil-square' %} </span>
</button> </button>
<div class="modal fade" id="editInstanceNetwork{{ forloop.counter0 }}" role="dialog" aria-labelledby="editInstanceNetworkLabel" aria-hidden="true"> <div class="modal fade" id="editInstanceNetwork{{ forloop.counter0 }}" role="dialog" aria-labelledby="editInstanceNetworkLabel" aria-hidden="true">
@ -471,7 +471,7 @@
<form action="{% url 'instances:delete_network' instance.id %}" method="post" name="delete_network" role="form">{% csrf_token %} <form action="{% url 'instances:delete_network' instance.id %}" method="post" name="delete_network" role="form">{% csrf_token %}
<button class="btn btn-sm btn-danger" value="{{ network.mac }}" name="delete_network" title="{% trans "Delete Device" %}" <button class="btn btn-sm btn-danger" value="{{ network.mac }}" name="delete_network" title="{% trans "Delete Device" %}"
onclick="return confirm('{% trans "Are you sure?" %}')"> onclick="return confirm('{% trans "Are you sure?" %}')">
<i class="fa fa-trash"></i> {% bs_icon 'trash' %}
</button> </button>
</form> </form>
</td> </td>
@ -547,7 +547,7 @@
<button type="submit" class="btn btn-sm btn-primary" <button type="submit" class="btn btn-sm btn-primary"
name="set_qos" data-bs-toggle="modal" name="set_qos" data-bs-toggle="modal"
title="{% trans "Edit QoS" %}" onclick="return confirm('{% trans "Are you sure?" %}')"> title="{% trans "Edit QoS" %}" onclick="return confirm('{% trans "Are you sure?" %}')">
<span class="fa fa-save"></span> <span>{% bs_icon 'save' %} </span>
</button> </button>
</form> </form>
<form action="{% url 'instances:unset_qos' instance.id %}" method="post" role="form" aria-label="Instance QoS configuration form"> <form action="{% url 'instances:unset_qos' instance.id %}" method="post" role="form" aria-label="Instance QoS configuration form">
@ -557,7 +557,7 @@
<button type="submit" class="btn btn-sm btn-danger" <button type="submit" class="btn btn-sm btn-danger"
name="unset_qos" name="unset_qos"
title="{% trans "Delete QoS" %}" onclick="return confirm('{% trans "Are you sure?" %}')"> title="{% trans "Delete QoS" %}" onclick="return confirm('{% trans "Are you sure?" %}')">
<i class="fa fa-trash"></i> {% bs_icon 'trash' %}
</button> </button>
</form> </form>
</td> </td>
@ -694,7 +694,7 @@
<td><a href="{% url 'accounts:account' userinstance.user.id %}">{{ userinstance.user }}</a></td> <td><a href="{% url 'accounts:account' userinstance.user.id %}">{{ userinstance.user }}</a></td>
<td style="width:30px;"> <td style="width:30px;">
<a href="{% url 'accounts:user_instance_delete' userinstance.id %}?next={% url 'instances:instance' instance.id %}#users"> <a href="{% url 'accounts:user_instance_delete' userinstance.id %}?next={% url 'instances:instance' instance.id %}#users">
{% icon 'trash' %} {% bs_icon 'trash' %}
</a> </a>
</td> </td>
</tr> </tr>

View file

@ -1,5 +1,5 @@
{% load i18n %} {% load i18n %}
{% load icons %} {% load bootstrap_icons %}
<div class="tab-pane" id="snapshots" role="tabpanel"> <div class="tab-pane" id="snapshots" role="tabpanel">
<!-- Nav tabs --> <!-- Nav tabs -->
<ul class="nav nav-tabs" role="tablist" aria-label="Instance snapshot menu"> <ul class="nav nav-tabs" role="tablist" aria-label="Instance snapshot menu">
@ -90,12 +90,12 @@
<input type="hidden" name="name" value="{{ snap.name }}"> <input type="hidden" name="name" value="{{ snap.name }}">
{% if instance.status == 5 %} {% if instance.status == 5 %}
<button type="submit" class="btn btn-sm btn-primary" name="revert_snapshot" title="{% trans 'Revert to this Snapshot' %}" onclick="return confirm('Are you sure?')"> <button type="submit" class="btn btn-sm btn-primary" name="revert_snapshot" title="{% trans 'Revert to this Snapshot' %}" onclick="return confirm('Are you sure?')">
<span class="fa fa-download"></span> <span>{% bs_icon 'download' %} </span>
</button> </button>
{% else %} {% else %}
<button type="button" class="btn btn-sm btn-primary disabled" <button type="button" class="btn btn-sm btn-primary disabled"
title="{% trans "To restore snapshots you need Power Off the instance." %}"> title="{% trans "To restore snapshots you need Power Off the instance." %}">
<span class="fa fa-download"></span> <span>{% bs_icon 'download' %} </span>
</button> </button>
{% endif %} {% endif %}
</form> </form>
@ -104,7 +104,7 @@
<form action="{% url 'instances:delete_snapshot' instance.id %}" method="post" role="form" aria-label="Delete snapshot form">{% csrf_token %} <form action="{% url 'instances:delete_snapshot' instance.id %}" method="post" role="form" aria-label="Delete snapshot form">{% csrf_token %}
<input type="hidden" name="name" value="{{ snap.name }}"> <input type="hidden" name="name" value="{{ snap.name }}">
<button type="submit" class="btn btn-sm btn-danger" title="{% trans 'Delete Snapshot' %}" onclick="return confirm('{% trans "Are you sure?" %}')"> <button type="submit" class="btn btn-sm btn-danger" title="{% trans 'Delete Snapshot' %}" onclick="return confirm('{% trans "Are you sure?" %}')">
{% icon 'trash' %} {% bs_icon 'trash' %}
</button> </button>
</form> </form>
</td> </td>
@ -123,7 +123,7 @@
<input type="hidden" name="date" value="{{ ext_snap.date }}"> <input type="hidden" name="date" value="{{ ext_snap.date }}">
<input type="hidden" name="desc" value="{{ ext_snap.description }}"> <input type="hidden" name="desc" value="{{ ext_snap.description }}">
<button type="submit" class="btn btn-sm btn-primary" name="revert_external_snapshot" title="{% trans 'Revert to this Snapshot' %}" onclick="return confirm('You are going to lose your unsaved work by reverting to this snapshot state. Are you sure?')"> <button type="submit" class="btn btn-sm btn-primary" name="revert_external_snapshot" title="{% trans 'Revert to this Snapshot' %}" onclick="return confirm('You are going to lose your unsaved work by reverting to this snapshot state. Are you sure?')">
<span class="fa fa-download"></span> <span>{% bs_icon 'download' %} </span>
</button> </button>
</form> </form>
</td> </td>
@ -131,7 +131,7 @@
<form action="{% url 'instances:delete_external_snapshot' instance.id %}" method="post" role="form" aria-label="Delete external snapshot form">{% csrf_token %} <form action="{% url 'instances:delete_external_snapshot' instance.id %}" method="post" role="form" aria-label="Delete external snapshot form">{% csrf_token %}
<input type="hidden" name="name" value="{{ ext_snap.name }}"> <input type="hidden" name="name" value="{{ ext_snap.name }}">
<button type="submit" class="btn btn-sm btn-danger" name="delete_external_snapshot" title="{% trans 'Delete Snapshot' %}" onclick="return confirm('You are about to delete this snapshot and merge it with base image. Are you sure?')"> <button type="submit" class="btn btn-sm btn-danger" name="delete_external_snapshot" title="{% trans 'Delete Snapshot' %}" onclick="return confirm('You are about to delete this snapshot and merge it with base image. Are you sure?')">
{% icon 'trash' %} {% bs_icon 'trash' %}
</button> </button>
</form> </form>
</td> </td>

View file

@ -1,4 +1,5 @@
{% load i18n %} {% load i18n %}
{% load bootstrap_icons %}
<div class="tab-pane" id="graphics" role="tabpanel" > <div class="tab-pane" id="graphics" role="tabpanel" >
<!-- Nav tabs --> <!-- Nav tabs -->
<ul class="nav nav-tabs" role="tablist" aria-label="Instance graphs and logs menu"> <ul class="nav nav-tabs" role="tablist" aria-label="Instance graphs and logs menu">
@ -18,7 +19,7 @@
<div role="tabpanel" class="tab-pane tab-pane-bordered active" id="graphs"> <div role="tabpanel" class="tab-pane tab-pane-bordered active" id="graphs">
<div class="mb-1 card border-success"> <div class="mb-1 card border-success">
<div class="card-header"> <div class="card-header">
<h5 class="card-title"><i class="fa fa-long-arrow-right"></i> <h5 class="card-title">{% bs_icon 'arrow-right' %}
{% trans "CPU Usage" %} {% trans "CPU Usage" %}
</h5> </h5>
</div> </div>
@ -32,7 +33,7 @@
</div> </div>
<div class="mb-1 card border-danger"> <div class="mb-1 card border-danger">
<div class="card-header"> <div class="card-header">
<h5 class="card-title"><i class="fa fa-long-arrow-right"></i> <h5 class="card-title">{% bs_icon 'arrow-right' %}
{% trans "Memory Usage" %} {% trans "Memory Usage" %}
</h5> </h5>
</div> </div>
@ -47,7 +48,7 @@
{% for net in instance.networks %} {% for net in instance.networks %}
<div class="mb-1 card border-info"> <div class="mb-1 card border-info">
<div class="card-header"> <div class="card-header">
<h5 class="card-title"><i class="fa fa-long-arrow-right"></i> <h5 class="card-title">{% bs_icon 'arrow-right' %}
{% trans "Bandwidth Device" %}: eth{{ forloop.counter0 }} {% trans "Bandwidth Device" %}: eth{{ forloop.counter0 }}
</h5> </h5>
</div> </div>
@ -63,7 +64,7 @@
{% for disk in instance.disks %} {% for disk in instance.disks %}
<div class="mb-1 card border-warning"> <div class="mb-1 card border-warning">
<div class="card-header"> <div class="card-header">
<h5 class="card-title"><i class="fa fa-long-arrow-right"></i> <h5 class="card-title">{% bs_icon 'arrow-right' %}
{% trans "Disk I/O device" %}: {{ disk.dev }} {% trans "Disk I/O device" %}: {{ disk.dev }}
</h5> </h5>
</div> </div>

View file

@ -1253,6 +1253,7 @@ def add_network(request, pk):
mac = request.POST.get("add-net-mac") mac = request.POST.get("add-net-mac")
nwfilter = request.POST.get("add-net-nwfilter") nwfilter = request.POST.get("add-net-nwfilter")
(source, source_type) = utils.get_network_tuple(request.POST.get("add-net-network")) (source, source_type) = utils.get_network_tuple(request.POST.get("add-net-network"))
model = request.POST.get("add-net-model")
if source_type == "iface": if source_type == "iface":
iface = wvmInterface( iface = wvmInterface(
@ -1264,7 +1265,7 @@ def add_network(request, pk):
) )
source_type = iface.get_type() source_type = iface.get_type()
instance.proxy.add_network(mac, source, source_type, nwfilter=nwfilter) instance.proxy.add_network(mac, source, source_type, model=model, nwfilter=nwfilter)
msg = _("Add network: %(mac)s") % {"mac": mac} msg = _("Add network: %(mac)s") % {"mac": mac}
addlogmsg(request.user.username, instance.compute.name, instance.name, msg) addlogmsg(request.user.username, instance.compute.name, instance.name, msg)
return redirect(request.META.get("HTTP_REFERER") + "#network") return redirect(request.META.get("HTTP_REFERER") + "#network")
@ -1690,6 +1691,7 @@ def create_instance(request, compute_id, arch, machine):
default_bus = app_settings.INSTANCE_VOLUME_DEFAULT_BUS default_bus = app_settings.INSTANCE_VOLUME_DEFAULT_BUS
networks = sorted(conn.get_networks()) networks = sorted(conn.get_networks())
nwfilters = conn.get_nwfilters() nwfilters = conn.get_nwfilters()
net_models_host = conn.get_network_models()
storages = sorted(conn.get_storages(only_actives=True)) storages = sorted(conn.get_storages(only_actives=True))
default_graphics = app_settings.QEMU_CONSOLE_DEFAULT_TYPE default_graphics = app_settings.QEMU_CONSOLE_DEFAULT_TYPE
default_cdrom = app_settings.INSTANCE_CDROM_ADD default_cdrom = app_settings.INSTANCE_CDROM_ADD
@ -1866,6 +1868,7 @@ def create_instance(request, compute_id, arch, machine):
virtio=data["virtio"], virtio=data["virtio"],
listener_addr=data["listener_addr"], listener_addr=data["listener_addr"],
nwfilter=data["nwfilter"], nwfilter=data["nwfilter"],
net_model=data["net_model"],
graphics=data["graphics"], graphics=data["graphics"],
video=data["video"], video=data["video"],
console_pass=data["console_pass"], console_pass=data["console_pass"],

View file

@ -1,7 +1,8 @@
{% load i18n %} {% load i18n %}
{% load bootstrap_icons %}
{% if request.user.is_superuser %} {% if request.user.is_superuser %}
<a href="#AddInterface" type="button" class="btn btn-success float-end" data-bs-toggle="modal"> <a href="#AddInterface" type="button" class="btn btn-success float-end" data-bs-toggle="modal">
<span class="fa fa-plus" aria-hidden="true"></span> <span aria-hidden="true">{% bs_icon 'plus' %} </span>
</a> </a>
<!-- Modal Secret --> <!-- Modal Secret -->

View file

@ -1,5 +1,6 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load i18n %} {% load i18n %}
{% load bootstrap_icons %}
{% block title %}{% trans "Interface" %} - {{ iface }}{% endblock %} {% block title %}{% trans "Interface" %} - {{ iface }}{% endblock %}
@ -10,25 +11,25 @@
<div class="col-lg-12"> <div class="col-lg-12">
<ol class="breadcrumb shadow-sm"> <ol class="breadcrumb shadow-sm">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'overview' compute.id %}"><i class="fa fa-dashboard"></i> {% trans "Overview" %}</a> <a href="{% url 'overview' compute.id %}">{% bs_icon 'laptop' %} {% trans "Overview" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'instances' compute.id %}"><i class="fa fa-server"></i> {% trans "Instances" %}</a> <a href="{% url 'instances' compute.id %}">{% bs_icon 'server' %} {% trans "Instances" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'storages' compute.id %}"> <i class="fa fa-hdd-o"></i> {% trans "Storages" %}</a> <a href="{% url 'storages' compute.id %}">{% bs_icon 'device-hdd' %} {% trans "Storages" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'networks' compute.id %}"><i class="fa fa-sitemap"></i> {% trans "Networks" %}</a> <a href="{% url 'networks' compute.id %}">{% bs_icon 'hdd-network' %} {% trans "Networks" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'interfaces' compute.id %}"><i class="fa fa-wifi"></i> {% trans "Interfaces" %}</a> <a href="{% url 'interfaces' compute.id %}">{% bs_icon 'wifi' %} {% trans "Interfaces" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'nwfilters' compute.id %}"> <i class="fa fa-filter"></i> {% trans "NWFilters" %}</a> <a href="{% url 'nwfilters' compute.id %}">{% bs_icon 'filter' %} {% trans "NWFilters" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'virtsecrets' compute.id %}"><i class="fa fa-key"></i> {% trans "Secrets" %}</a> <a href="{% url 'virtsecrets' compute.id %}">{% bs_icon 'key' %} {% trans "Secrets" %}</a>
</li> </li>
</ol> </ol>
</div> </div>

View file

@ -1,6 +1,7 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load i18n %} {% load i18n %}
{% load static %} {% load static %}
{% load bootstrap_icons %}
{% block title %}{% trans "Interfaces" %} - {{ compute.name }}{% endblock %} {% block title %}{% trans "Interfaces" %} - {{ compute.name }}{% endblock %}
@ -16,25 +17,25 @@
<nav aria-label="breadcrumb"> <nav aria-label="breadcrumb">
<ol class="breadcrumb shadow-sm"> <ol class="breadcrumb shadow-sm">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'overview' compute.id %}"><i class="fa fa-dashboard"></i> {% trans "Overview" %}</a> <a href="{% url 'overview' compute.id %}">{% bs_icon 'laptop' %} {% trans "Overview" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'instances' compute.id %}"><i class="fa fa-server"></i> {% trans "Instances" %}</a> <a href="{% url 'instances' compute.id %}">{% bs_icon 'server' %} {% trans "Instances" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'storages' compute.id %}"><i class="fa fa-hdd-o"></i> {% trans "Storages" %}</a> <a href="{% url 'storages' compute.id %}">{% bs_icon 'device-hdd' %} {% trans "Storages" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'networks' compute.id %}"><i class="fa fa-sitemap"></i> {% trans "Networks" %}</a> <a href="{% url 'networks' compute.id %}">{% bs_icon 'hdd-network' %} {% trans "Networks" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<span class="fw-bold"><i class="fa fa-wifi"></i> {% trans "Interfaces" %}</span> <span class="fw-bold">{% bs_icon 'wifi' %} {% trans "Interfaces" %}</span>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'nwfilters' compute.id %}"><i class="fa fa-filter"></i> {% trans "NWFilters" %}</a> <a href="{% url 'nwfilters' compute.id %}">{% bs_icon 'filter' %} {% trans "NWFilters" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'virtsecrets' compute.id %}"><i class="fa fa-key"></i> {% trans "Secrets" %}</a> <a href="{% url 'virtsecrets' compute.id %}">{% bs_icon 'key' %} {% trans "Secrets" %}</a>
</li> </li>
</ol> </ol>
</nav> </nav>
@ -45,7 +46,7 @@
{% if not ifaces_all %} {% if not ifaces_all %}
<div class="col-lg-12"> <div class="col-lg-12">
<div class="alert alert-warning shadow-sm"> <div class="alert alert-warning shadow-sm">
<i class="fa fa-exclamation-triangle"></i> <strong>{% trans "Warning" %}:</strong> {% trans "Hypervisor doesn't have any Interfaces" %} {% bs_icon 'exclamation-triangle' %} <strong>{% trans "Warning" %}:</strong> {% trans "Hypervisor doesn't have any Interfaces" %}
</div> </div>
</div> </div>
{% else %} {% else %}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,4 +1,5 @@
import json import json
import logging
from django.http import HttpResponse from django.http import HttpResponse
@ -17,6 +18,8 @@ def addlogmsg(user, host, instance, message):
""" """
add_log_msg = Logs(user=user, host=host, instance=instance, message=message) add_log_msg = Logs(user=user, host=host, instance=instance, message=message)
add_log_msg.save() add_log_msg.save()
logger = logging.getLogger("")
logger.info(user + " " + host+ " " + instance+ " " + message)
@superuser_only @superuser_only

View file

@ -1,7 +1,8 @@
{% load i18n %} {% load i18n %}
{% load bootstrap_icons %}
{% if request.user.is_superuser %} {% if request.user.is_superuser %}
<a href="#AddQos{{ id }}" type="button" class="btn btn-sm btn-success float-end" data-bs-toggle="modal" title="add qos"> <a href="#AddQos{{ id }}" type="button" class="btn btn-sm btn-success float-end" data-bs-toggle="modal" title="add qos">
<span class="fa fa-barcode" aria-hidden="true"></span> <span aria-hidden="true">{% bs_icon 'qr-code' %} </span>
</a> </a>
<!-- Modal pool --> <!-- Modal pool -->

View file

@ -1,7 +1,8 @@
{% load i18n %} {% load i18n %}
{% load bootstrap_icons %}
{% if request.user.is_superuser %} {% if request.user.is_superuser %}
<a href="#AddNetPool" type="button" class="btn btn-success float-end" data-bs-toggle="modal"> <a href="#AddNetPool" type="button" class="btn btn-success float-end" data-bs-toggle="modal">
<span class="fa fa-plus" aria-hidden="true"></span> <span aria-hidden="true">{% bs_icon 'plus' %} </span>
</a> </a>
<!-- Modal pool --> <!-- Modal pool -->

View file

@ -1,7 +1,8 @@
{% load i18n %} {% load i18n %}
{% load bootstrap_icons %}
{% if request.user.is_superuser %} {% if request.user.is_superuser %}
<a href="#AddFixedNet4" type="button" class="btn btn-success float-end" data-bs-toggle="modal"> <a href="#AddFixedNet4" type="button" class="btn btn-success float-end" data-bs-toggle="modal">
<span class="fa fa-plus" aria-hidden="true"></span> <span aria-hidden="true">{% bs_icon 'plus' %} </span>
</a> </a>
<!-- Modal pool --> <!-- Modal pool -->

View file

@ -1,7 +1,8 @@
{% load i18n %} {% load i18n %}
{% load bootstrap_icons %}
{% if request.user.is_superuser %} {% if request.user.is_superuser %}
<a href="#AddFixedNet6" type="button" class="btn btn-success float-end" data-bs-toggle="modal"> <a href="#AddFixedNet6" type="button" class="btn btn-success float-end" data-bs-toggle="modal">
<span class="fa fa-plus" aria-hidden="true"></span> <span aria-hidden="true">{% bs_icon 'plus' %} </span>
</a> </a>
<!-- Modal pool --> <!-- Modal pool -->

View file

@ -1,6 +1,7 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load i18n %} {% load i18n %}
{% load static %} {% load static %}
{% load bootstrap_icons %}
{% block title %}{% trans "Network" %} - {{ pool }}{% endblock %} {% block title %}{% trans "Network" %} - {{ pool }}{% endblock %}
@ -11,25 +12,25 @@
<div class="col-lg-12"> <div class="col-lg-12">
<ol class="breadcrumb shadow-sm"> <ol class="breadcrumb shadow-sm">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'overview' compute.id %}"><i class="fa fa-dashboard"></i> {% trans "Overview" %}</a> <a href="{% url 'overview' compute.id %}">{% bs_icon 'laptop' %} {% trans "Overview" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'instances' compute.id %}"><i class="fa fa-server"></i> {% trans "Instances" %}</a> <a href="{% url 'instances' compute.id %}">{% bs_icon 'server' %} {% trans "Instances" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'storages' compute.id %}"><i class="fa fa-hdd-o"></i> {% trans "Storages" %}</a> <a href="{% url 'storages' compute.id %}">{% bs_icon 'device-hdd' %} {% trans "Storages" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'networks' compute.id %}"><i class="fa fa-sitemap"></i> {% trans "Networks" %}</a> <a href="{% url 'networks' compute.id %}">{% bs_icon 'hdd-network' %} {% trans "Networks" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'interfaces' compute.id %}"><i class="fa fa-wifi"></i> {% trans "Interfaces" %}</a> <a href="{% url 'interfaces' compute.id %}">{% bs_icon 'wifi' %} {% trans "Interfaces" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'nwfilters' compute.id %}"><i class="fa fa-filter"></i> {% trans "NWFilters" %}</a> <a href="{% url 'nwfilters' compute.id %}">{% bs_icon 'filter' %} {% trans "NWFilters" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'virtsecrets' compute.id %}"><i class="fa fa-key"></i> {% trans "Secrets" %}</a> <a href="{% url 'virtsecrets' compute.id %}">{% bs_icon 'key' %} {% trans "Secrets" %}</a>
</li> </li>
</ol> </ol>
@ -68,7 +69,7 @@
<div class="d-grid col-lg-12"> <div class="d-grid col-lg-12">
<button class="btn btn-light" role="button" data-bs-toggle="collapse" data-bs-target="#collapseXML" aria-expanded="true" aria-controls="collapseXML"> <button class="btn btn-light" role="button" data-bs-toggle="collapse" data-bs-target="#collapseXML" aria-expanded="true" aria-controls="collapseXML">
<span class="fa fa-chevron-down"></span> <span>{% bs_icon 'chevron-down' %} </span>
{% trans 'XML' %} {% trans 'XML' %}
</button> </button>
<div class="collapse" id="collapseXML"> <div class="collapse" id="collapseXML">
@ -154,7 +155,7 @@
<div class="d-grid col-12"> <div class="d-grid col-12">
<button class="btn btn-light" role="button" data-bs-toggle="collapse" data-bs-target="#collapseipv4fix" aria-expanded="true" aria-controls="collapseXML"> <button class="btn btn-light" role="button" data-bs-toggle="collapse" data-bs-target="#collapseipv4fix" aria-expanded="true" aria-controls="collapseXML">
<span class="fa fa-chevron-down"></span> <span>{% bs_icon 'chevron-down' %} </span>
{% trans 'Show' %} {% trans 'Show' %}
</button> </button>
<div id="collapseipv4fix" class="collapse"> <div id="collapseipv4fix" class="collapse">
@ -187,12 +188,12 @@
<button type="submit" class="btn btn-sm btn-primary" <button type="submit" class="btn btn-sm btn-primary"
name="modify_fixed_address" name="modify_fixed_address"
title="{% trans "Edit entry" %}" onclick="return confirm('{% trans "Are you sure?" %}')"> title="{% trans "Edit entry" %}" onclick="return confirm('{% trans "Are you sure?" %}')">
<i class="fa fa-save"></i> {% bs_icon 'save' %}
</button> </button>
<button type="submit" class="btn btn-sm btn-danger" <button type="submit" class="btn btn-sm btn-danger"
name="delete_fixed_address" name="delete_fixed_address"
title="{% trans "Delete entry" %}" onclick="return confirm('{% trans "Are you sure?" %}')"> title="{% trans "Delete entry" %}" onclick="return confirm('{% trans "Are you sure?" %}')">
<i class="fa fa-trash"></i> {% bs_icon 'trash' %}
</button> </button>
</td> </td>
</form> </form>
@ -264,7 +265,7 @@
{% if ipv6_fixed_address %} {% if ipv6_fixed_address %}
<div class="d-grid col-12"> <div class="d-grid col-12">
<button class="btn btn-light" role="button" data-bs-toggle="collapse" data-bs-target="#collapseipv6fix" aria-expanded="true" aria-controls="collapseipv6fix"> <button class="btn btn-light" role="button" data-bs-toggle="collapse" data-bs-target="#collapseipv6fix" aria-expanded="true" aria-controls="collapseipv6fix">
<span class="fa fa-chevron-down"></span> <span>{% bs_icon 'chevron-down' %} </span>
{% trans 'Show' %} {% trans 'Show' %}
</button> </button>
<div id="collapseipv6fix" class="collapse"> <div id="collapseipv6fix" class="collapse">
@ -296,12 +297,12 @@
<button type="submit" class="btn btn-sm btn-primary" <button type="submit" class="btn btn-sm btn-primary"
name="modify_fixed_address" name="modify_fixed_address"
title="{% trans "Edit entry" %}" onclick="return confirm('{% trans "Are you sure?" %}')"> title="{% trans "Edit entry" %}" onclick="return confirm('{% trans "Are you sure?" %}')">
<span class="fa fa-save"></span> <span>{% bs_icon 'save' %} </span>
</button> </button>
<button type="submit" class="btn btn-sm btn-danger" <button type="submit" class="btn btn-sm btn-danger"
name="delete_fixed_address" name="delete_fixed_address"
title="{% trans "Delete entry" %}" onclick="return confirm('{% trans "Are you sure?" %}')"> title="{% trans "Delete entry" %}" onclick="return confirm('{% trans "Are you sure?" %}')">
<span class="fa fa-trash"></span> <span>{% bs_icon 'trash' %} </span>
</button> </button>
</td> </td>
</form> </form>
@ -351,12 +352,12 @@
<button type="submit" class="btn btn-sm btn-primary" <button type="submit" class="btn btn-sm btn-primary"
name="set_qos" data-bs-toggle="modal" name="set_qos" data-bs-toggle="modal"
title="{% trans "Edit QoS" %}" onclick="return confirm('{% trans "Are you sure?" %}')"> title="{% trans "Edit QoS" %}" onclick="return confirm('{% trans "Are you sure?" %}')">
<i class="fa fa-save"></i> {% bs_icon 'save' %}
</button> </button>
<button type="submit" class="btn btn-sm btn-danger" <button type="submit" class="btn btn-sm btn-danger"
name="unset_qos" name="unset_qos"
title="{% trans "Delete QoS" %}" onclick="return confirm('{% trans "Are you sure?" %}')"> title="{% trans "Delete QoS" %}" onclick="return confirm('{% trans "Are you sure?" %}')">
<i class="fa fa-trash"></i> {% bs_icon 'trash' %}
</button> </button>
</td> </td>
</tr> </tr>

View file

@ -1,5 +1,6 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load i18n %} {% load i18n %}
{% load bootstrap_icons %}
{% block title %}{% trans "Networks" %} - {{ compute.name }}{% endblock %} {% block title %}{% trans "Networks" %} - {{ compute.name }}{% endblock %}
@ -13,25 +14,25 @@
<nav aria-label="breadcrumb"> <nav aria-label="breadcrumb">
<ol class="breadcrumb shadow-sm"> <ol class="breadcrumb shadow-sm">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'overview' compute.id %}"><i class="fa fa-dashboard"></i> {% trans "Overview" %}</a> <a href="{% url 'overview' compute.id %}">{% bs_icon 'laptop' %} {% trans "Overview" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'instances' compute.id %}"><i class="fa fa-server"></i> {% trans "Instances" %}</a> <a href="{% url 'instances' compute.id %}">{% bs_icon 'server' %} {% trans "Instances" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'storages' compute.id %}"><i class="fa fa-hdd-o"></i> {% trans "Storages" %}</a> <a href="{% url 'storages' compute.id %}">{% bs_icon 'device-hdd' %} {% trans "Storages" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<span class="fw-bold"><i class="fa fa-sitemap"></i> {% trans "Networks" %}</span> <span class="fw-bold">{% bs_icon 'hdd-network' %} {% trans "Networks" %}</span>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'interfaces' compute.id %}"><i class="fa fa-wifi"></i> {% trans "Interfaces" %}</a> <a href="{% url 'interfaces' compute.id %}">{% bs_icon 'wifi' %} {% trans "Interfaces" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'nwfilters' compute.id %}"><i class="fa fa-filter"></i> {% trans "NWFilters" %}</a> <a href="{% url 'nwfilters' compute.id %}">{% bs_icon 'filter' %} {% trans "NWFilters" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'virtsecrets' compute.id %}"><i class="fa fa-key"></i> {% trans "Secrets" %}</a> <a href="{% url 'virtsecrets' compute.id %}">{% bs_icon 'key' %} {% trans "Secrets" %}</a>
</li> </li>
</ol> </ol>
</nav> </nav>
@ -42,7 +43,7 @@
{% if not networks %} {% if not networks %}
<div class="col-lg-12"> <div class="col-lg-12">
<div class="alert alert-warning shadow-sm"> <div class="alert alert-warning shadow-sm">
<i class="fa fa-exclamation-triangle"></i> <strong>{% trans "Warning" %} :</strong> {% trans "Hypervisor doesn't have any Network" %} {% bs_icon 'exclamation-triangle' %} <strong>{% trans "Warning" %} :</strong> {% trans "Hypervisor doesn't have any Network" %}
</div> </div>
</div> </div>
{% else %} {% else %}

View file

@ -1,7 +1,8 @@
{% load i18n %} {% load i18n %}
{% load bootstrap_icons %}
{% if request.user.is_superuser %} {% if request.user.is_superuser %}
<button class="btn btn-success float-end" type="button" data-bs-toggle="modal" data-bs-target="#AddNWFilterRule"> <button class="btn btn-success float-end" type="button" data-bs-toggle="modal" data-bs-target="#AddNWFilterRule">
<span class="fa fa-plus" aria-hidden="true"></span> <span aria-hidden="true">{% bs_icon 'plus' %} </span>
</button> </button>
<!-- Modal Secret --> <!-- Modal Secret -->

View file

@ -1,7 +1,8 @@
{% load i18n %} {% load i18n %}
{% load bootstrap_icons %}
{% if request.user.is_superuser %} {% if request.user.is_superuser %}
<button type="button" class="btn btn-success btn-header float-end" data-bs-toggle="modal" data-bs-target="#AddNWFilter"> <button type="button" class="btn btn-success btn-header float-end" data-bs-toggle="modal" data-bs-target="#AddNWFilter">
<span class="fa fa-plus" aria-hidden="true"></span> <span aria-hidden="true">{% bs_icon 'plus' %} </span>
</button> </button>
<!-- Modal Secret --> <!-- Modal Secret -->

View file

@ -1,6 +1,7 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load i18n %} {% load i18n %}
{% load static %} {% load static %}
{% load bootstrap_icons %}
{% block title %}{% trans "NWFilter" %}: {{ name }}{% endblock %} {% block title %}{% trans "NWFilter" %}: {{ name }}{% endblock %}
@ -11,25 +12,25 @@
<div class="col-lg-12"> <div class="col-lg-12">
<ol class="breadcrumb shadow-sm"> <ol class="breadcrumb shadow-sm">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'overview' compute.id %}"><i class="fa fa-dashboard"></i> {% trans "Overview" %}</a> <a href="{% url 'overview' compute.id %}">{% bs_icon 'laptop' %} {% trans "Overview" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'instances' compute.id %}"><i class="fa fa-server"></i> {% trans "Instances" %}</a> <a href="{% url 'instances' compute.id %}">{% bs_icon 'server' %} {% trans "Instances" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'storages' compute.id %}"><i class="fa fa-hdd-o"></i> {% trans "Storages" %}</a> <a href="{% url 'storages' compute.id %}">{% bs_icon 'device-hdd' %} {% trans "Storages" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'networks' compute.id %}"><i class="fa fa-sitemap"></i> {% trans "Networks" %}</a> <a href="{% url 'networks' compute.id %}">{% bs_icon 'hdd-network' %} {% trans "Networks" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'interfaces' compute.id %}"><i class="fa fa-wifi"></i> {% trans "Interfaces" %}</a> <a href="{% url 'interfaces' compute.id %}">{% bs_icon 'wifi' %} {% trans "Interfaces" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'nwfilters' compute.id %}"><i class="fa fa-filter"></i> {% trans "NWFilters" %}</a> <a href="{% url 'nwfilters' compute.id %}">{% bs_icon 'filter' %} {% trans "NWFilters" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'virtsecrets' compute.id %}"><i class="fa fa-key"></i> {% trans "Secrets" %}</a> <a href="{% url 'virtsecrets' compute.id %}">{% bs_icon 'key' %} {% trans "Secrets" %}</a>
</li> </li>
</ol> </ol>
</div> </div>
@ -45,7 +46,7 @@
<div class="row"> <div class="row">
<div class="d-grid col-lg-12"> <div class="d-grid col-lg-12">
<button class="btn btn-light mb-3" role="button" data-bs-toggle="collapse" data-bs-target="#collapseXML" aria-expanded="true" aria-controls="collapseXML"> <button class="btn btn-light mb-3" role="button" data-bs-toggle="collapse" data-bs-target="#collapseXML" aria-expanded="true" aria-controls="collapseXML">
<span class="fa fa-chevron-down"></span> <span>{% bs_icon 'chevron-down' %} </span>
{% trans 'XML' %} {% trans 'XML' %}
</button> </button>
<div class="collapse" id="collapseXML"> <div class="collapse" id="collapseXML">
@ -76,7 +77,7 @@
{% endfor %} {% endfor %}
</select> </select>
<button type="submit" class="btn btn-success float-end" name="add_nwfilter_ref"> <button type="submit" class="btn btn-success float-end" name="add_nwfilter_ref">
<span class="fa fa-plus" aria-hidden="true"></span> <span aria-hidden="true">{% bs_icon 'plus-circle-fill' %} </span>
</button> </button>
</div> </div>
</form> </form>
@ -101,7 +102,7 @@
<form action="" method="post" role="form" aria-label="Delete NWFilter form">{% csrf_token %} <form action="" method="post" role="form" aria-label="Delete NWFilter form">{% csrf_token %}
<input type="hidden" name="ref" value="{{ ref }}"> <input type="hidden" name="ref" value="{{ ref }}">
<button type="submit" class="btn btn-sm btn-danger" name="del_nwfilter_ref" title="{% trans "Delete" %}" onclick="return confirm('{% trans "Are you sure?" %}');"> <button type="submit" class="btn btn-sm btn-danger" name="del_nwfilter_ref" title="{% trans "Delete" %}" onclick="return confirm('{% trans "Are you sure?" %}');">
<i class="fa fa-trash"></i> {% bs_icon 'trash' %}
</button> </button>
</form> </form>
</td> </td>
@ -141,7 +142,7 @@
<input type="hidden" name="direction" value="{{ rule.direction }}"> <input type="hidden" name="direction" value="{{ rule.direction }}">
<input type="hidden" name="priority" value="{{ rule.priority }}"> <input type="hidden" name="priority" value="{{ rule.priority }}">
<button type="submit" class="btn btn-sm btn-danger" name="del_nwfilter_rule" title="{% trans 'Delete' %}" onclick="return confirm('{% trans "Are you sure?" %}');"> <button type="submit" class="btn btn-sm btn-danger" name="del_nwfilter_rule" title="{% trans 'Delete' %}" onclick="return confirm('{% trans "Are you sure?" %}');">
<i class="fa fa-trash"></i> {% bs_icon 'trash' %}
</button> </button>
</form> </form>
</td> </td>

View file

@ -1,6 +1,7 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load i18n %} {% load i18n %}
{% load static %} {% load static %}
{% load bootstrap_icons %}
{% block title %}{% trans "NWFilters" %} - {{ compute.name }}{% endblock %} {% block title %}{% trans "NWFilters" %} - {{ compute.name }}{% endblock %}
@ -17,25 +18,25 @@
<nav aria-label="breadcrumb"> <nav aria-label="breadcrumb">
<ol class="breadcrumb shadow-sm"> <ol class="breadcrumb shadow-sm">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'overview' compute.id %}"><i class="fa fa-dashboard"></i> {% trans "Overview" %}</a> <a href="{% url 'overview' compute.id %}">{% bs_icon 'laptop' %} {% trans "Overview" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'instances' compute.id %}"><i class="fa fa-server"></i> {% trans "Instances" %}</a> <a href="{% url 'instances' compute.id %}">{% bs_icon 'server' %} {% trans "Instances" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'storages' compute.id %}"><i class="fa fa-hdd-o"></i> {% trans "Storages" %}</a> <a href="{% url 'storages' compute.id %}">{% bs_icon 'device-hdd' %} {% trans "Storages" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'networks' compute.id %}"><i class="fa fa-sitemap"></i> {% trans "Networks" %}</a> <a href="{% url 'networks' compute.id %}">{% bs_icon 'hdd-network' %} {% trans "Networks" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'interfaces' compute.id %}"><i class="fa fa-wifi"></i> {% trans "Interfaces" %}</a> <a href="{% url 'interfaces' compute.id %}">{% bs_icon 'wifi' %} {% trans "Interfaces" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<span class="fw-bold"><i class="fa fa-filter"></i> {% trans "NWFilters" %}</span> <span class="fw-bold">{% bs_icon 'filter' %} {% trans "NWFilters" %}</span>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'virtsecrets' compute.id %}"><i class="fa fa-key"></i> {% trans "Secrets" %}</a> <a href="{% url 'virtsecrets' compute.id %}">{% bs_icon 'key' %} {% trans "Secrets" %}</a>
</li> </li>
</ol> </ol>
</nav> </nav>
@ -81,7 +82,7 @@
</div> <!-- /.modal-dialog --> </div> <!-- /.modal-dialog -->
</div> <!-- /.modal --> </div> <!-- /.modal -->
<button class="btn btn-sm btn-secondary" data-bs-toggle="modal" data-bs-target="#Show{{ forloop.counter }}" title="{% trans "Show" %}"> <button class="btn btn-sm btn-secondary" data-bs-toggle="modal" data-bs-target="#Show{{ forloop.counter }}" title="{% trans "Show" %}">
<i class="fa fa-eye"></i> {% bs_icon 'eye' %}
</button> </button>
</td> </td>
<td> <td>
@ -110,13 +111,13 @@
</div> <!-- /.modal-content --> </div> <!-- /.modal-content -->
</div> <!-- /.modal-dialog --> </div> <!-- /.modal-dialog -->
</div> <!-- /.modal --> </div> <!-- /.modal -->
<button class="btn btn-sm btn-secondary" data-bs-toggle="modal" data-bs-target="#Clone{{ forloop.counter }}" title="{% trans "Clone" %}"><i class="fa fa-files-o"></i></button> <button class="btn btn-sm btn-secondary" data-bs-toggle="modal" data-bs-target="#Clone{{ forloop.counter }}" title="{% trans "Clone" %}">{% bs_icon 'files' %} </button>
</td> </td>
<td> <td>
<form action="" method="post" role="form" aria-label="Delete NWFilter form">{% csrf_token %} <form action="" method="post" role="form" aria-label="Delete NWFilter form">{% csrf_token %}
<input type="hidden" name="nwfiltername" value="{{ nwfilter.name }}"> <input type="hidden" name="nwfiltername" value="{{ nwfilter.name }}">
<button type="submit" class="btn btn-sm btn-secondary" name="del_nwfilter" title="{% trans "Delete" %}" onclick="return confirm('{% trans "Are you sure?" %}')"> <button type="submit" class="btn btn-sm btn-secondary" name="del_nwfilter" title="{% trans "Delete" %}" onclick="return confirm('{% trans "Are you sure?" %}')">
<i class="fa fa-trash"></i> {% bs_icon 'trash' %}
</button> </button>
</form> </form>
</td> </td>
@ -129,7 +130,7 @@
<div class="row"> <div class="row">
<div class="col-lg-12"> <div class="col-lg-12">
<div class="alert alert-warning shadow-sm"> <div class="alert alert-warning shadow-sm">
<i class="fa fa-exclamation-triangle"></i> <strong>{% trans "Warning" %}:</strong> {% trans "Hypervisor doesn't have any NWFilters" %} {% bs_icon 'exclamation-triangle' %} <strong>{% trans "Warning" %}:</strong> {% trans "Hypervisor doesn't have any NWFilters" %}
</div> </div>
</div> </div>
</div> </div>

5
static/css/bootstrap-icons.min.css vendored Executable file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

BIN
static/fonts/bootstrap-icons.woff Executable file

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load diff

Before

Width:  |  Height:  |  Size: 434 KiB

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,8 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-arrow-down" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M8 1a.5.5 0 0 1 .5.5v11.793l3.146-3.147a.5.5 0 0 1 .708.708l-4 4a.5.5 0 0 1-.708 0l-4-4a.5.5 0 0 1 .708-.708L7.5 13.293V1.5A.5.5 0 0 1 8 1z"/>
</svg>

After

Width:  |  Height:  |  Size: 340 B

View file

@ -0,0 +1,8 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-arrow-left" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M15 8a.5.5 0 0 0-.5-.5H2.707l3.147-3.146a.5.5 0 1 0-.708-.708l-4 4a.5.5 0 0 0 0 .708l4 4a.5.5 0 0 0 .708-.708L2.707 8.5H14.5A.5.5 0 0 0 15 8z"/>
</svg>

After

Width:  |  Height:  |  Size: 342 B

View file

@ -0,0 +1,8 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-arrow-right" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M1 8a.5.5 0 0 1 .5-.5h11.793l-3.147-3.146a.5.5 0 0 1 .708-.708l4 4a.5.5 0 0 1 0 .708l-4 4a.5.5 0 0 1-.708-.708L13.293 8.5H1.5A.5.5 0 0 1 1 8z"/>
</svg>

After

Width:  |  Height:  |  Size: 343 B

View file

@ -0,0 +1,8 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-arrow-up" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M8 15a.5.5 0 0 0 .5-.5V2.707l3.146 3.147a.5.5 0 0 0 .708-.708l-4-4a.5.5 0 0 0-.708 0l-4 4a.5.5 0 1 0 .708.708L7.5 2.707V14.5a.5.5 0 0 0 .5.5z"/>
</svg>

After

Width:  |  Height:  |  Size: 340 B

View file

@ -0,0 +1,8 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="2em" height="2em" fill="currentColor" class="bi bi-arrows-angle-expand" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M5.828 10.172a.5.5 0 0 0-.707 0l-4.096 4.096V11.5a.5.5 0 0 0-1 0v3.975a.5.5 0 0 0 .5.5H4.5a.5.5 0 0 0 0-1H1.732l4.096-4.096a.5.5 0 0 0 0-.707zm4.344-4.344a.5.5 0 0 0 .707 0l4.096-4.096V4.5a.5.5 0 1 0 1 0V.525a.5.5 0 0 0-.5-.5H11.5a.5.5 0 0 0 0 1h2.768l-4.096 4.096a.5.5 0 0 0 0 .707z"/>
</svg>

After

Width:  |  Height:  |  Size: 495 B

View file

@ -0,0 +1,8 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="2em" height="2em" fill="currentColor" class="bi bi-bar-chart-line" viewBox="0 0 16 16">
<path d="M11 2a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v12h.5a.5.5 0 0 1 0 1H.5a.5.5 0 0 1 0-1H1v-3a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v3h1V7a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v7h1V2zm1 12h2V2h-2v12zm-3 0V7H7v7h2zm-5 0v-3H2v3h2z"/>
</svg>

After

Width:  |  Height:  |  Size: 384 B

View file

@ -0,0 +1,8 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" class="bi bi-broadcast" viewBox="0 0 16 16">
<path d="M3.05 3.05a7 7 0 0 0 0 9.9.5.5 0 0 1-.707.707 8 8 0 0 1 0-11.314.5.5 0 0 1 .707.707zm2.122 2.122a4 4 0 0 0 0 5.656.5.5 0 1 1-.708.708 5 5 0 0 1 0-7.072.5.5 0 0 1 .708.708zm5.656-.708a.5.5 0 0 1 .708 0 5 5 0 0 1 0 7.072.5.5 0 1 1-.708-.708 4 4 0 0 0 0-5.656.5.5 0 0 1 0-.708zm2.122-2.12a.5.5 0 0 1 .707 0 8 8 0 0 1 0 11.313.5.5 0 0 1-.707-.707 7 7 0 0 0 0-9.9.5.5 0 0 1 0-.707zM10 8a2 2 0 1 1-4 0 2 2 0 0 1 4 0z"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View file

@ -0,0 +1,11 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="2em" height="2em" fill="currentColor" class="bi bi-camera" viewBox="0 0 16 16">
<path d="M15 12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1h1.172a3 3 0 0 0 2.12-.879l.83-.828A1 1 0 0 1 6.827 3h2.344a1 1 0 0 1 .707.293l.828.828A3 3 0 0 0 12.828 5H14a1 1 0 0 1 1 1v6zM2 4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2h-1.172a2 2 0 0 1-1.414-.586l-.828-.828A2 2 0 0 0 9.172 2H6.828a2 2 0 0 0-1.414.586l-.828.828A2 2 0 0 1 3.172 4H2z"/>
<path d="M8 11a2.5 2.5 0 1 1 0-5 2.5 2.5 0 0 1 0 5zm0 1a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7zM3 6.5a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0z"/>
</svg>

After

Width:  |  Height:  |  Size: 677 B

View file

@ -0,0 +1,11 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-card-list" viewBox="0 0 16 16">
<path d="M14.5 3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-13a.5.5 0 0 1-.5-.5v-9a.5.5 0 0 1 .5-.5h13zm-13-1A1.5 1.5 0 0 0 0 3.5v9A1.5 1.5 0 0 0 1.5 14h13a1.5 1.5 0 0 0 1.5-1.5v-9A1.5 1.5 0 0 0 14.5 2h-13z"/>
<path d="M5 8a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7A.5.5 0 0 1 5 8zm0-2.5a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5zm0 5a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5zm-1-5a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0zM4 8a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0zm0 2.5a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0z"/>
</svg>

After

Width:  |  Height:  |  Size: 673 B

View file

@ -0,0 +1,8 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-caret-down" viewBox="0 0 16 16">
<path d="M3.204 5h9.592L8 10.481 3.204 5zm-.753.659 4.796 5.48a1 1 0 0 0 1.506 0l4.796-5.48c.566-.647.106-1.659-.753-1.659H3.204a1 1 0 0 0-.753 1.659z"/>
</svg>

After

Width:  |  Height:  |  Size: 322 B

View file

@ -0,0 +1,8 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-check-circle-fill" viewBox="0 0 16 16">
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zm-3.97-3.03a.75.75 0 0 0-1.08.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-.01-1.05z"/>
</svg>

After

Width:  |  Height:  |  Size: 371 B

View file

@ -0,0 +1,8 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-chevron-up" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M7.646 4.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1-.708.708L8 5.707l-5.646 5.647a.5.5 0 0 1-.708-.708l6-6z"/>
</svg>

After

Width:  |  Height:  |  Size: 302 B

View file

@ -0,0 +1,11 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-dash-circle" viewBox="0 0 16 16">
<path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z"/>
<path d="M4 8a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7A.5.5 0 0 1 4 8z"/>
</svg>

After

Width:  |  Height:  |  Size: 327 B

View file

@ -0,0 +1,14 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-device-hdd" viewBox="0 0 16 16">
<path d="M12 2.5a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0Zm0 11a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0Zm-7.5.5a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1ZM5 2.5a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0ZM8 8a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z"/>
<path d="M12 7a4 4 0 0 1-3.937 4c-.537.813-1.02 1.515-1.181 1.677a1.102 1.102 0 0 1-1.56-1.559c.1-.098.396-.314.795-.588A4 4 0 0 1 8 3a4 4 0 0 1 4 4Zm-1 0a3 3 0 1 0-3.891 2.865c.667-.44 1.396-.91 1.955-1.268.224-.144.483.115.34.34l-.62.96A3.001 3.001 0 0 0 11 7Z"/>
<path d="M2 2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V2Zm2-1a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1H4Z"/>
</svg>

After

Width:  |  Height:  |  Size: 794 B

View file

@ -0,0 +1,8 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-eject" viewBox="0 0 16 16">
<path d="M7.27 1.047a1 1 0 0 1 1.46 0l6.345 6.77c.6.638.146 1.683-.73 1.683H1.656C.78 9.5.326 8.455.926 7.816L7.27 1.047zM14.346 8.5 8 1.731 1.654 8.5h12.692zM.5 11.5a1 1 0 0 1 1-1h13a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1h-13a1 1 0 0 1-1-1v-1zm14 0h-13v1h13v-1z"/>
</svg>

After

Width:  |  Height:  |  Size: 420 B

View file

@ -0,0 +1,11 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-exclamation-triangle" viewBox="0 0 16 16">
<path d="M7.938 2.016A.13.13 0 0 1 8.002 2a.13.13 0 0 1 .063.016.146.146 0 0 1 .054.057l6.857 11.667c.036.06.035.124.002.183a.163.163 0 0 1-.054.06.116.116 0 0 1-.066.017H1.146a.115.115 0 0 1-.066-.017.163.163 0 0 1-.054-.06.176.176 0 0 1 .002-.183L7.884 2.073a.147.147 0 0 1 .054-.057zm1.044-.45a1.13 1.13 0 0 0-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767L8.982 1.566z"/>
<path d="M7.002 12a1 1 0 1 1 2 0 1 1 0 0 1-2 0zM7.1 5.995a.905.905 0 1 1 1.8 0l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 5.995z"/>
</svg>

After

Width:  |  Height:  |  Size: 719 B

View file

@ -0,0 +1,11 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-eye-fill" viewBox="0 0 16 16">
<path d="M10.5 8a2.5 2.5 0 1 1-5 0 2.5 2.5 0 0 1 5 0z"/>
<path d="M0 8s3-5.5 8-5.5S16 8 16 8s-3 5.5-8 5.5S0 8 0 8zm8 3.5a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7z"/>
</svg>

After

Width:  |  Height:  |  Size: 333 B

View file

@ -0,0 +1,11 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-eye" viewBox="0 0 16 16">
<path d="M16 8s-3-5.5-8-5.5S0 8 0 8s3 5.5 8 5.5S16 8 16 8zM1.173 8a13.133 13.133 0 0 1 1.66-2.043C4.12 4.668 5.88 3.5 8 3.5c2.12 0 3.879 1.168 5.168 2.457A13.133 13.133 0 0 1 14.828 8c-.058.087-.122.183-.195.288-.335.48-.83 1.12-1.465 1.755C11.879 11.332 10.119 12.5 8 12.5c-2.12 0-3.879-1.168-5.168-2.457A13.134 13.134 0 0 1 1.172 8z"/>
<path d="M8 5.5a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5zM4.5 8a3.5 3.5 0 1 1 7 0 3.5 3.5 0 0 1-7 0z"/>
</svg>

After

Width:  |  Height:  |  Size: 604 B

View file

@ -0,0 +1,8 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-files" viewBox="0 0 16 16">
<path d="M13 0H6a2 2 0 0 0-2 2 2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h7a2 2 0 0 0 2-2 2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zm0 13V4a2 2 0 0 0-2-2H5a1 1 0 0 1 1-1h7a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1zM3 4a1 1 0 0 1 1-1h7a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V4z"/>
</svg>

After

Width:  |  Height:  |  Size: 416 B

View file

@ -0,0 +1,8 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-filter" viewBox="0 0 16 16">
<path d="M6 10.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1-.5-.5zm-2-3a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5zm-2-3a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-11a.5.5 0 0 1-.5-.5z"/>
</svg>

After

Width:  |  Height:  |  Size: 361 B

View file

@ -0,0 +1,8 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="2em" height="2em" fill="currentColor" class="bi bi-gear-wide-connected" viewBox="0 0 16 16">
<path d="M7.068.727c.243-.97 1.62-.97 1.864 0l.071.286a.96.96 0 0 0 1.622.434l.205-.211c.695-.719 1.888-.03 1.613.931l-.08.284a.96.96 0 0 0 1.187 1.187l.283-.081c.96-.275 1.65.918.931 1.613l-.211.205a.96.96 0 0 0 .434 1.622l.286.071c.97.243.97 1.62 0 1.864l-.286.071a.96.96 0 0 0-.434 1.622l.211.205c.719.695.03 1.888-.931 1.613l-.284-.08a.96.96 0 0 0-1.187 1.187l.081.283c.275.96-.918 1.65-1.613.931l-.205-.211a.96.96 0 0 0-1.622.434l-.071.286c-.243.97-1.62.97-1.864 0l-.071-.286a.96.96 0 0 0-1.622-.434l-.205.211c-.695.719-1.888.03-1.613-.931l.08-.284a.96.96 0 0 0-1.186-1.187l-.284.081c-.96.275-1.65-.918-.931-1.613l.211-.205a.96.96 0 0 0-.434-1.622l-.286-.071c-.97-.243-.97-1.62 0-1.864l.286-.071a.96.96 0 0 0 .434-1.622l-.211-.205c-.719-.695-.03-1.888.931-1.613l.284.08a.96.96 0 0 0 1.187-1.186l-.081-.284c-.275-.96.918-1.65 1.613-.931l.205.211a.96.96 0 0 0 1.622-.434l.071-.286zM12.973 8.5H8.25l-2.834 3.779A4.998 4.998 0 0 0 12.973 8.5zm0-1a4.998 4.998 0 0 0-7.557-3.779l2.834 3.78h4.723zM5.048 3.967c-.03.021-.058.043-.087.065l.087-.065zm-.431.355A4.984 4.984 0 0 0 3.002 8c0 1.455.622 2.765 1.615 3.678L7.375 8 4.617 4.322zm.344 7.646.087.065-.087-.065z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -0,0 +1,8 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-gear-wide-connected" viewBox="0 0 16 16">
<path d="M7.068.727c.243-.97 1.62-.97 1.864 0l.071.286a.96.96 0 0 0 1.622.434l.205-.211c.695-.719 1.888-.03 1.613.931l-.08.284a.96.96 0 0 0 1.187 1.187l.283-.081c.96-.275 1.65.918.931 1.613l-.211.205a.96.96 0 0 0 .434 1.622l.286.071c.97.243.97 1.62 0 1.864l-.286.071a.96.96 0 0 0-.434 1.622l.211.205c.719.695.03 1.888-.931 1.613l-.284-.08a.96.96 0 0 0-1.187 1.187l.081.283c.275.96-.918 1.65-1.613.931l-.205-.211a.96.96 0 0 0-1.622.434l-.071.286c-.243.97-1.62.97-1.864 0l-.071-.286a.96.96 0 0 0-1.622-.434l-.205.211c-.695.719-1.888.03-1.613-.931l.08-.284a.96.96 0 0 0-1.186-1.187l-.284.081c-.96.275-1.65-.918-.931-1.613l.211-.205a.96.96 0 0 0-.434-1.622l-.286-.071c-.97-.243-.97-1.62 0-1.864l.286-.071a.96.96 0 0 0 .434-1.622l-.211-.205c-.719-.695-.03-1.888.931-1.613l.284.08a.96.96 0 0 0 1.187-1.186l-.081-.284c-.275-.96.918-1.65 1.613-.931l.205.211a.96.96 0 0 0 1.622-.434l.071-.286zM12.973 8.5H8.25l-2.834 3.779A4.998 4.998 0 0 0 12.973 8.5zm0-1a4.998 4.998 0 0 0-7.557-3.779l2.834 3.78h4.723zM5.048 3.967c-.03.021-.058.043-.087.065l.087-.065zm-.431.355A4.984 4.984 0 0 0 3.002 8c0 1.455.622 2.765 1.615 3.678L7.375 8 4.617 4.322zm.344 7.646.087.065-.087-.065z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -0,0 +1,11 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-hdd-network" viewBox="0 0 16 16">
<path d="M4.5 5a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1zM3 4.5a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0z"/>
<path d="M0 4a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v1a2 2 0 0 1-2 2H8.5v3a1.5 1.5 0 0 1 1.5 1.5h5.5a.5.5 0 0 1 0 1H10A1.5 1.5 0 0 1 8.5 14h-1A1.5 1.5 0 0 1 6 12.5H.5a.5.5 0 0 1 0-1H6A1.5 1.5 0 0 1 7.5 10V7H2a2 2 0 0 1-2-2V4zm1 0v1a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1zm6 7.5v1a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5z"/>
</svg>

After

Width:  |  Height:  |  Size: 636 B

View file

@ -0,0 +1,11 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-info-circle" viewBox="0 0 16 16">
<path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z"/>
<path d="m8.93 6.588-2.29.287-.082.38.45.083c.294.07.352.176.288.469l-.738 3.468c-.194.897.105 1.319.808 1.319.545 0 1.178-.252 1.465-.598l.088-.416c-.2.176-.492.246-.686.246-.275 0-.375-.193-.304-.533L8.93 6.588zM9 4.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0z"/>
</svg>

After

Width:  |  Height:  |  Size: 509 B

View file

@ -0,0 +1,8 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-info" viewBox="0 0 16 16">
<path d="m8.93 6.588-2.29.287-.082.38.45.083c.294.07.352.176.288.469l-.738 3.468c-.194.897.105 1.319.808 1.319.545 0 1.178-.252 1.465-.598l.088-.416c-.2.176-.492.246-.686.246-.275 0-.375-.193-.304-.533L8.93 6.588zM9 4.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0z"/>
</svg>

After

Width:  |  Height:  |  Size: 414 B

View file

@ -0,0 +1,11 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-key" viewBox="0 0 16 16">
<path d="M0 8a4 4 0 0 1 7.465-2H14a.5.5 0 0 1 .354.146l1.5 1.5a.5.5 0 0 1 0 .708l-1.5 1.5a.5.5 0 0 1-.708 0L13 9.207l-.646.647a.5.5 0 0 1-.708 0L11 9.207l-.646.647a.5.5 0 0 1-.708 0L9 9.207l-.646.647A.5.5 0 0 1 8 10h-.535A4 4 0 0 1 0 8zm4-3a3 3 0 1 0 2.712 4.285A.5.5 0 0 1 7.163 9h.63l.853-.854a.5.5 0 0 1 .708 0l.646.647.646-.647a.5.5 0 0 1 .708 0l.646.647.646-.647a.5.5 0 0 1 .708 0l.646.647.793-.793-1-1h-6.63a.5.5 0 0 1-.451-.285A3 3 0 0 0 4 5z"/>
<path d="M4 8a1 1 0 1 1-2 0 1 1 0 0 1 2 0z"/>
</svg>

After

Width:  |  Height:  |  Size: 666 B

View file

@ -0,0 +1,8 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-laptop" viewBox="0 0 16 16">
<path d="M13.5 3a.5.5 0 0 1 .5.5V11H2V3.5a.5.5 0 0 1 .5-.5h11zm-11-1A1.5 1.5 0 0 0 1 3.5V12h14V3.5A1.5 1.5 0 0 0 13.5 2h-11zM0 12.5h16a1.5 1.5 0 0 1-1.5 1.5h-13A1.5 1.5 0 0 1 0 12.5z"/>
</svg>

After

Width:  |  Height:  |  Size: 350 B

View file

@ -0,0 +1,8 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="2em" height="2em" fill="currentColor" class="bi bi-lock" viewBox="0 0 16 16">
<path d="M8 1a2 2 0 0 1 2 2v4H6V3a2 2 0 0 1 2-2zm3 6V3a3 3 0 0 0-6 0v4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2zM5 8h6a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V9a1 1 0 0 1 1-1z"/>
</svg>

After

Width:  |  Height:  |  Size: 370 B

View file

@ -0,0 +1,8 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-pause-fill" viewBox="0 0 16 16">
<path d="M5.5 3.5A1.5 1.5 0 0 1 7 5v6a1.5 1.5 0 0 1-3 0V5a1.5 1.5 0 0 1 1.5-1.5zm5 0A1.5 1.5 0 0 1 12 5v6a1.5 1.5 0 0 1-3 0V5a1.5 1.5 0 0 1 1.5-1.5z"/>
</svg>

After

Width:  |  Height:  |  Size: 320 B

Some files were not shown because too many files have changed in this diff Show more