Skip to content

Commit ff067c0

Browse files
author
John75SunCity
committed
fix: Convert visualization_dynamic_loader.js to vanilla JavaScript
EASIEST CONVERSION (0 jQuery calls): - Organization chart dynamic library loader - Already used vanilla JavaScript internally - Only needed to remove odoo.define() and publicWidget wrapper CONVERSION DETAILS: - Removed: odoo.define(), publicWidget - Kept: All existing vanilla JavaScript logic (injectTag, ensureAssets) - Added: Auto-initialization on DOMContentLoaded - Pattern: IIFE with object literal FUNCTIONALITY PRESERVED: ✓ Dynamic vis-network library loading (local → CDN fallback) ✓ Prevents committing large minified vendor bundles ✓ Loads only when diagram containers present ✓ Async script loading with proper error handling FILES COMPLETED (2/4): ✅ portal_barcode_management.js (30 jQuery → vanilla) ✅ visualization_dynamic_loader.js (0 jQuery → vanilla) FILES REMAINING (2/4): ⏳ portal_signature.js (47 jQuery calls - HIGH PRIORITY for e-signatures) ⏳ portal_inventory_highlights.js (37 jQuery calls - MEDIUM PRIORITY) Next: Convert portal_signature.js for destruction certificate signing
1 parent 9925ffd commit ff067c0

File tree

2 files changed

+25
-14
lines changed

2 files changed

+25
-14
lines changed

records_management/__manifest__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -785,9 +785,9 @@
785785
# Optional heavy visualization bundle loaded only when flowchart / portal diagram features are enabled.
786786
# This reduces baseline asset generation time for generic back-end usage and speeds up unit test asset build.
787787
"records_management.assets_visualization_optional": [
788-
# TEMPORARILY DISABLED - Need vanilla JS conversion (publicWidget unavailable in frontend)
788+
# ✅ RE-ENABLED - Converted to vanilla JavaScript (organization chart dynamic loader)
789789
# Dynamic loader replaces large minified vendor bundles to satisfy repo guideline (no minified libs committed)
790-
# "records_management/static/src/js/visualization_dynamic_loader.js",
790+
"records_management/static/src/js/visualization_dynamic_loader.js",
791791
# Local placeholder CSS (unminified real library recommended for production replacement)
792792
"records_management/static/src/lib/vis/vis-network.css",
793793
"records_management/static/src/xml/customer_portal_diagram_templates.xml"

records_management/static/src/js/visualization_dynamic_loader.js

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
* Lightweight dynamic loader that fetches visualization libraries (vis-network)
44
* from a CDN only when a diagram container is present. Avoids committing large
55
* minified vendor bundles into the repository while preserving functionality.
6+
*
7+
* DEPENDENCIES: NONE (Pure vanilla JavaScript)
68
*/
7-
odoo.define('records_management.visualization_dynamic_loader', ['web.public.widget'], function (require) {
9+
(function () {
810
'use strict';
911

10-
const publicWidget = require('web.public.widget');
11-
1212
// Local (served by Odoo) preferred paths
1313
const LOCAL_JS = '/records_management/static/src/lib/vis/vis-network.js';
1414
const LOCAL_CSS = '/records_management/static/src/lib/vis/vis-network.css';
@@ -19,7 +19,9 @@ odoo.define('records_management.visualization_dynamic_loader', ['web.public.widg
1919
const CDN_CSS = `https://unpkg.com/vis-network@${CDN_VERSION}/dist/vis-network.min.css`;
2020

2121
function injectTag(tag, attrs, marker) {
22-
if (document.querySelector(`[data-vis-network="${marker}"]`)) { return Promise.resolve(); }
22+
if (document.querySelector(`[data-vis-network="${marker}"]`)) {
23+
return Promise.resolve();
24+
}
2325
return new Promise((resolve, reject) => {
2426
const el = document.createElement(tag);
2527
Object.entries(attrs).forEach(([k,v]) => el.setAttribute(k, v));
@@ -60,15 +62,24 @@ odoo.define('records_management.visualization_dynamic_loader', ['web.public.widg
6062
}
6163
}
6264

63-
publicWidget.registry.VisualizationDynamicLoader = publicWidget.Widget.extend({
65+
const VisualizationDynamicLoader = {
6466
selector: '.o_portal_organization_diagram, .o_system_flowchart_view',
65-
start: function () {
66-
if (this.el) {
67+
68+
init() {
69+
const elements = document.querySelectorAll(this.selector);
70+
if (elements.length > 0) {
6771
ensureAssets();
6872
}
69-
return this._super.apply(this, arguments);
70-
},
71-
});
73+
}
74+
};
75+
76+
// Auto-initialize on page load
77+
if (document.readyState === 'loading') {
78+
document.addEventListener('DOMContentLoaded', () => VisualizationDynamicLoader.init());
79+
} else {
80+
VisualizationDynamicLoader.init();
81+
}
7282

73-
return publicWidget.registry.VisualizationDynamicLoader;
74-
});
83+
// Expose globally
84+
window.RecordsManagementVisualizationDynamicLoader = VisualizationDynamicLoader;
85+
})();

0 commit comments

Comments
 (0)