This commit is contained in:
Eden Kirin
2024-04-06 23:32:41 +02:00
parent 5e1989a60f
commit 1b1d0f1b5c
11 changed files with 386 additions and 182 deletions

View File

@ -1,13 +1,29 @@
{% extends "main/base/layout.html" %} {% extends "main/base/layout.html" %}
{% block content %} {% block content %}
<form <form class="row">
hx-post="{{ url("complex-form-handle") }}" <div
class="col"
hx-post="{{ url("complex-form-handle-route-module") }}"
hx-trigger="change" hx-trigger="change"
hx-target="#complex-form-content" hx-target="#route-module-content"
> >
<div id="complex-form-content"> <div id="route-module-content">
{% set state = form_state.route_module %}
{% include "main/complex_form/route_module.html" %} {% include "main/complex_form/route_module.html" %}
</div> </div>
</div>
<div
class="col"
hx-post="{{ url("complex-form-handle-reports") }}"
hx-trigger="change"
hx-target="#reports-content"
>
<div id="reports-content">
{% set state = form_state.reports %}
{% include "main/complex_form/reports.html" %}
</div>
</div>
</form> </form>
{% endblock %} {% endblock %}

View File

@ -0,0 +1,86 @@
{% from "main/components/inputs.html" import checkbox, select %}
{% set indent_1 = "ms-4" %}
{% set indent_2 = "ms-5" %}
<div class="card p-3">
{{ checkbox(
title="Enable Reports",
name="reports",
state=state.enabled
) }}
<hr>
{{ checkbox(
title="Allow empty cashbag",
name="allow_empty_cashbag",
state=state.allow_empty_cashbag
) }}
{{ checkbox(
title="Reports builder",
name="reports_builder",
state=state.reports_builder
) }}
{{ checkbox(
title="Tax reports",
name="tax_reports",
state=state.tax_reports
) }}
{{ checkbox(
title="Transaction list",
name="transaction_list",
state=state.transaction_list
) }}
{{ checkbox(
title="Reports generator",
name="reports_generator",
state=state.reports_generator
) }}
{{ checkbox(
title="Technical center reports",
name="technical_center_reports",
state=state.technical_center_reports
) }}
{{ checkbox(
title="Dispense list",
name="dispense_list",
state=state.dispense_list
) }}
{{ checkbox(
title="Cash conformity",
name="cash_conformity",
state=state.cash_conformity
) }}
{{ checkbox(
title="Scan 2nd barcode",
name="scan_2nd_bardcode",
state=state.scan_2nd_bardcode,
cls=indent_1
) }}
{{ select(
title="Days between CC",
name="days_between_cc",
options={
"1": "1",
"2": "2",
"3": "3",
"4": "4",
"5": "5",
"6": "6",
"7": "7",
"8": "8",
"9": "9",
"14": "14",
"30": "30",
"31": "31",
"60": "60",
"90": "90",
"365": "365",
},
state=state.days_between_cc,
cls=indent_1
) }}
</div>

View File

@ -3,38 +3,73 @@
{% set indent_1 = "ms-4" %} {% set indent_1 = "ms-4" %}
{% set indent_2 = "ms-5" %} {% set indent_2 = "ms-5" %}
{% set state = form_state.route_module %} <div class="card p-3">
{{ checkbox( {{ checkbox(
title="Route module", title="Enable Route module",
name="route_module", name="route_module",
state=state.enabled state=state.enabled
) }} ) }}
<hr>
{{ checkbox( {{ checkbox(
title="Smart routing", title="Smart routing",
name="smart_routing", name="smart_routing",
state=state.smart_routing, state=state.smart_routing
cls=indent_1
) }} ) }}
{{ checkbox( {{ checkbox(
title="Predictive pickup", title="Predictive pickup",
name="predictive_pickup", name="predictive_pickup",
state=state.predictive_pickup, state=state.predictive_pickup,
cls=indent_2 cls=indent_1
) }} ) }}
{{ checkbox( {{ checkbox(
title="Automatic planning", title="Automatic planning",
name="automatic_planning", name="automatic_planning",
state=state.automatic_planning, state=state.automatic_planning,
cls=indent_2 cls=indent_1
) }} ) }}
{{ checkbox( {{ checkbox(
title="Geo routing", title="Geo routing",
name="geo_routing", name="geo_routing",
state=state.geo_routing, state=state.geo_routing
) }}
{{ checkbox(
title="Warehouse",
name="warehouse",
state=state.warehouse
) }}
{{ checkbox(
title="End warehouse tracking",
name="end_warehouse_tracking",
state=state.end_warehouse_tracking,
cls=indent_1 cls=indent_1
) }} ) }}
{{ checkbox(
title="Pick&Pack application",
name="pick_and_pack_application",
state=state.pick_and_pack_application,
cls=indent_1
) }}
{{ checkbox(
title="Custom forms in routing",
name="custom_forms_in_routing",
state=state.custom_forms_in_routing
) }}
{{ checkbox(
title="Money bag tracking",
name="money_bag_tracking",
state=state.money_bag_tracking
) }}
{{ select( {{ select(
title="Packing model", title="Packing model",
name="packing_model", name="packing_model",
@ -43,44 +78,27 @@
"per_route": "Packing model per route", "per_route": "Packing model per route",
"per_machine": "Packing model per machine", "per_machine": "Packing model per machine",
}, },
state=state.packing_model, state=state.packing_model
cls=indent_1
) }} ) }}
{{ checkbox( {{ checkbox(
title="Prekitting to box", title="Prekitting to box",
name="prekitting_to_box", name="prekitting_to_box",
state=state.prekitting_to_box, state=state.prekitting_to_box,
cls=indent_2 cls=indent_1
) }} ) }}
{{ checkbox( {{ checkbox(
title="Prekitting to pallet", title="Prekitting to pallet",
name="prekitting_to_pallet", name="prekitting_to_pallet",
state=state.prekitting_to_pallet, state=state.prekitting_to_pallet,
cls=indent_2 cls=indent_1
) }} ) }}
{{ checkbox( {{ checkbox(
title="Real time stock", title="Real time stock",
name="real_time_stock", name="real_time_stock",
state=state.real_time_stock, state=state.real_time_stock,
cls=indent_2
) }}
{{ checkbox(
title="Warehouse",
name="warehouse",
state=state.warehouse,
cls=indent_1
) }}
{{ checkbox(
title="End warehouse tracking",
name="end_warehouse_tracking",
state=state.end_warehouse_tracking,
cls=indent_2
) }}
{{ checkbox(
title="Custom forms in routing",
name="custom_forms_in_routing",
state=state.custom_forms_in_routing,
cls=indent_1 cls=indent_1
) }} ) }}
</div>

View File

@ -2,7 +2,7 @@
{% if state.visible %} {% if state.visible %}
{% set id = random_id() %} {% set id = random_id() %}
<div class="form-check {{ cls }}"> <div class="form-check {{ cls }} mb-2">
<input <input
class="form-check-input" class="form-check-input"
type="checkbox" type="checkbox"
@ -22,15 +22,20 @@
{% macro select(title, name, options, state, cls="") %} {% macro select(title, name, options, state, cls="") %}
{% if state.visible %} {% if state.visible %}
<div class="{{ cls }}"> <div class="{{ cls }}">
{% if title %}
<label class="form-label {% if not state.enabled %}text-secondary{% endif %}">
{{ title }}
</label>
{% endif %}
<select <select
name="{{ name }}" name="{{ name }}"
class="form-select form-select-sm" class="form-select mb-2"
{% if not state.enabled %}disabled{% endif %}
> >
{% for value, title in options.items() %} {% for value, title in options.items() %}
<option <option
value="{{ value }}" value="{{ value }}"
{% if value == state.value %}selected{% endif %} {% if value == state.value %}selected{% endif %}
{% if not state.enabled %}disabled {% endif %}
> >
{{ title }} {{ title }}
</option> </option>

View File

@ -1,4 +1,4 @@
from .complex_form.views import ComplexFormHandleView, ComplexFormView from .complex_form.views import RouteModuleHandleView, ComplexFormView, ReportsHandleView
from .filter_list import FilterListView from .filter_list import FilterListView
from .form_validation import FormValidationView from .form_validation import FormValidationView
from .home import HomeView from .home import HomeView

View File

@ -0,0 +1,47 @@
from dataclasses import dataclass
from project.main.views.complex_form.state_models import CheckboxState, SelectState
@dataclass
class ReportsState:
enabled: CheckboxState
cash_conformity: CheckboxState
days_between_cc: SelectState
scan_2nd_bardcode: CheckboxState
allow_empty_cashbag: CheckboxState
reports_builder: CheckboxState
tax_reports: CheckboxState
transaction_list: CheckboxState
reports_generator: CheckboxState
technical_center_reports: CheckboxState
dispense_list: CheckboxState
@staticmethod
def from_form(values: dict[str, str]) -> "ReportsState":
print(values)
return ReportsState(
enabled=CheckboxState(checked=values.get("reports") == "on"),
cash_conformity=CheckboxState(checked=values.get("cash_conformity") == "on"),
days_between_cc=SelectState(value=values.get("days_between_cc")),
scan_2nd_bardcode=CheckboxState(checked=values.get("scan_2nd_bardcode") == "on"),
allow_empty_cashbag=CheckboxState(checked=values.get("allow_empty_cashbag") == "on"),
reports_builder=CheckboxState(checked=values.get("reports_builder") == "on"),
tax_reports=CheckboxState(checked=values.get("tax_reports") == "on"),
transaction_list=CheckboxState(checked=values.get("transaction_list") == "on"),
reports_generator=CheckboxState(checked=values.get("reports_generator") == "on"),
technical_center_reports=CheckboxState(checked=values.get("technical_center_reports") == "on"),
dispense_list=CheckboxState(checked=values.get("dispense_list") == "on"),
)
def control_state(self) -> None:
self.cash_conformity.enabled = self.enabled.checked
self.days_between_cc.enabled = self.cash_conformity.enabled and self.cash_conformity.checked
self.scan_2nd_bardcode.enabled = self.cash_conformity.enabled and self.cash_conformity.checked
self.allow_empty_cashbag.enabled = self.enabled.checked
self.reports_builder.enabled = self.enabled.checked
self.tax_reports.enabled = self.enabled.checked
self.transaction_list.enabled = self.enabled.checked
self.reports_generator.enabled = self.enabled.checked
self.technical_center_reports.enabled = self.enabled.checked
self.dispense_list.enabled = self.enabled.checked

View File

@ -0,0 +1,92 @@
from dataclasses import dataclass
from project.main.views.complex_form.state_models import CheckboxState, SelectState
@dataclass
class RouteModuleState:
enabled: CheckboxState
smart_routing: CheckboxState
predictive_pickup: CheckboxState
automatic_planning: CheckboxState
geo_routing: CheckboxState
packing_model: SelectState
prekitting_to_box: CheckboxState
prekitting_to_pallet: CheckboxState
real_time_stock: CheckboxState
warehouse: CheckboxState
end_warehouse_tracking: CheckboxState
pick_and_pack_application: CheckboxState
custom_forms_in_routing: CheckboxState
money_bag_tracking: CheckboxState
@staticmethod
def from_form(values: dict[str, str]) -> "RouteModuleState":
return RouteModuleState(
enabled=CheckboxState(checked=values.get("route_module") == "on"),
smart_routing=CheckboxState(checked=values.get("smart_routing") == "on"),
predictive_pickup=CheckboxState(
checked=values.get("predictive_pickup") == "on"
),
automatic_planning=CheckboxState(
checked=values.get("automatic_planning") == "on"
),
geo_routing=CheckboxState(checked=values.get("geo_routing") == "on"),
packing_model=SelectState(value=values.get("packing_model")),
prekitting_to_box=CheckboxState(
checked=values.get("prekitting_to_box") == "on"
),
prekitting_to_pallet=CheckboxState(
checked=values.get("prekitting_to_pallet") == "on"
),
real_time_stock=CheckboxState(
checked=values.get("real_time_stock") == "on"
),
warehouse=CheckboxState(checked=values.get("warehouse") == "on"),
end_warehouse_tracking=CheckboxState(
checked=values.get("end_warehouse_tracking") == "on"
),
pick_and_pack_application=CheckboxState(
checked=values.get("pick_and_pack_application") == "on"
),
custom_forms_in_routing=CheckboxState(
checked=values.get("custom_forms_in_routing") == "on"
),
money_bag_tracking=CheckboxState(
checked=values.get("money_bag_tracking") == "on"
),
)
def control_state(self) -> None:
self.smart_routing.enabled = self.enabled.checked
self.geo_routing.enabled = self.enabled.checked
self.warehouse.enabled = self.enabled.checked
self.custom_forms_in_routing.enabled = self.enabled.checked
self.predictive_pickup.visible = (
self.smart_routing.checked and self.smart_routing.enabled
)
self.automatic_planning.visible = (
self.smart_routing.checked and self.smart_routing.enabled
)
self.end_warehouse_tracking.visible = (
self.warehouse.checked and self.warehouse.enabled
)
self.pick_and_pack_application.visible = (
self.warehouse.checked and self.warehouse.enabled
)
if not self.enabled.checked:
self.packing_model.value = None
self.packing_model.enabled = self.enabled.checked
self.prekitting_to_box.visible = (
self.packing_model.enabled and self.packing_model.value
)
self.prekitting_to_pallet.visible = (
self.packing_model.enabled and self.packing_model.value
)
self.real_time_stock.visible = (
self.packing_model.enabled and self.packing_model.value
)
self.money_bag_tracking.enabled = self.enabled.checked

View File

@ -13,55 +13,3 @@ class SelectState:
value: str = None value: str = None
visible: bool = True visible: bool = True
enabled: bool = True enabled: bool = True
@dataclass
class RouteModuleState:
enabled: CheckboxState
smart_routing: CheckboxState
predictive_pickup: CheckboxState
automatic_planning: CheckboxState
geo_routing: CheckboxState
packing_model: SelectState
prekitting_to_box: CheckboxState
prekitting_to_pallet: CheckboxState
real_time_stock: CheckboxState
warehouse: CheckboxState
end_warehouse_tracking: CheckboxState
custom_forms_in_routing: CheckboxState
@staticmethod
def from_form(values: dict[str, str]) -> "RouteModuleState":
return RouteModuleState(
enabled=CheckboxState(checked=values.get("route_module") == "on"),
smart_routing=CheckboxState(checked=values.get("smart_routing") == "on"),
predictive_pickup=CheckboxState(
checked=values.get("predictive_pickup") == "on"
),
automatic_planning=CheckboxState(
checked=values.get("automatic_planning") == "on"
),
geo_routing=CheckboxState(checked=values.get("geo_routing") == "on"),
packing_model=SelectState(value=values.get("packing_model")),
prekitting_to_box=CheckboxState(
checked=values.get("prekitting_to_box") == "on"
),
prekitting_to_pallet=CheckboxState(
checked=values.get("prekitting_to_pallet") == "on"
),
real_time_stock=CheckboxState(
checked=values.get("real_time_stock") == "on"
),
warehouse=CheckboxState(checked=values.get("warehouse") == "on"),
end_warehouse_tracking=CheckboxState(
checked=values.get("end_warehouse_tracking") == "on"
),
custom_forms_in_routing=CheckboxState(
checked=values.get("custom_forms_in_routing") == "on"
),
)
@dataclass
class FormState:
route_module: RouteModuleState

View File

@ -1,43 +1,23 @@
from dataclasses import dataclass
from typing import Any from typing import Any
from django.core.handlers.wsgi import WSGIRequest from django.core.handlers.wsgi import WSGIRequest
from django.http import HttpResponse from django.http import HttpResponse
from django.views.generic import TemplateView from django.views.generic import TemplateView
from project.main.views.complex_form.state_models import CheckboxState, FormState, SelectState, RouteModuleState from project.main.views.complex_form.reports_state import ReportsState
from project.main.views.complex_form.route_module_state import RouteModuleState
from project.main.views.demo_view_base import DemoViewBase from project.main.views.demo_view_base import DemoViewBase
@dataclass
class FormState:
route_module: RouteModuleState
reports: ReportsState
def control_state(self) -> None:
# def control_state(state: FormState) -> None: self.route_module.control_state()
# state.smart_routing.enabled = state.route_module.checked self.reports.control_state()
# state.geo_routing.enabled = state.route_module.checked
# state.warehouse.enabled = state.route_module.checked
# state.custom_forms_in_routing.enabled = state.route_module.checked
#
# state.predictive_pickup.visible = (
# state.smart_routing.checked and state.smart_routing.enabled
# )
# state.automatic_planning.visible = (
# state.smart_routing.checked and state.smart_routing.enabled
# )
# # state.prekitting_to_box.visible = (
# # state.use_packing_model_per_route.enabled
# # and state.use_packing_model_per_route.checked
# # )
# # state.prekitting_to_pallet.visible = (
# # state.use_packing_model_per_route.enabled
# # and state.use_packing_model_per_route.checked
# # )
# # state.real_time_stock.visible = (
# # state.use_packing_model_per_route.enabled
# # and state.use_packing_model_per_route.checked
# # )
# state.end_warehouse_tracking.visible = state.warehouse.checked
#
# print(state)
# print("-" * 100)
class ComplexFormView(DemoViewBase): class ComplexFormView(DemoViewBase):
@ -49,9 +29,10 @@ class ComplexFormView(DemoViewBase):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
state = FormState( state = FormState(
route_module=RouteModuleState.from_form(values={}) route_module=RouteModuleState.from_form(values={}),
reports=ReportsState.from_form(values={}),
) )
# control_state(state) state.control_state()
context.update( context.update(
{ {
@ -64,19 +45,29 @@ class ComplexFormView(DemoViewBase):
... ...
class ComplexFormHandleView(TemplateView): class RouteModuleHandleView(TemplateView):
template_name = "main/complex_form/route_module.html" template_name = "main/complex_form/route_module.html"
def post(self, request: WSGIRequest, *args, **kwargs) -> HttpResponse: def post(self, request: WSGIRequest, *args, **kwargs) -> HttpResponse:
print(request.POST) state = RouteModuleState.from_form(values=request.POST)
state = FormState( state.control_state()
route_module=RouteModuleState.from_form(values=request.POST),
)
# state = route_module_form_to_state(values=request.POST)
# control_state(state)
return self.render_to_response( return self.render_to_response(
context={ context={
"form_state": state, "state": state,
}
)
class ReportsHandleView(TemplateView):
template_name = "main/complex_form/reports.html"
def post(self, request: WSGIRequest, *args, **kwargs) -> HttpResponse:
state = ReportsState.from_form(values=request.POST)
state.control_state()
return self.render_to_response(
context={
"state": state,
} }
) )

View File

@ -8,6 +8,7 @@ urlpatterns = [
path("filter-list", views.FilterListView.as_view(), name="filter-list"), path("filter-list", views.FilterListView.as_view(), name="filter-list"),
path("form-validation", views.FormValidationView.as_view(), name="form-validation"), path("form-validation", views.FormValidationView.as_view(), name="form-validation"),
path("complex-form", views.ComplexFormView.as_view(), name="complex-form"), path("complex-form", views.ComplexFormView.as_view(), name="complex-form"),
path("complex-form/handle", views.ComplexFormHandleView.as_view(), name="complex-form-handle"), path("complex-form/handle/route-module", views.RouteModuleHandleView.as_view(), name="complex-form-handle-route-module"),
path("complex-form/handle/reports", views.ReportsHandleView.as_view(), name="complex-form-handle-reports"),
path("table-inline-edit", views.TableInlineEditView.as_view(), name="table-inline-edit"), path("table-inline-edit", views.TableInlineEditView.as_view(), name="table-inline-edit"),
] ]