diff --git a/static/css/select2.css b/static/css/select2.css index 0c64022..0e4dffc 100644 --- a/static/css/select2.css +++ b/static/css/select2.css @@ -4,4 +4,9 @@ border-radius: 3px !important; border: 1px solid #939799 !important; height: 100% !important; +} + +.django-select2 { + /* Hide the default select. This may be a bug in Select2? */ + display: none; } \ No newline at end of file diff --git a/webportal/forms.py b/webportal/forms.py index 9c56fff..4b37a3b 100644 --- a/webportal/forms.py +++ b/webportal/forms.py @@ -43,15 +43,3 @@ class MaterialSearchForm(forms.Form): widget=Select2Widget(), label="", ) - - def __init__(self, *args, **kwargs): - self.request = kwargs.pop("request", None) - super().__init__(*args, **kwargs) - if self.request: - self.fields["material"].queryset = Material.objects.filter( - user=self.request.user - ) - if prefix := kwargs.get("prefix", None): - self.prefix = prefix - if auto_id := kwargs.get("auto_id", None): - self.auto_id = auto_id diff --git a/webportal/templates/webportal/base.html b/webportal/templates/webportal/base.html index 7df2c4c..4b5abb6 100644 --- a/webportal/templates/webportal/base.html +++ b/webportal/templates/webportal/base.html @@ -54,23 +54,26 @@ - diff --git a/webportal/templates/webportal/partials/assemblies/assembly.html b/webportal/templates/webportal/partials/assemblies/assembly.html index d31f5c4..279b311 100644 --- a/webportal/templates/webportal/partials/assemblies/assembly.html +++ b/webportal/templates/webportal/partials/assemblies/assembly.html @@ -9,7 +9,7 @@ hx-post="{% url 'update-assembly-name' assembly.id %}" hx-target="#assembly-name" hx-swap="outerHTML" - hx-trigger="keyup delay:500ms" + hx-trigger="submit, focusout" class="flex flex-1" > +
-
Thickness [M]
Layer Material
-
+
{% for layer_view in layer_views %} {% block layer %} -
-
- - - - - - +
+ + + + + -
- -
- -
- {% for segment, form in layer_view.segments_and_forms %} -
- {{ form }} -
- {% endfor %} -
+
+ +
+ +
+ {% for segment, form in layer_view.segments_and_forms %} +
+ {{ form }} +
+ {% endfor %}
+
{% endblock %} - {% endfor %}
- +
{% endblock %} - + {% endcomment %} {% endif %}
diff --git a/webportal/views.py b/webportal/views.py index a1fab71..c4e0368 100644 --- a/webportal/views.py +++ b/webportal/views.py @@ -28,6 +28,25 @@ class UnitSystem(Enum): IP = "IP" +class LayerView: + """A helper class to manage the Layer and its segments/forms in the Assembly view.""" + + def __init__(self, layer: Layer): + self.layer = layer + self.segments = layer.get_ordered_segments() + self.forms = [ + MaterialSearchForm( + prefix=f"form_{segment.pk}", + initial={"material": segment.material.pk if segment.material else None}, + ) + for segment in self.segments + ] + + @property + def segments_and_forms(self): + return zip(self.segments, self.forms) + + @require_POST def set_unit_system(request: WSGIRequest) -> HttpResponse: if request.POST.get("unit-system", None): @@ -236,19 +255,6 @@ def assemblies_page(request: WSGIRequest) -> HttpResponse: return render(request, "webportal/assemblies.html", context) -class LayerView: - def __init__(self, layer: Layer): - self.layer = layer - self.segments = layer.get_ordered_segments() - self.forms = [ - MaterialSearchForm(prefix=f"form_{segment.pk}") for segment in self.segments - ] - - @property - def segments_and_forms(self): - return zip(self.segments, self.forms) - - @login_required def assembly(request: WSGIRequest, pk: int | None) -> HttpResponse: """The Assembly view with the sidebar. @@ -257,7 +263,7 @@ def assembly(request: WSGIRequest, pk: int | None) -> HttpResponse: """ print(f">> assembly/{pk}") - # ------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------- # -- Detail-View this_assembly = get_object_or_404(Assembly, pk=pk) layers: list[Layer] = this_assembly.get_ordered_layers() @@ -269,11 +275,11 @@ def assembly(request: WSGIRequest, pk: int | None) -> HttpResponse: "webportal/partials/assemblies/assembly.html", context={ "assembly": this_assembly, - "layer_views": [LayerView(layer) for layer in layers], + "layer_views": (LayerView(layer) for layer in layers), }, ) - # ------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------- # -- Sidebar sidebar_html = render_block_to_string( "webportal/partials/assemblies/sidebar.html", @@ -383,13 +389,16 @@ def update_layer_material( request: WSGIRequest, assembly_pk: int, layer_pk: int ) -> HttpResponse: print(f">> {assembly_pk}/update_layer_material/{layer_pk}") + layer = get_object_or_404(Layer, id=layer_pk) + print(">> Layer:", layer) if request.method == "POST": - # Select2 will return something like 'form_2-material' as the key - if mat_id := request.POST.get(f"segment_{layer.pk}-material", None): - new_material = Material.objects.get(id=mat_id) - for segment in layer.segments.all(): + for segment in layer.segments.all(): + print(">> Segment:", segment) + # Select2 will return something like 'form_2-material' as the key + if mat_id := request.POST.get(f"form_{segment.pk}-material", None): + new_material = Material.objects.get(id=mat_id) segment.material = new_material segment.save() - return HttpResponse(new_material.name) + return HttpResponse(new_material.name) return HttpResponse()