Compare commits

3 Commits

Author SHA1 Message Date
1b1d0f1b5c Reports 2024-04-06 23:32:41 +02:00
5e1989a60f Complex form 2024-04-06 22:04:57 +02:00
ad14f2fe12 Complex form 2024-04-06 19:42:32 +02:00
14 changed files with 506 additions and 19 deletions

View File

@ -1,3 +1,4 @@
import random
from typing import Any
from jinja2 import Environment
@ -11,10 +12,17 @@ def conditional_cls(conditions: dict[str, Any]) -> str:
return " ".join(result)
def random_id() -> str:
return f"_{random.randint(0, 10**8)}"
def environment(**options):
env = Environment(**options)
env.globals.update({
env.globals.update(
{
"conditional_cls": conditional_cls,
})
"random_id": random_id,
}
)
return env

View File

@ -1,8 +0,0 @@
{% extends "main/base/layout.html" %}
{% block content %}
<p>
This is some complex form content bellow.
</p>
{% endblock %}

View File

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

@ -0,0 +1,104 @@
{% 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 Route module",
name="route_module",
state=state.enabled
) }}
<hr>
{{ checkbox(
title="Smart routing",
name="smart_routing",
state=state.smart_routing
) }}
{{ checkbox(
title="Predictive pickup",
name="predictive_pickup",
state=state.predictive_pickup,
cls=indent_1
) }}
{{ checkbox(
title="Automatic planning",
name="automatic_planning",
state=state.automatic_planning,
cls=indent_1
) }}
{{ checkbox(
title="Geo routing",
name="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
) }}
{{ 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(
title="Packing model",
name="packing_model",
options={
"": "No packing model",
"per_route": "Packing model per route",
"per_machine": "Packing model per machine",
},
state=state.packing_model
) }}
{{ checkbox(
title="Prekitting to box",
name="prekitting_to_box",
state=state.prekitting_to_box,
cls=indent_1
) }}
{{ checkbox(
title="Prekitting to pallet",
name="prekitting_to_pallet",
state=state.prekitting_to_pallet,
cls=indent_1
) }}
{{ checkbox(
title="Real time stock",
name="real_time_stock",
state=state.real_time_stock,
cls=indent_1
) }}
</div>

View File

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

View File

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

View File

@ -1,7 +0,0 @@
from project.main.views.demo_view_base import DemoViewBase
class ComplexFormView(DemoViewBase):
template_name = "main/complex_form.html"
active_section = "complex-form"
title = "Complex Form"

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

@ -0,0 +1,15 @@
from dataclasses import dataclass
@dataclass
class CheckboxState:
checked: bool = False
visible: bool = True
enabled: bool = True
@dataclass
class SelectState:
value: str = None
visible: bool = True
enabled: bool = True

View File

@ -0,0 +1,73 @@
from dataclasses import dataclass
from typing import Any
from django.core.handlers.wsgi import WSGIRequest
from django.http import HttpResponse
from django.views.generic import TemplateView
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
@dataclass
class FormState:
route_module: RouteModuleState
reports: ReportsState
def control_state(self) -> None:
self.route_module.control_state()
self.reports.control_state()
class ComplexFormView(DemoViewBase):
template_name = "main/complex_form/container.html"
active_section = "complex-form"
title = "Complex Form"
def get_context_data(self, **kwargs) -> dict[str, Any]:
context = super().get_context_data(**kwargs)
state = FormState(
route_module=RouteModuleState.from_form(values={}),
reports=ReportsState.from_form(values={}),
)
state.control_state()
context.update(
{
"form_state": state,
}
)
return context
def post(self, request: WSGIRequest, *args, **kwargs) -> HttpResponse:
...
class RouteModuleHandleView(TemplateView):
template_name = "main/complex_form/route_module.html"
def post(self, request: WSGIRequest, *args, **kwargs) -> HttpResponse:
state = RouteModuleState.from_form(values=request.POST)
state.control_state()
return self.render_to_response(
context={
"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,5 +8,7 @@ urlpatterns = [
path("filter-list", views.FilterListView.as_view(), name="filter-list"),
path("form-validation", views.FormValidationView.as_view(), name="form-validation"),
path("complex-form", views.ComplexFormView.as_view(), name="complex-form"),
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"),
]