Compare commits

...

2 commits

Author SHA1 Message Date
GitHub Copilot
a029fd9265 [FIX] website_sale_aplicoop: restore the floating notifications
Every error and confirmation popup was rendering off-screen. This addon's
CSS partials reach the page through @import, which the spec hoists above
everything else in the bundle, so an equal-specificity Bootstrap rule
always comes later and wins: .alert (0,1,0) beat .eskaera-notification
(0,1,0) on `position`, pinning the notification to `relative` and leaving
it in normal flow at the foot of <body>, below the footer. Qualifying the
selector as .alert.eskaera-notification (0,2,0) settles it without
!important; padding moves onto Bootstrap's own --alert-padding-* custom
properties, as .badge-km and .product-card > .card already do.

Present since the notification moved from a JS inline style to a class
(5de7573) — an inline style outranks any stylesheet rule, so the class
never inherited the specificity the inline style had.

Also fix the announcement while in the same helper: the urgency test read
`type === "error"`, which no caller passes (the type has to name a
Bootstrap variant, so failures arrive as "danger"), so every error was
announced politely instead of assertively.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-27 18:53:58 +02:00
GitHub Copilot
96b2e8eedd [FIX] website_sale_aplicoop: drop dead /eskaera/labels fetch, quiet a log
The "Available Orders" page fetched /eskaera/labels with no request body
against a type="json" route, which Odoo can't parse (400 "Invalid JSON
data" on every load). The script also targeted #realtime-category-select,
an element that only exists on the shop page, so it never did anything
useful there anyway: the shop page already re-translates that option via
_initializeTooltips() in website_sale.js. Delete the dead script instead
of fixing a call that was never reachable.

infinite_scroll.js also logged console.error for the expected case of
running on a page with no product grid (this script loads site-wide);
downgrade to console.log since it's not an error.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-27 18:21:52 +02:00
4 changed files with 30 additions and 46 deletions

View file

@ -77,22 +77,36 @@
/* ---------- Floating notification (_showNotification) ---------- */
/* Was a 200-character inline style written from JS on every call. */
.eskaera-notification {
/* Was a 200-character inline style written from JS on every call.
*
* The `.alert` qualifier is load-bearing, not decoration. This addon's
* partials reach the page through @import, which the CSS spec hoists above
* every other rule in the bundle so an equal-specificity Bootstrap rule
* always comes later and wins. `.alert` (0,1,0) therefore beat a bare
* `.eskaera-notification` (0,1,0) on `position`, pinning the toast to
* `relative` and leaving it in normal flow at the foot of <body>, below the
* footer: every error and confirmation rendered off-screen. `.alert
* .eskaera-notification` (0,2,0) settles it without !important.
*
* `.fade` does the same to `transition`, and `.alert` to `padding` which
* rides on Bootstrap's own custom properties here, as .badge-km and
* .product-card > .card already do. */
.alert.eskaera-notification {
--alert-padding-x: var(--ac-space-lg);
--alert-padding-y: var(--ac-space-lg);
position: fixed;
top: 5rem;
right: var(--ac-space-md);
z-index: var(--ac-z-notification);
min-width: 18.75rem;
max-width: 31.25rem;
padding: var(--ac-space-lg);
font-size: var(--ac-text-md);
box-shadow: var(--ac-shadow-lg);
transition: opacity var(--ac-transition-normal);
}
@media (max-width: 576px) {
.eskaera-notification {
.alert.eskaera-notification {
left: var(--ac-space-md);
right: var(--ac-space-md);
min-width: 0;
@ -101,7 +115,7 @@
@media (prefers-reduced-motion: reduce) {
.toast-notification,
.eskaera-notification {
.alert.eskaera-notification {
transition: none;
}

View file

@ -132,9 +132,10 @@ console.log("[INFINITE_SCROLL] Script loaded!");
console.log("[INFINITE_SCROLL] eskaera-config element:", configEl);
if (!configEl) {
console.error(
"[INFINITE_SCROLL] ❌ No eskaera-config found, lazy loading disabled"
);
// Expected on every eskaera page that has no product grid
// (orders list, checkout, ...): this script is loaded
// site-wide, not just on the shop page.
console.log("[INFINITE_SCROLL] No eskaera-config found, lazy loading disabled");
return;
}

View file

@ -738,8 +738,13 @@
"alert alert-" + type + " alert-dismissible fade show eskaera-notification";
// Announce it: errors and warnings are the whole point of this helper,
// and without a live role a screen reader never hears them.
notification.setAttribute("role", type === "error" ? "alert" : "status");
notification.setAttribute("aria-live", type === "error" ? "assertive" : "polite");
// The test was `type === "error"`, which no caller ever passes — the
// class has to name a Bootstrap variant, so failures come through as
// "danger". Every error was therefore announced politely, i.e. queued
// behind whatever the screen reader was already saying.
var isUrgent = type === "danger" || type === "warning";
notification.setAttribute("role", isUrgent ? "alert" : "status");
notification.setAttribute("aria-live", isUrgent ? "assertive" : "polite");
notification.innerHTML =
message +
'<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="' +

View file

@ -69,42 +69,6 @@
</div>
</div>
</div>
<script type="text/javascript">
(function() {
'use strict';
// console.log('[eskaera_page] Loading translated labels for category selector');
// Fetch translated labels from endpoint
fetch('/eskaera/labels', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': odoo.csrf_token || ''
}
})
.then(response =&gt; response.json())
.then(data =&gt; {
var labels = data.result || data;
//console.log('[eskaera_page] Labels received:', labels);
// Update category selector first option text
var categorySelect = document.getElementById('realtime-category-select');
if (categorySelect &amp;&amp; categorySelect.options[0] &amp;&amp; labels &amp;&amp; labels.all_categories) {
categorySelect.options[0].text = labels.all_categories;
// console.log('[eskaera_page] Updated category selector to:', labels.all_categories);
} else {
console.log('[eskaera_page] Could not update category selector');
console.log(' categorySelect:', !!categorySelect);
console.log(' categorySelect.options[0]:', categorySelect ? !!categorySelect.options[0] : false);
console.log(' labels:', !!labels);
console.log(' labels.all_categories:', labels ? labels.all_categories : 'N/A');
}
})
.catch(error =&gt; {
console.error('[eskaera_page] Error fetching labels:', error);
});
})();
</script>
</t>
</template>
<template id="eskaera_order_card_meta" name="Order Card Metadata">