user_form.html 196 lignes · 8397 octets
{% extends "base.html" %}

{% block title %}{{ page_title }}{% endblock %}

{% block navbar %}
{% include "components/navbar.html" %}
{% endblock %}

{% block content %}
<div class="container mx-auto px-4 py-8">
    <!-- Breadcrumb -->
    <div class="text-sm breadcrumbs mb-6">
        <ul>
            <li><a href="/">{{ breadcrumb_home }}</a></li>
            <li><a href="/admin">{{ breadcrumb_admin }}</a></li>
            <li><a href="/admin/users">{{ breadcrumb_users }}</a></li>
            <li>{{ breadcrumb_mode }}</li>
        </ul>
    </div>

    <div class="flex justify-between items-center mb-6">
        <h1 class="text-3xl font-bold">{{ form_title }}</h1>
        <a href="/admin/users" class="btn btn-ghost">
            <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 mr-2" fill="none" viewBox="0 0 24 24" stroke="currentColor">
                <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 19l-7-7m0 0l7-7m-7 7h18" />
            </svg>
            {{ back_to_list }}
        </a>
    </div>

    <!-- Messages d'erreur/succès -->
    <div id="form-messages" class="mb-6"></div>

    <!-- User Form -->
    <div class="card bg-base-100 shadow-xl">
        <div class="card-body">
            {% if mode == "create" %}
            <form 
                method="POST" 
                action="/admin/users" 
                class="space-y-6"
                hx-post="/admin/users"
                hx-target="#form-messages"
                hx-swap="innerHTML"
                hx-indicator="#form-loading"
            >
            {% else %}
            <form 
                method="PUT" 
                action="/admin/users/{{ user_id }}" 
                class="space-y-6"
                hx-put="/admin/users/{{ user_id }}"
                hx-target="#form-messages"
                hx-swap="innerHTML"
                hx-indicator="#form-loading"
            >
            {% endif %}
                <input type="hidden" name="csrf_token" value="{{ csrf_token }}">

                <!-- Username Field -->
                <div class="form-control">
                    <label class="label">
                        <span class="label-text font-semibold">{{ username_label }}</span>
                        <span class="label-text-alt text-error">*</span>
                    </label>
                    {% if mode == "create" %}
                        <input
                            type="text"
                            name="username"
                            value="{{ form_username }}"
                            placeholder="{{ username_placeholder }}"
                            class="input input-bordered w-full"
                            minlength="3"
                            maxlength="39"
                            pattern="[a-z0-9-]+"
                            title="{{ username_pattern }}"
                            required
                        >
                    {% else %}
                        <input 
                            type="text" 
                            value="{{ form_username }}" 
                            class="input input-bordered w-full input-disabled" 
                            readonly
                        >
                        <input type="hidden" name="username" value="{{ form_username }}">
                    {% endif %}
                    <label class="label">
                        <span class="label-text-alt">{{ username_readonly_hint }}</span>
                    </label>
                </div>

                <!-- Email Field -->
                <div class="form-control">
                    <label class="label">
                        <span class="label-text font-semibold">{{ email_label }}</span>
                        <span class="label-text-alt text-error">*</span>
                    </label>
                    <input 
                        type="email" 
                        name="email" 
                        value="{{ form_email }}" 
                        placeholder="{{ email_placeholder }}" 
                        class="input input-bordered w-full" 
                        required
                    >
                    {% if mode == "edit" %}
                    <label class="label">
                        <span class="label-text-alt">{{ email_change_hint }}</span>
                    </label>
                    {% endif %}
                </div>

                <!-- Password Field (only for create mode or if resetting) -->
                {% if mode == "create" %}
                <div class="form-control">
                    <label class="label">
                        <span class="label-text font-semibold">{{ password_label }}</span>
                        <span class="label-text-alt">{{ password_optional }}</span>
                    </label>
                    <input 
                        type="password" 
                        name="password" 
                        placeholder="{{ password_placeholder }}" 
                        class="input input-bordered w-full"
                    >
                    <label class="label">
                        <span class="label-text-alt">{{ password_hint }}</span>
                    </label>
                </div>
                {% endif %}

                <!-- Roles Field -->
                <div class="form-control">
                    <label class="label">
                        <span class="label-text font-semibold">{{ roles_label }}</span>
                        <span class="label-text-alt text-error">*</span>
                    </label>
                    <div class="space-y-2">
                        {% for role in available_roles %}
                        <label class="label cursor-pointer justify-start gap-3">
                            <input 
                                type="checkbox" 
                                name="roles" 
                                value="{{ role.name }}" 
                                class="checkbox checkbox-primary"
                                {% if role.is_selected %}checked{% endif %}
                            >
                            <div class="flex-1">
                                <span class="label-text font-medium">{{ role.name }}</span>
                                {% if role.description.len() > 0 %}
                                <p class="text-sm text-base-content/70">{{ role.description }}</p>
                                {% endif %}
                            </div>
                        </label>
                        {% endfor %}
                    </div>
                    <label class="label">
                        <span class="label-text-alt">{{ roles_hint }}</span>
                    </label>
                </div>

                <!-- Must Change Password (only for edit mode) -->
                {% if mode == "edit" %}
                <div class="form-control">
                    <label class="label cursor-pointer justify-start gap-3">
                        <input 
                            type="checkbox" 
                            name="must_change_password" 
                            value="true" 
                            class="checkbox checkbox-warning"
                            {% if must_change_password %}checked{% endif %}
                        >
                        <div class="flex-1">
                            <span class="label-text font-medium">{{ must_change_password_label }}</span>
                            <p class="text-sm text-base-content/70">{{ must_change_password_desc }}</p>
                        </div>
                    </label>
                </div>
                {% endif %}

                <!-- Form Actions -->
                <div class="flex justify-end gap-4 pt-4 border-t">
                    <a href="/admin/users" class="btn btn-ghost">{{ cancel }}</a>
                    <button type="submit" class="btn btn-primary" id="submit-btn">
                        <span id="form-loading" class="htmx-indicator loading loading-spinner loading-sm mr-2"></span>
                        {{ submit_label }}
                    </button>
                </div>
            </form>
            {% if mode != "create" %}
            {% endif %}
        </div>
    </div>
</div>
{% endblock %}