Working on Work Log entry settings now.
This commit is contained in:
parent
15d0de44fe
commit
86c4f88b78
5 changed files with 89 additions and 7 deletions
|
|
@ -661,6 +661,30 @@ def _class_for(val: Any, classes: Optional[Dict[str, str]]) -> Optional[str]:
|
||||||
key = "none" if val is None else str(val).lower()
|
key = "none" if val is None else str(val).lower()
|
||||||
return classes.get(key, classes.get("default"))
|
return classes.get(key, classes.get("default"))
|
||||||
|
|
||||||
|
def _format_label_from_values(spec: Any, values: dict) -> Optional[str]:
|
||||||
|
if not spec:
|
||||||
|
return None
|
||||||
|
if isinstance(spec, (list, tuple)):
|
||||||
|
parts = []
|
||||||
|
for a in spec:
|
||||||
|
v = _deep_get(values, str(a))
|
||||||
|
parts.append("" if v is None else str(v))
|
||||||
|
return " ".join(p for p in parts if p)
|
||||||
|
|
||||||
|
s = str(spec)
|
||||||
|
if "{" in s and "}" in s:
|
||||||
|
names = re.findall(r"{\s*([^}:\s]+)", s)
|
||||||
|
data = {n: _deep_get(values, n) for n in names}
|
||||||
|
# wrap for safe .format()
|
||||||
|
data = {k: ("" if v is None else v) for k, v in data.items()}
|
||||||
|
try:
|
||||||
|
return s.format(**data)
|
||||||
|
except Exception:
|
||||||
|
return None
|
||||||
|
# simple field name
|
||||||
|
v = _deep_get(values, s)
|
||||||
|
return "" if v is None else str(v)
|
||||||
|
|
||||||
def _build_href(spec: Dict[str, Any], row: Dict[str, Any], obj) -> Optional[str]:
|
def _build_href(spec: Dict[str, Any], row: Dict[str, Any], obj) -> Optional[str]:
|
||||||
if not spec:
|
if not spec:
|
||||||
return None
|
return None
|
||||||
|
|
@ -915,6 +939,19 @@ def render_form(
|
||||||
if vl is not None:
|
if vl is not None:
|
||||||
f["value_label"] = vl
|
f["value_label"] = vl
|
||||||
|
|
||||||
|
for f in fields:
|
||||||
|
# existing FK label resolution
|
||||||
|
vl = _value_label_for_field(f, mapper, values_map, instance, session)
|
||||||
|
if vl is not None:
|
||||||
|
f["value_label"] = vl
|
||||||
|
# NEW: if not a relationship but a label_spec is provided, format from values
|
||||||
|
elif f.get("label_spec"):
|
||||||
|
base, rel_prop = _rel_for_id_name(mapper, f["name"])
|
||||||
|
if not rel_prop: # scalar field
|
||||||
|
vl2 = _format_label_from_values(f["label_spec"], values_map)
|
||||||
|
if vl2 is not None:
|
||||||
|
f["value_label"] = vl2
|
||||||
|
|
||||||
# Build rows (supports nested layout with parents)
|
# Build rows (supports nested layout with parents)
|
||||||
rows_map = _normalize_rows_layout(layout)
|
rows_map = _normalize_rows_layout(layout)
|
||||||
rows_tree = _assign_fields_to_rows(fields, rows_map)
|
rows_tree = _assign_fields_to_rows(fields, rows_map)
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,24 @@
|
||||||
{{k}}{% if v is not sameas true %}="{{ v }}"{% endif %}
|
{{k}}{% if v is not sameas true %}="{{ v }}"{% endif %}
|
||||||
{% endfor %}{% endif %}>{{ value_label if value_label else (value if value else "") }}</div>
|
{% endfor %}{% endif %}>{{ value_label if value_label else (value if value else "") }}</div>
|
||||||
|
|
||||||
|
{% elif field_type == "date" %}
|
||||||
|
<input type="date" name="{{ field_name }}" id="{{ field_name }}" value="{{ value if value else "" }}"
|
||||||
|
{% if attrs %}{% for k,v in attrs.items() %}
|
||||||
|
{{k}}{% if v is not sameas true %}="{{ v }}"{% endif %}
|
||||||
|
{% endfor %}{% endif %}>
|
||||||
|
|
||||||
|
{% elif field_type == "time" %}
|
||||||
|
<input type="time" name="{{ field_name }}" id="{{ field_name }}" value="{{ value if value else "" }}"
|
||||||
|
{% if attrs %}{% for k,v in attrs.items() %}
|
||||||
|
{{k}}{% if v is not sameas true %}="{{ v }}"{% endif %}
|
||||||
|
{% endfor %}{% endif %}>
|
||||||
|
|
||||||
|
{% elif field_type == "datetime" %}
|
||||||
|
<input type="datetime-local" name="{{ field_name }}" id="{{ field_name }}" value="{{ value if value else "" }}"
|
||||||
|
{% if attrs %}{% for k,v in attrs.items() %}
|
||||||
|
{{k}}{% if v is not sameas true %}="{{ v }}"{% endif %}
|
||||||
|
{% endfor %}{% endif %}>
|
||||||
|
|
||||||
{% else %}
|
{% else %}
|
||||||
<input type="text" name="{{ field_name }}" id="{{ field_name }}" value="{{ value if value else "" }}"
|
<input type="text" name="{{ field_name }}" id="{{ field_name }}" value="{{ value if value else "" }}"
|
||||||
{% if attrs %}{% for k,v in attrs.items() %}
|
{% if attrs %}{% for k,v in attrs.items() %}
|
||||||
|
|
|
||||||
|
|
@ -23,8 +23,7 @@ def init_entry_routes(app):
|
||||||
if model == "inventory":
|
if model == "inventory":
|
||||||
fields["fields"] = ["label", "name", "serial", "barcode", "brand", "model", "device_type", "owner", "location", "condition", "image"]
|
fields["fields"] = ["label", "name", "serial", "barcode", "brand", "model", "device_type", "owner", "location", "condition", "image"]
|
||||||
fields_spec = [
|
fields_spec = [
|
||||||
{"name": "label", "type": "display", "label": "",
|
{"name": "label", "type": "display", "label": "", "row": "label",
|
||||||
"label_attrs": {"class": "display-6 me-2"}, "row": "label",
|
|
||||||
"attrs": {"class": "display-6 mb-3"}},
|
"attrs": {"class": "display-6 mb-3"}},
|
||||||
|
|
||||||
{"name": "name", "row": "names", "label": "Name", "wrap": {"class": "col-3"},
|
{"name": "name", "row": "names", "label": "Name", "wrap": {"class": "col-3"},
|
||||||
|
|
@ -65,8 +64,7 @@ def init_entry_routes(app):
|
||||||
elif model.lower() == 'user':
|
elif model.lower() == 'user':
|
||||||
fields["fields"] = ["label", "first_name", "last_name", "title", "active", "staff", "location", "supervisor"]
|
fields["fields"] = ["label", "first_name", "last_name", "title", "active", "staff", "location", "supervisor"]
|
||||||
fields_spec = [
|
fields_spec = [
|
||||||
{"name": "label", "row": "label", "label": "",
|
{"name": "label", "row": "label", "label": "", "type": "display",
|
||||||
"label_attrs": {"class": "display-6 me-2"}, "type": "display",
|
|
||||||
"attrs": {"class": "display-6 mb-3"}},
|
"attrs": {"class": "display-6 mb-3"}},
|
||||||
|
|
||||||
{"name": "last_name", "label": "Last Name", "label_attrs": {"class": "form-label"},
|
{"name": "last_name", "label": "Last Name", "label_attrs": {"class": "form-label"},
|
||||||
|
|
@ -102,7 +100,33 @@ def init_entry_routes(app):
|
||||||
{"name": "checkboxes", "order": 30, "parent": "name", "attrs": {"class": "col d-flex flex-column justify-content-end"}}
|
{"name": "checkboxes", "order": 30, "parent": "name", "attrs": {"class": "col d-flex flex-column justify-content-end"}}
|
||||||
]
|
]
|
||||||
elif model == "worklog":
|
elif model == "worklog":
|
||||||
pass
|
fields["fields"] = ["id", "contact", "work_item", "start_time", "end_time", "complete"]
|
||||||
|
fields_spec = [
|
||||||
|
{"name": "id", "label": "", "type": "display", "label_spec": "Work Item #{id}",
|
||||||
|
"attrs": {"class": "display-6 mb-3"}, "row": "label"},
|
||||||
|
|
||||||
|
{"name": "contact", "row": "ownership", "wrap": {"class": "col"}, "label": "Contact",
|
||||||
|
"label_spec": "{first_name} {last_name}", "attrs": {"class": "form-control"},
|
||||||
|
"label_attrs": {"class": "form-label"}},
|
||||||
|
{"name": "work_item", "row": "ownership", "wrap": {"class": "col"}, "label": "Work Item",
|
||||||
|
"label_spec": "{name}", "attrs": {"class": "form-control"}, "label_attrs": {"class": "form-label"}},
|
||||||
|
|
||||||
|
{"name": "start_time", "type": "datetime", "attrs": {"class": "form-control"}, "row": "timestamps",
|
||||||
|
"wrap": {"class": "col"}, "label_attrs": {"class": "form-label"}},
|
||||||
|
{"name": "end_time", "type": "datetime", "attrs": {"class": "form-control"}, "row": "timestamps",
|
||||||
|
"wrap": {"class": "col"}, "label_attrs": {"class": "form-label"}},
|
||||||
|
{"name": "complete", "label": "Complete", "label-attrs": {"class": "form-check-label"},
|
||||||
|
"attrs": {"class": "form-check-input"}, "row": "timestamps", "wrap": {"class": "col form-check"}},
|
||||||
|
|
||||||
|
{"name": "updates", "label": "Updates", "row": "updates", "label_attrs": {"class": "form-label"},
|
||||||
|
"type": "template", "template": "update_list.html"}
|
||||||
|
]
|
||||||
|
layout = [
|
||||||
|
{"name": "label", "order": 0},
|
||||||
|
{"name": "ownership", "order": 10, "attrs": {"class": "row"}},
|
||||||
|
{"name": "timestamps", "order": 20, "attrs": {"class": "row d-flex align-items-center"}},
|
||||||
|
{"name": "updates", "order": 30, "attrs": {"class": "row"}}
|
||||||
|
]
|
||||||
|
|
||||||
obj = crudkit.crud.get_service(cls).get(id, fields)
|
obj = crudkit.crud.get_service(cls).get(id, fields)
|
||||||
if obj is None:
|
if obj is None:
|
||||||
|
|
|
||||||
|
|
@ -63,9 +63,9 @@ def init_index_routes(app):
|
||||||
columns = [
|
columns = [
|
||||||
{"field": "start_time", "label": "Start", "format": "date"},
|
{"field": "start_time", "label": "Start", "format": "date"},
|
||||||
{"field": "contact.label", "label": "Contact",
|
{"field": "contact.label", "label": "Contact",
|
||||||
"link": {"endpoint": "user.get_item", "params": {"id": "{contact.id}"}}},
|
"link": {"endpoint": "entry.entry", "params": {"id": "{contact.id}", "model": "user"}}},
|
||||||
{"field": "work_item.label", "label": "Work Item",
|
{"field": "work_item.label", "label": "Work Item",
|
||||||
"link": {"endpoint": "inventory.get_item", "params": {"id": "{work_item.id}"}}},
|
"link": {"endpoint": "entry.entry", "params": {"id": "{work_item.id}", "model": "inventory"}}},
|
||||||
{"field": "work_item.device_type.description", "label": "Device Type"}
|
{"field": "work_item.device_type.description", "label": "Device Type"}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
||||||
3
inventory/templates/update_list.html
Normal file
3
inventory/templates/update_list.html
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
<div class="col mt-3">
|
||||||
|
UPDATES NOT IMPLEMENTED YET
|
||||||
|
</div>
|
||||||
Loading…
Add table
Add a link
Reference in a new issue