Organization tenancy and frontend #16

Merged
rixx merged 26 commits from 6-organizations into main 2025-03-21 12:32:53 +00:00
2 changed files with 49 additions and 52 deletions
Showing only changes of commit eae01c74c7 - Show all commits

View file

@ -1,9 +1,14 @@
from servala.frontend.forms.renderers import InlineFormRenderer
class HtmxMixin: class HtmxMixin:
""" """
Form mixin that retains only a single field when specified. Form mixin that retains only a single field when specified.
Useful when sending single fields with htmx. Useful when sending single fields with htmx.
""" """
default_renderer = InlineFormRenderer
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self.single_field = kwargs.pop("single_field", None) self.single_field = kwargs.pop("single_field", None)

View file

@ -12,68 +12,60 @@
</div> </div>
{% endblock %} {% endblock %}
{% partialdef user-email %} {% partialdef user-email %}
<tr> <td>
<th>{% translate "E-mail" %}</th> {{ request.user.email }}
<td>{{ request.user.email }}</td> <button class="btn btn-primary"
<td> hx-get="{% url 'frontend:profile' %}?fragment=user-email-edit"
<button class="btn btn-sm btn-primary" hx-target="closest td"
hx-get="{% url 'frontend:profile' %}?fragment=user-email-edit" hx-swap="outerHTML">{% translate "Edit" %}</button>
hx-target="closest tr" </td>
hx-swap="outerHTML">{% translate "Edit" %}</button>
</td>
</tr>
{% endpartialdef user-email %} {% endpartialdef user-email %}
{% partialdef user-company %} {% partialdef user-company %}
<tr> <td>
<th>{% translate "Company" %}</th> {{ request.user.company|default_if_none:"" }}
<td>{{ request.user.company|default_if_none:"" }}</td> <button class="btn btn-primary"
<td> hx-get="{% url 'frontend:profile' %}?fragment=user-company-edit"
<button class="btn btn-sm btn-primary" hx-target="closest td"
hx-get="{% url 'frontend:profile' %}?fragment=user-company-edit" hx-swap="outerHTML">{% translate "Edit" %}</button>
hx-target="closest tr" </td>
hx-swap="outerHTML">{% translate "Edit" %}</button>
</td>
</tr>
{% endpartialdef user-company %} {% endpartialdef user-company %}
{% partialdef user-email-edit %} {% partialdef user-email-edit %}
<tr> <td>
<th>{% translate "E-mail" %}</th> <form hx-target="closest td"
<td colspan="2"> hx-swap="outerHTML"
<form hx-target="closest tr" hx-post="{{ request.url }}">
hx-swap="outerHTML" <div class="d-flex align-items-baseline">
hx-post="{{ request.url }}"> {{ form.email.as_field_group }}
{{ form.email }}
<input type="hidden" name="hx-single-field" value="email"> <input type="hidden" name="hx-single-field" value="email">
<input type="hidden" name="fragment" value="user-email"> <input type="hidden" name="fragment" value="user-email">
<button type="submit" class="btn btn-primary">{% translate "Save" %}</button> <button type="submit" class="btn btn-primary mx-1">{% translate "Save" %}</button>
<button type="button" <button type="button"
class="btn btn-secondary" class="btn btn-secondary"
hx-get="{{ request.path }}?fragment=user-email" hx-get="{{ request.path }}?fragment=user-email"
hx-target="closest tr" hx-target="closest td"
hx-swap="outerHTML">{% translate "Cancel" %}</button> hx-swap="outerHTML">{% translate "Cancel" %}</button>
</form> </div>
</td> </form>
</tr> </td>
{% endpartialdef %} {% endpartialdef %}
{% partialdef user-company-edit %} {% partialdef user-company-edit %}
<tr> <td>
<th>{% translate "Company" %}</th> <form hx-target="closest td"
<td colspan="2"> hx-swap="outerHTML"
<form hx-target="closest tr" hx-post="{{ request.url }}">
hx-swap="outerHTML" <div class="d-flex align-items-baseline">
hx-post="{{ request.url }}"> {{ form.company.as_field_group }}
{{ form.company }}
<input type="hidden" name="hx-single-field" value="company"> <input type="hidden" name="hx-single-field" value="company">
<input type="hidden" name="fragment" value="user-company"> <input type="hidden" name="fragment" value="user-company">
<button type="submit" class="btn btn-primary">{% translate "Save" %}</button> <button type="submit" class="btn mx-1 btn-primary">{% translate "Save" %}</button>
<button type="button" <button type="button"
class="btn btn-secondary" class="btn btn-secondary"
hx-get="{{ request.path }}?fragment=user-company" hx-get="{{ request.path }}?fragment=user-company"
hx-target="closest tr" hx-target="closest td"
hx-swap="outerHTML">{% translate "Cancel" %}</button> hx-swap="outerHTML">{% translate "Cancel" %}</button>
</form> </div>
</td> </form>
</tr> </td>
{% endpartialdef %} {% endpartialdef %}
{% block content %} {% block content %}
<section> <section>
@ -88,18 +80,18 @@
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-lg"> <table class="table table-lg">
<tbody> <tbody>
{% partial user-email %}
<tr> <tr>
<th>{% translate "First name" %}</th> <th class="w-25">{% translate "Name" %}</th>
<td>{{ request.user.first_name }}</td> <td>{{ request.user.first_name }} {{ request.user.last_name }}</td>
<td></td>
</tr> </tr>
<tr> <tr>
<th>{% translate "Last name" %}</th> <th class="w-25">{% translate "E-mail" %}</th>
<td>{{ request.user.last_name }}</td> {% partial user-email %}
<td></td> </tr>
<tr>
<th class="w-25">{% translate "Company" %}</th>
{% partial user-company %}
</tr> </tr>
{% partial user-company %}
</tbody> </tbody>
</table> </table>
</div> </div>