diff --git a/fusion_plating/fusion_plating_shopfloor/__manifest__.py b/fusion_plating/fusion_plating_shopfloor/__manifest__.py index f3e17f1b..4185cb1b 100644 --- a/fusion_plating/fusion_plating_shopfloor/__manifest__.py +++ b/fusion_plating/fusion_plating_shopfloor/__manifest__.py @@ -5,7 +5,7 @@ { 'name': 'Fusion Plating — Shop Floor', - 'version': '19.0.34.0.0', + 'version': '19.0.34.1.0', 'category': 'Manufacturing/Plating', 'summary': 'Shop-floor tablet stations, QR scanning, bake window enforcer.', 'description': """ diff --git a/fusion_plating/fusion_plating_shopfloor/controllers/plant_kanban.py b/fusion_plating/fusion_plating_shopfloor/controllers/plant_kanban.py index c1f9b70d..79535d6e 100644 --- a/fusion_plating/fusion_plating_shopfloor/controllers/plant_kanban.py +++ b/fusion_plating/fusion_plating_shopfloor/controllers/plant_kanban.py @@ -95,6 +95,8 @@ class PlantKanbanController(http.Controller): ))) if filters.get('mine'): domain.append(('card_state', 'in', ('ready_mine', 'running_mine'))) + if filters.get('awaiting_qc'): + domain.append(('card_state', '=', 'awaiting_qc')) # Spec 2026-05-25 — post-shop state filter chips if filters.get('awaiting_cert'): domain.append(('state', '=', 'awaiting_cert')) @@ -145,6 +147,9 @@ class PlantKanbanController(http.Controller): 'on_hold': sum( 1 for j in jobs if j.card_state == 'on_hold' ), + 'awaiting_qc': sum( + 1 for j in jobs if j.card_state == 'awaiting_qc' + ), # Spec 2026-05-25 — post-shop state KPIs 'awaiting_cert': sum( 1 for j in jobs if j.state == 'awaiting_cert' diff --git a/fusion_plating/fusion_plating_shopfloor/static/src/scss/components/_filter_chip.scss b/fusion_plating/fusion_plating_shopfloor/static/src/scss/components/_filter_chip.scss index b0f73aa7..3b9c713a 100644 --- a/fusion_plating/fusion_plating_shopfloor/static/src/scss/components/_filter_chip.scss +++ b/fusion_plating/fusion_plating_shopfloor/static/src/scss/components/_filter_chip.scss @@ -1,20 +1,27 @@ // _filter_chip.scss — depends on _plant_tokens.scss +// 2026-05-25: bigger touch target + gradient bg. .o_fp_filter_chip { - padding: 4px 12px; - font-size: 11px; - background: $plant-card-bg; + padding: 7px 16px; + font-size: 13px; + font-weight: 500; + background: linear-gradient(135deg, $plant-card-bg 0%, $plant-bg 100%); border: 1px solid $plant-card-border; - border-radius: 14px; + border-radius: 18px; color: $plant-muted; cursor: pointer; font-family: inherit; + transition: transform 0.1s ease, box-shadow 0.1s ease; &.active { - background: #1d4ed8; + background: linear-gradient(135deg, #2563eb 0%, #1d4ed8 100%); border-color: #1d4ed8; color: #fff; font-weight: 600; + box-shadow: 0 2px 4px rgba(29, 78, 216, 0.25); + } + &:hover:not(.active) { + transform: translateY(-1px); + box-shadow: 0 2px 4px rgba(0,0,0,0.06); } - &:hover:not(.active) { background: $plant-bg; } } diff --git a/fusion_plating/fusion_plating_shopfloor/static/src/scss/components/_kpi_tile.scss b/fusion_plating/fusion_plating_shopfloor/static/src/scss/components/_kpi_tile.scss index 275d9d67..ac918901 100644 --- a/fusion_plating/fusion_plating_shopfloor/static/src/scss/components/_kpi_tile.scss +++ b/fusion_plating/fusion_plating_shopfloor/static/src/scss/components/_kpi_tile.scss @@ -1,34 +1,66 @@ // _kpi_tile.scss — depends on _plant_tokens.scss +// +// 2026-05-25: redesigned for the 8-tile row. Narrower individual width +// (grid handles that), more vertical presence via padding + larger +// typography, subtle 135deg gradients per kind that work in both light +// and dark modes (gradient stops use $plant-* tokens — dark variants +// flip automatically via the @if $o-webclient-color-scheme branch). .o_fp_kpi_tile { - padding: 6px 10px; - background: $plant-card-bg; - border-radius: 6px; + padding: 10px 12px; + background: linear-gradient(135deg, $plant-card-bg 0%, $plant-bg 100%); + border-radius: 8px; border: 1px solid $plant-card-border; - display: flex; flex-direction: column; gap: 1px; + display: flex; flex-direction: column; gap: 3px; cursor: pointer; - transition: background 0.1s; + transition: transform 0.1s ease, box-shadow 0.1s ease, border-color 0.1s ease; text-align: left; color: $plant-text; font-family: inherit; + box-shadow: 0 1px 2px rgba(0,0,0,0.04); + min-width: 0; // grid-track minmax handles sizing; let label truncate - &:hover { background: $plant-bg; } + &:hover { + transform: translateY(-1px); + box-shadow: 0 2px 6px rgba(0,0,0,0.08); + } &.active { border-color: $plant-mine-border; - background: $plant-mine-bg; + background: linear-gradient(135deg, $plant-mine-bg 0%, $plant-card-bg 100%); + box-shadow: 0 2px 6px rgba(0,0,0,0.10); + } + + // Kind-specific subtle gradients. Each pulls from existing tokens + // so dark mode auto-flips via the @if $o-webclient-color-scheme + // == dark global override in _plant_tokens.scss. + &.urgent { + background: linear-gradient(135deg, $plant-card-bg 0%, $plant-hold-bg 100%); + .kpi-val { color: $plant-hold-border; } + } + &.warn { + background: linear-gradient(135deg, $plant-card-bg 0%, $plant-bake-bg 100%); + .kpi-val { color: $plant-idle-border; } + } + &.good { + background: linear-gradient(135deg, $plant-card-bg 0%, $plant-done-bg 100%); + .kpi-val { color: $plant-done-border; } + } + &.qc { + background: linear-gradient(135deg, $plant-card-bg 0%, $plant-qc-bg 100%); + .kpi-val { color: $plant-qc-border; } } - &.urgent .kpi-val { color: $plant-hold-border; } - &.warn .kpi-val { color: $plant-idle-border; } - &.good .kpi-val { color: $plant-done-border; } .kpi-val { - font-size: 20px; font-weight: 700; + font-size: 26px; font-weight: 700; color: $plant-text; line-height: 1; font-variant-numeric: tabular-nums; } .kpi-lbl { - font-size: 9px; font-weight: 600; + font-size: 10px; font-weight: 600; color: $plant-muted; text-transform: uppercase; letter-spacing: 0.04em; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } } diff --git a/fusion_plating/fusion_plating_shopfloor/static/src/scss/plant_kanban.scss b/fusion_plating/fusion_plating_shopfloor/static/src/scss/plant_kanban.scss index f5ba6f88..d50797f4 100644 --- a/fusion_plating/fusion_plating_shopfloor/static/src/scss/plant_kanban.scss +++ b/fusion_plating/fusion_plating_shopfloor/static/src/scss/plant_kanban.scss @@ -34,67 +34,87 @@ .floor-title { font-size: 16px; font-weight: 700; } .floor-controls { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; } + // 2026-05-25 — toolbar buttons bigger + gradients for visual weight .station-picker { - padding: 5px 10px; - background: $plant-mine-bg; + padding: 8px 14px; + background: linear-gradient(135deg, $plant-mine-bg 0%, $plant-card-bg 100%); border: 1px solid $plant-mine-border; - border-radius: 6px; - font-size: 12px; + border-radius: 7px; + font-size: 14px; font-weight: 600; - color: #856404; + color: $plant-text; cursor: pointer; font-family: inherit; + box-shadow: 0 1px 2px rgba(0,0,0,0.05); } .mode-toggle { display: inline-flex; border: 1px solid $plant-card-border; - border-radius: 6px; + border-radius: 7px; overflow: hidden; + box-shadow: 0 1px 2px rgba(0,0,0,0.05); .mode-btn { - padding: 5px 12px; - font-size: 12px; + padding: 8px 16px; + font-size: 14px; font-weight: 600; - background: $plant-card-bg; + background: linear-gradient(135deg, $plant-card-bg 0%, $plant-bg 100%); color: $plant-muted; border: 0; cursor: pointer; border-right: 1px solid $plant-card-border; font-family: inherit; &:last-child { border-right: 0; } - &.active { background: #1d4ed8; color: #fff; } + &.active { + background: linear-gradient(135deg, #2563eb 0%, #1d4ed8 100%); + color: #fff; + } &:hover:not(.active) { background: $plant-bg; } } } .toolbar-btn { - padding: 5px 10px; - font-size: 12px; - background: $plant-card-bg; + padding: 8px 14px; + font-size: 14px; + font-weight: 500; + background: linear-gradient(135deg, $plant-card-bg 0%, $plant-bg 100%); border: 1px solid $plant-card-border; - border-radius: 6px; + border-radius: 7px; cursor: pointer; color: $plant-text; font-family: inherit; - &:hover { background: $plant-bg; } + box-shadow: 0 1px 2px rgba(0,0,0,0.05); + transition: transform 0.1s ease, box-shadow 0.1s ease; + &:hover { + transform: translateY(-1px); + box-shadow: 0 2px 4px rgba(0,0,0,0.08); + } &.handoff { - background: #ffc107; + background: linear-gradient(135deg, #ffd966 0%, #ffc107 100%); border-color: #d39e00; - color: #856404; + color: #5e4400; font-weight: 700; } } - .kpi-strip { display: grid; grid-template-columns: repeat(5, 1fr); gap: 6px; } + // 8 tiles — Work Orders, At My Station, Bakes Due, On Hold, + // Awaiting QC, Awaiting CoC, Ready to Ship, Overdue. + .kpi-strip { display: grid; grid-template-columns: repeat(8, 1fr); gap: 8px; } - .search-row { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; } + .search-row { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; } .search-input { - flex: 1; min-width: 200px; - padding: 5px 10px; + flex: 1; min-width: 220px; + padding: 9px 14px; border: 1px solid $plant-card-border; - border-radius: 6px; + border-radius: 8px; background: $plant-card-bg; color: $plant-text; - font-size: 12px; + font-size: 14px; font-family: inherit; + box-shadow: 0 1px 2px rgba(0,0,0,0.04) inset; + &:focus { + outline: none; + border-color: #1d4ed8; + box-shadow: 0 0 0 3px rgba(29, 78, 216, 0.15); + } } // Board: fixed-width columns with horizontal scroll on smaller diff --git a/fusion_plating/fusion_plating_shopfloor/static/src/xml/plant_kanban.xml b/fusion_plating/fusion_plating_shopfloor/static/src/xml/plant_kanban.xml index 501f67ee..321d7e3b 100644 --- a/fusion_plating/fusion_plating_shopfloor/static/src/xml/plant_kanban.xml +++ b/fusion_plating/fusion_plating_shopfloor/static/src/xml/plant_kanban.xml @@ -47,6 +47,11 @@ kind="'urgent'" active="!!state.filters.on_hold" onClick="() => this.toggleFilter('on_hold')"/> + +