Improve states UI

This commit is contained in:
Gabriel Augendre 2022-11-02 22:02:48 +01:00
parent 4664ae0d9d
commit 369449442e
10 changed files with 79 additions and 17 deletions

View file

@ -24,8 +24,10 @@ class AddPathForm(forms.Form):
def __init__(self, character: Character, *args, **kwargs): def __init__(self, character: Character, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
paths = {cap.path_id for cap in character.capabilities.all()} paths = {cap.path_id for cap in character.capabilities.all()}
paths = Path.objects.exclude(pk__in=paths).order_by( paths = (
"profile__name", "race__name" Path.objects.exclude(pk__in=paths)
.order_by("profile__name", "race__name")
.select_related("profile", "race")
) )
character_paths = paths.filter( character_paths = paths.filter(
Q(profile=character.profile) | Q(race=character.race) Q(profile=character.profile) | Q(race=character.race)

View file

@ -0,0 +1,21 @@
# Generated by Django 4.1.2 on 2022-11-02 21:01
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("character", "0030_alter_character_states"),
]
operations = [
migrations.AlterModelOptions(
name="harmfulstate",
options={
"ordering": ["name"],
"verbose_name": "État préjudiciable",
"verbose_name_plural": "États préjudiciables",
},
),
]

View file

@ -1 +1 @@
0030_alter_character_states 0031_alter_harmfulstate_options

View file

@ -1,4 +1,5 @@
import collections import collections
from collections.abc import Iterable
import markdown import markdown
from django.db import models from django.db import models
@ -56,6 +57,7 @@ class HarmfulState(DocumentedModel, UniquelyNamedModel, TimeStampedModel, models
class Meta: class Meta:
verbose_name = "État préjudiciable" verbose_name = "État préjudiciable"
verbose_name_plural = "États préjudiciables" verbose_name_plural = "États préjudiciables"
ordering = ["name"]
def modifier(value: int) -> int: def modifier(value: int) -> int:
@ -318,3 +320,8 @@ class Character(models.Model):
def get_formatted_notes(self) -> str: def get_formatted_notes(self) -> str:
md = markdown.Markdown(extensions=["extra", "nl2br"]) md = markdown.Markdown(extensions=["extra", "nl2br"])
return md.convert(self.notes) return md.convert(self.notes)
def get_missing_states(self) -> Iterable[HarmfulState]:
return HarmfulState.objects.exclude(
pk__in=self.states.all().values_list("pk", flat=True)
)

View file

@ -0,0 +1,3 @@
.state-enabled {
filter: invert(50%) sepia(100%) saturate(3000%) hue-rotate(325deg);
}

View file

@ -1,15 +1,20 @@
<p id="states"> <p id="states">
États : États :
{% for state in character.states.all %} {% with character.states.all as character_states %}
{% for state in all_states %}
<img src="{{ state.icon_url }}" alt="{{ state.name }}" height="25" width="25" <img src="{{ state.icon_url }}" alt="{{ state.name }}" height="25" width="25"
data-bs-toggle="tooltip" data-bs-toggle="tooltip"
data-bs-placement="top" data-bs-placement="top"
data-bs-title="{{ state.name }} : {{ state.description }}" data-bs-title="{{ state.name }} : {{ state.description }}"
{% if state in character_states %}
class="state-enabled"
hx-get="{% url "character:remove_state" pk=character.pk state_pk=state.pk %}" hx-get="{% url "character:remove_state" pk=character.pk state_pk=state.pk %}"
{% else %}
hx-get="{% url "character:add_state" pk=character.pk state_pk=state.pk %}"
{% endif %}
hx-target="#states" hx-target="#states"
hx-swap="outerHTML" hx-swap="outerHTML"
> >
{% empty %}
Aucun
{% endfor %} {% endfor %}
{% endwith %}
</p> </p>

View file

@ -1,9 +1,14 @@
{% extends "common/base.html" %} {% extends "common/base.html" %}
{% load static %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% load character_extras %} {% load character_extras %}
{% block title %}{{ character.name }}{% endblock %} {% block title %}{{ character.name }}{% endblock %}
{% block head_end %}
<link rel="stylesheet" href="{% static "character/style.css" %}">
{% endblock %}
{% block content %} {% block content %}
<h1>{{ character.name }}</h1> <h1>{{ character.name }}</h1>
<p> <p>

View file

@ -72,4 +72,5 @@ urlpatterns = [
path( path(
"<int:pk>/remove_state/<int:state_pk>/", views.remove_state, name="remove_state" "<int:pk>/remove_state/<int:state_pk>/", views.remove_state, name="remove_state"
), ),
path("<int:pk>/add_state/<int:state_pk>/", views.add_state, name="add_state"),
] ]

View file

@ -32,7 +32,11 @@ def character_view(request, pk: int):
pk=pk, pk=pk,
) )
add_path_form = AddPathForm(character) add_path_form = AddPathForm(character)
context = {"character": character, "add_path_form": add_path_form} context = {
"character": character,
"add_path_form": add_path_form,
"all_states": HarmfulState.objects.all(),
}
return render(request, "character/view.html", context) return render(request, "character/view.html", context)
@ -274,6 +278,18 @@ def remove_state(request, pk: int, state_pk: int):
) )
state = get_object_or_404(HarmfulState, pk=state_pk) state = get_object_or_404(HarmfulState, pk=state_pk)
character.states.remove(state) character.states.remove(state)
context = {"character": character} context = {"character": character, "all_states": HarmfulState.objects.all()}
response = render(request, "character/states.html", context)
return trigger_client_event(response, "refresh_tooltips", {})
@login_required
def add_state(request, pk: int, state_pk: int):
character: Character = get_object_or_404(
Character.objects.filter(player=request.user), pk=pk
)
state = get_object_or_404(HarmfulState, pk=state_pk)
character.states.add(state)
context = {"character": character, "all_states": HarmfulState.objects.all()}
response = render(request, "character/states.html", context) response = render(request, "character/states.html", context)
return trigger_client_event(response, "refresh_tooltips", {}) return trigger_client_event(response, "refresh_tooltips", {})

View file

@ -16,6 +16,8 @@
touch-action: manipulation; touch-action: manipulation;
} }
</style> </style>
{% block head_end %}
{% endblock %}
</head> </head>
<body> <body>
{% include "common/navbar.html" %} {% include "common/navbar.html" %}