feat(fusion_plating_shopfloor): FpIdleWarning overlay (P6.2.3)
Fixed-position yellow-border overlay + countdown toast shown during the last N (default 30) seconds before auto-lock. Pure props-driven — secondsRemaining is the only input; parent (FpTabletLock) decides when to mount and unmount. Box-shadow pulse animation runs CSS-only so OWL doesn't need to re-render every tick. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -88,6 +88,9 @@ Copyright (c) 2026 Nexa Systems Inc. All rights reserved.
|
||||
'fusion_plating_shopfloor/static/src/scss/components/_pin_pad.scss',
|
||||
'fusion_plating_shopfloor/static/src/xml/components/pin_pad.xml',
|
||||
'fusion_plating_shopfloor/static/src/js/components/pin_pad.js',
|
||||
'fusion_plating_shopfloor/static/src/scss/components/_idle_warning.scss',
|
||||
'fusion_plating_shopfloor/static/src/xml/components/idle_warning.xml',
|
||||
'fusion_plating_shopfloor/static/src/js/components/idle_warning.js',
|
||||
# ---- Job Workspace (Phase 1 — tablet redesign) ----
|
||||
'fusion_plating_shopfloor/static/src/scss/job_workspace.scss',
|
||||
'fusion_plating_shopfloor/static/src/xml/job_workspace.xml',
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
/** @odoo-module **/
|
||||
// =============================================================================
|
||||
// Fusion Plating — FpIdleWarning (shared OWL service)
|
||||
//
|
||||
// Yellow-border overlay + countdown toast shown during the last
|
||||
// (default 30) seconds before auto-lock. Any pointer/touch event on
|
||||
// the document elsewhere resets the activity tracker, which causes
|
||||
// this component's parent (FpTabletLock) to hide the warning.
|
||||
// =============================================================================
|
||||
|
||||
import { Component } from "@odoo/owl";
|
||||
|
||||
export class FpIdleWarning extends Component {
|
||||
static template = "fusion_plating_shopfloor.IdleWarning";
|
||||
static props = {
|
||||
secondsRemaining: { type: Number },
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
// =============================================================================
|
||||
// FpIdleWarning — yellow-border countdown overlay before auto-lock
|
||||
// =============================================================================
|
||||
|
||||
.o_fp_idle_warning_overlay {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
pointer-events: none;
|
||||
z-index: 9998;
|
||||
box-shadow: inset 0 0 0 4px #ff9f0a;
|
||||
animation: o_fp_idle_pulse 1s ease-in-out infinite alternate;
|
||||
}
|
||||
|
||||
@keyframes o_fp_idle_pulse {
|
||||
from { box-shadow: inset 0 0 0 4px rgba(255, 159, 10, 0.6); }
|
||||
to { box-shadow: inset 0 0 0 4px rgba(255, 159, 10, 1); }
|
||||
}
|
||||
|
||||
.o_fp_idle_warning_toast {
|
||||
position: fixed;
|
||||
top: 16px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
background: #1d1d1f;
|
||||
color: #ffd585;
|
||||
padding: 0.6rem 1.2rem;
|
||||
border-radius: 8px;
|
||||
font-size: 0.9rem;
|
||||
z-index: 9999;
|
||||
pointer-events: none;
|
||||
box-shadow: 0 4px 12px rgba(0,0,0,0.4);
|
||||
|
||||
strong { color: #ffb84d; margin: 0 0.2rem; }
|
||||
> i { margin-right: 0.4rem; }
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="fusion_plating_shopfloor.IdleWarning">
|
||||
<div class="o_fp_idle_warning_overlay">
|
||||
<div class="o_fp_idle_warning_toast">
|
||||
<i class="fa fa-clock-o"/>
|
||||
Locking in <strong t-esc="props.secondsRemaining"/>s · tap anywhere to stay
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
Reference in New Issue
Block a user