[ADD] HORILLA VIEWS: Add filter selected quick action

This commit is contained in:
Horilla
2025-02-07 09:47:04 +05:30
parent 5e2994cf3f
commit 6287092426
4 changed files with 105 additions and 7 deletions

View File

@@ -99,6 +99,12 @@ class HorillaListView(ListView):
header_attrs: dict = {}
def post(self, *args, **kwargs):
"""
POST method to handle post submissions
"""
return self.get(self, *args, **kwargs)
def __init__(self, **kwargs: Any) -> None:
if not self.view_id:
self.view_id = get_short_uuid(4)
@@ -203,6 +209,24 @@ class HorillaListView(ListView):
self._saved_filters = QueryDict("", mutable=True)
if self.filter_class:
query_dict = self.request.GET
selected_ids = eval_validate(
self.request.POST.get("selected_ids", "[]")
)
if (
self.request.session.get("prev_path")
and self.request.session.get("prev_path") != self.request.path
):
selected_ids = []
self.request.session["hlv_selected_ids"] = selected_ids
self.request.session["prev_path"] = self.request.path
if selected_ids and selected_ids != self.request.session.get(
"hlv_selected_ids", []
):
self.request.session["hlv_selected_ids"] = selected_ids
self.request.session["prev_path"] = self.request.path
if "filter_applied" in query_dict.keys():
update_saved_filter_cache(self.request, CACHE)
elif CACHE.get(
@@ -231,6 +255,18 @@ class HorillaListView(ListView):
self.queryset = self.filter_class(
data=query_dict, queryset=self.queryset, request=self.request
).qs
if self.request.GET.get(
"show_all"
) == "true" and self.request.session.get("hlv_selected_ids"):
del self.request.session["hlv_selected_ids"]
if self.request.session.get("hlv_selected_ids"):
self.request.actual_ids = list(
self.queryset.values_list("id", flat=True)
)
self.queryset = self.queryset.filter(
id__in=self.request.session["hlv_selected_ids"]
)
return self.queryset
def get_context_data(self, **kwargs: Any):

View File

@@ -103,6 +103,7 @@
<div class="oh-modal__dialog-footer p-0 mt-3">
<button
onclick="$(this).closest('.oh-modal--show').removeClass('oh-modal--show')"
type="submit"
class="oh-btn oh-btn--secondary oh-btn--shadow"
>

View File

@@ -364,9 +364,14 @@
</div>
{% endif %}
<script>
setInterval(() => {
setTimeout(() => {
$("#{{view_id}} [type=checkbox].list-table-row:checked").first().change();
$("#{{view_id}} [type=checkbox].list-table-row:checked").not().first().change();
var ids = JSON.parse($("#{{selected_instances_key_id}}").attr("data-ids"))
if (ids.length) {
$("#{{view_id}} .quick-bulk-action.d-none").removeClass("d-none");
}
}, 200);
</script>
</div>

View File

@@ -1,4 +1,11 @@
{% load i18n %}
{% if request.actual_ids and request.session.prev_path == request.path %}
<script>
var ids = {{request.session.hlv_selected_ids|safe}}
$("#{{selected_instances_key_id}}").attr("data-ids", JSON.stringify(ids));
</script>
{% endif %}
<div class="d-flex justify-content-between mb-2">
<div style="
display: flex;
@@ -89,13 +96,62 @@
</span>)
</div>
<form
hx-get="/{{bulk_path}}"
hx-target="#bulkUpdateModalBody{{view_id|safe}}">
<input type="hidden" name="instance_ids">
<button type="submit" id="bulk_update_get_form{{view_id}}" hidden>
</button>
hx-get="/{{bulk_path}}"
hx-target="#bulkUpdateModalBody{{view_id|safe}}">
<input type="hidden" name="instance_ids">
<button type="submit" id="bulk_update_get_form{{view_id}}" hidden>
</button>
</form>
{% endif %}
<div
id="filter_selected_{{view_id}}"
class="oh-checkpoint-badge text-warning d-none quick-bulk-action"
style="cursor: pointer;
color:hsl(7.8deg 91% 60%) !important;"
onclick="
ids = $('#{{selected_instances_key_id}}').attr('data-ids');
$('#bulk_update_get_form{{view_id}}').closest('form').find('[name=instance_ids]').val(ids);
$('#bulk_update_get_form{{view_id}}').click();
$(this).find('[name=selected_ids]').val(ids);
$(this).find('[type=submit]').click()
"
>
<form style="display: inline;"
hx-post="{{request.path}}?show_all=false" hx-target="#{{view_id|safe}}" hx-swap="outerHTML"
onsubmit="event.preventDefault()"
hx-on:submit="htmxLoadIndicator(this);">
<input type="hidden" name="selected_ids" value="{{request.sesssion.hlv_selected_ids}}">
<span class="label"
{% comment %} style="display: none;" {% endcomment %}
>
{% trans "Filter" %}
</span>
<button hidden onclick="event.stopPropagation()" type="submit"></button>
</form>
{% endif %}
(<span class="count_{{view_id}}">
0
</span>)
</div>
{% if request.session.hlv_selected_ids %}
<div
hx-get="{{request.path}}?show_all=true" hx-target="#{{view_id|safe}}" hx-swap="outerHTML"
id="show_selected{{view_id}}"
class="oh-checkpoint-badge text-warning quick-bulk-action"
style="cursor: pointer;
color: hsl(203.16deg 91% 60%) !important;
"
>
<span class="label"
{% comment %} style="display: none;" {% endcomment %}
>
{% trans "Show All" %}
</span>
(<span class="">
{{request.actual_ids|length}}
</span>)
</div>
{% endif %}
{% for filter in stored_filters %}
<div class="oh-hover-btn-container"
hx-get="{{request.path}}?{{filter.urlencode}}"