16.0 vanilla version

This commit is contained in:
Ernad Husremovic 2025-10-08 10:46:05 +02:00
parent 2e65bf056a
commit 8c653da57a
5 changed files with 2045 additions and 4742 deletions

View file

@ -15,40 +15,14 @@ pip install odoo-bringout-oca-ocb-web
## Dependencies ## Dependencies
This addon depends on:
- base - base
## Manifest Information
- **Name**: Web
- **Version**: 1.0
- **Category**: Hidden
- **License**: LGPL-3
- **Installable**: False
## Modifications
This package has been modified from the original OCA/OCB source:
- Removed proprietary mobile app download buttons (Google Play Store, Apple App Store) from base_setup configuration views
## Source ## Source
Based on [OCA/OCB](https://github.com/OCA/OCB) branch 16.0, addon `web`. - Repository: https://github.com/OCA/OCB
- Branch: 16.0
- Path: addons/web
## License ## License
This package maintains the original LGPL-3 license from the upstream Odoo project. This package preserves the original LGPL-3 license.
## Documentation
- Overview: doc/OVERVIEW.md
- Architecture: doc/ARCHITECTURE.md
- Models: doc/MODELS.md
- Controllers: doc/CONTROLLERS.md
- Wizards: doc/WIZARDS.md
- Install: doc/INSTALL.md
- Usage: doc/USAGE.md
- Configuration: doc/CONFIGURATION.md
- Dependencies: doc/DEPENDENCIES.md
- Troubleshooting: doc/TROUBLESHOOTING.md
- FAQ: doc/FAQ.md

View file

@ -1,7 +1,9 @@
[project] [project]
name = "odoo-bringout-oca-ocb-web" name = "odoo-bringout-oca-ocb-web"
version = "16.0.0" version = "16.0.0"
description = "Web - Odoo addon" description = "Web -
Odoo addon
"
authors = [ authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" } { name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
] ]
@ -16,14 +18,14 @@ classifiers = [
"Intended Audience :: Developers", "Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Programming Language :: Python :: 3", "Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.12",
"Topic :: Office/Business", "Topic :: Office/Business",
] ]
[project.urls] [project.urls]
homepage = "https://github.com/bringout/odoo-bringout-oca-ocb-web" homepage = "https://github.com/bringout/0"
repository = "https://github.com/bringout/odoo-bringout-oca-ocb-web" repository = "https://github.com/bringout/0"
[build-system] [build-system]
requires = ["hatchling"] requires = ["hatchling"]

File diff suppressed because it is too large Load diff

View file

@ -4542,7 +4542,7 @@
const isNewBlock = !block || forceNewBlock; const isNewBlock = !block || forceNewBlock;
let codeIdx = this.target.code.length; let codeIdx = this.target.code.length;
if (isNewBlock) { if (isNewBlock) {
const n = ast.content.filter((c) => c.type !== 6 /* TSet */).length; const n = ast.content.filter((c) => !c.hasNoRepresentation).length;
let result = null; let result = null;
if (n <= 1) { if (n <= 1) {
for (let child of ast.content) { for (let child of ast.content) {
@ -4556,15 +4556,15 @@
let index = 0; let index = 0;
for (let i = 0, l = ast.content.length; i < l; i++) { for (let i = 0, l = ast.content.length; i < l; i++) {
const child = ast.content[i]; const child = ast.content[i];
const isTSet = child.type === 6 /* TSet */; const forceNewBlock = !child.hasNoRepresentation;
const subCtx = createContext(ctx, { const subCtx = createContext(ctx, {
block, block,
index, index,
forceNewBlock: !isTSet, forceNewBlock,
isLast: ctx.isLast && i === l - 1, isLast: ctx.isLast && i === l - 1,
}); });
this.compileAST(child, subCtx); this.compileAST(child, subCtx);
if (!isTSet) { if (forceNewBlock) {
index++; index++;
} }
} }
@ -4982,9 +4982,9 @@
parseTCallBlock(node) || parseTCallBlock(node) ||
parseTTranslation(node, ctx) || parseTTranslation(node, ctx) ||
parseTTranslationContext(node, ctx) || parseTTranslationContext(node, ctx) ||
parseTKey(node, ctx) ||
parseTEscNode(node, ctx) || parseTEscNode(node, ctx) ||
parseTOutNode(node, ctx) || parseTOutNode(node, ctx) ||
parseTKey(node, ctx) ||
parseTSlot(node, ctx) || parseTSlot(node, ctx) ||
parseComponent(node, ctx) || parseComponent(node, ctx) ||
parseDOMNode(node, ctx) || parseDOMNode(node, ctx) ||
@ -5052,19 +5052,29 @@
function parseTDebugLog(node, ctx) { function parseTDebugLog(node, ctx) {
if (node.hasAttribute("t-debug")) { if (node.hasAttribute("t-debug")) {
node.removeAttribute("t-debug"); node.removeAttribute("t-debug");
return { const content = parseNode(node, ctx);
const ast = {
type: 12 /* TDebug */, type: 12 /* TDebug */,
content: parseNode(node, ctx), content,
}; };
if (content === null || content === void 0 ? void 0 : content.hasNoRepresentation) {
ast.hasNoRepresentation = true;
}
return ast;
} }
if (node.hasAttribute("t-log")) { if (node.hasAttribute("t-log")) {
const expr = node.getAttribute("t-log"); const expr = node.getAttribute("t-log");
node.removeAttribute("t-log"); node.removeAttribute("t-log");
return { const content = parseNode(node, ctx);
const ast = {
type: 13 /* TLog */, type: 13 /* TLog */,
expr, expr,
content: parseNode(node, ctx), content,
}; };
if (content === null || content === void 0 ? void 0 : content.hasNoRepresentation) {
ast.hasNoRepresentation = true;
}
return ast;
} }
return null; return null;
} }
@ -5294,11 +5304,19 @@
} }
const key = node.getAttribute("t-key"); const key = node.getAttribute("t-key");
node.removeAttribute("t-key"); node.removeAttribute("t-key");
const body = parseNode(node, ctx); const content = parseNode(node, ctx);
if (!body) { if (!content) {
return null; return null;
} }
return { type: 10 /* TKey */, expr: key, content: body }; const ast = {
type: 10 /* TKey */,
expr: key,
content,
};
if (content.hasNoRepresentation) {
ast.hasNoRepresentation = true;
}
return ast;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// t-call // t-call
@ -5407,7 +5425,7 @@
if (node.textContent !== node.innerHTML) { if (node.textContent !== node.innerHTML) {
body = parseChildren(node, ctx); body = parseChildren(node, ctx);
} }
return { type: 6 /* TSet */, name, value, defaultValue, body }; return { type: 6 /* TSet */, name, value, defaultValue, body, hasNoRepresentation: true };
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// Components // Components
@ -5586,30 +5604,51 @@
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// Translation // Translation
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
function wrapInTTranslationAST(r) {
const ast = { type: 16 /* TTranslation */, content: r };
if (r === null || r === void 0 ? void 0 : r.hasNoRepresentation) {
ast.hasNoRepresentation = true;
}
return ast;
}
function parseTTranslation(node, ctx) { function parseTTranslation(node, ctx) {
if (node.getAttribute("t-translation") !== "off") { if (node.getAttribute("t-translation") !== "off") {
return null; return null;
} }
node.removeAttribute("t-translation"); node.removeAttribute("t-translation");
return { const result = parseNode(node, ctx);
type: 16 /* TTranslation */, if ((result === null || result === void 0 ? void 0 : result.type) === 3 /* Multi */) {
content: parseNode(node, ctx), const children = result.content.map(wrapInTTranslationAST);
}; return makeASTMulti(children);
}
return wrapInTTranslationAST(result);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// Translation Context // Translation Context
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
function wrapInTTranslationContextAST(r, translationCtx) {
const ast = {
type: 17 /* TTranslationContext */,
content: r,
translationCtx,
};
if (r === null || r === void 0 ? void 0 : r.hasNoRepresentation) {
ast.hasNoRepresentation = true;
}
return ast;
}
function parseTTranslationContext(node, ctx) { function parseTTranslationContext(node, ctx) {
const translationCtx = node.getAttribute("t-translation-context"); const translationCtx = node.getAttribute("t-translation-context");
if (!translationCtx) { if (!translationCtx) {
return null; return null;
} }
node.removeAttribute("t-translation-context"); node.removeAttribute("t-translation-context");
return { const result = parseNode(node, ctx);
type: 17 /* TTranslationContext */, if ((result === null || result === void 0 ? void 0 : result.type) === 3 /* Multi */) {
content: parseNode(node, ctx), const children = result.content.map((c) => wrapInTTranslationContextAST(c, translationCtx));
translationCtx, return makeASTMulti(children);
}; }
return wrapInTTranslationContextAST(result, translationCtx);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// Portal // Portal
@ -5654,6 +5693,13 @@
} }
return children; return children;
} }
function makeASTMulti(children) {
const ast = { type: 3 /* Multi */, content: children };
if (children.every((c) => c.hasNoRepresentation)) {
ast.hasNoRepresentation = true;
}
return ast;
}
/** /**
* Parse all the child nodes of a given node and return an ast if possible. * Parse all the child nodes of a given node and return an ast if possible.
* In the case there are multiple children, they are wrapped in a astmulti. * In the case there are multiple children, they are wrapped in a astmulti.
@ -5666,7 +5712,7 @@
case 1: case 1:
return children[0]; return children[0];
default: default:
return { type: 3 /* Multi */, content: children }; return makeASTMulti(children);
} }
} }
/** /**
@ -5770,7 +5816,7 @@
} }
// do not modify manually. This file is generated by the release script. // do not modify manually. This file is generated by the release script.
const version = "2.8.0"; const version = "2.8.1";
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// Scheduler // Scheduler
@ -6279,8 +6325,8 @@
Object.defineProperty(exports, '__esModule', { value: true }); Object.defineProperty(exports, '__esModule', { value: true });
__info__.date = '2025-06-30T12:46:06.424Z'; __info__.date = '2025-09-23T07:17:45.055Z';
__info__.hash = 'b620502'; __info__.hash = '5211116';
__info__.url = 'https://github.com/odoo/owl'; __info__.url = 'https://github.com/odoo/owl';

View file

@ -5090,7 +5090,7 @@ QUnit.module("Views", (hooks) => {
assert.containsOnce(target, ".o_notification_manager .o_notification"); assert.containsOnce(target, ".o_notification_manager .o_notification");
}); });
QUnit.test("keynav: switching to another record from an invalid one", async function (assert) { QUnit.skip("keynav: switching to another record from an invalid one", async function (assert) {
await makeView({ await makeView({
type: "form", type: "form",
resModel: "partner", resModel: "partner",
@ -5159,7 +5159,7 @@ QUnit.module("Views", (hooks) => {
assert.strictEqual(target.querySelector(".o_pager_value").textContent, "1"); assert.strictEqual(target.querySelector(".o_pager_value").textContent, "1");
}); });
QUnit.test("keynav: switching to another record from a dirty one", async function (assert) { QUnit.skip("keynav: switching to another record from a dirty one", async function (assert) {
let nbWrite = 0; let nbWrite = 0;
await makeView({ await makeView({
type: "form", type: "form",