Skip to content

Commit 75bdb0a

Browse files
author
oko-x
committed
triv: added modal view for action and selection action, inlines adding to top of the stack, added several blocks
1 parent 5954bea commit 75bdb0a

File tree

9 files changed

+146
-28
lines changed

9 files changed

+146
-28
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
from django.http import HttpResponse
2+
from django.views.generic import FormView
3+
from django_htmx.http import trigger_client_event
4+
from django_smartbase_admin.actions.admin_action_list import SBAdminListAction
5+
6+
7+
class ActionModalView(FormView):
8+
template_name = "sb_admin/partials/modal/modal_content.html"
9+
form_class = None
10+
modal_title = ""
11+
12+
def process_form_valid(self, request, form):
13+
response = HttpResponse()
14+
trigger_client_event(response, "hideModal", {})
15+
trigger_client_event(
16+
response,
17+
"SBAdminReloadTableData",
18+
{},
19+
)
20+
return response
21+
22+
def post(self, request, *args, **kwargs):
23+
form = self.get_form()
24+
if form.is_valid():
25+
return self.process_form_valid(request, form)
26+
else:
27+
return self.form_invalid(form)
28+
29+
def get_modal_title(self):
30+
return self.modal_title
31+
32+
def get_context_data(self, **kwargs):
33+
context = super().get_context_data(**kwargs)
34+
context["modal_title"] = self.get_modal_title()
35+
return context
36+
37+
38+
class ListActionModalView(ActionModalView):
39+
view = None
40+
41+
def __init__(self, view=None, *args, **kwargs):
42+
self.view = view
43+
super().__init__(*args, **kwargs)
44+
45+
def process_form_valid(self, request, form):
46+
response = super().process_form_valid(request, form)
47+
self.process_form_valid_list_selection_queryset(
48+
request, form, self.get_selection_queryset(request, form)
49+
)
50+
return response
51+
52+
def get_selection_queryset(self, request, form):
53+
list_action = SBAdminListAction(self.view, request)
54+
return list_action.get_data_queryset().filter(
55+
list_action.get_selection_queryset()
56+
)
57+
58+
def process_form_valid_list_selection_queryset(
59+
self, request, form, selection_queryset
60+
):
61+
pass

src/django_smartbase_admin/static/sb_admin/src/js/main.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ class Main {
4040
document.addEventListener('formset:added', (e) => {
4141
this.initDropdowns(e.target)
4242
this.initFileInputs(e.target)
43+
if (e.target !== e.target.parentNode.firstChild) {
44+
e.target.parentNode.insertBefore(e.target, e.target.parentNode.firstChild)
45+
}
4346
})
4447
document.addEventListener('openUrl', (e) => {
4548
window.open(e.detail.url, e.detail?.target || '_blank')

src/django_smartbase_admin/templates/sb_admin/actions/change_form.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
{{ media }}
88
{% endblock %}
99

10+
{% block view_class %}change-form{% endblock %}
11+
1012
{% block js %}
1113
{{ block.super }}
1214
<script type="text/javascript"

src/django_smartbase_admin/templates/sb_admin/actions/list.html

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
{% extends list_base_template|default:"sb_admin/sb_admin_base.html" %}
22
{% load sb_admin_tags i18n static %}
33

4+
{% block view_class %}change-list{% endblock %}
5+
46
{% block content %}
57
{% block form_modal %}
68
{% include 'sb_admin/partials/modal/modal.html' %}
@@ -113,7 +115,7 @@ <h1 class="text-24 md:text-30 text-dark-900 font-bold font-heading line-clamp-1
113115
class="btn btn-empty btn-small">{% trans 'Select none' %}
114116
</button>
115117
{% for list_selection_action in content_context.list_selection_actions %}
116-
<button {% if list_action.open_in_modal %}{% include 'sb_admin/actions/partials/open_modal_attrs.html' with action=list_action %} hx-vals="js:{params: window.SBAdminTable['{{ view_id }}'].getAllUrlParams()}" {% else %}onclick="window.location.href='{{ list_selection_action.url }}' + window.SBAdminTable['{{ view_id }}'].getUrlParamsString()"{% endif %}
118+
<button {% if list_selection_action.open_in_modal %}{% include 'sb_admin/actions/partials/open_modal_attrs.html' with action=list_selection_action %} hx-vals="js:{params: window.SBAdminTable['{{ view_id }}'].getAllUrlParams()}" {% else %}onclick="window.location.href='{{ list_selection_action.url }}' + window.SBAdminTable['{{ view_id }}'].getUrlParamsString()"{% endif %}
117119
class="btn btn-small {{ list_selection_action.css_class|default_if_none:'' }}">{{ list_selection_action.title }}
118120
</button>
119121
{% endfor %}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{% load widget_tweaks %}
2+
{% if inline_admin_formset.formset.can_delete %}
3+
{% if inline_admin_form.original %}
4+
<td class="w-40">
5+
<div class="relative min-h-40 flex items-center delete djn-delete-handler {{ inline_admin_formset.handler_classes|join:" " }}">
6+
{% render_field inline_admin_form.deletion_field.field class="checkbox checkbox-delete" %}
7+
<label for="{{ inline_admin_form.deletion_field.field.auto_id }}">
8+
<svg class="w-20 h-20">
9+
<use xlink:href="#Delete"></use>
10+
</svg>
11+
</label>
12+
</div>
13+
</td>
14+
{% else %}
15+
<td class="delete w-40">
16+
<a
17+
class="flex-center h-40 inline-deletelink djn-remove-handler {{ inline_admin_formset.handler_classes|join:" " }}"
18+
href="javascript:void(0)">
19+
<svg class="w-20 h-20 text-dark-300 hover:text-dark-400">
20+
<use xlink:href="#Delete"></use>
21+
</svg>
22+
</a>
23+
</td>
24+
{% endif %}
25+
{% endif %}

src/django_smartbase_admin/templates/sb_admin/inlines/table_inline.html

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,9 @@
136136
{% endspaceless %}
137137
</td>
138138

139+
{% block table_inline_after_sortable %}
140+
{% endblock %}
141+
139142
{% for fieldset in inline_admin_form %}
140143
{% for line in fieldset %}
141144
{% for field in line %}
@@ -154,25 +157,9 @@
154157
{% endfor %}
155158
{% endfor %}
156159
{% endfor %}
157-
{% if inline_admin_formset.formset.can_delete %}
158-
{% if inline_admin_form.original %}
159-
<td>
160-
<div class="relative min-h-40 flex items-center delete djn-delete-handler {{ inline_admin_formset.handler_classes|join:" " }}">
161-
{% render_field inline_admin_form.deletion_field.field class="checkbox checkbox-delete" %}
162-
<label for="{{ inline_admin_form.deletion_field.field.auto_id }}">
163-
<svg class="w-20 h-20"><use xlink:href="#Delete"></use></svg>
164-
</label>
165-
</div>
166-
</td>
167-
{% else %}
168-
<td class="delete">
169-
<a
170-
class="flex-center h-40 inline-deletelink djn-remove-handler {{ inline_admin_formset.handler_classes|join:" " }}"
171-
href="javascript:void(0)"><svg class="w-20 h-20 text-dark-300 hover:text-dark-400"><use xlink:href="#Delete"></use></svg></a>
172-
</td>
173-
{% endif %}
174-
{% endif %}
175-
160+
{% block table_inline_delete_button %}
161+
{% include "sb_admin/includes/table_inline_delete_button.html" %}
162+
{% endblock %}
176163
</tr>
177164

178165
{% if inline_admin_form.form.inlines %}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
{% load i18n %}
2+
3+
{% block content %}
4+
<div class="modal-dialog">
5+
<div class="modal-content">
6+
{% include 'sb_admin/includes/loading_absolute.html' with additional_class="sb-admin-modal-loading" %}
7+
{% block modal_content %}
8+
<div class="modal-header">
9+
{% block modal_header %}
10+
<h3 class="text-dark-900 text-18 font-semibold leading-28">{% block modal_title %}{{ modal_title }}{% endblock %}</h3>
11+
<svg data-bs-dismiss="modal" aria-label="Close"
12+
class="w-24 h-24 absolute top-16 right-16 cursor-pointer transition-transform hover:rotate-90">
13+
<use xlink:href="#Close-small"></use>
14+
</svg>
15+
{% endblock %}
16+
</div>
17+
<div class="modal-body">
18+
{% block modal_body %}
19+
{{ form.non_field_errors }}
20+
<form id="sb-admin-modal-form" hx-indicator=".sb-admin-modal-loading" hx-target="#sb-admin-modal" hx-post="{{ request.get_full_path }}" action="{{ request.get_full_path }}" method="post">
21+
{% block modal_form_body %}
22+
{{ form.as_p }}
23+
{% endblock %}
24+
</form>
25+
{% endblock %}
26+
</div>
27+
<div class="modal-footer">
28+
{% block modal_footer %}
29+
<button form="sb-admin-modal-form" type="button" class="btn btn-destructive mr-10" data-bs-dismiss="modal">{% trans 'Close' %}</button>
30+
<button form="sb-admin-modal-form" type="submit" class="btn btn-primary">{% trans 'Continue' %}</button>
31+
{% endblock %}
32+
</div>
33+
{% endblock %}
34+
</div>
35+
</div>
36+
{% endblock %}

src/django_smartbase_admin/templates/sb_admin/sb_admin_base.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
{% block main_wrapper %}
44
<div class="w-full h-full min-h-full xl:pl-260">
55
{% include 'sb_admin/navigation.html' %}
6-
<div class="min-h-screen sm:p-24 relative flex flex-col">
6+
<div class="min-h-screen sm:p-24 relative flex flex-col {% block view_class %}{% endblock %}">
77
{% include "sb_admin/includes/loading.html" %}
88
{% include "sb_admin/includes/notifications.html" %}
99

@@ -12,4 +12,4 @@
1212
{{ inner_content }}
1313
</div>
1414
</div>
15-
{% endblock %}
15+
{% endblock %}

src/django_smartbase_admin/templates/sb_admin/widgets/autocomplete.html

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@
77
data-bs-toggle="dropdown"
88
aria-expanded="false"
99
data-bs-offset="[0, 8]"
10-
class="btn px-10 font-normal w-full"
10+
class="autocomplete-button btn px-10 font-normal w-full"
1111
>
12-
<span id="{{ widget.attrs.id }}-value">{{ widget.form_field.empty_label }}</span>
13-
<svg class="ml-8">
14-
<use xlink:href="#Down"></use>
15-
</svg>
12+
{% block autocomplete_button_text %}
13+
<span id="{{ widget.attrs.id }}-value">{{ widget.form_field.empty_label }}</span>
14+
<svg class="ml-8">
15+
<use xlink:href="#Down"></use>
16+
</svg>
17+
{% endblock %}
1618
</button>
1719
<div class="dropdown-menu max-h-none w-248">
1820
<div class="px-12 pt-8">
@@ -33,7 +35,7 @@
3335
</div>
3436
{% endif %}
3537
{% if widget.form_field.required %}
36-
<div class="pb-8"></div>
38+
<div class="pb-8"></div>
3739
{% else %}
3840
<div class="relative px-12 py-8 flex">
3941
<button type="button"

0 commit comments

Comments
 (0)