Includes: - Odoo 19 framework (odoo/) - 27 custom EnCoach addons (new_project/custom_addons/) - encoach_core, encoach_api, encoach_lms_api, encoach_adaptive_api - encoach_exam, encoach_taxonomy, encoach_adaptive, encoach_assignment - encoach_ai, encoach_ai_grading, encoach_ai_generation, encoach_ai_media - encoach_courseware, encoach_communication, encoach_subscription - encoach_notification, encoach_approval, encoach_branding - encoach_classroom, encoach_registration, encoach_stats - encoach_faq, encoach_ticket, encoach_training, encoach_resources - encoach_adaptive_ai, encoach_sis - 21 OpenEduCat Enterprise modules (new_project/enterprise-19/) - 14 OpenEduCat Community modules (new_project/openeducat_erp-19.0/) - Configuration: odoo.conf, requirements.txt, scripts - 200+ REST API endpoints with JWT authentication - SRS and test documentation Made-with: Cursor
54 lines
1.3 KiB
JavaScript
54 lines
1.3 KiB
JavaScript
async function animate(el, keyFrame, duration) {
|
|
if (!el) {
|
|
return;
|
|
}
|
|
const animation = el.animate(keyFrame, {
|
|
duration,
|
|
iterations: 1,
|
|
fill: "forwards",
|
|
});
|
|
await animation.finished;
|
|
try {
|
|
// can fail when the element is not visible (ex: display: none)
|
|
animation.commitStyles();
|
|
} catch {
|
|
// pass
|
|
}
|
|
animation.cancel();
|
|
}
|
|
|
|
function normalizeToArray(els) {
|
|
if (els) {
|
|
if (els.nodeName && ["FORM", "SELECT"].includes(els.nodeName)) {
|
|
return [els];
|
|
}
|
|
return els[Symbol.iterator] ? els : [els];
|
|
} else {
|
|
return [];
|
|
}
|
|
}
|
|
|
|
export async function fadeOut(els, duration, afterFadeOutCallback) {
|
|
els = normalizeToArray(els);
|
|
const promises = [];
|
|
for (const el of els) {
|
|
promises.push(animate(el, [{ opacity: 0 }], duration));
|
|
}
|
|
await Promise.all(promises);
|
|
for (const el of els) {
|
|
el.classList.add("d-none");
|
|
}
|
|
afterFadeOutCallback?.();
|
|
}
|
|
|
|
export async function fadeIn(els, duration, afterFadeInCallback) {
|
|
els = normalizeToArray(els);
|
|
const promises = [];
|
|
for (const el of els) {
|
|
el.classList.remove("d-none");
|
|
promises.push(animate(el, [{ opacity: 1 }], duration));
|
|
}
|
|
await Promise.all(promises);
|
|
afterFadeInCallback?.();
|
|
}
|