Add OCA Modules Status section: searchable scrollable table with v19/v20 support indicators and GitHub icon links

This commit is contained in:
Reef committed 2026-09-27 10:24:03 +00:00
1 parent 246beeb231
commit 3605545838
2 files changed
+110

No files matched your search

+63
View File
@@ -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 ? '<span class="oca-check">&#10003;</span>' : '<span class="oca-cross">&ndash;</span>';
var v20 = mod.v20 ? '<span class="oca-check">&#10003;</span>' : '<span class="oca-cross">&ndash;</span>';
html += '<tr>' +
'<td>' + esc(mod.name) + '</td>' +
'<td>' + esc(mod.area) + '</td>' +
'<td>' + v19 + '</td>' +
'<td>' + v20 + '</td>' +
'<td><a href="' + esc(mod.URL) + '" target="_blank" rel="noopener" class="oca-icon-link" title="View on GitHub"><i class="fas fa-external-link-alt"></i></a></td>' +
'</tr>';
}
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);
});
}
})();