feat(sub12a): step library list/form/search views

Form: Title + Code + Classification (kind/icon/process/material) +
Stations & Flags + 4 notebook tabs (Instructions / Operation
Measurements / Transition Form / Advanced).

Operation Measurements + Transition Form are inline-editable o2m
lists with handle widget for drag reorder.

Header button: 'Seed Default Inputs' (visible only when default_kind
is set). Triggers the idempotent seeding helper.

NB: I removed `string=` from <search> per Odoo 19 rule (CLAUDE.md
critical rule 4 — no string attr on search).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
gsinghpal
2026-04-27 20:35:33 -04:00
parent 6fbb6f918b
commit 738f3fcfd5

View File

@@ -0,0 +1,144 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2026 Nexa Systems Inc.
License OPL-1 (Odoo Proprietary License v1.0)
Part of the Fusion Plating product family.
-->
<odoo>
<record id="view_fp_step_template_list" model="ir.ui.view">
<field name="name">fp.step.template.list</field>
<field name="model">fp.step.template</field>
<field name="arch" type="xml">
<list string="Step Library">
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="code"/>
<field name="default_kind"/>
<field name="tank_ids" widget="many2many_tags" optional="show"/>
<field name="requires_signoff" optional="hide"/>
<field name="requires_rack_assignment" optional="hide"/>
<field name="requires_transition_form" optional="hide"/>
<field name="active" widget="boolean_toggle" optional="hide"/>
</list>
</field>
</record>
<record id="view_fp_step_template_form" model="ir.ui.view">
<field name="name">fp.step.template.form</field>
<field name="model">fp.step.template</field>
<field name="arch" type="xml">
<form string="Step Library Template">
<header>
<button name="_seed_default_inputs" type="object"
string="Seed Default Inputs" class="btn-secondary"
invisible="not default_kind"/>
</header>
<sheet>
<div class="oe_title">
<label for="name" string="Title"/>
<h1><field name="name" placeholder="e.g. Soak Clean"/></h1>
<div class="text-muted">
<field name="code" placeholder="SOAK_CLEAN"/>
</div>
</div>
<group>
<group string="Classification">
<field name="default_kind"/>
<field name="icon"/>
<field name="process_type_id"/>
<field name="material_callout"/>
</group>
<group string="Stations + Flags">
<field name="tank_ids" widget="many2many_tags"/>
<field name="requires_signoff"/>
<field name="requires_predecessor_done"/>
<field name="requires_rack_assignment"/>
<field name="requires_transition_form"/>
</group>
</group>
<notebook>
<page string="Instructions" name="instructions">
<field name="description"
placeholder="Rich-text instructions / WI reference."/>
</page>
<page string="Operation Measurements" name="op_measurements">
<field name="input_template_ids">
<list editable="bottom">
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="input_type"/>
<field name="target_min"/>
<field name="target_max"/>
<field name="target_unit"/>
<field name="required" widget="boolean_toggle"/>
<field name="hint"/>
</list>
</field>
</page>
<page string="Transition Form" name="transition_form">
<field name="transition_input_ids">
<list editable="bottom">
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="input_type"/>
<field name="required" widget="boolean_toggle"/>
<field name="compliance_tag"/>
<field name="hint"/>
</list>
</field>
</page>
<page string="Advanced" name="advanced">
<group>
<group string="Time Target">
<field name="time_min_target"/>
<field name="time_max_target"/>
<field name="time_unit"/>
</group>
<group string="Temperature Target">
<field name="temp_min_target"/>
<field name="temp_max_target"/>
<field name="temp_unit"/>
</group>
<group string="Other Targets">
<field name="voltage_target"/>
<field name="viscosity_target"/>
</group>
</group>
</page>
</notebook>
</sheet>
<chatter/>
</form>
</field>
</record>
<record id="view_fp_step_template_search" model="ir.ui.view">
<field name="name">fp.step.template.search</field>
<field name="model">fp.step.template</field>
<field name="arch" type="xml">
<search>
<field name="name"/>
<field name="code"/>
<field name="default_kind"/>
<field name="tank_ids"/>
<separator/>
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
<group>
<filter string="Step Kind" name="group_kind"
context="{'group_by':'default_kind'}"/>
<filter string="Process Type" name="group_proc"
context="{'group_by':'process_type_id'}"/>
</group>
</search>
</field>
</record>
<record id="action_fp_step_template" model="ir.actions.act_window">
<field name="name">Step Library</field>
<field name="res_model">fp.step.template</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_fp_step_template_search"/>
</record>
</odoo>