feat: automated replacement

This commit is contained in:
Herculino Trotta
2025-10-28 14:13:30 -03:00
parent dd82289488
commit e600d87968
167 changed files with 4442 additions and 2503 deletions
@@ -1,22 +1,20 @@
{% load i18n %}
<div class="container px-md-3 py-3 column-gap-5">
<div class="tw:text-3xl fw-bold font-monospace tw:w-full mb-3">
<div class="tw:container tw:px-md-3 tw:py-3 tw:column-gap-5">
<div class="tw:text-3xl tw:font-bold tw:font-mono tw:w-full tw:mb-3">
{% spaceless %}
<div>{% translate 'Import Profiles' %}<span>
<span class="dropdown" data-bs-toggle="tooltip"
<span class="tw:dropdown" data-bs-toggle="tooltip"
data-bs-title="{% translate "Add" %}">
<a class="text-decoration-none tw:text-2xl p-1" role="button"
<a class="tw:no-underline tw:text-2xl tw:p-1" role="button"
data-bs-toggle="dropdown"
data-bs-title="{% translate "Add" %}" aria-expanded="false">
<i class="fa-solid fa-circle-plus fa-fw"></i>
</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item"
role="button"
<ul class="tw:dropdown-content tw:menu tw:bg-base-100 tw:rounded-box tw:z-[1] tw:w-52 tw:p-2 tw:shadow">
<li><a role="button"
hx-get="{% url 'import_profiles_add' %}"
hx-target="#generic-offcanvas">{% trans 'New' %}</a></li>
<li><a class="dropdown-item"
role="button"
<li><a role="button"
hx-get="{% url 'import_presets_list' %}"
hx-target="#persistent-generic-offcanvas-left">{% trans 'From preset' %}</a></li>
</ul>
@@ -25,45 +23,45 @@
{% endspaceless %}
</div>
<div class="card">
<div class="card-body table-responsive">
<div class="tw:card tw:bg-base-100 tw:shadow-xl">
<div class="tw:card-body tw:overflow-x-auto">
{% if profiles %}
<c-config.search></c-config.search>
<table class="table table-hover text-nowrap">
<table class="tw:table tw:table-hover tw:whitespace-nowrap">
<thead>
<tr>
<th scope="col" class="col-auto"></th>
<th scope="col" class="col">{% translate 'Name' %}</th>
<th scope="col" class="col">{% translate 'Version' %}</th>
<th scope="col" class="tw:w-auto"></th>
<th scope="col">{% translate 'Name' %}</th>
<th scope="col">{% translate 'Version' %}</th>
</tr>
</thead>
<tbody>
{% for profile in profiles %}
<tr class="profile">
<td class="col-auto">
<div class="btn-group" role="group" aria-label="{% translate 'Actions' %}">
<a class="btn btn-secondary btn-sm"
<td class="tw:w-auto">
<div class="tw:join" role="group" aria-label="{% translate 'Actions' %}">
<a class="tw:btn tw:btn-secondary tw:btn-sm tw:join-item"
role="button"
data-bs-toggle="tooltip"
data-bs-title="{% translate "Edit" %}"
hx-get="{% url 'import_profile_edit' profile_id=profile.id %}"
hx-target="#generic-offcanvas">
<i class="fa-solid fa-pencil fa-fw"></i></a>
<a class="btn btn-secondary btn-sm text-success"
<a class="tw:btn tw:btn-secondary tw:btn-sm tw:join-item tw:text-success"
role="button"
data-bs-toggle="tooltip"
data-bs-title="{% translate "Runs" %}"
hx-get="{% url 'import_profile_runs_list' profile_id=profile.id %}"
hx-target="#persistent-generic-offcanvas-left">
<i class="fa-solid fa-person-running fa-fw"></i></a>
<a class="btn btn-secondary btn-sm text-primary"
<a class="tw:btn tw:btn-secondary tw:btn-sm tw:join-item tw:text-primary"
role="button"
data-bs-toggle="tooltip"
data-bs-title="{% translate "Import" %}"
hx-get="{% url 'import_run_add' profile_id=profile.id %}"
hx-target="#generic-offcanvas">
<i class="fa-solid fa-file-import fa-fw"></i></a>
<a class="btn btn-secondary btn-sm text-danger"
<a class="tw:btn tw:btn-secondary tw:btn-sm tw:join-item tw:text-error"
role="button"
data-bs-toggle="tooltip"
data-bs-title="{% translate "Delete" %}"
@@ -76,8 +74,8 @@
_="install prompt_swal"><i class="fa-solid fa-trash fa-fw"></i></a>
</div>
</td>
<td class="col">{{ profile.name }}</td>
<td class="col">{{ profile.get_version_display }}</td>
<td>{{ profile.name }}</td>
<td>{{ profile.get_version_display }}</td>
</tr>
{% endfor %}
</tbody>
@@ -6,28 +6,28 @@
{% block body %}
{% if presets %}
<div id="search" class="mb-3">
<label class="w-100">
<div id="search" class="tw:mb-3">
<label class="tw:w-full">
<input type="search"
class="form-control"
class="tw:input tw:input-bordered tw:w-full"
placeholder="{% translate 'Search' %}"
_="on input or search
show < .col /> in <#items/>
when its textContent.toLowerCase() contains my value.toLowerCase()"/>
</label>
</div>
<div class="row row-cols-1 g-4" id="items">
<div class="tw:grid tw:grid-cols-1 tw:gap-4" id="items">
{% for preset in presets %}
<a class="text-decoration-none"
<a class="tw:no-underline"
role="button"
hx-post="{% url 'import_profiles_add' %}"
hx-vals='{"yaml_config": {{ preset.config }}, "name": "{{ preset.name }}", "version": "{{ preset.schema_version }}", "message": {{ preset.message }}}'
hx-target="#generic-offcanvas">
<div class="col">
<div class="card">
<div class="card-body">
<h5 class="card-title">{{ preset.name }}</h5>
<div class="tw:card tw:bg-base-100 tw:shadow-xl">
<div class="tw:card-body">
<h5 class="tw:card-title">{{ preset.name }}</h5>
<hr>
<p>{{ preset.description }}</p>
<p>{% trans 'By' %} {{ preset.authors|join:", " }}</p>
@@ -11,21 +11,21 @@
class="show-loading"
hx-swap="show:none scroll:none">
{% if runs %}
<div class="row row-cols-1 g-4">
<div class="tw:grid tw:grid-cols-1 tw:gap-4">
{% for run in runs %}
<div class="col">
<div class="card">
<div class="card-header tw:text-sm {% if run.status == run.Status.QUEUED %}text-body{% elif run.status == run.Status.PROCESSING %}text-warning{% elif run.status == run.Status.FINISHED %}text-success{% else %}text-danger{% endif %}">
<span><i class="fa-solid {% if run.status == run.Status.QUEUED %}fa-hourglass-half{% elif run.status == run.Status.PROCESSING %}fa-spinner{% elif run.status == run.Status.FINISHED %}fa-check{% else %}fa-xmark{% endif %} fa-fw me-2"></i>{{ run.get_status_display }}</span>
<div class="tw:card tw:bg-base-100 tw:shadow-xl">
<div class="tw:card-header tw:bg-base-200 tw:p-4 tw:text-sm {% if run.status == run.Status.QUEUED %}tw:text-base-content{% elif run.status == run.Status.PROCESSING %}tw:text-warning{% elif run.status == run.Status.FINISHED %}tw:text-success{% else %}tw:text-error{% endif %}">
<span><i class="fa-solid {% if run.status == run.Status.QUEUED %}fa-hourglass-half{% elif run.status == run.Status.PROCESSING %}fa-spinner{% elif run.status == run.Status.FINISHED %}fa-check{% else %}fa-xmark{% endif %} fa-fw tw:me-2"></i>{{ run.get_status_display }}</span>
</div>
<div class="card-body">
<h5 class="card-title"><i class="fa-solid fa-hashtag me-1 tw:text-xs tw:text-gray-400"></i>{{ run.id }}<span class="tw:text-xs tw:text-gray-400 ms-1">({{ run.file_name }})</span></h5>
<div class="tw:card-body">
<h5 class="tw:card-title"><i class="fa-solid fa-hashtag tw:me-1 tw:text-xs tw:text-gray-400"></i>{{ run.id }}<span class="tw:text-xs tw:text-gray-400 tw:ms-1">({{ run.file_name }})</span></h5>
<hr>
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 w-100 g-4">
<div class="tw:grid tw:grid-cols-1 tw:md:grid-cols-2 tw:lg:grid-cols-3 tw:w-full tw:gap-4">
<div class="col">
<div class="d-flex flex-row">
<div class="d-flex flex-column">
<div class="text-body-secondary tw:text-xs tw:font-medium">
<div class="tw:flex tw:flex-row">
<div class="tw:flex tw:flex-col">
<div class="tw:text-base-content/70 tw:text-xs tw:font-medium">
{% trans 'Total Items' %}
</div>
<div class="tw:text-sm">
@@ -36,9 +36,9 @@
</div>
<div class="col">
<div class="d-flex flex-row">
<div class="d-flex flex-column">
<div class="text-body-secondary tw:text-xs tw:font-medium">
<div class="tw:flex tw:flex-row">
<div class="tw:flex tw:flex-col">
<div class="tw:text-base-content/70 tw:text-xs tw:font-medium">
{% trans 'Processed Items' %}
</div>
<div class="tw:text-sm">
@@ -49,9 +49,9 @@
</div>
<div class="col">
<div class="d-flex flex-row">
<div class="d-flex flex-column">
<div class="text-body-secondary tw:text-xs tw:font-medium">
<div class="tw:flex tw:flex-row">
<div class="tw:flex tw:flex-col">
<div class="tw:text-base-content/70 tw:text-xs tw:font-medium">
{% trans 'Skipped Items' %}
</div>
<div class="tw:text-sm">
@@ -62,9 +62,9 @@
</div>
<div class="col">
<div class="d-flex flex-row">
<div class="d-flex flex-column">
<div class="text-body-secondary tw:text-xs tw:font-medium">
<div class="tw:flex tw:flex-row">
<div class="tw:flex tw:flex-col">
<div class="tw:text-base-content/70 tw:text-xs tw:font-medium">
{% trans 'Failed Items' %}
</div>
<div class="tw:text-sm">
@@ -75,9 +75,9 @@
</div>
<div class="col">
<div class="d-flex flex-row">
<div class="d-flex flex-column">
<div class="text-body-secondary tw:text-xs tw:font-medium">
<div class="tw:flex tw:flex-row">
<div class="tw:flex tw:flex-col">
<div class="tw:text-base-content/70 tw:text-xs tw:font-medium">
{% trans 'Successful Items' %}
</div>
<div class="tw:text-sm">
@@ -89,14 +89,14 @@
</div>
</div>
<div class="card-footer text-body-secondary">
<a class="text-decoration-none text-info"
<div class="tw:card-footer tw:bg-base-200 tw:p-4 tw:text-base-content/70">
<a class="tw:no-underline tw:text-info"
role="button"
data-bs-toggle="tooltip"
data-bs-title="{% translate "Logs" %}"
hx-get="{% url 'import_run_log' profile_id=profile.id run_id=run.id %}"
hx-target="#generic-offcanvas"><i class="fa-solid fa-file-lines"></i></a>
<a class="text-decoration-none text-danger"
<a class="tw:no-underline tw:text-error"
role="button"
data-bs-toggle="tooltip"
data-bs-title="{% translate "Delete" %}"
@@ -5,8 +5,8 @@
{% block title %}{% translate 'Logs for' %} #{{ run.id }}{% endblock %}
{% block body %}
<div class="card tw:max-h-full tw:overflow-auto">
<div class="card-body">
<div class="tw:card tw:bg-base-100 tw:shadow-xl tw:max-h-full tw:overflow-auto">
<div class="tw:card-body">
{{ run.logs|linebreaks }}
</div>
</div>