We're not shipping the sourcemap files, and while the assets minifier
strips out the mappings they're getting hit in debug=assets which is
bot useless and problematic when running odoo-bin without a proxy for
static folders: if sourcemaps are enabled (which is apparently the
default in all browsers if devtools are opened at this point) the
browser tries to fetch the sourcemap, which does through the
SharedDataMiddleware which doesn't find them and passes the query on
to the regular Application which goes through the entire dispatch &
NotFound process.
If website is installed, that process ends up rendering website.404,
which can be pretty costly until everything is properly cached:
# initial request
"GET /web/static/lib/bootstrap/js/index.js.map HTTP/1.1" 404 - 319 0.198 0.954
# a few requests later
"GET /web/static/lib/bootstrap/js/index.js.map HTTP/1.1" 404 - 27 0.022 0.060
And the way sourcemaps are fetched (might be headers, might be the
stampede as browsers will try to fetch a dozen sourcemaps as fast as
possible) seems to make this problem much, much worse: instead of 300+
the requests take 800+ queries each, multiple seconds, and requests
get worse as time goes on (didn't investigate the exact reason for
that) *and* they apparently don't ever get cached (at least they don't
after half a dozen reloads of the client).
431 lines
14 KiB
JavaScript
431 lines
14 KiB
JavaScript
(function (global, factory) {
|
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('./util.js')) :
|
|
typeof define === 'function' && define.amd ? define(['jquery', './util.js'], factory) :
|
|
(global.Collapse = factory(global.jQuery,global.Util));
|
|
}(this, (function ($,Util) { 'use strict';
|
|
|
|
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
|
|
Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
|
|
|
|
function _defineProperties(target, props) {
|
|
for (var i = 0; i < props.length; i++) {
|
|
var descriptor = props[i];
|
|
descriptor.enumerable = descriptor.enumerable || false;
|
|
descriptor.configurable = true;
|
|
if ("value" in descriptor) descriptor.writable = true;
|
|
Object.defineProperty(target, descriptor.key, descriptor);
|
|
}
|
|
}
|
|
|
|
function _createClass(Constructor, protoProps, staticProps) {
|
|
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
return Constructor;
|
|
}
|
|
|
|
function _defineProperty(obj, key, value) {
|
|
if (key in obj) {
|
|
Object.defineProperty(obj, key, {
|
|
value: value,
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true
|
|
});
|
|
} else {
|
|
obj[key] = value;
|
|
}
|
|
|
|
return obj;
|
|
}
|
|
|
|
function _objectSpread(target) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
var source = arguments[i] != null ? arguments[i] : {};
|
|
var ownKeys = Object.keys(source);
|
|
|
|
if (typeof Object.getOwnPropertySymbols === 'function') {
|
|
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
|
|
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
}));
|
|
}
|
|
|
|
ownKeys.forEach(function (key) {
|
|
_defineProperty(target, key, source[key]);
|
|
});
|
|
}
|
|
|
|
return target;
|
|
}
|
|
|
|
/**
|
|
* --------------------------------------------------------------------------
|
|
* Bootstrap (v4.1.3): collapse.js
|
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
* --------------------------------------------------------------------------
|
|
*/
|
|
|
|
var Collapse = function ($$$1) {
|
|
/**
|
|
* ------------------------------------------------------------------------
|
|
* Constants
|
|
* ------------------------------------------------------------------------
|
|
*/
|
|
var NAME = 'collapse';
|
|
var VERSION = '4.1.3';
|
|
var DATA_KEY = 'bs.collapse';
|
|
var EVENT_KEY = "." + DATA_KEY;
|
|
var DATA_API_KEY = '.data-api';
|
|
var JQUERY_NO_CONFLICT = $$$1.fn[NAME];
|
|
var Default = {
|
|
toggle: true,
|
|
parent: ''
|
|
};
|
|
var DefaultType = {
|
|
toggle: 'boolean',
|
|
parent: '(string|element)'
|
|
};
|
|
var Event = {
|
|
SHOW: "show" + EVENT_KEY,
|
|
SHOWN: "shown" + EVENT_KEY,
|
|
HIDE: "hide" + EVENT_KEY,
|
|
HIDDEN: "hidden" + EVENT_KEY,
|
|
CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
|
|
};
|
|
var ClassName = {
|
|
SHOW: 'show',
|
|
COLLAPSE: 'collapse',
|
|
COLLAPSING: 'collapsing',
|
|
COLLAPSED: 'collapsed'
|
|
};
|
|
var Dimension = {
|
|
WIDTH: 'width',
|
|
HEIGHT: 'height'
|
|
};
|
|
var Selector = {
|
|
ACTIVES: '.show, .collapsing',
|
|
DATA_TOGGLE: '[data-toggle="collapse"]'
|
|
/**
|
|
* ------------------------------------------------------------------------
|
|
* Class Definition
|
|
* ------------------------------------------------------------------------
|
|
*/
|
|
|
|
};
|
|
|
|
var Collapse =
|
|
/*#__PURE__*/
|
|
function () {
|
|
function Collapse(element, config) {
|
|
this._isTransitioning = false;
|
|
this._element = element;
|
|
this._config = this._getConfig(config);
|
|
this._triggerArray = $$$1.makeArray(document.querySelectorAll("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]")));
|
|
var toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE));
|
|
|
|
for (var i = 0, len = toggleList.length; i < len; i++) {
|
|
var elem = toggleList[i];
|
|
var selector = Util.getSelectorFromElement(elem);
|
|
var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) {
|
|
return foundElem === element;
|
|
});
|
|
|
|
if (selector !== null && filterElement.length > 0) {
|
|
this._selector = selector;
|
|
|
|
this._triggerArray.push(elem);
|
|
}
|
|
}
|
|
|
|
this._parent = this._config.parent ? this._getParent() : null;
|
|
|
|
if (!this._config.parent) {
|
|
this._addAriaAndCollapsedClass(this._element, this._triggerArray);
|
|
}
|
|
|
|
if (this._config.toggle) {
|
|
this.toggle();
|
|
}
|
|
} // Getters
|
|
|
|
|
|
var _proto = Collapse.prototype;
|
|
|
|
// Public
|
|
_proto.toggle = function toggle() {
|
|
if ($$$1(this._element).hasClass(ClassName.SHOW)) {
|
|
this.hide();
|
|
} else {
|
|
this.show();
|
|
}
|
|
};
|
|
|
|
_proto.show = function show() {
|
|
var _this = this;
|
|
|
|
if (this._isTransitioning || $$$1(this._element).hasClass(ClassName.SHOW)) {
|
|
return;
|
|
}
|
|
|
|
var actives;
|
|
var activesData;
|
|
|
|
if (this._parent) {
|
|
actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES)).filter(function (elem) {
|
|
return elem.getAttribute('data-parent') === _this._config.parent;
|
|
});
|
|
|
|
if (actives.length === 0) {
|
|
actives = null;
|
|
}
|
|
}
|
|
|
|
if (actives) {
|
|
activesData = $$$1(actives).not(this._selector).data(DATA_KEY);
|
|
|
|
if (activesData && activesData._isTransitioning) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
var startEvent = $$$1.Event(Event.SHOW);
|
|
$$$1(this._element).trigger(startEvent);
|
|
|
|
if (startEvent.isDefaultPrevented()) {
|
|
return;
|
|
}
|
|
|
|
if (actives) {
|
|
Collapse._jQueryInterface.call($$$1(actives).not(this._selector), 'hide');
|
|
|
|
if (!activesData) {
|
|
$$$1(actives).data(DATA_KEY, null);
|
|
}
|
|
}
|
|
|
|
var dimension = this._getDimension();
|
|
|
|
$$$1(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);
|
|
this._element.style[dimension] = 0;
|
|
|
|
if (this._triggerArray.length) {
|
|
$$$1(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);
|
|
}
|
|
|
|
this.setTransitioning(true);
|
|
|
|
var complete = function complete() {
|
|
$$$1(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW);
|
|
_this._element.style[dimension] = '';
|
|
|
|
_this.setTransitioning(false);
|
|
|
|
$$$1(_this._element).trigger(Event.SHOWN);
|
|
};
|
|
|
|
var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
|
|
var scrollSize = "scroll" + capitalizedDimension;
|
|
var transitionDuration = Util.getTransitionDurationFromElement(this._element);
|
|
$$$1(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
|
|
this._element.style[dimension] = this._element[scrollSize] + "px";
|
|
};
|
|
|
|
_proto.hide = function hide() {
|
|
var _this2 = this;
|
|
|
|
if (this._isTransitioning || !$$$1(this._element).hasClass(ClassName.SHOW)) {
|
|
return;
|
|
}
|
|
|
|
var startEvent = $$$1.Event(Event.HIDE);
|
|
$$$1(this._element).trigger(startEvent);
|
|
|
|
if (startEvent.isDefaultPrevented()) {
|
|
return;
|
|
}
|
|
|
|
var dimension = this._getDimension();
|
|
|
|
this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px";
|
|
Util.reflow(this._element);
|
|
$$$1(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);
|
|
var triggerArrayLength = this._triggerArray.length;
|
|
|
|
if (triggerArrayLength > 0) {
|
|
for (var i = 0; i < triggerArrayLength; i++) {
|
|
var trigger = this._triggerArray[i];
|
|
var selector = Util.getSelectorFromElement(trigger);
|
|
|
|
if (selector !== null) {
|
|
var $elem = $$$1([].slice.call(document.querySelectorAll(selector)));
|
|
|
|
if (!$elem.hasClass(ClassName.SHOW)) {
|
|
$$$1(trigger).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
this.setTransitioning(true);
|
|
|
|
var complete = function complete() {
|
|
_this2.setTransitioning(false);
|
|
|
|
$$$1(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);
|
|
};
|
|
|
|
this._element.style[dimension] = '';
|
|
var transitionDuration = Util.getTransitionDurationFromElement(this._element);
|
|
$$$1(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
|
|
};
|
|
|
|
_proto.setTransitioning = function setTransitioning(isTransitioning) {
|
|
this._isTransitioning = isTransitioning;
|
|
};
|
|
|
|
_proto.dispose = function dispose() {
|
|
$$$1.removeData(this._element, DATA_KEY);
|
|
this._config = null;
|
|
this._parent = null;
|
|
this._element = null;
|
|
this._triggerArray = null;
|
|
this._isTransitioning = null;
|
|
}; // Private
|
|
|
|
|
|
_proto._getConfig = function _getConfig(config) {
|
|
config = _objectSpread({}, Default, config);
|
|
config.toggle = Boolean(config.toggle); // Coerce string values
|
|
|
|
Util.typeCheckConfig(NAME, config, DefaultType);
|
|
return config;
|
|
};
|
|
|
|
_proto._getDimension = function _getDimension() {
|
|
var hasWidth = $$$1(this._element).hasClass(Dimension.WIDTH);
|
|
return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;
|
|
};
|
|
|
|
_proto._getParent = function _getParent() {
|
|
var _this3 = this;
|
|
|
|
var parent = null;
|
|
|
|
if (Util.isElement(this._config.parent)) {
|
|
parent = this._config.parent; // It's a jQuery object
|
|
|
|
if (typeof this._config.parent.jquery !== 'undefined') {
|
|
parent = this._config.parent[0];
|
|
}
|
|
} else {
|
|
parent = document.querySelector(this._config.parent);
|
|
}
|
|
|
|
var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]";
|
|
var children = [].slice.call(parent.querySelectorAll(selector));
|
|
$$$1(children).each(function (i, element) {
|
|
_this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
|
|
});
|
|
return parent;
|
|
};
|
|
|
|
_proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
|
|
if (element) {
|
|
var isOpen = $$$1(element).hasClass(ClassName.SHOW);
|
|
|
|
if (triggerArray.length) {
|
|
$$$1(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
|
|
}
|
|
}
|
|
}; // Static
|
|
|
|
|
|
Collapse._getTargetFromElement = function _getTargetFromElement(element) {
|
|
var selector = Util.getSelectorFromElement(element);
|
|
return selector ? document.querySelector(selector) : null;
|
|
};
|
|
|
|
Collapse._jQueryInterface = function _jQueryInterface(config) {
|
|
return this.each(function () {
|
|
var $this = $$$1(this);
|
|
var data = $this.data(DATA_KEY);
|
|
|
|
var _config = _objectSpread({}, Default, $this.data(), typeof config === 'object' && config ? config : {});
|
|
|
|
if (!data && _config.toggle && /show|hide/.test(config)) {
|
|
_config.toggle = false;
|
|
}
|
|
|
|
if (!data) {
|
|
data = new Collapse(this, _config);
|
|
$this.data(DATA_KEY, data);
|
|
}
|
|
|
|
if (typeof config === 'string') {
|
|
if (typeof data[config] === 'undefined') {
|
|
throw new TypeError("No method named \"" + config + "\"");
|
|
}
|
|
|
|
data[config]();
|
|
}
|
|
});
|
|
};
|
|
|
|
_createClass(Collapse, null, [{
|
|
key: "VERSION",
|
|
get: function get() {
|
|
return VERSION;
|
|
}
|
|
}, {
|
|
key: "Default",
|
|
get: function get() {
|
|
return Default;
|
|
}
|
|
}]);
|
|
|
|
return Collapse;
|
|
}();
|
|
/**
|
|
* ------------------------------------------------------------------------
|
|
* Data Api implementation
|
|
* ------------------------------------------------------------------------
|
|
*/
|
|
|
|
|
|
$$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
|
|
// preventDefault only for <a> elements (which change the URL) not inside the collapsible element
|
|
if (event.currentTarget.tagName === 'A') {
|
|
event.preventDefault();
|
|
}
|
|
|
|
var $trigger = $$$1(this);
|
|
var selector = Util.getSelectorFromElement(this);
|
|
var selectors = [].slice.call(document.querySelectorAll(selector));
|
|
$$$1(selectors).each(function () {
|
|
var $target = $$$1(this);
|
|
var data = $target.data(DATA_KEY);
|
|
var config = data ? 'toggle' : $trigger.data();
|
|
|
|
Collapse._jQueryInterface.call($target, config);
|
|
});
|
|
});
|
|
/**
|
|
* ------------------------------------------------------------------------
|
|
* jQuery
|
|
* ------------------------------------------------------------------------
|
|
*/
|
|
|
|
$$$1.fn[NAME] = Collapse._jQueryInterface;
|
|
$$$1.fn[NAME].Constructor = Collapse;
|
|
|
|
$$$1.fn[NAME].noConflict = function () {
|
|
$$$1.fn[NAME] = JQUERY_NO_CONFLICT;
|
|
return Collapse._jQueryInterface;
|
|
};
|
|
|
|
return Collapse;
|
|
}($);
|
|
|
|
return Collapse;
|
|
|
|
})));
|