diff --git a/script.js b/script.js
index 4bc35b0..b6ce339 100644
--- a/script.js
+++ b/script.js
@@ -666,3 +666,66 @@ var si = 0,
form.submit();
document.body.removeChild(form);
};
+
+ /* ---- OCA Modules Status ---- */
+ (function () {
+ var tbody = document.getElementById('ocaTbody');
+ var searchInput = document.getElementById('ocaSearch');
+ var empty = document.getElementById('ocaEmpty');
+ var loading = document.getElementById('ocaLoading');
+ var allModules = [];
+
+ function render(filter) {
+ var q = (filter || '').toLowerCase();
+ var matched = q ? allModules.filter(function (m) { return (m.name + ' ' + m.area).toLowerCase().indexOf(q) !== -1; }) : allModules;
+ if (matched.length === 0) {
+ tbody.innerHTML = '';
+ empty.style.display = 'block';
+ return;
+ }
+ empty.style.display = 'none';
+ var html = '';
+ for (var i = 0; i < matched.length; i++) {
+ var mod = matched[i];
+ var v19 = mod.v19 ? '
✓' : '
–';
+ var v20 = mod.v20 ? '
✓' : '
–';
+ html += '
' +
+ '| ' + esc(mod.name) + ' | ' +
+ '' + esc(mod.area) + ' | ' +
+ '' + v19 + ' | ' +
+ '' + v20 + ' | ' +
+ ' | ' +
+ '
';
+ }
+ tbody.innerHTML = html;
+ }
+
+ function esc(s) {
+ var d = document.createElement('div');
+ d.appendChild(document.createTextNode(s || ''));
+ return d.innerHTML;
+ }
+
+ fetch('https://n8n.odoo4projects.com/webhook/oc-guy/modules')
+ .then(function (r) { return r.json(); })
+ .then(function (data) {
+ if (data && Array.isArray(data.data)) {
+ allModules = data.data;
+ } else if (Array.isArray(data) && data.length > 0 && Array.isArray(data[0].data)) {
+ allModules = data[0].data;
+ } else if (Array.isArray(data)) {
+ allModules = data;
+ }
+ loading.style.display = 'none';
+ render(searchInput ? searchInput.value : '');
+ })
+ .catch(function () {
+ loading.textContent = 'Could not load module status.';
+ });
+
+ if (searchInput) {
+ searchInput.addEventListener('input', function () {
+ render(this.value);
+ });
+ }
+ })();