| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
Discuss (mail)
|
| Lines of code | 5120 |
| Technical Name |
anit_web_ui |
| License | OPL-1 |
Web Anit UI
A workspace-focused Odoo 19 backend enhancement suite for teams that manage several records, menus and review tasks in parallel.
Workspace-Focused Backend Enhancement for High-Volume Teams
Multi-tab navigation, persistent workspace, optimized lists, and inline previews. For teams managing dozens of records in parallel. Zero configuration needed, drops right into existing Odoo.
Keep parallel workspaces open simultaneously
Instant tab switching without page refresh
Column widths, field order, chatter behavior
Tabs, cache, refresh, dialogs, chatter, and more
Introduction
Web Anit UI is a practical Odoo 19 backend enhancement suite for teams that keep several tasks in motion at the same time. It combines persistent navigation, list ergonomics, form-space optimization and inline review tools in one configurable package.
The module focuses on operator efficiency instead of business logic changes, making it a strong fit for existing deployments that want a better working experience without redesigning core flows.
模块介绍
Web Anit UI 是一个偏实用型的 Odoo 19 后端界面增强模块,面向需要并行处理多个任务、频繁切换记录和反复核对信息的业务团队。它把导航连续性、列表可用性、表单空间优化和内联预览能力收敛到一个可配置模块中。
这个模块的重点不是改业务规则,而是在不破坏原生流程的前提下,改善最终用户的后台使用体验,因此适合已有项目渐进式接入。
Who benefits most
- Sales and purchasing teams comparing several records in parallel
- Back-office users who spend long sessions in list and form views
- Operators who frequently review attachments, chatter and popup forms
- Projects that want stronger usability without changing standard business logic
适合哪些团队
- 需要并行查看多个客户、订单、联系人或业务单据的销售与采购团队
- 长时间停留在列表和表单中的后台高频使用者
- 经常处理附件、Chatter 和弹窗表单的运营或支持团队
- 希望提升界面效率,但不希望改动原生业务逻辑的实施项目
Work across pages faster
Keep up to 20 backend pages open in separate tabs. Click to switch instantly — no reload, no blank flash. Right-click for contextual options: pin, close others or refresh.
通过顶部标签栏并行保留最多 20 个页面。单击即刻切换——无重新加载、无白屏。右键弹出上下文菜单:固定、关闭其他或刷新。
Tune list views for each user
Refresh list content with a dedicated button and spin animation. Drag column edges to set widths (30–800 px, auto-saved). Reorder optional fields by dragging sort handles in the columns dropdown.
用专属刷新按钮刷新列表(带旋转动画)。拖拽列边缘设定宽度(30–800 px,自动保存)。在"列"下拉菜单中拖拽排序手柄重排可选字段。
Save space in form-heavy flows
Collapse chatter with one click, drag its border to resize (200–900 px), double-click to reset. Preview attachments inline in minimized or maximized mode. Drag any of 8 handles to resize popup dialogs (min 300×150 px).
一键折叠 Chatter、拖拽调宽(200–900 px)、双击重置。在最小化或最大化模式下内联预览附件。通过 8 个拖拽手柄调整弹窗尺寸(最小 300×150 px)。
Multi-tab workspace
A persistent tab bar below the navbar keeps up to 20 backend destinations open. Each tab runs its own isolated ActionManager and router — switching tabs instantly displays the cached view without page reloads or server round-trips. Tabs are saved server-side and restored on the next login.
导航栏下方的持久化标签栏可同时保留最多 20 个后端页面。每个标签运行独立的 ActionManager 和路由——切换标签时直接显示已缓存的视图,无需重新加载页面或发起额外请求。标签列表存储在服务端,关闭浏览器后重新登录仍可恢复。
Tab bar interactions / 标签栏操作
| Left-click / 单击 | Switch to that tab instantly — cached views show without reload 立即切到对应标签——已缓存的视图无需重新加载 |
| Right-click / 右键 | Context menu: Refresh Tab · Pin / Unpin · Close Others · Close to Left · Close to Right 右键菜单:刷新页签 · 固定/取消固定 · 关闭其他 · 关闭左侧 · 关闭右侧 |
| ✕ button / 关闭按钮 | Fades in on hover; tab exits with scale + fade animation; if the active tab is closed, the previous tab from the visit history stack is activated 悬停时渐显;标签以缩放 + 淡出动画关闭;若关闭当前标签则自动跳到历史栈中上一个标签 |
| Mouse wheel / 滚轮 | Scroll 100 px per tick; overflow arrows appear at both ends with smooth width + opacity transitions 每次滚动 100 px;标签溢出时两端平滑渐入滚动箭头 |
Toolbar buttons / 工具栏按钮
返回首页菜单,取消所有业务页签的激活状态
按访问历史倒序查找前一个标签或首页并激活
列表走分页器刷新、表单保留记录 ID、报表恢复 action。200 ms 节流 + 旋转动画
隐藏导航栏和标签栏,仅保留内容区。按 Esc 退出
📌 Pin tabs / 固定页签
Pin via right-click menu. Pinned tabs show a purple pin icon (18° rotation), shrink to 78–148 px and are immune to "Close Others/Left/Right".
右键固定后左侧出现紫色图钉图标,宽度收窄至 78–148 px,不被批量关闭操作移除。
⚡ Tab cache / 页签缓存
Each tab keeps its OWL component tree alive via CSS display: none. Switching back shows the cached state instantly — zero reload, zero server request. Routes and titles are scope-isolated per tab.
每个标签通过 CSS 隐藏保持组件树存活,切换回来时零延迟恢复。路由和标题按标签隔离。
🎨 Theme aware / 主题适配
Auto-detects light/dark theme. Light: background #e2e5ea, accent #875a7b. Dark: background #2d2d30, accent #b07cb0. Active tab has a 2 px accent indicator. Context menu and scroll arrows also follow the theme.
自动检测浅/深色主题并切换配色。激活标签顶部 2 px 强调色条。右键菜单和滚动箭头同步适配。
List tools enhancement
Three targeted improvements for list views: a dedicated refresh button with visual feedback, persistent column width memory per view, and drag-to-reorder optional field management with pixel-precise width control.
三项精准的列表视图增强:带视觉反馈的专属刷新按钮、按视图保存的列宽记忆、拖拽排序的可选字段管理与像素级宽度控制。
🔄 Refresh button / 刷新按钮
Injected into the control panel. 200 ms click throttle. Spin animation on the content area (1 s auto-clear). Strategy adapts: list → pager refresh, form → keep record ID, report → restore action. Hidden in settings sub-views.
注入控制面板,200 ms 节流,内容区旋转动画(1 秒消失)。策略自适应:列表走分页器、表单保留记录 ID、报表恢复 action。设置页隐藏。
📏 Column width memory / 列宽记忆
Drag-adjusted widths (30–800 px) saved after 300 ms debounce. Keys: {model}.{view_key}.{field}. Different list views and One2many sub-lists tracked independently. Uses requestAnimationFrame + 5 retries for flicker-free application.
拖拽列宽(30–800 px)300 ms 防抖保存。各列表视图和 One2many 子表独立记录。requestAnimationFrame + 5 次重试确保无闪烁。
🔀 Drag-reorder fields / 拖拽排序字段
Drag sort handles in the "Columns" dropdown to reorder. Grabbed item uses cursor: grabbing + box-shadow highlight. Order persisted to backend. Each column has a pixel-width input box (30–800 px).
在"列"下拉中拖拽排序手柄重排字段,拖动中 grabbing 光标 + 阴影高亮,顺序持久化,每列支持像素宽度输入。
📦 View-level cache / 视图级缓存
Column preferences (widths + field order) are cached in a module-level _listPreferenceCache. Switching records in the same view triggers zero additional RPCs.
列偏好(列宽 + 字段顺序)在模块级缓存中保持,同一视图切换记录不产生额外 RPC。
Flexible chatter workspace
A 24×60 px vertical toggle on the chatter edge gives users full control over chatter visibility and width. Click to collapse or expand; drag to resize in real time; double-click to reset. All preferences persist across page refreshes.
Chatter 侧边的 24×60 px 竖向按钮让用户完全掌控 Chatter 的显隐和宽度。单击折叠/展开、拖拽实时调宽、双击重置。所有偏好设置在刷新页面后保持。
🔁 Collapse / Expand / 折叠与展开
- Expanded state: gradient background (#f8f9fa → #e9ecef), col-resize cursor, widens to 28 px on hover
- Collapsed state: purple gradient (#875a7b → #6d4a63), pointer cursor, chatter fully hidden
- Click (displacement < 5 px = click, not drag) toggles instantly
- State saved to localStorage
odoo.chatter.collapsed
- 展开态:渐变背景,col-resize 光标,悬停扩展到 28 px
- 折叠态:紫色渐变,pointer 光标,Chatter 完全隐藏
- 点击(位移 < 5 px 视为点击)即刻切换
- 状态记入 localStorage 刷新后保持
↔ Drag resize / 拖拽调宽
- Press and drag horizontally (≥ 5 px enters drag mode)
- Width clamped to 200–900 px
- Text selection disabled during drag for smooth interaction
- Final width saved to localStorage
odoo.chatter.widthon mouse-up - Double-click to reset to default width
- 按住水平拖拽(≥ 5 px 进入拖拽模式)
- 宽度范围 200–900 px
- 拖拽期间禁用文字选中
- 释放鼠标时保存最终宽度
- 双击一步重置为默认宽度
Layout behavior / 布局行为
Chatter follows Odoo's native responsive layout — sided on wide screens, bottom on narrow. Fold and drag-resize are available only in the sided layout; the toggle button hides automatically when chatter is at the bottom.
Chatter 跟随 Odoo 原生响应式布局——大屏侧边、小屏底部。折叠和拖拽调宽仅在侧边布局时可用,底部模式下按钮自动隐藏。
Attachment preview inside forms
When chatter is sided and the file viewer is enabled, clicking an attachment opens a minimized floating preview inside the chatter area (width follows chatter size, minimum 530 px). Switch to maximized mode to cover the full content area for thorough review.
当 Chatter 在侧边且文件预览启用时,点击附件在 Chatter 区域内以最小化浮窗预览(宽度跟随 Chatter,最小 530 px)。切换到最大化模式覆盖整个内容区全屏审阅。
- CSS variables adapt to chatter size and form width dynamically
- requestAnimationFrame-based responsive updates on window resize
- Supports images, PDFs and other common file formats
- No file download or external viewer needed
Resizable popup dialogs
Every Odoo modal gets 8 resize handles — top, bottom, left, right and four corners. Drag from any edge or corner to expand the dialog in real time. Minimum size: 300×150 px, no upper limit.
所有 Odoo 模态弹窗自动注入 8 个拖拽手柄(上下左右 + 四角)。从任意边缘或角落拖拽实时扩大。最小 300×150 px,无上限。
- Edge handles: 6 px wide. Corner handles: 12×12 px
- Direction-specific cursors: ns-resize, ew-resize, nw/ne/se/sw-resize
- Text selection disabled during drag for smooth experience
- Works on form modals, wizards and complex intermediate forms
- 边缘手柄 6 px,角部 12×12 px
- 光标按方向自动切换
- 拖拽期间禁用文字选中
- 适用于表单弹窗、向导和复杂中间表单
Group expand / collapse helper
Adds an "Expand Groups" / "Collapse Groups" toggle button in grouped list views. The expand operation runs recursively — up to 20 rounds, expanding child groups layer by layer and calling load() only when new groups were found. Collapse is a single-pass operation. The button shows "Processing…" and disables during execution. The state resets automatically on filter or group-by changes.
在分组列表中提供"展开所有分组"/"收起所有分组"切换按钮。展开采用递归策略——最多 20 轮逐层展开并按需加载。收起单轮完成。操作期间按钮显示"处理中…"并禁用。修改过滤条件或重新分组时自动重置。
Settings by feature
Enable or disable each capability from a dedicated Web UI settings block. Every feature has its own switch:
| anit_web_ui.enable_tabs | Multi-tab workspace / 多标签工作区 |
| anit_web_ui.enable_list | List tools / 列表工具增强 |
| anit_web_ui.enable_refresher | Refresh button / 刷新按钮 |
| anit_web_ui.enable_chatter_fold | Chatter fold + drag resize / 折叠 + 拖拽调宽 |
| anit_web_ui.enable_group_expand | Group expand / 分组展开辅助 |
| anit_web_ui.enable_file_viewer | Attachment preview / 附件预览 |
| anit_web_ui.enable_dialog_size | Dialog resize / 弹窗调整 |
所有增强功能都可以在独立的 Web UI 设置中按功能维度控制,适合渐进式上线。
Rollout and configuration
A progressive rollout is recommended. Start small — enable tabs and list tools for heavy backend users first, then expand gradually.
- Start with tabs and list tools for heavy backend users
- Add chatter folding and file preview where forms and attachments are part of the daily workflow
- Enable resizable dialogs for teams that rely heavily on wizards and popup forms
- Enable only the feature groups you actually need — when all features are off, the lazy loader adds zero frontend overhead
建议采用渐进式上线:先为高频后台用户开启标签和列表工具,再根据实际场景启用其他能力。
- 先在测试库验证常用菜单和弹窗
- 功能全关时前端性能零影响
- 团队习惯差异大时建议先启用基础能力
On-demand feature loading
Frontend assets are split into two layers: a lightweight loader.js (main bundle) that reads backend config via RPC, and a anit_web_ui.features bundle loaded only when at least one feature is enabled. When all features are off, zero extra JS is loaded.
前端资源分两层:主 bundle 仅含轻量 loader.js(读取后端配置),功能 bundle 仅在至少一项功能启用时才加载。功能全关时零额外 JS。
Search keywords
Odoo 19 multi tabs, backend UI enhancement, workspace tabs, persistent tabs, tab cache, pinned tabs, tab history, right-click tab menu, fullscreen workspace, theme-aware backend UI, lazy-loaded web features, list refresh, column width memory, optional field reorder, grouped list expand collapse, chatter collapse, chatter resize, drag to resize chatter, file preview, attachment viewer, inline preview, resizable dialogs, popup resize, operator productivity, back-office usability.
关键词补充:Odoo 19 多标签、后台界面增强、页签缓存、固定页签、页签历史、右键页签菜单、全屏工作区、列表刷新、列宽记忆、可选字段排序、分组展开折叠、Chatter 收起、Chatter 调宽、双击重置宽度、附件预览、文件查看器、内联预览、弹窗缩放、对话框调宽、后台效率提升、界面易用性优化。
Notes
- Tested with Odoo 19.
- The module depends on mail because chatter folding and file preview extend chatter-related components and layouts.
- Each feature can be enabled independently from Settings > Web UI.
- When all features are turned off, zero additional JS is loaded — front-end performance is unaffected.
- Tabs are stored server-side (anit.web_tabs model) — they survive browser restarts and session changes.
- The tab bar supports both Chinese and English labels, auto-detected from the user's session language.
- Current visual blocks can be replaced later with final production screenshots and marketing artwork.
- 已在 Odoo 19 环境下验证。
- 模块依赖 mail,因为 Chatter 折叠和文件预览直接扩展了 chatter 相关组件与布局。
- 所有功能都可以在 Settings > Web UI 中单独控制。
- 功能全关时零额外 JS 加载——前端性能不受影响。
- 标签列表存储在服务端(anit.web_tabs 模型),关闭浏览器或切换会话后仍可恢复。
- 标签栏界面支持中英文,根据用户会话语言自动检测。
- 当前页面中的视觉区域可先作为占位,后续再替换为正式截图和封面素材。
Odoo Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from the authors, typically via Odoo Apps, or if you have received a written agreement from the authors of the Software (see the COPYRIGHT file). You may develop Odoo modules that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the Odoo Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module