Files
full_encoach_platform/odoo/addons/bus/static/src/misc.js
Yamen Ahmad 3e83d8d7d5 feat: add complete EnCoach backend — Odoo 19 + all addons
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
2026-04-01 17:10:04 +04:00

64 lines
1.8 KiB
JavaScript

import { browser } from "@web/core/browser/browser";
/**
* Returns a function, that, when invoked, will only be triggered at most once
* during a given window of time. Normally, the throttled function will run
* as much as it can, without ever going more than once per `wait` duration;
* but if you'd like to disable the execution on the leading edge, pass
* `{leading: false}`. To disable execution on the trailing edge, ditto.
*
* credit to `underscore.js`
*/
function throttle(func, wait, options) {
let timeout, context, args, result;
let previous = 0;
if (!options) {
options = {};
}
const later = function () {
previous = options.leading === false ? 0 : luxon.DateTime.now().ts;
timeout = null;
result = func.apply(context, args);
if (!timeout) {
context = args = null;
}
};
const throttled = function () {
const _now = luxon.DateTime.now().ts;
if (!previous && options.leading === false) {
previous = _now;
}
const remaining = wait - (_now - previous);
context = this;
args = arguments;
if (remaining <= 0 || remaining > wait) {
if (timeout) {
browser.clearTimeout(timeout);
timeout = null;
}
previous = _now;
result = func.apply(context, args);
if (!timeout) {
context = args = null;
}
} else if (!timeout && options.trailing !== false) {
timeout = browser.setTimeout(later, remaining);
}
return result;
};
throttled.cancel = function () {
browser.clearTimeout(timeout);
previous = 0;
timeout = context = args = null;
};
return throttled;
}
export const timings = {
throttle,
};