feat(configurator): Sub 3 Phase B — part-scoped Process Composer client action + part form Compose button

- Add fp_part_composer_controller with 3 JSON-RPC endpoints:
  /fp/part/composer/state, /fp/part/composer/templates,
  /fp/part/composer/load_template (deep-clones a shared template
  into a part-owned tree inside a cr.savepoint, sets
  fp.part.catalog.default_process_id atomically)
- _clone_subtree copies name/sequence/opt_in_out/treatment_uom plus
  description/notes/icon/color/timing/behaviour/work_center/process_type
  and stamps part_catalog_id + cloned_from_id on every node
- Add fp_part_process_composer OWL client action (JS + XML + SCSS):
  picks template from dropdown, clones, hands off to existing
  fp_recipe_tree_editor via context={recipe_id, part_id}
- Add Process tab on part form with readonly default_process_id
  field and Compose button calling action_open_part_composer
- Register new assets in web.assets_backend, bump configurator
  version to 19.0.11.0.0
This commit is contained in:
gsinghpal
2026-04-22 09:02:03 -04:00
parent 7d5c826f3e
commit 3de37ea735
7 changed files with 541 additions and 1 deletions

View File

@@ -0,0 +1,84 @@
// Copyright 2026 Nexa Systems Inc.
// License OPL-1 (Odoo Proprietary License v1.0)
// Part of the Fusion Plating product family.
//
// Sub 3 — Process Composer styles.
.o_fp_part_composer {
padding: 16px;
max-width: 900px;
margin: 0 auto;
&_state {
padding: 32px;
text-align: center;
color: var(--bs-secondary-color, #666);
.fa {
margin-right: 8px;
}
}
&_error {
color: var(--bs-danger, #c00);
}
&_header {
display: flex;
align-items: center;
gap: 16px;
margin-bottom: 24px;
padding-bottom: 16px;
border-bottom: 1px solid var(--bs-border-color, #e0e0e0);
}
&_title {
h2 {
margin: 0;
font-size: 20px;
}
}
&_loader {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 24px;
padding: 16px;
background: var(--bs-tertiary-bg, #f5f5f5);
border-radius: 8px;
label {
margin: 0;
font-weight: 600;
}
select {
flex: 1;
max-width: 400px;
}
}
&_tree {
min-height: 300px;
padding: 24px;
background: var(--bs-body-bg, #ffffff);
border-radius: 8px;
border: 1px solid var(--bs-border-color, #d8dadd);
}
&_hint,
&_empty {
text-align: center;
padding: 48px 16px;
.fa {
color: var(--bs-secondary-color, #999);
margin-bottom: 16px;
}
p {
color: var(--bs-secondary-color, #666);
}
}
}