Branch

Pending: 0 Building: 0 Running: 1 Failed: 228

[FIX] viin_brand_pos: make forward-ported POS navbar guard Hoot test runnable on 18.0 The Hoot test added with the a982703 forward-port statically imported the real @point_of_sale/app/navbar/navbar, which drags 9 transitive POS-app modules into the shared web.assets_unit_tests bundle and aborts the whole web unit suite at setup. Register a dependency-free stand-in under the same module name (core's own odoo.define idiom) so the real guard patch applies on top of it without pulling the POS UI tree into the shared bundle. Proven live on 18.0: passed 2/2 with the guard, and the guard test fails when the guard is reverted (confirm-by-toggle).

PR: [18.0][FWD] Forward-port 17.0 fixes: branded colorpicker tour, POS navbar guard, statusbar/chatter absorbs

Committer: David Tran

Instance ID: 0

PR State: merged

age: up-time:

[FIX] web_responsive: correct a false idempotency comment + bind the session_info test Three review findings from the forward-port batch. The migration's comment claimed the is_redirect_home filter makes a re-run match nothing, so an opted-out user is never silently re-opted-in. The second half was false: an opted-out user holds False, which is exactly what the domain selects. Odoo compiles a boolean "= False" to (col IS NULL OR col = FALSE), so the domain provably cannot tell "never backfilled" from "deliberately opted out" - the manifest version gate is what makes this run once. The comment now says that. The domain and the logic are unchanged and correct: that same collapse is what lets the backfill match the NULL rows every pre-existing user actually has. test_session_info only ever exercised the preference at True, so a hardcoded True in the session_info transport would have passed it. It now also flips the preference to False and re-asserts, binding the assertion to the user's real stored value on both sides. The new JS test file carried an OCA sibling's copyright header; it is Viindoo's own 2026 file. The LGPL-3 license line stays - the module is OCA.

PR: [FWD] forward-port 17.0 -> 18.0: store URLs + web_responsive apps_menu guard + is_redirect_home restoration

Committer: David Tran

Instance ID: 0

PR State: open

age: up-time:

Merge remote-tracking branch 'origin/17.0' into 18.0

PR: Fwd from 17 to 18 260630 01

Committer: David Tran

Instance ID: 0

PR State: merged

age: up-time:

[FWD] branding: forward-port origin/17.0 into 18.0 Absorb origin/17.0 (9 commits since a83807d) into 18.0. Net behavioral deltas: - web_responsive: guard session.apps_menu?.theme (60a49a7); .o_form_statusbar sticky block (3d5df32) - viin_brand_mass_mailing: Viindoo-branded newsletter demo + i18n strings (603119f) - viin_brand_social_media: demo (603119f); .gitignore node_modules/.odoo-ai (36603e7) Already-on-18.0 / net-zero: web_tour manifest dep, chatter.xml styling, test_patch.js (removed in 18.0), serve-menu-icon revert pair. Verified: 73 modules install clean on 18.0 with demo ON (--no-http, demo enabled).

PR: [FWD] branding: forward-port 17.0 → 18.0 (web_responsive guard + sticky statusbar, demo enrich)

Committer: David Tran

Instance ID: 0

PR State: merged

age: up-time:

[FIX] viin_brand_hr_expense: restore empty-state image size on v18 On v18 the core placeholder %o-nocontent-init-image no longer declares width/height (each consumer must set its own, e.g. core sets 120x80). The branded phone-bill :before only set background + background-size, so it collapsed to height:0 and the image was invisible on the My Expenses empty-state. Add explicit width:300px / height:230px matching the background-size. Caught by live-browser render verification. Claude-Session: https://claude.ai/code/session_01FsCCRaAZ4Tb84s2UdQQQS2

PR: [FIX] viin_brand_hr_expense: re-enable on 18.0 + refresh live_test_url

Committer: David Tran

Instance ID: 0

PR State: merged

age: up-time:

[FIX] viin_brand_hr_expense: restore empty-state image size on v18 On v18 the core placeholder %o-nocontent-init-image no longer declares width/height (each consumer must set its own, e.g. core sets 120x80). The branded phone-bill :before only set background + background-size, so it collapsed to height:0 and the image was invisible on the My Expenses empty-state. Add explicit width:300px / height:230px matching the background-size. Caught by live-browser render verification. Claude-Session: https://claude.ai/code/session_01FsCCRaAZ4Tb84s2UdQQQS2

PR: [FIX] viin_brand_hr_expense: re-enable on 18.0 + refresh live_test_url

Committer: David Tran

Instance ID: 0

PR State: merged

age: Not finished up-time: Not finished

[FIX] viin_brand: refresh live_test_url to v18demo Point live_test_url / live_test_url_vi_VN at v18demo-int / v18demo-vn (were still v17demo) on the 18.0 branding modules. Claude-Session: https://claude.ai/code/session_01FsCCRaAZ4Tb84s2UdQQQS2

PR: [FIX] viin_brand_hr_expense: re-enable on 18.0 + refresh live_test_url

Committer: David Tran

Instance ID: 0

PR State: merged

age: up-time: Not finished

[FWD] branding: forward-port 17.0 styling fixes to 18.0 Forward-port 8 white-label frontend commits (b1e478d..a83807d) from 17.0 onto 18.0: viin_brand_mail / viin_brand_common / viin_brand_pos / web_responsive SCSS plus the apps_menu preferences OWL group-guard. Platform-drift adaptations for v18: - viin_brand_mail manifest: register new message/message_seen_indicator overrides and move the messaging_menu asset anchor to mail/static/src/core/public_web (v18 relocated it from core/web), keeping the v18 mail.assets_public + im_livechat bundles. - apps_menu_preferences.esm.js: re-graft the base.group_system visibility guard (useState + onWillStart + t-if) onto the v18 @web/core/user singleton idiom and static template. - viin_brand_pos/style.scss: drop dead v17-era POS highlight rules. Verified on a live v18 instance: install-clean, asset bundles build with zero console errors, the apps_menu OWL component mounts, and the white-label styling applies. Claude-Session: https://claude.ai/code/session_01Vxr24zjvJXj5gmv6vgzPPd

PR: [FWD] branding: forward-port 17.0 styling fixes to 18.0

Committer: David Tran

Instance ID: 0

PR State: merged

age: up-time:

[FIX] viin_brand_website_slides: fix bad UI

PR: [FIX][18.0] viin_brand_website_slides: fix bad UI

Committer: Viinbot

Instance ID: 0

PR State: merged

age: up-time:

[IMP] web_responsive: change home menu to action

PR: [IMP][18.0] web_responsive: change home menu to action

Committer: Huy Lee

Instance ID: 0

PR State: merged

age: up-time:

[IMP] web_responsive: change home menu to action

PR: [IMP][18.0] web_responsive: change home menu to action

Committer: Huy Lee

Instance ID: 0

PR State: merged

age: up-time:

[IMP] web_responsive: change home menu to action

PR: [IMP][18.0] web_responsive: change home menu to action

Committer: Huy Lee

Instance ID: 0

PR State: merged

age: up-time:

[UPD] web_responsive: update code from upstream

PR: [UPD] web_responsive: update code from upstream

Committer: Roy Le

Instance ID: 0

PR State: merged

age: up-time:

[UPD] web_responsive: update code from upstream

PR: [UPD] web_responsive: update code from upstream

Committer: Roy Le

Instance ID: 0

PR State: merged

age: up-time: Not finished

[UPD] web_responsive: update code from upstream

PR: [UPD] web_responsive: update code from upstream

Committer: Roy Le

Instance ID: 0

PR State: merged

age: up-time:

[FIX] viin_brand: change odoo email template to viindoo

PR: [FIX][18.0] viin_brand: change odoo email template to viindoo

Committer: Tuyentran12345

Instance ID: 0

PR State: merged

age: up-time:

[IMP] viin_brand_website_sale: drop unverifiable "#1" claim from promo The eCommerce "Powered by" footer stated "The #1 Open Source eCommerce Software" (vi_VN: "... Mã nguồn mở số 1"), an unverifiable superiority ranking. Vietnam's advertising law forbids "#1"/"best" style claims without supporting evidence and penalises them heavily, so remove the ranking wording from both the template source and the Vietnamese translation. - views/templates.xml: drop the "#1" from the promo label and the standalone "The" text node so the label reads "Open Source eCommerce Software"; add a comment at the label noting the VN advertising-law constraint. - i18n/vi_VN.po and .pot: realign msgid to the new source string and drop the now-orphaned "The" term; msgstr "... Mã nguồn mở số 1" -> "... Mã nguồn mở". - bump module version 0.1 -> 0.2 so existing databases pick up the updated view and translation on upgrade.

PR: [IMP][13.0] viin_brand_website_sale: drop unverifiable "#1" claim from promo

Committer: SonCrits

Instance ID: 0

PR State: open

age: up-time:

[IMP] gitignore: ignore node_modules and .odoo-ai Add node_modules/ (Node.js dependencies) and .odoo-ai/ (Odoo AI agent workspace) to .gitignore so these local build/tooling artifacts are never tracked.

PR: [IMP] gitignore: ignore node_modules and .odoo-ai

Committer: David Tran

Instance ID: 0

PR State: merged

age: up-time: Not finished

[FIX] viin_brand_auth_signup: Header values may not contain linefeed

PR: [ADD][16.0] viin_brand_auth_signup: Viindoo Branding for module Signup

Committer: Viinbot

Instance ID: 0

PR State: open

age: up-time:

[IMP] viin_brand_auth_totp_mail: fix test pylint

PR: [IMP][16.0] viin_brand_auth_totp*: Viindoo debranding for module auth_totp*

Committer: Viinbot

Instance ID: 0

PR State: open

age: up-time:

[IMP] viin_brand_calendar: fix test pylint

PR: [ADD][16.0] viin_brand_calendar: Calendar Branding For Viindoo

Committer: Viinbot

Instance ID: 0

PR State: open

age: up-time:

Update viin_brand_hr_skills/__manifest__.py

PR: [IMP][16.0] viin_brand_hr*: replace odoo brand by viindoo

Committer: GitHub

Instance ID: 0

PR State: open

age: up-time:

[FIX] web_responsive: mv text-input.scss to viin_brand_mail

PR: [FIX] web_responsive: mv text-input.scss to viin_brand_mail

Committer: David Tran

Instance ID: 0

PR State: merged

age: up-time:

[FIX] web_responsive: fix show scroll in text input

PR: [FIX][16.0] web_responsive: fix show scroll in text input

Committer: TuyenTran

Instance ID: 0

PR State: merged

age: up-time:

[FIX] web_responsive: fix show scroll in text input

PR: [FIX][16.0] web_responsive: fix show scroll in text input

Committer: TuyenTran

Instance ID: 0

PR State: merged

age: up-time:

[FIX] web_chatter_position: Fixed an issue where form height was lost in the Note app.

PR: [FIX][16.0] web_chatter_position: Fixed an issue where form height was lost…

Committer: quyen

Instance ID: 0

PR State: merged

age: up-time:

[FIX] web_chatter_position: Fixed an issue where form height was lost in the Note app.

PR: [FIX][16.0] web_chatter_position: Fixed an issue where form height was lost…

Committer: quyen

Instance ID: 0

PR State: merged

age: Not finished up-time: Not finished

[FIX] web_chatter_position: Fixed an issue where form height was lost in the Note app.

PR: [FIX][16.0] web_chatter_position: Fixed an issue where form height was lost…

Committer: quyen

Instance ID: 0

PR State: merged

age: up-time: Not finished

[FIX] web_chatter_position: Fixed an issue where form height was lost in the Note app.

PR: [FIX][16.0] web_chatter_position: Fixed an issue where form height was lost…

Committer: quyen

Instance ID: 0

PR State: merged

age: up-time:

[IMP] viin_brand_website_sale: drop unverifiable "#1" claim from promo The eCommerce "Powered by" footer stated "The #1 Open Source eCommerce Software" (vi_VN: "... mã nguồn mở số 1"), an unverifiable superiority ranking. Vietnam's advertising law forbids "#1"/"best" style claims without supporting evidence and penalises them heavily, so remove the ranking wording from both the template source and the Vietnamese translation. - views/templates.xml: promo label "The #1 Open Source eCommerce Software" -> "Open Source eCommerce Software"; add a comment at the label noting the VN advertising-law constraint. - i18n/vi_VN.po and .pot: realign msgid to the new source string; msgstr "... mã nguồn mở số 1" -> "... mã nguồn mở". - bump module version 0.1 -> 0.2 so existing databases pick up the updated view and translation on upgrade.

PR: [IMP][17.0] viin_brand_website_sale: drop unverifiable "#1" claim from promo

Committer: SonCrits

Instance ID: 0

PR State: merged

Delete Date:

age: up-time:

[IMP] viin_brand_website_sale: drop unverifiable "#1" claim from promo The eCommerce "Powered by" footer stated "The #1 Open Source eCommerce Software" (vi_VN: "... mã nguồn mở số 1"), an unverifiable superiority ranking. Vietnam's advertising law forbids "#1"/"best" style claims without supporting evidence and penalises them heavily, so remove the ranking wording from both the template source and the Vietnamese translation. - views/templates.xml: promo label "The #1 Open Source eCommerce Software" -> "Open Source eCommerce Software"; document the inherited replace with a comment. - i18n/vi_VN.po and .pot: realign msgid to the new source string; msgstr "... mã nguồn mở số 1" -> "... mã nguồn mở". - bump module version 0.1 -> 0.2 so existing databases pick up the updated view and translation on upgrade.

PR: [IMP][17.0] viin_brand_website_sale: drop unverifiable "#1" claim from promo

Committer: SonCrits

Instance ID: 0

PR State: merged

age: Not finished up-time: Not finished

[FIX] web_responsive: core checkbox metrics inside QUnit pages The 'big checkboxes' restyle (+10px margin-right, 1.5em box) widens the list record-selector column, shifting core pixel-width assertions by exactly those pixels (runbot 223235/396399: ListView 'column widths should depend on the content when there is data' 41->51 and 'editable list: resize column headers' 52->51). Load a web.tests_assets-only reset that pins the test page back to core metrics; the real webclient keeps big checkboxes.

PR: [FIX] viin_brand_common: apply brand palette/title only in genuine sessions; core metrics in QUnit

Committer: Roy Le

Instance ID: 0

PR State: merged

age: up-time: Not finished

[FIX] viin_brand_common: apply brand palette/title only in genuine sessions; core metrics in QUnit Three brand client tweaks broke core QUnit suites: the unconditional colors.getColor override failed 30 GraphView tests asserting the default palette; the 'Viindoo' window-title part failed 3 ActionManager title tests; and the 15px base font shifted pixel-geometry assertions (Draggable confinement, Scroller offsets, tour anchors) by fractions of a pixel (runbot 223219/396221 & 223235/396399). session_info now stamps a viin_brand marker: real sessions keep the brand palette and title, mock test sessions (marker absent) fall through to core behavior. A web.tests_assets-only CSS reset pins the test page back to the 14px core base font - the real webclient is untouched. Also fix the missing '#' on the last palette color (was an invalid CSS color).

PR: [FIX] viin_brand_common: apply brand palette/title only in genuine sessions; core metrics in QUnit

Committer: Roy Le

Instance ID: 0

PR State: merged

age: up-time: Not finished

[FIX] viin_brand_website: end the colorpicker tour override with a pure check step The override dropped the final RGBA assertion entirely, leaving the last step action-less -- web_tour warns "ignoring action (auto) of last step" on every run. Relax the step to a pure check (isCheck on .o_rgba_div) instead of dropping it: the tour still ends on a verification, only the hard-coded rgb assertion the brand palette invalidates is gone. Verify: /website:TestUi.test_32_website_background_colorpicker 0 failed, 0 "ignoring action" warnings (clean CE and v17_full).

PR: V17 fix test tour

Committer: Roy Le

Instance ID: 0

PR State: merged

age: up-time: Not finished

[FIX] viin_brand_common: keep statusbar arrows compact so 4 stages fit on mobile The brand raises $o-font-size-base to 15px (core default is 14px). That extra width on the status-flow arrows is enough that a 4-stage statusbar no longer fits one row on small screens: adjustVisibleItems detects the wrap and folds one arrow into the overflow dropdown. Core's mobile web StatusBarField QUnit tests assert every stage renders as an inline arrow (4 visible, a single "..." toggle, one disabled dropdown item), so they failed 3/... under the branded assets while passing on clean CE. Root-caused on v17_full by instrumenting core areItemsWrapping(): branded arrows measured 65px wide / 34.5px tall vs clean CE's 50-61px / 33px, tipping 4 arrows over the container width. Scope the arrows to $o-font-size-base-small (13px) - the framework's compact control size - so they match core's geometry and all four stages stay inline. Only the arrow chrome shrinks; stage labels remain legible. Verified on v17_full: web MobileWebSuite.test_mobile_js 0 failed (the three StatusBarField "small devices" / "extra small screens" / "clickable ... on mobile" cases now pass).

PR: [FIX] viin_brand_common: keep statusbar arrows compact so 4 stages fit on mobile

Committer: Roy Le

Instance ID: 0

PR State: merged

age: up-time: Not finished

[FIX] web_responsive: restore disabled binding on chatter Log Note button The web_responsive.Chatter template replaces the Log Note button but dropped its t-att-disabled binding (the sibling Send message button kept it). This left Log Note always enabled regardless of posting permission, breaking Odoo core's project_chatter_log_disabled tour (project/tests/test_project_ui.py), which logs in as a limited Project User and asserts the button is disabled. Restore the same disabled expression used by the Send message button.

PR: [FIX] web_responsive: keep upstream "Action" statusbar toggler on mobile

Committer: Roy Le

Instance ID: 0

PR State: merged

age: up-time: Not finished

[FIX] viin_brand_pos: guard company service in POS Navbar favicon patch The POS Navbar patch read this.env.services.company.currentCompany.id unconditionally in setup() to set the branded favicon. The company service is not registered in the bare point_of_sale QUnit test env, so this.env.services.company was undefined and .currentCompany threw "Cannot read properties of undefined (reading 'currentCompany')" in Navbar.setup -> the whole POS Chrome mount failed, failing point_of_sale:WebSuite.test_pos_js ("mount the Chrome"). Optional-chain the service and bail out when there is no current company (no branded favicon to set). Real POS is unaffected. Verified: point_of_sale:WebSuite.test_pos_js passes (0 failed) on a focused point_of_sale+viin_brand_pos install with the guard.

PR: [FIX] viin_brand_pos: guard company service in POS Navbar favicon patch

Committer: Roy Le

Instance ID: 0

PR State: merged

age: up-time: Not finished

[FIX] viin_brand_website: adapt website_background_colorpicker tour to branded palette viin_brand_common recolours the frontend theme palette (primary #7f4282), so the core website_background_colorpicker tour no longer holds: its custom-colour step targets a hard-coded swatch background-color:#65435C (= rgb(101,67,92)) that the recoloured palette never produces, and the following RGBA check asserts that exact rgb. That breaks website: TestUi.test_32_website_background_colorpicker. Re-register the tour (force) in web.assets_tests with the custom-colour step adapted to pick whatever the first custom swatch is, and drop only the hard-coded custom-colour rgb assertion. The gradient steps (a fixed preset) and their RGBA check are kept, so the tour still exercises the colorpicker.

PR: [FIX] viin_brand_website: adapt website_background_colorpicker tour to branded palette

Committer: Roy Le

Instance ID: 0

PR State: merged

age: up-time: Not finished

[FIX] viin_brand: repoint hr_contract link to the canonical 17.0 store URL to_base overrides a core module's manifest 'website' from this branding dict at load time (_get_brand_module_website -> _load_manifest_plus), so this value is what a Viindoo deployment actually displays for the core hr_contract module - it is shipped, not inert. The hr_contract entry was wrong twice over: it used the legacy /apps/app/ prefix (now only a permanent 301 shim), and it pinned version 15.0 inside the 17.0 branch, so 17.0 users were sent to a four-series-old store page. viin_hr_contract is published on the store at 17.0, so the canonical target resolves directly. The remaining entries are deliberately left alone: they map core Odoo modules to Viindoo marketing intro pages, which is the correct destination - a core Odoo module has no Viindoo store page under its own name. hr_contract is the only store link in this dict, and the only one that was stale.

PR: [IMP] *: point module manifests at their canonical App Store page

Committer: David Tran

Instance ID: 0

PR State: merged

age: up-time:

[FIX] web_responsive: don't break core component tests when apps_menu is absent The NavBar and WebClient patches called useService("apps_menu") and the menu searchbar read session.apps_menu.search_type. Isolated core component tests (NavBar, BurgerMenu, mail mobile) do not start apps_menu nor set session.apps_menu, so these threw as soon as web_responsive is installed ("Service apps_menu is not available", "Cannot read properties of undefined (reading 'search_type')"). Read apps_menu from env.services (optional), fall back to super._loadDefaultApp(), and use session.apps_menu?.search_type.

PR: [FIX] web_responsive: don't break core component tests when apps_menu is

Committer: Roy Le

Instance ID: 0

PR State: merged

age: up-time: Not finished

[FIX] web_responsive: use semantic SCSS tokens + guard apps_menu access

PR: [FIX] web_responsive: semantic SCSS tokens + guard apps_menu access

Committer: David Tran

Instance ID: 0

PR State: merged

age: up-time:

[MISC] *: enrich demo data

PR: [MISC] *: enrich demo data

Committer: Roy Le

Instance ID: 0

PR State: merged

age: up-time:

[IMP] web_responsive: adjust button styles and alignment in the chatter The purpose is to reduce spacing so that all icons and buttons fit within the window without having to scroll.

PR: [UPD] web_responsive: update code from upstream

Committer: Roy Le

Instance ID: 0

PR State: merged

age: up-time:

[IMP] web_responsive: adjust button styles and alignment in the chatter The purpose is to reduce spacing so that all icons and buttons fit within the window without having to scroll.

PR: [UPD] web_responsive: update code from upstream

Committer: Roy Le

Instance ID: 0

PR State: merged

age: Not finished up-time: Not finished

[IMP] web_responsive: adjust button styles and alignment in the chatter The purpose is to reduce spacing so that all icons and buttons fit within the window without having to scroll.

PR: [UPD] web_responsive: update code from upstream

Committer: Roy Le

Instance ID: 0

PR State: merged

age: up-time:

[REM] web_responsive: drop OCA responsive backend (superseded by viin_backend_theme's native mobile/rail redesign) Was the legacy to_backend_theme's dependency; nothing else in the repo/tvtmaaddons/core depends on it. Signed-off-by: David Tran <david.tran@tvtmarine.com>

PR: [UPG] branding-base cluster (5 modules) to Odoo 19.0 + de-brand/teal SSOT

Committer: David Tran

Instance ID: 0

PR State: open

age: up-time:

[REM] web_responsive: drop OCA responsive backend (superseded by viin_backend_theme's native mobile/rail redesign) Was the legacy to_backend_theme's dependency; nothing else in the repo/tvtmaaddons/core depends on it. Signed-off-by: David Tran <david.tran@tvtmarine.com>

PR: [UPG] branding-base cluster (5 modules) to Odoo 19.0 + de-brand/teal SSOT

Committer: David Tran

Instance ID: 0

PR State: open

age: up-time:

[REM] web_responsive: drop OCA responsive backend (superseded by viin_backend_theme's native mobile/rail redesign) Was the legacy to_backend_theme's dependency; nothing else in the repo/tvtmaaddons/core depends on it. Signed-off-by: David Tran <david.tran@tvtmarine.com>

PR: [UPG] branding-base cluster (5 modules) to Odoo 19.0 + de-brand/teal SSOT

Committer: David Tran

Instance ID: 0

PR State: open

age: up-time:

[REM] web_responsive: drop OCA responsive backend (superseded by viin_backend_theme's native mobile/rail redesign) Was the legacy to_backend_theme's dependency; nothing else in the repo/tvtmaaddons/core depends on it. Signed-off-by: David Tran <david.tran@tvtmarine.com>

PR: [UPG] branding-base cluster (5 modules) to Odoo 19.0 + de-brand/teal SSOT

Committer: David Tran

Instance ID: 0

PR State: open

age: up-time:

[REM] web_responsive: drop OCA responsive backend (superseded by viin_backend_theme's native mobile/rail redesign) Was the legacy to_backend_theme's dependency; nothing else in the repo/tvtmaaddons/core depends on it. Signed-off-by: David Tran <david.tran@tvtmarine.com>

PR: [UPG] branding-base cluster (5 modules) to Odoo 19.0 + de-brand/teal SSOT

Committer: David Tran

Instance ID: 0

PR State: open

age: up-time: Not finished

[REM] web_responsive: drop OCA responsive backend (superseded by viin_backend_theme's native mobile/rail redesign) Was the legacy to_backend_theme's dependency; nothing else in the repo/tvtmaaddons/core depends on it. Signed-off-by: David Tran <david.tran@tvtmarine.com>

PR: [UPG] branding-base cluster (5 modules) to Odoo 19.0 + de-brand/teal SSOT

Committer: David Tran

Instance ID: 0

PR State: open

age: up-time:

[REM] web_responsive: drop OCA responsive backend (superseded by viin_backend_theme's native mobile/rail redesign) Was the legacy to_backend_theme's dependency; nothing else in the repo/tvtmaaddons/core depends on it. Signed-off-by: David Tran <david.tran@tvtmarine.com>

PR: [UPG] branding-base cluster (5 modules) to Odoo 19.0 + de-brand/teal SSOT

Committer: David Tran

Instance ID: 0

PR State: open

age: up-time:

[NEW] viin_backend_theme: Odoo 19 CE backend theme (Viindoo redesign), additive on the branding base Purely-additive backend redesign on top of viin_brand_common + viin_brand_mail: instant OPT-IN dark mode (native [data-bs-theme], per-user choice - public pages and the default state stay LIGHT), the always-dark vertical rail + flat "Applications" home menu, form chrome + D6 statusbar->stepper, list/kanban + bulk bar, split-screen login, overlays/skeleton/empty-states, mobile bottom-nav + density toggle, appearance systray, Montserrat/Roboto typography. ZERO --viin-* custom properties; native $o-* / Bootstrap levers + the cluster teal SSOT only; auto_install so the de-branded redesign is the default on every Viindoo 19 DB. Includes the W5 durable test layer (Hoot: theme service + D6 stepper; HttpCase tours: dark toggle, home menu, density, mobile bottom-nav), the full dark-mode AA-contrast pass (form/dialog/grouped list/kanban/pivot/calendar/search-panel/mail menus/chatter re-pointed to the runtime scheme props; Bootstrap .text-* utilities relit in dark; light mode untouched), and the vi_VN translation. Signed-off-by: David Tran <david.tran@tvtmarine.com>

PR: [UPG] branding-base cluster (5 modules) to Odoo 19.0 + de-brand/teal SSOT

Committer: David Tran

Instance ID: 0

PR State: open

age: up-time: Not finished

[NEW] viin_backend_theme: Odoo 19 CE backend theme (Viindoo redesign), additive on the branding base Purely-additive backend redesign on top of viin_brand_common + viin_brand_mail: instant OPT-IN dark mode (native [data-bs-theme], per-user choice - public pages and the default state stay LIGHT), the always-dark vertical rail + flat "Applications" home menu, form chrome + D6 statusbar->stepper, list/kanban + bulk bar, split-screen login, overlays/skeleton/empty-states, mobile bottom-nav + density toggle, appearance systray, Montserrat/Roboto typography. ZERO --viin-* custom properties; native $o-* / Bootstrap levers + the cluster teal SSOT only; auto_install so the de-branded redesign is the default on every Viindoo 19 DB. Includes the W5 durable test layer (Hoot: theme service + D6 stepper; HttpCase tours: dark toggle, home menu, density, mobile bottom-nav), the full dark-mode AA-contrast pass (form/dialog/grouped list/kanban/pivot/calendar/search-panel/mail menus/chatter re-pointed to the runtime scheme props; Bootstrap .text-* utilities relit in dark; light mode untouched), and the vi_VN translation. Signed-off-by: David Tran <david.tran@tvtmarine.com>

PR: [UPG] branding-base cluster (5 modules) to Odoo 19.0 + de-brand/teal SSOT

Committer: David Tran

Instance ID: 0

PR State: open

age: up-time:

[FIX] viin_backend_theme: complete dark-mode AA coverage (opt-in, backend) + keep public login light Dark mode is a LOGGED-IN per-user choice applied to the backend only; public pages and the default state stay LIGHT. Two parts: 1. Public/default-light: remove login.scss's `@media (prefers-color-scheme: dark)` block - the PUBLIC pre-auth login must not darken from the visitor's OS. The login now always renders the light split-screen. Guard test_public_login_never_os_darkens bans re-adding it. 2. Complete the backend dark-mode AA coverage the earlier commit started, all dark-scoped ([data-bs-theme=dark]) so light mode is untouched. Odoo 19 CE core dark mode leaves many surfaces on compiled light values that never scheme-flip; re-point them to the runtime scheme props at the layer each is read: - Backgrounds via the core CSS var (fixes the whole family at once): grouped-kanban --Kanban-background/--KanbanGroup-background; form o2m list --ListRenderer-thead/tfoot-bg-color; breadcrumb --breadcrumb-bg; a GLOBAL .bg-view --background-color flip (view-surface utility on ~14 surfaces incl. search panel + calendar container + inputs) - beats .bg-view's !important WITHOUT an !important war since re-pointing its own local var; messaging systray --mail-MessagingMenu-bg (core set it light in its OWN dark stylesheet); search-panel list-group. - Text utilities compiled light + !important: .text-body/.text-muted/.text-900 relit WITH !important (sparing .btn-light/.btn-secondary light chips); --body-color-rgb flipped for dark. - Per-surface: search-panel active row (core hardcodes .text-black), field-selector chain part, pivot cells/headers (beat core's o-hover-text-color mixin), chatter header, command-palette footer, settings form (--settings__* vars + .settings bg + section titles). - Calendar: re-point --fc-* tokens on the .fc element itself (FullCalendar declares them there, so an ancestor rule loses) -> dark grid + readable day names/dates. - .o_web_client color-scheme: correct core's invalid 'bright' ident to light/dark per the app toggle (fixes native scrollbars/controls + the getComputedStyle skew). REVERTED a mis-step from the prior iteration: a global .text-success/.text-info dark flip that, being unscoped, lost contrast on light surfaces (selected rows/subtle alerts) - core's marginal ~3.7-3.9:1 values are accepted known-minors (like white-on-color badges), not regressed. Live getComputedStyle-verified (the review browser runs force-dark, so screenshots are unreliable): all primary daily screens (home/list/form/kanban/pivot/settings/dialog/dropdowns/command-palette/ search-panel/activities+messages menus/calendar/chatter) are AA-clean in dark, regression reverted, 0 console errors, light mode unchanged. ~24 source-invariant guards (TestReviewA11yFixes) protect the intent; 52/52 theme tests green (Python /viin_backend_theme + Hoot bracket).

PR: [UPG] branding-base cluster (5 modules) to Odoo 19.0 + de-brand/teal SSOT

Committer: David Tran

Instance ID: 0

PR State: open

age: up-time:

[FIX] viin_backend_theme: dark-mode AA contrast (form, dialog, grouped list, kanban, text utilities) A live acceptance review found several dark-mode surfaces still rendering compiled light-mode colors that do not scheme-flip. Re-point them (dark-scoped, so light mode is untouched) to the runtime scheme props, at the correct layer: * Form: record title / headings -> var(--emphasis-color); field values/inputs -> var(--body-color) (core .oe_title uses a compiled $headings-color hex). * Light form labels: brand-purple leak -> neutral var(--secondary-color) (grey, matches the mockup and the dark label tier). * Teal FOREGROUND on dark (nocontent link, bulk-selection count, active notebook tab, statusbar done glyph, many2one o_form_uri links): compiled #007F8E (3.69:1) -> lighter dark teal #4FD4E2 (~9.9:1). Teal fills + the rail accent untouched. * Dialog titles + any var-based heading: flip --heading-color -> var(--emphasis-color) at the scheme engine (core $headings-color-dark is 'inherit', never flips). * Grouped-list header + the Bootstrap .text-body/.text-muted utilities: these are compiled with light values + !important into the dark bundle, so relit with !important in dark (.text-muted spares .btn-light/.btn-secondary chips); also fix the stale --body-color-rgb in the dark scheme. * Overdue/rotting kanban card: core's static light-pink bg -> a dark-red color-mix so its text is readable in dark (light mode keeps the pink). * .o_web_client color-scheme: core's invalid 'bright' ($o-webclient-color-scheme) -> light/dark per the app toggle, so native scrollbars/controls match the scheme. All light-on-light / dark-on-light-chip cases verified non-regressed; light mode unchanged. 13 source-invariant guards added (TestReviewA11yFixes). Live re-verify: form/dialog/list/kanban/labels/links all clear AA in dark; 36/36 theme tests green.

PR: [UPG] branding-base cluster (5 modules) to Odoo 19.0 + de-brand/teal SSOT

Committer: David Tran

Instance ID: 0

PR State: open

age: up-time:

[NEW] viin_backend_theme: W5 durable test layer (Hoot + HttpCase tours) Adds the behavior-guard test layer for the theme, wired into web.assets_unit_tests (Hoot) and web.assets_tests (tours), driven by tests/test_tours.py: * Hoot - viin_theme service: setScheme dark/light flips documentElement data-bs-theme + persists the color_scheme cookie; setDensity compact flips data-viin-density + viin_density cookie; 'auto' resolves via a mocked matchMedia and re-resolves on OS flip. * Hoot - StatusBarField (D6) stepper: getStepInfo maps a mid-pipeline record to done/current/upcoming markers; clicking a stage still fires core selectItem -> web_save (presentation-only patch must not break click-to-change). * HttpCase tours: instant dark toggle + reload persistence; density compact + reload persistence (single-session location.reload, expectUnloadPage); home-menu fuzzy search + keyboard launch; mobile ViinBottomNav single-chrome + slot navigation (375x667 touch). All assert observable state (RED-on-behavior-removal); no assertion is a code snapshot. 23/23 green on 19.0 CE (17 Python/tours + 6 Hoot).

PR: [UPG] branding-base cluster (5 modules) to Odoo 19.0 + de-brand/teal SSOT

Committer: David Tran

Instance ID: 0

PR State: open

age: up-time:

[NEW] viin_backend_theme: Odoo 19 CE backend theme (Viindoo redesign), additive on the branding base auto_install theme (depends web, viin_brand_common, viin_brand_mail) that redesigns the Odoo 19 backend to the Viindoo mockups WITHOUT re-implementing the cluster's de-brand/AA cascade. Native-override-first, ZERO --viin-* parallel tokens; reads the $o-brand-primary SSOT from viin_brand_common. W1 substrate: Viindoo light/dark values on Bootstrap's UNPREFIXED runtime props (Odoo 19 sets $variable-prefix='') at :root/[data-bs-theme=dark] + app-shell flip + Montserrat/Roboto stacks. W2: 64px always-dark vertical rail (D4, active pill teal) + flat ViinHomeMenu client action (D3, mockup-faithful light, desktop 6-col/mobile 2-col, autofocus fuzzy search). W3: statusbar->stepper (D6, P3 patch + t-inherit, numbered/check pills), control panel (D5), button-box (D7), notebook teal (D11), list chrome + bulk bar (D10, SelectionBox t-inherit), kanban card hover-lift (D9), login split-screen (D16) + frontend $primary de-brand (A-LOGIN, teal CTA), overlays (D12) + loading/skeleton (D15) + nocontent (D14). W4: dark mode END-TO-END - res.users.viin_color_scheme (SELF-writeable) + ir.http.color_scheme() (cookie>pref>super) + data-bs-theme/data-viin-density boot reflection (FOUC-free reload) + viin_theme service (INSTANT no-reload toggle + System/matchMedia) + ViinAppearanceSystray + ViinBottomNav (mobile, §4d layering) + density + the half-dark container fix (re-point control panel/form sheet/statusbar/chatter/kanban to runtime scheme vars). Only 3 OWL patches (WebClient landing, NavBar rail, StatusBarField stepper). Verified live per wave vs the mockup-ref set; 13 module tests green; compile-landmine guards (no var()-in-color-fn, no bare CSS min/max, no -- in XML comments, no luxon import). Follow-ups: woff2 font vendoring, ViinSkeleton component, empty-state SVGs, compact density 34px target, W5 tours/axe/visual-regression. Signed-off-by: David Tran <david.tran@tvtmarine.com>

PR: [UPG] branding-base cluster (5 modules) to Odoo 19.0 + de-brand/teal SSOT

Committer: David Tran

Instance ID: 0

PR State: open

age: up-time:

[UPG] viin_brand_web_editor: upgrade to 19.0 (web_editor -> html_editor rename, primary-button de-brand SCSS) Signed-off-by: David Tran <david.tran@tvtmarine.com>

PR: [UPG] branding-base cluster (5 modules) to Odoo 19.0 + de-brand/teal SSOT

Committer: David Tran

Instance ID: 0

PR State: open

age: up-time:

[UPG] viin_brand_web_editor: upgrade to 19.0 (web_editor -> html_editor rename, primary-button de-brand SCSS) Signed-off-by: David Tran <david.tran@tvtmarine.com>

PR: [UPG] branding-base cluster (5 modules) to Odoo 19.0 + de-brand/teal SSOT

Committer: David Tran

Instance ID: 0

PR State: open

age: up-time:

[UPG] viin_brand_web_editor: upgrade to 19.0 (web_editor -> html_editor rename, primary-button de-brand SCSS) Signed-off-by: David Tran <david.tran@tvtmarine.com>

PR: [UPG] branding-base cluster (5 modules) to Odoo 19.0 + de-brand/teal SSOT

Committer: David Tran

Instance ID: 0

PR State: open

age: up-time: