Merge branch 'aa-services-fixes' into 'v4.x'

Template Updates (I hope I got them all)

See merge request allianceauth/allianceauth!1566
This commit is contained in:
Ariel Rin 2023-12-11 12:18:51 +00:00
commit 04cdd4c64f
99 changed files with 3107 additions and 2648 deletions

View File

@ -1,5 +1,5 @@
{% load i18n %} {% load i18n %}
<div class="col-12 col-xl-8 align-self-stretch p-2 ps-0"> <div class="col-12 col-xl-8 align-self-stretch p-2 ps-0 pe-0 ps-xl-0 pe-xl-2">
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">

View File

@ -1,11 +1,11 @@
{% load i18n %} {% load i18n %}
<div class="col-12 col-xl-4 align-self-stretch py-2 ps-2"> <div class="col-12 col-xl-4 align-self-stretch py-2 ps-xl-2">
<div class="card h-100"> <div class="card h-100">
<div class="card-body"> <div class="card-body">
<h4 class="card-title text-center">{% translate "Membership" %}</h4> <h4 class="card-title text-center">{% translate "Membership" %}</h4>
<div class="card-body"> <div class="card-body">
<div style="height: 300px; overflow-y:auto;"> <div style="height: 300px; overflow-y:auto;">
<h6 class="text-center">{% translate "State:" %} {{ request.user.profile.state }}</h6> <h5 class="text-center">{% translate "State:" %} {{ request.user.profile.state }}</h5>
<table class="table"> <table class="table">
{% for group in groups %} {% for group in groups %}
<tr> <tr>

View File

@ -1,65 +1,85 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "Dashboard" %}{% endblock page_title %} {% block page_title %}
{% translate "Token Management" %}
{% endblock page_title %}
{% block header_nav_brand %}
{% translate "Token Management" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<h1 class="page-header text-center">{% translate "Token Management" %}</h1>
<div> <div>
<table class="table table-aa" id="table_tokens" style="width: 100%;"> <p class="mb-3">
{% translate "This page is a best attempt, but backups or database logs can still contain your tokens. Always revoke tokens on https://community.eveonline.com/support/third-party-applications/ where possible."|urlize %}
</p>
<table class="table" id="table_tokens" style="width: 100%;">
<thead> <thead>
<tr> <tr>
<th>{% translate "Scopes" %}</th> <th>{% translate "Scopes" %}</th>
<th class="text-end">{% translate "Actions" %}</th> <th class="text-end">{% translate "Actions" %}</th>
<th>{% translate "Character" %}</th> <th>{% translate "Character" %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for t in tokens %} {% for t in tokens %}
<tr> <tr>
<td style="white-space:initial;">{% for s in t.scopes.all %}<span class="badge bg-secondary">{{ s.name }}</span>{% endfor %}</td> <td style="white-space:initial;">
<td nowrap class="text-end"> {% for s in t.scopes.all %}
<a href="{% url 'authentication:token_delete' t.id %}" class="btn btn-danger"><i class="fas fa-trash"></i></a> <span class="badge bg-secondary">{{ s.name }}</span>
<a href="{% url 'authentication:token_refresh' t.id %}" class="btn btn-success"><i class="fas fa-sync-alt"></i></a> {% endfor %}
</td> </td>
<td nowrap class="text-end">
<a href="{% url 'authentication:token_delete' t.id %}" class="btn btn-danger"><i class="fa-solid fa-trash-can"></i></a>
<a href="{% url 'authentication:token_refresh' t.id %}" class="btn btn-success"><i class="fa-solid fa-rotate"></i></a>
</td>
<td>{{ t.character_name }}</td> <td>{{ t.character_name }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
{% translate "This page is a best attempt, but backups or database logs can still contain your tokens. Always revoke tokens on https://community.eveonline.com/support/third-party-applications/ where possible."|urlize %}
</div> </div>
{% endblock content %} {% endblock content %}
{% block extra_javascript %} {% block extra_javascript %}
{% include "bundles/datatables-js-bs5.html" %} {% include "bundles/datatables-js-bs5.html" %}
{% endblock extra_javascript %}
{% block extra_css %} <script>
{% include "bundles/datatables-css-bs5.html" %} $(document).ready(() => {
{% endblock extra_css %}
{% block extra_script %}
$(document).ready(function(){
let grp = 2; let grp = 2;
var table = $('#table_tokens').DataTable({
"columnDefs": [{ orderable: false, targets: [0,1] },{ "visible": false, "targets": grp }], const table = $('#table_tokens').DataTable({
"order": [[grp, 'asc']], 'columnDefs': [{orderable: false, targets: [0, 1]}, {
"drawCallback": function (settings) { 'visible': false,
'targets': grp
}],
'order': [[grp, 'asc']],
'drawCallback': function (settings) {
var api = this.api(); var api = this.api();
var rows = api.rows({page: 'current'}).nodes(); var rows = api.rows({page: 'current'}).nodes();
var last = null; var last = null;
api.column(grp, {page: 'current'}) api.column(grp, {page: 'current'})
.data() .data()
.each(function (group, i) { .each((group, i) => {
if (last !== group) { if (last !== group) {
$(rows).eq(i).before('<tr class="info"><td colspan="3">' + group + '</td></tr>'); $(rows).eq(i).before(`<tr class="h5 table-primary"><td colspan="3">${group}</td></tr>`);
last = group; last = group;
} }
}); });
}, },
"stateSave": true, 'stateSave': true
}); });
}); });
{% endblock extra_script %} </script>
{% endblock extra_javascript %}
{% block extra_css %}
{% include "bundles/datatables-css-bs5.html" %}
{% endblock extra_css %}

View File

@ -7,7 +7,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content=""> <meta name="description" content="">
<meta name="author" content=""> <meta name="author" content="">
<!-- TODO Bundle all the site specific stuff up into its own template for easy overide --> <!-- TODO Bundle all the site specific stuff up into its own template for easy override -->
<meta property="og:title" content="{{ SITE_NAME }}"> <meta property="og:title" content="{{ SITE_NAME }}">
<meta property="og:image" content="{{ SITE_URL }}{% static 'allianceauth/icons/apple-touch-icon.png' %}"> <meta property="og:image" content="{{ SITE_URL }}{% static 'allianceauth/icons/apple-touch-icon.png' %}">
<meta property="og:description" content="Alliance Auth - An auth system for EVE Online to help in-game organizations manage online service access."> <meta property="og:description" content="Alliance Auth - An auth system for EVE Online to help in-game organizations manage online service access.">
@ -16,8 +16,9 @@
<title>{% block title %}{% block page_title %}{% endblock page_title %} - {{ SITE_NAME }}{% endblock title %}</title> <title>{% block title %}{% block page_title %}{% endblock page_title %} - {{ SITE_NAME }}{% endblock title %}</title>
{% include 'bundles/bootstrap-css.html' %} {% include 'bundles/bootstrap-css-bs5.html' %}
{% include 'bundles/fontawesome.html' %} {% include 'bundles/fontawesome.html' %}
{% block extra_include %} {% block extra_include %}
{% endblock %} {% endblock %}
@ -30,25 +31,23 @@
background-size: cover; background-size: cover;
} }
.panel-transparent { .card-login {
background: rgba(48 48 48 / 0.7); background: rgba(48 48 48 / 0.7);
color: #ffffff; color: rgb(255 255 255);
padding-bottom: 21px; padding-bottom: 21px;
} }
.panel-body {
}
#lang-select { #lang-select {
width: 40%; width: 40%;
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
} }
{% block extra_style %} {% block extra_style %}
{% endblock %} {% endblock %}
</style> </style>
</head> </head>
<body> <body>
<div class="container" style="margin-top:150px;"> <div class="container" style="margin-top:150px;">
{% block content %} {% block content %}

View File

@ -1,9 +1,12 @@
{% load i18n %} {% load i18n %}
<div class="dropdown"> <div class="dropdown">
<form action="{% url 'set_language' %}" method="post"> <form action="{% url 'set_language' %}" method="post">
{% csrf_token %} {% csrf_token %}
<select onchange="this.form.submit()" class="form-control" id="lang-select" name="language"> <select onchange="this.form.submit()" class="form-control" id="lang-select" name="language">
{% get_language_info_list for LANGUAGES as languages %} {% get_language_info_list for LANGUAGES as languages %}
{% for language in languages %} {% for language in languages %}
<option lang="{{ language.code }}" value="{{ language.code }}"{% if language.code == LANGUAGE_CODE %} selected="selected"{% endif %}> <option lang="{{ language.code }}" value="{{ language.code }}"{% if language.code == LANGUAGE_CODE %} selected="selected"{% endif %}>
{{ language.name_local|capfirst }} ({{ language.code }}) {{ language.name_local|capfirst }} ({{ language.code }})

View File

@ -3,16 +3,17 @@
{% load i18n %} {% load i18n %}
{% block content %} {% block content %}
<div class="col-md-4 col-md-offset-4"> <div class="row justify-content-center">
<div class="col-md-4">
{% if messages %} {% if messages %}
{% for message in messages %} {% for message in messages %}
<div class="alert alert-{{ message.level_tag}}">{{ message }}</div> <div class="alert alert-{{ message.level_tag}}">{{ message }}</div>
{% endfor %} {% endfor %}
{% endif %} {% endif %}
<div class="panel panel-default panel-transparent"> <div class="card card-login border-secondary p-3">
<div class="panel-body"> <div class="card-body">
<div class="col-md-12"> <div class="text-center">
{% block middle_box_content %} {% block middle_box_content %}
{% endblock %} {% endblock %}
</div> </div>
@ -20,22 +21,23 @@
{% include 'public/lang_select.html' %} {% include 'public/lang_select.html' %}
<p class="text-center" style="margin-top: 2rem;"> <p class="text-center mt-3">
{% translate "For information on SSO, ESI and security read the CCP Dev Blog" %}<br> {% translate "For information on SSO, ESI and security read the CCP Dev Blog" %}<br>
<a href="https://www.eveonline.com/news/view/introducing-esi" target="_blank" rel="noopener noreferrer"> <a class="text-reset" href="https://www.eveonline.com/news/view/introducing-esi" target="_blank" rel="noopener noreferrer">
{% translate "Introducing ESI - A New API For EVE Online" %} {% translate "Introducing ESI - A New API For EVE Online" %}
</a> </a>
</p> </p>
<p class="text-center"> <p class="text-center">
<a href="https://community.eveonline.com/support/third-party-applications/" target="_blank" rel="noopener noreferrer"> <a class="text-reset" href="https://community.eveonline.com/support/third-party-applications/" target="_blank" rel="noopener noreferrer">
{% translate "Manage ESI Applications" %} {% translate "Manage ESI Applications" %}
</a> </a>
</p> </p>
</div> </div>
</div> </div>
</div>
{% endblock %} {% endblock %}
{% block extra_include %} {% block extra_include %}
{% include 'bundles/bootstrap-js.html' %} {% include 'bundles/bootstrap-js-bs5.html' %}
{% endblock %} {% endblock %}

View File

@ -6,9 +6,9 @@
{% block page_title %}{% translate "Registration" %}{% endblock %} {% block page_title %}{% translate "Registration" %}{% endblock %}
{% block extra_include %} {% block extra_include %}
{% include 'bundles/bootstrap-css.html' %} {% include 'bundles/bootstrap-css-bs5.html' %}
{% include 'bundles/fontawesome.html' %} {% include 'bundles/fontawesome.html' %}
{% include 'bundles/bootstrap-js.html' %} {% include 'bundles/bootstrap-js-bs5.html' %}
{% endblock %} {% endblock %}
{% block content %} {% block content %}

View File

@ -1,5 +1,7 @@
{% extends 'public/middle_box.html' %} {% extends 'public/middle_box.html' %}
{% load i18n %} {% load i18n %}
{% block middle_box_content %} {% block middle_box_content %}
<div class="alert alert-danger">{% translate 'Invalid or expired activation link.' %}</div> <div class="alert alert-danger">{% translate 'Invalid or expired activation link.' %}</div>
{% endblock %} {% endblock %}

View File

@ -1,34 +1,69 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load i18n %} {% load i18n %}
{% block page_title %} {% block page_title %}
{% translate "Corporation Member Data" %} {% translate "Corporation Member Data" %}
{% endblock page_title %} {% endblock page_title %}
{% block header_nav_brand %}
{% translate "Corporation Member Data" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div> <div>
<h1 class="page-header text-center">{% translate "Corporation Member Data" %}</h1> <nav class="navbar navbar-default navbar-expand-lg mb-4">
<nav class="navbar navbar-default">
<div class="container-fluid"> <div class="container-fluid">
<ul class="nav navbar-nav"> <button
<li class="dropdown"> class="navbar-toggler collapsed"
<a href="#" id="dLabel" class="dropdown-toggle" role="button" data-toggle="dropdown" aria-haspopup="false" aria-expanded="false">{% translate "Corporations" %}<span class="caret"></span></a> type="button"
<ul class="dropdown-menu" role="menu" aria-labelledby="dLabel"> data-bs-toggle="collapse"
data-bs-target="#fleetfinder-header-navbar"
aria-controls="fleetfinder-header-navbar"
aria-expanded="false"
aria-label="{% translate 'Toggle navigation' %}"
>
<span class="navbar-toggler-icon"></span>
</button>
<ul class="navbar-nav">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#" role="button" aria-expanded="false">
{% translate "Corporations" %}
</a>
<ul class="dropdown-menu">
{% for corpstat in available %} {% for corpstat in available %}
<li> <li>
<a href="{% url 'corputils:view_corp' corpstat.corp.corporation_id %}">{{ corpstat.corp.corporation_name }}</a> <a class="dropdown-item" href="{% url 'corputils:view_corp' corpstat.corp.corporation_id %}">
{{ corpstat.corp.corporation_name }}
</a>
</li> </li>
{% endfor %} {% endfor %}
</ul>
</li>
{% if perms.corputils.add_corpstats %} {% if perms.corputils.add_corpstats %}
{% if available.count >= 1 %}
<li>&nbsp;</li>
{% endif %}
<li> <li>
<a href="{% url 'corputils:add' %}">{% translate "Add" %}</a> <a class="dropdown-item" href="{% url 'corputils:add' %}">
{% translate "Add corporation" %}
</a>
</li> </li>
{% endif %} {% endif %}
</ul> </ul>
</li>
</ul>
<form class="navbar-form navbar-right" role="search" action="{% url 'corputils:search' %}" method="GET"> <form class="navbar-form navbar-right" role="search" action="{% url 'corputils:search' %}" method="GET">
<div class="form-group"> <div class="form-group">
<input type="text" class="form-control" name="search_string" placeholder="{% if search_string %}{{ search_string }}{% else %}{% translate 'Search all corporations...' %}{% endif %}"> <input
type="text"
class="form-control"
name="search_string"
placeholder="{% if search_string %}{{ search_string }}{% else %}{% translate 'Search all corporations...' %}{% endif %}"
>
</div> </div>
</form> </form>
</div> </div>

View File

@ -1,65 +1,114 @@
{% extends 'corputils/base.html' %} {% extends 'corputils/base.html' %}
{% load i18n %} {% load i18n %}
{% load humanize %} {% load humanize %}
{% block member_data %} {% block member_data %}
{% if corpstats %} {% if corpstats %}
<div> <div>
<table class="table"> <table class="table text-center">
<tr> <tr>
<td class="text-center col-lg-6{% if corpstats.corp.alliance %}{% else %}col-lg-offset-3{% endif %}"> <td>
<img class="ra-avatar" src="{{ corpstats.corp.logo_url_64 }}" alt="{{ corpstats.corp.corporation_name }}"> <img class="ra-avatar" src="{{ corpstats.corp.logo_url_64 }}" alt="{{ corpstats.corp.corporation_name }}">
</td> </td>
{% if corpstats.corp.alliance %} {% if corpstats.corp.alliance %}
<td class="text-center col-lg-6"> <td>
<img class="ra-avatar" src="{{ corpstats.corp.alliance.logo_url_64 }}" alt="{{ corpstats.corp.alliance.alliance_name }}"> <img class="ra-avatar" src="{{ corpstats.corp.alliance.logo_url_64 }}" alt="{{ corpstats.corp.alliance.alliance_name }}">
</td> </td>
{% endif %} {% endif %}
</tr> </tr>
<tr> <tr>
<td class="text-center"><h4>{{ corpstats.corp.corporation_name }}</h4></td> <td><p class="h4">{{ corpstats.corp.corporation_name }}</p></td>
{% if corpstats.corp.alliance %} {% if corpstats.corp.alliance %}
<td class="text-center"><h4>{{ corpstats.corp.alliance.alliance_name }}</h4></td> <td><p class="h4">{{ corpstats.corp.alliance.alliance_name }}</p></td>
{% endif %} {% endif %}
</tr> </tr>
</table> </table>
</div> </div>
<div> <div class="card card-default mt-4">
<div class="panel panel-default"> <div class="card-header clearfix" role="tablist">
<div class="panel-heading"> <ul class="nav nav-pills text-right float-start">
<ul class="nav nav-pills pull-left"> <li class="nav-item" role="presentation">
<li class="active"><a href="#mains" data-toggle="pill">{% translate 'Mains' %} ({{ total_mains }})</a></li> <a
<li><a href="#members" data-toggle="pill">{% translate 'Members' %} ({{ corpstats.member_count }})</a></li> class="nav-link active"
<li><a href="#unregistered" data-toggle="pill">{% translate 'Unregistered' %} ({{ unregistered.count }})</a></li> id="mains"
data-bs-toggle="tab"
href="#tab-mains"
role="tab"
aria-controls="tab-mains"
aria-selected="true"
>
{% translate 'Mains' %} ({{ total_mains }})
</a>
</li>
<li class="nav-item" role="presentation">
<a
class="nav-link"
id="members"
data-bs-toggle="tab"
href="#tab-members"
role="tab"
aria-controls="tab-members"
aria-selected="false"
>
{% translate 'Members' %} ({{ corpstats.member_count }})
</a>
</li>
<li class="nav-item">
<a
class="nav-link"
id="unregistered"
data-bs-toggle="tab"
href="#tab-unregistered"
role="tab"
aria-controls="tab-unregistered"
aria-selected="false"
>
{% translate 'Unregistered' %} ({{ unregistered.count }})
</a>
</li>
</ul> </ul>
<div class="pull-right hidden-xs">
{% translate "Last update:" %} {{ corpstats.last_update|naturaltime }}&nbsp; <div class="float-end d-none d-sm-block">
<a class="btn btn-success" type="button" href="{% url 'corputils:update' corpstats.corp.corporation_id %}" title="Update Now"> {% translate "Last update:" %} {{ corpstats.last_update|naturaltime }}
<span class="glyphicon glyphicon-refresh"></span>
<a
class="btn btn-success btn-sm ms-2"
type="button"
href="{% url 'corputils:update' corpstats.corp.corporation_id %}"
title="{% translate 'Update Now' %}"
>
<i class="fa-solid fa-rotate"></i>
</a> </a>
</div> </div>
<div class="clearfix"></div>
</div> </div>
<div class="panel-body"> <div class="card-body">
<div class="tab-content"> <div class="tab-content">
<div class="tab-pane fade in active" id="mains"> <div class="tab-pane fade show active" id="tab-mains" role="tabpanel" aria-labelledby="tab-mains">
{% if mains %} {% if mains %}
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-hover" id="table-mains"> <table class="table table-hover" id="table-mains">
<thead> <thead>
<tr> <tr>
<th style="height:1em;"><!-- Must have text or height to prevent clipping --></th> <th style="min-height: 1rem;"><!-- Must have a text or height to prevent clipping --></th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for id, main in mains.items %} {% for id, main in mains.items %}
<tr> <tr>
<td class="text-center" style="vertical-align:middle"> <td class="text-center" style="vertical-align: middle;">
<div class="thumbnail" style="border: 0 none; box-shadow: none; background: transparent;"> <div class="thumbnail" style="border: 0 none; box-shadow: none; background: transparent;">
<img src="{{ main.main.portrait_url_64 }}" class="img-circle" alt="{{ main.main }}"> <img src="{{ main.main.portrait_url_64 }}" class="img-circle" alt="{{ main.main }}">
<div class="caption text-center"> <div class="caption">
{{ main.main }} {{ main.main }}
</div> </div>
</div> </div>
@ -70,22 +119,22 @@
{% if forloop.first %} {% if forloop.first %}
<tr> <tr>
<th></th> <th></th>
<th class="text-center">{% translate "Character" %}</th> <th>{% translate "Character" %}</th>
<th class="text-center">{% translate "Corporation" %}</th> <th>{% translate "Corporation" %}</th>
<th class="text-center">{% translate "Alliance" %}</th> <th>{% translate "Alliance" %}</th>
<th class="text-center"></th> <th></th>
</tr> </tr>
{% endif %} {% endif %}
<tr> <tr>
<td class="text-center" style="width:5%"> <td style="width: 5%;">
<div class="thumbnail" style="border: 0 none; box-shadow: none; background: transparent;"> <div class="thumbnail" style="border: 0 none; box-shadow: none; background: transparent;">
<img src="{{ alt.portrait_url_32 }}" class="img-circle" alt="{{ alt.character_name }}"> <img src="{{ alt.portrait_url_32 }}" class="img-circle" alt="{{ alt.character_name }}">
</div> </div>
</td> </td>
<td class="text-center" style="width:30%">{{ alt.character_name }}</td> <td style="width: 30%;">{{ alt.character_name }}</td>
<td class="text-center" style="width:30%">{{ alt.corporation_name }}</td> <td style="width: 30%;">{{ alt.corporation_name }}</td>
<td class="text-center" style="width:30%">{{ alt.alliance_name }}</td> <td style="width: 30%;">{{ alt.alliance_name }}</td>
<td class="text-center" style="width:5%"> <td style="width: 5%;">
<a href="https://zkillboard.com/character/{{ alt.character_id }}/" class="badge bg-danger" target="_blank"> <a href="https://zkillboard.com/character/{{ alt.character_id }}/" class="badge bg-danger" target="_blank">
{% translate "Killboard" %} {% translate "Killboard" %}
</a> </a>
@ -101,43 +150,45 @@
</div> </div>
{% endif %} {% endif %}
</div> </div>
<div class="tab-pane fade" id="members">
<div class="tab-pane fade" id="tab-members" role="tabpanel" aria-labelledby="tab-members">
{% if members %} {% if members %}
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-hover" id="table-members"> <table class="table table-hover" id="table-members">
<thead> <thead>
<tr> <tr>
<th></th> <th></th>
<th class="text-center">{% translate "Character" %}</th> <th>{% translate "Character" %}</th>
<th class="text-center"></th> <th></th>
<th class="text-center">{% translate "Main Character" %}</th> <th>{% translate "Main Character" %}</th>
<th class="text-center">{% translate "Main Corporation" %}</th> <th>{% translate "Main Corporation" %}</th>
<th class="text-center">{% translate "Main Alliance" %}</th> <th>{% translate "Main Alliance" %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for member in members %} {% for member in members %}
<tr> <tr>
<td><img src="{{ member.portrait_url }}" class="img-circle" alt="{{ member }}"></td> <td><img src="{{ member.portrait_url }}" class="img-circle" alt="{{ member }}"></td>
<td class="text-center">{{ member }}</td> <td>{{ member }}</td>
<td class="text-center"> <td>
<a href="https://zkillboard.com/character/{{ member.character_id }}/" class="badge bg-danger" target="_blank">{% translate "Killboard" %}</a> <a href="https://zkillboard.com/character/{{ member.character_id }}/" class="badge bg-danger" target="_blank">{% translate "Killboard" %}</a>
</td> </td>
<td class="text-center">{{ member.character_ownership.user.profile.main_character.character_name }}</td> <td>{{ member.character_ownership.user.profile.main_character.character_name }}</td>
<td class="text-center">{{ member.character_ownership.user.profile.main_character.corporation_name }}</td> <td>{{ member.character_ownership.user.profile.main_character.corporation_name }}</td>
<td class="text-center">{{ member.character_ownership.user.profile.main_character.alliance_name }}</td> <td>{{ member.character_ownership.user.profile.main_character.alliance_name }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
{% for member in unregistered %} {% for member in unregistered %}
<tr class="danger"> <tr class="danger">
<td><img src="{{ member.portrait_url }}" class="img-circle" alt="{{ member.character_name }}"></td> <td><img src="{{ member.portrait_url }}" class="img-circle" alt="{{ member.character_name }}"></td>
<td class="text-center">{{ member.character_name }}</td> <td>{{ member.character_name }}</td>
<td class="text-center"> <td>
<a href="https://zkillboard.com/character/{{ member.character_id }}/" class="badge bg-danger" target="_blank">{% translate "Killboard" %}</a> <a href="https://zkillboard.com/character/{{ member.character_id }}/" class="badge bg-danger" target="_blank">{% translate "Killboard" %}</a>
</td> </td>
<td class="text-center"></td> <td></td>
<td class="text-center"></td> <td></td>
<td class="text-center"></td> <td></td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
@ -145,23 +196,25 @@
</div> </div>
{% endif %} {% endif %}
</div> </div>
<div class="tab-pane fade" id="unregistered">
<div class="tab-pane fade" id="tab-unregistered" role="tabpanel" aria-labelledby="tab-unregistered">
{% if unregistered %} {% if unregistered %}
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-hover" id="table-unregistered"> <table class="table table-hover" id="table-unregistered">
<thead> <thead>
<tr> <tr>
<th></th> <th></th>
<th class="text-center">{% translate "Character" %}</th> <th>{% translate "Character" %}</th>
<th class="text-center"></th> <th></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for member in unregistered %} {% for member in unregistered %}
<tr class="danger"> <tr class="danger">
<td><img src="{{ member.portrait_url }}" class="img-circle" alt="{{ member.character_name }}"></td> <td><img src="{{ member.portrait_url }}" class="img-circle" alt="{{ member.character_name }}"></td>
<td class="text-center">{{ member.character_name }}</td> <td>{{ member.character_name }}</td>
<td class="text-center"> <td>
<a href="https://zkillboard.com/character/{{ member.character_id }}/" class="badge bg-danger" target="_blank"> <a href="https://zkillboard.com/character/{{ member.character_id }}/" class="badge bg-danger" target="_blank">
{% translate "Killboard" %} {% translate "Killboard" %}
</a> </a>
@ -176,20 +229,14 @@
</div> </div>
</div> </div>
</div> </div>
</div>
{% endif %} {% endif %}
{% endblock %} {% endblock %}
{% block extra_javascript %} {% block extra_javascript %}
{% include 'bundles/datatables-js.html' %} {% include 'bundles/datatables-js-bs5.html' %}
{% endblock %}
{% block extra_css %} <script>
{% include 'bundles/datatables-css.html' %} $(document).ready(() => {
{% endblock %}
{% block extra_script %}
$(document).ready(function(){
$('#table-mains').DataTable({ $('#table-mains').DataTable({
"columnDefs": [ "columnDefs": [
{ "sortable": false, "targets": [1] }, { "sortable": false, "targets": [1] },
@ -197,6 +244,7 @@
"stateSave": true, "stateSave": true,
"stateDuration": 0 "stateDuration": 0
}); });
$('#table-members').DataTable({ $('#table-members').DataTable({
"columnDefs": [ "columnDefs": [
{ "searchable": false, "targets": [0, 2] }, { "searchable": false, "targets": [0, 2] },
@ -206,6 +254,7 @@
"stateSave": true, "stateSave": true,
"stateDuration": 0 "stateDuration": 0
}); });
$('#table-unregistered').DataTable({ $('#table-unregistered').DataTable({
"columnDefs": [ "columnDefs": [
{ "searchable": false, "targets": [0, 2] }, { "searchable": false, "targets": [0, 2] },
@ -215,6 +264,10 @@
"stateSave": true, "stateSave": true,
"stateDuration": 0 "stateDuration": 0
}); });
}); });
</script>
{% endblock %}
{% block extra_css %}
{% include 'bundles/datatables-css-bs5.html' %}
{% endblock %} {% endblock %}

View File

@ -1,33 +1,36 @@
{% extends "corputils/base.html" %} {% extends "corputils/base.html" %}
{% load i18n %} {% load i18n %}
{% block member_data %} {% block member_data %}
<div class="panel panel-default"> <div class="card card-default">
<div class="panel-heading clearfix"> <div class="card-header clearfix">
<div class="panel-title pull-left">{% translate "Search Results" %}</div> <div class="card-title">{% translate "Search Results" %}</div>
</div> </div>
<div class="panel-body">
<div class="card-body mt-2">
<table class="table table-hover" id="table-search"> <table class="table table-hover" id="table-search">
<thead> <thead>
<tr> <tr>
<th class="text-center"></th> <th></th>
<th class="text-center">{% translate "Character" %}</th> <th>{% translate "Character" %}</th>
<th class="text-center">{% translate "Corporation" %}</th> <th>{% translate "Corporation" %}</th>
<th class="text-center">{% translate "zKillboard" %}</th> <th>{% translate "zKillboard" %}</th>
<th class="text-center">{% translate "Main Character" %}</th> <th>{% translate "Main Character" %}</th>
<th class="text-center">{% translate "Main Corporation" %}</th> <th>{% translate "Main Corporation" %}</th>
<th class="text-center">{% translate "Main Alliance" %}</th> <th>{% translate "Main Alliance" %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for result in results %} {% for result in results %}
<tr {% if not result.1.registered %}class="danger"{% endif %}> <tr {% if not result.1.registered %}class="danger"{% endif %}>
<td class="text-center"><img src="{{ result.1.portrait_url }}" class="img-circle" alt="{{ result.1.character_name }}"></td> <td><img src="{{ result.1.portrait_url }}" class="img-circle" alt="{{ result.1.character_name }}"></td>
<td class="text-center">{{ result.1.character_name }}</td> <td>{{ result.1.character_name }}</td>
<td class="text-center">{{ result.0.corp.corporation_name }}</td> <td >{{ result.0.corp.corporation_name }}</td>
<td class="text-center"><a href="https://zkillboard.com/character/{{ result.1.character_id }}/" class="badge bg-danger" target="_blank">{% translate "Killboard" %}</a></td> <td><a href="https://zkillboard.com/character/{{ result.1.character_id }}/" class="badge bg-danger" target="_blank">{% translate "Killboard" %}</a></td>
<td class="text-center">{{ result.1.main_character.character_name }}</td> <td>{{ result.1.main_character.character_name }}</td>
<td class="text-center">{{ result.1.main_character.corporation_name }}</td> <td>{{ result.1.main_character.corporation_name }}</td>
<td class="text-center">{{ result.1.main_character.alliance_name }}</td> <td>{{ result.1.main_character.alliance_name }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
@ -35,17 +38,20 @@
</div> </div>
</div> </div>
{% endblock %} {% endblock %}
{% block extra_javascript %} {% block extra_javascript %}
{% include 'bundles/datatables-js.html' %} {% include 'bundles/datatables-js-bs5.html' %}
{% endblock %}
{% block extra_css %} <script>
{% include 'bundles/datatables-css.html' %} $(document).ready(() => {
{% endblock %}
{% block extra_script %}
$(document).ready(function(){
$('#table-search').DataTable({ $('#table-search').DataTable({
"stateSave": true, "stateSave": true,
"stateDuration": 0 "stateDuration": 0
}); });
}); });
</script>
{% endblock %}
{% block extra_css %}
{% include 'bundles/datatables-css-bs5.html' %}
{% endblock %} {% endblock %}

View File

@ -16,7 +16,7 @@ Needs to be called with a context containing three objects:
{% block content %} {% block content %}
<div class="col-lg-12"> <div class="col-lg-12">
<h1 class="page-header text-center">Evelinks templatetags examples</h1> <h1 class="page-header text-center mb-3">Evelinks templatetags examples</h1>
<div class="col-lg-12 container"> <div class="col-lg-12 container">
<h2>profile URLs</h2> <h2>profile URLs</h2>

View File

@ -4,4 +4,4 @@ from django.utils.translation import gettext_lazy as _
class FatlinkForm(forms.Form): class FatlinkForm(forms.Form):
fleet = forms.CharField(label=_("Fleet Name"), max_length=50) fleet = forms.CharField(label=_("Fleet Name"), max_length=50)
duration = forms.IntegerField(label=_("Duration of fat-link"), required=True, initial=30, min_value=1, max_value=2147483647, help_text=_('minutes')) duration = forms.IntegerField(label=_("Duration of fat-link"), required=True, initial=30, min_value=1, max_value=2147483647, help_text=_('Duration of the fat-link in minutes'))

View File

@ -1,23 +1,44 @@
{% extends 'allianceauth/base-bs5.html' %} {% extends 'allianceauth/base-bs5.html' %}
{% load i18n %} {% load i18n %}
{% block page_title %} {% block page_title %}
{% translate "Fleet Participation" %} {% translate "Fleet Participation" %}
{% endblock %} {% endblock %}
{% block header_nav_brand %}
{% translate "Fleet Activity Tracking" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div class="col-lg-12"> <div>
<h1 class="page-header text-center">{% translate "Character not found!" %}</h1> <h1 class="page-header text-center mb-3">
<div class="col-lg-12 container" id="example"> {% translate "Character not found!" %}
</h1>
<div class="col-lg-12 container">
<div class="row"> <div class="row">
<div class="col-lg-12"> <div class="col-lg-12">
<div class="panel panel-default"> <div class="card card-default">
<div class="panel-heading">{{ character_name }}</div> <div class="card-header">
<div class="panel-body"> <div class="card-title mb-0">
{{ character_name }}
</div>
</div>
<div class="card-body">
<div class="col-lg-2 col-sm-2"> <div class="col-lg-2 col-sm-2">
<img class="ra-avatar img-responsive" src="{{ character_portrait_url }}" alt="{{ character_name }}"> <img class="ra-avatar img-responsive" src="{{ character_portrait_url }}" alt="{{ character_name }}">
</div> </div>
<div class="col-lg-10 col-sm-2"> <div class="col-lg-10 col-sm-2">
<div class="alert alert-danger" role="alert">{% translate "Character not registered!" %}</div> <div class="alert alert-danger" role="alert">
{% translate "This character is not associated with an auth account." %} <a href=" {% url 'authentication:add_character' %}">{% translate "Add it here" %}</a> {% translate "before attempting to click fleet attendance links." %} {% translate "Character not registered!" %}
</div>
{% translate "This character is not associated with an auth account." %}
<a href="{% url 'authentication:add_character' %}">{% translate "Add it here" %}</a>
{% translate "before attempting to click fleet attendance links." %}
</div> </div>
</div> </div>
</div> </div>

View File

@ -0,0 +1,54 @@
{% extends "allianceauth/base-bs5.html" %}
{% load django_bootstrap5 %}
{% load i18n %}
{% block page_title %}
{% translate "Create Fatlink" %}
{% endblock page_title %}
{% block header_nav_brand %}
{% translate "Fleet Activity Tracking" %}
{% endblock header_nav_brand %}
{% block content %}
<div>
<h1 class="page-header text-center mb-3">
{% translate "Create Fatlink" %}
</h1>
<div>
{% if badrequest %}
<div class="alert alert-danger" role="alert">{% translate "Bad request!" %}</div>
{% endif %}
{% for message in errormessages %}
<div class="alert alert-danger" role="alert">{{ message }}</div>
{% endfor %}
<div class="card card-primary border-0">
<div class="card-header">
<div class="card-title mb-0">
{% translate "Fatlink details" %}
</div>
</div>
<div class="card-body">
<div class="row justify-content-center">
<div class="col-md-6">
<form role="form" action="" method="POST">
{% csrf_token %}
{% bootstrap_form form %}
<div class="form-group mt-3 clearfix">
{% translate "Create fatlink" as button_text %}
{% bootstrap_button button_class="btn btn-primary" content=button_text name="submit_fat" id="submit_fat" %}
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock content %}

View File

@ -1,31 +0,0 @@
{% extends "allianceauth/base-bs5.html" %}
{% load bootstrap %}
{% load i18n %}
{% block page_title %}
{% translate "Create Fatlink" %}
{% endblock page_title %}
{% block content %}
<div class="col-lg-12">
<h1 class="page-header text-center">{% translate "Create Fleet Operation" %}</h1>
<div class="container-fluid">
{% if badrequest %}
<div class="alert alert-danger" role="alert">{% translate "Bad request!" %}</div>
{% endif %}
{% for message in errormessages %}<div class="alert alert-danger" role="alert">{{ message }}</div>{% endfor %}
<div class="col-md-4 offset-md-4">
<div class="row">
<form class="form-signin" role="form" action="" method="POST">
{% csrf_token %}
{{ form|bootstrap }}
<br>
<button class="btn btn-lg btn-primary btn-block"
type="submit"
name="submit_fat">
{% translate "Create fatlink" %}
</button>
</form>
</div>
</div>
</div>
</div>
{% endblock content %}

View File

@ -1,21 +1,35 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "Fatlink view" %}{% endblock page_title %}
{% block page_title %}
{% translate "Fatlink view" %}
{% endblock page_title %}
{% block header_nav_brand %}
{% translate "Fleet Activity Tracking" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div class="col-lg-12"> <div>
<h1 class="page-header text-center">{% translate "Edit fatlink" %} "{{ fatlink }}" <h1 class="page-header text-center mb-3">
{% translate "Edit fatlink" %} "{{ fatlink }}"
<div class="text-end"> <div class="text-end">
<form> <form>
<button type="submit" onclick="return confirm('Are you sure?')" class="btn btn-danger" name="deletefat" value="True"> <button type="submit" onclick="return confirm('{% translate "Are you sure?" %}')" class="btn btn-danger" name="deletefat" value="True">
{% translate "Delete fat" %} {% translate "Delete fat" %}
</button> </button>
</form> </form>
</div> </div>
</h1> </h1>
<div class="panel panel-default">
<div class="panel-heading">{% translate "Registered characters" %}</div> <div class="card card-default">
<div class="panel-body"> <div class="card-header">
<div class="card-title mb-0">{% translate "Registered characters" %}</div>
</div>
<div class="card-body">
<table class="table table-responsive table-hover"> <table class="table table-responsive table-hover">
<tr> <tr>
<th class="text-center">{% translate "User" %}</th> <th class="text-center">{% translate "User" %}</th>
@ -25,21 +39,23 @@
<th class="text-center">{% translate "Eve Time" %}</th> <th class="text-center">{% translate "Eve Time" %}</th>
<th></th> <th></th>
</tr> </tr>
{% for fat in registered_fats %} {% for fat in registered_fats %}
<tr> <tr>
<td class="text-center">{{ fat.user }}</td> <td class="text-center">{{ fat.user }}</td>
<td class="text-center">{{ fat.character.character_name }}</td> <td class="text-center">{{ fat.character.character_name }}</td>
<td class="text-center">
{% if fat.station != "No Station" %} {% if fat.station != "No Station" %}
<td class="text-center">{% blocktranslate %}Docked in {% endblocktranslate %}{{ fat.system }}</td> {% translate "Docked in" %}
{% else %}
<td class="text-center">{{ fat.system }}</td>
{% endif %} {% endif %}
{{ fat.system }}
</td>
<td class="text-center">{{ fat.shiptype }}</td> <td class="text-center">{{ fat.shiptype }}</td>
<td class="text-center">{{ fat.fatlink.fatdatetime }}</td> <td class="text-center">{{ fat.fatlink.fatdatetime }}</td>
<td class="text-center"> <td class="text-center">
<form> <form>
<button type="submit" class="btn btn-warning" name="removechar" value="{{ fat.character.character_id }}"> <button type="submit" class="btn btn-warning" name="removechar" value="{{ fat.character.character_id }}">
<span class="glyphicon glyphicon-remove"></span> <i class="fa-solid fa-trash-can fa-fw"></i>
</button> </button>
</form> </form>
</td> </td>

View File

@ -1,30 +1,50 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "Personal fatlink statistics" %}{% endblock page_title %} {% block page_title %}
{% translate "Personal fatlink statistics" %}
{% endblock page_title %}
{% block header_nav_brand %}
{% translate "Fleet Activity Tracking" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div class="col-lg-12"> <div>
<h1 class="page-header text-center">{% blocktranslate %}Participation data statistics for {{ month }}, {{ year }}{% endblocktranslate %} <h1 class="page-header text-center mb-3">
{% blocktranslate %}Participation data statistics for {{ month }}, {{ year }}{% endblocktranslate %}
{% if char_id %} {% if char_id %}
<div class="text-end"> <div class="text-end">
<a href="{% url 'fatlink:user_statistics_month' char_id previous_month|date:'Y' previous_month|date:'m' %}" class="btn btn-info">{% translate "Previous month" %}</a> <a href="{% url 'fatlink:user_statistics_month' char_id previous_month|date:'Y' previous_month|date:'m' %}" class="btn btn-info">
<a href="{% url 'fatlink:user_statistics_month' char_id next_month|date:'Y' next_month|date:'m' %}" class="btn btn-info">{% translate "Next month" %}</a> {% translate "Previous month" %}
</a>
<a href="{% url 'fatlink:user_statistics_month' char_id next_month|date:'Y' next_month|date:'m' %}" class="btn btn-info">
{% translate "Next month" %}
</a>
</div> </div>
{% endif %} {% endif %}
</h1> </h1>
<h2>
<div class="card card-default mb-4">
<div class="card-header">
<div class="card-title mb-0">
{% blocktranslate count links=n_fats trimmed %} {% blocktranslate count links=n_fats trimmed %}
{{ user }} has collected one link this month. {{ user }} has collected one link this month.
{% plural %} {% plural %}
{{ user }} has collected {{ links }} links this month. {{ user }} has collected {{ links }} links this month.
{% endblocktranslate %} {% endblocktranslate %}
</h2> </div>
</div>
<div class="card-body">
<table class="table table-responsive"> <table class="table table-responsive">
<tr> <tr>
<th class="col-md-2 text-center">{% translate "Ship" %}</th> <th class="col-md-2 text-center">{% translate "Ship" %}</th>
<th class="col-md-2 text-center">{% translate "Times used" %}</th> <th class="col-md-2 text-center">{% translate "Times used" %}</th>
</tr> </tr>
{% for ship, n_fats in shipStats %} {% for ship, n_fats in shipStats %}
<tr> <tr>
<td class="text-center">{{ ship }}</td> <td class="text-center">{{ ship }}</td>
@ -32,15 +52,22 @@
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>
</div>
</div>
{% if created_fats %} {% if created_fats %}
<h2> <div class="card card-default">
<div class="card-header">
<div class="card-title mb-0">
{% blocktranslate count links=n_created_fats trimmed %} {% blocktranslate count links=n_created_fats trimmed %}
{{ user }} has created one link this month. {{ user }} has created one link this month.
{% plural %} {% plural %}
{{ user }} has created {{ links }} links this month. {{ user }} has created {{ links }} links this month.
{% endblocktranslate %} {% endblocktranslate %}
</h2> </div>
{% if created_fats %} </div>
<div class="card-body">
<table class="table"> <table class="table">
<tr> <tr>
<th class="text-center">{% translate "Fleet" %}</th> <th class="text-center">{% translate "Fleet" %}</th>
@ -49,23 +76,29 @@
<th class="text-center">{% translate "Duration" %}</th> <th class="text-center">{% translate "Duration" %}</th>
<th class="text-center">{% translate "Edit" %}</th> <th class="text-center">{% translate "Edit" %}</th>
</tr> </tr>
{% for link in created_fats %} {% for link in created_fats %}
<tr> <tr>
<td class="text-center"><a href="{% url 'fatlink:click' link.hash %}" class="badge bg-primary">{{ link.fleet }}</a></td> <td class="text-center">
<a href="{% url 'fatlink:click' link.hash %}" class="badge bg-primary">
{{ link.fleet }}
</a>
</td>
<td class="text-center">{{ link.creator.username }}</td> <td class="text-center">{{ link.creator.username }}</td>
<td class="text-center">{{ link.fatdatetime }}</td> <td class="text-center">{{ link.fatdatetime }}</td>
<td class="text-center">{{ link.duration }}</td> <td class="text-center">{{ link.duration }}</td>
<td class="text-center"> <td class="text-center">
<a href="{% url 'fatlink:modify' link.hash %}"> <a href="{% url 'fatlink:modify' link.hash %}">
<button type="button" class="btn btn-info"><span <button type="button" class="btn btn-info">
class="glyphicon glyphicon-edit"></span></button> <i class="fa-solid fa-pen-to-square fa-fw"></i>
</button>
</a> </a>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>
{% endif %} </div>
</div>
{% endif %} {% endif %}
</div> </div>
{% endblock content %} {% endblock content %}

View File

@ -1,25 +1,36 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load i18n %} {% load i18n %}
{% block page_title %} {% block page_title %}
{% translate "Personal fatlink statistics" %} {% translate "Personal fatlink statistics" %}
{% endblock page_title %} {% endblock page_title %}
{% block header_nav_brand %}
{% translate "Fleet Activity Tracking" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div class="col-lg-12"> <div>
<h1 class="page-header text-center"> <h1 class="page-header text-center mb-3">
{% blocktranslate %}Participation data statistics for {{ year }}{% endblocktranslate %} {% blocktranslate %}Participation data statistics for {{ year }}{% endblocktranslate %}
<div class="text-end"> <div class="text-end">
<a href="{% url "fatlink:personal_statistics_year" previous_year %}" class="btn btn-info"><i class="fa-solid fa-chevron-left"></i> {% translate "Previous year" %}</a> <a href="{% url "fatlink:personal_statistics_year" previous_year %}" class="btn btn-info"><i class="fa-solid fa-chevron-left"></i> {% translate "Previous year" %}</a>
{% if next_year %} {% if next_year %}
<a href="{% url "fatlink:personal_statistics_year" next_year %}" class="btn btn-info">{% translate "Next year" %} <i class="fa-solid fa-chevron-right"></i></a> <a href="{% url "fatlink:personal_statistics_year" next_year %}" class="btn btn-info">{% translate "Next year" %} <i class="fa-solid fa-chevron-right"></i></a>
{% endif %} {% endif %}
</div> </div>
</h1> </h1>
<div class="col-lg-2 offset-lg-5"> <div class="col-lg-2 offset-lg-5">
<table class="table table-responsive"> <table class="table table-responsive">
<tr> <tr>
<th scope="col" class="col-md-2 text-center">{% translate "Month" %}</th> <th scope="col" class="col-md-2 text-center">{% translate "Month" %}</th>
<th scope="col" class="col-md-2 text-center">{% translate "Fats" %}</th> <th scope="col" class="col-md-2 text-center">{% translate "Fats" %}</th>
</tr> </tr>
{% for monthnr, month, n_fats in monthlystats %} {% for monthnr, month, n_fats in monthlystats %}
<tr> <tr>
<td class="text-center"> <td class="text-center">

View File

@ -1,19 +1,29 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load i18n %} {% load i18n %}
{% block page_title %} {% block page_title %}
{% translate "Fatlink Corp Statistics" %} {% translate "Fatlink Corp Statistics" %}
{% endblock page_title %} {% endblock page_title %}
{% block header_nav_brand %}
{% translate "Fleet Activity Tracking" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div class="col-lg-12"> <div class="col-lg-12">
<h1 class="page-header text-center"> <h1 class="page-header text-center mb-3">
{% blocktranslate %}Participation data statistics for {{ month }}, {{ year }}{% endblocktranslate %} {% blocktranslate %}Participation data statistics for {{ month }}, {{ year }}{% endblocktranslate %}
<div class="text-end"> <div class="text-end">
<a href="{% url "fatlink:statistics_corp_month" corpid previous_month|date:"Y" previous_month|date:"m" %}" class="btn btn-info">{% translate "Previous month" %}</a> <a href="{% url "fatlink:statistics_corp_month" corpid previous_month|date:"Y" previous_month|date:"m" %}" class="btn btn-info">{% translate "Previous month" %}</a>
{% if next_month %} {% if next_month %}
<a href="{% url "fatlink:statistics_corp_month" corpid next_month|date:"Y" next_month|date:"m" %}" class="btn btn-info">{% translate "Next month" %}</a> <a href="{% url "fatlink:statistics_corp_month" corpid next_month|date:"Y" next_month|date:"m" %}" class="btn btn-info">{% translate "Next month" %}</a>
{% endif %} {% endif %}
</div> </div>
</h1> </h1>
{% if fatStats %} {% if fatStats %}
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped"> <table class="table table-striped">
@ -43,8 +53,11 @@
{% endif %} {% endif %}
</div> </div>
{% endblock content %} {% endblock content %}
{% block extra_script %}
$(document).ready(function () { {% block extra_javascript %}
<script>
$(document).ready(() => {
$("[rel=tooltip]").tooltip(); $("[rel=tooltip]").tooltip();
}); });
{% endblock extra_script %} </script>
{% endblock extra_javascript %}

View File

@ -1,19 +1,29 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load i18n %} {% load i18n %}
{% block page_title %} {% block page_title %}
{% translate "Fatlink Statistics" %} {% translate "Fatlink Statistics" %}
{% endblock page_title %} {% endblock page_title %}
{% block header_nav_brand %}
{% translate "Fleet Activity Tracking" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div class="col-lg-12"> <div>
<h1 class="page-header text-center"> <h1 class="page-header text-center mb-3">
{% blocktranslate %}Participation data statistics for {{ month }}, {{ year }}{% endblocktranslate %} {% blocktranslate %}Participation data statistics for {{ month }}, {{ year }}{% endblocktranslate %}
<div class="text-end"> <div class="text-end">
<a href="{% url "fatlink:statistics_month" previous_month|date:"Y" previous_month|date:"m" %}" class="btn btn-info">{% translate "Previous month" %}</a> <a href="{% url "fatlink:statistics_month" previous_month|date:"Y" previous_month|date:"m" %}" class="btn btn-info">{% translate "Previous month" %}</a>
{% if next_month %} {% if next_month %}
<a href="{% url 'fatlink:statistics_month' next_month|date:"Y" next_month|date:"m" %}" class="btn btn-info">{% translate "Next month" %}</a> <a href="{% url 'fatlink:statistics_month' next_month|date:"Y" next_month|date:"m" %}" class="btn btn-info">{% translate "Next month" %}</a>
{% endif %} {% endif %}
</div> </div>
</h1> </h1>
{% if fatStats %} {% if fatStats %}
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped"> <table class="table table-striped">
@ -47,8 +57,11 @@
{% endif %} {% endif %}
</div> </div>
{% endblock content %} {% endblock content %}
{% block extra_script %}
$(document).ready(function () { {% block extra_javascript %}
<script>
$(document).ready(() => {
$("[rel=tooltip]").tooltip(); $("[rel=tooltip]").tooltip();
}); });
{% endblock extra_script %} </script>
{% endblock extra_javascript %}

View File

@ -1,11 +1,21 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load i18n %} {% load i18n %}
{% block page_title %} {% block page_title %}
{% translate "Fatlink view" %} {% translate "Fatlink view" %}
{% endblock page_title %} {% endblock page_title %}
{% block header_nav_brand %}
{% translate "Fleet Activity Tracking" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div class="col-lg-12"> <div class="col-lg-12">
<h1 class="page-header text-center">{% translate "Participation data" %}</h1> <h1 class="page-header text-center mb-3">
{% translate "Participation data" %}
</h1>
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped"> <table class="table table-striped">
<tr> <tr>
@ -15,11 +25,15 @@
</h4> </h4>
</th> </th>
<th class="col-md-2 align-self-end"> <th class="col-md-2 align-self-end">
<a href="{% url 'fatlink:personal_statistics' %}" class="btn btn-info"><i class="fa-solid fa-circle-info fa-fw"></i>{% translate "Personal statistics" %}</a> <a href="{% url 'fatlink:personal_statistics' %}" class="btn btn-info">
<i class="fa-solid fa-circle-info fa-fw"></i>
{% translate "Personal statistics" %}
</a>
</th> </th>
</tr> </tr>
</table> </table>
</div> </div>
{% if fats %} {% if fats %}
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped"> <table class="table table-striped">
@ -30,6 +44,7 @@
<th scope="col" class="text-center">{% translate "Ship" %}</th> <th scope="col" class="text-center">{% translate "Ship" %}</th>
<th scope="col" class="text-center">{% translate "Eve Time" %}</th> <th scope="col" class="text-center">{% translate "Eve Time" %}</th>
</tr> </tr>
{% for fat in fats %} {% for fat in fats %}
<tr> <tr>
<td class="text-center">{{ fat.fatlink.fleet }}</td> <td class="text-center">{{ fat.fatlink.fleet }}</td>
@ -48,6 +63,7 @@
{% else %} {% else %}
<div class="alert alert-warning text-center">{% translate "No fleet activity on record." %}</div> <div class="alert alert-warning text-center">{% translate "No fleet activity on record." %}</div>
{% endif %} {% endif %}
{% if perms.auth.fleetactivitytracking %} {% if perms.auth.fleetactivitytracking %}
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped"> <table class="table table-striped">
@ -66,6 +82,7 @@
</tr> </tr>
</table> </table>
</div> </div>
{% if fatlinks %} {% if fatlinks %}
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped"> <table class="table table-striped">
@ -77,6 +94,7 @@
<th scope="col" class="text-center">{% translate "Duration" %}</th> <th scope="col" class="text-center">{% translate "Duration" %}</th>
<th scope="col" class="text-center">{% translate "Edit" %}</th> <th scope="col" class="text-center">{% translate "Edit" %}</th>
</tr> </tr>
{% for link in fatlinks %} {% for link in fatlinks %}
<tr> <tr>
<td class="text-center"> <td class="text-center">

View File

@ -352,11 +352,11 @@ def create_fatlink_view(request):
for errorname, message in e.message_dict.items(): for errorname, message in e.message_dict.items():
messages.append(message[0].decode()) messages.append(message[0].decode())
context = {'form': form, 'errormessages': messages} context = {'form': form, 'errormessages': messages}
return render(request, 'fleetactivitytracking/fatlinkformatter.html', context=context) return render(request, 'fleetactivitytracking/fatlinkcreate.html', context=context)
else: else:
form = FatlinkForm() form = FatlinkForm()
context = {'form': form, 'badrequest': True} context = {'form': form, 'badrequest': True}
return render(request, 'fleetactivitytracking/fatlinkformatter.html', context=context) return render(request, 'fleetactivitytracking/fatlinkcreate.html', context=context)
return redirect('fatlink:view') return redirect('fatlink:view')
else: else:
@ -365,7 +365,7 @@ def create_fatlink_view(request):
context = {'form': form} context = {'form': form}
return render(request, 'fleetactivitytracking/fatlinkformatter.html', context=context) return render(request, 'fleetactivitytracking/fatlinkcreate.html', context=context)
@login_required @login_required

View File

@ -16,7 +16,7 @@ class GroupManagementMenuItem(MenuItemHook):
MenuItemHook.__init__( MenuItemHook.__init__(
self, self,
text=_("Group Management"), text=_("Group Management"),
classes="fas fa-users-cog fa-fw", classes="fa-solid fa-users-gear",
url_name="groupmanagement:management", url_name="groupmanagement:management",
order=50, order=50,
navactive=[ navactive=[
@ -36,7 +36,7 @@ class GroupManagementMenuItem(MenuItemHook):
""" """
<li class="d-flex m-2 p-2 pt-0 pb-0 mt-0 mb-0"> <li class="d-flex m-2 p-2 pt-0 pb-0 mt-0 mb-0">
<i class="fas fa-users fa-fw align-self-center me-2"></i> <i class="fa-solid fa-users fa-fw align-self-center me-2"></i>
<a class="nav-link flex-fill align-self-center {% navactive request 'groupmanagement:groups' %}" href="{% url 'groupmanagement:groups' %}"> <a class="nav-link flex-fill align-self-center {% navactive request 'groupmanagement:groups' %}" href="{% url 'groupmanagement:groups' %}">
{% translate "Groups" %} {% translate "Groups" %}
</a> </a>
@ -49,7 +49,7 @@ class GroupsMenuItem(MenuItemHook):
MenuItemHook.__init__( MenuItemHook.__init__(
self, self,
text=_("Groups"), text=_("Groups"),
classes="fas fa-user fa-fw", classes="fa-solid fa-user",
url_name="groupmanagement:groups", url_name="groupmanagement:groups",
order=25, order=25,
navactive=[ navactive=[

View File

@ -1,10 +1,16 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load static %} {% load static %}
{% load i18n %} {% load i18n %}
{% load navactive %} {% load navactive %}
{% block page_title %}{{ group }} {% translate "Audit Log" %}{% endblock page_title %} {% block page_title %}
{% block header_nav_brand %}{% translate "Audit Log" %} - {{ group.name }}{% endblock header_nav_brand %} {{ group }} {% translate "Audit Log" %}
{% endblock page_title %}
{% block header_nav_brand %}
{% translate "Audit Log" %} - {{ group.name }}
{% endblock header_nav_brand %}
{% block header_nav_collapse_left %} {% block header_nav_collapse_left %}
<li class="nav-item"> <li class="nav-item">
@ -65,31 +71,26 @@
{% block extra_javascript %} {% block extra_javascript %}
{% include 'bundles/datatables-js-bs5.html' %} {% include 'bundles/datatables-js-bs5.html' %}
{% include 'bundles/moment-js.html' with locale=True %} {% include 'bundles/moment-js.html' with locale=True %}
{% include 'bundles/filterdropdown-js.html' %} {# {% include 'bundles/filterdropdown-js.html' %}#}
{% endblock %}
{% block extra_css %} <script>
{% include 'bundles/datatables-css-bs5.html' %} $.fn.dataTable.moment = (format, locale) => {
{% endblock %} const types = $.fn.dataTable.ext.type;
{% block extra_script %}
$.fn.dataTable.moment = function(format, locale) {
let types = $.fn.dataTable.ext.type;
// Add type detection // Add type detection
types.detect.unshift(function(d) { types.detect.unshift((d) => {
return moment(d, format, locale, true).isValid() ? return moment(d, format, locale, true).isValid() ?
'moment-'+format : 'moment-'+format :
null; null;
}); });
// Add sorting method - use an integer for the sorting // Add sorting method - use an integer for the sorting
types.order[ 'moment-'+format+'-pre' ] = function(d) { types.order[ 'moment-'+format+'-pre' ] = (d) => {
return moment(d, format, locale, true).unix(); return moment(d, format, locale, true).unix();
}; };
}; };
$(document).ready(function(){ $(document).ready(() => {
$.fn.dataTable.moment('YYYY-MMM-D, HH:mm'); $.fn.dataTable.moment('YYYY-MMM-D, HH:mm');
$('#log-entries').DataTable({ $('#log-entries').DataTable({
@ -122,4 +123,9 @@
"stateDuration": 0 "stateDuration": 0
}); });
}); });
</script>
{% endblock %}
{% block extra_css %}
{% include 'bundles/datatables-css-bs5.html' %}
{% endblock %} {% endblock %}

View File

@ -1,11 +1,17 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load static %} {% load static %}
{% load i18n %} {% load i18n %}
{% load evelinks %} {% load evelinks %}
{% load navactive %} {% load navactive %}
{% block page_title %}{% translate "Group Members" %}{% endblock page_title %} {% block page_title %}
{% block header_nav_brand %}{% translate "Group Members" %} - {{ group.name }}{% endblock header_nav_brand %} {% translate "Group Members" %}
{% endblock page_title %}
{% block header_nav_brand %}
{% translate "Group Members" %} - {{ group.name }}
{% endblock header_nav_brand %}
{% block header_nav_collapse_left %} {% block header_nav_collapse_left %}
<li class="nav-item"> <li class="nav-item">
@ -16,7 +22,7 @@
{% block content %} {% block content %}
{% if group.user_set %} {% if group.user_set %}
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-aa" id="tab_group_members"> <table class="table" id="tab_group_members">
<thead> <thead>
<tr> <tr>
<th>{% translate "Character" %}</th> <th>{% translate "Character" %}</th>
@ -30,6 +36,7 @@
<tr> <tr>
<td> <td>
<img src="{{ member.main_char|character_portrait_url:32 }}" class="rounded-circle" style="margin-right: 1rem;" alt="{{ member.main_char.character_name }}"> <img src="{{ member.main_char|character_portrait_url:32 }}" class="rounded-circle" style="margin-right: 1rem;" alt="{{ member.main_char.character_name }}">
{% if member.main_char %} {% if member.main_char %}
<a href="{{ member.main_char|evewho_character_url }}" target="_blank"> <a href="{{ member.main_char|evewho_character_url }}" target="_blank">
{{ member.main_char.character_name }} {{ member.main_char.character_name }}
@ -39,7 +46,7 @@
{% endif %} {% endif %}
{% if member.is_leader %} {% if member.is_leader %}
<i class="fa-solid fa-star"> title="{% translate "Group leader" %}" style="margin-left: 1rem;"></i>&nbsp; <sup><i class="fa-solid fa-star" title="{% translate "Group leader" %}"></i></sup>
{% endif %} {% endif %}
</td> </td>
@ -53,6 +60,7 @@
{% translate "(unknown)" %} {% translate "(unknown)" %}
{% endif %} {% endif %}
</td> </td>
<td class="text-end"> <td class="text-end">
<a href="{% url 'groupmanagement:membership_remove' group.id member.user.id %}" class="btn btn-danger" title="{% translate "Remove from group" %}"> <a href="{% url 'groupmanagement:membership_remove' group.id member.user.id %}" class="btn btn-danger" title="{% translate "Remove from group" %}">
<i class="fa-solid fa-xmark"></i> <i class="fa-solid fa-xmark"></i>
@ -77,14 +85,9 @@
{% block extra_javascript %} {% block extra_javascript %}
{% include 'bundles/datatables-js-bs5.html' %} {% include 'bundles/datatables-js-bs5.html' %}
{% endblock %}
{% block extra_css %} <script>
{% include 'bundles/datatables-css-bs5.html' %} $(document).ready(() => {
{% endblock %}
{% block extra_script %}
$(document).ready(function(){
$('#tab_group_members').DataTable({ $('#tab_group_members').DataTable({
order: [[0, "asc"]], order: [[0, "asc"]],
columnDefs: [ columnDefs: [
@ -97,4 +100,9 @@
"stateDuration": 0 "stateDuration": 0
}); });
}); });
</script>
{% endblock %}
{% block extra_css %}
{% include 'bundles/datatables-css-bs5.html' %}
{% endblock %} {% endblock %}

View File

@ -17,7 +17,7 @@
{% block content %} {% block content %}
{% if groups %} {% if groups %}
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-aa"> <table class="table">
<thead> <thead>
<tr> <tr>
<th>{% translate "Name" %}</th> <th>{% translate "Name" %}</th>
@ -54,15 +54,15 @@
<td class="text-end"> <td class="text-end">
<a href="{% url 'groupmanagement:membership' group.id %}" class="btn btn-primary" title="{% translate "View Members" %}"> <a href="{% url 'groupmanagement:membership' group.id %}" class="btn btn-primary" title="{% translate "View Members" %}">
<i class="far fa-eye"></i> <i class="fa-regular fa-eye"></i>
</a> </a>
<a href="{% url "groupmanagement:audit_log" group.id %}" class="btn btn-info" title="{% translate "Audit Members" %}"> <a href="{% url "groupmanagement:audit_log" group.id %}" class="btn btn-info" title="{% translate "Audit Members" %}">
<i class="far fa-list-alt"></i> <i class="fa-regular fa-rectangle-list"></i>
</a> </a>
<a id="clipboard-copy" data-clipboard-text="{{ request.scheme }}://{{request.get_host}}{% url 'groupmanagement:request_add' group.id %}" class="btn btn-warning" title="{% translate "Copy Direct Join Link" %}"> <a id="clipboard-copy" data-clipboard-text="{{ request.scheme }}://{{request.get_host}}{% url 'groupmanagement:request_add' group.id %}" class="btn btn-warning" title="{% translate "Copy Direct Join Link" %}">
<i class="far fa-clipboard"></i> <i class="fa-regular fa-clipboard"></i>
</a> </a>
</td> </td>
</tr> </tr>

View File

@ -1,9 +1,15 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load static %} {% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "Available Groups" %}{% endblock page_title %} {% block page_title %}
{% block header_nav_brand %}{% translate "Available Groups" %}{% endblock header_nav_brand %} {% translate "Available Groups" %}
{% endblock page_title %}
{% block header_nav_brand %}
{% translate "Available Groups" %}
{% endblock header_nav_brand %}
{% if manager_perms %} {% if manager_perms %}
{% block header_nav_collapse_left %} {% block header_nav_collapse_left %}
@ -16,6 +22,7 @@
</li> </li>
{% endblock %} {% endblock %}
{% endif %} {% endif %}
{% block content %} {% block content %}
{% if groups %} {% if groups %}
<table class="table" id="groupsTable" > <table class="table" id="groupsTable" >
@ -78,16 +85,17 @@
</div> </div>
{% endif %} {% endif %}
{% endblock content %} {% endblock content %}
{% block extra_javascript %} {% block extra_javascript %}
{% include 'bundles/datatables-js-bs5.html' %} {% include 'bundles/datatables-js-bs5.html' %}
<script>
$(document).ready(() => {
$('#groupsTable').DataTable();
});
</script>
{% endblock %} {% endblock %}
{% block extra_css %} {% block extra_css %}
{% include 'bundles/datatables-css-bs5.html' %} {% include 'bundles/datatables-css-bs5.html' %}
{% endblock %} {% endblock %}
{% block extra_script %}
$(document).ready(function () {
$('#groupsTable').DataTable();
});
{% endblock extra_script %}

View File

@ -1,18 +1,21 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load static %} {% load static %}
{% load i18n %} {% load i18n %}
{% load evelinks %} {% load evelinks %}
{% load navactive %} {% load navactive %}
{% block page_title %}{% translate "Groups Management" %}{% endblock page_title %} {% block page_title %}
{% block header_nav_brand %}{% translate "Groups Management" %}{% endblock header_nav_brand %} {% translate "Groups Management" %}
{% endblock page_title %}
{% block extra_css %} {% block header_nav_brand %}
{% endblock extra_css %} {% translate "Groups Management" %}
{% endblock header_nav_brand %}
{% block header_nav_collapse_left %} {% block header_nav_collapse_left %}
<li class="active"> <li class="active">
<a class="nav-link active" id="add-tab" data-bs-toggle="tab" data-bs-target="#add" type="button" role="tab" aria-controls="addd" aria-selected="true"> <a class="nav-link active" id="add-tab" data-bs-toggle="tab" data-bs-target="#add" type="button" role="tab" aria-controls="add" aria-selected="true">
{% translate "Join Requests" %} {% translate "Join Requests" %}
{% if acceptrequests %} {% if acceptrequests %}
@ -21,14 +24,9 @@
</a> </a>
</li> </li>
{% if not auto_leave %}
<li>
<a class="nav-link" id="leave-tab" data-bs-toggle="tab" data-bs-target="#leave" type="button" role="tab" aria-controls="leave" aria-selected="false">
{% translate "Leave Requests" %}
{% if not show_leave_tab %} {% if not show_leave_tab %}
<li> <li>
<a data-toggle="tab" href="#leave"> <a class="nav-link" id="leave-tab" data-bs-toggle="tab" data-bs-target="#leave" type="button" role="tab" aria-controls="leave" aria-selected="false">
{% translate "Leave Requests" %} {% translate "Leave Requests" %}
{% if leaverequests %} {% if leaverequests %}
@ -37,14 +35,13 @@
</a> </a>
</li> </li>
{% endif %} {% endif %}
<li class="nav-item ">
<a class="nav-link {% navactive request 'groupmanagement:membership groupmanagement:audit_log' %}" href="{% url 'groupmanagement:membership' %}">
{% translate "Group Membership" %}
</a> </a>
</li> </li>
{% endif %} {% endblock header_nav_collapse_left %}
<li class="nav-item ">
<a class="nav-link {% navactive request 'groupmanagement:membership groupmanagement:audit_log' %}" href="{% url 'groupmanagement:membership' %}">{% translate "Group Membership" %}</a>
</li>
{% endblock %}
{% block content %} {% block content %}
@ -52,7 +49,7 @@
<div id="add" class="tab-pane active"> <div id="add" class="tab-pane active">
{% if acceptrequests %} {% if acceptrequests %}
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-aa"> <table class="table">
<thead> <thead>
<tr> <tr>
<th>{% translate "Character" %}</th> <th>{% translate "Character" %}</th>
@ -67,6 +64,7 @@
<tr> <tr>
<td> <td>
<img src="{{ acceptrequest.main_char|character_portrait_url:32 }}" class="rounded-circle" style="margin-right: 1rem;" alt="{{ acceptrequest.main_char.character_name }}"> <img src="{{ acceptrequest.main_char|character_portrait_url:32 }}" class="rounded-circle" style="margin-right: 1rem;" alt="{{ acceptrequest.main_char.character_name }}">
{% if acceptrequest.main_char %} {% if acceptrequest.main_char %}
<a href="{{ acceptrequest.main_char|evewho_character_url }}" target="_blank"> <a href="{{ acceptrequest.main_char|evewho_character_url }}" target="_blank">
{{ acceptrequest.main_char.character_name }} {{ acceptrequest.main_char.character_name }}
@ -75,68 +73,25 @@
{{ acceptrequest.user.username }} {{ acceptrequest.user.username }}
{% endif %} {% endif %}
</td> </td>
<td> <td>
{% if acceptrequest.main_char %} {% if acceptrequest.main_char %}
<a href="{{ acceptrequest.main_char|dotlan_corporation_url }}" target="_blank"> <a href="{{ acceptrequest.main_char|dotlan_corporation_url }}" target="_blank">
{{ acceptrequest.main_char.corporation_name }} {{ acceptrequest.main_char.corporation_name }}
</a><br> </a>
<br>
{{ acceptrequest.main_char.alliance_name|default_if_none:"" }} {{ acceptrequest.main_char.alliance_name|default_if_none:"" }}
{% else %} {% else %}
{% translate "(unknown)" %} {% translate "(unknown)" %}
{% endif %} {% endif %}
</td> </td>
<td>{{ acceptrequest.group.name }}</td> <td>{{ acceptrequest.group.name }}</td>
<td class="text-end"> <td class="text-end">
<a href="{% url 'groupmanagement:accept_request' acceptrequest.id %}" class="btn btn-success"> <a href="{% url 'groupmanagement:accept_request' acceptrequest.id %}" class="btn btn-success">
{% translate "Accept" %} {% translate "Accept" %}
</a> </a>
{% if not show_leave_tab %}
<div id="leave" class="tab-pane">
{% if leaverequests %}
<div class="table-responsive">
<table class="table table-aa">
<thead>
<tr>
<th>{% translate "Character" %}</th>
<th>{% translate "Organization" %}</th>
<th>{% translate "Group" %}</th>
<th></th>
</tr>
</thead>
<tbody>
{% for leaverequest in leaverequests %}
<tr>
<td>
<img src="{{ leaverequest.main_char|character_portrait_url:32 }}" class="img-circle" style="margin-right: 1rem;" alt="{{ leaverequest.main_char.character_name }}">
{% if leaverequest.main_char %}
<a href="{{ leaverequest.main_char|evewho_character_url }}" target="_blank">
{{ leaverequest.main_char.character_name }}
</a>
{% else %}
{{ leaverequest.user.username }}
{% endif %}
</td>
<td>
{% if leaverequest.main_char %}
<a href="{{ leaverequest.main_char|dotlan_corporation_url }}" target="_blank">
{{ leaverequest.main_char.corporation_name }}
</a><br>
{{ leaverequest.main_char.alliance_name|default_if_none:"" }}
{% else %}
{% translate "(unknown)" %}
{% endif %}
</td>
<td>{{ leaverequest.group.name }}</td>
<td class="text-right">
<a href="{% url 'groupmanagement:leave_accept_request' leaverequest.id %}" class="btn btn-success">
{% translate "Accept" %}
</a>
<a href="{% url 'groupmanagement:leave_reject_request' leaverequest.id %}" class="btn btn-danger">
{% translate "Reject" %}
</a>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
@ -144,22 +99,17 @@
</table> </table>
</div> </div>
{% else %} {% else %}
<div class="alert alert-warning text-center">{% translate "No group leave requests." %}</div> <div class="aa-callout aa-callout-warning text-center">
{% endif %} {% translate "No group add requests." %}
</div> </div>
{% endif %} {% endif %}
</div> </div>
</div>
{% else %}
<div class="alert alert-warning text-center">{% translate "No group add requests." %}</div>
{% endif %}
</div>
{% if not auto_leave %} {% if not show_leave_tab %}
<div id="leave" class="tab-pane"> <div id="leave" class="tab-pane">
{% if leaverequests %} {% if leaverequests %}
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-aa"> <table class="table">
<thead> <thead>
<tr> <tr>
<th>{% translate "Character" %}</th> <th>{% translate "Character" %}</th>
@ -174,6 +124,7 @@
<tr> <tr>
<td> <td>
<img src="{{ leaverequest.main_char|character_portrait_url:32 }}" class="rounded-circle" style="margin-right: 1rem;" alt="{{ leaverequest.main_char.character_name }}"> <img src="{{ leaverequest.main_char|character_portrait_url:32 }}" class="rounded-circle" style="margin-right: 1rem;" alt="{{ leaverequest.main_char.character_name }}">
{% if leaverequest.main_char %} {% if leaverequest.main_char %}
<a href="{{ leaverequest.main_char|evewho_character_url }}" target="_blank"> <a href="{{ leaverequest.main_char|evewho_character_url }}" target="_blank">
{{ leaverequest.main_char.character_name }} {{ leaverequest.main_char.character_name }}
@ -182,17 +133,21 @@
{{ leaverequest.user.username }} {{ leaverequest.user.username }}
{% endif %} {% endif %}
</td> </td>
<td> <td>
{% if leaverequest.main_char %} {% if leaverequest.main_char %}
<a href="{{ leaverequest.main_char|dotlan_corporation_url }}" target="_blank"> <a href="{{ leaverequest.main_char|dotlan_corporation_url }}" target="_blank">
{{ leaverequest.main_char.corporation_name }} {{ leaverequest.main_char.corporation_name }}
</a><br> </a>
<br>
{{ leaverequest.main_char.alliance_name|default_if_none:"" }} {{ leaverequest.main_char.alliance_name|default_if_none:"" }}
{% else %} {% else %}
{% translate "(unknown)" %} {% translate "(unknown)" %}
{% endif %} {% endif %}
</td> </td>
<td>{{ leaverequest.group.name }}</td> <td>{{ leaverequest.group.name }}</td>
<td class="text-end"> <td class="text-end">
<a href="{% url 'groupmanagement:leave_accept_request' leaverequest.id %}" class="btn btn-success"> <a href="{% url 'groupmanagement:leave_accept_request' leaverequest.id %}" class="btn btn-success">
{% translate "Accept" %} {% translate "Accept" %}
@ -208,7 +163,7 @@
</table> </table>
</div> </div>
{% else %} {% else %}
<div class="alert alert-warning text-center">{% translate "No group leave requests." %}</div> <div class="aa-callout aa-callout-warning text-center">{% translate "No group leave requests." %}</div>
{% endif %} {% endif %}
</div> </div>
{% endif %} {% endif %}

View File

@ -99,5 +99,5 @@ class TestViews(TestCase):
# then # then
content = response_content_to_str(response) content = response_content_to_str(response)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertIn('<a data-toggle="tab" href="#leave">', content) self.assertIn('<a class="nav-link" id="leave-tab" data-bs-toggle="tab" data-bs-target="#leave"', content)
self.assertIn('<div id="leave" class="tab-pane">', content) self.assertIn('<div id="leave" class="tab-pane">', content)

View File

@ -1,13 +1,28 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "Choose a Corp" %}{% endblock page_title %} {% block page_title %}
{% translate "Choose a Corp" %}
{% endblock page_title %}
{% block header_nav_brand %}
{% translate "HR Application Management" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div class="col-lg-12"> <div>
<h1 class="page-header text-center">{% translate "Choose a Corp" %}</h1> <h1 class="page-header text-center mb-3">
{% translate "Choose a Corp" %}
</h1>
{% if choices %} {% if choices %}
<div class="panel panel-primary"> <div class="card card-primary">
<div class="panel-heading">{% translate "Available Corps" %}</div> <div class="card-header">
<div class="card-title mb-0">{% translate "Available Corps" %}</div>
</div>
<div class="card-body">
<table class="table table-responsive"> <table class="table table-responsive">
{% for choice in choices %} {% for choice in choices %}
<tr> <tr>
@ -18,6 +33,7 @@
{% endfor %} {% endfor %}
</table> </table>
</div> </div>
</div>
{% else %} {% else %}
<div class="alert alert-danger">{% translate "No corps are accepting applications at this time." %}</div> <div class="alert alert-danger">{% translate "No corps are accepting applications at this time." %}</div>
{% endif %} {% endif %}

View File

@ -1,35 +1,66 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load django_bootstrap5 %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "Apply To" %} {{ corp.corporation_name }}{% endblock page_title %} {% block page_title %}
{% translate "Apply To" %} {{ corp.corporation_name }}
{% endblock page_title %}
{% block header_nav_brand %}
{% translate "HR Application Management" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div class="col-lg-12"> <div>
<h1 class="page-header text-center">{% translate "Apply To" %} {{ corp.corporation_name }}</h1> <h1 class="page-header text-center mb-3">
<div class="container-fluid"> {% translate "Apply To" %} {{ corp.corporation_name }}
<div class="col-md-4 col-md-offset-4"> </h1>
<div class="row">
<form class="form-signin"> <div class="card">
<div class="card-header">
<div class="card-title mb-0">
{% translate "Application form" %}
</div>
</div>
<div class="card-body">
<div class="row justify-content-center">
<div class="col-md-8">
<form method="post">
{% csrf_token %} {% csrf_token %}
{% for question in questions %} {% for question in questions %}
<div class="form-group"> <div class="card mb-3 form-group border-0">
<label class="control-label" for="id_{{ question.pk }}">{{ question.title }}</label> <div class="card-header">
<div class=" "> <div class="card-title mb-0">{{ question.title }}</div>
</div>
<div class="card-body">
{% if question.help_text %} {% if question.help_text %}
<div class="text-center">{{ question.help_text }}</div> <p class="text-muted">
{{ question.help_text }}
</p>
{% endif %} {% endif %}
{% for choice in question.choices.all %} {% for choice in question.choices.all %}
<input type={% if question.multi_select == False %}"radio"{% else %}"checkbox"{% endif %} name="{{ question.pk }}" id="id_{{ question.pk }}_choice_{{ forloop.counter }}" value="{{ choice.choice_text }}"> <input type="{% if question.multi_select == False %}radio{% else %}checkbox{% endif %}" name="{{ question.pk }}" id="id_{{ question.pk }}_choice_{{ forloop.counter }}" value="{{ choice.choice_text }}">
<label for="id_{{ question.pk }}_choice_{{ forloop.counter }}">{{ choice.choice_text }}</label><br> <label for="id_{{ question.pk }}_choice_{{ forloop.counter }}">{{ choice.choice_text }}</label><br>
{% empty %} {% empty %}
<textarea class="form-control" cols="30" id="id_{{ question.pk }}" name="{{ question.pk }}" rows="4"></textarea> <textarea class="form-control" cols="30" id="id_{{ question.pk }}" name="{{ question.pk }}" rows="10"></textarea>
{% endfor %} {% endfor %}
</div> </div>
</div> </div>
{% endfor %} {% endfor %}
<button class="btn btn-lg btn-primary btn-block" type="submit" formmethod="post">{% translate "Submit" %}</button>
<div class="form-group clearfix">
{% translate "Submit" as button_text %}
{% bootstrap_button button_class="btn btn-primary" content=button_text name="submitApplicationForm" id="submitApplicationForm" %}
</div>
</form> </form>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
{% endblock %} {% endblock %}

View File

@ -1,13 +1,19 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load bootstrap %}
{% load django_bootstrap5 %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "HR Application Management" %}{% endblock page_title %} {% block page_title %}
{% block extra_css %}{% endblock extra_css %} {% translate "HR Application Management" %}
{% endblock page_title %}
{% block header_nav_brand %}
{% translate "HR Application Management" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div class="col-lg-12"> <div>
<h1 class="page-header text-center">{% translate "Personal Applications" %} <h1 class="page-header text-center mb-3">{% translate "Personal Applications" %}
<div class="text-end"> <div class="text-end">
{% if create %} {% if create %}
<a href="{% url 'hrapplications:create_view' %}"> <a href="{% url 'hrapplications:create_view' %}">
@ -18,8 +24,10 @@
{% endif %} {% endif %}
</div> </div>
</h1> </h1>
{% if personal_apps %} {% if personal_apps %}
<div class="panel panel-default"> <div class="card card-default mb-3">
<div class="card-body">
<table class="table table-condensed"> <table class="table table-condensed">
<tr> <tr>
<th class="text-center">{% translate "Username" %}</th> <th class="text-center">{% translate "Username" %}</th>
@ -27,6 +35,7 @@
<th class="text-center">{% translate "Status" %}</th> <th class="text-center">{% translate "Status" %}</th>
<th class="text-center">{% translate "Actions" %}</th> <th class="text-center">{% translate "Actions" %}</th>
</tr> </tr>
{% for personal_app in personal_apps %} {% for personal_app in personal_apps %}
<tr> <tr>
<td class="text-center">{{ personal_app.user.username }}</td> <td class="text-center">{{ personal_app.user.username }}</td>
@ -42,12 +51,12 @@
</td> </td>
<td class="text-center"> <td class="text-center">
<a href="{% url 'hrapplications:personal_view' personal_app.id %}" class="btn btn-primary"> <a href="{% url 'hrapplications:personal_view' personal_app.id %}" class="btn btn-primary">
<span class="glyphicon glyphicon-eye-open"></span> <i class="fa-solid fa-eye"></i>
</a> </a>
{% if personal_app.approved == None %} {% if personal_app.approved == None %}
<a href="{% url 'hrapplications:personal_removal' personal_app.id %}" class="btn btn-danger"> <a href="{% url 'hrapplications:personal_removal' personal_app.id %}" class="btn btn-danger">
<span class="glyphicon glyphicon-remove"></span> <i class="fa-solid fa-trash-can"></i>
</a> </a>
{% endif %} {% endif %}
</td> </td>
@ -55,23 +64,53 @@
{% endfor %} {% endfor %}
</table> </table>
</div> </div>
</div>
{% endif %} {% endif %}
{% if perms.auth.human_resources %} {% if perms.auth.human_resources %}
<h1 class="page-header text-center">{% translate "Application Management" %} <h1 class="page-header text-center mb-3">{% translate "Application Management" %}
<div class="text-end"> <div class="text-end">
<!-- Button trigger modal --> <!-- Button trigger modal -->
<button type="button" class="btn btn-primary btn-sm" data-toggle="modal" data-target="#myModal"> <button type="button" class="btn btn-primary btn-sm" data-bs-toggle="modal" data-bs-target="#modal-hr-search">
{% translate "Search Applications" %} {% translate "Search Applications" %}
</button> </button>
</div> </div>
</h1> </h1>
<ul class="nav nav-tabs">
<li class="active"><a data-toggle="tab" href="#pending">{% translate "Pending" %}</a></li> <div class="card card-default mt-4">
<li><a data-toggle="tab" href="#reviewed">{% translate "Reviewed" %}</a></li> <div class="card-body clearfix">
<ul class="nav nav-tabs" id="application-list" role="tablist">
<li class="nav-item" role="presentation">
<a
class="nav-link active"
id="pending"
data-bs-toggle="tab"
href="#tab-pending"
role="tab"
aria-controls="tab-pending"
aria-selected="true"
>
{% translate "Pending" %}
</a>
</li>
<li class="nav-item" role="presentation">
<a
class="nav-link"
id="reviewed"
data-bs-toggle="tab"
href="#tab-reviewed"
role="tab"
aria-controls="tab-reviewed"
aria-selected="false"
>
{% translate "Reviewed" %}
</a>
</li>
</ul> </ul>
<div class="tab-content">
<div id="pending" class="tab-pane fade in active panel panel-default"> <div class="tab-content" id="application-list-content">
<div class="panel-body"> <div id="tab-pending" class="tab-pane fade show active" role="tabpanel" aria-labelledby="tab-pending">
{% if applications %} {% if applications %}
<table class="table"> <table class="table">
<tr> <tr>
@ -82,6 +121,7 @@
<th class="text-center">{% translate "Status" %}</th> <th class="text-center">{% translate "Status" %}</th>
<th class="text-center">{% translate "Actions" %}</th> <th class="text-center">{% translate "Actions" %}</th>
</tr> </tr>
{% for app in applications %} {% for app in applications %}
<tr> <tr>
<td class="text-center">{{ app.created }}</td> <td class="text-center">{{ app.created }}</td>
@ -103,7 +143,7 @@
</td> </td>
<td class="text-center"> <td class="text-center">
<a href="{% url 'hrapplications:view' app.id %}" class="btn btn-primary"> <a href="{% url 'hrapplications:view' app.id %}" class="btn btn-primary">
<span class="glyphicon glyphicon-eye-open"></span> <i class="fa-solid fa-eye"></i>
</a> </a>
</td> </td>
</tr> </tr>
@ -113,9 +153,8 @@
<div class="alert alert-warning text-center">{% translate "No pending applications." %}</div> <div class="alert alert-warning text-center">{% translate "No pending applications." %}</div>
{% endif %} {% endif %}
</div> </div>
</div>
<div id="reviewed" class="tab-pane fade panel panel-default"> <div id="tab-reviewed" class="tab-pane fade" role="tabpanel" aria-labelledby="tab-reviewed">
<div class="panel-body">
{% if finished_applications %} {% if finished_applications %}
<table class="table"> <table class="table">
<tr> <tr>
@ -126,6 +165,7 @@
<th class="text-center">{% translate "Status" %}</th> <th class="text-center">{% translate "Status" %}</th>
<th class="text-center">{% translate "Actions" %}</th> <th class="text-center">{% translate "Actions" %}</th>
</tr> </tr>
{% for app in finished_applications %} {% for app in finished_applications %}
<tr> <tr>
<td class="text-center">{{ app.created }}</td> <td class="text-center">{{ app.created }}</td>
@ -147,11 +187,12 @@
</td> </td>
<td class="text-center"> <td class="text-center">
<a href="{% url 'hrapplications:view' app.id %}" class="btn btn-primary"> <a href="{% url 'hrapplications:view' app.id %}" class="btn btn-primary">
<span class="glyphicon glyphicon-eye-open"></span> <i class="fa-solid fa-eye"></i>
</a> </a>
{% if perms.hrapplications.delete_application %} {% if perms.hrapplications.delete_application %}
<a href="{% url 'hrapplications:remove' app.id %}" class="btn btn-danger"> <a href="{% url 'hrapplications:remove' app.id %}" class="btn btn-danger">
<span class="glyphicon glyphicon-remove"></span> <i class="fa-solid fa-trash-can"></i>
</a> </a>
{% endif %} {% endif %}
</td> </td>
@ -164,30 +205,9 @@
</div> </div>
</div> </div>
</div> </div>
</div>
{% endif %} {% endif %}
</div> </div>
{% if perms.auth.human_resources %} {% include "hrapplications/partials/modals/search.html" %}
<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">{% translate "Close" %}</span></button>
<h4 class="modal-title" id="myModalLabel">{% translate "Application Search" %}</h4>
</div>
<div class="modal-body">
<form class="form-signin" role="form" action="{% url 'hrapplications:search' %}" method="POST">
{% csrf_token %}
{{ search_form|bootstrap }}
<br>
<button class="btn btn-lg btn-primary btn-block" type="submit">{% translate "Search" %}</button>
</form>
</div>
<div class="modal-footer">
</div>
</div>
</div>
</div>
{% endif %}
{% endblock content %} {% endblock content %}

View File

@ -0,0 +1,32 @@
{% load django_bootstrap5 %}
{% load i18n %}
{% if perms.auth.human_resources %}
<!-- Modal -->
<div class="modal fade" id="modal-hr-search" tabindex="-1" aria-labelledby="modalHrSearch" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<div class="modal-title fs-5" id="modalHrSearchLabel">
{% translate "Application Search" %}
</div>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="{% translate 'Close' %}"></button>
</div>
<div class="modal-body">
<form class="form-signin" role="form" action="{% url 'hrapplications:search' %}" method="POST">
{% csrf_token %}
{% bootstrap_form search_form %}
<div class="form-group mt-3 clearfix">
{% translate "Search" as button_text %}
{% bootstrap_button button_class="btn btn-primary" content=button_text name="search" id="search" %}
</div>
</form>
</div>
</div>
</div>
</div>
{% endif %}

View File

@ -1,37 +1,47 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "HR Application Management" %}{% endblock page_title %} {% block page_title %}
{% block extra_css %}{% endblock extra_css %} {% translate "HR Application Management" %}
{% endblock page_title %}
{% block header_nav_brand %}
{% translate "HR Application Management" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div class="col-lg-12"> <div>
{% if perms.auth.human_resources %} {% if perms.auth.human_resources %}
<h1 class="page-header text-center">{% translate "Application Search Results" %} <h1 class="page-header text-center mb-3">
<div class="text-end"> {% translate "Application Search Results" %}
</h1>
<div class="text-end mb-3">
<!-- Button trigger modal --> <!-- Button trigger modal -->
<button type="button" class="btn btn-primary btn-sm" data-toggle="modal" data-target="#myModal"> <button type="button" class="btn btn-primary btn-sm" data-bs-toggle="modal" data-bs-target="#modal-hr-search">
{% translate "Search Applications" %} {% translate "Search Applications" %}
</button> </button>
</div> </div>
</h1>
<div class="container-fluid"> <div>
<table class="table table-bordered"> <table class="table">
<tr> <tr>
<th class="text-center">{% translate "Application ID" %}</th> <th>{% translate "Application ID" %}</th>
<th class="text-center">{% translate "Username" %}</th> <th>{% translate "Username" %}</th>
<th class="text-center">{% translate "Main Character" %}</th> <th>{% translate "Main Character" %}</th>
<th class="text-center">{% translate "Corporation" %}</th> <th>{% translate "Corporation" %}</th>
<th class="text-center">{% translate "Status" %}</th> <th class="text-center">{% translate "Status" %}</th>
<th class="text-center">{% translate "Actions" %}</th> <th class="text-end">{% translate "Actions" %}</th>
</tr> </tr>
{% for app in applications %} {% for app in applications %}
<tr> <tr>
<td class="text-center">{{ app.id }}</td> <td>{{ app.id }}</td>
<td class="text-center">{{ app.user }}</td> <td>{{ app.user }}</td>
<td class="text-center">{{ app.main_character }}</td> <td >{{ app.main_character }}</td>
<td class="text-center">{{ app.form.corp }}</td> <td>{{ app.form.corp }}</td>
<td class="text-center"> <td class="text-center">
{% if app.approved == None %} {% if app.approved == None %}
<div class="badge bg-warning">{% translate "Pending" %}</div> <div class="badge bg-warning">{% translate "Pending" %}</div>
@ -41,9 +51,9 @@
<div class="badge bg-danger">{% translate "Rejected" %}</div> <div class="badge bg-danger">{% translate "Rejected" %}</div>
{% endif %} {% endif %}
</td> </td>
<td class="text-center"> <td class="text-end">
<a href="{% url 'hrapplications:view' app.id %}" class="btn btn-primary"> <a href="{% url 'hrapplications:view' app.id %}" class="btn btn-primary">
<span class="glyphicon glyphicon-eye-open"></span> <i class="fa-solid fa-eye"></i>
</a> </a>
</td> </td>
</tr> </tr>
@ -53,27 +63,5 @@
{% endif %} {% endif %}
</div> </div>
{% if perms.auth.human_resources %} {% include "hrapplications/partials/modals/search.html" %}
<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">{% translate "Close" %}</span></button>
<h4 class="modal-title" id="myModalLabel">{% translate "Application Search" %}</h4>
</div>
<div class="modal-body">
<form class="form-signin" role="form" action="{% url 'hrapplications:search' %}" method="POST">
{% csrf_token %}
{{ search_form|bootstrap }}
<br>
<button class="btn btn-lg btn-primary btn-block" type="submit">{% translate "Search" %}</button>
</form>
</div>
<div class="modal-footer">
</div>
</div>
</div>
</div>
{% endif %}
{% endblock content %} {% endblock content %}

View File

@ -1,16 +1,21 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load bootstrap %}
{% load django_bootstrap5 %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "View Application" %}{% endblock page_title %} {% block page_title %}
{% block extra_css %}{% endblock extra_css %} {% translate "View Application" %}
{% endblock page_title %}
{% block header_nav_brand %}
{% translate "HR Application Management" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div class="col-lg-12"> <div>
<h1 class="page-header text-center">{% translate "View Application" %}</h1> <h1 class="page-header text-center mb-3">{% translate "View Application" %}</h1>
<div class="container-fluid">
<div class="col-md-6 col-md-offset-3"> <div>
<div class="row">
{% if app.approved %} {% if app.approved %}
<div class="alert alert-success text-center">{% translate "Approved" %}</div> <div class="alert alert-success text-center">{% translate "Approved" %}</div>
{% elif app.approved == False %} {% elif app.approved == False %}
@ -18,13 +23,18 @@
{% else %} {% else %}
<div class="alert alert-warning text-center">{% translate "Pending" %}</div> <div class="alert alert-warning text-center">{% translate "Pending" %}</div>
{% endif %} {% endif %}
{% if app.reviewer_str %} {% if app.reviewer_str %}
<div class="alert alert-info text-center">{% translate "Reviewer:" %} {{ app.reviewer_str }}</div> <div class="alert alert-info text-center">{% translate "Reviewer:" %} {{ app.reviewer_str }}</div>
{% endif %} {% endif %}
</div> </div>
<div class="row">
<div class="panel panel-info"> <div class="card mb-3">
<div class="panel-heading">{% translate "Applicant" %}</div> <div class="card-header bg-info">
<div class="card-title mb-0">{% translate "Applicant" %}</div>
</div>
<div class="card-body">
<table class="table"> <table class="table">
<tr> <tr>
<th class="text-center">{% translate "User" %}</th> <th class="text-center">{% translate "User" %}</th>
@ -36,49 +46,61 @@
</tr> </tr>
</table> </table>
</div> </div>
<div class="panel panel-info"> </div>
<div class="panel-heading">{% translate "Characters" %}</div>
<div class="card mb-3">
<div class="card-header bg-info">
<div class="card-title mb-0">{% translate "Characters" %}</div>
</div>
<div class="card-body">
<table class="table"> <table class="table">
<tr> <tr>
<th class="text-center"></th> <th></th>
<th class="text-center">{% translate "Name" %}</th> <th>{% translate "Name" %}</th>
<th class="text-center">{% translate "Corp" %}</th> <th>{% translate "Corporation" %}</th>
<th class="text-center">{% translate "Alliance" %}</th> <th>{% translate "Alliance" %}</th>
</tr> </tr>
{% for char in app.characters %} {% for char in app.characters %}
<tr> <tr>
<td class="text-center"> <td>
<img class="ra-avatar img-responsive img-circle" src="{{ char.portrait_url_32 }}" alt="{{ char.character_name }}"> <img class="ra-avatar img-responsive rounded-circle" src="{{ char.portrait_url_32 }}" alt="{{ char.character_name }}">
</td> </td>
<td class="text-center">{{ char.character_name }}</td> <td>{{ char.character_name }}</td>
<td class="text-center">{{ char.corporation_name }}</td> <td>{{ char.corporation_name }}</td>
<td class="text-center">{{ char.alliance_name }}</td> <td>{{ char.alliance_name }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>
</div> </div>
</div> </div>
<div class="row">
{% for response in responses %} {% for response in responses %}
<div class="panel panel-default"> <div class="card mb-3">
<div class="panel-heading">{{ response.question.title }}</div> <div class="card-header">
<div class="alert">{{ response.answer|linebreaksbr }}</div> <div class="card-title mb-0">{{ response.question.title }}</div>
</div>
<div class="card-body">{{ response.answer|linebreaksbr }}</div>
</div> </div>
{% endfor %} {% endfor %}
</div>
{% if buttons %} {% if buttons %}
{% if perms.auth.human_resources %} {% if perms.auth.human_resources %}
<div class="row"> <div class="card mb-3">
<div class="panel panel-primary"> <div class="card-header">
<div class="panel-heading">{% translate "Actions" %}</div> <div class="card-title mb-0">{% translate "Actions" %}</div>
<div class="panel-body text-center"> </div>
<div class="card-body text-center">
{% if app.approved == None %} {% if app.approved == None %}
{% if app.reviewer == user %} {% if app.reviewer == user %}
{% if perms.hrapplications.approve_application %} {% if perms.hrapplications.approve_application %}
<a href="{% url 'hrapplications:approve' app.id %}" class="btn btn-success">{% translate "Approve" %}</a> <a href="{% url 'hrapplications:approve' app.id %}" class="btn btn-success">{% translate "Approve" %}</a>
{% endif %} {% endif %}
{% if perms.hrapplications.reject_application %} {% if perms.hrapplications.reject_application %}
<a href="{% url 'hrapplications:reject' app.id %}" class="btn btn-danger">{% translate "Reject" %}</a> <a href="{% url 'hrapplications:reject' app.id %}" class="btn btn-warning">{% translate "Reject" %}</a>
{% endif %} {% endif %}
{% if perms.hrapplications.delete_application %} {% if perms.hrapplications.delete_application %}
<a href="{% url 'hrapplications:remove' app.id %}" class="btn btn-danger">{% translate "Delete" %}</a> <a href="{% url 'hrapplications:remove' app.id %}" class="btn btn-danger">{% translate "Delete" %}</a>
@ -87,63 +109,70 @@
<a href="{% url 'hrapplications:mark_in_progress' app.id %}" class="btn btn-warning">{% translate "Mark in Progress" %}</a> <a href="{% url 'hrapplications:mark_in_progress' app.id %}" class="btn btn-warning">{% translate "Mark in Progress" %}</a>
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if perms.hrapplications.add_applicationcomment %} {% if perms.hrapplications.add_applicationcomment %}
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#myModal">{% translate "Comment" %}</button> <button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#modal-hr-comment">{% translate "Comment" %}</button>
{% endif %} {% endif %}
</div> </div>
</div> </div>
</div>
<div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true"> <div class="card-group" id="accordion" role="tablist" aria-multiselectable="true">
<div class="panel panel-default"> <div class="card card-default">
<div class="panel-heading" role="tab" id="headingThree"> <div class="card-header">
<h4 class="panel-title"> <div class="card-title mb-0">
<a class="collapsed" data-toggle="collapse" data-parent="#accordion" href="#collapseThree" aria-expanded="false" aria-controls="collapseThree">
{% translate 'Comments' %} ({{ comments.count }}) {% translate 'Comments' %} ({{ comments.count }})
</a>
</h4>
</div> </div>
<div id="collapseThree" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingThree"> </div>
<div class="panel-body">
<div class="card-body">
{% if comments %}
{% for comment in comments %} {% for comment in comments %}
<div class="panel panel-default"> <div class="card card-default">
<div class="panel-heading" role="tab" id=""> <div class="card-header" role="tab" id="">
<div class="panel-title"> <div class="card-title mb-0 clearfix">
<div class="pull-right">{{ comment.created }}</div> <div class="float-md-end">{{ comment.created }}</div>
<div class="pull-left">{% if comment.user.profile.main_character %}{{ comment.user.profile.main_character }}{% else %}{{ comment.user }}{% endif %}</div> <div class="float-md-start">{% if comment.user.profile.main_character %}{{ comment.user.profile.main_character }}{% else %}{{ comment.user }}{% endif %}</div>
<div class="clearfix"></div>
</div> </div>
</div> </div>
<div class="panel-body">{{ comment.text|linebreaks }}</div> <div class="card-body">{{ comment.text|linebreaks }}</div>
</div> </div>
{% endfor %} {% endfor %}
{% else %}
<div class="alert alert-info">
{% translate "No comments" %}
</div> </div>
{% endif %}
</div> </div>
</div> </div>
</div> </div>
{% endif %} {% endif %}
{% endif %} {% endif %}
</div> </div>
</div>
</div>
{% if perms.hrapplications.add_applicationcomment %} {% if perms.hrapplications.add_applicationcomment %}
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> <div class="modal fade" id="modal-hr-comment" tabindex="-1" aria-labelledby="modalHrComment" aria-hidden="true">
<div class="modal-dialog"> <div class="modal-dialog">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<button type="button" class="close" data-dismiss="modal"> <div class="modal-title fs-5" id="modalHrCommentLabel">
<span aria-hidden="true">&times;</span><span class="sr-only">{% translate "Close" %}</span> {% translate "Add Comment" %}
</button>
<h4 class="modal-title" id="myModalLabel">{% translate "Add Comment" %}</h4>
</div> </div>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="{% translate 'Close' %}"></button>
</div>
<div class="modal-body"> <div class="modal-body">
<form class="form-signin" role="form" action="" method="POST"> <form class="form-signin" role="form" action="" method="POST">
{% csrf_token %} {% csrf_token %}
{{ comment_form|bootstrap }}
<br> {% bootstrap_form comment_form %}
<button class="btn btn-lg btn-primary btn-block" type="submit">{% translate "Add Comment" %}</button>
<div class="form-group mt-3 clearfix">
{% translate "Add comment" as button_text %}
{% bootstrap_button button_class="btn btn-primary" content=button_text name="addComment" id="addComment" %}
</div>
</form> </form>
</div> </div>
<div class="modal-footer"></div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -144,7 +144,7 @@ class MenuItem(models.Model):
"render": _render, "render": _render,
"text": mi.text, "text": mi.text,
"rank": mi.rank, "rank": mi.rank,
"classes": (mi.icon_classes if mi.icon_classes != "" else "fas fa-folder"), "classes": (mi.icon_classes if mi.icon_classes != "" else "fa-solid fa-folder"),
"hide": mi.hide "hide": mi.hide
} }

View File

@ -1,5 +1,6 @@
{% load i18n %} {% load i18n %}
{% load navactive %} {% load navactive %}
{% if not item.hide %} {% if not item.hide %}
<li class="d-flex flex-wrap m-2 p-2 pt-0 pb-0 mt-0 mb-0 me-0 pe-0"> <li class="d-flex flex-wrap m-2 p-2 pt-0 pb-0 mt-0 mb-0 me-0 pe-0">
<i class="nav-link {{ item.classes }} fa-fw align-self-center me-3 {% if item.navactive %}{% navactive request item.navactive|join:' ' %}{% endif %}" {% if item.items|length %} type="button" data-bs-toggle="collapse" data-bs-target="#id-{{ item.text|slugify }}" aria-expanded="false" aria-controls="" {% endif %}></i> <i class="nav-link {{ item.classes }} fa-fw align-self-center me-3 {% if item.navactive %}{% navactive request item.navactive|join:' ' %}{% endif %}" {% if item.items|length %} type="button" data-bs-toggle="collapse" data-bs-target="#id-{{ item.text|slugify }}" aria-expanded="false" aria-controls="" {% endif %}></i>
@ -7,6 +8,7 @@
href="{% if item.url_name %}{% url item.url_name %}{% else %}{{ item.url }}{% endif %}"> href="{% if item.url_name %}{% url item.url_name %}{% else %}{{ item.url }}{% endif %}">
{% translate item.text %} {% translate item.text %}
</a> </a>
{% if item.count >= 1 %} {% if item.count >= 1 %}
<span class="badge bg-primary m-2 align-self-center {% if item.items|length == 0 %}me-4{% endif %}"> <span class="badge bg-primary m-2 align-self-center {% if item.items|length == 0 %}me-4{% endif %}">
{{ item.count }} {{ item.count }}
@ -14,13 +16,16 @@
{% elif item.url %} {% elif item.url %}
<span class="pill m-2 me-4 align-self-center fas fa-external-link-alt"></span> <span class="pill m-2 me-4 align-self-center fas fa-external-link-alt"></span>
{% endif %} {% endif %}
{% if item.items|length > 0 %} {% if item.items|length > 0 %}
<span class="pill m-2 me-4 align-self-center fas fa-solid fa-chevron-down" <span
class="pill m-2 me-4 align-self-center fas fa-solid fa-chevron-down"
type="button" type="button"
data-bs-toggle="collapse" data-bs-toggle="collapse"
data-bs-target="#id-{{ item.text|slugify }}" data-bs-target="#id-{{ item.text|slugify }}"
aria-expanded="false" aria-expanded="false"
aria-controls=""></span> aria-controls="">
</span>
<!--<hr class="m-0 w-100">--> <!--<hr class="m-0 w-100">-->
<ul class="collapse ps-1 w-100 border-start rounded-start border-light border-3" id="id-{{ item.text|slugify }}"> <ul class="collapse ps-1 w-100 border-start rounded-start border-light border-3" id="id-{{ item.text|slugify }}">
{% for sub_item in item.items %} {% for sub_item in item.items %}

View File

@ -1,15 +1,13 @@
{% load i18n %} {% load i18n %}
{% load navactive %} {% load navactive %}
{% load auth_notifications %} {% load auth_notifications %}
<li class="nav-item {% navactive request 'notifications:' %}"
id="menu_item_notifications"> <li class="nav-item {% navactive request 'notifications:' %}" id="menu_item_notifications">
<a class="nav-link" <a class="nav-link" href="{% url 'notifications:list' %}">
href="{% url 'notifications:list' %}">
<span class="fa">
{% with unread_count=request.user|user_unread_notification_count %} {% with unread_count=request.user|user_unread_notification_count %}
<i class="fas fa-bell{% if unread_count %} text-danger{% endif %}"></i> <i class="fa-solid fa-bell{% if unread_count %} text-danger{% endif %}"></i>
{% endwith %} {% endwith %}
</span>
<span class="d-lg-none d-md-inline m-2"> <span class="d-lg-none d-md-inline m-2">
{% translate "Notifications" %} {% translate "Notifications" %}
</span> </span>

View File

@ -9,6 +9,7 @@
<div class="p-2 position-relative m-2"> <div class="p-2 position-relative m-2">
<img class="rounded-circle" src="{{ main.character_id|character_portrait_url:64 }}" alt="{{ main.character_name }}"> <img class="rounded-circle" src="{{ main.character_id|character_portrait_url:64 }}" alt="{{ main.character_name }}">
<img class="rounded-circle position-absolute bottom-0 start-0" src="{{ main.corporation_logo_url_32 }}" alt="{{ main.corporation_name }}"> <img class="rounded-circle position-absolute bottom-0 start-0" src="{{ main.corporation_logo_url_32 }}" alt="{{ main.corporation_name }}">
{% if main.alliance_id %} {% if main.alliance_id %}
<img class="rounded-circle position-absolute bottom-0 end-0" src="{{ main.alliance_logo_url_32 }}" alt="{{ main.alliance_name }}"> <img class="rounded-circle position-absolute bottom-0 end-0" src="{{ main.alliance_logo_url_32 }}" alt="{{ main.alliance_name }}">
{% elif main.faction_id %} {% elif main.faction_id %}

View File

@ -14,6 +14,7 @@
{% translate "Dashboard" %} {% translate "Dashboard" %}
</a> </a>
</li> </li>
{% sorted_menu_items %} {% sorted_menu_items %}
</ul> </ul>
{% endif %} {% endif %}

View File

@ -1,4 +1,5 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load static %} {% load static %}
{% load i18n %} {% load i18n %}
@ -17,6 +18,7 @@
<span class="badge bg-secondary">{{ unread|length }}</span> <span class="badge bg-secondary">{{ unread|length }}</span>
</a> </a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" id="read-tab" data-bs-toggle="tab" data-bs-target="#read" type="button" role="tab" aria-controls="read" aria-selected="false"> <a class="nav-link" id="read-tab" data-bs-toggle="tab" data-bs-target="#read" type="button" role="tab" aria-controls="read" aria-selected="false">
{% translate "Read" %} {% translate "Read" %}
@ -28,12 +30,13 @@
{% block header_nav_collapse_right %} {% block header_nav_collapse_right %}
<li class="nav-item"> <li class="nav-item">
<a href="{% url 'notifications:mark_all_read' %}" class="nav-link" title="{% translate 'Mark all notifications as read' %}"> <a href="{% url 'notifications:mark_all_read' %}" class="nav-link" title="{% translate 'Mark all notifications as read' %}">
<i class="fas fa-check-double"></i> <i class="fa-solid fa-check-double"></i>
</a> </a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a href="{% url 'notifications:delete_all_read' %}" class="nav-link" title="{% translate 'Delete all read notifications' %}"> <a href="{% url 'notifications:delete_all_read' %}" class="nav-link" title="{% translate 'Delete all read notifications' %}">
<i class="fas fa-trash"></i> <i class="fa-solid fa-trash-can"></i>
</a> </a>
</li> </li>
{% endblock %} {% endblock %}

View File

@ -7,16 +7,18 @@
<th>{% translate "Title" %}</th> <th>{% translate "Title" %}</th>
<th class="text-end">{% translate "Action" %}</th> <th class="text-end">{% translate "Action" %}</th>
</tr> </tr>
{% for notif in notifications %} {% for notif in notifications %}
<tr class="table-{{ notif.level }}"> <tr class="table-{{ notif.level }}">
<td>{{ notif.timestamp }}</td> <td>{{ notif.timestamp }}</td>
<td>{{ notif.title }}</td> <td>{{ notif.title }}</td>
<td class="text-end"> <td class="text-end">
<a href="{% url 'notifications:view' notif.id %}" class="btn btn-primary btn-sm" title="View"> <a href="{% url 'notifications:view' notif.id %}" class="btn btn-primary btn-sm" title="View">
<span class="fas fa-eye"></span> <span class="fa-solid fa-eye"></span>
</a> </a>
<a href="{% url 'notifications:remove' notif.id %}" class="btn btn-danger btn-sm" title="Remove"> <a href="{% url 'notifications:remove' notif.id %}" class="btn btn-danger btn-sm" title="Remove">
<span class="fas fa-trash"></span> <span class="fa-solid fa-trash-can"></span>
</a> </a>
</td> </td>
</tr> </tr>

View File

@ -32,7 +32,7 @@ def register_url():
class NextOpsHook(hooks.DashboardItemHook): class NextOpsHook(hooks.DashboardItemHook):
def __init__(self): #TODO add the view permms so if they cant see it is not rendered def __init__(self): #TODO add the view perms so if they cant see it is not rendered
hooks.DashboardItemHook.__init__( hooks.DashboardItemHook.__init__(
self, self,
dashboard_ops, dashboard_ops,

View File

@ -3,6 +3,7 @@ Form Widgets
""" """
from django import forms from django import forms
from django.utils.safestring import mark_safe
class DataListWidget(forms.TextInput): class DataListWidget(forms.TextInput):
@ -42,4 +43,4 @@ class DataListWidget(forms.TextInput):
data_list += "</datalist>" data_list += "</datalist>"
return text_html + data_list return mark_safe(text_html + data_list)

View File

@ -1,47 +1,65 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load bootstrap %}
{% load django_bootstrap5 %}
{% load i18n %} {% load i18n %}
{% get_current_language as LANGUAGE_CODE %} {% get_current_language as LANGUAGE_CODE %}
{% block page_title %}{% translate "Create Operation" %}{% endblock page_title %} {% block page_title %}
{% translate "Create Operation" %}
{% endblock page_title %}
{% block header_nav_brand %}
{% translate "Fleet Operation Timers" %}
{% endblock header_nav_brand %}
{% block extra_css %} {% block extra_css %}
{% include 'bundles/jquery-datetimepicker-css.html' %} {% include 'bundles/jquery-datetimepicker-css.html' %}
{% endblock extra_css %} {% endblock extra_css %}
{% block content %} {% block content %}
<div class="col-lg-12"> <div>
<h1 class="page-header text-center">{% translate "Create Fleet Operation" %}</h1> <h1 class="page-header text-center mb-3">
{% translate "Create Fleet Operation" %}
</h1>
<div class="container-fluid"> <div class="card card-primary border-0">
<div class="col-md-4 col-md-offset-4"> <div class="card-header">
<div class="row"> <div class="card-title mb-0">
<form class="form-signin" role="form" action="" method="POST"> {% translate "Fleet operation details" %}
</div>
</div>
<div class="card-body">
<div class="row justify-content-center">
<div class="col-md-6">
<form role="form" action="" method="POST">
{% csrf_token %} {% csrf_token %}
{{ form|bootstrap }}
<br> {% bootstrap_form form %}
<button class="btn btn-lg btn-primary btn-block" type="submit">{% translate "Create Fleet Operation" %}</button>
<div class="form-group mt-3 clearfix">
{% translate "Create fleet operation" as button_text %}
{% bootstrap_button button_class="btn btn-primary" content=button_text %}
</div>
</form> </form>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
{% endblock content %} {% endblock content %}
{% block extra_javascript %} {% block extra_javascript %}
{% include 'bundles/jquery-datetimepicker-js.html' %} {% include 'bundles/jquery-datetimepicker-js.html' %}
{% endblock %}
{% block extra_script %} <script>
$(document).ready(() => {
$('#id_start').datetimepicker({ $('#id_start').datetimepicker({
setlocale: '{{ LANGUAGE_CODE }}', setlocale: '{{ LANGUAGE_CODE }}',
{% if NIGHT_MODE %}
theme: 'dark',
{% else %}
theme: 'default',
{% endif %}
mask: true, mask: true,
format: 'Y-m-d H:i', format: 'Y-m-d H:i',
minDate: 0 minDate: 0
}); });
{% endblock extra_script %} });
</script>
{% endblock %}

View File

@ -1,10 +1,11 @@
{% load i18n %} {% load i18n %}
{% load evelinks %} {% load evelinks %}
<div class="col-12 col-xl-6 align-self-stretch p-2"> <div class="col-12 align-self-stretch py-2">
<div class="card h-100"> <div class="card h-100">
<div class="card-body"> <div class="card-body">
<h4 class="card-title text-center">{% translate "Upcoming Fleets" %}</h4> <h4 class="card-title text-center">{% translate "Upcoming Fleets" %}</h4>
<div class="card-body"> <div class="card-body">
<div style="height: 300px; overflow-y:auto;"> <div style="height: 300px; overflow-y:auto;">
<table class="table"> <table class="table">
@ -16,6 +17,7 @@
<th class="text-center">{% translate "Start Time" %}</th> <th class="text-center">{% translate "Start Time" %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for ops in timers %} {% for ops in timers %}
<tr> <tr>
@ -23,7 +25,7 @@
{{ ops.operation_name }} {{ ops.operation_name }}
</td> </td>
<td class="text-center"> <td class="text-center">
({{ ops.type }}) {{ ops.type }}
</td> </td>
<td class="text-center"> <td class="text-center">
<a href="{{ ops.system|dotlan_solar_system_url }}">{{ ops.system }}</a> <a href="{{ ops.system|dotlan_solar_system_url }}">{{ ops.system }}</a>

View File

@ -14,17 +14,20 @@
<th>{% translate "Local Time" %}</th> <th>{% translate "Local Time" %}</th>
<th>{% translate "Duration" %}</th> <th>{% translate "Duration" %}</th>
<th>{% translate "FC" %}</th> <th>{% translate "FC" %}</th>
{% if perms.auth.optimer_management %} {% if perms.auth.optimer_management %}
{# <th>{% translate "Creator" %}</th>#} {# <th>{% translate "Creator" %}</th>#}
<th class="text-end" style="width: 150px;">{% translate "Action" %}</th> <th class="text-end" style="width: 150px;">{% translate "Action" %}</th>
{% endif %} {% endif %}
</tr> </tr>
</thead> </thead>
{% for ops in timers %} {% for ops in timers %}
<tbody> <tbody>
<tr> <tr>
<td> <td>
{{ ops.operation_name }} {{ ops.operation_name }}
{% if ops.type %} {% if ops.type %}
<br>({{ ops.type }}) <br>({{ ops.type }})
{% endif %} {% endif %}
@ -38,15 +41,16 @@
<td nowrap><div id="localtime{{ ops.id }}"></div><div id="countdown{{ ops.id }}"></div></td> <td nowrap><div id="localtime{{ ops.id }}"></div><div id="countdown{{ ops.id }}"></div></td>
<td>{{ ops.duration }}</td> <td>{{ ops.duration }}</td>
<td>{{ ops.fc }}</td> <td>{{ ops.fc }}</td>
{% if perms.auth.optimer_management %} {% if perms.auth.optimer_management %}
{# <td>{{ ops.eve_character }}</td>#} {# <td>{{ ops.eve_character }}</td>#}
<td class="text-end"> <td class="text-end">
<a href="{% url 'optimer:remove' ops.id %}" class="btn btn-danger"> <a href="{% url 'optimer:remove' ops.id %}" class="btn btn-danger">
<span class="glyphicon glyphicon-remove"></span> <i class="fa-solid fa-trash-can"></i>
</a> </a>
<a href="{% url 'optimer:edit' ops.id %}" class="btn btn-info"> <a href="{% url 'optimer:edit' ops.id %}" class="btn btn-info">
<span class="glyphicon glyphicon-pencil"></span> <i class="fa-solid fa-pen-to-square"></i>
</a> </a>
</td> </td>
{% endif %} {% endif %}

View File

@ -1,49 +1,70 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load i18n %} {% load i18n %}
{% get_current_language as LANGUAGE_CODE %} {% get_current_language as LANGUAGE_CODE %}
{% block page_title %}{% translate "Fleet Operation Management" %}{% endblock page_title %} {% block page_title %}
{% block extra_css %}{% endblock extra_css %} {% translate "Fleet Operation Management" %}
{% endblock page_title %}
{% block header_nav_brand %}
{% translate "Fleet Operation Timers" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div class="col-lg-12"> <div>
<h1 class="page-header text-center">{% translate "Fleet Operation Timers" %}
<div class="text-end"> <div class="text-end">
{% if perms.auth.optimer_management %} {% if perms.auth.optimer_management %}
<a href="{% url 'optimer:add' %}" class="btn btn-success">{% translate "Create Operation" %}</a> <a href="{% url 'optimer:add' %}" class="btn btn-success">{% translate "Create Operation" %}</a>
{% endif %} {% endif %}
</div> </div>
</h1>
<div class="col-lg-12 text-center row"> <div class="text-center mb-3">
<div class="badge bg-info text-start"> <div class="badge bg-info text-start">
<b>{% translate "Current Eve Time:" %}</b> <b>{% translate "Current Eve Time:" %}</b>
<span id="current-time"></span>
</div> </div>
<strong class="badge bg-info text-start" id="current-time"></strong>
<br>
</div> </div>
<h4><b>{% translate "Next Fleet Operations" %}</b></h4> <div class="card mb-3">
<div class="card-header">
<div class="card-title mb-0">
{% translate "Next Fleet Operations" %}
</div>
</div>
<div class="card-body">
{% if future_timers %} {% if future_timers %}
{% include "optimer/fleetoptable.html" with timers=future_timers %} {% include "optimer/fleetoptable.html" with timers=future_timers %}
{% else %} {% else %}
<div class="alert alert-warning text-center">{% translate "No upcoming timers." %}</div> <div class="alert alert-warning text-center">{% translate "No upcoming timers." %}</div>
{% endif %} {% endif %}
</div>
</div>
<h4><b>{% translate "Past Fleet Operations" %}</b></h4> <div class="card mb-3">
<div class="card-header">
<div class="card-title mb-0">
{% translate "Past Fleet Operations" %}
</div>
</div>
<div class="card-body">
{% if past_timers %} {% if past_timers %}
{% include "optimer/fleetoptable.html" with timers=past_timers %} {% include "optimer/fleetoptable.html" with timers=past_timers %}
{% else %} {% else %}
<div class="alert alert-warning text-center">{% translate "No past timers." %}</div> <div class="alert alert-warning text-center">{% translate "No past timers." %}</div>
{% endif %} {% endif %}
</div> </div>
</div>
</div>
{% include 'bundles/moment-js.html' with locale=True %} {% include 'bundles/moment-js.html' with locale=True %}
{% include 'bundles/timers-js.html' %} {% include 'bundles/timers-js.html' %}
<script> <script>
// Data // Data
let timers = [ const timers = [
{% for op in optimer %} {% for op in optimer %}
{ {
'id': {{ op.id }}, 'id': {{ op.id }},
@ -57,9 +78,9 @@
* Update a timer * Update a timer
* @param timer Timer information * @param timer Timer information
*/ */
let updateTimer = function (timer) { const updateTimer = (timer) => {
if (timer.start.isAfter(Date.now())) { if (timer.start.isAfter(Date.now())) {
let duration = moment.duration(timer.start - moment(), 'milliseconds'); const duration = moment.duration(timer.start - moment(), 'milliseconds');
document.getElementById("countdown" + timer.id).innerHTML = getDurationString(duration); document.getElementById("countdown" + timer.id).innerHTML = getDurationString(duration);
} else { } else {
@ -69,10 +90,13 @@
} }
}; };
let updateAllTimers = function () { /**
let l = timers.length; * Update all timers
*/
const updateAllTimers = () => {
const l = timers.length;
for (var i=0; i < l; ++i) { for (let i=0; i < l; ++i) {
if (timers[i].expired) continue; if (timers[i].expired) continue;
updateTimer(timers[i]); updateTimer(timers[i]);
@ -83,26 +107,30 @@
* Set the local time info for the timer * Set the local time info for the timer
* @param timer Timer information * @param timer Timer information
*/ */
let setLocalTime = function (timer) { const setLocalTime = (timer) => {
document.getElementById("localtime" + timer.id).innerHTML = timer.start.format("ddd @ LT"); document.getElementById("localtime" + timer.id).innerHTML = timer.start.format("ddd @ LT");
}; };
/** /**
* Set all local time fields * Set all local time fields
*/ */
let setAllLocalTimes = function () { const setAllLocalTimes = () => {
let l = timers.length; const l = timers.length;
for (var i=0; i < l; ++i) { for (let i=0; i < l; ++i) {
setLocalTime(timers[i]); setLocalTime(timers[i]);
} }
}; };
let updateClock = function () { /**
* Get the current Eve time as a string
* @returns {string} Eve time string
*/
const updateClock = () => {
document.getElementById("current-time").innerHTML = getCurrentEveTimeString(); document.getElementById("current-time").innerHTML = getCurrentEveTimeString();
}; };
let timedUpdate = function () { const timedUpdate = () => {
updateClock(); updateClock();
updateAllTimers(); updateAllTimers();
}; };

View File

@ -1,57 +1,65 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load bootstrap %}
{% load django_bootstrap5 %}
{% load i18n %} {% load i18n %}
{% get_current_language as LANGUAGE_CODE %} {% get_current_language as LANGUAGE_CODE %}
{% block page_title %}{% translate "Update Fleet Operation" %}{% endblock page_title %} {% block page_title %}
{% translate "Update Fleet Operation" %}
{% endblock page_title %}
{% block header_nav_brand %}
{% translate "Fleet Operation Timers" %}
{% endblock header_nav_brand %}
{% block extra_css %} {% block extra_css %}
{% include 'bundles/jquery-datetimepicker-css.html' %} {% include 'bundles/jquery-datetimepicker-css.html' %}
{% endblock extra_css %} {% endblock extra_css %}
{% block content %} {% block content %}
<div>
<h1 class="page-header text-center mb-3">
{% translate "Update Fleet Operation" %}
</h1>
<div class="col-lg-12"> <div class="card card-primary border-0">
<h1 class="page-header text-center">{% translate "Update Fleet Operation" %}</h1> <div class="card-header">
<div class="card-title mb-0">
{% translate "Fleet operation details" %}
</div>
</div>
<div class="container-fluid"> <div class="card-body">
<div class="col-md-4 col-md-offset-4"> <div class="row justify-content-center">
<div class="row"> <div class="col-md-6">
{% if no_fleet_id %} <form role="form" action="" method="POST">
<div class="alert alert-danger" role="alert">{% translate "Fleet Operation Does Not Exist" %}</div>
{% else %}
<form class="form-signin" role="form" action="" method="POST">
{% csrf_token %} {% csrf_token %}
{{ form|bootstrap }}
<br> {% bootstrap_form form %}
<button class="btn btn-lg btn-primary btn-block" type="submit">{% translate "Update Fleet Operation" %}
</button> <div class="form-group mt-3 clearfix">
{% translate "Update fleet operation" as button_text %}
{% bootstrap_button button_class="btn btn-primary" content=button_text %}
</div>
</form> </form>
{% endif %}
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
{% endblock content %} {% endblock content %}
{% block extra_javascript %} {% block extra_javascript %}
{% include 'bundles/jquery-datetimepicker-js.html' %} {% include 'bundles/jquery-datetimepicker-js.html' %}
{% endblock %}
{% block extra_script %}
<script>
$(document).ready(() => {
$('#id_start').datetimepicker({ $('#id_start').datetimepicker({
setlocale: '{{ LANGUAGE_CODE }}', setlocale: '{{ LANGUAGE_CODE }}',
{% if NIGHT_MODE %}
theme: 'dark',
{% else %}
theme: 'default',
{% endif %}
mask: true, mask: true,
format: 'Y-m-d H:i', format: 'Y-m-d H:i',
minDate: 0 minDate: 0
}); });
});
{% endblock extra_script %} </script>
{% endblock %}

View File

@ -18,6 +18,15 @@ logger = logging.getLogger(__name__)
@login_required @login_required
@permission_required('auth.optimer_view') @permission_required('auth.optimer_view')
def optimer_view(request): def optimer_view(request):
"""
View for the optimer management page
:param request:
:type request:
:return:
:rtype:
"""
logger.debug("optimer_view called by user %s" % request.user) logger.debug("optimer_view called by user %s" % request.user)
base_query = OpTimer.objects.select_related('eve_character', 'type') base_query = OpTimer.objects.select_related('eve_character', 'type')
render_items = {'optimer': base_query.all(), render_items = {'optimer': base_query.all(),
@ -32,7 +41,17 @@ def optimer_view(request):
@login_required @login_required
@permission_required('auth.optimer_management') @permission_required('auth.optimer_management')
def add_optimer_view(request): def add_optimer_view(request):
"""
View for the add optimer page
:param request:
:type request:
:return:
:rtype:
"""
logger.debug("add_optimer_view called by user %s" % request.user) logger.debug("add_optimer_view called by user %s" % request.user)
if request.method == 'POST': if request.method == 'POST':
form = OpForm(request.POST, data_list=OpTimerType.objects.all()) form = OpForm(request.POST, data_list=OpTimerType.objects.all())
logger.debug("Request type POST contains form valid: %s" % form.is_valid()) logger.debug("Request type POST contains form valid: %s" % form.is_valid())
@ -81,19 +100,43 @@ def add_optimer_view(request):
@login_required @login_required
@permission_required('auth.optimer_management') @permission_required('auth.optimer_management')
def remove_optimer(request, optimer_id): def remove_optimer(request, optimer_id):
"""
Remove optimer
:param request:
:type request:
:param optimer_id:
:type optimer_id:
:return:
:rtype:
"""
logger.debug(f"remove_optimer called by user {request.user} for operation id {optimer_id}") logger.debug(f"remove_optimer called by user {request.user} for operation id {optimer_id}")
op = get_object_or_404(OpTimer, id=optimer_id) op = get_object_or_404(OpTimer, id=optimer_id)
op.delete() op.delete()
logger.info(f"Deleting optimer id {optimer_id} by user {request.user}") logger.info(f"Deleting optimer id {optimer_id} by user {request.user}")
messages.success(request, _('Removed operation timer for %(opname)s.') % {"opname": op.operation_name}) messages.success(request, _('Removed operation timer for %(opname)s.') % {"opname": op.operation_name})
return redirect("optimer:view") return redirect("optimer:view")
@login_required @login_required
@permission_required('auth.optimer_management') @permission_required('auth.optimer_management')
def edit_optimer(request, optimer_id): def edit_optimer(request, optimer_id):
"""
Edit optimer
:param request:
:type request:
:param optimer_id:
:type optimer_id:
:return:
:rtype:
"""
logger.debug(f"edit_optimer called by user {request.user} for optimer id {optimer_id}") logger.debug(f"edit_optimer called by user {request.user} for optimer id {optimer_id}")
op = get_object_or_404(OpTimer, id=optimer_id) op = get_object_or_404(OpTimer, id=optimer_id)
if request.method == 'POST': if request.method == 'POST':
form = OpForm(request.POST, data_list=OpTimerType.objects.all()) form = OpForm(request.POST, data_list=OpTimerType.objects.all())
logger.debug("Received POST request containing update optimer form, is valid: %s" % form.is_valid()) logger.debug("Received POST request containing update optimer form, is valid: %s" % form.is_valid())
@ -141,8 +184,18 @@ def edit_optimer(request, optimer_id):
def dashboard_ops(request): def dashboard_ops(request):
"""
Returns the next five upcoming ops for the dashboard
:param request:
:type request:
:return:
:rtype:
"""
base_query = OpTimer.objects.select_related('eve_character', 'type') base_query = OpTimer.objects.select_related('eve_character', 'type')
timers = base_query.filter(start__gte=timezone.now())[:5] timers = base_query.filter(start__gte=timezone.now())[:5]
if timers.count(): if timers.count():
context = { context = {
'timers': timers, 'timers': timers,

View File

@ -1,18 +1,29 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load i18n %} {% load i18n %}
{% block page_title %} {% block page_title %}
{{ permission.permission.codename }} - {% translate "Permissions Audit" %} {{ permission.permission.codename }} - {% translate "Permissions Audit" %}
{% endblock page_title %} {% endblock page_title %}
{% block header_nav_brand %}
{% translate "Permissions Audit" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div> <div>
<h1 class="page-header">{% translate "Permissions Audit" %}: {{ permission.permission.codename }}</h1> <h1 class="page-header md-3">
{% translate "Permissions Audit" %}: {{ permission.permission.codename }}
</h1>
<p> <p>
<a href="{% url 'permissions_tool:overview' %}" class="btn btn-primary"> <a href="{% url 'permissions_tool:overview' %}" class="btn btn-primary">
<i class="fa-solid fa-chevron-left"></i> {% translate "Back" %} <i class="fa-solid fa-chevron-left"></i> {% translate "Back" %}
</a> </a>
</p> </p>
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped" id="tab_permissions_audit"> <table class="table table-striped" id="tab_permissions_audit" style="width: 100%;">
<thead> <thead>
<tr> <tr>
<th scope="col">{% translate "Group" %}</th> <th scope="col">{% translate "Group" %}</th>
@ -44,14 +55,11 @@
{% endblock content %} {% endblock content %}
{% block extra_javascript %} {% block extra_javascript %}
{% include "bundles/datatables-js-bs5.html" %} {% include "bundles/datatables-js-bs5.html" %}
{% include "bundles/filterdropdown-js.html" %} {# {% include "bundles/filterdropdown-js.html" %}#}
{% endblock extra_javascript %}
{% block extra_css %} <script>
{% include "bundles/datatables-css-bs5.html" %} $(document).ready(() => {
{% endblock extra_css %} const groupColumn = 0;
{% block extra_script %}
$(document).ready(function () {
let groupColumn = 0;
$('#tab_permissions_audit').DataTable({ $('#tab_permissions_audit').DataTable({
columnDefs: [{ columnDefs: [{
@ -72,19 +80,17 @@
"stateSave": true, "stateSave": true,
"stateDuration": 0, "stateDuration": 0,
drawCallback: function (settings) { drawCallback: function (settings) {
let api = this.api(); const api = this.api();
let rows = api.rows({ const rows = api.rows({
page: 'current' page: 'current'
}).nodes(); }).nodes();
let last = null; let last = null;
api.column(groupColumn, { api.column(groupColumn, {
page: 'current' page: 'current'
}).data().each(function (group, i) { }).data().each((group, i) => {
if (last !== group) { if (last !== group) {
$(rows).eq(i).before( $(rows).eq(i).before(`<tr class="h5 table-primary"><td colspan="3">${group}</td></tr>`);
'<tr class="h4 table-secondary"><td colspan="3">' + group + '</td></tr>'
);
last = group; last = group;
} }
@ -92,4 +98,9 @@
} }
}); });
}); });
{% endblock extra_script %} </script>
{% endblock extra_javascript %}
{% block extra_css %}
{% include "bundles/datatables-css-bs5.html" %}
{% endblock extra_css %}

View File

@ -1,10 +1,14 @@
{% load evelinks %} {% load evelinks %}
{% load i18n %} {% load i18n %}
<tr> <tr>
<td>{{ type }}: {{ name }}</td> <td>{{ type }}: {{ name }}</td>
<td class="text-end"> <td class="text-end">
<img src="{{ user.profile.main_character|character_portrait_url:32 }}" class="img-circle" alt="{{ user.profile.main_character.character_name }}"></td> <img src="{{ user.profile.main_character|character_portrait_url:32 }}" class="img-circle" alt="{{ user.profile.main_character.character_name }}">
<td><strong>{{ user }}<br></strong>{{ user.profile.main_character.character_name }}</td> </td>
<td>
<strong>{{ user }}<br></strong>{{ user.profile.main_character.character_name }}
</td>
<td class="text-start"> <td class="text-start">
{% if user.profile.main_character %} {% if user.profile.main_character %}
<a href="{{ user.profile.main_character|dotlan_corporation_url }}" target="_blank">{{ user.profile.main_character.corporation_name }}</a> <a href="{{ user.profile.main_character|dotlan_corporation_url }}" target="_blank">{{ user.profile.main_character.corporation_name }}</a>

View File

@ -1,11 +1,17 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load i18n %} {% load i18n %}
{% block page_title %} {% block page_title %}
{% translate "Permissions Overview" %} {% translate "Permissions Overview" %}
{% endblock page_title %} {% endblock page_title %}
{% block header_nav_brand %}
{% translate "Permissions Audit" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div class="col-sm-12"> <div>
<h1 class="page-header">{% translate "Permissions Overview" %}</h1>
<p> <p>
{% if request.GET.all != 'yes' %} {% if request.GET.all != 'yes' %}
{% translate "Showing only applied permissions" %} {% translate "Showing only applied permissions" %}
@ -15,8 +21,9 @@
<a href="{% url 'permissions_tool:overview' %}?all=no" class="btn btn-primary">{% translate "Show Applied" %}</a> <a href="{% url 'permissions_tool:overview' %}?all=no" class="btn btn-primary">{% translate "Show Applied" %}</a>
{% endif %} {% endif %}
</p> </p>
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped" id="tab_permissions_overview"> <table class="table table-striped" id="tab_permissions_overview" style="width: 100%;">
<thead> <thead>
<tr> <tr>
<th scope="col">{% translate "App" %}</th> <th scope="col">{% translate "App" %}</th>
@ -28,6 +35,7 @@
<th scope="col">{% translate "States" %}</th> <th scope="col">{% translate "States" %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for perm in permissions %} {% for perm in permissions %}
<tr> <tr>
@ -49,16 +57,15 @@
</div> </div>
</div> </div>
{% endblock content %} {% endblock content %}
{% block extra_javascript %} {% block extra_javascript %}
{% include "bundles/datatables-js-bs5.html" %} {% include "bundles/datatables-js-bs5.html" %}
{% include "bundles/filterdropdown-js.html" %} {# {% include "bundles/filterdropdown-js.html" %}#}
{% endblock extra_javascript %}
{% block extra_css %} <script>
{% include "bundles/datatables-css-bs5.html" %} $(document).ready(() => {
{% endblock extra_css %} const groupColumn = 0;
{% block extra_script %}
$(document).ready(function () {
let groupColumn = 0;
$('#tab_permissions_overview').DataTable({ $('#tab_permissions_overview').DataTable({
columnDefs: [{ columnDefs: [{
"visible": false, "visible": false,
@ -70,7 +77,8 @@
[2, 'asc'] [2, 'asc']
], ],
filterDropDown: { filterDropDown: {
columns: [{ columns: [
{
idx: 0 idx: 0
}, },
{ {
@ -82,26 +90,27 @@
"stateSave": true, "stateSave": true,
"stateDuration": 0, "stateDuration": 0,
drawCallback: function(settings) { drawCallback: function(settings) {
let api = this.api(); const api = this.api();
let rows = api.rows({ const rows = api.rows({
page: 'current' page: 'current'
}).nodes(); }).nodes();
let last = null; let last = null;
api.column(groupColumn, { api.column(groupColumn, {
page: 'current' page: 'current'
}).data().each(function (group, i) { }).data().each((group, i) => {
if (last !== group) { if (last !== group) {
$(rows).eq(i).before( $(rows).eq(i).before(`<tr class="h5 table-primary"><td colspan="6">${group}</td></tr>`);
'
<tr class="h4 table-secondary">
<td colspan="6">' + group + '</td>
</tr>
'
);
last = group; last = group;
} }
}); });
} }
}); });
}); });
{% endblock extra_script %} </script>
{% endblock extra_javascript %}
{% block extra_css %}
{% include "bundles/datatables-css-bs5.html" %}
{% endblock extra_css %}

View File

@ -24,26 +24,26 @@
{% if not user_has_account %} {% if not user_has_account %}
{% if urls.auth_activate %} {% if urls.auth_activate %}
<a class="btn btn-warning" href="{% url urls.auth_activate %}" title="{% translate 'Activate' %}"> <a class="btn btn-warning" href="{% url urls.auth_activate %}" title="{% translate 'Activate' %}">
<span class="fas fa-check fa-fw"></span> <i class="fa-solid fa-check fa-fw"></i>
</a> </a>
{% endif %} {% endif %}
{% else %} {% else %}
{% if urls.auth_reset %} {% if urls.auth_reset %}
<a class="btn btn-primary" href="{% url urls.auth_reset %}" title="{% translate 'Reset Password' %}"> <a class="btn btn-primary" href="{% url urls.auth_reset %}" title="{% translate 'Reset Password' %}">
<span class="fas fa-sync fa-fw"></span> <i class="fa-solid fa-rotate fa-fw"></i>
</a> </a>
{% endif %} {% endif %}
{% if urls.auth_deactivate %} {% if urls.auth_deactivate %}
<a class="btn btn-danger" href="{% url urls.auth_deactivate %}" title="{% translate 'Deactivate' %}"> <a class="btn btn-danger" href="{% url urls.auth_deactivate %}" title="{% translate 'Deactivate' %}">
<span class="fas fa-times fa-fw"></span> <i class="fa-solid fa-xmark fa-fw"></i>
</a> </a>
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if request.user.is_superuser %} {% if request.user.is_superuser %}
<a class="btn btn-primary" type="button" id="btnLinkDiscordServer" href="{% url urls.auth_add_bot %}" title="{% translate 'Link Discord Server' %}"> <a class="btn btn-primary" type="button" id="btnLinkDiscordServer" href="{% url urls.auth_add_bot %}" title="{% translate 'Link Discord Server' %}">
<span class="fas fa-link fa-fw"></span> <i class="fa-solid fa-link fa-fw"></i>
</a> </a>
{% endif %} {% endif %}
{% endblock %} {% endblock %}

View File

@ -21,6 +21,6 @@
{% block controls %} {% block controls %}
<a class="btn btn-success" href="{{ DISCOURSE_URL }}" title="{% translate 'Go to forums' %}"> <a class="btn btn-success" href="{{ DISCOURSE_URL }}" title="{% translate 'Go to forums' %}">
<span class="fas fa-arrow-right fa-fw"></span> <i class="fa-solid fa-arrow-right fa-fw"></i>
</a> </a>
{% endblock %} {% endblock %}

View File

@ -18,31 +18,31 @@
{% if username == "" %} {% if username == "" %}
{% if urls.auth_activate %} {% if urls.auth_activate %}
<a class="btn btn-warning" href="{% url urls.auth_activate %}" title="{% translate 'Activate' %}"> <a class="btn btn-warning" href="{% url urls.auth_activate %}" title="{% translate 'Activate' %}">
<span class="fas fa-check fa-fw"></span> <i class="fa-solid fa-check fa-fw"></i>
</a> </a>
{% endif %} {% endif %}
{% else %} {% else %}
{% if urls.auth_set_password %} {% if urls.auth_set_password %}
<a class="btn btn-warning" href="{% url urls.auth_set_password %}" title="{% translate 'Set Password' %}"> <a class="btn btn-warning" href="{% url urls.auth_set_password %}" title="{% translate 'Set Password' %}">
<span class="fas fa-edit fa-fw"></span> <i class="fa-solid fa-pen-to-square fa-fw"></i>
</a> </a>
{% endif %} {% endif %}
{% if urls.auth_reset_password %} {% if urls.auth_reset_password %}
<a class="btn btn-primary" href="{% url urls.auth_reset_password %}" title="{% translate 'Reset Password' %}"> <a class="btn btn-primary" href="{% url urls.auth_reset_password %}" title="{% translate 'Reset Password' %}">
<span class="fas fa-sync fa-fw"></span> <i class="fa-solid fa-rotate fa-fw"></i>
</a> </a>
{% endif %} {% endif %}
{% if urls.auth_deactivate %} {% if urls.auth_deactivate %}
<a class="btn btn-danger" href="{% url urls.auth_deactivate %}" title="{% translate 'Deactivate' %}"> <a class="btn btn-danger" href="{% url urls.auth_deactivate %}" title="{% translate 'Deactivate' %}">
<span class="fas fa-times fa-fw"></span> <i class="fa-solid fa-xmark fa-fw"></i>
</a> </a>
{% endif %} {% endif %}
{% if connect_url %} {% if connect_url %}
<a class="btn btn-success" href="mumble://{{ connect_url }}" title="{% translate 'Connect' %}"> <a class="btn btn-success" href="mumble://{{ connect_url }}" title="{% translate 'Connect' %}">
<span class="fas fa-arrow-right fa-fw"></span> <i class="fa-solid fa-arrow-right fa-fw"></i>
</a> </a>
{% endif %} {% endif %}
{% endif %} {% endif %}

View File

@ -1,30 +1,47 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "Jabber Broadcast" %}{% endblock page_title %} {% block page_title %}
{% block extra_css %}{% endblock extra_css %} {% translate "Jabber Broadcast" %}
{% endblock page_title %}
{% block header_nav_brand %}
{% translate "Jabber Broadcast" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div class="col-lg-12"> <div>
<h1 class="page-header text-center">{% translate "Jabber Broadcast" %}</h1> <div class="card card-primary border-0">
<div class="card-header">
<div class="card-title mb-0">
{% translate "Jabber Broadcast" %}
</div>
</div>
<div class="container-fluid"> <div class="card-body">
<div class="col-md-4 col-md-offset-4"> <div class="row justify-content-center">
<div class="row"> <div class="col-md-6">
{% if success %} {% if success %}
<div class="alert alert-success" role="alert">{% translate "Broadcast Sent!!" %}</div> <div class="alert alert-success" role="alert">
{% translate "Broadcast Sent!!" %}
</div>
{% endif %} {% endif %}
<form class="form-signin" role="form" action="" method="POST" onsubmit="submitbutton.disabled = true; return true;">
<form role="form" action="" method="POST">
{% csrf_token %} {% csrf_token %}
{% bootstrap_form form %} {% bootstrap_form form %}
<br>
<button class="btn btn-lg btn-primary btn-block" name="submitbutton" type="submit">{% translate "Broadcast" %} <div class="form-group mt-3 clearfix">
</button> {% translate "Broadcast" as button_text %}
{% bootstrap_button button_class="btn btn-primary" content=button_text %}
</div>
</form> </form>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
{% endblock content %} {% endblock content %}

View File

@ -1,7 +1,9 @@
{% extends "admin/change_list.html" %} {% extends "admin/change_list.html" %}
{% load i18n %} {% load i18n %}
{% block object-tools-items %} {% block object-tools-items %}
{{ block.super }} {{ block.super }}
<li> <li>
<a href="{% url 'teamspeak3:admin_update_ts3_groups' %}" class="btn btn-high"> <a href="{% url 'teamspeak3:admin_update_ts3_groups' %}" class="btn btn-high">

View File

@ -1,4 +1,5 @@
{% extends "services/services_ctrl_base.html" %} {% extends "services/services_ctrl_base.html" %}
{% load i18n %} {% load i18n %}
{% block title %} {% block title %}
@ -20,20 +21,20 @@
{% block controls %} {% block controls %}
{% if authinfo.teamspeak3_uid == "" %} {% if authinfo.teamspeak3_uid == "" %}
<a href="{% url 'teamspeak3:activate' %}" title="Activate" class="btn btn-warning"> <a href="{% url 'teamspeak3:activate' %}" title="Activate" class="btn btn-warning">
<span class="fas fa-check fa-fw"></span> <i class="fa-solid fa-check fa-fw"></i>
</a> </a>
{% else %} {% else %}
<a href="{% url 'teamspeak3:verify' %}" title="Verify Client ID" class="btn btn-success"> <a href="{% url 'teamspeak3:verify' %}" title="Verify Client ID" class="btn btn-success">
<span class="far fa-sign-in fa-fw"></span> <i class="fa-solid fa-right-to-bracket fa-fw"></i>
</a> </a>
<a href="{% url 'teamspeak3:reset_perm' %}" title="Refresh Token" class="btn btn-primary"> <a href="{% url 'teamspeak3:reset_perm' %}" title="Refresh Token" class="btn btn-primary">
<span class="fas fa-sync fa-fw"></span> <i class="fa-solid fa-rotate fa-fw"></i>
</a> </a>
<a href="{% url 'teamspeak3:deactivate' %}" title="Deactivate" class="btn btn-danger"> <a href="{% url 'teamspeak3:deactivate' %}" title="Deactivate" class="btn btn-danger">
<span class="fas fa-times fa-fw"></span> <i class="fa-solid fa-xmark fa-fw"></i>
</a> </a>
<a href="ts3server://{{ TEAMSPEAK3_PUBLIC_URL }}?nickname={{ authinfo.teamspeak3_uid }}" title="Connect" class="btn btn-success"> <a href="ts3server://{{ TEAMSPEAK3_PUBLIC_URL }}?nickname={{ authinfo.teamspeak3_uid }}" title="Connect" class="btn btn-success">
<span class="fas fa-arrow-right fa-fw"></span> <i class="fa-solid fa-arrow-right fa-fw"></i>
</a> </a>
{% endif %} {% endif %}
{% endblock %} {% endblock %}

View File

@ -1,20 +1,25 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "Verify TeamSpeak3" %}{% endblock page_title %} {% block page_title %}{% translate "Verify TeamSpeak3" %}{% endblock page_title %}
{% block extra_css %}{% endblock extra_css %}
{% block content %} {% block content %}
<div class="col-lg-12"> <div class="col-lg-12">
<h1 class="page-header text-center">{% translate "Verify TeamSpeak3 Identity" %}</h1> <h1 class="page-header text-center mb-3">
<div class="container-fluid"> {% translate "Verify TeamSpeak3 Identity" %}
<div class="col-md-4 col-md-offset-4"> </h1>
<div class="row justify-content-center">
<div class="col-md-4">
<a href="ts3server://{{ public_url }}?token={{ authinfo.teamspeak3_perm_key }}&nickname={{ authinfo.teamspeak3_uid }}" class="btn btn-primary btn-block btn-lg" title="Join">{% translate "Join Server" %}</a> <a href="ts3server://{{ public_url }}?token={{ authinfo.teamspeak3_perm_key }}&nickname={{ authinfo.teamspeak3_uid }}" class="btn btn-primary btn-block btn-lg" title="Join">{% translate "Join Server" %}</a>
<br> <br>
<form class="form-signin" role="form" action="{% url 'teamspeak3:verify' %}" method="POST"> <form class="form-signin" role="form" action="{% url 'teamspeak3:verify' %}" method="POST">
{% csrf_token %} {% csrf_token %}
{% bootstrap_form form %} {% bootstrap_form form %}
<br> <br>
<button class="btn btn-lg btn-primary btn-block" type="submit">{% translate "Continue" %}</button> <button class="btn btn-lg btn-primary btn-block" type="submit">{% translate "Continue" %}</button>
</form> </form>

View File

@ -4,6 +4,7 @@
<li> <li>
<a class="{% navactive request item.navactive|join:' ' %}" href="{% url item.url_name %}"> <a class="{% navactive request item.navactive|join:' ' %}" href="{% url item.url_name %}">
<i class="{{ item.classes }}"></i> {% translate item.text %} <i class="{{ item.classes }}"></i> {% translate item.text %}
{% if item.count != None %} {% if item.count != None %}
<span class="badge">{{ item.count }}</span> <span class="badge">{{ item.count }}</span>
{% endif %} {% endif %}

View File

@ -2,30 +2,45 @@
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "Fleet Formatter Tool" %}{% endblock page_title %} {% block page_title %}
{% block extra_css %}{% endblock extra_css %} {% translate "Fleet Formatter Tool" %}
{% endblock page_title %}
{% block header_nav_brand %}
{% translate "Fleet Formatter Tool" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div class="col-lg-12"> <div>
<h1 class="page-header text-center">{% translate "Fleet Broadcast Formatter Tool" %}</h1> <div class="card card-primary border-0">
<div class="card-header">
<div class="card-title mb-0">
{% translate "Fleet Details" %}
</div>
</div>
<div class="container-fluid"> <div class="card-body">
<div class="col-md-6 col-md-offset-3"> <div class="row justify-content-center">
<div class="row"> <div class="col-md-6">
{% if generated != "" %} {% if generated != "" %}
<textarea class="form-control" rows="10" cols="60">{{ generated }} <div class="text-right mb-3">
</textarea> <textarea class="form-control" rows="10" cols="60">{{ generated }}</textarea>
</div>
{% endif %} {% endif %}
<form class="form-signin" role="form" action="" method="POST">
<form role="form" action="" method="POST">
{% csrf_token %} {% csrf_token %}
{% bootstrap_form form %} {% bootstrap_form form %}
<br>
<button class="btn btn-lg btn-primary btn-block" type="submit">{% translate "Format" %}</button> <div class="form-group mt-3 clearfix">
<br> {% translate "Format" as button_text %}
{% bootstrap_button button_class="btn btn-primary" content=button_text %}
</div>
</form> </form>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
{% endblock content %} {% endblock content %}

View File

@ -1,17 +1,21 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load i18n %}
{% load i18n %}
{% block page_title %} {% block page_title %}
{% blocktranslate with service_name=view.service_name|title %}Delete {{ service_name }} Account?{% endblocktranslate %} {% blocktranslate with service_name=view.service_name|title %}Delete {{ service_name }} Account?{% endblocktranslate %}
{% endblock page_title %} {% endblock page_title %}
{% block header_nav_brand %}
{% translate "Available Services" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div class="col-lg-12"> <div>
<h1 class="page-header text-center"> <h1 class="page-header text-center mb-3">
{% blocktranslate with service_name=view.service_name|title %}Delete {{ service_name }} Account?{% endblocktranslate %} {% blocktranslate with service_name=view.service_name|title %}Delete {{ service_name }} Account?{% endblocktranslate %}
</h1> </h1>
<div class="container">
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-md-4 align-self-center"> <div class="col-md-4 align-self-center">
<form action="" method="post"> <form action="" method="post">
@ -26,5 +30,4 @@
</div> </div>
</div> </div>
</div> </div>
</div>
{% endblock content %} {% endblock content %}

View File

@ -1,15 +1,24 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% blocktranslate with service_name=view.service_name|title %}{{ service_name }} Credentials{% endblocktranslate %}{% endblock page_title %} {% block page_title %}
{% blocktranslate with service_name=view.service_name|title %}{{ service_name }} Credentials{% endblocktranslate %}
{% endblock page_title %}
{% block header_nav_brand %}
{% translate "Available Services" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div class="col-lg-12"> <div class="col-lg-12">
<h1 class="page-header text-center">{% blocktranslate with service_name=view.service_name|title %}{{ service_name }} Credentials{% endblocktranslate %}</h1> <h1 class="page-header text-center mb-3">
<div class="container"> {% blocktranslate with service_name=view.service_name|title %}{{ service_name }} Credentials{% endblocktranslate %}
</h1>
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-md-4 align-self-center"> <div class="col-md-4 align-self-center">
<form class="form-signin"> <form>
{% for key, value in credentials.items %} {% for key, value in credentials.items %}
<div class="mb-3"> <div class="mb-3">
<label class="form-label" for="id_{{ key }}">{{ key|capfirst }}</label> <label class="form-label" for="id_{{ key }}">{{ key|capfirst }}</label>
@ -17,9 +26,9 @@
</div> </div>
{% endfor %} {% endfor %}
</form> </form>
<a href="{% url 'services:services' %}" class="btn btn-lg btn-block btn-primary" title="Continue">{% translate "Continue" %}</a> <a href="{% url 'services:services' %}" class="btn btn-lg btn-block btn-primary" title="Continue">{% translate "Continue" %}</a>
</div> </div>
</div> </div>
</div> </div>
</div>
{% endblock %} {% endblock %}

View File

@ -1,16 +1,25 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% blocktranslate with service_name=view.service_name|title %}{{ service_name }} Password Change{% endblocktranslate %}{% endblock page_title %} {% block page_title %}
{% blocktranslate with service_name=view.service_name|title %}{{ service_name }} Password Change{% endblocktranslate %}
{% endblock page_title %}
{% block header_nav_brand %}
{% translate "Available Services" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div class="col-lg-12"> <div>
<h1 class="page-header text-center">{% blocktranslate with service_name=view.service_name|title %}Set {{service_name}} Password{% endblocktranslate %}</h1> <h1 class="page-header text-center mb-3">
<div class="container"> {% blocktranslate with service_name=view.service_name|title %}Set {{service_name}} Password{% endblocktranslate %}
</h1>
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-md-4 align-self-center"> <div class="col-md-4 align-self-center">
<form class="form-signin" role="form" action="" method="POST" onsubmit="submitbutton.disabled = true; return true;"> <form role="form" action="" method="POST" onsubmit="submitbutton.disabled = true; return true;">
{% csrf_token %} {% csrf_token %}
{% bootstrap_form form %} {% bootstrap_form form %}
<br> <br>
@ -19,5 +28,4 @@
</div> </div>
</div> </div>
</div> </div>
</div>
{% endblock content %} {% endblock content %}

View File

@ -1,11 +1,13 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "Services Management" %}{% endblock page_title %} {% block page_title %}
{% block extra_css %}{% endblock extra_css %} {% translate "Services Management" %}
{% endblock page_title %}
{% block header_nav_brand %}{% translate "Available Services" %}{% endblock header_nav_brand %}
{% block header_nav_brand %}
{% translate "Available Services" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div class="d-flex py-2 pt-0 bd-highlight justify-content-center flex-wrap"> <div class="d-flex py-2 pt-0 bd-highlight justify-content-center flex-wrap">
@ -14,40 +16,40 @@
{% endfor %} {% endfor %}
</div> </div>
<div class="w-100 text-center"> <div class="mt-3">
<h4>Legend</h4> <h4 class="border-bottom">{% translate "Legend" %}</h4>
<div class="d-inline-flex bd-highlight justify-content-center flex-wrap"> <div class="d-inline-flex bd-highlight justify-content-center flex-wrap">
<div class="d-inline-flex m-3"> <div class="d-inline-flex align-items-center m-2">
<a title="Activate" class="btn btn-warning"> <span title="Activate" class="btn btn-warning btn-sm">
<span class="fas fa-check fa-fw"></span> <i class="fa-solid fa-check fa-fw"></i>
</a> </span>
<p class="m-2 p-0 align-self-center"> <p class="m-2 p-0 align-self-center">
{% translate "Click to activate the service for your user." %} {% translate "Click to activate the service for your user." %}
</p> </p>
</div> </div>
<div class="d-inline-flex m-3"> <div class="d-inline-flex align-items-center m-2">
<a title="Set Password" class="btn btn-warning"> <span title="Set Password" class="btn btn-warning btn-sm">
<span class="fas fa-edit fa-fw"></span> <i class="fa-solid fa-pen-to-square"></i>
</a> </span>
<p class="m-2 p-0 align-self-center"> <p class="m-2 p-0 align-self-center">
{% translate "Click to manually set your password." %} {% translate "Click to manually set your password." %}
</p> </p>
</div> </div>
<div class="d-inline-flex m-3"> <div class="d-inline-flex align-items-center m-2">
<a title="Reset Password" class="btn btn-primary"> <span title="Reset Password" class="btn btn-primary btn-sm">
<span class="fas fa-sync fa-fw"></span> <i class="fa-solid fa-rotate fa-fw"></i>
</a> </span>
<p class="m-2 p-0 align-self-center"> <p class="m-2 p-0 align-self-center">
{% translate "Click to randomly generate your password." %} {% translate "Click to randomly generate your password." %}
</p> </p>
</div> </div>
<div class="d-inline-flex m-3"> <div class="d-inline-flex align-items-center m-2">
<a title="Deactivate" class="btn btn-danger"> <span title="Deactivate" class="btn btn-danger btn-sm">
<span class="fas fa-times fa-fw"></span> <i class="fa-solid fa-xmark fa-fw"></i>
</a> </span>
<p class="m-2 p-0 align-self-center"> <p class="m-2 p-0 align-self-center">
{% translate "Click to deactivate the service for your user" %} {% translate "Click to deactivate the service for your user" %}
</p> </p>

View File

@ -1,4 +1,5 @@
{% extends "services/services_ctrl_base.html" %} {% extends "services/services_ctrl_base.html" %}
{% load i18n %} {% load i18n %}
{% block title %} {% block title %}
@ -13,23 +14,25 @@
{% if username == "" %} {% if username == "" %}
{% if urls.auth_activate %} {% if urls.auth_activate %}
<a href="{% url urls.auth_activate %}" title="Activate" class="btn btn-warning"> <a href="{% url urls.auth_activate %}" title="Activate" class="btn btn-warning">
<span class="fas fa-check fa-fw"></span> <i class="fa-solid fa-check fa-fw"></i>
</a> </a>
{% endif %} {% endif %}
{% else %} {% else %}
{% if urls.auth_set_password %} {% if urls.auth_set_password %}
<a href="{% url urls.auth_set_password %}" title="Set Password" class="btn btn-warning"> <a href="{% url urls.auth_set_password %}" title="Set Password" class="btn btn-warning">
<span class="fas fa-edit fa-fw"></span> <i class="fa-solid fa-pen-to-square"></i>
</a> </a>
{% endif %} {% endif %}
{% if urls.auth_reset_password %} {% if urls.auth_reset_password %}
<a href="{% url urls.auth_reset_password %}" title="Reset Password" class="btn btn-primary"> <a href="{% url urls.auth_reset_password %}" title="Reset Password" class="btn btn-primary">
<span class="fas fa-sync fa-fw"></span> <i class="fa-solid fa-rotate fa-fw"></i>
</a> </a>
{% endif %} {% endif %}
{% if urls.auth_deactivate %} {% if urls.auth_deactivate %}
<a href="{% url urls.auth_deactivate %}" title="Deactivate" class="btn btn-danger"> <a href="{% url urls.auth_deactivate %}" title="Deactivate" class="btn btn-danger">
<span class="fas fa-times fa-fw"></span> <i class="fa-solid fa-xmark fa-fw"></i>
</a> </a>
{% endif %} {% endif %}
{% endif %} {% endif %}

View File

@ -1,6 +1,6 @@
{% load i18n %} {% load i18n %}
<div class="card text-center m-4" style="min-width: 18rem; min-height: 18rem;"> <div class="card text-center m-3" style="min-width: 18rem; min-height: 18rem;">
<div class="card-body"> <div class="card-body">
<h5 class="card-title">{% block title %}{% endblock title %}</h5> <h5 class="card-title">{% block title %}{% endblock title %}</h5>

View File

@ -1,57 +1,75 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load bootstrap %}
{% load django_bootstrap5 %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "SRP Fleet Create" %}{% endblock page_title %} {% block page_title %}
{% translate "SRP Fleet Create" %}
{% endblock page_title %}
{% block header_nav_brand %}
{% translate "Ship Replacement Program" %}
{% endblock header_nav_brand %}
{% block extra_css %} {% block extra_css %}
{% include 'bundles/jquery-datetimepicker-css.html' %} {% include 'bundles/jquery-datetimepicker-css.html' %}
{% endblock extra_css %} {% endblock extra_css %}
{% block content %} {% block content %}
<div>
<h1 class="page-header text-center mb-3">
{% translate "Create SRP Fleet" %}
</h1>
<div class="col-lg-12"> <div class="card card-primary border-0">
<h1 class="page-header text-center">{% translate "Create SRP Fleet" %}</h1> <div class="card-header">
<div class="card-title mb-0">
{% translate "SRP fleet details" %}
</div>
</div>
<div class="container-fluid"> <div class="card-body">
<div class="col-md-4 col-md-offset-4"> <div class="row justify-content-center">
<div class="row"> <div class="col-md-6">
{% if completed == False %} {% if completed == False %}
<form class="form-signin" role="form" action="" method="POST"> <form role="form" action="" method="POST">
{% csrf_token %} {% csrf_token %}
{{ form|bootstrap }}
<br> {% bootstrap_form form %}
<button class="btn btn-lg btn-primary btn-block" type="submit">{% translate "Create SRP Fleet" %}</button>
<div class="form-group mt-3 clearfix">
{% translate "Create SRP fleet" as button_text %}
{% bootstrap_button button_class="btn btn-primary" content=button_text %}
</div>
</form> </form>
{% else %} {% else %}
<div class="alert alert-info" role="alert">{% blocktranslate %}Give this link to the line members{% endblocktranslate %}.</div> <div class="aa-callout aa-callout-info" role="alert">
<div class="alert alert-info" role="alert"> <p>{% translate "Give this link to the line members." %}</p>
{{ SITE_URL }}{% url 'srp:request' completed_srp_code %} <p>{{ SITE_URL }}{% url 'srp:request' completed_srp_code %}</p>
</div> </div>
<div class="text-center">
<a href="{% url 'srp:management' %}" class="btn btn-primary btn-lg">{% translate "Continue" %}</a> <div class="text-end">
<a href="{% url 'srp:management' %}" class="btn btn-primary">{% translate "Continue" %}</a>
</div> </div>
{% endif %} {% endif %}
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
{% endblock content %} {% endblock content %}
{% block extra_javascript %} {% block extra_javascript %}
{% include 'bundles/jquery-datetimepicker-js.html' %} {% include 'bundles/jquery-datetimepicker-js.html' %}
{% endblock %}
{% block extra_script %} <script>
$(document).ready(() => {
$('#id_fleet_time').datetimepicker({ $('#id_fleet_time').datetimepicker({
setlocale: '{{ LANGUAGE_CODE }}', setlocale: '{{ LANGUAGE_CODE }}',
{% if NIGHT_MODE %}
theme: 'dark',
{% else %}
theme: 'default',
{% endif %}
mask: true, mask: true,
format: 'Y-m-d H:i', format: 'Y-m-d H:i',
minDate: 0 minDate: 0
}); });
{% endblock extra_script %} });
</script>
{% endblock %}

View File

@ -1,12 +1,21 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load i18n %}
{% load i18n %}
{% load humanize %} {% load humanize %}
{% block page_title %}{% translate "Srp Fleet Data" %}{% endblock page_title %}
{% block page_title %}
{% translate "SRP Fleet Data" %}
{% endblock page_title %}
{% block header_nav_brand %}
{% translate "Ship Replacement Program" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div class="col-lg-12"> <div>
<div class="row"> <h1 class="page-header text-center mb-3">
<h1 class="page-header text-center">{% translate "SRP Fleet Data" %} {% translate "SRP Fleet Data" %}
<div class="text-end"> <div class="text-end">
{% if perms.auth.srp_management %} {% if perms.auth.srp_management %}
{% if fleet_status == "Completed" %} {% if fleet_status == "Completed" %}
@ -25,62 +34,68 @@
{% if srpfleetrequests %} {% if srpfleetrequests %}
<form method="POST"> <form method="POST">
{% csrf_token %} {% csrf_token %}
<div class="alert alert-info" role="alert"> <div class="alert alert-info" role="alert">
<div class="text-end"> <div class="text-end">
<b><span style="padding-right:2.5em">{% translate "Total Losses:" %} {{ srpfleetrequests.count }}</span></b> <b><span style="padding-right:2.5em">{% translate "Total Losses:" %} {{ srpfleetrequests.count }}</span></b>
<b><span style="padding-right:2.5em">{% translate "Total ISK Cost:" %} {{ totalcost | intcomma }}</span></b> <b><span style="padding-right:2.5em">{% translate "Total ISK Cost:" %} {{ totalcost | intcomma }}</span></b>
{% if perms.auth.srp_management %} {% if perms.auth.srp_management %}
<button type="submit" title="Approve" class="btn btn-success" formaction="{% url 'srp:request_approve' %}"> <button type="submit" title="Approve" class="btn btn-success btn-sm m-1" formaction="{% url 'srp:request_approve' %}">
<span class="glyphicon glyphicon-ok"></span> <i class="fa-solid fa-thumbs-up"></i>
</button> </button>
<button type="submit" title="Reject" class="btn btn-warning" formaction="{% url 'srp:request_reject' %}">
<span class="glyphicon glyphicon-remove"></span> <button type="submit" title="Reject" class="btn btn-warning btn-sm m-1" formaction="{% url 'srp:request_reject' %}">
<i class="fa-solid fa-thumbs-down"></i>
</button> </button>
<button type="submit" title="Remove" onclick="return confirm('{% translate "Are you sure you want to delete SRP requests?" %}')" class="btn btn-danger" formaction="{% url 'srp:request_remove' %}">
<span class="glyphicon glyphicon-trash"></span> <button type="submit" title="Remove" onclick="return confirm('{% translate "Are you sure you want to delete SRP requests?" %}')" class="btn btn-danger btn-sm m-1" formaction="{% url 'srp:request_remove' %}">
<i class="fa-solid fa-trash-can"></i>
</button> </button>
{% endif %} {% endif %}
</div> </div>
</div> </div>
<div class="table-responsive"> <div class="table-responsive">
<table class="table srplist"> <table class="table srplist">
<thead> <thead>
<th class="text-center">{% translate "Pilot Name" %}</th> <th>{% translate "Pilot Name" %}</th>
<th class="text-center">{% translate "Killboard Link" %}</th> <th>{% translate "Killboard Link" %}</th>
<th class="text-center">{% translate "Additional Info" %}</th> <th>{% translate "Additional Info" %}</th>
<th class="text-center">{% translate "Ship Type" %}</th> <th>{% translate "Ship Type" %}</th>
<th class="text-center">{% translate "Killboard Loss Amt" %}</th> <th>{% translate "Killboard Loss Amt" %}</th>
<th class="text-center">{% translate "SRP ISK Cost" %} <th>
<i class="glyphicon glyphicon-question-sign" rel="tooltip" title="{% blocktranslate trimmed %}Click value to edit {% translate "SRP ISK Cost" %}
<i class="fa-solid fa-circle-question" rel="tooltip" title="{% blocktranslate trimmed %}Click value to edit
Enter to save & next Enter to save & next
ESC to cancel{% endblocktranslate %}" id="blah"></i></th> ESC to cancel{% endblocktranslate %}" id="blah"></i></th>
<th class="text-center">{% translate "Post Time" %}</th> <th>{% translate "Post Time" %}</th>
<th class="text-center">{% translate "Status" %}</th> <th>{% translate "Status" %}</th>
{% if perms.auth.srp_management %} {% if perms.auth.srp_management %}
<th class="text-center">{% translate "Actions" %}</th> <th>{% translate "Actions" %}</th>
{% endif %} {% endif %}
</thead> </thead>
<tbody> <tbody>
{% for srpfleetrequest in srpfleetrequests %} {% for srpfleetrequest in srpfleetrequests %}
<tr> <tr>
<td class="text-center"> <td>
{% if srpfleetrequest.character.alliance.alliance_ticker %} {% if srpfleetrequest.character.alliance.alliance_ticker %}
{{ srpfleetrequest.character.alliance.alliance_ticker }} {{ srpfleetrequest.character.alliance.alliance_ticker }}
{% endif %} {% endif %}
[{{ srpfleetrequest.character.corporation.corporation_ticker }}] [{{ srpfleetrequest.character.corporation.corporation_ticker }}]
{{ srpfleetrequest.character.character_name }}&nbsp;<i class="copy-text-fa-icon far fa-copy" data-clipboard-text="{{ srpfleetrequest.character.character_name }}"></i> {{ srpfleetrequest.character.character_name }}&nbsp;<i class="copy-text-fa-icon far fa-copy" data-clipboard-text="{{ srpfleetrequest.character.character_name }}"></i>
</td> </td>
<td class="text-center"> <td>
<a href="{{ srpfleetrequest.killboard_link }}" <a href="{{ srpfleetrequest.killboard_link }}"
target="_blank" class="badge bg-warning">{% translate "Link" %}</a> target="_blank" class="badge bg-warning">{% translate "Link" %}</a>
</td> </td>
<td class="text-center">{{ srpfleetrequest.additional_info }}</td> <td>{{ srpfleetrequest.additional_info }}</td>
<td class="text-center">{{ srpfleetrequest.srp_ship_name }}</td> <td>{{ srpfleetrequest.srp_ship_name }}</td>
<td class="text-center" data-sort="{{ srpfleetrequest.kb_total_loss }}">{{ srpfleetrequest.kb_total_loss | intcomma }} ISK</td> <td class="text-end" data-sort="{{ srpfleetrequest.kb_total_loss }}">{{ srpfleetrequest.kb_total_loss | intcomma }} ISK</td>
<td class="srp text-center" data-name="srp_total_amount" data-type="number" data-pk="{{srpfleetrequest.id}}" data-url="{% url 'srp:request_update_amount' srpfleetrequest.id %}" data-params="{csrfmiddlewaretoken:'{{csrf_token}}'}" data-sort="{{ srpfleetrequest.srp_total_amount }}">{{ srpfleetrequest.srp_total_amount | intcomma }} ISK</td> <td class="srp text-end" data-name="srp_total_amount" data-type="number" data-pk="{{srpfleetrequest.id}}" data-url="{% url 'srp:request_update_amount' srpfleetrequest.id %}" data-params="{csrfmiddlewaretoken:'{{csrf_token}}'}" data-sort="{{ srpfleetrequest.srp_total_amount }}">{{ srpfleetrequest.srp_total_amount | intcomma }} ISK</td>
<td class="text-center" data-sort="{{ srpfleetrequest.post_time | date:"Y-m-d H:i" }}">{{ srpfleetrequest.post_time | date:"Y-M-d H:i" }}</td> <td data-sort="{{ srpfleetrequest.post_time | date:"Y-m-d H:i" }}">{{ srpfleetrequest.post_time | date:"Y-M-d H:i" }}</td>
<td class="text-center"> <td>
{% if srpfleetrequest.srp_status == "Approved" %} {% if srpfleetrequest.srp_status == "Approved" %}
<div class="badge bg-success"> <div class="badge bg-success">
{% translate "Approved" %} {% translate "Approved" %}
@ -96,7 +111,7 @@ ESC to cancel{% endblocktranslate %}" id="blah"></i></th>
{% endif %} {% endif %}
</td> </td>
{% if perms.auth.srp_management %} {% if perms.auth.srp_management %}
<td class="text-center"> <td class="text-end">
<div class="checkbox"> <div class="checkbox">
<label style="font-size: 1.5em"> <label style="font-size: 1.5em">
<input type="checkbox" name="{{srpfleetrequest.id}}"> <input type="checkbox" name="{{srpfleetrequest.id}}">
@ -108,22 +123,25 @@ ESC to cancel{% endblocktranslate %}" id="blah"></i></th>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
</div> </div>
<div class="alert alert-info" role="alert"> <div class="alert alert-info" role="alert">
<div class="text-end"> <div class="text-end">
<b><span style="padding-right:2.5em">{% translate "Total Losses:" %} {{ srpfleetrequests.count }}</span></b> <b><span style="padding-right:2.5em">{% translate "Total Losses:" %} {{ srpfleetrequests.count }}</span></b>
<b><span style="padding-right:2.5em">{% translate "Total ISK Cost:" %} {{ totalcost | intcomma }}</span></b> <b><span style="padding-right:2.5em">{% translate "Total ISK Cost:" %} {{ totalcost | intcomma }}</span></b>
{% if perms.auth.srp_management %} {% if perms.auth.srp_management %}
<button type="submit" title="Approve" class="btn btn-success" formaction="{% url 'srp:request_approve' %}"> <button type="submit" title="Approve" class="btn btn-success btn-sm m-1" formaction="{% url 'srp:request_approve' %}">
<span class="glyphicon glyphicon-ok"></span> <i class="fa-solid fa-thumbs-up"></i>
</button> </button>
<button type="submit" title="Reject" class="btn btn-warning" formaction="{% url 'srp:request_reject' %}">
<span class="glyphicon glyphicon-remove"></span> <button type="submit" title="Reject" class="btn btn-warning btn-sm m-1" formaction="{% url 'srp:request_reject' %}">
<i class="fa-solid fa-thumbs-down"></i>
</button> </button>
<button type="submit" title="Remove" onclick="return confirm('{% translate "Are you sure you want to delete SRP requests?" %}')" class="btn btn-danger" formaction="{% url 'srp:request_remove' %}">
<span class="glyphicon glyphicon-trash"></span> <button type="submit" title="Remove" onclick="return confirm('{% translate "Are you sure you want to delete SRP requests?" %}')" class="btn btn-danger btn-sm m-1" formaction="{% url 'srp:request_remove' %}">
<i class="fa-solid fa-trash-can"></i>
</button> </button>
{% endif %} {% endif %}
</div> </div>
@ -135,7 +153,6 @@ ESC to cancel{% endblocktranslate %}" id="blah"></i></th>
</div> </div>
{% endif %} {% endif %}
</div> </div>
</div>
{% endblock content %} {% endblock content %}
{% block extra_javascript %} {% block extra_javascript %}
@ -146,7 +163,8 @@ ESC to cancel{% endblocktranslate %}" id="blah"></i></th>
<script> <script>
const clipboard = new ClipboardJS('.copy-text-fa-icon'); const clipboard = new ClipboardJS('.copy-text-fa-icon');
clipboard.on('success', function (e) {
clipboard.on('success', (e) => {
console.info('Action:', e.action); console.info('Action:', e.action);
console.info('Text:', e.text); console.info('Text:', e.text);
console.info('Trigger:', e.trigger); console.info('Trigger:', e.trigger);
@ -154,45 +172,45 @@ ESC to cancel{% endblocktranslate %}" id="blah"></i></th>
e.clearSelection(); e.clearSelection();
}); });
clipboard.on('error', function (e) { clipboard.on('error', (e) => {
console.error('Action:', e.action); console.error('Action:', e.action);
console.error('Trigger:', e.trigger); console.error('Trigger:', e.trigger);
}); });
</script>
{% endblock extra_javascript %}
{% block extra_script %} $(document).ready(() => {
$(document).ready(function() { const elementEditableSrpAmount = $('.srp');
const elementTableSrpList = $('table.srplist');
$.fn.editable.defaults.mode = 'inline'; $.fn.editable.defaults.mode = 'inline';
$.fn.editable.defaults.showbuttons = false; $.fn.editable.defaults.showbuttons = false;
$.fn.editable.defaults.highlight = "#AAFF80"; $.fn.editable.defaults.highlight = "rgb(170 255 128)";
$.fn.dataTable.moment = function(format, locale) { $.fn.dataTable.moment = (format, locale) => {
let types = $.fn.dataTable.ext.type; const types = $.fn.dataTable.ext.type;
// Add type detection // Add type detection
types.detect.unshift(function(d) { types.detect.unshift((d) => {
return moment(d, format, locale, true).isValid() ? return moment(d, format, locale, true).isValid() ?
'moment-' + format : 'moment-' + format :
null; null;
}); });
// Add sorting method - use an integer for the sorting // Add sorting method - use an integer for the sorting
types.order[ 'moment-' + format+'-pre' ] = function(d) { types.order[ 'moment-' + format+'-pre' ] = (d) => {
return moment(d, format, locale, true).unix(); return moment(d, format, locale, true).unix();
}; };
}; };
$.fn.dataTable.moment('YYYY-MMM-D, HH:mm'); $.fn.dataTable.moment('YYYY-MMM-D, HH:mm');
$('.srp').editable({ elementEditableSrpAmount.editable({
display: function(value, response) { display: (value, response) => {
return false; return false;
}, },
success: function(response, newValue) { success: function(response, newValue) {
newValue = parseInt(newValue); newValue = parseInt(newValue);
let newValueOutput = newValue.toLocaleString() + " ISK"; const newValueOutput = `${newValue.toLocaleString()} ISK`;
$(this).html(newValueOutput.bold()); $(this).html(`<b>${newValueOutput}</b>`);
}, },
validate: function(value) { validate: function(value) {
if (value === null || value === '') { if (value === null || value === '') {
@ -201,17 +219,17 @@ ESC to cancel{% endblocktranslate %}" id="blah"></i></th>
} }
}); });
$('.srp').on('hidden', function(e, reason){ elementEditableSrpAmount.on('hidden', function(e, reason) {
if (reason === 'save' || reason === 'nochange') { if (reason === 'save' || reason === 'nochange') {
let $next = $(this).closest('tr').next().find('.editable'); const next_editable_element = $(this).closest('tr').next().find('.editable');
setTimeout(function() { setTimeout(() => {
$next.editable('show'); next_editable_element.editable('show');
}, 400); }, 400);
} }
}); });
$('table.srplist').DataTable({ elementTableSrpList.DataTable({
"order": [[ 6, "asc" ]], "order": [[ 6, "asc" ]],
"paging": false, "paging": false,
"columnDefs": [ "columnDefs": [
@ -231,12 +249,14 @@ ESC to cancel{% endblocktranslate %}" id="blah"></i></th>
// tooltip // tooltip
$("[rel=tooltip]").tooltip({ placement: 'top'}); $("[rel=tooltip]").tooltip({ placement: 'top'});
}); });
{% endblock extra_script %} </script>
{% endblock extra_javascript %}
{% block extra_css %} {% block extra_css %}
{% include "bundles/datatables-css-bs5.html" %} {% include "bundles/datatables-css-bs5.html" %}
{% include "bundles/x-editable.css.html" %} {% include "bundles/x-editable.css.html" %}
{% include "bundles/checkbox-css.html" %} {% include "bundles/checkbox-css.html" %}
<style> <style>
.copy-text-fa-icon:hover { .copy-text-fa-icon:hover {
cursor: pointer; cursor: pointer;

View File

@ -1,68 +1,74 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load i18n %}
{% load i18n %}
{% load humanize %} {% load humanize %}
{% block page_title %}{% translate "Srp Management" %}{% endblock page_title %} {% block page_title %}
{% block extra_css %}{% endblock extra_css %} {% translate "SRP Management" %}
{% endblock page_title %}
{% block header_nav_brand %}
{% translate "Ship Replacement Program" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div class="col-lg-12"> <div>
<div class="row"> <div class="text-end mb-3">
<h1 class="page-header text-center">{% translate "SRP Management" %}
<div class="text-end">
{% if perms.auth.srp_management %} {% if perms.auth.srp_management %}
<a href="{% url 'srp:all' %}" class="btn btn-primary"> <a href="{% url 'srp:all' %}" class="btn btn-primary">
{% translate "View All" %} {% translate "View All" %}
</a> </a>
{% endif %} {% endif %}
{% if perms.srp.add_srpfleetmain or perms.auth.srp_management %} {% if perms.srp.add_srpfleetmain or perms.auth.srp_management %}
<a href="{% url 'srp:add' %}" class="btn btn-success"> <a href="{% url 'srp:add' %}" class="btn btn-success">
{% translate "Add SRP Fleet" %} {% translate "Add SRP Fleet" %}
</a> </a>
{% endif %} {% endif %}
</div> </div>
</h1>
<div class="alert alert-info" role="alert"> <div class="alert alert-info" role="alert">
<div class="text-end"> <div class="text-end">
<b>{% translate "Total ISK Cost:" %} {{ totalcost | intcomma }}</b> <b>{% translate "Total ISK Cost:" %} {{ totalcost | intcomma }}</b>
</div> </div>
</div> </div>
{% if srpfleets %} {% if srpfleets %}
<div class="table-responsive"> <div class="table-responsive">
<table class="table"> <table class="table">
<tr> <tr>
<th class="text-center">{% translate "Fleet Name" %}</th> <th>{% translate "Fleet Name" %}</th>
<th class="text-center">{% translate "Fleet Time" %}</th> <th>{% translate "Fleet Time" %}</th>
<th class="text-center">{% translate "Fleet Doctrine" %}</th> <th>{% translate "Fleet Doctrine" %}</th>
<th class="text-center">{% translate "Fleet Commander" %}</th> <th>{% translate "Fleet Commander" %}</th>
<th class="text-center">{% translate "Fleet AAR" %}</th> <th>{% translate "Fleet AAR" %}</th>
<th class="text-center">{% translate "Fleet SRP Code" %}</th> <th>{% translate "Fleet SRP Code" %}</th>
<th class="text-center">{% translate "Fleet ISK Cost" %}</th> <th>{% translate "Fleet ISK Cost" %}</th>
<th class="text-center">{% translate "SRP Status" %}</th> <th>{% translate "SRP Status" %}</th>
<th class="text-center">{% translate "Pending Requests" %}</th> <th>{% translate "Pending Requests" %}</th>
<th class="text-center" style="width: 100px;">{% translate "Actions" %}</th> <th style="width: 110px;">{% translate "Actions" %}</th>
</tr> </tr>
{% for srpfleet in srpfleets %} {% for srpfleet in srpfleets %}
<tr> <tr>
<td class="text-center"> <td>
<div class="badge bg-info"> <div class="badge bg-info">
{{ srpfleet.fleet_name }} {{ srpfleet.fleet_name }}
</div> </div>
</td> </td>
<td class="text-center">{{ srpfleet.fleet_time | date:"Y-m-d H:i" }}</td> <td>{{ srpfleet.fleet_time | date:"Y-m-d H:i" }}</td>
<td class="text-center">{{ srpfleet.fleet_doctrine }}</td> <td>{{ srpfleet.fleet_doctrine }}</td>
<td class="text-center"> <td>
<div class="badge bg-success"> <div class="badge bg-success">
{{ srpfleet.fleet_commander.character_name }} {{ srpfleet.fleet_commander.character_name }}
</div> </div>
</td> </td>
<td class="text-center"> <td>
{% if srpfleet.fleet_srp_aar_link %} {% if srpfleet.fleet_srp_aar_link %}
<a href="{{ srpfleet.fleet_srp_aar_link }}" target="_blank" class="badge bg-primary">{% translate "Link" %}</a> <a href="{{ srpfleet.fleet_srp_aar_link }}" target="_blank" class="badge bg-primary">{% translate "Link" %}</a>
{% endif %} {% endif %}
</td> </td>
<td class="text-center"> <td>
{% if srpfleet.fleet_srp_code %} {% if srpfleet.fleet_srp_code %}
<a class="badge bg-warning" href="{% url 'srp:request' srpfleet.fleet_srp_code %}">{{ srpfleet.fleet_srp_code }}</a> <a class="badge bg-warning" href="{% url 'srp:request' srpfleet.fleet_srp_code %}">{{ srpfleet.fleet_srp_code }}</a>
{% else %} {% else %}
@ -71,9 +77,9 @@
</div> </div>
{% endif %} {% endif %}
</td> </td>
<td class="text-center">ISK: {{ srpfleet.total_cost | intcomma }}</td> <td class="text-end">{{ srpfleet.total_cost | intcomma }} ISK</td>
<td class="text-center"> <td>
{% if srpfleet.fleet_srp_status == "" %} {% if srpfleet.fleet_srp_status == "" %}
<div class="badge bg-warning"> <div class="badge bg-warning">
{% translate "Pending" %} {% translate "Pending" %}
@ -84,33 +90,32 @@
</div> </div>
{% endif %} {% endif %}
</td> </td>
<td class="text-center"> <td>
<div class="badge bg-warning">{{ srpfleet.pending_requests }}</div> <div class="badge bg-warning">{{ srpfleet.pending_requests }}</div>
</td> </td>
<td class="text-center"> <td class="text-end">
<a href="{% url 'srp:fleet' srpfleet.id %}" class="btn btn-primary btn-sm m-1" title="View">
<a href="{% url 'srp:fleet' srpfleet.id %}" class="btn btn-primary" title="View"> <i class="fa-solid fa-eye"></i>
<span class="glyphicon glyphicon-eye-open"></span>
</a> </a>
{% if perms.auth.srp_management %} {% if perms.auth.srp_management %}
<a href="{% url 'srp:edit' srpfleet.id %}" class="btn btn-info" title="Edit"> <a href="{% url 'srp:edit' srpfleet.id %}" class="btn btn-info btn-sm m-1" title="Edit">
<span class="glyphicon glyphicon-pencil"></span> <i class="fa-solid fa-pen-to-square fa-fw"></i>
</a> </a>
<a href="{% url 'srp:remove' srpfleet.id %}" onclick="return confirm('{% translate "Are you sure you want to delete this SRP code and its contents?" %}')" class="btn btn-danger" title="Remove"> <a href="{% url 'srp:remove' srpfleet.id %}" onclick="return confirm('{% translate "Are you sure you want to delete this SRP code and its contents?" %}')" class="btn btn-danger btn-sm m-1" title="Remove">
<span class="glyphicon glyphicon-trash"></span> <i class="fa-solid fa-trash-can fa-fw"></i>
</a> </a>
{% if srpfleet.fleet_srp_code %} {% if srpfleet.fleet_srp_code %}
<a href="{% url 'srp:disable' srpfleet.id %}" class="btn btn-warning" title="Disable"> <a href="{% url 'srp:disable' srpfleet.id %}" class="btn btn-warning btn-sm m-1" title="Disable">
<span class="glyphicon glyphicon-remove-sign"></span> <i class="fa-solid fa-ban fa-fw"></i>
</a> </a>
{% else %} {% else %}
<a href="{% url 'srp:enable' srpfleet.id %}" class="btn btn-success" title="Enable"> <a href="{% url 'srp:enable' srpfleet.id %}" class="btn btn-success btn-sm m-1" title="Enable">
<span class="glyphicon glyphicon-ok-sign"></span> <i class="fa-solid fa-check fa-fw"></i>
</a> </a>
{% endif %} {% endif %}
{% endif %} {% endif %}
</td> </td>
</tr> </tr>
@ -123,6 +128,4 @@
</div> </div>
{% endif %} {% endif %}
</div> </div>
</div>
{% endblock content %} {% endblock content %}

View File

@ -1,28 +1,45 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load bootstrap %}
{% load django_bootstrap5 %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "SRP Request" %}{% endblock page_title %} {% block page_title %}
{% translate "SRP Request" %}
{% endblock page_title %}
{% block header_nav_brand %}
{% translate "Ship Replacement Program" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div>
<h1 class="page-header text-center mb-3">
{% translate "Create SRP Request" %}
</h1>
<div class="col-lg-12"> <div class="card card-primary border-0">
<h1 class="page-header text-center">{% translate "Create SRP Request" %}</h1> <div class="card-header">
<div class="card-title mb-0">
{% translate "Your SRP request" %}
</div>
</div>
<div class="container-fluid"> <div class="card-body">
<div class="col-md-4 col-md-offset-4"> <div class="row justify-content-center">
<div class="row"> <div class="col-md-6">
<form class="form-signin" role="form" action="" method="POST"> <form role="form" action="" method="POST">
{% csrf_token %} {% csrf_token %}
{{ form|bootstrap }}
<br> {% bootstrap_form form %}
<button class="btn btn-lg btn-primary btn-block" type="submit">{% translate "Create SRP Request" %}
</button> <div class="form-group mt-3 clearfix">
{% translate "Create SRP request" as button_text %}
{% bootstrap_button button_class="btn btn-primary" content=button_text %}
</div>
</form> </form>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
{% endblock content %} {% endblock content %}

View File

@ -1,31 +1,51 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load bootstrap %}
{% load django_bootstrap5 %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "Update AAR Link" %}{% endblock page_title %} {% block page_title %}
{% translate "Update AAR Link" %}
{% endblock page_title %}
{% block header_nav_brand %}
{% translate "Ship Replacement Program" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div>
<h1 class="page-header text-center mb-3">
{% translate "Update AAR Link" %}
</h1>
<div class="col-lg-12"> <div class="card card-primary border-0">
<h1 class="page-header text-center">{% translate "Update AAR Link" %}</h1> <div class="card-header">
<div class="card-title mb-0">
{% translate "After Action Report" %}
</div>
</div>
<div class="container-fluid"> <div class="card-body">
<div class="col-md-4 col-md-offset-4"> <div class="row justify-content-center">
<div class="row"> <div class="col-md-6">
{% if no_fleet_id %} {% if no_fleet_id %}
<div class="alert alert-danger" role="alert">{% translate "SRP Fleet Does Not Exist" %}</div> <div class="alert alert-danger" role="alert">
{% translate "SRP Fleet Does Not Exist" %}
</div>
{% else %} {% else %}
<form class="form-signin" role="form" action="" method="POST"> <form role="form" action="" method="POST">
{% csrf_token %} {% csrf_token %}
{{ form|bootstrap }}
<br> {% bootstrap_form form %}
<button class="btn btn-lg btn-primary btn-block" type="submit">{% translate "Update AAR Link" %}
</button> <div class="form-group mt-3 clearfix">
{% translate "Update AAR link" as button_text %}
{% bootstrap_button button_class="btn btn-primary" content=button_text %}
</div>
</form> </form>
{% endif %} {% endif %}
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
{% endblock content %} {% endblock content %}

View File

@ -1,20 +1,22 @@
$(document).ready(function () { $(document).ready(() => {
'use strict'; 'use strict';
/** /**
* render a JS clock for Eve Time * Render the current EVE time in the top menu bar
* @param element * @param element
*/ */
const renderClock = function (element) { const renderClock = (element) => {
const datetimeNow = new Date(); const datetimeNow = new Date();
const h = String(datetimeNow.getUTCHours()).padStart(2, '0'); const h = String(datetimeNow.getUTCHours()).padStart(2, '0');
const m = String(datetimeNow.getUTCMinutes()).padStart(2, '0'); const m = String(datetimeNow.getUTCMinutes()).padStart(2, '0');
element.html(h + ':' + m); element.html(`${h}:${m}`);
}; };
// Start the Eve time clock in the top menu bar /**
setInterval(function () { * Start the Eve time clock in the top menu bar
*/
setInterval(() => {
renderClock($('.eve-time-wrapper .eve-time-clock')); renderClock($('.eve-time-wrapper .eve-time-clock'));
}, 500); }, 500);
}); });

View File

@ -5,21 +5,21 @@
* on a regular basis so to keep the user apprised about newly arrived * on a regular basis so to keep the user apprised about newly arrived
* notifications without having to reload the page. * notifications without having to reload the page.
* *
* The refresh rate can be changes via the Django setting NOTIFICATIONS_REFRESH_TIME. * The refresh rate can be changed via the Django setting NOTIFICATIONS_REFRESH_TIME.
* See documentation for details. * See documentation for details.
*/ */
$(() => { $(() => {
'use strict'; 'use strict';
const notificationsRefreshTime = notificationUpdateSettings.refreshTime; const notificationRefreshTime = notificationUpdateSettings.refreshTime;
const userNotificationsCountViewUrl = notificationUpdateSettings.userNotificationsCountViewUrl; const userNotificationCountViewUrl = notificationUpdateSettings.userNotificationsCountViewUrl;
const elementNotificationIcon = $('#menu_item_notifications .fa-bell'); const elementNotificationIcon = $('#menu_item_notifications .fa-bell');
/** /**
* Update the notification icon in the top menu * Update the notification icon in the top menu
*/ */
const updateNotificationIcon = () => { const updateNotificationIcon = () => {
fetch(userNotificationsCountViewUrl) fetch(userNotificationCountViewUrl)
.then((response) => { .then((response) => {
if (response.ok) { if (response.ok) {
return response.json(); return response.json();
@ -47,9 +47,9 @@ $(() => {
* Activate automatic refresh every x seconds * Activate automatic refresh every x seconds
*/ */
const activateIconUpdate = () => { const activateIconUpdate = () => {
if (notificationsRefreshTime > 0) { if (notificationRefreshTime > 0) {
myInterval = setInterval( myInterval = setInterval(
updateNotificationIcon, notificationsRefreshTime * 1000 updateNotificationIcon, notificationRefreshTime * 1000
); );
} }
}; };
@ -58,7 +58,7 @@ $(() => {
* Deactivate automatic refresh * Deactivate automatic refresh
*/ */
const deactivateIconUpdate = () => { const deactivateIconUpdate = () => {
if ((notificationsRefreshTime > 0) && (typeof myInterval !== 'undefined')) { if ((notificationRefreshTime > 0) && (typeof myInterval !== 'undefined')) {
clearInterval(myInterval); clearInterval(myInterval);
} }
}; };

View File

@ -1,37 +1,39 @@
/* global notificationUPdateSettings */ /* global notificationUPdateSettings, xhr */
/* /**
This script refreshed the unread notification count in the top menu * This script refreshed the unread notification count in the top menu
on a regular basis so to keep the user apprised about newly arrived * on a regular basis so to keep the user apprized about newly arrived
notifications without having to reload the page. * notifications without having to reload the page.
*
The refresh rate can be changes via the Django setting NOTIFICATIONS_REFRESH_TIME. * The refresh rate can be changed via the Django setting NOTIFICATIONS_REFRESH_TIME.
See documentation for details. * See documentation for details.
*/ */
$(function () { $(document).ready(() => {
'use strict'; 'use strict';
let notificationsListViewUrl = notificationUPdateSettings.notificationsListViewUrl; const notificationListViewUrl = notificationUPdateSettings.notificationsListViewUrl;
let notificationsRefreshTime = notificationUPdateSettings.notificationsRefreshTime; const notificationRefreshTime = notificationUPdateSettings.notificationsRefreshTime;
let userNotificationsCountViewUrl = notificationUPdateSettings.userNotificationsCountViewUrl; const userNotificationCountViewUrl = notificationUPdateSettings.userNotificationsCountViewUrl;
// update the notification unread count in the top menu /**
let updateNotifications = function () { * Update the notification item in the top menu with the current unread count
$.getJSON(userNotificationsCountViewUrl, function (data, status) { */
const updateNotifications = () => {
$.getJSON(userNotificationCountViewUrl, (data, status) => {
if (status === 'success') { if (status === 'success') {
let innerHtml = ''; let innerHtml;
let unreadCount = data.unread_count; const unreadCount = data.unread_count;
if (unreadCount > 0) { if (unreadCount > 0) {
innerHtml = ( innerHtml = (
`Notifications <span class="badge">${unreadCount}</span>` `Notifications <span class="badge">${unreadCount}</span>`
); );
} else { } else {
innerHtml = '<i class="far fa-bell"></i>'; innerHtml = '<i class="fa-solid fa-bell"></i>';
} }
$('#menu_item_notifications').html( $('#menu_item_notifications').html(
`<a href="${notificationsListViewUrl}">${innerHtml}</a>` `<a href="${notificationListViewUrl}">${innerHtml}</a>`
); );
} else { } else {
console.error( console.error(
@ -43,32 +45,41 @@ $(function () {
let myInterval; let myInterval;
// activate automatic refreshing every x seconds /**
let activateRefreshing = function () { * Activate automatic refreshing of notifications
if (notificationsRefreshTime > 0) { */
const activateRefreshing = () => {
if (notificationRefreshTime > 0) {
myInterval = setInterval( myInterval = setInterval(
updateNotifications, notificationsRefreshTime * 1000 updateNotifications, notificationRefreshTime * 1000
); );
} }
}; };
// deactivate automatic refreshing /**
let deactivateRefreshing = function () { * Deactivate automatic refreshing of notifications
if ((notificationsRefreshTime > 0) && (typeof myInterval !== 'undefined')) { */
const deactivateRefreshing = () => {
if ((notificationRefreshTime > 0) && (typeof myInterval !== 'undefined')) {
clearInterval(myInterval); clearInterval(myInterval);
} }
}; };
// refreshing only happens on active browser tab /**
* Activate refreshing when the browser tab is active
* and deactivate it when it is not
*/
$(document).on({ $(document).on({
'show': function () { 'show': () => {
activateRefreshing(); activateRefreshing();
}, },
'hide': function () { 'hide': () => {
deactivateRefreshing(); deactivateRefreshing();
} }
}); });
// Initial start of refreshing on script loading /**
* Initial start of refreshing on script loading
*/
activateRefreshing(); activateRefreshing();
}); });

View File

@ -7,24 +7,24 @@
* @param duration * @param duration
* @returns {string} * @returns {string}
*/ */
let getDurationString = function (duration) { const getDurationString = (duration) => { // eslint-disable-line no-unused-vars
'use strict'; 'use strict';
let out = ''; let out = '';
if (duration.years()) { if (duration.years()) {
out += duration.years() + 'y '; out += `${duration.years()}y `;
} }
if (duration.months()) { if (duration.months()) {
out += duration.months() + 'm '; out += `${duration.months()}m `;
} }
if (duration.days()) { if (duration.days()) {
out += duration.days() + 'd '; out += `${duration.days()}d `;
} }
return out + duration.hours() + 'h ' + duration.minutes() + 'm ' + duration.seconds() + 's'; return `${out + duration.hours()}h ${duration.minutes()}m ${duration.seconds()}s`;
}; };
/** /**
@ -32,11 +32,11 @@ let getDurationString = function (duration) {
* *
* condition: * condition:
* only if moment.js is loaded before, * only if moment.js is loaded before,
* if not this function returns an empty string to avoid JS errors from happening. * if not, this function returns an empty string to avoid JS errors from happening.
* *
* @returns {string} * @returns {string}
*/ */
let getCurrentEveTimeString = function () { const getCurrentEveTimeString = () => { // eslint-disable-line no-unused-vars
'use strict'; 'use strict';
let returnValue = ''; let returnValue = '';

View File

@ -51,7 +51,7 @@
<div class="container-fluid justify-content-start"> <div class="container-fluid justify-content-start">
{% if user.is_authenticated %} {% if user.is_authenticated %}
<a class="navbar-brand" data-bs-toggle="collapse" data-bs-target="#sidebar" role="button"> <a class="navbar-brand" data-bs-toggle="collapse" data-bs-target="#sidebar" role="button">
<i class="fas fa-solid fa-bars ms-2 me-2"></i> <i class="fa-solid fa-bars ms-2 me-2"></i>
</a> </a>
{% endif %} {% endif %}
@ -74,7 +74,7 @@
</div> </div>
<a class="navbar-toggler navbar-brand border-0 collapsed" data-bs-toggle="collapse" data-bs-target="#navbarexpand" aria-controls="navbarColor01" aria-expanded="false" aria-label="Toggle navigation" style="margin-left: auto;"> <a class="navbar-toggler navbar-brand border-0 collapsed" data-bs-toggle="collapse" data-bs-target="#navbarexpand" aria-controls="navbarColor01" aria-expanded="false" aria-label="Toggle navigation" style="margin-left: auto;">
<i class="fas fa-solid fa-chevron-up"></i> <i class="fa-solid fa-chevron-up"></i>
</a> </a>
</div> </div>
</nav> </nav>

View File

@ -1,10 +1,13 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% block page_title %} {% block page_title %}
{{ error_title }} {{ error_title }}
{% endblock page_title %} {% endblock page_title %}
{% block content %} {% block content %}
<div class="col-lg-12"> <div class="col-lg-12">
<h1 class="page-header text-center">{{ error_title }}</h1> <h1 class="page-header text-center mb-3">{{ error_title }}</h1>
<div class="text-center"> <div class="text-center">
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
@ -22,6 +25,7 @@
/> />
</svg> </svg>
</div> </div>
<p class="text-center">{{ error_message }}</p> <p class="text-center">{{ error_message }}</p>
</div> </div>
{% endblock content %} {% endblock content %}

View File

@ -7,6 +7,7 @@
<link rel="manifest" href="{% static 'allianceauth/icons/site.webmanifest' %}"> <link rel="manifest" href="{% static 'allianceauth/icons/site.webmanifest' %}">
<link rel="mask-icon" href="{% static 'allianceauth/icons/safari-pinned-tab.svg' %}" color="#5bbad5"> <link rel="mask-icon" href="{% static 'allianceauth/icons/safari-pinned-tab.svg' %}" color="#5bbad5">
<link rel="shortcut icon" type="image/png" href="{% static 'allianceauth/icons/favicon.ico' %}"> <link rel="shortcut icon" type="image/png" href="{% static 'allianceauth/icons/favicon.ico' %}">
<meta name="msapplication-TileColor" content="#2d89ef"> <meta name="msapplication-TileColor" content="#2d89ef">
<meta name="msapplication-config" content="{% static 'allianceauth/icons/browserconfig.xml' %}"> <meta name="msapplication-config" content="{% static 'allianceauth/icons/browserconfig.xml' %}">
<meta name="theme-color" content="#ffffff"> <meta name="theme-color" content="#ffffff">

View File

@ -1,17 +1,17 @@
{% if messages %} {% load i18n %}
<br>
{% for message in messages %}
<div class="alert alert-{{ message.level_tag }} alert-dismissible d-flex align-items-center fade show" role="alert">
{% if messages %}
{% for message in messages %}
<div class="alert alert-{{ message.level_tag }} alert-dismissible d-flex fade show" role="alert">
<div> <div>
{% if message.level_tag == "info" %} {% if message.level_tag == "info" %}
<i class="fas fa-info-circle"></i> <i class="fa-solid fa-info-circle fa-xl"></i>
{% elif message.level_tag == "success" %} {% elif message.level_tag == "success" %}
<i class="fas fa-check-circle"></i> <i class="fa-solid fa-check-circle fa-xl"></i>
{% elif message.level_tag == "warning" %} {% elif message.level_tag == "warning" %}
<i class="fas fa-exclamation-circle"></i> <i class="fa-solid fa-exclamation-circle fa-xl"></i>
{% elif "danger" in message.level_tag %} {% elif "danger" in message.level_tag %}
<i class="fas fa-exclamation-triangle"></i> <i class="fa-solid fa-exclamation-triangle fa-xl"></i>
{% endif %} {% endif %}
</div> </div>
@ -19,7 +19,7 @@
{{ message }} {{ message }}
</div> </div>
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button> <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="{% translate 'Close' %}"></button>
</div> </div>
{% endfor %} {% endfor %}
{% endif %} {% endif %}

View File

@ -1,20 +1,21 @@
{% load i18n %}
{% if messages %} {% if messages %}
<br>
{% for message in messages %} {% for message in messages %}
<div class="alert alert-{{ message.level_tag }} alert-dismissible" role="alert"> <div class="alert alert-{{ message.level_tag }} alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"> <button type="button" class="close" data-dismiss="alert" aria-label="{% translate 'Close' %}">
<span aria-hidden="true">&times;</span> <span aria-hidden="true">&times;</span>
</button> </button>
<div class="message-icon pull-left" style="margin-right: 0.5rem;"> <div class="message-icon pull-left" style="margin-right: 0.5rem;">
{% if message.level_tag == "info" %} {% if message.level_tag == "info" %}
<i class="fas fa-info-circle"></i> <i class="fa-solid fa-info-circle"></i>
{% elif message.level_tag == "success" %} {% elif message.level_tag == "success" %}
<i class="fas fa-check-circle"></i> <i class="fa-solid fa-check-circle"></i>
{% elif message.level_tag == "warning" %} {% elif message.level_tag == "warning" %}
<i class="fas fa-exclamation-circle"></i> <i class="fa-solid fa-exclamation-circle"></i>
{% elif "danger" in message.level_tag %} {% elif "danger" in message.level_tag %}
<i class="fas fa-exclamation-triangle"></i> <i class="fa-solid fa-exclamation-triangle"></i>
{% endif %} {% endif %}
</div> </div>

View File

@ -2,7 +2,7 @@
<li> <li>
<a href="{% url 'nightmode' %}?next={{ request.path|urlencode }}"> <a href="{% url 'nightmode' %}?next={{ request.path|urlencode }}">
<i class="fas {% if NIGHT_MODE %}fa-toggle-on{% else %}fa-toggle-off{% endif %}" aria-hidden="true"></i> <i class="fa-solid {% if NIGHT_MODE %}fa-toggle-on{% else %}fa-toggle-off{% endif %}" aria-hidden="true"></i>
{% translate "Night Mode" %} {% translate "Night Mode" %}
</a> </a>
</li> </li>

View File

@ -8,7 +8,7 @@
</a> </a>
{% else %} {% else %}
<a href="{% url 'notifications:list' %}"> <a href="{% url 'notifications:list' %}">
<i class="far fa-bell"></i> <i class="fa-solid fa-bell"></i>
</a> </a>
{% endif %} {% endif %}
{% endwith %} {% endwith %}

View File

@ -7,12 +7,12 @@
<ul class="nav nav-pills nav-stacked gray-icon-color" id="side-menu"> <ul class="nav nav-pills nav-stacked gray-icon-color" id="side-menu">
<li> <li>
<a class="{% navactive request 'authentication:dashboard' %}" href="{% url 'authentication:dashboard' %}"> <a class="{% navactive request 'authentication:dashboard' %}" href="{% url 'authentication:dashboard' %}">
<i class="fas fa-tachometer-alt fa-fw"></i> {% translate "Dashboard" %} <i class="fa-solid fa-gauge-high fa-fw"></i> {% translate "Dashboard" %}
</a> </a>
</li> </li>
<li> <li>
<a class="{% navactive request 'groupmanagement:groups' %}" href="{% url 'groupmanagement:groups' %}"> <a class="{% navactive request 'groupmanagement:groups' %}" href="{% url 'groupmanagement:groups' %}">
<i class="fas fa-users fa-fw"></i> {% translate "Groups" %} <i class="fa-solid fa-users fa-fw"></i> {% translate "Groups" %}
</a> </a>
</li> </li>

View File

@ -5,7 +5,7 @@
{% if user.is_staff %} {% if user.is_staff %}
<li role="separator" class="divider"></li> <li role="separator" class="divider"></li>
<li><a href="{% url 'admin:index' %}" target="_blank" rel="noopener noreferer"> <li><a href="{% url 'admin:index' %}" target="_blank" rel="noopener noreferer">
<i class="fas fa-user-shield"></i> <i class="fa-solid fa-user-shield fa-fw"></i>
{% translate "Admin" %}</a> {% translate "Admin" %}</a>
</li> </li>
{% endif %} {% endif %}
@ -15,14 +15,14 @@
<li role="separator" class="divider"></li> <li role="separator" class="divider"></li>
<li> <li>
<a href="https://allianceauth.readthedocs.io/" target="_blank" rel="noopener noreferer"> <a href="https://allianceauth.readthedocs.io/" target="_blank" rel="noopener noreferer">
<i class="fas fa-question-circle fa-fw"></i> <i class="fa-solid fa-question-circle fa-fw"></i>
{% translate "AA Documentation" %} {% translate "AA Documentation" %}
</a> </a>
</li> </li>
<li> <li>
<a href="https://discord.gg/fjnHAmk" target="_blank" rel="noopener noreferer"> <a href="https://discord.gg/fjnHAmk" target="_blank" rel="noopener noreferer">
<i class="fab fa-discord fa-fw"></i> <i class="fa-brands fa-discord fa-fw"></i>
{% translate "AA Support Discord" %} {% translate "AA Support Discord" %}
</a> </a>
</li> </li>

View File

@ -1,8 +1,14 @@
{% load i18n %} {% load i18n %}
<li class="nav-item active"> <li class="nav-item active">
<a href="{% url 'authentication:add_character' %}" class="nav-link" title="{% translate 'Add Character' %}"><i class="fas fa-plus"></i><span class="d-lg-none d-md-inline m-2">{% translate "Add Character" %}</span></a> <a href="{% url 'authentication:add_character' %}" class="nav-link" title="{% translate 'Add Character' %}">
<i class="fa-solid fa-plus"></i>
<span class="d-lg-none d-md-inline m-2">{% translate "Add Character" %}</span>
</a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a href="{% url 'authentication:change_main_character' %}" class="nav-link" title="{% translate 'Change Main' %}"><i class="fas fa-random"></i><span class="d-lg-none d-md-inline m-2">{% translate "Change Main" %}</span></a> <a href="{% url 'authentication:change_main_character' %}" class="nav-link" title="{% translate 'Change Main' %}">
<i class="fa-solid fa-shuffle"></i>
<span class="d-lg-none d-md-inline m-2">{% translate "Change Main" %}</span>
</a>
</li> </li>

View File

@ -58,7 +58,7 @@
{% if user.is_authenticated %} {% if user.is_authenticated %}
<li> <li>
<a href="{% url 'authentication:token_management' %}"> <a href="{% url 'authentication:token_management' %}">
<i class="fas fa-user-lock"></i> <i class="fa-solid fa-user-lock"></i>
{% translate "Token Management" %} {% translate "Token Management" %}
</a> </a>
</li> </li>

View File

@ -0,0 +1,4 @@
{% load static %}
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css">
<!-- End Bootstrap CSS -->

View File

@ -0,0 +1,4 @@
<!-- Start Bootstrap + jQuery js from cdnjs -->
{#<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js" integrity="sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>#}
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<!-- End Bootstrap + jQuery js from cdnjs -->

View File

@ -1,7 +1,7 @@
{% load i18n %} {% load i18n %}
{% load evelinks %} {% load evelinks %}
<div class="col-12 col-l-6 align-self-stretch p-2"> <div class="col-12 align-self-stretch py-2">
<div class="card h-100"> <div class="card h-100">
<div class="card-body"> <div class="card-body">
<h4 class="card-title text-center">{% translate "Upcoming Timers" %}</h4> <h4 class="card-title text-center">{% translate "Upcoming Timers" %}</h4>
@ -17,6 +17,7 @@
<th class="text-center">{% translate "Eve Time" %}</th> <th class="text-center">{% translate "Eve Time" %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for timer in timers %} {% for timer in timers %}
<tr> <tr>
@ -48,7 +49,6 @@
</a> </a>
</td> </td>
<td class="text-center" nowrap>{{ timer.eve_time | date:"Y-m-d H:i" }}</td> <td class="text-center" nowrap>{{ timer.eve_time | date:"Y-m-d H:i" }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>

View File

@ -1,50 +1,64 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load bootstrap %}
{% load django_bootstrap5 %}
{% load i18n %} {% load i18n %}
{% block page_title %} {% block page_title %}
{% endblock page_title %} {% endblock page_title %}
{% block header_nav_brand %}
{% translate "Structure Timers" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div class="col-lg-12"> <div>
<h1 class="page-header text-center"> <h1 class="page-header text-center mb-3">
{% block page_header %} {% block page_header %}
{% endblock page_header %} {% endblock page_header %}
{% include "timerboard/index_button.html" %} {% include "timerboard/index_button.html" %}
</h1> </h1>
<div class="container-fluid">
<div class="col-md-4 col-md-offset-4"> <div class="card card-primary border-0">
<div class="row"> <div class="card-header">
<form id="add-timer-form" class="form-signin" role="form" action="" method="POST"> <div class="card-title mb-0">
{% translate "Structure Timer Details" %}
</div>
</div>
<div class="card-body">
<div class="row justify-content-center">
<div class="col-md-6">
<form id="add-timer-form" role="form" action="" method="POST">
{% csrf_token %} {% csrf_token %}
{{ form|bootstrap }}
<br> {% bootstrap_form form %}
<button class="btn btn-lg btn-primary btn-block" type="submit">
<div class="form-group mt-3 clearfix">
<button class="btn btn-primary" type="submit">
{% block submit_button_text %} {% block submit_button_text %}
{% endblock submit_button_text %} {% endblock submit_button_text %}
</button> </button>
</div>
</form> </form>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
{% endblock content %} {% endblock content %}
{% block extra_javascript %} {% block extra_javascript %}
{% include 'bundles/jquery-datetimepicker-js.html' %} {% include 'bundles/jquery-datetimepicker-js.html' %}
{% endblock %}
{% block extra_script %} <script>
$(document).ready(() => {
$('#id_start').datetimepicker({ $('#id_start').datetimepicker({
setlocale: '{{ LANGUAGE_CODE }}', setlocale: '{{ LANGUAGE_CODE }}',
{% if NIGHT_MODE %}
theme: 'dark',
{% else %}
theme: 'default',
{% endif %}
mask: true, mask: true,
format: 'Y-m-d H:i', format: 'Y-m-d H:i',
minDate: 0 minDate: 0
}); });
{% endblock extra_script %} });
</script>
{% endblock %}

View File

@ -1,4 +1,5 @@
{% load i18n %} {% load i18n %}
<div class="text-end"> <div class="text-end">
<a href="{% url 'timerboard:view' %}" class="btn btn-default">{% translate "Back" %}</a> <a href="{% url 'timerboard:view' %}" class="btn btn-secondary">{% translate "Back" %}</a>
</div> </div>

View File

@ -1,22 +1,30 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load i18n %} {% load i18n %}
{% block page_title %} {% block page_title %}
{% translate "Delete Timer" %} {% translate "Delete Timer" %}
{% endblock page_title %} {% endblock page_title %}
{% block header_nav_brand %}
{% translate "Structure Timers" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div class="col-lg-12"> <div>
<h1 class="page-header text-center"> <h1 class="page-header text-center mb-3">
{% translate "Delete Timer" %} {% translate "Delete Timer" %}
{% include "timerboard/index_button.html" %} {% include "timerboard/index_button.html" %}
</h1> </h1>
<div class="container-fluid">
<div class="col-md-2 col-md-offset-5"> <div class="row justify-content-center">
<div class="col-md-2">
<div class="row"> <div class="row">
<form action="" method="post"> <form action="" method="post">
{% csrf_token %} {% csrf_token %}
<p>{% blocktranslate %}Are you sure you want to delete timer "{{ object }}"?{% endblocktranslate %}</p> <p>{% blocktranslate %}Are you sure you want to delete timer "{{ object }}"?{% endblocktranslate %}</p>
<input class="btn btn-danger btn-block" type="submit" value="Confirm"> <input class="btn btn-danger btn-block" type="submit" value="Confirm">
</form> </form>
</div> </div>

View File

@ -17,14 +17,15 @@
{% include 'bundles/timerboard-js.html' %} {% include 'bundles/timerboard-js.html' %}
{% include 'bundles/jquery-datetimepicker-js.html' %} {% include 'bundles/jquery-datetimepicker-js.html' %}
{% include 'bundles/jquery-datetimepicker-css.html' %} {% include 'bundles/jquery-datetimepicker-css.html' %}
{% endblock %}
{% block extra_script %} <script>
$(document).ready(() => {
$('input#id_absolute_time').datetimepicker({ $('input#id_absolute_time').datetimepicker({
setlocale: '{{ LANGUAGE_CODE }}', setlocale: '{{ LANGUAGE_CODE }}',
theme: {% if NIGHT_MODE %}'dark'{% else %}'default'{% endif %},
format: 'Y-m-d H:i', format: 'Y-m-d H:i',
minDate: 0, minDate: 0,
defaultDate: null defaultDate: null
}); });
{% endblock extra_script %} });
</script>
{% endblock %}

View File

@ -17,18 +17,15 @@
{% include 'bundles/timerboard-js.html' %} {% include 'bundles/timerboard-js.html' %}
{% include 'bundles/jquery-datetimepicker-js.html' %} {% include 'bundles/jquery-datetimepicker-js.html' %}
{% include 'bundles/jquery-datetimepicker-css.html' %} {% include 'bundles/jquery-datetimepicker-css.html' %}
{% endblock %}
{% block extra_script %} <script>
$(document).ready(() => {
$('input#id_absolute_time').datetimepicker({ $('input#id_absolute_time').datetimepicker({
setlocale: '{{ LANGUAGE_CODE }}', setlocale: '{{ LANGUAGE_CODE }}',
{% if NIGHT_MODE %}
theme: 'dark',
{% else %}
theme: 'default',
{% endif %}
mask: true, mask: true,
format: 'Y-m-d H:i', format: 'Y-m-d H:i',
defaultDate: null defaultDate: null
}); });
{% endblock extra_script %} });
</script>
{% endblock %}

View File

@ -0,0 +1,203 @@
{% load evelinks %}
{% load i18n %}
<div class="table-responsive">
<table class="table">
<tr>
<th class="text-center">{% translate "Details" %}</th>
<th class="text-center">{% translate "Objective" %}</th>
<th class="text-center">{% translate "System" %}</th>
<th class="text-center">{% translate "Structure" %}</th>
<th class="text-center">{% translate "Eve Time" %}</th>
<th class="text-center">{% translate "Local Time" %}</th>
<th class="text-center">{% translate "Creator" %}</th>
{% if perms.auth.timer_management %}
<th class="text-center">{% translate "Action" %}</th>
{% endif %}
</tr>
{% for timer in timers %}
{% if timer.important == True %}
<tr class="danger">
{% else %}
<tr class="info">
{% endif %}
<td style="width: 150px;" class="text-center">
{{ timer.details }}
{% if timer.timer_type != 'UNSPECIFIED' %}
<br>({{ timer.get_timer_type_display }})
{% endif %}
</td>
<td class="text-center">
{% if timer.objective == "Hostile" %}
<div class="badge bg-danger">
{% translate "Hostile" %}
</div>
{% endif %}
{% if timer.objective == "Friendly" %}
<div class="badge bg-primary">
{% translate "Friendly" %}
</div>
{% endif %}
{% if timer.objective == "Neutral" %}
<div class="badge bg-default">
{% translate "Neutral" %}
</div>
{% endif %}
</td>
<td class="text-center">
<a href="{{ timer.system|dotlan_solar_system_url }}">
{{ timer.system }} {{ timer.planet_moon }}
</a>
</td>
<td class="text-center">
{% if timer.structure == "POCO" %}
<div class="badge bg-info">
{% translate "POCO" %}
</div>
{% endif %}
{% if timer.structure == "I-HUB" %}
<div class="badge bg-warning">
{% translate "I-HUB" %}
</div>
{% endif %}
{% if timer.structure == "TCU" %}
<div class="badge bg-danger">
{% translate "TCU" %}
</div>
{% endif %}
{% if timer.structure == "POS[S]" %}
<div class="badge bg-info">
{% translate "POS [S]" %}
</div>
{% endif %}
{% if timer.structure == "POS[M]" %}
<div class="badge bg-info">
{% translate "POS [M]" %}
</div>
{% endif %}
{% if timer.structure == "POS[L]" %}
<div class="badge bg-info">
{% translate "POS [L]" %}
</div>
{% endif %}
{% if timer.structure == "Citadel[M]" or timer.structure == "Astrahus" %}
<div class="badge bg-danger">
{% translate "Astrahus" %}
</div>
{% endif %}
{% if timer.structure == "Citadel[L]" or timer.structure == "Fortizar" %}
<div class="badge bg-danger">
{% translate "Fortizar" %}
</div>
{% endif %}
{% if timer.structure == "Citadel[XL]" or timer.structure == "Keepstar" %}
<div class="badge bg-danger">
{% translate "Keepstar" %}
</div>
{% endif %}
{% if timer.structure == "Engineering Complex[M]" or timer.structure == "Raitaru" %}
<div class="badge bg-warning">
{% translate "Raitaru" %}
</div>
{% endif %}
{% if timer.structure == "Engineering Complex[L]" or timer.structure == "Azbel" %}
<div class="badge bg-warning">
{% translate "Azbel" %}
</div>
{% endif %}
{% if timer.structure == "Engineering Complex[XL]" or timer.structure == "Sotiyo" %}
<div class="badge bg-warning">
{% translate "Sotiyo" %}
</div>
{% endif %}
{% if timer.structure == "Refinery[M]" or timer.structure == "Athanor" %}
<div class="badge bg-warning">
{% translate "Athanor" %}
</div>
{% endif %}
{% if timer.structure == "Refinery[L]" or timer.structure == "Tatara"%}
<div class="badge bg-warning">
{% translate "Tatara" %}
</div>
{% endif %}
{% if timer.structure == "Cyno Beacon" or timer.structure == "Pharolux Cyno Beacon" %}
<div class="badge bg-warning">
{% translate "Cyno Beacon" %}
</div>
{% endif %}
{% if timer.structure == "Cyno Jammer" or timer.structure == "Tenebrex Cyno Jammer" %}
<div class="badge bg-warning">
{% translate "Cyno Jammer" %}
</div>
{% endif %}
{% if timer.structure == "Jump Gate" or timer.structure == "Ansiblex Jump Gate" %}
<div class="badge bg-warning">
{% translate "Ansiblex Jump Gate" %}
</div>
{% endif %}
{% if timer.structure == "Moon Mining Cycle" %}
<div class="badge bg-success">
{% translate "Moon Mining Cycle" %}
</div>
{% endif %}
{% if timer.structure == "Other" %}
<div class="badge bg-default">
{% translate "Other" %}
</div>
{% endif %}
</td>
<td class="text-center" nowrap>
{{ timer.eve_time | date:"Y-m-d H:i" }}
</td>
<td class="text-center" nowrap>
<div id="localtime{{ timer.id }}"></div>
<div id="countdown{{ timer.id }}"></div>
</td>
<td class="text-center">
{{ timer.eve_character.character_name }}
</td>
{% if perms.auth.timer_management %}
<td class="text-center">
<a href="{% url 'timerboard:delete' timer.id %}" class="btn btn-danger">
<i class="fa-solid fa-trash-can fa-fw"></i>
</a>
<a href="{% url 'timerboard:edit' timer.id %}" class="btn btn-info">
<i class="fa-solid fa-pen-to-square fa-fw"></i>
</a>
</td>
{% endif %}
</tr>
{% endfor %}
</table>
</div>

View File

@ -1,546 +1,93 @@
{% extends "allianceauth/base-bs5.html" %} {% extends "allianceauth/base-bs5.html" %}
{% load i18n %} {% load i18n %}
{% get_current_language as LANGUAGE_CODE %}
{% load evelinks %} {% load evelinks %}
{% block page_title %}{% translate "Structure Timer Management" %}{% endblock page_title %} {% get_current_language as LANGUAGE_CODE %}
{% block extra_css %}{% endblock extra_css %}
{% block page_title %}
{% translate "Structure Timer Management" %}
{% endblock page_title %}
{% block header_nav_brand %}
{% translate "Structure Timers" %}
{% endblock header_nav_brand %}
{% block content %} {% block content %}
<div class="col-lg-12"> <div>
<h1 class="page-header text-center">{% translate "Structure Timers" %} <div class="text-end mb-3">
<div class="text-end">
{% if perms.auth.timer_management %} {% if perms.auth.timer_management %}
<a href="{% url 'timerboard:add' %}" class="btn btn-success"> <a href="{% url 'timerboard:add' %}" class="btn btn-success">
{% translate "Create Structure Timer" %} {% translate "Create Structure Timer" %}
</a> </a>
{% endif %} {% endif %}
</div> </div>
</h1>
<div class="col-lg-12 text-center"> <div class="col-lg-12 text-center mb-3">
<div class="badge bg-info text-start"> <div class="badge bg-info text-start">
<b>{% translate "Current Eve Time:" %} </b> <span>{% translate "Current Eve Time:" %}</span>
<span id="current-time"></span>
</div> </div>
<strong class="badge bg-info text-start" id="current-time"></strong>
</div> </div>
{% if corp_timers %} {% if corp_timers %}
<h4><b>{% translate "Corp Timers" %}</b></h4> <div class="card mb-3">
<div class="table-responsive"> <div class="card-header">
<table class="table"> <div class="card-title mb-0">
<tr> {% translate "Corporation Timers" %}
<th style="width:150px" class="text-center">{% translate "Details" %}</th> </div>
<th class="text-center">{% translate "Objective" %}</th> </div>
<th class="text-center">{% translate "System" %}</th>
<th class="text-center">{% translate "Structure" %}</th> <div class="card-body">
<th class="text-center">{% translate "Eve Time" %}</th> {% include "timerboard/timertable.html" with timers=corp_timers %}
<th class="text-center">{% translate "Local Time" %}</th> </div>
<th class="text-center">{% translate "Creator" %}</th>
{% if perms.auth.timer_management %}
<th class="text-center">{% translate "Action" %}</th>
{% endif %}
</tr>
{% for timer in corp_timers %}
{% if timer.important == True %}
<tr class="danger">
{% else %}
<tr class="info">
{% endif %}
<td style="width:150px" class="text-center">
{{ timer.details }}
{% if timer.timer_type != 'UNSPECIFIED' %}
<br>({{ timer.get_timer_type_display }})
{% endif %}
</td>
<td class="text-center">
{% if timer.objective == "Hostile" %}
<div class="badge bg-danger">
{% translate "Hostile" %}
</div> </div>
{% endif %} {% endif %}
{% if timer.objective == "Friendly" %}
<div class="badge bg-primary"> <div class="card mb-3">
{% translate "Friendly" %} <div class="card-header">
<div class="card-title mb-0">
{% translate "Upcoming Timers" %}
</div> </div>
{% endif %}
{% if timer.objective == "Neutral" %}
<div class="badge bg-default">
{% translate "Neutral" %}
</div> </div>
{% endif %}
</td> <div class="card-body">
<td class="text-center"><a href="{{ timer.system|dotlan_solar_system_url }}">
{{ timer.system }} {{ timer.planet_moon }}
</a>
</td>
<td class="text-center">
{% if timer.structure == "POCO" %}
<div class="badge bg-info">
POCO
</div>
{% endif %}
{% if timer.structure == "I-HUB" %}
<div class="badge bg-warning">
I-HUB
</div>
{% endif %}
{% if timer.structure == "TCU" %}
<div class="badge bg-danger">
TCU
</div>
{% endif %}
{% if timer.structure == "POS[S]" %}
<div class="badge bg-info">
POS [S]
</div>
{% endif %}
{% if timer.structure == "POS[M]" %}
<div class="badge bg-info">
POS [M]
</div>
{% endif %}
{% if timer.structure == "POS[L]" %}
<div class="badge bg-info">
POS [L]
</div>
{% endif %}
{% if timer.structure == "Citadel[M]" or timer.structure == "Astrahus" %}
<div class="badge bg-danger">
Astrahus
</div>
{% endif %}
{% if timer.structure == "Citadel[L]" or timer.structure == "Fortizar" %}
<div class="badge bg-danger">
Fortizar
</div>
{% endif %}
{% if timer.structure == "Citadel[XL]" or timer.structure == "Keepstar" %}
<div class="badge bg-danger">
Keepstar
</div>
{% endif %}
{% if timer.structure == "Engineering Complex[M]" or timer.structure == "Raitaru" %}
<div class="badge bg-warning">
Raitaru
</div>
{% endif %}
{% if timer.structure == "Engineering Complex[L]" or timer.structure == "Azbel" %}
<div class="badge bg-warning">
Azbel
</div>
{% endif %}
{% if timer.structure == "Engineering Complex[XL]" or timer.structure == "Sotiyo" %}
<div class="badge bg-warning">
Sotiyo
</div>
{% endif %}
{% if timer.structure == "Refinery[M]" or timer.structure == "Athanor" %}
<div class="badge bg-warning">
Athanor
</div>
{% endif %}
{% if timer.structure == "Refinery[L]" or timer.structure == "Tatara"%}
<div class="badge bg-warning">
Tatara
</div>
{% endif %}
{% if timer.structure == "Cyno Beacon" or timer.structure == "Pharolux Cyno Beacon" %}
<div class="badge bg-warning">
Cyno Beacon
</div>
{% endif %}
{% if timer.structure == "Cyno Jammer" or timer.structure == "Tenebrex Cyno Jammer" %}
<div class="badge bg-warning">
Tenebrex Cyno Jammer
</div>
{% endif %}
{% if timer.structure == "Jump Gate" or timer.structure == "Ansiblex Jump Gate" %}
<div class="badge bg-warning">
Ansiblex Jump Gate
</div>
{% endif %}
{% if timer.structure == "Moon Mining Cycle" %}
<div class="badge bg-success">
Moon Mining Cycle
</div>
{% endif %}
{% if timer.structure == "Other" %}
<div class="badge bg-default">
Other
</div>
{% endif %}
</td>
<td class="text-center" nowrap>{{ timer.eve_time | date:"Y-m-d H:i" }}</td>
<td class="text-center" nowrap>
<div id="localtime{{ timer.id }}"></div>
<div id="countdown{{ timer.id }}"></div>
</td>
<td class="text-center">{{ timer.eve_character.character_name }}</td>
{% if perms.auth.timer_management %}
<td class="text-center">
<a href="{% url 'timerboard:delete' timer.id %}" class="btn btn-danger">
<span class="glyphicon glyphicon-remove"></span>
</a>
<a href="{% url 'timerboard:edit' timer.id %}" class="btn btn-info">
<span class="glyphicon glyphicon-pencil"></span>
</a>
</td>
{% endif %}
</tr>
{% endfor %}
</table>
</div>
{% endif %}
<h4><b>{% translate "Next Timers" %}</b></h4>
{% if future_timers %} {% if future_timers %}
<div class="table-responsive"> {% include "timerboard/timertable.html" with timers=future_timers %}
<table class="table">
<tr>
<th style="width:150px" class="text-center">{% translate "Details" %}</th>
<th class="text-center">{% translate "Objective" %}</th>
<th class="text-center">{% translate "System" %}</th>
<th class="text-center">{% translate "Structure" %}</th>
<th class="text-center">{% translate "Eve Time" %}</th>
<th class="text-center">{% translate "Local Time" %}</th>
<th class="text-center">{% translate "Creator" %}</th>
{% if perms.auth.timer_management %}
<th class="text-center">{% translate "Action" %}</th>
{% endif %}
</tr>
{% for timer in future_timers %}
{% if timer.important == True %}
<tr class="danger">
{% else %}
<tr class="info">
{% endif %}
<td style="width:150px" class="text-center">
{{ timer.details }}
{% if timer.timer_type != 'UNSPECIFIED' %}
<br>({{ timer.get_timer_type_display }})
{% endif %}
</td>
<td class="text-center">
{% if timer.objective == "Hostile" %}
<div class="badge bg-danger">
{% translate "Hostile" %}
</div>
{% endif %}
{% if timer.objective == "Friendly" %}
<div class="badge bg-primary">
{% translate "Friendly" %}
</div>
{% endif %}
{% if timer.objective == "Neutral" %}
<div class="badge bg-default">
{% translate "Neutral" %}
</div>
{% endif %}
</td>
<td class="text-center">
<a href="{{ timer.system|dotlan_solar_system_url }}">
{{ timer.system }} {{ timer.planet_moon }}
</a>
</td>
<td class="text-center">
{% if timer.structure == "POCO" %}
<div class="badge bg-info">
POCO
</div>
{% endif %}
{% if timer.structure == "I-HUB" %}
<div class="badge bg-warning">
I-HUB
</div>
{% endif %}
{% if timer.structure == "TCU" %}
<div class="badge bg-danger">
TCU
</div>
{% endif %}
{% if timer.structure == "POS[S]" %}
<div class="badge bg-info">
POS [S]
</div>
{% endif %}
{% if timer.structure == "POS[M]" %}
<div class="badge bg-info">
POS [M]
</div>
{% endif %}
{% if timer.structure == "POS[L]" %}
<div class="badge bg-info">
POS [L]
</div>
{% endif %}
{% if timer.structure == "Citadel[M]" or timer.structure == "Astrahus" %}
<div class="badge bg-danger">
Astrahus
</div>
{% endif %}
{% if timer.structure == "Citadel[L]" or timer.structure == "Fortizar" %}
<div class="badge bg-danger">
Fortizar
</div>
{% endif %}
{% if timer.structure == "Citadel[XL]" or timer.structure == "Keepstar" %}
<div class="badge bg-danger">
Keepstar
</div>
{% endif %}
{% if timer.structure == "Engineering Complex[M]" or timer.structure == "Raitaru" %}
<div class="badge bg-warning">
Raitaru
</div>
{% endif %}
{% if timer.structure == "Engineering Complex[L]" or timer.structure == "Azbel" %}
<div class="badge bg-warning">
Azbel
</div>
{% endif %}
{% if timer.structure == "Engineering Complex[XL]" or timer.structure == "Sotiyo" %}
<div class="badge bg-warning">
Sotiyo
</div>
{% endif %}
{% if timer.structure == "Refinery[M]" or timer.structure == "Athanor" %}
<div class="badge bg-warning">
Athanor
</div>
{% endif %}
{% if timer.structure == "Refinery[L]" or timer.structure == "Tatara" %}
<div class="badge bg-warning">
Tatara
</div>
{% endif %}
{% if timer.structure == "Cyno Beacon" or timer.structure == "Pharolux Cyno Beacon" %}
<div class="badge bg-warning">
Pharolux Cyno Beacon
</div>
{% endif %}
{% if timer.structure == "Cyno Jammer" or timer.structure == "Tenebrex Cyno Jammer" %}
<div class="badge bg-warning">
Tenebrex Cyno Jammer
</div>
{% endif %}
{% if timer.structure == "Jump Gate" or timer.structure == "Ansiblex Jump Gate" %}
<div class="badge bg-warning">
Ansiblex Jump Gate
</div>
{% endif %}
{% if timer.structure == "Moon Mining Cycle" %}
<div class="badge bg-success">
Moon Mining Cycle
</div>
{% endif %}
{% if timer.structure == "Other" %}
<div class="badge bg-default">
Other
</div>
{% endif %}
</td>
<td class="text-center" nowrap>{{ timer.eve_time | date:"Y-m-d H:i" }}</td>
<td class="text-center" nowrap>
<div id="localtime{{ timer.id }}"></div>
<div id="countdown{{ timer.id }}"></div>
</td>
<td class="text-center">{{ timer.eve_character.character_name }}</td>
{% if perms.auth.timer_management %}
<td class="text-center">
<a href="{% url 'timerboard:delete' timer.id %}" class="btn btn-danger">
<span class="glyphicon glyphicon-remove"></span>
</a>
<a href="{% url 'timerboard:edit' timer.id %}" class="btn btn-info">
<span class="glyphicon glyphicon-pencil"></span>
</a>
</td>
{% endif %}
</tr>
{% endfor %}
</table>
</div>
{% else %} {% else %}
<div class="alert alert-warning text-center"> <div class="alert alert-warning text-center">
{% translate "No upcoming timers." %} {% translate "No upcoming timers." %}
</div> </div>
{% endif %} {% endif %}
</div>
</div>
<h4><b>{% translate "Past Timers" %}</b></h4> <div class="card mb-3">
<div class="card-header">
<div class="card-title mb-0">
{% translate "Past Timers" %}
</div>
</div>
<div class="card-body">
{% if past_timers %} {% if past_timers %}
<div class="table-responsive"> {% include "timerboard/timertable.html" with timers=past_timers %}
<table class="table">
<tr>
<th style="width:150px" class="text-center">{% translate "Details" %}</th>
<th class="text-center">{% translate "Objective" %}</th>
<th class="text-center">{% translate "System" %}</th>
<th class="text-center">{% translate "Structure" %}</th>
<th class="text-center">{% translate "Eve Time" %}</th>
<th class="text-center">{% translate "Local Time" %}</th>
<th class="text-center">{% translate "Creator" %}</th>
{% if perms.auth.timer_management %}
<th class="text-center">{% translate "Action" %}</th>
{% endif %}
</tr>
{% for timer in past_timers %}
{% if timer.important == True %}
<tr class="danger">
{% else %}
<tr class="info">
{% endif %}
<td style="width:150px" class="text-center">
{{ timer.details }}
{% if timer.timer_type != 'UNSPECIFIED' %}
<br>({{ timer.get_timer_type_display }})
{% endif %}
</td>
<td class="text-center">
{% if timer.objective == "Hostile" %}
<div class="badge bg-danger">
{% translate "Hostile" %}
</div>
{% endif %}
{% if timer.objective == "Friendly" %}
<div class="badge bg-primary">
{% translate "Friendly" %}
</div>
{% endif %}
{% if timer.objective == "Neutral" %}
<div class="badge bg-default">
{% translate "Neutral" %}
</div>
{% endif %}
</td>
<td class="text-center">
<a href="{{ timer.system|dotlan_solar_system_url }}">
{{ timer.system }} {{ timer.planet_moon }}
</a>
</td>
<td class="text-center">
{% if timer.structure == "POCO" %}
<div class="badge bg-info">
POCO
</div>
{% endif %}
{% if timer.structure == "I-HUB" %}
<div class="badge bg-warning">
I-HUB
</div>
{% endif %}
{% if timer.structure == "TCU" %}
<div class="badge bg-danger">
TCU
</div>
{% endif %}
{% if timer.structure == "POS[S]" %}
<div class="badge bg-info">
POS [S]
</div>
{% endif %}
{% if timer.structure == "POS[M]" %}
<div class="badge bg-info">
POS [M]
</div>
{% endif %}
{% if timer.structure == "POS[L]" %}
<div class="badge bg-info">
POS [L]
</div>
{% endif %}
{% if timer.structure == "Citadel[M]" or timer.structure == "Astrahus" %}
<div class="badge bg-danger">
Astrahus
</div>
{% endif %}
{% if timer.structure == "Citadel[L]" or timer.structure == "Fortizar" %}
<div class="badge bg-danger">
Fortizar
</div>
{% endif %}
{% if timer.structure == "Citadel[XL]" or timer.structure == "Keepstar" %}
<div class="badge bg-danger">
Keepstar
</div>
{% endif %}
{% if timer.structure == "Engineering Complex[M]" or timer.structure == "Raitaru" %}
<div class="badge bg-warning">
Raitaru
</div>
{% endif %}
{% if timer.structure == "Engineering Complex[L]" or timer.structure == "Azbel" %}
<div class="badge bg-warning">
Azbel
</div>
{% endif %}
{% if timer.structure == "Engineering Complex[XL]" or timer.structure == "Sotiyo" %}
<div class="badge bg-warning">
Sotiyo
</div>
{% endif %}
{% if timer.structure == "Refinery[M]" or timer.structure == "Athanor" %}
<div class="badge bg-warning">
Athanor
</div>
{% endif %}
{% if timer.structure == "Refinery[L]" or timer.structure == "Tatara" %}
<div class="badge bg-warning">
Tatara
</div>
{% endif %}
{% if timer.structure == "Cyno Beacon" or timer.structure == "Pharolux Cyno Beacon" %}
<div class="badge bg-warning">
Pharolux Cyno Beacon
</div>
{% endif %}
{% if timer.structure == "Cyno Jammer" or timer.structure == "Tenebrex Cyno Jammer" %}
<div class="badge bg-warning">
Tenebrex Cyno Jammer
</div>
{% endif %}
{% if timer.structure == "Jump Gate" or timer.structure == "Ansiblex Jump Gate" %}
<div class="badge bg-warning">
Ansiblex Jump Gate
</div>
{% endif %}
{% if timer.structure == "Moon Mining Cycle" %}
<div class="badge bg-success">
Moon Mining Cycle
</div>
{% endif %}
{% if timer.structure == "Other" %}
<div class="badge bg-default">
Other
</div>
{% endif %}
</td>
<td class="text-center" nowrap>{{ timer.eve_time | date:"Y-m-d H:i" }}</td>
<td class="text-center" nowrap>
<div id="localtime{{ timer.id }}"></div>
<div id="countdown{{ timer.id }}"></div>
</td>
<td class="text-center">{{ timer.eve_character.character_name }}</td>
{% if perms.auth.timer_management %}
<td class="text-center">
<a href="{% url 'timerboard:delete' timer.id %}" class="btn btn-danger">
<span class="glyphicon glyphicon-remove"></span>
</a>
<a href="{% url 'timerboard:edit' timer.id %}" class="btn btn-info">
<span class="glyphicon glyphicon-pencil"></span>
</a>
</td>
{% endif %}
</tr>
{% endfor %}
</table>
</div>
{% else %} {% else %}
<div class="alert alert-warning text-center"> <div class="alert alert-warning text-center">
{% translate "No past timers." %} {% translate "No past timers." %}
</div> </div>
{% endif %} {% endif %}
</div> </div>
</div>
</div>
{% endblock content %}
{% block extra_javascript %}
{% include "bundles/moment-js.html" with locale=True %} {% include "bundles/moment-js.html" with locale=True %}
{% include "bundles/timers-js.html" %} {% include "bundles/timers-js.html" %}
<script> <script>
let timers = [ const timers = [
{% for timer in timers %} {% for timer in timers %}
{ {
'id': {{ timer.id }}, 'id': {{ timer.id }},
@ -548,6 +95,7 @@
'expired': false 'expired': false
}, },
{% endfor %} {% endfor %}
{% for timer in corp_timers %} {% for timer in corp_timers %}
{ {
'id': {{ timer.id }}, 'id': {{ timer.id }},
@ -561,9 +109,9 @@
* Update a timer * Update a timer
* @param timer Timer information * @param timer Timer information
*/ */
let updateTimer = function (timer) { const updateTimer = (timer) => {
if (timer.targetDate.isAfter(Date.now())) { if (timer.targetDate.isAfter(Date.now())) {
let duration = moment.duration(timer.targetDate - moment(), 'milliseconds'); const duration = moment.duration(timer.targetDate - moment(), 'milliseconds');
document.getElementById("countdown" + timer.id).innerHTML = getDurationString(duration); document.getElementById("countdown" + timer.id).innerHTML = getDurationString(duration);
} else { } else {
@ -573,8 +121,8 @@
} }
}; };
let updateAllTimers = function () { const updateAllTimers = () => {
let l = timers.length; const l = timers.length;
for (let i=0; i < l; ++i) { for (let i=0; i < l; ++i) {
if (timers[i].expired) continue; if (timers[i].expired) continue;
@ -583,33 +131,34 @@
} }
}; };
function timedUpdate() {
updateClock();
updateAllTimers();
}
/** /**
* Set the local time info for the timer * Set the local time info for the timer
* @param timer Timer information * @param timer Timer information
*/ */
let setLocalTime = function (timer) { const setLocalTime = (timer) => {
document.getElementById("localtime" + timer.id).innerHTML = timer.targetDate.format("ddd @ LT"); document.getElementById("localtime" + timer.id).innerHTML = timer.targetDate.format("ddd @ LT");
}; };
/** /**
* Set all local time fields * Set all local time fields
*/ */
let setAllLocalTimes = function () { const setAllLocalTimes = () => {
let l = timers.length; const l = timers.length;
for (let i=0; i < l; ++i) { for (let i=0; i < l; ++i) {
setLocalTime(timers[i]); setLocalTime(timers[i]);
} }
}; };
let updateClock = function () { const updateClock = () => {
document.getElementById("current-time").innerHTML = getCurrentEveTimeString(); document.getElementById("current-time").innerHTML = getCurrentEveTimeString();
}; };
const timedUpdate = () => {
updateClock();
updateAllTimers();
}
// Set initial values // Set initial values
setAllLocalTimes(); setAllLocalTimes();
timedUpdate(); timedUpdate();
@ -617,4 +166,4 @@
// Start timed updates // Start timed updates
setInterval(timedUpdate, 1000); setInterval(timedUpdate, 1000);
</script> </script>
{% endblock content %} {% endblock extra_javascript %}