(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else if(typeof exports === 'object') exports["agGrid"] = factory(); else root["agGrid"] = factory(); })(self, function() { return /******/ (function() { // webpackBootstrap /******/ "use strict"; /******/ var __webpack_modules__ = ({ /***/ 2974: /***/ (function(module, __webpack_exports__, __webpack_require__) { /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6758); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(935); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(62); /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__); // Imports var ___CSS_LOADER_URL_IMPORT_0___ = new URL(/* asset import */ __webpack_require__(2487), __webpack_require__.b); var ___CSS_LOADER_URL_IMPORT_1___ = new URL(/* asset import */ __webpack_require__(1244), __webpack_require__.b); var ___CSS_LOADER_URL_IMPORT_2___ = new URL(/* asset import */ __webpack_require__(542), __webpack_require__.b); var ___CSS_LOADER_URL_IMPORT_3___ = new URL(/* asset import */ __webpack_require__(8791), __webpack_require__.b); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); var ___CSS_LOADER_URL_REPLACEMENT_0___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_0___); var ___CSS_LOADER_URL_REPLACEMENT_1___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_1___); var ___CSS_LOADER_URL_REPLACEMENT_2___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_2___); var ___CSS_LOADER_URL_REPLACEMENT_3___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_3___); // Module ___CSS_LOADER_EXPORT___.push([module.id, ".ag-measurement-container {\n --ag-legacy-styles-loaded: \"true\";\n}\n\n.ag-icon {\n font-family: var(--ag-icon-font-family);\n font-weight: var(--ag-icon-font-weight);\n color: var(--ag-icon-font-color);\n font-size: var(--ag-icon-size);\n line-height: var(--ag-icon-size);\n font-style: normal;\n font-variant: normal;\n text-transform: none;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n width: var(--ag-icon-size);\n height: var(--ag-icon-size);\n position: relative;\n}\n.ag-icon::before {\n content: \"\";\n font-family: inherit;\n}\n.ag-icon::after {\n background: transparent var(--ag-icon-image, none) center/contain no-repeat;\n display: var(--ag-icon-image-display);\n opacity: var(--ag-icon-image-opacity, 0.9);\n position: absolute;\n inset: 0;\n content: \"\";\n}\n\n.ag-icon-aggregation {\n font-family: var(--ag-icon-font-family-aggregation, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-aggregation, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-aggregation, var(--ag-icon-font-color));\n}\n\n.ag-icon-aggregation::before {\n content: var(--ag-icon-font-code-aggregation, \"\\f101\");\n display: var(--ag-icon-font-display-aggregation, var(--ag-icon-font-display));\n}\n\n.ag-icon-aggregation::after {\n background-image: var(--ag-icon-image-aggregation, var(--ag-icon-image));\n display: var(--ag-icon-image-display-aggregation, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-aggregation, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-arrows {\n font-family: var(--ag-icon-font-family-arrows, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-arrows, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-arrows, var(--ag-icon-font-color));\n}\n\n.ag-icon-arrows::before {\n content: var(--ag-icon-font-code-arrows, \"\\f102\");\n display: var(--ag-icon-font-display-arrows, var(--ag-icon-font-display));\n}\n\n.ag-icon-arrows::after {\n background-image: var(--ag-icon-image-arrows, var(--ag-icon-image));\n display: var(--ag-icon-image-display-arrows, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-arrows, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-asc {\n font-family: var(--ag-icon-font-family-asc, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-asc, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-asc, var(--ag-icon-font-color));\n}\n\n.ag-icon-asc::before {\n content: var(--ag-icon-font-code-asc, \"\\f103\");\n display: var(--ag-icon-font-display-asc, var(--ag-icon-font-display));\n}\n\n.ag-icon-asc::after {\n background-image: var(--ag-icon-image-asc, var(--ag-icon-image));\n display: var(--ag-icon-image-display-asc, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-asc, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-cancel {\n font-family: var(--ag-icon-font-family-cancel, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-cancel, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-cancel, var(--ag-icon-font-color));\n}\n\n.ag-icon-cancel::before {\n content: var(--ag-icon-font-code-cancel, \"\\f104\");\n display: var(--ag-icon-font-display-cancel, var(--ag-icon-font-display));\n}\n\n.ag-icon-cancel::after {\n background-image: var(--ag-icon-image-cancel, var(--ag-icon-image));\n display: var(--ag-icon-image-display-cancel, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-cancel, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-chart {\n font-family: var(--ag-icon-font-family-chart, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-chart, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-chart, var(--ag-icon-font-color));\n}\n\n.ag-icon-chart::before {\n content: var(--ag-icon-font-code-chart, \"\\f105\");\n display: var(--ag-icon-font-display-chart, var(--ag-icon-font-display));\n}\n\n.ag-icon-chart::after {\n background-image: var(--ag-icon-image-chart, var(--ag-icon-image));\n display: var(--ag-icon-image-display-chart, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-chart, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-checkbox-checked {\n font-family: var(--ag-icon-font-family-checkbox-checked, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-checkbox-checked, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-checkbox-checked, var(--ag-icon-font-color));\n}\n\n.ag-icon-checkbox-checked::before {\n content: var(--ag-icon-font-code-checkbox-checked, \"\\f106\");\n display: var(--ag-icon-font-display-checkbox-checked, var(--ag-icon-font-display));\n}\n\n.ag-icon-checkbox-checked::after {\n background-image: var(--ag-icon-image-checkbox-checked, var(--ag-icon-image));\n display: var(--ag-icon-image-display-checkbox-checked, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-checkbox-checked, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-checkbox-indeterminate {\n font-family: var(--ag-icon-font-family-checkbox-indeterminate, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-checkbox-indeterminate, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-checkbox-indeterminate, var(--ag-icon-font-color));\n}\n\n.ag-icon-checkbox-indeterminate::before {\n content: var(--ag-icon-font-code-checkbox-indeterminate, \"\\f107\");\n display: var(--ag-icon-font-display-checkbox-indeterminate, var(--ag-icon-font-display));\n}\n\n.ag-icon-checkbox-indeterminate::after {\n background-image: var(--ag-icon-image-checkbox-indeterminate, var(--ag-icon-image));\n display: var(--ag-icon-image-display-checkbox-indeterminate, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-checkbox-indeterminate, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-checkbox-unchecked {\n font-family: var(--ag-icon-font-family-checkbox-unchecked, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-checkbox-unchecked, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-checkbox-unchecked, var(--ag-icon-font-color));\n}\n\n.ag-icon-checkbox-unchecked::before {\n content: var(--ag-icon-font-code-checkbox-unchecked, \"\\f108\");\n display: var(--ag-icon-font-display-checkbox-unchecked, var(--ag-icon-font-display));\n}\n\n.ag-icon-checkbox-unchecked::after {\n background-image: var(--ag-icon-image-checkbox-unchecked, var(--ag-icon-image));\n display: var(--ag-icon-image-display-checkbox-unchecked, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-checkbox-unchecked, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-color-picker {\n font-family: var(--ag-icon-font-family-color-picker, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-color-picker, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-color-picker, var(--ag-icon-font-color));\n}\n\n.ag-icon-color-picker::before {\n content: var(--ag-icon-font-code-color-picker, \"\\f109\");\n display: var(--ag-icon-font-display-color-picker, var(--ag-icon-font-display));\n}\n\n.ag-icon-color-picker::after {\n background-image: var(--ag-icon-image-color-picker, var(--ag-icon-image));\n display: var(--ag-icon-image-display-color-picker, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-color-picker, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-columns {\n font-family: var(--ag-icon-font-family-columns, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-columns, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-columns, var(--ag-icon-font-color));\n}\n\n.ag-icon-columns::before {\n content: var(--ag-icon-font-code-columns, \"\\f10a\");\n display: var(--ag-icon-font-display-columns, var(--ag-icon-font-display));\n}\n\n.ag-icon-columns::after {\n background-image: var(--ag-icon-image-columns, var(--ag-icon-image));\n display: var(--ag-icon-image-display-columns, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-columns, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-contracted {\n font-family: var(--ag-icon-font-family-contracted, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-contracted, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-contracted, var(--ag-icon-font-color));\n}\n\n.ag-icon-contracted::before {\n content: var(--ag-icon-font-code-contracted, \"\\f10b\");\n display: var(--ag-icon-font-display-contracted, var(--ag-icon-font-display));\n}\n\n.ag-icon-contracted::after {\n background-image: var(--ag-icon-image-contracted, var(--ag-icon-image));\n display: var(--ag-icon-image-display-contracted, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-contracted, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-copy {\n font-family: var(--ag-icon-font-family-copy, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-copy, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-copy, var(--ag-icon-font-color));\n}\n\n.ag-icon-copy::before {\n content: var(--ag-icon-font-code-copy, \"\\f10c\");\n display: var(--ag-icon-font-display-copy, var(--ag-icon-font-display));\n}\n\n.ag-icon-copy::after {\n background-image: var(--ag-icon-image-copy, var(--ag-icon-image));\n display: var(--ag-icon-image-display-copy, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-copy, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-cross {\n font-family: var(--ag-icon-font-family-cross, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-cross, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-cross, var(--ag-icon-font-color));\n}\n\n.ag-icon-cross::before {\n content: var(--ag-icon-font-code-cross, \"\\f10d\");\n display: var(--ag-icon-font-display-cross, var(--ag-icon-font-display));\n}\n\n.ag-icon-cross::after {\n background-image: var(--ag-icon-image-cross, var(--ag-icon-image));\n display: var(--ag-icon-image-display-cross, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-cross, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-csv {\n font-family: var(--ag-icon-font-family-csv, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-csv, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-csv, var(--ag-icon-font-color));\n}\n\n.ag-icon-csv::before {\n content: var(--ag-icon-font-code-csv, \"\\f10e\");\n display: var(--ag-icon-font-display-csv, var(--ag-icon-font-display));\n}\n\n.ag-icon-csv::after {\n background-image: var(--ag-icon-image-csv, var(--ag-icon-image));\n display: var(--ag-icon-image-display-csv, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-csv, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-cut {\n font-family: var(--ag-icon-font-family-cut, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-cut, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-cut, var(--ag-icon-font-color));\n}\n\n.ag-icon-cut::before {\n content: var(--ag-icon-font-code-cut, \"\\f10f\");\n display: var(--ag-icon-font-display-cut, var(--ag-icon-font-display));\n}\n\n.ag-icon-cut::after {\n background-image: var(--ag-icon-image-cut, var(--ag-icon-image));\n display: var(--ag-icon-image-display-cut, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-cut, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-desc {\n font-family: var(--ag-icon-font-family-desc, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-desc, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-desc, var(--ag-icon-font-color));\n}\n\n.ag-icon-desc::before {\n content: var(--ag-icon-font-code-desc, \"\\f110\");\n display: var(--ag-icon-font-display-desc, var(--ag-icon-font-display));\n}\n\n.ag-icon-desc::after {\n background-image: var(--ag-icon-image-desc, var(--ag-icon-image));\n display: var(--ag-icon-image-display-desc, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-desc, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-excel {\n font-family: var(--ag-icon-font-family-excel, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-excel, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-excel, var(--ag-icon-font-color));\n}\n\n.ag-icon-excel::before {\n content: var(--ag-icon-font-code-excel, \"\\f111\");\n display: var(--ag-icon-font-display-excel, var(--ag-icon-font-display));\n}\n\n.ag-icon-excel::after {\n background-image: var(--ag-icon-image-excel, var(--ag-icon-image));\n display: var(--ag-icon-image-display-excel, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-excel, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-expanded {\n font-family: var(--ag-icon-font-family-expanded, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-expanded, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-expanded, var(--ag-icon-font-color));\n}\n\n.ag-icon-expanded::before {\n content: var(--ag-icon-font-code-expanded, \"\\f112\");\n display: var(--ag-icon-font-display-expanded, var(--ag-icon-font-display));\n}\n\n.ag-icon-expanded::after {\n background-image: var(--ag-icon-image-expanded, var(--ag-icon-image));\n display: var(--ag-icon-image-display-expanded, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-expanded, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-eye-slash {\n font-family: var(--ag-icon-font-family-eye-slash, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-eye-slash, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-eye-slash, var(--ag-icon-font-color));\n}\n\n.ag-icon-eye-slash::before {\n content: var(--ag-icon-font-code-eye-slash, \"\\f113\");\n display: var(--ag-icon-font-display-eye-slash, var(--ag-icon-font-display));\n}\n\n.ag-icon-eye-slash::after {\n background-image: var(--ag-icon-image-eye-slash, var(--ag-icon-image));\n display: var(--ag-icon-image-display-eye-slash, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-eye-slash, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-eye {\n font-family: var(--ag-icon-font-family-eye, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-eye, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-eye, var(--ag-icon-font-color));\n}\n\n.ag-icon-eye::before {\n content: var(--ag-icon-font-code-eye, \"\\f114\");\n display: var(--ag-icon-font-display-eye, var(--ag-icon-font-display));\n}\n\n.ag-icon-eye::after {\n background-image: var(--ag-icon-image-eye, var(--ag-icon-image));\n display: var(--ag-icon-image-display-eye, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-eye, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-filter {\n font-family: var(--ag-icon-font-family-filter, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-filter, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-filter, var(--ag-icon-font-color));\n}\n\n.ag-icon-filter::before {\n content: var(--ag-icon-font-code-filter, \"\\f115\");\n display: var(--ag-icon-font-display-filter, var(--ag-icon-font-display));\n}\n\n.ag-icon-filter::after {\n background-image: var(--ag-icon-image-filter, var(--ag-icon-image));\n display: var(--ag-icon-image-display-filter, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-filter, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-first {\n font-family: var(--ag-icon-font-family-first, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-first, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-first, var(--ag-icon-font-color));\n}\n\n.ag-icon-first::before {\n content: var(--ag-icon-font-code-first, \"\\f116\");\n display: var(--ag-icon-font-display-first, var(--ag-icon-font-display));\n}\n\n.ag-icon-first::after {\n background-image: var(--ag-icon-image-first, var(--ag-icon-image));\n display: var(--ag-icon-image-display-first, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-first, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-grip {\n font-family: var(--ag-icon-font-family-grip, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-grip, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-grip, var(--ag-icon-font-color));\n}\n\n.ag-icon-grip::before {\n content: var(--ag-icon-font-code-grip, \"\\f117\");\n display: var(--ag-icon-font-display-grip, var(--ag-icon-font-display));\n}\n\n.ag-icon-grip::after {\n background-image: var(--ag-icon-image-grip, var(--ag-icon-image));\n display: var(--ag-icon-image-display-grip, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-grip, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-group {\n font-family: var(--ag-icon-font-family-group, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-group, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-group, var(--ag-icon-font-color));\n}\n\n.ag-icon-group::before {\n content: var(--ag-icon-font-code-group, \"\\f118\");\n display: var(--ag-icon-font-display-group, var(--ag-icon-font-display));\n}\n\n.ag-icon-group::after {\n background-image: var(--ag-icon-image-group, var(--ag-icon-image));\n display: var(--ag-icon-image-display-group, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-group, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-last {\n font-family: var(--ag-icon-font-family-last, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-last, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-last, var(--ag-icon-font-color));\n}\n\n.ag-icon-last::before {\n content: var(--ag-icon-font-code-last, \"\\f119\");\n display: var(--ag-icon-font-display-last, var(--ag-icon-font-display));\n}\n\n.ag-icon-last::after {\n background-image: var(--ag-icon-image-last, var(--ag-icon-image));\n display: var(--ag-icon-image-display-last, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-last, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-left {\n font-family: var(--ag-icon-font-family-left, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-left, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-left, var(--ag-icon-font-color));\n}\n\n.ag-icon-left::before {\n content: var(--ag-icon-font-code-left, \"\\f11a\");\n display: var(--ag-icon-font-display-left, var(--ag-icon-font-display));\n}\n\n.ag-icon-left::after {\n background-image: var(--ag-icon-image-left, var(--ag-icon-image));\n display: var(--ag-icon-image-display-left, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-left, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-linked {\n font-family: var(--ag-icon-font-family-linked, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-linked, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-linked, var(--ag-icon-font-color));\n}\n\n.ag-icon-linked::before {\n content: var(--ag-icon-font-code-linked, \"\\f11b\");\n display: var(--ag-icon-font-display-linked, var(--ag-icon-font-display));\n}\n\n.ag-icon-linked::after {\n background-image: var(--ag-icon-image-linked, var(--ag-icon-image));\n display: var(--ag-icon-image-display-linked, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-linked, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-loading {\n font-family: var(--ag-icon-font-family-loading, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-loading, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-loading, var(--ag-icon-font-color));\n}\n\n.ag-icon-loading::before {\n content: var(--ag-icon-font-code-loading, \"\\f11c\");\n display: var(--ag-icon-font-display-loading, var(--ag-icon-font-display));\n}\n\n.ag-icon-loading::after {\n background-image: var(--ag-icon-image-loading, var(--ag-icon-image));\n display: var(--ag-icon-image-display-loading, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-loading, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-maximize {\n font-family: var(--ag-icon-font-family-maximize, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-maximize, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-maximize, var(--ag-icon-font-color));\n}\n\n.ag-icon-maximize::before {\n content: var(--ag-icon-font-code-maximize, \"\\f11d\");\n display: var(--ag-icon-font-display-maximize, var(--ag-icon-font-display));\n}\n\n.ag-icon-maximize::after {\n background-image: var(--ag-icon-image-maximize, var(--ag-icon-image));\n display: var(--ag-icon-image-display-maximize, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-maximize, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-menu {\n font-family: var(--ag-icon-font-family-menu, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-menu, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-menu, var(--ag-icon-font-color));\n}\n\n.ag-icon-menu::before {\n content: var(--ag-icon-font-code-menu, \"\\f11e\");\n display: var(--ag-icon-font-display-menu, var(--ag-icon-font-display));\n}\n\n.ag-icon-menu::after {\n background-image: var(--ag-icon-image-menu, var(--ag-icon-image));\n display: var(--ag-icon-image-display-menu, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-menu, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-minimize {\n font-family: var(--ag-icon-font-family-minimize, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-minimize, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-minimize, var(--ag-icon-font-color));\n}\n\n.ag-icon-minimize::before {\n content: var(--ag-icon-font-code-minimize, \"\\f11f\");\n display: var(--ag-icon-font-display-minimize, var(--ag-icon-font-display));\n}\n\n.ag-icon-minimize::after {\n background-image: var(--ag-icon-image-minimize, var(--ag-icon-image));\n display: var(--ag-icon-image-display-minimize, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-minimize, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-next {\n font-family: var(--ag-icon-font-family-next, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-next, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-next, var(--ag-icon-font-color));\n}\n\n.ag-icon-next::before {\n content: var(--ag-icon-font-code-next, \"\\f120\");\n display: var(--ag-icon-font-display-next, var(--ag-icon-font-display));\n}\n\n.ag-icon-next::after {\n background-image: var(--ag-icon-image-next, var(--ag-icon-image));\n display: var(--ag-icon-image-display-next, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-next, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-none {\n font-family: var(--ag-icon-font-family-none, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-none, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-none, var(--ag-icon-font-color));\n}\n\n.ag-icon-none::before {\n content: var(--ag-icon-font-code-none, \"\\f121\");\n display: var(--ag-icon-font-display-none, var(--ag-icon-font-display));\n}\n\n.ag-icon-none::after {\n background-image: var(--ag-icon-image-none, var(--ag-icon-image));\n display: var(--ag-icon-image-display-none, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-none, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-not-allowed {\n font-family: var(--ag-icon-font-family-not-allowed, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-not-allowed, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-not-allowed, var(--ag-icon-font-color));\n}\n\n.ag-icon-not-allowed::before {\n content: var(--ag-icon-font-code-not-allowed, \"\\f122\");\n display: var(--ag-icon-font-display-not-allowed, var(--ag-icon-font-display));\n}\n\n.ag-icon-not-allowed::after {\n background-image: var(--ag-icon-image-not-allowed, var(--ag-icon-image));\n display: var(--ag-icon-image-display-not-allowed, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-not-allowed, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-paste {\n font-family: var(--ag-icon-font-family-paste, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-paste, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-paste, var(--ag-icon-font-color));\n}\n\n.ag-icon-paste::before {\n content: var(--ag-icon-font-code-paste, \"\\f123\");\n display: var(--ag-icon-font-display-paste, var(--ag-icon-font-display));\n}\n\n.ag-icon-paste::after {\n background-image: var(--ag-icon-image-paste, var(--ag-icon-image));\n display: var(--ag-icon-image-display-paste, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-paste, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-pin {\n font-family: var(--ag-icon-font-family-pin, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-pin, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-pin, var(--ag-icon-font-color));\n}\n\n.ag-icon-pin::before {\n content: var(--ag-icon-font-code-pin, \"\\f124\");\n display: var(--ag-icon-font-display-pin, var(--ag-icon-font-display));\n}\n\n.ag-icon-pin::after {\n background-image: var(--ag-icon-image-pin, var(--ag-icon-image));\n display: var(--ag-icon-image-display-pin, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-pin, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-pivot {\n font-family: var(--ag-icon-font-family-pivot, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-pivot, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-pivot, var(--ag-icon-font-color));\n}\n\n.ag-icon-pivot::before {\n content: var(--ag-icon-font-code-pivot, \"\\f125\");\n display: var(--ag-icon-font-display-pivot, var(--ag-icon-font-display));\n}\n\n.ag-icon-pivot::after {\n background-image: var(--ag-icon-image-pivot, var(--ag-icon-image));\n display: var(--ag-icon-image-display-pivot, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-pivot, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-previous {\n font-family: var(--ag-icon-font-family-previous, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-previous, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-previous, var(--ag-icon-font-color));\n}\n\n.ag-icon-previous::before {\n content: var(--ag-icon-font-code-previous, \"\\f126\");\n display: var(--ag-icon-font-display-previous, var(--ag-icon-font-display));\n}\n\n.ag-icon-previous::after {\n background-image: var(--ag-icon-image-previous, var(--ag-icon-image));\n display: var(--ag-icon-image-display-previous, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-previous, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-radio-button-off {\n font-family: var(--ag-icon-font-family-radio-button-off, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-radio-button-off, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-radio-button-off, var(--ag-icon-font-color));\n}\n\n.ag-icon-radio-button-off::before {\n content: var(--ag-icon-font-code-radio-button-off, \"\\f127\");\n display: var(--ag-icon-font-display-radio-button-off, var(--ag-icon-font-display));\n}\n\n.ag-icon-radio-button-off::after {\n background-image: var(--ag-icon-image-radio-button-off, var(--ag-icon-image));\n display: var(--ag-icon-image-display-radio-button-off, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-radio-button-off, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-radio-button-on {\n font-family: var(--ag-icon-font-family-radio-button-on, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-radio-button-on, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-radio-button-on, var(--ag-icon-font-color));\n}\n\n.ag-icon-radio-button-on::before {\n content: var(--ag-icon-font-code-radio-button-on, \"\\f128\");\n display: var(--ag-icon-font-display-radio-button-on, var(--ag-icon-font-display));\n}\n\n.ag-icon-radio-button-on::after {\n background-image: var(--ag-icon-image-radio-button-on, var(--ag-icon-image));\n display: var(--ag-icon-image-display-radio-button-on, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-radio-button-on, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-right {\n font-family: var(--ag-icon-font-family-right, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-right, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-right, var(--ag-icon-font-color));\n}\n\n.ag-icon-right::before {\n content: var(--ag-icon-font-code-right, \"\\f129\");\n display: var(--ag-icon-font-display-right, var(--ag-icon-font-display));\n}\n\n.ag-icon-right::after {\n background-image: var(--ag-icon-image-right, var(--ag-icon-image));\n display: var(--ag-icon-image-display-right, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-right, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-save {\n font-family: var(--ag-icon-font-family-save, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-save, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-save, var(--ag-icon-font-color));\n}\n\n.ag-icon-save::before {\n content: var(--ag-icon-font-code-save, \"\\f12a\");\n display: var(--ag-icon-font-display-save, var(--ag-icon-font-display));\n}\n\n.ag-icon-save::after {\n background-image: var(--ag-icon-image-save, var(--ag-icon-image));\n display: var(--ag-icon-image-display-save, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-save, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-small-down {\n font-family: var(--ag-icon-font-family-small-down, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-small-down, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-small-down, var(--ag-icon-font-color));\n}\n\n.ag-icon-small-down::before {\n content: var(--ag-icon-font-code-small-down, \"\\f12b\");\n display: var(--ag-icon-font-display-small-down, var(--ag-icon-font-display));\n}\n\n.ag-icon-small-down::after {\n background-image: var(--ag-icon-image-small-down, var(--ag-icon-image));\n display: var(--ag-icon-image-display-small-down, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-small-down, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-small-left {\n font-family: var(--ag-icon-font-family-small-left, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-small-left, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-small-left, var(--ag-icon-font-color));\n}\n\n.ag-icon-small-left::before {\n content: var(--ag-icon-font-code-small-left, \"\\f12c\");\n display: var(--ag-icon-font-display-small-left, var(--ag-icon-font-display));\n}\n\n.ag-icon-small-left::after {\n background-image: var(--ag-icon-image-small-left, var(--ag-icon-image));\n display: var(--ag-icon-image-display-small-left, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-small-left, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-small-right {\n font-family: var(--ag-icon-font-family-small-right, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-small-right, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-small-right, var(--ag-icon-font-color));\n}\n\n.ag-icon-small-right::before {\n content: var(--ag-icon-font-code-small-right, \"\\f12d\");\n display: var(--ag-icon-font-display-small-right, var(--ag-icon-font-display));\n}\n\n.ag-icon-small-right::after {\n background-image: var(--ag-icon-image-small-right, var(--ag-icon-image));\n display: var(--ag-icon-image-display-small-right, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-small-right, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-small-up {\n font-family: var(--ag-icon-font-family-small-up, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-small-up, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-small-up, var(--ag-icon-font-color));\n}\n\n.ag-icon-small-up::before {\n content: var(--ag-icon-font-code-small-up, \"\\f12e\");\n display: var(--ag-icon-font-display-small-up, var(--ag-icon-font-display));\n}\n\n.ag-icon-small-up::after {\n background-image: var(--ag-icon-image-small-up, var(--ag-icon-image));\n display: var(--ag-icon-image-display-small-up, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-small-up, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-tick {\n font-family: var(--ag-icon-font-family-tick, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-tick, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-tick, var(--ag-icon-font-color));\n}\n\n.ag-icon-tick::before {\n content: var(--ag-icon-font-code-tick, \"\\f12f\");\n display: var(--ag-icon-font-display-tick, var(--ag-icon-font-display));\n}\n\n.ag-icon-tick::after {\n background-image: var(--ag-icon-image-tick, var(--ag-icon-image));\n display: var(--ag-icon-image-display-tick, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-tick, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-tree-closed {\n font-family: var(--ag-icon-font-family-tree-closed, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-tree-closed, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-tree-closed, var(--ag-icon-font-color));\n}\n\n.ag-icon-tree-closed::before {\n content: var(--ag-icon-font-code-tree-closed, \"\\f130\");\n display: var(--ag-icon-font-display-tree-closed, var(--ag-icon-font-display));\n}\n\n.ag-icon-tree-closed::after {\n background-image: var(--ag-icon-image-tree-closed, var(--ag-icon-image));\n display: var(--ag-icon-image-display-tree-closed, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-tree-closed, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-tree-indeterminate {\n font-family: var(--ag-icon-font-family-tree-indeterminate, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-tree-indeterminate, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-tree-indeterminate, var(--ag-icon-font-color));\n}\n\n.ag-icon-tree-indeterminate::before {\n content: var(--ag-icon-font-code-tree-indeterminate, \"\\f131\");\n display: var(--ag-icon-font-display-tree-indeterminate, var(--ag-icon-font-display));\n}\n\n.ag-icon-tree-indeterminate::after {\n background-image: var(--ag-icon-image-tree-indeterminate, var(--ag-icon-image));\n display: var(--ag-icon-image-display-tree-indeterminate, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-tree-indeterminate, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-tree-open {\n font-family: var(--ag-icon-font-family-tree-open, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-tree-open, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-tree-open, var(--ag-icon-font-color));\n}\n\n.ag-icon-tree-open::before {\n content: var(--ag-icon-font-code-tree-open, \"\\f132\");\n display: var(--ag-icon-font-display-tree-open, var(--ag-icon-font-display));\n}\n\n.ag-icon-tree-open::after {\n background-image: var(--ag-icon-image-tree-open, var(--ag-icon-image));\n display: var(--ag-icon-image-display-tree-open, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-tree-open, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-unlinked {\n font-family: var(--ag-icon-font-family-unlinked, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-unlinked, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-unlinked, var(--ag-icon-font-color));\n}\n\n.ag-icon-unlinked::before {\n content: var(--ag-icon-font-code-unlinked, \"\\f133\");\n display: var(--ag-icon-font-display-unlinked, var(--ag-icon-font-display));\n}\n\n.ag-icon-unlinked::after {\n background-image: var(--ag-icon-image-unlinked, var(--ag-icon-image));\n display: var(--ag-icon-image-display-unlinked, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-unlinked, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-up {\n font-family: var(--ag-icon-font-family-up, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-up, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-up, var(--ag-icon-font-color));\n}\n\n.ag-icon-up::before {\n content: var(--ag-icon-font-code-up, \"\\f134\");\n display: var(--ag-icon-font-display-up, var(--ag-icon-font-display));\n}\n\n.ag-icon-up::after {\n background-image: var(--ag-icon-image-up, var(--ag-icon-image));\n display: var(--ag-icon-image-display-up, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-up, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-down {\n font-family: var(--ag-icon-font-family-down, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-down, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-down, var(--ag-icon-font-color));\n}\n\n.ag-icon-down::before {\n content: var(--ag-icon-font-code-down, \"\\f135\");\n display: var(--ag-icon-font-display-down, var(--ag-icon-font-display));\n}\n\n.ag-icon-down::after {\n background-image: var(--ag-icon-image-down, var(--ag-icon-image));\n display: var(--ag-icon-image-display-down, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-down, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-plus {\n font-family: var(--ag-icon-font-family-plus, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-plus, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-plus, var(--ag-icon-font-color));\n}\n\n.ag-icon-plus::before {\n content: var(--ag-icon-font-code-plus, \"\\f136\");\n display: var(--ag-icon-font-display-plus, var(--ag-icon-font-display));\n}\n\n.ag-icon-plus::after {\n background-image: var(--ag-icon-image-plus, var(--ag-icon-image));\n display: var(--ag-icon-image-display-plus, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-plus, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-minus {\n font-family: var(--ag-icon-font-family-minus, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-minus, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-minus, var(--ag-icon-font-color));\n}\n\n.ag-icon-minus::before {\n content: var(--ag-icon-font-code-minus, \"\\f137\");\n display: var(--ag-icon-font-display-minus, var(--ag-icon-font-display));\n}\n\n.ag-icon-minus::after {\n background-image: var(--ag-icon-image-minus, var(--ag-icon-image));\n display: var(--ag-icon-image-display-minus, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-minus, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-menu-alt {\n font-family: var(--ag-icon-font-family-menu-alt, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-menu-alt, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-menu-alt, var(--ag-icon-font-color));\n}\n\n.ag-icon-menu-alt::before {\n content: var(--ag-icon-font-code-menu-alt, \"\\f138\");\n display: var(--ag-icon-font-display-menu-alt, var(--ag-icon-font-display));\n}\n\n.ag-icon-menu-alt::after {\n background-image: var(--ag-icon-image-menu-alt, var(--ag-icon-image));\n display: var(--ag-icon-image-display-menu-alt, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-menu-alt, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-settings {\n font-family: var(--ag-icon-font-family-settings, var(--ag-icon-font-family));\n font-weight: var(--ag-icon-font-weight-settings, var(--ag-icon-font-weight));\n color: var(--ag-icon-font-color-settings, var(--ag-icon-font-color));\n}\n\n.ag-icon-settings::before {\n content: var(--ag-icon-font-code-settings, \"\\f139\");\n display: var(--ag-icon-font-display-settings, var(--ag-icon-font-display));\n}\n\n.ag-icon-settings::after {\n background-image: var(--ag-icon-image-settings, var(--ag-icon-image));\n display: var(--ag-icon-image-display-settings, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-settings, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-icon-row-drag::before {\n content: var(--ag-icon-font-code-grip);\n}\n\n.ag-left-arrow::before {\n content: var(--ag-icon-font-code-left);\n}\n\n.ag-right-arrow::before {\n content: var(--ag-icon-font-code-right);\n}\n\n[class*=ag-theme-] {\n --ag-foreground-color: #000;\n --ag-data-color: var(--ag-foreground-color);\n --ag-secondary-foreground-color: var(--ag-foreground-color);\n --ag-header-foreground-color: var(--ag-secondary-foreground-color);\n --ag-disabled-foreground-color: rgba(0, 0, 0, 0.5);\n --ag-background-color: #fff;\n --ag-header-background-color: transparent;\n --ag-tooltip-background-color: transparent;\n --ag-subheader-background-color: transparent;\n --ag-subheader-toolbar-background-color: transparent;\n --ag-control-panel-background-color: transparent;\n --ag-side-button-selected-background-color: var(--ag-control-panel-background-color);\n --ag-selected-row-background-color: #bbb;\n --ag-odd-row-background-color: var(--ag-background-color);\n --ag-modal-overlay-background-color: rgba(255, 255, 255, 0.66);\n --ag-menu-background-color: var(--ag-background-color);\n --ag-menu-border-color: var(--ag-border-color);\n --ag-panel-background-color: var(--ag-background-color);\n --ag-panel-border-color: var(--ag-border-color);\n --ag-row-hover-color: transparent;\n --ag-column-hover-color: transparent;\n --ag-range-selection-border-color: var(--ag-foreground-color);\n --ag-range-selection-border-style: solid;\n --ag-range-selection-background-color: rgba(0, 0, 0, 0.2);\n --ag-range-selection-background-color-2: var(--ag-range-selection-background-color);\n --ag-range-selection-background-color-3: var(--ag-range-selection-background-color);\n --ag-range-selection-background-color-4: var(--ag-range-selection-background-color);\n --ag-range-selection-highlight-color: var(--ag-range-selection-border-color);\n --ag-range-header-highlight-color: color-mix(\n in srgb,\n var(--ag-header-background-color),\n var(--ag-foreground-color) 8%\n );\n --ag-selected-tab-underline-color: var(--ag-range-selection-border-color);\n --ag-selected-tab-underline-width: 0;\n --ag-selected-tab-underline-transition-speed: 0s;\n --ag-range-selection-chart-category-background-color: rgba(0, 255, 132, 0.1);\n --ag-range-selection-chart-background-color: rgba(0, 88, 255, 0.1);\n --ag-header-cell-hover-background-color: transparent;\n --ag-header-cell-moving-background-color: var(--ag-background-color);\n --ag-value-change-value-highlight-background-color: rgba(22, 160, 133, 0.5);\n --ag-value-change-delta-up-color: #43a047;\n --ag-value-change-delta-down-color: #e53935;\n --ag-row-loading-skeleton-effect-color: rgba(66, 66, 66, 0.2);\n --ag-chip-background-color: transparent;\n --ag-chip-border-color: var(--ag-chip-background-color);\n --ag-borders: solid 1px;\n --ag-border-color: rgba(0, 0, 0, 0.25);\n --ag-borders-critical: var(--ag-borders);\n --ag-borders-secondary: var(--ag-borders);\n --ag-secondary-border-color: var(--ag-border-color);\n --ag-row-border-style: solid;\n --ag-row-border-color: var(--ag-secondary-border-color);\n --ag-row-border-width: 1px;\n --ag-cell-horizontal-border: solid transparent;\n --ag-borders-input: var(--ag-borders-secondary);\n --ag-input-border-color: var(--ag-secondary-border-color);\n --ag-borders-input-invalid: solid 2px;\n --ag-input-border-color-invalid: var(--ag-invalid-color);\n --ag-borders-side-button: var(--ag-borders);\n --ag-border-radius: 0px;\n --ag-wrapper-border-radius: var(--ag-border-radius);\n --ag-row-border-color: var(--ag-secondary-border-color);\n --ag-header-column-separator-display: none;\n --ag-header-column-separator-height: 100%;\n --ag-header-column-separator-width: 1px;\n --ag-header-column-separator-color: var(--ag-secondary-border-color);\n --ag-header-column-resize-handle-display: none;\n --ag-header-column-resize-handle-height: 50%;\n --ag-header-column-resize-handle-width: 1px;\n --ag-header-column-resize-handle-color: var(--ag-secondary-border-color);\n --ag-invalid-color: red;\n --ag-input-disabled-border-color: var(--ag-input-border-color);\n --ag-input-disabled-background-color: transparent;\n --ag-checkbox-background-color: transparent;\n --ag-checkbox-border-radius: var(--ag-border-radius);\n --ag-checkbox-checked-color: var(--ag-foreground-color);\n --ag-checkbox-unchecked-color: var(--ag-foreground-color);\n --ag-checkbox-indeterminate-color: var(--ag-checkbox-unchecked-color);\n --ag-toggle-button-off-border-color: var(--ag-checkbox-unchecked-color);\n --ag-toggle-button-off-background-color: var(--ag-checkbox-unchecked-color);\n --ag-toggle-button-on-border-color: var(--ag-checkbox-checked-color);\n --ag-toggle-button-on-background-color: var(--ag-checkbox-checked-color);\n --ag-toggle-button-switch-background-color: var(--ag-background-color);\n --ag-toggle-button-switch-border-color: var(--ag-toggle-button-off-border-color);\n --ag-toggle-button-border-width: 1px;\n --ag-toggle-button-height: var(--ag-icon-size);\n --ag-toggle-button-width: calc(var(--ag-toggle-button-height) * 2);\n --ag-input-focus-box-shadow: none;\n --ag-input-focus-border-color: none;\n --ag-minichart-selected-chart-color: var(--ag-checkbox-checked-color);\n --ag-minichart-selected-page-color: var(--ag-checkbox-checked-color);\n --ag-grid-size: 4px;\n --ag-icon-size: 12px;\n --ag-icon-font-weight: normal;\n --ag-icon-font-color: var(--ag-foreground-color);\n --ag-icon-image-display: block;\n --ag-widget-container-horizontal-padding: calc(var(--ag-grid-size) * 1.5);\n --ag-widget-container-vertical-padding: calc(var(--ag-grid-size) * 1.5);\n --ag-widget-horizontal-spacing: calc(var(--ag-grid-size) * 2);\n --ag-widget-vertical-spacing: var(--ag-grid-size);\n --ag-cell-horizontal-padding: calc(var(--ag-grid-size) * 3);\n --ag-cell-widget-spacing: var(--ag-cell-horizontal-padding);\n --ag-row-height: calc(var(--ag-grid-size) * 6 + 1px);\n --ag-header-height: var(--ag-row-height);\n --ag-list-item-height: calc(var(--ag-grid-size) * 5);\n --ag-column-select-indent-size: calc(var(--ag-grid-size) + var(--ag-icon-size));\n --ag-set-filter-indent-size: calc(var(--ag-grid-size) + var(--ag-icon-size));\n --ag-advanced-filter-builder-indent-size: calc(var(--ag-grid-size) * 2 + var(--ag-icon-size));\n --ag-row-group-indent-size: calc(var(--ag-cell-widget-spacing) + var(--ag-icon-size));\n --ag-row-numbers-selected-color: #bbb;\n --ag-filter-tool-panel-group-indent: 16px;\n --ag-tab-min-width: 220px;\n --ag-chart-menu-panel-width: var(--ag-tab-min-width);\n --ag-menu-min-width: 181px;\n --ag-side-bar-panel-width: 200px;\n --ag-font-family: \"Helvetica Neue\", sans-serif;\n --ag-font-size: 14px;\n --ag-card-radius: var(--ag-border-radius);\n --ag-card-shadow: none;\n --ag-popup-shadow: 5px 5px 10px rgba(0, 0, 0, 0.3);\n --ag-advanced-filter-join-pill-color: #f08e8d;\n --ag-advanced-filter-column-pill-color: #a6e194;\n --ag-advanced-filter-option-pill-color: #f3c08b;\n --ag-advanced-filter-value-pill-color: #85c0e4;\n}\n\n.ag-root-wrapper,\n.ag-sticky-top,\n.ag-sticky-bottom,\n.ag-dnd-ghost {\n background-color: var(--ag-background-color);\n}\n\n.ag-sticky-bottom {\n border-top: var(--ag-row-border-style) var(--ag-row-border-color) var(--ag-row-border-width);\n}\n\n.ag-root-wrapper,\n.ag-popup {\n --ag-indentation-level: 0;\n}\n\n[class*=ag-theme-] {\n -webkit-font-smoothing: antialiased;\n font-family: var(--ag-font-family);\n font-size: var(--ag-font-size);\n line-height: normal;\n color: var(--ag-foreground-color);\n}\n\nag-grid,\nag-grid-angular,\nag-grid-ng2,\nag-grid-polymer,\nag-grid-aurelia {\n display: block;\n}\n\n.ag-aria-description-container {\n z-index: 9999;\n border: 0px;\n clip: rect(1px, 1px, 1px, 1px);\n height: 1px;\n width: 1px;\n position: absolute;\n overflow: hidden;\n padding: 0px;\n white-space: nowrap;\n}\n\n.ag-hidden {\n display: none !important;\n}\n\n.ag-invisible {\n visibility: hidden !important;\n}\n\n.ag-drag-handle {\n cursor: grab;\n}\n\n.ag-column-drop-wrapper {\n display: flex;\n}\n\n.ag-column-drop-horizontal-half-width {\n display: inline-block;\n width: 50% !important;\n}\n\n.ag-unselectable {\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.ag-selectable {\n -moz-user-select: text;\n -webkit-user-select: text;\n -ms-user-select: text;\n user-select: text;\n}\n\n.ag-tab {\n position: relative;\n}\n\n.ag-tab-guard {\n position: absolute;\n width: 0;\n height: 0;\n display: block;\n}\n\n.ag-virtual-list-viewport .ag-tab-guard {\n position: sticky;\n}\n\n.ag-tab-guard-top {\n top: 1px;\n}\n\n.ag-tab-guard-bottom {\n bottom: 1px;\n}\n\n.ag-select-agg-func-popup {\n position: absolute;\n}\n\n.ag-input-wrapper,\n.ag-picker-field-wrapper {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n line-height: normal;\n position: relative;\n}\n\n.ag-shake-left-to-right {\n animation-direction: alternate;\n animation-duration: 0.2s;\n animation-iteration-count: infinite;\n animation-name: ag-shake-left-to-right;\n}\n\n@keyframes ag-shake-left-to-right {\n from {\n padding-left: 6px;\n padding-right: 2px;\n }\n to {\n padding-left: 2px;\n padding-right: 6px;\n }\n}\n.ag-root-wrapper {\n cursor: default;\n position: relative;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n white-space: normal;\n}\n.ag-root-wrapper.ag-layout-normal {\n height: 100%;\n}\n\n.ag-watermark {\n position: absolute;\n bottom: 20px;\n right: 25px;\n opacity: 0.7;\n transition: opacity 1s ease-out 3s;\n color: #9b9b9b;\n}\n.ag-watermark::before {\n content: \"\";\n background-image: url(" + ___CSS_LOADER_URL_REPLACEMENT_0___ + ");\n background-repeat: no-repeat;\n background-size: 170px 40px;\n display: block;\n height: 40px;\n width: 170px;\n}\n\n.ag-watermark-text {\n opacity: 0.5;\n font-weight: bold;\n font-family: Impact, sans-serif;\n font-size: 19px;\n padding-left: 0.7rem;\n}\n\n.ag-root-wrapper-body {\n display: flex;\n flex-direction: row;\n}\n.ag-root-wrapper-body.ag-layout-normal {\n flex: 1 1 auto;\n height: 0;\n min-height: 0;\n}\n\n.ag-root {\n position: relative;\n display: flex;\n flex-direction: column;\n}\n.ag-root.ag-layout-normal, .ag-root.ag-layout-auto-height {\n overflow: hidden;\n flex: 1 1 auto;\n width: 0;\n}\n.ag-root.ag-layout-normal {\n height: 100%;\n}\n\n.ag-header-viewport,\n.ag-floating-top-viewport,\n.ag-body-viewport,\n.ag-center-cols-viewport,\n.ag-floating-bottom-viewport,\n.ag-body-horizontal-scroll-viewport,\n.ag-body-vertical-scroll-viewport,\n.ag-virtual-list-viewport,\n.ag-sticky-top-viewport,\n.ag-sticky-bottom-viewport {\n position: relative;\n height: 100%;\n min-width: 0px;\n overflow: hidden;\n flex: 1 1 auto;\n}\n\n.ag-body-viewport,\n.ag-center-cols-viewport,\n.ag-header-viewport,\n.ag-floating-top-viewport,\n.ag-floating-bottom-viewport,\n.ag-sticky-top-viewport,\n.ag-sticky-bottom-viewport {\n overflow-x: auto;\n -ms-overflow-style: none !important;\n scrollbar-width: none !important;\n}\n.ag-body-viewport::-webkit-scrollbar,\n.ag-center-cols-viewport::-webkit-scrollbar,\n.ag-header-viewport::-webkit-scrollbar,\n.ag-floating-top-viewport::-webkit-scrollbar,\n.ag-floating-bottom-viewport::-webkit-scrollbar,\n.ag-sticky-top-viewport::-webkit-scrollbar,\n.ag-sticky-bottom-viewport::-webkit-scrollbar {\n display: none !important;\n}\n\n.ag-body-viewport {\n display: flex;\n overflow-x: hidden;\n}\n.ag-body-viewport.ag-layout-normal {\n overflow-y: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.ag-viewport {\n position: relative;\n}\n\n.ag-spanning-container {\n position: absolute;\n top: 0;\n}\n\n.ag-sticky-top-container,\n.ag-sticky-bottom-container {\n min-height: 1px;\n}\n\n.ag-sticky-top,\n.ag-sticky-bottom {\n z-index: 1;\n}\n\n.ag-center-cols-viewport {\n min-height: 100%;\n width: 100%;\n}\n\n.ag-body-horizontal-scroll-viewport {\n overflow-x: scroll;\n}\n\n.ag-body-vertical-scroll-viewport {\n overflow-y: scroll;\n}\n\n.ag-virtual-list-viewport {\n overflow: auto;\n width: 100%;\n}\n\n.ag-header-container,\n.ag-floating-top-container,\n.ag-body-container,\n.ag-pinned-right-cols-container,\n.ag-center-cols-container,\n.ag-pinned-left-cols-container,\n.ag-floating-bottom-container,\n.ag-body-horizontal-scroll-container,\n.ag-body-vertical-scroll-container,\n.ag-full-width-container,\n.ag-floating-bottom-full-width-container,\n.ag-virtual-list-container,\n.ag-sticky-top-container,\n.ag-sticky-bottom-container {\n position: relative;\n}\n\n.ag-header-container,\n.ag-floating-top-container,\n.ag-pinned-left-floating-top,\n.ag-pinned-right-floating-top,\n.ag-floating-bottom-container,\n.ag-pinned-left-floating-bottom,\n.ag-pinned-right-floating-bottom,\n.ag-sticky-top-container,\n.ag-sticky-bottom-container {\n height: 100%;\n white-space: nowrap;\n}\n\n.ag-center-cols-container {\n display: block;\n}\n\n.ag-pinned-right-cols-container {\n display: block;\n}\n\n.ag-body-horizontal-scroll-container {\n height: 100%;\n}\n\n.ag-body-vertical-scroll-container {\n width: 100%;\n}\n\n.ag-full-width-container,\n.ag-floating-top-full-width-container,\n.ag-floating-bottom-full-width-container,\n.ag-sticky-top-full-width-container,\n.ag-sticky-bottom-full-width-container {\n position: absolute;\n top: 0px;\n pointer-events: none;\n}\n.ag-ltr .ag-full-width-container,\n.ag-ltr .ag-floating-top-full-width-container,\n.ag-ltr .ag-floating-bottom-full-width-container,\n.ag-ltr .ag-sticky-top-full-width-container,\n.ag-ltr .ag-sticky-bottom-full-width-container {\n left: 0;\n}\n.ag-rtl .ag-full-width-container,\n.ag-rtl .ag-floating-top-full-width-container,\n.ag-rtl .ag-floating-bottom-full-width-container,\n.ag-rtl .ag-sticky-top-full-width-container,\n.ag-rtl .ag-sticky-bottom-full-width-container {\n right: 0;\n}\n\n.ag-full-width-container {\n width: 100%;\n}\n\n.ag-floating-bottom-full-width-container,\n.ag-floating-top-full-width-container {\n display: inline-block;\n overflow: hidden;\n height: 100%;\n width: 100%;\n}\n\n.ag-virtual-list-container {\n overflow: hidden;\n}\n\n.ag-body {\n position: relative;\n display: flex;\n flex: 1 1 auto;\n flex-direction: row !important;\n min-height: 0;\n}\n\n.ag-body-horizontal-scroll,\n.ag-body-vertical-scroll {\n min-height: 0;\n min-width: 0;\n display: flex;\n position: relative;\n}\n.ag-body-horizontal-scroll.ag-scrollbar-invisible,\n.ag-body-vertical-scroll.ag-scrollbar-invisible {\n position: absolute;\n bottom: 0;\n}\n.ag-body-horizontal-scroll.ag-scrollbar-invisible.ag-apple-scrollbar,\n.ag-body-vertical-scroll.ag-scrollbar-invisible.ag-apple-scrollbar {\n opacity: 0;\n transition: opacity 400ms;\n visibility: hidden;\n}\n.ag-body-horizontal-scroll.ag-scrollbar-invisible.ag-apple-scrollbar.ag-scrollbar-scrolling, .ag-body-horizontal-scroll.ag-scrollbar-invisible.ag-apple-scrollbar.ag-scrollbar-active,\n.ag-body-vertical-scroll.ag-scrollbar-invisible.ag-apple-scrollbar.ag-scrollbar-scrolling,\n.ag-body-vertical-scroll.ag-scrollbar-invisible.ag-apple-scrollbar.ag-scrollbar-active {\n visibility: visible;\n opacity: 1;\n}\n\n.ag-body-horizontal-scroll {\n width: 100%;\n}\n.ag-body-horizontal-scroll.ag-scrollbar-invisible {\n left: 0;\n right: 0;\n}\n\n.ag-body-vertical-scroll {\n height: 100%;\n}\n.ag-body-vertical-scroll.ag-scrollbar-invisible {\n top: 0;\n z-index: 10;\n}\n.ag-ltr .ag-body-vertical-scroll.ag-scrollbar-invisible {\n right: 0;\n}\n.ag-rtl .ag-body-vertical-scroll.ag-scrollbar-invisible {\n left: 0;\n}\n\n.ag-force-vertical-scroll {\n overflow-y: scroll !important;\n}\n\n.ag-horizontal-left-spacer,\n.ag-horizontal-right-spacer {\n height: 100%;\n min-width: 0;\n overflow-x: scroll;\n}\n.ag-horizontal-left-spacer.ag-scroller-corner,\n.ag-horizontal-right-spacer.ag-scroller-corner {\n overflow-x: hidden;\n}\n\n.ag-header,\n.ag-pinned-left-header,\n.ag-pinned-right-header {\n display: inline-block;\n overflow: hidden;\n position: relative;\n}\n\n.ag-header-cell-sortable .ag-header-cell-label {\n cursor: pointer;\n}\n\n.ag-header {\n display: flex;\n width: 100%;\n white-space: nowrap;\n}\n\n.ag-pinned-left-header {\n height: 100%;\n}\n\n.ag-pinned-right-header {\n height: 100%;\n}\n\n.ag-header-row {\n position: absolute;\n}\n\n.ag-header-row:not(.ag-header-row-column-group) {\n overflow: hidden;\n}\n\n.ag-header.ag-header-allow-overflow .ag-header-row {\n overflow: visible;\n}\n\n.ag-header-cell {\n display: inline-flex;\n align-items: center;\n position: absolute;\n height: 100%;\n overflow: hidden;\n}\n\n.ag-header-cell.ag-header-active .ag-header-cell-menu-button,\n.ag-header-cell-filter-button {\n opacity: 1;\n}\n\n.ag-header-cell-menu-button:not(.ag-header-menu-always-show) {\n transition: opacity 0.2s;\n opacity: 0;\n}\n\n.ag-header-group-cell-label,\n.ag-header-cell-label {\n display: flex;\n flex: 1 1 auto;\n align-self: stretch;\n align-items: center;\n overflow: hidden;\n}\n\n.ag-header-cell-label {\n text-overflow: ellipsis;\n}\n\n.ag-header-group-cell-label.ag-sticky-label {\n position: sticky;\n flex: none;\n max-width: 100%;\n overflow: visible;\n}\n\n.ag-header-group-text {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ag-header-cell-text {\n overflow: hidden;\n text-overflow: ellipsis;\n word-break: break-word;\n}\n\n.ag-header-group-cell .ag-header-cell-comp-wrapper {\n display: flex;\n}\n\n.ag-header-cell:not(.ag-header-cell-auto-height) .ag-header-cell-comp-wrapper {\n height: 100%;\n display: flex;\n align-items: center;\n}\n\n.ag-header-cell-comp-wrapper {\n width: 100%;\n}\n\n.ag-header-cell-wrap-text .ag-header-cell-comp-wrapper {\n white-space: normal;\n}\n\n.ag-header-cell-comp-wrapper-limited-height > div {\n overflow: hidden;\n}\n\n.ag-right-aligned-header .ag-header-cell-label {\n flex-direction: row-reverse;\n}\n\n.ag-header-cell-resize {\n position: absolute;\n z-index: 2;\n height: 100%;\n width: 8px;\n top: 0;\n cursor: ew-resize;\n}\n.ag-ltr .ag-header-cell-resize {\n right: -3px;\n}\n.ag-rtl .ag-header-cell-resize {\n left: -3px;\n}\n\n.ag-pinned-left-header .ag-header-cell-resize {\n right: -3px;\n}\n\n.ag-pinned-right-header .ag-header-cell-resize {\n left: -3px;\n}\n\n.ag-header-select-all {\n display: flex;\n}\n\n.ag-header-cell-menu-button,\n.ag-header-cell-filter-button,\n.ag-side-button-button,\n.ag-panel-title-bar-button,\n.ag-floating-filter-button-button {\n cursor: pointer;\n}\n\n.ag-column-moving .ag-cell {\n transition: left 0.2s;\n}\n.ag-column-moving .ag-header-cell {\n transition: left 0.2s;\n}\n.ag-column-moving .ag-spanned-cell-wrapper {\n transition: left 0.2s;\n}\n.ag-column-moving .ag-header-group-cell {\n transition: left 0.2s, width 0.2s;\n}\n\n.ag-column-panel {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n flex: 1 1 auto;\n}\n\n.ag-column-select {\n position: relative;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n flex: 3 1 0px;\n}\n\n.ag-column-select-header {\n position: relative;\n display: flex;\n flex: none;\n}\n\n.ag-column-select-header-icon {\n position: relative;\n}\n\n.ag-column-select-header-filter-wrapper {\n flex: 1 1 auto;\n}\n\n.ag-column-select-header-filter {\n width: 100%;\n}\n\n.ag-column-select-list {\n flex: 1 1 0px;\n overflow: hidden;\n}\n\n.ag-column-drop {\n position: relative;\n display: inline-flex;\n align-items: center;\n overflow: auto;\n width: 100%;\n}\n\n.ag-column-drop-list {\n display: flex;\n align-items: center;\n}\n\n.ag-column-drop-cell {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.ag-column-drop-cell-text {\n overflow: hidden;\n flex: 1 1 auto;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.ag-column-drop-vertical {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n align-items: stretch;\n flex: 1 1 0px;\n}\n\n.ag-column-drop-vertical-title-bar {\n display: flex;\n align-items: center;\n flex: none;\n}\n\n.ag-column-drop-vertical-list {\n position: relative;\n align-items: stretch;\n flex-grow: 1;\n flex-direction: column;\n overflow-x: auto;\n}\n.ag-column-drop-vertical-list > * {\n flex: none;\n}\n\n.ag-column-drop-empty .ag-column-drop-vertical-list {\n overflow: hidden;\n}\n\n.ag-column-drop-vertical-empty-message {\n display: block;\n}\n\n.ag-column-drop.ag-column-drop-horizontal {\n white-space: nowrap;\n overflow: hidden;\n}\n\n.ag-column-drop-cell-button {\n cursor: pointer;\n}\n\n.ag-filter-toolpanel {\n flex: 1 1 0px;\n min-width: 0;\n}\n\n.ag-filter-toolpanel-header {\n position: relative;\n}\n\n.ag-filter-toolpanel-header,\n.ag-filter-toolpanel-search {\n display: flex;\n align-items: center;\n}\n.ag-filter-toolpanel-header > *,\n.ag-filter-toolpanel-search > * {\n display: flex;\n align-items: center;\n}\n\n.ag-filter-apply-panel {\n display: flex;\n justify-content: flex-end;\n overflow: hidden;\n}\n\n.ag-row-animation .ag-row {\n transition: transform 0.4s, top 0.4s, opacity 0.2s;\n}\n\n.ag-row-animation .ag-row.ag-after-created {\n transition: transform 0.4s, top 0.4s, height 0.4s, opacity 0.2s;\n}\n\n.ag-row-no-animation .ag-row {\n transition: none;\n}\n\n.ag-row {\n white-space: nowrap;\n width: 100%;\n}\n\n.ag-row-loading {\n display: flex;\n align-items: center;\n}\n\n.ag-row-position-absolute {\n position: absolute;\n}\n\n.ag-row-position-relative {\n position: relative;\n}\n\n.ag-full-width-row {\n overflow: hidden;\n pointer-events: all;\n}\n\n.ag-row-inline-editing {\n z-index: 1;\n}\n\n.ag-row-dragging {\n z-index: 2;\n}\n\n.ag-stub-cell {\n display: flex;\n align-items: center;\n}\n\n.ag-cell {\n display: inline-block;\n position: absolute;\n white-space: nowrap;\n height: 100%;\n}\n\n.ag-cell-value {\n flex: 1 1 auto;\n}\n\n.ag-cell-value,\n.ag-group-value {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ag-cell-wrapper {\n display: flex;\n align-items: center;\n}\n.ag-cell-wrapper.ag-row-group {\n align-items: flex-start;\n}\n\n.ag-cell-wrap-text {\n white-space: normal;\n word-break: break-word;\n}\n\n.ag-cell-wrap-text:not(.ag-cell-auto-height) .ag-cell-wrapper {\n align-items: normal;\n height: 100%;\n}\n.ag-cell-wrap-text:not(.ag-cell-auto-height) .ag-cell-wrapper .ag-cell-value {\n height: 100%;\n}\n\n.ag-sparkline-wrapper {\n position: absolute;\n height: 100%;\n width: 100%;\n left: 0;\n top: 0;\n line-height: initial;\n}\n\n.ag-full-width-row .ag-cell-wrapper.ag-row-group {\n height: 100%;\n align-items: center;\n}\n\n.ag-cell-inline-editing {\n z-index: 1;\n}\n.ag-cell-inline-editing .ag-cell-wrapper,\n.ag-cell-inline-editing .ag-cell-edit-wrapper,\n.ag-cell-inline-editing .ag-cell-editor,\n.ag-cell-inline-editing .ag-cell-editor .ag-wrapper,\n.ag-cell-inline-editing .ag-cell-editor input {\n height: 100%;\n width: 100%;\n line-height: normal;\n}\n\n.ag-cell .ag-icon {\n display: inline-block;\n vertical-align: middle;\n}\n\n.ag-set-filter-item {\n display: flex;\n align-items: center;\n height: 100%;\n}\n\n.ag-set-filter-item-checkbox {\n display: flex;\n width: 100%;\n height: 100%;\n}\n\n.ag-set-filter-group-icons {\n display: block;\n}\n.ag-set-filter-group-icons > * {\n cursor: pointer;\n}\n\n.ag-filter-body-wrapper {\n display: flex;\n flex-direction: column;\n}\n\n.ag-filter-filter {\n flex: 1 1 0px;\n}\n\n.ag-filter-condition {\n display: flex;\n justify-content: center;\n}\n\n.ag-floating-filter-body {\n position: relative;\n display: flex;\n flex: 1 1 auto;\n height: 100%;\n}\n\n.ag-floating-filter-full-body {\n display: flex;\n flex: 1 1 auto;\n height: 100%;\n width: 100%;\n align-items: center;\n overflow: hidden;\n}\n\n.ag-floating-filter-full-body > div {\n flex: 1 1 auto;\n}\n\n.ag-floating-filter-input {\n align-items: center;\n display: flex;\n width: 100%;\n}\n.ag-floating-filter-input > * {\n flex: 1 1 auto;\n}\n\n.ag-floating-filter-button {\n display: flex;\n flex: none;\n}\n\n.ag-set-floating-filter-input input[disabled] {\n pointer-events: none;\n}\n\n.ag-dnd-ghost {\n display: inline-flex;\n align-items: center;\n cursor: move;\n white-space: nowrap;\n}\n\n.ag-overlay {\n height: 100%;\n left: 0;\n pointer-events: none;\n position: absolute;\n top: 0;\n width: 100%;\n z-index: 2;\n}\n\n.ag-overlay-panel {\n display: flex;\n height: 100%;\n width: 100%;\n}\n\n.ag-overlay-wrapper {\n display: flex;\n flex: none;\n width: 100%;\n height: 100%;\n align-items: center;\n justify-content: center;\n text-align: center;\n}\n\n.ag-overlay-loading-wrapper {\n pointer-events: all;\n}\n\n.ag-popup-child {\n z-index: 5;\n top: 0;\n}\n\n.ag-popup-editor {\n position: absolute;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.ag-large-text-input {\n display: block;\n}\n\n.ag-virtual-list-item {\n position: absolute;\n width: 100%;\n}\n\n.ag-floating-top,\n.ag-floating-bottom {\n overflow: hidden;\n white-space: nowrap;\n width: 100%;\n position: relative;\n display: flex;\n}\n\n.ag-pinned-left-floating-top,\n.ag-pinned-right-floating-top,\n.ag-pinned-left-floating-bottom,\n.ag-pinned-right-floating-bottom {\n overflow: hidden;\n position: relative;\n min-width: 0px;\n}\n\n.ag-sticky-top,\n.ag-sticky-bottom {\n position: absolute;\n display: flex;\n width: 100%;\n overflow: hidden;\n height: 0px;\n}\n\n.ag-sticky-bottom {\n box-sizing: content-box !important;\n}\n\n.ag-pinned-left-sticky-top,\n.ag-pinned-right-sticky-top {\n position: relative;\n height: 100%;\n overflow: hidden;\n}\n\n.ag-sticky-top-full-width-container,\n.ag-sticky-bottom-full-width-container {\n overflow: hidden;\n width: 100%;\n height: 100%;\n}\n\n.ag-dialog,\n.ag-panel {\n display: flex;\n flex-direction: column;\n position: relative;\n overflow: hidden;\n}\n\n.ag-panel-title-bar {\n display: flex;\n flex: none;\n align-items: center;\n cursor: default;\n}\n\n.ag-panel-title-bar-title {\n flex: 1 1 auto;\n}\n\n.ag-panel-title-bar-buttons {\n display: flex;\n}\n\n.ag-panel-title-bar-button {\n cursor: pointer;\n}\n\n.ag-panel-content-wrapper {\n display: flex;\n flex: 1 1 auto;\n position: relative;\n overflow: hidden;\n}\n\n.ag-dialog {\n position: absolute;\n}\n\n.ag-resizer {\n position: absolute;\n pointer-events: none;\n z-index: 1;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.ag-resizer.ag-resizer-topLeft {\n top: 0;\n left: 0;\n height: 5px;\n width: 5px;\n cursor: nwse-resize;\n}\n.ag-resizer.ag-resizer-top {\n top: 0;\n left: 5px;\n right: 5px;\n height: 5px;\n cursor: ns-resize;\n}\n.ag-resizer.ag-resizer-topRight {\n top: 0;\n right: 0;\n height: 5px;\n width: 5px;\n cursor: nesw-resize;\n}\n.ag-resizer.ag-resizer-right {\n top: 5px;\n right: 0;\n bottom: 5px;\n width: 5px;\n cursor: ew-resize;\n}\n.ag-resizer.ag-resizer-bottomRight {\n bottom: 0;\n right: 0;\n height: 5px;\n width: 5px;\n cursor: nwse-resize;\n}\n.ag-resizer.ag-resizer-bottom {\n bottom: 0;\n left: 5px;\n right: 5px;\n height: 5px;\n cursor: ns-resize;\n}\n.ag-resizer.ag-resizer-bottomLeft {\n bottom: 0;\n left: 0;\n height: 5px;\n width: 5px;\n cursor: nesw-resize;\n}\n.ag-resizer.ag-resizer-left {\n left: 0;\n top: 5px;\n bottom: 5px;\n width: 5px;\n cursor: ew-resize;\n}\n\n.ag-tooltip {\n position: absolute;\n z-index: 99999;\n}\n\n.ag-tooltip-custom {\n position: absolute;\n z-index: 99999;\n}\n\n.ag-tooltip:not(.ag-tooltip-interactive),\n.ag-tooltip-custom:not(.ag-tooltip-interactive) {\n pointer-events: none;\n}\n\n.ag-value-slide-out {\n margin-right: 5px;\n opacity: 1;\n transition: opacity 3s, margin-right 3s;\n transition-timing-function: linear;\n}\n\n.ag-value-slide-out-end {\n margin-right: 10px;\n opacity: 0;\n}\n\n.ag-opacity-zero {\n opacity: 0 !important;\n}\n\n.ag-menu {\n max-height: 100%;\n overflow-y: auto;\n position: absolute;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.ag-menu-column-select-wrapper {\n height: 265px;\n overflow: auto;\n}\n.ag-menu-column-select-wrapper .ag-column-select {\n height: 100%;\n}\n\n.ag-dialog .ag-panel-content-wrapper .ag-column-select {\n user-select: none;\n}\n\n.ag-menu-list {\n display: table;\n width: 100%;\n}\n\n.ag-menu-option,\n.ag-menu-separator {\n display: table-row;\n}\n\n.ag-menu-option-part,\n.ag-menu-separator-part {\n display: table-cell;\n vertical-align: middle;\n}\n\n.ag-menu-option-text {\n white-space: nowrap;\n}\n\n.ag-menu-option-custom {\n display: contents;\n}\n\n.ag-compact-menu-option {\n width: 100%;\n display: flex;\n flex-wrap: nowrap;\n}\n\n.ag-compact-menu-option-text {\n white-space: nowrap;\n flex: 1 1 auto;\n}\n\n.ag-context-menu-loading-icon {\n position: absolute;\n pointer-events: none;\n}\n\n.ag-pill-container {\n display: flex;\n gap: 0.25rem;\n flex-wrap: nowrap;\n}\n\n.ag-pill {\n display: flex;\n white-space: nowrap;\n padding: 0 0.25rem;\n align-items: center;\n}\n\n.ag-pill .ag-pill-button {\n border: none;\n padding: 0;\n}\n\n.ag-rich-select {\n cursor: default;\n outline: none;\n height: 100%;\n}\n\n.ag-rich-select-value {\n display: flex;\n align-items: center;\n height: 100%;\n}\n.ag-rich-select-value .ag-picker-field-display {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.ag-rich-select-value .ag-picker-field-display.ag-display-as-placeholder {\n opacity: 0.5;\n}\n\n.ag-rich-select-list {\n position: relative;\n}\n.ag-rich-select-list .ag-loading-text {\n min-height: 2rem;\n}\n\n.ag-rich-select-row {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n white-space: nowrap;\n overflow: hidden;\n height: 100%;\n}\n\n.ag-rich-select-field-input {\n flex: 1 1 auto;\n}\n.ag-rich-select-field-input .ag-input-field-input {\n padding: 0 !important;\n border: none !important;\n box-shadow: none !important;\n text-overflow: ellipsis;\n}\n.ag-rich-select-field-input .ag-input-field-input::placeholder {\n opacity: 0.8;\n}\n\n.ag-autocomplete {\n align-items: center;\n display: flex;\n}\n.ag-autocomplete > * {\n flex: 1 1 auto;\n}\n\n.ag-autocomplete-list-popup {\n position: absolute;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.ag-autocomplete-list {\n position: relative;\n}\n\n.ag-autocomplete-virtual-list-item {\n display: flex;\n}\n\n.ag-autocomplete-row {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n overflow: hidden;\n}\n\n.ag-autocomplete-row-label {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ag-paging-panel {\n align-items: center;\n display: flex;\n justify-content: flex-end;\n}\n\n.ag-paging-page-summary-panel {\n display: flex;\n align-items: center;\n}\n\n.ag-paging-button {\n position: relative;\n}\n\n.ag-disabled .ag-paging-page-summary-panel {\n pointer-events: none;\n}\n\n.ag-tool-panel-wrapper {\n display: flex;\n overflow-y: auto;\n overflow-x: hidden;\n cursor: default;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.ag-column-select-column,\n.ag-column-select-column-group,\n.ag-select-agg-func-item {\n position: relative;\n align-items: center;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n height: 100%;\n}\n.ag-column-select-column > *,\n.ag-column-select-column-group > *,\n.ag-select-agg-func-item > * {\n flex: none;\n}\n\n.ag-select-agg-func-item,\n.ag-column-select-column-label {\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.ag-column-select-checkbox {\n display: flex;\n}\n\n.ag-tool-panel-horizontal-resize {\n cursor: ew-resize;\n height: 100%;\n position: absolute;\n top: 0;\n width: 5px;\n z-index: 1;\n}\n\n.ag-ltr .ag-side-bar-left .ag-tool-panel-horizontal-resize {\n right: -3px;\n}\n.ag-rtl .ag-side-bar-left .ag-tool-panel-horizontal-resize {\n left: -3px;\n}\n\n.ag-ltr .ag-side-bar-right .ag-tool-panel-horizontal-resize {\n left: -3px;\n}\n.ag-rtl .ag-side-bar-right .ag-tool-panel-horizontal-resize {\n right: -3px;\n}\n\n.ag-details-row {\n width: 100%;\n}\n\n.ag-details-row-fixed-height {\n height: 100%;\n}\n\n.ag-details-grid {\n width: 100%;\n}\n\n.ag-details-grid-fixed-height {\n height: 100%;\n}\n\n.ag-header-group-cell {\n display: flex;\n align-items: center;\n height: 100%;\n position: absolute;\n contain: paint;\n}\n\n.ag-header-group-cell-no-group.ag-header-span-height {\n display: none;\n}\n\n.ag-cell-label-container {\n display: flex;\n justify-content: space-between;\n flex-direction: row-reverse;\n align-items: center;\n height: 100%;\n width: 100%;\n}\n\n.ag-header-group-cell-label,\n.ag-cell-label-container {\n padding: 5px 0px;\n}\n\n.ag-right-aligned-header .ag-cell-label-container {\n flex-direction: row;\n}\n.ag-right-aligned-header .ag-header-cell-text {\n text-align: end;\n}\n\n.ag-side-bar {\n display: flex;\n flex-direction: row-reverse;\n}\n\n.ag-side-bar-left {\n order: -1;\n flex-direction: row;\n}\n\n.ag-side-button-button {\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex-wrap: nowrap;\n white-space: nowrap;\n outline: none;\n cursor: pointer;\n}\n\n.ag-side-button-label {\n writing-mode: vertical-lr;\n}\n\n.ag-status-bar {\n display: flex;\n justify-content: space-between;\n overflow: hidden;\n}\n\n.ag-status-panel {\n display: inline-flex;\n}\n\n.ag-status-name-value {\n white-space: nowrap;\n}\n\n.ag-status-bar-left {\n display: inline-flex;\n}\n\n.ag-status-bar-center {\n display: inline-flex;\n}\n\n.ag-status-bar-right {\n display: inline-flex;\n}\n\n.ag-row-number-cell {\n width: 100%;\n white-space: nowrap;\n overflow: hidden;\n user-select: none;\n}\n.ag-ltr .ag-row-number-cell {\n text-align: right;\n}\n.ag-rtl .ag-row-number-cell {\n text-align: left;\n}\n\n.ag-icon {\n display: block;\n speak: none;\n}\n\n.ag-group {\n position: relative;\n width: 100%;\n}\n\n.ag-group-title-bar {\n display: flex;\n align-items: center;\n}\n\n.ag-group-title {\n display: inline;\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n\n.ag-group-title-bar .ag-group-title {\n cursor: default;\n}\n\n.ag-group-toolbar {\n display: flex;\n align-items: center;\n}\n\n.ag-group-container {\n display: flex;\n}\n\n.ag-disabled .ag-group-container {\n pointer-events: none;\n}\n\n.ag-group-container-horizontal {\n flex-direction: row;\n flex-wrap: wrap;\n}\n\n.ag-group-container-vertical {\n flex-direction: column;\n}\n\n.ag-column-group-icons {\n display: block;\n}\n.ag-column-group-icons > * {\n cursor: pointer;\n}\n\n.ag-group-item-alignment-stretch .ag-group-item {\n align-items: stretch;\n}\n\n.ag-group-item-alignment-start .ag-group-item {\n align-items: flex-start;\n}\n\n.ag-group-item-alignment-end .ag-group-item {\n align-items: flex-end;\n}\n\n.ag-toggle-button-icon {\n transition: right 0.3s;\n position: absolute;\n top: -1px;\n}\n\n.ag-input-field,\n.ag-select {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n.ag-input-field-input {\n flex: 1 1 auto;\n}\n\n.ag-floating-filter-input .ag-input-field-input[type=date] {\n width: 1px;\n}\n\n.ag-range-field {\n display: flex;\n align-items: center;\n}\n\n.ag-angle-select {\n display: flex;\n align-items: center;\n}\n\n.ag-angle-select-wrapper {\n display: flex;\n}\n\n.ag-angle-select-parent-circle {\n display: block;\n position: relative;\n}\n\n.ag-angle-select-child-circle {\n position: absolute;\n}\n\n.ag-slider-wrapper {\n display: flex;\n}\n.ag-slider-wrapper .ag-input-field {\n flex: 1 1 auto;\n}\n\n.ag-picker-field-display {\n flex: 1 1 auto;\n}\n\n.ag-picker-field {\n display: flex;\n align-items: center;\n}\n\n.ag-picker-field-icon {\n display: flex;\n border: 0;\n padding: 0;\n margin: 0;\n cursor: pointer;\n}\n\n.ag-picker-field-wrapper {\n overflow: hidden;\n}\n\n.ag-label-align-right .ag-label {\n order: 1;\n}\n.ag-label-align-right > * {\n flex: none;\n}\n\n.ag-label-align-top {\n flex-direction: column;\n align-items: flex-start;\n}\n.ag-label-align-top > * {\n align-self: stretch;\n}\n\n.ag-label-ellipsis {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n}\n\n.ag-color-panel {\n width: 100%;\n display: flex;\n flex-direction: column;\n text-align: center;\n}\n\n.ag-spectrum-color {\n flex: 1 1 auto;\n position: relative;\n overflow: visible;\n cursor: default;\n}\n\n.ag-spectrum-fill {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n}\n\n.ag-spectrum-val {\n cursor: pointer;\n}\n\n.ag-spectrum-dragger {\n position: absolute;\n pointer-events: none;\n cursor: pointer;\n}\n\n.ag-spectrum-hue,\n.ag-spectrum-alpha {\n cursor: default;\n}\n\n.ag-spectrum-hue-background {\n background: linear-gradient(to left, #ff0000 3%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);\n width: 100%;\n height: 100%;\n}\n\n.ag-spectrum-alpha {\n --ag-spectrum-alpha-background-checked: url(" + ___CSS_LOADER_URL_REPLACEMENT_1___ + ");\n}\n\n.ag-spectrum-alpha-background {\n background: linear-gradient(to right, var(--ag-internal-spectrum-alpha-color-from), var(--ag-internal-spectrum-alpha-color-to)), var(--ag-spectrum-alpha-background-checked) top left/4px 4px;\n width: 100%;\n height: 100%;\n}\n\n.ag-spectrum-tool {\n cursor: pointer;\n position: relative;\n}\n\n.ag-spectrum-slider {\n position: absolute;\n pointer-events: none;\n}\n\n.ag-spectrum-alpha .ag-spectrum-slider {\n background: linear-gradient(to bottom, var(--ag-internal-spectrum-alpha-color), var(--ag-internal-spectrum-alpha-color)) white;\n}\n\n.ag-recent-colors {\n display: flex;\n}\n\n.ag-recent-color {\n cursor: pointer;\n}\n\n.ag-pill-select {\n display: flex;\n flex-direction: column;\n}\n.ag-pill-select .ag-column-drop {\n flex: unset;\n}\n\n.ag-ltr {\n direction: ltr;\n}\n.ag-ltr .ag-body,\n.ag-ltr .ag-floating-top,\n.ag-ltr .ag-floating-bottom,\n.ag-ltr .ag-header,\n.ag-ltr .ag-sticky-top,\n.ag-ltr .ag-sticky-bottom,\n.ag-ltr .ag-body-viewport,\n.ag-ltr .ag-body-horizontal-scroll {\n flex-direction: row;\n}\n\n.ag-rtl {\n direction: rtl;\n}\n.ag-rtl .ag-body,\n.ag-rtl .ag-floating-top,\n.ag-rtl .ag-floating-bottom,\n.ag-rtl .ag-header,\n.ag-rtl .ag-sticky-top,\n.ag-rtl .ag-sticky-bottom,\n.ag-rtl .ag-body-viewport,\n.ag-rtl .ag-body-horizontal-scroll {\n flex-direction: row-reverse;\n}\n.ag-rtl .ag-icon-contracted,\n.ag-rtl .ag-icon-expanded,\n.ag-rtl .ag-icon-tree-closed {\n display: block;\n transform: rotate(180deg);\n}\n\n.ag-body .ag-body-viewport {\n -webkit-overflow-scrolling: touch;\n}\n\n.ag-measurement-container {\n width: 0;\n overflow: hidden;\n visibility: hidden;\n}\n.ag-measurement-container div {\n position: absolute;\n}\n\n.ag-layout-print.ag-body {\n display: block;\n height: unset;\n}\n.ag-layout-print.ag-root-wrapper {\n display: inline-block;\n}\n.ag-layout-print .ag-body-vertical-scroll {\n display: none;\n}\n.ag-layout-print .ag-body-horizontal-scroll {\n display: none;\n}\n.ag-layout-print.ag-force-vertical-scroll {\n overflow-y: visible !important;\n}\n\n@media print {\n .ag-root-wrapper.ag-layout-print {\n display: table;\n }\n .ag-root-wrapper.ag-layout-print .ag-root-wrapper-body,\n .ag-root-wrapper.ag-layout-print .ag-root,\n .ag-root-wrapper.ag-layout-print .ag-body-viewport,\n .ag-root-wrapper.ag-layout-print .ag-center-cols-container,\n .ag-root-wrapper.ag-layout-print .ag-center-cols-viewport,\n .ag-root-wrapper.ag-layout-print .ag-body-horizontal-scroll-viewport,\n .ag-root-wrapper.ag-layout-print .ag-virtual-list-viewport {\n height: auto !important;\n overflow: hidden !important;\n display: block !important;\n }\n .ag-root-wrapper.ag-layout-print .ag-row,\n .ag-root-wrapper.ag-layout-print .ag-cell {\n break-inside: avoid;\n }\n}\n[class^=ag-],\n[class^=ag-]:focus,\n[class^=ag-]:after,\n[class^=ag-]:before {\n box-sizing: border-box;\n outline: none;\n}\n\n[class^=ag-]::-ms-clear {\n display: none;\n}\n\n.ag-checkbox .ag-input-wrapper,\n.ag-radio-button .ag-input-wrapper {\n overflow: visible;\n}\n\n.ag-range-field .ag-input-wrapper {\n height: 100%;\n}\n\n.ag-toggle-button {\n flex: none;\n width: unset;\n min-width: unset;\n}\n\n.ag-button {\n border-radius: 0px;\n color: var(--ag-foreground-color);\n}\n\n.ag-button:hover {\n background-color: transparent;\n}\n\n.ag-ltr .ag-label-align-right .ag-label {\n margin-left: var(--ag-grid-size);\n}\n.ag-rtl .ag-label-align-right .ag-label {\n margin-right: var(--ag-grid-size);\n}\n\ninput[class^=ag-] {\n margin: 0;\n background-color: var(--ag-background-color);\n}\n\ntextarea[class^=ag-],\nselect[class^=ag-] {\n background-color: var(--ag-background-color);\n}\n\ninput[class^=ag-]:not([type]),\ninput[class^=ag-][type=text],\ninput[class^=ag-][type=number],\ninput[class^=ag-][type=tel],\ninput[class^=ag-][type=date],\ninput[class^=ag-][type=datetime-local],\ntextarea[class^=ag-] {\n font-size: inherit;\n line-height: inherit;\n color: inherit;\n font-family: inherit;\n border: var(--ag-borders-input) var(--ag-input-border-color);\n}\ninput[class^=ag-]:not([type]):disabled,\ninput[class^=ag-][type=text]:disabled,\ninput[class^=ag-][type=number]:disabled,\ninput[class^=ag-][type=tel]:disabled,\ninput[class^=ag-][type=date]:disabled,\ninput[class^=ag-][type=datetime-local]:disabled,\ntextarea[class^=ag-]:disabled {\n color: var(--ag-disabled-foreground-color);\n background-color: var(--ag-input-disabled-background-color);\n border-color: var(--ag-input-disabled-border-color);\n}\ninput[class^=ag-]:not([type]):focus,\ninput[class^=ag-][type=text]:focus,\ninput[class^=ag-][type=number]:focus,\ninput[class^=ag-][type=tel]:focus,\ninput[class^=ag-][type=date]:focus,\ninput[class^=ag-][type=datetime-local]:focus,\ntextarea[class^=ag-]:focus {\n outline: none;\n box-shadow: var(--ag-input-focus-box-shadow);\n border-color: var(--ag-input-focus-border-color);\n}\ninput[class^=ag-]:not([type]):invalid,\ninput[class^=ag-][type=text]:invalid,\ninput[class^=ag-][type=number]:invalid,\ninput[class^=ag-][type=tel]:invalid,\ninput[class^=ag-][type=date]:invalid,\ninput[class^=ag-][type=datetime-local]:invalid,\ntextarea[class^=ag-]:invalid {\n border: var(--ag-borders-input-invalid) var(--ag-input-border-color-invalid);\n}\n\ninput[class^=ag-][type=number]:not(.ag-number-field-input-stepper) {\n -moz-appearance: textfield;\n}\ninput[class^=ag-][type=number]:not(.ag-number-field-input-stepper)::-webkit-outer-spin-button, input[class^=ag-][type=number]:not(.ag-number-field-input-stepper)::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\ninput[class^=ag-][type=range] {\n padding: 0;\n}\n\ninput[class^=ag-][type=button]:focus,\nbutton[class^=ag-]:focus {\n box-shadow: var(--ag-input-focus-box-shadow);\n}\n\n.ag-drag-handle {\n color: var(--ag-secondary-foreground-color);\n}\n\n.ag-list-item,\n.ag-virtual-list-item {\n height: var(--ag-list-item-height);\n}\n\n.ag-virtual-list-item:focus-visible {\n outline: none;\n}\n.ag-virtual-list-item:focus-visible::after {\n content: \"\";\n position: absolute;\n background-color: transparent;\n pointer-events: none;\n top: 4px;\n left: 4px;\n display: block;\n width: calc(100% - 8px);\n height: calc(100% - 8px);\n border: 1px solid;\n border-color: var(--ag-input-focus-border-color);\n}\n\n.ag-select-list {\n background-color: var(--ag-background-color);\n overflow-y: auto;\n overflow-x: hidden;\n border-radius: var(--ag-border-radius);\n border: var(--ag-borders) var(--ag-border-color);\n}\n\n.ag-list-item {\n display: flex;\n align-items: center;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.ag-list-item.ag-active-item {\n background-color: var(--ag-row-hover-color);\n}\n\n.ag-select-list-item {\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n cursor: default;\n}\n.ag-ltr .ag-select-list-item {\n padding-left: calc(var(--ag-cell-horizontal-padding) / 2);\n}\n.ag-rtl .ag-select-list-item {\n padding-right: calc(var(--ag-cell-horizontal-padding) / 2);\n}\n.ag-select-list-item span {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n\n.ag-row-drag,\n.ag-selection-checkbox,\n.ag-group-expanded,\n.ag-group-contracted {\n color: var(--ag-secondary-foreground-color);\n}\n.ag-ltr .ag-row-drag,\n.ag-ltr .ag-selection-checkbox,\n.ag-ltr .ag-group-expanded,\n.ag-ltr .ag-group-contracted {\n margin-right: var(--ag-cell-widget-spacing);\n}\n.ag-rtl .ag-row-drag,\n.ag-rtl .ag-selection-checkbox,\n.ag-rtl .ag-group-expanded,\n.ag-rtl .ag-group-contracted {\n margin-left: var(--ag-cell-widget-spacing);\n}\n\n.ag-cell-wrapper > *:not(.ag-cell-value):not(.ag-group-value) {\n --ag-internal-calculated-line-height: var(\n --ag-line-height,\n calc(var(--ag-row-height) - var(--ag-row-border-width))\n );\n --ag-internal-padded-row-height: calc(var(--ag-row-height) - var(--ag-row-border-width) - 2px);\n height: min(var(--ag-internal-calculated-line-height), var(--ag-internal-padded-row-height));\n display: flex;\n align-items: center;\n flex: none;\n}\n\n.ag-group-expanded,\n.ag-group-contracted {\n cursor: pointer;\n}\n\n.ag-group-title-bar-icon {\n cursor: pointer;\n flex: none;\n color: var(--ag-secondary-foreground-color);\n}\n\n.ag-ltr .ag-group-child-count {\n margin-left: 2px;\n}\n.ag-rtl .ag-group-child-count {\n margin-right: 2px;\n}\n\n.ag-group-title-bar {\n background-color: var(--ag-subheader-background-color);\n padding: var(--ag-grid-size);\n}\n\n.ag-group-toolbar {\n padding: var(--ag-grid-size);\n background-color: var(--ag-subheader-toolbar-background-color);\n}\n\n.ag-disabled-group-title-bar,\n.ag-disabled-group-container {\n opacity: 0.5;\n}\n\n.group-item {\n margin: calc(var(--ag-grid-size) * 0.5) 0;\n}\n\n.ag-label {\n white-space: nowrap;\n}\n.ag-ltr .ag-label {\n margin-right: var(--ag-grid-size);\n}\n.ag-rtl .ag-label {\n margin-left: var(--ag-grid-size);\n}\n\n.ag-label-align-top .ag-label {\n margin-bottom: calc(var(--ag-grid-size) * 0.5);\n}\n\n.ag-angle-select[disabled] {\n color: var(--ag-disabled-foreground-color);\n pointer-events: none;\n}\n.ag-angle-select[disabled] .ag-angle-select-field {\n opacity: 0.4;\n}\n\n.ag-ltr .ag-slider-field,\n.ag-ltr .ag-angle-select-field {\n margin-right: calc(var(--ag-grid-size) * 2);\n}\n.ag-rtl .ag-slider-field,\n.ag-rtl .ag-angle-select-field {\n margin-left: calc(var(--ag-grid-size) * 2);\n}\n\n.ag-angle-select-parent-circle {\n width: 24px;\n height: 24px;\n border-radius: 12px;\n border: solid 1px;\n border-color: var(--ag-border-color);\n background-color: var(--ag-background-color);\n}\n\n.ag-angle-select-child-circle {\n top: 4px;\n left: 12px;\n width: 6px;\n height: 6px;\n margin-left: -3px;\n margin-top: -4px;\n border-radius: 3px;\n background-color: var(--ag-secondary-foreground-color);\n}\n\n.ag-picker-field-wrapper {\n border: var(--ag-borders);\n border-color: var(--ag-border-color);\n border-radius: 5px;\n background-color: var(--ag-background-color);\n}\n.ag-picker-field-wrapper:disabled {\n color: var(--ag-disabled-foreground-color);\n background-color: var(--ag-input-disabled-background-color);\n border-color: var(--ag-input-disabled-border-color);\n}\n.ag-picker-field-wrapper.ag-picker-has-focus, .ag-picker-field-wrapper:focus-within {\n outline: none;\n box-shadow: var(--ag-input-focus-box-shadow);\n border-color: var(--ag-input-focus-border-color);\n}\n\n.ag-picker-field-button {\n background-color: var(--ag-background-color);\n color: var(--ag-secondary-foreground-color);\n}\n\n.ag-dialog.ag-color-dialog {\n border-radius: 5px;\n}\n\n.ag-color-picker .ag-picker-field-wrapper {\n padding-left: var(--ag-grid-size);\n padding-right: var(--ag-grid-size);\n}\n.ag-color-picker .ag-picker-field-display {\n display: flex;\n flex-direction: row;\n align-items: center;\n min-height: var(--ag-list-item-height);\n}\n\n.ag-ltr .ag-color-picker-color,\n.ag-ltr .ag-color-picker-value {\n margin-right: var(--ag-grid-size);\n}\n.ag-rtl .ag-color-picker-color,\n.ag-rtl .ag-color-picker-value {\n margin-left: var(--ag-grid-size);\n}\n\n.ag-color-panel {\n padding: var(--ag-grid-size);\n}\n\n.ag-spectrum-color {\n background-color: rgb(255, 0, 0);\n border-radius: 2px;\n}\n\n.ag-spectrum-tools {\n padding: 10px;\n}\n\n.ag-spectrum-sat {\n background-image: linear-gradient(to right, white, rgba(204, 154, 129, 0));\n}\n\n.ag-spectrum-val {\n background-image: linear-gradient(to top, black, rgba(204, 154, 129, 0));\n}\n\n.ag-spectrum-dragger {\n border-radius: 12px;\n height: 12px;\n width: 12px;\n border: 2px solid white;\n background: black;\n box-shadow: 0 0 2px 0px rgba(0, 0, 0, 0.24);\n}\n\n.ag-spectrum-hue-background {\n border-radius: 2px;\n}\n\n.ag-spectrum-alpha-background {\n border-radius: 2px;\n}\n\n.ag-spectrum-tool {\n margin-bottom: 10px;\n height: 11px;\n border-radius: 2px;\n}\n\n.ag-spectrum-slider {\n margin-top: -12px;\n width: 13px;\n height: 13px;\n border-radius: 13px;\n border: 2px solid white;\n box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.37);\n}\n\n.ag-recent-colors {\n margin-top: 10px;\n}\n\n.ag-recent-color {\n margin: 0 3px;\n}\n.ag-recent-color:first-child {\n margin-left: 0;\n}\n.ag-recent-color:last-child {\n margin-right: 0;\n}\n\n.ag-spectrum-color:focus-visible:not(:disabled):not([readonly]),\n.ag-spectrum-slider:focus-visible:not(:disabled):not([readonly]),\n.ag-recent-color:focus-visible:not(:disabled):not([readonly]) {\n box-shadow: var(--ag-input-focus-box-shadow);\n}\n\n.ag-ltr .ag-color-input input[class^=ag-][type=text].ag-input-field-input {\n padding-left: calc(var(--ag-icon-size) + var(--ag-grid-size) * 2);\n}\n.ag-rtl .ag-color-input input[class^=ag-][type=text].ag-input-field-input {\n padding-right: calc(var(--ag-icon-size) + var(--ag-grid-size) * 2);\n}\n.ag-color-input .ag-color-input-color {\n position: absolute;\n}\n.ag-ltr .ag-color-input .ag-color-input-color {\n margin-left: var(--ag-grid-size);\n}\n.ag-rtl .ag-color-input .ag-color-input-color {\n margin-right: var(--ag-grid-size);\n}\n\n.ag-color-picker-color,\n.ag-color-input-color {\n width: var(--ag-icon-size);\n height: var(--ag-icon-size);\n border: var(--ag-borders-secondary) var(--ag-secondary-border-color);\n border-radius: 2px;\n}\n\n.ag-dnd-ghost {\n border: var(--ag-borders) var(--ag-border-color);\n background: var(--ag-background-color);\n border-radius: var(--ag-card-radius);\n box-shadow: var(--ag-card-shadow);\n padding: var(--ag-grid-size);\n overflow: hidden;\n text-overflow: ellipsis;\n border: var(--ag-borders-secondary) var(--ag-secondary-border-color);\n color: var(--ag-secondary-foreground-color);\n height: var(--ag-header-height);\n line-height: var(--ag-header-height);\n margin: 0;\n padding: 0 calc(var(--ag-grid-size) * 2);\n transform: translateY(calc(var(--ag-grid-size) * 2));\n}\n\n.ag-dnd-ghost-icon {\n margin-right: var(--ag-grid-size);\n color: var(--ag-foreground-color);\n}\n\n.ag-popup-child:not(.ag-tooltip-custom) {\n box-shadow: var(--ag-popup-shadow);\n}\n\n.ag-select .ag-picker-field-wrapper {\n min-height: var(--ag-list-item-height);\n cursor: default;\n}\n.ag-ltr .ag-select .ag-picker-field-wrapper {\n padding-left: calc(var(--ag-cell-horizontal-padding) / 2);\n}\n.ag-rtl .ag-select .ag-picker-field-wrapper {\n padding-right: calc(var(--ag-cell-horizontal-padding) / 2);\n}\n.ag-ltr .ag-select .ag-picker-field-wrapper {\n padding-right: var(--ag-grid-size);\n}\n.ag-rtl .ag-select .ag-picker-field-wrapper {\n padding-left: var(--ag-grid-size);\n}\n.ag-select.ag-disabled .ag-picker-field-wrapper:focus {\n box-shadow: none;\n}\n.ag-select:not(.ag-cell-editor, .ag-label-align-top) {\n min-height: var(--ag-list-item-height);\n}\n.ag-select .ag-picker-field-display {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.ag-select .ag-picker-field-icon {\n display: flex;\n align-items: center;\n}\n.ag-select.ag-disabled {\n opacity: 0.5;\n}\n\n.ag-rich-select-value,\n.ag-rich-select-list {\n background-color: var(--ag-background-color);\n}\n\n.ag-rich-select-list {\n width: 100%;\n height: auto;\n border-radius: var(--ag-border-radius);\n border: var(--ag-borders) var(--ag-border-color);\n}\n.ag-rich-select-list .ag-loading-text {\n padding: var(--ag-widget-vertical-spacing) var(--ag-widget-horizontal-spacing);\n}\n\n.ag-rich-select-value {\n border-bottom: var(--ag-borders-secondary) var(--ag-secondary-border-color);\n padding-top: 0;\n padding-bottom: 0;\n}\n.ag-ltr .ag-rich-select-value {\n padding-left: calc(var(--ag-cell-horizontal-padding) / 2);\n}\n.ag-rtl .ag-rich-select-value {\n padding-right: calc(var(--ag-cell-horizontal-padding) / 2);\n}\n.ag-ltr .ag-rich-select-value {\n padding-right: var(--ag-grid-size);\n}\n.ag-rtl .ag-rich-select-value {\n padding-left: var(--ag-grid-size);\n}\n\n.ag-ltr .ag-rich-select-field-input {\n left: calc(var(--ag-cell-horizontal-padding));\n}\n.ag-rtl .ag-rich-select-field-input {\n right: calc(var(--ag-cell-horizontal-padding));\n}\n\n.ag-popup-editor .ag-rich-select-value {\n height: var(--ag-row-height);\n min-width: 200px;\n}\n\n.ag-rich-select-virtual-list-item {\n cursor: default;\n height: var(--ag-list-item-height);\n}\n.ag-rich-select-virtual-list-item:focus-visible::after {\n content: none;\n}\n\n.ag-ltr .ag-rich-select-row {\n padding-left: calc(var(--ag-cell-horizontal-padding) / 2);\n}\n.ag-rtl .ag-rich-select-row {\n padding-right: calc(var(--ag-cell-horizontal-padding) / 2);\n}\n\n.ag-rich-select-row-selected {\n background-color: var(--ag-selected-row-background-color);\n}\n\n.ag-rich-select-row:hover,\n.ag-rich-select-row-highlighted {\n background-image: linear-gradient(var(--ag-row-hover-color), var(--ag-row-hover-color));\n}\n\n.ag-rich-select-row-text-highlight {\n font-weight: bold;\n}\n\n.ag-autocomplete {\n width: 100%;\n}\n\n.ag-autocomplete-list {\n width: 100%;\n min-width: 200px;\n height: calc(var(--ag-row-height) * 6.5);\n}\n\n.ag-autocomplete-virtual-list-item {\n cursor: default;\n height: var(--ag-list-item-height);\n}\n.ag-autocomplete-virtual-list-item:focus-visible::after {\n content: none;\n}\n.ag-autocomplete-virtual-list-item:hover {\n background-color: var(--ag-row-hover-color);\n}\n\n.ag-autocomplete-row-label {\n margin: 0px var(--ag-widget-container-horizontal-padding);\n}\n\n.ag-autocomplete-row-selected {\n background-color: var(--ag-selected-row-background-color);\n}\n\n.ag-pill {\n border: 1px solid var(--ag-chip-border-color);\n border-radius: var(--ag-border-radius);\n background-color: var(--ag-chip-background-color);\n}\n\n.ag-ltr .ag-pill .ag-pill-button {\n margin-left: var(--ag-grid-size);\n}\n.ag-rtl .ag-pill .ag-pill-button {\n margin-right: var(--ag-grid-size);\n}\n\n.ag-pill:focus-visible {\n border-color: var(--ag-input-focus-border-color);\n}\n\n.ag-pill .ag-pill-button:hover {\n cursor: pointer;\n}\n\n.ag-dragging-range-handle .ag-dialog,\n.ag-dragging-fill-handle .ag-dialog {\n opacity: 0.7;\n pointer-events: none;\n}\n\n.ag-dialog {\n border-radius: var(--ag-border-radius);\n border: var(--ag-borders) var(--ag-border-color);\n box-shadow: var(--ag-popup-shadow);\n}\n\n.ag-panel {\n background-color: var(--ag-panel-background-color);\n border-color: var(--ag-panel-border-color);\n}\n\n.ag-panel-title-bar {\n color: var(--ag-header-foreground-color);\n height: var(--ag-header-height);\n padding: var(--ag-grid-size) var(--ag-cell-horizontal-padding);\n border-bottom: var(--ag-borders) var(--ag-border-color);\n}\n\n.ag-ltr .ag-panel-title-bar-button {\n margin-left: var(--ag-grid-size);\n}\n.ag-rtl .ag-panel-title-bar-button {\n margin-right: var(--ag-grid-size);\n}\n\n.ag-tooltip {\n background-color: var(--ag-tooltip-background-color);\n color: var(--ag-foreground-color);\n padding: var(--ag-grid-size);\n border: var(--ag-borders) var(--ag-border-color);\n border-radius: var(--ag-card-radius);\n white-space: normal;\n}\n\n.ag-tooltip.ag-tooltip-animate,\n.ag-tooltip-custom.ag-tooltip-animate {\n transition: opacity 1s;\n}\n.ag-tooltip.ag-tooltip-animate.ag-tooltip-hiding,\n.ag-tooltip-custom.ag-tooltip-animate.ag-tooltip-hiding {\n opacity: 0;\n}\n\n.ag-ltr .ag-column-select-column,\n.ag-ltr .ag-column-select-column-group {\n padding-left: calc(var(--ag-indentation-level) * var(--ag-column-select-indent-size));\n}\n.ag-rtl .ag-column-select-column,\n.ag-rtl .ag-column-select-column-group {\n padding-right: calc(var(--ag-indentation-level) * var(--ag-column-select-indent-size));\n}\n\n.ag-column-select-header-icon {\n cursor: pointer;\n}\n\n.ag-column-select-header-icon:focus-visible {\n outline: none;\n}\n.ag-column-select-header-icon:focus-visible::after {\n content: \"\";\n position: absolute;\n background-color: transparent;\n pointer-events: none;\n top: 0px;\n left: 0px;\n display: block;\n width: calc(100% - 0px);\n height: calc(100% - 0px);\n border: 1px solid;\n border-color: var(--ag-input-focus-border-color);\n}\n\n.ag-ltr .ag-column-group-icons:not(:last-child),\n.ag-ltr .ag-column-select-header-icon:not(:last-child),\n.ag-ltr .ag-column-select-header-checkbox:not(:last-child),\n.ag-ltr .ag-column-select-header-filter-wrapper:not(:last-child),\n.ag-ltr .ag-column-select-checkbox:not(:last-child),\n.ag-ltr .ag-column-select-column-drag-handle:not(:last-child),\n.ag-ltr .ag-column-select-column-group-drag-handle:not(:last-child),\n.ag-ltr .ag-column-select-column-label:not(:last-child) {\n margin-right: var(--ag-widget-horizontal-spacing);\n}\n.ag-rtl .ag-column-group-icons:not(:last-child),\n.ag-rtl .ag-column-select-header-icon:not(:last-child),\n.ag-rtl .ag-column-select-header-checkbox:not(:last-child),\n.ag-rtl .ag-column-select-header-filter-wrapper:not(:last-child),\n.ag-rtl .ag-column-select-checkbox:not(:last-child),\n.ag-rtl .ag-column-select-column-drag-handle:not(:last-child),\n.ag-rtl .ag-column-select-column-group-drag-handle:not(:last-child),\n.ag-rtl .ag-column-select-column-label:not(:last-child) {\n margin-left: var(--ag-widget-horizontal-spacing);\n}\n\n.ag-column-select-virtual-list-item:focus-visible {\n outline: none;\n}\n.ag-column-select-virtual-list-item:focus-visible::after {\n content: \"\";\n position: absolute;\n background-color: transparent;\n pointer-events: none;\n top: 1px;\n left: 1px;\n display: block;\n width: calc(100% - 2px);\n height: calc(100% - 2px);\n border: 1px solid;\n border-color: var(--ag-input-focus-border-color);\n}\n\n.ag-column-select-column-group:not(:last-child),\n.ag-column-select-column:not(:last-child) {\n margin-bottom: var(--ag-widget-vertical-spacing);\n}\n\n.ag-column-select-column-readonly,\n.ag-column-select-column-group-readonly {\n color: var(--ag-disabled-foreground-color);\n pointer-events: none;\n}\n\n.ag-ltr .ag-column-select-add-group-indent {\n margin-left: calc(var(--ag-icon-size) + var(--ag-grid-size) * 2);\n}\n.ag-rtl .ag-column-select-add-group-indent {\n margin-right: calc(var(--ag-icon-size) + var(--ag-grid-size) * 2);\n}\n\n.ag-column-select-virtual-list-viewport {\n padding: calc(var(--ag-widget-container-vertical-padding) * 0.5) 0px;\n}\n\n.ag-column-select-virtual-list-item {\n padding: 0 var(--ag-widget-container-horizontal-padding);\n}\n\n.ag-checkbox-edit {\n padding-left: var(--ag-cell-horizontal-padding);\n padding-right: var(--ag-cell-horizontal-padding);\n}\n\n.ag-pill-select .ag-column-drop {\n border-bottom: 0;\n min-height: unset;\n}\n.ag-pill-select .ag-column-drop-list {\n padding: 0;\n}\n.ag-pill-select .ag-select {\n padding-top: var(--ag-grid-size);\n}\n.ag-pill-select .ag-picker-field-wrapper {\n background-color: transparent;\n border: 0;\n}\n.ag-pill-select .ag-picker-field-display {\n cursor: pointer;\n}\n\n.ag-rtl {\n text-align: right;\n}\n\n.ag-root-wrapper {\n border-radius: var(--ag-wrapper-border-radius);\n border: var(--ag-borders) var(--ag-border-color);\n}\n\n.ag-row > .ag-cell-wrapper.ag-row-group {\n padding-left: calc(var(--ag-cell-horizontal-padding) + var(--ag-row-group-indent-size) * var(--ag-indentation-level));\n}\n\n.ag-cell-wrapper.ag-row-group,\n.ag-cell-wrapper.ag-row-group-leaf-indent,\n.ag-cell-wrapper.ag-pivot-leaf-group {\n padding-left: calc(var(--ag-indentation-level) * var(--ag-row-group-indent-size));\n}\n\n.ag-ltr .ag-row-group-leaf-indent {\n margin-left: var(--ag-row-group-indent-size);\n}\n.ag-rtl .ag-row-group-leaf-indent {\n margin-right: var(--ag-row-group-indent-size);\n}\n\n.ag-row:not(.ag-row-level-0) .ag-pivot-leaf-group {\n margin-left: var(--ag-row-group-indent-size);\n}\n\n.ag-value-change-delta {\n padding-right: 2px;\n}\n\n.ag-value-change-delta-up {\n color: var(--ag-value-change-delta-up-color);\n}\n\n.ag-value-change-delta-down {\n color: var(--ag-value-change-delta-down-color);\n}\n\n.ag-value-change-value {\n background-color: transparent;\n border-radius: 1px;\n padding-left: 1px;\n padding-right: 1px;\n transition: background-color 1s;\n}\n\n.ag-value-change-value-highlight {\n background-color: var(--ag-value-change-value-highlight-background-color);\n transition: background-color 0.1s;\n}\n\n.ag-cell-data-changed {\n background-color: var(--ag-value-change-value-highlight-background-color) !important;\n}\n\n.ag-cell-data-changed-animation {\n background-color: transparent;\n}\n\n.ag-cell-highlight {\n background-color: var(--ag-range-selection-highlight-color) !important;\n}\n\n.ag-row,\n.ag-spanned-row {\n color: var(--ag-data-color);\n}\n\n.ag-row {\n height: var(--ag-row-height);\n background-color: var(--ag-background-color);\n border-bottom: var(--ag-row-border-style) var(--ag-row-border-color) var(--ag-row-border-width);\n}\n\n.ag-spanned-cell-wrapper {\n background-color: var(--ag-background-color);\n position: absolute;\n}\n\n.ag-spanned-cell-wrapper > .ag-spanned-cell {\n display: block;\n position: relative;\n}\n\n.ag-row-highlight-above::after,\n.ag-row-highlight-below::after {\n content: \"\";\n position: absolute;\n width: calc(100% - 1px);\n height: 1px;\n background-color: var(--ag-range-selection-border-color);\n left: 1px;\n}\n\n.ag-row-highlight-above::after {\n top: 0px;\n}\n\n.ag-row-highlight-below::after {\n bottom: 0px;\n}\n\n.ag-row-odd {\n background-color: var(--ag-odd-row-background-color);\n}\n\n.ag-body-horizontal-scroll:not(.ag-scrollbar-invisible) .ag-horizontal-left-spacer:not(.ag-scroller-corner) {\n border-right: var(--ag-borders-critical) var(--ag-border-color);\n}\n.ag-body-horizontal-scroll:not(.ag-scrollbar-invisible) .ag-horizontal-right-spacer:not(.ag-scroller-corner) {\n border-left: var(--ag-borders-critical) var(--ag-border-color);\n}\n\n.ag-row-selected::before {\n content: \"\";\n background-color: var(--ag-selected-row-background-color);\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n}\n\n.ag-row-hover:not(.ag-full-width-row)::before,\n.ag-row-hover.ag-full-width-row.ag-row-group::before {\n content: \"\";\n background-color: var(--ag-row-hover-color);\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n}\n\n.ag-row-hover.ag-full-width-row.ag-row-group > * {\n position: relative;\n}\n\n.ag-row-hover.ag-row-selected::before {\n background-color: var(--ag-row-hover-color);\n background-image: linear-gradient(var(--ag-selected-row-background-color), var(--ag-selected-row-background-color));\n}\n\n.ag-column-hover {\n background-color: var(--ag-column-hover-color);\n}\n\n.ag-header-range-highlight {\n background-color: var(--ag-range-header-highlight-color);\n}\n\n.ag-ltr .ag-right-aligned-cell {\n text-align: right;\n}\n.ag-rtl .ag-right-aligned-cell {\n text-align: left;\n}\n\n.ag-ltr .ag-right-aligned-cell .ag-cell-value,\n.ag-ltr .ag-right-aligned-cell .ag-group-value {\n margin-left: auto;\n}\n.ag-rtl .ag-right-aligned-cell .ag-cell-value,\n.ag-rtl .ag-right-aligned-cell .ag-group-value {\n margin-right: auto;\n}\n\n.ag-ltr .ag-right-aligned-cell .ag-skeleton-effect {\n margin-left: auto;\n}\n.ag-rtl .ag-right-aligned-cell .ag-skeleton-effect {\n margin-right: auto;\n}\n\n.ag-cell,\n.ag-full-width-row .ag-cell-wrapper.ag-row-group {\n --ag-internal-calculated-line-height: var(\n --ag-line-height,\n calc(var(--ag-row-height) - var(--ag-row-border-width))\n );\n --ag-internal-padded-row-height: calc(var(--ag-row-height) - var(--ag-row-border-width) - 2px);\n border: 1px solid transparent;\n line-height: min(var(--ag-internal-calculated-line-height), var(--ag-internal-padded-row-height));\n padding-left: calc(var(--ag-cell-horizontal-padding) - 1px + var(--ag-row-group-indent-size) * var(--ag-indentation-level));\n padding-right: calc(var(--ag-cell-horizontal-padding) - 1px);\n -webkit-font-smoothing: subpixel-antialiased;\n}\n\n.ag-row > .ag-cell-wrapper {\n padding-left: calc(var(--ag-cell-horizontal-padding) - 1px);\n padding-right: calc(var(--ag-cell-horizontal-padding) - 1px);\n}\n\n.ag-row-dragging {\n cursor: move;\n opacity: 0.5;\n}\n\n.ag-cell-inline-editing {\n border: 1px solid var(--ag-border-color);\n border-radius: var(--ag-card-radius);\n box-shadow: var(--ag-card-shadow);\n padding: 0;\n background-color: var(--ag-control-panel-background-color);\n}\n\n.ag-popup-editor .ag-large-text,\n.ag-autocomplete-list-popup {\n border: var(--ag-borders) var(--ag-border-color);\n background: var(--ag-background-color);\n border-radius: var(--ag-card-radius);\n box-shadow: var(--ag-card-shadow);\n padding: var(--ag-grid-size);\n background-color: var(--ag-control-panel-background-color);\n padding: 0;\n}\n\n.ag-large-text-input {\n height: auto;\n padding: var(--ag-cell-horizontal-padding);\n}\n\n.ag-rtl .ag-large-text-input textarea {\n resize: none;\n}\n\n.ag-details-row {\n padding: calc(var(--ag-grid-size) * 5);\n background-color: var(--ag-background-color);\n}\n\n.ag-layout-auto-height .ag-center-cols-viewport,\n.ag-layout-auto-height .ag-center-cols-container,\n.ag-layout-print .ag-center-cols-viewport,\n.ag-layout-print .ag-center-cols-container {\n min-height: 50px;\n}\n\n.ag-overlay-loading-wrapper {\n background-color: var(--ag-modal-overlay-background-color);\n}\n\n.ag-overlay-loading-center {\n border: var(--ag-borders) var(--ag-border-color);\n background: var(--ag-background-color);\n border-radius: var(--ag-card-radius);\n box-shadow: var(--ag-card-shadow);\n padding: var(--ag-grid-size);\n}\n\n.ag-skeleton-container {\n width: 100%;\n height: 100%;\n align-content: center;\n}\n\n.ag-skeleton-effect {\n background-color: var(--ag-row-loading-skeleton-effect-color);\n width: 100%;\n height: 1em;\n border-radius: 0.25rem;\n animation: ag-skeleton-loading 1.5s ease-in-out 0.5s infinite;\n}\n\n@keyframes ag-skeleton-loading {\n 0% {\n opacity: 1;\n }\n 50% {\n opacity: 0.4;\n }\n 100% {\n opacity: 1;\n }\n}\n.ag-loading {\n display: flex;\n height: 100%;\n align-items: center;\n}\n.ag-ltr .ag-loading {\n padding-left: var(--ag-cell-horizontal-padding);\n}\n.ag-rtl .ag-loading {\n padding-right: var(--ag-cell-horizontal-padding);\n}\n\n.ag-ltr .ag-loading-icon {\n padding-right: var(--ag-cell-widget-spacing);\n}\n.ag-rtl .ag-loading-icon {\n padding-left: var(--ag-cell-widget-spacing);\n}\n\n.ag-icon-loading {\n animation-name: spin;\n animation-duration: 1000ms;\n animation-iteration-count: infinite;\n animation-timing-function: linear;\n}\n\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n.ag-floating-top {\n border-bottom: var(--ag-borders-critical) var(--ag-border-color);\n}\n\n.ag-floating-bottom {\n border-top: var(--ag-borders-critical) var(--ag-border-color);\n}\n\n.ag-ltr .ag-cell {\n border-right: var(--ag-cell-horizontal-border);\n}\n.ag-rtl .ag-cell {\n border-left: var(--ag-cell-horizontal-border);\n}\n.ag-ltr .ag-cell {\n border-right-width: 1px;\n}\n.ag-rtl .ag-cell {\n border-left-width: 1px;\n}\n\n.ag-cell.ag-cell-first-right-pinned:not(.ag-cell-range-left):not(.ag-cell-range-single-cell) {\n border-left: var(--ag-borders-critical) var(--ag-border-color);\n}\n\n.ag-cell.ag-cell-last-left-pinned:not(.ag-cell-range-right):not(.ag-cell-range-single-cell) {\n border-right: var(--ag-borders-critical) var(--ag-border-color);\n}\n\n.ag-cell-range-selected:not(.ag-cell-focus),\n.ag-cell-range-selected.ag-cell-range-chart,\n.ag-body-viewport:not(.ag-has-focus) .ag-cell-range-single-cell:not(.ag-cell-inline-editing) {\n background-color: var(--ag-range-selection-background-color);\n}\n.ag-cell-range-selected:not(.ag-cell-focus).ag-cell-range-chart,\n.ag-cell-range-selected.ag-cell-range-chart.ag-cell-range-chart,\n.ag-body-viewport:not(.ag-has-focus) .ag-cell-range-single-cell:not(.ag-cell-inline-editing).ag-cell-range-chart {\n background-color: var(--ag-range-selection-chart-background-color) !important;\n}\n.ag-cell-range-selected:not(.ag-cell-focus).ag-cell-range-chart.ag-cell-range-chart-category,\n.ag-cell-range-selected.ag-cell-range-chart.ag-cell-range-chart.ag-cell-range-chart-category,\n.ag-body-viewport:not(.ag-has-focus) .ag-cell-range-single-cell:not(.ag-cell-inline-editing).ag-cell-range-chart.ag-cell-range-chart-category {\n background-color: var(--ag-range-selection-chart-category-background-color) !important;\n}\n\n.ag-cell-range-selected-1:not(.ag-cell-focus),\n.ag-cell-range-selected-1.ag-cell-range-chart,\n.ag-root:not(.ag-context-menu-open) .ag-body-viewport:not(.ag-has-focus) .ag-cell-range-selected-1:not(.ag-cell-inline-editing) {\n background-color: var(--ag-range-selection-background-color);\n}\n\n.ag-cell-range-selected-2:not(.ag-cell-focus),\n.ag-cell-range-selected-2.ag-cell-range-chart,\n.ag-body-viewport:not(.ag-has-focus) .ag-cell-range-selected-2 {\n background-color: var(--ag-range-selection-background-color-2);\n}\n\n.ag-cell-range-selected-3:not(.ag-cell-focus),\n.ag-cell-range-selected-3.ag-cell-range-chart,\n.ag-body-viewport:not(.ag-has-focus) .ag-cell-range-selected-3 {\n background-color: var(--ag-range-selection-background-color-3);\n}\n\n.ag-cell-range-selected-4:not(.ag-cell-focus),\n.ag-cell-range-selected-4.ag-cell-range-chart,\n.ag-body-viewport:not(.ag-has-focus) .ag-cell-range-selected-4 {\n background-color: var(--ag-range-selection-background-color-4);\n}\n\n.ag-cell.ag-cell-range-selected:not(.ag-cell-range-single-cell).ag-cell-range-top {\n border-top-color: var(--ag-range-selection-border-color);\n border-top-style: var(--ag-range-selection-border-style);\n}\n.ag-cell.ag-cell-range-selected:not(.ag-cell-range-single-cell).ag-cell-range-right {\n border-right-color: var(--ag-range-selection-border-color);\n border-right-style: var(--ag-range-selection-border-style);\n}\n.ag-cell.ag-cell-range-selected:not(.ag-cell-range-single-cell).ag-cell-range-bottom {\n border-bottom-color: var(--ag-range-selection-border-color);\n border-bottom-style: var(--ag-range-selection-border-style);\n}\n.ag-cell.ag-cell-range-selected:not(.ag-cell-range-single-cell).ag-cell-range-left {\n border-left-color: var(--ag-range-selection-border-color);\n border-left-style: var(--ag-range-selection-border-style);\n}\n\n.ag-ltr .ag-cell-focus:not(.ag-cell-range-selected):focus-within,\n.ag-ltr .ag-context-menu-open .ag-cell-focus:not(.ag-cell-range-selected),\n.ag-ltr .ag-full-width-row.ag-row-focus:focus .ag-cell-wrapper.ag-row-group,\n.ag-ltr .ag-cell-range-single-cell,\n.ag-ltr .ag-cell-range-single-cell.ag-cell-range-handle,\n.ag-rtl .ag-cell-focus:not(.ag-cell-range-selected):focus-within,\n.ag-rtl .ag-context-menu-open .ag-cell-focus:not(.ag-cell-range-selected),\n.ag-rtl .ag-full-width-row.ag-row-focus:focus .ag-cell-wrapper.ag-row-group,\n.ag-rtl .ag-cell-range-single-cell,\n.ag-rtl .ag-cell-range-single-cell.ag-cell-range-handle {\n border: 1px solid;\n border-color: var(--ag-range-selection-border-color);\n border-style: var(--ag-range-selection-border-style);\n outline: initial;\n}\n\n.ag-cell.ag-selection-fill-top,\n.ag-cell.ag-selection-fill-top.ag-cell-range-selected {\n border-top: 1px dashed;\n border-top-color: var(--ag-range-selection-border-color);\n}\n\n.ag-ltr .ag-cell.ag-selection-fill-right,\n.ag-ltr .ag-cell.ag-selection-fill-right.ag-cell-range-selected {\n border-right: 1px dashed var(--ag-range-selection-border-color) !important;\n}\n.ag-rtl .ag-cell.ag-selection-fill-right,\n.ag-rtl .ag-cell.ag-selection-fill-right.ag-cell-range-selected {\n border-left: 1px dashed var(--ag-range-selection-border-color) !important;\n}\n\n.ag-cell.ag-selection-fill-bottom,\n.ag-cell.ag-selection-fill-bottom.ag-cell-range-selected {\n border-bottom: 1px dashed;\n border-bottom-color: var(--ag-range-selection-border-color);\n}\n\n.ag-ltr .ag-cell.ag-selection-fill-left,\n.ag-ltr .ag-cell.ag-selection-fill-left.ag-cell-range-selected {\n border-left: 1px dashed var(--ag-range-selection-border-color) !important;\n}\n.ag-rtl .ag-cell.ag-selection-fill-left,\n.ag-rtl .ag-cell.ag-selection-fill-left.ag-cell-range-selected {\n border-right: 1px dashed var(--ag-range-selection-border-color) !important;\n}\n\n.ag-fill-handle,\n.ag-range-handle {\n position: absolute;\n width: 6px;\n height: 6px;\n bottom: -1px;\n background-color: var(--ag-range-selection-border-color);\n}\n.ag-ltr .ag-fill-handle,\n.ag-ltr .ag-range-handle {\n right: -1px;\n}\n.ag-rtl .ag-fill-handle,\n.ag-rtl .ag-range-handle {\n left: -1px;\n}\n\n.ag-fill-handle {\n cursor: cell;\n}\n\n.ag-range-handle {\n cursor: nwse-resize;\n}\n\n.ag-cell-inline-editing {\n border-color: var(--ag-input-focus-border-color) !important;\n}\n\n.ag-menu {\n border: var(--ag-borders) var(--ag-border-color);\n background: var(--ag-background-color);\n border-radius: var(--ag-card-radius);\n box-shadow: var(--ag-card-shadow);\n padding: var(--ag-grid-size);\n background-color: var(--ag-menu-background-color);\n border-color: var(--ag-menu-border-color);\n padding: 0;\n}\n\n.ag-menu.ag-tabs {\n min-width: var(--ag-tab-min-width);\n}\n\n.ag-menu-list {\n cursor: default;\n padding: var(--ag-grid-size) 0;\n}\n\n.ag-menu-separator {\n height: calc(var(--ag-grid-size) * 2 + 1px);\n}\n\n.ag-menu-separator-part::after {\n content: \"\";\n display: block;\n border-top: var(--ag-borders-critical) var(--ag-border-color);\n}\n\n.ag-menu-option-active,\n.ag-compact-menu-option-active {\n background-color: var(--ag-row-hover-color);\n}\n\n.ag-menu-option-part,\n.ag-compact-menu-option-part {\n line-height: var(--ag-icon-size);\n padding: calc(var(--ag-grid-size) + 2px) 0;\n}\n\n.ag-menu-option-disabled,\n.ag-compact-menu-option-disabled {\n opacity: 0.5;\n}\n\n.ag-menu-option-icon,\n.ag-compact-menu-option-icon {\n width: var(--ag-icon-size);\n}\n.ag-ltr .ag-menu-option-icon,\n.ag-ltr .ag-compact-menu-option-icon {\n padding-left: calc(var(--ag-grid-size) * 2);\n}\n.ag-rtl .ag-menu-option-icon,\n.ag-rtl .ag-compact-menu-option-icon {\n padding-right: calc(var(--ag-grid-size) * 2);\n}\n\n.ag-menu-option-text,\n.ag-compact-menu-option-text {\n padding-left: calc(var(--ag-grid-size) * 2);\n padding-right: calc(var(--ag-grid-size) * 2);\n}\n\n.ag-ltr .ag-menu-option-shortcut,\n.ag-ltr .ag-compact-menu-option-shortcut {\n padding-right: var(--ag-grid-size);\n}\n.ag-rtl .ag-menu-option-shortcut,\n.ag-rtl .ag-compact-menu-option-shortcut {\n padding-left: var(--ag-grid-size);\n}\n\n.ag-ltr .ag-menu-option-popup-pointer,\n.ag-ltr .ag-compact-menu-option-popup-pointer {\n padding-right: var(--ag-grid-size);\n}\n.ag-rtl .ag-menu-option-popup-pointer,\n.ag-rtl .ag-compact-menu-option-popup-pointer {\n padding-left: var(--ag-grid-size);\n}\n\n.ag-tabs-header {\n display: flex;\n}\n\n.ag-tabs-header-wrapper {\n display: flex;\n}\n.ag-tabs-header-wrapper .ag-tabs-header {\n flex: 1;\n}\n\n.ag-tabs-close-button-wrapper {\n border: 0;\n border-right: var(--ag-borders) var(--ag-border-color);\n padding: var(--ag-grid-size);\n}\n\n.ag-tabs-close-button {\n border: 0;\n background-color: unset;\n cursor: pointer;\n padding: 0;\n}\n\n.ag-tab {\n border-bottom: var(--ag-selected-tab-underline-width) solid transparent;\n transition: border-bottom var(--ag-selected-tab-underline-transition-speed);\n display: flex;\n flex: none;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n}\n\n.ag-tab:focus-visible {\n outline: none;\n}\n.ag-tab:focus-visible::after {\n content: \"\";\n position: absolute;\n background-color: transparent;\n pointer-events: none;\n top: 4px;\n left: 4px;\n display: block;\n width: calc(100% - 8px);\n height: calc(100% - 8px);\n border: 1px solid;\n border-color: var(--ag-input-focus-border-color);\n}\n\n.ag-tab-selected {\n border-bottom-color: var(--ag-selected-tab-underline-color);\n}\n\n.ag-menu-header {\n color: var(--ag-secondary-foreground-color);\n}\n\n.ag-filter-separator {\n border-top: var(--ag-borders-critical) var(--ag-border-color);\n}\n\n.ag-filter-select .ag-picker-field-wrapper {\n width: 0;\n}\n\n.ag-filter-condition-operator {\n height: 17px;\n}\n\n.ag-ltr .ag-filter-condition-operator-or {\n margin-left: calc(var(--ag-grid-size) * 2);\n}\n.ag-rtl .ag-filter-condition-operator-or {\n margin-right: calc(var(--ag-grid-size) * 2);\n}\n\n.ag-set-filter-select-all {\n padding-top: var(--ag-widget-container-vertical-padding);\n}\n\n.ag-set-filter-list,\n.ag-filter-no-matches {\n height: calc(var(--ag-list-item-height) * 6);\n}\n\n.ag-set-filter-tree-list {\n height: calc(var(--ag-list-item-height) * 10);\n}\n\n.ag-set-filter-filter {\n margin-top: var(--ag-widget-container-vertical-padding);\n margin-left: var(--ag-widget-container-horizontal-padding);\n margin-right: var(--ag-widget-container-horizontal-padding);\n}\n\n.ag-filter-to {\n margin-top: var(--ag-widget-vertical-spacing);\n}\n\n.ag-mini-filter {\n margin: var(--ag-widget-container-vertical-padding) var(--ag-widget-container-horizontal-padding);\n}\n\n.ag-set-filter {\n --ag-indentation-level: 0;\n}\n\n.ag-ltr .ag-set-filter-item {\n padding-left: calc(var(--ag-widget-container-horizontal-padding) + var(--ag-indentation-level) * var(--ag-set-filter-indent-size));\n}\n.ag-rtl .ag-set-filter-item {\n padding-right: calc(var(--ag-widget-container-horizontal-padding) + var(--ag-indentation-level) * var(--ag-set-filter-indent-size));\n}\n\n.ag-ltr .ag-set-filter-add-group-indent {\n margin-left: calc(var(--ag-icon-size) + var(--ag-widget-container-horizontal-padding));\n}\n.ag-rtl .ag-set-filter-add-group-indent {\n margin-right: calc(var(--ag-icon-size) + var(--ag-widget-container-horizontal-padding));\n}\n\n.ag-ltr .ag-set-filter-group-icons {\n margin-right: var(--ag-widget-container-horizontal-padding);\n}\n.ag-rtl .ag-set-filter-group-icons {\n margin-left: var(--ag-widget-container-horizontal-padding);\n}\n\n.ag-filter-menu .ag-set-filter-list {\n min-width: 200px;\n}\n\n.ag-filter-virtual-list-item:focus-visible {\n outline: none;\n}\n.ag-filter-virtual-list-item:focus-visible::after {\n content: \"\";\n position: absolute;\n background-color: transparent;\n pointer-events: none;\n top: 1px;\n left: 1px;\n display: block;\n width: calc(100% - 2px);\n height: calc(100% - 2px);\n border: 1px solid;\n border-color: var(--ag-input-focus-border-color);\n}\n\n.ag-filter-apply-panel {\n padding: var(--ag-widget-container-vertical-padding) var(--ag-widget-container-horizontal-padding);\n border-top: var(--ag-borders-secondary) var(--ag-secondary-border-color);\n}\n\n.ag-filter-apply-panel-button {\n line-height: 1.5;\n}\n.ag-ltr .ag-filter-apply-panel-button {\n margin-left: calc(var(--ag-grid-size) * 2);\n}\n.ag-rtl .ag-filter-apply-panel-button {\n margin-right: calc(var(--ag-grid-size) * 2);\n}\n\n.ag-simple-filter-body-wrapper {\n padding: var(--ag-widget-container-vertical-padding) var(--ag-widget-container-horizontal-padding);\n padding-bottom: calc(var(--ag-widget-container-vertical-padding) - var(--ag-widget-vertical-spacing));\n overflow-y: auto;\n min-height: calc(var(--ag-list-item-height) + var(--ag-widget-container-vertical-padding) + var(--ag-widget-vertical-spacing));\n}\n.ag-simple-filter-body-wrapper > * {\n margin-bottom: var(--ag-widget-vertical-spacing);\n}\n.ag-simple-filter-body-wrapper .ag-resizer-wrapper {\n margin: 0;\n}\n\n.ag-menu:not(.ag-tabs) .ag-filter .ag-filter-body-wrapper,\n.ag-menu:not(.ag-tabs) .ag-filter > *:not(.ag-filter-wrapper) {\n min-width: calc(var(--ag-menu-min-width) - 2px);\n}\n\n.ag-filter-no-matches {\n padding: var(--ag-widget-container-vertical-padding) var(--ag-widget-container-horizontal-padding);\n}\n\n.ag-multi-filter-menu-item {\n margin: var(--ag-grid-size) 0;\n}\n\n.ag-multi-filter-group-title-bar {\n padding: calc(var(--ag-grid-size) * 2) var(--ag-grid-size);\n background-color: transparent;\n}\n\n.ag-group-filter-field-select-wrapper {\n padding: var(--ag-widget-container-vertical-padding) var(--ag-widget-container-horizontal-padding);\n padding-bottom: calc(var(--ag-widget-container-vertical-padding) - var(--ag-widget-vertical-spacing));\n}\n.ag-group-filter-field-select-wrapper > * {\n margin-bottom: var(--ag-widget-vertical-spacing);\n}\n\n.ag-multi-filter-group-title-bar:focus-visible {\n outline: none;\n}\n.ag-multi-filter-group-title-bar:focus-visible::after {\n content: \"\";\n position: absolute;\n background-color: transparent;\n pointer-events: none;\n top: 4px;\n left: 4px;\n display: block;\n width: calc(100% - 8px);\n height: calc(100% - 8px);\n border: 1px solid;\n border-color: var(--ag-input-focus-border-color);\n}\n\n.ag-side-bar {\n position: relative;\n}\n\n.ag-tool-panel-wrapper {\n width: var(--ag-side-bar-panel-width);\n background-color: var(--ag-control-panel-background-color);\n}\n\n.ag-side-buttons {\n padding-top: calc(var(--ag-grid-size) * 4);\n width: calc(var(--ag-icon-size) + 4px);\n position: relative;\n overflow: hidden;\n}\n\nbutton.ag-side-button-button {\n color: inherit;\n font-family: inherit;\n font-size: inherit;\n font-weight: inherit;\n line-height: inherit;\n background: transparent;\n padding: calc(var(--ag-grid-size) * 2) 0 calc(var(--ag-grid-size) * 2) 0;\n width: 100%;\n margin: 0;\n min-height: calc(var(--ag-grid-size) * 18);\n background-position-y: center;\n background-position-x: center;\n background-repeat: no-repeat;\n border: none;\n border-top: var(--ag-borders-side-button) var(--ag-border-color);\n border-bottom: var(--ag-borders-side-button) var(--ag-border-color);\n}\nbutton.ag-side-button-button:focus {\n box-shadow: none;\n}\n\n.ag-side-button-button:focus-visible {\n outline: none;\n}\n.ag-side-button-button:focus-visible::after {\n content: \"\";\n position: absolute;\n background-color: transparent;\n pointer-events: none;\n top: 4px;\n left: 4px;\n display: block;\n width: calc(100% - 8px);\n height: calc(100% - 8px);\n border: 1px solid;\n border-color: var(--ag-input-focus-border-color);\n}\n\n.ag-selected button.ag-side-button-button {\n background-color: var(--ag-side-button-selected-background-color);\n}\n\n.ag-side-button-icon-wrapper {\n margin-bottom: 3px;\n}\n\n.ag-ltr .ag-side-bar-left,\n.ag-rtl .ag-side-bar-right {\n border-right: var(--ag-borders) var(--ag-border-color);\n}\n.ag-ltr .ag-side-bar-left .ag-tool-panel-wrapper,\n.ag-rtl .ag-side-bar-right .ag-tool-panel-wrapper {\n border-left: var(--ag-borders) var(--ag-border-color);\n}\n.ag-ltr .ag-side-bar-left .ag-side-button-button,\n.ag-rtl .ag-side-bar-right .ag-side-button-button {\n border-right: var(--ag-selected-tab-underline-width) solid transparent;\n transition: border-right var(--ag-selected-tab-underline-transition-speed);\n}\n.ag-ltr .ag-side-bar-left .ag-selected .ag-side-button-button,\n.ag-rtl .ag-side-bar-right .ag-selected .ag-side-button-button {\n border-right-color: var(--ag-selected-tab-underline-color);\n}\n\n.ag-rtl .ag-side-bar-left,\n.ag-ltr .ag-side-bar-right {\n border-left: var(--ag-borders) var(--ag-border-color);\n}\n.ag-rtl .ag-side-bar-left .ag-tool-panel-wrapper,\n.ag-ltr .ag-side-bar-right .ag-tool-panel-wrapper {\n border-right: var(--ag-borders) var(--ag-border-color);\n}\n.ag-rtl .ag-side-bar-left .ag-side-button-button,\n.ag-ltr .ag-side-bar-right .ag-side-button-button {\n border-left: var(--ag-selected-tab-underline-width) solid transparent;\n transition: border-left var(--ag-selected-tab-underline-transition-speed);\n}\n.ag-rtl .ag-side-bar-left .ag-selected .ag-side-button-button,\n.ag-ltr .ag-side-bar-right .ag-selected .ag-side-button-button {\n border-left-color: var(--ag-selected-tab-underline-color);\n}\n\n.ag-filter-toolpanel-header {\n height: calc(var(--ag-grid-size) * 6);\n}\n\n.ag-filter-toolpanel-header,\n.ag-filter-toolpanel-search {\n padding: 0 var(--ag-grid-size);\n}\n\n.ag-filter-toolpanel-header:focus-visible {\n outline: none;\n}\n.ag-filter-toolpanel-header:focus-visible::after {\n content: \"\";\n position: absolute;\n background-color: transparent;\n pointer-events: none;\n top: 4px;\n left: 4px;\n display: block;\n width: calc(100% - 8px);\n height: calc(100% - 8px);\n border: 1px solid;\n border-color: var(--ag-input-focus-border-color);\n}\n\n.ag-filter-toolpanel-group:not(.ag-has-filter) > .ag-group-title-bar .ag-filter-toolpanel-group-instance-header-icon {\n display: none;\n}\n\n.ag-filter-toolpanel-group-level-0-header {\n height: calc(var(--ag-grid-size) * 8);\n}\n\n.ag-filter-toolpanel-group-item {\n margin-top: calc(var(--ag-grid-size) * 0.5);\n margin-bottom: calc(var(--ag-grid-size) * 0.5);\n}\n\n.ag-filter-toolpanel-search {\n height: var(--ag-header-height);\n}\n\n.ag-filter-toolpanel-search-input {\n flex-grow: 1;\n height: calc(var(--ag-grid-size) * 4);\n}\n.ag-ltr .ag-filter-toolpanel-search-input {\n margin-right: var(--ag-grid-size);\n}\n.ag-rtl .ag-filter-toolpanel-search-input {\n margin-left: var(--ag-grid-size);\n}\n\n.ag-filter-toolpanel-group-level-0 {\n border-top: var(--ag-borders-secondary) var(--ag-secondary-border-color);\n}\n\n.ag-ltr .ag-filter-toolpanel-expand,\n.ag-ltr .ag-filter-toolpanel-group-title-bar-icon {\n margin-right: var(--ag-grid-size);\n}\n.ag-rtl .ag-filter-toolpanel-expand,\n.ag-rtl .ag-filter-toolpanel-group-title-bar-icon {\n margin-left: var(--ag-grid-size);\n}\n\n.ag-filter-toolpanel-group-title-bar {\n background-color: transparent;\n}\n\n.ag-ltr .ag-filter-toolpanel-header {\n padding-left: calc(var(--ag-filter-tool-panel-group-indent) * var(--ag-indentation-level, 0) + var(--ag-grid-size));\n}\n.ag-rtl .ag-filter-toolpanel-header {\n padding-right: calc(var(--ag-filter-tool-panel-group-indent) * var(--ag-indentation-level, 0) + var(--ag-grid-size));\n}\n\n.ag-filter-toolpanel-instance-filter {\n border-bottom: var(--ag-borders) var(--ag-border-color);\n border-top: var(--ag-borders) var(--ag-border-color);\n margin-top: var(--ag-grid-size);\n}\n\n.ag-ltr .ag-filter-toolpanel-group-instance-header-icon,\n.ag-ltr .ag-filter-toolpanel-instance-header-icon {\n margin-left: var(--ag-grid-size);\n}\n.ag-rtl .ag-filter-toolpanel-group-instance-header-icon,\n.ag-rtl .ag-filter-toolpanel-instance-header-icon {\n margin-right: var(--ag-grid-size);\n}\n\n.ag-set-filter-group-icons {\n color: var(--ag-secondary-foreground-color);\n}\n\n.ag-pivot-mode-panel {\n min-height: var(--ag-header-height);\n height: var(--ag-header-height);\n display: flex;\n}\n\n.ag-pivot-mode-select {\n display: flex;\n align-items: center;\n}\n.ag-ltr .ag-pivot-mode-select {\n margin-left: var(--ag-widget-container-horizontal-padding);\n}\n.ag-rtl .ag-pivot-mode-select {\n margin-right: var(--ag-widget-container-horizontal-padding);\n}\n\n.ag-column-select-header:focus-visible {\n outline: none;\n}\n.ag-column-select-header:focus-visible::after {\n content: \"\";\n position: absolute;\n background-color: transparent;\n pointer-events: none;\n top: 4px;\n left: 4px;\n display: block;\n width: calc(100% - 8px);\n height: calc(100% - 8px);\n border: 1px solid;\n border-color: var(--ag-input-focus-border-color);\n}\n\n.ag-column-select-header {\n height: var(--ag-header-height);\n align-items: center;\n padding: 0 var(--ag-widget-container-horizontal-padding);\n border-bottom: var(--ag-borders-secondary) var(--ag-secondary-border-color);\n}\n\n.ag-column-panel-column-select {\n border-bottom: var(--ag-borders-secondary) var(--ag-secondary-border-color);\n border-top: var(--ag-borders-secondary) var(--ag-secondary-border-color);\n}\n\n.ag-column-group-icons,\n.ag-column-select-header-icon {\n color: var(--ag-secondary-foreground-color);\n}\n\n.ag-column-select-list .ag-list-item-hovered::after {\n content: \"\";\n position: absolute;\n left: 0;\n right: 0;\n height: 1px;\n}\n.ag-column-select-list .ag-item-highlight-top::after {\n top: 0;\n}\n.ag-column-select-list .ag-item-highlight-bottom::after {\n bottom: 0;\n}\n\n.ag-header,\n.ag-advanced-filter-header {\n background-color: var(--ag-header-background-color);\n border-bottom: var(--ag-borders-critical) var(--ag-border-color);\n}\n\n.ag-header-row {\n color: var(--ag-header-foreground-color);\n height: var(--ag-header-height);\n}\n\n.ag-pinned-right-header {\n border-left: var(--ag-borders-critical) var(--ag-border-color);\n}\n\n.ag-pinned-left-header {\n border-right: var(--ag-borders-critical) var(--ag-border-color);\n}\n\n.ag-ltr .ag-header-cell:not(.ag-right-aligned-header) .ag-header-label-icon,\n.ag-ltr .ag-header-cell:not(.ag-right-aligned-header) .ag-header-menu-icon {\n margin-left: var(--ag-grid-size);\n}\n.ag-rtl .ag-header-cell:not(.ag-right-aligned-header) .ag-header-label-icon,\n.ag-rtl .ag-header-cell:not(.ag-right-aligned-header) .ag-header-menu-icon {\n margin-right: var(--ag-grid-size);\n}\n\n.ag-ltr .ag-header-cell.ag-right-aligned-header .ag-header-label-icon,\n.ag-ltr .ag-header-cell.ag-right-aligned-header .ag-header-menu-icon {\n margin-right: var(--ag-grid-size);\n}\n.ag-rtl .ag-header-cell.ag-right-aligned-header .ag-header-label-icon,\n.ag-rtl .ag-header-cell.ag-right-aligned-header .ag-header-menu-icon {\n margin-left: var(--ag-grid-size);\n}\n\n.ag-header-cell,\n.ag-header-group-cell {\n padding-left: var(--ag-cell-horizontal-padding);\n padding-right: var(--ag-cell-horizontal-padding);\n}\n.ag-header-cell.ag-header-cell-moving,\n.ag-header-group-cell.ag-header-cell-moving {\n background-color: var(--ag-header-cell-moving-background-color);\n}\n\n.ag-ltr .ag-header-group-cell-label.ag-sticky-label {\n left: var(--ag-cell-horizontal-padding);\n}\n.ag-rtl .ag-header-group-cell-label.ag-sticky-label {\n right: var(--ag-cell-horizontal-padding);\n}\n\n.ag-header-cell:focus-visible {\n outline: none;\n}\n.ag-header-cell:focus-visible::after {\n content: \"\";\n position: absolute;\n background-color: transparent;\n pointer-events: none;\n top: 4px;\n left: 4px;\n display: block;\n width: calc(100% - 8px);\n height: calc(100% - 8px);\n border: 1px solid;\n border-color: var(--ag-input-focus-border-color);\n}\n\n.ag-header-group-cell:focus-visible {\n outline: none;\n}\n.ag-header-group-cell:focus-visible::after {\n content: \"\";\n position: absolute;\n background-color: transparent;\n pointer-events: none;\n top: 4px;\n left: 4px;\n display: block;\n width: calc(100% - 8px);\n height: calc(100% - 8px);\n border: 1px solid;\n border-color: var(--ag-input-focus-border-color);\n}\n\n.ag-advanced-filter-header-cell:focus-visible {\n outline: none;\n}\n.ag-advanced-filter-header-cell:focus-visible::after {\n content: \"\";\n position: absolute;\n background-color: transparent;\n pointer-events: none;\n top: 4px;\n left: 4px;\n display: block;\n width: calc(100% - 8px);\n height: calc(100% - 8px);\n border: 1px solid;\n border-color: var(--ag-input-focus-border-color);\n}\n\n.ag-header-icon {\n color: var(--ag-secondary-foreground-color);\n}\n\n.ag-header-expand-icon {\n cursor: pointer;\n}\n.ag-ltr .ag-header-expand-icon {\n margin-left: 4px;\n}\n.ag-rtl .ag-header-expand-icon {\n margin-right: 4px;\n}\n\n.ag-header-row:not(:first-child) .ag-header-cell:not(.ag-header-span-height.ag-header-span-total, .ag-header-parent-hidden),\n.ag-header-row:not(:first-child) .ag-header-group-cell.ag-header-group-cell-with-group {\n border-top: var(--ag-borders-critical) var(--ag-border-color);\n}\n\n.ag-header-group-cell:not(.ag-column-resizing) + .ag-header-group-cell:not(.ag-column-hover):not(.ag-header-cell-moving):hover, .ag-header-group-cell:not(.ag-column-resizing) + .ag-header-group-cell:not(.ag-column-hover).ag-column-resizing,\n.ag-header-cell:not(.ag-column-resizing) + .ag-header-cell:not(.ag-column-hover):not(.ag-header-cell-moving):hover,\n.ag-header-cell:not(.ag-column-resizing) + .ag-header-cell:not(.ag-column-hover).ag-column-resizing,\n.ag-header-group-cell:first-of-type:not(.ag-header-cell-moving):hover,\n.ag-header-group-cell:first-of-type.ag-column-resizing,\n.ag-header-cell:not(.ag-column-hover):first-of-type:not(.ag-header-cell-moving):hover,\n.ag-header-cell:not(.ag-column-hover):first-of-type.ag-column-resizing {\n background-color: var(--ag-header-cell-hover-background-color);\n}\n\n.ag-header-cell::before,\n.ag-header-group-cell:not(.ag-header-span-height.ag-header-group-cell-no-group)::before {\n content: \"\";\n position: absolute;\n z-index: 1;\n display: var(--ag-header-column-separator-display);\n width: var(--ag-header-column-separator-width);\n height: var(--ag-header-column-separator-height);\n top: calc(50% - var(--ag-header-column-separator-height) * 0.5);\n background-color: var(--ag-header-column-separator-color);\n}\n.ag-ltr .ag-header-cell::before,\n.ag-ltr .ag-header-group-cell:not(.ag-header-span-height.ag-header-group-cell-no-group)::before {\n right: 0;\n}\n.ag-rtl .ag-header-cell::before,\n.ag-rtl .ag-header-group-cell:not(.ag-header-span-height.ag-header-group-cell-no-group)::before {\n left: 0;\n}\n\n.ag-header-highlight-before::after,\n.ag-header-highlight-after::after {\n content: \"\";\n position: absolute;\n height: 100%;\n width: 1px;\n}\n\n.ag-header-highlight-before::after {\n left: 0px;\n}\n\n.ag-header-highlight-after::after {\n right: 0px;\n}\n\n.ag-pinned-left-header .ag-header-highlight-after::after {\n right: 1px;\n}\n\n.ag-header-cell-resize {\n display: flex;\n align-items: center;\n}\n\n.ag-header-cell-resize::after {\n content: \"\";\n position: absolute;\n z-index: 1;\n display: var(--ag-header-column-resize-handle-display);\n width: var(--ag-header-column-resize-handle-width);\n height: var(--ag-header-column-resize-handle-height);\n top: calc(50% - var(--ag-header-column-resize-handle-height) * 0.5);\n background-color: var(--ag-header-column-resize-handle-color);\n}\n.ag-header-cell.ag-header-span-height .ag-header-cell-resize::after {\n height: calc(100% - var(--ag-grid-size) * 4);\n top: calc(var(--ag-grid-size) * 2);\n}\n\n.ag-ltr .ag-header-viewport .ag-header-cell-resize::after {\n left: calc(50% - var(--ag-header-column-resize-handle-width));\n}\n.ag-rtl .ag-header-viewport .ag-header-cell-resize::after {\n right: calc(50% - var(--ag-header-column-resize-handle-width));\n}\n\n.ag-pinned-left-header .ag-header-cell-resize::after {\n left: calc(50% - var(--ag-header-column-resize-handle-width));\n}\n\n.ag-pinned-right-header .ag-header-cell-resize::after {\n left: 50%;\n}\n\n.ag-ltr .ag-header-select-all {\n margin-right: var(--ag-cell-horizontal-padding);\n}\n.ag-rtl .ag-header-select-all {\n margin-left: var(--ag-cell-horizontal-padding);\n}\n\n.ag-ltr .ag-floating-filter-button {\n margin-left: var(--ag-cell-widget-spacing);\n}\n.ag-rtl .ag-floating-filter-button {\n margin-right: var(--ag-cell-widget-spacing);\n}\n\n.ag-floating-filter-button-button {\n color: inherit;\n font-family: inherit;\n font-size: inherit;\n font-weight: inherit;\n line-height: inherit;\n appearance: none;\n background: transparent;\n border: none;\n height: var(--ag-icon-size);\n padding: 0;\n width: var(--ag-icon-size);\n}\n\n.ag-filter-loading {\n background-color: var(--ag-control-panel-background-color);\n height: 100%;\n padding: var(--ag-widget-container-vertical-padding) var(--ag-widget-container-horizontal-padding);\n position: absolute;\n width: 100%;\n z-index: 1;\n align-items: unset;\n}\n\n.ag-paging-panel {\n border-top: 1px solid;\n border-top-color: var(--ag-border-color);\n color: var(--ag-secondary-foreground-color);\n height: var(--ag-header-height);\n}\n.ag-paging-panel > * {\n margin: 0 var(--ag-cell-horizontal-padding);\n}\n.ag-paging-panel > .ag-paging-page-size .ag-wrapper {\n min-width: calc(var(--ag-grid-size) * 10);\n}\n\n.ag-paging-button {\n cursor: pointer;\n}\n\n.ag-paging-button.ag-disabled {\n cursor: default;\n color: var(--ag-disabled-foreground-color);\n}\n\n.ag-paging-button:focus-visible {\n outline: none;\n}\n.ag-paging-button:focus-visible::after {\n content: \"\";\n position: absolute;\n background-color: transparent;\n pointer-events: none;\n top: 0px;\n left: 0px;\n display: block;\n width: calc(100% - 0px);\n height: calc(100% - 0px);\n border: 1px solid;\n border-color: var(--ag-input-focus-border-color);\n}\n\n.ag-paging-button,\n.ag-paging-description {\n margin: 0 var(--ag-grid-size);\n}\n\n.ag-status-bar {\n border-top: var(--ag-borders) var(--ag-border-color);\n color: var(--ag-disabled-foreground-color);\n padding-right: calc(var(--ag-grid-size) * 4);\n padding-left: calc(var(--ag-grid-size) * 4);\n line-height: 1.5;\n}\n\n.ag-status-name-value-value {\n color: var(--ag-foreground-color);\n}\n\n.ag-status-bar-center {\n text-align: center;\n}\n\n.ag-status-name-value {\n margin-left: var(--ag-grid-size);\n margin-right: var(--ag-grid-size);\n padding-top: calc(var(--ag-grid-size) * 2);\n padding-bottom: calc(var(--ag-grid-size) * 2);\n}\n\n.ag-column-drop-cell {\n background: var(--ag-chip-background-color);\n border-radius: calc(var(--ag-grid-size) * 4);\n height: calc(var(--ag-grid-size) * 4);\n padding: 0 calc(var(--ag-grid-size) * 0.5);\n border: 1px solid var(--ag-chip-border-color);\n}\n\n.ag-column-drop-cell:focus-visible {\n outline: none;\n}\n.ag-column-drop-cell:focus-visible::after {\n content: \"\";\n position: absolute;\n background-color: transparent;\n pointer-events: none;\n top: 2px;\n left: 2px;\n display: block;\n width: calc(100% - 4px);\n height: calc(100% - 4px);\n border: 1px solid;\n border-color: var(--ag-input-focus-border-color);\n}\n\n.ag-column-drop-cell-text {\n margin: 0 var(--ag-grid-size);\n}\n\n.ag-column-drop-cell-button {\n min-width: calc(var(--ag-grid-size) * 4);\n margin: 0 calc(var(--ag-grid-size) * 0.5);\n color: var(--ag-secondary-foreground-color);\n}\n\n.ag-column-drop-cell-drag-handle {\n margin-left: calc(var(--ag-grid-size) * 2);\n}\n\n.ag-column-drop-cell-ghost {\n opacity: 0.5;\n}\n\n.ag-column-drop-horizontal {\n background-color: var(--ag-header-background-color);\n color: var(--ag-secondary-foreground-color);\n height: var(--ag-header-height);\n border-bottom: var(--ag-borders) var(--ag-border-color);\n}\n.ag-ltr .ag-column-drop-horizontal {\n padding-left: var(--ag-cell-horizontal-padding);\n}\n.ag-rtl .ag-column-drop-horizontal {\n padding-right: var(--ag-cell-horizontal-padding);\n}\n\n.ag-ltr .ag-column-drop-horizontal-half-width:not(:last-child) {\n border-right: var(--ag-borders) var(--ag-border-color);\n}\n.ag-rtl .ag-column-drop-horizontal-half-width:not(:last-child) {\n border-left: var(--ag-borders) var(--ag-border-color);\n}\n\n.ag-column-drop-horizontal-cell-separator {\n margin: 0 var(--ag-grid-size);\n color: var(--ag-secondary-foreground-color);\n}\n\n.ag-column-drop-horizontal-empty-message {\n color: var(--ag-disabled-foreground-color);\n}\n\n.ag-ltr .ag-column-drop-horizontal-icon {\n margin-right: var(--ag-cell-horizontal-padding);\n}\n.ag-rtl .ag-column-drop-horizontal-icon {\n margin-left: var(--ag-cell-horizontal-padding);\n}\n\n.ag-column-drop-vertical-list {\n padding-bottom: var(--ag-grid-size);\n padding-right: var(--ag-grid-size);\n padding-left: var(--ag-grid-size);\n}\n\n.ag-column-drop-vertical-cell {\n margin-top: var(--ag-grid-size);\n}\n\n.ag-column-drop-vertical {\n min-height: 50px;\n border-bottom: var(--ag-borders-secondary) var(--ag-secondary-border-color);\n}\n.ag-column-drop-vertical.ag-last-column-drop {\n border-bottom: none;\n}\n\n.ag-column-drop-vertical-icon {\n margin-left: var(--ag-grid-size);\n margin-right: var(--ag-grid-size);\n}\n\n.ag-column-drop-vertical-empty-message {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n overflow: hidden;\n color: var(--ag-disabled-foreground-color);\n margin-top: var(--ag-grid-size);\n}\n\n.ag-select-agg-func-popup {\n border: var(--ag-borders) var(--ag-border-color);\n background: var(--ag-background-color);\n border-radius: var(--ag-card-radius);\n box-shadow: var(--ag-card-shadow);\n padding: var(--ag-grid-size);\n background: var(--ag-background-color);\n height: calc(var(--ag-grid-size) * 5 * 3.5);\n padding: 0;\n}\n\n.ag-select-agg-func-virtual-list-item {\n cursor: default;\n}\n.ag-ltr .ag-select-agg-func-virtual-list-item {\n padding-left: calc(var(--ag-grid-size) * 2);\n}\n.ag-rtl .ag-select-agg-func-virtual-list-item {\n padding-right: calc(var(--ag-grid-size) * 2);\n}\n.ag-select-agg-func-virtual-list-item:hover {\n background-color: var(--ag-selected-row-background-color);\n}\n\n.ag-select-agg-func-virtual-list-item:focus-visible {\n outline: none;\n}\n.ag-select-agg-func-virtual-list-item:focus-visible::after {\n content: \"\";\n position: absolute;\n background-color: transparent;\n pointer-events: none;\n top: 1px;\n left: 1px;\n display: block;\n width: calc(100% - 2px);\n height: calc(100% - 2px);\n border: 1px solid;\n border-color: var(--ag-input-focus-border-color);\n}\n\n.ag-sort-indicator-container {\n display: flex;\n}\n\n.ag-ltr .ag-sort-indicator-icon {\n padding-left: var(--ag-grid-size);\n}\n.ag-rtl .ag-sort-indicator-icon {\n padding-right: var(--ag-grid-size);\n}\n\n.ag-chart {\n position: relative;\n display: flex;\n width: 100%;\n height: 100%;\n}\n\n.ag-chart-components-wrapper {\n position: relative;\n display: flex;\n flex: 1 1 auto;\n}\n\n.ag-chart-canvas-wrapper {\n position: relative;\n flex: 1 1 auto;\n}\n\n.ag-chart-menu {\n position: absolute;\n top: 16px;\n display: flex;\n flex-direction: column;\n}\n.ag-ltr .ag-chart-menu {\n right: 20px;\n}\n.ag-rtl .ag-chart-menu {\n left: 20px;\n}\n\n.ag-chart-docked-container {\n position: relative;\n min-width: var(--ag-chart-menu-panel-width);\n}\n\n.ag-chart-menu-hidden ~ .ag-chart-docked-container {\n display: none;\n}\n\n.ag-chart-tabbed-menu {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.ag-chart-tabbed-menu-header {\n flex: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n cursor: default;\n}\n\n.ag-chart-tabbed-menu-body {\n display: flex;\n flex: 1 1 auto;\n align-items: stretch;\n overflow: hidden;\n}\n\n.ag-chart-tab {\n width: 100%;\n overflow: hidden;\n overflow-y: auto;\n}\n\n.ag-chart-settings {\n overflow-x: hidden;\n}\n\n.ag-chart-settings-wrapper {\n position: relative;\n flex-direction: column;\n width: 100%;\n height: 100%;\n display: flex;\n overflow: hidden;\n}\n\n.ag-chart-settings-nav-bar {\n display: flex;\n align-items: center;\n width: 100%;\n height: 30px;\n padding: 0 10px;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.ag-chart-settings-card-selector {\n display: flex;\n align-items: center;\n justify-content: space-around;\n flex: 1 1 auto;\n height: 100%;\n padding: 0 10px;\n}\n\n.ag-chart-settings-card-item {\n cursor: pointer;\n width: 10px;\n height: 10px;\n background-color: #000;\n position: relative;\n}\n.ag-chart-settings-card-item.ag-not-selected {\n opacity: 0.2;\n}\n.ag-chart-settings-card-item::before {\n content: \" \";\n display: block;\n position: absolute;\n background-color: transparent;\n left: 50%;\n top: 50%;\n margin-left: -10px;\n margin-top: -10px;\n width: 20px;\n height: 20px;\n}\n\n.ag-chart-settings-prev,\n.ag-chart-settings-next {\n position: relative;\n flex: none;\n}\n.ag-chart-settings-prev:focus-within,\n.ag-chart-settings-next:focus-within {\n box-shadow: var(--ag-input-focus-box-shadow);\n border-radius: 1px;\n}\n\n.ag-chart-settings-prev-button,\n.ag-chart-settings-next-button {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n cursor: pointer;\n opacity: 0;\n}\n\n.ag-chart-settings-mini-charts-container {\n position: relative;\n flex: 1 1 auto;\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.ag-chart-settings-mini-wrapper {\n position: absolute;\n top: 0;\n left: 0;\n display: flex;\n flex-direction: column;\n width: 100%;\n min-height: 100%;\n overflow: hidden;\n}\n.ag-chart-settings-mini-wrapper.ag-animating {\n transition: left 0.3s;\n transition-timing-function: ease-in-out;\n}\n\n.ag-chart-mini-thumbnail {\n cursor: pointer;\n}\n\n.ag-chart-mini-thumbnail-canvas {\n display: block;\n}\n\n.ag-chart-data-wrapper,\n.ag-chart-format-wrapper,\n.ag-chart-advanced-settings-wrapper {\n display: flex;\n flex-direction: column;\n position: relative;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n padding-bottom: 16px;\n}\n\n.ag-chart-data-wrapper,\n.ag-chart-advanced-settings-wrapper {\n height: 100%;\n overflow-y: auto;\n}\n\n.ag-chart-advanced-settings {\n background-color: var(--ag-control-panel-background-color);\n}\n\n.ag-chart-advanced-settings-wrapper,\n.ag-chart-advanced-settings {\n width: 100%;\n}\n\n.ag-chart-advanced-settings-wrapper {\n padding-bottom: 0;\n}\n\n.ag-chart-data-section,\n.ag-chart-format-section,\n.ag-chart-advanced-settings-section {\n display: flex;\n margin: 0;\n}\n\n.ag-chart-advanced-settings-section {\n padding-top: var(--ag-grid-size);\n padding-bottom: var(--ag-grid-size);\n}\n.ag-chart-advanced-settings-section:not(:last-child) {\n border-bottom: 1px solid var(--ag-secondary-border-color);\n}\n\n.ag-chart-empty-text {\n display: flex;\n top: 0;\n width: 100%;\n height: 100%;\n align-items: center;\n justify-content: center;\n background-color: var(--ag-background-color);\n}\n\n.ag-chart .ag-chart-menu-wrapper .ag-chart-menu {\n display: flex;\n flex-direction: row;\n top: 8px;\n gap: 20px;\n width: auto;\n}\n.ag-ltr .ag-chart .ag-chart-menu-wrapper .ag-chart-menu {\n right: calc(var(--ag-cell-horizontal-padding) + var(--ag-grid-size) - 4px);\n justify-content: right;\n}\n.ag-rtl .ag-chart .ag-chart-menu-wrapper .ag-chart-menu {\n left: calc(var(--ag-cell-horizontal-padding) + var(--ag-grid-size) - 4px);\n justify-content: left;\n}\n\n.ag-charts-font-size-color {\n display: flex;\n align-self: stretch;\n justify-content: space-between;\n}\n\n.ag-charts-data-group-item {\n position: relative;\n}\n\n.ag-charts-data-group-item:not(:last-child) {\n margin-bottom: var(--ag-grid-size);\n}\n\n.ag-chart-menu {\n border-radius: var(--ag-card-radius);\n background: var(--ag-background-color);\n}\n\n.ag-chart-menu-icon {\n opacity: 0.5;\n margin: 2px 0;\n cursor: pointer;\n border-radius: var(--ag-card-radius);\n color: var(--ag-secondary-foreground-color);\n}\n.ag-chart-menu-icon:hover {\n opacity: 1;\n}\n\n.ag-chart-menu-toolbar-button {\n border: 0;\n background-color: unset;\n padding: 0 2px;\n border-radius: 1px;\n}\n\n.ag-chart-mini-thumbnail {\n border: 1px solid var(--ag-secondary-border-color);\n border-radius: 5px;\n}\n.ag-chart-mini-thumbnail.ag-selected {\n border-color: var(--ag-minichart-selected-chart-color);\n border-width: 2px;\n}\n.ag-chart-mini-thumbnail:focus-visible {\n outline: none;\n border-color: var(--ag-minichart-selected-chart-color);\n box-shadow: var(--ag-input-focus-box-shadow);\n}\n\n.ag-chart-settings-card-item {\n background: var(--ag-foreground-color);\n width: 8px;\n height: 8px;\n border-radius: 4px;\n}\n.ag-chart-settings-card-item.ag-selected {\n background-color: var(--ag-minichart-selected-page-color);\n}\n\n.ag-chart-data-column-drag-handle {\n margin-left: var(--ag-grid-size);\n}\n\n.ag-charts-settings-group-title-bar,\n.ag-charts-data-group-title-bar,\n.ag-charts-format-top-level-group-title-bar {\n border-top: var(--ag-borders-secondary) var(--ag-secondary-border-color);\n position: relative;\n}\n\n.ag-charts-advanced-settings-top-level-group-title-bar {\n position: relative;\n background-color: unset;\n}\n\n.ag-charts-data-group-title-bar:focus-visible {\n outline: none;\n}\n.ag-charts-data-group-title-bar:focus-visible::after {\n content: \"\";\n position: absolute;\n background-color: transparent;\n pointer-events: none;\n top: 4px;\n left: 4px;\n display: block;\n width: calc(100% - 8px);\n height: calc(100% - 8px);\n border: 1px solid;\n border-color: var(--ag-input-focus-border-color);\n}\n\n.ag-charts-format-top-level-group-title-bar:focus-visible {\n outline: none;\n}\n.ag-charts-format-top-level-group-title-bar:focus-visible::after {\n content: \"\";\n position: absolute;\n background-color: transparent;\n pointer-events: none;\n top: 4px;\n left: 4px;\n display: block;\n width: calc(100% - 8px);\n height: calc(100% - 8px);\n border: 1px solid;\n border-color: var(--ag-input-focus-border-color);\n}\n\n.ag-charts-data-group-title-bar .ag-charts-data-group-title,\n.ag-charts-format-top-level-group-title-bar .ag-charts-format-top-level-group-title {\n cursor: pointer;\n}\n\n.ag-charts-data-group-container {\n padding: calc(var(--ag-widget-container-vertical-padding) * 0.5) var(--ag-widget-container-horizontal-padding);\n}\n.ag-charts-data-group-container .ag-charts-data-group-item:not(.ag-charts-format-sub-level-group):not(.ag-pill-select):not(.ag-select) {\n height: var(--ag-list-item-height);\n}\n.ag-charts-data-group-container .ag-charts-data-group-item.ag-picker-field {\n margin-top: var(--ag-grid-size);\n}\n.ag-charts-data-group-container .ag-list-item-hovered::after {\n content: \"\";\n position: absolute;\n left: 0;\n right: 0;\n height: 1px;\n}\n.ag-charts-data-group-container .ag-item-highlight-top::after {\n top: 0;\n}\n.ag-charts-data-group-container .ag-item-highlight-bottom::after {\n bottom: 0;\n}\n\n.ag-charts-format-top-level-group-container,\n.ag-charts-advanced-settings-top-level-group-container {\n padding: var(--ag-grid-size);\n}\n.ag-ltr .ag-charts-format-top-level-group-container,\n.ag-ltr .ag-charts-advanced-settings-top-level-group-container {\n margin-left: calc(var(--ag-grid-size) * 2);\n}\n.ag-rtl .ag-charts-format-top-level-group-container,\n.ag-rtl .ag-charts-advanced-settings-top-level-group-container {\n margin-right: calc(var(--ag-grid-size) * 2);\n}\n\n.ag-charts-format-top-level-group-item,\n.ag-charts-advanced-settings-top-level-group-item {\n margin: var(--ag-grid-size) 0;\n}\n\n.ag-charts-format-sub-level-group-container {\n padding: var(--ag-widget-container-vertical-padding) var(--ag-widget-container-horizontal-padding);\n padding-bottom: calc(var(--ag-widget-container-vertical-padding) - var(--ag-widget-vertical-spacing));\n}\n.ag-charts-format-sub-level-group-container > * {\n margin-bottom: var(--ag-widget-vertical-spacing);\n}\n\n.ag-charts-format-sub-level-no-header-group-container > * {\n margin-bottom: var(--ag-widget-vertical-spacing);\n}\n\n.ag-charts-format-sub-level-group-container .ag-charts-format-sub-level-group-item.ag-font-panel-no-header {\n margin: 0;\n}\n\n.ag-charts-settings-group-container {\n padding: var(--ag-grid-size);\n row-gap: 8px;\n display: grid;\n grid-template-columns: 60px 1fr 60px 1fr 60px;\n}\n.ag-charts-settings-group-container .ag-chart-mini-thumbnail:nth-child(3n+1) {\n grid-column: 1;\n}\n.ag-charts-settings-group-container .ag-chart-mini-thumbnail:nth-child(3n+2) {\n grid-column: 3;\n}\n.ag-charts-settings-group-container .ag-chart-mini-thumbnail:nth-child(3n+3) {\n grid-column: 5;\n}\n\n.ag-chart-menu-panel {\n background-color: var(--ag-control-panel-background-color);\n}\n.ag-ltr .ag-chart-menu-panel {\n border-left: solid 1px var(--ag-border-color);\n}\n.ag-rtl .ag-chart-menu-panel {\n border-right: solid 1px var(--ag-border-color);\n}\n\n.ag-date-time-list-page-title-bar {\n display: flex;\n}\n\n.ag-date-time-list-page-title {\n flex-grow: 1;\n text-align: center;\n}\n\n.ag-date-time-list-page-column-labels-row,\n.ag-date-time-list-page-entries-row {\n display: flex;\n}\n\n.ag-date-time-list-page-column-label,\n.ag-date-time-list-page-entry {\n flex-basis: 0;\n flex-grow: 1;\n}\n\n.ag-date-time-list-page-entry {\n cursor: pointer;\n text-align: center;\n}\n\n.ag-date-time-list-page-column-label {\n text-align: center;\n}\n\n.ag-advanced-filter-header {\n position: relative;\n display: flex;\n align-items: center;\n padding-left: var(--ag-cell-horizontal-padding);\n padding-right: var(--ag-cell-horizontal-padding);\n}\n\n.ag-advanced-filter {\n display: flex;\n align-items: center;\n width: 100%;\n}\n\n.ag-advanced-filter-apply-button,\n.ag-advanced-filter-builder-button {\n line-height: normal;\n white-space: nowrap;\n}\n.ag-ltr .ag-advanced-filter-apply-button,\n.ag-ltr .ag-advanced-filter-builder-button {\n margin-left: calc(var(--ag-grid-size) * 2);\n}\n.ag-rtl .ag-advanced-filter-apply-button,\n.ag-rtl .ag-advanced-filter-builder-button {\n margin-right: calc(var(--ag-grid-size) * 2);\n}\n\n.ag-advanced-filter-builder-button {\n display: flex;\n align-items: center;\n border: 0;\n background-color: unset;\n color: var(--ag-foreground-color);\n font-size: var(--ag-font-size);\n font-weight: 600;\n}\n.ag-advanced-filter-builder-button:hover:not(:disabled) {\n background-color: var(--ag-row-hover-color);\n}\n.ag-advanced-filter-builder-button:not(:disabled) {\n cursor: pointer;\n}\n\n.ag-advanced-filter-builder-button-label {\n margin-left: var(--ag-grid-size);\n}\n\n.ag-advanced-filter-builder {\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n width: 100%;\n background-color: var(--ag-control-panel-background-color);\n display: flex;\n flex-direction: column;\n}\n\n.ag-advanced-filter-builder-list {\n flex: 1;\n overflow: auto;\n}\n.ag-advanced-filter-builder-list .ag-list-item-hovered::after {\n content: \"\";\n position: absolute;\n left: 0;\n right: 0;\n height: 1px;\n}\n.ag-advanced-filter-builder-list .ag-item-highlight-top::after {\n top: 0;\n}\n.ag-advanced-filter-builder-list .ag-item-highlight-bottom::after {\n bottom: 0;\n}\n\n.ag-advanced-filter-builder-button-panel {\n display: flex;\n justify-content: flex-end;\n padding: var(--ag-widget-container-vertical-padding) var(--ag-widget-container-horizontal-padding);\n border-top: var(--ag-borders-secondary) var(--ag-secondary-border-color);\n}\n\n.ag-advanced-filter-builder .ag-advanced-filter-builder-button-panel .ag-advanced-filter-builder-apply-button,\n.ag-advanced-filter-builder .ag-advanced-filter-builder-button-panel .ag-advanced-filter-builder-cancel-button {\n margin-left: calc(var(--ag-grid-size) * 2);\n}\n\n.ag-advanced-filter-builder-item-wrapper {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n justify-content: space-between;\n overflow: hidden;\n padding-left: calc(var(--ag-icon-size) / 2);\n padding-right: var(--ag-icon-size);\n}\n\n.ag-virtual-list-viewport .ag-advanced-filter-builder-item-wrapper .ag-tab-guard {\n position: absolute;\n}\n\n.ag-advanced-filter-builder-item-tree-lines > * {\n width: var(--ag-advanced-filter-builder-indent-size);\n}\n\n.ag-advanced-filter-builder-item-tree-lines .ag-advanced-filter-builder-item-tree-line-root {\n width: var(--ag-icon-size);\n}\n.ag-advanced-filter-builder-item-tree-lines .ag-advanced-filter-builder-item-tree-line-root::before {\n top: 50%;\n height: 50%;\n}\n\n.ag-advanced-filter-builder-item-tree-line-horizontal,\n.ag-advanced-filter-builder-item-tree-line-vertical,\n.ag-advanced-filter-builder-item-tree-line-vertical-top,\n.ag-advanced-filter-builder-item-tree-line-vertical-bottom {\n position: relative;\n height: 100%;\n display: flex;\n align-items: center;\n}\n.ag-advanced-filter-builder-item-tree-line-horizontal::before, .ag-advanced-filter-builder-item-tree-line-horizontal::after,\n.ag-advanced-filter-builder-item-tree-line-vertical::before,\n.ag-advanced-filter-builder-item-tree-line-vertical::after,\n.ag-advanced-filter-builder-item-tree-line-vertical-top::before,\n.ag-advanced-filter-builder-item-tree-line-vertical-top::after,\n.ag-advanced-filter-builder-item-tree-line-vertical-bottom::before,\n.ag-advanced-filter-builder-item-tree-line-vertical-bottom::after {\n content: \"\";\n position: absolute;\n height: 100%;\n}\n\n.ag-advanced-filter-builder-item-tree-line-horizontal::after {\n height: 50%;\n width: calc(var(--ag-advanced-filter-builder-indent-size) - var(--ag-icon-size));\n top: 0;\n left: calc(var(--ag-icon-size) / 2);\n border-bottom: 1px solid;\n border-color: var(--ag-border-color);\n}\n\n.ag-advanced-filter-builder-item-tree-line-vertical::before {\n width: calc(var(--ag-advanced-filter-builder-indent-size) - var(--ag-icon-size) / 2);\n top: 0;\n left: calc(var(--ag-icon-size) / 2);\n border-left: 1px solid;\n border-color: var(--ag-border-color);\n}\n\n.ag-advanced-filter-builder-item-tree-line-vertical-top::before {\n height: 50%;\n width: calc(var(--ag-advanced-filter-builder-indent-size) - var(--ag-icon-size) / 2);\n top: 0;\n left: calc(var(--ag-icon-size) / 2);\n border-left: 1px solid;\n border-color: var(--ag-border-color);\n}\n\n.ag-advanced-filter-builder-item-tree-line-vertical-bottom::before {\n height: calc((100% - 1.5 * var(--ag-icon-size)) / 2);\n width: calc(var(--ag-icon-size) / 2);\n top: calc((100% + 1.5 * var(--ag-icon-size)) / 2);\n left: calc(var(--ag-icon-size) / 2);\n border-left: 1px solid;\n border-color: var(--ag-border-color);\n}\n\n.ag-advanced-filter-builder-item-condition {\n padding-top: var(--ag-grid-size);\n padding-bottom: var(--ag-grid-size);\n}\n\n.ag-advanced-filter-builder-item,\n.ag-advanced-filter-builder-item-condition,\n.ag-advanced-filter-builder-pill-wrapper,\n.ag-advanced-filter-builder-pill,\n.ag-advanced-filter-builder-item-buttons,\n.ag-advanced-filter-builder-item-tree-lines {\n display: flex;\n align-items: center;\n height: 100%;\n}\n\n.ag-advanced-filter-builder-pill-wrapper {\n margin: 0px var(--ag-grid-size);\n}\n\n.ag-advanced-filter-builder-pill {\n position: relative;\n border-radius: var(--ag-border-radius);\n padding: var(--ag-grid-size) calc(var(--ag-grid-size) * 2);\n min-height: calc(100% - var(--ag-grid-size) * 3);\n min-width: calc(var(--ag-grid-size) * 2);\n}\n.ag-advanced-filter-builder-pill .ag-picker-field-display {\n margin-right: var(--ag-grid-size);\n}\n.ag-advanced-filter-builder-pill .ag-advanced-filter-builder-value-number {\n font-family: monospace;\n font-weight: 700;\n}\n.ag-advanced-filter-builder-pill .ag-advanced-filter-builder-value-empty {\n color: var(--ag-disabled-foreground-color);\n}\n\n.ag-advanced-filter-builder-pill:focus-visible {\n outline: none;\n}\n.ag-advanced-filter-builder-pill:focus-visible::after {\n content: \"\";\n position: absolute;\n background-color: transparent;\n pointer-events: none;\n top: -4px;\n left: -4px;\n display: block;\n width: calc(100% - -8px);\n height: calc(100% - -8px);\n border: 1px solid;\n border-color: var(--ag-input-focus-border-color);\n}\n\n.ag-advanced-filter-builder-item-button:focus-visible {\n outline: none;\n}\n.ag-advanced-filter-builder-item-button:focus-visible::after {\n content: \"\";\n position: absolute;\n background-color: transparent;\n pointer-events: none;\n top: -4px;\n left: -4px;\n display: block;\n width: calc(100% - -8px);\n height: calc(100% - -8px);\n border: 1px solid;\n border-color: var(--ag-input-focus-border-color);\n}\n\n.ag-advanced-filter-builder-pill-display {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-weight: 500;\n}\n\n.ag-advanced-filter-builder-join-pill {\n color: var(--ag-foreground-color);\n background-color: var(--ag-advanced-filter-join-pill-color);\n cursor: pointer;\n}\n\n.ag-advanced-filter-builder-column-pill {\n color: var(--ag-foreground-color);\n background-color: var(--ag-advanced-filter-column-pill-color);\n cursor: pointer;\n}\n\n.ag-advanced-filter-builder-option-pill {\n color: var(--ag-foreground-color);\n background-color: var(--ag-advanced-filter-option-pill-color);\n cursor: pointer;\n}\n\n.ag-advanced-filter-builder-value-pill {\n color: var(--ag-foreground-color);\n background-color: var(--ag-advanced-filter-value-pill-color);\n cursor: text;\n max-width: 140px;\n}\n.ag-advanced-filter-builder-value-pill .ag-advanced-filter-builder-pill-display {\n display: block;\n}\n\n.ag-advanced-filter-builder-item-buttons > * {\n margin: 0 calc(var(--ag-grid-size) * 0.5);\n}\n\n.ag-advanced-filter-builder-item-button {\n position: relative;\n cursor: pointer;\n color: var(--ag-secondary-foreground-color);\n opacity: 50%;\n}\n\n.ag-advanced-filter-builder-item-button-disabled {\n color: var(--ag-disabled-foreground-color);\n cursor: default;\n}\n\n.ag-advanced-filter-builder-virtual-list-container {\n top: var(--ag-grid-size);\n}\n\n.ag-advanced-filter-builder-virtual-list-item {\n display: flex;\n cursor: default;\n height: var(--ag-list-item-height);\n}\n.ag-advanced-filter-builder-virtual-list-item:hover {\n background-color: var(--ag-row-hover-color);\n}\n.ag-advanced-filter-builder-virtual-list-item:hover .ag-advanced-filter-builder-item-button {\n opacity: 100%;\n}\n\n.ag-advanced-filter-builder-virtual-list-item-highlight .ag-advanced-filter-builder-item-button:focus-visible,\n.ag-advanced-filter-builder-validation .ag-advanced-filter-builder-invalid {\n opacity: 100%;\n}\n\n.ag-advanced-filter-builder-invalid {\n margin: 0 var(--ag-grid-size);\n color: var(--ag-invalid-color);\n cursor: default;\n}\n\n.ag-row-number-cell {\n background-color: var(--ag-header-background-color);\n color: var(--ag-header-foreground-color);\n font-size: var(--ag-font-size);\n font-family: var(--ag-font-family);\n}\n\n.ag-row-number-header.ag-row-number-selection-enabled {\n cursor: cell;\n}\n\n.ag-row-number-range-highlight {\n background-color: var(--ag-range-header-highlight-color);\n}\n\n.ag-row-number-range-selected {\n background-color: var(--ag-row-numbers-selected-color);\n}\n\n.ag-ltr .ag-row-number-header,\n.ag-ltr .ag-cell.ag-row-number-cell:not(.ag-cell-last-left-pinned) {\n border-right: var(--ag-pinned-column-border);\n}\n.ag-ltr .ag-cell.ag-row-number-cell.ag-row-number-selection-enabled {\n cursor: url(" + ___CSS_LOADER_URL_REPLACEMENT_2___ + "), auto;\n}\n\n:where(.ag-rtl) .ag-row-number-header,\n:where(.ag-rtl) .ag-cell.ag-row-number-cell:not(.ag-cell-first-right-pinned) {\n border-left: var(--ag-pinned-column-border);\n}\n:where(.ag-rtl) .ag-cell.ag-row-number-cell.ag-row-number-selection-enabled {\n cursor: url(" + ___CSS_LOADER_URL_REPLACEMENT_3___ + "), auto;\n}\n\n.ag-input-field-input {\n width: 100%;\n min-width: 0;\n}\n\n.ag-checkbox-input-wrapper {\n font-family: var(--ag-icon-font-family);\n font-weight: var(--ag-icon-font-weight);\n color: var(--ag-icon-font-color);\n font-size: var(--ag-icon-size);\n line-height: var(--ag-icon-size);\n font-style: normal;\n font-variant: normal;\n text-transform: none;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n width: var(--ag-icon-size);\n height: var(--ag-icon-size);\n background-color: var(--ag-checkbox-background-color);\n border-radius: var(--ag-checkbox-border-radius);\n display: inline-block;\n vertical-align: middle;\n flex: none;\n}\n.ag-checkbox-input-wrapper input,\n.ag-checkbox-input-wrapper input {\n -webkit-appearance: none;\n opacity: 0;\n width: 100%;\n height: 100%;\n}\n.ag-checkbox-input-wrapper:focus-within, .ag-checkbox-input-wrapper:active {\n outline: none;\n box-shadow: var(--ag-input-focus-box-shadow);\n}\n.ag-checkbox-input-wrapper.ag-disabled {\n opacity: 0.5;\n}\n.ag-checkbox-input-wrapper::after {\n content: var(--ag-icon-font-code-checkbox-unchecked, \"\\f108\");\n font-family: inherit;\n color: var(--ag-checkbox-unchecked-color);\n display: var(--ag-icon-font-display-checkbox-unchecked, var(--ag-icon-font-display));\n position: absolute;\n top: 0;\n left: 0;\n pointer-events: none;\n}\n.ag-checkbox-input-wrapper.ag-checked::after {\n content: var(--ag-icon-font-code-checkbox-checked, \"\\f106\");\n color: var(--ag-checkbox-checked-color);\n display: var(--ag-icon-font-display-checkbox-checked, var(--ag-icon-font-display));\n position: absolute;\n top: 0;\n left: 0;\n pointer-events: none;\n}\n.ag-checkbox-input-wrapper.ag-indeterminate::after {\n content: var(--ag-icon-font-code-checkbox-indeterminate, \"\\f107\");\n color: var(--ag-checkbox-indeterminate-color);\n display: var(--ag-icon-font-display-checkbox-indeterminate, var(--ag-icon-font-display));\n position: absolute;\n top: 0;\n left: 0;\n pointer-events: none;\n}\n.ag-checkbox-input-wrapper::before {\n content: \"\";\n background: transparent center/contain no-repeat;\n position: absolute;\n inset: 0;\n background-image: var(--ag-icon-image-checkbox-unchecked, var(--ag-icon-image));\n display: var(--ag-icon-image-display-checkbox-unchecked, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-checkbox-unchecked, var(--ag-icon-image-opacity, 0.9));\n}\n.ag-checkbox-input-wrapper.ag-checked::before {\n background-image: var(--ag-icon-image-checkbox-checked, var(--ag-icon-image));\n display: var(--ag-icon-image-display-checkbox-checked, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-checkbox-checked, var(--ag-icon-image-opacity, 0.9));\n}\n.ag-checkbox-input-wrapper.ag-indeterminate::before {\n background-image: var(--ag-icon-image-checkbox-indeterminate, var(--ag-icon-image));\n display: var(--ag-icon-image-display-checkbox-indeterminate, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-checkbox-indeterminate, var(--ag-icon-image-opacity, 0.9));\n}\n\n.ag-toggle-button-input-wrapper {\n box-sizing: border-box;\n width: var(--ag-toggle-button-width);\n min-width: var(--ag-toggle-button-width);\n max-width: var(--ag-toggle-button-width);\n height: var(--ag-toggle-button-height);\n background-color: var(--ag-toggle-button-off-background-color);\n border-radius: calc(var(--ag-toggle-button-height) * 0.5);\n position: relative;\n flex: none;\n border: var(--ag-toggle-button-border-width) solid;\n border-color: var(--ag-toggle-button-off-border-color);\n}\n.ag-toggle-button-input-wrapper input {\n opacity: 0;\n height: 100%;\n width: 100%;\n}\n.ag-toggle-button-input-wrapper:focus-within {\n outline: none;\n box-shadow: var(--ag-input-focus-box-shadow);\n}\n.ag-toggle-button-input-wrapper.ag-disabled {\n opacity: 0.5;\n}\n.ag-toggle-button-input-wrapper.ag-checked {\n background-color: var(--ag-toggle-button-on-background-color);\n border-color: var(--ag-toggle-button-on-border-color);\n}\n.ag-toggle-button-input-wrapper::before {\n content: \" \";\n position: absolute;\n top: calc(0px - var(--ag-toggle-button-border-width));\n left: calc(0px - var(--ag-toggle-button-border-width));\n display: block;\n box-sizing: border-box;\n height: var(--ag-toggle-button-height);\n width: var(--ag-toggle-button-height);\n background-color: var(--ag-toggle-button-switch-background-color);\n border-radius: 100%;\n transition: left 100ms;\n border: var(--ag-toggle-button-border-width) solid;\n border-color: var(--ag-toggle-button-switch-border-color);\n}\n.ag-toggle-button-input-wrapper.ag-checked::before {\n left: calc(100% - var(--ag-toggle-button-height) + var(--ag-toggle-button-border-width));\n border-color: var(--ag-toggle-button-on-border-color);\n}\n\n.ag-radio-button-input-wrapper {\n font-family: var(--ag-icon-font-family);\n font-weight: var(--ag-icon-font-weight);\n color: var(--ag-icon-font-color);\n font-size: var(--ag-icon-size);\n line-height: var(--ag-icon-size);\n font-style: normal;\n font-variant: normal;\n text-transform: none;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n width: var(--ag-icon-size);\n height: var(--ag-icon-size);\n background-color: var(--ag-checkbox-background-color);\n border-radius: var(--ag-checkbox-border-radius);\n display: inline-block;\n vertical-align: middle;\n flex: none;\n border-radius: var(--ag-icon-size);\n}\n.ag-radio-button-input-wrapper input,\n.ag-radio-button-input-wrapper input {\n -webkit-appearance: none;\n opacity: 0;\n width: 100%;\n height: 100%;\n}\n.ag-radio-button-input-wrapper:focus-within, .ag-radio-button-input-wrapper:active {\n outline: none;\n box-shadow: var(--ag-input-focus-box-shadow);\n}\n.ag-radio-button-input-wrapper.ag-disabled {\n opacity: 0.5;\n}\n.ag-radio-button-input-wrapper::after {\n content: var(--ag-icon-font-code-radio-button-off, \"\\f127\");\n color: var(--ag-checkbox-unchecked-color);\n display: var(--ag-icon-font-display-radio-button-off, var(--ag-icon-font-display));\n position: absolute;\n top: 0;\n left: 0;\n pointer-events: none;\n}\n.ag-radio-button-input-wrapper.ag-checked::after {\n content: var(--ag-icon-font-code-radio-button-on, \"\\f128\");\n color: var(--ag-checkbox-checked-color);\n display: var(--ag-icon-font-display-radio-button-on, var(--ag-icon-font-display));\n position: absolute;\n top: 0;\n left: 0;\n pointer-events: none;\n}\n.ag-radio-button-input-wrapper::before {\n content: \"\";\n background: transparent center/contain no-repeat;\n position: absolute;\n inset: 0;\n background-image: var(--ag-icon-image-radio-button-off, var(--ag-icon-image));\n display: var(--ag-icon-image-display-radio-button-off, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-radio-button-off, var(--ag-icon-image-opacity, 0.9));\n}\n.ag-radio-button-input-wrapper.ag-checked::before {\n background-image: var(--ag-icon-image-radio-button-on, var(--ag-icon-image));\n display: var(--ag-icon-image-display-radio-button-on, var(--ag-icon-image-display));\n opacity: var(--ag-icon-image-opacity-radio-button-on, var(--ag-icon-image-opacity, 0.9));\n}\n\ninput[class^=ag-][type=range] {\n -webkit-appearance: none;\n width: 100%;\n height: 100%;\n background: none;\n overflow: visible;\n}\ninput[class^=ag-][type=range]::-webkit-slider-runnable-track {\n margin: 0;\n padding: 0;\n width: 100%;\n height: 3px;\n background-color: var(--ag-border-color);\n border-radius: var(--ag-border-radius);\n border-radius: var(--ag-checkbox-border-radius);\n}\ninput[class^=ag-][type=range]::-moz-range-track {\n margin: 0;\n padding: 0;\n width: 100%;\n height: 3px;\n background-color: var(--ag-border-color);\n border-radius: var(--ag-border-radius);\n border-radius: var(--ag-checkbox-border-radius);\n}\ninput[class^=ag-][type=range]::-ms-track {\n margin: 0;\n padding: 0;\n width: 100%;\n height: 3px;\n background-color: var(--ag-border-color);\n border-radius: var(--ag-border-radius);\n border-radius: var(--ag-checkbox-border-radius);\n color: transparent;\n width: calc(100% - 2px);\n}\ninput[class^=ag-][type=range]::-webkit-slider-thumb {\n margin: 0;\n padding: 0;\n -webkit-appearance: none;\n width: var(--ag-icon-size);\n height: var(--ag-icon-size);\n background-color: var(--ag-background-color);\n border: 1px solid;\n border-color: var(--ag-checkbox-unchecked-color);\n border-radius: var(--ag-icon-size);\n transform: translateY(calc(var(--ag-icon-size) * -0.5 + 1.5px));\n}\ninput[class^=ag-][type=range]::-ms-thumb {\n margin: 0;\n padding: 0;\n -webkit-appearance: none;\n width: var(--ag-icon-size);\n height: var(--ag-icon-size);\n background-color: var(--ag-background-color);\n border: 1px solid;\n border-color: var(--ag-checkbox-unchecked-color);\n border-radius: var(--ag-icon-size);\n}\ninput[class^=ag-][type=range]::-moz-ag-range-thumb {\n margin: 0;\n padding: 0;\n -webkit-appearance: none;\n width: var(--ag-icon-size);\n height: var(--ag-icon-size);\n background-color: var(--ag-background-color);\n border: 1px solid;\n border-color: var(--ag-checkbox-unchecked-color);\n border-radius: var(--ag-icon-size);\n}\ninput[class^=ag-][type=range]:focus {\n outline: none;\n}\ninput[class^=ag-][type=range]:focus::-webkit-slider-thumb {\n box-shadow: var(--ag-input-focus-box-shadow);\n border-color: var(--ag-checkbox-checked-color);\n}\ninput[class^=ag-][type=range]:focus::-ms-thumb {\n box-shadow: var(--ag-input-focus-box-shadow);\n border-color: var(--ag-checkbox-checked-color);\n}\ninput[class^=ag-][type=range]:focus::-moz-ag-range-thumb {\n box-shadow: var(--ag-input-focus-box-shadow);\n border-color: var(--ag-checkbox-checked-color);\n}\ninput[class^=ag-][type=range]:active::-webkit-slider-runnable-track {\n background-color: var(--ag-input-focus-border-color);\n}\ninput[class^=ag-][type=range]:active::-moz-ag-range-track {\n background-color: var(--ag-input-focus-border-color);\n}\ninput[class^=ag-][type=range]:active::-ms-track {\n background-color: var(--ag-input-focus-border-color);\n}\ninput[class^=ag-][type=range]:disabled {\n opacity: 0.5;\n}\n", ""]); // Exports /* harmony default export */ __webpack_exports__.A = (___CSS_LOADER_EXPORT___); /***/ }), /***/ 1229: /***/ (function(module, __webpack_exports__, __webpack_require__) { /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6758); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(935); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); // Imports var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module ___CSS_LOADER_EXPORT___.push([module.id, ".ag-theme-alpine,\n.ag-theme-alpine-dark,\n.ag-theme-alpine-auto-dark {\n --ag-alpine-active-color: #2196f3;\n --ag-selected-row-background-color: rgba(33, 150, 243, 0.3);\n --ag-row-hover-color: rgba(33, 150, 243, 0.1);\n --ag-column-hover-color: rgba(33, 150, 243, 0.1);\n --ag-input-focus-border-color: rgba(33, 150, 243, 0.4);\n --ag-range-selection-background-color: rgba(33, 150, 243, 0.2);\n --ag-range-selection-background-color-2: rgba(33, 150, 243, 0.36);\n --ag-range-selection-background-color-3: rgba(33, 150, 243, 0.49);\n --ag-range-selection-background-color-4: rgba(33, 150, 243, 0.59);\n --ag-row-numbers-selected-color: color-mix(in srgb, transparent, var(--ag-alpine-active-color) 50%);\n --ag-background-color: #fff;\n --ag-foreground-color: #181d1f;\n --ag-border-color: #babfc7;\n --ag-secondary-border-color: #dde2eb;\n --ag-header-background-color: #f8f8f8;\n --ag-tooltip-background-color: #f8f8f8;\n --ag-odd-row-background-color: #fcfcfc;\n --ag-control-panel-background-color: #f8f8f8;\n --ag-subheader-background-color: #fff;\n --ag-invalid-color: #e02525;\n --ag-checkbox-unchecked-color: #999;\n --ag-advanced-filter-join-pill-color: #f08e8d;\n --ag-advanced-filter-column-pill-color: #a6e194;\n --ag-advanced-filter-option-pill-color: #f3c08b;\n --ag-advanced-filter-value-pill-color: #85c0e4;\n --ag-checkbox-background-color: var(--ag-background-color);\n --ag-checkbox-checked-color: var(--ag-alpine-active-color);\n --ag-range-selection-border-color: var(--ag-alpine-active-color);\n --ag-secondary-foreground-color: var(--ag-foreground-color);\n --ag-input-border-color: var(--ag-border-color);\n --ag-input-border-color-invalid: var(--ag-invalid-color);\n --ag-input-focus-box-shadow: 0 0 2px 0.1rem var(--ag-input-focus-border-color);\n --ag-panel-background-color: var(--ag-header-background-color);\n --ag-menu-background-color: var(--ag-header-background-color);\n --ag-disabled-foreground-color: rgba(24, 29, 31, 0.5);\n --ag-chip-background-color: rgba(24, 29, 31, 0.07);\n --ag-input-disabled-border-color: rgba(186, 191, 199, 0.3);\n --ag-input-disabled-background-color: rgba(186, 191, 199, 0.15);\n --ag-borders: solid 1px;\n --ag-border-radius: 3px;\n --ag-borders-side-button: none;\n --ag-side-button-selected-background-color: transparent;\n --ag-header-column-resize-handle-display: block;\n --ag-header-column-resize-handle-width: 2px;\n --ag-header-column-resize-handle-height: 30%;\n --ag-grid-size: 6px;\n --ag-icon-size: 16px;\n --ag-row-height: calc(var(--ag-grid-size) * 7);\n --ag-header-height: calc(var(--ag-grid-size) * 8);\n --ag-list-item-height: calc(var(--ag-grid-size) * 4);\n --ag-column-select-indent-size: var(--ag-icon-size);\n --ag-set-filter-indent-size: var(--ag-icon-size);\n --ag-advanced-filter-builder-indent-size: calc(var(--ag-icon-size) + var(--ag-grid-size) * 2);\n --ag-cell-horizontal-padding: calc(var(--ag-grid-size) * 3);\n --ag-cell-widget-spacing: calc(var(--ag-grid-size) * 2);\n --ag-widget-container-vertical-padding: calc(var(--ag-grid-size) * 2);\n --ag-widget-container-horizontal-padding: calc(var(--ag-grid-size) * 2);\n --ag-widget-vertical-spacing: calc(var(--ag-grid-size) * 1.5);\n --ag-toggle-button-height: 18px;\n --ag-toggle-button-width: 28px;\n --ag-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell,\n \"Helvetica Neue\", sans-serif;\n --ag-font-size: 13px;\n --ag-icon-font-family: agGridAlpine;\n --ag-selected-tab-underline-color: var(--ag-alpine-active-color);\n --ag-selected-tab-underline-width: 2px;\n --ag-selected-tab-underline-transition-speed: 0.3s;\n --ag-tab-min-width: 240px;\n --ag-card-shadow: 0 1px 4px 1px rgba(186, 191, 199, 0.4);\n --ag-popup-shadow: var(--ag-card-shadow);\n --ag-side-bar-panel-width: 250px;\n}\n\n.ag-theme-alpine-dark {\n --ag-background-color: #181d1f;\n --ag-foreground-color: #fff;\n --ag-border-color: #68686e;\n --ag-secondary-border-color: rgba(88, 86, 82, 0.5);\n --ag-modal-overlay-background-color: rgba(24, 29, 31, 0.66);\n --ag-header-background-color: #222628;\n --ag-tooltip-background-color: #222628;\n --ag-odd-row-background-color: #222628;\n --ag-control-panel-background-color: #222628;\n --ag-subheader-background-color: #000;\n --ag-input-disabled-background-color: #282c2f;\n --ag-input-focus-box-shadow: 0 0 2px 0.5px rgba(255, 255, 255, 0.5), 0 0 4px 3px var(--ag-input-focus-border-color);\n --ag-card-shadow: 0 1px 20px 1px black;\n --ag-disabled-foreground-color: rgba(255, 255, 255, 0.5);\n --ag-chip-background-color: rgba(255, 255, 255, 0.07);\n --ag-input-disabled-border-color: rgba(104, 104, 110, 0.3);\n --ag-input-disabled-background-color: rgba(104, 104, 110, 0.07);\n --ag-advanced-filter-join-pill-color: #7a3a37;\n --ag-advanced-filter-column-pill-color: #355f2d;\n --ag-advanced-filter-option-pill-color: #5a3168;\n --ag-advanced-filter-value-pill-color: #374c86;\n --ag-row-loading-skeleton-effect-color: rgba(202, 203, 204, 0.4);\n color-scheme: dark;\n}\n\n@media (prefers-color-scheme: dark) {\n .ag-theme-alpine-auto-dark {\n --ag-background-color: #181d1f;\n --ag-foreground-color: #fff;\n --ag-border-color: #68686e;\n --ag-secondary-border-color: rgba(88, 86, 82, 0.5);\n --ag-modal-overlay-background-color: rgba(24, 29, 31, 0.66);\n --ag-header-background-color: #222628;\n --ag-tooltip-background-color: #222628;\n --ag-odd-row-background-color: #222628;\n --ag-control-panel-background-color: #222628;\n --ag-subheader-background-color: #000;\n --ag-input-disabled-background-color: #282c2f;\n --ag-input-focus-box-shadow: 0 0 2px 0.5px rgba(255, 255, 255, 0.5), 0 0 4px 3px var(--ag-input-focus-border-color);\n --ag-card-shadow: 0 1px 20px 1px black;\n --ag-disabled-foreground-color: rgba(255, 255, 255, 0.5);\n --ag-chip-background-color: rgba(255, 255, 255, 0.07);\n --ag-input-disabled-border-color: rgba(104, 104, 110, 0.3);\n --ag-input-disabled-background-color: rgba(104, 104, 110, 0.07);\n --ag-advanced-filter-join-pill-color: #7a3a37;\n --ag-advanced-filter-column-pill-color: #355f2d;\n --ag-advanced-filter-option-pill-color: #5a3168;\n --ag-advanced-filter-value-pill-color: #374c86;\n --ag-row-loading-skeleton-effect-color: rgba(202, 203, 204, 0.4);\n color-scheme: dark;\n }\n}\n.ag-theme-alpine .ag-filter-toolpanel-header,\n.ag-theme-alpine .ag-filter-toolpanel-search,\n.ag-theme-alpine .ag-status-bar,\n.ag-theme-alpine .ag-header-row,\n.ag-theme-alpine .ag-row-number-cell,\n.ag-theme-alpine .ag-panel-title-bar-title,\n.ag-theme-alpine .ag-multi-filter-group-title-bar,\n.ag-theme-alpine-dark .ag-filter-toolpanel-header,\n.ag-theme-alpine-dark .ag-filter-toolpanel-search,\n.ag-theme-alpine-dark .ag-status-bar,\n.ag-theme-alpine-dark .ag-header-row,\n.ag-theme-alpine-dark .ag-row-number-cell,\n.ag-theme-alpine-dark .ag-panel-title-bar-title,\n.ag-theme-alpine-dark .ag-multi-filter-group-title-bar,\n.ag-theme-alpine-auto-dark .ag-filter-toolpanel-header,\n.ag-theme-alpine-auto-dark .ag-filter-toolpanel-search,\n.ag-theme-alpine-auto-dark .ag-status-bar,\n.ag-theme-alpine-auto-dark .ag-header-row,\n.ag-theme-alpine-auto-dark .ag-row-number-cell,\n.ag-theme-alpine-auto-dark .ag-panel-title-bar-title,\n.ag-theme-alpine-auto-dark .ag-multi-filter-group-title-bar {\n font-weight: 700;\n color: var(--ag-header-foreground-color);\n}\n.ag-theme-alpine .ag-row,\n.ag-theme-alpine-dark .ag-row,\n.ag-theme-alpine-auto-dark .ag-row {\n font-size: calc(var(--ag-font-size) + 1px);\n}\n.ag-theme-alpine input[class^=ag-]:not([type]),\n.ag-theme-alpine input[class^=ag-][type=text],\n.ag-theme-alpine input[class^=ag-][type=number],\n.ag-theme-alpine input[class^=ag-][type=tel],\n.ag-theme-alpine input[class^=ag-][type=date],\n.ag-theme-alpine input[class^=ag-][type=datetime-local],\n.ag-theme-alpine textarea[class^=ag-],\n.ag-theme-alpine-dark input[class^=ag-]:not([type]),\n.ag-theme-alpine-dark input[class^=ag-][type=text],\n.ag-theme-alpine-dark input[class^=ag-][type=number],\n.ag-theme-alpine-dark input[class^=ag-][type=tel],\n.ag-theme-alpine-dark input[class^=ag-][type=date],\n.ag-theme-alpine-dark input[class^=ag-][type=datetime-local],\n.ag-theme-alpine-dark textarea[class^=ag-],\n.ag-theme-alpine-auto-dark input[class^=ag-]:not([type]),\n.ag-theme-alpine-auto-dark input[class^=ag-][type=text],\n.ag-theme-alpine-auto-dark input[class^=ag-][type=number],\n.ag-theme-alpine-auto-dark input[class^=ag-][type=tel],\n.ag-theme-alpine-auto-dark input[class^=ag-][type=date],\n.ag-theme-alpine-auto-dark input[class^=ag-][type=datetime-local],\n.ag-theme-alpine-auto-dark textarea[class^=ag-] {\n min-height: calc(var(--ag-grid-size) * 4);\n border-radius: var(--ag-border-radius);\n}\n.ag-theme-alpine .ag-ltr input[class^=ag-]:not([type]), .ag-theme-alpine .ag-ltr input[class^=ag-][type=text], .ag-theme-alpine .ag-ltr input[class^=ag-][type=number], .ag-theme-alpine .ag-ltr input[class^=ag-][type=tel], .ag-theme-alpine .ag-ltr input[class^=ag-][type=date], .ag-theme-alpine .ag-ltr input[class^=ag-][type=datetime-local], .ag-theme-alpine .ag-ltr textarea[class^=ag-], .ag-theme-alpine-dark .ag-ltr input[class^=ag-]:not([type]), .ag-theme-alpine-dark .ag-ltr input[class^=ag-][type=text], .ag-theme-alpine-dark .ag-ltr input[class^=ag-][type=number], .ag-theme-alpine-dark .ag-ltr input[class^=ag-][type=tel], .ag-theme-alpine-dark .ag-ltr input[class^=ag-][type=date], .ag-theme-alpine-dark .ag-ltr input[class^=ag-][type=datetime-local], .ag-theme-alpine-dark .ag-ltr textarea[class^=ag-], .ag-theme-alpine-auto-dark .ag-ltr input[class^=ag-]:not([type]), .ag-theme-alpine-auto-dark .ag-ltr input[class^=ag-][type=text], .ag-theme-alpine-auto-dark .ag-ltr input[class^=ag-][type=number], .ag-theme-alpine-auto-dark .ag-ltr input[class^=ag-][type=tel], .ag-theme-alpine-auto-dark .ag-ltr input[class^=ag-][type=date], .ag-theme-alpine-auto-dark .ag-ltr input[class^=ag-][type=datetime-local], .ag-theme-alpine-auto-dark .ag-ltr textarea[class^=ag-] {\n padding-left: var(--ag-grid-size);\n}\n\n.ag-theme-alpine .ag-rtl input[class^=ag-]:not([type]), .ag-theme-alpine .ag-rtl input[class^=ag-][type=text], .ag-theme-alpine .ag-rtl input[class^=ag-][type=number], .ag-theme-alpine .ag-rtl input[class^=ag-][type=tel], .ag-theme-alpine .ag-rtl input[class^=ag-][type=date], .ag-theme-alpine .ag-rtl input[class^=ag-][type=datetime-local], .ag-theme-alpine .ag-rtl textarea[class^=ag-], .ag-theme-alpine-dark .ag-rtl input[class^=ag-]:not([type]), .ag-theme-alpine-dark .ag-rtl input[class^=ag-][type=text], .ag-theme-alpine-dark .ag-rtl input[class^=ag-][type=number], .ag-theme-alpine-dark .ag-rtl input[class^=ag-][type=tel], .ag-theme-alpine-dark .ag-rtl input[class^=ag-][type=date], .ag-theme-alpine-dark .ag-rtl input[class^=ag-][type=datetime-local], .ag-theme-alpine-dark .ag-rtl textarea[class^=ag-], .ag-theme-alpine-auto-dark .ag-rtl input[class^=ag-]:not([type]), .ag-theme-alpine-auto-dark .ag-rtl input[class^=ag-][type=text], .ag-theme-alpine-auto-dark .ag-rtl input[class^=ag-][type=number], .ag-theme-alpine-auto-dark .ag-rtl input[class^=ag-][type=tel], .ag-theme-alpine-auto-dark .ag-rtl input[class^=ag-][type=date], .ag-theme-alpine-auto-dark .ag-rtl input[class^=ag-][type=datetime-local], .ag-theme-alpine-auto-dark .ag-rtl textarea[class^=ag-] {\n padding-right: var(--ag-grid-size);\n}\n\n.ag-theme-alpine .ag-tab,\n.ag-theme-alpine-dark .ag-tab,\n.ag-theme-alpine-auto-dark .ag-tab {\n padding: calc(var(--ag-grid-size) * 1.5);\n transition: color 0.4s;\n flex: 1 1 auto;\n}\n.ag-theme-alpine .ag-tab-selected,\n.ag-theme-alpine-dark .ag-tab-selected,\n.ag-theme-alpine-auto-dark .ag-tab-selected {\n color: var(--ag-alpine-active-color);\n}\n.ag-theme-alpine .ag-menu,\n.ag-theme-alpine-dark .ag-menu,\n.ag-theme-alpine-auto-dark .ag-menu {\n background-color: var(--ag-control-panel-background-color);\n}\n.ag-theme-alpine .ag-panel-content-wrapper .ag-column-select,\n.ag-theme-alpine-dark .ag-panel-content-wrapper .ag-column-select,\n.ag-theme-alpine-auto-dark .ag-panel-content-wrapper .ag-column-select {\n background-color: var(--ag-control-panel-background-color);\n}\n.ag-theme-alpine .ag-menu-header,\n.ag-theme-alpine-dark .ag-menu-header,\n.ag-theme-alpine-auto-dark .ag-menu-header {\n background-color: var(--ag-control-panel-background-color);\n padding-top: 1px;\n}\n.ag-theme-alpine .ag-tabs-header,\n.ag-theme-alpine-dark .ag-tabs-header,\n.ag-theme-alpine-auto-dark .ag-tabs-header {\n border-bottom: var(--ag-borders) var(--ag-border-color);\n}\n.ag-theme-alpine .ag-charts-settings-group-title-bar,\n.ag-theme-alpine .ag-charts-data-group-title-bar,\n.ag-theme-alpine .ag-charts-format-top-level-group-title-bar,\n.ag-theme-alpine .ag-charts-advanced-settings-top-level-group-title-bar,\n.ag-theme-alpine-dark .ag-charts-settings-group-title-bar,\n.ag-theme-alpine-dark .ag-charts-data-group-title-bar,\n.ag-theme-alpine-dark .ag-charts-format-top-level-group-title-bar,\n.ag-theme-alpine-dark .ag-charts-advanced-settings-top-level-group-title-bar,\n.ag-theme-alpine-auto-dark .ag-charts-settings-group-title-bar,\n.ag-theme-alpine-auto-dark .ag-charts-data-group-title-bar,\n.ag-theme-alpine-auto-dark .ag-charts-format-top-level-group-title-bar,\n.ag-theme-alpine-auto-dark .ag-charts-advanced-settings-top-level-group-title-bar {\n padding: var(--ag-grid-size) calc(var(--ag-grid-size) * 2);\n line-height: calc(var(--ag-icon-size) + var(--ag-grid-size) - 2px);\n}\n.ag-theme-alpine .ag-chart-mini-thumbnail,\n.ag-theme-alpine-dark .ag-chart-mini-thumbnail,\n.ag-theme-alpine-auto-dark .ag-chart-mini-thumbnail {\n background-color: var(--ag-background-color);\n}\n.ag-theme-alpine .ag-chart-settings-nav-bar,\n.ag-theme-alpine-dark .ag-chart-settings-nav-bar,\n.ag-theme-alpine-auto-dark .ag-chart-settings-nav-bar {\n border-top: var(--ag-borders-secondary) var(--ag-secondary-border-color);\n}\n.ag-theme-alpine .ag-ltr .ag-group-title-bar-icon, .ag-theme-alpine-dark .ag-ltr .ag-group-title-bar-icon, .ag-theme-alpine-auto-dark .ag-ltr .ag-group-title-bar-icon {\n margin-right: var(--ag-grid-size);\n}\n\n.ag-theme-alpine .ag-rtl .ag-group-title-bar-icon, .ag-theme-alpine-dark .ag-rtl .ag-group-title-bar-icon, .ag-theme-alpine-auto-dark .ag-rtl .ag-group-title-bar-icon {\n margin-left: var(--ag-grid-size);\n}\n\n.ag-theme-alpine .ag-charts-format-top-level-group-toolbar,\n.ag-theme-alpine .ag-charts-advanced-settings-top-level-group-toolbar,\n.ag-theme-alpine-dark .ag-charts-format-top-level-group-toolbar,\n.ag-theme-alpine-dark .ag-charts-advanced-settings-top-level-group-toolbar,\n.ag-theme-alpine-auto-dark .ag-charts-format-top-level-group-toolbar,\n.ag-theme-alpine-auto-dark .ag-charts-advanced-settings-top-level-group-toolbar {\n margin-top: var(--ag-grid-size);\n}\n.ag-theme-alpine .ag-ltr .ag-charts-format-top-level-group-toolbar, .ag-theme-alpine .ag-ltr .ag-charts-advanced-settings-top-level-group-toolbar, .ag-theme-alpine-dark .ag-ltr .ag-charts-format-top-level-group-toolbar, .ag-theme-alpine-dark .ag-ltr .ag-charts-advanced-settings-top-level-group-toolbar, .ag-theme-alpine-auto-dark .ag-ltr .ag-charts-format-top-level-group-toolbar, .ag-theme-alpine-auto-dark .ag-ltr .ag-charts-advanced-settings-top-level-group-toolbar {\n padding-left: calc(var(--ag-icon-size) * 0.5 + var(--ag-grid-size) * 2);\n}\n\n.ag-theme-alpine .ag-rtl .ag-charts-format-top-level-group-toolbar, .ag-theme-alpine .ag-rtl .ag-charts-advanced-settings-top-level-group-toolbar, .ag-theme-alpine-dark .ag-rtl .ag-charts-format-top-level-group-toolbar, .ag-theme-alpine-dark .ag-rtl .ag-charts-advanced-settings-top-level-group-toolbar, .ag-theme-alpine-auto-dark .ag-rtl .ag-charts-format-top-level-group-toolbar, .ag-theme-alpine-auto-dark .ag-rtl .ag-charts-advanced-settings-top-level-group-toolbar {\n padding-right: calc(var(--ag-icon-size) * 0.5 + var(--ag-grid-size) * 2);\n}\n\n.ag-theme-alpine .ag-charts-format-sub-level-group,\n.ag-theme-alpine-dark .ag-charts-format-sub-level-group,\n.ag-theme-alpine-auto-dark .ag-charts-format-sub-level-group {\n border-left: dashed 1px;\n border-left-color: var(--ag-border-color);\n padding-left: var(--ag-grid-size);\n margin-bottom: calc(var(--ag-grid-size) * 2);\n}\n.ag-theme-alpine .ag-charts-format-sub-level-group-title-bar,\n.ag-theme-alpine-dark .ag-charts-format-sub-level-group-title-bar,\n.ag-theme-alpine-auto-dark .ag-charts-format-sub-level-group-title-bar {\n padding-top: 0;\n padding-bottom: 0;\n background: none;\n font-weight: 700;\n}\n.ag-theme-alpine .ag-charts-format-sub-level-group-container,\n.ag-theme-alpine-dark .ag-charts-format-sub-level-group-container,\n.ag-theme-alpine-auto-dark .ag-charts-format-sub-level-group-container {\n padding-bottom: 0;\n}\n.ag-theme-alpine .ag-charts-format-sub-level-group-item:last-child,\n.ag-theme-alpine-dark .ag-charts-format-sub-level-group-item:last-child,\n.ag-theme-alpine-auto-dark .ag-charts-format-sub-level-group-item:last-child {\n margin-bottom: 0;\n}\n.ag-theme-alpine.ag-dnd-ghost,\n.ag-theme-alpine-dark.ag-dnd-ghost,\n.ag-theme-alpine-auto-dark.ag-dnd-ghost {\n font-size: calc(var(--ag-font-size) - 1px);\n font-weight: 700;\n}\n.ag-theme-alpine .ag-side-buttons,\n.ag-theme-alpine-dark .ag-side-buttons,\n.ag-theme-alpine-auto-dark .ag-side-buttons {\n width: calc(var(--ag-grid-size) * 5);\n}\n.ag-theme-alpine .ag-standard-button,\n.ag-theme-alpine-dark .ag-standard-button,\n.ag-theme-alpine-auto-dark .ag-standard-button {\n font-family: inherit;\n appearance: none;\n -webkit-appearance: none;\n border-radius: var(--ag-border-radius);\n border: 1px solid;\n border-color: var(--ag-alpine-active-color);\n color: var(--ag-alpine-active-color);\n background-color: var(--ag-background-color);\n font-weight: 600;\n padding: var(--ag-grid-size) calc(var(--ag-grid-size) * 2);\n}\n.ag-theme-alpine .ag-standard-button:hover,\n.ag-theme-alpine-dark .ag-standard-button:hover,\n.ag-theme-alpine-auto-dark .ag-standard-button:hover {\n border-color: var(--ag-alpine-active-color);\n background-color: var(--ag-row-hover-color);\n}\n.ag-theme-alpine .ag-standard-button:active,\n.ag-theme-alpine-dark .ag-standard-button:active,\n.ag-theme-alpine-auto-dark .ag-standard-button:active {\n border-color: var(--ag-alpine-active-color);\n background-color: var(--ag-alpine-active-color);\n color: var(--ag-background-color);\n}\n.ag-theme-alpine .ag-standard-button:disabled,\n.ag-theme-alpine-dark .ag-standard-button:disabled,\n.ag-theme-alpine-auto-dark .ag-standard-button:disabled {\n color: var(--ag-disabled-foreground-color);\n background-color: var(--ag-input-disabled-background-color);\n border-color: var(--ag-input-disabled-border-color);\n}\n.ag-theme-alpine .ag-column-drop-vertical,\n.ag-theme-alpine-dark .ag-column-drop-vertical,\n.ag-theme-alpine-auto-dark .ag-column-drop-vertical {\n min-height: 75px;\n}\n.ag-theme-alpine .ag-column-drop-vertical-title-bar,\n.ag-theme-alpine-dark .ag-column-drop-vertical-title-bar,\n.ag-theme-alpine-auto-dark .ag-column-drop-vertical-title-bar {\n padding: calc(var(--ag-grid-size) * 2);\n padding-bottom: 0px;\n}\n.ag-theme-alpine .ag-column-drop-vertical-empty-message,\n.ag-theme-alpine-dark .ag-column-drop-vertical-empty-message,\n.ag-theme-alpine-auto-dark .ag-column-drop-vertical-empty-message {\n display: flex;\n align-items: center;\n border: dashed 1px;\n border-color: var(--ag-border-color);\n margin: calc(var(--ag-grid-size) * 2);\n padding: calc(var(--ag-grid-size) * 2);\n}\n.ag-theme-alpine .ag-column-drop-empty-message,\n.ag-theme-alpine-dark .ag-column-drop-empty-message,\n.ag-theme-alpine-auto-dark .ag-column-drop-empty-message {\n color: var(--ag-foreground-color);\n opacity: 0.75;\n}\n.ag-theme-alpine .ag-pill-select .ag-column-drop,\n.ag-theme-alpine-dark .ag-pill-select .ag-column-drop,\n.ag-theme-alpine-auto-dark .ag-pill-select .ag-column-drop {\n min-height: unset;\n}\n.ag-theme-alpine .ag-status-bar,\n.ag-theme-alpine-dark .ag-status-bar,\n.ag-theme-alpine-auto-dark .ag-status-bar {\n font-weight: normal;\n}\n.ag-theme-alpine .ag-status-name-value-value,\n.ag-theme-alpine-dark .ag-status-name-value-value,\n.ag-theme-alpine-auto-dark .ag-status-name-value-value {\n font-weight: 700;\n}\n.ag-theme-alpine .ag-paging-number,\n.ag-theme-alpine .ag-paging-row-summary-panel-number,\n.ag-theme-alpine-dark .ag-paging-number,\n.ag-theme-alpine-dark .ag-paging-row-summary-panel-number,\n.ag-theme-alpine-auto-dark .ag-paging-number,\n.ag-theme-alpine-auto-dark .ag-paging-row-summary-panel-number {\n font-weight: 700;\n}\n.ag-theme-alpine .ag-column-drop-cell-button,\n.ag-theme-alpine-dark .ag-column-drop-cell-button,\n.ag-theme-alpine-auto-dark .ag-column-drop-cell-button {\n opacity: 0.5;\n}\n.ag-theme-alpine .ag-column-drop-cell-button:hover,\n.ag-theme-alpine-dark .ag-column-drop-cell-button:hover,\n.ag-theme-alpine-auto-dark .ag-column-drop-cell-button:hover {\n opacity: 0.75;\n}\n.ag-theme-alpine .ag-column-select-column-readonly.ag-icon-grip,\n.ag-theme-alpine .ag-column-select-column-readonly .ag-icon-grip,\n.ag-theme-alpine-dark .ag-column-select-column-readonly.ag-icon-grip,\n.ag-theme-alpine-dark .ag-column-select-column-readonly .ag-icon-grip,\n.ag-theme-alpine-auto-dark .ag-column-select-column-readonly.ag-icon-grip,\n.ag-theme-alpine-auto-dark .ag-column-select-column-readonly .ag-icon-grip {\n opacity: 0.35;\n}\n.ag-theme-alpine .ag-header-cell-menu-button:hover,\n.ag-theme-alpine .ag-header-cell-filter-button:hover,\n.ag-theme-alpine .ag-side-button-button:hover,\n.ag-theme-alpine .ag-tab:hover,\n.ag-theme-alpine .ag-panel-title-bar-button:hover,\n.ag-theme-alpine .ag-header-expand-icon:hover,\n.ag-theme-alpine .ag-column-group-icons:hover,\n.ag-theme-alpine .ag-set-filter-group-icons:hover,\n.ag-theme-alpine .ag-group-expanded .ag-icon:hover,\n.ag-theme-alpine .ag-group-contracted .ag-icon:hover,\n.ag-theme-alpine .ag-chart-settings-prev:hover,\n.ag-theme-alpine .ag-chart-settings-next:hover,\n.ag-theme-alpine .ag-group-title-bar-icon:hover,\n.ag-theme-alpine .ag-column-select-header-icon:hover,\n.ag-theme-alpine .ag-floating-filter-button-button:hover,\n.ag-theme-alpine .ag-filter-toolpanel-expand:hover,\n.ag-theme-alpine .ag-chart-menu-icon:hover,\n.ag-theme-alpine-dark .ag-header-cell-menu-button:hover,\n.ag-theme-alpine-dark .ag-header-cell-filter-button:hover,\n.ag-theme-alpine-dark .ag-side-button-button:hover,\n.ag-theme-alpine-dark .ag-tab:hover,\n.ag-theme-alpine-dark .ag-panel-title-bar-button:hover,\n.ag-theme-alpine-dark .ag-header-expand-icon:hover,\n.ag-theme-alpine-dark .ag-column-group-icons:hover,\n.ag-theme-alpine-dark .ag-set-filter-group-icons:hover,\n.ag-theme-alpine-dark .ag-group-expanded .ag-icon:hover,\n.ag-theme-alpine-dark .ag-group-contracted .ag-icon:hover,\n.ag-theme-alpine-dark .ag-chart-settings-prev:hover,\n.ag-theme-alpine-dark .ag-chart-settings-next:hover,\n.ag-theme-alpine-dark .ag-group-title-bar-icon:hover,\n.ag-theme-alpine-dark .ag-column-select-header-icon:hover,\n.ag-theme-alpine-dark .ag-floating-filter-button-button:hover,\n.ag-theme-alpine-dark .ag-filter-toolpanel-expand:hover,\n.ag-theme-alpine-dark .ag-chart-menu-icon:hover,\n.ag-theme-alpine-auto-dark .ag-header-cell-menu-button:hover,\n.ag-theme-alpine-auto-dark .ag-header-cell-filter-button:hover,\n.ag-theme-alpine-auto-dark .ag-side-button-button:hover,\n.ag-theme-alpine-auto-dark .ag-tab:hover,\n.ag-theme-alpine-auto-dark .ag-panel-title-bar-button:hover,\n.ag-theme-alpine-auto-dark .ag-header-expand-icon:hover,\n.ag-theme-alpine-auto-dark .ag-column-group-icons:hover,\n.ag-theme-alpine-auto-dark .ag-set-filter-group-icons:hover,\n.ag-theme-alpine-auto-dark .ag-group-expanded .ag-icon:hover,\n.ag-theme-alpine-auto-dark .ag-group-contracted .ag-icon:hover,\n.ag-theme-alpine-auto-dark .ag-chart-settings-prev:hover,\n.ag-theme-alpine-auto-dark .ag-chart-settings-next:hover,\n.ag-theme-alpine-auto-dark .ag-group-title-bar-icon:hover,\n.ag-theme-alpine-auto-dark .ag-column-select-header-icon:hover,\n.ag-theme-alpine-auto-dark .ag-floating-filter-button-button:hover,\n.ag-theme-alpine-auto-dark .ag-filter-toolpanel-expand:hover,\n.ag-theme-alpine-auto-dark .ag-chart-menu-icon:hover {\n color: var(--ag-alpine-active-color);\n}\n.ag-theme-alpine .ag-header-cell-menu-button:hover .ag-icon,\n.ag-theme-alpine .ag-header-cell-filter-button:hover .ag-icon,\n.ag-theme-alpine .ag-side-button-button:hover .ag-icon,\n.ag-theme-alpine .ag-panel-title-bar-button:hover .ag-icon,\n.ag-theme-alpine .ag-floating-filter-button-button:hover .ag-icon,\n.ag-theme-alpine-dark .ag-header-cell-menu-button:hover .ag-icon,\n.ag-theme-alpine-dark .ag-header-cell-filter-button:hover .ag-icon,\n.ag-theme-alpine-dark .ag-side-button-button:hover .ag-icon,\n.ag-theme-alpine-dark .ag-panel-title-bar-button:hover .ag-icon,\n.ag-theme-alpine-dark .ag-floating-filter-button-button:hover .ag-icon,\n.ag-theme-alpine-auto-dark .ag-header-cell-menu-button:hover .ag-icon,\n.ag-theme-alpine-auto-dark .ag-header-cell-filter-button:hover .ag-icon,\n.ag-theme-alpine-auto-dark .ag-side-button-button:hover .ag-icon,\n.ag-theme-alpine-auto-dark .ag-panel-title-bar-button:hover .ag-icon,\n.ag-theme-alpine-auto-dark .ag-floating-filter-button-button:hover .ag-icon {\n color: inherit;\n}\n.ag-theme-alpine .ag-filter-active .ag-icon-filter,\n.ag-theme-alpine-dark .ag-filter-active .ag-icon-filter,\n.ag-theme-alpine-auto-dark .ag-filter-active .ag-icon-filter {\n color: var(--ag-alpine-active-color);\n}\n.ag-theme-alpine .ag-chart-settings-card-item.ag-not-selected:hover,\n.ag-theme-alpine-dark .ag-chart-settings-card-item.ag-not-selected:hover,\n.ag-theme-alpine-auto-dark .ag-chart-settings-card-item.ag-not-selected:hover {\n opacity: 0.35;\n}\n.ag-theme-alpine .ag-ltr .ag-panel-title-bar-button, .ag-theme-alpine-dark .ag-ltr .ag-panel-title-bar-button, .ag-theme-alpine-auto-dark .ag-ltr .ag-panel-title-bar-button {\n margin-left: calc(var(--ag-grid-size) * 2);\n margin-right: var(--ag-grid-size);\n}\n\n.ag-theme-alpine .ag-rtl .ag-panel-title-bar-button, .ag-theme-alpine-dark .ag-rtl .ag-panel-title-bar-button, .ag-theme-alpine-auto-dark .ag-rtl .ag-panel-title-bar-button {\n margin-right: calc(var(--ag-grid-size) * 2);\n margin-left: var(--ag-grid-size);\n}\n\n.ag-theme-alpine .ag-ltr .ag-filter-toolpanel-group-container, .ag-theme-alpine-dark .ag-ltr .ag-filter-toolpanel-group-container, .ag-theme-alpine-auto-dark .ag-ltr .ag-filter-toolpanel-group-container {\n padding-left: var(--ag-grid-size);\n}\n\n.ag-theme-alpine .ag-rtl .ag-filter-toolpanel-group-container, .ag-theme-alpine-dark .ag-rtl .ag-filter-toolpanel-group-container, .ag-theme-alpine-auto-dark .ag-rtl .ag-filter-toolpanel-group-container {\n padding-right: var(--ag-grid-size);\n}\n\n.ag-theme-alpine .ag-filter-toolpanel-instance-filter,\n.ag-theme-alpine-dark .ag-filter-toolpanel-instance-filter,\n.ag-theme-alpine-auto-dark .ag-filter-toolpanel-instance-filter {\n border: none;\n background-color: var(--ag-control-panel-background-color);\n}\n.ag-theme-alpine .ag-ltr .ag-filter-toolpanel-instance-filter, .ag-theme-alpine-dark .ag-ltr .ag-filter-toolpanel-instance-filter, .ag-theme-alpine-auto-dark .ag-ltr .ag-filter-toolpanel-instance-filter {\n border-left: dashed 1px;\n border-left-color: var(--ag-border-color);\n margin-left: calc(var(--ag-icon-size) * 0.5);\n}\n\n.ag-theme-alpine .ag-rtl .ag-filter-toolpanel-instance-filter, .ag-theme-alpine-dark .ag-rtl .ag-filter-toolpanel-instance-filter, .ag-theme-alpine-auto-dark .ag-rtl .ag-filter-toolpanel-instance-filter {\n border-right: dashed 1px;\n border-right-color: var(--ag-border-color);\n margin-right: calc(var(--ag-icon-size) * 0.5);\n}\n\n.ag-theme-alpine .ag-set-filter-list,\n.ag-theme-alpine-dark .ag-set-filter-list,\n.ag-theme-alpine-auto-dark .ag-set-filter-list {\n padding-top: calc(var(--ag-grid-size) * 0.5);\n padding-bottom: calc(var(--ag-grid-size) * 0.5);\n}\n.ag-theme-alpine .ag-layout-auto-height .ag-center-cols-viewport,\n.ag-theme-alpine .ag-layout-auto-height .ag-center-cols-container,\n.ag-theme-alpine .ag-layout-print .ag-center-cols-viewport,\n.ag-theme-alpine .ag-layout-print .ag-center-cols-container,\n.ag-theme-alpine-dark .ag-layout-auto-height .ag-center-cols-viewport,\n.ag-theme-alpine-dark .ag-layout-auto-height .ag-center-cols-container,\n.ag-theme-alpine-dark .ag-layout-print .ag-center-cols-viewport,\n.ag-theme-alpine-dark .ag-layout-print .ag-center-cols-container,\n.ag-theme-alpine-auto-dark .ag-layout-auto-height .ag-center-cols-viewport,\n.ag-theme-alpine-auto-dark .ag-layout-auto-height .ag-center-cols-container,\n.ag-theme-alpine-auto-dark .ag-layout-print .ag-center-cols-viewport,\n.ag-theme-alpine-auto-dark .ag-layout-print .ag-center-cols-container {\n min-height: 150px;\n}\n.ag-theme-alpine .ag-date-time-list-page-entry-is-current,\n.ag-theme-alpine-dark .ag-date-time-list-page-entry-is-current,\n.ag-theme-alpine-auto-dark .ag-date-time-list-page-entry-is-current {\n background-color: var(--ag-alpine-active-color);\n}\n.ag-theme-alpine .ag-advanced-filter-builder-button,\n.ag-theme-alpine-dark .ag-advanced-filter-builder-button,\n.ag-theme-alpine-auto-dark .ag-advanced-filter-builder-button {\n padding: var(--ag-grid-size);\n font-weight: 600;\n}\n.ag-theme-alpine .ag-list-item-hovered::after,\n.ag-theme-alpine-dark .ag-list-item-hovered::after,\n.ag-theme-alpine-auto-dark .ag-list-item-hovered::after {\n background-color: var(--ag-alpine-active-color);\n}\n.ag-theme-alpine .ag-pill .ag-pill-button:hover,\n.ag-theme-alpine-dark .ag-pill .ag-pill-button:hover,\n.ag-theme-alpine-auto-dark .ag-pill .ag-pill-button:hover {\n color: var(--ag-alpine-active-color);\n}\n.ag-theme-alpine .ag-header-highlight-before::after,\n.ag-theme-alpine .ag-header-highlight-after::after,\n.ag-theme-alpine-dark .ag-header-highlight-before::after,\n.ag-theme-alpine-dark .ag-header-highlight-after::after,\n.ag-theme-alpine-auto-dark .ag-header-highlight-before::after,\n.ag-theme-alpine-auto-dark .ag-header-highlight-after::after {\n background-color: var(--ag-alpine-active-color);\n}\n.ag-theme-alpine .ag-advanced-filter-builder-item-button-disabled .ag-icon,\n.ag-theme-alpine .ag-disabled .ag-icon,\n.ag-theme-alpine .ag-column-select-column-group-readonly .ag-icon,\n.ag-theme-alpine [disabled] .ag-icon,\n.ag-theme-alpine-dark .ag-advanced-filter-builder-item-button-disabled .ag-icon,\n.ag-theme-alpine-dark .ag-disabled .ag-icon,\n.ag-theme-alpine-dark .ag-column-select-column-group-readonly .ag-icon,\n.ag-theme-alpine-dark [disabled] .ag-icon,\n.ag-theme-alpine-auto-dark .ag-advanced-filter-builder-item-button-disabled .ag-icon,\n.ag-theme-alpine-auto-dark .ag-disabled .ag-icon,\n.ag-theme-alpine-auto-dark .ag-column-select-column-group-readonly .ag-icon,\n.ag-theme-alpine-auto-dark [disabled] .ag-icon {\n color: var(--ag-disabled-foreground-color);\n}\n", ""]); // Exports /* harmony default export */ __webpack_exports__.A = (___CSS_LOADER_EXPORT___); /***/ }), /***/ 3871: /***/ (function(module, __webpack_exports__, __webpack_require__) { /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6758); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(935); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(62); /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__); // Imports var ___CSS_LOADER_URL_IMPORT_0___ = new URL(/* asset import */ __webpack_require__(8430), __webpack_require__.b); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); var ___CSS_LOADER_URL_REPLACEMENT_0___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_0___); // Module ___CSS_LOADER_EXPORT___.push([module.id, "@font-face {\n font-family: \"agGridAlpine\";\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_0___ + ");\n font-weight: normal;\n font-style: normal;\n}\n.ag-theme-alpine,\n.ag-theme-alpine-dark,\n.ag-theme-alpine-auto-dark {\n --ag-alpine-active-color: #2196f3;\n --ag-selected-row-background-color: rgba(33, 150, 243, 0.3);\n --ag-row-hover-color: rgba(33, 150, 243, 0.1);\n --ag-column-hover-color: rgba(33, 150, 243, 0.1);\n --ag-input-focus-border-color: rgba(33, 150, 243, 0.4);\n --ag-range-selection-background-color: rgba(33, 150, 243, 0.2);\n --ag-range-selection-background-color-2: rgba(33, 150, 243, 0.36);\n --ag-range-selection-background-color-3: rgba(33, 150, 243, 0.49);\n --ag-range-selection-background-color-4: rgba(33, 150, 243, 0.59);\n --ag-row-numbers-selected-color: color-mix(in srgb, transparent, var(--ag-alpine-active-color) 50%);\n --ag-background-color: #fff;\n --ag-foreground-color: #181d1f;\n --ag-border-color: #babfc7;\n --ag-secondary-border-color: #dde2eb;\n --ag-header-background-color: #f8f8f8;\n --ag-tooltip-background-color: #f8f8f8;\n --ag-odd-row-background-color: #fcfcfc;\n --ag-control-panel-background-color: #f8f8f8;\n --ag-subheader-background-color: #fff;\n --ag-invalid-color: #e02525;\n --ag-checkbox-unchecked-color: #999;\n --ag-advanced-filter-join-pill-color: #f08e8d;\n --ag-advanced-filter-column-pill-color: #a6e194;\n --ag-advanced-filter-option-pill-color: #f3c08b;\n --ag-advanced-filter-value-pill-color: #85c0e4;\n --ag-checkbox-background-color: var(--ag-background-color);\n --ag-checkbox-checked-color: var(--ag-alpine-active-color);\n --ag-range-selection-border-color: var(--ag-alpine-active-color);\n --ag-secondary-foreground-color: var(--ag-foreground-color);\n --ag-input-border-color: var(--ag-border-color);\n --ag-input-border-color-invalid: var(--ag-invalid-color);\n --ag-input-focus-box-shadow: 0 0 2px 0.1rem var(--ag-input-focus-border-color);\n --ag-panel-background-color: var(--ag-header-background-color);\n --ag-menu-background-color: var(--ag-header-background-color);\n --ag-disabled-foreground-color: rgba(24, 29, 31, 0.5);\n --ag-chip-background-color: rgba(24, 29, 31, 0.07);\n --ag-input-disabled-border-color: rgba(186, 191, 199, 0.3);\n --ag-input-disabled-background-color: rgba(186, 191, 199, 0.15);\n --ag-borders: solid 1px;\n --ag-border-radius: 3px;\n --ag-borders-side-button: none;\n --ag-side-button-selected-background-color: transparent;\n --ag-header-column-resize-handle-display: block;\n --ag-header-column-resize-handle-width: 2px;\n --ag-header-column-resize-handle-height: 30%;\n --ag-grid-size: 6px;\n --ag-icon-size: 16px;\n --ag-row-height: calc(var(--ag-grid-size) * 7);\n --ag-header-height: calc(var(--ag-grid-size) * 8);\n --ag-list-item-height: calc(var(--ag-grid-size) * 4);\n --ag-column-select-indent-size: var(--ag-icon-size);\n --ag-set-filter-indent-size: var(--ag-icon-size);\n --ag-advanced-filter-builder-indent-size: calc(var(--ag-icon-size) + var(--ag-grid-size) * 2);\n --ag-cell-horizontal-padding: calc(var(--ag-grid-size) * 3);\n --ag-cell-widget-spacing: calc(var(--ag-grid-size) * 2);\n --ag-widget-container-vertical-padding: calc(var(--ag-grid-size) * 2);\n --ag-widget-container-horizontal-padding: calc(var(--ag-grid-size) * 2);\n --ag-widget-vertical-spacing: calc(var(--ag-grid-size) * 1.5);\n --ag-toggle-button-height: 18px;\n --ag-toggle-button-width: 28px;\n --ag-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell,\n \"Helvetica Neue\", sans-serif;\n --ag-font-size: 13px;\n --ag-icon-font-family: agGridAlpine;\n --ag-selected-tab-underline-color: var(--ag-alpine-active-color);\n --ag-selected-tab-underline-width: 2px;\n --ag-selected-tab-underline-transition-speed: 0.3s;\n --ag-tab-min-width: 240px;\n --ag-card-shadow: 0 1px 4px 1px rgba(186, 191, 199, 0.4);\n --ag-popup-shadow: var(--ag-card-shadow);\n --ag-side-bar-panel-width: 250px;\n}\n\n.ag-theme-alpine-dark {\n --ag-background-color: #181d1f;\n --ag-foreground-color: #fff;\n --ag-border-color: #68686e;\n --ag-secondary-border-color: rgba(88, 86, 82, 0.5);\n --ag-modal-overlay-background-color: rgba(24, 29, 31, 0.66);\n --ag-header-background-color: #222628;\n --ag-tooltip-background-color: #222628;\n --ag-odd-row-background-color: #222628;\n --ag-control-panel-background-color: #222628;\n --ag-subheader-background-color: #000;\n --ag-input-disabled-background-color: #282c2f;\n --ag-input-focus-box-shadow: 0 0 2px 0.5px rgba(255, 255, 255, 0.5), 0 0 4px 3px var(--ag-input-focus-border-color);\n --ag-card-shadow: 0 1px 20px 1px black;\n --ag-disabled-foreground-color: rgba(255, 255, 255, 0.5);\n --ag-chip-background-color: rgba(255, 255, 255, 0.07);\n --ag-input-disabled-border-color: rgba(104, 104, 110, 0.3);\n --ag-input-disabled-background-color: rgba(104, 104, 110, 0.07);\n --ag-advanced-filter-join-pill-color: #7a3a37;\n --ag-advanced-filter-column-pill-color: #355f2d;\n --ag-advanced-filter-option-pill-color: #5a3168;\n --ag-advanced-filter-value-pill-color: #374c86;\n --ag-row-loading-skeleton-effect-color: rgba(202, 203, 204, 0.4);\n color-scheme: dark;\n}\n\n@media (prefers-color-scheme: dark) {\n .ag-theme-alpine-auto-dark {\n --ag-background-color: #181d1f;\n --ag-foreground-color: #fff;\n --ag-border-color: #68686e;\n --ag-secondary-border-color: rgba(88, 86, 82, 0.5);\n --ag-modal-overlay-background-color: rgba(24, 29, 31, 0.66);\n --ag-header-background-color: #222628;\n --ag-tooltip-background-color: #222628;\n --ag-odd-row-background-color: #222628;\n --ag-control-panel-background-color: #222628;\n --ag-subheader-background-color: #000;\n --ag-input-disabled-background-color: #282c2f;\n --ag-input-focus-box-shadow: 0 0 2px 0.5px rgba(255, 255, 255, 0.5), 0 0 4px 3px var(--ag-input-focus-border-color);\n --ag-card-shadow: 0 1px 20px 1px black;\n --ag-disabled-foreground-color: rgba(255, 255, 255, 0.5);\n --ag-chip-background-color: rgba(255, 255, 255, 0.07);\n --ag-input-disabled-border-color: rgba(104, 104, 110, 0.3);\n --ag-input-disabled-background-color: rgba(104, 104, 110, 0.07);\n --ag-advanced-filter-join-pill-color: #7a3a37;\n --ag-advanced-filter-column-pill-color: #355f2d;\n --ag-advanced-filter-option-pill-color: #5a3168;\n --ag-advanced-filter-value-pill-color: #374c86;\n --ag-row-loading-skeleton-effect-color: rgba(202, 203, 204, 0.4);\n color-scheme: dark;\n }\n}\n.ag-theme-alpine .ag-filter-toolpanel-header,\n.ag-theme-alpine .ag-filter-toolpanel-search,\n.ag-theme-alpine .ag-status-bar,\n.ag-theme-alpine .ag-header-row,\n.ag-theme-alpine .ag-row-number-cell,\n.ag-theme-alpine .ag-panel-title-bar-title,\n.ag-theme-alpine .ag-multi-filter-group-title-bar,\n.ag-theme-alpine-dark .ag-filter-toolpanel-header,\n.ag-theme-alpine-dark .ag-filter-toolpanel-search,\n.ag-theme-alpine-dark .ag-status-bar,\n.ag-theme-alpine-dark .ag-header-row,\n.ag-theme-alpine-dark .ag-row-number-cell,\n.ag-theme-alpine-dark .ag-panel-title-bar-title,\n.ag-theme-alpine-dark .ag-multi-filter-group-title-bar,\n.ag-theme-alpine-auto-dark .ag-filter-toolpanel-header,\n.ag-theme-alpine-auto-dark .ag-filter-toolpanel-search,\n.ag-theme-alpine-auto-dark .ag-status-bar,\n.ag-theme-alpine-auto-dark .ag-header-row,\n.ag-theme-alpine-auto-dark .ag-row-number-cell,\n.ag-theme-alpine-auto-dark .ag-panel-title-bar-title,\n.ag-theme-alpine-auto-dark .ag-multi-filter-group-title-bar {\n font-weight: 700;\n color: var(--ag-header-foreground-color);\n}\n.ag-theme-alpine .ag-row,\n.ag-theme-alpine-dark .ag-row,\n.ag-theme-alpine-auto-dark .ag-row {\n font-size: calc(var(--ag-font-size) + 1px);\n}\n.ag-theme-alpine input[class^=ag-]:not([type]),\n.ag-theme-alpine input[class^=ag-][type=text],\n.ag-theme-alpine input[class^=ag-][type=number],\n.ag-theme-alpine input[class^=ag-][type=tel],\n.ag-theme-alpine input[class^=ag-][type=date],\n.ag-theme-alpine input[class^=ag-][type=datetime-local],\n.ag-theme-alpine textarea[class^=ag-],\n.ag-theme-alpine-dark input[class^=ag-]:not([type]),\n.ag-theme-alpine-dark input[class^=ag-][type=text],\n.ag-theme-alpine-dark input[class^=ag-][type=number],\n.ag-theme-alpine-dark input[class^=ag-][type=tel],\n.ag-theme-alpine-dark input[class^=ag-][type=date],\n.ag-theme-alpine-dark input[class^=ag-][type=datetime-local],\n.ag-theme-alpine-dark textarea[class^=ag-],\n.ag-theme-alpine-auto-dark input[class^=ag-]:not([type]),\n.ag-theme-alpine-auto-dark input[class^=ag-][type=text],\n.ag-theme-alpine-auto-dark input[class^=ag-][type=number],\n.ag-theme-alpine-auto-dark input[class^=ag-][type=tel],\n.ag-theme-alpine-auto-dark input[class^=ag-][type=date],\n.ag-theme-alpine-auto-dark input[class^=ag-][type=datetime-local],\n.ag-theme-alpine-auto-dark textarea[class^=ag-] {\n min-height: calc(var(--ag-grid-size) * 4);\n border-radius: var(--ag-border-radius);\n}\n.ag-theme-alpine .ag-ltr input[class^=ag-]:not([type]), .ag-theme-alpine .ag-ltr input[class^=ag-][type=text], .ag-theme-alpine .ag-ltr input[class^=ag-][type=number], .ag-theme-alpine .ag-ltr input[class^=ag-][type=tel], .ag-theme-alpine .ag-ltr input[class^=ag-][type=date], .ag-theme-alpine .ag-ltr input[class^=ag-][type=datetime-local], .ag-theme-alpine .ag-ltr textarea[class^=ag-], .ag-theme-alpine-dark .ag-ltr input[class^=ag-]:not([type]), .ag-theme-alpine-dark .ag-ltr input[class^=ag-][type=text], .ag-theme-alpine-dark .ag-ltr input[class^=ag-][type=number], .ag-theme-alpine-dark .ag-ltr input[class^=ag-][type=tel], .ag-theme-alpine-dark .ag-ltr input[class^=ag-][type=date], .ag-theme-alpine-dark .ag-ltr input[class^=ag-][type=datetime-local], .ag-theme-alpine-dark .ag-ltr textarea[class^=ag-], .ag-theme-alpine-auto-dark .ag-ltr input[class^=ag-]:not([type]), .ag-theme-alpine-auto-dark .ag-ltr input[class^=ag-][type=text], .ag-theme-alpine-auto-dark .ag-ltr input[class^=ag-][type=number], .ag-theme-alpine-auto-dark .ag-ltr input[class^=ag-][type=tel], .ag-theme-alpine-auto-dark .ag-ltr input[class^=ag-][type=date], .ag-theme-alpine-auto-dark .ag-ltr input[class^=ag-][type=datetime-local], .ag-theme-alpine-auto-dark .ag-ltr textarea[class^=ag-] {\n padding-left: var(--ag-grid-size);\n}\n\n.ag-theme-alpine .ag-rtl input[class^=ag-]:not([type]), .ag-theme-alpine .ag-rtl input[class^=ag-][type=text], .ag-theme-alpine .ag-rtl input[class^=ag-][type=number], .ag-theme-alpine .ag-rtl input[class^=ag-][type=tel], .ag-theme-alpine .ag-rtl input[class^=ag-][type=date], .ag-theme-alpine .ag-rtl input[class^=ag-][type=datetime-local], .ag-theme-alpine .ag-rtl textarea[class^=ag-], .ag-theme-alpine-dark .ag-rtl input[class^=ag-]:not([type]), .ag-theme-alpine-dark .ag-rtl input[class^=ag-][type=text], .ag-theme-alpine-dark .ag-rtl input[class^=ag-][type=number], .ag-theme-alpine-dark .ag-rtl input[class^=ag-][type=tel], .ag-theme-alpine-dark .ag-rtl input[class^=ag-][type=date], .ag-theme-alpine-dark .ag-rtl input[class^=ag-][type=datetime-local], .ag-theme-alpine-dark .ag-rtl textarea[class^=ag-], .ag-theme-alpine-auto-dark .ag-rtl input[class^=ag-]:not([type]), .ag-theme-alpine-auto-dark .ag-rtl input[class^=ag-][type=text], .ag-theme-alpine-auto-dark .ag-rtl input[class^=ag-][type=number], .ag-theme-alpine-auto-dark .ag-rtl input[class^=ag-][type=tel], .ag-theme-alpine-auto-dark .ag-rtl input[class^=ag-][type=date], .ag-theme-alpine-auto-dark .ag-rtl input[class^=ag-][type=datetime-local], .ag-theme-alpine-auto-dark .ag-rtl textarea[class^=ag-] {\n padding-right: var(--ag-grid-size);\n}\n\n.ag-theme-alpine .ag-tab,\n.ag-theme-alpine-dark .ag-tab,\n.ag-theme-alpine-auto-dark .ag-tab {\n padding: calc(var(--ag-grid-size) * 1.5);\n transition: color 0.4s;\n flex: 1 1 auto;\n}\n.ag-theme-alpine .ag-tab-selected,\n.ag-theme-alpine-dark .ag-tab-selected,\n.ag-theme-alpine-auto-dark .ag-tab-selected {\n color: var(--ag-alpine-active-color);\n}\n.ag-theme-alpine .ag-menu,\n.ag-theme-alpine-dark .ag-menu,\n.ag-theme-alpine-auto-dark .ag-menu {\n background-color: var(--ag-control-panel-background-color);\n}\n.ag-theme-alpine .ag-panel-content-wrapper .ag-column-select,\n.ag-theme-alpine-dark .ag-panel-content-wrapper .ag-column-select,\n.ag-theme-alpine-auto-dark .ag-panel-content-wrapper .ag-column-select {\n background-color: var(--ag-control-panel-background-color);\n}\n.ag-theme-alpine .ag-menu-header,\n.ag-theme-alpine-dark .ag-menu-header,\n.ag-theme-alpine-auto-dark .ag-menu-header {\n background-color: var(--ag-control-panel-background-color);\n padding-top: 1px;\n}\n.ag-theme-alpine .ag-tabs-header,\n.ag-theme-alpine-dark .ag-tabs-header,\n.ag-theme-alpine-auto-dark .ag-tabs-header {\n border-bottom: var(--ag-borders) var(--ag-border-color);\n}\n.ag-theme-alpine .ag-charts-settings-group-title-bar,\n.ag-theme-alpine .ag-charts-data-group-title-bar,\n.ag-theme-alpine .ag-charts-format-top-level-group-title-bar,\n.ag-theme-alpine .ag-charts-advanced-settings-top-level-group-title-bar,\n.ag-theme-alpine-dark .ag-charts-settings-group-title-bar,\n.ag-theme-alpine-dark .ag-charts-data-group-title-bar,\n.ag-theme-alpine-dark .ag-charts-format-top-level-group-title-bar,\n.ag-theme-alpine-dark .ag-charts-advanced-settings-top-level-group-title-bar,\n.ag-theme-alpine-auto-dark .ag-charts-settings-group-title-bar,\n.ag-theme-alpine-auto-dark .ag-charts-data-group-title-bar,\n.ag-theme-alpine-auto-dark .ag-charts-format-top-level-group-title-bar,\n.ag-theme-alpine-auto-dark .ag-charts-advanced-settings-top-level-group-title-bar {\n padding: var(--ag-grid-size) calc(var(--ag-grid-size) * 2);\n line-height: calc(var(--ag-icon-size) + var(--ag-grid-size) - 2px);\n}\n.ag-theme-alpine .ag-chart-mini-thumbnail,\n.ag-theme-alpine-dark .ag-chart-mini-thumbnail,\n.ag-theme-alpine-auto-dark .ag-chart-mini-thumbnail {\n background-color: var(--ag-background-color);\n}\n.ag-theme-alpine .ag-chart-settings-nav-bar,\n.ag-theme-alpine-dark .ag-chart-settings-nav-bar,\n.ag-theme-alpine-auto-dark .ag-chart-settings-nav-bar {\n border-top: var(--ag-borders-secondary) var(--ag-secondary-border-color);\n}\n.ag-theme-alpine .ag-ltr .ag-group-title-bar-icon, .ag-theme-alpine-dark .ag-ltr .ag-group-title-bar-icon, .ag-theme-alpine-auto-dark .ag-ltr .ag-group-title-bar-icon {\n margin-right: var(--ag-grid-size);\n}\n\n.ag-theme-alpine .ag-rtl .ag-group-title-bar-icon, .ag-theme-alpine-dark .ag-rtl .ag-group-title-bar-icon, .ag-theme-alpine-auto-dark .ag-rtl .ag-group-title-bar-icon {\n margin-left: var(--ag-grid-size);\n}\n\n.ag-theme-alpine .ag-charts-format-top-level-group-toolbar,\n.ag-theme-alpine .ag-charts-advanced-settings-top-level-group-toolbar,\n.ag-theme-alpine-dark .ag-charts-format-top-level-group-toolbar,\n.ag-theme-alpine-dark .ag-charts-advanced-settings-top-level-group-toolbar,\n.ag-theme-alpine-auto-dark .ag-charts-format-top-level-group-toolbar,\n.ag-theme-alpine-auto-dark .ag-charts-advanced-settings-top-level-group-toolbar {\n margin-top: var(--ag-grid-size);\n}\n.ag-theme-alpine .ag-ltr .ag-charts-format-top-level-group-toolbar, .ag-theme-alpine .ag-ltr .ag-charts-advanced-settings-top-level-group-toolbar, .ag-theme-alpine-dark .ag-ltr .ag-charts-format-top-level-group-toolbar, .ag-theme-alpine-dark .ag-ltr .ag-charts-advanced-settings-top-level-group-toolbar, .ag-theme-alpine-auto-dark .ag-ltr .ag-charts-format-top-level-group-toolbar, .ag-theme-alpine-auto-dark .ag-ltr .ag-charts-advanced-settings-top-level-group-toolbar {\n padding-left: calc(var(--ag-icon-size) * 0.5 + var(--ag-grid-size) * 2);\n}\n\n.ag-theme-alpine .ag-rtl .ag-charts-format-top-level-group-toolbar, .ag-theme-alpine .ag-rtl .ag-charts-advanced-settings-top-level-group-toolbar, .ag-theme-alpine-dark .ag-rtl .ag-charts-format-top-level-group-toolbar, .ag-theme-alpine-dark .ag-rtl .ag-charts-advanced-settings-top-level-group-toolbar, .ag-theme-alpine-auto-dark .ag-rtl .ag-charts-format-top-level-group-toolbar, .ag-theme-alpine-auto-dark .ag-rtl .ag-charts-advanced-settings-top-level-group-toolbar {\n padding-right: calc(var(--ag-icon-size) * 0.5 + var(--ag-grid-size) * 2);\n}\n\n.ag-theme-alpine .ag-charts-format-sub-level-group,\n.ag-theme-alpine-dark .ag-charts-format-sub-level-group,\n.ag-theme-alpine-auto-dark .ag-charts-format-sub-level-group {\n border-left: dashed 1px;\n border-left-color: var(--ag-border-color);\n padding-left: var(--ag-grid-size);\n margin-bottom: calc(var(--ag-grid-size) * 2);\n}\n.ag-theme-alpine .ag-charts-format-sub-level-group-title-bar,\n.ag-theme-alpine-dark .ag-charts-format-sub-level-group-title-bar,\n.ag-theme-alpine-auto-dark .ag-charts-format-sub-level-group-title-bar {\n padding-top: 0;\n padding-bottom: 0;\n background: none;\n font-weight: 700;\n}\n.ag-theme-alpine .ag-charts-format-sub-level-group-container,\n.ag-theme-alpine-dark .ag-charts-format-sub-level-group-container,\n.ag-theme-alpine-auto-dark .ag-charts-format-sub-level-group-container {\n padding-bottom: 0;\n}\n.ag-theme-alpine .ag-charts-format-sub-level-group-item:last-child,\n.ag-theme-alpine-dark .ag-charts-format-sub-level-group-item:last-child,\n.ag-theme-alpine-auto-dark .ag-charts-format-sub-level-group-item:last-child {\n margin-bottom: 0;\n}\n.ag-theme-alpine.ag-dnd-ghost,\n.ag-theme-alpine-dark.ag-dnd-ghost,\n.ag-theme-alpine-auto-dark.ag-dnd-ghost {\n font-size: calc(var(--ag-font-size) - 1px);\n font-weight: 700;\n}\n.ag-theme-alpine .ag-side-buttons,\n.ag-theme-alpine-dark .ag-side-buttons,\n.ag-theme-alpine-auto-dark .ag-side-buttons {\n width: calc(var(--ag-grid-size) * 5);\n}\n.ag-theme-alpine .ag-standard-button,\n.ag-theme-alpine-dark .ag-standard-button,\n.ag-theme-alpine-auto-dark .ag-standard-button {\n font-family: inherit;\n appearance: none;\n -webkit-appearance: none;\n border-radius: var(--ag-border-radius);\n border: 1px solid;\n border-color: var(--ag-alpine-active-color);\n color: var(--ag-alpine-active-color);\n background-color: var(--ag-background-color);\n font-weight: 600;\n padding: var(--ag-grid-size) calc(var(--ag-grid-size) * 2);\n}\n.ag-theme-alpine .ag-standard-button:hover,\n.ag-theme-alpine-dark .ag-standard-button:hover,\n.ag-theme-alpine-auto-dark .ag-standard-button:hover {\n border-color: var(--ag-alpine-active-color);\n background-color: var(--ag-row-hover-color);\n}\n.ag-theme-alpine .ag-standard-button:active,\n.ag-theme-alpine-dark .ag-standard-button:active,\n.ag-theme-alpine-auto-dark .ag-standard-button:active {\n border-color: var(--ag-alpine-active-color);\n background-color: var(--ag-alpine-active-color);\n color: var(--ag-background-color);\n}\n.ag-theme-alpine .ag-standard-button:disabled,\n.ag-theme-alpine-dark .ag-standard-button:disabled,\n.ag-theme-alpine-auto-dark .ag-standard-button:disabled {\n color: var(--ag-disabled-foreground-color);\n background-color: var(--ag-input-disabled-background-color);\n border-color: var(--ag-input-disabled-border-color);\n}\n.ag-theme-alpine .ag-column-drop-vertical,\n.ag-theme-alpine-dark .ag-column-drop-vertical,\n.ag-theme-alpine-auto-dark .ag-column-drop-vertical {\n min-height: 75px;\n}\n.ag-theme-alpine .ag-column-drop-vertical-title-bar,\n.ag-theme-alpine-dark .ag-column-drop-vertical-title-bar,\n.ag-theme-alpine-auto-dark .ag-column-drop-vertical-title-bar {\n padding: calc(var(--ag-grid-size) * 2);\n padding-bottom: 0px;\n}\n.ag-theme-alpine .ag-column-drop-vertical-empty-message,\n.ag-theme-alpine-dark .ag-column-drop-vertical-empty-message,\n.ag-theme-alpine-auto-dark .ag-column-drop-vertical-empty-message {\n display: flex;\n align-items: center;\n border: dashed 1px;\n border-color: var(--ag-border-color);\n margin: calc(var(--ag-grid-size) * 2);\n padding: calc(var(--ag-grid-size) * 2);\n}\n.ag-theme-alpine .ag-column-drop-empty-message,\n.ag-theme-alpine-dark .ag-column-drop-empty-message,\n.ag-theme-alpine-auto-dark .ag-column-drop-empty-message {\n color: var(--ag-foreground-color);\n opacity: 0.75;\n}\n.ag-theme-alpine .ag-pill-select .ag-column-drop,\n.ag-theme-alpine-dark .ag-pill-select .ag-column-drop,\n.ag-theme-alpine-auto-dark .ag-pill-select .ag-column-drop {\n min-height: unset;\n}\n.ag-theme-alpine .ag-status-bar,\n.ag-theme-alpine-dark .ag-status-bar,\n.ag-theme-alpine-auto-dark .ag-status-bar {\n font-weight: normal;\n}\n.ag-theme-alpine .ag-status-name-value-value,\n.ag-theme-alpine-dark .ag-status-name-value-value,\n.ag-theme-alpine-auto-dark .ag-status-name-value-value {\n font-weight: 700;\n}\n.ag-theme-alpine .ag-paging-number,\n.ag-theme-alpine .ag-paging-row-summary-panel-number,\n.ag-theme-alpine-dark .ag-paging-number,\n.ag-theme-alpine-dark .ag-paging-row-summary-panel-number,\n.ag-theme-alpine-auto-dark .ag-paging-number,\n.ag-theme-alpine-auto-dark .ag-paging-row-summary-panel-number {\n font-weight: 700;\n}\n.ag-theme-alpine .ag-column-drop-cell-button,\n.ag-theme-alpine-dark .ag-column-drop-cell-button,\n.ag-theme-alpine-auto-dark .ag-column-drop-cell-button {\n opacity: 0.5;\n}\n.ag-theme-alpine .ag-column-drop-cell-button:hover,\n.ag-theme-alpine-dark .ag-column-drop-cell-button:hover,\n.ag-theme-alpine-auto-dark .ag-column-drop-cell-button:hover {\n opacity: 0.75;\n}\n.ag-theme-alpine .ag-column-select-column-readonly.ag-icon-grip,\n.ag-theme-alpine .ag-column-select-column-readonly .ag-icon-grip,\n.ag-theme-alpine-dark .ag-column-select-column-readonly.ag-icon-grip,\n.ag-theme-alpine-dark .ag-column-select-column-readonly .ag-icon-grip,\n.ag-theme-alpine-auto-dark .ag-column-select-column-readonly.ag-icon-grip,\n.ag-theme-alpine-auto-dark .ag-column-select-column-readonly .ag-icon-grip {\n opacity: 0.35;\n}\n.ag-theme-alpine .ag-header-cell-menu-button:hover,\n.ag-theme-alpine .ag-header-cell-filter-button:hover,\n.ag-theme-alpine .ag-side-button-button:hover,\n.ag-theme-alpine .ag-tab:hover,\n.ag-theme-alpine .ag-panel-title-bar-button:hover,\n.ag-theme-alpine .ag-header-expand-icon:hover,\n.ag-theme-alpine .ag-column-group-icons:hover,\n.ag-theme-alpine .ag-set-filter-group-icons:hover,\n.ag-theme-alpine .ag-group-expanded .ag-icon:hover,\n.ag-theme-alpine .ag-group-contracted .ag-icon:hover,\n.ag-theme-alpine .ag-chart-settings-prev:hover,\n.ag-theme-alpine .ag-chart-settings-next:hover,\n.ag-theme-alpine .ag-group-title-bar-icon:hover,\n.ag-theme-alpine .ag-column-select-header-icon:hover,\n.ag-theme-alpine .ag-floating-filter-button-button:hover,\n.ag-theme-alpine .ag-filter-toolpanel-expand:hover,\n.ag-theme-alpine .ag-chart-menu-icon:hover,\n.ag-theme-alpine-dark .ag-header-cell-menu-button:hover,\n.ag-theme-alpine-dark .ag-header-cell-filter-button:hover,\n.ag-theme-alpine-dark .ag-side-button-button:hover,\n.ag-theme-alpine-dark .ag-tab:hover,\n.ag-theme-alpine-dark .ag-panel-title-bar-button:hover,\n.ag-theme-alpine-dark .ag-header-expand-icon:hover,\n.ag-theme-alpine-dark .ag-column-group-icons:hover,\n.ag-theme-alpine-dark .ag-set-filter-group-icons:hover,\n.ag-theme-alpine-dark .ag-group-expanded .ag-icon:hover,\n.ag-theme-alpine-dark .ag-group-contracted .ag-icon:hover,\n.ag-theme-alpine-dark .ag-chart-settings-prev:hover,\n.ag-theme-alpine-dark .ag-chart-settings-next:hover,\n.ag-theme-alpine-dark .ag-group-title-bar-icon:hover,\n.ag-theme-alpine-dark .ag-column-select-header-icon:hover,\n.ag-theme-alpine-dark .ag-floating-filter-button-button:hover,\n.ag-theme-alpine-dark .ag-filter-toolpanel-expand:hover,\n.ag-theme-alpine-dark .ag-chart-menu-icon:hover,\n.ag-theme-alpine-auto-dark .ag-header-cell-menu-button:hover,\n.ag-theme-alpine-auto-dark .ag-header-cell-filter-button:hover,\n.ag-theme-alpine-auto-dark .ag-side-button-button:hover,\n.ag-theme-alpine-auto-dark .ag-tab:hover,\n.ag-theme-alpine-auto-dark .ag-panel-title-bar-button:hover,\n.ag-theme-alpine-auto-dark .ag-header-expand-icon:hover,\n.ag-theme-alpine-auto-dark .ag-column-group-icons:hover,\n.ag-theme-alpine-auto-dark .ag-set-filter-group-icons:hover,\n.ag-theme-alpine-auto-dark .ag-group-expanded .ag-icon:hover,\n.ag-theme-alpine-auto-dark .ag-group-contracted .ag-icon:hover,\n.ag-theme-alpine-auto-dark .ag-chart-settings-prev:hover,\n.ag-theme-alpine-auto-dark .ag-chart-settings-next:hover,\n.ag-theme-alpine-auto-dark .ag-group-title-bar-icon:hover,\n.ag-theme-alpine-auto-dark .ag-column-select-header-icon:hover,\n.ag-theme-alpine-auto-dark .ag-floating-filter-button-button:hover,\n.ag-theme-alpine-auto-dark .ag-filter-toolpanel-expand:hover,\n.ag-theme-alpine-auto-dark .ag-chart-menu-icon:hover {\n color: var(--ag-alpine-active-color);\n}\n.ag-theme-alpine .ag-header-cell-menu-button:hover .ag-icon,\n.ag-theme-alpine .ag-header-cell-filter-button:hover .ag-icon,\n.ag-theme-alpine .ag-side-button-button:hover .ag-icon,\n.ag-theme-alpine .ag-panel-title-bar-button:hover .ag-icon,\n.ag-theme-alpine .ag-floating-filter-button-button:hover .ag-icon,\n.ag-theme-alpine-dark .ag-header-cell-menu-button:hover .ag-icon,\n.ag-theme-alpine-dark .ag-header-cell-filter-button:hover .ag-icon,\n.ag-theme-alpine-dark .ag-side-button-button:hover .ag-icon,\n.ag-theme-alpine-dark .ag-panel-title-bar-button:hover .ag-icon,\n.ag-theme-alpine-dark .ag-floating-filter-button-button:hover .ag-icon,\n.ag-theme-alpine-auto-dark .ag-header-cell-menu-button:hover .ag-icon,\n.ag-theme-alpine-auto-dark .ag-header-cell-filter-button:hover .ag-icon,\n.ag-theme-alpine-auto-dark .ag-side-button-button:hover .ag-icon,\n.ag-theme-alpine-auto-dark .ag-panel-title-bar-button:hover .ag-icon,\n.ag-theme-alpine-auto-dark .ag-floating-filter-button-button:hover .ag-icon {\n color: inherit;\n}\n.ag-theme-alpine .ag-filter-active .ag-icon-filter,\n.ag-theme-alpine-dark .ag-filter-active .ag-icon-filter,\n.ag-theme-alpine-auto-dark .ag-filter-active .ag-icon-filter {\n color: var(--ag-alpine-active-color);\n}\n.ag-theme-alpine .ag-chart-settings-card-item.ag-not-selected:hover,\n.ag-theme-alpine-dark .ag-chart-settings-card-item.ag-not-selected:hover,\n.ag-theme-alpine-auto-dark .ag-chart-settings-card-item.ag-not-selected:hover {\n opacity: 0.35;\n}\n.ag-theme-alpine .ag-ltr .ag-panel-title-bar-button, .ag-theme-alpine-dark .ag-ltr .ag-panel-title-bar-button, .ag-theme-alpine-auto-dark .ag-ltr .ag-panel-title-bar-button {\n margin-left: calc(var(--ag-grid-size) * 2);\n margin-right: var(--ag-grid-size);\n}\n\n.ag-theme-alpine .ag-rtl .ag-panel-title-bar-button, .ag-theme-alpine-dark .ag-rtl .ag-panel-title-bar-button, .ag-theme-alpine-auto-dark .ag-rtl .ag-panel-title-bar-button {\n margin-right: calc(var(--ag-grid-size) * 2);\n margin-left: var(--ag-grid-size);\n}\n\n.ag-theme-alpine .ag-ltr .ag-filter-toolpanel-group-container, .ag-theme-alpine-dark .ag-ltr .ag-filter-toolpanel-group-container, .ag-theme-alpine-auto-dark .ag-ltr .ag-filter-toolpanel-group-container {\n padding-left: var(--ag-grid-size);\n}\n\n.ag-theme-alpine .ag-rtl .ag-filter-toolpanel-group-container, .ag-theme-alpine-dark .ag-rtl .ag-filter-toolpanel-group-container, .ag-theme-alpine-auto-dark .ag-rtl .ag-filter-toolpanel-group-container {\n padding-right: var(--ag-grid-size);\n}\n\n.ag-theme-alpine .ag-filter-toolpanel-instance-filter,\n.ag-theme-alpine-dark .ag-filter-toolpanel-instance-filter,\n.ag-theme-alpine-auto-dark .ag-filter-toolpanel-instance-filter {\n border: none;\n background-color: var(--ag-control-panel-background-color);\n}\n.ag-theme-alpine .ag-ltr .ag-filter-toolpanel-instance-filter, .ag-theme-alpine-dark .ag-ltr .ag-filter-toolpanel-instance-filter, .ag-theme-alpine-auto-dark .ag-ltr .ag-filter-toolpanel-instance-filter {\n border-left: dashed 1px;\n border-left-color: var(--ag-border-color);\n margin-left: calc(var(--ag-icon-size) * 0.5);\n}\n\n.ag-theme-alpine .ag-rtl .ag-filter-toolpanel-instance-filter, .ag-theme-alpine-dark .ag-rtl .ag-filter-toolpanel-instance-filter, .ag-theme-alpine-auto-dark .ag-rtl .ag-filter-toolpanel-instance-filter {\n border-right: dashed 1px;\n border-right-color: var(--ag-border-color);\n margin-right: calc(var(--ag-icon-size) * 0.5);\n}\n\n.ag-theme-alpine .ag-set-filter-list,\n.ag-theme-alpine-dark .ag-set-filter-list,\n.ag-theme-alpine-auto-dark .ag-set-filter-list {\n padding-top: calc(var(--ag-grid-size) * 0.5);\n padding-bottom: calc(var(--ag-grid-size) * 0.5);\n}\n.ag-theme-alpine .ag-layout-auto-height .ag-center-cols-viewport,\n.ag-theme-alpine .ag-layout-auto-height .ag-center-cols-container,\n.ag-theme-alpine .ag-layout-print .ag-center-cols-viewport,\n.ag-theme-alpine .ag-layout-print .ag-center-cols-container,\n.ag-theme-alpine-dark .ag-layout-auto-height .ag-center-cols-viewport,\n.ag-theme-alpine-dark .ag-layout-auto-height .ag-center-cols-container,\n.ag-theme-alpine-dark .ag-layout-print .ag-center-cols-viewport,\n.ag-theme-alpine-dark .ag-layout-print .ag-center-cols-container,\n.ag-theme-alpine-auto-dark .ag-layout-auto-height .ag-center-cols-viewport,\n.ag-theme-alpine-auto-dark .ag-layout-auto-height .ag-center-cols-container,\n.ag-theme-alpine-auto-dark .ag-layout-print .ag-center-cols-viewport,\n.ag-theme-alpine-auto-dark .ag-layout-print .ag-center-cols-container {\n min-height: 150px;\n}\n.ag-theme-alpine .ag-date-time-list-page-entry-is-current,\n.ag-theme-alpine-dark .ag-date-time-list-page-entry-is-current,\n.ag-theme-alpine-auto-dark .ag-date-time-list-page-entry-is-current {\n background-color: var(--ag-alpine-active-color);\n}\n.ag-theme-alpine .ag-advanced-filter-builder-button,\n.ag-theme-alpine-dark .ag-advanced-filter-builder-button,\n.ag-theme-alpine-auto-dark .ag-advanced-filter-builder-button {\n padding: var(--ag-grid-size);\n font-weight: 600;\n}\n.ag-theme-alpine .ag-list-item-hovered::after,\n.ag-theme-alpine-dark .ag-list-item-hovered::after,\n.ag-theme-alpine-auto-dark .ag-list-item-hovered::after {\n background-color: var(--ag-alpine-active-color);\n}\n.ag-theme-alpine .ag-pill .ag-pill-button:hover,\n.ag-theme-alpine-dark .ag-pill .ag-pill-button:hover,\n.ag-theme-alpine-auto-dark .ag-pill .ag-pill-button:hover {\n color: var(--ag-alpine-active-color);\n}\n.ag-theme-alpine .ag-header-highlight-before::after,\n.ag-theme-alpine .ag-header-highlight-after::after,\n.ag-theme-alpine-dark .ag-header-highlight-before::after,\n.ag-theme-alpine-dark .ag-header-highlight-after::after,\n.ag-theme-alpine-auto-dark .ag-header-highlight-before::after,\n.ag-theme-alpine-auto-dark .ag-header-highlight-after::after {\n background-color: var(--ag-alpine-active-color);\n}\n.ag-theme-alpine .ag-advanced-filter-builder-item-button-disabled .ag-icon,\n.ag-theme-alpine .ag-disabled .ag-icon,\n.ag-theme-alpine .ag-column-select-column-group-readonly .ag-icon,\n.ag-theme-alpine [disabled] .ag-icon,\n.ag-theme-alpine-dark .ag-advanced-filter-builder-item-button-disabled .ag-icon,\n.ag-theme-alpine-dark .ag-disabled .ag-icon,\n.ag-theme-alpine-dark .ag-column-select-column-group-readonly .ag-icon,\n.ag-theme-alpine-dark [disabled] .ag-icon,\n.ag-theme-alpine-auto-dark .ag-advanced-filter-builder-item-button-disabled .ag-icon,\n.ag-theme-alpine-auto-dark .ag-disabled .ag-icon,\n.ag-theme-alpine-auto-dark .ag-column-select-column-group-readonly .ag-icon,\n.ag-theme-alpine-auto-dark [disabled] .ag-icon {\n color: var(--ag-disabled-foreground-color);\n}\n", ""]); // Exports /* harmony default export */ __webpack_exports__.A = (___CSS_LOADER_EXPORT___); /***/ }), /***/ 8225: /***/ (function(module, __webpack_exports__, __webpack_require__) { /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6758); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(935); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); // Imports var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module ___CSS_LOADER_EXPORT___.push([module.id, ".ag-theme-balham,\n.ag-theme-balham-dark,\n.ag-theme-balham-auto-dark {\n --ag-balham-active-color: #0091ea;\n --ag-foreground-color: #000;\n --ag-background-color: #fff;\n --ag-header-background-color: #f5f7f7;\n --ag-tooltip-background-color: #cbd0d3;\n --ag-subheader-background-color: #e2e9eb;\n --ag-control-panel-background-color: #f5f7f7;\n --ag-border-color: #bdc3c7;\n --ag-odd-row-background-color: #fcfdfe;\n --ag-row-hover-color: #ecf0f1;\n --ag-column-hover-color: #ecf0f1;\n --ag-input-border-color: #95a5a6;\n --ag-invalid-color: #e02525;\n --ag-input-disabled-background-color: #ebebeb;\n --ag-checkbox-unchecked-color: #7f8c8d;\n --ag-input-focus-border-color: #719ece;\n --ag-advanced-filter-join-pill-color: #f08e8d;\n --ag-advanced-filter-column-pill-color: #a6e194;\n --ag-advanced-filter-option-pill-color: #f3c08b;\n --ag-advanced-filter-value-pill-color: #85c0e4;\n --ag-input-focus-box-shadow: 0 0 2px 1px var(--ag-input-focus-border-color);\n --ag-range-selection-border-color: var(--ag-balham-active-color);\n --ag-checkbox-checked-color: var(--ag-balham-active-color);\n --ag-checkbox-background-color: var(--ag-background-color);\n --ag-panel-background-color: var(--ag-header-background-color);\n --ag-secondary-foreground-color: rgba(0, 0, 0, 0.54);\n --ag-disabled-foreground-color: rgba(0, 0, 0, 0.38);\n --ag-subheader-toolbar-background-color: rgba(226, 233, 235, 0.5);\n --ag-row-border-color: rgba(189, 195, 199, 0.58);\n --ag-chip-background-color: rgba(0, 0, 0, 0.1);\n --ag-range-selection-background-color: rgba(0, 145, 234, 0.2);\n --ag-range-selection-background-color-2: rgba(0, 145, 234, 0.36);\n --ag-range-selection-background-color-3: rgba(0, 145, 234, 0.49);\n --ag-range-selection-background-color-4: rgba(0, 145, 234, 0.59);\n --ag-selected-row-background-color: rgba(0, 145, 234, 0.28);\n --ag-header-column-separator-color: rgba(189, 195, 199, 0.5);\n --ag-input-disabled-border-color: rgba(149, 165, 166, 0.3);\n --ag-row-numbers-selected-color: color-mix(in srgb, transparent, var(--ag-balham-active-color) 50%);\n --ag-header-column-separator-display: block;\n --ag-header-column-separator-height: 50%;\n --ag-grid-size: 4px;\n --ag-icon-size: 16px;\n --ag-row-height: calc(var(--ag-grid-size) * 7);\n --ag-header-height: calc(var(--ag-grid-size) * 8);\n --ag-list-item-height: calc(var(--ag-grid-size) * 6);\n --ag-row-group-indent-size: calc(var(--ag-grid-size) * 3 + var(--ag-icon-size));\n --ag-cell-horizontal-padding: calc(var(--ag-grid-size) * 3);\n --ag-input-height: calc(var(--ag-grid-size) * 4);\n --ag-chart-menu-panel-width: 240px;\n --ag-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell,\n \"Helvetica Neue\", sans-serif;\n --ag-font-size: 12px;\n --ag-icon-font-family: agGridBalham;\n --ag-border-radius: 2px;\n --ag-checkbox-border-radius: 3px;\n --ag-card-shadow: none;\n}\n\n.ag-theme-balham-dark {\n --ag-balham-active-color: #00b0ff;\n --ag-foreground-color: #f5f5f5;\n --ag-background-color: #2d3436;\n --ag-header-background-color: #1c1c1c;\n --ag-tooltip-background-color: #1c1f20;\n --ag-subheader-background-color: #111;\n --ag-control-panel-background-color: #202020;\n --ag-border-color: #424242;\n --ag-odd-row-background-color: #262c2e;\n --ag-row-hover-color: #3d4749;\n --ag-column-hover-color: #3d4749;\n --ag-input-border-color: #f0f0f0;\n --ag-input-disabled-background-color: rgba(48, 46, 46, 0.3);\n --ag-modal-overlay-background-color: rgba(45, 52, 54, 0.66);\n --ag-checkbox-unchecked-color: #ecf0f1;\n --ag-advanced-filter-join-pill-color: #7a3a37;\n --ag-advanced-filter-column-pill-color: #355f2d;\n --ag-advanced-filter-option-pill-color: #5a3168;\n --ag-advanced-filter-value-pill-color: #374c86;\n --ag-secondary-foreground-color: var(--ag-foreground-color);\n --ag-disabled-foreground-color: rgba(245, 245, 245, 0.38);\n --ag-subheader-toolbar-background-color: rgba(17, 17, 17, 0.5);\n --ag-row-border-color: #5c5c5c;\n --ag-chip-background-color: rgba(245, 245, 245, 0.08);\n --ag-range-selection-background-color: rgba(0, 176, 255, 0.2);\n --ag-range-selection-background-color-2: rgba(0, 176, 255, 0.36);\n --ag-range-selection-background-color-3: rgba(0, 176, 255, 0.49);\n --ag-range-selection-background-color-4: rgba(0, 176, 255, 0.59);\n --ag-selected-row-background-color: rgba(0, 176, 255, 0.28);\n --ag-header-column-separator-color: rgba(66, 66, 66, 0.5);\n --ag-input-disabled-border-color: rgba(240, 240, 240, 0.3);\n --ag-header-foreground-color: rgba(245, 245, 245, 0.64);\n --ag-toggle-button-off-background-color: transparent;\n --ag-toggle-button-off-border-color: var(--ag-foreground-color);\n --ag-range-selection-chart-category-background-color: rgba(26, 177, 74, 0.5);\n --ag-range-selection-chart-background-color: rgba(45, 166, 255, 0.5);\n --ag-input-focus-box-shadow: 0 0 4px 1.5px var(--ag-input-focus-border-color);\n --ag-row-loading-skeleton-effect-color: rgba(202, 203, 204, 0.4);\n color-scheme: dark;\n}\n\n@media (prefers-color-scheme: dark) {\n .ag-theme-balham-auto-dark {\n --ag-balham-active-color: #00b0ff;\n --ag-foreground-color: #f5f5f5;\n --ag-background-color: #2d3436;\n --ag-header-background-color: #1c1c1c;\n --ag-tooltip-background-color: #1c1f20;\n --ag-subheader-background-color: #111;\n --ag-control-panel-background-color: #202020;\n --ag-border-color: #424242;\n --ag-odd-row-background-color: #262c2e;\n --ag-row-hover-color: #3d4749;\n --ag-column-hover-color: #3d4749;\n --ag-input-border-color: #f0f0f0;\n --ag-input-disabled-background-color: rgba(48, 46, 46, 0.3);\n --ag-modal-overlay-background-color: rgba(45, 52, 54, 0.66);\n --ag-checkbox-unchecked-color: #ecf0f1;\n --ag-advanced-filter-join-pill-color: #7a3a37;\n --ag-advanced-filter-column-pill-color: #355f2d;\n --ag-advanced-filter-option-pill-color: #5a3168;\n --ag-advanced-filter-value-pill-color: #374c86;\n --ag-secondary-foreground-color: var(--ag-foreground-color);\n --ag-disabled-foreground-color: rgba(245, 245, 245, 0.38);\n --ag-subheader-toolbar-background-color: rgba(17, 17, 17, 0.5);\n --ag-row-border-color: #5c5c5c;\n --ag-chip-background-color: rgba(245, 245, 245, 0.08);\n --ag-range-selection-background-color: rgba(0, 176, 255, 0.2);\n --ag-range-selection-background-color-2: rgba(0, 176, 255, 0.36);\n --ag-range-selection-background-color-3: rgba(0, 176, 255, 0.49);\n --ag-range-selection-background-color-4: rgba(0, 176, 255, 0.59);\n --ag-selected-row-background-color: rgba(0, 176, 255, 0.28);\n --ag-header-column-separator-color: rgba(66, 66, 66, 0.5);\n --ag-input-disabled-border-color: rgba(240, 240, 240, 0.3);\n --ag-header-foreground-color: rgba(245, 245, 245, 0.64);\n --ag-toggle-button-off-background-color: transparent;\n --ag-toggle-button-off-border-color: var(--ag-foreground-color);\n --ag-range-selection-chart-category-background-color: rgba(26, 177, 74, 0.5);\n --ag-range-selection-chart-background-color: rgba(45, 166, 255, 0.5);\n --ag-input-focus-box-shadow: 0 0 4px 1.5px var(--ag-input-focus-border-color);\n --ag-row-loading-skeleton-effect-color: rgba(202, 203, 204, 0.4);\n color-scheme: dark;\n }\n}\n.ag-theme-balham .ag-filter-toolpanel-header,\n.ag-theme-balham .ag-filter-toolpanel-search,\n.ag-theme-balham .ag-status-bar,\n.ag-theme-balham .ag-header-row,\n.ag-theme-balham .ag-row-number-cell,\n.ag-theme-balham .ag-multi-filter-group-title-bar,\n.ag-theme-balham-dark .ag-filter-toolpanel-header,\n.ag-theme-balham-dark .ag-filter-toolpanel-search,\n.ag-theme-balham-dark .ag-status-bar,\n.ag-theme-balham-dark .ag-header-row,\n.ag-theme-balham-dark .ag-row-number-cell,\n.ag-theme-balham-dark .ag-multi-filter-group-title-bar,\n.ag-theme-balham-auto-dark .ag-filter-toolpanel-header,\n.ag-theme-balham-auto-dark .ag-filter-toolpanel-search,\n.ag-theme-balham-auto-dark .ag-status-bar,\n.ag-theme-balham-auto-dark .ag-header-row,\n.ag-theme-balham-auto-dark .ag-row-number-cell,\n.ag-theme-balham-auto-dark .ag-multi-filter-group-title-bar {\n font-weight: 600;\n color: var(--ag-header-foreground-color);\n}\n.ag-theme-balham .ag-ltr input[class^=ag-]:not([type]), .ag-theme-balham .ag-ltr input[class^=ag-][type=text], .ag-theme-balham .ag-ltr input[class^=ag-][type=number], .ag-theme-balham .ag-ltr input[class^=ag-][type=tel], .ag-theme-balham .ag-ltr input[class^=ag-][type=date], .ag-theme-balham .ag-ltr input[class^=ag-][type=datetime-local], .ag-theme-balham .ag-ltr textarea[class^=ag-], .ag-theme-balham-dark .ag-ltr input[class^=ag-]:not([type]), .ag-theme-balham-dark .ag-ltr input[class^=ag-][type=text], .ag-theme-balham-dark .ag-ltr input[class^=ag-][type=number], .ag-theme-balham-dark .ag-ltr input[class^=ag-][type=tel], .ag-theme-balham-dark .ag-ltr input[class^=ag-][type=date], .ag-theme-balham-dark .ag-ltr input[class^=ag-][type=datetime-local], .ag-theme-balham-dark .ag-ltr textarea[class^=ag-], .ag-theme-balham-auto-dark .ag-ltr input[class^=ag-]:not([type]), .ag-theme-balham-auto-dark .ag-ltr input[class^=ag-][type=text], .ag-theme-balham-auto-dark .ag-ltr input[class^=ag-][type=number], .ag-theme-balham-auto-dark .ag-ltr input[class^=ag-][type=tel], .ag-theme-balham-auto-dark .ag-ltr input[class^=ag-][type=date], .ag-theme-balham-auto-dark .ag-ltr input[class^=ag-][type=datetime-local], .ag-theme-balham-auto-dark .ag-ltr textarea[class^=ag-] {\n padding-left: var(--ag-grid-size);\n}\n\n.ag-theme-balham .ag-rtl input[class^=ag-]:not([type]), .ag-theme-balham .ag-rtl input[class^=ag-][type=text], .ag-theme-balham .ag-rtl input[class^=ag-][type=number], .ag-theme-balham .ag-rtl input[class^=ag-][type=tel], .ag-theme-balham .ag-rtl input[class^=ag-][type=date], .ag-theme-balham .ag-rtl input[class^=ag-][type=datetime-local], .ag-theme-balham .ag-rtl textarea[class^=ag-], .ag-theme-balham-dark .ag-rtl input[class^=ag-]:not([type]), .ag-theme-balham-dark .ag-rtl input[class^=ag-][type=text], .ag-theme-balham-dark .ag-rtl input[class^=ag-][type=number], .ag-theme-balham-dark .ag-rtl input[class^=ag-][type=tel], .ag-theme-balham-dark .ag-rtl input[class^=ag-][type=date], .ag-theme-balham-dark .ag-rtl input[class^=ag-][type=datetime-local], .ag-theme-balham-dark .ag-rtl textarea[class^=ag-], .ag-theme-balham-auto-dark .ag-rtl input[class^=ag-]:not([type]), .ag-theme-balham-auto-dark .ag-rtl input[class^=ag-][type=text], .ag-theme-balham-auto-dark .ag-rtl input[class^=ag-][type=number], .ag-theme-balham-auto-dark .ag-rtl input[class^=ag-][type=tel], .ag-theme-balham-auto-dark .ag-rtl input[class^=ag-][type=date], .ag-theme-balham-auto-dark .ag-rtl input[class^=ag-][type=datetime-local], .ag-theme-balham-auto-dark .ag-rtl textarea[class^=ag-] {\n padding-right: var(--ag-grid-size);\n}\n\n.ag-theme-balham .ag-column-drop-vertical-empty-message,\n.ag-theme-balham .ag-status-bar,\n.ag-theme-balham-dark .ag-column-drop-vertical-empty-message,\n.ag-theme-balham-dark .ag-status-bar,\n.ag-theme-balham-auto-dark .ag-column-drop-vertical-empty-message,\n.ag-theme-balham-auto-dark .ag-status-bar {\n font-weight: 600;\n color: var(--ag-disabled-foreground-color);\n}\n.ag-theme-balham.ag-dnd-ghost,\n.ag-theme-balham-dark.ag-dnd-ghost,\n.ag-theme-balham-auto-dark.ag-dnd-ghost {\n font-size: var(--ag-font-size);\n font-weight: 600;\n}\n.ag-theme-balham .ag-tab,\n.ag-theme-balham-dark .ag-tab,\n.ag-theme-balham-auto-dark .ag-tab {\n border: 1px solid transparent;\n padding: var(--ag-grid-size) calc(var(--ag-grid-size) * 2);\n margin: var(--ag-grid-size);\n margin-bottom: -1px;\n}\n.ag-theme-balham .ag-tab-selected,\n.ag-theme-balham-dark .ag-tab-selected,\n.ag-theme-balham-auto-dark .ag-tab-selected {\n background-color: var(--ag-background-color);\n border-color: var(--ag-border-color);\n border-bottom-color: transparent;\n}\n.ag-theme-balham .ag-tabs-header,\n.ag-theme-balham-dark .ag-tabs-header,\n.ag-theme-balham-auto-dark .ag-tabs-header {\n border-bottom: 1px solid var(--ag-border-color);\n}\n.ag-theme-balham .ag-column-drop-cell,\n.ag-theme-balham-dark .ag-column-drop-cell,\n.ag-theme-balham-auto-dark .ag-column-drop-cell {\n height: calc(var(--ag-grid-size) * 6);\n}\n.ag-theme-balham .ag-column-drop-vertical-title,\n.ag-theme-balham-dark .ag-column-drop-vertical-title,\n.ag-theme-balham-auto-dark .ag-column-drop-vertical-title {\n color: var(--ag-foreground-color);\n}\n.ag-theme-balham .ag-column-drop-vertical-cell,\n.ag-theme-balham-dark .ag-column-drop-vertical-cell,\n.ag-theme-balham-auto-dark .ag-column-drop-vertical-cell {\n margin-left: calc(var(--ag-grid-size) * 2);\n margin-right: calc(var(--ag-grid-size) * 2);\n}\n.ag-theme-balham .ag-column-drop-vertical-cell-text,\n.ag-theme-balham-dark .ag-column-drop-vertical-cell-text,\n.ag-theme-balham-auto-dark .ag-column-drop-vertical-cell-text {\n margin-left: calc(var(--ag-grid-size) * 2);\n}\n.ag-theme-balham .ag-column-drop-vertical-icon,\n.ag-theme-balham-dark .ag-column-drop-vertical-icon,\n.ag-theme-balham-auto-dark .ag-column-drop-vertical-icon {\n color: var(--ag-secondary-foreground-color);\n}\n.ag-theme-balham .ag-ltr .ag-column-drop-vertical-empty-message, .ag-theme-balham-dark .ag-ltr .ag-column-drop-vertical-empty-message, .ag-theme-balham-auto-dark .ag-ltr .ag-column-drop-vertical-empty-message {\n padding-left: calc(var(--ag-icon-size) + var(--ag-grid-size) * 2);\n padding-right: var(--ag-grid-size);\n}\n\n.ag-theme-balham .ag-rtl .ag-column-drop-vertical-empty-message, .ag-theme-balham-dark .ag-rtl .ag-column-drop-vertical-empty-message, .ag-theme-balham-auto-dark .ag-rtl .ag-column-drop-vertical-empty-message {\n padding-right: calc(var(--ag-icon-size) + var(--ag-grid-size) * 2);\n padding-left: var(--ag-grid-size);\n}\n\n.ag-theme-balham .ag-column-drop-horizontal,\n.ag-theme-balham-dark .ag-column-drop-horizontal,\n.ag-theme-balham-auto-dark .ag-column-drop-horizontal {\n height: var(--ag-header-height);\n}\n.ag-theme-balham .ag-column-drop-empty,\n.ag-theme-balham-dark .ag-column-drop-empty,\n.ag-theme-balham-auto-dark .ag-column-drop-empty {\n color: var(--ag-disabled-foreground-color);\n}\n.ag-theme-balham .ag-column-drop-horizontal-cell-text,\n.ag-theme-balham-dark .ag-column-drop-horizontal-cell-text,\n.ag-theme-balham-auto-dark .ag-column-drop-horizontal-cell-text {\n margin-left: calc(var(--ag-grid-size) * 2);\n}\n.ag-theme-balham .ag-column-drop-vertical,\n.ag-theme-balham-dark .ag-column-drop-vertical,\n.ag-theme-balham-auto-dark .ag-column-drop-vertical {\n padding-top: calc(var(--ag-grid-size) * 2);\n}\n.ag-theme-balham .ag-column-select-column-readonly.ag-icon-grip,\n.ag-theme-balham .ag-column-select-column-readonly .ag-icon-grip,\n.ag-theme-balham-dark .ag-column-select-column-readonly.ag-icon-grip,\n.ag-theme-balham-dark .ag-column-select-column-readonly .ag-icon-grip,\n.ag-theme-balham-auto-dark .ag-column-select-column-readonly.ag-icon-grip,\n.ag-theme-balham-auto-dark .ag-column-select-column-readonly .ag-icon-grip {\n opacity: 0.35;\n}\n.ag-theme-balham .ag-menu-header,\n.ag-theme-balham-dark .ag-menu-header,\n.ag-theme-balham-auto-dark .ag-menu-header {\n background-color: var(--ag-header-background-color);\n}\n.ag-theme-balham .ag-overlay-loading-center,\n.ag-theme-balham-dark .ag-overlay-loading-center,\n.ag-theme-balham-auto-dark .ag-overlay-loading-center {\n background-color: var(--ag-background-color);\n border: 1px solid var(--ag-border-color);\n color: var(--ag-foreground-color);\n padding: calc(var(--ag-grid-size) * 4);\n}\n.ag-theme-balham .ag-tooltip,\n.ag-theme-balham-dark .ag-tooltip,\n.ag-theme-balham-auto-dark .ag-tooltip {\n border: none;\n}\n.ag-theme-balham .ag-panel-title-bar-button-icon,\n.ag-theme-balham-dark .ag-panel-title-bar-button-icon,\n.ag-theme-balham-auto-dark .ag-panel-title-bar-button-icon {\n font-size: calc(var(--ag-icon-size) + var(--ag-grid-size));\n}\n.ag-theme-balham .ag-panel,\n.ag-theme-balham-dark .ag-panel,\n.ag-theme-balham-auto-dark .ag-panel {\n background-color: var(--ag-header-background-color);\n}\n.ag-theme-balham .ag-chart-data-section,\n.ag-theme-balham .ag-chart-format-section,\n.ag-theme-balham .ag-chart-advanced-settings-section,\n.ag-theme-balham-dark .ag-chart-data-section,\n.ag-theme-balham-dark .ag-chart-format-section,\n.ag-theme-balham-dark .ag-chart-advanced-settings-section,\n.ag-theme-balham-auto-dark .ag-chart-data-section,\n.ag-theme-balham-auto-dark .ag-chart-format-section,\n.ag-theme-balham-auto-dark .ag-chart-advanced-settings-section {\n padding-bottom: calc(var(--ag-grid-size) * 0.5);\n}\n.ag-theme-balham .ag-group-toolbar,\n.ag-theme-balham-dark .ag-group-toolbar,\n.ag-theme-balham-auto-dark .ag-group-toolbar {\n background-color: var(--ag-subheader-toolbar-background-color);\n}\n.ag-theme-balham .ag-chart-tab,\n.ag-theme-balham-dark .ag-chart-tab,\n.ag-theme-balham-auto-dark .ag-chart-tab {\n padding-top: calc(var(--ag-grid-size) * 0.5);\n}\n.ag-theme-balham .ag-charts-format-sub-level-group-item,\n.ag-theme-balham-dark .ag-charts-format-sub-level-group-item,\n.ag-theme-balham-auto-dark .ag-charts-format-sub-level-group-item {\n margin-bottom: calc(var(--ag-grid-size) * 1.5);\n}\n.ag-theme-balham .ag-filter-active .ag-icon-filter,\n.ag-theme-balham-dark .ag-filter-active .ag-icon-filter,\n.ag-theme-balham-auto-dark .ag-filter-active .ag-icon-filter {\n color: var(--ag-balham-active-color);\n}\n.ag-theme-balham .ag-color-input input[class^=ag-][type=text].ag-input-field-input,\n.ag-theme-balham-dark .ag-color-input input[class^=ag-][type=text].ag-input-field-input,\n.ag-theme-balham-auto-dark .ag-color-input input[class^=ag-][type=text].ag-input-field-input {\n min-height: calc(var(--ag-icon-size) + 4px);\n}\n.ag-theme-balham .ag-list-item-hovered::after,\n.ag-theme-balham-dark .ag-list-item-hovered::after,\n.ag-theme-balham-auto-dark .ag-list-item-hovered::after {\n background-color: var(--ag-balham-active-color);\n}\n.ag-theme-balham .ag-pill .ag-pill-button:hover,\n.ag-theme-balham-dark .ag-pill .ag-pill-button:hover,\n.ag-theme-balham-auto-dark .ag-pill .ag-pill-button:hover {\n color: var(--ag-balham-active-color);\n}\n.ag-theme-balham .ag-header-highlight-before::after,\n.ag-theme-balham .ag-header-highlight-after::after,\n.ag-theme-balham-dark .ag-header-highlight-before::after,\n.ag-theme-balham-dark .ag-header-highlight-after::after,\n.ag-theme-balham-auto-dark .ag-header-highlight-before::after,\n.ag-theme-balham-auto-dark .ag-header-highlight-after::after {\n background-color: var(--ag-balham-active-color);\n}\n.ag-theme-balham .ag-advanced-filter-builder-item-button-disabled .ag-icon,\n.ag-theme-balham .ag-disabled .ag-icon,\n.ag-theme-balham .ag-column-select-column-group-readonly .ag-icon,\n.ag-theme-balham [disabled] .ag-icon,\n.ag-theme-balham-dark .ag-advanced-filter-builder-item-button-disabled .ag-icon,\n.ag-theme-balham-dark .ag-disabled .ag-icon,\n.ag-theme-balham-dark .ag-column-select-column-group-readonly .ag-icon,\n.ag-theme-balham-dark [disabled] .ag-icon,\n.ag-theme-balham-auto-dark .ag-advanced-filter-builder-item-button-disabled .ag-icon,\n.ag-theme-balham-auto-dark .ag-disabled .ag-icon,\n.ag-theme-balham-auto-dark .ag-column-select-column-group-readonly .ag-icon,\n.ag-theme-balham-auto-dark [disabled] .ag-icon {\n color: var(--ag-disabled-foreground-color);\n}\n", ""]); // Exports /* harmony default export */ __webpack_exports__.A = (___CSS_LOADER_EXPORT___); /***/ }), /***/ 5251: /***/ (function(module, __webpack_exports__, __webpack_require__) { /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6758); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(935); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(62); /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__); // Imports var ___CSS_LOADER_URL_IMPORT_0___ = new URL(/* asset import */ __webpack_require__(9377), __webpack_require__.b); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); var ___CSS_LOADER_URL_REPLACEMENT_0___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_0___); // Module ___CSS_LOADER_EXPORT___.push([module.id, "@font-face {\n font-family: \"agGridBalham\";\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_0___ + ");\n font-weight: normal;\n font-style: normal;\n}\n.ag-theme-balham,\n.ag-theme-balham-dark,\n.ag-theme-balham-auto-dark {\n --ag-balham-active-color: #0091ea;\n --ag-foreground-color: #000;\n --ag-background-color: #fff;\n --ag-header-background-color: #f5f7f7;\n --ag-tooltip-background-color: #cbd0d3;\n --ag-subheader-background-color: #e2e9eb;\n --ag-control-panel-background-color: #f5f7f7;\n --ag-border-color: #bdc3c7;\n --ag-odd-row-background-color: #fcfdfe;\n --ag-row-hover-color: #ecf0f1;\n --ag-column-hover-color: #ecf0f1;\n --ag-input-border-color: #95a5a6;\n --ag-invalid-color: #e02525;\n --ag-input-disabled-background-color: #ebebeb;\n --ag-checkbox-unchecked-color: #7f8c8d;\n --ag-input-focus-border-color: #719ece;\n --ag-advanced-filter-join-pill-color: #f08e8d;\n --ag-advanced-filter-column-pill-color: #a6e194;\n --ag-advanced-filter-option-pill-color: #f3c08b;\n --ag-advanced-filter-value-pill-color: #85c0e4;\n --ag-input-focus-box-shadow: 0 0 2px 1px var(--ag-input-focus-border-color);\n --ag-range-selection-border-color: var(--ag-balham-active-color);\n --ag-checkbox-checked-color: var(--ag-balham-active-color);\n --ag-checkbox-background-color: var(--ag-background-color);\n --ag-panel-background-color: var(--ag-header-background-color);\n --ag-secondary-foreground-color: rgba(0, 0, 0, 0.54);\n --ag-disabled-foreground-color: rgba(0, 0, 0, 0.38);\n --ag-subheader-toolbar-background-color: rgba(226, 233, 235, 0.5);\n --ag-row-border-color: rgba(189, 195, 199, 0.58);\n --ag-chip-background-color: rgba(0, 0, 0, 0.1);\n --ag-range-selection-background-color: rgba(0, 145, 234, 0.2);\n --ag-range-selection-background-color-2: rgba(0, 145, 234, 0.36);\n --ag-range-selection-background-color-3: rgba(0, 145, 234, 0.49);\n --ag-range-selection-background-color-4: rgba(0, 145, 234, 0.59);\n --ag-selected-row-background-color: rgba(0, 145, 234, 0.28);\n --ag-header-column-separator-color: rgba(189, 195, 199, 0.5);\n --ag-input-disabled-border-color: rgba(149, 165, 166, 0.3);\n --ag-row-numbers-selected-color: color-mix(in srgb, transparent, var(--ag-balham-active-color) 50%);\n --ag-header-column-separator-display: block;\n --ag-header-column-separator-height: 50%;\n --ag-grid-size: 4px;\n --ag-icon-size: 16px;\n --ag-row-height: calc(var(--ag-grid-size) * 7);\n --ag-header-height: calc(var(--ag-grid-size) * 8);\n --ag-list-item-height: calc(var(--ag-grid-size) * 6);\n --ag-row-group-indent-size: calc(var(--ag-grid-size) * 3 + var(--ag-icon-size));\n --ag-cell-horizontal-padding: calc(var(--ag-grid-size) * 3);\n --ag-input-height: calc(var(--ag-grid-size) * 4);\n --ag-chart-menu-panel-width: 240px;\n --ag-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell,\n \"Helvetica Neue\", sans-serif;\n --ag-font-size: 12px;\n --ag-icon-font-family: agGridBalham;\n --ag-border-radius: 2px;\n --ag-checkbox-border-radius: 3px;\n --ag-card-shadow: none;\n}\n\n.ag-theme-balham-dark {\n --ag-balham-active-color: #00b0ff;\n --ag-foreground-color: #f5f5f5;\n --ag-background-color: #2d3436;\n --ag-header-background-color: #1c1c1c;\n --ag-tooltip-background-color: #1c1f20;\n --ag-subheader-background-color: #111;\n --ag-control-panel-background-color: #202020;\n --ag-border-color: #424242;\n --ag-odd-row-background-color: #262c2e;\n --ag-row-hover-color: #3d4749;\n --ag-column-hover-color: #3d4749;\n --ag-input-border-color: #f0f0f0;\n --ag-input-disabled-background-color: rgba(48, 46, 46, 0.3);\n --ag-modal-overlay-background-color: rgba(45, 52, 54, 0.66);\n --ag-checkbox-unchecked-color: #ecf0f1;\n --ag-advanced-filter-join-pill-color: #7a3a37;\n --ag-advanced-filter-column-pill-color: #355f2d;\n --ag-advanced-filter-option-pill-color: #5a3168;\n --ag-advanced-filter-value-pill-color: #374c86;\n --ag-secondary-foreground-color: var(--ag-foreground-color);\n --ag-disabled-foreground-color: rgba(245, 245, 245, 0.38);\n --ag-subheader-toolbar-background-color: rgba(17, 17, 17, 0.5);\n --ag-row-border-color: #5c5c5c;\n --ag-chip-background-color: rgba(245, 245, 245, 0.08);\n --ag-range-selection-background-color: rgba(0, 176, 255, 0.2);\n --ag-range-selection-background-color-2: rgba(0, 176, 255, 0.36);\n --ag-range-selection-background-color-3: rgba(0, 176, 255, 0.49);\n --ag-range-selection-background-color-4: rgba(0, 176, 255, 0.59);\n --ag-selected-row-background-color: rgba(0, 176, 255, 0.28);\n --ag-header-column-separator-color: rgba(66, 66, 66, 0.5);\n --ag-input-disabled-border-color: rgba(240, 240, 240, 0.3);\n --ag-header-foreground-color: rgba(245, 245, 245, 0.64);\n --ag-toggle-button-off-background-color: transparent;\n --ag-toggle-button-off-border-color: var(--ag-foreground-color);\n --ag-range-selection-chart-category-background-color: rgba(26, 177, 74, 0.5);\n --ag-range-selection-chart-background-color: rgba(45, 166, 255, 0.5);\n --ag-input-focus-box-shadow: 0 0 4px 1.5px var(--ag-input-focus-border-color);\n --ag-row-loading-skeleton-effect-color: rgba(202, 203, 204, 0.4);\n color-scheme: dark;\n}\n\n@media (prefers-color-scheme: dark) {\n .ag-theme-balham-auto-dark {\n --ag-balham-active-color: #00b0ff;\n --ag-foreground-color: #f5f5f5;\n --ag-background-color: #2d3436;\n --ag-header-background-color: #1c1c1c;\n --ag-tooltip-background-color: #1c1f20;\n --ag-subheader-background-color: #111;\n --ag-control-panel-background-color: #202020;\n --ag-border-color: #424242;\n --ag-odd-row-background-color: #262c2e;\n --ag-row-hover-color: #3d4749;\n --ag-column-hover-color: #3d4749;\n --ag-input-border-color: #f0f0f0;\n --ag-input-disabled-background-color: rgba(48, 46, 46, 0.3);\n --ag-modal-overlay-background-color: rgba(45, 52, 54, 0.66);\n --ag-checkbox-unchecked-color: #ecf0f1;\n --ag-advanced-filter-join-pill-color: #7a3a37;\n --ag-advanced-filter-column-pill-color: #355f2d;\n --ag-advanced-filter-option-pill-color: #5a3168;\n --ag-advanced-filter-value-pill-color: #374c86;\n --ag-secondary-foreground-color: var(--ag-foreground-color);\n --ag-disabled-foreground-color: rgba(245, 245, 245, 0.38);\n --ag-subheader-toolbar-background-color: rgba(17, 17, 17, 0.5);\n --ag-row-border-color: #5c5c5c;\n --ag-chip-background-color: rgba(245, 245, 245, 0.08);\n --ag-range-selection-background-color: rgba(0, 176, 255, 0.2);\n --ag-range-selection-background-color-2: rgba(0, 176, 255, 0.36);\n --ag-range-selection-background-color-3: rgba(0, 176, 255, 0.49);\n --ag-range-selection-background-color-4: rgba(0, 176, 255, 0.59);\n --ag-selected-row-background-color: rgba(0, 176, 255, 0.28);\n --ag-header-column-separator-color: rgba(66, 66, 66, 0.5);\n --ag-input-disabled-border-color: rgba(240, 240, 240, 0.3);\n --ag-header-foreground-color: rgba(245, 245, 245, 0.64);\n --ag-toggle-button-off-background-color: transparent;\n --ag-toggle-button-off-border-color: var(--ag-foreground-color);\n --ag-range-selection-chart-category-background-color: rgba(26, 177, 74, 0.5);\n --ag-range-selection-chart-background-color: rgba(45, 166, 255, 0.5);\n --ag-input-focus-box-shadow: 0 0 4px 1.5px var(--ag-input-focus-border-color);\n --ag-row-loading-skeleton-effect-color: rgba(202, 203, 204, 0.4);\n color-scheme: dark;\n }\n}\n.ag-theme-balham .ag-filter-toolpanel-header,\n.ag-theme-balham .ag-filter-toolpanel-search,\n.ag-theme-balham .ag-status-bar,\n.ag-theme-balham .ag-header-row,\n.ag-theme-balham .ag-row-number-cell,\n.ag-theme-balham .ag-multi-filter-group-title-bar,\n.ag-theme-balham-dark .ag-filter-toolpanel-header,\n.ag-theme-balham-dark .ag-filter-toolpanel-search,\n.ag-theme-balham-dark .ag-status-bar,\n.ag-theme-balham-dark .ag-header-row,\n.ag-theme-balham-dark .ag-row-number-cell,\n.ag-theme-balham-dark .ag-multi-filter-group-title-bar,\n.ag-theme-balham-auto-dark .ag-filter-toolpanel-header,\n.ag-theme-balham-auto-dark .ag-filter-toolpanel-search,\n.ag-theme-balham-auto-dark .ag-status-bar,\n.ag-theme-balham-auto-dark .ag-header-row,\n.ag-theme-balham-auto-dark .ag-row-number-cell,\n.ag-theme-balham-auto-dark .ag-multi-filter-group-title-bar {\n font-weight: 600;\n color: var(--ag-header-foreground-color);\n}\n.ag-theme-balham .ag-ltr input[class^=ag-]:not([type]), .ag-theme-balham .ag-ltr input[class^=ag-][type=text], .ag-theme-balham .ag-ltr input[class^=ag-][type=number], .ag-theme-balham .ag-ltr input[class^=ag-][type=tel], .ag-theme-balham .ag-ltr input[class^=ag-][type=date], .ag-theme-balham .ag-ltr input[class^=ag-][type=datetime-local], .ag-theme-balham .ag-ltr textarea[class^=ag-], .ag-theme-balham-dark .ag-ltr input[class^=ag-]:not([type]), .ag-theme-balham-dark .ag-ltr input[class^=ag-][type=text], .ag-theme-balham-dark .ag-ltr input[class^=ag-][type=number], .ag-theme-balham-dark .ag-ltr input[class^=ag-][type=tel], .ag-theme-balham-dark .ag-ltr input[class^=ag-][type=date], .ag-theme-balham-dark .ag-ltr input[class^=ag-][type=datetime-local], .ag-theme-balham-dark .ag-ltr textarea[class^=ag-], .ag-theme-balham-auto-dark .ag-ltr input[class^=ag-]:not([type]), .ag-theme-balham-auto-dark .ag-ltr input[class^=ag-][type=text], .ag-theme-balham-auto-dark .ag-ltr input[class^=ag-][type=number], .ag-theme-balham-auto-dark .ag-ltr input[class^=ag-][type=tel], .ag-theme-balham-auto-dark .ag-ltr input[class^=ag-][type=date], .ag-theme-balham-auto-dark .ag-ltr input[class^=ag-][type=datetime-local], .ag-theme-balham-auto-dark .ag-ltr textarea[class^=ag-] {\n padding-left: var(--ag-grid-size);\n}\n\n.ag-theme-balham .ag-rtl input[class^=ag-]:not([type]), .ag-theme-balham .ag-rtl input[class^=ag-][type=text], .ag-theme-balham .ag-rtl input[class^=ag-][type=number], .ag-theme-balham .ag-rtl input[class^=ag-][type=tel], .ag-theme-balham .ag-rtl input[class^=ag-][type=date], .ag-theme-balham .ag-rtl input[class^=ag-][type=datetime-local], .ag-theme-balham .ag-rtl textarea[class^=ag-], .ag-theme-balham-dark .ag-rtl input[class^=ag-]:not([type]), .ag-theme-balham-dark .ag-rtl input[class^=ag-][type=text], .ag-theme-balham-dark .ag-rtl input[class^=ag-][type=number], .ag-theme-balham-dark .ag-rtl input[class^=ag-][type=tel], .ag-theme-balham-dark .ag-rtl input[class^=ag-][type=date], .ag-theme-balham-dark .ag-rtl input[class^=ag-][type=datetime-local], .ag-theme-balham-dark .ag-rtl textarea[class^=ag-], .ag-theme-balham-auto-dark .ag-rtl input[class^=ag-]:not([type]), .ag-theme-balham-auto-dark .ag-rtl input[class^=ag-][type=text], .ag-theme-balham-auto-dark .ag-rtl input[class^=ag-][type=number], .ag-theme-balham-auto-dark .ag-rtl input[class^=ag-][type=tel], .ag-theme-balham-auto-dark .ag-rtl input[class^=ag-][type=date], .ag-theme-balham-auto-dark .ag-rtl input[class^=ag-][type=datetime-local], .ag-theme-balham-auto-dark .ag-rtl textarea[class^=ag-] {\n padding-right: var(--ag-grid-size);\n}\n\n.ag-theme-balham .ag-column-drop-vertical-empty-message,\n.ag-theme-balham .ag-status-bar,\n.ag-theme-balham-dark .ag-column-drop-vertical-empty-message,\n.ag-theme-balham-dark .ag-status-bar,\n.ag-theme-balham-auto-dark .ag-column-drop-vertical-empty-message,\n.ag-theme-balham-auto-dark .ag-status-bar {\n font-weight: 600;\n color: var(--ag-disabled-foreground-color);\n}\n.ag-theme-balham.ag-dnd-ghost,\n.ag-theme-balham-dark.ag-dnd-ghost,\n.ag-theme-balham-auto-dark.ag-dnd-ghost {\n font-size: var(--ag-font-size);\n font-weight: 600;\n}\n.ag-theme-balham .ag-tab,\n.ag-theme-balham-dark .ag-tab,\n.ag-theme-balham-auto-dark .ag-tab {\n border: 1px solid transparent;\n padding: var(--ag-grid-size) calc(var(--ag-grid-size) * 2);\n margin: var(--ag-grid-size);\n margin-bottom: -1px;\n}\n.ag-theme-balham .ag-tab-selected,\n.ag-theme-balham-dark .ag-tab-selected,\n.ag-theme-balham-auto-dark .ag-tab-selected {\n background-color: var(--ag-background-color);\n border-color: var(--ag-border-color);\n border-bottom-color: transparent;\n}\n.ag-theme-balham .ag-tabs-header,\n.ag-theme-balham-dark .ag-tabs-header,\n.ag-theme-balham-auto-dark .ag-tabs-header {\n border-bottom: 1px solid var(--ag-border-color);\n}\n.ag-theme-balham .ag-column-drop-cell,\n.ag-theme-balham-dark .ag-column-drop-cell,\n.ag-theme-balham-auto-dark .ag-column-drop-cell {\n height: calc(var(--ag-grid-size) * 6);\n}\n.ag-theme-balham .ag-column-drop-vertical-title,\n.ag-theme-balham-dark .ag-column-drop-vertical-title,\n.ag-theme-balham-auto-dark .ag-column-drop-vertical-title {\n color: var(--ag-foreground-color);\n}\n.ag-theme-balham .ag-column-drop-vertical-cell,\n.ag-theme-balham-dark .ag-column-drop-vertical-cell,\n.ag-theme-balham-auto-dark .ag-column-drop-vertical-cell {\n margin-left: calc(var(--ag-grid-size) * 2);\n margin-right: calc(var(--ag-grid-size) * 2);\n}\n.ag-theme-balham .ag-column-drop-vertical-cell-text,\n.ag-theme-balham-dark .ag-column-drop-vertical-cell-text,\n.ag-theme-balham-auto-dark .ag-column-drop-vertical-cell-text {\n margin-left: calc(var(--ag-grid-size) * 2);\n}\n.ag-theme-balham .ag-column-drop-vertical-icon,\n.ag-theme-balham-dark .ag-column-drop-vertical-icon,\n.ag-theme-balham-auto-dark .ag-column-drop-vertical-icon {\n color: var(--ag-secondary-foreground-color);\n}\n.ag-theme-balham .ag-ltr .ag-column-drop-vertical-empty-message, .ag-theme-balham-dark .ag-ltr .ag-column-drop-vertical-empty-message, .ag-theme-balham-auto-dark .ag-ltr .ag-column-drop-vertical-empty-message {\n padding-left: calc(var(--ag-icon-size) + var(--ag-grid-size) * 2);\n padding-right: var(--ag-grid-size);\n}\n\n.ag-theme-balham .ag-rtl .ag-column-drop-vertical-empty-message, .ag-theme-balham-dark .ag-rtl .ag-column-drop-vertical-empty-message, .ag-theme-balham-auto-dark .ag-rtl .ag-column-drop-vertical-empty-message {\n padding-right: calc(var(--ag-icon-size) + var(--ag-grid-size) * 2);\n padding-left: var(--ag-grid-size);\n}\n\n.ag-theme-balham .ag-column-drop-horizontal,\n.ag-theme-balham-dark .ag-column-drop-horizontal,\n.ag-theme-balham-auto-dark .ag-column-drop-horizontal {\n height: var(--ag-header-height);\n}\n.ag-theme-balham .ag-column-drop-empty,\n.ag-theme-balham-dark .ag-column-drop-empty,\n.ag-theme-balham-auto-dark .ag-column-drop-empty {\n color: var(--ag-disabled-foreground-color);\n}\n.ag-theme-balham .ag-column-drop-horizontal-cell-text,\n.ag-theme-balham-dark .ag-column-drop-horizontal-cell-text,\n.ag-theme-balham-auto-dark .ag-column-drop-horizontal-cell-text {\n margin-left: calc(var(--ag-grid-size) * 2);\n}\n.ag-theme-balham .ag-column-drop-vertical,\n.ag-theme-balham-dark .ag-column-drop-vertical,\n.ag-theme-balham-auto-dark .ag-column-drop-vertical {\n padding-top: calc(var(--ag-grid-size) * 2);\n}\n.ag-theme-balham .ag-column-select-column-readonly.ag-icon-grip,\n.ag-theme-balham .ag-column-select-column-readonly .ag-icon-grip,\n.ag-theme-balham-dark .ag-column-select-column-readonly.ag-icon-grip,\n.ag-theme-balham-dark .ag-column-select-column-readonly .ag-icon-grip,\n.ag-theme-balham-auto-dark .ag-column-select-column-readonly.ag-icon-grip,\n.ag-theme-balham-auto-dark .ag-column-select-column-readonly .ag-icon-grip {\n opacity: 0.35;\n}\n.ag-theme-balham .ag-menu-header,\n.ag-theme-balham-dark .ag-menu-header,\n.ag-theme-balham-auto-dark .ag-menu-header {\n background-color: var(--ag-header-background-color);\n}\n.ag-theme-balham .ag-overlay-loading-center,\n.ag-theme-balham-dark .ag-overlay-loading-center,\n.ag-theme-balham-auto-dark .ag-overlay-loading-center {\n background-color: var(--ag-background-color);\n border: 1px solid var(--ag-border-color);\n color: var(--ag-foreground-color);\n padding: calc(var(--ag-grid-size) * 4);\n}\n.ag-theme-balham .ag-tooltip,\n.ag-theme-balham-dark .ag-tooltip,\n.ag-theme-balham-auto-dark .ag-tooltip {\n border: none;\n}\n.ag-theme-balham .ag-panel-title-bar-button-icon,\n.ag-theme-balham-dark .ag-panel-title-bar-button-icon,\n.ag-theme-balham-auto-dark .ag-panel-title-bar-button-icon {\n font-size: calc(var(--ag-icon-size) + var(--ag-grid-size));\n}\n.ag-theme-balham .ag-panel,\n.ag-theme-balham-dark .ag-panel,\n.ag-theme-balham-auto-dark .ag-panel {\n background-color: var(--ag-header-background-color);\n}\n.ag-theme-balham .ag-chart-data-section,\n.ag-theme-balham .ag-chart-format-section,\n.ag-theme-balham .ag-chart-advanced-settings-section,\n.ag-theme-balham-dark .ag-chart-data-section,\n.ag-theme-balham-dark .ag-chart-format-section,\n.ag-theme-balham-dark .ag-chart-advanced-settings-section,\n.ag-theme-balham-auto-dark .ag-chart-data-section,\n.ag-theme-balham-auto-dark .ag-chart-format-section,\n.ag-theme-balham-auto-dark .ag-chart-advanced-settings-section {\n padding-bottom: calc(var(--ag-grid-size) * 0.5);\n}\n.ag-theme-balham .ag-group-toolbar,\n.ag-theme-balham-dark .ag-group-toolbar,\n.ag-theme-balham-auto-dark .ag-group-toolbar {\n background-color: var(--ag-subheader-toolbar-background-color);\n}\n.ag-theme-balham .ag-chart-tab,\n.ag-theme-balham-dark .ag-chart-tab,\n.ag-theme-balham-auto-dark .ag-chart-tab {\n padding-top: calc(var(--ag-grid-size) * 0.5);\n}\n.ag-theme-balham .ag-charts-format-sub-level-group-item,\n.ag-theme-balham-dark .ag-charts-format-sub-level-group-item,\n.ag-theme-balham-auto-dark .ag-charts-format-sub-level-group-item {\n margin-bottom: calc(var(--ag-grid-size) * 1.5);\n}\n.ag-theme-balham .ag-filter-active .ag-icon-filter,\n.ag-theme-balham-dark .ag-filter-active .ag-icon-filter,\n.ag-theme-balham-auto-dark .ag-filter-active .ag-icon-filter {\n color: var(--ag-balham-active-color);\n}\n.ag-theme-balham .ag-color-input input[class^=ag-][type=text].ag-input-field-input,\n.ag-theme-balham-dark .ag-color-input input[class^=ag-][type=text].ag-input-field-input,\n.ag-theme-balham-auto-dark .ag-color-input input[class^=ag-][type=text].ag-input-field-input {\n min-height: calc(var(--ag-icon-size) + 4px);\n}\n.ag-theme-balham .ag-list-item-hovered::after,\n.ag-theme-balham-dark .ag-list-item-hovered::after,\n.ag-theme-balham-auto-dark .ag-list-item-hovered::after {\n background-color: var(--ag-balham-active-color);\n}\n.ag-theme-balham .ag-pill .ag-pill-button:hover,\n.ag-theme-balham-dark .ag-pill .ag-pill-button:hover,\n.ag-theme-balham-auto-dark .ag-pill .ag-pill-button:hover {\n color: var(--ag-balham-active-color);\n}\n.ag-theme-balham .ag-header-highlight-before::after,\n.ag-theme-balham .ag-header-highlight-after::after,\n.ag-theme-balham-dark .ag-header-highlight-before::after,\n.ag-theme-balham-dark .ag-header-highlight-after::after,\n.ag-theme-balham-auto-dark .ag-header-highlight-before::after,\n.ag-theme-balham-auto-dark .ag-header-highlight-after::after {\n background-color: var(--ag-balham-active-color);\n}\n.ag-theme-balham .ag-advanced-filter-builder-item-button-disabled .ag-icon,\n.ag-theme-balham .ag-disabled .ag-icon,\n.ag-theme-balham .ag-column-select-column-group-readonly .ag-icon,\n.ag-theme-balham [disabled] .ag-icon,\n.ag-theme-balham-dark .ag-advanced-filter-builder-item-button-disabled .ag-icon,\n.ag-theme-balham-dark .ag-disabled .ag-icon,\n.ag-theme-balham-dark .ag-column-select-column-group-readonly .ag-icon,\n.ag-theme-balham-dark [disabled] .ag-icon,\n.ag-theme-balham-auto-dark .ag-advanced-filter-builder-item-button-disabled .ag-icon,\n.ag-theme-balham-auto-dark .ag-disabled .ag-icon,\n.ag-theme-balham-auto-dark .ag-column-select-column-group-readonly .ag-icon,\n.ag-theme-balham-auto-dark [disabled] .ag-icon {\n color: var(--ag-disabled-foreground-color);\n}\n", ""]); // Exports /* harmony default export */ __webpack_exports__.A = (___CSS_LOADER_EXPORT___); /***/ }), /***/ 4023: /***/ (function(module, __webpack_exports__, __webpack_require__) { /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6758); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(935); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); // Imports var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module ___CSS_LOADER_EXPORT___.push([module.id, ".ag-theme-material,\n.ag-theme-material-dark,\n.ag-theme-material-auto-dark {\n --ag-material-primary-color: #3f51b5;\n --ag-material-accent-color: #ff4081;\n --ag-foreground-color: rgba(0, 0, 0, 0.87);\n --ag-secondary-foreground-color: rgba(0, 0, 0, 0.54);\n --ag-disabled-foreground-color: rgba(0, 0, 0, 0.38);\n --ag-background-color: #fff;\n --ag-header-background-color: #fff;\n --ag-tooltip-background-color: #fff;\n --ag-subheader-background-color: #eee;\n --ag-subheader-toolbar-background-color: rgba(238, 238, 238, 0.5);\n --ag-header-cell-hover-background-color: #f2f2f2;\n --ag-chip-background-color: #e2e2e2;\n --ag-range-selection-background-color: rgba(122, 134, 203, 0.1);\n --ag-range-selection-background-color-2: rgba(122, 134, 203, 0.19);\n --ag-range-selection-background-color-3: rgba(122, 134, 203, 0.27);\n --ag-range-selection-background-color-4: rgba(122, 134, 203, 0.34);\n --ag-row-numbers-selected-color: color-mix(in srgb, transparent, var(--ag-material-accent-color) 50%);\n --ag-range-selection-highlight-color: #fce4ec;\n --ag-row-hover-color: #fafafa;\n --ag-column-hover-color: #fafafa;\n --ag-control-panel-background-color: #fafafa;\n --ag-selected-row-background-color: rgba(33, 150, 243, 0.3);\n --ag-checkbox-unchecked-color: #333;\n --ag-value-change-value-highlight-background-color: #00acc1;\n --ag-side-button-selected-background-color: transparent;\n --ag-advanced-filter-join-pill-color: #f08e8d;\n --ag-advanced-filter-column-pill-color: #a6e194;\n --ag-advanced-filter-option-pill-color: #f3c08b;\n --ag-advanced-filter-value-pill-color: #85c0e4;\n --ag-range-selection-border-color: var(--ag-material-primary-color);\n --ag-checkbox-checked-color: var(--ag-material-accent-color);\n --ag-borders: none;\n --ag-borders-critical: solid 1px;\n --ag-border-color: #e2e2e2;\n --ag-grid-size: 8px;\n --ag-icon-size: 18px;\n --ag-header-height: calc(var(--ag-grid-size) * 7);\n --ag-row-height: calc(var(--ag-grid-size) * 6);\n --ag-cell-horizontal-padding: calc(var(--ag-grid-size) * 3);\n --ag-list-item-height: calc(var(--ag-grid-size) * 4);\n --ag-row-group-indent-size: calc(var(--ag-grid-size) * 3 + var(--ag-icon-size));\n --ag-filter-tool-panel-sub-level-row-height: calc(var(--ag-grid-size) * 4);\n --ag-checkbox-border-radius: 2px;\n --ag-toggle-button-switch-border-width: 2px;\n --ag-toggle-button-height: var(--ag-icon-size);\n --ag-widget-container-horizontal-padding: calc(var(--ag-grid-size) * 1.5);\n --ag-widget-container-vertical-padding: calc(var(--ag-grid-size) * 2);\n --ag-widget-vertical-spacing: calc(var(--ag-grid-size) * 1.75);\n --ag-font-family: Roboto, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Oxygen-Sans, Ubuntu, Cantarell,\n \"Helvetica Neue\", sans-serif;\n --ag-font-size: 13px;\n --ag-icon-font-family: agGridMaterial;\n --ag-selected-tab-underline-color: var(--ag-material-primary-color);\n --ag-selected-tab-underline-width: 2px;\n --ag-input-focus-border-color: var(--ag-material-primary-color);\n --ag-input-focus-box-shadow: 0 0 0 5px rgba(32, 33, 36, 0.122);\n --ag-card-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14),\n 0 1px 5px 0 rgba(0, 0, 0, 0.12);\n --ag-card-radius: 2px;\n --ag-invalid-color: #e02525;\n}\n\n.ag-theme-material-dark {\n --ag-material-primary-color: #3f51b5;\n --ag-material-accent-color: #bb86fcff;\n --ag-range-selection-border-color: var(--ag-material-accent-color);\n --ag-background-color: #121212ff;\n --ag-foreground-color: #ffffffff;\n --ag-data-color: #f5f5f5ff;\n --ag-header-cell-hover-background-color: #000000ff;\n --ag-advanced-filter-join-pill-color: #7a3a37ff;\n --ag-advanced-filter-column-pill-color: #355f2dff;\n --ag-advanced-filter-option-pill-color: #5a3168ff;\n --ag-advanced-filter-value-pill-color: #374c86ff;\n --ag-input-disabled-border-color: #3a434eff;\n --ag-input-disabled-background-color: #68686e12;\n --ag-selected-row-background-color: #bb86fc33;\n --ag-row-hover-color: #bb86fc33;\n --ag-column-hover-color: #f5f5f50d;\n --ag-range-selection-background-color: #bb86fc1a;\n --ag-range-selection-background-color-2: #bb86fc30;\n --ag-range-selection-background-color-3: #bb86fc45;\n --ag-range-selection-background-color-4: #bb86fc57;\n --ag-border-color: #383838ff;\n --ag-secondary-border-color: #383838ff;\n --ag-header-background-color: #121212ff;\n --ag-tooltip-background-color: #212b38ff;\n --ag-odd-row-background-color: #121212ff;\n --ag-control-panel-background-color: #2c2c2cff;\n --ag-subheader-background-color: #ffffff0d;\n --ag-subheader-toolbar-background-color: #2c2c2cff;\n --ag-invalid-color: #e02525ff;\n --ag-checkbox-unchecked-color: #797e87ff;\n --ag-checkbox-background-color: #121212ff;\n --ag-secondary-foreground-color: #f5f5f5ff;\n --ag-input-border-color: #383838ff;\n --ag-input-border-color-invalid: #e02525ff;\n --ag-disabled-foreground-color: #f5f5f580;\n --ag-chip-background-color: #22262812;\n --ag-side-button-selected-background-color: #2c2c2cff;\n --ag-selected-tab-underline-color: #3f51b5ff;\n --ag-modal-overlay-background-color: #121212a8;\n --ag-value-change-delta-up-color: #43a047a8;\n --ag-value-change-delta-down-color: #e53935ff;\n --ag-menu-background-color: #2c2c2cff;\n --ag-row-loading-skeleton-effect-color: rgba(202, 203, 204, 0.4);\n color-scheme: dark;\n}\n\n@media (prefers-color-scheme: dark) {\n .ag-theme-material-auto-dark {\n --ag-material-primary-color: #3f51b5;\n --ag-material-accent-color: #bb86fcff;\n --ag-range-selection-border-color: var(--ag-material-accent-color);\n --ag-background-color: #121212ff;\n --ag-foreground-color: #ffffffff;\n --ag-data-color: #f5f5f5ff;\n --ag-header-cell-hover-background-color: #000000ff;\n --ag-advanced-filter-join-pill-color: #7a3a37ff;\n --ag-advanced-filter-column-pill-color: #355f2dff;\n --ag-advanced-filter-option-pill-color: #5a3168ff;\n --ag-advanced-filter-value-pill-color: #374c86ff;\n --ag-input-disabled-border-color: #3a434eff;\n --ag-input-disabled-background-color: #68686e12;\n --ag-selected-row-background-color: #bb86fc33;\n --ag-row-hover-color: #bb86fc33;\n --ag-column-hover-color: #f5f5f50d;\n --ag-range-selection-background-color: #bb86fc1a;\n --ag-range-selection-background-color-2: #bb86fc30;\n --ag-range-selection-background-color-3: #bb86fc45;\n --ag-range-selection-background-color-4: #bb86fc57;\n --ag-border-color: #383838ff;\n --ag-secondary-border-color: #383838ff;\n --ag-header-background-color: #121212ff;\n --ag-tooltip-background-color: #212b38ff;\n --ag-odd-row-background-color: #121212ff;\n --ag-control-panel-background-color: #2c2c2cff;\n --ag-subheader-background-color: #ffffff0d;\n --ag-subheader-toolbar-background-color: #2c2c2cff;\n --ag-invalid-color: #e02525ff;\n --ag-checkbox-unchecked-color: #797e87ff;\n --ag-checkbox-background-color: #121212ff;\n --ag-secondary-foreground-color: #f5f5f5ff;\n --ag-input-border-color: #383838ff;\n --ag-input-border-color-invalid: #e02525ff;\n --ag-disabled-foreground-color: #f5f5f580;\n --ag-chip-background-color: #22262812;\n --ag-side-button-selected-background-color: #2c2c2cff;\n --ag-selected-tab-underline-color: #3f51b5ff;\n --ag-modal-overlay-background-color: #121212a8;\n --ag-value-change-delta-up-color: #43a047a8;\n --ag-value-change-delta-down-color: #e53935ff;\n --ag-menu-background-color: #2c2c2cff;\n --ag-row-loading-skeleton-effect-color: rgba(202, 203, 204, 0.4);\n color-scheme: dark;\n }\n}\n.ag-theme-material .ag-filter-toolpanel-header,\n.ag-theme-material .ag-filter-toolpanel-search,\n.ag-theme-material .ag-status-bar,\n.ag-theme-material .ag-header-row,\n.ag-theme-material .ag-row-number-cell,\n.ag-theme-material .ag-panel-title-bar-title,\n.ag-theme-material .ag-multi-filter-group-title-bar,\n.ag-theme-material-dark .ag-filter-toolpanel-header,\n.ag-theme-material-dark .ag-filter-toolpanel-search,\n.ag-theme-material-dark .ag-status-bar,\n.ag-theme-material-dark .ag-header-row,\n.ag-theme-material-dark .ag-row-number-cell,\n.ag-theme-material-dark .ag-panel-title-bar-title,\n.ag-theme-material-dark .ag-multi-filter-group-title-bar,\n.ag-theme-material-auto-dark .ag-filter-toolpanel-header,\n.ag-theme-material-auto-dark .ag-filter-toolpanel-search,\n.ag-theme-material-auto-dark .ag-status-bar,\n.ag-theme-material-auto-dark .ag-header-row,\n.ag-theme-material-auto-dark .ag-row-number-cell,\n.ag-theme-material-auto-dark .ag-panel-title-bar-title,\n.ag-theme-material-auto-dark .ag-multi-filter-group-title-bar {\n font-size: calc(var(--ag-font-size) - 1px);\n font-weight: 600;\n color: var(--ag-header-foreground-color);\n}\n.ag-theme-material .ag-tab,\n.ag-theme-material-dark .ag-tab,\n.ag-theme-material-auto-dark .ag-tab {\n height: calc(var(--ag-grid-size) * 4.5);\n flex: 1 1 auto;\n}\n.ag-theme-material .ag-tabs-header,\n.ag-theme-material .ag-column-drop-horizontal,\n.ag-theme-material-dark .ag-tabs-header,\n.ag-theme-material-dark .ag-column-drop-horizontal,\n.ag-theme-material-auto-dark .ag-tabs-header,\n.ag-theme-material-auto-dark .ag-column-drop-horizontal {\n background-color: var(--ag-subheader-background-color);\n}\n.ag-theme-material .ag-tabs-body,\n.ag-theme-material-dark .ag-tabs-body,\n.ag-theme-material-auto-dark .ag-tabs-body {\n padding: calc(var(--ag-grid-size) * 0.5) 0;\n}\n.ag-theme-material .ag-tabs-body .ag-menu-list,\n.ag-theme-material-dark .ag-tabs-body .ag-menu-list,\n.ag-theme-material-auto-dark .ag-tabs-body .ag-menu-list {\n padding-top: 0;\n padding-bottom: 0;\n}\n.ag-theme-material .ag-header-cell,\n.ag-theme-material .ag-header-group-cell,\n.ag-theme-material-dark .ag-header-cell,\n.ag-theme-material-dark .ag-header-group-cell,\n.ag-theme-material-auto-dark .ag-header-cell,\n.ag-theme-material-auto-dark .ag-header-group-cell {\n transition: background-color 0.5s;\n}\n.ag-theme-material .ag-row-last:not(.ag-row-first) .ag-cell-inline-editing,\n.ag-theme-material-dark .ag-row-last:not(.ag-row-first) .ag-cell-inline-editing,\n.ag-theme-material-auto-dark .ag-row-last:not(.ag-row-first) .ag-cell-inline-editing {\n bottom: 0;\n}\n.ag-theme-material .ag-cell-inline-editing,\n.ag-theme-material-dark .ag-cell-inline-editing,\n.ag-theme-material-auto-dark .ag-cell-inline-editing {\n padding: var(--ag-grid-size);\n height: calc(var(--ag-row-height) + var(--ag-grid-size) * 3);\n border-color: var(--ag-border-color) !important;\n}\n.ag-theme-material .ag-has-focus .ag-cell-inline-editing,\n.ag-theme-material-dark .ag-has-focus .ag-cell-inline-editing,\n.ag-theme-material-auto-dark .ag-has-focus .ag-cell-inline-editing {\n border-color: var(--ag-input-focus-border-color) !important;\n}\n.ag-theme-material .ag-column-drop-vertical,\n.ag-theme-material-dark .ag-column-drop-vertical,\n.ag-theme-material-auto-dark .ag-column-drop-vertical {\n border-bottom: solid 1px;\n border-bottom-color: var(--ag-border-color);\n padding-top: var(--ag-grid-size);\n}\n.ag-theme-material .ag-column-drop-vertical.ag-last-column-drop,\n.ag-theme-material-dark .ag-column-drop-vertical.ag-last-column-drop,\n.ag-theme-material-auto-dark .ag-column-drop-vertical.ag-last-column-drop {\n border-bottom: none;\n}\n.ag-theme-material .ag-column-drop-vertical-cell,\n.ag-theme-material-dark .ag-column-drop-vertical-cell,\n.ag-theme-material-auto-dark .ag-column-drop-vertical-cell {\n margin-left: 0;\n}\n.ag-theme-material .ag-column-drop-vertical-empty-message,\n.ag-theme-material-dark .ag-column-drop-vertical-empty-message,\n.ag-theme-material-auto-dark .ag-column-drop-vertical-empty-message {\n font-size: calc(var(--ag-font-size) - 1px);\n font-weight: 600;\n color: var(--ag-disabled-foreground-color);\n}\n.ag-theme-material .ag-ltr .ag-column-drop-vertical-empty-message, .ag-theme-material-dark .ag-ltr .ag-column-drop-vertical-empty-message, .ag-theme-material-auto-dark .ag-ltr .ag-column-drop-vertical-empty-message {\n padding-left: calc(var(--ag-icon-size) + var(--ag-grid-size) * 2);\n padding-right: var(--ag-grid-size);\n}\n\n.ag-theme-material .ag-rtl .ag-column-drop-vertical-empty-message, .ag-theme-material-dark .ag-rtl .ag-column-drop-vertical-empty-message, .ag-theme-material-auto-dark .ag-rtl .ag-column-drop-vertical-empty-message {\n padding-right: calc(var(--ag-icon-size) + var(--ag-grid-size) * 2);\n padding-left: var(--ag-grid-size);\n}\n\n.ag-theme-material .ag-status-bar,\n.ag-theme-material-dark .ag-status-bar,\n.ag-theme-material-auto-dark .ag-status-bar {\n border: solid 1px;\n border-color: var(--ag-border-color);\n}\n.ag-theme-material .ag-column-panel-column-select,\n.ag-theme-material-dark .ag-column-panel-column-select,\n.ag-theme-material-auto-dark .ag-column-panel-column-select {\n border-top: solid 1px;\n border-top-color: var(--ag-border-color);\n}\n.ag-theme-material .ag-column-select,\n.ag-theme-material .ag-column-select-header,\n.ag-theme-material-dark .ag-column-select,\n.ag-theme-material-dark .ag-column-select-header,\n.ag-theme-material-auto-dark .ag-column-select,\n.ag-theme-material-auto-dark .ag-column-select-header {\n border-bottom: solid 1px;\n border-bottom-color: var(--ag-border-color);\n}\n.ag-theme-material .ag-column-select-header,\n.ag-theme-material-dark .ag-column-select-header,\n.ag-theme-material-auto-dark .ag-column-select-header {\n height: var(--ag-header-height);\n}\n.ag-theme-material .ag-group-title-bar,\n.ag-theme-material-dark .ag-group-title-bar,\n.ag-theme-material-auto-dark .ag-group-title-bar {\n padding: calc(var(--ag-grid-size) * 0.75) var(--ag-grid-size);\n}\n.ag-theme-material .ag-charts-format-sub-level-group-title-bar,\n.ag-theme-material-dark .ag-charts-format-sub-level-group-title-bar,\n.ag-theme-material-auto-dark .ag-charts-format-sub-level-group-title-bar {\n padding: calc(var(--ag-grid-size) * 0.5) var(--ag-grid-size);\n}\n.ag-theme-material .ag-chart-data-section,\n.ag-theme-material .ag-chart-format-section,\n.ag-theme-material .ag-chart-advanced-settings-section,\n.ag-theme-material-dark .ag-chart-data-section,\n.ag-theme-material-dark .ag-chart-format-section,\n.ag-theme-material-dark .ag-chart-advanced-settings-section,\n.ag-theme-material-auto-dark .ag-chart-data-section,\n.ag-theme-material-auto-dark .ag-chart-format-section,\n.ag-theme-material-auto-dark .ag-chart-advanced-settings-section {\n padding-bottom: calc(var(--ag-grid-size) * 0.5);\n}\n.ag-theme-material input[class^=ag-]:not([type]),\n.ag-theme-material input[class^=ag-][type=text],\n.ag-theme-material input[class^=ag-][type=number],\n.ag-theme-material input[class^=ag-][type=tel],\n.ag-theme-material input[class^=ag-][type=date],\n.ag-theme-material input[class^=ag-][type=datetime-local],\n.ag-theme-material textarea[class^=ag-],\n.ag-theme-material-dark input[class^=ag-]:not([type]),\n.ag-theme-material-dark input[class^=ag-][type=text],\n.ag-theme-material-dark input[class^=ag-][type=number],\n.ag-theme-material-dark input[class^=ag-][type=tel],\n.ag-theme-material-dark input[class^=ag-][type=date],\n.ag-theme-material-dark input[class^=ag-][type=datetime-local],\n.ag-theme-material-dark textarea[class^=ag-],\n.ag-theme-material-auto-dark input[class^=ag-]:not([type]),\n.ag-theme-material-auto-dark input[class^=ag-][type=text],\n.ag-theme-material-auto-dark input[class^=ag-][type=number],\n.ag-theme-material-auto-dark input[class^=ag-][type=tel],\n.ag-theme-material-auto-dark input[class^=ag-][type=date],\n.ag-theme-material-auto-dark input[class^=ag-][type=datetime-local],\n.ag-theme-material-auto-dark textarea[class^=ag-] {\n background: transparent;\n color: var(--ag-foreground-color);\n font-family: inherit;\n font-size: inherit;\n padding-bottom: var(--ag-grid-size);\n border-width: 0;\n border-radius: 0;\n border-bottom: 2px solid;\n border-bottom-color: var(--ag-border-color);\n}\n.ag-theme-material input[class^=ag-]:not([type]):not(textarea),\n.ag-theme-material input[class^=ag-][type=text]:not(textarea),\n.ag-theme-material input[class^=ag-][type=number]:not(textarea),\n.ag-theme-material input[class^=ag-][type=tel]:not(textarea),\n.ag-theme-material input[class^=ag-][type=date]:not(textarea),\n.ag-theme-material input[class^=ag-][type=datetime-local]:not(textarea),\n.ag-theme-material textarea[class^=ag-]:not(textarea),\n.ag-theme-material-dark input[class^=ag-]:not([type]):not(textarea),\n.ag-theme-material-dark input[class^=ag-][type=text]:not(textarea),\n.ag-theme-material-dark input[class^=ag-][type=number]:not(textarea),\n.ag-theme-material-dark input[class^=ag-][type=tel]:not(textarea),\n.ag-theme-material-dark input[class^=ag-][type=date]:not(textarea),\n.ag-theme-material-dark input[class^=ag-][type=datetime-local]:not(textarea),\n.ag-theme-material-dark textarea[class^=ag-]:not(textarea),\n.ag-theme-material-auto-dark input[class^=ag-]:not([type]):not(textarea),\n.ag-theme-material-auto-dark input[class^=ag-][type=text]:not(textarea),\n.ag-theme-material-auto-dark input[class^=ag-][type=number]:not(textarea),\n.ag-theme-material-auto-dark input[class^=ag-][type=tel]:not(textarea),\n.ag-theme-material-auto-dark input[class^=ag-][type=date]:not(textarea),\n.ag-theme-material-auto-dark input[class^=ag-][type=datetime-local]:not(textarea),\n.ag-theme-material-auto-dark textarea[class^=ag-]:not(textarea) {\n height: calc(var(--ag-grid-size) * 5);\n}\n.ag-theme-material input[class^=ag-]:not([type]):focus,\n.ag-theme-material input[class^=ag-][type=text]:focus,\n.ag-theme-material input[class^=ag-][type=number]:focus,\n.ag-theme-material input[class^=ag-][type=tel]:focus,\n.ag-theme-material input[class^=ag-][type=date]:focus,\n.ag-theme-material input[class^=ag-][type=datetime-local]:focus,\n.ag-theme-material textarea[class^=ag-]:focus,\n.ag-theme-material-dark input[class^=ag-]:not([type]):focus,\n.ag-theme-material-dark input[class^=ag-][type=text]:focus,\n.ag-theme-material-dark input[class^=ag-][type=number]:focus,\n.ag-theme-material-dark input[class^=ag-][type=tel]:focus,\n.ag-theme-material-dark input[class^=ag-][type=date]:focus,\n.ag-theme-material-dark input[class^=ag-][type=datetime-local]:focus,\n.ag-theme-material-dark textarea[class^=ag-]:focus,\n.ag-theme-material-auto-dark input[class^=ag-]:not([type]):focus,\n.ag-theme-material-auto-dark input[class^=ag-][type=text]:focus,\n.ag-theme-material-auto-dark input[class^=ag-][type=number]:focus,\n.ag-theme-material-auto-dark input[class^=ag-][type=tel]:focus,\n.ag-theme-material-auto-dark input[class^=ag-][type=date]:focus,\n.ag-theme-material-auto-dark input[class^=ag-][type=datetime-local]:focus,\n.ag-theme-material-auto-dark textarea[class^=ag-]:focus {\n border-bottom: 2px solid;\n border-bottom-color: var(--ag-material-primary-color);\n outline: none;\n box-shadow: none;\n}\n.ag-theme-material input[class^=ag-]:not([type])::placeholder,\n.ag-theme-material input[class^=ag-][type=text]::placeholder,\n.ag-theme-material input[class^=ag-][type=number]::placeholder,\n.ag-theme-material input[class^=ag-][type=tel]::placeholder,\n.ag-theme-material input[class^=ag-][type=date]::placeholder,\n.ag-theme-material input[class^=ag-][type=datetime-local]::placeholder,\n.ag-theme-material textarea[class^=ag-]::placeholder,\n.ag-theme-material-dark input[class^=ag-]:not([type])::placeholder,\n.ag-theme-material-dark input[class^=ag-][type=text]::placeholder,\n.ag-theme-material-dark input[class^=ag-][type=number]::placeholder,\n.ag-theme-material-dark input[class^=ag-][type=tel]::placeholder,\n.ag-theme-material-dark input[class^=ag-][type=date]::placeholder,\n.ag-theme-material-dark input[class^=ag-][type=datetime-local]::placeholder,\n.ag-theme-material-dark textarea[class^=ag-]::placeholder,\n.ag-theme-material-auto-dark input[class^=ag-]:not([type])::placeholder,\n.ag-theme-material-auto-dark input[class^=ag-][type=text]::placeholder,\n.ag-theme-material-auto-dark input[class^=ag-][type=number]::placeholder,\n.ag-theme-material-auto-dark input[class^=ag-][type=tel]::placeholder,\n.ag-theme-material-auto-dark input[class^=ag-][type=date]::placeholder,\n.ag-theme-material-auto-dark input[class^=ag-][type=datetime-local]::placeholder,\n.ag-theme-material-auto-dark textarea[class^=ag-]::placeholder {\n color: var(--ag-disabled-foreground-color);\n}\n.ag-theme-material input[class^=ag-]:not([type]):disabled,\n.ag-theme-material input[class^=ag-][type=text]:disabled,\n.ag-theme-material input[class^=ag-][type=number]:disabled,\n.ag-theme-material input[class^=ag-][type=tel]:disabled,\n.ag-theme-material input[class^=ag-][type=date]:disabled,\n.ag-theme-material input[class^=ag-][type=datetime-local]:disabled,\n.ag-theme-material textarea[class^=ag-]:disabled,\n.ag-theme-material-dark input[class^=ag-]:not([type]):disabled,\n.ag-theme-material-dark input[class^=ag-][type=text]:disabled,\n.ag-theme-material-dark input[class^=ag-][type=number]:disabled,\n.ag-theme-material-dark input[class^=ag-][type=tel]:disabled,\n.ag-theme-material-dark input[class^=ag-][type=date]:disabled,\n.ag-theme-material-dark input[class^=ag-][type=datetime-local]:disabled,\n.ag-theme-material-dark textarea[class^=ag-]:disabled,\n.ag-theme-material-auto-dark input[class^=ag-]:not([type]):disabled,\n.ag-theme-material-auto-dark input[class^=ag-][type=text]:disabled,\n.ag-theme-material-auto-dark input[class^=ag-][type=number]:disabled,\n.ag-theme-material-auto-dark input[class^=ag-][type=tel]:disabled,\n.ag-theme-material-auto-dark input[class^=ag-][type=date]:disabled,\n.ag-theme-material-auto-dark input[class^=ag-][type=datetime-local]:disabled,\n.ag-theme-material-auto-dark textarea[class^=ag-]:disabled {\n border-bottom: 1px solid;\n border-bottom-color: var(--ag-border-color);\n}\n.ag-theme-material input[class^=ag-]:not([type]):invalid,\n.ag-theme-material input[class^=ag-][type=text]:invalid,\n.ag-theme-material input[class^=ag-][type=number]:invalid,\n.ag-theme-material input[class^=ag-][type=tel]:invalid,\n.ag-theme-material input[class^=ag-][type=date]:invalid,\n.ag-theme-material input[class^=ag-][type=datetime-local]:invalid,\n.ag-theme-material textarea[class^=ag-]:invalid,\n.ag-theme-material-dark input[class^=ag-]:not([type]):invalid,\n.ag-theme-material-dark input[class^=ag-][type=text]:invalid,\n.ag-theme-material-dark input[class^=ag-][type=number]:invalid,\n.ag-theme-material-dark input[class^=ag-][type=tel]:invalid,\n.ag-theme-material-dark input[class^=ag-][type=date]:invalid,\n.ag-theme-material-dark input[class^=ag-][type=datetime-local]:invalid,\n.ag-theme-material-dark textarea[class^=ag-]:invalid,\n.ag-theme-material-auto-dark input[class^=ag-]:not([type]):invalid,\n.ag-theme-material-auto-dark input[class^=ag-][type=text]:invalid,\n.ag-theme-material-auto-dark input[class^=ag-][type=number]:invalid,\n.ag-theme-material-auto-dark input[class^=ag-][type=tel]:invalid,\n.ag-theme-material-auto-dark input[class^=ag-][type=date]:invalid,\n.ag-theme-material-auto-dark input[class^=ag-][type=datetime-local]:invalid,\n.ag-theme-material-auto-dark textarea[class^=ag-]:invalid {\n border-width: 0;\n border-bottom: 1px solid;\n border-bottom-color: var(--ag-invalid-color);\n color: var(--ag-invalid-color);\n}\n.ag-theme-material .ag-standard-button,\n.ag-theme-material-dark .ag-standard-button,\n.ag-theme-material-auto-dark .ag-standard-button {\n appearance: none;\n background-color: transparent;\n border: 0;\n color: var(--ag-material-primary-color);\n font-family: inherit;\n font-size: inherit;\n margin: 0;\n padding: 0;\n text-transform: uppercase;\n}\n.ag-theme-material .ag-standard-button:disabled,\n.ag-theme-material-dark .ag-standard-button:disabled,\n.ag-theme-material-auto-dark .ag-standard-button:disabled {\n color: var(--ag-disabled-foreground-color);\n background-color: var(--ag-input-disabled-background-color);\n border-color: var(--ag-input-disabled-border-color);\n}\n.ag-theme-material.ag-dnd-ghost,\n.ag-theme-material-dark.ag-dnd-ghost,\n.ag-theme-material-auto-dark.ag-dnd-ghost {\n font-size: calc(var(--ag-font-size) - 1px);\n font-weight: 600;\n}\n.ag-theme-material .ag-filter-toolpanel-header,\n.ag-theme-material-dark .ag-filter-toolpanel-header,\n.ag-theme-material-auto-dark .ag-filter-toolpanel-header {\n height: calc(var(--ag-grid-size) * 4);\n}\n.ag-theme-material .ag-filter-toolpanel-group-level-0-header,\n.ag-theme-material-dark .ag-filter-toolpanel-group-level-0-header,\n.ag-theme-material-auto-dark .ag-filter-toolpanel-group-level-0-header {\n height: calc(var(--ag-grid-size) * 7);\n}\n.ag-theme-material .ag-ltr .ag-filter-apply-panel-button, .ag-theme-material .ag-ltr .ag-advanced-filter-apply-button, .ag-theme-material .ag-ltr .ag-advanced-filter-builder-button, .ag-theme-material-dark .ag-ltr .ag-filter-apply-panel-button, .ag-theme-material-dark .ag-ltr .ag-advanced-filter-apply-button, .ag-theme-material-dark .ag-ltr .ag-advanced-filter-builder-button, .ag-theme-material-auto-dark .ag-ltr .ag-filter-apply-panel-button, .ag-theme-material-auto-dark .ag-ltr .ag-advanced-filter-apply-button, .ag-theme-material-auto-dark .ag-ltr .ag-advanced-filter-builder-button {\n margin-left: var(--ag-grid-size);\n}\n\n.ag-theme-material .ag-rtl .ag-filter-apply-panel-button, .ag-theme-material .ag-rtl .ag-advanced-filter-apply-button, .ag-theme-material .ag-rtl .ag-advanced-filter-builder-button, .ag-theme-material-dark .ag-rtl .ag-filter-apply-panel-button, .ag-theme-material-dark .ag-rtl .ag-advanced-filter-apply-button, .ag-theme-material-dark .ag-rtl .ag-advanced-filter-builder-button, .ag-theme-material-auto-dark .ag-rtl .ag-filter-apply-panel-button, .ag-theme-material-auto-dark .ag-rtl .ag-advanced-filter-apply-button, .ag-theme-material-auto-dark .ag-rtl .ag-advanced-filter-builder-button {\n margin-right: var(--ag-grid-size);\n}\n\n.ag-theme-material .ag-layout-auto-height .ag-center-cols-viewport,\n.ag-theme-material .ag-layout-auto-height .ag-center-cols-container,\n.ag-theme-material .ag-layout-print .ag-center-cols-viewport,\n.ag-theme-material .ag-layout-print .ag-center-cols-container,\n.ag-theme-material-dark .ag-layout-auto-height .ag-center-cols-viewport,\n.ag-theme-material-dark .ag-layout-auto-height .ag-center-cols-container,\n.ag-theme-material-dark .ag-layout-print .ag-center-cols-viewport,\n.ag-theme-material-dark .ag-layout-print .ag-center-cols-container,\n.ag-theme-material-auto-dark .ag-layout-auto-height .ag-center-cols-viewport,\n.ag-theme-material-auto-dark .ag-layout-auto-height .ag-center-cols-container,\n.ag-theme-material-auto-dark .ag-layout-print .ag-center-cols-viewport,\n.ag-theme-material-auto-dark .ag-layout-print .ag-center-cols-container {\n min-height: 150px;\n}\n.ag-theme-material .ag-picker-field-wrapper:focus-within,\n.ag-theme-material-dark .ag-picker-field-wrapper:focus-within,\n.ag-theme-material-auto-dark .ag-picker-field-wrapper:focus-within {\n box-shadow: 0 0 0 1px var(--ag-material-primary-color);\n}\n.ag-theme-material .ag-rich-select-list,\n.ag-theme-material-dark .ag-rich-select-list,\n.ag-theme-material-auto-dark .ag-rich-select-list {\n box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 5px -3px, rgba(0, 0, 0, 0.14) 0px 8px 10px 1px, rgba(0, 0, 0, 0.12) 0px 3px 14px 2px;\n}\n.ag-theme-material .ag-advanced-filter-builder-button-label,\n.ag-theme-material-dark .ag-advanced-filter-builder-button-label,\n.ag-theme-material-auto-dark .ag-advanced-filter-builder-button-label {\n text-transform: uppercase;\n}\n.ag-theme-material .ag-filter-active .ag-icon-filter,\n.ag-theme-material-dark .ag-filter-active .ag-icon-filter,\n.ag-theme-material-auto-dark .ag-filter-active .ag-icon-filter {\n color: var(--ag-material-accent-color);\n}\n.ag-theme-material .ag-list-item-hovered::after,\n.ag-theme-material-dark .ag-list-item-hovered::after,\n.ag-theme-material-auto-dark .ag-list-item-hovered::after {\n background-color: var(--ag-material-primary-color);\n}\n.ag-theme-material .ag-pill .ag-pill-button:hover,\n.ag-theme-material-dark .ag-pill .ag-pill-button:hover,\n.ag-theme-material-auto-dark .ag-pill .ag-pill-button:hover {\n color: var(--ag-material-primary-color);\n}\n.ag-theme-material .ag-header-highlight-before::after,\n.ag-theme-material .ag-header-highlight-after::after,\n.ag-theme-material-dark .ag-header-highlight-before::after,\n.ag-theme-material-dark .ag-header-highlight-after::after,\n.ag-theme-material-auto-dark .ag-header-highlight-before::after,\n.ag-theme-material-auto-dark .ag-header-highlight-after::after {\n background-color: var(--ag-material-primary-color);\n}\n.ag-theme-material .ag-advanced-filter-builder-item-button-disabled .ag-icon,\n.ag-theme-material .ag-disabled .ag-icon,\n.ag-theme-material .ag-column-select-column-group-readonly .ag-icon,\n.ag-theme-material [disabled] .ag-icon,\n.ag-theme-material-dark .ag-advanced-filter-builder-item-button-disabled .ag-icon,\n.ag-theme-material-dark .ag-disabled .ag-icon,\n.ag-theme-material-dark .ag-column-select-column-group-readonly .ag-icon,\n.ag-theme-material-dark [disabled] .ag-icon,\n.ag-theme-material-auto-dark .ag-advanced-filter-builder-item-button-disabled .ag-icon,\n.ag-theme-material-auto-dark .ag-disabled .ag-icon,\n.ag-theme-material-auto-dark .ag-column-select-column-group-readonly .ag-icon,\n.ag-theme-material-auto-dark [disabled] .ag-icon {\n color: var(--ag-disabled-foreground-color);\n}\n", ""]); // Exports /* harmony default export */ __webpack_exports__.A = (___CSS_LOADER_EXPORT___); /***/ }), /***/ 3973: /***/ (function(module, __webpack_exports__, __webpack_require__) { /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6758); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(935); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(62); /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__); // Imports var ___CSS_LOADER_URL_IMPORT_0___ = new URL(/* asset import */ __webpack_require__(6055), __webpack_require__.b); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); var ___CSS_LOADER_URL_REPLACEMENT_0___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_0___); // Module ___CSS_LOADER_EXPORT___.push([module.id, "@font-face {\n font-family: \"agGridMaterial\";\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_0___ + ");\n font-weight: normal;\n font-style: normal;\n}\n.ag-theme-material,\n.ag-theme-material-dark,\n.ag-theme-material-auto-dark {\n --ag-material-primary-color: #3f51b5;\n --ag-material-accent-color: #ff4081;\n --ag-foreground-color: rgba(0, 0, 0, 0.87);\n --ag-secondary-foreground-color: rgba(0, 0, 0, 0.54);\n --ag-disabled-foreground-color: rgba(0, 0, 0, 0.38);\n --ag-background-color: #fff;\n --ag-header-background-color: #fff;\n --ag-tooltip-background-color: #fff;\n --ag-subheader-background-color: #eee;\n --ag-subheader-toolbar-background-color: rgba(238, 238, 238, 0.5);\n --ag-header-cell-hover-background-color: #f2f2f2;\n --ag-chip-background-color: #e2e2e2;\n --ag-range-selection-background-color: rgba(122, 134, 203, 0.1);\n --ag-range-selection-background-color-2: rgba(122, 134, 203, 0.19);\n --ag-range-selection-background-color-3: rgba(122, 134, 203, 0.27);\n --ag-range-selection-background-color-4: rgba(122, 134, 203, 0.34);\n --ag-row-numbers-selected-color: color-mix(in srgb, transparent, var(--ag-material-accent-color) 50%);\n --ag-range-selection-highlight-color: #fce4ec;\n --ag-row-hover-color: #fafafa;\n --ag-column-hover-color: #fafafa;\n --ag-control-panel-background-color: #fafafa;\n --ag-selected-row-background-color: rgba(33, 150, 243, 0.3);\n --ag-checkbox-unchecked-color: #333;\n --ag-value-change-value-highlight-background-color: #00acc1;\n --ag-side-button-selected-background-color: transparent;\n --ag-advanced-filter-join-pill-color: #f08e8d;\n --ag-advanced-filter-column-pill-color: #a6e194;\n --ag-advanced-filter-option-pill-color: #f3c08b;\n --ag-advanced-filter-value-pill-color: #85c0e4;\n --ag-range-selection-border-color: var(--ag-material-primary-color);\n --ag-checkbox-checked-color: var(--ag-material-accent-color);\n --ag-borders: none;\n --ag-borders-critical: solid 1px;\n --ag-border-color: #e2e2e2;\n --ag-grid-size: 8px;\n --ag-icon-size: 18px;\n --ag-header-height: calc(var(--ag-grid-size) * 7);\n --ag-row-height: calc(var(--ag-grid-size) * 6);\n --ag-cell-horizontal-padding: calc(var(--ag-grid-size) * 3);\n --ag-list-item-height: calc(var(--ag-grid-size) * 4);\n --ag-row-group-indent-size: calc(var(--ag-grid-size) * 3 + var(--ag-icon-size));\n --ag-filter-tool-panel-sub-level-row-height: calc(var(--ag-grid-size) * 4);\n --ag-checkbox-border-radius: 2px;\n --ag-toggle-button-switch-border-width: 2px;\n --ag-toggle-button-height: var(--ag-icon-size);\n --ag-widget-container-horizontal-padding: calc(var(--ag-grid-size) * 1.5);\n --ag-widget-container-vertical-padding: calc(var(--ag-grid-size) * 2);\n --ag-widget-vertical-spacing: calc(var(--ag-grid-size) * 1.75);\n --ag-font-family: Roboto, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Oxygen-Sans, Ubuntu, Cantarell,\n \"Helvetica Neue\", sans-serif;\n --ag-font-size: 13px;\n --ag-icon-font-family: agGridMaterial;\n --ag-selected-tab-underline-color: var(--ag-material-primary-color);\n --ag-selected-tab-underline-width: 2px;\n --ag-input-focus-border-color: var(--ag-material-primary-color);\n --ag-input-focus-box-shadow: 0 0 0 5px rgba(32, 33, 36, 0.122);\n --ag-card-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14),\n 0 1px 5px 0 rgba(0, 0, 0, 0.12);\n --ag-card-radius: 2px;\n --ag-invalid-color: #e02525;\n}\n\n.ag-theme-material-dark {\n --ag-material-primary-color: #3f51b5;\n --ag-material-accent-color: #bb86fcff;\n --ag-range-selection-border-color: var(--ag-material-accent-color);\n --ag-background-color: #121212ff;\n --ag-foreground-color: #ffffffff;\n --ag-data-color: #f5f5f5ff;\n --ag-header-cell-hover-background-color: #000000ff;\n --ag-advanced-filter-join-pill-color: #7a3a37ff;\n --ag-advanced-filter-column-pill-color: #355f2dff;\n --ag-advanced-filter-option-pill-color: #5a3168ff;\n --ag-advanced-filter-value-pill-color: #374c86ff;\n --ag-input-disabled-border-color: #3a434eff;\n --ag-input-disabled-background-color: #68686e12;\n --ag-selected-row-background-color: #bb86fc33;\n --ag-row-hover-color: #bb86fc33;\n --ag-column-hover-color: #f5f5f50d;\n --ag-range-selection-background-color: #bb86fc1a;\n --ag-range-selection-background-color-2: #bb86fc30;\n --ag-range-selection-background-color-3: #bb86fc45;\n --ag-range-selection-background-color-4: #bb86fc57;\n --ag-border-color: #383838ff;\n --ag-secondary-border-color: #383838ff;\n --ag-header-background-color: #121212ff;\n --ag-tooltip-background-color: #212b38ff;\n --ag-odd-row-background-color: #121212ff;\n --ag-control-panel-background-color: #2c2c2cff;\n --ag-subheader-background-color: #ffffff0d;\n --ag-subheader-toolbar-background-color: #2c2c2cff;\n --ag-invalid-color: #e02525ff;\n --ag-checkbox-unchecked-color: #797e87ff;\n --ag-checkbox-background-color: #121212ff;\n --ag-secondary-foreground-color: #f5f5f5ff;\n --ag-input-border-color: #383838ff;\n --ag-input-border-color-invalid: #e02525ff;\n --ag-disabled-foreground-color: #f5f5f580;\n --ag-chip-background-color: #22262812;\n --ag-side-button-selected-background-color: #2c2c2cff;\n --ag-selected-tab-underline-color: #3f51b5ff;\n --ag-modal-overlay-background-color: #121212a8;\n --ag-value-change-delta-up-color: #43a047a8;\n --ag-value-change-delta-down-color: #e53935ff;\n --ag-menu-background-color: #2c2c2cff;\n --ag-row-loading-skeleton-effect-color: rgba(202, 203, 204, 0.4);\n color-scheme: dark;\n}\n\n@media (prefers-color-scheme: dark) {\n .ag-theme-material-auto-dark {\n --ag-material-primary-color: #3f51b5;\n --ag-material-accent-color: #bb86fcff;\n --ag-range-selection-border-color: var(--ag-material-accent-color);\n --ag-background-color: #121212ff;\n --ag-foreground-color: #ffffffff;\n --ag-data-color: #f5f5f5ff;\n --ag-header-cell-hover-background-color: #000000ff;\n --ag-advanced-filter-join-pill-color: #7a3a37ff;\n --ag-advanced-filter-column-pill-color: #355f2dff;\n --ag-advanced-filter-option-pill-color: #5a3168ff;\n --ag-advanced-filter-value-pill-color: #374c86ff;\n --ag-input-disabled-border-color: #3a434eff;\n --ag-input-disabled-background-color: #68686e12;\n --ag-selected-row-background-color: #bb86fc33;\n --ag-row-hover-color: #bb86fc33;\n --ag-column-hover-color: #f5f5f50d;\n --ag-range-selection-background-color: #bb86fc1a;\n --ag-range-selection-background-color-2: #bb86fc30;\n --ag-range-selection-background-color-3: #bb86fc45;\n --ag-range-selection-background-color-4: #bb86fc57;\n --ag-border-color: #383838ff;\n --ag-secondary-border-color: #383838ff;\n --ag-header-background-color: #121212ff;\n --ag-tooltip-background-color: #212b38ff;\n --ag-odd-row-background-color: #121212ff;\n --ag-control-panel-background-color: #2c2c2cff;\n --ag-subheader-background-color: #ffffff0d;\n --ag-subheader-toolbar-background-color: #2c2c2cff;\n --ag-invalid-color: #e02525ff;\n --ag-checkbox-unchecked-color: #797e87ff;\n --ag-checkbox-background-color: #121212ff;\n --ag-secondary-foreground-color: #f5f5f5ff;\n --ag-input-border-color: #383838ff;\n --ag-input-border-color-invalid: #e02525ff;\n --ag-disabled-foreground-color: #f5f5f580;\n --ag-chip-background-color: #22262812;\n --ag-side-button-selected-background-color: #2c2c2cff;\n --ag-selected-tab-underline-color: #3f51b5ff;\n --ag-modal-overlay-background-color: #121212a8;\n --ag-value-change-delta-up-color: #43a047a8;\n --ag-value-change-delta-down-color: #e53935ff;\n --ag-menu-background-color: #2c2c2cff;\n --ag-row-loading-skeleton-effect-color: rgba(202, 203, 204, 0.4);\n color-scheme: dark;\n }\n}\n.ag-theme-material .ag-filter-toolpanel-header,\n.ag-theme-material .ag-filter-toolpanel-search,\n.ag-theme-material .ag-status-bar,\n.ag-theme-material .ag-header-row,\n.ag-theme-material .ag-row-number-cell,\n.ag-theme-material .ag-panel-title-bar-title,\n.ag-theme-material .ag-multi-filter-group-title-bar,\n.ag-theme-material-dark .ag-filter-toolpanel-header,\n.ag-theme-material-dark .ag-filter-toolpanel-search,\n.ag-theme-material-dark .ag-status-bar,\n.ag-theme-material-dark .ag-header-row,\n.ag-theme-material-dark .ag-row-number-cell,\n.ag-theme-material-dark .ag-panel-title-bar-title,\n.ag-theme-material-dark .ag-multi-filter-group-title-bar,\n.ag-theme-material-auto-dark .ag-filter-toolpanel-header,\n.ag-theme-material-auto-dark .ag-filter-toolpanel-search,\n.ag-theme-material-auto-dark .ag-status-bar,\n.ag-theme-material-auto-dark .ag-header-row,\n.ag-theme-material-auto-dark .ag-row-number-cell,\n.ag-theme-material-auto-dark .ag-panel-title-bar-title,\n.ag-theme-material-auto-dark .ag-multi-filter-group-title-bar {\n font-size: calc(var(--ag-font-size) - 1px);\n font-weight: 600;\n color: var(--ag-header-foreground-color);\n}\n.ag-theme-material .ag-tab,\n.ag-theme-material-dark .ag-tab,\n.ag-theme-material-auto-dark .ag-tab {\n height: calc(var(--ag-grid-size) * 4.5);\n flex: 1 1 auto;\n}\n.ag-theme-material .ag-tabs-header,\n.ag-theme-material .ag-column-drop-horizontal,\n.ag-theme-material-dark .ag-tabs-header,\n.ag-theme-material-dark .ag-column-drop-horizontal,\n.ag-theme-material-auto-dark .ag-tabs-header,\n.ag-theme-material-auto-dark .ag-column-drop-horizontal {\n background-color: var(--ag-subheader-background-color);\n}\n.ag-theme-material .ag-tabs-body,\n.ag-theme-material-dark .ag-tabs-body,\n.ag-theme-material-auto-dark .ag-tabs-body {\n padding: calc(var(--ag-grid-size) * 0.5) 0;\n}\n.ag-theme-material .ag-tabs-body .ag-menu-list,\n.ag-theme-material-dark .ag-tabs-body .ag-menu-list,\n.ag-theme-material-auto-dark .ag-tabs-body .ag-menu-list {\n padding-top: 0;\n padding-bottom: 0;\n}\n.ag-theme-material .ag-header-cell,\n.ag-theme-material .ag-header-group-cell,\n.ag-theme-material-dark .ag-header-cell,\n.ag-theme-material-dark .ag-header-group-cell,\n.ag-theme-material-auto-dark .ag-header-cell,\n.ag-theme-material-auto-dark .ag-header-group-cell {\n transition: background-color 0.5s;\n}\n.ag-theme-material .ag-row-last:not(.ag-row-first) .ag-cell-inline-editing,\n.ag-theme-material-dark .ag-row-last:not(.ag-row-first) .ag-cell-inline-editing,\n.ag-theme-material-auto-dark .ag-row-last:not(.ag-row-first) .ag-cell-inline-editing {\n bottom: 0;\n}\n.ag-theme-material .ag-cell-inline-editing,\n.ag-theme-material-dark .ag-cell-inline-editing,\n.ag-theme-material-auto-dark .ag-cell-inline-editing {\n padding: var(--ag-grid-size);\n height: calc(var(--ag-row-height) + var(--ag-grid-size) * 3);\n border-color: var(--ag-border-color) !important;\n}\n.ag-theme-material .ag-has-focus .ag-cell-inline-editing,\n.ag-theme-material-dark .ag-has-focus .ag-cell-inline-editing,\n.ag-theme-material-auto-dark .ag-has-focus .ag-cell-inline-editing {\n border-color: var(--ag-input-focus-border-color) !important;\n}\n.ag-theme-material .ag-column-drop-vertical,\n.ag-theme-material-dark .ag-column-drop-vertical,\n.ag-theme-material-auto-dark .ag-column-drop-vertical {\n border-bottom: solid 1px;\n border-bottom-color: var(--ag-border-color);\n padding-top: var(--ag-grid-size);\n}\n.ag-theme-material .ag-column-drop-vertical.ag-last-column-drop,\n.ag-theme-material-dark .ag-column-drop-vertical.ag-last-column-drop,\n.ag-theme-material-auto-dark .ag-column-drop-vertical.ag-last-column-drop {\n border-bottom: none;\n}\n.ag-theme-material .ag-column-drop-vertical-cell,\n.ag-theme-material-dark .ag-column-drop-vertical-cell,\n.ag-theme-material-auto-dark .ag-column-drop-vertical-cell {\n margin-left: 0;\n}\n.ag-theme-material .ag-column-drop-vertical-empty-message,\n.ag-theme-material-dark .ag-column-drop-vertical-empty-message,\n.ag-theme-material-auto-dark .ag-column-drop-vertical-empty-message {\n font-size: calc(var(--ag-font-size) - 1px);\n font-weight: 600;\n color: var(--ag-disabled-foreground-color);\n}\n.ag-theme-material .ag-ltr .ag-column-drop-vertical-empty-message, .ag-theme-material-dark .ag-ltr .ag-column-drop-vertical-empty-message, .ag-theme-material-auto-dark .ag-ltr .ag-column-drop-vertical-empty-message {\n padding-left: calc(var(--ag-icon-size) + var(--ag-grid-size) * 2);\n padding-right: var(--ag-grid-size);\n}\n\n.ag-theme-material .ag-rtl .ag-column-drop-vertical-empty-message, .ag-theme-material-dark .ag-rtl .ag-column-drop-vertical-empty-message, .ag-theme-material-auto-dark .ag-rtl .ag-column-drop-vertical-empty-message {\n padding-right: calc(var(--ag-icon-size) + var(--ag-grid-size) * 2);\n padding-left: var(--ag-grid-size);\n}\n\n.ag-theme-material .ag-status-bar,\n.ag-theme-material-dark .ag-status-bar,\n.ag-theme-material-auto-dark .ag-status-bar {\n border: solid 1px;\n border-color: var(--ag-border-color);\n}\n.ag-theme-material .ag-column-panel-column-select,\n.ag-theme-material-dark .ag-column-panel-column-select,\n.ag-theme-material-auto-dark .ag-column-panel-column-select {\n border-top: solid 1px;\n border-top-color: var(--ag-border-color);\n}\n.ag-theme-material .ag-column-select,\n.ag-theme-material .ag-column-select-header,\n.ag-theme-material-dark .ag-column-select,\n.ag-theme-material-dark .ag-column-select-header,\n.ag-theme-material-auto-dark .ag-column-select,\n.ag-theme-material-auto-dark .ag-column-select-header {\n border-bottom: solid 1px;\n border-bottom-color: var(--ag-border-color);\n}\n.ag-theme-material .ag-column-select-header,\n.ag-theme-material-dark .ag-column-select-header,\n.ag-theme-material-auto-dark .ag-column-select-header {\n height: var(--ag-header-height);\n}\n.ag-theme-material .ag-group-title-bar,\n.ag-theme-material-dark .ag-group-title-bar,\n.ag-theme-material-auto-dark .ag-group-title-bar {\n padding: calc(var(--ag-grid-size) * 0.75) var(--ag-grid-size);\n}\n.ag-theme-material .ag-charts-format-sub-level-group-title-bar,\n.ag-theme-material-dark .ag-charts-format-sub-level-group-title-bar,\n.ag-theme-material-auto-dark .ag-charts-format-sub-level-group-title-bar {\n padding: calc(var(--ag-grid-size) * 0.5) var(--ag-grid-size);\n}\n.ag-theme-material .ag-chart-data-section,\n.ag-theme-material .ag-chart-format-section,\n.ag-theme-material .ag-chart-advanced-settings-section,\n.ag-theme-material-dark .ag-chart-data-section,\n.ag-theme-material-dark .ag-chart-format-section,\n.ag-theme-material-dark .ag-chart-advanced-settings-section,\n.ag-theme-material-auto-dark .ag-chart-data-section,\n.ag-theme-material-auto-dark .ag-chart-format-section,\n.ag-theme-material-auto-dark .ag-chart-advanced-settings-section {\n padding-bottom: calc(var(--ag-grid-size) * 0.5);\n}\n.ag-theme-material input[class^=ag-]:not([type]),\n.ag-theme-material input[class^=ag-][type=text],\n.ag-theme-material input[class^=ag-][type=number],\n.ag-theme-material input[class^=ag-][type=tel],\n.ag-theme-material input[class^=ag-][type=date],\n.ag-theme-material input[class^=ag-][type=datetime-local],\n.ag-theme-material textarea[class^=ag-],\n.ag-theme-material-dark input[class^=ag-]:not([type]),\n.ag-theme-material-dark input[class^=ag-][type=text],\n.ag-theme-material-dark input[class^=ag-][type=number],\n.ag-theme-material-dark input[class^=ag-][type=tel],\n.ag-theme-material-dark input[class^=ag-][type=date],\n.ag-theme-material-dark input[class^=ag-][type=datetime-local],\n.ag-theme-material-dark textarea[class^=ag-],\n.ag-theme-material-auto-dark input[class^=ag-]:not([type]),\n.ag-theme-material-auto-dark input[class^=ag-][type=text],\n.ag-theme-material-auto-dark input[class^=ag-][type=number],\n.ag-theme-material-auto-dark input[class^=ag-][type=tel],\n.ag-theme-material-auto-dark input[class^=ag-][type=date],\n.ag-theme-material-auto-dark input[class^=ag-][type=datetime-local],\n.ag-theme-material-auto-dark textarea[class^=ag-] {\n background: transparent;\n color: var(--ag-foreground-color);\n font-family: inherit;\n font-size: inherit;\n padding-bottom: var(--ag-grid-size);\n border-width: 0;\n border-radius: 0;\n border-bottom: 2px solid;\n border-bottom-color: var(--ag-border-color);\n}\n.ag-theme-material input[class^=ag-]:not([type]):not(textarea),\n.ag-theme-material input[class^=ag-][type=text]:not(textarea),\n.ag-theme-material input[class^=ag-][type=number]:not(textarea),\n.ag-theme-material input[class^=ag-][type=tel]:not(textarea),\n.ag-theme-material input[class^=ag-][type=date]:not(textarea),\n.ag-theme-material input[class^=ag-][type=datetime-local]:not(textarea),\n.ag-theme-material textarea[class^=ag-]:not(textarea),\n.ag-theme-material-dark input[class^=ag-]:not([type]):not(textarea),\n.ag-theme-material-dark input[class^=ag-][type=text]:not(textarea),\n.ag-theme-material-dark input[class^=ag-][type=number]:not(textarea),\n.ag-theme-material-dark input[class^=ag-][type=tel]:not(textarea),\n.ag-theme-material-dark input[class^=ag-][type=date]:not(textarea),\n.ag-theme-material-dark input[class^=ag-][type=datetime-local]:not(textarea),\n.ag-theme-material-dark textarea[class^=ag-]:not(textarea),\n.ag-theme-material-auto-dark input[class^=ag-]:not([type]):not(textarea),\n.ag-theme-material-auto-dark input[class^=ag-][type=text]:not(textarea),\n.ag-theme-material-auto-dark input[class^=ag-][type=number]:not(textarea),\n.ag-theme-material-auto-dark input[class^=ag-][type=tel]:not(textarea),\n.ag-theme-material-auto-dark input[class^=ag-][type=date]:not(textarea),\n.ag-theme-material-auto-dark input[class^=ag-][type=datetime-local]:not(textarea),\n.ag-theme-material-auto-dark textarea[class^=ag-]:not(textarea) {\n height: calc(var(--ag-grid-size) * 5);\n}\n.ag-theme-material input[class^=ag-]:not([type]):focus,\n.ag-theme-material input[class^=ag-][type=text]:focus,\n.ag-theme-material input[class^=ag-][type=number]:focus,\n.ag-theme-material input[class^=ag-][type=tel]:focus,\n.ag-theme-material input[class^=ag-][type=date]:focus,\n.ag-theme-material input[class^=ag-][type=datetime-local]:focus,\n.ag-theme-material textarea[class^=ag-]:focus,\n.ag-theme-material-dark input[class^=ag-]:not([type]):focus,\n.ag-theme-material-dark input[class^=ag-][type=text]:focus,\n.ag-theme-material-dark input[class^=ag-][type=number]:focus,\n.ag-theme-material-dark input[class^=ag-][type=tel]:focus,\n.ag-theme-material-dark input[class^=ag-][type=date]:focus,\n.ag-theme-material-dark input[class^=ag-][type=datetime-local]:focus,\n.ag-theme-material-dark textarea[class^=ag-]:focus,\n.ag-theme-material-auto-dark input[class^=ag-]:not([type]):focus,\n.ag-theme-material-auto-dark input[class^=ag-][type=text]:focus,\n.ag-theme-material-auto-dark input[class^=ag-][type=number]:focus,\n.ag-theme-material-auto-dark input[class^=ag-][type=tel]:focus,\n.ag-theme-material-auto-dark input[class^=ag-][type=date]:focus,\n.ag-theme-material-auto-dark input[class^=ag-][type=datetime-local]:focus,\n.ag-theme-material-auto-dark textarea[class^=ag-]:focus {\n border-bottom: 2px solid;\n border-bottom-color: var(--ag-material-primary-color);\n outline: none;\n box-shadow: none;\n}\n.ag-theme-material input[class^=ag-]:not([type])::placeholder,\n.ag-theme-material input[class^=ag-][type=text]::placeholder,\n.ag-theme-material input[class^=ag-][type=number]::placeholder,\n.ag-theme-material input[class^=ag-][type=tel]::placeholder,\n.ag-theme-material input[class^=ag-][type=date]::placeholder,\n.ag-theme-material input[class^=ag-][type=datetime-local]::placeholder,\n.ag-theme-material textarea[class^=ag-]::placeholder,\n.ag-theme-material-dark input[class^=ag-]:not([type])::placeholder,\n.ag-theme-material-dark input[class^=ag-][type=text]::placeholder,\n.ag-theme-material-dark input[class^=ag-][type=number]::placeholder,\n.ag-theme-material-dark input[class^=ag-][type=tel]::placeholder,\n.ag-theme-material-dark input[class^=ag-][type=date]::placeholder,\n.ag-theme-material-dark input[class^=ag-][type=datetime-local]::placeholder,\n.ag-theme-material-dark textarea[class^=ag-]::placeholder,\n.ag-theme-material-auto-dark input[class^=ag-]:not([type])::placeholder,\n.ag-theme-material-auto-dark input[class^=ag-][type=text]::placeholder,\n.ag-theme-material-auto-dark input[class^=ag-][type=number]::placeholder,\n.ag-theme-material-auto-dark input[class^=ag-][type=tel]::placeholder,\n.ag-theme-material-auto-dark input[class^=ag-][type=date]::placeholder,\n.ag-theme-material-auto-dark input[class^=ag-][type=datetime-local]::placeholder,\n.ag-theme-material-auto-dark textarea[class^=ag-]::placeholder {\n color: var(--ag-disabled-foreground-color);\n}\n.ag-theme-material input[class^=ag-]:not([type]):disabled,\n.ag-theme-material input[class^=ag-][type=text]:disabled,\n.ag-theme-material input[class^=ag-][type=number]:disabled,\n.ag-theme-material input[class^=ag-][type=tel]:disabled,\n.ag-theme-material input[class^=ag-][type=date]:disabled,\n.ag-theme-material input[class^=ag-][type=datetime-local]:disabled,\n.ag-theme-material textarea[class^=ag-]:disabled,\n.ag-theme-material-dark input[class^=ag-]:not([type]):disabled,\n.ag-theme-material-dark input[class^=ag-][type=text]:disabled,\n.ag-theme-material-dark input[class^=ag-][type=number]:disabled,\n.ag-theme-material-dark input[class^=ag-][type=tel]:disabled,\n.ag-theme-material-dark input[class^=ag-][type=date]:disabled,\n.ag-theme-material-dark input[class^=ag-][type=datetime-local]:disabled,\n.ag-theme-material-dark textarea[class^=ag-]:disabled,\n.ag-theme-material-auto-dark input[class^=ag-]:not([type]):disabled,\n.ag-theme-material-auto-dark input[class^=ag-][type=text]:disabled,\n.ag-theme-material-auto-dark input[class^=ag-][type=number]:disabled,\n.ag-theme-material-auto-dark input[class^=ag-][type=tel]:disabled,\n.ag-theme-material-auto-dark input[class^=ag-][type=date]:disabled,\n.ag-theme-material-auto-dark input[class^=ag-][type=datetime-local]:disabled,\n.ag-theme-material-auto-dark textarea[class^=ag-]:disabled {\n border-bottom: 1px solid;\n border-bottom-color: var(--ag-border-color);\n}\n.ag-theme-material input[class^=ag-]:not([type]):invalid,\n.ag-theme-material input[class^=ag-][type=text]:invalid,\n.ag-theme-material input[class^=ag-][type=number]:invalid,\n.ag-theme-material input[class^=ag-][type=tel]:invalid,\n.ag-theme-material input[class^=ag-][type=date]:invalid,\n.ag-theme-material input[class^=ag-][type=datetime-local]:invalid,\n.ag-theme-material textarea[class^=ag-]:invalid,\n.ag-theme-material-dark input[class^=ag-]:not([type]):invalid,\n.ag-theme-material-dark input[class^=ag-][type=text]:invalid,\n.ag-theme-material-dark input[class^=ag-][type=number]:invalid,\n.ag-theme-material-dark input[class^=ag-][type=tel]:invalid,\n.ag-theme-material-dark input[class^=ag-][type=date]:invalid,\n.ag-theme-material-dark input[class^=ag-][type=datetime-local]:invalid,\n.ag-theme-material-dark textarea[class^=ag-]:invalid,\n.ag-theme-material-auto-dark input[class^=ag-]:not([type]):invalid,\n.ag-theme-material-auto-dark input[class^=ag-][type=text]:invalid,\n.ag-theme-material-auto-dark input[class^=ag-][type=number]:invalid,\n.ag-theme-material-auto-dark input[class^=ag-][type=tel]:invalid,\n.ag-theme-material-auto-dark input[class^=ag-][type=date]:invalid,\n.ag-theme-material-auto-dark input[class^=ag-][type=datetime-local]:invalid,\n.ag-theme-material-auto-dark textarea[class^=ag-]:invalid {\n border-width: 0;\n border-bottom: 1px solid;\n border-bottom-color: var(--ag-invalid-color);\n color: var(--ag-invalid-color);\n}\n.ag-theme-material .ag-standard-button,\n.ag-theme-material-dark .ag-standard-button,\n.ag-theme-material-auto-dark .ag-standard-button {\n appearance: none;\n background-color: transparent;\n border: 0;\n color: var(--ag-material-primary-color);\n font-family: inherit;\n font-size: inherit;\n margin: 0;\n padding: 0;\n text-transform: uppercase;\n}\n.ag-theme-material .ag-standard-button:disabled,\n.ag-theme-material-dark .ag-standard-button:disabled,\n.ag-theme-material-auto-dark .ag-standard-button:disabled {\n color: var(--ag-disabled-foreground-color);\n background-color: var(--ag-input-disabled-background-color);\n border-color: var(--ag-input-disabled-border-color);\n}\n.ag-theme-material.ag-dnd-ghost,\n.ag-theme-material-dark.ag-dnd-ghost,\n.ag-theme-material-auto-dark.ag-dnd-ghost {\n font-size: calc(var(--ag-font-size) - 1px);\n font-weight: 600;\n}\n.ag-theme-material .ag-filter-toolpanel-header,\n.ag-theme-material-dark .ag-filter-toolpanel-header,\n.ag-theme-material-auto-dark .ag-filter-toolpanel-header {\n height: calc(var(--ag-grid-size) * 4);\n}\n.ag-theme-material .ag-filter-toolpanel-group-level-0-header,\n.ag-theme-material-dark .ag-filter-toolpanel-group-level-0-header,\n.ag-theme-material-auto-dark .ag-filter-toolpanel-group-level-0-header {\n height: calc(var(--ag-grid-size) * 7);\n}\n.ag-theme-material .ag-ltr .ag-filter-apply-panel-button, .ag-theme-material .ag-ltr .ag-advanced-filter-apply-button, .ag-theme-material .ag-ltr .ag-advanced-filter-builder-button, .ag-theme-material-dark .ag-ltr .ag-filter-apply-panel-button, .ag-theme-material-dark .ag-ltr .ag-advanced-filter-apply-button, .ag-theme-material-dark .ag-ltr .ag-advanced-filter-builder-button, .ag-theme-material-auto-dark .ag-ltr .ag-filter-apply-panel-button, .ag-theme-material-auto-dark .ag-ltr .ag-advanced-filter-apply-button, .ag-theme-material-auto-dark .ag-ltr .ag-advanced-filter-builder-button {\n margin-left: var(--ag-grid-size);\n}\n\n.ag-theme-material .ag-rtl .ag-filter-apply-panel-button, .ag-theme-material .ag-rtl .ag-advanced-filter-apply-button, .ag-theme-material .ag-rtl .ag-advanced-filter-builder-button, .ag-theme-material-dark .ag-rtl .ag-filter-apply-panel-button, .ag-theme-material-dark .ag-rtl .ag-advanced-filter-apply-button, .ag-theme-material-dark .ag-rtl .ag-advanced-filter-builder-button, .ag-theme-material-auto-dark .ag-rtl .ag-filter-apply-panel-button, .ag-theme-material-auto-dark .ag-rtl .ag-advanced-filter-apply-button, .ag-theme-material-auto-dark .ag-rtl .ag-advanced-filter-builder-button {\n margin-right: var(--ag-grid-size);\n}\n\n.ag-theme-material .ag-layout-auto-height .ag-center-cols-viewport,\n.ag-theme-material .ag-layout-auto-height .ag-center-cols-container,\n.ag-theme-material .ag-layout-print .ag-center-cols-viewport,\n.ag-theme-material .ag-layout-print .ag-center-cols-container,\n.ag-theme-material-dark .ag-layout-auto-height .ag-center-cols-viewport,\n.ag-theme-material-dark .ag-layout-auto-height .ag-center-cols-container,\n.ag-theme-material-dark .ag-layout-print .ag-center-cols-viewport,\n.ag-theme-material-dark .ag-layout-print .ag-center-cols-container,\n.ag-theme-material-auto-dark .ag-layout-auto-height .ag-center-cols-viewport,\n.ag-theme-material-auto-dark .ag-layout-auto-height .ag-center-cols-container,\n.ag-theme-material-auto-dark .ag-layout-print .ag-center-cols-viewport,\n.ag-theme-material-auto-dark .ag-layout-print .ag-center-cols-container {\n min-height: 150px;\n}\n.ag-theme-material .ag-picker-field-wrapper:focus-within,\n.ag-theme-material-dark .ag-picker-field-wrapper:focus-within,\n.ag-theme-material-auto-dark .ag-picker-field-wrapper:focus-within {\n box-shadow: 0 0 0 1px var(--ag-material-primary-color);\n}\n.ag-theme-material .ag-rich-select-list,\n.ag-theme-material-dark .ag-rich-select-list,\n.ag-theme-material-auto-dark .ag-rich-select-list {\n box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 5px -3px, rgba(0, 0, 0, 0.14) 0px 8px 10px 1px, rgba(0, 0, 0, 0.12) 0px 3px 14px 2px;\n}\n.ag-theme-material .ag-advanced-filter-builder-button-label,\n.ag-theme-material-dark .ag-advanced-filter-builder-button-label,\n.ag-theme-material-auto-dark .ag-advanced-filter-builder-button-label {\n text-transform: uppercase;\n}\n.ag-theme-material .ag-filter-active .ag-icon-filter,\n.ag-theme-material-dark .ag-filter-active .ag-icon-filter,\n.ag-theme-material-auto-dark .ag-filter-active .ag-icon-filter {\n color: var(--ag-material-accent-color);\n}\n.ag-theme-material .ag-list-item-hovered::after,\n.ag-theme-material-dark .ag-list-item-hovered::after,\n.ag-theme-material-auto-dark .ag-list-item-hovered::after {\n background-color: var(--ag-material-primary-color);\n}\n.ag-theme-material .ag-pill .ag-pill-button:hover,\n.ag-theme-material-dark .ag-pill .ag-pill-button:hover,\n.ag-theme-material-auto-dark .ag-pill .ag-pill-button:hover {\n color: var(--ag-material-primary-color);\n}\n.ag-theme-material .ag-header-highlight-before::after,\n.ag-theme-material .ag-header-highlight-after::after,\n.ag-theme-material-dark .ag-header-highlight-before::after,\n.ag-theme-material-dark .ag-header-highlight-after::after,\n.ag-theme-material-auto-dark .ag-header-highlight-before::after,\n.ag-theme-material-auto-dark .ag-header-highlight-after::after {\n background-color: var(--ag-material-primary-color);\n}\n.ag-theme-material .ag-advanced-filter-builder-item-button-disabled .ag-icon,\n.ag-theme-material .ag-disabled .ag-icon,\n.ag-theme-material .ag-column-select-column-group-readonly .ag-icon,\n.ag-theme-material [disabled] .ag-icon,\n.ag-theme-material-dark .ag-advanced-filter-builder-item-button-disabled .ag-icon,\n.ag-theme-material-dark .ag-disabled .ag-icon,\n.ag-theme-material-dark .ag-column-select-column-group-readonly .ag-icon,\n.ag-theme-material-dark [disabled] .ag-icon,\n.ag-theme-material-auto-dark .ag-advanced-filter-builder-item-button-disabled .ag-icon,\n.ag-theme-material-auto-dark .ag-disabled .ag-icon,\n.ag-theme-material-auto-dark .ag-column-select-column-group-readonly .ag-icon,\n.ag-theme-material-auto-dark [disabled] .ag-icon {\n color: var(--ag-disabled-foreground-color);\n}\n", ""]); // Exports /* harmony default export */ __webpack_exports__.A = (___CSS_LOADER_EXPORT___); /***/ }), /***/ 145: /***/ (function(module, __webpack_exports__, __webpack_require__) { /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6758); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(935); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(62); /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__); // Imports var ___CSS_LOADER_URL_IMPORT_0___ = new URL(/* asset import */ __webpack_require__(7249), __webpack_require__.b); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); var ___CSS_LOADER_URL_REPLACEMENT_0___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_0___); // Module ___CSS_LOADER_EXPORT___.push([module.id, ".ag-theme-quartz,\n.ag-theme-quartz-dark,\n.ag-theme-quartz-auto-dark {\n --ag-active-color: #2196f3;\n --ag-background-color: #fff;\n --ag-foreground-color: #181d1f;\n --ag-border-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 15%);\n --ag-secondary-border-color: var(--ag-border-color);\n --ag-header-background-color: color-mix(in srgb, var(--ag-background-color), var(--ag-foreground-color) 2%);\n --ag-tooltip-background-color: var(--ag-header-background-color);\n --ag-control-panel-background-color: var(--ag-header-background-color);\n --ag-subheader-background-color: transparent;\n --ag-invalid-color: #e02525;\n --ag-checkbox-unchecked-color: color-mix(in srgb, var(--ag-background-color), var(--ag-foreground-color) 30%);\n --ag-advanced-filter-join-pill-color: #f08e8d;\n --ag-advanced-filter-column-pill-color: #a6e194;\n --ag-advanced-filter-option-pill-color: #f3c08b;\n --ag-advanced-filter-value-pill-color: #85c0e4;\n --ag-header-column-resize-handle-color: var(--ag-secondary-border-color);\n --ag-icon-font-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 90%);\n --ag-panel-background-color: color-mix(in srgb, var(--ag-background-color), var(--ag-foreground-color) 3%);\n --ag-panel-border-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 20%);\n --ag-menu-background-color: color-mix(in srgb, var(--ag-background-color), var(--ag-foreground-color) 3%);\n --ag-menu-border-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 20%);\n --ag-selected-row-background-color: color-mix(in srgb, transparent, var(--ag-active-color) 8%);\n --ag-row-hover-color: color-mix(in srgb, transparent, var(--ag-active-color) 12%);\n --ag-column-hover-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 5%);\n --ag-input-focus-border-color: var(--ag-active-color);\n --ag-input-focus-box-shadow: 0 0 0 3px color-mix(in srgb, transparent, var(--ag-input-focus-border-color) 47%);\n --ag-range-selection-background-color: color-mix(in srgb, transparent, var(--ag-active-color) 20%);\n --ag-range-selection-background-color-2: color-mix(in srgb, transparent, var(--ag-active-color) 36%);\n --ag-range-selection-background-color-3: color-mix(in srgb, transparent, var(--ag-active-color) 49%);\n --ag-range-selection-background-color-4: color-mix(in srgb, transparent, var(--ag-active-color) 59%);\n --ag-row-numbers-selected-color: color-mix(in srgb, transparent, var(--ag-active-color) 50%);\n --ag-checkbox-background-color: var(--ag-background-color);\n --ag-checkbox-checked-color: var(--ag-active-color);\n --ag-range-selection-border-color: var(--ag-active-color);\n --ag-secondary-foreground-color: var(--ag-foreground-color);\n --ag-input-border-color: var(--ag-border-color);\n --ag-input-border-color-invalid: var(--ag-invalid-color);\n --ag-disabled-foreground-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 50%);\n --ag-chip-background-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 7%);\n --ag-chip-border-color: color-mix(in srgb, var(--ag-header-background-color), var(--ag-foreground-color) 13%);\n --ag-input-disabled-border-color: var(--ag-border-color);\n --ag-input-disabled-background-color: color-mix(in srgb, var(--ag-background-color), var(--ag-foreground-color) 6%);\n --ag-modal-overlay-background-color: color-mix(in srgb, transparent, var(--ag-background-color) 66%);\n --ag-chart-menu-label-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 80%);\n --ag-chart-menu-pill-select-button-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 70%);\n --ag-borders: solid 1px;\n --ag-border-radius: 4px;\n --ag-wrapper-border-radius: 8px;\n --ag-borders-side-button: none;\n --ag-side-button-selected-background-color: transparent;\n --ag-header-column-resize-handle-display: block;\n --ag-header-column-resize-handle-width: 2px;\n --ag-header-column-resize-handle-height: 30%;\n --ag-grid-size: 8px;\n --ag-icon-size: 16px;\n --ag-header-height: calc(var(--ag-font-size) + var(--ag-grid-size) * 4.25);\n --ag-row-height: calc(var(--ag-font-size) + var(--ag-grid-size) * 3.5);\n --ag-list-item-height: calc(\n var(--ag-icon-size) + var(--ag-widget-vertical-spacing)\n );\n --ag-column-select-indent-size: var(--ag-icon-size);\n --ag-set-filter-indent-size: var(--ag-icon-size);\n --ag-filter-tool-panel-group-indent: var(--ag-grid-size);\n --ag-advanced-filter-builder-indent-size: calc(var(--ag-icon-size) + var(--ag-grid-size) * 2);\n --ag-cell-horizontal-padding: calc(var(--ag-grid-size) * 2);\n --ag-cell-widget-spacing: calc(var(--ag-grid-size) * 1.5);\n --ag-widget-container-vertical-padding: calc(var(--ag-grid-size) * 1.5);\n --ag-widget-container-horizontal-padding: calc(var(--ag-grid-size) * 1.5);\n --ag-widget-horizontal-spacing: calc(var(--ag-grid-size) * 1.5);\n --ag-widget-vertical-spacing: calc(var(--ag-grid-size) * 1);\n --ag-toggle-button-height: 18px;\n --ag-toggle-button-width: 28px;\n --ag-toggle-button-border-width: 2px;\n --ag-font-family: \"IBM Plex Sans\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu,\n Cantarell, \"Helvetica Neue\", sans-serif;\n --ag-font-size: 14px;\n --ag-icon-font-family: agGridQuartz;\n --ag-tab-min-width: 290px;\n --ag-chart-menu-panel-width: 260px;\n --ag-card-shadow: 0 1px 4px 1px rgba(186, 191, 199, 0.4);\n --ag-popup-shadow: 0 0 16px 0 rgba(0, 0, 0, 0.15);\n --ag-side-bar-panel-width: 250px;\n}\n\n.ag-theme-quartz-dark {\n --ag-background-color: color-mix(in srgb, #fff, #182230 97%);\n --ag-foreground-color: #fff;\n --ag-border-color: rgba(255, 255, 255, 0.16);\n --ag-secondary-border-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 10%);\n --ag-header-background-color: color-mix(in srgb, #fff, #182230 93%);\n --ag-tooltip-background-color: color-mix(in srgb, #fff, #182230 96%);\n --ag-control-panel-background-color: color-mix(in srgb, #fff, #182230 93%);\n --ag-input-disabled-background-color: #68686e12;\n --ag-card-shadow: 0 1px 20px 1px black;\n --ag-input-border-color: var(--ag-border-color);\n --ag-input-disabled-border-color: rgba(255, 255, 255, 0.07);\n --ag-checkbox-unchecked-color: color-mix(in srgb, var(--ag-background-color), var(--ag-foreground-color) 40%);\n --ag-row-hover-color: color-mix(in srgb, transparent, var(--ag-active-color) 20%);\n --ag-selected-row-background-color: var(--ag-row-hover-color);\n --ag-panel-background-color: color-mix(in srgb, var(--ag-background-color), var(--ag-foreground-color) 10%);\n --ag-panel-border-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 10%);\n --ag-menu-background-color: color-mix(in srgb, var(--ag-background-color), var(--ag-foreground-color) 10%);\n --ag-menu-border-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 10%);\n --ag-advanced-filter-join-pill-color: #7a3a37;\n --ag-advanced-filter-column-pill-color: #355f2d;\n --ag-advanced-filter-option-pill-color: #5a3168;\n --ag-advanced-filter-value-pill-color: #374c86;\n --ag-popup-shadow: 0 0px 20px rgba(0, 0, 0, 0.3);\n --ag-row-loading-skeleton-effect-color: rgba(202, 203, 204, 0.4);\n color-scheme: dark;\n}\n\n@media (prefers-color-scheme: dark) {\n .ag-theme-quartz-auto-dark {\n --ag-background-color: color-mix(in srgb, #fff, #182230 97%);\n --ag-foreground-color: #fff;\n --ag-border-color: rgba(255, 255, 255, 0.16);\n --ag-secondary-border-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 10%);\n --ag-header-background-color: color-mix(in srgb, #fff, #182230 93%);\n --ag-tooltip-background-color: color-mix(in srgb, #fff, #182230 96%);\n --ag-control-panel-background-color: color-mix(in srgb, #fff, #182230 93%);\n --ag-input-disabled-background-color: #68686e12;\n --ag-card-shadow: 0 1px 20px 1px black;\n --ag-input-border-color: var(--ag-border-color);\n --ag-input-disabled-border-color: rgba(255, 255, 255, 0.07);\n --ag-checkbox-unchecked-color: color-mix(in srgb, var(--ag-background-color), var(--ag-foreground-color) 40%);\n --ag-row-hover-color: color-mix(in srgb, transparent, var(--ag-active-color) 20%);\n --ag-selected-row-background-color: var(--ag-row-hover-color);\n --ag-panel-background-color: color-mix(in srgb, var(--ag-background-color), var(--ag-foreground-color) 10%);\n --ag-panel-border-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 10%);\n --ag-menu-background-color: color-mix(in srgb, var(--ag-background-color), var(--ag-foreground-color) 10%);\n --ag-menu-border-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 10%);\n --ag-advanced-filter-join-pill-color: #7a3a37;\n --ag-advanced-filter-column-pill-color: #355f2d;\n --ag-advanced-filter-option-pill-color: #5a3168;\n --ag-advanced-filter-value-pill-color: #374c86;\n --ag-popup-shadow: 0 0px 20px rgba(0, 0, 0, 0.3);\n --ag-row-loading-skeleton-effect-color: rgba(202, 203, 204, 0.4);\n color-scheme: dark;\n }\n}\n.ag-theme-quartz .ag-filter-toolpanel-header,\n.ag-theme-quartz .ag-filter-toolpanel-search,\n.ag-theme-quartz .ag-status-bar,\n.ag-theme-quartz .ag-header-row,\n.ag-theme-quartz .ag-row-number-cell,\n.ag-theme-quartz .ag-panel-title-bar-title,\n.ag-theme-quartz .ag-multi-filter-group-title-bar,\n.ag-theme-quartz-dark .ag-filter-toolpanel-header,\n.ag-theme-quartz-dark .ag-filter-toolpanel-search,\n.ag-theme-quartz-dark .ag-status-bar,\n.ag-theme-quartz-dark .ag-header-row,\n.ag-theme-quartz-dark .ag-row-number-cell,\n.ag-theme-quartz-dark .ag-panel-title-bar-title,\n.ag-theme-quartz-dark .ag-multi-filter-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-filter-toolpanel-header,\n.ag-theme-quartz-auto-dark .ag-filter-toolpanel-search,\n.ag-theme-quartz-auto-dark .ag-status-bar,\n.ag-theme-quartz-auto-dark .ag-header-row,\n.ag-theme-quartz-auto-dark .ag-row-number-cell,\n.ag-theme-quartz-auto-dark .ag-panel-title-bar-title,\n.ag-theme-quartz-auto-dark .ag-multi-filter-group-title-bar {\n font-weight: 500;\n color: var(--ag-header-foreground-color);\n}\n.ag-theme-quartz input[class^=ag-]:not([type]),\n.ag-theme-quartz input[class^=ag-][type=text],\n.ag-theme-quartz input[class^=ag-][type=number],\n.ag-theme-quartz input[class^=ag-][type=tel],\n.ag-theme-quartz input[class^=ag-][type=date],\n.ag-theme-quartz input[class^=ag-][type=datetime-local],\n.ag-theme-quartz textarea[class^=ag-],\n.ag-theme-quartz-dark input[class^=ag-]:not([type]),\n.ag-theme-quartz-dark input[class^=ag-][type=text],\n.ag-theme-quartz-dark input[class^=ag-][type=number],\n.ag-theme-quartz-dark input[class^=ag-][type=tel],\n.ag-theme-quartz-dark input[class^=ag-][type=date],\n.ag-theme-quartz-dark input[class^=ag-][type=datetime-local],\n.ag-theme-quartz-dark textarea[class^=ag-],\n.ag-theme-quartz-auto-dark input[class^=ag-]:not([type]),\n.ag-theme-quartz-auto-dark input[class^=ag-][type=text],\n.ag-theme-quartz-auto-dark input[class^=ag-][type=number],\n.ag-theme-quartz-auto-dark input[class^=ag-][type=tel],\n.ag-theme-quartz-auto-dark input[class^=ag-][type=date],\n.ag-theme-quartz-auto-dark input[class^=ag-][type=datetime-local],\n.ag-theme-quartz-auto-dark textarea[class^=ag-] {\n min-height: calc(var(--ag-grid-size) * 4);\n border-radius: var(--ag-border-radius);\n}\n.ag-theme-quartz .ag-ltr input[class^=ag-]:not([type]), .ag-theme-quartz .ag-ltr input[class^=ag-][type=text], .ag-theme-quartz .ag-ltr input[class^=ag-][type=number], .ag-theme-quartz .ag-ltr input[class^=ag-][type=tel], .ag-theme-quartz .ag-ltr input[class^=ag-][type=date], .ag-theme-quartz .ag-ltr input[class^=ag-][type=datetime-local], .ag-theme-quartz .ag-ltr textarea[class^=ag-], .ag-theme-quartz-dark .ag-ltr input[class^=ag-]:not([type]), .ag-theme-quartz-dark .ag-ltr input[class^=ag-][type=text], .ag-theme-quartz-dark .ag-ltr input[class^=ag-][type=number], .ag-theme-quartz-dark .ag-ltr input[class^=ag-][type=tel], .ag-theme-quartz-dark .ag-ltr input[class^=ag-][type=date], .ag-theme-quartz-dark .ag-ltr input[class^=ag-][type=datetime-local], .ag-theme-quartz-dark .ag-ltr textarea[class^=ag-], .ag-theme-quartz-auto-dark .ag-ltr input[class^=ag-]:not([type]), .ag-theme-quartz-auto-dark .ag-ltr input[class^=ag-][type=text], .ag-theme-quartz-auto-dark .ag-ltr input[class^=ag-][type=number], .ag-theme-quartz-auto-dark .ag-ltr input[class^=ag-][type=tel], .ag-theme-quartz-auto-dark .ag-ltr input[class^=ag-][type=date], .ag-theme-quartz-auto-dark .ag-ltr input[class^=ag-][type=datetime-local], .ag-theme-quartz-auto-dark .ag-ltr textarea[class^=ag-] {\n padding-left: var(--ag-grid-size);\n}\n\n.ag-theme-quartz .ag-rtl input[class^=ag-]:not([type]), .ag-theme-quartz .ag-rtl input[class^=ag-][type=text], .ag-theme-quartz .ag-rtl input[class^=ag-][type=number], .ag-theme-quartz .ag-rtl input[class^=ag-][type=tel], .ag-theme-quartz .ag-rtl input[class^=ag-][type=date], .ag-theme-quartz .ag-rtl input[class^=ag-][type=datetime-local], .ag-theme-quartz .ag-rtl textarea[class^=ag-], .ag-theme-quartz-dark .ag-rtl input[class^=ag-]:not([type]), .ag-theme-quartz-dark .ag-rtl input[class^=ag-][type=text], .ag-theme-quartz-dark .ag-rtl input[class^=ag-][type=number], .ag-theme-quartz-dark .ag-rtl input[class^=ag-][type=tel], .ag-theme-quartz-dark .ag-rtl input[class^=ag-][type=date], .ag-theme-quartz-dark .ag-rtl input[class^=ag-][type=datetime-local], .ag-theme-quartz-dark .ag-rtl textarea[class^=ag-], .ag-theme-quartz-auto-dark .ag-rtl input[class^=ag-]:not([type]), .ag-theme-quartz-auto-dark .ag-rtl input[class^=ag-][type=text], .ag-theme-quartz-auto-dark .ag-rtl input[class^=ag-][type=number], .ag-theme-quartz-auto-dark .ag-rtl input[class^=ag-][type=tel], .ag-theme-quartz-auto-dark .ag-rtl input[class^=ag-][type=date], .ag-theme-quartz-auto-dark .ag-rtl input[class^=ag-][type=datetime-local], .ag-theme-quartz-auto-dark .ag-rtl textarea[class^=ag-] {\n padding-right: var(--ag-grid-size);\n}\n\n.ag-theme-quartz .ag-picker-field-wrapper,\n.ag-theme-quartz-dark .ag-picker-field-wrapper,\n.ag-theme-quartz-auto-dark .ag-picker-field-wrapper {\n min-height: calc(var(--ag-grid-size) * 4);\n}\n.ag-theme-quartz .ag-tab,\n.ag-theme-quartz-dark .ag-tab,\n.ag-theme-quartz-auto-dark .ag-tab {\n padding: var(--ag-grid-size);\n border-left: var(--ag-borders) transparent;\n border-right: var(--ag-borders) transparent;\n flex: 1 1 auto;\n}\n.ag-theme-quartz .ag-tab-selected,\n.ag-theme-quartz-dark .ag-tab-selected,\n.ag-theme-quartz-auto-dark .ag-tab-selected {\n background-color: var(--ag-background-color);\n}\n.ag-theme-quartz .ag-ltr .ag-tab-selected:not(:first-of-type), .ag-theme-quartz-dark .ag-ltr .ag-tab-selected:not(:first-of-type), .ag-theme-quartz-auto-dark .ag-ltr .ag-tab-selected:not(:first-of-type) {\n border-left-color: var(--ag-border-color);\n}\n\n.ag-theme-quartz .ag-rtl .ag-tab-selected:not(:first-of-type), .ag-theme-quartz-dark .ag-rtl .ag-tab-selected:not(:first-of-type), .ag-theme-quartz-auto-dark .ag-rtl .ag-tab-selected:not(:first-of-type) {\n border-right-color: var(--ag-border-color);\n}\n\n.ag-theme-quartz .ag-ltr .ag-tab-selected:not(:last-of-type), .ag-theme-quartz-dark .ag-ltr .ag-tab-selected:not(:last-of-type), .ag-theme-quartz-auto-dark .ag-ltr .ag-tab-selected:not(:last-of-type) {\n border-right-color: var(--ag-border-color);\n}\n\n.ag-theme-quartz .ag-rtl .ag-tab-selected:not(:last-of-type), .ag-theme-quartz-dark .ag-rtl .ag-tab-selected:not(:last-of-type), .ag-theme-quartz-auto-dark .ag-rtl .ag-tab-selected:not(:last-of-type) {\n border-left-color: var(--ag-border-color);\n}\n\n.ag-theme-quartz .ag-tab:not(.ag-tab-selected),\n.ag-theme-quartz-dark .ag-tab:not(.ag-tab-selected),\n.ag-theme-quartz-auto-dark .ag-tab:not(.ag-tab-selected) {\n opacity: 0.7;\n}\n.ag-theme-quartz .ag-tab:not(.ag-tab-selected):hover,\n.ag-theme-quartz-dark .ag-tab:not(.ag-tab-selected):hover,\n.ag-theme-quartz-auto-dark .ag-tab:not(.ag-tab-selected):hover {\n opacity: 1;\n}\n.ag-theme-quartz .ag-menu,\n.ag-theme-quartz-dark .ag-menu,\n.ag-theme-quartz-auto-dark .ag-menu {\n color: color-mix(in srgb, transparent, var(--ag-foreground-color) 95%);\n}\n.ag-theme-quartz .ag-panel-content-wrapper .ag-column-select,\n.ag-theme-quartz-dark .ag-panel-content-wrapper .ag-column-select,\n.ag-theme-quartz-auto-dark .ag-panel-content-wrapper .ag-column-select {\n background-color: var(--ag-control-panel-background-color);\n color: color-mix(in srgb, transparent, var(--ag-foreground-color) 95%);\n}\n.ag-theme-quartz .ag-menu-header,\n.ag-theme-quartz-dark .ag-menu-header,\n.ag-theme-quartz-auto-dark .ag-menu-header {\n background-color: var(--ag-control-panel-background-color);\n}\n.ag-theme-quartz .ag-menu-option,\n.ag-theme-quartz-dark .ag-menu-option,\n.ag-theme-quartz-auto-dark .ag-menu-option {\n font-weight: 500;\n cursor: pointer;\n}\n.ag-theme-quartz .ag-ltr .ag-menu-option-popup-pointer .ag-icon, .ag-theme-quartz-dark .ag-ltr .ag-menu-option-popup-pointer .ag-icon, .ag-theme-quartz-auto-dark .ag-ltr .ag-menu-option-popup-pointer .ag-icon {\n text-align: right;\n}\n\n.ag-theme-quartz .ag-rtl .ag-menu-option-popup-pointer .ag-icon, .ag-theme-quartz-dark .ag-rtl .ag-menu-option-popup-pointer .ag-icon, .ag-theme-quartz-auto-dark .ag-rtl .ag-menu-option-popup-pointer .ag-icon {\n text-align: left;\n}\n\n.ag-theme-quartz .ag-tabs-header,\n.ag-theme-quartz-dark .ag-tabs-header,\n.ag-theme-quartz-auto-dark .ag-tabs-header {\n border-bottom: var(--ag-borders) var(--ag-border-color);\n display: flex;\n background-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 5%);\n}\n.ag-theme-quartz .ag-side-bar,\n.ag-theme-quartz-dark .ag-side-bar,\n.ag-theme-quartz-auto-dark .ag-side-bar {\n background-color: var(--ag-control-panel-background-color);\n min-width: calc(var(--ag-icon-size) + var(--ag-grid-size) * 2);\n}\n.ag-theme-quartz .ag-side-buttons,\n.ag-theme-quartz-dark .ag-side-buttons,\n.ag-theme-quartz-auto-dark .ag-side-buttons {\n padding: 0;\n align-self: stretch;\n width: calc(var(--ag-icon-size) + var(--ag-grid-size) * 2);\n background: var(--ag-control-panel-background-color);\n}\n.ag-theme-quartz .ag-side-button,\n.ag-theme-quartz-dark .ag-side-button,\n.ag-theme-quartz-auto-dark .ag-side-button {\n border-top: var(--ag-borders) transparent;\n border-bottom: var(--ag-borders) transparent;\n}\n@media (max-resolution: 1.5x) {\n .ag-theme-quartz .ag-side-button-label,\n .ag-theme-quartz-dark .ag-side-button-label,\n .ag-theme-quartz-auto-dark .ag-side-button-label {\n font-family: \"Segoe UI\", var(--ag-font-family);\n transform: rotate(0.05deg);\n }\n}\n.ag-theme-quartz .ag-side-button.ag-selected,\n.ag-theme-quartz-dark .ag-side-button.ag-selected,\n.ag-theme-quartz-auto-dark .ag-side-button.ag-selected {\n border-bottom-color: var(--ag-border-color);\n background-color: var(--ag-background-color);\n}\n.ag-theme-quartz .ag-side-button.ag-selected:not(:first-of-type),\n.ag-theme-quartz-dark .ag-side-button.ag-selected:not(:first-of-type),\n.ag-theme-quartz-auto-dark .ag-side-button.ag-selected:not(:first-of-type) {\n border-top-color: var(--ag-border-color);\n}\n.ag-theme-quartz .ag-column-panel-column-select,\n.ag-theme-quartz-dark .ag-column-panel-column-select,\n.ag-theme-quartz-auto-dark .ag-column-panel-column-select {\n border-top: none;\n border-bottom: 1px solid var(--ag-secondary-border-color);\n}\n.ag-theme-quartz .ag-filter-toolpanel-search,\n.ag-theme-quartz-dark .ag-filter-toolpanel-search,\n.ag-theme-quartz-auto-dark .ag-filter-toolpanel-search {\n height: initial;\n margin-top: var(--ag-widget-container-vertical-padding);\n}\n.ag-theme-quartz .ag-filter-toolpanel-search-input,\n.ag-theme-quartz-dark .ag-filter-toolpanel-search-input,\n.ag-theme-quartz-auto-dark .ag-filter-toolpanel-search-input {\n margin: 0;\n}\n.ag-theme-quartz .ag-filter-apply-panel,\n.ag-theme-quartz-dark .ag-filter-apply-panel,\n.ag-theme-quartz-auto-dark .ag-filter-apply-panel {\n border: none;\n padding-top: var(--ag-widget-vertical-spacing);\n}\n.ag-theme-quartz .ag-chart-tabbed-menu-body,\n.ag-theme-quartz-dark .ag-chart-tabbed-menu-body,\n.ag-theme-quartz-auto-dark .ag-chart-tabbed-menu-body {\n position: relative;\n}\n.ag-theme-quartz .ag-chart-tabbed-menu-body::after,\n.ag-theme-quartz-dark .ag-chart-tabbed-menu-body::after,\n.ag-theme-quartz-auto-dark .ag-chart-tabbed-menu-body::after {\n content: \"\";\n position: absolute;\n display: block;\n top: 0;\n left: 0;\n right: 0;\n height: 16px;\n background: linear-gradient(var(--ag-control-panel-background-color), transparent);\n}\n.ag-theme-quartz .ag-charts-settings-group-title-bar,\n.ag-theme-quartz .ag-charts-data-group-title-bar,\n.ag-theme-quartz .ag-charts-format-top-level-group-title-bar,\n.ag-theme-quartz .ag-charts-advanced-settings-top-level-group-title-bar,\n.ag-theme-quartz .ag-charts-settings-group-container,\n.ag-theme-quartz-dark .ag-charts-settings-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-data-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-format-top-level-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-advanced-settings-top-level-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-settings-group-container,\n.ag-theme-quartz-auto-dark .ag-charts-settings-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-data-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-format-top-level-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-advanced-settings-top-level-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-settings-group-container {\n border-top: none;\n font-weight: 500;\n}\n.ag-theme-quartz .ag-chart-mini-thumbnail,\n.ag-theme-quartz-dark .ag-chart-mini-thumbnail,\n.ag-theme-quartz-auto-dark .ag-chart-mini-thumbnail {\n background-color: var(--ag-background-color);\n margin-top: 0;\n margin-bottom: 0;\n}\n.ag-theme-quartz .ag-chart-settings-nav-bar,\n.ag-theme-quartz-dark .ag-chart-settings-nav-bar,\n.ag-theme-quartz-auto-dark .ag-chart-settings-nav-bar {\n border-top: var(--ag-borders-secondary) var(--ag-secondary-border-color);\n}\n.ag-theme-quartz .ag-charts-format-sub-level-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-format-sub-level-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-format-sub-level-group-title-bar {\n background: none;\n font-weight: 500;\n}\n.ag-theme-quartz .ag-chart-data-section .ag-label:not(.ag-group-title-bar),\n.ag-theme-quartz .ag-chart-format-section .ag-label:not(.ag-group-title-bar),\n.ag-theme-quartz-dark .ag-chart-data-section .ag-label:not(.ag-group-title-bar),\n.ag-theme-quartz-dark .ag-chart-format-section .ag-label:not(.ag-group-title-bar),\n.ag-theme-quartz-auto-dark .ag-chart-data-section .ag-label:not(.ag-group-title-bar),\n.ag-theme-quartz-auto-dark .ag-chart-format-section .ag-label:not(.ag-group-title-bar) {\n color: var(--ag-chart-menu-label-color);\n}\n.ag-theme-quartz .ag-chart-data-section .ag-label-align-top .ag-label,\n.ag-theme-quartz .ag-chart-format-section .ag-label-align-top .ag-label,\n.ag-theme-quartz-dark .ag-chart-data-section .ag-label-align-top .ag-label,\n.ag-theme-quartz-dark .ag-chart-format-section .ag-label-align-top .ag-label,\n.ag-theme-quartz-auto-dark .ag-chart-data-section .ag-label-align-top .ag-label,\n.ag-theme-quartz-auto-dark .ag-chart-format-section .ag-label-align-top .ag-label {\n margin-top: calc(var(--ag-widget-vertical-spacing) * 0.5);\n margin-bottom: var(--ag-widget-vertical-spacing);\n}\n.ag-theme-quartz .ag-chart-data-section .ag-slider.ag-label-align-top .ag-label,\n.ag-theme-quartz .ag-chart-format-section .ag-slider.ag-label-align-top .ag-label,\n.ag-theme-quartz-dark .ag-chart-data-section .ag-slider.ag-label-align-top .ag-label,\n.ag-theme-quartz-dark .ag-chart-format-section .ag-slider.ag-label-align-top .ag-label,\n.ag-theme-quartz-auto-dark .ag-chart-data-section .ag-slider.ag-label-align-top .ag-label,\n.ag-theme-quartz-auto-dark .ag-chart-format-section .ag-slider.ag-label-align-top .ag-label {\n margin-bottom: 0;\n}\n.ag-theme-quartz .ag-chart-data-section label,\n.ag-theme-quartz .ag-chart-format-section label,\n.ag-theme-quartz-dark .ag-chart-data-section label,\n.ag-theme-quartz-dark .ag-chart-format-section label,\n.ag-theme-quartz-auto-dark .ag-chart-data-section label,\n.ag-theme-quartz-auto-dark .ag-chart-format-section label {\n display: inline-block;\n}\n.ag-theme-quartz .ag-chart-format-wrapper,\n.ag-theme-quartz .ag-chart-data-wrapper,\n.ag-theme-quartz .ag-charts-format-top-level-group,\n.ag-theme-quartz .ag-charts-format-top-level-group-title-bar,\n.ag-theme-quartz .ag-charts-format-top-level-group .ag-charts-format-top-level-group-container,\n.ag-theme-quartz .ag-charts-format-top-level-group-item,\n.ag-theme-quartz .ag-charts-format-sub-level-group,\n.ag-theme-quartz .ag-charts-format-sub-level-group-title-bar,\n.ag-theme-quartz .ag-charts-format-sub-level-group-container,\n.ag-theme-quartz .ag-charts-format-sub-level-group-item:last-child,\n.ag-theme-quartz .ag-charts-format-sub-level-group-container > *,\n.ag-theme-quartz .ag-charts-data-group-title-bar,\n.ag-theme-quartz .ag-charts-data-group-container,\n.ag-theme-quartz .ag-charts-settings-group-title-bar,\n.ag-theme-quartz .ag-charts-settings-group-container,\n.ag-theme-quartz-dark .ag-chart-format-wrapper,\n.ag-theme-quartz-dark .ag-chart-data-wrapper,\n.ag-theme-quartz-dark .ag-charts-format-top-level-group,\n.ag-theme-quartz-dark .ag-charts-format-top-level-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-format-top-level-group .ag-charts-format-top-level-group-container,\n.ag-theme-quartz-dark .ag-charts-format-top-level-group-item,\n.ag-theme-quartz-dark .ag-charts-format-sub-level-group,\n.ag-theme-quartz-dark .ag-charts-format-sub-level-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-format-sub-level-group-container,\n.ag-theme-quartz-dark .ag-charts-format-sub-level-group-item:last-child,\n.ag-theme-quartz-dark .ag-charts-format-sub-level-group-container > *,\n.ag-theme-quartz-dark .ag-charts-data-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-data-group-container,\n.ag-theme-quartz-dark .ag-charts-settings-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-settings-group-container,\n.ag-theme-quartz-auto-dark .ag-chart-format-wrapper,\n.ag-theme-quartz-auto-dark .ag-chart-data-wrapper,\n.ag-theme-quartz-auto-dark .ag-charts-format-top-level-group,\n.ag-theme-quartz-auto-dark .ag-charts-format-top-level-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-format-top-level-group .ag-charts-format-top-level-group-container,\n.ag-theme-quartz-auto-dark .ag-charts-format-top-level-group-item,\n.ag-theme-quartz-auto-dark .ag-charts-format-sub-level-group,\n.ag-theme-quartz-auto-dark .ag-charts-format-sub-level-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-format-sub-level-group-container,\n.ag-theme-quartz-auto-dark .ag-charts-format-sub-level-group-item:last-child,\n.ag-theme-quartz-auto-dark .ag-charts-format-sub-level-group-container > *,\n.ag-theme-quartz-auto-dark .ag-charts-data-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-data-group-container,\n.ag-theme-quartz-auto-dark .ag-charts-settings-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-settings-group-container {\n padding: 0;\n margin: 0;\n}\n.ag-theme-quartz .ag-charts-format-top-level-group,\n.ag-theme-quartz .ag-charts-data-group,\n.ag-theme-quartz-dark .ag-charts-format-top-level-group,\n.ag-theme-quartz-dark .ag-charts-data-group,\n.ag-theme-quartz-auto-dark .ag-charts-format-top-level-group,\n.ag-theme-quartz-auto-dark .ag-charts-data-group {\n border-top: var(--ag-borders-secondary) var(--ag-secondary-border-color);\n}\n.ag-theme-quartz .ag-charts-format-top-level-group-title-bar,\n.ag-theme-quartz .ag-charts-data-group-title-bar,\n.ag-theme-quartz .ag-charts-settings-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-format-top-level-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-data-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-settings-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-format-top-level-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-data-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-settings-group-title-bar {\n padding: var(--ag-widget-container-vertical-padding) var(--ag-widget-container-horizontal-padding);\n}\n.ag-theme-quartz .ag-charts-format-top-level-group .ag-charts-format-top-level-group-container,\n.ag-theme-quartz .ag-charts-data-group .ag-charts-data-group-container,\n.ag-theme-quartz .ag-charts-settings-group .ag-charts-settings-group-container,\n.ag-theme-quartz-dark .ag-charts-format-top-level-group .ag-charts-format-top-level-group-container,\n.ag-theme-quartz-dark .ag-charts-data-group .ag-charts-data-group-container,\n.ag-theme-quartz-dark .ag-charts-settings-group .ag-charts-settings-group-container,\n.ag-theme-quartz-auto-dark .ag-charts-format-top-level-group .ag-charts-format-top-level-group-container,\n.ag-theme-quartz-auto-dark .ag-charts-data-group .ag-charts-data-group-container,\n.ag-theme-quartz-auto-dark .ag-charts-settings-group .ag-charts-settings-group-container {\n padding: 0 var(--ag-widget-container-horizontal-padding);\n}\n.ag-theme-quartz .ag-charts-format-sub-level-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-format-sub-level-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-format-sub-level-group-title-bar {\n padding: var(--ag-widget-vertical-spacing) 0;\n}\n.ag-theme-quartz .ag-charts-format-sub-level-group-container,\n.ag-theme-quartz-dark .ag-charts-format-sub-level-group-container,\n.ag-theme-quartz-auto-dark .ag-charts-format-sub-level-group-container {\n padding-top: var(--ag-widget-vertical-spacing);\n padding-bottom: var(--ag-widget-container-vertical-padding);\n}\n.ag-theme-quartz .ag-charts-format-top-level-group-container > *,\n.ag-theme-quartz .ag-charts-format-sub-level-group-container > *,\n.ag-theme-quartz-dark .ag-charts-format-top-level-group-container > *,\n.ag-theme-quartz-dark .ag-charts-format-sub-level-group-container > *,\n.ag-theme-quartz-auto-dark .ag-charts-format-top-level-group-container > *,\n.ag-theme-quartz-auto-dark .ag-charts-format-sub-level-group-container > * {\n margin-bottom: var(--ag-widget-vertical-spacing);\n}\n.ag-theme-quartz .ag-charts-data-group-item,\n.ag-theme-quartz-dark .ag-charts-data-group-item,\n.ag-theme-quartz-auto-dark .ag-charts-data-group-item {\n padding-bottom: var(--ag-widget-container-vertical-padding);\n}\n.ag-theme-quartz .ag-chart-settings-mini-wrapper,\n.ag-theme-quartz-dark .ag-chart-settings-mini-wrapper,\n.ag-theme-quartz-auto-dark .ag-chart-settings-mini-wrapper {\n padding-bottom: var(--ag-widget-container-vertical-padding);\n}\n.ag-theme-quartz .ag-chart-advanced-settings-section,\n.ag-theme-quartz-dark .ag-chart-advanced-settings-section,\n.ag-theme-quartz-auto-dark .ag-chart-advanced-settings-section {\n padding-top: var(--ag-widget-container-vertical-padding);\n padding-bottom: var(--ag-widget-container-vertical-padding);\n}\n.ag-theme-quartz .ag-charts-advanced-settings-top-level-group .ag-charts-advanced-settings-top-level-group-title-bar,\n.ag-theme-quartz .ag-charts-advanced-settings-top-level-group .ag-charts-advanced-settings-top-level-group-container,\n.ag-theme-quartz-dark .ag-charts-advanced-settings-top-level-group .ag-charts-advanced-settings-top-level-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-advanced-settings-top-level-group .ag-charts-advanced-settings-top-level-group-container,\n.ag-theme-quartz-auto-dark .ag-charts-advanced-settings-top-level-group .ag-charts-advanced-settings-top-level-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-advanced-settings-top-level-group .ag-charts-advanced-settings-top-level-group-container {\n padding: 0 var(--ag-widget-container-horizontal-padding);\n}\n.ag-theme-quartz .ag-charts-advanced-settings-top-level-group-container,\n.ag-theme-quartz-dark .ag-charts-advanced-settings-top-level-group-container,\n.ag-theme-quartz-auto-dark .ag-charts-advanced-settings-top-level-group-container {\n margin: 0;\n}\n.ag-theme-quartz .ag-charts-advanced-settings-top-level-group-item,\n.ag-theme-quartz-dark .ag-charts-advanced-settings-top-level-group-item,\n.ag-theme-quartz-auto-dark .ag-charts-advanced-settings-top-level-group-item {\n margin-top: calc(var(--ag-widget-vertical-spacing) * 2);\n margin-bottom: 0;\n}\n.ag-theme-quartz .ag-ltr .ag-group-title-bar-icon, .ag-theme-quartz-dark .ag-ltr .ag-group-title-bar-icon, .ag-theme-quartz-auto-dark .ag-ltr .ag-group-title-bar-icon {\n margin-right: var(--ag-grid-size);\n}\n\n.ag-theme-quartz .ag-rtl .ag-group-title-bar-icon, .ag-theme-quartz-dark .ag-rtl .ag-group-title-bar-icon, .ag-theme-quartz-auto-dark .ag-rtl .ag-group-title-bar-icon {\n margin-left: var(--ag-grid-size);\n}\n\n.ag-theme-quartz .ag-spectrum-color,\n.ag-theme-quartz .ag-spectrum-fill,\n.ag-theme-quartz-dark .ag-spectrum-color,\n.ag-theme-quartz-dark .ag-spectrum-fill,\n.ag-theme-quartz-auto-dark .ag-spectrum-color,\n.ag-theme-quartz-auto-dark .ag-spectrum-fill {\n border-radius: var(--ag-border-radius);\n}\n.ag-theme-quartz .ag-spectrum-dragger,\n.ag-theme-quartz-dark .ag-spectrum-dragger,\n.ag-theme-quartz-auto-dark .ag-spectrum-dragger {\n border-radius: 18px;\n height: 18px;\n width: 18px;\n border: 3px solid white;\n}\n.ag-theme-quartz .ag-spectrum-tools,\n.ag-theme-quartz-dark .ag-spectrum-tools,\n.ag-theme-quartz-auto-dark .ag-spectrum-tools {\n padding-left: 0;\n padding-right: 0;\n padding-bottom: 0;\n}\n.ag-theme-quartz .ag-spectrum-tool,\n.ag-theme-quartz-dark .ag-spectrum-tool,\n.ag-theme-quartz-auto-dark .ag-spectrum-tool {\n height: 12px;\n}\n.ag-theme-quartz .ag-spectrum-hue-background,\n.ag-theme-quartz .ag-spectrum-alpha-background,\n.ag-theme-quartz-dark .ag-spectrum-hue-background,\n.ag-theme-quartz-dark .ag-spectrum-alpha-background,\n.ag-theme-quartz-auto-dark .ag-spectrum-hue-background,\n.ag-theme-quartz-auto-dark .ag-spectrum-alpha-background {\n border-radius: 12px;\n}\n.ag-theme-quartz .ag-spectrum-slider,\n.ag-theme-quartz-dark .ag-spectrum-slider,\n.ag-theme-quartz-auto-dark .ag-spectrum-slider {\n margin-top: -15px;\n width: 18px;\n height: 18px;\n border-radius: 18px;\n border: 3px solid rgb(248, 248, 248);\n}\n.ag-theme-quartz .ag-recent-colors,\n.ag-theme-quartz-dark .ag-recent-colors,\n.ag-theme-quartz-auto-dark .ag-recent-colors {\n margin-left: var(--ag-grid-size);\n margin-right: var(--ag-grid-size);\n margin-bottom: 2px;\n}\n.ag-theme-quartz .ag-color-input-color,\n.ag-theme-quartz .ag-color-picker-color,\n.ag-theme-quartz .ag-recent-color,\n.ag-theme-quartz-dark .ag-color-input-color,\n.ag-theme-quartz-dark .ag-color-picker-color,\n.ag-theme-quartz-dark .ag-recent-color,\n.ag-theme-quartz-auto-dark .ag-color-input-color,\n.ag-theme-quartz-auto-dark .ag-color-picker-color,\n.ag-theme-quartz-auto-dark .ag-recent-color {\n border-radius: 4px;\n}\n.ag-theme-quartz .ag-recent-color,\n.ag-theme-quartz-dark .ag-recent-color,\n.ag-theme-quartz-auto-dark .ag-recent-color {\n border: var(--ag-borders-secondary) var(--ag-secondary-border-color);\n}\n.ag-theme-quartz.ag-dnd-ghost,\n.ag-theme-quartz-dark.ag-dnd-ghost,\n.ag-theme-quartz-auto-dark.ag-dnd-ghost {\n font-weight: 500;\n}\n.ag-theme-quartz .ag-standard-button,\n.ag-theme-quartz-dark .ag-standard-button,\n.ag-theme-quartz-auto-dark .ag-standard-button {\n font-family: inherit;\n appearance: none;\n -webkit-appearance: none;\n border-radius: var(--ag-border-radius);\n border: solid 1px var(--ag-input-border-color);\n background-color: var(--ag-background-color);\n padding: var(--ag-grid-size) calc(var(--ag-grid-size) * 2);\n cursor: pointer;\n}\n.ag-theme-quartz .ag-standard-button:hover,\n.ag-theme-quartz-dark .ag-standard-button:hover,\n.ag-theme-quartz-auto-dark .ag-standard-button:hover {\n background-color: var(--ag-row-hover-color);\n}\n.ag-theme-quartz .ag-standard-button:active,\n.ag-theme-quartz-dark .ag-standard-button:active,\n.ag-theme-quartz-auto-dark .ag-standard-button:active {\n border-color: var(--ag-active-color);\n}\n.ag-theme-quartz .ag-standard-button:disabled,\n.ag-theme-quartz-dark .ag-standard-button:disabled,\n.ag-theme-quartz-auto-dark .ag-standard-button:disabled {\n color: var(--ag-disabled-foreground-color);\n background-color: var(--ag-input-disabled-background-color);\n border-color: var(--ag-input-disabled-border-color);\n}\n.ag-theme-quartz .ag-column-drop-cell,\n.ag-theme-quartz-dark .ag-column-drop-cell,\n.ag-theme-quartz-auto-dark .ag-column-drop-cell {\n border-radius: calc(var(--ag-grid-size) * 3);\n height: calc(var(--ag-grid-size) * 3);\n padding: 0 var(--ag-grid-size);\n}\n.ag-theme-quartz .ag-column-drop-cell-button,\n.ag-theme-quartz-dark .ag-column-drop-cell-button,\n.ag-theme-quartz-auto-dark .ag-column-drop-cell-button {\n min-width: 0;\n margin: 0;\n}\n.ag-theme-quartz .ag-column-drop-cell-drag-handle,\n.ag-theme-quartz-dark .ag-column-drop-cell-drag-handle,\n.ag-theme-quartz-auto-dark .ag-column-drop-cell-drag-handle {\n margin-left: 0;\n}\n.ag-theme-quartz .ag-column-drop-vertical,\n.ag-theme-quartz-dark .ag-column-drop-vertical,\n.ag-theme-quartz-auto-dark .ag-column-drop-vertical {\n min-height: 75px;\n}\n.ag-theme-quartz .ag-column-drop-vertical-title-bar,\n.ag-theme-quartz-dark .ag-column-drop-vertical-title-bar,\n.ag-theme-quartz-auto-dark .ag-column-drop-vertical-title-bar {\n padding: var(--ag-widget-container-vertical-padding) calc(var(--ag-grid-size) * 2) 0;\n}\n.ag-theme-quartz .ag-ltr .ag-column-drop-vertical-icon, .ag-theme-quartz-dark .ag-ltr .ag-column-drop-vertical-icon, .ag-theme-quartz-auto-dark .ag-ltr .ag-column-drop-vertical-icon {\n margin-left: 0;\n margin-right: var(--ag-widget-horizontal-spacing);\n}\n\n.ag-theme-quartz .ag-rtl .ag-column-drop-vertical-icon, .ag-theme-quartz-dark .ag-rtl .ag-column-drop-vertical-icon, .ag-theme-quartz-auto-dark .ag-rtl .ag-column-drop-vertical-icon {\n margin-right: 0;\n margin-left: var(--ag-widget-horizontal-spacing);\n}\n\n.ag-theme-quartz .ag-column-drop-vertical-empty-message,\n.ag-theme-quartz-dark .ag-column-drop-vertical-empty-message,\n.ag-theme-quartz-auto-dark .ag-column-drop-vertical-empty-message {\n display: flex;\n align-items: center;\n justify-content: center;\n border: dashed 1px;\n border-color: var(--ag-border-color);\n margin: calc(var(--ag-grid-size) * 1.5) calc(var(--ag-grid-size) * 2);\n padding: calc(var(--ag-grid-size) * 2);\n}\n.ag-theme-quartz .ag-column-drop-empty-message,\n.ag-theme-quartz-dark .ag-column-drop-empty-message,\n.ag-theme-quartz-auto-dark .ag-column-drop-empty-message {\n color: var(--ag-foreground-color);\n}\n.ag-theme-quartz .ag-pill-select .ag-column-drop,\n.ag-theme-quartz-dark .ag-pill-select .ag-column-drop,\n.ag-theme-quartz-auto-dark .ag-pill-select .ag-column-drop {\n min-height: unset;\n}\n.ag-theme-quartz .ag-pill-select .ag-picker-field-display,\n.ag-theme-quartz-dark .ag-pill-select .ag-picker-field-display,\n.ag-theme-quartz-auto-dark .ag-pill-select .ag-picker-field-display {\n font-weight: 500;\n color: var(--ag-chart-menu-pill-select-button-color);\n}\n.ag-theme-quartz .ag-pill-select .ag-picker-field-icon .ag-icon,\n.ag-theme-quartz-dark .ag-pill-select .ag-picker-field-icon .ag-icon,\n.ag-theme-quartz-auto-dark .ag-pill-select .ag-picker-field-icon .ag-icon {\n color: var(--ag-chart-menu-pill-select-button-color);\n}\n.ag-theme-quartz .ag-status-bar,\n.ag-theme-quartz-dark .ag-status-bar,\n.ag-theme-quartz-auto-dark .ag-status-bar {\n font-weight: normal;\n}\n.ag-theme-quartz .ag-status-name-value,\n.ag-theme-quartz-dark .ag-status-name-value,\n.ag-theme-quartz-auto-dark .ag-status-name-value {\n padding: var(--ag-widget-container-vertical-padding) 0;\n}\n.ag-theme-quartz .ag-status-name-value-value,\n.ag-theme-quartz .ag-paging-number,\n.ag-theme-quartz .ag-paging-row-summary-panel-number,\n.ag-theme-quartz-dark .ag-status-name-value-value,\n.ag-theme-quartz-dark .ag-paging-number,\n.ag-theme-quartz-dark .ag-paging-row-summary-panel-number,\n.ag-theme-quartz-auto-dark .ag-status-name-value-value,\n.ag-theme-quartz-auto-dark .ag-paging-number,\n.ag-theme-quartz-auto-dark .ag-paging-row-summary-panel-number {\n font-weight: 500;\n}\n.ag-theme-quartz .ag-column-drop-cell-button,\n.ag-theme-quartz-dark .ag-column-drop-cell-button,\n.ag-theme-quartz-auto-dark .ag-column-drop-cell-button {\n opacity: 0.75;\n}\n.ag-theme-quartz .ag-column-drop-cell-button:hover,\n.ag-theme-quartz-dark .ag-column-drop-cell-button:hover,\n.ag-theme-quartz-auto-dark .ag-column-drop-cell-button:hover {\n opacity: 1;\n}\n.ag-theme-quartz .ag-header-cell-menu-button,\n.ag-theme-quartz .ag-header-cell-filter-button,\n.ag-theme-quartz .ag-panel-title-bar-button,\n.ag-theme-quartz .ag-header-expand-icon,\n.ag-theme-quartz .ag-column-group-icons,\n.ag-theme-quartz .ag-set-filter-group-icons,\n.ag-theme-quartz .ag-group-expanded .ag-icon,\n.ag-theme-quartz .ag-group-contracted .ag-icon,\n.ag-theme-quartz .ag-chart-settings-prev,\n.ag-theme-quartz .ag-chart-settings-next,\n.ag-theme-quartz .ag-group-title-bar-icon,\n.ag-theme-quartz .ag-column-select-header-icon,\n.ag-theme-quartz .ag-floating-filter-button-button,\n.ag-theme-quartz .ag-filter-toolpanel-expand,\n.ag-theme-quartz .ag-panel-title-bar-button-icon,\n.ag-theme-quartz .ag-chart-menu-icon,\n.ag-theme-quartz-dark .ag-header-cell-menu-button,\n.ag-theme-quartz-dark .ag-header-cell-filter-button,\n.ag-theme-quartz-dark .ag-panel-title-bar-button,\n.ag-theme-quartz-dark .ag-header-expand-icon,\n.ag-theme-quartz-dark .ag-column-group-icons,\n.ag-theme-quartz-dark .ag-set-filter-group-icons,\n.ag-theme-quartz-dark .ag-group-expanded .ag-icon,\n.ag-theme-quartz-dark .ag-group-contracted .ag-icon,\n.ag-theme-quartz-dark .ag-chart-settings-prev,\n.ag-theme-quartz-dark .ag-chart-settings-next,\n.ag-theme-quartz-dark .ag-group-title-bar-icon,\n.ag-theme-quartz-dark .ag-column-select-header-icon,\n.ag-theme-quartz-dark .ag-floating-filter-button-button,\n.ag-theme-quartz-dark .ag-filter-toolpanel-expand,\n.ag-theme-quartz-dark .ag-panel-title-bar-button-icon,\n.ag-theme-quartz-dark .ag-chart-menu-icon,\n.ag-theme-quartz-auto-dark .ag-header-cell-menu-button,\n.ag-theme-quartz-auto-dark .ag-header-cell-filter-button,\n.ag-theme-quartz-auto-dark .ag-panel-title-bar-button,\n.ag-theme-quartz-auto-dark .ag-header-expand-icon,\n.ag-theme-quartz-auto-dark .ag-column-group-icons,\n.ag-theme-quartz-auto-dark .ag-set-filter-group-icons,\n.ag-theme-quartz-auto-dark .ag-group-expanded .ag-icon,\n.ag-theme-quartz-auto-dark .ag-group-contracted .ag-icon,\n.ag-theme-quartz-auto-dark .ag-chart-settings-prev,\n.ag-theme-quartz-auto-dark .ag-chart-settings-next,\n.ag-theme-quartz-auto-dark .ag-group-title-bar-icon,\n.ag-theme-quartz-auto-dark .ag-column-select-header-icon,\n.ag-theme-quartz-auto-dark .ag-floating-filter-button-button,\n.ag-theme-quartz-auto-dark .ag-filter-toolpanel-expand,\n.ag-theme-quartz-auto-dark .ag-panel-title-bar-button-icon,\n.ag-theme-quartz-auto-dark .ag-chart-menu-icon {\n --ag-quartz-icon-hover-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 10%);\n}\n.ag-theme-quartz .ag-header-cell-menu-button:hover,\n.ag-theme-quartz .ag-header-cell-filter-button:hover,\n.ag-theme-quartz .ag-panel-title-bar-button:hover,\n.ag-theme-quartz .ag-header-expand-icon:hover,\n.ag-theme-quartz .ag-column-group-icons:hover,\n.ag-theme-quartz .ag-set-filter-group-icons:hover,\n.ag-theme-quartz .ag-group-expanded .ag-icon:hover,\n.ag-theme-quartz .ag-group-contracted .ag-icon:hover,\n.ag-theme-quartz .ag-chart-settings-prev:hover,\n.ag-theme-quartz .ag-chart-settings-next:hover,\n.ag-theme-quartz .ag-group-title-bar-icon:hover,\n.ag-theme-quartz .ag-column-select-header-icon:hover,\n.ag-theme-quartz .ag-floating-filter-button-button:hover,\n.ag-theme-quartz .ag-filter-toolpanel-expand:hover,\n.ag-theme-quartz .ag-panel-title-bar-button-icon:hover,\n.ag-theme-quartz .ag-chart-menu-icon:hover,\n.ag-theme-quartz-dark .ag-header-cell-menu-button:hover,\n.ag-theme-quartz-dark .ag-header-cell-filter-button:hover,\n.ag-theme-quartz-dark .ag-panel-title-bar-button:hover,\n.ag-theme-quartz-dark .ag-header-expand-icon:hover,\n.ag-theme-quartz-dark .ag-column-group-icons:hover,\n.ag-theme-quartz-dark .ag-set-filter-group-icons:hover,\n.ag-theme-quartz-dark .ag-group-expanded .ag-icon:hover,\n.ag-theme-quartz-dark .ag-group-contracted .ag-icon:hover,\n.ag-theme-quartz-dark .ag-chart-settings-prev:hover,\n.ag-theme-quartz-dark .ag-chart-settings-next:hover,\n.ag-theme-quartz-dark .ag-group-title-bar-icon:hover,\n.ag-theme-quartz-dark .ag-column-select-header-icon:hover,\n.ag-theme-quartz-dark .ag-floating-filter-button-button:hover,\n.ag-theme-quartz-dark .ag-filter-toolpanel-expand:hover,\n.ag-theme-quartz-dark .ag-panel-title-bar-button-icon:hover,\n.ag-theme-quartz-dark .ag-chart-menu-icon:hover,\n.ag-theme-quartz-auto-dark .ag-header-cell-menu-button:hover,\n.ag-theme-quartz-auto-dark .ag-header-cell-filter-button:hover,\n.ag-theme-quartz-auto-dark .ag-panel-title-bar-button:hover,\n.ag-theme-quartz-auto-dark .ag-header-expand-icon:hover,\n.ag-theme-quartz-auto-dark .ag-column-group-icons:hover,\n.ag-theme-quartz-auto-dark .ag-set-filter-group-icons:hover,\n.ag-theme-quartz-auto-dark .ag-group-expanded .ag-icon:hover,\n.ag-theme-quartz-auto-dark .ag-group-contracted .ag-icon:hover,\n.ag-theme-quartz-auto-dark .ag-chart-settings-prev:hover,\n.ag-theme-quartz-auto-dark .ag-chart-settings-next:hover,\n.ag-theme-quartz-auto-dark .ag-group-title-bar-icon:hover,\n.ag-theme-quartz-auto-dark .ag-column-select-header-icon:hover,\n.ag-theme-quartz-auto-dark .ag-floating-filter-button-button:hover,\n.ag-theme-quartz-auto-dark .ag-filter-toolpanel-expand:hover,\n.ag-theme-quartz-auto-dark .ag-panel-title-bar-button-icon:hover,\n.ag-theme-quartz-auto-dark .ag-chart-menu-icon:hover {\n border-radius: 1px;\n background-color: var(--ag-quartz-icon-hover-color);\n box-shadow: 0 0 0 4px var(--ag-quartz-icon-hover-color);\n}\n.ag-theme-quartz .ag-filter-active,\n.ag-theme-quartz-dark .ag-filter-active,\n.ag-theme-quartz-auto-dark .ag-filter-active {\n --ag-quartz-icon-active-color: color-mix(in srgb, transparent, var(--ag-active-color) 14%);\n --ag-quartz-icon-hover-color: color-mix(in srgb, transparent, var(--ag-active-color) 28%);\n position: relative;\n border-radius: 1px;\n background-color: var(--ag-quartz-icon-active-color);\n box-shadow: 0 0 0 4px var(--ag-quartz-icon-active-color);\n}\n.ag-theme-quartz .ag-filter-active::after,\n.ag-theme-quartz-dark .ag-filter-active::after,\n.ag-theme-quartz-auto-dark .ag-filter-active::after {\n content: \"\";\n position: absolute;\n width: 6px;\n height: 6px;\n top: -1px;\n right: -1px;\n border-radius: 50%;\n background-color: var(--ag-active-color);\n}\n.ag-theme-quartz .ag-filter-active .ag-icon-filter,\n.ag-theme-quartz-dark .ag-filter-active .ag-icon-filter,\n.ag-theme-quartz-auto-dark .ag-filter-active .ag-icon-filter {\n clip-path: path(\"M8,0C8,4.415 11.585,8 16,8L16,16L0,16L0,0L8,0Z\");\n}\n.ag-theme-quartz .ag-chart-menu,\n.ag-theme-quartz-dark .ag-chart-menu,\n.ag-theme-quartz-auto-dark .ag-chart-menu {\n --ag-icon-size: 20px;\n background-color: color-mix(in srgb, transparent, var(--ag-background-color) 30%);\n padding: 4px 2px;\n}\n.ag-theme-quartz .ag-chart-menu-icon,\n.ag-theme-quartz-dark .ag-chart-menu-icon,\n.ag-theme-quartz-auto-dark .ag-chart-menu-icon {\n opacity: 0.8;\n}\n.ag-theme-quartz .ag-drag-handle,\n.ag-theme-quartz-dark .ag-drag-handle,\n.ag-theme-quartz-auto-dark .ag-drag-handle {\n color: var(--ag-icon-font-color);\n}\n.ag-theme-quartz .ag-menu-option-icon,\n.ag-theme-quartz .ag-compact-menu-option-icon,\n.ag-theme-quartz-dark .ag-menu-option-icon,\n.ag-theme-quartz-dark .ag-compact-menu-option-icon,\n.ag-theme-quartz-auto-dark .ag-menu-option-icon,\n.ag-theme-quartz-auto-dark .ag-compact-menu-option-icon {\n width: var(--ag-icon-size);\n cursor: pointer;\n}\n.ag-theme-quartz .ag-ltr .ag-menu-option-icon, .ag-theme-quartz .ag-ltr .ag-compact-menu-option-icon, .ag-theme-quartz-dark .ag-ltr .ag-menu-option-icon, .ag-theme-quartz-dark .ag-ltr .ag-compact-menu-option-icon, .ag-theme-quartz-auto-dark .ag-ltr .ag-menu-option-icon, .ag-theme-quartz-auto-dark .ag-ltr .ag-compact-menu-option-icon {\n padding-left: calc(var(--ag-grid-size) * 1.5);\n}\n\n.ag-theme-quartz .ag-rtl .ag-menu-option-icon, .ag-theme-quartz .ag-rtl .ag-compact-menu-option-icon, .ag-theme-quartz-dark .ag-rtl .ag-menu-option-icon, .ag-theme-quartz-dark .ag-rtl .ag-compact-menu-option-icon, .ag-theme-quartz-auto-dark .ag-rtl .ag-menu-option-icon, .ag-theme-quartz-auto-dark .ag-rtl .ag-compact-menu-option-icon {\n padding-right: calc(var(--ag-grid-size) * 1.5);\n}\n\n.ag-theme-quartz .ag-chart-settings-card-item.ag-not-selected:hover,\n.ag-theme-quartz-dark .ag-chart-settings-card-item.ag-not-selected:hover,\n.ag-theme-quartz-auto-dark .ag-chart-settings-card-item.ag-not-selected:hover {\n opacity: 0.35;\n}\n.ag-theme-quartz .ag-ltr .ag-panel-title-bar-button, .ag-theme-quartz-dark .ag-ltr .ag-panel-title-bar-button, .ag-theme-quartz-auto-dark .ag-ltr .ag-panel-title-bar-button {\n margin-left: calc(var(--ag-grid-size) * 2);\n margin-right: var(--ag-grid-size);\n}\n\n.ag-theme-quartz .ag-rtl .ag-panel-title-bar-button, .ag-theme-quartz-dark .ag-rtl .ag-panel-title-bar-button, .ag-theme-quartz-auto-dark .ag-rtl .ag-panel-title-bar-button {\n margin-right: calc(var(--ag-grid-size) * 2);\n margin-left: var(--ag-grid-size);\n}\n\n.ag-theme-quartz .ag-multi-filter-group-title-bar,\n.ag-theme-quartz-dark .ag-multi-filter-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-multi-filter-group-title-bar {\n padding: calc(var(--ag-grid-size) * 1.5) var(--ag-grid-size);\n}\n.ag-theme-quartz .ag-ltr .ag-filter-toolpanel-instance-body, .ag-theme-quartz-dark .ag-ltr .ag-filter-toolpanel-instance-body, .ag-theme-quartz-auto-dark .ag-ltr .ag-filter-toolpanel-instance-body {\n padding-left: var(--ag-grid-size);\n}\n\n.ag-theme-quartz .ag-rtl .ag-filter-toolpanel-instance-body, .ag-theme-quartz-dark .ag-rtl .ag-filter-toolpanel-instance-body, .ag-theme-quartz-auto-dark .ag-rtl .ag-filter-toolpanel-instance-body {\n padding-right: var(--ag-grid-size);\n}\n\n.ag-theme-quartz .ag-filter-toolpanel-instance-filter,\n.ag-theme-quartz-dark .ag-filter-toolpanel-instance-filter,\n.ag-theme-quartz-auto-dark .ag-filter-toolpanel-instance-filter {\n border: none;\n background-color: var(--ag-control-panel-background-color);\n}\n.ag-theme-quartz .ag-ltr .ag-filter-toolpanel-instance-filter, .ag-theme-quartz-dark .ag-ltr .ag-filter-toolpanel-instance-filter, .ag-theme-quartz-auto-dark .ag-ltr .ag-filter-toolpanel-instance-filter {\n margin-left: calc(var(--ag-icon-size) * 0.5);\n}\n\n.ag-theme-quartz .ag-rtl .ag-filter-toolpanel-instance-filter, .ag-theme-quartz-dark .ag-rtl .ag-filter-toolpanel-instance-filter, .ag-theme-quartz-auto-dark .ag-rtl .ag-filter-toolpanel-instance-filter {\n margin-right: calc(var(--ag-icon-size) * 0.5);\n}\n\n.ag-theme-quartz .ag-filter-toolpanel-group-level-0,\n.ag-theme-quartz-dark .ag-filter-toolpanel-group-level-0,\n.ag-theme-quartz-auto-dark .ag-filter-toolpanel-group-level-0 {\n border-top: none;\n}\n.ag-theme-quartz .ag-filter-toolpanel-header,\n.ag-theme-quartz-dark .ag-filter-toolpanel-header,\n.ag-theme-quartz-auto-dark .ag-filter-toolpanel-header {\n height: initial;\n padding-top: var(--ag-grid-size);\n padding-bottom: var(--ag-grid-size);\n}\n.ag-theme-quartz .ag-filter-toolpanel-group-item,\n.ag-theme-quartz-dark .ag-filter-toolpanel-group-item,\n.ag-theme-quartz-auto-dark .ag-filter-toolpanel-group-item {\n margin: 0;\n}\n.ag-theme-quartz .ag-layout-auto-height .ag-center-cols-viewport,\n.ag-theme-quartz .ag-layout-auto-height .ag-center-cols-container,\n.ag-theme-quartz .ag-layout-print .ag-center-cols-viewport,\n.ag-theme-quartz .ag-layout-print .ag-center-cols-container,\n.ag-theme-quartz-dark .ag-layout-auto-height .ag-center-cols-viewport,\n.ag-theme-quartz-dark .ag-layout-auto-height .ag-center-cols-container,\n.ag-theme-quartz-dark .ag-layout-print .ag-center-cols-viewport,\n.ag-theme-quartz-dark .ag-layout-print .ag-center-cols-container,\n.ag-theme-quartz-auto-dark .ag-layout-auto-height .ag-center-cols-viewport,\n.ag-theme-quartz-auto-dark .ag-layout-auto-height .ag-center-cols-container,\n.ag-theme-quartz-auto-dark .ag-layout-print .ag-center-cols-viewport,\n.ag-theme-quartz-auto-dark .ag-layout-print .ag-center-cols-container {\n min-height: 150px;\n}\n.ag-theme-quartz .ag-date-time-list-page-entry-is-current,\n.ag-theme-quartz-dark .ag-date-time-list-page-entry-is-current,\n.ag-theme-quartz-auto-dark .ag-date-time-list-page-entry-is-current {\n background-color: var(--ag-active-color);\n}\n.ag-theme-quartz .ag-advanced-filter-builder-button,\n.ag-theme-quartz-dark .ag-advanced-filter-builder-button,\n.ag-theme-quartz-auto-dark .ag-advanced-filter-builder-button {\n padding: var(--ag-grid-size);\n font-weight: 600;\n}\n.ag-theme-quartz .ag-advanced-filter-builder-item-button-disabled .ag-icon,\n.ag-theme-quartz .ag-disabled .ag-icon,\n.ag-theme-quartz .ag-column-select-column-group-readonly .ag-icon,\n.ag-theme-quartz [disabled] .ag-icon,\n.ag-theme-quartz-dark .ag-advanced-filter-builder-item-button-disabled .ag-icon,\n.ag-theme-quartz-dark .ag-disabled .ag-icon,\n.ag-theme-quartz-dark .ag-column-select-column-group-readonly .ag-icon,\n.ag-theme-quartz-dark [disabled] .ag-icon,\n.ag-theme-quartz-auto-dark .ag-advanced-filter-builder-item-button-disabled .ag-icon,\n.ag-theme-quartz-auto-dark .ag-disabled .ag-icon,\n.ag-theme-quartz-auto-dark .ag-column-select-column-group-readonly .ag-icon,\n.ag-theme-quartz-auto-dark [disabled] .ag-icon {\n opacity: 0.6;\n}\n.ag-theme-quartz .ag-icon-grip,\n.ag-theme-quartz-dark .ag-icon-grip,\n.ag-theme-quartz-auto-dark .ag-icon-grip {\n opacity: 0.7;\n}\n.ag-theme-quartz .ag-column-select-column-readonly.ag-icon-grip,\n.ag-theme-quartz .ag-column-select-column-readonly .ag-icon-grip,\n.ag-theme-quartz-dark .ag-column-select-column-readonly.ag-icon-grip,\n.ag-theme-quartz-dark .ag-column-select-column-readonly .ag-icon-grip,\n.ag-theme-quartz-auto-dark .ag-column-select-column-readonly.ag-icon-grip,\n.ag-theme-quartz-auto-dark .ag-column-select-column-readonly .ag-icon-grip {\n opacity: 0.35;\n}\n.ag-theme-quartz .ag-column-select-header-filter-wrapper .ag-input-wrapper::before,\n.ag-theme-quartz .ag-filter-toolpanel-search .ag-input-wrapper::before,\n.ag-theme-quartz .ag-mini-filter .ag-input-wrapper::before,\n.ag-theme-quartz .ag-filter-filter .ag-input-wrapper::before,\n.ag-theme-quartz-dark .ag-column-select-header-filter-wrapper .ag-input-wrapper::before,\n.ag-theme-quartz-dark .ag-filter-toolpanel-search .ag-input-wrapper::before,\n.ag-theme-quartz-dark .ag-mini-filter .ag-input-wrapper::before,\n.ag-theme-quartz-dark .ag-filter-filter .ag-input-wrapper::before,\n.ag-theme-quartz-auto-dark .ag-column-select-header-filter-wrapper .ag-input-wrapper::before,\n.ag-theme-quartz-auto-dark .ag-filter-toolpanel-search .ag-input-wrapper::before,\n.ag-theme-quartz-auto-dark .ag-mini-filter .ag-input-wrapper::before,\n.ag-theme-quartz-auto-dark .ag-filter-filter .ag-input-wrapper::before {\n position: absolute;\n display: block;\n width: 12px;\n height: 12px;\n background-image: url(" + ___CSS_LOADER_URL_REPLACEMENT_0___ + ");\n background-position: 50% 50%;\n background-size: contain;\n opacity: 40%;\n content: \"\";\n filter: var(--ag-icon-filter);\n}\n.ag-theme-quartz .ag-ltr .ag-column-select-header-filter-wrapper .ag-input-wrapper::before, .ag-theme-quartz .ag-ltr .ag-filter-toolpanel-search .ag-input-wrapper::before, .ag-theme-quartz .ag-ltr .ag-mini-filter .ag-input-wrapper::before, .ag-theme-quartz .ag-ltr .ag-filter-filter .ag-input-wrapper::before, .ag-theme-quartz-dark .ag-ltr .ag-column-select-header-filter-wrapper .ag-input-wrapper::before, .ag-theme-quartz-dark .ag-ltr .ag-filter-toolpanel-search .ag-input-wrapper::before, .ag-theme-quartz-dark .ag-ltr .ag-mini-filter .ag-input-wrapper::before, .ag-theme-quartz-dark .ag-ltr .ag-filter-filter .ag-input-wrapper::before, .ag-theme-quartz-auto-dark .ag-ltr .ag-column-select-header-filter-wrapper .ag-input-wrapper::before, .ag-theme-quartz-auto-dark .ag-ltr .ag-filter-toolpanel-search .ag-input-wrapper::before, .ag-theme-quartz-auto-dark .ag-ltr .ag-mini-filter .ag-input-wrapper::before, .ag-theme-quartz-auto-dark .ag-ltr .ag-filter-filter .ag-input-wrapper::before {\n margin-left: var(--ag-grid-size);\n}\n\n.ag-theme-quartz .ag-rtl .ag-column-select-header-filter-wrapper .ag-input-wrapper::before, .ag-theme-quartz .ag-rtl .ag-filter-toolpanel-search .ag-input-wrapper::before, .ag-theme-quartz .ag-rtl .ag-mini-filter .ag-input-wrapper::before, .ag-theme-quartz .ag-rtl .ag-filter-filter .ag-input-wrapper::before, .ag-theme-quartz-dark .ag-rtl .ag-column-select-header-filter-wrapper .ag-input-wrapper::before, .ag-theme-quartz-dark .ag-rtl .ag-filter-toolpanel-search .ag-input-wrapper::before, .ag-theme-quartz-dark .ag-rtl .ag-mini-filter .ag-input-wrapper::before, .ag-theme-quartz-dark .ag-rtl .ag-filter-filter .ag-input-wrapper::before, .ag-theme-quartz-auto-dark .ag-rtl .ag-column-select-header-filter-wrapper .ag-input-wrapper::before, .ag-theme-quartz-auto-dark .ag-rtl .ag-filter-toolpanel-search .ag-input-wrapper::before, .ag-theme-quartz-auto-dark .ag-rtl .ag-mini-filter .ag-input-wrapper::before, .ag-theme-quartz-auto-dark .ag-rtl .ag-filter-filter .ag-input-wrapper::before {\n margin-right: var(--ag-grid-size);\n}\n\n.ag-theme-quartz .ag-ltr .ag-column-select-header-filter-wrapper input.ag-text-field-input, .ag-theme-quartz .ag-ltr .ag-column-select-header-filter-wrapper input.ag-number-field-input, .ag-theme-quartz .ag-ltr .ag-filter-toolpanel-search input.ag-text-field-input, .ag-theme-quartz .ag-ltr .ag-filter-toolpanel-search input.ag-number-field-input, .ag-theme-quartz .ag-ltr .ag-mini-filter input.ag-text-field-input, .ag-theme-quartz .ag-ltr .ag-mini-filter input.ag-number-field-input, .ag-theme-quartz .ag-ltr .ag-filter-filter input.ag-text-field-input, .ag-theme-quartz .ag-ltr .ag-filter-filter input.ag-number-field-input, .ag-theme-quartz-dark .ag-ltr .ag-column-select-header-filter-wrapper input.ag-text-field-input, .ag-theme-quartz-dark .ag-ltr .ag-column-select-header-filter-wrapper input.ag-number-field-input, .ag-theme-quartz-dark .ag-ltr .ag-filter-toolpanel-search input.ag-text-field-input, .ag-theme-quartz-dark .ag-ltr .ag-filter-toolpanel-search input.ag-number-field-input, .ag-theme-quartz-dark .ag-ltr .ag-mini-filter input.ag-text-field-input, .ag-theme-quartz-dark .ag-ltr .ag-mini-filter input.ag-number-field-input, .ag-theme-quartz-dark .ag-ltr .ag-filter-filter input.ag-text-field-input, .ag-theme-quartz-dark .ag-ltr .ag-filter-filter input.ag-number-field-input, .ag-theme-quartz-auto-dark .ag-ltr .ag-column-select-header-filter-wrapper input.ag-text-field-input, .ag-theme-quartz-auto-dark .ag-ltr .ag-column-select-header-filter-wrapper input.ag-number-field-input, .ag-theme-quartz-auto-dark .ag-ltr .ag-filter-toolpanel-search input.ag-text-field-input, .ag-theme-quartz-auto-dark .ag-ltr .ag-filter-toolpanel-search input.ag-number-field-input, .ag-theme-quartz-auto-dark .ag-ltr .ag-mini-filter input.ag-text-field-input, .ag-theme-quartz-auto-dark .ag-ltr .ag-mini-filter input.ag-number-field-input, .ag-theme-quartz-auto-dark .ag-ltr .ag-filter-filter input.ag-text-field-input, .ag-theme-quartz-auto-dark .ag-ltr .ag-filter-filter input.ag-number-field-input {\n padding-left: 26px;\n}\n\n.ag-theme-quartz .ag-rtl .ag-column-select-header-filter-wrapper input.ag-text-field-input, .ag-theme-quartz .ag-rtl .ag-column-select-header-filter-wrapper input.ag-number-field-input, .ag-theme-quartz .ag-rtl .ag-filter-toolpanel-search input.ag-text-field-input, .ag-theme-quartz .ag-rtl .ag-filter-toolpanel-search input.ag-number-field-input, .ag-theme-quartz .ag-rtl .ag-mini-filter input.ag-text-field-input, .ag-theme-quartz .ag-rtl .ag-mini-filter input.ag-number-field-input, .ag-theme-quartz .ag-rtl .ag-filter-filter input.ag-text-field-input, .ag-theme-quartz .ag-rtl .ag-filter-filter input.ag-number-field-input, .ag-theme-quartz-dark .ag-rtl .ag-column-select-header-filter-wrapper input.ag-text-field-input, .ag-theme-quartz-dark .ag-rtl .ag-column-select-header-filter-wrapper input.ag-number-field-input, .ag-theme-quartz-dark .ag-rtl .ag-filter-toolpanel-search input.ag-text-field-input, .ag-theme-quartz-dark .ag-rtl .ag-filter-toolpanel-search input.ag-number-field-input, .ag-theme-quartz-dark .ag-rtl .ag-mini-filter input.ag-text-field-input, .ag-theme-quartz-dark .ag-rtl .ag-mini-filter input.ag-number-field-input, .ag-theme-quartz-dark .ag-rtl .ag-filter-filter input.ag-text-field-input, .ag-theme-quartz-dark .ag-rtl .ag-filter-filter input.ag-number-field-input, .ag-theme-quartz-auto-dark .ag-rtl .ag-column-select-header-filter-wrapper input.ag-text-field-input, .ag-theme-quartz-auto-dark .ag-rtl .ag-column-select-header-filter-wrapper input.ag-number-field-input, .ag-theme-quartz-auto-dark .ag-rtl .ag-filter-toolpanel-search input.ag-text-field-input, .ag-theme-quartz-auto-dark .ag-rtl .ag-filter-toolpanel-search input.ag-number-field-input, .ag-theme-quartz-auto-dark .ag-rtl .ag-mini-filter input.ag-text-field-input, .ag-theme-quartz-auto-dark .ag-rtl .ag-mini-filter input.ag-number-field-input, .ag-theme-quartz-auto-dark .ag-rtl .ag-filter-filter input.ag-text-field-input, .ag-theme-quartz-auto-dark .ag-rtl .ag-filter-filter input.ag-number-field-input {\n padding-right: 26px;\n}\n\n.ag-theme-quartz .ag-ltr .ag-column-select-add-group-indent, .ag-theme-quartz-dark .ag-ltr .ag-column-select-add-group-indent, .ag-theme-quartz-auto-dark .ag-ltr .ag-column-select-add-group-indent {\n margin-left: calc(var(--ag-icon-size) + var(--ag-grid-size) * 1.5);\n}\n\n.ag-theme-quartz .ag-rtl .ag-column-select-add-group-indent, .ag-theme-quartz-dark .ag-rtl .ag-column-select-add-group-indent, .ag-theme-quartz-auto-dark .ag-rtl .ag-column-select-add-group-indent {\n margin-right: calc(var(--ag-icon-size) + var(--ag-grid-size) * 1.5);\n}\n\n.ag-theme-quartz .ag-text-field-input[disabled],\n.ag-theme-quartz .ag-menu-option-disabled,\n.ag-theme-quartz-dark .ag-text-field-input[disabled],\n.ag-theme-quartz-dark .ag-menu-option-disabled,\n.ag-theme-quartz-auto-dark .ag-text-field-input[disabled],\n.ag-theme-quartz-auto-dark .ag-menu-option-disabled {\n cursor: not-allowed;\n}\n.ag-theme-quartz .ag-checkbox-input-wrapper.ag-checked.ag-disabled,\n.ag-theme-quartz-dark .ag-checkbox-input-wrapper.ag-checked.ag-disabled,\n.ag-theme-quartz-auto-dark .ag-checkbox-input-wrapper.ag-checked.ag-disabled {\n --ag-checkbox-checked-color: var(--ag-checkbox-unchecked-color);\n}\n.ag-theme-quartz .ag-checkbox-input,\n.ag-theme-quartz .ag-toggle-button-input,\n.ag-theme-quartz .ag-radio-button-input,\n.ag-theme-quartz input[class^=ag-][type=range],\n.ag-theme-quartz-dark .ag-checkbox-input,\n.ag-theme-quartz-dark .ag-toggle-button-input,\n.ag-theme-quartz-dark .ag-radio-button-input,\n.ag-theme-quartz-dark input[class^=ag-][type=range],\n.ag-theme-quartz-auto-dark .ag-checkbox-input,\n.ag-theme-quartz-auto-dark .ag-toggle-button-input,\n.ag-theme-quartz-auto-dark .ag-radio-button-input,\n.ag-theme-quartz-auto-dark input[class^=ag-][type=range] {\n cursor: pointer;\n}\n.ag-theme-quartz .ag-details-row,\n.ag-theme-quartz-dark .ag-details-row,\n.ag-theme-quartz-auto-dark .ag-details-row {\n padding: calc(var(--ag-grid-size) * 3.75);\n}\n.ag-theme-quartz .ag-list-item-hovered::after,\n.ag-theme-quartz-dark .ag-list-item-hovered::after,\n.ag-theme-quartz-auto-dark .ag-list-item-hovered::after {\n background-color: var(--ag-active-color);\n}\n.ag-theme-quartz .ag-pill .ag-pill-button:hover,\n.ag-theme-quartz-dark .ag-pill .ag-pill-button:hover,\n.ag-theme-quartz-auto-dark .ag-pill .ag-pill-button:hover {\n color: var(--ag-active-color);\n}\n.ag-theme-quartz .ag-header-highlight-before::after,\n.ag-theme-quartz .ag-header-highlight-after::after,\n.ag-theme-quartz-dark .ag-header-highlight-before::after,\n.ag-theme-quartz-dark .ag-header-highlight-after::after,\n.ag-theme-quartz-auto-dark .ag-header-highlight-before::after,\n.ag-theme-quartz-auto-dark .ag-header-highlight-after::after {\n background-color: var(--ag-active-color);\n}\n\n.ag-theme-quartz-dark .ag-column-select-header-filter-wrapper .ag-input-wrapper::before,\n.ag-theme-quartz-dark .ag-filter-toolpanel-search .ag-input-wrapper::before,\n.ag-theme-quartz-dark .ag-mini-filter .ag-input-wrapper::before,\n.ag-theme-quartz-dark .ag-filter-filter .ag-input-wrapper::before {\n opacity: 66%;\n filter: invert(100%);\n}\n.ag-theme-quartz-dark .ag-chart-menu {\n background-color: color-mix(in srgb, rgba(24, 39, 50, 0.3), var(--ag-background-color) 30%);\n}\n.ag-theme-quartz-dark .ag-text-field-input::placeholder {\n color: var(--ag-data-color);\n opacity: 0.8;\n}\n", ""]); // Exports /* harmony default export */ __webpack_exports__.A = (___CSS_LOADER_EXPORT___); /***/ }), /***/ 1123: /***/ (function(module, __webpack_exports__, __webpack_require__) { /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6758); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(935); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(62); /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__); // Imports var ___CSS_LOADER_URL_IMPORT_0___ = new URL(/* asset import */ __webpack_require__(2006), __webpack_require__.b); var ___CSS_LOADER_URL_IMPORT_1___ = new URL(/* asset import */ __webpack_require__(7249), __webpack_require__.b); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); var ___CSS_LOADER_URL_REPLACEMENT_0___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_0___); var ___CSS_LOADER_URL_REPLACEMENT_1___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_1___); // Module ___CSS_LOADER_EXPORT___.push([module.id, "@font-face {\n font-family: \"agGridQuartz\";\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_0___ + ");\n font-weight: normal;\n font-style: normal;\n}\n.ag-theme-quartz,\n.ag-theme-quartz-dark,\n.ag-theme-quartz-auto-dark {\n --ag-active-color: #2196f3;\n --ag-background-color: #fff;\n --ag-foreground-color: #181d1f;\n --ag-border-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 15%);\n --ag-secondary-border-color: var(--ag-border-color);\n --ag-header-background-color: color-mix(in srgb, var(--ag-background-color), var(--ag-foreground-color) 2%);\n --ag-tooltip-background-color: var(--ag-header-background-color);\n --ag-control-panel-background-color: var(--ag-header-background-color);\n --ag-subheader-background-color: transparent;\n --ag-invalid-color: #e02525;\n --ag-checkbox-unchecked-color: color-mix(in srgb, var(--ag-background-color), var(--ag-foreground-color) 30%);\n --ag-advanced-filter-join-pill-color: #f08e8d;\n --ag-advanced-filter-column-pill-color: #a6e194;\n --ag-advanced-filter-option-pill-color: #f3c08b;\n --ag-advanced-filter-value-pill-color: #85c0e4;\n --ag-header-column-resize-handle-color: var(--ag-secondary-border-color);\n --ag-icon-font-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 90%);\n --ag-panel-background-color: color-mix(in srgb, var(--ag-background-color), var(--ag-foreground-color) 3%);\n --ag-panel-border-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 20%);\n --ag-menu-background-color: color-mix(in srgb, var(--ag-background-color), var(--ag-foreground-color) 3%);\n --ag-menu-border-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 20%);\n --ag-selected-row-background-color: color-mix(in srgb, transparent, var(--ag-active-color) 8%);\n --ag-row-hover-color: color-mix(in srgb, transparent, var(--ag-active-color) 12%);\n --ag-column-hover-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 5%);\n --ag-input-focus-border-color: var(--ag-active-color);\n --ag-input-focus-box-shadow: 0 0 0 3px color-mix(in srgb, transparent, var(--ag-input-focus-border-color) 47%);\n --ag-range-selection-background-color: color-mix(in srgb, transparent, var(--ag-active-color) 20%);\n --ag-range-selection-background-color-2: color-mix(in srgb, transparent, var(--ag-active-color) 36%);\n --ag-range-selection-background-color-3: color-mix(in srgb, transparent, var(--ag-active-color) 49%);\n --ag-range-selection-background-color-4: color-mix(in srgb, transparent, var(--ag-active-color) 59%);\n --ag-row-numbers-selected-color: color-mix(in srgb, transparent, var(--ag-active-color) 50%);\n --ag-checkbox-background-color: var(--ag-background-color);\n --ag-checkbox-checked-color: var(--ag-active-color);\n --ag-range-selection-border-color: var(--ag-active-color);\n --ag-secondary-foreground-color: var(--ag-foreground-color);\n --ag-input-border-color: var(--ag-border-color);\n --ag-input-border-color-invalid: var(--ag-invalid-color);\n --ag-disabled-foreground-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 50%);\n --ag-chip-background-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 7%);\n --ag-chip-border-color: color-mix(in srgb, var(--ag-header-background-color), var(--ag-foreground-color) 13%);\n --ag-input-disabled-border-color: var(--ag-border-color);\n --ag-input-disabled-background-color: color-mix(in srgb, var(--ag-background-color), var(--ag-foreground-color) 6%);\n --ag-modal-overlay-background-color: color-mix(in srgb, transparent, var(--ag-background-color) 66%);\n --ag-chart-menu-label-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 80%);\n --ag-chart-menu-pill-select-button-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 70%);\n --ag-borders: solid 1px;\n --ag-border-radius: 4px;\n --ag-wrapper-border-radius: 8px;\n --ag-borders-side-button: none;\n --ag-side-button-selected-background-color: transparent;\n --ag-header-column-resize-handle-display: block;\n --ag-header-column-resize-handle-width: 2px;\n --ag-header-column-resize-handle-height: 30%;\n --ag-grid-size: 8px;\n --ag-icon-size: 16px;\n --ag-header-height: calc(var(--ag-font-size) + var(--ag-grid-size) * 4.25);\n --ag-row-height: calc(var(--ag-font-size) + var(--ag-grid-size) * 3.5);\n --ag-list-item-height: calc(\n var(--ag-icon-size) + var(--ag-widget-vertical-spacing)\n );\n --ag-column-select-indent-size: var(--ag-icon-size);\n --ag-set-filter-indent-size: var(--ag-icon-size);\n --ag-filter-tool-panel-group-indent: var(--ag-grid-size);\n --ag-advanced-filter-builder-indent-size: calc(var(--ag-icon-size) + var(--ag-grid-size) * 2);\n --ag-cell-horizontal-padding: calc(var(--ag-grid-size) * 2);\n --ag-cell-widget-spacing: calc(var(--ag-grid-size) * 1.5);\n --ag-widget-container-vertical-padding: calc(var(--ag-grid-size) * 1.5);\n --ag-widget-container-horizontal-padding: calc(var(--ag-grid-size) * 1.5);\n --ag-widget-horizontal-spacing: calc(var(--ag-grid-size) * 1.5);\n --ag-widget-vertical-spacing: calc(var(--ag-grid-size) * 1);\n --ag-toggle-button-height: 18px;\n --ag-toggle-button-width: 28px;\n --ag-toggle-button-border-width: 2px;\n --ag-font-family: \"IBM Plex Sans\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu,\n Cantarell, \"Helvetica Neue\", sans-serif;\n --ag-font-size: 14px;\n --ag-icon-font-family: agGridQuartz;\n --ag-tab-min-width: 290px;\n --ag-chart-menu-panel-width: 260px;\n --ag-card-shadow: 0 1px 4px 1px rgba(186, 191, 199, 0.4);\n --ag-popup-shadow: 0 0 16px 0 rgba(0, 0, 0, 0.15);\n --ag-side-bar-panel-width: 250px;\n}\n\n.ag-theme-quartz-dark {\n --ag-background-color: color-mix(in srgb, #fff, #182230 97%);\n --ag-foreground-color: #fff;\n --ag-border-color: rgba(255, 255, 255, 0.16);\n --ag-secondary-border-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 10%);\n --ag-header-background-color: color-mix(in srgb, #fff, #182230 93%);\n --ag-tooltip-background-color: color-mix(in srgb, #fff, #182230 96%);\n --ag-control-panel-background-color: color-mix(in srgb, #fff, #182230 93%);\n --ag-input-disabled-background-color: #68686e12;\n --ag-card-shadow: 0 1px 20px 1px black;\n --ag-input-border-color: var(--ag-border-color);\n --ag-input-disabled-border-color: rgba(255, 255, 255, 0.07);\n --ag-checkbox-unchecked-color: color-mix(in srgb, var(--ag-background-color), var(--ag-foreground-color) 40%);\n --ag-row-hover-color: color-mix(in srgb, transparent, var(--ag-active-color) 20%);\n --ag-selected-row-background-color: var(--ag-row-hover-color);\n --ag-panel-background-color: color-mix(in srgb, var(--ag-background-color), var(--ag-foreground-color) 10%);\n --ag-panel-border-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 10%);\n --ag-menu-background-color: color-mix(in srgb, var(--ag-background-color), var(--ag-foreground-color) 10%);\n --ag-menu-border-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 10%);\n --ag-advanced-filter-join-pill-color: #7a3a37;\n --ag-advanced-filter-column-pill-color: #355f2d;\n --ag-advanced-filter-option-pill-color: #5a3168;\n --ag-advanced-filter-value-pill-color: #374c86;\n --ag-popup-shadow: 0 0px 20px rgba(0, 0, 0, 0.3);\n --ag-row-loading-skeleton-effect-color: rgba(202, 203, 204, 0.4);\n color-scheme: dark;\n}\n\n@media (prefers-color-scheme: dark) {\n .ag-theme-quartz-auto-dark {\n --ag-background-color: color-mix(in srgb, #fff, #182230 97%);\n --ag-foreground-color: #fff;\n --ag-border-color: rgba(255, 255, 255, 0.16);\n --ag-secondary-border-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 10%);\n --ag-header-background-color: color-mix(in srgb, #fff, #182230 93%);\n --ag-tooltip-background-color: color-mix(in srgb, #fff, #182230 96%);\n --ag-control-panel-background-color: color-mix(in srgb, #fff, #182230 93%);\n --ag-input-disabled-background-color: #68686e12;\n --ag-card-shadow: 0 1px 20px 1px black;\n --ag-input-border-color: var(--ag-border-color);\n --ag-input-disabled-border-color: rgba(255, 255, 255, 0.07);\n --ag-checkbox-unchecked-color: color-mix(in srgb, var(--ag-background-color), var(--ag-foreground-color) 40%);\n --ag-row-hover-color: color-mix(in srgb, transparent, var(--ag-active-color) 20%);\n --ag-selected-row-background-color: var(--ag-row-hover-color);\n --ag-panel-background-color: color-mix(in srgb, var(--ag-background-color), var(--ag-foreground-color) 10%);\n --ag-panel-border-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 10%);\n --ag-menu-background-color: color-mix(in srgb, var(--ag-background-color), var(--ag-foreground-color) 10%);\n --ag-menu-border-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 10%);\n --ag-advanced-filter-join-pill-color: #7a3a37;\n --ag-advanced-filter-column-pill-color: #355f2d;\n --ag-advanced-filter-option-pill-color: #5a3168;\n --ag-advanced-filter-value-pill-color: #374c86;\n --ag-popup-shadow: 0 0px 20px rgba(0, 0, 0, 0.3);\n --ag-row-loading-skeleton-effect-color: rgba(202, 203, 204, 0.4);\n color-scheme: dark;\n }\n}\n.ag-theme-quartz .ag-filter-toolpanel-header,\n.ag-theme-quartz .ag-filter-toolpanel-search,\n.ag-theme-quartz .ag-status-bar,\n.ag-theme-quartz .ag-header-row,\n.ag-theme-quartz .ag-row-number-cell,\n.ag-theme-quartz .ag-panel-title-bar-title,\n.ag-theme-quartz .ag-multi-filter-group-title-bar,\n.ag-theme-quartz-dark .ag-filter-toolpanel-header,\n.ag-theme-quartz-dark .ag-filter-toolpanel-search,\n.ag-theme-quartz-dark .ag-status-bar,\n.ag-theme-quartz-dark .ag-header-row,\n.ag-theme-quartz-dark .ag-row-number-cell,\n.ag-theme-quartz-dark .ag-panel-title-bar-title,\n.ag-theme-quartz-dark .ag-multi-filter-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-filter-toolpanel-header,\n.ag-theme-quartz-auto-dark .ag-filter-toolpanel-search,\n.ag-theme-quartz-auto-dark .ag-status-bar,\n.ag-theme-quartz-auto-dark .ag-header-row,\n.ag-theme-quartz-auto-dark .ag-row-number-cell,\n.ag-theme-quartz-auto-dark .ag-panel-title-bar-title,\n.ag-theme-quartz-auto-dark .ag-multi-filter-group-title-bar {\n font-weight: 500;\n color: var(--ag-header-foreground-color);\n}\n.ag-theme-quartz input[class^=ag-]:not([type]),\n.ag-theme-quartz input[class^=ag-][type=text],\n.ag-theme-quartz input[class^=ag-][type=number],\n.ag-theme-quartz input[class^=ag-][type=tel],\n.ag-theme-quartz input[class^=ag-][type=date],\n.ag-theme-quartz input[class^=ag-][type=datetime-local],\n.ag-theme-quartz textarea[class^=ag-],\n.ag-theme-quartz-dark input[class^=ag-]:not([type]),\n.ag-theme-quartz-dark input[class^=ag-][type=text],\n.ag-theme-quartz-dark input[class^=ag-][type=number],\n.ag-theme-quartz-dark input[class^=ag-][type=tel],\n.ag-theme-quartz-dark input[class^=ag-][type=date],\n.ag-theme-quartz-dark input[class^=ag-][type=datetime-local],\n.ag-theme-quartz-dark textarea[class^=ag-],\n.ag-theme-quartz-auto-dark input[class^=ag-]:not([type]),\n.ag-theme-quartz-auto-dark input[class^=ag-][type=text],\n.ag-theme-quartz-auto-dark input[class^=ag-][type=number],\n.ag-theme-quartz-auto-dark input[class^=ag-][type=tel],\n.ag-theme-quartz-auto-dark input[class^=ag-][type=date],\n.ag-theme-quartz-auto-dark input[class^=ag-][type=datetime-local],\n.ag-theme-quartz-auto-dark textarea[class^=ag-] {\n min-height: calc(var(--ag-grid-size) * 4);\n border-radius: var(--ag-border-radius);\n}\n.ag-theme-quartz .ag-ltr input[class^=ag-]:not([type]), .ag-theme-quartz .ag-ltr input[class^=ag-][type=text], .ag-theme-quartz .ag-ltr input[class^=ag-][type=number], .ag-theme-quartz .ag-ltr input[class^=ag-][type=tel], .ag-theme-quartz .ag-ltr input[class^=ag-][type=date], .ag-theme-quartz .ag-ltr input[class^=ag-][type=datetime-local], .ag-theme-quartz .ag-ltr textarea[class^=ag-], .ag-theme-quartz-dark .ag-ltr input[class^=ag-]:not([type]), .ag-theme-quartz-dark .ag-ltr input[class^=ag-][type=text], .ag-theme-quartz-dark .ag-ltr input[class^=ag-][type=number], .ag-theme-quartz-dark .ag-ltr input[class^=ag-][type=tel], .ag-theme-quartz-dark .ag-ltr input[class^=ag-][type=date], .ag-theme-quartz-dark .ag-ltr input[class^=ag-][type=datetime-local], .ag-theme-quartz-dark .ag-ltr textarea[class^=ag-], .ag-theme-quartz-auto-dark .ag-ltr input[class^=ag-]:not([type]), .ag-theme-quartz-auto-dark .ag-ltr input[class^=ag-][type=text], .ag-theme-quartz-auto-dark .ag-ltr input[class^=ag-][type=number], .ag-theme-quartz-auto-dark .ag-ltr input[class^=ag-][type=tel], .ag-theme-quartz-auto-dark .ag-ltr input[class^=ag-][type=date], .ag-theme-quartz-auto-dark .ag-ltr input[class^=ag-][type=datetime-local], .ag-theme-quartz-auto-dark .ag-ltr textarea[class^=ag-] {\n padding-left: var(--ag-grid-size);\n}\n\n.ag-theme-quartz .ag-rtl input[class^=ag-]:not([type]), .ag-theme-quartz .ag-rtl input[class^=ag-][type=text], .ag-theme-quartz .ag-rtl input[class^=ag-][type=number], .ag-theme-quartz .ag-rtl input[class^=ag-][type=tel], .ag-theme-quartz .ag-rtl input[class^=ag-][type=date], .ag-theme-quartz .ag-rtl input[class^=ag-][type=datetime-local], .ag-theme-quartz .ag-rtl textarea[class^=ag-], .ag-theme-quartz-dark .ag-rtl input[class^=ag-]:not([type]), .ag-theme-quartz-dark .ag-rtl input[class^=ag-][type=text], .ag-theme-quartz-dark .ag-rtl input[class^=ag-][type=number], .ag-theme-quartz-dark .ag-rtl input[class^=ag-][type=tel], .ag-theme-quartz-dark .ag-rtl input[class^=ag-][type=date], .ag-theme-quartz-dark .ag-rtl input[class^=ag-][type=datetime-local], .ag-theme-quartz-dark .ag-rtl textarea[class^=ag-], .ag-theme-quartz-auto-dark .ag-rtl input[class^=ag-]:not([type]), .ag-theme-quartz-auto-dark .ag-rtl input[class^=ag-][type=text], .ag-theme-quartz-auto-dark .ag-rtl input[class^=ag-][type=number], .ag-theme-quartz-auto-dark .ag-rtl input[class^=ag-][type=tel], .ag-theme-quartz-auto-dark .ag-rtl input[class^=ag-][type=date], .ag-theme-quartz-auto-dark .ag-rtl input[class^=ag-][type=datetime-local], .ag-theme-quartz-auto-dark .ag-rtl textarea[class^=ag-] {\n padding-right: var(--ag-grid-size);\n}\n\n.ag-theme-quartz .ag-picker-field-wrapper,\n.ag-theme-quartz-dark .ag-picker-field-wrapper,\n.ag-theme-quartz-auto-dark .ag-picker-field-wrapper {\n min-height: calc(var(--ag-grid-size) * 4);\n}\n.ag-theme-quartz .ag-tab,\n.ag-theme-quartz-dark .ag-tab,\n.ag-theme-quartz-auto-dark .ag-tab {\n padding: var(--ag-grid-size);\n border-left: var(--ag-borders) transparent;\n border-right: var(--ag-borders) transparent;\n flex: 1 1 auto;\n}\n.ag-theme-quartz .ag-tab-selected,\n.ag-theme-quartz-dark .ag-tab-selected,\n.ag-theme-quartz-auto-dark .ag-tab-selected {\n background-color: var(--ag-background-color);\n}\n.ag-theme-quartz .ag-ltr .ag-tab-selected:not(:first-of-type), .ag-theme-quartz-dark .ag-ltr .ag-tab-selected:not(:first-of-type), .ag-theme-quartz-auto-dark .ag-ltr .ag-tab-selected:not(:first-of-type) {\n border-left-color: var(--ag-border-color);\n}\n\n.ag-theme-quartz .ag-rtl .ag-tab-selected:not(:first-of-type), .ag-theme-quartz-dark .ag-rtl .ag-tab-selected:not(:first-of-type), .ag-theme-quartz-auto-dark .ag-rtl .ag-tab-selected:not(:first-of-type) {\n border-right-color: var(--ag-border-color);\n}\n\n.ag-theme-quartz .ag-ltr .ag-tab-selected:not(:last-of-type), .ag-theme-quartz-dark .ag-ltr .ag-tab-selected:not(:last-of-type), .ag-theme-quartz-auto-dark .ag-ltr .ag-tab-selected:not(:last-of-type) {\n border-right-color: var(--ag-border-color);\n}\n\n.ag-theme-quartz .ag-rtl .ag-tab-selected:not(:last-of-type), .ag-theme-quartz-dark .ag-rtl .ag-tab-selected:not(:last-of-type), .ag-theme-quartz-auto-dark .ag-rtl .ag-tab-selected:not(:last-of-type) {\n border-left-color: var(--ag-border-color);\n}\n\n.ag-theme-quartz .ag-tab:not(.ag-tab-selected),\n.ag-theme-quartz-dark .ag-tab:not(.ag-tab-selected),\n.ag-theme-quartz-auto-dark .ag-tab:not(.ag-tab-selected) {\n opacity: 0.7;\n}\n.ag-theme-quartz .ag-tab:not(.ag-tab-selected):hover,\n.ag-theme-quartz-dark .ag-tab:not(.ag-tab-selected):hover,\n.ag-theme-quartz-auto-dark .ag-tab:not(.ag-tab-selected):hover {\n opacity: 1;\n}\n.ag-theme-quartz .ag-menu,\n.ag-theme-quartz-dark .ag-menu,\n.ag-theme-quartz-auto-dark .ag-menu {\n color: color-mix(in srgb, transparent, var(--ag-foreground-color) 95%);\n}\n.ag-theme-quartz .ag-panel-content-wrapper .ag-column-select,\n.ag-theme-quartz-dark .ag-panel-content-wrapper .ag-column-select,\n.ag-theme-quartz-auto-dark .ag-panel-content-wrapper .ag-column-select {\n background-color: var(--ag-control-panel-background-color);\n color: color-mix(in srgb, transparent, var(--ag-foreground-color) 95%);\n}\n.ag-theme-quartz .ag-menu-header,\n.ag-theme-quartz-dark .ag-menu-header,\n.ag-theme-quartz-auto-dark .ag-menu-header {\n background-color: var(--ag-control-panel-background-color);\n}\n.ag-theme-quartz .ag-menu-option,\n.ag-theme-quartz-dark .ag-menu-option,\n.ag-theme-quartz-auto-dark .ag-menu-option {\n font-weight: 500;\n cursor: pointer;\n}\n.ag-theme-quartz .ag-ltr .ag-menu-option-popup-pointer .ag-icon, .ag-theme-quartz-dark .ag-ltr .ag-menu-option-popup-pointer .ag-icon, .ag-theme-quartz-auto-dark .ag-ltr .ag-menu-option-popup-pointer .ag-icon {\n text-align: right;\n}\n\n.ag-theme-quartz .ag-rtl .ag-menu-option-popup-pointer .ag-icon, .ag-theme-quartz-dark .ag-rtl .ag-menu-option-popup-pointer .ag-icon, .ag-theme-quartz-auto-dark .ag-rtl .ag-menu-option-popup-pointer .ag-icon {\n text-align: left;\n}\n\n.ag-theme-quartz .ag-tabs-header,\n.ag-theme-quartz-dark .ag-tabs-header,\n.ag-theme-quartz-auto-dark .ag-tabs-header {\n border-bottom: var(--ag-borders) var(--ag-border-color);\n display: flex;\n background-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 5%);\n}\n.ag-theme-quartz .ag-side-bar,\n.ag-theme-quartz-dark .ag-side-bar,\n.ag-theme-quartz-auto-dark .ag-side-bar {\n background-color: var(--ag-control-panel-background-color);\n min-width: calc(var(--ag-icon-size) + var(--ag-grid-size) * 2);\n}\n.ag-theme-quartz .ag-side-buttons,\n.ag-theme-quartz-dark .ag-side-buttons,\n.ag-theme-quartz-auto-dark .ag-side-buttons {\n padding: 0;\n align-self: stretch;\n width: calc(var(--ag-icon-size) + var(--ag-grid-size) * 2);\n background: var(--ag-control-panel-background-color);\n}\n.ag-theme-quartz .ag-side-button,\n.ag-theme-quartz-dark .ag-side-button,\n.ag-theme-quartz-auto-dark .ag-side-button {\n border-top: var(--ag-borders) transparent;\n border-bottom: var(--ag-borders) transparent;\n}\n@media (max-resolution: 1.5x) {\n .ag-theme-quartz .ag-side-button-label,\n .ag-theme-quartz-dark .ag-side-button-label,\n .ag-theme-quartz-auto-dark .ag-side-button-label {\n font-family: \"Segoe UI\", var(--ag-font-family);\n transform: rotate(0.05deg);\n }\n}\n.ag-theme-quartz .ag-side-button.ag-selected,\n.ag-theme-quartz-dark .ag-side-button.ag-selected,\n.ag-theme-quartz-auto-dark .ag-side-button.ag-selected {\n border-bottom-color: var(--ag-border-color);\n background-color: var(--ag-background-color);\n}\n.ag-theme-quartz .ag-side-button.ag-selected:not(:first-of-type),\n.ag-theme-quartz-dark .ag-side-button.ag-selected:not(:first-of-type),\n.ag-theme-quartz-auto-dark .ag-side-button.ag-selected:not(:first-of-type) {\n border-top-color: var(--ag-border-color);\n}\n.ag-theme-quartz .ag-column-panel-column-select,\n.ag-theme-quartz-dark .ag-column-panel-column-select,\n.ag-theme-quartz-auto-dark .ag-column-panel-column-select {\n border-top: none;\n border-bottom: 1px solid var(--ag-secondary-border-color);\n}\n.ag-theme-quartz .ag-filter-toolpanel-search,\n.ag-theme-quartz-dark .ag-filter-toolpanel-search,\n.ag-theme-quartz-auto-dark .ag-filter-toolpanel-search {\n height: initial;\n margin-top: var(--ag-widget-container-vertical-padding);\n}\n.ag-theme-quartz .ag-filter-toolpanel-search-input,\n.ag-theme-quartz-dark .ag-filter-toolpanel-search-input,\n.ag-theme-quartz-auto-dark .ag-filter-toolpanel-search-input {\n margin: 0;\n}\n.ag-theme-quartz .ag-filter-apply-panel,\n.ag-theme-quartz-dark .ag-filter-apply-panel,\n.ag-theme-quartz-auto-dark .ag-filter-apply-panel {\n border: none;\n padding-top: var(--ag-widget-vertical-spacing);\n}\n.ag-theme-quartz .ag-chart-tabbed-menu-body,\n.ag-theme-quartz-dark .ag-chart-tabbed-menu-body,\n.ag-theme-quartz-auto-dark .ag-chart-tabbed-menu-body {\n position: relative;\n}\n.ag-theme-quartz .ag-chart-tabbed-menu-body::after,\n.ag-theme-quartz-dark .ag-chart-tabbed-menu-body::after,\n.ag-theme-quartz-auto-dark .ag-chart-tabbed-menu-body::after {\n content: \"\";\n position: absolute;\n display: block;\n top: 0;\n left: 0;\n right: 0;\n height: 16px;\n background: linear-gradient(var(--ag-control-panel-background-color), transparent);\n}\n.ag-theme-quartz .ag-charts-settings-group-title-bar,\n.ag-theme-quartz .ag-charts-data-group-title-bar,\n.ag-theme-quartz .ag-charts-format-top-level-group-title-bar,\n.ag-theme-quartz .ag-charts-advanced-settings-top-level-group-title-bar,\n.ag-theme-quartz .ag-charts-settings-group-container,\n.ag-theme-quartz-dark .ag-charts-settings-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-data-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-format-top-level-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-advanced-settings-top-level-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-settings-group-container,\n.ag-theme-quartz-auto-dark .ag-charts-settings-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-data-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-format-top-level-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-advanced-settings-top-level-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-settings-group-container {\n border-top: none;\n font-weight: 500;\n}\n.ag-theme-quartz .ag-chart-mini-thumbnail,\n.ag-theme-quartz-dark .ag-chart-mini-thumbnail,\n.ag-theme-quartz-auto-dark .ag-chart-mini-thumbnail {\n background-color: var(--ag-background-color);\n margin-top: 0;\n margin-bottom: 0;\n}\n.ag-theme-quartz .ag-chart-settings-nav-bar,\n.ag-theme-quartz-dark .ag-chart-settings-nav-bar,\n.ag-theme-quartz-auto-dark .ag-chart-settings-nav-bar {\n border-top: var(--ag-borders-secondary) var(--ag-secondary-border-color);\n}\n.ag-theme-quartz .ag-charts-format-sub-level-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-format-sub-level-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-format-sub-level-group-title-bar {\n background: none;\n font-weight: 500;\n}\n.ag-theme-quartz .ag-chart-data-section .ag-label:not(.ag-group-title-bar),\n.ag-theme-quartz .ag-chart-format-section .ag-label:not(.ag-group-title-bar),\n.ag-theme-quartz-dark .ag-chart-data-section .ag-label:not(.ag-group-title-bar),\n.ag-theme-quartz-dark .ag-chart-format-section .ag-label:not(.ag-group-title-bar),\n.ag-theme-quartz-auto-dark .ag-chart-data-section .ag-label:not(.ag-group-title-bar),\n.ag-theme-quartz-auto-dark .ag-chart-format-section .ag-label:not(.ag-group-title-bar) {\n color: var(--ag-chart-menu-label-color);\n}\n.ag-theme-quartz .ag-chart-data-section .ag-label-align-top .ag-label,\n.ag-theme-quartz .ag-chart-format-section .ag-label-align-top .ag-label,\n.ag-theme-quartz-dark .ag-chart-data-section .ag-label-align-top .ag-label,\n.ag-theme-quartz-dark .ag-chart-format-section .ag-label-align-top .ag-label,\n.ag-theme-quartz-auto-dark .ag-chart-data-section .ag-label-align-top .ag-label,\n.ag-theme-quartz-auto-dark .ag-chart-format-section .ag-label-align-top .ag-label {\n margin-top: calc(var(--ag-widget-vertical-spacing) * 0.5);\n margin-bottom: var(--ag-widget-vertical-spacing);\n}\n.ag-theme-quartz .ag-chart-data-section .ag-slider.ag-label-align-top .ag-label,\n.ag-theme-quartz .ag-chart-format-section .ag-slider.ag-label-align-top .ag-label,\n.ag-theme-quartz-dark .ag-chart-data-section .ag-slider.ag-label-align-top .ag-label,\n.ag-theme-quartz-dark .ag-chart-format-section .ag-slider.ag-label-align-top .ag-label,\n.ag-theme-quartz-auto-dark .ag-chart-data-section .ag-slider.ag-label-align-top .ag-label,\n.ag-theme-quartz-auto-dark .ag-chart-format-section .ag-slider.ag-label-align-top .ag-label {\n margin-bottom: 0;\n}\n.ag-theme-quartz .ag-chart-data-section label,\n.ag-theme-quartz .ag-chart-format-section label,\n.ag-theme-quartz-dark .ag-chart-data-section label,\n.ag-theme-quartz-dark .ag-chart-format-section label,\n.ag-theme-quartz-auto-dark .ag-chart-data-section label,\n.ag-theme-quartz-auto-dark .ag-chart-format-section label {\n display: inline-block;\n}\n.ag-theme-quartz .ag-chart-format-wrapper,\n.ag-theme-quartz .ag-chart-data-wrapper,\n.ag-theme-quartz .ag-charts-format-top-level-group,\n.ag-theme-quartz .ag-charts-format-top-level-group-title-bar,\n.ag-theme-quartz .ag-charts-format-top-level-group .ag-charts-format-top-level-group-container,\n.ag-theme-quartz .ag-charts-format-top-level-group-item,\n.ag-theme-quartz .ag-charts-format-sub-level-group,\n.ag-theme-quartz .ag-charts-format-sub-level-group-title-bar,\n.ag-theme-quartz .ag-charts-format-sub-level-group-container,\n.ag-theme-quartz .ag-charts-format-sub-level-group-item:last-child,\n.ag-theme-quartz .ag-charts-format-sub-level-group-container > *,\n.ag-theme-quartz .ag-charts-data-group-title-bar,\n.ag-theme-quartz .ag-charts-data-group-container,\n.ag-theme-quartz .ag-charts-settings-group-title-bar,\n.ag-theme-quartz .ag-charts-settings-group-container,\n.ag-theme-quartz-dark .ag-chart-format-wrapper,\n.ag-theme-quartz-dark .ag-chart-data-wrapper,\n.ag-theme-quartz-dark .ag-charts-format-top-level-group,\n.ag-theme-quartz-dark .ag-charts-format-top-level-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-format-top-level-group .ag-charts-format-top-level-group-container,\n.ag-theme-quartz-dark .ag-charts-format-top-level-group-item,\n.ag-theme-quartz-dark .ag-charts-format-sub-level-group,\n.ag-theme-quartz-dark .ag-charts-format-sub-level-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-format-sub-level-group-container,\n.ag-theme-quartz-dark .ag-charts-format-sub-level-group-item:last-child,\n.ag-theme-quartz-dark .ag-charts-format-sub-level-group-container > *,\n.ag-theme-quartz-dark .ag-charts-data-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-data-group-container,\n.ag-theme-quartz-dark .ag-charts-settings-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-settings-group-container,\n.ag-theme-quartz-auto-dark .ag-chart-format-wrapper,\n.ag-theme-quartz-auto-dark .ag-chart-data-wrapper,\n.ag-theme-quartz-auto-dark .ag-charts-format-top-level-group,\n.ag-theme-quartz-auto-dark .ag-charts-format-top-level-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-format-top-level-group .ag-charts-format-top-level-group-container,\n.ag-theme-quartz-auto-dark .ag-charts-format-top-level-group-item,\n.ag-theme-quartz-auto-dark .ag-charts-format-sub-level-group,\n.ag-theme-quartz-auto-dark .ag-charts-format-sub-level-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-format-sub-level-group-container,\n.ag-theme-quartz-auto-dark .ag-charts-format-sub-level-group-item:last-child,\n.ag-theme-quartz-auto-dark .ag-charts-format-sub-level-group-container > *,\n.ag-theme-quartz-auto-dark .ag-charts-data-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-data-group-container,\n.ag-theme-quartz-auto-dark .ag-charts-settings-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-settings-group-container {\n padding: 0;\n margin: 0;\n}\n.ag-theme-quartz .ag-charts-format-top-level-group,\n.ag-theme-quartz .ag-charts-data-group,\n.ag-theme-quartz-dark .ag-charts-format-top-level-group,\n.ag-theme-quartz-dark .ag-charts-data-group,\n.ag-theme-quartz-auto-dark .ag-charts-format-top-level-group,\n.ag-theme-quartz-auto-dark .ag-charts-data-group {\n border-top: var(--ag-borders-secondary) var(--ag-secondary-border-color);\n}\n.ag-theme-quartz .ag-charts-format-top-level-group-title-bar,\n.ag-theme-quartz .ag-charts-data-group-title-bar,\n.ag-theme-quartz .ag-charts-settings-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-format-top-level-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-data-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-settings-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-format-top-level-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-data-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-settings-group-title-bar {\n padding: var(--ag-widget-container-vertical-padding) var(--ag-widget-container-horizontal-padding);\n}\n.ag-theme-quartz .ag-charts-format-top-level-group .ag-charts-format-top-level-group-container,\n.ag-theme-quartz .ag-charts-data-group .ag-charts-data-group-container,\n.ag-theme-quartz .ag-charts-settings-group .ag-charts-settings-group-container,\n.ag-theme-quartz-dark .ag-charts-format-top-level-group .ag-charts-format-top-level-group-container,\n.ag-theme-quartz-dark .ag-charts-data-group .ag-charts-data-group-container,\n.ag-theme-quartz-dark .ag-charts-settings-group .ag-charts-settings-group-container,\n.ag-theme-quartz-auto-dark .ag-charts-format-top-level-group .ag-charts-format-top-level-group-container,\n.ag-theme-quartz-auto-dark .ag-charts-data-group .ag-charts-data-group-container,\n.ag-theme-quartz-auto-dark .ag-charts-settings-group .ag-charts-settings-group-container {\n padding: 0 var(--ag-widget-container-horizontal-padding);\n}\n.ag-theme-quartz .ag-charts-format-sub-level-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-format-sub-level-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-format-sub-level-group-title-bar {\n padding: var(--ag-widget-vertical-spacing) 0;\n}\n.ag-theme-quartz .ag-charts-format-sub-level-group-container,\n.ag-theme-quartz-dark .ag-charts-format-sub-level-group-container,\n.ag-theme-quartz-auto-dark .ag-charts-format-sub-level-group-container {\n padding-top: var(--ag-widget-vertical-spacing);\n padding-bottom: var(--ag-widget-container-vertical-padding);\n}\n.ag-theme-quartz .ag-charts-format-top-level-group-container > *,\n.ag-theme-quartz .ag-charts-format-sub-level-group-container > *,\n.ag-theme-quartz-dark .ag-charts-format-top-level-group-container > *,\n.ag-theme-quartz-dark .ag-charts-format-sub-level-group-container > *,\n.ag-theme-quartz-auto-dark .ag-charts-format-top-level-group-container > *,\n.ag-theme-quartz-auto-dark .ag-charts-format-sub-level-group-container > * {\n margin-bottom: var(--ag-widget-vertical-spacing);\n}\n.ag-theme-quartz .ag-charts-data-group-item,\n.ag-theme-quartz-dark .ag-charts-data-group-item,\n.ag-theme-quartz-auto-dark .ag-charts-data-group-item {\n padding-bottom: var(--ag-widget-container-vertical-padding);\n}\n.ag-theme-quartz .ag-chart-settings-mini-wrapper,\n.ag-theme-quartz-dark .ag-chart-settings-mini-wrapper,\n.ag-theme-quartz-auto-dark .ag-chart-settings-mini-wrapper {\n padding-bottom: var(--ag-widget-container-vertical-padding);\n}\n.ag-theme-quartz .ag-chart-advanced-settings-section,\n.ag-theme-quartz-dark .ag-chart-advanced-settings-section,\n.ag-theme-quartz-auto-dark .ag-chart-advanced-settings-section {\n padding-top: var(--ag-widget-container-vertical-padding);\n padding-bottom: var(--ag-widget-container-vertical-padding);\n}\n.ag-theme-quartz .ag-charts-advanced-settings-top-level-group .ag-charts-advanced-settings-top-level-group-title-bar,\n.ag-theme-quartz .ag-charts-advanced-settings-top-level-group .ag-charts-advanced-settings-top-level-group-container,\n.ag-theme-quartz-dark .ag-charts-advanced-settings-top-level-group .ag-charts-advanced-settings-top-level-group-title-bar,\n.ag-theme-quartz-dark .ag-charts-advanced-settings-top-level-group .ag-charts-advanced-settings-top-level-group-container,\n.ag-theme-quartz-auto-dark .ag-charts-advanced-settings-top-level-group .ag-charts-advanced-settings-top-level-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-charts-advanced-settings-top-level-group .ag-charts-advanced-settings-top-level-group-container {\n padding: 0 var(--ag-widget-container-horizontal-padding);\n}\n.ag-theme-quartz .ag-charts-advanced-settings-top-level-group-container,\n.ag-theme-quartz-dark .ag-charts-advanced-settings-top-level-group-container,\n.ag-theme-quartz-auto-dark .ag-charts-advanced-settings-top-level-group-container {\n margin: 0;\n}\n.ag-theme-quartz .ag-charts-advanced-settings-top-level-group-item,\n.ag-theme-quartz-dark .ag-charts-advanced-settings-top-level-group-item,\n.ag-theme-quartz-auto-dark .ag-charts-advanced-settings-top-level-group-item {\n margin-top: calc(var(--ag-widget-vertical-spacing) * 2);\n margin-bottom: 0;\n}\n.ag-theme-quartz .ag-ltr .ag-group-title-bar-icon, .ag-theme-quartz-dark .ag-ltr .ag-group-title-bar-icon, .ag-theme-quartz-auto-dark .ag-ltr .ag-group-title-bar-icon {\n margin-right: var(--ag-grid-size);\n}\n\n.ag-theme-quartz .ag-rtl .ag-group-title-bar-icon, .ag-theme-quartz-dark .ag-rtl .ag-group-title-bar-icon, .ag-theme-quartz-auto-dark .ag-rtl .ag-group-title-bar-icon {\n margin-left: var(--ag-grid-size);\n}\n\n.ag-theme-quartz .ag-spectrum-color,\n.ag-theme-quartz .ag-spectrum-fill,\n.ag-theme-quartz-dark .ag-spectrum-color,\n.ag-theme-quartz-dark .ag-spectrum-fill,\n.ag-theme-quartz-auto-dark .ag-spectrum-color,\n.ag-theme-quartz-auto-dark .ag-spectrum-fill {\n border-radius: var(--ag-border-radius);\n}\n.ag-theme-quartz .ag-spectrum-dragger,\n.ag-theme-quartz-dark .ag-spectrum-dragger,\n.ag-theme-quartz-auto-dark .ag-spectrum-dragger {\n border-radius: 18px;\n height: 18px;\n width: 18px;\n border: 3px solid white;\n}\n.ag-theme-quartz .ag-spectrum-tools,\n.ag-theme-quartz-dark .ag-spectrum-tools,\n.ag-theme-quartz-auto-dark .ag-spectrum-tools {\n padding-left: 0;\n padding-right: 0;\n padding-bottom: 0;\n}\n.ag-theme-quartz .ag-spectrum-tool,\n.ag-theme-quartz-dark .ag-spectrum-tool,\n.ag-theme-quartz-auto-dark .ag-spectrum-tool {\n height: 12px;\n}\n.ag-theme-quartz .ag-spectrum-hue-background,\n.ag-theme-quartz .ag-spectrum-alpha-background,\n.ag-theme-quartz-dark .ag-spectrum-hue-background,\n.ag-theme-quartz-dark .ag-spectrum-alpha-background,\n.ag-theme-quartz-auto-dark .ag-spectrum-hue-background,\n.ag-theme-quartz-auto-dark .ag-spectrum-alpha-background {\n border-radius: 12px;\n}\n.ag-theme-quartz .ag-spectrum-slider,\n.ag-theme-quartz-dark .ag-spectrum-slider,\n.ag-theme-quartz-auto-dark .ag-spectrum-slider {\n margin-top: -15px;\n width: 18px;\n height: 18px;\n border-radius: 18px;\n border: 3px solid rgb(248, 248, 248);\n}\n.ag-theme-quartz .ag-recent-colors,\n.ag-theme-quartz-dark .ag-recent-colors,\n.ag-theme-quartz-auto-dark .ag-recent-colors {\n margin-left: var(--ag-grid-size);\n margin-right: var(--ag-grid-size);\n margin-bottom: 2px;\n}\n.ag-theme-quartz .ag-color-input-color,\n.ag-theme-quartz .ag-color-picker-color,\n.ag-theme-quartz .ag-recent-color,\n.ag-theme-quartz-dark .ag-color-input-color,\n.ag-theme-quartz-dark .ag-color-picker-color,\n.ag-theme-quartz-dark .ag-recent-color,\n.ag-theme-quartz-auto-dark .ag-color-input-color,\n.ag-theme-quartz-auto-dark .ag-color-picker-color,\n.ag-theme-quartz-auto-dark .ag-recent-color {\n border-radius: 4px;\n}\n.ag-theme-quartz .ag-recent-color,\n.ag-theme-quartz-dark .ag-recent-color,\n.ag-theme-quartz-auto-dark .ag-recent-color {\n border: var(--ag-borders-secondary) var(--ag-secondary-border-color);\n}\n.ag-theme-quartz.ag-dnd-ghost,\n.ag-theme-quartz-dark.ag-dnd-ghost,\n.ag-theme-quartz-auto-dark.ag-dnd-ghost {\n font-weight: 500;\n}\n.ag-theme-quartz .ag-standard-button,\n.ag-theme-quartz-dark .ag-standard-button,\n.ag-theme-quartz-auto-dark .ag-standard-button {\n font-family: inherit;\n appearance: none;\n -webkit-appearance: none;\n border-radius: var(--ag-border-radius);\n border: solid 1px var(--ag-input-border-color);\n background-color: var(--ag-background-color);\n padding: var(--ag-grid-size) calc(var(--ag-grid-size) * 2);\n cursor: pointer;\n}\n.ag-theme-quartz .ag-standard-button:hover,\n.ag-theme-quartz-dark .ag-standard-button:hover,\n.ag-theme-quartz-auto-dark .ag-standard-button:hover {\n background-color: var(--ag-row-hover-color);\n}\n.ag-theme-quartz .ag-standard-button:active,\n.ag-theme-quartz-dark .ag-standard-button:active,\n.ag-theme-quartz-auto-dark .ag-standard-button:active {\n border-color: var(--ag-active-color);\n}\n.ag-theme-quartz .ag-standard-button:disabled,\n.ag-theme-quartz-dark .ag-standard-button:disabled,\n.ag-theme-quartz-auto-dark .ag-standard-button:disabled {\n color: var(--ag-disabled-foreground-color);\n background-color: var(--ag-input-disabled-background-color);\n border-color: var(--ag-input-disabled-border-color);\n}\n.ag-theme-quartz .ag-column-drop-cell,\n.ag-theme-quartz-dark .ag-column-drop-cell,\n.ag-theme-quartz-auto-dark .ag-column-drop-cell {\n border-radius: calc(var(--ag-grid-size) * 3);\n height: calc(var(--ag-grid-size) * 3);\n padding: 0 var(--ag-grid-size);\n}\n.ag-theme-quartz .ag-column-drop-cell-button,\n.ag-theme-quartz-dark .ag-column-drop-cell-button,\n.ag-theme-quartz-auto-dark .ag-column-drop-cell-button {\n min-width: 0;\n margin: 0;\n}\n.ag-theme-quartz .ag-column-drop-cell-drag-handle,\n.ag-theme-quartz-dark .ag-column-drop-cell-drag-handle,\n.ag-theme-quartz-auto-dark .ag-column-drop-cell-drag-handle {\n margin-left: 0;\n}\n.ag-theme-quartz .ag-column-drop-vertical,\n.ag-theme-quartz-dark .ag-column-drop-vertical,\n.ag-theme-quartz-auto-dark .ag-column-drop-vertical {\n min-height: 75px;\n}\n.ag-theme-quartz .ag-column-drop-vertical-title-bar,\n.ag-theme-quartz-dark .ag-column-drop-vertical-title-bar,\n.ag-theme-quartz-auto-dark .ag-column-drop-vertical-title-bar {\n padding: var(--ag-widget-container-vertical-padding) calc(var(--ag-grid-size) * 2) 0;\n}\n.ag-theme-quartz .ag-ltr .ag-column-drop-vertical-icon, .ag-theme-quartz-dark .ag-ltr .ag-column-drop-vertical-icon, .ag-theme-quartz-auto-dark .ag-ltr .ag-column-drop-vertical-icon {\n margin-left: 0;\n margin-right: var(--ag-widget-horizontal-spacing);\n}\n\n.ag-theme-quartz .ag-rtl .ag-column-drop-vertical-icon, .ag-theme-quartz-dark .ag-rtl .ag-column-drop-vertical-icon, .ag-theme-quartz-auto-dark .ag-rtl .ag-column-drop-vertical-icon {\n margin-right: 0;\n margin-left: var(--ag-widget-horizontal-spacing);\n}\n\n.ag-theme-quartz .ag-column-drop-vertical-empty-message,\n.ag-theme-quartz-dark .ag-column-drop-vertical-empty-message,\n.ag-theme-quartz-auto-dark .ag-column-drop-vertical-empty-message {\n display: flex;\n align-items: center;\n justify-content: center;\n border: dashed 1px;\n border-color: var(--ag-border-color);\n margin: calc(var(--ag-grid-size) * 1.5) calc(var(--ag-grid-size) * 2);\n padding: calc(var(--ag-grid-size) * 2);\n}\n.ag-theme-quartz .ag-column-drop-empty-message,\n.ag-theme-quartz-dark .ag-column-drop-empty-message,\n.ag-theme-quartz-auto-dark .ag-column-drop-empty-message {\n color: var(--ag-foreground-color);\n}\n.ag-theme-quartz .ag-pill-select .ag-column-drop,\n.ag-theme-quartz-dark .ag-pill-select .ag-column-drop,\n.ag-theme-quartz-auto-dark .ag-pill-select .ag-column-drop {\n min-height: unset;\n}\n.ag-theme-quartz .ag-pill-select .ag-picker-field-display,\n.ag-theme-quartz-dark .ag-pill-select .ag-picker-field-display,\n.ag-theme-quartz-auto-dark .ag-pill-select .ag-picker-field-display {\n font-weight: 500;\n color: var(--ag-chart-menu-pill-select-button-color);\n}\n.ag-theme-quartz .ag-pill-select .ag-picker-field-icon .ag-icon,\n.ag-theme-quartz-dark .ag-pill-select .ag-picker-field-icon .ag-icon,\n.ag-theme-quartz-auto-dark .ag-pill-select .ag-picker-field-icon .ag-icon {\n color: var(--ag-chart-menu-pill-select-button-color);\n}\n.ag-theme-quartz .ag-status-bar,\n.ag-theme-quartz-dark .ag-status-bar,\n.ag-theme-quartz-auto-dark .ag-status-bar {\n font-weight: normal;\n}\n.ag-theme-quartz .ag-status-name-value,\n.ag-theme-quartz-dark .ag-status-name-value,\n.ag-theme-quartz-auto-dark .ag-status-name-value {\n padding: var(--ag-widget-container-vertical-padding) 0;\n}\n.ag-theme-quartz .ag-status-name-value-value,\n.ag-theme-quartz .ag-paging-number,\n.ag-theme-quartz .ag-paging-row-summary-panel-number,\n.ag-theme-quartz-dark .ag-status-name-value-value,\n.ag-theme-quartz-dark .ag-paging-number,\n.ag-theme-quartz-dark .ag-paging-row-summary-panel-number,\n.ag-theme-quartz-auto-dark .ag-status-name-value-value,\n.ag-theme-quartz-auto-dark .ag-paging-number,\n.ag-theme-quartz-auto-dark .ag-paging-row-summary-panel-number {\n font-weight: 500;\n}\n.ag-theme-quartz .ag-column-drop-cell-button,\n.ag-theme-quartz-dark .ag-column-drop-cell-button,\n.ag-theme-quartz-auto-dark .ag-column-drop-cell-button {\n opacity: 0.75;\n}\n.ag-theme-quartz .ag-column-drop-cell-button:hover,\n.ag-theme-quartz-dark .ag-column-drop-cell-button:hover,\n.ag-theme-quartz-auto-dark .ag-column-drop-cell-button:hover {\n opacity: 1;\n}\n.ag-theme-quartz .ag-header-cell-menu-button,\n.ag-theme-quartz .ag-header-cell-filter-button,\n.ag-theme-quartz .ag-panel-title-bar-button,\n.ag-theme-quartz .ag-header-expand-icon,\n.ag-theme-quartz .ag-column-group-icons,\n.ag-theme-quartz .ag-set-filter-group-icons,\n.ag-theme-quartz .ag-group-expanded .ag-icon,\n.ag-theme-quartz .ag-group-contracted .ag-icon,\n.ag-theme-quartz .ag-chart-settings-prev,\n.ag-theme-quartz .ag-chart-settings-next,\n.ag-theme-quartz .ag-group-title-bar-icon,\n.ag-theme-quartz .ag-column-select-header-icon,\n.ag-theme-quartz .ag-floating-filter-button-button,\n.ag-theme-quartz .ag-filter-toolpanel-expand,\n.ag-theme-quartz .ag-panel-title-bar-button-icon,\n.ag-theme-quartz .ag-chart-menu-icon,\n.ag-theme-quartz-dark .ag-header-cell-menu-button,\n.ag-theme-quartz-dark .ag-header-cell-filter-button,\n.ag-theme-quartz-dark .ag-panel-title-bar-button,\n.ag-theme-quartz-dark .ag-header-expand-icon,\n.ag-theme-quartz-dark .ag-column-group-icons,\n.ag-theme-quartz-dark .ag-set-filter-group-icons,\n.ag-theme-quartz-dark .ag-group-expanded .ag-icon,\n.ag-theme-quartz-dark .ag-group-contracted .ag-icon,\n.ag-theme-quartz-dark .ag-chart-settings-prev,\n.ag-theme-quartz-dark .ag-chart-settings-next,\n.ag-theme-quartz-dark .ag-group-title-bar-icon,\n.ag-theme-quartz-dark .ag-column-select-header-icon,\n.ag-theme-quartz-dark .ag-floating-filter-button-button,\n.ag-theme-quartz-dark .ag-filter-toolpanel-expand,\n.ag-theme-quartz-dark .ag-panel-title-bar-button-icon,\n.ag-theme-quartz-dark .ag-chart-menu-icon,\n.ag-theme-quartz-auto-dark .ag-header-cell-menu-button,\n.ag-theme-quartz-auto-dark .ag-header-cell-filter-button,\n.ag-theme-quartz-auto-dark .ag-panel-title-bar-button,\n.ag-theme-quartz-auto-dark .ag-header-expand-icon,\n.ag-theme-quartz-auto-dark .ag-column-group-icons,\n.ag-theme-quartz-auto-dark .ag-set-filter-group-icons,\n.ag-theme-quartz-auto-dark .ag-group-expanded .ag-icon,\n.ag-theme-quartz-auto-dark .ag-group-contracted .ag-icon,\n.ag-theme-quartz-auto-dark .ag-chart-settings-prev,\n.ag-theme-quartz-auto-dark .ag-chart-settings-next,\n.ag-theme-quartz-auto-dark .ag-group-title-bar-icon,\n.ag-theme-quartz-auto-dark .ag-column-select-header-icon,\n.ag-theme-quartz-auto-dark .ag-floating-filter-button-button,\n.ag-theme-quartz-auto-dark .ag-filter-toolpanel-expand,\n.ag-theme-quartz-auto-dark .ag-panel-title-bar-button-icon,\n.ag-theme-quartz-auto-dark .ag-chart-menu-icon {\n --ag-quartz-icon-hover-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 10%);\n}\n.ag-theme-quartz .ag-header-cell-menu-button:hover,\n.ag-theme-quartz .ag-header-cell-filter-button:hover,\n.ag-theme-quartz .ag-panel-title-bar-button:hover,\n.ag-theme-quartz .ag-header-expand-icon:hover,\n.ag-theme-quartz .ag-column-group-icons:hover,\n.ag-theme-quartz .ag-set-filter-group-icons:hover,\n.ag-theme-quartz .ag-group-expanded .ag-icon:hover,\n.ag-theme-quartz .ag-group-contracted .ag-icon:hover,\n.ag-theme-quartz .ag-chart-settings-prev:hover,\n.ag-theme-quartz .ag-chart-settings-next:hover,\n.ag-theme-quartz .ag-group-title-bar-icon:hover,\n.ag-theme-quartz .ag-column-select-header-icon:hover,\n.ag-theme-quartz .ag-floating-filter-button-button:hover,\n.ag-theme-quartz .ag-filter-toolpanel-expand:hover,\n.ag-theme-quartz .ag-panel-title-bar-button-icon:hover,\n.ag-theme-quartz .ag-chart-menu-icon:hover,\n.ag-theme-quartz-dark .ag-header-cell-menu-button:hover,\n.ag-theme-quartz-dark .ag-header-cell-filter-button:hover,\n.ag-theme-quartz-dark .ag-panel-title-bar-button:hover,\n.ag-theme-quartz-dark .ag-header-expand-icon:hover,\n.ag-theme-quartz-dark .ag-column-group-icons:hover,\n.ag-theme-quartz-dark .ag-set-filter-group-icons:hover,\n.ag-theme-quartz-dark .ag-group-expanded .ag-icon:hover,\n.ag-theme-quartz-dark .ag-group-contracted .ag-icon:hover,\n.ag-theme-quartz-dark .ag-chart-settings-prev:hover,\n.ag-theme-quartz-dark .ag-chart-settings-next:hover,\n.ag-theme-quartz-dark .ag-group-title-bar-icon:hover,\n.ag-theme-quartz-dark .ag-column-select-header-icon:hover,\n.ag-theme-quartz-dark .ag-floating-filter-button-button:hover,\n.ag-theme-quartz-dark .ag-filter-toolpanel-expand:hover,\n.ag-theme-quartz-dark .ag-panel-title-bar-button-icon:hover,\n.ag-theme-quartz-dark .ag-chart-menu-icon:hover,\n.ag-theme-quartz-auto-dark .ag-header-cell-menu-button:hover,\n.ag-theme-quartz-auto-dark .ag-header-cell-filter-button:hover,\n.ag-theme-quartz-auto-dark .ag-panel-title-bar-button:hover,\n.ag-theme-quartz-auto-dark .ag-header-expand-icon:hover,\n.ag-theme-quartz-auto-dark .ag-column-group-icons:hover,\n.ag-theme-quartz-auto-dark .ag-set-filter-group-icons:hover,\n.ag-theme-quartz-auto-dark .ag-group-expanded .ag-icon:hover,\n.ag-theme-quartz-auto-dark .ag-group-contracted .ag-icon:hover,\n.ag-theme-quartz-auto-dark .ag-chart-settings-prev:hover,\n.ag-theme-quartz-auto-dark .ag-chart-settings-next:hover,\n.ag-theme-quartz-auto-dark .ag-group-title-bar-icon:hover,\n.ag-theme-quartz-auto-dark .ag-column-select-header-icon:hover,\n.ag-theme-quartz-auto-dark .ag-floating-filter-button-button:hover,\n.ag-theme-quartz-auto-dark .ag-filter-toolpanel-expand:hover,\n.ag-theme-quartz-auto-dark .ag-panel-title-bar-button-icon:hover,\n.ag-theme-quartz-auto-dark .ag-chart-menu-icon:hover {\n border-radius: 1px;\n background-color: var(--ag-quartz-icon-hover-color);\n box-shadow: 0 0 0 4px var(--ag-quartz-icon-hover-color);\n}\n.ag-theme-quartz .ag-filter-active,\n.ag-theme-quartz-dark .ag-filter-active,\n.ag-theme-quartz-auto-dark .ag-filter-active {\n --ag-quartz-icon-active-color: color-mix(in srgb, transparent, var(--ag-active-color) 14%);\n --ag-quartz-icon-hover-color: color-mix(in srgb, transparent, var(--ag-active-color) 28%);\n position: relative;\n border-radius: 1px;\n background-color: var(--ag-quartz-icon-active-color);\n box-shadow: 0 0 0 4px var(--ag-quartz-icon-active-color);\n}\n.ag-theme-quartz .ag-filter-active::after,\n.ag-theme-quartz-dark .ag-filter-active::after,\n.ag-theme-quartz-auto-dark .ag-filter-active::after {\n content: \"\";\n position: absolute;\n width: 6px;\n height: 6px;\n top: -1px;\n right: -1px;\n border-radius: 50%;\n background-color: var(--ag-active-color);\n}\n.ag-theme-quartz .ag-filter-active .ag-icon-filter,\n.ag-theme-quartz-dark .ag-filter-active .ag-icon-filter,\n.ag-theme-quartz-auto-dark .ag-filter-active .ag-icon-filter {\n clip-path: path(\"M8,0C8,4.415 11.585,8 16,8L16,16L0,16L0,0L8,0Z\");\n}\n.ag-theme-quartz .ag-chart-menu,\n.ag-theme-quartz-dark .ag-chart-menu,\n.ag-theme-quartz-auto-dark .ag-chart-menu {\n --ag-icon-size: 20px;\n background-color: color-mix(in srgb, transparent, var(--ag-background-color) 30%);\n padding: 4px 2px;\n}\n.ag-theme-quartz .ag-chart-menu-icon,\n.ag-theme-quartz-dark .ag-chart-menu-icon,\n.ag-theme-quartz-auto-dark .ag-chart-menu-icon {\n opacity: 0.8;\n}\n.ag-theme-quartz .ag-drag-handle,\n.ag-theme-quartz-dark .ag-drag-handle,\n.ag-theme-quartz-auto-dark .ag-drag-handle {\n color: var(--ag-icon-font-color);\n}\n.ag-theme-quartz .ag-menu-option-icon,\n.ag-theme-quartz .ag-compact-menu-option-icon,\n.ag-theme-quartz-dark .ag-menu-option-icon,\n.ag-theme-quartz-dark .ag-compact-menu-option-icon,\n.ag-theme-quartz-auto-dark .ag-menu-option-icon,\n.ag-theme-quartz-auto-dark .ag-compact-menu-option-icon {\n width: var(--ag-icon-size);\n cursor: pointer;\n}\n.ag-theme-quartz .ag-ltr .ag-menu-option-icon, .ag-theme-quartz .ag-ltr .ag-compact-menu-option-icon, .ag-theme-quartz-dark .ag-ltr .ag-menu-option-icon, .ag-theme-quartz-dark .ag-ltr .ag-compact-menu-option-icon, .ag-theme-quartz-auto-dark .ag-ltr .ag-menu-option-icon, .ag-theme-quartz-auto-dark .ag-ltr .ag-compact-menu-option-icon {\n padding-left: calc(var(--ag-grid-size) * 1.5);\n}\n\n.ag-theme-quartz .ag-rtl .ag-menu-option-icon, .ag-theme-quartz .ag-rtl .ag-compact-menu-option-icon, .ag-theme-quartz-dark .ag-rtl .ag-menu-option-icon, .ag-theme-quartz-dark .ag-rtl .ag-compact-menu-option-icon, .ag-theme-quartz-auto-dark .ag-rtl .ag-menu-option-icon, .ag-theme-quartz-auto-dark .ag-rtl .ag-compact-menu-option-icon {\n padding-right: calc(var(--ag-grid-size) * 1.5);\n}\n\n.ag-theme-quartz .ag-chart-settings-card-item.ag-not-selected:hover,\n.ag-theme-quartz-dark .ag-chart-settings-card-item.ag-not-selected:hover,\n.ag-theme-quartz-auto-dark .ag-chart-settings-card-item.ag-not-selected:hover {\n opacity: 0.35;\n}\n.ag-theme-quartz .ag-ltr .ag-panel-title-bar-button, .ag-theme-quartz-dark .ag-ltr .ag-panel-title-bar-button, .ag-theme-quartz-auto-dark .ag-ltr .ag-panel-title-bar-button {\n margin-left: calc(var(--ag-grid-size) * 2);\n margin-right: var(--ag-grid-size);\n}\n\n.ag-theme-quartz .ag-rtl .ag-panel-title-bar-button, .ag-theme-quartz-dark .ag-rtl .ag-panel-title-bar-button, .ag-theme-quartz-auto-dark .ag-rtl .ag-panel-title-bar-button {\n margin-right: calc(var(--ag-grid-size) * 2);\n margin-left: var(--ag-grid-size);\n}\n\n.ag-theme-quartz .ag-multi-filter-group-title-bar,\n.ag-theme-quartz-dark .ag-multi-filter-group-title-bar,\n.ag-theme-quartz-auto-dark .ag-multi-filter-group-title-bar {\n padding: calc(var(--ag-grid-size) * 1.5) var(--ag-grid-size);\n}\n.ag-theme-quartz .ag-ltr .ag-filter-toolpanel-instance-body, .ag-theme-quartz-dark .ag-ltr .ag-filter-toolpanel-instance-body, .ag-theme-quartz-auto-dark .ag-ltr .ag-filter-toolpanel-instance-body {\n padding-left: var(--ag-grid-size);\n}\n\n.ag-theme-quartz .ag-rtl .ag-filter-toolpanel-instance-body, .ag-theme-quartz-dark .ag-rtl .ag-filter-toolpanel-instance-body, .ag-theme-quartz-auto-dark .ag-rtl .ag-filter-toolpanel-instance-body {\n padding-right: var(--ag-grid-size);\n}\n\n.ag-theme-quartz .ag-filter-toolpanel-instance-filter,\n.ag-theme-quartz-dark .ag-filter-toolpanel-instance-filter,\n.ag-theme-quartz-auto-dark .ag-filter-toolpanel-instance-filter {\n border: none;\n background-color: var(--ag-control-panel-background-color);\n}\n.ag-theme-quartz .ag-ltr .ag-filter-toolpanel-instance-filter, .ag-theme-quartz-dark .ag-ltr .ag-filter-toolpanel-instance-filter, .ag-theme-quartz-auto-dark .ag-ltr .ag-filter-toolpanel-instance-filter {\n margin-left: calc(var(--ag-icon-size) * 0.5);\n}\n\n.ag-theme-quartz .ag-rtl .ag-filter-toolpanel-instance-filter, .ag-theme-quartz-dark .ag-rtl .ag-filter-toolpanel-instance-filter, .ag-theme-quartz-auto-dark .ag-rtl .ag-filter-toolpanel-instance-filter {\n margin-right: calc(var(--ag-icon-size) * 0.5);\n}\n\n.ag-theme-quartz .ag-filter-toolpanel-group-level-0,\n.ag-theme-quartz-dark .ag-filter-toolpanel-group-level-0,\n.ag-theme-quartz-auto-dark .ag-filter-toolpanel-group-level-0 {\n border-top: none;\n}\n.ag-theme-quartz .ag-filter-toolpanel-header,\n.ag-theme-quartz-dark .ag-filter-toolpanel-header,\n.ag-theme-quartz-auto-dark .ag-filter-toolpanel-header {\n height: initial;\n padding-top: var(--ag-grid-size);\n padding-bottom: var(--ag-grid-size);\n}\n.ag-theme-quartz .ag-filter-toolpanel-group-item,\n.ag-theme-quartz-dark .ag-filter-toolpanel-group-item,\n.ag-theme-quartz-auto-dark .ag-filter-toolpanel-group-item {\n margin: 0;\n}\n.ag-theme-quartz .ag-layout-auto-height .ag-center-cols-viewport,\n.ag-theme-quartz .ag-layout-auto-height .ag-center-cols-container,\n.ag-theme-quartz .ag-layout-print .ag-center-cols-viewport,\n.ag-theme-quartz .ag-layout-print .ag-center-cols-container,\n.ag-theme-quartz-dark .ag-layout-auto-height .ag-center-cols-viewport,\n.ag-theme-quartz-dark .ag-layout-auto-height .ag-center-cols-container,\n.ag-theme-quartz-dark .ag-layout-print .ag-center-cols-viewport,\n.ag-theme-quartz-dark .ag-layout-print .ag-center-cols-container,\n.ag-theme-quartz-auto-dark .ag-layout-auto-height .ag-center-cols-viewport,\n.ag-theme-quartz-auto-dark .ag-layout-auto-height .ag-center-cols-container,\n.ag-theme-quartz-auto-dark .ag-layout-print .ag-center-cols-viewport,\n.ag-theme-quartz-auto-dark .ag-layout-print .ag-center-cols-container {\n min-height: 150px;\n}\n.ag-theme-quartz .ag-date-time-list-page-entry-is-current,\n.ag-theme-quartz-dark .ag-date-time-list-page-entry-is-current,\n.ag-theme-quartz-auto-dark .ag-date-time-list-page-entry-is-current {\n background-color: var(--ag-active-color);\n}\n.ag-theme-quartz .ag-advanced-filter-builder-button,\n.ag-theme-quartz-dark .ag-advanced-filter-builder-button,\n.ag-theme-quartz-auto-dark .ag-advanced-filter-builder-button {\n padding: var(--ag-grid-size);\n font-weight: 600;\n}\n.ag-theme-quartz .ag-advanced-filter-builder-item-button-disabled .ag-icon,\n.ag-theme-quartz .ag-disabled .ag-icon,\n.ag-theme-quartz .ag-column-select-column-group-readonly .ag-icon,\n.ag-theme-quartz [disabled] .ag-icon,\n.ag-theme-quartz-dark .ag-advanced-filter-builder-item-button-disabled .ag-icon,\n.ag-theme-quartz-dark .ag-disabled .ag-icon,\n.ag-theme-quartz-dark .ag-column-select-column-group-readonly .ag-icon,\n.ag-theme-quartz-dark [disabled] .ag-icon,\n.ag-theme-quartz-auto-dark .ag-advanced-filter-builder-item-button-disabled .ag-icon,\n.ag-theme-quartz-auto-dark .ag-disabled .ag-icon,\n.ag-theme-quartz-auto-dark .ag-column-select-column-group-readonly .ag-icon,\n.ag-theme-quartz-auto-dark [disabled] .ag-icon {\n opacity: 0.6;\n}\n.ag-theme-quartz .ag-icon-grip,\n.ag-theme-quartz-dark .ag-icon-grip,\n.ag-theme-quartz-auto-dark .ag-icon-grip {\n opacity: 0.7;\n}\n.ag-theme-quartz .ag-column-select-column-readonly.ag-icon-grip,\n.ag-theme-quartz .ag-column-select-column-readonly .ag-icon-grip,\n.ag-theme-quartz-dark .ag-column-select-column-readonly.ag-icon-grip,\n.ag-theme-quartz-dark .ag-column-select-column-readonly .ag-icon-grip,\n.ag-theme-quartz-auto-dark .ag-column-select-column-readonly.ag-icon-grip,\n.ag-theme-quartz-auto-dark .ag-column-select-column-readonly .ag-icon-grip {\n opacity: 0.35;\n}\n.ag-theme-quartz .ag-column-select-header-filter-wrapper .ag-input-wrapper::before,\n.ag-theme-quartz .ag-filter-toolpanel-search .ag-input-wrapper::before,\n.ag-theme-quartz .ag-mini-filter .ag-input-wrapper::before,\n.ag-theme-quartz .ag-filter-filter .ag-input-wrapper::before,\n.ag-theme-quartz-dark .ag-column-select-header-filter-wrapper .ag-input-wrapper::before,\n.ag-theme-quartz-dark .ag-filter-toolpanel-search .ag-input-wrapper::before,\n.ag-theme-quartz-dark .ag-mini-filter .ag-input-wrapper::before,\n.ag-theme-quartz-dark .ag-filter-filter .ag-input-wrapper::before,\n.ag-theme-quartz-auto-dark .ag-column-select-header-filter-wrapper .ag-input-wrapper::before,\n.ag-theme-quartz-auto-dark .ag-filter-toolpanel-search .ag-input-wrapper::before,\n.ag-theme-quartz-auto-dark .ag-mini-filter .ag-input-wrapper::before,\n.ag-theme-quartz-auto-dark .ag-filter-filter .ag-input-wrapper::before {\n position: absolute;\n display: block;\n width: 12px;\n height: 12px;\n background-image: url(" + ___CSS_LOADER_URL_REPLACEMENT_1___ + ");\n background-position: 50% 50%;\n background-size: contain;\n opacity: 40%;\n content: \"\";\n filter: var(--ag-icon-filter);\n}\n.ag-theme-quartz .ag-ltr .ag-column-select-header-filter-wrapper .ag-input-wrapper::before, .ag-theme-quartz .ag-ltr .ag-filter-toolpanel-search .ag-input-wrapper::before, .ag-theme-quartz .ag-ltr .ag-mini-filter .ag-input-wrapper::before, .ag-theme-quartz .ag-ltr .ag-filter-filter .ag-input-wrapper::before, .ag-theme-quartz-dark .ag-ltr .ag-column-select-header-filter-wrapper .ag-input-wrapper::before, .ag-theme-quartz-dark .ag-ltr .ag-filter-toolpanel-search .ag-input-wrapper::before, .ag-theme-quartz-dark .ag-ltr .ag-mini-filter .ag-input-wrapper::before, .ag-theme-quartz-dark .ag-ltr .ag-filter-filter .ag-input-wrapper::before, .ag-theme-quartz-auto-dark .ag-ltr .ag-column-select-header-filter-wrapper .ag-input-wrapper::before, .ag-theme-quartz-auto-dark .ag-ltr .ag-filter-toolpanel-search .ag-input-wrapper::before, .ag-theme-quartz-auto-dark .ag-ltr .ag-mini-filter .ag-input-wrapper::before, .ag-theme-quartz-auto-dark .ag-ltr .ag-filter-filter .ag-input-wrapper::before {\n margin-left: var(--ag-grid-size);\n}\n\n.ag-theme-quartz .ag-rtl .ag-column-select-header-filter-wrapper .ag-input-wrapper::before, .ag-theme-quartz .ag-rtl .ag-filter-toolpanel-search .ag-input-wrapper::before, .ag-theme-quartz .ag-rtl .ag-mini-filter .ag-input-wrapper::before, .ag-theme-quartz .ag-rtl .ag-filter-filter .ag-input-wrapper::before, .ag-theme-quartz-dark .ag-rtl .ag-column-select-header-filter-wrapper .ag-input-wrapper::before, .ag-theme-quartz-dark .ag-rtl .ag-filter-toolpanel-search .ag-input-wrapper::before, .ag-theme-quartz-dark .ag-rtl .ag-mini-filter .ag-input-wrapper::before, .ag-theme-quartz-dark .ag-rtl .ag-filter-filter .ag-input-wrapper::before, .ag-theme-quartz-auto-dark .ag-rtl .ag-column-select-header-filter-wrapper .ag-input-wrapper::before, .ag-theme-quartz-auto-dark .ag-rtl .ag-filter-toolpanel-search .ag-input-wrapper::before, .ag-theme-quartz-auto-dark .ag-rtl .ag-mini-filter .ag-input-wrapper::before, .ag-theme-quartz-auto-dark .ag-rtl .ag-filter-filter .ag-input-wrapper::before {\n margin-right: var(--ag-grid-size);\n}\n\n.ag-theme-quartz .ag-ltr .ag-column-select-header-filter-wrapper input.ag-text-field-input, .ag-theme-quartz .ag-ltr .ag-column-select-header-filter-wrapper input.ag-number-field-input, .ag-theme-quartz .ag-ltr .ag-filter-toolpanel-search input.ag-text-field-input, .ag-theme-quartz .ag-ltr .ag-filter-toolpanel-search input.ag-number-field-input, .ag-theme-quartz .ag-ltr .ag-mini-filter input.ag-text-field-input, .ag-theme-quartz .ag-ltr .ag-mini-filter input.ag-number-field-input, .ag-theme-quartz .ag-ltr .ag-filter-filter input.ag-text-field-input, .ag-theme-quartz .ag-ltr .ag-filter-filter input.ag-number-field-input, .ag-theme-quartz-dark .ag-ltr .ag-column-select-header-filter-wrapper input.ag-text-field-input, .ag-theme-quartz-dark .ag-ltr .ag-column-select-header-filter-wrapper input.ag-number-field-input, .ag-theme-quartz-dark .ag-ltr .ag-filter-toolpanel-search input.ag-text-field-input, .ag-theme-quartz-dark .ag-ltr .ag-filter-toolpanel-search input.ag-number-field-input, .ag-theme-quartz-dark .ag-ltr .ag-mini-filter input.ag-text-field-input, .ag-theme-quartz-dark .ag-ltr .ag-mini-filter input.ag-number-field-input, .ag-theme-quartz-dark .ag-ltr .ag-filter-filter input.ag-text-field-input, .ag-theme-quartz-dark .ag-ltr .ag-filter-filter input.ag-number-field-input, .ag-theme-quartz-auto-dark .ag-ltr .ag-column-select-header-filter-wrapper input.ag-text-field-input, .ag-theme-quartz-auto-dark .ag-ltr .ag-column-select-header-filter-wrapper input.ag-number-field-input, .ag-theme-quartz-auto-dark .ag-ltr .ag-filter-toolpanel-search input.ag-text-field-input, .ag-theme-quartz-auto-dark .ag-ltr .ag-filter-toolpanel-search input.ag-number-field-input, .ag-theme-quartz-auto-dark .ag-ltr .ag-mini-filter input.ag-text-field-input, .ag-theme-quartz-auto-dark .ag-ltr .ag-mini-filter input.ag-number-field-input, .ag-theme-quartz-auto-dark .ag-ltr .ag-filter-filter input.ag-text-field-input, .ag-theme-quartz-auto-dark .ag-ltr .ag-filter-filter input.ag-number-field-input {\n padding-left: 26px;\n}\n\n.ag-theme-quartz .ag-rtl .ag-column-select-header-filter-wrapper input.ag-text-field-input, .ag-theme-quartz .ag-rtl .ag-column-select-header-filter-wrapper input.ag-number-field-input, .ag-theme-quartz .ag-rtl .ag-filter-toolpanel-search input.ag-text-field-input, .ag-theme-quartz .ag-rtl .ag-filter-toolpanel-search input.ag-number-field-input, .ag-theme-quartz .ag-rtl .ag-mini-filter input.ag-text-field-input, .ag-theme-quartz .ag-rtl .ag-mini-filter input.ag-number-field-input, .ag-theme-quartz .ag-rtl .ag-filter-filter input.ag-text-field-input, .ag-theme-quartz .ag-rtl .ag-filter-filter input.ag-number-field-input, .ag-theme-quartz-dark .ag-rtl .ag-column-select-header-filter-wrapper input.ag-text-field-input, .ag-theme-quartz-dark .ag-rtl .ag-column-select-header-filter-wrapper input.ag-number-field-input, .ag-theme-quartz-dark .ag-rtl .ag-filter-toolpanel-search input.ag-text-field-input, .ag-theme-quartz-dark .ag-rtl .ag-filter-toolpanel-search input.ag-number-field-input, .ag-theme-quartz-dark .ag-rtl .ag-mini-filter input.ag-text-field-input, .ag-theme-quartz-dark .ag-rtl .ag-mini-filter input.ag-number-field-input, .ag-theme-quartz-dark .ag-rtl .ag-filter-filter input.ag-text-field-input, .ag-theme-quartz-dark .ag-rtl .ag-filter-filter input.ag-number-field-input, .ag-theme-quartz-auto-dark .ag-rtl .ag-column-select-header-filter-wrapper input.ag-text-field-input, .ag-theme-quartz-auto-dark .ag-rtl .ag-column-select-header-filter-wrapper input.ag-number-field-input, .ag-theme-quartz-auto-dark .ag-rtl .ag-filter-toolpanel-search input.ag-text-field-input, .ag-theme-quartz-auto-dark .ag-rtl .ag-filter-toolpanel-search input.ag-number-field-input, .ag-theme-quartz-auto-dark .ag-rtl .ag-mini-filter input.ag-text-field-input, .ag-theme-quartz-auto-dark .ag-rtl .ag-mini-filter input.ag-number-field-input, .ag-theme-quartz-auto-dark .ag-rtl .ag-filter-filter input.ag-text-field-input, .ag-theme-quartz-auto-dark .ag-rtl .ag-filter-filter input.ag-number-field-input {\n padding-right: 26px;\n}\n\n.ag-theme-quartz .ag-ltr .ag-column-select-add-group-indent, .ag-theme-quartz-dark .ag-ltr .ag-column-select-add-group-indent, .ag-theme-quartz-auto-dark .ag-ltr .ag-column-select-add-group-indent {\n margin-left: calc(var(--ag-icon-size) + var(--ag-grid-size) * 1.5);\n}\n\n.ag-theme-quartz .ag-rtl .ag-column-select-add-group-indent, .ag-theme-quartz-dark .ag-rtl .ag-column-select-add-group-indent, .ag-theme-quartz-auto-dark .ag-rtl .ag-column-select-add-group-indent {\n margin-right: calc(var(--ag-icon-size) + var(--ag-grid-size) * 1.5);\n}\n\n.ag-theme-quartz .ag-text-field-input[disabled],\n.ag-theme-quartz .ag-menu-option-disabled,\n.ag-theme-quartz-dark .ag-text-field-input[disabled],\n.ag-theme-quartz-dark .ag-menu-option-disabled,\n.ag-theme-quartz-auto-dark .ag-text-field-input[disabled],\n.ag-theme-quartz-auto-dark .ag-menu-option-disabled {\n cursor: not-allowed;\n}\n.ag-theme-quartz .ag-checkbox-input-wrapper.ag-checked.ag-disabled,\n.ag-theme-quartz-dark .ag-checkbox-input-wrapper.ag-checked.ag-disabled,\n.ag-theme-quartz-auto-dark .ag-checkbox-input-wrapper.ag-checked.ag-disabled {\n --ag-checkbox-checked-color: var(--ag-checkbox-unchecked-color);\n}\n.ag-theme-quartz .ag-checkbox-input,\n.ag-theme-quartz .ag-toggle-button-input,\n.ag-theme-quartz .ag-radio-button-input,\n.ag-theme-quartz input[class^=ag-][type=range],\n.ag-theme-quartz-dark .ag-checkbox-input,\n.ag-theme-quartz-dark .ag-toggle-button-input,\n.ag-theme-quartz-dark .ag-radio-button-input,\n.ag-theme-quartz-dark input[class^=ag-][type=range],\n.ag-theme-quartz-auto-dark .ag-checkbox-input,\n.ag-theme-quartz-auto-dark .ag-toggle-button-input,\n.ag-theme-quartz-auto-dark .ag-radio-button-input,\n.ag-theme-quartz-auto-dark input[class^=ag-][type=range] {\n cursor: pointer;\n}\n.ag-theme-quartz .ag-details-row,\n.ag-theme-quartz-dark .ag-details-row,\n.ag-theme-quartz-auto-dark .ag-details-row {\n padding: calc(var(--ag-grid-size) * 3.75);\n}\n.ag-theme-quartz .ag-list-item-hovered::after,\n.ag-theme-quartz-dark .ag-list-item-hovered::after,\n.ag-theme-quartz-auto-dark .ag-list-item-hovered::after {\n background-color: var(--ag-active-color);\n}\n.ag-theme-quartz .ag-pill .ag-pill-button:hover,\n.ag-theme-quartz-dark .ag-pill .ag-pill-button:hover,\n.ag-theme-quartz-auto-dark .ag-pill .ag-pill-button:hover {\n color: var(--ag-active-color);\n}\n.ag-theme-quartz .ag-header-highlight-before::after,\n.ag-theme-quartz .ag-header-highlight-after::after,\n.ag-theme-quartz-dark .ag-header-highlight-before::after,\n.ag-theme-quartz-dark .ag-header-highlight-after::after,\n.ag-theme-quartz-auto-dark .ag-header-highlight-before::after,\n.ag-theme-quartz-auto-dark .ag-header-highlight-after::after {\n background-color: var(--ag-active-color);\n}\n\n.ag-theme-quartz-dark .ag-column-select-header-filter-wrapper .ag-input-wrapper::before,\n.ag-theme-quartz-dark .ag-filter-toolpanel-search .ag-input-wrapper::before,\n.ag-theme-quartz-dark .ag-mini-filter .ag-input-wrapper::before,\n.ag-theme-quartz-dark .ag-filter-filter .ag-input-wrapper::before {\n opacity: 66%;\n filter: invert(100%);\n}\n.ag-theme-quartz-dark .ag-chart-menu {\n background-color: color-mix(in srgb, rgba(24, 39, 50, 0.3), var(--ag-background-color) 30%);\n}\n.ag-theme-quartz-dark .ag-text-field-input::placeholder {\n color: var(--ag-data-color);\n opacity: 0.8;\n}\n", ""]); // Exports /* harmony default export */ __webpack_exports__.A = (___CSS_LOADER_EXPORT___); /***/ }), /***/ 6049: /***/ (function(module, __webpack_exports__, __webpack_require__) { /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6758); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(935); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(62); /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__); // Imports var ___CSS_LOADER_URL_IMPORT_0___ = new URL(/* asset import */ __webpack_require__(8430), __webpack_require__.b); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); var ___CSS_LOADER_URL_REPLACEMENT_0___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_0___); // Module ___CSS_LOADER_EXPORT___.push([module.id, "@font-face {\n font-family: \"agGridAlpine\";\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_0___ + ");\n font-weight: normal;\n font-style: normal;\n}\n", ""]); // Exports /* harmony default export */ __webpack_exports__.A = (___CSS_LOADER_EXPORT___); /***/ }), /***/ 1365: /***/ (function(module, __webpack_exports__, __webpack_require__) { /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6758); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(935); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(62); /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__); // Imports var ___CSS_LOADER_URL_IMPORT_0___ = new URL(/* asset import */ __webpack_require__(9377), __webpack_require__.b); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); var ___CSS_LOADER_URL_REPLACEMENT_0___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_0___); // Module ___CSS_LOADER_EXPORT___.push([module.id, "@font-face {\n font-family: \"agGridBalham\";\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_0___ + ");\n font-weight: normal;\n font-style: normal;\n}\n", ""]); // Exports /* harmony default export */ __webpack_exports__.A = (___CSS_LOADER_EXPORT___); /***/ }), /***/ 492: /***/ (function(module, __webpack_exports__, __webpack_require__) { /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6758); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(935); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(62); /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__); // Imports var ___CSS_LOADER_URL_IMPORT_0___ = new URL(/* asset import */ __webpack_require__(7738), __webpack_require__.b); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); var ___CSS_LOADER_URL_REPLACEMENT_0___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_0___); // Module ___CSS_LOADER_EXPORT___.push([module.id, "@font-face {\n font-family: \"agGridClassic\";\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_0___ + ");\n font-weight: normal;\n font-style: normal;\n}\n", ""]); // Exports /* harmony default export */ __webpack_exports__.A = (___CSS_LOADER_EXPORT___); /***/ }), /***/ 31: /***/ (function(module, __webpack_exports__, __webpack_require__) { /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6758); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(935); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(62); /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__); // Imports var ___CSS_LOADER_URL_IMPORT_0___ = new URL(/* asset import */ __webpack_require__(6055), __webpack_require__.b); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); var ___CSS_LOADER_URL_REPLACEMENT_0___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_0___); // Module ___CSS_LOADER_EXPORT___.push([module.id, "@font-face {\n font-family: \"agGridMaterial\";\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_0___ + ");\n font-weight: normal;\n font-style: normal;\n}\n", ""]); // Exports /* harmony default export */ __webpack_exports__.A = (___CSS_LOADER_EXPORT___); /***/ }), /***/ 2229: /***/ (function(module, __webpack_exports__, __webpack_require__) { /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6758); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(935); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(62); /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__); // Imports var ___CSS_LOADER_URL_IMPORT_0___ = new URL(/* asset import */ __webpack_require__(2006), __webpack_require__.b); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); var ___CSS_LOADER_URL_REPLACEMENT_0___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_0___); // Module ___CSS_LOADER_EXPORT___.push([module.id, "@font-face {\n font-family: \"agGridQuartz\";\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_0___ + ");\n font-weight: normal;\n font-style: normal;\n}\n", ""]); // Exports /* harmony default export */ __webpack_exports__.A = (___CSS_LOADER_EXPORT___); /***/ }), /***/ 935: /***/ (function(module) { /* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ module.exports = function (cssWithMappingToString) { var list = []; // return the list of modules as css string list.toString = function toString() { return this.map(function (item) { var content = ""; var needLayer = typeof item[5] !== "undefined"; if (item[4]) { content += "@supports (".concat(item[4], ") {"); } if (item[2]) { content += "@media ".concat(item[2], " {"); } if (needLayer) { content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {"); } content += cssWithMappingToString(item); if (needLayer) { content += "}"; } if (item[2]) { content += "}"; } if (item[4]) { content += "}"; } return content; }).join(""); }; // import a list of modules into the list list.i = function i(modules, media, dedupe, supports, layer) { if (typeof modules === "string") { modules = [[null, modules, undefined]]; } var alreadyImportedModules = {}; if (dedupe) { for (var k = 0; k < this.length; k++) { var id = this[k][0]; if (id != null) { alreadyImportedModules[id] = true; } } } for (var _k = 0; _k < modules.length; _k++) { var item = [].concat(modules[_k]); if (dedupe && alreadyImportedModules[item[0]]) { continue; } if (typeof layer !== "undefined") { if (typeof item[5] === "undefined") { item[5] = layer; } else { item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}"); item[5] = layer; } } if (media) { if (!item[2]) { item[2] = media; } else { item[1] = "@media ".concat(item[2], " {").concat(item[1], "}"); item[2] = media; } } if (supports) { if (!item[4]) { item[4] = "".concat(supports); } else { item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}"); item[4] = supports; } } list.push(item); } }; return list; }; /***/ }), /***/ 62: /***/ (function(module) { module.exports = function (url, options) { if (!options) { options = {}; } if (!url) { return url; } url = String(url.__esModule ? url.default : url); // If url is already wrapped in quotes, remove them if (/^['"].*['"]$/.test(url)) { url = url.slice(1, -1); } if (options.hash) { url += options.hash; } // Should url be wrapped? // See https://drafts.csswg.org/css-values-3/#urls if (/["'() \t\n]|(%20)/.test(url) || options.needQuotes) { return "\"".concat(url.replace(/"/g, '\\"').replace(/\n/g, "\\n"), "\""); } return url; }; /***/ }), /***/ 6758: /***/ (function(module) { module.exports = function (i) { return i[1]; }; /***/ }), /***/ 8510: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2591); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1740); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(8128); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8021); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(3051); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(3656); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _node_modules_css_loader_dist_cjs_js_ag_grid_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(2974); var options = {"attributes":{"data-ag-scope":"legacy"}}; options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default()); options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_ag_grid_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, options); /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_ag_grid_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A && _node_modules_css_loader_dist_cjs_js_ag_grid_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals ? _node_modules_css_loader_dist_cjs_js_ag_grid_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals : undefined); /***/ }), /***/ 2685: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2591); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1740); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(8128); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8021); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(3051); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(3656); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _node_modules_css_loader_dist_cjs_js_ag_theme_alpine_no_font_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(1229); var options = {"attributes":{"data-ag-scope":"legacy"}}; options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default()); options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_ag_theme_alpine_no_font_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, options); /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_ag_theme_alpine_no_font_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A && _node_modules_css_loader_dist_cjs_js_ag_theme_alpine_no_font_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals ? _node_modules_css_loader_dist_cjs_js_ag_theme_alpine_no_font_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals : undefined); /***/ }), /***/ 5151: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2591); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1740); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(8128); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8021); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(3051); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(3656); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _node_modules_css_loader_dist_cjs_js_ag_theme_alpine_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(3871); var options = {"attributes":{"data-ag-scope":"legacy"}}; options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default()); options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_ag_theme_alpine_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, options); /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_ag_theme_alpine_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A && _node_modules_css_loader_dist_cjs_js_ag_theme_alpine_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals ? _node_modules_css_loader_dist_cjs_js_ag_theme_alpine_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals : undefined); /***/ }), /***/ 9681: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2591); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1740); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(8128); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8021); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(3051); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(3656); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _node_modules_css_loader_dist_cjs_js_ag_theme_balham_no_font_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(8225); var options = {"attributes":{"data-ag-scope":"legacy"}}; options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default()); options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_ag_theme_balham_no_font_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, options); /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_ag_theme_balham_no_font_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A && _node_modules_css_loader_dist_cjs_js_ag_theme_balham_no_font_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals ? _node_modules_css_loader_dist_cjs_js_ag_theme_balham_no_font_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals : undefined); /***/ }), /***/ 2883: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2591); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1740); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(8128); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8021); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(3051); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(3656); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _node_modules_css_loader_dist_cjs_js_ag_theme_balham_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(5251); var options = {"attributes":{"data-ag-scope":"legacy"}}; options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default()); options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_ag_theme_balham_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, options); /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_ag_theme_balham_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A && _node_modules_css_loader_dist_cjs_js_ag_theme_balham_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals ? _node_modules_css_loader_dist_cjs_js_ag_theme_balham_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals : undefined); /***/ }), /***/ 3543: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2591); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1740); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(8128); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8021); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(3051); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(3656); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _node_modules_css_loader_dist_cjs_js_ag_theme_material_no_font_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(4023); var options = {"attributes":{"data-ag-scope":"legacy"}}; options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default()); options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_ag_theme_material_no_font_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, options); /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_ag_theme_material_no_font_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A && _node_modules_css_loader_dist_cjs_js_ag_theme_material_no_font_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals ? _node_modules_css_loader_dist_cjs_js_ag_theme_material_no_font_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals : undefined); /***/ }), /***/ 1109: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2591); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1740); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(8128); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8021); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(3051); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(3656); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _node_modules_css_loader_dist_cjs_js_ag_theme_material_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(3973); var options = {"attributes":{"data-ag-scope":"legacy"}}; options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default()); options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_ag_theme_material_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, options); /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_ag_theme_material_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A && _node_modules_css_loader_dist_cjs_js_ag_theme_material_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals ? _node_modules_css_loader_dist_cjs_js_ag_theme_material_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals : undefined); /***/ }), /***/ 1601: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2591); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1740); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(8128); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8021); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(3051); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(3656); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _node_modules_css_loader_dist_cjs_js_ag_theme_quartz_no_font_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(145); var options = {"attributes":{"data-ag-scope":"legacy"}}; options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default()); options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_ag_theme_quartz_no_font_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, options); /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_ag_theme_quartz_no_font_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A && _node_modules_css_loader_dist_cjs_js_ag_theme_quartz_no_font_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals ? _node_modules_css_loader_dist_cjs_js_ag_theme_quartz_no_font_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals : undefined); /***/ }), /***/ 8755: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2591); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1740); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(8128); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8021); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(3051); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(3656); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _node_modules_css_loader_dist_cjs_js_ag_theme_quartz_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(1123); var options = {"attributes":{"data-ag-scope":"legacy"}}; options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default()); options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_ag_theme_quartz_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, options); /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_ag_theme_quartz_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A && _node_modules_css_loader_dist_cjs_js_ag_theme_quartz_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals ? _node_modules_css_loader_dist_cjs_js_ag_theme_quartz_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals : undefined); /***/ }), /***/ 3713: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2591); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1740); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(8128); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8021); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(3051); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(3656); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _node_modules_css_loader_dist_cjs_js_agGridAlpineFont_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(6049); var options = {"attributes":{"data-ag-scope":"legacy"}}; options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default()); options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_agGridAlpineFont_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, options); /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_agGridAlpineFont_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A && _node_modules_css_loader_dist_cjs_js_agGridAlpineFont_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals ? _node_modules_css_loader_dist_cjs_js_agGridAlpineFont_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals : undefined); /***/ }), /***/ 9029: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2591); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1740); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(8128); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8021); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(3051); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(3656); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _node_modules_css_loader_dist_cjs_js_agGridBalhamFont_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(1365); var options = {"attributes":{"data-ag-scope":"legacy"}}; options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default()); options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_agGridBalhamFont_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, options); /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_agGridBalhamFont_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A && _node_modules_css_loader_dist_cjs_js_agGridBalhamFont_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals ? _node_modules_css_loader_dist_cjs_js_agGridBalhamFont_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals : undefined); /***/ }), /***/ 7628: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2591); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1740); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(8128); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8021); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(3051); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(3656); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _node_modules_css_loader_dist_cjs_js_agGridClassicFont_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(492); var options = {"attributes":{"data-ag-scope":"legacy"}}; options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default()); options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_agGridClassicFont_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, options); /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_agGridClassicFont_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A && _node_modules_css_loader_dist_cjs_js_agGridClassicFont_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals ? _node_modules_css_loader_dist_cjs_js_agGridClassicFont_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals : undefined); /***/ }), /***/ 2559: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2591); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1740); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(8128); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8021); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(3051); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(3656); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _node_modules_css_loader_dist_cjs_js_agGridMaterialFont_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(31); var options = {"attributes":{"data-ag-scope":"legacy"}}; options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default()); options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_agGridMaterialFont_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, options); /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_agGridMaterialFont_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A && _node_modules_css_loader_dist_cjs_js_agGridMaterialFont_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals ? _node_modules_css_loader_dist_cjs_js_agGridMaterialFont_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals : undefined); /***/ }), /***/ 9893: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2591); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1740); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(8128); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8021); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(3051); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(3656); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _node_modules_css_loader_dist_cjs_js_agGridQuartzFont_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(2229); var options = {"attributes":{"data-ag-scope":"legacy"}}; options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithAttributesAndNonce_js__WEBPACK_IMPORTED_MODULE_3___default()); options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_agGridQuartzFont_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, options); /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_agGridQuartzFont_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A && _node_modules_css_loader_dist_cjs_js_agGridQuartzFont_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals ? _node_modules_css_loader_dist_cjs_js_agGridQuartzFont_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals : undefined); /***/ }), /***/ 2591: /***/ (function(module) { var stylesInDOM = []; function getIndexByIdentifier(identifier) { var result = -1; for (var i = 0; i < stylesInDOM.length; i++) { if (stylesInDOM[i].identifier === identifier) { result = i; break; } } return result; } function modulesToDom(list, options) { var idCountMap = {}; var identifiers = []; for (var i = 0; i < list.length; i++) { var item = list[i]; var id = options.base ? item[0] + options.base : item[0]; var count = idCountMap[id] || 0; var identifier = "".concat(id, " ").concat(count); idCountMap[id] = count + 1; var indexByIdentifier = getIndexByIdentifier(identifier); var obj = { css: item[1], media: item[2], sourceMap: item[3], supports: item[4], layer: item[5] }; if (indexByIdentifier !== -1) { stylesInDOM[indexByIdentifier].references++; stylesInDOM[indexByIdentifier].updater(obj); } else { var updater = addElementStyle(obj, options); options.byIndex = i; stylesInDOM.splice(i, 0, { identifier: identifier, updater: updater, references: 1 }); } identifiers.push(identifier); } return identifiers; } function addElementStyle(obj, options) { var api = options.domAPI(options); api.update(obj); var updater = function updater(newObj) { if (newObj) { if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) { return; } api.update(obj = newObj); } else { api.remove(); } }; return updater; } module.exports = function (list, options) { options = options || {}; list = list || []; var lastIdentifiers = modulesToDom(list, options); return function update(newList) { newList = newList || []; for (var i = 0; i < lastIdentifiers.length; i++) { var identifier = lastIdentifiers[i]; var index = getIndexByIdentifier(identifier); stylesInDOM[index].references--; } var newLastIdentifiers = modulesToDom(newList, options); for (var _i = 0; _i < lastIdentifiers.length; _i++) { var _identifier = lastIdentifiers[_i]; var _index = getIndexByIdentifier(_identifier); if (stylesInDOM[_index].references === 0) { stylesInDOM[_index].updater(); stylesInDOM.splice(_index, 1); } } lastIdentifiers = newLastIdentifiers; }; }; /***/ }), /***/ 8128: /***/ (function(module) { var memo = {}; /* istanbul ignore next */ function getTarget(target) { if (typeof memo[target] === "undefined") { var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) { try { // This will throw an exception if access to iframe is blocked // due to cross-origin restrictions styleTarget = styleTarget.contentDocument.head; } catch (e) { // istanbul ignore next styleTarget = null; } } memo[target] = styleTarget; } return memo[target]; } /* istanbul ignore next */ function insertBySelector(insert, style) { var target = getTarget(insert); if (!target) { throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid."); } target.appendChild(style); } module.exports = insertBySelector; /***/ }), /***/ 3051: /***/ (function(module) { /* istanbul ignore next */ function insertStyleElement(options) { var element = document.createElement("style"); options.setAttributes(element, options.attributes); options.insert(element, options.options); return element; } module.exports = insertStyleElement; /***/ }), /***/ 8021: /***/ (function(module) { /* istanbul ignore next */ function setAttributesWithoutAttributes(styleElement, attributes) { Object.keys(attributes).forEach(function (key) { styleElement.setAttribute(key, attributes[key]); }); } module.exports = setAttributesWithoutAttributes; /***/ }), /***/ 1740: /***/ (function(module) { /* istanbul ignore next */ function apply(styleElement, options, obj) { var css = ""; if (obj.supports) { css += "@supports (".concat(obj.supports, ") {"); } if (obj.media) { css += "@media ".concat(obj.media, " {"); } var needLayer = typeof obj.layer !== "undefined"; if (needLayer) { css += "@layer".concat(obj.layer.length > 0 ? " ".concat(obj.layer) : "", " {"); } css += obj.css; if (needLayer) { css += "}"; } if (obj.media) { css += "}"; } if (obj.supports) { css += "}"; } var sourceMap = obj.sourceMap; if (sourceMap && typeof btoa !== "undefined") { css += "\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), " */"); } // For old IE /* istanbul ignore if */ options.styleTagTransform(css, styleElement, options.options); } function removeStyleElement(styleElement) { // istanbul ignore if if (styleElement.parentNode === null) { return false; } styleElement.parentNode.removeChild(styleElement); } /* istanbul ignore next */ function domAPI(options) { if (typeof document === "undefined") { return { update: function update() {}, remove: function remove() {} }; } var styleElement = options.insertStyleElement(options); return { update: function update(obj) { apply(styleElement, options, obj); }, remove: function remove() { removeStyleElement(styleElement); } }; } module.exports = domAPI; /***/ }), /***/ 3656: /***/ (function(module) { /* istanbul ignore next */ function styleTagTransform(css, styleElement) { if (styleElement.styleSheet) { styleElement.styleSheet.cssText = css; } else { while (styleElement.firstChild) { styleElement.removeChild(styleElement.firstChild); } styleElement.appendChild(document.createTextNode(css)); } } module.exports = styleTagTransform; /***/ }), /***/ 2074: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.AlignedGridsModule = void 0; const version_1 = __webpack_require__(7205); const alignedGridsService_1 = __webpack_require__(8963); /** * @feature Other -> Aligned Grids * @gridOption alignedGrids */ exports.AlignedGridsModule = { moduleName: 'AlignedGrids', version: version_1.VERSION, beans: [alignedGridsService_1.AlignedGridsService], }; /***/ }), /***/ 8963: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.AlignedGridsService = void 0; const columnStateUtils_1 = __webpack_require__(2885); const beanStub_1 = __webpack_require__(8731); const logging_1 = __webpack_require__(7764); class AlignedGridsService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'alignedGridsSvc'; // flag to mark if we are consuming. to avoid cyclic events (ie other grid firing back to master // while processing a master event) we mark this if consuming an event, and if we are, then // we don't fire back any events. this.consuming = false; } getAlignedGridApis() { let alignedGrids = this.gos.get('alignedGrids') ?? []; const isCallbackConfig = typeof alignedGrids === 'function'; if (typeof alignedGrids === 'function') { alignedGrids = alignedGrids(); } const apis = alignedGrids .map((alignedGrid) => { if (!alignedGrid) { (0, logging_1._error)(18); if (!isCallbackConfig) { (0, logging_1._error)(20); } return; } if (this.isGridApi(alignedGrid)) { return alignedGrid; } // Extract the GridApi from a ref or component const refOrComp = alignedGrid; if ('current' in refOrComp) { return refOrComp.current?.api; } if (!refOrComp.api) { (0, logging_1._error)(19); } return refOrComp.api; }) .filter((api) => !!api && !api.isDestroyed()); return apis; } isGridApi(ref) { return !!ref && !!ref.dispatchEvent; } postConstruct() { const fireColumnEvent = this.fireColumnEvent.bind(this); this.addManagedEventListeners({ columnMoved: fireColumnEvent, columnVisible: fireColumnEvent, columnPinned: fireColumnEvent, columnGroupOpened: fireColumnEvent, columnResized: fireColumnEvent, bodyScroll: this.fireScrollEvent.bind(this), alignedGridColumn: ({ event }) => this.onColumnEvent(event), alignedGridScroll: ({ event }) => this.onScrollEvent(event), }); } // common logic across all the fire methods fireEvent(event) { // if we are already consuming, then we are acting on an event from a master, // so we don't cause a cyclic firing of events if (this.consuming) { return; } this.getAlignedGridApis().forEach((api) => { if (api.isDestroyed()) { return; } api.dispatchEvent(event); }); } // common logic across all consume methods. very little common logic, however extracting // guarantees consistency across the methods. onEvent(callback) { this.consuming = true; callback(); this.consuming = false; } fireColumnEvent(columnEvent) { this.fireEvent({ type: 'alignedGridColumn', event: columnEvent, }); } fireScrollEvent(scrollEvent) { if (scrollEvent.direction !== 'horizontal') { return; } this.fireEvent({ type: 'alignedGridScroll', event: scrollEvent, }); } onScrollEvent(event) { this.onEvent(() => { this.beans.ctrlsSvc.getScrollFeature().setHorizontalScrollPosition(event.left, true); }); } extractDataFromEvent(event, func) { const result = []; if (event.columns) { event.columns.forEach((column) => { result.push(func(column)); }); } else if (event.column) { result.push(func(event.column)); } return result; } getMasterColumns(event) { return this.extractDataFromEvent(event, (col) => col); } getColumnIds(event) { return this.extractDataFromEvent(event, (col) => col.getColId()); } onColumnEvent(event) { this.onEvent(() => { switch (event.type) { case 'columnMoved': case 'columnVisible': case 'columnPinned': case 'columnResized': { this.processColumnEvent(event); break; } case 'columnGroupOpened': { this.processGroupOpenedEvent(event); break; } case 'columnPivotChanged': // we cannot support pivoting with aligned grids as the columns will be out of sync as the // grids will have columns created based on the row data of the grid. (0, logging_1._warn)(21); break; } }); } processGroupOpenedEvent(groupOpenedEvent) { const { colGroupSvc } = this.beans; if (!colGroupSvc) { return; } groupOpenedEvent.columnGroups.forEach((masterGroup) => { // likewise for column group let otherColumnGroup = null; if (masterGroup) { otherColumnGroup = colGroupSvc.getProvidedColGroup(masterGroup.getGroupId()); } if (masterGroup && !otherColumnGroup) { return; } colGroupSvc.setColumnGroupOpened(otherColumnGroup, masterGroup.isExpanded(), 'alignedGridChanged'); }); } processColumnEvent(colEvent) { // the column in the event is from the master grid. need to // look up the equivalent from this (other) grid const masterColumn = colEvent.column; let otherColumn = null; const beans = this.beans; const { colResize, ctrlsSvc, colModel } = beans; if (masterColumn) { otherColumn = colModel.getColDefCol(masterColumn.getColId()); } // if event was with respect to a master column, that is not present in this // grid, then we ignore the event if (masterColumn && !otherColumn) { return; } // in time, all the methods below should use the column ids, it's a more generic way // of handling columns, and also allows for single or multi column events const masterColumns = this.getMasterColumns(colEvent); switch (colEvent.type) { case 'columnMoved': // when the user moves columns via applyColumnState, we can't depend on moving specific columns // to an index, as there maybe be many indexes columns moved to (as wasn't result of a mouse drag). // so only way to be sure is match the order of all columns using Column State. { const srcColState = colEvent.api.getColumnState(); const destColState = srcColState.map((s) => ({ colId: s.colId })); (0, columnStateUtils_1._applyColumnState)(beans, { state: destColState, applyOrder: true }, 'alignedGridChanged'); } break; case 'columnVisible': // when the user changes visibility via applyColumnState, we can't depend on visibility flag in event // as there maybe be mix of true/false (as wasn't result of a mouse click to set visiblity). // so only way to be sure is match the visibility of all columns using Column State. { const srcColState = colEvent.api.getColumnState(); const destColState = srcColState.map((s) => ({ colId: s.colId, hide: s.hide })); (0, columnStateUtils_1._applyColumnState)(beans, { state: destColState }, 'alignedGridChanged'); } break; case 'columnPinned': { const srcColState = colEvent.api.getColumnState(); const destColState = srcColState.map((s) => ({ colId: s.colId, pinned: s.pinned })); (0, columnStateUtils_1._applyColumnState)(beans, { state: destColState }, 'alignedGridChanged'); } break; case 'columnResized': { const resizedEvent = colEvent; const columnWidths = {}; masterColumns.forEach((column) => { columnWidths[column.getId()] = { key: column.getColId(), newWidth: column.getActualWidth() }; }); // don't set flex columns width resizedEvent.flexColumns?.forEach((col) => { if (columnWidths[col.getId()]) { delete columnWidths[col.getId()]; } }); colResize?.setColumnWidths(Object.values(columnWidths), false, resizedEvent.finished, 'alignedGridChanged'); break; } } const gridBodyCon = ctrlsSvc.getGridBodyCtrl(); const isVerticalScrollShowing = gridBodyCon.isVerticalScrollShowing(); this.getAlignedGridApis().forEach((api) => { api.setGridOption('alwaysShowVerticalScroll', isVerticalScrollShowing); }); } } exports.AlignedGridsService = AlignedGridsService; /***/ }), /***/ 1621: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.AllCommunityModule = void 0; const alignedGridsModule_1 = __webpack_require__(2074); const apiModule_1 = __webpack_require__(9642); const clientSideRowModelModule_1 = __webpack_require__(9722); const clientSideRowModelModule_2 = __webpack_require__(9722); const columnAutosizeModule_1 = __webpack_require__(3856); const columnHoverModule_1 = __webpack_require__(1690); const columnModule_1 = __webpack_require__(2027); const csvExportModule_1 = __webpack_require__(9734); const dragModule_1 = __webpack_require__(4388); const editModule_1 = __webpack_require__(4652); const filterModule_1 = __webpack_require__(5432); const infiniteRowModelModule_1 = __webpack_require__(4002); const apiEventModule_1 = __webpack_require__(9410); const localeModule_1 = __webpack_require__(9519); const stateModule_1 = __webpack_require__(6989); const paginationModule_1 = __webpack_require__(1824); const pinnedRowModule_1 = __webpack_require__(5423); const highlightChangesModule_1 = __webpack_require__(3498); const renderModule_1 = __webpack_require__(6964); const rowAutoHeightModule_1 = __webpack_require__(4577); const cellSpanModule_1 = __webpack_require__(4265); const rowSelectionModule_1 = __webpack_require__(3352); const stylingModule_1 = __webpack_require__(8594); const tooltipModule_1 = __webpack_require__(2277); const validationModule_1 = __webpack_require__(5010); const valueModule_1 = __webpack_require__(6431); const version_1 = __webpack_require__(7205); /** * @feature All Community Features */ exports.AllCommunityModule = { moduleName: 'AllCommunity', version: version_1.VERSION, dependsOn: [ clientSideRowModelModule_1.ClientSideRowModelModule, csvExportModule_1.CsvExportModule, infiniteRowModelModule_1.InfiniteRowModelModule, validationModule_1.ValidationModule, editModule_1.TextEditorModule, editModule_1.NumberEditorModule, editModule_1.DateEditorModule, editModule_1.CheckboxEditorModule, editModule_1.SelectEditorModule, editModule_1.LargeTextEditorModule, editModule_1.CustomEditorModule, editModule_1.UndoRedoEditModule, filterModule_1.TextFilterModule, filterModule_1.NumberFilterModule, filterModule_1.DateFilterModule, filterModule_1.CustomFilterModule, filterModule_1.QuickFilterModule, filterModule_1.ExternalFilterModule, stateModule_1.GridStateModule, alignedGridsModule_1.AlignedGridsModule, paginationModule_1.PaginationModule, columnModule_1.ColumnApiModule, apiModule_1.RowApiModule, apiModule_1.ScrollApiModule, renderModule_1.RenderApiModule, columnAutosizeModule_1.ColumnAutoSizeModule, dragModule_1.RowDragModule, pinnedRowModule_1.PinnedRowModule, rowSelectionModule_1.RowSelectionModule, valueModule_1.ValueCacheModule, stylingModule_1.CellStyleModule, columnHoverModule_1.ColumnHoverModule, stylingModule_1.RowStyleModule, apiEventModule_1.EventApiModule, valueModule_1.CellApiModule, highlightChangesModule_1.HighlightChangesModule, tooltipModule_1.TooltipModule, localeModule_1.LocaleModule, rowAutoHeightModule_1.RowAutoHeightModule, dragModule_1.DragAndDropModule, clientSideRowModelModule_2.ClientSideRowModelApiModule, cellSpanModule_1.CellSpanModule, ], }; /***/ }), /***/ 3907: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ApiFunctionService = void 0; const beanStub_1 = __webpack_require__(8731); const logging_1 = __webpack_require__(7764); const gridApiFunctions_1 = __webpack_require__(7689); const defaultFns = { isDestroyed: () => true, destroy() { }, preConstruct() { }, postConstruct() { }, preWireBeans() { }, wireBeans() { }, }; const dispatchEvent = (beans, event) => beans.eventSvc.dispatchEvent(event); // We use a class for AGGridApi so in stack traces calling grid.api.xxx() if an error is thrown it will print "GridApi.xxx" class GridApiClass { } Reflect.defineProperty(GridApiClass, 'name', { value: 'GridApi' }); class ApiFunctionService extends beanStub_1.BeanStub { constructor() { super(); this.beanName = 'apiFunctionSvc'; this.api = new GridApiClass(); this.fns = { ...defaultFns, // dispatchEvent is used by frameworks, also used by aligned grids to identify a grid api instance dispatchEvent, }; this.preDestroyLink = ''; const { api } = this; for (const key of Object.keys(gridApiFunctions_1.gridApiFunctionsMap)) { api[key] = this.makeApi(key)[key]; } } postConstruct() { this.preDestroyLink = this.beans.frameworkOverrides.getDocLink('grid-lifecycle/#grid-pre-destroyed'); } addFunction(functionName, func) { const { fns, beans } = this; if (fns !== defaultFns) { fns[functionName] = beans?.validation?.validateApiFunction(functionName, func) ?? func; } } makeApi(apiName) { // We return an object here to be sure the function name is properly applied, // in this way error stack trace are correct and gridApi.xxx.name === 'xxx' // This is generally faster than using Object.defineProperty(gridApi, apiName, { value: apiName, configurable: true }); // Keep this function as light and simple as possible. return { [apiName]: (...args) => { const { beans, fns: { [apiName]: fn }, } = this; return fn ? fn(beans, ...args) : this.apiNotFound(apiName); }, }; } apiNotFound(fnName) { const { beans, gos, preDestroyLink } = this; if (!beans) { (0, logging_1._warn)(26, { fnName, preDestroyLink }); } else { const module = gridApiFunctions_1.gridApiFunctionsMap[fnName]; if (gos.assertModuleRegistered(module, `api.${fnName}`)) { (0, logging_1._warn)(27, { fnName, module }); } } } destroy() { super.destroy(); this.fns = defaultFns; this.beans = null; } } exports.ApiFunctionService = ApiFunctionService; /***/ }), /***/ 9642: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ScrollApiModule = exports.RowApiModule = void 0; const version_1 = __webpack_require__(7205); const rowApi_1 = __webpack_require__(8192); const scrollApi_1 = __webpack_require__(1765); /** * @feature Rows */ exports.RowApiModule = { moduleName: 'RowApi', version: version_1.VERSION, apiFunctions: { redrawRows: rowApi_1.redrawRows, setRowNodeExpanded: rowApi_1.setRowNodeExpanded, getRowNode: rowApi_1.getRowNode, addRenderedRowListener: rowApi_1.addRenderedRowListener, getRenderedNodes: rowApi_1.getRenderedNodes, forEachNode: rowApi_1.forEachNode, getFirstDisplayedRowIndex: rowApi_1.getFirstDisplayedRowIndex, getLastDisplayedRowIndex: rowApi_1.getLastDisplayedRowIndex, getDisplayedRowAtIndex: rowApi_1.getDisplayedRowAtIndex, getDisplayedRowCount: rowApi_1.getDisplayedRowCount, }, }; /** * @feature Scrolling */ exports.ScrollApiModule = { moduleName: 'ScrollApi', version: version_1.VERSION, apiFunctions: { getVerticalPixelRange: scrollApi_1.getVerticalPixelRange, getHorizontalPixelRange: scrollApi_1.getHorizontalPixelRange, ensureColumnVisible: scrollApi_1.ensureColumnVisible, ensureIndexVisible: scrollApi_1.ensureIndexVisible, ensureNodeVisible: scrollApi_1.ensureNodeVisible, }, }; /***/ }), /***/ 6433: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.createGridApi = void 0; function createGridApi(context) { return { beanName: 'gridApi', bean: context.getBean('apiFunctionSvc').api, }; } exports.createGridApi = createGridApi; /***/ }), /***/ 9875: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.updateGridOptions = exports.setGridOption = exports.getGridOption = exports.isDestroyed = exports.destroy = exports.getGridId = void 0; function getGridId(beans) { return beans.context.getGridId(); } exports.getGridId = getGridId; function destroy(beans) { beans.gridDestroySvc.destroy(); } exports.destroy = destroy; function isDestroyed(beans) { return beans.gridDestroySvc.destroyCalled; } exports.isDestroyed = isDestroyed; function getGridOption(beans, key) { return beans.gos.get(key); } exports.getGridOption = getGridOption; function setGridOption(beans, key, value) { updateGridOptions(beans, { [key]: value }); } exports.setGridOption = setGridOption; function updateGridOptions(beans, options) { // NOTE: The TDataUpdate generic is used to ensure that the update options match the generic passed into the GridApi above as TData. // This is required because if we just use TData directly then Typescript will get into an infinite loop due to callbacks which recursively include the GridApi. beans.gos.updateGridOptions({ options }); } exports.updateGridOptions = updateGridOptions; /***/ }), /***/ 9513: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.onRowHeightChanged = exports.collapseAll = exports.expandAll = void 0; const rowModelApiUtils_1 = __webpack_require__(6876); function expandAll(beans) { beans.expansionSvc?.expandAll(true); } exports.expandAll = expandAll; function collapseAll(beans) { beans.expansionSvc?.expandAll(false); } exports.collapseAll = collapseAll; function onRowHeightChanged(beans) { const clientSideRowModel = (0, rowModelApiUtils_1._getClientSideRowModel)(beans); const serverSideRowModel = (0, rowModelApiUtils_1._getServerSideRowModel)(beans); if (clientSideRowModel) { clientSideRowModel.onRowHeightChanged(); } else if (serverSideRowModel) { serverSideRowModel.onRowHeightChanged(); } } exports.onRowHeightChanged = onRowHeightChanged; /***/ }), /***/ 7689: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.gridApiFunctionsMap = void 0; const mod = (moduleName, input) => { for (const key of Object.keys(input)) { input[key] = moduleName; } return input; }; exports.gridApiFunctionsMap = { dispatchEvent: 'CommunityCore', ...mod('CommunityCore', { destroy: 0, getGridId: 0, getGridOption: 0, isDestroyed: 0, setGridOption: 0, updateGridOptions: 0, }), ...mod('GridState', { getState: 0, }), ...mod('SharedRowSelection', { setNodesSelected: 0, selectAll: 0, deselectAll: 0, selectAllFiltered: 0, deselectAllFiltered: 0, selectAllOnCurrentPage: 0, deselectAllOnCurrentPage: 0, getSelectedNodes: 0, getSelectedRows: 0, }), ...mod('RowApi', { redrawRows: 0, setRowNodeExpanded: 0, getRowNode: 0, addRenderedRowListener: 0, getRenderedNodes: 0, forEachNode: 0, getFirstDisplayedRowIndex: 0, getLastDisplayedRowIndex: 0, getDisplayedRowAtIndex: 0, getDisplayedRowCount: 0, }), ...mod('ScrollApi', { getVerticalPixelRange: 0, getHorizontalPixelRange: 0, ensureColumnVisible: 0, ensureIndexVisible: 0, ensureNodeVisible: 0, }), ...mod('KeyboardNavigation', { getFocusedCell: 0, clearFocusedCell: 0, setFocusedCell: 0, tabToNextCell: 0, tabToPreviousCell: 0, setFocusedHeader: 0, }), ...mod('EventApi', { addEventListener: 0, addGlobalListener: 0, removeEventListener: 0, removeGlobalListener: 0, }), ...mod('ValueCache', { expireValueCache: 0, }), ...mod('CellApi', { getCellValue: 0, }), ...mod('SharedMenu', { showColumnMenu: 0, hidePopupMenu: 0, }), ...mod('Sort', { onSortChanged: 0, }), ...mod('PinnedRow', { getPinnedTopRowCount: 0, getPinnedBottomRowCount: 0, getPinnedTopRow: 0, getPinnedBottomRow: 0, }), ...mod('Overlay', { showLoadingOverlay: 0, showNoRowsOverlay: 0, hideOverlay: 0, }), ...mod('RenderApi', { setGridAriaProperty: 0, refreshCells: 0, refreshHeader: 0, isAnimationFrameQueueEmpty: 0, flushAllAnimationFrames: 0, getSizesForCurrentTheme: 0, getCellRendererInstances: 0, }), ...mod('HighlightChanges', { flashCells: 0, }), ...mod('RowDrag', { addRowDropZone: 0, removeRowDropZone: 0, getRowDropZoneParams: 0, }), ...mod('ColumnApi', { getColumnDefs: 0, getColumnDef: 0, getDisplayNameForColumn: 0, getColumn: 0, getColumns: 0, applyColumnState: 0, getColumnState: 0, resetColumnState: 0, isPinning: 0, isPinningLeft: 0, isPinningRight: 0, getDisplayedColAfter: 0, getDisplayedColBefore: 0, setColumnsVisible: 0, setColumnsPinned: 0, getAllGridColumns: 0, getDisplayedLeftColumns: 0, getDisplayedCenterColumns: 0, getDisplayedRightColumns: 0, getAllDisplayedColumns: 0, getAllDisplayedVirtualColumns: 0, }), ...mod('ColumnAutoSize', { sizeColumnsToFit: 0, autoSizeColumns: 0, autoSizeAllColumns: 0, }), ...mod('ColumnGroup', { setColumnGroupOpened: 0, getColumnGroup: 0, getProvidedColumnGroup: 0, getDisplayNameForColumnGroup: 0, getColumnGroupState: 0, setColumnGroupState: 0, resetColumnGroupState: 0, getLeftDisplayedColumnGroups: 0, getCenterDisplayedColumnGroups: 0, getRightDisplayedColumnGroups: 0, getAllDisplayedColumnGroups: 0, }), ...mod('ColumnMove', { moveColumnByIndex: 0, moveColumns: 0, }), ...mod('ColumnResize', { setColumnWidths: 0, }), ...mod('ColumnHover', { isColumnHovered: 0, }), ...mod('EditCore', { getCellEditorInstances: 0, getEditingCells: 0, stopEditing: 0, startEditingCell: 0, }), ...mod('UndoRedoEdit', { undoCellEditing: 0, redoCellEditing: 0, getCurrentUndoSize: 0, getCurrentRedoSize: 0, }), ...mod('FilterCore', { isAnyFilterPresent: 0, onFilterChanged: 0, }), ...mod('ColumnFilter', { isColumnFilterPresent: 0, getColumnFilterInstance: 0, destroyFilter: 0, setFilterModel: 0, getFilterModel: 0, getColumnFilterModel: 0, setColumnFilterModel: 0, showColumnFilter: 0, }), ...mod('QuickFilter', { isQuickFilterPresent: 0, getQuickFilter: 0, resetQuickFilter: 0, }), ...mod('Pagination', { paginationIsLastPageFound: 0, paginationGetPageSize: 0, paginationGetCurrentPage: 0, paginationGetTotalPages: 0, paginationGetRowCount: 0, paginationGoToNextPage: 0, paginationGoToPreviousPage: 0, paginationGoToFirstPage: 0, paginationGoToLastPage: 0, paginationGoToPage: 0, }), ...mod('CsrmSsrmSharedApi', { expandAll: 0, collapseAll: 0, onRowHeightChanged: 0, }), ...mod('SsrmInfiniteSharedApi', { setRowCount: 0, getCacheBlockState: 0, isLastRowIndexKnown: 0, }), ...mod('ClientSideRowModelApi', { onGroupExpandedOrCollapsed: 0, refreshClientSideRowModel: 0, isRowDataEmpty: 0, forEachLeafNode: 0, forEachNodeAfterFilter: 0, forEachNodeAfterFilterAndSort: 0, resetRowHeights: 0, applyTransaction: 0, applyTransactionAsync: 0, flushAsyncTransactions: 0, getBestCostNodeSelection: 0, }), ...mod('CsvExport', { getDataAsCsv: 0, exportDataAsCsv: 0, }), ...mod('InfiniteRowModel', { refreshInfiniteCache: 0, purgeInfiniteCache: 0, getInfiniteRowCount: 0, }), ...mod('AdvancedFilter', { getAdvancedFilterModel: 0, setAdvancedFilterModel: 0, showAdvancedFilterBuilder: 0, hideAdvancedFilterBuilder: 0, }), ...mod('IntegratedCharts', { getChartModels: 0, getChartRef: 0, getChartImageDataURL: 0, downloadChart: 0, openChartToolPanel: 0, closeChartToolPanel: 0, createRangeChart: 0, createPivotChart: 0, createCrossFilterChart: 0, updateChart: 0, restoreChart: 0, }), ...mod('Clipboard', { copyToClipboard: 0, cutToClipboard: 0, copySelectedRowsToClipboard: 0, copySelectedRangeToClipboard: 0, copySelectedRangeDown: 0, pasteFromClipboard: 0, }), ...mod('ExcelExport', { getDataAsExcel: 0, exportDataAsExcel: 0, getSheetDataForExcel: 0, getMultipleSheetsAsExcel: 0, exportMultipleSheetsAsExcel: 0, }), ...mod('SharedMasterDetail', { addDetailGridInfo: 0, removeDetailGridInfo: 0, getDetailGridInfo: 0, forEachDetailGridInfo: 0, }), ...mod('ContextMenu', { showContextMenu: 0, }), ...mod('ColumnMenu', { showColumnChooser: 0, hideColumnChooser: 0, }), ...mod('CellSelection', { getCellRanges: 0, addCellRange: 0, clearRangeSelection: 0, clearCellSelection: 0, }), ...mod('SharedRowGrouping', { setRowGroupColumns: 0, removeRowGroupColumns: 0, addRowGroupColumns: 0, getRowGroupColumns: 0, moveRowGroupColumn: 0, }), ...mod('SharedAggregation', { addAggFuncs: 0, clearAggFuncs: 0, setColumnAggFunc: 0, }), ...mod('SharedPivot', { isPivotMode: 0, getPivotResultColumn: 0, setValueColumns: 0, getValueColumns: 0, removeValueColumns: 0, addValueColumns: 0, setPivotColumns: 0, removePivotColumns: 0, addPivotColumns: 0, getPivotColumns: 0, setPivotResultColumns: 0, getPivotResultColumns: 0, }), ...mod('ServerSideRowModelApi', { getServerSideSelectionState: 0, setServerSideSelectionState: 0, applyServerSideTransaction: 0, applyServerSideTransactionAsync: 0, applyServerSideRowData: 0, retryServerSideLoads: 0, flushServerSideAsyncTransactions: 0, refreshServerSide: 0, getServerSideGroupLevelState: 0, }), ...mod('SideBar', { isSideBarVisible: 0, setSideBarVisible: 0, setSideBarPosition: 0, openToolPanel: 0, closeToolPanel: 0, getOpenedToolPanel: 0, refreshToolPanel: 0, isToolPanelShowing: 0, getToolPanelInstance: 0, getSideBar: 0, }), ...mod('StatusBar', { getStatusPanel: 0, }), }; /***/ }), /***/ 8192: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getDisplayedRowCount = exports.getDisplayedRowAtIndex = exports.getLastDisplayedRowIndex = exports.getFirstDisplayedRowIndex = exports.forEachNode = exports.getRenderedNodes = exports.addRenderedRowListener = exports.getRowNode = exports.setRowNodeExpanded = exports.redrawRows = void 0; function redrawRows(beans, params = {}) { const rowNodes = params ? params.rowNodes : undefined; beans.frameworkOverrides.wrapIncoming(() => beans.rowRenderer.redrawRows(rowNodes)); } exports.redrawRows = redrawRows; function setRowNodeExpanded(beans, rowNode, expanded, expandParents, forceSync) { if (rowNode) { // expand all parents recursively, except root node. if (expandParents && rowNode.parent && rowNode.parent.level !== -1) { setRowNodeExpanded(beans, rowNode.parent, expanded, expandParents, forceSync); } rowNode.setExpanded(expanded, undefined, forceSync); } } exports.setRowNodeExpanded = setRowNodeExpanded; function getRowNode(beans, id) { return beans.rowModel.getRowNode(id); } exports.getRowNode = getRowNode; function addRenderedRowListener(beans, eventName, rowIndex, callback) { beans.rowRenderer.addRenderedRowListener(eventName, rowIndex, callback); } exports.addRenderedRowListener = addRenderedRowListener; function getRenderedNodes(beans) { return beans.rowRenderer.getRenderedNodes(); } exports.getRenderedNodes = getRenderedNodes; function forEachNode(beans, callback, includeFooterNodes) { beans.rowModel.forEachNode(callback, includeFooterNodes); } exports.forEachNode = forEachNode; function getFirstDisplayedRowIndex(beans) { return beans.rowRenderer.firstRenderedRow; } exports.getFirstDisplayedRowIndex = getFirstDisplayedRowIndex; function getLastDisplayedRowIndex(beans) { return beans.rowRenderer.lastRenderedRow; } exports.getLastDisplayedRowIndex = getLastDisplayedRowIndex; function getDisplayedRowAtIndex(beans, index) { return beans.rowModel.getRow(index); } exports.getDisplayedRowAtIndex = getDisplayedRowAtIndex; function getDisplayedRowCount(beans) { return beans.rowModel.getRowCount(); } exports.getDisplayedRowCount = getDisplayedRowCount; /***/ }), /***/ 6876: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports._getServerSideRowModel = exports._getInfiniteRowModel = exports._getClientSideRowModel = void 0; function _getClientSideRowModel(beans) { const rowModel = beans.rowModel; return rowModel.getType() === 'clientSide' ? rowModel : undefined; } exports._getClientSideRowModel = _getClientSideRowModel; function _getInfiniteRowModel(beans) { const rowModel = beans.rowModel; return rowModel.getType() === 'infinite' ? rowModel : undefined; } exports._getInfiniteRowModel = _getInfiniteRowModel; function _getServerSideRowModel(beans) { const rowModel = beans.rowModel; return rowModel.getType() === 'serverSide' ? rowModel : undefined; } exports._getServerSideRowModel = _getServerSideRowModel; /***/ }), /***/ 1765: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ensureNodeVisible = exports.ensureIndexVisible = exports.ensureColumnVisible = exports.getHorizontalPixelRange = exports.getVerticalPixelRange = void 0; function getVerticalPixelRange(beans) { return beans.ctrlsSvc.getScrollFeature().getVScrollPosition(); } exports.getVerticalPixelRange = getVerticalPixelRange; function getHorizontalPixelRange(beans) { return beans.ctrlsSvc.getScrollFeature().getHScrollPosition(); } exports.getHorizontalPixelRange = getHorizontalPixelRange; function ensureColumnVisible(beans, key, position = 'auto') { beans.frameworkOverrides.wrapIncoming(() => beans.ctrlsSvc.getScrollFeature().ensureColumnVisible(key, position), 'ensureVisible'); } exports.ensureColumnVisible = ensureColumnVisible; function ensureIndexVisible(beans, index, position) { beans.frameworkOverrides.wrapIncoming(() => beans.ctrlsSvc.getScrollFeature().ensureIndexVisible(index, position), 'ensureVisible'); } exports.ensureIndexVisible = ensureIndexVisible; function ensureNodeVisible(beans, nodeSelector, position = null) { beans.frameworkOverrides.wrapIncoming(() => beans.ctrlsSvc.getScrollFeature().ensureNodeVisible(nodeSelector, position), 'ensureVisible'); } exports.ensureNodeVisible = ensureNodeVisible; /***/ }), /***/ 6437: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.SsrmInfiniteSharedApiModule = exports.CsrmSsrmSharedApiModule = void 0; const version_1 = __webpack_require__(7205); const csrmSsrmSharedApi_1 = __webpack_require__(9513); const ssrmInfiniteSharedApi_1 = __webpack_require__(8496); // these modules are not used in core, but are shared between multiple other modules /** * @internal */ exports.CsrmSsrmSharedApiModule = { moduleName: 'CsrmSsrmSharedApi', version: version_1.VERSION, apiFunctions: { expandAll: csrmSsrmSharedApi_1.expandAll, collapseAll: csrmSsrmSharedApi_1.collapseAll, onRowHeightChanged: csrmSsrmSharedApi_1.onRowHeightChanged, }, }; /** * @internal */ exports.SsrmInfiniteSharedApiModule = { moduleName: 'SsrmInfiniteSharedApi', version: version_1.VERSION, apiFunctions: { setRowCount: ssrmInfiniteSharedApi_1.setRowCount, getCacheBlockState: ssrmInfiniteSharedApi_1.getCacheBlockState, isLastRowIndexKnown: ssrmInfiniteSharedApi_1.isLastRowIndexKnown, }, }; /***/ }), /***/ 8496: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.isLastRowIndexKnown = exports.getCacheBlockState = exports.setRowCount = void 0; const gridOptionsUtils_1 = __webpack_require__(7274); const logging_1 = __webpack_require__(7764); const rowModelApiUtils_1 = __webpack_require__(6876); function setRowCount(beans, rowCount, maxRowFound) { const serverSideRowModel = (0, rowModelApiUtils_1._getServerSideRowModel)(beans); if (serverSideRowModel) { if (beans.rowGroupColsSvc?.columns.length === 0) { if (rowCount < 0) { (0, logging_1._error)(238); return; } serverSideRowModel.setRowCount(rowCount, maxRowFound); return; } (0, logging_1._error)(28); return; } const infiniteRowModel = (0, rowModelApiUtils_1._getInfiniteRowModel)(beans); if (infiniteRowModel) { infiniteRowModel.setRowCount(rowCount, maxRowFound); return; } } exports.setRowCount = setRowCount; function getCacheBlockState(beans) { if ((0, gridOptionsUtils_1._isServerSideRowModel)(beans.gos)) { const ssrm = beans.rowModel; return ssrm.getBlockStates(); } return beans.rowNodeBlockLoader?.getBlockState() ?? {}; } exports.getCacheBlockState = getCacheBlockState; function isLastRowIndexKnown(beans) { return beans.rowModel.isLastRowIndexKnown(); } exports.isLastRowIndexKnown = isLastRowIndexKnown; /***/ }), /***/ 5628: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.AutoScrollService = void 0; class AutoScrollService { constructor(params) { this.tickingInterval = null; this.onScrollCallback = null; this.scrollContainer = params.scrollContainer; this.scrollHorizontally = params.scrollAxis.indexOf('x') !== -1; this.scrollVertically = params.scrollAxis.indexOf('y') !== -1; this.scrollByTick = params.scrollByTick != null ? params.scrollByTick : 20; if (params.onScrollCallback) { this.onScrollCallback = params.onScrollCallback; } if (this.scrollVertically) { this.getVerticalPosition = params.getVerticalPosition; this.setVerticalPosition = params.setVerticalPosition; } if (this.scrollHorizontally) { this.getHorizontalPosition = params.getHorizontalPosition; this.setHorizontalPosition = params.setHorizontalPosition; } this.shouldSkipVerticalScroll = params.shouldSkipVerticalScroll || (() => false); this.shouldSkipHorizontalScroll = params.shouldSkipHorizontalScroll || (() => false); } check(mouseEvent, forceSkipVerticalScroll = false) { const skipVerticalScroll = forceSkipVerticalScroll || this.shouldSkipVerticalScroll(); if (skipVerticalScroll && this.shouldSkipHorizontalScroll()) { return; } const rect = this.scrollContainer.getBoundingClientRect(); const scrollTick = this.scrollByTick; this.tickLeft = mouseEvent.clientX < rect.left + scrollTick; this.tickRight = mouseEvent.clientX > rect.right - scrollTick; this.tickUp = mouseEvent.clientY < rect.top + scrollTick && !skipVerticalScroll; this.tickDown = mouseEvent.clientY > rect.bottom - scrollTick && !skipVerticalScroll; if (this.tickLeft || this.tickRight || this.tickUp || this.tickDown) { this.ensureTickingStarted(); } else { this.ensureCleared(); } } ensureTickingStarted() { if (this.tickingInterval === null) { this.tickingInterval = window.setInterval(this.doTick.bind(this), 100); this.tickCount = 0; } } doTick() { this.tickCount++; const tickAmount = this.tickCount > 20 ? 200 : this.tickCount > 10 ? 80 : 40; if (this.scrollVertically) { const vScrollPosition = this.getVerticalPosition(); if (this.tickUp) { this.setVerticalPosition(vScrollPosition - tickAmount); } if (this.tickDown) { this.setVerticalPosition(vScrollPosition + tickAmount); } } if (this.scrollHorizontally) { const hScrollPosition = this.getHorizontalPosition(); if (this.tickLeft) { this.setHorizontalPosition(hScrollPosition - tickAmount); } if (this.tickRight) { this.setHorizontalPosition(hScrollPosition + tickAmount); } } if (this.onScrollCallback) { this.onScrollCallback(); } } ensureCleared() { if (this.tickingInterval) { window.clearInterval(this.tickingInterval); this.tickingInterval = null; } } } exports.AutoScrollService = AutoScrollService; /***/ }), /***/ 3263: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.BASE_URL = void 0; // DO NOT UPDATE MANUALLY: Generated from script during build time exports.BASE_URL = 'https://www.ag-grid.com'; /***/ }), /***/ 1954: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.AbstractClientSideNodeManager = void 0; const beanStub_1 = __webpack_require__(8731); const rowNode_1 = __webpack_require__(3373); const gridOptionsUtils_1 = __webpack_require__(7274); const logging_1 = __webpack_require__(7764); const ROOT_NODE_ID = 'ROOT_NODE_ID'; class AbstractClientSideNodeManager extends beanStub_1.BeanStub { constructor() { super(...arguments); this.nextId = 0; this.allNodesMap = {}; this.rootNode = null; } get treeData() { return false; // not supported by this node manager } getRowNode(id) { return this.allNodesMap[id]; } extractRowData() { return this.rootNode?.allLeafChildren?.map((node) => node.data); } activate(rootNode) { this.rootNode = rootNode; rootNode.group = true; rootNode.level = -1; rootNode.id = ROOT_NODE_ID; rootNode.allLeafChildren = []; rootNode.childrenAfterGroup = []; rootNode.childrenAfterSort = []; rootNode.childrenAfterAggFilter = []; rootNode.childrenAfterFilter = []; this.updateRootSiblingArrays(rootNode); } deactivate() { if (this.rootNode) { this.allNodesMap = {}; this.rootNode = null; } } destroy() { super.destroy(); // Forcefully deallocate memory this.allNodesMap = {}; this.rootNode = null; } setNewRowData(rowData) { const rootNode = this.rootNode; if (!rootNode) { return; } this.dispatchRowDataUpdateStartedEvent(rowData); rootNode.childrenAfterFilter = null; rootNode.childrenAfterGroup = null; rootNode.childrenAfterAggFilter = null; rootNode.childrenAfterSort = null; rootNode.childrenMapped = null; rootNode.updateHasChildren(); // Clear internal maps this.allNodesMap = {}; this.nextId = 0; this.loadNewRowData(rowData); this.updateRootSiblingArrays(rootNode); } updateRootSiblingArrays(rootNode) { const sibling = rootNode.sibling; if (sibling) { sibling.childrenAfterFilter = rootNode.childrenAfterFilter; sibling.childrenAfterGroup = rootNode.childrenAfterGroup; sibling.childrenAfterAggFilter = rootNode.childrenAfterAggFilter; sibling.childrenAfterSort = rootNode.childrenAfterSort; sibling.childrenMapped = rootNode.childrenMapped; sibling.allLeafChildren = rootNode.allLeafChildren; } } loadNewRowData(rowData) { this.rootNode.allLeafChildren = rowData?.map((dataItem, index) => this.createRowNode(dataItem, index)) ?? []; } setImmutableRowData(params, rowData) { const getRowIdFunc = (0, gridOptionsUtils_1._getRowIdCallback)(this.gos); const reorder = !this.gos.get('suppressMaintainUnsortedOrder'); const changedRowNodes = params.changedRowNodes; const processedNodes = new Set(); const rootNode = this.rootNode; const oldAllLeafChildren = rootNode.allLeafChildren; const oldAllLeafChildrenLen = oldAllLeafChildren.length; let nodesAdded = false; let nodesRemoved = false; let nodesUpdated = false; let orderChanged = false; for (let i = 0, prevSourceRowIndex = -1, len = rowData.length; i < len; i++) { const data = rowData[i]; let node = this.getRowNode(getRowIdFunc({ data, level: 0 })); if (!node) { nodesAdded = true; node = this.createRowNode(data, -1); changedRowNodes.add(node); } else { if (reorder) { const sourceRowIndex = node.sourceRowIndex; orderChanged || (orderChanged = sourceRowIndex <= prevSourceRowIndex || // A node was moved up, so order changed nodesAdded); // A node was inserted not at the end prevSourceRowIndex = sourceRowIndex; } if (node.data !== data) { nodesUpdated = true; node.updateData(data); changedRowNodes.update(node); } } processedNodes.add(node); } // Destroy the remaining unprocessed node and collect the removed that were selected. const nodesToUnselect = []; for (let i = 0; i < oldAllLeafChildrenLen; i++) { const node = oldAllLeafChildren[i]; if (!processedNodes.has(node)) { nodesRemoved = true; if (node.isSelected()) { nodesToUnselect.push(node); } this.rowNodeDeleted(node); changedRowNodes.remove(node); } } if (nodesAdded || nodesRemoved || orderChanged) { const newAllLeafChildren = new Array(processedNodes.size); // Preallocate let writeIdx = 0; if (!reorder) { // All the old nodes will be in the new array in the order they were in the old array // At the end of this loop, processedNodes will contain only the new appended nodes for (let i = 0; i < oldAllLeafChildrenLen; ++i) { const node = oldAllLeafChildren[i]; if (processedNodes.delete(node)) { node.sourceRowIndex = writeIdx; newAllLeafChildren[writeIdx++] = node; } } } for (const node of processedNodes) { node.sourceRowIndex = writeIdx; newAllLeafChildren[writeIdx++] = node; } rootNode.allLeafChildren = newAllLeafChildren; const sibling = rootNode.sibling; if (sibling) { sibling.allLeafChildren = newAllLeafChildren; } params.rowNodesOrderChanged || (params.rowNodesOrderChanged = orderChanged); } if (nodesAdded || nodesRemoved || orderChanged || nodesUpdated) { this.deselectNodes(nodesToUnselect); params.rowDataUpdated = true; } } /** Called when a node needs to be deleted */ rowNodeDeleted(node) { node.clearRowTopAndRowIndex(); // so row renderer knows to fade row out (and not reposition it) const id = node.id; const allNodesMap = this.allNodesMap; if (allNodesMap[id] === node) { delete allNodesMap[id]; } } updateRowData(rowDataTran, changedRowNodes) { this.dispatchRowDataUpdateStartedEvent(rowDataTran.add); const updateRowDataResult = { changedRowNodes, rowNodeTransaction: { remove: [], update: [], add: [] }, rowsInserted: false, }; const nodesToUnselect = []; const getRowIdFunc = (0, gridOptionsUtils_1._getRowIdCallback)(this.gos); this.executeRemove(getRowIdFunc, rowDataTran, updateRowDataResult, nodesToUnselect); this.executeUpdate(getRowIdFunc, rowDataTran, updateRowDataResult, nodesToUnselect); this.executeAdd(rowDataTran, updateRowDataResult); this.deselectNodes(nodesToUnselect); return updateRowDataResult; } executeAdd(rowDataTran, result) { const add = rowDataTran.add; if (!add?.length) { return; } let allLeafChildren = this.rootNode.allLeafChildren; let addIndex = allLeafChildren.length; if (typeof rowDataTran.addIndex === 'number') { addIndex = this.sanitizeAddIndex(rowDataTran.addIndex); if (addIndex > 0) { // TODO: this code should not be here, see AG-12602 // This was a fix for AG-6231, but is not the correct fix // We enable it only for trees that use getDataPath and not the new children field const getDataPath = this.gos.get('treeData') && this.gos.get('getDataPath'); if (getDataPath) { for (let i = 0; i < allLeafChildren.length; i++) { const node = allLeafChildren[i]; if (node?.rowIndex == addIndex - 1) { addIndex = i + 1; break; } } } } } const addLength = add.length; const changedRowNodes = result.changedRowNodes; // create new row nodes for each data item const newNodes = new Array(addLength); for (let i = 0; i < addLength; i++) { const newNode = this.createRowNode(add[i], addIndex + i); changedRowNodes.add(newNode); newNodes[i] = newNode; } const rootNode = this.rootNode; if (addIndex < allLeafChildren.length) { // Insert at the specified index const nodesBeforeIndex = allLeafChildren.slice(0, addIndex); const nodesAfterIndex = allLeafChildren.slice(addIndex, allLeafChildren.length); // update latter row indexes const nodesAfterIndexFirstIndex = nodesBeforeIndex.length + newNodes.length; for (let index = 0, length = nodesAfterIndex.length; index < length; ++index) { nodesAfterIndex[index].sourceRowIndex = nodesAfterIndexFirstIndex + index; } allLeafChildren = [...nodesBeforeIndex, ...newNodes, ...nodesAfterIndex]; // Mark the result as rows inserted result.rowsInserted = true; } else { // Just append at the end allLeafChildren = allLeafChildren.concat(newNodes); } rootNode.allLeafChildren = allLeafChildren; const sibling = rootNode.sibling; if (sibling) { sibling.allLeafChildren = allLeafChildren; } // add new row nodes to the transaction add items result.rowNodeTransaction.add = newNodes; } executeRemove(getRowIdFunc, rowDataTran, { changedRowNodes, rowNodeTransaction }, nodesToUnselect) { const { remove } = rowDataTran; if (!remove?.length) { return; } const rowIdsRemoved = {}; remove.forEach((item) => { const rowNode = this.lookupRowNode(getRowIdFunc, item); if (!rowNode) { return; } if (rowNode.isSelected()) { nodesToUnselect.push(rowNode); } // so row renderer knows to fade row out (and not reposition it) rowNode.clearRowTopAndRowIndex(); // NOTE: were we could remove from allLeaveChildren, however removeFromArray() is expensive, especially // if called multiple times (eg deleting lots of rows) and if allLeafChildren is a large list rowIdsRemoved[rowNode.id] = true; // removeFromArray(this.rootNode.allLeafChildren, rowNode); delete this.allNodesMap[rowNode.id]; rowNodeTransaction.remove.push(rowNode); changedRowNodes.remove(rowNode); }); const rootNode = this.rootNode; rootNode.allLeafChildren = rootNode.allLeafChildren?.filter((rowNode) => !rowIdsRemoved[rowNode.id]) ?? null; // after rows have been removed, all following rows need the position index updated rootNode.allLeafChildren?.forEach((node, idx) => { node.sourceRowIndex = idx; }); const sibling = rootNode.sibling; if (sibling) { sibling.allLeafChildren = rootNode.allLeafChildren; } } executeUpdate(getRowIdFunc, rowDataTran, { changedRowNodes, rowNodeTransaction }, nodesToUnselect) { const { update } = rowDataTran; if (!update?.length) { return; } update.forEach((item) => { const rowNode = this.lookupRowNode(getRowIdFunc, item); if (!rowNode) { return; } rowNode.updateData(item); if (!rowNode.selectable && rowNode.isSelected()) { nodesToUnselect.push(rowNode); } rowNodeTransaction.update.push(rowNode); changedRowNodes.update(rowNode); }); } dispatchRowDataUpdateStartedEvent(rowData) { this.eventSvc.dispatchEvent({ type: 'rowDataUpdateStarted', firstRowData: rowData?.length ? rowData[0] : null, }); } deselectNodes(nodesToUnselect) { const source = 'rowDataChanged'; const selectionSvc = this.beans.selectionSvc; const selectionChanged = nodesToUnselect.length > 0; if (selectionChanged) { selectionSvc?.setNodesSelected({ newValue: false, nodes: nodesToUnselect, suppressFinishActions: true, source, }); } // we do this regardless of nodes to unselect or not, as it's possible // a new node was inserted, so a parent that was previously selected (as all // children were selected) should not be tri-state (as new one unselected against // all other selected children). selectionSvc?.updateGroupsFromChildrenSelections?.(source); if (selectionChanged) { this.eventSvc.dispatchEvent({ type: 'selectionChanged', source: source, }); } } sanitizeAddIndex(addIndex) { const allChildrenCount = this.rootNode.allLeafChildren?.length ?? 0; if (addIndex < 0 || addIndex >= allChildrenCount || Number.isNaN(addIndex)) { return allChildrenCount; // Append. Also for negative values, as it was historically the behavior. } // Ensure index is a whole number and not a floating point. // Use case: the user want to add a row in the middle, doing addIndex = array.length / 2. // If the array has an odd number of elements, the addIndex need to be rounded up. // Consider that array.slice does round up internally, but we are setting this value to node.sourceRowIndex. return Math.ceil(addIndex); } createRowNode(data, sourceRowIndex) { const node = new rowNode_1.RowNode(this.beans); node.parent = this.rootNode; node.level = 0; node.group = false; node.expanded = false; node.sourceRowIndex = sourceRowIndex; node.setDataAndId(data, String(this.nextId)); if (this.allNodesMap[node.id]) { (0, logging_1._warn)(2, { nodeId: node.id }); } this.allNodesMap[node.id] = node; this.nextId++; return node; } lookupRowNode(getRowIdFunc, data) { let rowNode; if (getRowIdFunc) { // find rowNode using id const id = getRowIdFunc({ data, level: 0 }); rowNode = this.allNodesMap[id]; if (!rowNode) { (0, logging_1._error)(4, { id }); return null; } } else { // find rowNode using object references rowNode = this.rootNode?.allLeafChildren?.find((node) => node.data === data); if (!rowNode) { (0, logging_1._error)(5, { data }); return null; } } return rowNode || null; } } exports.AbstractClientSideNodeManager = AbstractClientSideNodeManager; /***/ }), /***/ 2106: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ChangedRowNodes = void 0; class ChangedRowNodes { constructor() { this.removals = new Set(); this.updates = new Set(); this.adds = new Set(); } /** Marks a row as removed. Order of operations is: remove, update, add */ remove(node) { if (!this.adds.delete(node)) { this.updates.delete(node); this.removals.add(node); } } /** Marks a row as updated. Order of operations is: remove, update, add */ update(node) { if (!this.adds.has(node)) { this.updates.add(node); } } /** Marks a row as added. Order of operation is: remove, update, add */ add(node) { this.adds.add(node); } } exports.ChangedRowNodes = ChangedRowNodes; /***/ }), /***/ 5747: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ClientSideNodeManager = void 0; const abstractClientSideNodeManager_1 = __webpack_require__(1954); class ClientSideNodeManager extends abstractClientSideNodeManager_1.AbstractClientSideNodeManager { constructor() { super(...arguments); this.beanName = 'csrmNodeSvc'; } } exports.ClientSideNodeManager = ClientSideNodeManager; /***/ }), /***/ 3278: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ClientSideRowModel = void 0; const beanStub_1 = __webpack_require__(8731); const rowNode_1 = __webpack_require__(3373); const gridOptionsUtils_1 = __webpack_require__(7274); const array_1 = __webpack_require__(1502); const changedPath_1 = __webpack_require__(6800); const function_1 = __webpack_require__(2043); const logging_1 = __webpack_require__(7764); const changedRowNodes_1 = __webpack_require__(2106); const filterStage_1 = __webpack_require__(8287); const sortStage_1 = __webpack_require__(9849); class ClientSideRowModel extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'rowModel'; // top most node of the tree. the children are the user provided data. this.rootNode = null; this.rowsToDisplay = []; // the rows mapped to rows to display /** Has the start method been called */ this.started = false; /** * This is to prevent refresh model being called when it's already being called. * E.g. the group stage can trigger initial state filter model to be applied. This fires onFilterChanged, * which then triggers the listener here that calls refresh model again but at the filter stage * (which is about to be run by the original call). */ this.isRefreshingModel = false; this.rowNodesCountReady = false; this.rowCountReady = false; this.onRowHeightChanged_debounced = (0, function_1._debounce)(this, this.onRowHeightChanged.bind(this), 100); } wireBeans(beans) { this.colModel = beans.colModel; this.valueCache = beans.valueCache; this.filterStage = beans.filterStage; this.sortStage = beans.sortStage; this.flattenStage = beans.flattenStage; this.groupStage = beans.groupStage; this.aggStage = beans.aggStage; this.pivotStage = beans.pivotStage; this.filterAggStage = beans.filterAggStage; } postConstruct() { this.orderedStages = [ this.groupStage, this.filterStage, this.pivotStage, this.aggStage, this.sortStage, this.filterAggStage, this.flattenStage, ].filter((stage) => !!stage); const refreshEverythingFunc = this.refreshModel.bind(this, { step: 'group' }); const refreshEverythingAfterColsChangedFunc = this.refreshModel.bind(this, { step: 'group', afterColumnsChanged: true, keepRenderedRows: true, // we want animations cos sorting or filtering could be applied animate: !this.gos.get('suppressAnimationFrame'), }); this.addManagedEventListeners({ newColumnsLoaded: refreshEverythingAfterColsChangedFunc, columnRowGroupChanged: refreshEverythingFunc, columnValueChanged: this.onValueChanged.bind(this), columnPivotChanged: this.refreshModel.bind(this, { step: 'pivot' }), filterChanged: this.onFilterChanged.bind(this), sortChanged: this.onSortChanged.bind(this), columnPivotModeChanged: refreshEverythingFunc, gridStylesChanged: this.onGridStylesChanges.bind(this), gridReady: this.onGridReady.bind(this), }); // doesn't need done if doing full reset // Property listeners which call `refreshModel` at different stages this.addPropertyListeners(); this.rootNode = new rowNode_1.RowNode(this.beans); const nodeManager = this.getNewNodeManager(); this.nodeManager = nodeManager; nodeManager.activate(this.rootNode); } getNewNodeManager() { const { gos, beans } = this; let nodeManager; if (gos.get('treeData')) { if (gos.get('treeDataChildrenField')) { nodeManager = beans.csrmChildrenTreeNodeSvc; } else { nodeManager = beans.csrmPathTreeNodeSvc; } } return nodeManager ?? beans.csrmNodeSvc; } addPropertyListeners() { // Omitted Properties // // We do not act reactively on all functional properties, as it's possible the application is React and // has not memoised the property and it's getting set every render. // // ** LIST OF NON REACTIVE, NO ARGUMENT // // getDataPath, getRowId -- these are called once for each Node when the Node is created. // -- these are immutable Node properties (ie a Node ID cannot be changed) // // isRowMaster -- called when masterDetail is true and the Node is created or the property was changed // // getRowHeight - this is called once when Node is created, if a new getRowHeight function is provided, // - we do not revisit the heights of each node. // // pivotDefaultExpanded - relevant for initial pivot column creation, no impact on existing pivot columns. // // deltaSort - this changes the type of algorithm used only, it doesn't change the sort order. so no point // - in doing the sort again as the same result will be got. the new Prop will be used next time we sort. // // ** LIST OF NON REACTIVE, SOME ARGUMENT // ** For these, they could be reactive, but not convinced the business argument is strong enough, // ** so leaving as non-reactive for now, and see if anyone complains. // // processPivotResultColDef, processPivotResultColGroupDef // - there is an argument for having these reactive, that if the application changes // - these props, we should re-create the Pivot Columns, however it's highly unlikely // - the application would change these functions, far more likely the functions were // - non memoised correctly. const allProps = [ 'treeData', 'treeDataChildrenField', ...this.orderedStages.flatMap(({ refreshProps }) => [...refreshProps]), ]; this.addManagedPropertyListeners(allProps, (params) => { const properties = params.changeSet?.properties; if (properties) { this.onPropChange(properties); } }); // TODO: HACK: rowData should be in the list of allProps instead of being registered separately. // but due to AG-13498, the columnModel will execute AFTER the previous listeners if properties // the column model listen to together with the previous listener are changed together. // So this is a temporary solution to make sure rowData is processed after the columnModel is ready. // Unfortunately this can result in double refresh when multiple properties are changed together, as it was before version 33. this.addManagedPropertyListener('rowData', () => this.onPropChange(['rowData'])); this.addManagedPropertyListener('rowHeight', () => this.resetRowHeights()); } start() { this.started = true; if (this.rowNodesCountReady) { this.refreshModel({ step: 'group', rowDataUpdated: true, newData: true }); } else { this.setInitialData(); } } setInitialData() { const rowData = this.gos.get('rowData'); if (rowData) { this.onPropChange(['rowData']); } } ensureRowHeightsValid(startPixel, endPixel, startLimitIndex, endLimitIndex) { let atLeastOneChange; let res = false; // we do this multiple times as changing the row heights can also change the first and last rows, // so the first pass can make lots of rows smaller, which means the second pass we end up changing // more rows. do { atLeastOneChange = false; const rowAtStartPixel = this.getRowIndexAtPixel(startPixel); const rowAtEndPixel = this.getRowIndexAtPixel(endPixel); // keep check to current page if doing pagination const firstRow = Math.max(rowAtStartPixel, startLimitIndex); const lastRow = Math.min(rowAtEndPixel, endLimitIndex); for (let rowIndex = firstRow; rowIndex <= lastRow; rowIndex++) { const rowNode = this.getRow(rowIndex); if (rowNode.rowHeightEstimated) { const rowHeight = (0, gridOptionsUtils_1._getRowHeightForNode)(this.beans, rowNode); rowNode.setRowHeight(rowHeight.height); atLeastOneChange = true; res = true; } } if (atLeastOneChange) { this.setRowTopAndRowIndex(); } } while (atLeastOneChange); return res; } onPropChange(properties) { if (!this.rootNode) { return; // Destroyed. } const gos = this.gos; const changedProps = new Set(properties); const params = { step: 'nothing', changedProps, }; const rowDataChanged = changedProps.has('rowData'); const treeDataChanged = changedProps.has('treeData'); const oldNodeManager = this.nodeManager; const nodeManager = this.getNewNodeManager(); const reset = oldNodeManager !== nodeManager || (changedProps.has('treeDataChildrenField') && gos.get('treeData')); let newRowData; if (treeDataChanged) { params.step = 'group'; } if (reset || rowDataChanged) { newRowData = gos.get('rowData'); if (newRowData != null && !Array.isArray(newRowData)) { newRowData = null; (0, logging_1._warn)(1); } } if (reset) { // If we are here, it means that the row manager need to be changed or fully reloaded if (!rowDataChanged) { // No new rowData was passed, so to include user executed transaction we need to extract // the row data from the node manager as it might be different from the original rowData newRowData = oldNodeManager?.extractRowData() ?? newRowData; } if (oldNodeManager !== nodeManager) { oldNodeManager?.deactivate(); this.nodeManager = nodeManager; } nodeManager.activate(this.rootNode); } if (newRowData) { const immutable = !reset && !this.isEmpty() && newRowData.length > 0 && gos.exists('getRowId') && // this property is a backwards compatibility property, for those who want // the old behaviour of Row IDs but NOT Immutable Data. !gos.get('resetRowDataOnUpdate'); if (immutable) { params.keepRenderedRows = true; params.animate = !this.gos.get('suppressAnimationFrame'); params.changedRowNodes = new changedRowNodes_1.ChangedRowNodes(); nodeManager.setImmutableRowData(params, newRowData); } else { params.rowDataUpdated = true; params.newData = true; // no need to invalidate cache, as the cache is stored on the rowNode, // so new rowNodes means the cache is wiped anyway. // - clears selection, done before we set row data to ensure it isn't readded via `selectionSvc.syncInOldRowNode` this.beans.selectionSvc?.reset('rowDataChanged'); this.rowNodesCountReady = true; nodeManager.setNewRowData(newRowData); } } if (params.rowDataUpdated) { params.step = 'group'; } else if (params.step === 'nothing') { for (const { refreshProps, step } of this.orderedStages) { if (properties.some((prop) => refreshProps.has(prop))) { params.step = step; break; } } } if (params.step !== 'nothing') { this.refreshModel(params); } } setRowTopAndRowIndex() { const { beans } = this; const defaultRowHeight = beans.environment.getDefaultRowHeight(); let nextRowTop = 0; // mapping displayed rows is not needed for this method, however it's used in // clearRowTopAndRowIndex(), and given we are looping through this.rowsToDisplay here, // we create the map here for performance reasons, so we don't loop a second time // in clearRowTopAndRowIndex() const displayedRowsMapped = new Set(); // we don't estimate if doing fullHeight or autoHeight, as all rows get rendered all the time // with these two layouts. const allowEstimate = (0, gridOptionsUtils_1._isDomLayout)(this.gos, 'normal'); const rowsToDisplay = this.rowsToDisplay; for (let i = 0, len = rowsToDisplay.length; i < len; ++i) { const rowNode = rowsToDisplay[i]; if (rowNode.id != null) { displayedRowsMapped.add(rowNode.id); } if (rowNode.rowHeight == null) { const rowHeight = (0, gridOptionsUtils_1._getRowHeightForNode)(beans, rowNode, allowEstimate, defaultRowHeight); rowNode.setRowHeight(rowHeight.height, rowHeight.estimated); } rowNode.setRowTop(nextRowTop); rowNode.setRowIndex(i); nextRowTop += rowNode.rowHeight; } return displayedRowsMapped; } clearRowTopAndRowIndex(changedPath, displayedRowsMapped) { const changedPathActive = changedPath.active; const clearIfNotDisplayed = (rowNode) => { if (rowNode && rowNode.id != null && !displayedRowsMapped.has(rowNode.id)) { rowNode.clearRowTopAndRowIndex(); } }; const recurse = (rowNode) => { if (rowNode === null) { return; } clearIfNotDisplayed(rowNode); clearIfNotDisplayed(rowNode.detailNode); clearIfNotDisplayed(rowNode.sibling); if (rowNode.hasChildren()) { if (rowNode.childrenAfterGroup) { // if a changedPath is active, it means we are here because of a transaction update or // a change detection. neither of these impacts the open/closed state of groups. so if // a group is not open this time, it was not open last time. so we know all closed groups // already have their top positions cleared. so there is no need to traverse all the way // when changedPath is active and the rowNode is not expanded. const isRootNode = rowNode.level == -1; // we need to give special consideration for root node, // as expanded=undefined for root node const skipChildren = changedPathActive && !isRootNode && !rowNode.expanded; if (!skipChildren) { rowNode.childrenAfterGroup.forEach(recurse); } } } }; recurse(this.rootNode); } // returns false if row was moved, otherwise true ensureRowsAtPixel(rowNodes, pixel, increment = 0) { const indexAtPixelNow = this.getRowIndexAtPixel(pixel); const rowNodeAtPixelNow = this.getRow(indexAtPixelNow); const animate = !this.gos.get('suppressAnimationFrame'); if (rowNodeAtPixelNow === rowNodes[0]) { return false; } const allLeafChildren = this.rootNode?.allLeafChildren; if (!allLeafChildren) { return false; } // TODO: this implementation is currently quite inefficient and it could be optimized to run in O(n) in a single pass rowNodes.forEach((rowNode) => { (0, array_1._removeFromArray)(allLeafChildren, rowNode); }); rowNodes.forEach((rowNode, idx) => { allLeafChildren.splice(Math.max(indexAtPixelNow + increment, 0) + idx, 0, rowNode); }); rowNodes.forEach((rowNode, index) => { rowNode.sourceRowIndex = index; // Update all the sourceRowIndex to reflect the new positions }); this.refreshModel({ step: 'group', keepRenderedRows: true, animate, rowNodesOrderChanged: true, // We assume the order changed and we don't need to check if it really did }); return true; } highlightRowAtPixel(rowNode, pixel) { const indexAtPixelNow = pixel != null ? this.getRowIndexAtPixel(pixel) : null; const rowNodeAtPixelNow = indexAtPixelNow != null ? this.getRow(indexAtPixelNow) : null; if (!rowNodeAtPixelNow || !rowNode || pixel == null) { this.clearHighlightedRow(); return; } const highlight = this.getHighlightPosition(pixel, rowNodeAtPixelNow); const isSamePosition = this.isHighlightingCurrentPosition(rowNode, rowNodeAtPixelNow, highlight); const isDifferentNode = this.lastHighlightedRow != null && this.lastHighlightedRow !== rowNodeAtPixelNow; if (isSamePosition || isDifferentNode) { this.clearHighlightedRow(); if (isSamePosition) { return; } } this.setRowNodeHighlighted(rowNodeAtPixelNow, highlight); this.lastHighlightedRow = rowNodeAtPixelNow; } setRowNodeHighlighted(rowNode, highlighted) { if (rowNode.highlighted !== highlighted) { rowNode.highlighted = highlighted; rowNode.dispatchRowEvent('rowHighlightChanged'); } } getHighlightPosition(pixel, rowNode) { if (!rowNode) { const index = this.getRowIndexAtPixel(pixel); rowNode = this.getRow(index || 0); if (!rowNode) { return 'Below'; } } const { rowTop, rowHeight } = rowNode; return pixel - rowTop < rowHeight / 2 ? 'Above' : 'Below'; } getLastHighlightedRowNode() { return this.lastHighlightedRow; } isHighlightingCurrentPosition(movingRowNode, hoveredRowNode, highlightPosition) { if (movingRowNode === hoveredRowNode) { return true; } const diff = highlightPosition === 'Above' ? -1 : 1; if (this.getRow(hoveredRowNode.rowIndex + diff) === movingRowNode) { return true; } return false; } clearHighlightedRow() { if (this.lastHighlightedRow) { this.setRowNodeHighlighted(this.lastHighlightedRow, null); this.lastHighlightedRow = null; } } isLastRowIndexKnown() { return true; } getRowCount() { if (this.rowsToDisplay) { return this.rowsToDisplay.length; } return 0; } /** * Returns the number of rows with level === 1 */ getTopLevelRowCount() { const rootNode = this.rootNode; if (!rootNode) { return 0; } if (this.rowsToDisplay.length === 0) { return 0; } // exception to func comment, if showing root node, then we return that const showingRootNode = this.rowsToDisplay && this.rowsToDisplay[0] === rootNode; if (showingRootNode) { return 1; } const filteredChildren = rootNode.childrenAfterAggFilter; const totalFooterInc = rootNode.sibling ? 1 : 0; return (filteredChildren ? filteredChildren.length : 0) + totalFooterInc; } /** * Get the row display index by the top level index * top level index is the index of rows with level === 1 */ getTopLevelRowDisplayedIndex(topLevelIndex) { const { rootNode, rowsToDisplay } = this; const showingRootNode = !rootNode || !rowsToDisplay.length || rowsToDisplay[0] === rootNode; // exception to function comment, if showing footer node (level === -1) return 0. if (showingRootNode) { return topLevelIndex; } const { childrenAfterSort } = rootNode; const getDefaultIndex = (adjustedIndex) => { let rowNode = childrenAfterSort[adjustedIndex]; if (this.gos.get('groupHideOpenParents')) { // if hideOpenParents, then get lowest displayed descendent while (rowNode.expanded && rowNode.childrenAfterSort && rowNode.childrenAfterSort.length > 0) { rowNode = rowNode.childrenAfterSort[0]; } } return rowNode.rowIndex; }; const { footerSvc } = this.beans; if (footerSvc) { return footerSvc.getTopDisplayIndex(rowsToDisplay, topLevelIndex, childrenAfterSort, getDefaultIndex); } else { return getDefaultIndex(topLevelIndex); } } getRowBounds(index) { const rowNode = this.rowsToDisplay[index]; if (rowNode) { return { rowTop: rowNode.rowTop, rowHeight: rowNode.rowHeight, }; } return null; } onRowGroupOpened() { const animate = (0, gridOptionsUtils_1._isAnimateRows)(this.gos); this.refreshModel({ step: 'map', keepRenderedRows: true, animate: animate }); } onFilterChanged(event) { if (event.afterDataChange) { return; } const animate = (0, gridOptionsUtils_1._isAnimateRows)(this.gos); const primaryOrQuickFilterChanged = event.columns.length === 0 || event.columns.some((col) => col.isPrimary()); const step = primaryOrQuickFilterChanged ? 'filter' : 'filter_aggregates'; this.refreshModel({ step: step, keepRenderedRows: true, animate: animate }); } onSortChanged() { const animate = (0, gridOptionsUtils_1._isAnimateRows)(this.gos); this.refreshModel({ step: 'sort', keepRenderedRows: true, animate: animate, }); } getType() { return 'clientSide'; } onValueChanged() { this.refreshModel({ step: this.colModel.isPivotActive() ? 'pivot' : 'aggregate' }); } createChangePath(enabled) { // for updates, if the row is updated at all, then we re-calc all the values // in that row. we could compare each value to each old value, however if we // did this, we would be calling the valueSvc twice, once on the old value // and once on the new value. so it's less valueGetter calls if we just assume // each column is different. that way the changedPath is used so that only // the impacted parent rows are recalculated, parents who's children have // not changed are not impacted. const changedPath = new changedPath_1.ChangedPath(false, this.rootNode); if (!enabled) { changedPath.active = false; } return changedPath; } isSuppressModelUpdateAfterUpdateTransaction(params) { if (!this.gos.get('suppressModelUpdateAfterUpdateTransaction')) { return false; // Not suppressed } const { changedRowNodes, newData, rowDataUpdated } = params; if (!changedRowNodes || newData || !rowDataUpdated) { return false; // Not a transaction update } if (changedRowNodes.removals.size || changedRowNodes.adds.size) { return false; // There are added rows or removed rows, not just updates } return true; // Nothing changed, or only updates with no new rows and no removals } refreshModel(params) { if (!this.rootNode) { return; // Destroyed } // this goes through the pipeline of stages. what's in my head is similar // to the diagram on this page: // http://commons.apache.org/sandbox/commons-pipeline/pipeline_basics.html // however we want to keep the results of each stage, hence we manually call // each step rather than have them chain each other. // fallthrough in below switch is on purpose, // eg if STEP_FILTER, then all steps below this // step get done // let start: number; // console.log('======= start ======='); const changedPath = (params.changedPath ?? (params.changedPath = this.createChangePath(!params.newData && !!params.rowDataUpdated))); this.nodeManager.refreshModel?.(params, this.started); this.eventSvc.dispatchEvent({ type: 'beforeRefreshModel', params }); if (!this.started) { return; // Destroyed or not yet started } if (params.rowDataUpdated) { this.eventSvc.dispatchEvent({ type: 'rowDataUpdated' }); } if (this.isRefreshingModel || this.colModel.changeEventsDispatching || this.isSuppressModelUpdateAfterUpdateTransaction(params)) { return; } this.isRefreshingModel = true; switch (params.step) { case 'group': { this.doRowGrouping(params.changedRowNodes, changedPath, !!params.rowNodesOrderChanged, !!params.afterColumnsChanged); } /* eslint-disable no-fallthrough */ case 'filter': this.doFilter(changedPath); case 'pivot': this.doPivot(changedPath); case 'aggregate': // depends on agg fields this.doAggregate(changedPath); case 'filter_aggregates': this.doFilterAggregates(changedPath); case 'sort': this.doSort(params.changedRowNodes, changedPath); case 'map': this.doRowsToDisplay(); /* eslint-enable no-fallthrough */ } // set all row tops to null, then set row tops on all visible rows. if we don't // do this, then the algorithm below only sets row tops, old row tops from old rows // will still lie around const displayedNodesMapped = this.setRowTopAndRowIndex(); this.clearRowTopAndRowIndex(changedPath, displayedNodesMapped); this.isRefreshingModel = false; this.eventSvc.dispatchEvent({ type: 'modelUpdated', animate: params.animate, keepRenderedRows: params.keepRenderedRows, newData: params.newData, newPage: false, keepUndoRedoStack: params.keepUndoRedoStack, }); } isEmpty() { return !this.rootNode?.allLeafChildren?.length || !this.colModel?.ready; } isRowsToRender() { return this.rowsToDisplay.length > 0; } getNodesInRangeForSelection(firstInRange, lastInRange) { let started = false; let finished = false; const result = []; const groupsSelectChildren = (0, gridOptionsUtils_1._getGroupSelectsDescendants)(this.gos); this.forEachNodeAfterFilterAndSort((rowNode) => { // range has been closed, skip till end if (finished) { return; } if (started) { if (rowNode === lastInRange || rowNode === firstInRange) { // check if this is the last node we're going to be adding finished = true; // if the final node was a group node, and we're doing groupSelectsChildren // make the exception to select all of it's descendants too if (rowNode.group && groupsSelectChildren) { result.push(...rowNode.allLeafChildren); return; } } } if (!started) { if (rowNode !== lastInRange && rowNode !== firstInRange) { // still haven't hit a boundary node, keep searching return; } started = true; } // only select leaf nodes if groupsSelectChildren const includeThisNode = !rowNode.group || !groupsSelectChildren; if (includeThisNode) { result.push(rowNode); return; } }); return result; } getTopLevelNodes() { return this.rootNode?.childrenAfterGroup ?? null; } getRow(index) { return this.rowsToDisplay[index]; } isRowPresent(rowNode) { return this.rowsToDisplay.indexOf(rowNode) >= 0; } getRowIndexAtPixel(pixelToMatch) { const rowsToDisplay = this.rowsToDisplay; if (this.isEmpty() || rowsToDisplay.length === 0) { return -1; } // do binary search of tree // http://oli.me.uk/2013/06/08/searching-javascript-arrays-with-a-binary-search/ let bottomPointer = 0; let topPointer = rowsToDisplay.length - 1; // quick check, if the pixel is out of bounds, then return last row if (pixelToMatch <= 0) { // if pixel is less than or equal zero, it's always the first row return 0; } const lastNode = (0, array_1._last)(rowsToDisplay); if (lastNode.rowTop <= pixelToMatch) { return rowsToDisplay.length - 1; } let oldBottomPointer = -1; let oldTopPointer = -1; while (true) { const midPointer = Math.floor((bottomPointer + topPointer) / 2); const currentRowNode = rowsToDisplay[midPointer]; if (this.isRowInPixel(currentRowNode, pixelToMatch)) { return midPointer; } if (currentRowNode.rowTop < pixelToMatch) { bottomPointer = midPointer + 1; } else if (currentRowNode.rowTop > pixelToMatch) { topPointer = midPointer - 1; } // infinite loops happen when there is space between rows. this can happen // when Auto Height is active, cos we re-calculate row tops asynchronously // when row heights change, which can temporarily result in gaps between rows. const caughtInInfiniteLoop = oldBottomPointer === bottomPointer && oldTopPointer === topPointer; if (caughtInInfiniteLoop) { return midPointer; } oldBottomPointer = bottomPointer; oldTopPointer = topPointer; } } isRowInPixel(rowNode, pixelToMatch) { const topPixel = rowNode.rowTop; const bottomPixel = rowNode.rowTop + rowNode.rowHeight; const pixelInRow = topPixel <= pixelToMatch && bottomPixel > pixelToMatch; return pixelInRow; } forEachLeafNode(callback) { this.rootNode?.allLeafChildren?.forEach((rowNode, index) => callback(rowNode, index)); } forEachNode(callback, includeFooterNodes = false) { this.depthFirstSearchRowNodes(callback, includeFooterNodes); } forEachDisplayedNode(callback) { this.rowsToDisplay.forEach(callback); } forEachNodeAfterFilter(callback, includeFooterNodes = false) { this.depthFirstSearchRowNodes(callback, includeFooterNodes, (node) => node.childrenAfterAggFilter); } forEachNodeAfterFilterAndSort(callback, includeFooterNodes = false) { this.depthFirstSearchRowNodes(callback, includeFooterNodes, (node) => node.childrenAfterSort); } forEachPivotNode(callback, includeFooterNodes = false, afterSort = false) { const childrenField = afterSort ? 'childrenAfterSort' : 'childrenAfterGroup'; // for pivot, we don't go below leafGroup levels this.depthFirstSearchRowNodes(callback, includeFooterNodes, (node) => !node.leafGroup ? node[childrenField] : null); } /** * Iterate through each node and all of its children * @param callback the function to execute for each node * @param includeFooterNodes whether to also iterate over footer nodes * @param nodes the nodes to start iterating over * @param getChildren a function to determine the recursion strategy * @param startIndex the index to start from * @returns the index ended at */ depthFirstSearchRowNodes(callback, includeFooterNodes = false, getChildren = (node) => node.childrenAfterGroup, node = this.rootNode, startIndex = 0) { let index = startIndex; if (!node) { return index; } const isRootNode = node === this.rootNode; if (!isRootNode) { callback(node, index++); } const { footerSvc } = this.beans; if (node.hasChildren() && !node.footer) { const children = getChildren(node); if (children) { index = footerSvc?.addTotalRows(index, node, callback, includeFooterNodes, isRootNode, 'top') ?? index; for (const node of children) { index = this.depthFirstSearchRowNodes(callback, includeFooterNodes, getChildren, node, index); } return (footerSvc?.addTotalRows(index, node, callback, includeFooterNodes, isRootNode, 'bottom') ?? index); } } return index; } // it's possible to recompute the aggregate without doing the other parts // + api.refreshClientSideRowModel('aggregate') doAggregate(changedPath) { const rootNode = this.rootNode; if (rootNode) { this.aggStage?.execute({ rowNode: rootNode, changedPath: changedPath }); } } doFilterAggregates(changedPath) { const rootNode = this.rootNode; if (this.filterAggStage) { this.filterAggStage.execute({ rowNode: rootNode, changedPath: changedPath }); } else { // If filterAggStage is undefined, then so is the grouping stage, so all children should be on the rootNode. rootNode.childrenAfterAggFilter = rootNode.childrenAfterFilter; } } doSort(changedRowNodes, changedPath) { const { groupHideOpenParentsSvc } = this.beans; if (this.sortStage) { this.sortStage.execute({ rowNode: this.rootNode, changedRowNodes, changedPath: changedPath, }); } else { changedPath.forEachChangedNodeDepthFirst((rowNode) => { // this needs to run before sorting groupHideOpenParentsSvc?.pullDownGroupDataForHideOpenParents(rowNode.childrenAfterAggFilter, true); rowNode.childrenAfterSort = rowNode.childrenAfterAggFilter.slice(0); (0, sortStage_1.updateRowNodeAfterSort)(rowNode); }); } // this needs to run after sorting groupHideOpenParentsSvc?.updateGroupDataForHideOpenParents(changedPath); } doRowGrouping(changedRowNodes, changedPath, rowNodesOrderChanged, afterColumnsChanged) { const treeData = this.nodeManager.treeData; const rootNode = this.rootNode; if (!treeData) { const groupStage = this.groupStage; if (groupStage) { groupStage.execute({ rowNode: rootNode, changedPath, changedRowNodes, rowNodesOrderChanged, afterColumnsChanged, }); } else { const sibling = rootNode.sibling; rootNode.childrenAfterGroup = rootNode.allLeafChildren; if (sibling) { sibling.childrenAfterGroup = rootNode.childrenAfterGroup; } rootNode.updateHasChildren(); } } if (this.rowNodesCountReady) { // only if row data has been set this.rowCountReady = true; this.eventSvc.dispatchEventOnce({ type: 'rowCountReady' }); } } doFilter(changedPath) { if (this.filterStage) { this.filterStage.execute({ rowNode: this.rootNode, changedPath: changedPath }); } else { changedPath.forEachChangedNodeDepthFirst((rowNode) => { rowNode.childrenAfterFilter = rowNode.childrenAfterGroup; (0, filterStage_1.updateRowNodeAfterFilter)(rowNode); }, true); } } doPivot(changedPath) { this.pivotStage?.execute({ rowNode: this.rootNode, changedPath: changedPath }); } getRowNode(id) { // although id is typed a string, this could be called by the user, and they could have passed a number const idIsGroup = typeof id == 'string' && id.indexOf(rowNode_1.ROW_ID_PREFIX_ROW_GROUP) == 0; if (idIsGroup) { // only one users complained about getRowNode not working for groups, after years of // this working for normal rows. so have done quick implementation. if users complain // about performance, then GroupStage should store / manage created groups in a map, // which is a chunk of work. let res = undefined; this.forEachNode((node) => { if (node.id === id) { res = node; } }); return res; } return this.nodeManager.getRowNode(id); } batchUpdateRowData(rowDataTransaction, callback) { if (this.applyAsyncTransactionsTimeout == null) { this.rowDataTransactionBatch = []; const waitMillis = this.gos.get('asyncTransactionWaitMillis'); this.applyAsyncTransactionsTimeout = window.setTimeout(() => { if (this.isAlive()) { // Handle case where grid is destroyed before timeout is triggered this.executeBatchUpdateRowData(); } }, waitMillis); } this.rowDataTransactionBatch.push({ rowDataTransaction: rowDataTransaction, callback }); } flushAsyncTransactions() { if (this.applyAsyncTransactionsTimeout != null) { clearTimeout(this.applyAsyncTransactionsTimeout); this.executeBatchUpdateRowData(); } } executeBatchUpdateRowData() { this.valueCache?.onDataChanged(); const callbackFuncsBound = []; const rowNodeTrans = []; const changedRowNodes = new changedRowNodes_1.ChangedRowNodes(); let orderChanged = false; this.rowDataTransactionBatch?.forEach((tranItem) => { this.rowNodesCountReady = true; const { rowNodeTransaction, rowsInserted } = this.nodeManager.updateRowData(tranItem.rowDataTransaction, changedRowNodes); if (rowsInserted) { orderChanged = true; } rowNodeTrans.push(rowNodeTransaction); if (tranItem.callback) { callbackFuncsBound.push(tranItem.callback.bind(null, rowNodeTransaction)); } }); this.commitTransactions(orderChanged, changedRowNodes); // do callbacks in next VM turn so it's async if (callbackFuncsBound.length > 0) { window.setTimeout(() => { callbackFuncsBound.forEach((func) => func()); }, 0); } if (rowNodeTrans.length > 0) { this.eventSvc.dispatchEvent({ type: 'asyncTransactionsFlushed', results: rowNodeTrans, }); } this.rowDataTransactionBatch = null; this.applyAsyncTransactionsTimeout = undefined; } /** * Used to apply transaction changes. * Called by gridApi & rowDragFeature */ updateRowData(rowDataTran) { this.valueCache?.onDataChanged(); this.rowNodesCountReady = true; const changedRowNodes = new changedRowNodes_1.ChangedRowNodes(); const { rowNodeTransaction, rowsInserted } = this.nodeManager.updateRowData(rowDataTran, changedRowNodes); this.commitTransactions(rowsInserted, changedRowNodes); return rowNodeTransaction; } /** * Common to: * - executeBatchUpdateRowData (batch transactions) * - updateRowData (single transaction) * - setImmutableRowData (generated transaction) * * @param rowNodeTrans - the transactions to apply * @param orderChanged - whether the order of the rows has changed, either via generated transaction or user provided addIndex */ commitTransactions(rowNodesOrderChanged, changedRowNodes) { this.refreshModel({ step: 'group', rowDataUpdated: true, rowNodesOrderChanged, keepRenderedRows: true, animate: !this.gos.get('suppressAnimationFrame'), changedRowNodes, changedPath: this.createChangePath(true), }); } doRowsToDisplay() { const { flattenStage, rootNode } = this; let rowsToDisplay; if (flattenStage) { rowsToDisplay = flattenStage.execute({ rowNode: rootNode }); } else { rowsToDisplay = rootNode?.childrenAfterSort ?? []; for (const row of rowsToDisplay) { row.setUiLevel(0); } } this.rowsToDisplay = rowsToDisplay; } onRowHeightChanged() { this.refreshModel({ step: 'map', keepRenderedRows: true, keepUndoRedoStack: true, }); } resetRowHeights() { const rootNode = this.rootNode; if (!rootNode) { return; } const atLeastOne = this.resetRowHeightsForAllRowNodes(); rootNode.setRowHeight(rootNode.rowHeight, true); if (rootNode.sibling) { rootNode.sibling.setRowHeight(rootNode.sibling.rowHeight, true); } // when pivotMode but pivot not active, root node is displayed on its own // because it's only ever displayed alone, refreshing the model (onRowHeightChanged) is not required if (atLeastOne) { this.onRowHeightChanged(); } } resetRowHeightsForAllRowNodes() { let atLeastOne = false; this.forEachNode((rowNode) => { rowNode.setRowHeight(rowNode.rowHeight, true); // we keep the height each row is at, however we set estimated=true rather than clear the height. // this means the grid will not reset the row heights back to defaults, rather it will re-calc // the height for each row as the row is displayed. otherwise the scroll will jump when heights are reset. const detailNode = rowNode.detailNode; if (detailNode) { detailNode.setRowHeight(detailNode.rowHeight, true); } if (rowNode.sibling) { rowNode.sibling.setRowHeight(rowNode.sibling.rowHeight, true); } atLeastOne = true; }); return atLeastOne; } onGridStylesChanges(e) { if (e.rowHeightChanged) { if (this.beans.rowAutoHeight?.active) { return; } this.resetRowHeights(); } } onGridReady() { if (!this.started) { // App can start using API to add transactions, so need to add data into the node manager if not started this.setInitialData(); } } isRowDataLoaded() { return this.rowCountReady; } destroy() { super.destroy(); // Forcefully deallocate memory this.clearHighlightedRow(); this.started = false; this.rootNode = null; this.nodeManager = null; this.rowDataTransactionBatch = null; this.lastHighlightedRow = null; this.orderedStages = array_1._EmptyArray; this.rowsToDisplay = array_1._EmptyArray; } /** * @deprecated v33.1 */ onRowHeightChangedDebounced() { this.onRowHeightChanged_debounced(); } } exports.ClientSideRowModel = ClientSideRowModel; /***/ }), /***/ 4452: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getBestCostNodeSelection = exports.flushAsyncTransactions = exports.applyTransactionAsync = exports.applyTransaction = exports.resetRowHeights = exports.forEachNodeAfterFilterAndSort = exports.forEachNodeAfterFilter = exports.forEachLeafNode = exports.isRowDataEmpty = exports.refreshClientSideRowModel = exports.onGroupExpandedOrCollapsed = void 0; const rowModelApiUtils_1 = __webpack_require__(6876); const logging_1 = __webpack_require__(7764); function onGroupExpandedOrCollapsed(beans) { beans.expansionSvc?.onGroupExpandedOrCollapsed(); } exports.onGroupExpandedOrCollapsed = onGroupExpandedOrCollapsed; function refreshClientSideRowModel(beans, step) { const clientSideRowModel = (0, rowModelApiUtils_1._getClientSideRowModel)(beans); if (clientSideRowModel) { if (!step || step === 'everything') { step = 'group'; } clientSideRowModel.refreshModel({ step, keepRenderedRows: true, animate: !beans.gos.get('suppressAnimationFrame'), }); } } exports.refreshClientSideRowModel = refreshClientSideRowModel; function isRowDataEmpty(beans) { return (0, rowModelApiUtils_1._getClientSideRowModel)(beans)?.isEmpty() ?? true; } exports.isRowDataEmpty = isRowDataEmpty; function forEachLeafNode(beans, callback) { (0, rowModelApiUtils_1._getClientSideRowModel)(beans)?.forEachLeafNode(callback); } exports.forEachLeafNode = forEachLeafNode; function forEachNodeAfterFilter(beans, callback) { (0, rowModelApiUtils_1._getClientSideRowModel)(beans)?.forEachNodeAfterFilter(callback); } exports.forEachNodeAfterFilter = forEachNodeAfterFilter; function forEachNodeAfterFilterAndSort(beans, callback) { (0, rowModelApiUtils_1._getClientSideRowModel)(beans)?.forEachNodeAfterFilterAndSort(callback); } exports.forEachNodeAfterFilterAndSort = forEachNodeAfterFilterAndSort; function resetRowHeights(beans) { if (beans.rowAutoHeight?.active) { (0, logging_1._warn)(3); return; } (0, rowModelApiUtils_1._getClientSideRowModel)(beans)?.resetRowHeights(); } exports.resetRowHeights = resetRowHeights; function applyTransaction(beans, rowDataTransaction) { return beans.frameworkOverrides.wrapIncoming(() => (0, rowModelApiUtils_1._getClientSideRowModel)(beans)?.updateRowData(rowDataTransaction)); } exports.applyTransaction = applyTransaction; function applyTransactionAsync(beans, rowDataTransaction, callback) { beans.frameworkOverrides.wrapIncoming(() => (0, rowModelApiUtils_1._getClientSideRowModel)(beans)?.batchUpdateRowData(rowDataTransaction, callback)); } exports.applyTransactionAsync = applyTransactionAsync; function flushAsyncTransactions(beans) { beans.frameworkOverrides.wrapIncoming(() => (0, rowModelApiUtils_1._getClientSideRowModel)(beans)?.flushAsyncTransactions()); } exports.flushAsyncTransactions = flushAsyncTransactions; function getBestCostNodeSelection(beans) { return beans.selectionSvc?.getBestCostNodeSelection(); } exports.getBestCostNodeSelection = getBestCostNodeSelection; /***/ }), /***/ 9722: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ClientSideRowModelApiModule = exports.ClientSideRowModelModule = void 0; const sharedApiModule_1 = __webpack_require__(6437); const sortModule_1 = __webpack_require__(6620); const version_1 = __webpack_require__(7205); const clientSideNodeManager_1 = __webpack_require__(5747); const clientSideRowModel_1 = __webpack_require__(3278); const clientSideRowModelApi_1 = __webpack_require__(4452); const sortStage_1 = __webpack_require__(9849); /** * @feature Client-Side Row Model */ exports.ClientSideRowModelModule = { moduleName: 'ClientSideRowModel', version: version_1.VERSION, rowModels: ['clientSide'], beans: [clientSideNodeManager_1.ClientSideNodeManager, clientSideRowModel_1.ClientSideRowModel, sortStage_1.SortStage], dependsOn: [sortModule_1.SortModule], }; /** * @feature Client-Side Row Model */ exports.ClientSideRowModelApiModule = { moduleName: 'ClientSideRowModelApi', version: version_1.VERSION, apiFunctions: { onGroupExpandedOrCollapsed: clientSideRowModelApi_1.onGroupExpandedOrCollapsed, refreshClientSideRowModel: clientSideRowModelApi_1.refreshClientSideRowModel, isRowDataEmpty: clientSideRowModelApi_1.isRowDataEmpty, forEachLeafNode: clientSideRowModelApi_1.forEachLeafNode, forEachNodeAfterFilter: clientSideRowModelApi_1.forEachNodeAfterFilter, forEachNodeAfterFilterAndSort: clientSideRowModelApi_1.forEachNodeAfterFilterAndSort, resetRowHeights: clientSideRowModelApi_1.resetRowHeights, applyTransaction: clientSideRowModelApi_1.applyTransaction, applyTransactionAsync: clientSideRowModelApi_1.applyTransactionAsync, flushAsyncTransactions: clientSideRowModelApi_1.flushAsyncTransactions, getBestCostNodeSelection: clientSideRowModelApi_1.getBestCostNodeSelection, }, dependsOn: [sharedApiModule_1.CsrmSsrmSharedApiModule], }; /***/ }), /***/ 8287: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.FilterStage = exports.updateRowNodeAfterFilter = void 0; const beanStub_1 = __webpack_require__(8731); function updateRowNodeAfterFilter(rowNode) { if (rowNode.sibling) { rowNode.sibling.childrenAfterFilter = rowNode.childrenAfterFilter; } } exports.updateRowNodeAfterFilter = updateRowNodeAfterFilter; class FilterStage extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'filterStage'; this.refreshProps = new Set(['excludeChildrenWhenTreeDataFiltering']); this.step = 'filter'; } wireBeans(beans) { this.filterManager = beans.filterManager; } execute(params) { const { changedPath } = params; this.filter(changedPath); } filter(changedPath) { const filterActive = !!this.filterManager?.isChildFilterPresent(); this.filterNodes(filterActive, changedPath); } filterNodes(filterActive, changedPath) { const filterCallback = (rowNode, includeChildNodes) => { // recursively get all children that are groups to also filter if (rowNode.hasChildren()) { // result of filter for this node. when filtering tree data, includeChildNodes = true when parent passes if (filterActive && !includeChildNodes) { rowNode.childrenAfterFilter = rowNode.childrenAfterGroup.filter((childNode) => { // a group is included in the result if it has any children of it's own. // by this stage, the child groups are already filtered const passBecauseChildren = childNode.childrenAfterFilter && childNode.childrenAfterFilter.length > 0; // both leaf level nodes and tree data nodes have data. these get added if // the data passes the filter const passBecauseDataPasses = childNode.data && this.filterManager.doesRowPassFilter({ rowNode: childNode }); // note - tree data nodes pass either if a) they pass themselves or b) any children of that node pass return passBecauseChildren || passBecauseDataPasses; }); } else { // if not filtering, the result is the original list rowNode.childrenAfterFilter = rowNode.childrenAfterGroup; } } else { rowNode.childrenAfterFilter = rowNode.childrenAfterGroup; } updateRowNodeAfterFilter(rowNode); }; if (this.doingTreeDataFiltering()) { const treeDataDepthFirstFilter = (rowNode, alreadyFoundInParent) => { // tree data filter traverses the hierarchy depth first and includes child nodes if parent passes // filter, and parent nodes will be include if any children exist. if (rowNode.childrenAfterGroup) { for (let i = 0; i < rowNode.childrenAfterGroup.length; i++) { const childNode = rowNode.childrenAfterGroup[i]; // first check if current node passes filter before invoking child nodes const foundInParent = alreadyFoundInParent || this.filterManager.doesRowPassFilter({ rowNode: childNode }); if (childNode.childrenAfterGroup) { treeDataDepthFirstFilter(rowNode.childrenAfterGroup[i], foundInParent); } else { filterCallback(childNode, foundInParent); } } } filterCallback(rowNode, alreadyFoundInParent); }; const treeDataFilterCallback = (rowNode) => treeDataDepthFirstFilter(rowNode, false); changedPath.executeFromRootNode(treeDataFilterCallback); } else { const defaultFilterCallback = (rowNode) => filterCallback(rowNode, false); changedPath.forEachChangedNodeDepthFirst(defaultFilterCallback, true); } } doingTreeDataFiltering() { return this.gos.get('treeData') && !this.gos.get('excludeChildrenWhenTreeDataFiltering'); } } exports.FilterStage = FilterStage; /***/ }), /***/ 9849: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.SortStage = exports.updateRowNodeAfterSort = void 0; const beanStub_1 = __webpack_require__(8731); const gridOptionsUtils_1 = __webpack_require__(7274); const generic_1 = __webpack_require__(4422); function updateChildIndexes(rowNode) { if ((0, generic_1._missing)(rowNode.childrenAfterSort)) { return; } const listToSort = rowNode.childrenAfterSort; for (let i = 0; i < listToSort.length; i++) { const child = listToSort[i]; const firstChild = i === 0; const lastChild = i === rowNode.childrenAfterSort.length - 1; child.setFirstChild(firstChild); if (child.lastChild !== lastChild) { child.lastChild = lastChild; child.dispatchRowEvent('lastChildChanged'); } if (child.childIndex !== i) { child.childIndex = i; child.dispatchRowEvent('childIndexChanged'); } } } function updateRowNodeAfterSort(rowNode) { if (rowNode.sibling) { rowNode.sibling.childrenAfterSort = rowNode.childrenAfterSort; } updateChildIndexes(rowNode); } exports.updateRowNodeAfterSort = updateRowNodeAfterSort; class SortStage extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'sortStage'; this.refreshProps = new Set(['postSortRows', 'groupDisplayType', 'accentedSort']); this.step = 'sort'; } execute(params) { const beans = this.beans; const sortOptions = beans.sortSvc.getSortOptions(); const sortActive = (0, generic_1._exists)(sortOptions) && sortOptions.length > 0; const deltaSort = sortActive && !!params.changedRowNodes && // in time we can remove this check, so that delta sort is always // on if transactions are present. it's off for now so that we can // selectively turn it on and test it with some select users before // rolling out to everyone. this.gos.get('deltaSort'); const sortContainsGroupColumns = sortOptions.some(({ column }) => { const isSortingCoupled = (0, gridOptionsUtils_1._isColumnsSortingCoupledToGroup)(beans.gos); if (isSortingCoupled) { return column.isPrimary() && column.isRowGroupActive(); } return !!column.getColDef().showRowGroup; }); this.sort(beans, sortOptions, sortActive, deltaSort, params.changedRowNodes, params.changedPath, sortContainsGroupColumns); } sort(beans, sortOptions, sortActive, useDeltaSort, changedRowNodes, changedPath, sortContainsGroupColumns) { const { gos, colModel, rowGroupColsSvc, groupHideOpenParentsSvc, rowNodeSorter } = beans; const groupMaintainOrder = gos.get('groupMaintainOrder'); const groupColumnsPresent = colModel.getCols().some((c) => c.isRowGroupActive()); const isPivotMode = colModel.isPivotMode(); const postSortFunc = gos.getCallback('postSortRows'); const callback = (rowNode) => { // we clear out the 'pull down open parents' first, as the values mix up the sorting groupHideOpenParentsSvc?.pullDownGroupDataForHideOpenParents(rowNode.childrenAfterAggFilter, true); // It's pointless to sort rows which aren't being displayed. in pivot mode we don't need to sort the leaf group children. const skipSortingPivotLeafs = isPivotMode && rowNode.leafGroup; // Javascript sort is non deterministic when all the array items are equals, ie Comparator always returns 0, // so to ensure the array keeps its order, add an additional sorting condition manually, in this case we // are going to inspect the original array position. This is what sortedRowNodes is for. const skipSortingGroups = groupMaintainOrder && groupColumnsPresent && !rowNode.leafGroup && !sortContainsGroupColumns; let newChildrenAfterSort; if (skipSortingGroups) { const nextGroup = rowGroupColsSvc?.columns?.[rowNode.level + 1]; // if the sort is null, then sort was explicitly removed, so remove sort from this group. const wasSortExplicitlyRemoved = nextGroup?.getSort() === null; const childrenToBeSorted = rowNode.childrenAfterAggFilter.slice(0); if (rowNode.childrenAfterSort && !wasSortExplicitlyRemoved) { const indexedOrders = {}; rowNode.childrenAfterSort.forEach((node, idx) => { indexedOrders[node.id] = idx; }); childrenToBeSorted.sort((row1, row2) => (indexedOrders[row1.id] ?? 0) - (indexedOrders[row2.id] ?? 0)); } newChildrenAfterSort = childrenToBeSorted; } else if (!sortActive || skipSortingPivotLeafs) { // if there's no sort to make, skip this step newChildrenAfterSort = rowNode.childrenAfterAggFilter.slice(0); } else if (useDeltaSort && changedRowNodes) { newChildrenAfterSort = doDeltaSort(rowNodeSorter, rowNode, changedRowNodes, changedPath, sortOptions); } else { newChildrenAfterSort = rowNodeSorter.doFullSort(rowNode.childrenAfterAggFilter, sortOptions); } rowNode.childrenAfterSort = newChildrenAfterSort; updateRowNodeAfterSort(rowNode); if (postSortFunc) { const params = { nodes: rowNode.childrenAfterSort }; postSortFunc(params); } }; changedPath?.forEachChangedNodeDepthFirst(callback); } } exports.SortStage = SortStage; function doDeltaSort(rowNodeSorter, rowNode, changedRowNodes, changedPath, sortOptions) { const unsortedRows = rowNode.childrenAfterAggFilter; const oldSortedRows = rowNode.childrenAfterSort; if (!oldSortedRows) { return rowNodeSorter.doFullSort(unsortedRows, sortOptions); } const untouchedRows = new Set(); const touchedRows = []; const { updates, adds } = changedRowNodes; for (let i = 0, len = unsortedRows.length; i < len; ++i) { const row = unsortedRows[i]; if (updates.has(row) || adds.has(row) || (changedPath && !changedPath.canSkip(row))) { touchedRows.push({ currentPos: touchedRows.length, rowNode: row, }); } else { untouchedRows.add(row.id); } } const sortedUntouchedRows = oldSortedRows .filter((child) => untouchedRows.has(child.id)) .map((rowNode, currentPos) => ({ currentPos, rowNode })); touchedRows.sort((a, b) => rowNodeSorter.compareRowNodes(sortOptions, a, b)); return mergeSortedArrays(rowNodeSorter, sortOptions, touchedRows, sortedUntouchedRows); } // Merge two sorted arrays into each other function mergeSortedArrays(rowNodeSorter, sortOptions, arr1, arr2) { const res = []; let i = 0; let j = 0; const arr1Length = arr1.length; const arr2Length = arr2.length; // Traverse both array, adding them in order while (i < arr1Length && j < arr2Length) { const a = arr1[i]; const b = arr2[j]; // Check if current element of first array is smaller than current element // of second array. If yes, store first array element and increment first array index. // Otherwise do same with second array const compareResult = rowNodeSorter.compareRowNodes(sortOptions, a, b); let chosen; if (compareResult < 0) { chosen = a; ++i; } else { chosen = b; ++j; } res.push(chosen.rowNode); } // add remaining from arr1 while (i < arr1Length) { res.push(arr1[i++].rowNode); } // add remaining from arr2 while (j < arr2Length) { res.push(arr2[j++].rowNode); } return res; } /***/ }), /***/ 3218: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.autoSizeAllColumns = exports.autoSizeColumns = exports.sizeColumnsToFit = void 0; function sizeColumnsToFit(beans, paramsOrGridWidth) { if (typeof paramsOrGridWidth === 'number') { beans.colAutosize?.sizeColumnsToFit(paramsOrGridWidth, 'api'); } else { beans.colAutosize?.sizeColumnsToFitGridBody(paramsOrGridWidth); } } exports.sizeColumnsToFit = sizeColumnsToFit; function autoSizeColumns(beans, keys, skipHeader) { beans.colAutosize?.autoSizeCols({ colKeys: keys, skipHeader: skipHeader, source: 'api' }); } exports.autoSizeColumns = autoSizeColumns; function autoSizeAllColumns(beans, skipHeader) { beans.colAutosize?.autoSizeAllColumns('api', skipHeader); } exports.autoSizeAllColumns = autoSizeAllColumns; /***/ }), /***/ 3856: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ColumnAutoSizeModule = void 0; const autoWidthModule_1 = __webpack_require__(447); const version_1 = __webpack_require__(7205); const columnAutosizeApi_1 = __webpack_require__(3218); const columnAutosizeService_1 = __webpack_require__(4817); /** * @feature Columns -> Column Sizing * @gridOption autoSizeStrategy */ exports.ColumnAutoSizeModule = { moduleName: 'ColumnAutoSize', version: version_1.VERSION, beans: [columnAutosizeService_1.ColumnAutosizeService], apiFunctions: { sizeColumnsToFit: columnAutosizeApi_1.sizeColumnsToFit, autoSizeColumns: columnAutosizeApi_1.autoSizeColumns, autoSizeAllColumns: columnAutosizeApi_1.autoSizeAllColumns, }, dependsOn: [autoWidthModule_1.AutoWidthModule], }; /***/ }), /***/ 4817: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ColumnAutosizeService = void 0; const columnEventUtils_1 = __webpack_require__(2934); const columnUtils_1 = __webpack_require__(3146); const beanStub_1 = __webpack_require__(8731); const array_1 = __webpack_require__(1502); const dom_1 = __webpack_require__(3507); const logging_1 = __webpack_require__(7764); const touchListener_1 = __webpack_require__(9644); class ColumnAutosizeService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'colAutosize'; this.timesDelayed = 0; // when we're waiting for cell data types to be inferred, we need to defer column resizing this.shouldQueueResizeOperations = false; this.resizeOperationQueue = []; } postConstruct() { this.addManagedEventListeners({ firstDataRendered: () => this.onFirstDataRendered() }); } autoSizeCols(params) { if (this.shouldQueueResizeOperations) { this.pushResizeOperation(() => this.autoSizeCols(params)); return; } const { colKeys, skipHeader, skipHeaderGroups, stopAtGroup, source = 'api' } = params; // because of column virtualisation, we can only do this function on columns that are // actually rendered, as non-rendered columns (outside the viewport and not rendered // due to column virtualisation) are not present. this can result in all rendered columns // getting narrowed, which in turn introduces more rendered columns on the RHS which // did not get autoSized in the original run, leaving the visible grid with columns on // the LHS sized, but RHS no. so we keep looping through the visible columns until // no more cols are available (rendered) to be resized const { animationFrameSvc, renderStatus, colModel, autoWidthCalc, visibleCols } = this.beans; // we autosize after animation frames finish in case any cell renderers need to complete first. this can // happen eg if client code is calling api.autoSizeAllColumns() straight after grid is initialised, but grid // hasn't fully drawn out all the cells yet (due to cell renderers in animation frames). animationFrameSvc?.flushAllFrames(); if (this.timesDelayed < 5 && renderStatus && !renderStatus.areHeaderCellsRendered()) { // This is needed for React, as it doesn't render the headers synchronously all the time. // Added a defensive check to avoid infinite loop in case headers are never rendered. this.timesDelayed++; setTimeout(() => { if (this.isAlive()) { this.autoSizeCols(params); } }); return; } this.timesDelayed = 0; // keep track of which cols we have resized in here const columnsAutoSized = []; // initialise with anything except 0 so that while loop executes at least once let changesThisTimeAround = -1; const shouldSkipHeader = skipHeader != null ? skipHeader : this.gos.get('skipHeaderOnAutoSize'); const shouldSkipHeaderGroups = skipHeaderGroups != null ? skipHeaderGroups : shouldSkipHeader; while (changesThisTimeAround !== 0) { changesThisTimeAround = 0; const updatedColumns = []; colKeys.forEach((key) => { if (!key) { return; } const column = colModel.getCol(key); if (!column || (0, columnUtils_1.isRowNumberCol)(column)) { return; } // if already autoSized, skip it if (columnsAutoSized.indexOf(column) >= 0) { return; } // get how wide this col should be const preferredWidth = autoWidthCalc.getPreferredWidthForColumn(column, shouldSkipHeader); // preferredWidth = -1 if this col is not on the screen if (preferredWidth > 0) { const newWidth = normaliseColumnWidth(column, preferredWidth); column.setActualWidth(newWidth, source); columnsAutoSized.push(column); changesThisTimeAround++; } updatedColumns.push(column); }); if (!updatedColumns.length) { continue; } visibleCols.refresh(source); } if (!shouldSkipHeaderGroups) { this.autoSizeColumnGroupsByColumns(colKeys, source, stopAtGroup); } (0, columnEventUtils_1.dispatchColumnResizedEvent)(this.eventSvc, columnsAutoSized, true, 'autosizeColumns'); } autoSizeColumn(key, source, skipHeader) { if (key) { this.autoSizeCols({ colKeys: [key], skipHeader, skipHeaderGroups: true, source }); } } autoSizeColumnGroupsByColumns(keys, source, stopAtGroup) { const { colModel, ctrlsSvc } = this.beans; const columnGroups = new Set(); const columns = colModel.getColsForKeys(keys); columns.forEach((col) => { let parent = col.getParent(); while (parent && parent != stopAtGroup) { if (!parent.isPadding()) { columnGroups.add(parent); } parent = parent.getParent(); } }); let headerGroupCtrl; const resizedColumns = []; for (const columnGroup of columnGroups) { for (const headerContainerCtrl of ctrlsSvc.getHeaderRowContainerCtrls()) { headerGroupCtrl = headerContainerCtrl.getHeaderCtrlForColumn(columnGroup); if (headerGroupCtrl) { break; } } if (headerGroupCtrl) { headerGroupCtrl.resizeLeafColumnsToFit(source); } } return resizedColumns; } autoSizeAllColumns(source, skipHeader) { if (this.shouldQueueResizeOperations) { this.pushResizeOperation(() => this.autoSizeAllColumns(source, skipHeader)); return; } const allDisplayedColumns = this.beans.visibleCols.allCols; this.autoSizeCols({ colKeys: allDisplayedColumns, skipHeader, source }); } addColumnAutosize(element, column) { const skipHeaderOnAutoSize = this.gos.get('skipHeaderOnAutoSize'); const autoSizeColListener = () => { this.autoSizeColumn(column, 'uiColumnResized', skipHeaderOnAutoSize); }; element.addEventListener('dblclick', autoSizeColListener); const touchListener = new touchListener_1.TouchListener(element); touchListener.addEventListener('doubleTap', autoSizeColListener); return () => { element.removeEventListener('dblclick', autoSizeColListener); touchListener.removeEventListener('doubleTap', autoSizeColListener); touchListener.destroy(); }; } addColumnGroupResize(element, columnGroup, callback) { const skipHeaderOnAutoSize = this.gos.get('skipHeaderOnAutoSize'); const listener = () => { // get list of all the column keys we are responsible for const keys = []; const leafCols = columnGroup.getDisplayedLeafColumns(); leafCols.forEach((column) => { // not all cols in the group may be participating with auto-resize if (!column.getColDef().suppressAutoSize) { keys.push(column.getColId()); } }); if (keys.length > 0) { this.autoSizeCols({ colKeys: keys, skipHeader: skipHeaderOnAutoSize, stopAtGroup: columnGroup, source: 'uiColumnResized', }); } callback(); }; element.addEventListener('dblclick', listener); return () => element.removeEventListener('dblclick', listener); } // method will call itself if no available width. this covers if the grid // isn't visible, but is just about to be visible. sizeColumnsToFitGridBody(params, nextTimeout) { if (!this.isAlive()) { return; } const { ctrlsSvc, scrollVisibleSvc } = this.beans; const gridBodyCtrl = ctrlsSvc.getGridBodyCtrl(); const removeScrollWidth = gridBodyCtrl.isVerticalScrollShowing(); const scrollWidthToRemove = removeScrollWidth ? scrollVisibleSvc.getScrollbarWidth() : 0; // bodyViewportWidth should be calculated from eGridBody, not eBodyViewport // because we change the width of the bodyViewport to hide the real browser scrollbar const bodyViewportWidth = (0, dom_1._getInnerWidth)(gridBodyCtrl.eGridBody); const availableWidth = bodyViewportWidth - scrollWidthToRemove; if (availableWidth > 0) { this.sizeColumnsToFit(availableWidth, 'sizeColumnsToFit', false, params); return; } if (nextTimeout === undefined) { window.setTimeout(() => { this.sizeColumnsToFitGridBody(params, 100); }, 0); } else if (nextTimeout === 100) { window.setTimeout(() => { this.sizeColumnsToFitGridBody(params, 500); }, 100); } else if (nextTimeout === 500) { window.setTimeout(() => { this.sizeColumnsToFitGridBody(params, -1); }, 500); } else { // Grid coming back with zero width, maybe the grid is not visible yet on the screen? (0, logging_1._warn)(29); } } // called from api sizeColumnsToFit(gridWidth, source = 'sizeColumnsToFit', silent, params) { if (this.shouldQueueResizeOperations) { this.pushResizeOperation(() => this.sizeColumnsToFit(gridWidth, source, silent, params)); return; } const limitsMap = {}; if (params) { params?.columnLimits?.forEach(({ key, ...dimensions }) => { limitsMap[typeof key === 'string' ? key : key.getColId()] = dimensions; }); } // avoid divide by zero const allDisplayedColumns = this.beans.visibleCols.allCols; const doColumnsAlreadyFit = gridWidth === (0, columnUtils_1.getWidthOfColsInList)(allDisplayedColumns); if (gridWidth <= 0 || !allDisplayedColumns.length || doColumnsAlreadyFit) { return; } const colsToSpread = []; const colsToNotSpread = []; allDisplayedColumns.forEach((column) => { if (column.getColDef().suppressSizeToFit === true) { colsToNotSpread.push(column); } else { colsToSpread.push(column); } }); // make a copy of the cols that are going to be resized const colsToDispatchEventFor = colsToSpread.slice(0); let finishedResizing = false; const moveToNotSpread = (column) => { (0, array_1._removeFromArray)(colsToSpread, column); colsToNotSpread.push(column); }; // resetting cols to their original width makes the sizeColumnsToFit more deterministic, // rather than depending on the current size of the columns. most users call sizeColumnsToFit // immediately after grid is created, so will make no difference. however if application is calling // sizeColumnsToFit repeatedly (eg after column group is opened / closed repeatedly) we don't want // the columns to start shrinking / growing over time. // // NOTE: the process below will assign values to `this.actualWidth` of each column without firing events // for this reason we need to manually dispatch resize events after the resize has been done for each column. colsToSpread.forEach((column) => { column.resetActualWidth(source); const widthOverride = limitsMap?.[column.getId()]; const minOverride = widthOverride?.minWidth ?? params?.defaultMinWidth; const maxOverride = widthOverride?.maxWidth ?? params?.defaultMaxWidth; const colWidth = column.getActualWidth(); if (typeof minOverride === 'number' && colWidth < minOverride) { column.setActualWidth(minOverride, source, true); } else if (typeof maxOverride === 'number' && colWidth > maxOverride) { column.setActualWidth(maxOverride, source, true); } }); while (!finishedResizing) { finishedResizing = true; const availablePixels = gridWidth - (0, columnUtils_1.getWidthOfColsInList)(colsToNotSpread); if (availablePixels <= 0) { // no width, set everything to minimum colsToSpread.forEach((column) => { const widthOverride = limitsMap?.[column.getId()]?.minWidth ?? params?.defaultMinWidth; if (typeof widthOverride === 'number') { column.setActualWidth(widthOverride, source, true); return; } column.setActualWidth(column.minWidth, source); }); } else { const scale = availablePixels / (0, columnUtils_1.getWidthOfColsInList)(colsToSpread); // we set the pixels for the last col based on what's left, as otherwise // we could be a pixel or two short or extra because of rounding errors. let pixelsForLastCol = availablePixels; // backwards through loop, as we are removing items as we go for (let i = colsToSpread.length - 1; i >= 0; i--) { const column = colsToSpread[i]; const widthOverride = limitsMap?.[column.getId()]; const minOverride = widthOverride?.minWidth ?? params?.defaultMinWidth; const maxOverride = widthOverride?.maxWidth ?? params?.defaultMaxWidth; const colMinWidth = column.getMinWidth(); const colMaxWidth = column.getMaxWidth(); const minWidth = typeof minOverride === 'number' && minOverride > colMinWidth ? minOverride : colMinWidth; const maxWidth = typeof maxOverride === 'number' && maxOverride < colMaxWidth ? maxOverride : colMaxWidth; let newWidth = Math.round(column.getActualWidth() * scale); if (newWidth < minWidth) { newWidth = minWidth; moveToNotSpread(column); finishedResizing = false; } else if (newWidth > maxWidth) { newWidth = maxWidth; moveToNotSpread(column); finishedResizing = false; } else if (i === 0) { // if this is the last column newWidth = pixelsForLastCol; } column.setActualWidth(newWidth, source, true); pixelsForLastCol -= newWidth; } } } // see notes above colsToDispatchEventFor.forEach((col) => { col.fireColumnWidthChangedEvent(source); }); const visibleCols = this.beans.visibleCols; visibleCols.setLeftValues(source); visibleCols.updateBodyWidths(); if (silent) { return; } (0, columnEventUtils_1.dispatchColumnResizedEvent)(this.eventSvc, colsToDispatchEventFor, true, source); } applyAutosizeStrategy() { const autoSizeStrategy = this.gos.get('autoSizeStrategy'); if (!autoSizeStrategy) { return; } const { type } = autoSizeStrategy; // ensure things like aligned grids have linked first setTimeout(() => { if (type === 'fitGridWidth') { const { columnLimits: propColumnLimits, defaultMinWidth, defaultMaxWidth } = autoSizeStrategy; const columnLimits = propColumnLimits?.map(({ colId: key, minWidth, maxWidth }) => ({ key, minWidth, maxWidth, })); this.sizeColumnsToFitGridBody({ defaultMinWidth, defaultMaxWidth, columnLimits, }); } else if (type === 'fitProvidedWidth') { this.sizeColumnsToFit(autoSizeStrategy.width, 'sizeColumnsToFit'); } }); } onFirstDataRendered() { const autoSizeStrategy = this.gos.get('autoSizeStrategy'); if (autoSizeStrategy?.type !== 'fitCellContents') { return; } const { colIds: columns, skipHeader } = autoSizeStrategy; // ensure render has finished setTimeout(() => { if (columns) { this.autoSizeCols({ colKeys: columns, skipHeader, source: 'autosizeColumns', }); } else { this.autoSizeAllColumns('autosizeColumns', skipHeader); } }); } processResizeOperations() { this.shouldQueueResizeOperations = false; this.resizeOperationQueue.forEach((resizeOperation) => resizeOperation()); this.resizeOperationQueue = []; } pushResizeOperation(func) { this.resizeOperationQueue.push(func); } destroy() { this.resizeOperationQueue.length = 0; super.destroy(); } } exports.ColumnAutosizeService = ColumnAutosizeService; /** returns the width we can set to this col, taking into consideration min and max widths */ function normaliseColumnWidth(column, newWidth) { const minWidth = column.getMinWidth(); if (newWidth < minWidth) { newWidth = minWidth; } const maxWidth = column.getMaxWidth(); if (column.isGreaterThanMax(newWidth)) { newWidth = maxWidth; } return newWidth; } /***/ }), /***/ 9607: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.columnMovingCSS = void 0; exports.columnMovingCSS = `:where(.ag-ltr) :where(.ag-column-moving){.ag-cell,.ag-header-cell,.ag-spanned-cell-wrapper{transition:left .2s}.ag-header-group-cell{transition:left .2s,width .2s}}:where(.ag-rtl) :where(.ag-column-moving){.ag-cell,.ag-header-cell,.ag-spanned-cell-wrapper{transition:right .2s}.ag-header-group-cell{transition:right .2s,width .2s}}`; /***/ }), /***/ 9122: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ColumnAnimationService = void 0; const beanStub_1 = __webpack_require__(8731); class ColumnAnimationService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'colAnimation'; this.executeNextFuncs = []; this.executeLaterFuncs = []; this.active = false; // activeNext starts with active but it is reset earlier after the nextFuncs are cleared // to prevent calls made to executeNextVMTurn from queuing functions after executeNextFuncs has already been flushed, this.activeNext = false; this.suppressAnimation = false; this.animationThreadCount = 0; } postConstruct() { this.beans.ctrlsSvc.whenReady(this, (p) => (this.gridBodyCtrl = p.gridBodyCtrl)); } isActive() { return this.active && !this.suppressAnimation; } setSuppressAnimation(suppress) { this.suppressAnimation = suppress; } start() { if (this.active) { return; } const { gos } = this; if (gos.get('suppressColumnMoveAnimation')) { return; } // if doing RTL, we don't animate open / close as due to how the pixels are inverted, // the animation moves all the row the the right rather than to the left (ie it's the static // columns that actually get their coordinates updated) if (gos.get('enableRtl')) { return; } this.ensureAnimationCssClassPresent(); this.active = true; this.activeNext = true; } finish() { if (!this.active) { return; } this.flush(() => (this.activeNext = false), () => (this.active = false)); } executeNextVMTurn(func) { if (this.activeNext) { this.executeNextFuncs.push(func); } else { func(); } } executeLaterVMTurn(func) { if (this.active) { this.executeLaterFuncs.push(func); } else { func(); } } ensureAnimationCssClassPresent() { // up the count, so we can tell if someone else has updated the count // by the time the 'wait' func executes this.animationThreadCount++; const animationThreadCountCopy = this.animationThreadCount; const { gridBodyCtrl } = this; gridBodyCtrl.setColumnMovingCss(true); this.executeLaterFuncs.push(() => { // only remove the class if this thread was the last one to update it if (this.animationThreadCount === animationThreadCountCopy) { gridBodyCtrl.setColumnMovingCss(false); } }); } flush(callbackNext, callbackLater) { const { executeNextFuncs, executeLaterFuncs } = this; if (executeNextFuncs.length === 0 && executeLaterFuncs.length === 0) { callbackNext(); callbackLater(); return; } const runFuncs = (queue) => { while (queue.length) { const func = queue.pop(); if (func) { func(); } } }; this.beans.frameworkOverrides.wrapIncoming(() => { window.setTimeout(() => { callbackNext(); runFuncs(executeNextFuncs); }, 0); window.setTimeout(() => { // run the callback before executeLaterFuncs // because some functions being executed later // check if this service is `active`. callbackLater(); runFuncs(executeLaterFuncs); }, 200); }); } } exports.ColumnAnimationService = ColumnAnimationService; /***/ }), /***/ 3052: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.BodyDropPivotTarget = void 0; const beanStub_1 = __webpack_require__(8731); class BodyDropPivotTarget extends beanStub_1.BeanStub { constructor(pinned) { super(); this.pinned = pinned; this.columnsToAggregate = []; this.columnsToGroup = []; this.columnsToPivot = []; } /** Callback for when drag enters */ onDragEnter(draggingEvent) { this.clearColumnsList(); // in pivot mode, we don't accept any drops if functions are read only if (this.gos.get('functionsReadOnly')) { return; } const dragColumns = draggingEvent.dragItem.columns; if (!dragColumns) { return; } dragColumns.forEach((column) => { // we don't allow adding secondary columns if (!column.isPrimary()) { return; } if (column.isAnyFunctionActive()) { return; } if (column.isAllowValue()) { this.columnsToAggregate.push(column); } else if (column.isAllowRowGroup()) { this.columnsToGroup.push(column); } else if (column.isAllowPivot()) { this.columnsToPivot.push(column); } }); } getIconName() { const totalColumns = this.columnsToAggregate.length + this.columnsToGroup.length + this.columnsToPivot.length; if (totalColumns > 0) { return this.pinned ? 'pinned' : 'move'; } return null; } /** Callback for when drag leaves */ // eslint-disable-next-line @typescript-eslint/no-unused-vars onDragLeave(draggingEvent) { // if we are taking columns out of the center, then we remove them from the report this.clearColumnsList(); } clearColumnsList() { this.columnsToAggregate.length = 0; this.columnsToGroup.length = 0; this.columnsToPivot.length = 0; } /** Callback for when dragging */ // eslint-disable-next-line @typescript-eslint/no-unused-vars onDragging(draggingEvent) { } /** Callback for when drag stops */ // eslint-disable-next-line @typescript-eslint/no-unused-vars onDragStop(draggingEvent) { const { valueColsSvc, rowGroupColsSvc, pivotColsSvc } = this.beans; if (this.columnsToAggregate.length > 0) { valueColsSvc?.addColumns(this.columnsToAggregate, 'toolPanelDragAndDrop'); } if (this.columnsToGroup.length > 0) { rowGroupColsSvc?.addColumns(this.columnsToGroup, 'toolPanelDragAndDrop'); } if (this.columnsToPivot.length > 0) { pivotColsSvc?.addColumns(this.columnsToPivot, 'toolPanelDragAndDrop'); } } onDragCancel() { this.clearColumnsList(); } } exports.BodyDropPivotTarget = BodyDropPivotTarget; /***/ }), /***/ 7912: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.BodyDropTarget = void 0; const beanStub_1 = __webpack_require__(8731); const dragAndDropService_1 = __webpack_require__(2903); const bodyDropPivotTarget_1 = __webpack_require__(3052); const moveColumnFeature_1 = __webpack_require__(2909); class BodyDropTarget extends beanStub_1.BeanStub { constructor(pinned, eContainer) { super(); this.pinned = pinned; this.eContainer = eContainer; } postConstruct() { const { ctrlsSvc, dragAndDrop } = this.beans; const pinned = this.pinned; ctrlsSvc.whenReady(this, (p) => { let eSecondaryContainers; const eBodyViewport = p.gridBodyCtrl.eBodyViewport; switch (pinned) { case 'left': eSecondaryContainers = [ [eBodyViewport, p.left.eContainer], [p.bottomLeft.eContainer], [p.topLeft.eContainer], ]; break; case 'right': eSecondaryContainers = [ [eBodyViewport, p.right.eContainer], [p.bottomRight.eContainer], [p.topRight.eContainer], ]; break; default: eSecondaryContainers = [ [eBodyViewport, p.center.eViewport], [p.bottomCenter.eViewport], [p.topCenter.eViewport], ]; break; } this.eSecondaryContainers = eSecondaryContainers; }); this.moveColumnFeature = this.createManagedBean(new moveColumnFeature_1.MoveColumnFeature(pinned)); this.bodyDropPivotTarget = this.createManagedBean(new bodyDropPivotTarget_1.BodyDropPivotTarget(pinned)); dragAndDrop.addDropTarget(this); this.addDestroyFunc(() => dragAndDrop.removeDropTarget(this)); } isInterestedIn(type) { return (type === dragAndDropService_1.DragSourceType.HeaderCell || (type === dragAndDropService_1.DragSourceType.ToolPanel && this.gos.get('allowDragFromColumnsToolPanel'))); } getSecondaryContainers() { return this.eSecondaryContainers; } getContainer() { return this.eContainer; } getIconName() { return this.currentDropListener.getIconName(); } // we want to use the bodyPivotTarget if the user is dragging columns in from the toolPanel // and we are in pivot mode, as it has to logic to set pivot/value/group on the columns when // dropped into the grid's body. isDropColumnInPivotMode(draggingEvent) { // in pivot mode, then if moving a column (ie didn't come from toolpanel) then it's // a standard column move, however if it came from the toolpanel, then we are introducing // dimensions or values to the grid return this.beans.colModel.isPivotMode() && draggingEvent.dragSource.type === dragAndDropService_1.DragSourceType.ToolPanel; } onDragEnter(draggingEvent) { // we pick the drop listener depending on whether we are in pivot mode are not. if we are // in pivot mode, then dropping cols changes the row group, pivot, value stats. otherwise // we change visibility state and position. this.currentDropListener = this.isDropColumnInPivotMode(draggingEvent) ? this.bodyDropPivotTarget : this.moveColumnFeature; this.currentDropListener.onDragEnter(draggingEvent); } onDragLeave(params) { this.currentDropListener.onDragLeave(params); } onDragging(params) { this.currentDropListener.onDragging(params); } onDragStop(params) { this.currentDropListener.onDragStop(params); } onDragCancel() { this.currentDropListener.onDragCancel(); } } exports.BodyDropTarget = BodyDropTarget; /***/ }), /***/ 2909: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.MoveColumnFeature = void 0; const beanStub_1 = __webpack_require__(8731); const dragAndDropService_1 = __webpack_require__(2903); const iColumn_1 = __webpack_require__(2783); const array_1 = __webpack_require__(1502); const generic_1 = __webpack_require__(4422); const internalColumnMoveUtils_1 = __webpack_require__(5446); const MOVE_FAIL_THRESHOLD = 7; const SCROLL_MOVE_WIDTH = 100; const SCROLL_GAP_NEEDED_BEFORE_MOVE = SCROLL_MOVE_WIDTH / 2; const SCROLL_ACCELERATION_RATE = 5; const SCROLL_TIME_INTERVAL = 100; class MoveColumnFeature extends beanStub_1.BeanStub { constructor(pinned) { super(); this.pinned = pinned; this.needToMoveLeft = false; this.needToMoveRight = false; this.lastMovedInfo = null; this.isCenterContainer = !(0, generic_1._exists)(pinned); } postConstruct() { this.beans.ctrlsSvc.whenReady(this, (p) => { this.gridBodyCon = p.gridBodyCtrl; }); } getIconName() { const { pinned, lastDraggingEvent } = this; const columns = lastDraggingEvent?.dragItem.columns ?? []; for (const col of columns) { const colPinned = col.getPinned(); // when the column is lockPinned, only moves within pinned section if (col.getColDef().lockPinned) { if (colPinned == pinned) { return 'move'; } continue; } // if the column pinned state is the same as the container's, or // when `unpinning` a column, set the icon to move if (colPinned === pinned || !pinned) { return 'move'; } // moving an unpinned column to a pinned container // set the icon to pinned if (!colPinned && pinned) { return 'pinned'; } } return 'notAllowed'; } onDragEnter(draggingEvent) { // we do dummy drag, so make sure column appears in the right location when first placed const dragItem = draggingEvent.dragItem; const columns = dragItem.columns; const dragCameFromToolPanel = draggingEvent.dragSource.type === dragAndDropService_1.DragSourceType.ToolPanel; if (dragCameFromToolPanel) { // the if statement doesn't work if drag leaves grid, then enters again this.setColumnsVisible(columns, true, 'uiColumnDragged'); } else { // restore previous state of visible columns upon re-entering. this means if the user drags // a group out, and then drags the group back in, only columns that were originally visible // will be visible again. otherwise a group with three columns (but only two visible) could // be dragged out, then when it's dragged in again, all three are visible. this stops that. const visibleState = dragItem.visibleState; const visibleColumns = (columns || []).filter((column) => visibleState[column.getId()]); this.setColumnsVisible(visibleColumns, true, 'uiColumnDragged'); } if (!this.gos.get('suppressMoveWhenColumnDragging')) { this.attemptToPinColumns(columns, this.pinned); } this.onDragging(draggingEvent, true, true); } onDragging(draggingEvent = this.lastDraggingEvent, fromEnter = false, fakeEvent = false, finished = false) { const { gos, ctrlsSvc } = this.beans; const isSuppressMoveWhenDragging = gos.get('suppressMoveWhenColumnDragging'); if (finished && !isSuppressMoveWhenDragging) { this.finishColumnMoving(); return; } this.lastDraggingEvent = draggingEvent; // if moving up or down (ie not left or right) then do nothing if (!draggingEvent || (!finished && (0, generic_1._missing)(draggingEvent.hDirection))) { return; } const mouseX = (0, internalColumnMoveUtils_1.normaliseX)({ x: draggingEvent.x, pinned: this.pinned, gos, ctrlsSvc, }); // if the user is dragging into the panel, ie coming from the side panel into the main grid, // we don't want to scroll the grid this time, it would appear like the table is jumping // each time a column is dragged in. if (!fromEnter) { this.checkCenterForScrolling(mouseX); } if (isSuppressMoveWhenDragging) { this.handleColumnDragWhileSuppressingMovement(draggingEvent, fromEnter, fakeEvent, mouseX, finished); } else { this.handleColumnDragWhileAllowingMovement(draggingEvent, fromEnter, fakeEvent, mouseX, finished); } } onDragLeave() { this.ensureIntervalCleared(); this.clearHighlighted(); this.lastMovedInfo = null; } onDragStop() { this.onDragging(this.lastDraggingEvent, false, true, true); this.ensureIntervalCleared(); this.lastMovedInfo = null; } onDragCancel() { this.clearHighlighted(); this.ensureIntervalCleared(); this.lastMovedInfo = null; } setColumnsVisible(columns, visible, source) { if (!columns) { return; } const allowedCols = columns.filter((c) => !c.getColDef().lockVisible); this.beans.colModel.setColsVisible(allowedCols, visible, source); } finishColumnMoving() { this.clearHighlighted(); const lastMovedInfo = this.lastMovedInfo; if (!lastMovedInfo) { return; } const { columns, toIndex } = lastMovedInfo; this.beans.colMoves.moveColumns(columns, toIndex, 'uiColumnMoved', true); } handleColumnDragWhileSuppressingMovement(draggingEvent, fromEnter, fakeEvent, mouseX, finished) { const allMovingColumns = this.getAllMovingColumns(draggingEvent, true); if (finished) { // first we handle pinning, then move columns const isAttemptingToPin = this.isAttemptingToPin(allMovingColumns); if (isAttemptingToPin) { this.attemptToPinColumns(allMovingColumns, undefined, true); } const { fromLeft, xPosition } = this.getNormalisedXPositionInfo(allMovingColumns, isAttemptingToPin) || {}; if (fromLeft == null || xPosition == null) { this.finishColumnMoving(); return; } this.moveColumnsAfterHighlight({ allMovingColumns, xPosition, fromEnter, fakeEvent, fromLeft, }); } else { if (!this.beans.dragAndDrop.isDropZoneWithinThisGrid(draggingEvent)) { return; } this.highlightHoveredColumn(allMovingColumns, mouseX); } } handleColumnDragWhileAllowingMovement(draggingEvent, fromEnter, fakeEvent, mouseX, finished) { const allMovingColumns = this.getAllMovingColumns(draggingEvent); const fromLeft = this.normaliseDirection(draggingEvent.hDirection) === 'right'; const isFromHeader = draggingEvent.dragSource.type === dragAndDropService_1.DragSourceType.HeaderCell; const params = this.getMoveColumnParams({ allMovingColumns, isFromHeader, xPosition: mouseX, fromLeft, fromEnter, fakeEvent, }); const lastMovedInfo = (0, internalColumnMoveUtils_1.attemptMoveColumns)({ ...params, finished }); if (lastMovedInfo) { this.lastMovedInfo = lastMovedInfo; } } getAllMovingColumns(draggingEvent, useSplit = false) { const dragItem = draggingEvent.dragSource.getDragItem(); let columns = null; if (useSplit) { columns = dragItem.columnsInSplit; if (!columns) { columns = dragItem.columns; } } else { columns = dragItem.columns; } // if locked return true only if both col and container are same pin type. // double equals (==) here on purpose so that null==undefined is true (for not pinned options) // if not pin locked, then always allowed to be in this container const conditionCallback = (col) => col.getColDef().lockPinned ? col.getPinned() == this.pinned : true; if (!columns) { return []; } return columns.filter(conditionCallback); } getMoveColumnParams(params) { const { allMovingColumns, isFromHeader, xPosition, fromLeft, fromEnter, fakeEvent } = params; const { gos, colModel, colMoves, visibleCols } = this.beans; return { allMovingColumns, isFromHeader, fromLeft, xPosition, pinned: this.pinned, fromEnter, fakeEvent, gos, colModel, colMoves: colMoves, visibleCols, }; } highlightHoveredColumn(movingColumns, mouseX) { const { gos, colModel } = this.beans; const isRtl = gos.get('enableRtl'); const consideredColumns = colModel .getCols() .filter((col) => col.isVisible() && col.getPinned() === this.pinned); let start = null; let width = null; let targetColumn = null; for (const col of consideredColumns) { width = col.getActualWidth(); start = this.getNormalisedColumnLeft(col, 0, isRtl); if (start != null) { const end = start + width; if (start <= mouseX && end >= mouseX) { targetColumn = col; break; } } start = null; width = null; } if (!targetColumn) { // we fall into this condition if no columns are being hover // (e.g. hovering an empty area of the column header beyond all columns) for (let i = consideredColumns.length - 1; i >= 0; i--) { const currentColumn = consideredColumns[i]; const parent = consideredColumns[i].getParent(); if (!parent) { targetColumn = currentColumn; break; } const leafDisplayedCols = parent?.getDisplayedLeafColumns(); if (leafDisplayedCols.length) { targetColumn = (0, array_1._last)(leafDisplayedCols); break; } } if (!targetColumn) { return; } start = this.getNormalisedColumnLeft(targetColumn, 0, isRtl); width = targetColumn.getActualWidth(); } else if (movingColumns.indexOf(targetColumn) !== -1) { targetColumn = null; } if (this.lastHighlightedColumn?.column !== targetColumn) { this.clearHighlighted(); } if (targetColumn == null || start == null || width == null) { return; } let position; if (mouseX - start < width / 2 !== isRtl) { position = iColumn_1.ColumnHighlightPosition.Before; } else { position = iColumn_1.ColumnHighlightPosition.After; } setColumnHighlighted(targetColumn, position); this.lastHighlightedColumn = { column: targetColumn, position }; } getNormalisedXPositionInfo(allMovingColumns, isAttemptingToPin) { const { gos, visibleCols } = this.beans; const isRtl = gos.get('enableRtl'); const { firstMovingCol, column, position } = this.getColumnMoveAndTargetInfo(allMovingColumns, isAttemptingToPin, isRtl); if (!firstMovingCol || !column || position == null) { return; } const visibleColumns = visibleCols.allCols; const movingColIndex = visibleColumns.indexOf(firstMovingCol); const targetIndex = visibleColumns.indexOf(column); const isBefore = (position === iColumn_1.ColumnHighlightPosition.Before) !== isRtl; const fromLeft = movingColIndex < targetIndex || (movingColIndex === targetIndex && !isBefore); let diff = 0; if (isBefore) { if (fromLeft) { diff -= 1; } } else { if (!fromLeft) { diff += 1; } } if (targetIndex + diff === movingColIndex) { return; } const targetColumn = visibleColumns[targetIndex + diff]; if (!targetColumn) { return; } const xPosition = this.getNormalisedColumnLeft(targetColumn, 20, isRtl); return { fromLeft, xPosition }; } getColumnMoveAndTargetInfo(allMovingColumns, isAttemptingToPin, isRtl) { const lastHighlightedColumn = this.lastHighlightedColumn || {}; const { firstMovingCol, lastMovingCol } = findFirstAndLastMovingColumns(allMovingColumns); if (!firstMovingCol || !lastMovingCol || lastHighlightedColumn.column || !isAttemptingToPin) { return { firstMovingCol, ...lastHighlightedColumn, }; } const pinned = this.getPinDirection(); const isLeft = pinned === 'left'; return { firstMovingCol, position: isLeft ? iColumn_1.ColumnHighlightPosition.After : iColumn_1.ColumnHighlightPosition.Before, column: isLeft !== isRtl ? firstMovingCol : lastMovingCol, }; } normaliseDirection(hDirection) { if (this.gos.get('enableRtl')) { switch (hDirection) { case 'left': return 'right'; case 'right': return 'left'; } } return hDirection; } getNormalisedColumnLeft(col, padding, isRtl) { const { gos, ctrlsSvc } = this.beans; const left = col.getLeft(); if (left == null) { return null; } const width = col.getActualWidth(); return (0, internalColumnMoveUtils_1.normaliseX)({ x: isRtl ? left + width - padding : left + padding, pinned: col.getPinned(), useHeaderRow: isRtl, skipScrollPadding: true, gos, ctrlsSvc, }); } isAttemptingToPin(columns) { const isMovingHorizontally = this.needToMoveLeft || this.needToMoveRight; const isFailedMoreThanThreshold = this.failedMoveAttempts > MOVE_FAIL_THRESHOLD; return ((isMovingHorizontally && isFailedMoreThanThreshold) || columns.some((col) => col.getPinned() !== this.pinned)); } moveColumnsAfterHighlight(params) { const { allMovingColumns, xPosition, fromEnter, fakeEvent, fromLeft } = params; const columnMoveParams = this.getMoveColumnParams({ allMovingColumns, isFromHeader: true, xPosition, fromLeft, fromEnter, fakeEvent, }); const { columns, toIndex } = (0, internalColumnMoveUtils_1.getBestColumnMoveIndexFromXPosition)(columnMoveParams) || {}; if (columns && toIndex != null) { this.lastMovedInfo = { columns, toIndex, }; } this.finishColumnMoving(); } clearHighlighted() { const { lastHighlightedColumn } = this; if (!lastHighlightedColumn) { return; } setColumnHighlighted(lastHighlightedColumn.column, null); this.lastHighlightedColumn = null; } checkCenterForScrolling(xAdjustedForScroll) { if (!this.isCenterContainer) { return; } // scroll if the mouse has gone outside the grid (or just outside the scrollable part if pinning) // putting in 50 buffer, so even if user gets to edge of grid, a scroll will happen const centerCtrl = this.beans.ctrlsSvc.get('center'); const firstVisiblePixel = centerCtrl.getCenterViewportScrollLeft(); const lastVisiblePixel = firstVisiblePixel + centerCtrl.getCenterWidth(); let needToMoveRight; let needToMoveLeft; if (this.gos.get('enableRtl')) { needToMoveRight = xAdjustedForScroll < firstVisiblePixel + SCROLL_GAP_NEEDED_BEFORE_MOVE; needToMoveLeft = xAdjustedForScroll > lastVisiblePixel - SCROLL_GAP_NEEDED_BEFORE_MOVE; } else { needToMoveLeft = xAdjustedForScroll < firstVisiblePixel + SCROLL_GAP_NEEDED_BEFORE_MOVE; needToMoveRight = xAdjustedForScroll > lastVisiblePixel - SCROLL_GAP_NEEDED_BEFORE_MOVE; } this.needToMoveRight = needToMoveRight; this.needToMoveLeft = needToMoveLeft; if (needToMoveLeft || needToMoveRight) { this.ensureIntervalStarted(); } else { this.ensureIntervalCleared(); } } ensureIntervalStarted() { if (this.movingIntervalId) { return; } this.intervalCount = 0; this.failedMoveAttempts = 0; this.movingIntervalId = window.setInterval(this.moveInterval.bind(this), SCROLL_TIME_INTERVAL); this.beans.dragAndDrop.getDragAndDropImageComponent()?.setIcon(this.needToMoveLeft ? 'left' : 'right', true); } ensureIntervalCleared() { if (!this.movingIntervalId) { return; } window.clearInterval(this.movingIntervalId); this.movingIntervalId = null; this.failedMoveAttempts = 0; this.beans.dragAndDrop.getDragAndDropImageComponent()?.setIcon(this.getIconName(), false); } moveInterval() { // the amounts we move get bigger at each interval, so the speed accelerates, starting a bit slow // and getting faster. this is to give smoother user experience. we max at `SCROLL_MOVE_WIDTH` to limit the speed. let pixelsToMove; this.intervalCount++; pixelsToMove = 10 + this.intervalCount * SCROLL_ACCELERATION_RATE; if (pixelsToMove > SCROLL_MOVE_WIDTH) { pixelsToMove = SCROLL_MOVE_WIDTH; } let pixelsMoved = null; const scrollFeature = this.gridBodyCon.scrollFeature; if (this.needToMoveLeft) { pixelsMoved = scrollFeature.scrollHorizontally(-pixelsToMove); } else if (this.needToMoveRight) { pixelsMoved = scrollFeature.scrollHorizontally(pixelsToMove); } if (pixelsMoved !== 0) { this.onDragging(this.lastDraggingEvent); this.failedMoveAttempts = 0; } else { // we count the failed move attempts. if we fail to move `MOVE_FAIL_THRESHOLD` times, then we pin the column. // this is how we achieve pining by dragging the column to the edge of the grid. this.failedMoveAttempts++; const { pinnedCols, dragAndDrop, gos } = this.beans; if (this.failedMoveAttempts <= MOVE_FAIL_THRESHOLD + 1 || !pinnedCols) { return; } dragAndDrop.getDragAndDropImageComponent()?.setIcon('pinned', false); if (!gos.get('suppressMoveWhenColumnDragging')) { const columns = this.lastDraggingEvent?.dragItem.columns; this.attemptToPinColumns(columns, undefined, true); } } } getPinDirection() { if (this.needToMoveLeft || this.pinned === 'left') { return 'left'; } if (this.needToMoveRight || this.pinned === 'right') { return 'right'; } } attemptToPinColumns(columns, pinned, fromMoving = false) { const allowedCols = (columns || []).filter((c) => !c.getColDef().lockPinned); if (!allowedCols.length) { return 0; } if (fromMoving) { pinned = this.getPinDirection(); } const { pinnedCols, dragAndDrop } = this.beans; pinnedCols?.setColsPinned(allowedCols, pinned, 'uiColumnDragged'); if (fromMoving) { dragAndDrop.nudge(); } return allowedCols.length; } destroy() { super.destroy(); this.lastDraggingEvent = null; this.clearHighlighted(); this.lastMovedInfo = null; } } exports.MoveColumnFeature = MoveColumnFeature; function setColumnHighlighted(column, highlighted) { if (column.highlighted === highlighted) { return; } column.highlighted = highlighted; column.dispatchColEvent('headerHighlightChanged', 'uiColumnMoved'); } function findFirstAndLastMovingColumns(allMovingColumns) { const moveLen = allMovingColumns.length; let firstMovingCol; let lastMovingCol; for (let i = 0; i < moveLen; i++) { if (!firstMovingCol) { const leftCol = allMovingColumns[i]; if (leftCol.getLeft() != null) { firstMovingCol = leftCol; } } if (!lastMovingCol) { const rightCol = allMovingColumns[moveLen - 1 - i]; if (rightCol.getLeft() != null) { lastMovingCol = rightCol; } } if (firstMovingCol && lastMovingCol) { break; } } return { firstMovingCol, lastMovingCol }; } /***/ }), /***/ 852: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.moveColumns = exports.moveColumnByIndex = void 0; function moveColumnByIndex(beans, fromIndex, toIndex) { beans.colMoves?.moveColumnByIndex(fromIndex, toIndex, 'api'); } exports.moveColumnByIndex = moveColumnByIndex; function moveColumns(beans, columnsToMoveKeys, toIndex) { beans.colMoves?.moveColumns(columnsToMoveKeys, toIndex, 'api'); } exports.moveColumns = moveColumns; /***/ }), /***/ 4074: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ColumnMoveModule = void 0; const dragModule_1 = __webpack_require__(4388); const version_1 = __webpack_require__(7205); const column_moving_css_GENERATED_1 = __webpack_require__(9607); const columnAnimationService_1 = __webpack_require__(9122); const columnMoveApi_1 = __webpack_require__(852); const columnMoveService_1 = __webpack_require__(4067); /** * @feature Columns -> Column Moving */ exports.ColumnMoveModule = { moduleName: 'ColumnMove', version: version_1.VERSION, beans: [columnMoveService_1.ColumnMoveService, columnAnimationService_1.ColumnAnimationService], apiFunctions: { moveColumnByIndex: columnMoveApi_1.moveColumnByIndex, moveColumns: columnMoveApi_1.moveColumns, }, dependsOn: [dragModule_1.SharedDragAndDropModule], css: [column_moving_css_GENERATED_1.columnMovingCSS], }; /***/ }), /***/ 4067: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ColumnMoveService = void 0; const beanStub_1 = __webpack_require__(8731); const dragAndDropService_1 = __webpack_require__(2903); const agColumnGroup_1 = __webpack_require__(6908); const array_1 = __webpack_require__(1502); const logging_1 = __webpack_require__(7764); const bodyDropTarget_1 = __webpack_require__(7912); const columnMoveUtils_1 = __webpack_require__(3505); const internalColumnMoveUtils_1 = __webpack_require__(5446); var MoveDirection; (function (MoveDirection) { MoveDirection[MoveDirection["LEFT"] = -1] = "LEFT"; MoveDirection[MoveDirection["NONE"] = 0] = "NONE"; MoveDirection[MoveDirection["RIGHT"] = 1] = "RIGHT"; })(MoveDirection || (MoveDirection = {})); class ColumnMoveService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'colMoves'; } moveColumnByIndex(fromIndex, toIndex, source) { const gridColumns = this.beans.colModel.getCols(); if (!gridColumns) { return; } const column = gridColumns[fromIndex]; this.moveColumns([column], toIndex, source); } moveColumns(columnsToMoveKeys, toIndex, source, finished = true) { const { colModel, colAnimation, visibleCols, eventSvc } = this.beans; const gridColumns = colModel.getCols(); if (!gridColumns) { return; } if (toIndex > gridColumns.length - columnsToMoveKeys.length) { // Trying to insert in invalid position (0, logging_1._warn)(30, { toIndex }); return; } colAnimation?.start(); // we want to pull all the columns out first and put them into an ordered list const movedColumns = colModel.getColsForKeys(columnsToMoveKeys); if (this.doesMovePassRules(movedColumns, toIndex)) { (0, array_1._moveInArray)(colModel.getCols(), movedColumns, toIndex); visibleCols.refresh(source); eventSvc.dispatchEvent({ type: 'columnMoved', columns: movedColumns, column: movedColumns.length === 1 ? movedColumns[0] : null, toIndex, finished, source, }); } colAnimation?.finish(); } doesMovePassRules(columnsToMove, toIndex) { // make a copy of what the grid columns would look like after the move const proposedColumnOrder = this.getProposedColumnOrder(columnsToMove, toIndex); return this.doesOrderPassRules(proposedColumnOrder); } doesOrderPassRules(gridOrder) { const { colModel, gos } = this.beans; if (!(0, columnMoveUtils_1.doesMovePassMarryChildren)(gridOrder, colModel.getColTree())) { return false; } const doesMovePassLockedPositions = (proposedColumnOrder) => { const lockPositionToPlacement = (position) => { if (!position) { return MoveDirection.NONE; } return position === 'left' || position === true ? MoveDirection.LEFT : MoveDirection.RIGHT; }; const isRtl = gos.get('enableRtl'); let lastPlacement = isRtl ? MoveDirection.RIGHT : MoveDirection.LEFT; let rulePassed = true; proposedColumnOrder.forEach((col) => { const placement = lockPositionToPlacement(col.getColDef().lockPosition); if (isRtl) { if (placement > lastPlacement) { // If placement goes up, we're not in the correct order rulePassed = false; } } else { if (placement < lastPlacement) { // If placement goes down, we're not in the correct order rulePassed = false; } } lastPlacement = placement; }); return rulePassed; }; if (!doesMovePassLockedPositions(gridOrder)) { return false; } return true; } getProposedColumnOrder(columnsToMove, toIndex) { const gridColumns = this.beans.colModel.getCols(); const proposedColumnOrder = gridColumns.slice(); (0, array_1._moveInArray)(proposedColumnOrder, columnsToMove, toIndex); return proposedColumnOrder; } createBodyDropTarget(pinned, dropContainer) { return new bodyDropTarget_1.BodyDropTarget(pinned, dropContainer); } moveHeader(hDirection, eGui, column, pinned, bean) { const { ctrlsSvc, gos, colModel, visibleCols, focusSvc } = this.beans; const rect = eGui.getBoundingClientRect(); const left = rect.left; const isGroup = (0, agColumnGroup_1.isColumnGroup)(column); const width = isGroup ? rect.width : column.getActualWidth(); const isLeft = (hDirection === 'left') !== gos.get('enableRtl'); const xPosition = (0, internalColumnMoveUtils_1.normaliseX)({ x: isLeft ? left - 20 : left + width + 20, pinned, fromKeyboard: true, gos, ctrlsSvc, }); const headerPosition = focusSvc.focusedHeader; (0, internalColumnMoveUtils_1.attemptMoveColumns)({ allMovingColumns: isGroup ? column.getLeafColumns() : [column], isFromHeader: true, fromLeft: hDirection === 'right', xPosition, pinned, fromEnter: false, fakeEvent: false, gos, colModel, colMoves: this, visibleCols, finished: true, }); let targetColumn; if (isGroup) { const displayedLeafColumns = column.getDisplayedLeafColumns(); targetColumn = isLeft ? displayedLeafColumns[0] : (0, array_1._last)(displayedLeafColumns); } else { targetColumn = column; } ctrlsSvc.getScrollFeature().ensureColumnVisible(targetColumn, 'auto'); if ((!bean.isAlive() || gos.get('ensureDomOrder')) && headerPosition) { let restoreFocusColumn; if (isGroup) { const groupId = column.getGroupId(); const leafCols = column.getLeafColumns(); if (!leafCols.length) { return; } const parent = leafCols[0].getParent(); if (!parent) { return; } restoreFocusColumn = findGroupWidthId(parent, groupId); } else { restoreFocusColumn = column; } if (restoreFocusColumn) { focusSvc.focusHeaderPosition({ headerPosition: { ...headerPosition, column: restoreFocusColumn, }, }); } } } setDragSourceForHeader(eSource, column, displayName) { const { gos, colModel, dragAndDrop, visibleCols } = this.beans; let hideColumnOnExit = !gos.get('suppressDragLeaveHidesColumns'); const isGroup = (0, agColumnGroup_1.isColumnGroup)(column); const columns = isGroup ? column.getProvidedColumnGroup().getLeafColumns() : [column]; const getDragItem = isGroup ? () => createDragItemForGroup(column, visibleCols.allCols) : () => createDragItem(column); const dragSource = { type: dragAndDropService_1.DragSourceType.HeaderCell, eElement: eSource, getDefaultIconName: () => (hideColumnOnExit ? 'hide' : 'notAllowed'), getDragItem, dragItemName: displayName, onDragStarted: () => { hideColumnOnExit = !gos.get('suppressDragLeaveHidesColumns'); (0, internalColumnMoveUtils_1.setColumnsMoving)(columns, true); }, onDragStopped: () => (0, internalColumnMoveUtils_1.setColumnsMoving)(columns, false), onDragCancelled: () => (0, internalColumnMoveUtils_1.setColumnsMoving)(columns, false), onGridEnter: (dragItem) => { if (hideColumnOnExit) { const { columns = [], visibleState } = dragItem ?? {}; const hasVisibleState = isGroup ? (col) => !visibleState || visibleState[col.getColId()] : () => true; const unlockedColumns = columns.filter((col) => !col.getColDef().lockVisible && hasVisibleState(col)); colModel.setColsVisible(unlockedColumns, true, 'uiColumnMoved'); } }, onGridExit: (dragItem) => { if (hideColumnOnExit) { const unlockedColumns = dragItem?.columns?.filter((col) => !col.getColDef().lockVisible) || []; colModel.setColsVisible(unlockedColumns, false, 'uiColumnMoved'); } }, }; dragAndDrop.addDragSource(dragSource, true); return dragSource; } } exports.ColumnMoveService = ColumnMoveService; function findGroupWidthId(columnGroup, id) { while (columnGroup) { if (columnGroup.getGroupId() === id) { return columnGroup; } columnGroup = columnGroup.getParent(); } return undefined; } function createDragItem(column) { const visibleState = {}; visibleState[column.getId()] = column.isVisible(); return { columns: [column], visibleState: visibleState, }; } // when moving the columns, we want to move all the columns (contained within the DragItem) in this group in one go, // and in the order they are currently in the screen. function createDragItemForGroup(columnGroup, allCols) { const allColumnsOriginalOrder = columnGroup.getProvidedColumnGroup().getLeafColumns(); // capture visible state, used when re-entering grid to dictate which columns should be visible const visibleState = {}; allColumnsOriginalOrder.forEach((column) => (visibleState[column.getId()] = column.isVisible())); const allColumnsCurrentOrder = []; allCols.forEach((column) => { if (allColumnsOriginalOrder.indexOf(column) >= 0) { allColumnsCurrentOrder.push(column); (0, array_1._removeFromArray)(allColumnsOriginalOrder, column); } }); // we are left with non-visible columns, stick these in at the end allColumnsOriginalOrder.forEach((column) => allColumnsCurrentOrder.push(column)); const columnsInSplit = []; const columnGroupColumns = columnGroup.getLeafColumns(); for (const col of allColumnsCurrentOrder) { if (columnGroupColumns.indexOf(col) !== -1) { columnsInSplit.push(col); } } // create and return dragItem return { columns: allColumnsCurrentOrder, columnsInSplit, visibleState: visibleState, }; } /***/ }), /***/ 3505: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.doesMovePassMarryChildren = exports.placeLockedColumns = void 0; const columnFactoryUtils_1 = __webpack_require__(2716); const agProvidedColumnGroup_1 = __webpack_require__(9409); function placeLockedColumns(cols, gos) { const left = []; const normal = []; const right = []; cols.forEach((col) => { const position = col.getColDef().lockPosition; if (position === 'right') { right.push(col); } else if (position === 'left' || position === true) { left.push(col); } else { normal.push(col); } }); const isRtl = gos.get('enableRtl'); if (isRtl) { return [...right, ...normal, ...left]; } return [...left, ...normal, ...right]; } exports.placeLockedColumns = placeLockedColumns; function doesMovePassMarryChildren(allColumnsCopy, gridBalancedTree) { let rulePassed = true; (0, columnFactoryUtils_1.depthFirstOriginalTreeSearch)(null, gridBalancedTree, (child) => { if (!(0, agProvidedColumnGroup_1.isProvidedColumnGroup)(child)) { return; } const columnGroup = child; const colGroupDef = columnGroup.getColGroupDef(); const marryChildren = colGroupDef && colGroupDef.marryChildren; if (!marryChildren) { return; } const newIndexes = []; columnGroup.getLeafColumns().forEach((col) => { const newColIndex = allColumnsCopy.indexOf(col); newIndexes.push(newColIndex); }); // eslint-disable-next-line prefer-spread const maxIndex = Math.max.apply(Math, newIndexes); // eslint-disable-next-line prefer-spread const minIndex = Math.min.apply(Math, newIndexes); // spread is how far the first column in this group is away from the last column const spread = maxIndex - minIndex; const maxSpread = columnGroup.getLeafColumns().length - 1; // if the columns if (spread > maxSpread) { rulePassed = false; } // console.log(`maxIndex = ${maxIndex}, minIndex = ${minIndex}, spread = ${spread}, maxSpread = ${maxSpread}, fail = ${spread > (count-1)}`) // console.log(allColumnsCopy.map( col => col.getColDef().field).join(',')); }); return rulePassed; } exports.doesMovePassMarryChildren = doesMovePassMarryChildren; /***/ }), /***/ 5446: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.setColumnsMoving = exports.normaliseX = exports.attemptMoveColumns = exports.getBestColumnMoveIndexFromXPosition = void 0; const array_1 = __webpack_require__(1502); // returns the provided cols sorted in same order as they appear in this.cols, eg if this.cols // contains [a,b,c,d,e] and col passed is [e,a] then the passed cols are sorted into [a,e] function sortColsLikeCols(colsList, cols) { if (!cols || cols.length <= 1) { return; } const notAllColsPresent = cols.filter((c) => colsList.indexOf(c) < 0).length > 0; if (notAllColsPresent) { return; } cols.sort((a, b) => { const indexA = colsList.indexOf(a); const indexB = colsList.indexOf(b); return indexA - indexB; }); } function getBestColumnMoveIndexFromXPosition(params) { const { isFromHeader, fromLeft, xPosition, fromEnter, fakeEvent, pinned, gos, colModel, colMoves, visibleCols } = params; let { allMovingColumns } = params; if (isFromHeader) { // If the columns we're dragging are the only visible columns of their group, move the hidden ones too const newCols = []; allMovingColumns.forEach((col) => { let movingGroup = null; let parent = col.getParent(); while (parent != null && parent.getDisplayedLeafColumns().length === 1) { movingGroup = parent; parent = parent.getParent(); } if (movingGroup != null) { const isMarryChildren = !!movingGroup.getColGroupDef()?.marryChildren; const columnsToMove = isMarryChildren ? // when marry children is true, we also have to move hidden // columns within the group, so grab them from the `providedColumnGroup` movingGroup.getProvidedColumnGroup().getLeafColumns() : movingGroup.getLeafColumns(); columnsToMove.forEach((newCol) => { if (!newCols.includes(newCol)) { newCols.push(newCol); } }); } else if (!newCols.includes(col)) { newCols.push(col); } }); allMovingColumns = newCols; } // it is important to sort the moving columns as they are in grid columns, as the list of moving columns // could themselves be part of 'married children' groups, which means we need to maintain the order within // the moving list. const allMovingColumnsOrdered = allMovingColumns.slice(); sortColsLikeCols(colModel.getCols(), allMovingColumnsOrdered); const validMoves = calculateValidMoves({ movingCols: allMovingColumnsOrdered, draggingRight: fromLeft, xPosition, pinned, gos, colModel, visibleCols, }); // if cols are not adjacent, then this returns null. when moving, we constrain the direction of the move // (ie left or right) to the mouse direction. however const oldIndex = calculateOldIndex(allMovingColumnsOrdered, colModel); if (validMoves.length === 0) { return; } const firstValidMove = validMoves[0]; // the two check below stop an error when the user grabs a group my a middle column, then // it is possible the mouse pointer is to the right of a column while been dragged left. // so we need to make sure that the mouse pointer is actually left of the left most column // if moving left, and right of the right most column if moving right // we check 'fromEnter' below so we move the column to the new spot if the mouse is coming from // outside the grid, eg if the column is moving from side panel, mouse is moving left, then we should // place the column to the RHS even if the mouse is moving left and the column is already on // the LHS. otherwise we stick to the rule described above. let constrainDirection = oldIndex !== null && !fromEnter; // don't consider 'fromEnter' when dragging header cells, otherwise group can jump to opposite direction of drag if (isFromHeader) { constrainDirection = oldIndex !== null; } // if the event was faked by a change in column pin state, then the original location of the column // is not reliable for dictating where the column may now be placed. if (constrainDirection && !fakeEvent) { // only allow left drag if this column is moving left if (!fromLeft && firstValidMove >= oldIndex) { return; } // only allow right drag if this column is moving right if (fromLeft && firstValidMove <= oldIndex) { return; } } // From when we find a move that passes all the rules // Remember what that move would look like in terms of displayed cols // keep going with further moves until we find a different result in displayed output // In this way potentialMoves contains all potential moves over 'hidden' columns const displayedCols = visibleCols.allCols; const potentialMoves = []; let targetOrder = null; for (let i = 0; i < validMoves.length; i++) { const move = validMoves[i]; const order = colMoves.getProposedColumnOrder(allMovingColumnsOrdered, move); if (!colMoves.doesOrderPassRules(order)) { continue; } const displayedOrder = order.filter((col) => displayedCols.includes(col)); if (targetOrder === null) { targetOrder = displayedOrder; } else if (!(0, array_1._areEqual)(displayedOrder, targetOrder)) { break; // Stop looking for potential moves if the displayed result changes from the target } const fragCount = groupFragCount(order); potentialMoves.push({ move, fragCount }); } if (potentialMoves.length === 0) { return; } // The best move is the move with least group fragmentation potentialMoves.sort((a, b) => a.fragCount - b.fragCount); const toIndex = potentialMoves[0].move; if (toIndex > colModel.getCols().length - allMovingColumns.length) { return; } return { columns: allMovingColumns, toIndex }; } exports.getBestColumnMoveIndexFromXPosition = getBestColumnMoveIndexFromXPosition; function attemptMoveColumns(params) { const { columns, toIndex } = getBestColumnMoveIndexFromXPosition(params) || {}; const { finished, colMoves } = params; if (!columns || toIndex == null) { return null; } colMoves.moveColumns(columns, toIndex, 'uiColumnMoved', finished); return finished ? null : { columns, toIndex }; } exports.attemptMoveColumns = attemptMoveColumns; // returns the index of the first column in the list ONLY if the cols are all beside // each other. if the cols are not beside each other, then returns null function calculateOldIndex(movingCols, colModel) { const gridCols = colModel.getCols(); const indexes = (0, array_1._sortNumerically)(movingCols.map((col) => gridCols.indexOf(col))); const firstIndex = indexes[0]; const lastIndex = (0, array_1._last)(indexes); const spread = lastIndex - firstIndex; const gapsExist = spread !== indexes.length - 1; return gapsExist ? null : firstIndex; } // A measure of how fragmented in terms of groups an order of columns is function groupFragCount(columns) { function parents(col) { const result = []; let parent = col.getOriginalParent(); while (parent != null) { result.push(parent); parent = parent.getOriginalParent(); } return result; } let count = 0; for (let i = 0; i < columns.length - 1; i++) { let a = parents(columns[i]); let b = parents(columns[i + 1]); // iterate over the longest one [a, b] = a.length > b.length ? [a, b] : [b, a]; a.forEach((parent) => { if (b.indexOf(parent) === -1) { count++; // More fragmented if other column doesn't share the parent } }); } return count; } function getDisplayedColumns(visibleCols, type) { switch (type) { case 'left': return visibleCols.leftCols; case 'right': return visibleCols.rightCols; default: return visibleCols.centerCols; } } function calculateValidMoves(params) { const { movingCols, draggingRight, xPosition, pinned, gos, colModel, visibleCols } = params; const isMoveBlocked = gos.get('suppressMovableColumns') || movingCols.some((col) => col.getColDef().suppressMovable); if (isMoveBlocked) { return []; } // this is the list of cols on the screen, so it's these we use when comparing the x mouse position const allDisplayedCols = getDisplayedColumns(visibleCols, pinned); // but this list is the list of all cols, when we move a col it's the index within this list that gets used, // so the result we return has to be and index location for this list const allGridCols = colModel.getCols(); const movingDisplayedCols = allDisplayedCols.filter((col) => movingCols.includes(col)); const otherDisplayedCols = allDisplayedCols.filter((col) => !movingCols.includes(col)); const otherGridCols = allGridCols.filter((col) => !movingCols.includes(col)); // work out how many DISPLAYED columns fit before the 'x' position. this gives us the displayIndex. // for example, if cols are a,b,c,d and we find a,b fit before 'x', then we want to place the moving // col between b and c (so that it is under the mouse position). let displayIndex = 0; let availableWidth = xPosition; // if we are dragging right, then the columns will be to the left of the mouse, so we also want to // include the width of the moving columns if (draggingRight) { let widthOfMovingDisplayedCols = 0; movingDisplayedCols.forEach((col) => (widthOfMovingDisplayedCols += col.getActualWidth())); availableWidth -= widthOfMovingDisplayedCols; } if (availableWidth > 0) { // now count how many of the displayed columns will fit to the left for (let i = 0; i < otherDisplayedCols.length; i++) { const col = otherDisplayedCols[i]; availableWidth -= col.getActualWidth(); if (availableWidth < 0) { break; } displayIndex++; } // trial and error, if going right, we adjust by one, i didn't manage to quantify why, but it works if (draggingRight) { displayIndex++; } } // the display index is with respect to all the showing columns, however when we move, it's with // respect to all grid columns, so we need to translate from display index to grid index let firstValidMove; if (displayIndex > 0) { const leftColumn = otherDisplayedCols[displayIndex - 1]; firstValidMove = otherGridCols.indexOf(leftColumn) + 1; } else { firstValidMove = otherGridCols.indexOf(otherDisplayedCols[0]); if (firstValidMove === -1) { firstValidMove = 0; } } const validMoves = [firstValidMove]; const numberComparator = (a, b) => a - b; // add in other valid moves due to hidden columns and married children. for example, a particular // move might break a group that has married children (so move isn't valid), however there could // be hidden columns (not displayed) that we could jump over to make the move valid. because // they are hidden, user doesn't see any different, however it allows moves that would otherwise // not work. for example imagine a group with 9 columns and all columns are hidden except the // middle one (so 4 hidden to left, 4 hidden to right), then when moving 'firstValidMove' will // be relative to the not-shown column, however we need to consider the move jumping over all the // hidden children. if we didn't do this, then if the group just described was at the end (RHS) of the // grid, there would be no way to put a column after it (as the grid would only consider beside the // visible column, which would fail valid move rules). if (draggingRight) { // if dragging right, then we add all the additional moves to the right. so in other words // if the next move is not valid, find the next move to the right that is valid. let pointer = firstValidMove + 1; const lastIndex = allGridCols.length - 1; while (pointer <= lastIndex) { validMoves.push(pointer); pointer++; } // adding columns here means the order is now messed up validMoves.sort(numberComparator); } else { // if dragging left we do the reverse of dragging right, we add in all the valid moves to the // left. however we also have to consider moves to the right for all hidden columns first. // (this logic is hard to reason with, it was worked out with trial and error, // more observation rather than science). // add moves to the right let pointer = firstValidMove; const lastIndex = allGridCols.length - 1; let displacedCol = allGridCols[pointer]; // takes into account visible=false and group=closed, ie it is not displayed while (pointer <= lastIndex && allDisplayedCols.indexOf(displacedCol) < 0) { pointer++; validMoves.push(pointer); displacedCol = allGridCols[pointer]; } // add moves to the left pointer = firstValidMove - 1; const firstDisplayIndex = 0; while (pointer >= firstDisplayIndex) { validMoves.push(pointer); pointer--; } // adding columns here means the order is now messed up validMoves.sort(numberComparator).reverse(); } return validMoves; } function normaliseX(params) { const { pinned, fromKeyboard, gos, ctrlsSvc, useHeaderRow, skipScrollPadding } = params; let eViewport = ctrlsSvc.getHeaderRowContainerCtrl(pinned)?.eViewport; let { x } = params; if (!eViewport) { return 0; } if (fromKeyboard) { x -= eViewport.getBoundingClientRect().left; } // flip the coordinate if doing RTL if (gos.get('enableRtl')) { if (useHeaderRow) { eViewport = eViewport.querySelector('.ag-header-row'); } x = eViewport.clientWidth - x; } // adjust for scroll only if centre container (the pinned containers don't scroll) if (pinned == null && !skipScrollPadding) { x += ctrlsSvc.get('center').getCenterViewportScrollLeft(); } return x; } exports.normaliseX = normaliseX; function setColumnsMoving(columns, isMoving) { for (const column of columns) { column.moving = isMoving; column.dispatchColEvent('movingChanged', 'uiColumnMoved'); } } exports.setColumnsMoving = setColumnsMoving; /***/ }), /***/ 9686: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.setColumnWidths = void 0; function setColumnWidths(beans, columnWidths, finished = true, source = 'api') { beans.colResize?.setColumnWidths(columnWidths, false, finished, source); } exports.setColumnWidths = setColumnWidths; /***/ }), /***/ 6924: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ColumnResizeModule = void 0; const dragModule_1 = __webpack_require__(4388); const autoWidthModule_1 = __webpack_require__(447); const version_1 = __webpack_require__(7205); const columnResizeApi_1 = __webpack_require__(9686); const columnResizeService_1 = __webpack_require__(9677); /** * @feature Columns -> Column Sizing */ exports.ColumnResizeModule = { moduleName: 'ColumnResize', version: version_1.VERSION, beans: [columnResizeService_1.ColumnResizeService], apiFunctions: { setColumnWidths: columnResizeApi_1.setColumnWidths, }, dependsOn: [dragModule_1.HorizontalResizeModule, autoWidthModule_1.AutoWidthModule], }; /***/ }), /***/ 9677: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ColumnResizeService = void 0; const columnEventUtils_1 = __webpack_require__(2934); const beanStub_1 = __webpack_require__(8731); const logging_1 = __webpack_require__(7764); const groupResizeFeature_1 = __webpack_require__(9033); const resizeFeature_1 = __webpack_require__(7438); class ColumnResizeService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'colResize'; } setColumnWidths(columnWidths, shiftKey, // @takeFromAdjacent - if user has 'shift' pressed, then pixels are taken from adjacent column finished, // @finished - ends up in the event, tells the user if more events are to come source) { const sets = []; const { colModel, gos, visibleCols } = this.beans; columnWidths.forEach((columnWidth) => { const col = colModel.getColDefCol(columnWidth.key) || colModel.getCol(columnWidth.key); if (!col) { return; } sets.push({ width: columnWidth.newWidth, ratios: [1], columns: [col], }); // if user wants to do shift resize by default, then we invert the shift operation const defaultIsShift = gos.get('colResizeDefault') === 'shift'; if (defaultIsShift) { shiftKey = !shiftKey; } if (shiftKey) { const otherCol = visibleCols.getColAfter(col); if (!otherCol) { return; } const widthDiff = col.getActualWidth() - columnWidth.newWidth; const otherColWidth = otherCol.getActualWidth() + widthDiff; sets.push({ width: otherColWidth, ratios: [1], columns: [otherCol], }); } }); if (sets.length === 0) { return; } this.resizeColumnSets({ resizeSets: sets, finished, source, }); } // method takes sets of columns and resizes them. either all sets will be resized, or nothing // be resized. this is used for example when user tries to resize a group and holds shift key, // then both the current group (grows), and the adjacent group (shrinks), will get resized, // so that's two sets for this method. resizeColumnSets(params) { const { resizeSets, finished, source } = params; const passMinMaxCheck = !resizeSets || resizeSets.every((columnResizeSet) => checkMinAndMaxWidthsForSet(columnResizeSet)); if (!passMinMaxCheck) { // even though we are not going to resize beyond min/max size, we still need to dispatch event when finished if (finished) { const columns = resizeSets && resizeSets.length > 0 ? resizeSets[0].columns : null; (0, columnEventUtils_1.dispatchColumnResizedEvent)(this.eventSvc, columns, finished, source); } return; // don't resize! } const changedCols = []; const allResizedCols = []; resizeSets.forEach((set) => { const { width, columns, ratios } = set; // keep track of pixels used, and last column gets the remaining, // to cater for rounding errors, and min width adjustments const newWidths = {}; const finishedCols = {}; columns.forEach((col) => allResizedCols.push(col)); // the loop below goes through each col. if a col exceeds it's min/max width, // it then gets set to its min/max width and the column is removed marked as 'finished' // and the calculation is done again leaving this column out. take for example columns // {A, width: 50, maxWidth: 100} // {B, width: 50} // {C, width: 50} // and then the set is set to width 600 - on the first pass the grid tries to set each column // to 200. it checks A and sees 200 > 100 and so sets the width to 100. col A is then marked // as 'finished' and the calculation is done again with the remaining cols B and C, which end up // splitting the remaining 500 pixels. let finishedColsGrew = true; let loopCount = 0; while (finishedColsGrew) { loopCount++; if (loopCount > 1000) { // this should never happen, but in the future, someone might introduce a bug here, // so we stop the browser from hanging and report bug properly (0, logging_1._error)(31); break; } finishedColsGrew = false; const subsetCols = []; let subsetRatioTotal = 0; let pixelsToDistribute = width; columns.forEach((col, index) => { const thisColFinished = finishedCols[col.getId()]; if (thisColFinished) { pixelsToDistribute -= newWidths[col.getId()]; } else { subsetCols.push(col); const ratioThisCol = ratios[index]; subsetRatioTotal += ratioThisCol; } }); // because we are not using all of the ratios (cols can be missing), // we scale the ratio. if all columns are included, then subsetRatioTotal=1, // and so the ratioScale will be 1. const ratioScale = 1 / subsetRatioTotal; subsetCols.forEach((col, index) => { const lastCol = index === subsetCols.length - 1; let colNewWidth; if (lastCol) { colNewWidth = pixelsToDistribute; } else { colNewWidth = Math.round(ratios[index] * width * ratioScale); pixelsToDistribute -= colNewWidth; } const minWidth = col.getMinWidth(); const maxWidth = col.getMaxWidth(); if (colNewWidth < minWidth) { colNewWidth = minWidth; finishedCols[col.getId()] = true; finishedColsGrew = true; } else if (maxWidth > 0 && colNewWidth > maxWidth) { colNewWidth = maxWidth; finishedCols[col.getId()] = true; finishedColsGrew = true; } newWidths[col.getId()] = colNewWidth; }); } columns.forEach((col) => { const newWidth = newWidths[col.getId()]; const actualWidth = col.getActualWidth(); if (actualWidth !== newWidth) { col.setActualWidth(newWidth, source); changedCols.push(col); } }); }); // if no cols changed, then no need to update more or send event. const atLeastOneColChanged = changedCols.length > 0; let flexedCols = []; if (atLeastOneColChanged) { const { colFlex, visibleCols, colViewport } = this.beans; flexedCols = colFlex?.refreshFlexedColumns({ resizingCols: allResizedCols, skipSetLeft: true, }) ?? []; visibleCols.setLeftValues(source); visibleCols.updateBodyWidths(); colViewport.checkViewportColumns(); } // check for change first, to avoid unnecessary firing of events // however we always dispatch 'finished' events. this is important // when groups are resized, as if the group is changing slowly, // eg 1 pixel at a time, then each change will dispatch change events // in all the columns in the group, but only one with get the pixel. const colsForEvent = allResizedCols.concat(flexedCols); if (atLeastOneColChanged || finished) { (0, columnEventUtils_1.dispatchColumnResizedEvent)(this.eventSvc, colsForEvent, finished, source, flexedCols); } } resizeHeader(column, delta, shiftKey) { if (!column.isResizable()) { return; } const actualWidth = column.getActualWidth(); const minWidth = column.getMinWidth(); const maxWidth = column.getMaxWidth(); const newWidth = Math.min(Math.max(actualWidth + delta, minWidth), maxWidth); this.setColumnWidths([{ key: column, newWidth }], shiftKey, true, 'uiColumnResized'); } createResizeFeature(pinned, column, eResize, comp, ctrl) { return new resizeFeature_1.ResizeFeature(pinned, column, eResize, comp, ctrl); } createGroupResizeFeature(comp, eResize, pinned, columnGroup) { return new groupResizeFeature_1.GroupResizeFeature(comp, eResize, pinned, columnGroup); } } exports.ColumnResizeService = ColumnResizeService; function checkMinAndMaxWidthsForSet(columnResizeSet) { const { columns, width } = columnResizeSet; // every col has a min width, so sum them all up and see if we have enough room // for all the min widths let minWidthAccumulated = 0; let maxWidthAccumulated = 0; let maxWidthActive = true; columns.forEach((col) => { const minWidth = col.getMinWidth(); minWidthAccumulated += minWidth || 0; const maxWidth = col.getMaxWidth(); if (maxWidth > 0) { maxWidthAccumulated += maxWidth; } else { // if at least one columns has no max width, it means the group of columns // then has no max width, as at least one column can take as much width as possible maxWidthActive = false; } }); const minWidthPasses = width >= minWidthAccumulated; const maxWidthPasses = !maxWidthActive || width <= maxWidthAccumulated; return minWidthPasses && maxWidthPasses; } /***/ }), /***/ 9033: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.GroupResizeFeature = void 0; const beanStub_1 = __webpack_require__(8731); class GroupResizeFeature extends beanStub_1.BeanStub { constructor(comp, eResize, pinned, columnGroup) { super(); this.comp = comp; this.eResize = eResize; this.pinned = pinned; this.columnGroup = columnGroup; } postConstruct() { if (!this.columnGroup.isResizable()) { this.comp.setResizableDisplayed(false); return; } const { horizontalResizeSvc, gos, colAutosize } = this.beans; const finishedWithResizeFunc = horizontalResizeSvc.addResizeBar({ eResizeBar: this.eResize, onResizeStart: this.onResizeStart.bind(this), onResizing: this.onResizing.bind(this, false), onResizeEnd: this.onResizing.bind(this, true), }); this.addDestroyFunc(finishedWithResizeFunc); if (!gos.get('suppressAutoSize') && colAutosize) { this.addDestroyFunc(colAutosize.addColumnGroupResize(this.eResize, this.columnGroup, () => this.resizeLeafColumnsToFit('uiColumnResized'))); } } onResizeStart(shiftKey) { const { columnsToResize, resizeStartWidth, resizeRatios, groupAfterColumns, groupAfterStartWidth, groupAfterRatios, } = this.getInitialValues(shiftKey); this.resizeCols = columnsToResize; this.resizeStartWidth = resizeStartWidth; this.resizeRatios = resizeRatios; this.resizeTakeFromCols = groupAfterColumns; this.resizeTakeFromStartWidth = groupAfterStartWidth; this.resizeTakeFromRatios = groupAfterRatios; this.toggleColumnResizing(true); } onResizing(finished, resizeAmount, source = 'uiColumnResized') { const resizeAmountNormalised = this.normaliseDragChange(resizeAmount); const width = this.resizeStartWidth + resizeAmountNormalised; this.resizeColumnsFromLocalValues(width, source, finished); } getInitialValues(shiftKey) { const getInitialSizeOfColumns = (columns) => columns.reduce((totalWidth, column) => totalWidth + column.getActualWidth(), 0); const getSizeRatiosOfColumns = (columns, initialSizeOfColumns) => columns.map((column) => column.getActualWidth() / initialSizeOfColumns); const columnsToResize = this.getColumnsToResize(); const resizeStartWidth = getInitialSizeOfColumns(columnsToResize); const resizeRatios = getSizeRatiosOfColumns(columnsToResize, resizeStartWidth); const columnSizeAndRatios = { columnsToResize, resizeStartWidth, resizeRatios, }; let groupAfter = null; if (shiftKey) { groupAfter = this.beans.colGroupSvc?.getGroupAtDirection(this.columnGroup, 'After') ?? null; } if (groupAfter) { const takeFromLeafCols = groupAfter.getDisplayedLeafColumns(); const groupAfterColumns = (columnSizeAndRatios.groupAfterColumns = takeFromLeafCols.filter((col) => col.isResizable())); const groupAfterStartWidth = (columnSizeAndRatios.groupAfterStartWidth = getInitialSizeOfColumns(groupAfterColumns)); columnSizeAndRatios.groupAfterRatios = getSizeRatiosOfColumns(groupAfterColumns, groupAfterStartWidth); } else { columnSizeAndRatios.groupAfterColumns = undefined; columnSizeAndRatios.groupAfterStartWidth = undefined; columnSizeAndRatios.groupAfterRatios = undefined; } return columnSizeAndRatios; } resizeLeafColumnsToFit(source) { const preferredSize = this.beans.autoWidthCalc.getPreferredWidthForColumnGroup(this.columnGroup); const initialValues = this.getInitialValues(); if (preferredSize > initialValues.resizeStartWidth) { this.resizeColumns(initialValues, preferredSize, source, true); } } resizeColumnsFromLocalValues(totalWidth, source, finished = true) { if (!this.resizeCols || !this.resizeRatios) { return; } const initialValues = { columnsToResize: this.resizeCols, resizeStartWidth: this.resizeStartWidth, resizeRatios: this.resizeRatios, groupAfterColumns: this.resizeTakeFromCols, groupAfterStartWidth: this.resizeTakeFromStartWidth, groupAfterRatios: this.resizeTakeFromRatios, }; this.resizeColumns(initialValues, totalWidth, source, finished); } resizeColumns(initialValues, totalWidth, source, finished = true) { const { columnsToResize, resizeStartWidth, resizeRatios, groupAfterColumns, groupAfterStartWidth, groupAfterRatios, } = initialValues; const resizeSets = []; resizeSets.push({ columns: columnsToResize, ratios: resizeRatios, width: totalWidth, }); if (groupAfterColumns) { const diff = totalWidth - resizeStartWidth; resizeSets.push({ columns: groupAfterColumns, ratios: groupAfterRatios, width: groupAfterStartWidth - diff, }); } this.beans.colResize?.resizeColumnSets({ resizeSets, finished, source: source, }); if (finished) { this.toggleColumnResizing(false); } } toggleColumnResizing(resizing) { this.comp.addOrRemoveCssClass('ag-column-resizing', resizing); } getColumnsToResize() { const leafCols = this.columnGroup.getDisplayedLeafColumns(); return leafCols.filter((col) => col.isResizable()); } // optionally inverts the drag, depending on pinned and RTL // note - this method is duplicated in RenderedHeaderCell - should refactor out? normaliseDragChange(dragChange) { let result = dragChange; if (this.gos.get('enableRtl')) { // for RTL, dragging left makes the col bigger, except when pinning left if (this.pinned !== 'left') { result *= -1; } } else if (this.pinned === 'right') { // for LTR (ie normal), dragging left makes the col smaller, except when pinning right result *= -1; } return result; } destroy() { super.destroy(); this.resizeCols = undefined; this.resizeRatios = undefined; this.resizeTakeFromCols = undefined; this.resizeTakeFromRatios = undefined; } } exports.GroupResizeFeature = GroupResizeFeature; /***/ }), /***/ 7438: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ResizeFeature = void 0; const beanStub_1 = __webpack_require__(8731); const dom_1 = __webpack_require__(3507); class ResizeFeature extends beanStub_1.BeanStub { constructor(pinned, column, eResize, comp, ctrl) { super(); this.pinned = pinned; this.column = column; this.eResize = eResize; this.comp = comp; this.ctrl = ctrl; } postConstruct() { const destroyResizeFuncs = []; let canResize; let canAutosize; const addResize = () => { (0, dom_1._setDisplayed)(this.eResize, canResize); if (!canResize) { return; } const { horizontalResizeSvc, colAutosize } = this.beans; const finishedWithResizeFunc = horizontalResizeSvc.addResizeBar({ eResizeBar: this.eResize, onResizeStart: this.onResizeStart.bind(this), onResizing: this.onResizing.bind(this, false), onResizeEnd: this.onResizing.bind(this, true), }); destroyResizeFuncs.push(finishedWithResizeFunc); if (canAutosize && colAutosize) { destroyResizeFuncs.push(colAutosize.addColumnAutosize(this.eResize, this.column)); } }; const removeResize = () => { destroyResizeFuncs.forEach((f) => f()); destroyResizeFuncs.length = 0; }; const refresh = () => { const resize = this.column.isResizable(); const autoSize = !this.gos.get('suppressAutoSize') && !this.column.getColDef().suppressAutoSize; const propertyChange = resize !== canResize || autoSize !== canAutosize; if (propertyChange) { canResize = resize; canAutosize = autoSize; removeResize(); addResize(); } }; refresh(); this.addDestroyFunc(removeResize); this.ctrl.setRefreshFunction('resize', refresh); } onResizing(finished, resizeAmount) { const { column: key, lastResizeAmount, resizeStartWidth, beans } = this; const resizeAmountNormalised = this.normaliseResizeAmount(resizeAmount); const newWidth = resizeStartWidth + resizeAmountNormalised; const columnWidths = [{ key, newWidth }]; const { pinnedCols, ctrlsSvc, colResize } = beans; if (this.column.getPinned()) { const leftWidth = pinnedCols?.leftWidth ?? 0; const rightWidth = pinnedCols?.rightWidth ?? 0; const bodyWidth = (0, dom_1._getInnerWidth)(ctrlsSvc.getGridBodyCtrl().eBodyViewport) - 50; if (leftWidth + rightWidth + (resizeAmountNormalised - lastResizeAmount) > bodyWidth) { return; } } this.lastResizeAmount = resizeAmountNormalised; colResize?.setColumnWidths(columnWidths, this.resizeWithShiftKey, finished, 'uiColumnResized'); if (finished) { this.toggleColumnResizing(false); } } onResizeStart(shiftKey) { this.resizeStartWidth = this.column.getActualWidth(); this.lastResizeAmount = 0; this.resizeWithShiftKey = shiftKey; this.toggleColumnResizing(true); } toggleColumnResizing(resizing) { this.comp.addOrRemoveCssClass('ag-column-resizing', resizing); } // optionally inverts the drag, depending on pinned and RTL // note - this method is duplicated in RenderedHeaderGroupCell - should refactor out? normaliseResizeAmount(dragChange) { let result = dragChange; const notPinningLeft = this.pinned !== 'left'; const pinningRight = this.pinned === 'right'; if (this.gos.get('enableRtl')) { // for RTL, dragging left makes the col bigger, except when pinning left if (notPinningLeft) { result *= -1; } } else { // for LTR (ie normal), dragging left makes the col smaller, except when pinning right if (pinningRight) { result *= -1; } } return result; } } exports.ResizeFeature = ResizeFeature; /***/ }), /***/ 3600: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.BaseColsService = void 0; const beanStub_1 = __webpack_require__(8731); const array_1 = __webpack_require__(1502); const generic_1 = __webpack_require__(4422); const columnEventUtils_1 = __webpack_require__(2934); class BaseColsService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.dispatchColumnChangedEvent = columnEventUtils_1.dispatchColumnChangedEvent; this.columns = []; } wireBeans(beans) { this.colModel = beans.colModel; this.aggFuncSvc = beans.aggFuncSvc; this.visibleCols = beans.visibleCols; } sortColumns(compareFn) { this.columns.sort(compareFn); } setColumns(colKeys, source) { this.setColList(colKeys, this.columns, this.eventName, true, true, this.columnProcessors.set, source); } addColumns(colKeys, source) { this.updateColList(colKeys, this.columns, true, true, this.columnProcessors.add, this.eventName, source); } removeColumns(colKeys, source) { this.updateColList(colKeys, this.columns, false, true, this.columnProcessors.remove, this.eventName, source); } setColList(colKeys = [], masterList, eventName, detectOrderChange, autoGroupsNeedBuilding, columnCallback, source) { const gridColumns = this.colModel.getCols(); if (!gridColumns || gridColumns.length === 0) { return; } const changes = new Map(); // store all original cols and their index. masterList.forEach((col, idx) => changes.set(col, idx)); masterList.length = 0; if ((0, generic_1._exists)(colKeys)) { colKeys.forEach((key) => { const column = this.colModel.getColDefCol(key); if (column) { masterList.push(column); } }); } masterList.forEach((col, idx) => { const oldIndex = changes.get(col); // if the column was not in the list, we add it as it's a change // idx is irrelevant now. if (oldIndex === undefined) { changes.set(col, 0); return; } if (detectOrderChange && oldIndex !== idx) { // if we're detecting order changes, and the indexes differ, we retain this as it's changed return; } // otherwise remove this col, as it's unchanged. changes.delete(col); }); const primaryCols = this.colModel.getColDefCols(); (primaryCols || []).forEach((column) => { const added = masterList.indexOf(column) >= 0; columnCallback(column, added, source); }); autoGroupsNeedBuilding && this.colModel.refreshCols(false); this.visibleCols.refresh(source); this.dispatchColumnChangedEvent(this.eventSvc, eventName, [...changes.keys()], source); } updateColList(keys = [], masterList, actionIsAdd, autoGroupsNeedBuilding, columnCallback, eventType, source) { if (!keys || keys.length === 0) { return; } let atLeastOne = false; const updatedCols = new Set(); keys.forEach((key) => { if (!key) { return; } const columnToAdd = this.colModel.getColDefCol(key); if (!columnToAdd) { return; } updatedCols.add(columnToAdd); if (actionIsAdd) { if (masterList.indexOf(columnToAdd) >= 0) { return; } masterList.push(columnToAdd); } else { const currentIndex = masterList.indexOf(columnToAdd); if (currentIndex < 0) { return; } for (let i = currentIndex + 1; i < masterList.length; i++) { // row indexes of subsequent columns have changed updatedCols.add(masterList[i]); } (0, array_1._removeFromArray)(masterList, columnToAdd); } columnCallback(columnToAdd, actionIsAdd, source); atLeastOne = true; }); if (!atLeastOne) { return; } if (autoGroupsNeedBuilding) { this.colModel.refreshCols(false); } this.visibleCols.refresh(source); const eventColumns = Array.from(updatedCols); this.eventSvc.dispatchEvent({ type: eventType, columns: eventColumns, column: eventColumns.length === 1 ? eventColumns[0] : null, source, }); } extractCols(source, oldProvidedCols = []) { const previousCols = this.columns; const colsWithIndex = []; const colsWithValue = []; const { setFlagFunc, getIndexFunc, getInitialIndexFunc, getValueFunc, getInitialValueFunc } = this.columnExtractors; const primaryCols = this.colModel.getColDefCols() || []; // go though all cols. // if value, change // if default only, change only if new primaryCols.forEach((col) => { const colIsNew = oldProvidedCols.indexOf(col) < 0; const colDef = col.getColDef(); const value = getValueFunc(colDef); const initialValue = getInitialValueFunc(colDef); const index = getIndexFunc(colDef); const initialIndex = getInitialIndexFunc(colDef); let include; const valuePresent = value !== undefined; const indexPresent = index !== undefined; const initialValuePresent = initialValue !== undefined; const initialIndexPresent = initialIndex !== undefined; if (valuePresent) { include = value; // boolean value is guaranteed as attrToBoolean() is used above } else if (indexPresent) { if (index === null) { // if col is new we don't want to use the default / initial if index is set to null. Similarly, // we don't want to include the property for existing columns, i.e. we want to 'clear' it. include = false; } else { // note that 'null >= 0' evaluates to true which means 'rowGroupIndex = null' would enable row // grouping if the null check didn't exist above. include = index >= 0; } } else { if (colIsNew) { // as no value or index is 'present' we use the default / initial when col is new if (initialValuePresent) { include = initialValue; } else if (initialIndexPresent) { include = initialIndex != null && initialIndex >= 0; } else { include = false; } } else { // otherwise include it if included last time, e.g. if we are extracting row group cols and this col // is an existing row group col (i.e. it exists in 'previousCols') then we should include it. include = previousCols.indexOf(col) >= 0; } } if (include) { const useIndex = colIsNew ? index != null || initialIndex != null : index != null; useIndex ? colsWithIndex.push(col) : colsWithValue.push(col); } }); const getIndexForCol = (col) => { const index = getIndexFunc(col.getColDef()); const defaultIndex = getInitialIndexFunc(col.getColDef()); return index != null ? index : defaultIndex; }; // sort cols with index, and add these first colsWithIndex.sort((colA, colB) => { const indexA = getIndexForCol(colA); const indexB = getIndexForCol(colB); if (indexA === indexB) { return 0; } if (indexA < indexB) { return -1; } return 1; }); const res = [].concat(colsWithIndex); // second add columns that were there before and in the same order as they were before, // so we are preserving order of current grouping of columns that simply have rowGroup=true previousCols.forEach((col) => { if (colsWithValue.indexOf(col) >= 0) { res.push(col); } }); // lastly put in all remaining cols colsWithValue.forEach((col) => { if (res.indexOf(col) < 0) { res.push(col); } }); // set flag=false for removed cols previousCols.forEach((col) => { if (res.indexOf(col) < 0) { setFlagFunc(col, false, source); } }); // set flag=true for newly added cols res.forEach((col) => { if (previousCols.indexOf(col) < 0) { setFlagFunc(col, true, source); } }); return (this.columns = res); } restoreColumnOrder(columnStateAccumulator, incomingColumnState) { const colList = this.columns; const primaryCols = this.colModel.getColDefCols(); if (!colList.length || !primaryCols) { return columnStateAccumulator; } const updatedColIdArray = Object.keys(incomingColumnState); const updatedColIds = new Set(updatedColIdArray); const newColIds = new Set(updatedColIdArray); const allColIds = new Set(colList .map((column) => { const colId = column.getColId(); newColIds.delete(colId); return colId; }) .concat(updatedColIdArray)); const colIdsInOriginalOrder = []; const originalOrderMap = {}; let orderIndex = 0; for (let i = 0; i < primaryCols.length; i++) { const colId = primaryCols[i].getColId(); if (allColIds.has(colId)) { colIdsInOriginalOrder.push(colId); originalOrderMap[colId] = orderIndex++; } } // follow approach in `resetColumnState` let index = 1000; let hasAddedNewCols = false; let lastIndex = 0; const enableProp = this.columnOrdering.enableProp; const initialEnableProp = this.columnOrdering.initialEnableProp; const indexProp = this.columnOrdering.indexProp; const initialIndexProp = this.columnOrdering.initialIndexProp; const processPrecedingNewCols = (colId) => { const originalOrderIndex = originalOrderMap[colId]; for (let i = lastIndex; i < originalOrderIndex; i++) { const newColId = colIdsInOriginalOrder[i]; if (newColIds.has(newColId)) { incomingColumnState[newColId][indexProp] = index++; newColIds.delete(newColId); } } lastIndex = originalOrderIndex; }; colList.forEach((column) => { const colId = column.getColId(); if (updatedColIds.has(colId)) { // New col already exists. Add any other new cols that should be before it. processPrecedingNewCols(colId); incomingColumnState[colId][indexProp] = index++; } else { const colDef = column.getColDef(); const missingIndex = colDef[indexProp] === null || (colDef[indexProp] === undefined && colDef[initialIndexProp] == null); if (missingIndex) { if (!hasAddedNewCols) { const propEnabled = colDef[enableProp] || (colDef[enableProp] === undefined && colDef[initialEnableProp]); if (propEnabled) { processPrecedingNewCols(colId); } else { // Reached the first manually added column. Add all the new columns now. newColIds.forEach((newColId) => { // Rather than increment the index, just use the original order index - doesn't need to be contiguous. incomingColumnState[newColId][indexProp] = index + originalOrderMap[newColId]; }); index += colIdsInOriginalOrder.length; hasAddedNewCols = true; } } if (!columnStateAccumulator[colId]) { columnStateAccumulator[colId] = { colId }; } columnStateAccumulator[colId][indexProp] = index++; } } }); return columnStateAccumulator; } } exports.BaseColsService = BaseColsService; /***/ }), /***/ 1144: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getAllDisplayedVirtualColumns = exports.getAllDisplayedColumns = exports.getDisplayedRightColumns = exports.getDisplayedCenterColumns = exports.getDisplayedLeftColumns = exports.getAllGridColumns = exports.setColumnsPinned = exports.setColumnsVisible = exports.getDisplayedColBefore = exports.getDisplayedColAfter = exports.isPinningRight = exports.isPinningLeft = exports.isPinning = exports.resetColumnState = exports.getColumnState = exports.applyColumnState = exports.getColumns = exports.getColumn = exports.getDisplayNameForColumn = exports.getColumnDefs = exports.getColumnDef = void 0; const columnStateUtils_1 = __webpack_require__(2885); function getColumnDef(beans, key) { const column = beans.colModel.getColDefCol(key); if (column) { return column.getColDef(); } return null; } exports.getColumnDef = getColumnDef; function getColumnDefs(beans) { return beans.colModel.getColumnDefs(); } exports.getColumnDefs = getColumnDefs; function getDisplayNameForColumn(beans, column, location) { return beans.colNames.getDisplayNameForColumn(column, location) || ''; } exports.getDisplayNameForColumn = getDisplayNameForColumn; function getColumn(beans, key) { return beans.colModel.getColDefCol(key); } exports.getColumn = getColumn; function getColumns(beans) { return beans.colModel.getColDefCols(); } exports.getColumns = getColumns; function applyColumnState(beans, params) { return (0, columnStateUtils_1._applyColumnState)(beans, params, 'api'); } exports.applyColumnState = applyColumnState; function getColumnState(beans) { return (0, columnStateUtils_1._getColumnState)(beans); } exports.getColumnState = getColumnState; function resetColumnState(beans) { (0, columnStateUtils_1._resetColumnState)(beans, 'api'); } exports.resetColumnState = resetColumnState; function isPinning(beans) { return beans.visibleCols.isPinningLeft() || beans.visibleCols.isPinningRight(); } exports.isPinning = isPinning; function isPinningLeft(beans) { return beans.visibleCols.isPinningLeft(); } exports.isPinningLeft = isPinningLeft; function isPinningRight(beans) { return beans.visibleCols.isPinningRight(); } exports.isPinningRight = isPinningRight; function getDisplayedColAfter(beans, col) { return beans.visibleCols.getColAfter(col); } exports.getDisplayedColAfter = getDisplayedColAfter; function getDisplayedColBefore(beans, col) { return beans.visibleCols.getColBefore(col); } exports.getDisplayedColBefore = getDisplayedColBefore; function setColumnsVisible(beans, keys, visible) { beans.colModel.setColsVisible(keys, visible, 'api'); } exports.setColumnsVisible = setColumnsVisible; function setColumnsPinned(beans, keys, pinned) { beans.pinnedCols?.setColsPinned(keys, pinned, 'api'); } exports.setColumnsPinned = setColumnsPinned; function getAllGridColumns(beans) { return beans.colModel.getCols(); } exports.getAllGridColumns = getAllGridColumns; function getDisplayedLeftColumns(beans) { return beans.visibleCols.leftCols; } exports.getDisplayedLeftColumns = getDisplayedLeftColumns; function getDisplayedCenterColumns(beans) { return beans.visibleCols.centerCols; } exports.getDisplayedCenterColumns = getDisplayedCenterColumns; function getDisplayedRightColumns(beans) { return beans.visibleCols.rightCols; } exports.getDisplayedRightColumns = getDisplayedRightColumns; function getAllDisplayedColumns(beans) { return beans.visibleCols.allCols; } exports.getAllDisplayedColumns = getAllDisplayedColumns; function getAllDisplayedVirtualColumns(beans) { return beans.colViewport.getViewportColumns(); } exports.getAllDisplayedVirtualColumns = getAllDisplayedVirtualColumns; /***/ }), /***/ 4604: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ColumnDefFactory = exports._deepCloneDefinition = void 0; const beanStub_1 = __webpack_require__(8731); const object_1 = __webpack_require__(6996); // returns copy of an object, doing a deep clone of any objects with that object. // this is used for eg creating copies of Column Definitions, where we want to // deep copy all objects, but do not want to deep copy functions (eg when user provides // a function or class for colDef.cellRenderer) function _deepCloneDefinition(object, keysToSkip) { if (!object) { return; } const obj = object; const res = {}; Object.keys(obj).forEach((key) => { if ((keysToSkip && keysToSkip.indexOf(key) >= 0) || object_1.SKIP_JS_BUILTINS.has(key)) { return; } const value = obj[key]; // 'simple object' means a bunch of key/value pairs, eg {filter: 'myFilter'}. it does // NOT include the following: // 1) arrays // 2) functions or classes (eg api instance) const sourceIsSimpleObject = typeof value === 'object' && value !== null && value.constructor === Object; if (sourceIsSimpleObject) { res[key] = _deepCloneDefinition(value); } else { res[key] = value; } }); return res; } exports._deepCloneDefinition = _deepCloneDefinition; class ColumnDefFactory extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'colDefFactory'; } wireBeans(beans) { this.rowGroupColsSvc = beans.rowGroupColsSvc; this.pivotColsSvc = beans.pivotColsSvc; } getColumnDefs(colDefColsList, showingPivotResult, lastOrder, colsList) { const cols = colDefColsList.slice(); if (showingPivotResult) { cols.sort((a, b) => lastOrder.indexOf(a) - lastOrder.indexOf(b)); } else if (lastOrder) { cols.sort((a, b) => colsList.indexOf(a) - colsList.indexOf(b)); } const rowGroupColumns = this.rowGroupColsSvc?.columns; const pivotColumns = this.pivotColsSvc?.columns; return this.buildColumnDefs(cols, rowGroupColumns, pivotColumns); } buildColumnDefs(cols, rowGroupColumns = [], pivotColumns = []) { const res = []; const colGroupDefs = {}; cols.forEach((col) => { const colDef = this.createDefFromColumn(col, rowGroupColumns, pivotColumns); let addToResult = true; let childDef = colDef; let pointer = col.getOriginalParent(); let lastPointer = null; while (pointer) { let parentDef = null; // we don't include padding groups, as the column groups provided // by application didn't have these. the whole point of padding groups // is to balance the column tree that the user provided. if (pointer.isPadding()) { pointer = pointer.getOriginalParent(); continue; } // if colDef for this group already exists, use it const existingParentDef = colGroupDefs[pointer.getGroupId()]; if (existingParentDef) { existingParentDef.children.push(childDef); // if we added to result, it would be the second time we did it addToResult = false; // we don't want to continue up the tree, as it has already been // done for this group break; } parentDef = this.createDefFromGroup(pointer); if (parentDef) { parentDef.children = [childDef]; colGroupDefs[parentDef.groupId] = parentDef; childDef = parentDef; pointer = pointer.getOriginalParent(); } if (pointer != null && lastPointer === pointer) { addToResult = false; break; } // Ensure we don't get stuck in an infinite loop lastPointer = pointer; } if (addToResult) { res.push(childDef); } }); return res; } createDefFromGroup(group) { const defCloned = _deepCloneDefinition(group.getColGroupDef(), ['children']); if (defCloned) { defCloned.groupId = group.getGroupId(); } return defCloned; } createDefFromColumn(col, rowGroupColumns, pivotColumns) { const colDefCloned = _deepCloneDefinition(col.getColDef()); colDefCloned.colId = col.getColId(); colDefCloned.width = col.getActualWidth(); colDefCloned.rowGroup = col.isRowGroupActive(); colDefCloned.rowGroupIndex = col.isRowGroupActive() ? rowGroupColumns.indexOf(col) : null; colDefCloned.pivot = col.isPivotActive(); colDefCloned.pivotIndex = col.isPivotActive() ? pivotColumns.indexOf(col) : null; colDefCloned.aggFunc = col.isValueActive() ? col.getAggFunc() : null; colDefCloned.hide = col.isVisible() ? undefined : true; colDefCloned.pinned = col.isPinned() ? col.getPinned() : null; colDefCloned.sort = col.getSort() ? col.getSort() : null; colDefCloned.sortIndex = col.getSortIndex() != null ? col.getSortIndex() : null; return colDefCloned; } } exports.ColumnDefFactory = ColumnDefFactory; /***/ }), /***/ 2934: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.dispatchColumnResizedEvent = exports.dispatchColumnChangedEvent = exports.dispatchColumnVisibleEvent = exports.dispatchColumnPinnedEvent = void 0; function getCommonValue(cols, valueGetter) { if (!cols || cols.length == 0) { return undefined; } // compare each value to the first value. if nothing differs, then value is common so return it. const firstValue = valueGetter(cols[0]); for (let i = 1; i < cols.length; i++) { if (firstValue !== valueGetter(cols[i])) { // values differ, no common value return undefined; } } return firstValue; } function dispatchColumnPinnedEvent(eventSvc, changedColumns, source) { if (!changedColumns.length) { return; } // if just one column, we use this, otherwise we don't include the col const column = changedColumns.length === 1 ? changedColumns[0] : null; // only include pinned if it's common in all columns const pinned = getCommonValue(changedColumns, (col) => col.getPinned()); eventSvc.dispatchEvent({ type: 'columnPinned', // mistake in typing, 'undefined' should be allowed, as 'null' means 'not pinned' pinned: pinned != null ? pinned : null, columns: changedColumns, column, source, }); } exports.dispatchColumnPinnedEvent = dispatchColumnPinnedEvent; function dispatchColumnVisibleEvent(eventSvc, changedColumns, source) { if (!changedColumns.length) { return; } // if just one column, we use this, otherwise we don't include the col const column = changedColumns.length === 1 ? changedColumns[0] : null; // only include visible if it's common in all columns const visible = getCommonValue(changedColumns, (col) => col.isVisible()); eventSvc.dispatchEvent({ type: 'columnVisible', visible, columns: changedColumns, column, source, }); } exports.dispatchColumnVisibleEvent = dispatchColumnVisibleEvent; function dispatchColumnChangedEvent(eventSvc, type, columns, source) { eventSvc.dispatchEvent({ type, columns, column: columns && columns.length == 1 ? columns[0] : null, source, }); } exports.dispatchColumnChangedEvent = dispatchColumnChangedEvent; function dispatchColumnResizedEvent(eventSvc, columns, finished, source, flexColumns = null) { if (columns?.length) { eventSvc.dispatchEvent({ type: 'columnResized', columns, column: columns.length === 1 ? columns[0] : null, flexColumns, finished, source, }); } } exports.dispatchColumnResizedEvent = dispatchColumnResizedEvent; /***/ }), /***/ 2716: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.depthFirstOriginalTreeSearch = exports._addColumnDefaultAndTypes = exports._updateColumnState = exports.updateSomeColumnState = exports._recursivelyCreateColumns = exports._createColumnTree = void 0; const agColumn_1 = __webpack_require__(3355); const agProvidedColumnGroup_1 = __webpack_require__(9409); const defaultColumnTypes_1 = __webpack_require__(5449); const gridOptionsUtils_1 = __webpack_require__(7274); const object_1 = __webpack_require__(6996); const logging_1 = __webpack_require__(7764); const columnKeyCreator_1 = __webpack_require__(2294); const columnUtils_1 = __webpack_require__(3146); function _createColumnTree(beans, defs = null, primaryColumns, existingTree, source) { // column key creator dishes out unique column id's in a deterministic way, // so if we have two grids (that could be master/slave) with same column definitions, // then this ensures the two grids use identical id's. const columnKeyCreator = new columnKeyCreator_1.ColumnKeyCreator(); const { existingCols, existingGroups, existingColKeys } = extractExistingTreeData(existingTree); columnKeyCreator.addExistingKeys(existingColKeys); // create am unbalanced tree that maps the provided definitions const unbalancedTree = _recursivelyCreateColumns(beans, defs, 0, primaryColumns, existingCols, columnKeyCreator, existingGroups, source); const { colGroupSvc } = beans; const treeDept = colGroupSvc?.findMaxDepth(unbalancedTree, 0) ?? 0; const columnTree = colGroupSvc ? colGroupSvc.balanceColumnTree(unbalancedTree, 0, treeDept, columnKeyCreator) : unbalancedTree; const deptFirstCallback = (child, parent) => { if ((0, agProvidedColumnGroup_1.isProvidedColumnGroup)(child)) { child.setupExpandable(); } // we set the original parents at the end, rather than when we go along, as balancing the tree // adds extra levels into the tree. so we can only set parents when balancing is done. child.originalParent = parent; }; depthFirstOriginalTreeSearch(null, columnTree, deptFirstCallback); return { columnTree, treeDept, }; } exports._createColumnTree = _createColumnTree; function extractExistingTreeData(existingTree) { const existingCols = []; const existingGroups = []; const existingColKeys = []; if (existingTree) { depthFirstOriginalTreeSearch(null, existingTree, (item) => { if ((0, agProvidedColumnGroup_1.isProvidedColumnGroup)(item)) { const group = item; existingGroups.push(group); } else { const col = item; existingColKeys.push(col.getId()); existingCols.push(col); } }); } return { existingCols, existingGroups, existingColKeys }; } function _recursivelyCreateColumns(beans, defs, level, primaryColumns, existingColsCopy, columnKeyCreator, existingGroups, source) { if (!defs) return []; const { colGroupSvc } = beans; const result = new Array(defs.length); for (let i = 0; i < result.length; i++) { const def = defs[i]; if (colGroupSvc && isColumnGroup(def)) { result[i] = colGroupSvc.createProvidedColumnGroup(primaryColumns, def, level, existingColsCopy, columnKeyCreator, existingGroups, source); } else { result[i] = createColumn(beans, primaryColumns, def, existingColsCopy, columnKeyCreator, source); } } return result; } exports._recursivelyCreateColumns = _recursivelyCreateColumns; function createColumn(beans, primaryColumns, colDef, existingColsCopy, columnKeyCreator, source) { // see if column already exists const existingColAndIndex = findExistingColumn(colDef, existingColsCopy); // make sure we remove, so if user provided duplicate id, then we don't have more than // one column instance for colDef with common id if (existingColAndIndex) { existingColsCopy?.splice(existingColAndIndex.idx, 1); } let column = existingColAndIndex?.column; if (!column) { // no existing column, need to create one const colId = columnKeyCreator.getUniqueKey(colDef.colId, colDef.field); const colDefMerged = _addColumnDefaultAndTypes(beans, colDef, colId); column = new agColumn_1.AgColumn(colDefMerged, colDef, colId, primaryColumns); beans.context.createBean(column); } else { const colDefMerged = _addColumnDefaultAndTypes(beans, colDef, column.getColId()); column.setColDef(colDefMerged, colDef, source); _updateColumnState(beans, column, colDefMerged, source); } beans.dataTypeSvc?.addColumnListeners(column); return column; } /** Updates hide, sort, sortIndex, pinned and flex */ function updateSomeColumnState(beans, column, hide, sort, sortIndex, pinned, flex, source) { const { sortSvc, pinnedCols, colFlex } = beans; // hide - anything but undefined, thus null will clear the hide if (hide !== undefined) { column.setVisible(!hide, source); } if (sortSvc) { // sort - anything but undefined will set sort, thus null or empty string will clear the sort sortSvc.updateColSort(column, sort, source); // sorted at - anything but undefined, thus null will clear the sortIndex if (sortIndex !== undefined) { sortSvc.setColSortIndex(column, sortIndex); } } // pinned - anything but undefined, thus null or empty string will remove pinned if (pinned !== undefined) { pinnedCols?.setColPinned(column, pinned); } // flex if (flex !== undefined) { colFlex?.setColFlex(column, flex); } } exports.updateSomeColumnState = updateSomeColumnState; function _updateColumnState(beans, column, colDef, source) { updateSomeColumnState(beans, column, colDef.hide, colDef.sort, colDef.sortIndex, colDef.pinned, colDef.flex, source); const colFlex = column.getFlex(); // width - we only set width if column is not flexing if (colFlex != null && colFlex > 0) { return; } // both null and undefined means we skip, as it's not possible to 'clear' width (a column must have a width) if (colDef.width != null) { column.setActualWidth(colDef.width, source); } else { // otherwise set the width again, in case min or max width has changed, // and width needs to be adjusted. const widthBeforeUpdate = column.getActualWidth(); column.setActualWidth(widthBeforeUpdate, source); } } exports._updateColumnState = _updateColumnState; function findExistingColumn(newColDef, existingColsCopy) { if (!existingColsCopy) return undefined; for (let i = 0; i < existingColsCopy.length; i++) { const def = existingColsCopy[i].getUserProvidedColDef(); if (!def) continue; const newHasId = newColDef.colId != null; if (newHasId) { if (existingColsCopy[i].getId() === newColDef.colId) { return { idx: i, column: existingColsCopy[i] }; } continue; } const newHasField = newColDef.field != null; if (newHasField) { if (def.field === newColDef.field) { return { idx: i, column: existingColsCopy[i] }; } continue; } if (def === newColDef) { return { idx: i, column: existingColsCopy[i] }; } } return undefined; } function _addColumnDefaultAndTypes(beans, colDef, colId, isAutoCol) { const { gos, dataTypeSvc, validation } = beans; // start with empty merged definition const res = {}; // merge properties from default column definitions const defaultColDef = gos.get('defaultColDef'); (0, object_1._mergeDeep)(res, defaultColDef, false, true); const columnType = updateColDefAndGetColumnType(beans, res, colDef, colId); if (columnType) { assignColumnTypes(beans, columnType, res); } // merge properties from column definitions (0, object_1._mergeDeep)(res, colDef, false, true); const autoGroupColDef = gos.get('autoGroupColumnDef'); const isSortingCoupled = (0, gridOptionsUtils_1._isColumnsSortingCoupledToGroup)(gos); if (colDef.rowGroup && autoGroupColDef && isSortingCoupled) { // override the sort for row group columns where the autoGroupColDef defines these values. (0, object_1._mergeDeep)(res, { sort: autoGroupColDef.sort, initialSort: autoGroupColDef.initialSort }, false, true); } dataTypeSvc?.validateColDef(res); validation?.validateColDef(res, colId, isAutoCol); return res; } exports._addColumnDefaultAndTypes = _addColumnDefaultAndTypes; function updateColDefAndGetColumnType(beans, colDef, userColDef, colId) { const dataTypeDefinitionColumnType = beans.dataTypeSvc?.updateColDefAndGetColumnType(colDef, userColDef, colId); const columnTypes = userColDef.type ?? dataTypeDefinitionColumnType ?? colDef.type; colDef.type = columnTypes; return columnTypes ? (0, columnUtils_1.convertColumnTypes)(columnTypes) : undefined; } function assignColumnTypes(beans, typeKeys, colDefMerged) { if (!typeKeys.length) { return; } // merge user defined with default column types const allColumnTypes = Object.assign({}, defaultColumnTypes_1.DefaultColumnTypes); const userTypes = beans.gos.get('columnTypes') || {}; for (const key of Object.keys(userTypes)) { const value = userTypes[key]; if (key in allColumnTypes) { // default column types cannot be overridden (0, logging_1._warn)(34, { key }); } else { const colType = value; if (colType.type) { // type should not be defined in column types (0, logging_1._warn)(35); } allColumnTypes[key] = value; } } typeKeys.forEach((t) => { const typeColDef = allColumnTypes[t.trim()]; if (typeColDef) { (0, object_1._mergeDeep)(colDefMerged, typeColDef, false, true); } else { (0, logging_1._warn)(36, { t }); } }); } // if object has children, we assume it's a group function isColumnGroup(abstractColDef) { return abstractColDef.children !== undefined; } function depthFirstOriginalTreeSearch(parent, tree, callback) { if (!tree) { return; } for (let i = 0; i < tree.length; i++) { const child = tree[i]; if ((0, agProvidedColumnGroup_1.isProvidedColumnGroup)(child)) { depthFirstOriginalTreeSearch(child, child.getChildren(), callback); } callback(child, parent); } } exports.depthFirstOriginalTreeSearch = depthFirstOriginalTreeSearch; /***/ }), /***/ 2849: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ColumnFlexService = void 0; const beanStub_1 = __webpack_require__(8731); const columnEventUtils_1 = __webpack_require__(2934); class ColumnFlexService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'colFlex'; } refreshFlexedColumns(params = {}) { const source = params.source ?? 'flex'; if (params.viewportWidth != null) { this.flexViewportWidth = params.viewportWidth; } const totalSpace = this.flexViewportWidth; if (!totalSpace) { return []; } const { visibleCols } = this.beans; const visibleCenterCols = visibleCols.centerCols; let flexAfterDisplayIndex = -1; if (params.resizingCols) { const allResizingCols = new Set(params.resizingCols); // find the last resizing col, as only cols after this one are affected by the resizing for (let i = visibleCenterCols.length - 1; i >= 0; i--) { if (allResizingCols.has(visibleCenterCols[i])) { flexAfterDisplayIndex = i; break; } } } // NOTE this is an implementation of the "Resolve Flexible Lengths" part // of the flex spec, simplified because we only support flex growing not // shrinking, and don't support flex-basis. // https://www.w3.org/TR/css-flexbox-1/#resolve-flexible-lengths let hasFlexItems = false; const items = visibleCenterCols.map((col, i) => { const flex = col.getFlex(); const isFlex = flex != null && flex > 0 && i > flexAfterDisplayIndex; hasFlexItems || (hasFlexItems = isFlex); return { col, isFlex, flex: Math.max(0, flex ?? 0), initialSize: col.getActualWidth(), min: col.getMinWidth(), max: col.getMaxWidth(), targetSize: 0, }; }); if (!hasFlexItems) { return []; } let unfrozenItemCount = items.length; let unfrozenFlex = items.reduce((acc, item) => acc + item.flex, 0); let unfrozenSpace = totalSpace; const freeze = (item, width) => { item.frozenSize = width; item.col.setActualWidth(width, source); unfrozenSpace -= width; unfrozenFlex -= item.flex; unfrozenItemCount -= 1; }; const isFrozen = (item) => item.frozenSize != null; // Freeze inflexible columns for (const item of items) { if (!item.isFlex) { freeze(item, item.initialSize); } } // a. Check for flexible items. If all the flex items on the line are // frozen, free space has been distributed; exit this loop. while (unfrozenItemCount > 0) { // b. Calculate the remaining free space as for initial free space, // above. If the sum of the unfrozen flex items’ flex factors is // less than one, multiply the initial free space by this sum. const spaceToFill = Math.round(unfrozenFlex < 1 ? unfrozenSpace * unfrozenFlex : unfrozenSpace); // c. Distribute free space proportional to the flex factors. let lastUnfrozenItem; let actualLeft = 0; let idealRight = 0; for (const item of items) { if (isFrozen(item)) { continue; } lastUnfrozenItem = item; idealRight += spaceToFill * (item.flex / unfrozenFlex); const idealSize = idealRight - actualLeft; const roundedSize = Math.round(idealSize); item.targetSize = roundedSize; actualLeft += roundedSize; } if (lastUnfrozenItem) { // Correct cumulative rounding errors: adjust the size of the // last item to fill any remaining space lastUnfrozenItem.targetSize += spaceToFill - actualLeft; } // d. Fix min/max violations. Clamp each non-frozen item’s target // main size by its used min and max main sizes... If the item’s // target main size was made smaller by this, it’s a max violation. // If the item’s target main size was made larger by this, it’s a // min violation. let totalViolation = 0; for (const item of items) { if (isFrozen(item)) { continue; } const unclampedSize = item.targetSize; const clampedSize = Math.min(Math.max(unclampedSize, item.min), item.max); totalViolation += clampedSize - unclampedSize; item.violationType = clampedSize === unclampedSize ? undefined : clampedSize < unclampedSize ? 'max' : 'min'; item.targetSize = clampedSize; } // e. Freeze over-flexed items. The total violation is the sum of // the adjustments from the previous step. // If the total violation is: // - Zero, Freeze all items // - Positive, Freeze all the items with min violations // - Negative, Freeze all the items with max violations const freezeType = totalViolation === 0 ? 'all' : totalViolation > 0 ? 'min' : 'max'; for (const item of items) { if (isFrozen(item)) { continue; } if (freezeType === 'all' || item.violationType === freezeType) { freeze(item, item.targetSize); } } } if (!params.skipSetLeft) { visibleCols.setLeftValues(source); } if (params.updateBodyWidths) { visibleCols.updateBodyWidths(); } const unconstrainedFlexColumns = items .filter((item) => item.isFlex && !item.violationType) .map((item) => item.col); if (params.fireResizedEvent) { const changedColumns = items.filter((item) => item.initialSize !== item.frozenSize).map((item) => item.col); const flexingColumns = items.filter((item) => item.flex).map((item) => item.col); (0, columnEventUtils_1.dispatchColumnResizedEvent)(this.eventSvc, changedColumns, true, source, flexingColumns); } return unconstrainedFlexColumns; } initCol(column) { const { flex, initialFlex } = column.colDef; if (flex !== undefined) { column.flex = flex; } else if (initialFlex !== undefined) { column.flex = initialFlex; } } // this method should only be used by the colModel to // change flex when required by the applyColumnState method. setColFlex(column, flex) { column.flex = flex ?? null; column.dispatchStateUpdatedEvent('flex'); } } exports.ColumnFlexService = ColumnFlexService; /***/ }), /***/ 6641: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getAllDisplayedColumnGroups = exports.getRightDisplayedColumnGroups = exports.getCenterDisplayedColumnGroups = exports.getLeftDisplayedColumnGroups = exports.resetColumnGroupState = exports.setColumnGroupState = exports.getColumnGroupState = exports.getDisplayNameForColumnGroup = exports.getProvidedColumnGroup = exports.getColumnGroup = exports.setColumnGroupOpened = void 0; function setColumnGroupOpened(beans, group, newValue) { beans.colGroupSvc?.setColumnGroupOpened(group, newValue, 'api'); } exports.setColumnGroupOpened = setColumnGroupOpened; function getColumnGroup(beans, name, instanceId) { return beans.colGroupSvc?.getColumnGroup(name, instanceId) ?? null; } exports.getColumnGroup = getColumnGroup; function getProvidedColumnGroup(beans, name) { return beans.colGroupSvc?.getProvidedColGroup(name) ?? null; } exports.getProvidedColumnGroup = getProvidedColumnGroup; function getDisplayNameForColumnGroup(beans, columnGroup, location) { return beans.colNames.getDisplayNameForColumnGroup(columnGroup, location) || ''; } exports.getDisplayNameForColumnGroup = getDisplayNameForColumnGroup; function getColumnGroupState(beans) { return beans.colGroupSvc?.getColumnGroupState() ?? []; } exports.getColumnGroupState = getColumnGroupState; function setColumnGroupState(beans, stateItems) { beans.colGroupSvc?.setColumnGroupState(stateItems, 'api'); } exports.setColumnGroupState = setColumnGroupState; function resetColumnGroupState(beans) { beans.colGroupSvc?.resetColumnGroupState('api'); } exports.resetColumnGroupState = resetColumnGroupState; function getLeftDisplayedColumnGroups(beans) { return beans.visibleCols.treeLeft; } exports.getLeftDisplayedColumnGroups = getLeftDisplayedColumnGroups; function getCenterDisplayedColumnGroups(beans) { return beans.visibleCols.treeCenter; } exports.getCenterDisplayedColumnGroups = getCenterDisplayedColumnGroups; function getRightDisplayedColumnGroups(beans) { return beans.visibleCols.treeRight; } exports.getRightDisplayedColumnGroups = getRightDisplayedColumnGroups; function getAllDisplayedColumnGroups(beans) { return beans.visibleCols.getAllTrees(); } exports.getAllDisplayedColumnGroups = getAllDisplayedColumnGroups; /***/ }), /***/ 6041: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ColumnGroupModule = void 0; const headerGroupCellCtrl_1 = __webpack_require__(84); const version_1 = __webpack_require__(7205); const columnGroupApi_1 = __webpack_require__(6641); const columnGroupService_1 = __webpack_require__(6266); /** * @feature Columns -> Column Groups * @colGroupDef */ exports.ColumnGroupModule = { moduleName: 'ColumnGroup', version: version_1.VERSION, dynamicBeans: { headerGroupCellCtrl: headerGroupCellCtrl_1.HeaderGroupCellCtrl }, beans: [columnGroupService_1.ColumnGroupService], apiFunctions: { getAllDisplayedColumnGroups: columnGroupApi_1.getAllDisplayedColumnGroups, getCenterDisplayedColumnGroups: columnGroupApi_1.getCenterDisplayedColumnGroups, getColumnGroup: columnGroupApi_1.getColumnGroup, getColumnGroupState: columnGroupApi_1.getColumnGroupState, getDisplayNameForColumnGroup: columnGroupApi_1.getDisplayNameForColumnGroup, getLeftDisplayedColumnGroups: columnGroupApi_1.getLeftDisplayedColumnGroups, getProvidedColumnGroup: columnGroupApi_1.getProvidedColumnGroup, getRightDisplayedColumnGroups: columnGroupApi_1.getRightDisplayedColumnGroups, resetColumnGroupState: columnGroupApi_1.resetColumnGroupState, setColumnGroupOpened: columnGroupApi_1.setColumnGroupOpened, setColumnGroupState: columnGroupApi_1.setColumnGroupState, }, }; /***/ }), /***/ 6266: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ColumnGroupService = void 0; const beanStub_1 = __webpack_require__(8731); const agColumnGroup_1 = __webpack_require__(6908); const agColumnGroup_2 = __webpack_require__(6908); const agProvidedColumnGroup_1 = __webpack_require__(9409); const agProvidedColumnGroup_2 = __webpack_require__(9409); const array_1 = __webpack_require__(1502); const generic_1 = __webpack_require__(4422); const columnFactoryUtils_1 = __webpack_require__(2716); const visibleColsService_1 = __webpack_require__(6869); class ColumnGroupService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'colGroupSvc'; } getColumnGroupState() { const columnGroupState = []; const gridBalancedTree = this.beans.colModel.getColTree(); (0, columnFactoryUtils_1.depthFirstOriginalTreeSearch)(null, gridBalancedTree, (node) => { if ((0, agProvidedColumnGroup_2.isProvidedColumnGroup)(node)) { columnGroupState.push({ groupId: node.getGroupId(), open: node.isExpanded(), }); } }); return columnGroupState; } resetColumnGroupState(source) { const primaryColumnTree = this.beans.colModel.getColDefColTree(); if (!primaryColumnTree) { return; } const stateItems = []; (0, columnFactoryUtils_1.depthFirstOriginalTreeSearch)(null, primaryColumnTree, (child) => { if ((0, agProvidedColumnGroup_2.isProvidedColumnGroup)(child)) { const colGroupDef = child.getColGroupDef(); const groupState = { groupId: child.getGroupId(), open: !colGroupDef ? undefined : colGroupDef.openByDefault, }; stateItems.push(groupState); } }); this.setColumnGroupState(stateItems, source); } setColumnGroupState(stateItems, source) { const { colModel, colAnimation, visibleCols, eventSvc } = this.beans; const gridBalancedTree = colModel.getColTree(); if (!gridBalancedTree.length) { return; } colAnimation?.start(); const impactedGroups = []; stateItems.forEach((stateItem) => { const groupKey = stateItem.groupId; const newValue = stateItem.open; const providedColumnGroup = this.getProvidedColGroup(groupKey); if (!providedColumnGroup) { return; } if (providedColumnGroup.isExpanded() === newValue) { return; } providedColumnGroup.setExpanded(newValue); impactedGroups.push(providedColumnGroup); }); visibleCols.refresh(source, true); if (impactedGroups.length) { eventSvc.dispatchEvent({ type: 'columnGroupOpened', columnGroup: impactedGroups.length === 1 ? impactedGroups[0] : undefined, columnGroups: impactedGroups, }); } colAnimation?.finish(); } // called by headerRenderer - when a header is opened or closed setColumnGroupOpened(key, newValue, source) { let keyAsString; if ((0, agProvidedColumnGroup_2.isProvidedColumnGroup)(key)) { keyAsString = key.getId(); } else { keyAsString = key || ''; } this.setColumnGroupState([{ groupId: keyAsString, open: newValue }], source); } getProvidedColGroup(key) { let res = null; (0, columnFactoryUtils_1.depthFirstOriginalTreeSearch)(null, this.beans.colModel.getColTree(), (node) => { if ((0, agProvidedColumnGroup_2.isProvidedColumnGroup)(node)) { if (node.getId() === key) { res = node; } } }); return res; } getGroupAtDirection(columnGroup, direction) { // pick the last displayed column in this group const requiredLevel = columnGroup.getProvidedColumnGroup().getLevel() + columnGroup.getPaddingLevel(); const colGroupLeafColumns = columnGroup.getDisplayedLeafColumns(); const col = direction === 'After' ? (0, array_1._last)(colGroupLeafColumns) : colGroupLeafColumns[0]; const getDisplayColMethod = `getCol${direction}`; while (true) { // keep moving to the next col, until we get to another group const column = this.beans.visibleCols[getDisplayColMethod](col); if (!column) { return null; } const groupPointer = this.getColGroupAtLevel(column, requiredLevel); if (groupPointer !== columnGroup) { return groupPointer; } } } getColGroupAtLevel(column, level) { // get group at same level as the one we are looking for let groupPointer = column.getParent(); let originalGroupLevel; let groupPointerLevel; while (true) { const groupPointerProvidedColumnGroup = groupPointer.getProvidedColumnGroup(); originalGroupLevel = groupPointerProvidedColumnGroup.getLevel(); groupPointerLevel = groupPointer.getPaddingLevel(); if (originalGroupLevel + groupPointerLevel <= level) { break; } groupPointer = groupPointer.getParent(); } return groupPointer; } updateOpenClosedVisibility() { const allColumnGroups = this.beans.visibleCols.getAllTrees(); (0, visibleColsService_1.depthFirstAllColumnTreeSearch)(allColumnGroups, false, (child) => { if ((0, agColumnGroup_1.isColumnGroup)(child)) { child.calculateDisplayedColumns(); } }); } // returns the group with matching colId and instanceId. If instanceId is missing, // matches only on the colId. getColumnGroup(colId, partId) { if (!colId) { return null; } if ((0, agColumnGroup_1.isColumnGroup)(colId)) { return colId; } const allColumnGroups = this.beans.visibleCols.getAllTrees(); const checkPartId = typeof partId === 'number'; let result = null; (0, visibleColsService_1.depthFirstAllColumnTreeSearch)(allColumnGroups, false, (child) => { if ((0, agColumnGroup_1.isColumnGroup)(child)) { const columnGroup = child; let matched; if (checkPartId) { matched = colId === columnGroup.getGroupId() && partId === columnGroup.getPartId(); } else { matched = colId === columnGroup.getGroupId(); } if (matched) { result = columnGroup; } } }); return result; } createColumnGroups(params) { const { columns, idCreator, pinned, oldDisplayedGroups, isStandaloneStructure } = params; const oldColumnsMapped = this.mapOldGroupsById(oldDisplayedGroups); /** * The following logic starts at the leaf level of columns, iterating through them to build their parent * groups when the parents match. * * The created groups are then added to an array, and similarly iterated on until we reach the top level. * * When row groups have no original parent, it's added to the result. */ const topLevelResultCols = []; // this is an array of cols or col groups at one level of depth, starting from leaf and ending at root let groupsOrColsAtCurrentLevel = columns; while (groupsOrColsAtCurrentLevel.length) { // store what's currently iterating so the function can build the next level of col groups const currentlyIterating = groupsOrColsAtCurrentLevel; groupsOrColsAtCurrentLevel = []; // store the index of the last row which was different from the previous row, this is used as a slice // index for finding the children to group together let lastGroupedColIdx = 0; // create a group of children from lastGroupedColIdx to the provided `to` parameter const createGroupToIndex = (to) => { const from = lastGroupedColIdx; lastGroupedColIdx = to; const previousNode = currentlyIterating[from]; const previousNodeProvided = (0, agColumnGroup_1.isColumnGroup)(previousNode) ? previousNode.getProvidedColumnGroup() : previousNode; const previousNodeParent = previousNodeProvided.getOriginalParent(); if (previousNodeParent == null) { // if the last node was different, and had a null parent, then we add all the nodes to the final // results) for (let i = from; i < to; i++) { topLevelResultCols.push(currentlyIterating[i]); } return; } // the parent differs from the previous node, so we create a group from the previous node // and add all to the result array, except the current node. const newGroup = this.createColumnGroup(previousNodeParent, idCreator, oldColumnsMapped, pinned, isStandaloneStructure); for (let i = from; i < to; i++) { newGroup.addChild(currentlyIterating[i]); } groupsOrColsAtCurrentLevel.push(newGroup); }; for (let i = 1; i < currentlyIterating.length; i++) { const thisNode = currentlyIterating[i]; const thisNodeProvided = (0, agColumnGroup_1.isColumnGroup)(thisNode) ? thisNode.getProvidedColumnGroup() : thisNode; const thisNodeParent = thisNodeProvided.getOriginalParent(); const previousNode = currentlyIterating[lastGroupedColIdx]; const previousNodeProvided = (0, agColumnGroup_1.isColumnGroup)(previousNode) ? previousNode.getProvidedColumnGroup() : previousNode; const previousNodeParent = previousNodeProvided.getOriginalParent(); if (thisNodeParent !== previousNodeParent) { createGroupToIndex(i); } } if (lastGroupedColIdx < currentlyIterating.length) { createGroupToIndex(currentlyIterating.length); } } if (!isStandaloneStructure) { this.setupParentsIntoCols(topLevelResultCols, null); } return topLevelResultCols; } createProvidedColumnGroup(primaryColumns, colGroupDef, level, existingColumns, columnKeyCreator, existingGroups, source) { const groupId = columnKeyCreator.getUniqueKey(colGroupDef.groupId || null, null); const colGroupDefMerged = this.createMergedColGroupDef(colGroupDef, groupId); const providedGroup = new agProvidedColumnGroup_1.AgProvidedColumnGroup(colGroupDefMerged, groupId, false, level); this.createBean(providedGroup); const existingGroupAndIndex = this.findExistingGroup(colGroupDef, existingGroups); // make sure we remove, so if user provided duplicate id, then we don't have more than // one column instance for colDef with common id if (existingGroupAndIndex) { existingGroups.splice(existingGroupAndIndex.idx, 1); } const existingGroup = existingGroupAndIndex?.group; if (existingGroup) { providedGroup.setExpanded(existingGroup.isExpanded()); } const children = (0, columnFactoryUtils_1._recursivelyCreateColumns)(this.beans, colGroupDefMerged.children, level + 1, primaryColumns, existingColumns, columnKeyCreator, existingGroups, source); providedGroup.setChildren(children); return providedGroup; } balanceColumnTree(unbalancedTree, currentDept, columnDept, columnKeyCreator) { const result = []; // go through each child, for groups, recurse a level deeper, // for columns we need to pad for (let i = 0; i < unbalancedTree.length; i++) { const child = unbalancedTree[i]; if ((0, agProvidedColumnGroup_2.isProvidedColumnGroup)(child)) { // child is a group, all we do is go to the next level of recursion const originalGroup = child; const newChildren = this.balanceColumnTree(originalGroup.getChildren(), currentDept + 1, columnDept, columnKeyCreator); originalGroup.setChildren(newChildren); result.push(originalGroup); } else { // child is a column - so here we add in the padded column groups if needed let firstPaddedGroup; let currentPaddedGroup; // this for loop will NOT run any loops if no padded column groups are needed for (let j = columnDept - 1; j >= currentDept; j--) { const newColId = columnKeyCreator.getUniqueKey(null, null); const colGroupDefMerged = this.createMergedColGroupDef(null, newColId); const paddedGroup = new agProvidedColumnGroup_1.AgProvidedColumnGroup(colGroupDefMerged, newColId, true, currentDept); this.createBean(paddedGroup); if (currentPaddedGroup) { currentPaddedGroup.setChildren([paddedGroup]); } currentPaddedGroup = paddedGroup; if (!firstPaddedGroup) { firstPaddedGroup = currentPaddedGroup; } } // likewise this if statement will not run if no padded groups if (firstPaddedGroup && currentPaddedGroup) { result.push(firstPaddedGroup); const hasGroups = unbalancedTree.some((leaf) => (0, agProvidedColumnGroup_2.isProvidedColumnGroup)(leaf)); if (hasGroups) { currentPaddedGroup.setChildren([child]); continue; } else { currentPaddedGroup.setChildren(unbalancedTree); break; } } result.push(child); } } return result; } findDepth(balancedColumnTree) { let depth = 0; let pointer = balancedColumnTree; while (pointer && pointer[0] && (0, agProvidedColumnGroup_2.isProvidedColumnGroup)(pointer[0])) { depth++; pointer = pointer[0].getChildren(); } return depth; } findMaxDepth(treeChildren, depth) { let maxDeptThisLevel = depth; for (let i = 0; i < treeChildren.length; i++) { const abstractColumn = treeChildren[i]; if ((0, agProvidedColumnGroup_2.isProvidedColumnGroup)(abstractColumn)) { const originalGroup = abstractColumn; const newDept = this.findMaxDepth(originalGroup.getChildren(), depth + 1); if (maxDeptThisLevel < newDept) { maxDeptThisLevel = newDept; } } } return maxDeptThisLevel; } /** * Inserts dummy group columns in the hierarchy above auto-generated columns * in order to ensure auto-generated columns are leaf nodes (and therefore are * displayed correctly) */ balanceTreeForAutoCols(autoCols, depth) { const tree = []; autoCols.forEach((col) => { // at the end, this will be the top of the tree item. let nextChild = col; for (let i = depth - 1; i >= 0; i--) { const autoGroup = new agProvidedColumnGroup_1.AgProvidedColumnGroup(null, `FAKE_PATH_${col.getId()}}_${i}`, true, i); this.createBean(autoGroup); autoGroup.setChildren([nextChild]); nextChild.originalParent = autoGroup; nextChild = autoGroup; } if (depth === 0) { col.originalParent = null; } // at this point, the nextChild is the top most item in the tree tree.push(nextChild); }); return tree; } createMergedColGroupDef(colGroupDef, groupId) { const colGroupDefMerged = {}; const { gos, validation } = this.beans; Object.assign(colGroupDefMerged, gos.get('defaultColGroupDef')); Object.assign(colGroupDefMerged, colGroupDef); validation?.validateColDef(colGroupDefMerged, groupId); return colGroupDefMerged; } findExistingGroup(newGroupDef, existingGroups) { const newHasId = newGroupDef.groupId != null; if (!newHasId) { return undefined; } for (let i = 0; i < existingGroups.length; i++) { const existingGroup = existingGroups[i]; const existingDef = existingGroup.getColGroupDef(); if (!existingDef) { continue; } if (existingGroup.getId() === newGroupDef.groupId) { return { idx: i, group: existingGroup }; } } return undefined; } createColumnGroup(providedGroup, groupInstanceIdCreator, oldColumnsMapped, pinned, isStandaloneStructure) { const groupId = providedGroup.getGroupId(); const instanceId = groupInstanceIdCreator.getInstanceIdForKey(groupId); const uniqueId = (0, agColumnGroup_1.createUniqueColumnGroupId)(groupId, instanceId); let columnGroup = oldColumnsMapped[uniqueId]; // if the user is setting new colDefs, it is possible that the id's overlap, and we // would have a false match from above. so we double check we are talking about the // same original column group. if (columnGroup && columnGroup.getProvidedColumnGroup() !== providedGroup) { columnGroup = null; } if ((0, generic_1._exists)(columnGroup)) { // clean out the old column group here, as we will be adding children into it again columnGroup.reset(); } else { columnGroup = new agColumnGroup_2.AgColumnGroup(providedGroup, groupId, instanceId, pinned); if (!isStandaloneStructure) { this.createBean(columnGroup); } } return columnGroup; } // returns back a 2d map of ColumnGroup as follows: groupId -> instanceId -> ColumnGroup mapOldGroupsById(displayedGroups) { const result = {}; const recursive = (columnsOrGroups) => { columnsOrGroups.forEach((columnOrGroup) => { if ((0, agColumnGroup_1.isColumnGroup)(columnOrGroup)) { const columnGroup = columnOrGroup; result[columnOrGroup.getUniqueId()] = columnGroup; recursive(columnGroup.getChildren()); } }); }; if (displayedGroups) { recursive(displayedGroups); } return result; } setupParentsIntoCols(columnsOrGroups, parent) { columnsOrGroups.forEach((columnsOrGroup) => { columnsOrGroup.parent = parent; if ((0, agColumnGroup_1.isColumnGroup)(columnsOrGroup)) { const columnGroup = columnsOrGroup; this.setupParentsIntoCols(columnGroup.getChildren(), columnGroup); } }); } } exports.ColumnGroupService = ColumnGroupService; /***/ }), /***/ 3156: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.isColumnHovered = void 0; function isColumnHovered(beans, column) { return !!beans.colHover?.isHovered(column); } exports.isColumnHovered = isColumnHovered; /***/ }), /***/ 1690: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ColumnHoverModule = void 0; const version_1 = __webpack_require__(7205); const columnHoverApi_1 = __webpack_require__(3156); const columnHoverService_1 = __webpack_require__(7683); /** * @feature Rows -> Styling Rows * @gridOption columnHoverHighlight */ exports.ColumnHoverModule = { moduleName: 'ColumnHover', version: version_1.VERSION, beans: [columnHoverService_1.ColumnHoverService], apiFunctions: { isColumnHovered: columnHoverApi_1.isColumnHovered, }, }; /***/ }), /***/ 7683: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ColumnHoverService = void 0; const beanStub_1 = __webpack_require__(8731); const hoverFeature_1 = __webpack_require__(5788); const CSS_COLUMN_HOVER = 'ag-column-hover'; class ColumnHoverService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'colHover'; } setMouseOver(columns) { this.updateState(columns); } clearMouseOver() { this.updateState(null); } isHovered(column) { const selectedColumns = this.selectedColumns; return !!selectedColumns && selectedColumns.indexOf(column) >= 0; } addHeaderColumnHoverListener(compBean, comp, column) { const listener = () => { if (!this.gos.get('columnHoverHighlight')) { return; } const isHovered = this.isHovered(column); comp.addOrRemoveCssClass('ag-column-hover', isHovered); }; compBean.addManagedEventListeners({ columnHoverChanged: listener }); listener(); } onCellColumnHover(column, cellComp) { if (!cellComp) { return; } if (!this.gos.get('columnHoverHighlight')) { return; } const isHovered = this.isHovered(column); cellComp.addOrRemoveCssClass(CSS_COLUMN_HOVER, isHovered); } addHeaderFilterColumnHoverListener(compBean, comp, column, eGui) { this.createHoverFeature(compBean, [column], eGui); const listener = () => { if (!this.gos.get('columnHoverHighlight')) { return; } const hovered = this.isHovered(column); comp.addOrRemoveCssClass('ag-column-hover', hovered); }; compBean.addManagedEventListeners({ columnHoverChanged: listener }); listener(); } createHoverFeature(compBean, columns, eGui) { compBean.createManagedBean(new hoverFeature_1.HoverFeature(columns, eGui)); } updateState(columns) { this.selectedColumns = columns; this.eventSvc.dispatchEvent({ type: 'columnHoverChanged', }); } } exports.ColumnHoverService = ColumnHoverService; /***/ }), /***/ 5788: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.HoverFeature = void 0; const beanStub_1 = __webpack_require__(8731); class HoverFeature extends beanStub_1.BeanStub { constructor(columns, element) { super(); this.columns = columns; this.element = element; } postConstruct() { if (this.gos.get('columnHoverHighlight')) { const colHover = this.beans.colHover; this.addManagedListeners(this.element, { mouseout: colHover.clearMouseOver.bind(colHover), mouseover: colHover.setMouseOver.bind(colHover, this.columns), }); } } } exports.HoverFeature = HoverFeature; /***/ }), /***/ 2294: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ColumnKeyCreator = void 0; // class returns a unique id to use for the column. it checks the existing columns, and if the requested // id is already taken, it will start appending numbers until it gets a unique id. // eg, if the col field is 'name', it will try ids: {name, name_1, name_2...} // if no field or id provided in the col, it will try the ids of natural numbers const generic_1 = __webpack_require__(4422); class ColumnKeyCreator { constructor() { this.existingKeys = {}; } addExistingKeys(keys) { for (let i = 0; i < keys.length; i++) { this.existingKeys[keys[i]] = true; } } getUniqueKey(colId, colField) { // in case user passed in number for colId, convert to string colId = (0, generic_1._toStringOrNull)(colId); let count = 0; while (true) { let idToTry = colId ?? colField; if (idToTry) { if (count !== 0) { idToTry += '_' + count; } } else { // no point in stringing this, object treats it the same anyway. idToTry = count; } if (!this.existingKeys[idToTry]) { this.existingKeys[idToTry] = true; return String(idToTry); } count++; } } } exports.ColumnKeyCreator = ColumnKeyCreator; /***/ }), /***/ 2986: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ColumnModel = void 0; const columnMoveUtils_1 = __webpack_require__(3505); const beanStub_1 = __webpack_require__(8731); const gridOptionsUtils_1 = __webpack_require__(7274); const array_1 = __webpack_require__(1502); const columnFactoryUtils_1 = __webpack_require__(2716); const columnStateUtils_1 = __webpack_require__(2885); const columnUtils_1 = __webpack_require__(3146); class ColumnModel extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'colModel'; // if pivotMode is on, however pivot results are NOT shown if no pivot columns are set this.pivotMode = false; this.ready = false; this.changeEventsDispatching = false; } postConstruct() { this.pivotMode = this.gos.get('pivotMode'); this.addManagedPropertyListeners(['groupDisplayType', 'treeData', 'treeDataDisplayType', 'groupHideOpenParents'], (event) => this.refreshAll((0, columnUtils_1._convertColumnEventSourceType)(event.source))); this.addManagedPropertyListeners(['defaultColDef', 'defaultColGroupDef', 'columnTypes', 'suppressFieldDotNotation'], this.recreateColumnDefs.bind(this)); this.addManagedPropertyListener('pivotMode', (event) => this.setPivotMode(this.gos.get('pivotMode'), (0, columnUtils_1._convertColumnEventSourceType)(event.source))); } // called from SyncService, when grid has finished initialising createColsFromColDefs(source) { const { beans } = this; const { valueCache, colAutosize, rowGroupColsSvc, pivotColsSvc, valueColsSvc, visibleCols, colViewport, eventSvc, } = beans; // only need to dispatch before/after events if updating columns, never if setting columns for first time const dispatchEventsFunc = this.colDefs ? (0, columnStateUtils_1._compareColumnStatesAndDispatchEvents)(beans, source) : undefined; // always invalidate cache on changing columns, as the column id's for the new columns // could overlap with the old id's, so the cache would return old values for new columns. valueCache?.expire(); const oldCols = this.colDefCols?.list; const oldTree = this.colDefCols?.tree; const newTree = (0, columnFactoryUtils_1._createColumnTree)(beans, this.colDefs, true, oldTree, source); (0, columnUtils_1._destroyColumnTree)(beans, this.colDefCols?.tree, newTree.columnTree); const tree = newTree.columnTree; const treeDepth = newTree.treeDept; const list = (0, columnUtils_1._getColumnsFromTree)(tree); const map = {}; list.forEach((col) => (map[col.getId()] = col)); this.colDefCols = { tree, treeDepth, list, map }; rowGroupColsSvc?.extractCols(source, oldCols); pivotColsSvc?.extractCols(source, oldCols); valueColsSvc?.extractCols(source, oldCols); this.ready = true; this.refreshCols(true); visibleCols.refresh(source); colViewport.checkViewportColumns(); // this event is not used by AG Grid, but left here for backwards compatibility, // in case applications use it eventSvc.dispatchEvent({ type: 'columnEverythingChanged', source, }); // Row Models react to all of these events as well as new columns loaded, // this flag instructs row model to ignore these events to reduce refreshes. if (dispatchEventsFunc) { this.changeEventsDispatching = true; dispatchEventsFunc(); this.changeEventsDispatching = false; } eventSvc.dispatchEvent({ type: 'newColumnsLoaded', source, }); if (source === 'gridInitializing') { colAutosize?.applyAutosizeStrategy(); } } // called from: buildAutoGroupColumns (events 'groupDisplayType', 'treeData', 'treeDataDisplayType', 'groupHideOpenParents') // createColsFromColDefs (recreateColumnDefs, setColumnsDefs), // setPivotMode, applyColumnState, // functionColsService.setPrimaryColList, functionColsService.updatePrimaryColList, // pivotResultCols.setPivotResultCols refreshCols(newColDefs) { if (!this.colDefCols) { return; } const prevColTree = this.cols?.tree; this.saveColOrder(); const { autoColSvc, selectionColSvc, rowNumbersSvc, quickFilter, pivotResultCols, showRowGroupCols, rowAutoHeight, visibleCols, colViewport, eventSvc, } = this.beans; const cols = this.selectCols(pivotResultCols, this.colDefCols); this.createColumnsForService([autoColSvc, selectionColSvc, rowNumbersSvc], cols); const shouldSortNewColDefs = (0, gridOptionsUtils_1._shouldMaintainColumnOrder)(this.gos, this.showingPivotResult); if (!newColDefs || shouldSortNewColDefs) { this.restoreColOrder(cols); } this.positionLockedCols(cols); showRowGroupCols?.refresh(); quickFilter?.refreshCols(); this.setColSpanActive(); rowAutoHeight?.setAutoHeightActive(cols); // make sure any part of the gui that tries to draw, eg the header, // will get empty lists of columns rather than stale columns. // for example, the header will received gridColumnsChanged event, so will try and draw, // but it will draw successfully when it acts on the virtualColumnsChanged event visibleCols.clear(); colViewport.clear(); const dispatchChangedEvent = !(0, array_1._areEqual)(prevColTree, this.cols.tree); if (dispatchChangedEvent) { eventSvc.dispatchEvent({ type: 'gridColumnsChanged', }); } } createColumnsForService(services, cols) { for (const service of services) { if (!service) { continue; } service.createColumns(cols, (updateOrder) => { this.lastOrder = updateOrder(this.lastOrder); this.lastPivotOrder = updateOrder(this.lastPivotOrder); }); service.addColumns(cols); } } selectCols(pivotResultColsSvc, colDefCols) { const pivotResultCols = pivotResultColsSvc?.getPivotResultCols() ?? null; this.showingPivotResult = pivotResultCols != null; const { map, list, tree, treeDepth } = pivotResultCols ?? colDefCols; this.cols = { list: list.slice(), map: { ...map }, tree: tree.slice(), treeDepth, }; if (pivotResultCols) { // If the current columns are the same or a subset of the previous // we keep the previous order, otherwise we go back to the order the pivot // cols are generated in const hasSameColumns = pivotResultCols.list.some((col) => this.cols?.map[col.getColId()] !== undefined); if (!hasSameColumns) { this.lastPivotOrder = null; } } return this.cols; } getColsToShow() { if (!this.cols) { return []; } // pivot mode is on, but we are not pivoting, so we only // show columns we are aggregating on const showAutoGroupAndValuesOnly = this.isPivotMode() && !this.showingPivotResult; const valueColumns = this.beans.valueColsSvc?.columns; const res = this.cols.list.filter((col) => { const isAutoGroupCol = (0, columnUtils_1.isColumnGroupAutoCol)(col); if (showAutoGroupAndValuesOnly) { const isValueCol = valueColumns?.includes(col); return isAutoGroupCol || isValueCol; } else { // keep col if a) it's auto-group or b) it's visible return isAutoGroupCol || col.isVisible(); } }); return res; } // on events 'groupDisplayType', 'treeData', 'treeDataDisplayType', 'groupHideOpenParents' refreshAll(source) { if (!this.ready) { return; } this.refreshCols(false); this.beans.visibleCols.refresh(source); } setColsVisible(keys, visible = false, source) { (0, columnStateUtils_1._applyColumnState)(this.beans, { state: keys.map((key) => ({ colId: typeof key === 'string' ? key : key.getColId(), hide: !visible, })), }, source); } restoreColOrder(cols) { const lastOrder = this.showingPivotResult ? this.lastPivotOrder : this.lastOrder; if (!lastOrder) { return; } const lastOrderMapped = new Map(lastOrder.map((col, index) => [col, index])); // only do the sort if at least one column is accounted for. columns will be not accounted for // if changing from pivot result cols to provided columns const noColsFound = !cols.list.some((col) => lastOrderMapped.has(col)); if (noColsFound) { return; } // order cols in the same order as before. we need to make sure that all // cols still exists, so filter out any that no longer exist. const colsMap = new Map(cols.list.map((col) => [col, true])); const lastOrderFiltered = lastOrder.filter((col) => colsMap.has(col)); const lastOrderFilteredMap = new Map(lastOrderFiltered.map((col) => [col, true])); const missingFromLastOrder = cols.list.filter((col) => !lastOrderFilteredMap.has(col)); // add in the new columns, at the end (if no group), or at the end of the group (if a group) const res = lastOrderFiltered.slice(); missingFromLastOrder.forEach((newCol) => { let parent = newCol.getOriginalParent(); // if no parent, means we are not grouping, so add the column to the end if (!parent) { res.push(newCol); return; } // find the group the column belongs to. if no siblings at the current level (eg col in group on it's // own) then go up one level and look for siblings there. const siblings = []; while (!siblings.length && parent) { const leafCols = parent.getLeafColumns(); leafCols.forEach((leafCol) => { const presentInNewCols = res.indexOf(leafCol) >= 0; const notYetInSiblings = siblings.indexOf(leafCol) < 0; if (presentInNewCols && notYetInSiblings) { siblings.push(leafCol); } }); parent = parent.getOriginalParent(); } // if no siblings exist at any level, this means the col is in a group (or parent groups) on it's own if (!siblings.length) { res.push(newCol); return; } // find index of last column in the group const indexes = siblings.map((col) => res.indexOf(col)); const lastIndex = Math.max(...indexes); res.splice(lastIndex + 1, 0, newCol); }); cols.list = res; } positionLockedCols(cols) { cols.list = (0, columnMoveUtils_1.placeLockedColumns)(cols.list, this.gos); } saveColOrder() { if (this.showingPivotResult) { this.lastPivotOrder = this.cols?.list ?? null; } else { this.lastOrder = this.cols?.list ?? null; } } getColumnDefs() { return this.colDefCols ? this.beans.colDefFactory?.getColumnDefs(this.colDefCols.list, this.showingPivotResult, this.lastOrder, this.cols?.list ?? []) : undefined; } setColSpanActive() { this.colSpanActive = !!this.cols?.list.some((col) => col.getColDef().colSpan != null); } isPivotMode() { return this.pivotMode; } setPivotMode(pivotMode, source) { if (pivotMode === this.pivotMode) { return; } this.pivotMode = pivotMode; if (!this.ready) { return; } // we need to update grid columns to cover the scenario where user has groupDisplayType = 'custom', as // this means we don't use auto group column UNLESS we are in pivot mode (it's mandatory in pivot mode), // so need to updateCols() to check it autoGroupCol needs to be added / removed this.refreshCols(false); const { visibleCols, eventSvc } = this.beans; visibleCols.refresh(source); eventSvc.dispatchEvent({ type: 'columnPivotModeChanged', }); } // + clientSideRowModel isPivotActive() { const pivotColumns = this.beans.pivotColsSvc?.columns; return this.pivotMode && !!pivotColumns?.length; } // called when dataTypes change recreateColumnDefs(e) { if (!this.cols) { return; } // if we aren't going to force, update the auto cols in place this.beans.autoColSvc?.updateColumns(e); const source = (0, columnUtils_1._convertColumnEventSourceType)(e.source); this.createColsFromColDefs(source); } setColumnDefs(columnDefs, source) { this.colDefs = columnDefs; this.createColsFromColDefs(source); } destroy() { (0, columnUtils_1._destroyColumnTree)(this.beans, this.colDefCols?.tree); super.destroy(); } getColTree() { return this.cols?.tree ?? []; } // + columnSelectPanel getColDefColTree() { return this.colDefCols?.tree ?? []; } // + clientSideRowController -> sorting, building quick filter text // + headerRenderer -> sorting (clearing icon) getColDefCols() { return this.colDefCols?.list ?? null; } // + moveColumnController getCols() { return this.cols?.list ?? []; } // returns colDefCols, pivotResultCols and autoCols getAllCols() { const { pivotResultCols, autoColSvc, selectionColSvc } = this.beans; const pivotResultColsList = pivotResultCols?.getPivotResultCols()?.list; return [ this.colDefCols?.list ?? [], autoColSvc?.columns?.list ?? [], selectionColSvc?.columns?.list ?? [], pivotResultColsList ?? [], ].flat(); } getColsForKeys(keys) { if (!keys) { return []; } return keys.map((key) => this.getCol(key)).filter((col) => col != null); } getColDefCol(key) { if (!this.colDefCols?.list) { return null; } return this.getColFromCollection(key, this.colDefCols); } getCol(key) { if (key == null) { return null; } return this.getColFromCollection(key, this.cols); } getColFromCollection(key, cols) { if (cols == null) { return null; } const { map, list } = cols; // most of the time this method gets called the key is a string, so we put this shortcut in // for performance reasons, to see if we can match for ID (it doesn't do auto columns, that's done below) if (typeof key == 'string' && map[key]) { return map[key]; } for (let i = 0; i < list.length; i++) { if ((0, columnUtils_1._columnsMatch)(list[i], key)) { return list[i]; } } return this.beans.autoColSvc?.getColumn(key) ?? this.beans.selectionColSvc?.getColumn(key) ?? null; } } exports.ColumnModel = ColumnModel; /***/ }), /***/ 2027: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ColumnApiModule = exports.ColumnFlexModule = exports.DataTypeModule = void 0; const cellRendererModule_1 = __webpack_require__(7358); const version_1 = __webpack_require__(7205); const columnApi_1 = __webpack_require__(1144); const columnDefFactory_1 = __webpack_require__(4604); const columnFlexService_1 = __webpack_require__(2849); const dataTypeService_1 = __webpack_require__(6350); /** * @internal */ exports.DataTypeModule = { moduleName: 'DataType', version: version_1.VERSION, beans: [dataTypeService_1.DataTypeService], dependsOn: [cellRendererModule_1.CheckboxCellRendererModule], }; /** * @internal */ exports.ColumnFlexModule = { moduleName: 'ColumnFlex', version: version_1.VERSION, beans: [columnFlexService_1.ColumnFlexService], }; /** * @feature Columns */ exports.ColumnApiModule = { moduleName: 'ColumnApi', version: version_1.VERSION, beans: [columnDefFactory_1.ColumnDefFactory], apiFunctions: { getColumnDef: columnApi_1.getColumnDef, getDisplayNameForColumn: columnApi_1.getDisplayNameForColumn, getColumn: columnApi_1.getColumn, getColumns: columnApi_1.getColumns, applyColumnState: columnApi_1.applyColumnState, getColumnState: columnApi_1.getColumnState, resetColumnState: columnApi_1.resetColumnState, isPinning: columnApi_1.isPinning, isPinningLeft: columnApi_1.isPinningLeft, isPinningRight: columnApi_1.isPinningRight, getDisplayedColAfter: columnApi_1.getDisplayedColAfter, getDisplayedColBefore: columnApi_1.getDisplayedColBefore, setColumnsVisible: columnApi_1.setColumnsVisible, setColumnsPinned: columnApi_1.setColumnsPinned, getAllGridColumns: columnApi_1.getAllGridColumns, getDisplayedLeftColumns: columnApi_1.getDisplayedLeftColumns, getDisplayedCenterColumns: columnApi_1.getDisplayedCenterColumns, getDisplayedRightColumns: columnApi_1.getDisplayedRightColumns, getAllDisplayedColumns: columnApi_1.getAllDisplayedColumns, getAllDisplayedVirtualColumns: columnApi_1.getAllDisplayedVirtualColumns, getColumnDefs: columnApi_1.getColumnDefs, }, }; /***/ }), /***/ 8997: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ColumnNameService = exports._camelCaseToHumanText = void 0; const beanStub_1 = __webpack_require__(8731); const gridOptionsUtils_1 = __webpack_require__(7274); /** * Converts a camelCase string into startCase * @param {string} camelCase * @return {string} */ function _camelCaseToHumanText(camelCase) { if (!camelCase || camelCase == null) { return null; } // either split on a lowercase followed by uppercase ie asHereTo -> as Here To const rex = /([a-z])([A-Z])/g; // or starts with uppercase and we take all expect the last which is assumed to be part of next word if followed by lowercase HEREToThere -> HERE To There const rexCaps = /([A-Z]+)([A-Z])([a-z])/g; const words = camelCase.replace(rex, '$1 $2').replace(rexCaps, '$1 $2$3').replace(/\./g, ' ').split(' '); return words .map((word) => word.substring(0, 1).toUpperCase() + (word.length > 1 ? word.substring(1, word.length) : '')) .join(' '); } exports._camelCaseToHumanText = _camelCaseToHumanText; class ColumnNameService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'colNames'; } getDisplayNameForColumn(column, location, includeAggFunc = false) { if (!column) { return null; } const headerName = this.getHeaderName(column.getColDef(), column, null, null, location); const { aggColNameSvc } = this.beans; if (includeAggFunc && aggColNameSvc) { return aggColNameSvc.getHeaderName(column, headerName); } return headerName; } getDisplayNameForProvidedColumnGroup(columnGroup, providedColumnGroup, location) { const colGroupDef = providedColumnGroup?.getColGroupDef(); if (colGroupDef) { return this.getHeaderName(colGroupDef, null, columnGroup, providedColumnGroup, location); } return null; } getDisplayNameForColumnGroup(columnGroup, location) { return this.getDisplayNameForProvidedColumnGroup(columnGroup, columnGroup.getProvidedColumnGroup(), location); } // location is where the column is going to appear, ie who is calling us getHeaderName(colDef, column, columnGroup, providedColumnGroup, location) { const headerValueGetter = colDef.headerValueGetter; if (headerValueGetter) { const params = (0, gridOptionsUtils_1._addGridCommonParams)(this.gos, { colDef: colDef, column: column, columnGroup: columnGroup, providedColumnGroup: providedColumnGroup, location: location, }); if (typeof headerValueGetter === 'function') { // valueGetter is a function, so just call it return headerValueGetter(params); } else if (typeof headerValueGetter === 'string') { // valueGetter is an expression, so execute the expression return this.beans.expressionSvc?.evaluate(headerValueGetter, params) ?? null; } return ''; } else if (colDef.headerName != null) { return colDef.headerName; } else if (colDef.field) { return _camelCaseToHumanText(colDef.field); } return ''; } } exports.ColumnNameService = ColumnNameService; /***/ }), /***/ 2885: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getColumnStateFromColDef = exports._getColumnState = exports._compareColumnStatesAndDispatchEvents = exports._resetColumnState = exports._applyColumnState = void 0; const columnMoveUtils_1 = __webpack_require__(3505); const array_1 = __webpack_require__(1502); const generic_1 = __webpack_require__(4422); const logging_1 = __webpack_require__(7764); const columnEventUtils_1 = __webpack_require__(2934); const columnFactoryUtils_1 = __webpack_require__(2716); const columnUtils_1 = __webpack_require__(3146); function _applyColumnState(beans, params, source) { const { colModel, rowGroupColsSvc, pivotColsSvc, autoColSvc, selectionColSvc, colAnimation, visibleCols, pivotResultCols, environment, valueColsSvc, eventSvc, gos, } = beans; const providedCols = colModel.getColDefCols() || []; if (!providedCols?.length) { return false; } if (params?.state && !params.state.forEach) { // state is not an array (0, logging_1._warn)(32); return false; } const syncColumnWithStateItem = (column, stateItem, rowGroupIndexes, pivotIndexes, autoCol) => { if (!column) { return; } const getValue = (0, columnUtils_1.getValueFactory)(stateItem, params.defaultState); const flex = getValue('flex').value1; (0, columnFactoryUtils_1.updateSomeColumnState)(beans, column, getValue('hide').value1, getValue('sort').value1, getValue('sortIndex').value1, getValue('pinned').value1, flex, source); // if flex is null or undefined, fall back to setting width if (flex == null) { // if no flex, then use width if it's there const width = getValue('width').value1; if (width != null) { // if width provided and valid, use it, otherwise stick with the old width const minColWidth = column.getColDef().minWidth ?? environment.getDefaultColumnMinWidth(); if (minColWidth != null && width >= minColWidth) { column.setActualWidth(width, source); } } } // we do not do aggFunc, rowGroup or pivot for auto cols or secondary cols if (autoCol || !column.isPrimary()) { return; } valueColsSvc?.syncColumnWithState(column, source, getValue); rowGroupColsSvc?.syncColumnWithState(column, source, getValue, rowGroupIndexes); pivotColsSvc?.syncColumnWithState(column, source, getValue, pivotIndexes); }; const applyStates = (states, existingColumns, getById) => { const dispatchEventsFunc = _compareColumnStatesAndDispatchEvents(beans, source); // at the end below, this list will have all columns we got no state for const columnsWithNoState = existingColumns.slice(); const rowGroupIndexes = {}; const pivotIndexes = {}; const autoColStates = []; const selectionColStates = []; // If pivoting is modified, these are the states we try to reapply after // the pivot result cols are re-generated const unmatchedAndAutoStates = []; let unmatchedCount = 0; const previousRowGroupCols = rowGroupColsSvc?.columns.slice() ?? []; const previousPivotCols = pivotColsSvc?.columns.slice() ?? []; states.forEach((state) => { const colId = state.colId; // auto group columns are re-created so deferring syncing with ColumnState const isAutoGroupColumn = colId.startsWith(columnUtils_1.GROUP_AUTO_COLUMN_ID); if (isAutoGroupColumn) { autoColStates.push(state); unmatchedAndAutoStates.push(state); return; } if ((0, columnUtils_1.isColumnSelectionCol)(colId)) { selectionColStates.push(state); unmatchedAndAutoStates.push(state); return; } const column = getById(colId); if (!column) { unmatchedAndAutoStates.push(state); unmatchedCount += 1; } else { syncColumnWithStateItem(column, state, rowGroupIndexes, pivotIndexes, false); (0, array_1._removeFromArray)(columnsWithNoState, column); } }); // anything left over, we got no data for, so add in the column as non-value, non-rowGroup and hidden const applyDefaultsFunc = (col) => syncColumnWithStateItem(col, null, rowGroupIndexes, pivotIndexes, false); columnsWithNoState.forEach(applyDefaultsFunc); rowGroupColsSvc?.sortColumns(comparatorByIndex.bind(rowGroupColsSvc, rowGroupIndexes, previousRowGroupCols)); pivotColsSvc?.sortColumns(comparatorByIndex.bind(pivotColsSvc, pivotIndexes, previousPivotCols)); colModel.refreshCols(false); const syncColStates = (getCol, colStates, columns = []) => { colStates.forEach((stateItem) => { const col = getCol(stateItem.colId); (0, array_1._removeFromArray)(columns, col); syncColumnWithStateItem(col, stateItem, null, null, true); }); columns.forEach(applyDefaultsFunc); }; // sync newly created auto group columns with ColumnState syncColStates((colId) => autoColSvc?.getColumn(colId) ?? null, autoColStates, autoColSvc?.getColumns()?.slice()); // sync selection columns with ColumnState syncColStates((colId) => selectionColSvc?.getColumn(colId) ?? null, selectionColStates, selectionColSvc?.getColumns()?.slice()); orderLiveColsLikeState(params, colModel, gos); visibleCols.refresh(source); eventSvc.dispatchEvent({ type: 'columnEverythingChanged', source, }); dispatchEventsFunc(); // Will trigger pivot result col changes if pivoting modified return { unmatchedAndAutoStates, unmatchedCount }; }; colAnimation?.start(); let { unmatchedAndAutoStates, unmatchedCount } = applyStates(params.state || [], providedCols, (id) => colModel.getColDefCol(id)); // If there are still states left over, see if we can apply them to newly generated // pivot result cols or auto cols. Also if defaults exist, ensure they are applied to pivot resul cols if (unmatchedAndAutoStates.length > 0 || (0, generic_1._exists)(params.defaultState)) { const pivotResultColsList = pivotResultCols?.getPivotResultCols()?.list ?? []; unmatchedCount = applyStates(unmatchedAndAutoStates, pivotResultColsList, (id) => pivotResultCols?.getPivotResultCol(id) ?? null).unmatchedCount; } colAnimation?.finish(); return unmatchedCount === 0; // Successful if no states unaccounted for } exports._applyColumnState = _applyColumnState; function _resetColumnState(beans, source) { const { colModel, autoColSvc } = beans; const primaryCols = colModel.getColDefCols(); if (!primaryCols?.length) { return; } // NOTE = there is one bug here that no customer has noticed - if a column has colDef.lockPosition, // this is ignored below when ordering the cols. to work, we should always put lockPosition cols first. // As a work around, developers should just put lockPosition columns first in their colDef list. // we can't use 'allColumns' as the order might of messed up, so get the primary ordered list const primaryColumnTree = colModel.getColDefColTree(); const primaryColumns = (0, columnUtils_1._getColumnsFromTree)(primaryColumnTree); const columnStates = []; // we start at 1000, so if user has mix of rowGroup and group specified, it will work with both. // eg IF user has ColA.rowGroupIndex=0, ColB.rowGroupIndex=1, ColC.rowGroup=true, // THEN result will be ColA.rowGroupIndex=0, ColB.rowGroupIndex=1, ColC.rowGroup=1000 let letRowGroupIndex = 1000; let letPivotIndex = 1000; let colsToProcess = []; const groupAutoCols = autoColSvc?.getColumns(); if (groupAutoCols) { colsToProcess = colsToProcess.concat(groupAutoCols); } if (primaryColumns) { colsToProcess = colsToProcess.concat(primaryColumns); } colsToProcess.forEach((column) => { const stateItem = getColumnStateFromColDef(column); if ((0, generic_1._missing)(stateItem.rowGroupIndex) && stateItem.rowGroup) { stateItem.rowGroupIndex = letRowGroupIndex++; } if ((0, generic_1._missing)(stateItem.pivotIndex) && stateItem.pivot) { stateItem.pivotIndex = letPivotIndex++; } columnStates.push(stateItem); }); _applyColumnState(beans, { state: columnStates, applyOrder: true }, source); } exports._resetColumnState = _resetColumnState; /** * calculates what events to fire between column state changes. gets used when: * a) apply column state * b) apply new column definitions (so changes from old cols) */ function _compareColumnStatesAndDispatchEvents(beans, source) { const { rowGroupColsSvc, pivotColsSvc, valueColsSvc, colModel, sortSvc, eventSvc } = beans; const startState = { rowGroupColumns: rowGroupColsSvc?.columns.slice() ?? [], pivotColumns: pivotColsSvc?.columns.slice() ?? [], valueColumns: valueColsSvc?.columns.slice() ?? [], }; const columnStateBefore = _getColumnState(beans); const columnStateBeforeMap = {}; columnStateBefore.forEach((col) => { columnStateBeforeMap[col.colId] = col; }); return () => { const colsForState = colModel.getAllCols(); // dispatches generic ColumnEvents where all columns are returned rather than what has changed const dispatchWhenListsDifferent = (eventType, colsBefore, colsAfter, idMapper) => { const beforeList = colsBefore.map(idMapper); const afterList = colsAfter.map(idMapper); const unchanged = (0, array_1._areEqual)(beforeList, afterList); if (unchanged) { return; } const changes = new Set(colsBefore); colsAfter.forEach((id) => { // if the first list had it, delete it, as it's unchanged. if (!changes.delete(id)) { // if the second list has it, and first doesn't, add it. changes.add(id); } }); const changesArr = [...changes]; eventSvc.dispatchEvent({ type: eventType, columns: changesArr, column: changesArr.length === 1 ? changesArr[0] : null, source: source, }); }; // determines which columns have changed according to supplied predicate const getChangedColumns = (changedPredicate) => { const changedColumns = []; colsForState.forEach((column) => { const colStateBefore = columnStateBeforeMap[column.getColId()]; if (colStateBefore && changedPredicate(colStateBefore, column)) { changedColumns.push(column); } }); return changedColumns; }; const columnIdMapper = (c) => c.getColId(); dispatchWhenListsDifferent('columnRowGroupChanged', startState.rowGroupColumns, rowGroupColsSvc?.columns ?? [], columnIdMapper); dispatchWhenListsDifferent('columnPivotChanged', startState.pivotColumns, pivotColsSvc?.columns ?? [], columnIdMapper); const valueChangePredicate = (cs, c) => { const oldActive = cs.aggFunc != null; const activeChanged = oldActive != c.isValueActive(); // we only check aggFunc if the agg is active const aggFuncChanged = oldActive && cs.aggFunc != c.getAggFunc(); return activeChanged || aggFuncChanged; }; const changedValues = getChangedColumns(valueChangePredicate); if (changedValues.length > 0) { (0, columnEventUtils_1.dispatchColumnChangedEvent)(eventSvc, 'columnValueChanged', changedValues, source); } const resizeChangePredicate = (cs, c) => cs.width != c.getActualWidth(); (0, columnEventUtils_1.dispatchColumnResizedEvent)(eventSvc, getChangedColumns(resizeChangePredicate), true, source); const pinnedChangePredicate = (cs, c) => cs.pinned != c.getPinned(); (0, columnEventUtils_1.dispatchColumnPinnedEvent)(eventSvc, getChangedColumns(pinnedChangePredicate), source); const visibilityChangePredicate = (cs, c) => cs.hide == c.isVisible(); (0, columnEventUtils_1.dispatchColumnVisibleEvent)(eventSvc, getChangedColumns(visibilityChangePredicate), source); const sortChangePredicate = (cs, c) => cs.sort != c.getSort() || cs.sortIndex != c.getSortIndex(); const changedColumns = getChangedColumns(sortChangePredicate); if (changedColumns.length > 0) { sortSvc?.dispatchSortChangedEvents(source, changedColumns); } const colStateAfter = _getColumnState(beans); // special handling for moved column events normaliseColumnMovedEventForColumnState(columnStateBefore, colStateAfter, source, colModel, eventSvc); }; } exports._compareColumnStatesAndDispatchEvents = _compareColumnStatesAndDispatchEvents; function _getColumnState(beans) { const { colModel, rowGroupColsSvc, pivotColsSvc } = beans; const primaryCols = colModel.getColDefCols(); if ((0, generic_1._missing)(primaryCols) || !colModel.isAlive()) { return []; } const colsForState = colModel.getAllCols(); const rowGroupColumns = rowGroupColsSvc?.columns; const pivotColumns = pivotColsSvc?.columns; const createStateItemFromColumn = (column) => { const rowGroupIndex = column.isRowGroupActive() && rowGroupColumns ? rowGroupColumns.indexOf(column) : null; const pivotIndex = column.isPivotActive() && pivotColumns ? pivotColumns.indexOf(column) : null; const aggFunc = column.isValueActive() ? column.getAggFunc() : null; const sort = column.getSort() != null ? column.getSort() : null; const sortIndex = column.getSortIndex() != null ? column.getSortIndex() : null; const res = { colId: column.getColId(), width: column.getActualWidth(), hide: !column.isVisible(), pinned: column.getPinned(), sort, sortIndex, aggFunc, rowGroup: column.isRowGroupActive(), rowGroupIndex, pivot: column.isPivotActive(), pivotIndex: pivotIndex, flex: column.getFlex() ?? null, }; return res; }; const res = colsForState.map((col) => createStateItemFromColumn(col)); // for fast looking, store the index of each column const colIdToGridIndexMap = new Map(colModel.getCols().map((col, index) => [col.getColId(), index])); res.sort((itemA, itemB) => { const posA = colIdToGridIndexMap.has(itemA.colId) ? colIdToGridIndexMap.get(itemA.colId) : -1; const posB = colIdToGridIndexMap.has(itemB.colId) ? colIdToGridIndexMap.get(itemB.colId) : -1; return posA - posB; }); return res; } exports._getColumnState = _getColumnState; function getColumnStateFromColDef(column) { const getValueOrNull = (a, b) => (a != null ? a : b != null ? b : null); const colDef = column.getColDef(); const sort = getValueOrNull(colDef.sort, colDef.initialSort); const sortIndex = getValueOrNull(colDef.sortIndex, colDef.initialSortIndex); const hide = getValueOrNull(colDef.hide, colDef.initialHide); const pinned = getValueOrNull(colDef.pinned, colDef.initialPinned); const width = getValueOrNull(colDef.width, colDef.initialWidth); const flex = getValueOrNull(colDef.flex, colDef.initialFlex); let rowGroupIndex = getValueOrNull(colDef.rowGroupIndex, colDef.initialRowGroupIndex); let rowGroup = getValueOrNull(colDef.rowGroup, colDef.initialRowGroup); if (rowGroupIndex == null && (rowGroup == null || rowGroup == false)) { rowGroupIndex = null; rowGroup = null; } let pivotIndex = getValueOrNull(colDef.pivotIndex, colDef.initialPivotIndex); let pivot = getValueOrNull(colDef.pivot, colDef.initialPivot); if (pivotIndex == null && (pivot == null || pivot == false)) { pivotIndex = null; pivot = null; } const aggFunc = getValueOrNull(colDef.aggFunc, colDef.initialAggFunc); return { colId: column.getColId(), sort, sortIndex, hide, pinned, width, flex, rowGroup, rowGroupIndex, pivot, pivotIndex, aggFunc, }; } exports.getColumnStateFromColDef = getColumnStateFromColDef; function orderLiveColsLikeState(params, colModel, gos) { if (!params.applyOrder || !params.state) { return; } const colIds = []; params.state.forEach((item) => { if (item.colId != null) { colIds.push(item.colId); } }); sortColsLikeKeys(colModel.cols, colIds, colModel, gos); } function sortColsLikeKeys(cols, colIds, colModel, gos) { if (cols == null) { return; } let newOrder = []; const processedColIds = {}; colIds.forEach((colId) => { if (processedColIds[colId]) { return; } const col = cols.map[colId]; if (col) { newOrder.push(col); processedColIds[colId] = true; } }); // add in all other columns let autoGroupInsertIndex = 0; cols.list.forEach((col) => { const colId = col.getColId(); const alreadyProcessed = processedColIds[colId] != null; if (alreadyProcessed) { return; } const isAutoGroupCol = colId.startsWith(columnUtils_1.GROUP_AUTO_COLUMN_ID); if (isAutoGroupCol) { // auto group columns, if missing from state list, are added to the start. // it's common to have autoGroup missing, as grouping could be on by default // on a column, but the user could of since removed the grouping via the UI. // if we don't inc the insert index, autoGroups will be inserted in reverse order newOrder.splice(autoGroupInsertIndex++, 0, col); } else { // normal columns, if missing from state list, are added at the end newOrder.push(col); } }); // this is already done in updateCols, however we changed the order above (to match the order of the state // columns) so we need to do it again. we could of put logic into the order above to take into account fixed // columns, however if we did then we would have logic for updating fixed columns twice. reusing the logic here // is less sexy for the code here, but it keeps consistency. newOrder = (0, columnMoveUtils_1.placeLockedColumns)(newOrder, gos); if (!(0, columnMoveUtils_1.doesMovePassMarryChildren)(newOrder, colModel.getColTree())) { (0, logging_1._warn)(39); return; } cols.list = newOrder; } function normaliseColumnMovedEventForColumnState(colStateBefore, colStateAfter, source, colModel, eventSvc) { // we are only interested in columns that were both present and visible before and after const colStateAfterMapped = {}; colStateAfter.forEach((s) => (colStateAfterMapped[s.colId] = s)); // get id's of cols in both before and after lists const colsIntersectIds = {}; colStateBefore.forEach((s) => { if (colStateAfterMapped[s.colId]) { colsIntersectIds[s.colId] = true; } }); // filter state lists, so we only have cols that were present before and after const beforeFiltered = colStateBefore.filter((c) => colsIntersectIds[c.colId]); const afterFiltered = colStateAfter.filter((c) => colsIntersectIds[c.colId]); // see if any cols are in a different location const movedColumns = []; afterFiltered.forEach((csAfter, index) => { const csBefore = beforeFiltered && beforeFiltered[index]; if (csBefore && csBefore.colId !== csAfter.colId) { const gridCol = colModel.getCol(csBefore.colId); if (gridCol) { movedColumns.push(gridCol); } } }); if (!movedColumns.length) { return; } eventSvc.dispatchEvent({ type: 'columnMoved', columns: movedColumns, column: movedColumns.length === 1 ? movedColumns[0] : null, finished: true, source, }); } // sort the lists according to the indexes that were provided const comparatorByIndex = (indexes, oldList, colA, colB) => { const indexA = indexes[colA.getId()]; const indexB = indexes[colB.getId()]; const aHasIndex = indexA != null; const bHasIndex = indexB != null; if (aHasIndex && bHasIndex) { // both a and b are new cols with index, so sort on index return indexA - indexB; } if (aHasIndex) { // a has an index, so it should be before a return -1; } if (bHasIndex) { // b has an index, so it should be before a return 1; } const oldIndexA = oldList.indexOf(colA); const oldIndexB = oldList.indexOf(colB); const aHasOldIndex = oldIndexA >= 0; const bHasOldIndex = oldIndexB >= 0; if (aHasOldIndex && bHasOldIndex) { // both a and b are old cols, so sort based on last order return oldIndexA - oldIndexB; } if (aHasOldIndex) { // a is old, b is new, so b is first return -1; } // this bit does matter, means both are new cols // but without index or that b is old and a is new return 1; }; /***/ }), /***/ 3146: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getValueFactory = exports._columnsMatch = exports._convertColumnEventSourceType = exports._updateColsMap = exports._areColIdsEqual = exports.convertColumnTypes = exports.isRowNumberCol = exports.isColumnSelectionCol = exports.isColumnGroupAutoCol = exports._destroyColumnTree = exports.getWidthOfColsInList = exports._getColumnsFromTree = exports.ROW_NUMBERS_COLUMN_ID = exports.SELECTION_COLUMN_ID = exports.GROUP_AUTO_COLUMN_ID = void 0; const agColumn_1 = __webpack_require__(3355); const agProvidedColumnGroup_1 = __webpack_require__(9409); const array_1 = __webpack_require__(1502); const generic_1 = __webpack_require__(4422); const columnFactoryUtils_1 = __webpack_require__(2716); exports.GROUP_AUTO_COLUMN_ID = 'ag-Grid-AutoColumn'; exports.SELECTION_COLUMN_ID = 'ag-Grid-SelectionColumn'; exports.ROW_NUMBERS_COLUMN_ID = 'ag-Grid-RowNumbersColumn'; // Possible candidate for reuse (alot of recursive traversal duplication) function _getColumnsFromTree(rootColumns) { const result = []; const recursiveFindColumns = (childColumns) => { for (let i = 0; i < childColumns.length; i++) { const child = childColumns[i]; if ((0, agColumn_1.isColumn)(child)) { result.push(child); } else if ((0, agProvidedColumnGroup_1.isProvidedColumnGroup)(child)) { recursiveFindColumns(child.getChildren()); } } }; recursiveFindColumns(rootColumns); return result; } exports._getColumnsFromTree = _getColumnsFromTree; function getWidthOfColsInList(columnList) { return columnList.reduce((width, col) => width + col.getActualWidth(), 0); } exports.getWidthOfColsInList = getWidthOfColsInList; function _destroyColumnTree(beans, oldTree, newTree) { const oldObjectsById = {}; if (!oldTree) { return; } // add in all old columns to be destroyed (0, columnFactoryUtils_1.depthFirstOriginalTreeSearch)(null, oldTree, (child) => { oldObjectsById[child.getInstanceId()] = child; }); // however we don't destroy anything in the new tree. if destroying the grid, there is no new tree if (newTree) { (0, columnFactoryUtils_1.depthFirstOriginalTreeSearch)(null, newTree, (child) => { oldObjectsById[child.getInstanceId()] = null; }); } // what's left can be destroyed const colsToDestroy = Object.values(oldObjectsById).filter((item) => item != null); beans.context.destroyBeans(colsToDestroy); } exports._destroyColumnTree = _destroyColumnTree; function isColumnGroupAutoCol(col) { const colId = col.getId(); return colId.startsWith(exports.GROUP_AUTO_COLUMN_ID); } exports.isColumnGroupAutoCol = isColumnGroupAutoCol; function isColumnSelectionCol(col) { const id = typeof col === 'string' ? col : 'getColId' in col ? col.getColId() : col.colId; return id?.startsWith(exports.SELECTION_COLUMN_ID) ?? false; } exports.isColumnSelectionCol = isColumnSelectionCol; function isRowNumberCol(col) { const id = typeof col === 'string' ? col : 'getColId' in col ? col.getColId() : col.colId; return id?.startsWith(exports.ROW_NUMBERS_COLUMN_ID) ?? false; } exports.isRowNumberCol = isRowNumberCol; function convertColumnTypes(type) { let typeKeys = []; if (type instanceof Array) { typeKeys = type; } else if (typeof type === 'string') { typeKeys = type.split(','); } return typeKeys; } exports.convertColumnTypes = convertColumnTypes; function _areColIdsEqual(colsA, colsB) { return (0, array_1._areEqual)(colsA, colsB, (a, b) => a.getColId() === b.getColId()); } exports._areColIdsEqual = _areColIdsEqual; function _updateColsMap(cols) { cols.map = {}; cols.list.forEach((col) => (cols.map[col.getId()] = col)); } exports._updateColsMap = _updateColsMap; function _convertColumnEventSourceType(source) { // unfortunately they do not match so need to perform conversion return source === 'gridOptionsUpdated' ? 'gridOptionsChanged' : source; } exports._convertColumnEventSourceType = _convertColumnEventSourceType; function _columnsMatch(column, key) { const columnMatches = column === key; const colDefMatches = column.getColDef() === key; const idMatches = column.getColId() == key; return columnMatches || colDefMatches || idMatches; } exports._columnsMatch = _columnsMatch; const getValueFactory = (stateItem, defaultState) => (key1, key2) => { const obj = { value1: undefined, value2: undefined, }; let calculated = false; if (stateItem) { if (stateItem[key1] !== undefined) { obj.value1 = stateItem[key1]; calculated = true; } if ((0, generic_1._exists)(key2) && stateItem[key2] !== undefined) { obj.value2 = stateItem[key2]; calculated = true; } } if (!calculated && defaultState) { if (defaultState[key1] !== undefined) { obj.value1 = defaultState[key1]; } if ((0, generic_1._exists)(key2) && defaultState[key2] !== undefined) { obj.value2 = defaultState[key2]; } } return obj; }; exports.getValueFactory = getValueFactory; /***/ }), /***/ 5034: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ColumnViewportService = void 0; const beanStub_1 = __webpack_require__(8731); const agColumn_1 = __webpack_require__(3355); const generic_1 = __webpack_require__(4422); class ColumnViewportService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'colViewport'; // cols in center that are in the viewport this.colsWithinViewport = []; // same as colsWithinViewport, except we always include columns with headerAutoHeight this.headerColsWithinViewport = []; // A hash key to keep track of changes in viewport columns this.colsWithinViewportHash = ''; // all columns & groups to be rendered, index by row. // used by header rows to get all items to render for that row. this.rowsOfHeadersToRenderLeft = {}; this.rowsOfHeadersToRenderRight = {}; this.rowsOfHeadersToRenderCenter = {}; } wireBeans(beans) { this.visibleCols = beans.visibleCols; this.colModel = beans.colModel; } postConstruct() { this.suppressColumnVirtualisation = this.gos.get('suppressColumnVirtualisation'); } setScrollPosition(scrollWidth, scrollPosition, afterScroll = false) { const { visibleCols } = this; const bodyWidthDirty = visibleCols.isBodyWidthDirty; const noChange = scrollWidth === this.scrollWidth && scrollPosition === this.scrollPosition && !bodyWidthDirty; if (noChange) { return; } this.scrollWidth = scrollWidth; this.scrollPosition = scrollPosition; // we need to call setVirtualViewportLeftAndRight() at least once after the body width changes, // as the viewport can stay the same, but in RTL, if body width changes, we need to work out the // virtual columns again visibleCols.isBodyWidthDirty = true; if (this.gos.get('enableRtl')) { const bodyWidth = visibleCols.bodyWidth; this.viewportLeft = bodyWidth - scrollPosition - scrollWidth; this.viewportRight = bodyWidth - scrollPosition; } else { this.viewportLeft = scrollPosition; this.viewportRight = scrollWidth + scrollPosition; } if (this.colModel.ready) { this.checkViewportColumns(afterScroll); } } getHeadersToRender(type, dept) { let result; switch (type) { case 'left': result = this.rowsOfHeadersToRenderLeft[dept]; break; case 'right': result = this.rowsOfHeadersToRenderRight[dept]; break; default: result = this.rowsOfHeadersToRenderCenter[dept]; break; } return result || []; } extractViewportColumns() { const displayedColumnsCenter = this.visibleCols.centerCols; if (this.isColumnVirtualisationSuppressed()) { // no virtualisation, so don't filter this.colsWithinViewport = displayedColumnsCenter; this.headerColsWithinViewport = displayedColumnsCenter; } else { // filter out what should be visible this.colsWithinViewport = displayedColumnsCenter.filter(this.isColumnInRowViewport.bind(this)); this.headerColsWithinViewport = displayedColumnsCenter.filter(this.isColumnInHeaderViewport.bind(this)); } } isColumnVirtualisationSuppressed() { // When running within jsdom the viewportRight is always 0, so we need to return true to allow // tests to validate all the columns. return this.suppressColumnVirtualisation || this.viewportRight === 0; } clear(suppressHashClear) { this.rowsOfHeadersToRenderLeft = {}; this.rowsOfHeadersToRenderRight = {}; this.rowsOfHeadersToRenderCenter = {}; if (!suppressHashClear) { this.colsWithinViewportHash = ''; } } isColumnInHeaderViewport(col) { // for headers, we never filter out autoHeaderHeight columns, if calculating if (col.isAutoHeaderHeight() || isAnyParentAutoHeaderHeight(col)) { return true; } return this.isColumnInRowViewport(col); } isColumnInRowViewport(col) { // we never filter out autoHeight columns, as we need them in the DOM for calculating Auto Height if (col.isAutoHeight()) { return true; } const columnLeft = col.getLeft() || 0; const columnRight = columnLeft + col.getActualWidth(); // adding 200 for buffer size, so some cols off viewport are rendered. // this helps horizontal scrolling so user rarely sees white space (unless // they scroll horizontally fast). however we are conservative, as the more // buffer the slower the vertical redraw speed const leftBounds = this.viewportLeft - 200; const rightBounds = this.viewportRight + 200; const columnToMuchLeft = columnLeft < leftBounds && columnRight < leftBounds; const columnToMuchRight = columnLeft > rightBounds && columnRight > rightBounds; return !columnToMuchLeft && !columnToMuchRight; } // used by Grid API only getViewportColumns() { const { leftCols, rightCols } = this.visibleCols; const res = this.colsWithinViewport.concat(leftCols).concat(rightCols); return res; } // + rowRenderer // if we are not column spanning, this just returns back the virtual centre columns, // however if we are column spanning, then different rows can have different virtual // columns, so we have to work out the list for each individual row. getColsWithinViewport(rowNode) { if (!this.colModel.colSpanActive) { return this.colsWithinViewport; } const emptySpaceBeforeColumn = (col) => { const left = col.getLeft(); return (0, generic_1._exists)(left) && left > this.viewportLeft; }; // if doing column virtualisation, then we filter based on the viewport. const inViewportCallback = this.isColumnVirtualisationSuppressed() ? undefined : this.isColumnInRowViewport.bind(this); const { visibleCols } = this; const displayedColumnsCenter = visibleCols.centerCols; return visibleCols.getColsForRow(rowNode, displayedColumnsCenter, inViewportCallback, emptySpaceBeforeColumn); } // checks what columns are currently displayed due to column virtualisation. dispatches an event // if the list of columns has changed. // + setColumnWidth(), setViewportPosition(), setColumnDefs(), sizeColumnsToFit() checkViewportColumns(afterScroll = false) { const viewportColumnsChanged = this.extractViewport(); if (viewportColumnsChanged) { this.eventSvc.dispatchEvent({ type: 'virtualColumnsChanged', afterScroll, }); } } calculateHeaderRows() { // go through each group, see if any of it's cols are displayed, and if yes, // then this group is included this.clear(true); // for easy lookup when building the groups. const renderedColIds = {}; const { leftCols, rightCols, treeLeft, treeRight, treeCenter } = this.visibleCols; const allRenderedCols = this.headerColsWithinViewport.concat(leftCols).concat(rightCols); allRenderedCols.forEach((col) => (renderedColIds[col.getId()] = true)); const testGroup = (children, result, dept) => { let returnValue = false; for (let i = 0; i < children.length; i++) { // see if this item is within viewport const child = children[i]; let addThisItem = false; if ((0, agColumn_1.isColumn)(child)) { // for column, test if column is included addThisItem = renderedColIds[child.getId()] === true; } else { // if group, base decision on children const columnGroup = child; const displayedChildren = columnGroup.getDisplayedChildren(); if (displayedChildren) { addThisItem = testGroup(displayedChildren, result, dept + 1); } } if (addThisItem) { returnValue = true; if (!result[dept]) { result[dept] = []; } result[dept].push(child); } } return returnValue; }; testGroup(treeLeft, this.rowsOfHeadersToRenderLeft, 0); testGroup(treeRight, this.rowsOfHeadersToRenderRight, 0); testGroup(treeCenter, this.rowsOfHeadersToRenderCenter, 0); } extractViewport() { const hashColumn = (c) => `${c.getId()}-${c.getPinned() || 'normal'}`; this.extractViewportColumns(); const newHash = this.getViewportColumns().map(hashColumn).join('#'); const changed = this.colsWithinViewportHash !== newHash; if (changed) { this.colsWithinViewportHash = newHash; this.calculateHeaderRows(); } return changed; } } exports.ColumnViewportService = ColumnViewportService; function isAnyParentAutoHeaderHeight(col) { while (col) { if (col.isAutoHeaderHeight()) { return true; } col = col.getParent(); } return false; } /***/ }), /***/ 6350: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.DataTypeService = void 0; const keyCode_1 = __webpack_require__(9853); const beanStub_1 = __webpack_require__(8731); const gridOptionsUtils_1 = __webpack_require__(7274); const date_1 = __webpack_require__(9827); const generic_1 = __webpack_require__(4422); const object_1 = __webpack_require__(6996); const logging_1 = __webpack_require__(7764); const columnFactoryUtils_1 = __webpack_require__(2716); const columnStateUtils_1 = __webpack_require__(2885); const columnUtils_1 = __webpack_require__(3146); class DataTypeService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'dataTypeSvc'; this.dataTypeDefinitions = {}; this.isPendingInference = false; this.isColumnTypeOverrideInDataTypeDefinitions = false; // keep track of any column state updates whilst waiting for data types to be inferred this.columnStateUpdatesPendingInference = {}; this.columnStateUpdateListenerDestroyFuncs = []; } wireBeans(beans) { this.colModel = beans.colModel; } postConstruct() { this.processDataTypeDefinitions(); this.addManagedPropertyListener('dataTypeDefinitions', (event) => { this.processDataTypeDefinitions(); this.colModel.recreateColumnDefs(event); }); } processDataTypeDefinitions() { const defaultDataTypes = this.getDefaultDataTypes(); const newDataTypeDefinitions = {}; this.dataTypeDefinitions = newDataTypeDefinitions; const newFormatValueFuncs = {}; this.formatValueFuncs = newFormatValueFuncs; const generateFormatValueFunc = (dataTypeDefinition) => { return (params) => { const { column, node, value } = params; let valueFormatter = column.getColDef().valueFormatter; if (valueFormatter === dataTypeDefinition.groupSafeValueFormatter) { valueFormatter = dataTypeDefinition.valueFormatter; } return this.beans.valueSvc.formatValue(column, node, value, valueFormatter); }; }; for (const cellDataType of Object.keys(defaultDataTypes)) { const dataTypeDefinition = defaultDataTypes[cellDataType]; const mergedDataTypeDefinition = { ...dataTypeDefinition, groupSafeValueFormatter: createGroupSafeValueFormatter(dataTypeDefinition, this.gos), }; newDataTypeDefinitions[cellDataType] = mergedDataTypeDefinition; newFormatValueFuncs[cellDataType] = generateFormatValueFunc(mergedDataTypeDefinition); } const dataTypeDefinitions = this.gos.get('dataTypeDefinitions') ?? {}; const newDataTypeMatchers = {}; this.dataTypeMatchers = newDataTypeMatchers; for (const cellDataType of Object.keys(dataTypeDefinitions)) { const dataTypeDefinition = dataTypeDefinitions[cellDataType]; const mergedDataTypeDefinition = this.processDataTypeDefinition(dataTypeDefinition, dataTypeDefinitions, [cellDataType], defaultDataTypes); if (mergedDataTypeDefinition) { newDataTypeDefinitions[cellDataType] = mergedDataTypeDefinition; if (dataTypeDefinition.dataTypeMatcher) { newDataTypeMatchers[cellDataType] = dataTypeDefinition.dataTypeMatcher; } newFormatValueFuncs[cellDataType] = generateFormatValueFunc(mergedDataTypeDefinition); } } this.checkObjectValueHandlers(defaultDataTypes); ['dateString', 'text', 'number', 'boolean', 'date'].forEach((cellDataType) => { const overriddenDataTypeMatcher = newDataTypeMatchers[cellDataType]; if (overriddenDataTypeMatcher) { // remove to maintain correct ordering delete newDataTypeMatchers[cellDataType]; } newDataTypeMatchers[cellDataType] = overriddenDataTypeMatcher ?? defaultDataTypes[cellDataType].dataTypeMatcher; }); } processDataTypeDefinition(dataTypeDefinition, dataTypeDefinitions, alreadyProcessedDataTypes, defaultDataTypes) { let mergedDataTypeDefinition; const extendsCellDataType = dataTypeDefinition.extendsDataType; if (dataTypeDefinition.columnTypes) { this.isColumnTypeOverrideInDataTypeDefinitions = true; } if (dataTypeDefinition.extendsDataType === dataTypeDefinition.baseDataType) { let baseDataTypeDefinition = defaultDataTypes[extendsCellDataType]; const overriddenBaseDataTypeDefinition = dataTypeDefinitions[extendsCellDataType]; if (baseDataTypeDefinition && overriddenBaseDataTypeDefinition) { // only if it's valid do we override with a provided one baseDataTypeDefinition = overriddenBaseDataTypeDefinition; } if (!validateDataTypeDefinition(dataTypeDefinition, baseDataTypeDefinition, extendsCellDataType)) { return undefined; } mergedDataTypeDefinition = mergeDataTypeDefinitions(baseDataTypeDefinition, dataTypeDefinition); } else { if (alreadyProcessedDataTypes.includes(extendsCellDataType)) { (0, logging_1._warn)(44); return undefined; } const extendedDataTypeDefinition = dataTypeDefinitions[extendsCellDataType]; if (!validateDataTypeDefinition(dataTypeDefinition, extendedDataTypeDefinition, extendsCellDataType)) { return undefined; } const mergedExtendedDataTypeDefinition = this.processDataTypeDefinition(extendedDataTypeDefinition, dataTypeDefinitions, [...alreadyProcessedDataTypes, extendsCellDataType], defaultDataTypes); if (!mergedExtendedDataTypeDefinition) { return undefined; } mergedDataTypeDefinition = mergeDataTypeDefinitions(mergedExtendedDataTypeDefinition, dataTypeDefinition); } return { ...mergedDataTypeDefinition, groupSafeValueFormatter: createGroupSafeValueFormatter(mergedDataTypeDefinition, this.gos), }; } updateColDefAndGetColumnType(colDef, userColDef, colId) { let { cellDataType } = userColDef; const { field } = userColDef; if (cellDataType === undefined) { cellDataType = colDef.cellDataType; } if (cellDataType == null || cellDataType === true) { cellDataType = this.canInferCellDataType(colDef, userColDef) ? this.inferCellDataType(field, colId) : false; } if (!cellDataType) { colDef.cellDataType = false; return undefined; } const dataTypeDefinition = this.dataTypeDefinitions[cellDataType]; if (!dataTypeDefinition) { (0, logging_1._warn)(47, { cellDataType }); return undefined; } colDef.cellDataType = cellDataType; if (dataTypeDefinition.groupSafeValueFormatter) { colDef.valueFormatter = dataTypeDefinition.groupSafeValueFormatter; } if (dataTypeDefinition.valueParser) { colDef.valueParser = dataTypeDefinition.valueParser; } if (!dataTypeDefinition.suppressDefaultProperties) { this.setColDefPropertiesForBaseDataType(colDef, cellDataType, dataTypeDefinition, colId); } return dataTypeDefinition.columnTypes; } addColumnListeners(column) { if (!this.isPendingInference) { return; } const columnStateUpdates = this.columnStateUpdatesPendingInference[column.getColId()]; if (!columnStateUpdates) { return; } const columnListener = (event) => { columnStateUpdates.add(event.key); }; column.__addEventListener('columnStateUpdated', columnListener); this.columnStateUpdateListenerDestroyFuncs.push(() => column.__removeEventListener('columnStateUpdated', columnListener)); } canInferCellDataType(colDef, userColDef) { const { gos } = this; if (!(0, gridOptionsUtils_1._isClientSideRowModel)(gos)) { return false; } const propsToCheckForInference = { cellRenderer: true, valueGetter: true, valueParser: true, refData: true }; if (doColDefPropsPreventInference(userColDef, propsToCheckForInference)) { return false; } const columnTypes = userColDef.type === null ? colDef.type : userColDef.type; if (columnTypes) { const columnTypeDefs = gos.get('columnTypes') ?? {}; const hasPropsPreventingInference = (0, columnUtils_1.convertColumnTypes)(columnTypes).some((columnType) => { const columnTypeDef = columnTypeDefs[columnType.trim()]; return columnTypeDef && doColDefPropsPreventInference(columnTypeDef, propsToCheckForInference); }); if (hasPropsPreventingInference) { return false; } } return !doColDefPropsPreventInference(colDef, propsToCheckForInference); } inferCellDataType(field, colId) { if (!field) { return undefined; } let value; const initialData = this.getInitialData(); if (initialData) { const fieldContainsDots = field.indexOf('.') >= 0 && !this.gos.get('suppressFieldDotNotation'); value = (0, object_1._getValueUsingField)(initialData, field, fieldContainsDots); } else { this.initWaitForRowData(colId); } if (value == null) { return undefined; } return (Object.keys(this.dataTypeMatchers).find((_cellDataType) => this.dataTypeMatchers[_cellDataType](value)) ?? 'object'); } getInitialData() { const rowData = this.gos.get('rowData'); if (rowData?.length) { return rowData[0]; } else if (this.initialData) { return this.initialData; } else { const rowNodes = this.beans.rowModel.rootNode?.allLeafChildren; if (rowNodes?.length) { return rowNodes[0].data; } } return null; } initWaitForRowData(colId) { this.columnStateUpdatesPendingInference[colId] = new Set(); if (this.isPendingInference) { return; } this.isPendingInference = true; const columnTypeOverridesExist = this.isColumnTypeOverrideInDataTypeDefinitions; const { colAutosize, eventSvc } = this.beans; if (columnTypeOverridesExist && colAutosize) { colAutosize.shouldQueueResizeOperations = true; } const [destroyFunc] = this.addManagedEventListeners({ rowDataUpdateStarted: (event) => { const { firstRowData } = event; if (!firstRowData) { return; } destroyFunc?.(); this.isPendingInference = false; this.processColumnsPendingInference(firstRowData, columnTypeOverridesExist); this.columnStateUpdatesPendingInference = {}; if (columnTypeOverridesExist) { colAutosize?.processResizeOperations(); } eventSvc.dispatchEvent({ type: 'dataTypesInferred', }); }, }); } processColumnsPendingInference(firstRowData, columnTypeOverridesExist) { this.initialData = firstRowData; const state = []; this.destroyColumnStateUpdateListeners(); const newRowGroupColumnStateWithoutIndex = {}; const newPivotColumnStateWithoutIndex = {}; for (const colId of Object.keys(this.columnStateUpdatesPendingInference)) { const columnStateUpdates = this.columnStateUpdatesPendingInference[colId]; const column = this.colModel.getCol(colId); if (!column) { return; } const oldColDef = column.getColDef(); if (!this.resetColDefIntoCol(column, 'cellDataTypeInferred')) { return; } const newColDef = column.getColDef(); if (columnTypeOverridesExist && newColDef.type && newColDef.type !== oldColDef.type) { const updatedColumnState = getUpdatedColumnState(column, columnStateUpdates); if (updatedColumnState.rowGroup && updatedColumnState.rowGroupIndex == null) { newRowGroupColumnStateWithoutIndex[colId] = updatedColumnState; } if (updatedColumnState.pivot && updatedColumnState.pivotIndex == null) { newPivotColumnStateWithoutIndex[colId] = updatedColumnState; } state.push(updatedColumnState); } } if (columnTypeOverridesExist) { state.push(...this.generateColumnStateForRowGroupAndPivotIndexes(newRowGroupColumnStateWithoutIndex, newPivotColumnStateWithoutIndex)); } if (state.length) { (0, columnStateUtils_1._applyColumnState)(this.beans, { state }, 'cellDataTypeInferred'); } this.initialData = null; } generateColumnStateForRowGroupAndPivotIndexes(updatedRowGroupColumnState, updatedPivotColumnState) { // Generally columns should appear in the order they were before. For any new columns, these should appear in the original col def order. // The exception is for columns that were added via `addGroupColumns`. These should appear at the end. // We don't have to worry about full updates, as in this case the arrays are correct, and they won't appear in the updated lists. const existingColumnStateUpdates = {}; const { rowGroupColsSvc, pivotColsSvc } = this.beans; rowGroupColsSvc?.restoreColumnOrder(existingColumnStateUpdates, updatedRowGroupColumnState); pivotColsSvc?.restoreColumnOrder(existingColumnStateUpdates, updatedPivotColumnState); return Object.values(existingColumnStateUpdates); } resetColDefIntoCol(column, source) { const userColDef = column.getUserProvidedColDef(); if (!userColDef) { return false; } const newColDef = (0, columnFactoryUtils_1._addColumnDefaultAndTypes)(this.beans, userColDef, column.getColId()); column.setColDef(newColDef, userColDef, source); return true; } checkObjectValueHandlers(defaultDataTypes) { const resolvedObjectDataTypeDefinition = this.dataTypeDefinitions.object; const defaultObjectDataTypeDefinition = defaultDataTypes.object; this.hasObjectValueParser = resolvedObjectDataTypeDefinition.valueParser !== defaultObjectDataTypeDefinition.valueParser; this.hasObjectValueFormatter = resolvedObjectDataTypeDefinition.valueFormatter !== defaultObjectDataTypeDefinition.valueFormatter; } getDateStringTypeDefinition(column) { const { dateString } = this.dataTypeDefinitions; if (!column) { return dateString; } return (this.getDataTypeDefinition(column) ?? dateString); } getDateParserFunction(column) { return this.getDateStringTypeDefinition(column).dateParser; } getDateFormatterFunction(column) { return this.getDateStringTypeDefinition(column).dateFormatter; } getDataTypeDefinition(column) { const colDef = column.getColDef(); if (!colDef.cellDataType) { return undefined; } return this.dataTypeDefinitions[colDef.cellDataType]; } getBaseDataType(column) { return this.getDataTypeDefinition(column)?.baseDataType; } checkType(column, value) { if (value == null) { return true; } const dataTypeMatcher = this.getDataTypeDefinition(column)?.dataTypeMatcher; if (!dataTypeMatcher) { return true; } return dataTypeMatcher(value); } validateColDef(colDef) { const warning = (property) => (0, logging_1._warn)(48, { property }); if (colDef.cellDataType === 'object') { const { object } = this.dataTypeDefinitions; if (colDef.valueFormatter === object.groupSafeValueFormatter && !this.hasObjectValueFormatter) { warning('Formatter'); } if (colDef.editable && colDef.valueParser === object.valueParser && !this.hasObjectValueParser) { warning('Parser'); } } } getFormatValue(cellDataType) { return this.formatValueFuncs[cellDataType]; } isColPendingInference(colId) { return this.isPendingInference && !!this.columnStateUpdatesPendingInference[colId]; } setColDefPropertiesForBaseDataType(colDef, cellDataType, dataTypeDefinition, colId) { const formatValue = this.formatValueFuncs[cellDataType]; switch (dataTypeDefinition.baseDataType) { case 'number': { colDef.cellEditor = 'agNumberCellEditor'; break; } case 'boolean': { colDef.cellEditor = 'agCheckboxCellEditor'; colDef.cellRenderer = 'agCheckboxCellRenderer'; colDef.suppressKeyboardEvent = (params) => !!params.colDef.editable && params.event.key === keyCode_1.KeyCode.SPACE; break; } case 'date': { colDef.cellEditor = 'agDateCellEditor'; colDef.keyCreator = formatValue; break; } case 'dateString': { colDef.cellEditor = 'agDateStringCellEditor'; colDef.keyCreator = formatValue; break; } case 'object': { colDef.cellEditorParams = { useFormatter: true, }; colDef.comparator = (a, b) => { const column = this.colModel.getColDefCol(colId); const colDef = column?.getColDef(); if (!column || !colDef) { return 0; } const valA = a == null ? '' : formatValue({ column, node: null, value: a }); const valB = b == null ? '' : formatValue({ column, node: null, value: b }); if (valA === valB) return 0; return valA > valB ? 1 : -1; }; colDef.keyCreator = formatValue; break; } } this.beans.filterManager?.setColDefPropertiesForDataType(colDef, dataTypeDefinition, formatValue); } getDefaultDataTypes() { const defaultDateFormatMatcher = (value) => !!value.match('^\\d{4}-\\d{2}-\\d{2}$'); const translate = this.getLocaleTextFunc(); return { number: { baseDataType: 'number', // can be empty space with legacy copy valueParser: (params) => params.newValue?.trim?.() === '' ? null : Number(params.newValue), valueFormatter: (params) => { if (params.value == null) { return ''; } if (typeof params.value !== 'number' || isNaN(params.value)) { return translate('invalidNumber', 'Invalid Number'); } return String(params.value); }, dataTypeMatcher: (value) => typeof value === 'number', }, text: { baseDataType: 'text', valueParser: (params) => params.newValue === '' ? null : (0, generic_1._toStringOrNull)(params.newValue), dataTypeMatcher: (value) => typeof value === 'string', }, boolean: { baseDataType: 'boolean', valueParser: (params) => { if (params.newValue == null) { return params.newValue; } // can be empty space with legacy copy return params.newValue?.trim?.() === '' ? null : String(params.newValue).toLowerCase() === 'true'; }, valueFormatter: (params) => params.value == null ? '' : String(params.value), dataTypeMatcher: (value) => typeof value === 'boolean', }, date: { baseDataType: 'date', valueParser: (params) => (0, date_1._parseDateTimeFromString)(params.newValue == null ? null : String(params.newValue)), valueFormatter: (params) => { if (params.value == null) { return ''; } if (!(params.value instanceof Date) || isNaN(params.value.getTime())) { return translate('invalidDate', 'Invalid Date'); } return (0, date_1._serialiseDate)(params.value, false) ?? ''; }, dataTypeMatcher: (value) => value instanceof Date, }, dateString: { baseDataType: 'dateString', dateParser: (value) => (0, date_1._parseDateTimeFromString)(value) ?? undefined, dateFormatter: (value) => (0, date_1._serialiseDate)(value ?? null, false) ?? undefined, valueParser: (params) => defaultDateFormatMatcher(String(params.newValue)) ? params.newValue : null, valueFormatter: (params) => defaultDateFormatMatcher(String(params.value)) ? params.value : '', dataTypeMatcher: (value) => typeof value === 'string' && defaultDateFormatMatcher(value), }, object: { baseDataType: 'object', valueParser: () => null, valueFormatter: (params) => (0, generic_1._toStringOrNull)(params.value) ?? '', }, }; } destroyColumnStateUpdateListeners() { this.columnStateUpdateListenerDestroyFuncs.forEach((destroyFunc) => destroyFunc()); this.columnStateUpdateListenerDestroyFuncs = []; } destroy() { this.dataTypeDefinitions = {}; this.dataTypeMatchers = {}; this.formatValueFuncs = {}; this.columnStateUpdatesPendingInference = {}; this.destroyColumnStateUpdateListeners(); super.destroy(); } } exports.DataTypeService = DataTypeService; function mergeDataTypeDefinitions(parentDataTypeDefinition, childDataTypeDefinition) { const mergedDataTypeDefinition = { ...parentDataTypeDefinition, ...childDataTypeDefinition, }; if (parentDataTypeDefinition.columnTypes && childDataTypeDefinition.columnTypes && childDataTypeDefinition.appendColumnTypes) { mergedDataTypeDefinition.columnTypes = [ ...(0, columnUtils_1.convertColumnTypes)(parentDataTypeDefinition.columnTypes), ...(0, columnUtils_1.convertColumnTypes)(childDataTypeDefinition.columnTypes), ]; } return mergedDataTypeDefinition; } function validateDataTypeDefinition(dataTypeDefinition, parentDataTypeDefinition, parentCellDataType) { if (!parentDataTypeDefinition) { (0, logging_1._warn)(45, { parentCellDataType }); return false; } if (parentDataTypeDefinition.baseDataType !== dataTypeDefinition.baseDataType) { (0, logging_1._warn)(46); return false; } return true; } function createGroupSafeValueFormatter(dataTypeDefinition, gos) { if (!dataTypeDefinition.valueFormatter) { return undefined; } return (params) => { if (params.node?.group) { const aggFunc = (params.colDef.pivotValueColumn ?? params.column).getAggFunc(); if (aggFunc) { // the resulting type of these will be the same, so we call valueFormatter anyway if (aggFunc === 'first' || aggFunc === 'last') { return dataTypeDefinition.valueFormatter(params); } if (dataTypeDefinition.baseDataType === 'number' && aggFunc !== 'count') { if (typeof params.value === 'number') { return dataTypeDefinition.valueFormatter(params); } if (typeof params.value === 'object') { if (!params.value) { return undefined; } if ('toNumber' in params.value) { return dataTypeDefinition.valueFormatter({ ...params, value: params.value.toNumber(), }); } if ('value' in params.value) { return dataTypeDefinition.valueFormatter({ ...params, value: params.value.value, }); } } } // by default don't use value formatter for agg func as type may have changed return undefined; } // `groupRows` use the key as the value if (gos.get('groupDisplayType') === 'groupRows' && !gos.get('treeData')) { // we don't want to double format the value // as this is already formatted by using the valueFormatter as the keyCreator return undefined; } } else if (gos.get('groupHideOpenParents') && params.column.isRowGroupActive()) { // `groupHideOpenParents` passes leaf values in the group column, so need to format still. // If it's not a string, we know it hasn't been formatted. Otherwise check the data type matcher. if (typeof params.value === 'string' && !dataTypeDefinition.dataTypeMatcher?.(params.value)) { return undefined; } } return dataTypeDefinition.valueFormatter(params); }; } function doesColDefPropPreventInference(colDef, checkProps, prop, comparisonValue) { if (!checkProps[prop]) { return false; } const value = colDef[prop]; if (value === null) { checkProps[prop] = false; return false; } else { return comparisonValue === undefined ? !!value : value === comparisonValue; } } function doColDefPropsPreventInference(colDef, propsToCheckForInference) { return [ ['cellRenderer', 'agSparklineCellRenderer'], ['valueGetter', undefined], ['valueParser', undefined], ['refData', undefined], ].some(([prop, comparisonValue]) => doesColDefPropPreventInference(colDef, propsToCheckForInference, prop, comparisonValue)); } function getUpdatedColumnState(column, columnStateUpdates) { const columnState = (0, columnStateUtils_1.getColumnStateFromColDef)(column); columnStateUpdates.forEach((key) => { // if the column state has been updated, don't update again delete columnState[key]; if (key === 'rowGroup') { delete columnState.rowGroupIndex; } else if (key === 'pivot') { delete columnState.pivotIndex; } }); return columnState; } /***/ }), /***/ 6034: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.GroupInstanceIdCreator = void 0; // class returns unique instance id's for columns. // eg, the following calls (in this order) will result in: // // getInstanceIdForKey('country') => 0 // getInstanceIdForKey('country') => 1 // getInstanceIdForKey('country') => 2 // getInstanceIdForKey('country') => 3 // getInstanceIdForKey('age') => 0 // getInstanceIdForKey('age') => 1 // getInstanceIdForKey('country') => 4 class GroupInstanceIdCreator { constructor() { // this map contains keys to numbers, so we remember what the last call was this.existingIds = {}; } getInstanceIdForKey(key) { const lastResult = this.existingIds[key]; let result; if (typeof lastResult !== 'number') { // first time this key result = 0; } else { result = lastResult + 1; } this.existingIds[key] = result; return result; } } exports.GroupInstanceIdCreator = GroupInstanceIdCreator; /***/ }), /***/ 3245: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.SelectionColService = void 0; const beanStub_1 = __webpack_require__(8731); const agColumn_1 = __webpack_require__(3355); const gridOptionsUtils_1 = __webpack_require__(7274); const columnStateUtils_1 = __webpack_require__(2885); const columnUtils_1 = __webpack_require__(3146); class SelectionColService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'selectionColSvc'; } postConstruct() { this.addManagedPropertyListener('rowSelection', (event) => { this.onSelectionOptionsChanged(event.currentValue, event.previousValue, (0, columnUtils_1._convertColumnEventSourceType)(event.source)); }); this.addManagedPropertyListener('selectionColumnDef', this.updateColumns.bind(this)); } addColumns(cols) { const selectionCols = this.columns; if (selectionCols == null) { return; } cols.list = selectionCols.list.concat(cols.list); cols.tree = selectionCols.tree.concat(cols.tree); (0, columnUtils_1._updateColsMap)(cols); } createColumns(cols, updateOrders) { const destroyCollection = () => { (0, columnUtils_1._destroyColumnTree)(this.beans, this.columns?.tree); this.columns = null; }; const newTreeDepth = cols.treeDepth; const oldTreeDepth = this.columns?.treeDepth ?? -1; const treeDepthSame = oldTreeDepth == newTreeDepth; const list = this.generateSelectionCols(); const areSame = (0, columnUtils_1._areColIdsEqual)(list, this.columns?.list ?? []); if (areSame && treeDepthSame) { return; } destroyCollection(); const { colGroupSvc } = this.beans; const treeDepth = colGroupSvc?.findDepth(cols.tree) ?? 0; const tree = colGroupSvc?.balanceTreeForAutoCols(list, treeDepth) ?? []; this.columns = { list, tree, treeDepth, map: {}, }; const putSelectionColsFirstInList = (cols) => { if (!cols) { return null; } // we use colId, and not instance, to remove old selectionCols const colsFiltered = cols.filter((col) => !(0, columnUtils_1.isColumnSelectionCol)(col)); return [...list, ...colsFiltered]; }; updateOrders(putSelectionColsFirstInList); } updateColumns(event) { const source = (0, columnUtils_1._convertColumnEventSourceType)(event.source); const current = event.currentValue; this.columns?.list.forEach((col) => { const newColDef = this.createSelectionColDef(current); col.setColDef(newColDef, null, source); (0, columnStateUtils_1._applyColumnState)(this.beans, { state: [{ colId: col.getColId(), ...newColDef }] }, source); }); } getColumn(key) { return this.columns?.list.find((col) => (0, columnUtils_1._columnsMatch)(col, key)) ?? null; } getColumns() { return this.columns?.list ?? null; } isSelectionColumnEnabled() { const { gos, beans } = this; const rowSelection = gos.get('rowSelection'); if (typeof rowSelection !== 'object' || !(0, gridOptionsUtils_1._isRowSelection)(gos)) { return false; } const hasAutoCols = (beans.autoColSvc?.getColumns()?.length ?? 0) > 0; if (rowSelection.checkboxLocation === 'autoGroupColumn' && hasAutoCols) { return false; } const checkboxes = !!(0, gridOptionsUtils_1._getCheckboxes)(rowSelection); const headerCheckbox = (0, gridOptionsUtils_1._getHeaderCheckbox)(rowSelection); return checkboxes || headerCheckbox; } createSelectionColDef(def) { const { gos } = this.beans; const selectionColumnDef = def ?? gos.get('selectionColumnDef'); const enableRTL = gos.get('enableRtl'); // We don't support row spanning in the selection column const { rowSpan: _, spanRows: __, ...filteredSelColDef } = (selectionColumnDef ?? {}); return { // overridable properties width: 50, resizable: false, suppressHeaderMenuButton: true, sortable: false, suppressMovable: true, lockPosition: enableRTL ? 'right' : 'left', comparator(valueA, valueB, nodeA, nodeB) { const aSelected = nodeA.isSelected(); const bSelected = nodeB.isSelected(); return aSelected === bSelected ? 0 : aSelected ? 1 : -1; }, editable: false, suppressFillHandle: true, pinned: null, // overrides ...filteredSelColDef, // non-overridable properties colId: columnUtils_1.SELECTION_COLUMN_ID, }; } generateSelectionCols() { if (!this.isSelectionColumnEnabled()) { return []; } const colDef = this.createSelectionColDef(); const colId = colDef.colId; this.beans.validation?.validateColDef(colDef, colId, true); const col = new agColumn_1.AgColumn(colDef, null, colId, false); this.createBean(col); return [col]; } onSelectionOptionsChanged(current, prev, source) { const prevCheckbox = prev && typeof prev !== 'string' ? (0, gridOptionsUtils_1._getCheckboxes)(prev) : undefined; const currCheckbox = current && typeof current !== 'string' ? (0, gridOptionsUtils_1._getCheckboxes)(current) : undefined; const checkboxHasChanged = prevCheckbox !== currCheckbox; const prevHeaderCheckbox = prev && typeof prev !== 'string' ? (0, gridOptionsUtils_1._getHeaderCheckbox)(prev) : undefined; const currHeaderCheckbox = current && typeof current !== 'string' ? (0, gridOptionsUtils_1._getHeaderCheckbox)(current) : undefined; const headerCheckboxHasChanged = prevHeaderCheckbox !== currHeaderCheckbox; const currLocation = (0, gridOptionsUtils_1._getCheckboxLocation)(current); const prevLocation = (0, gridOptionsUtils_1._getCheckboxLocation)(prev); const locationChanged = currLocation !== prevLocation; if (checkboxHasChanged || headerCheckboxHasChanged || locationChanged) { this.beans.colModel.refreshAll(source); } } destroy() { (0, columnUtils_1._destroyColumnTree)(this.beans, this.columns?.tree); super.destroy(); } refreshVisibility(source) { if (!this.isSelectionColumnEnabled()) { return; } const beans = this.beans; const visibleColumns = beans.visibleCols.getAllTrees() ?? []; if (visibleColumns.length === 0) { return; } // check first: one or more columns showing -- none are selection column if (!visibleColumns.some(isLeafColumnSelectionCol)) { const existingState = (0, columnStateUtils_1._getColumnState)(beans).find((state) => (0, columnUtils_1.isColumnSelectionCol)(state.colId)); if (existingState) { (0, columnStateUtils_1._applyColumnState)(beans, { state: [{ colId: existingState.colId, hide: !existingState.hide }], }, source); } } // lastly, check only one column showing -- selection column if (visibleColumns.length === 1) { const firstColumn = visibleColumns[0]; const leafSelectionCol = getLeafColumnSelectionCol(firstColumn); if (!leafSelectionCol) { return; } (0, columnStateUtils_1._applyColumnState)(beans, { state: [{ colId: leafSelectionCol.getColId(), hide: true }] }, source); } } } exports.SelectionColService = SelectionColService; const isLeafColumnSelectionCol = (c) => c.isColumn ? (0, columnUtils_1.isColumnSelectionCol)(c) : c.getChildren()?.some(isLeafColumnSelectionCol) ?? false; function getLeafColumnSelectionCol(c) { if (c.isColumn) { return (0, columnUtils_1.isColumnSelectionCol)(c) ? c : null; } const children = c.getChildren() ?? []; for (const child of children) { const selCol = getLeafColumnSelectionCol(child); if (selCol) { return selCol; } } return null; } /***/ }), /***/ 6869: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.depthFirstAllColumnTreeSearch = exports.VisibleColsService = void 0; const beanStub_1 = __webpack_require__(8731); const agColumn_1 = __webpack_require__(3355); const agColumnGroup_1 = __webpack_require__(6908); const array_1 = __webpack_require__(1502); const columnUtils_1 = __webpack_require__(3146); const groupInstanceIdCreator_1 = __webpack_require__(6034); function _removeAllFromUnorderedArray(array, toRemove) { for (let i = 0; i < toRemove.length; i++) { const index = array.indexOf(toRemove[i]); if (index >= 0) { // preserve the last element, then shorten array length by 1 to delete index array[index] = array[array.length - 1]; array.pop(); } } } // takes in a list of columns, as specified by the column definitions, and returns column groups class VisibleColsService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'visibleCols'; // for fast lookup, to see if a column or group is still visible this.colsAndGroupsMap = {}; // leave level columns of the displayed trees this.leftCols = []; this.rightCols = []; this.centerCols = []; // all three lists above combined this.allCols = []; // used by: // + angularGrid -> for setting body width // + rowController -> setting main row widths (when inserting and resizing) // need to cache this this.bodyWidth = 0; this.leftWidth = 0; this.rightWidth = 0; this.isBodyWidthDirty = true; } refresh(source, skipTreeBuild = false) { const { colModel, colGroupSvc, colViewport } = this.beans; // when we open/close col group, skipTreeBuild=false, as we know liveCols haven't changed if (!skipTreeBuild) { this.buildTrees(colModel, colGroupSvc); } colGroupSvc?.updateOpenClosedVisibility(); const leftCols = pickDisplayedCols(this.treeLeft); this.leftCols = leftCols; this.centerCols = pickDisplayedCols(this.treeCenter); const rightCols = pickDisplayedCols(this.treeRight); this.rightCols = rightCols; this.joinColsAriaOrder(colModel); this.joinCols(); this.setLeftValues(source); this.autoHeightCols = this.allCols.filter((col) => col.isAutoHeight()); this.beans.colFlex?.refreshFlexedColumns(); this.updateBodyWidths(); colViewport.checkViewportColumns(false); this.setFirstRightAndLastLeftPinned(colModel, leftCols, rightCols, source); this.eventSvc.dispatchEvent({ type: 'displayedColumnsChanged', source, }); } // after setColumnWidth or updateGroupsAndPresentedCols updateBodyWidths() { const newBodyWidth = (0, columnUtils_1.getWidthOfColsInList)(this.centerCols); const newLeftWidth = (0, columnUtils_1.getWidthOfColsInList)(this.leftCols); const newRightWidth = (0, columnUtils_1.getWidthOfColsInList)(this.rightCols); // this is used by virtual col calculation, for RTL only, as a change to body width can impact displayed // columns, due to RTL inverting the y coordinates this.isBodyWidthDirty = this.bodyWidth !== newBodyWidth; const atLeastOneChanged = this.bodyWidth !== newBodyWidth || this.leftWidth !== newLeftWidth || this.rightWidth !== newRightWidth; if (atLeastOneChanged) { this.bodyWidth = newBodyWidth; this.leftWidth = newLeftWidth; this.rightWidth = newRightWidth; // this event is fired to allow the grid viewport to resize before the // scrollbar tries to update its visibility. this.eventSvc.dispatchEvent({ type: 'columnContainerWidthChanged', }); // when this fires, it is picked up by the gridPanel, which ends up in // gridPanel calling setWidthAndScrollPosition(), which in turn calls setViewportPosition() this.eventSvc.dispatchEvent({ type: 'displayedColumnsWidthChanged', }); } } // sets the left pixel position of each column setLeftValues(source) { this.setLeftValuesOfCols(source); this.setLeftValuesOfGroups(); } setFirstRightAndLastLeftPinned(colModel, leftCols, rightCols, source) { let lastLeft; let firstRight; if (this.gos.get('enableRtl')) { lastLeft = leftCols ? leftCols[0] : null; firstRight = rightCols ? (0, array_1._last)(rightCols) : null; } else { lastLeft = leftCols ? (0, array_1._last)(leftCols) : null; firstRight = rightCols ? rightCols[0] : null; } colModel.getCols().forEach((col) => { col.setLastLeftPinned(col === lastLeft, source); col.setFirstRightPinned(col === firstRight, source); }); } buildTrees(colModel, columnGroupSvc) { const cols = colModel.getColsToShow(); const leftCols = cols.filter((col) => col.getPinned() == 'left'); const rightCols = cols.filter((col) => col.getPinned() == 'right'); const centerCols = cols.filter((col) => col.getPinned() != 'left' && col.getPinned() != 'right'); const idCreator = new groupInstanceIdCreator_1.GroupInstanceIdCreator(); const createGroups = (params) => { return columnGroupSvc ? columnGroupSvc.createColumnGroups(params) : params.columns; }; this.treeLeft = createGroups({ columns: leftCols, idCreator, pinned: 'left', oldDisplayedGroups: this.treeLeft, }); this.treeRight = createGroups({ columns: rightCols, idCreator, pinned: 'right', oldDisplayedGroups: this.treeRight, }); this.treeCenter = createGroups({ columns: centerCols, idCreator, pinned: null, oldDisplayedGroups: this.treeCenter, }); this.updateColsAndGroupsMap(); } clear() { this.leftCols = []; this.rightCols = []; this.centerCols = []; this.allCols = []; this.ariaOrderColumns = []; } joinColsAriaOrder(colModel) { const allColumns = colModel.getCols(); const pinnedLeft = []; const center = []; const pinnedRight = []; for (const col of allColumns) { const pinned = col.getPinned(); if (!pinned) { center.push(col); } else if (pinned === true || pinned === 'left') { pinnedLeft.push(col); } else { pinnedRight.push(col); } } this.ariaOrderColumns = pinnedLeft.concat(center).concat(pinnedRight); } getAriaColIndex(colOrGroup) { let col; if ((0, agColumnGroup_1.isColumnGroup)(colOrGroup)) { col = colOrGroup.getLeafColumns()[0]; } else { col = colOrGroup; } return this.ariaOrderColumns.indexOf(col) + 1; } setLeftValuesOfGroups() { // a groups left value is the lest left value of it's children [this.treeLeft, this.treeRight, this.treeCenter].forEach((columns) => { columns.forEach((column) => { if ((0, agColumnGroup_1.isColumnGroup)(column)) { const columnGroup = column; columnGroup.checkLeft(); } }); }); } setLeftValuesOfCols(source) { const { colModel } = this.beans; const primaryCols = colModel.getColDefCols(); if (!primaryCols) { return; } // go through each list of displayed columns const allColumns = colModel.getCols().slice(0); // let totalColumnWidth = this.getWidthOfColsInList() const doingRtl = this.gos.get('enableRtl'); [this.leftCols, this.rightCols, this.centerCols].forEach((columns) => { if (doingRtl) { // when doing RTL, we start at the top most pixel (ie RHS) and work backwards let left = (0, columnUtils_1.getWidthOfColsInList)(columns); columns.forEach((column) => { left -= column.getActualWidth(); column.setLeft(left, source); }); } else { // otherwise normal LTR, we start at zero let left = 0; columns.forEach((column) => { column.setLeft(left, source); left += column.getActualWidth(); }); } _removeAllFromUnorderedArray(allColumns, columns); }); // items left in allColumns are columns not displayed, so remove the left position. this is // important for the rows, as if a col is made visible, then taken out, then made visible again, // we don't want the animation of the cell floating in from the old position, whatever that was. allColumns.forEach((column) => { column.setLeft(null, source); }); } joinCols() { if (this.gos.get('enableRtl')) { this.allCols = this.rightCols.concat(this.centerCols).concat(this.leftCols); } else { this.allCols = this.leftCols.concat(this.centerCols).concat(this.rightCols); } } getAllTrees() { if (this.treeLeft && this.treeRight && this.treeCenter) { return this.treeLeft.concat(this.treeCenter).concat(this.treeRight); } return null; } // gridPanel -> ensureColumnVisible isColDisplayed(column) { return this.allCols.indexOf(column) >= 0; } getLeftColsForRow(rowNode) { const { leftCols, beans: { colModel }, } = this; const colSpanActive = colModel.colSpanActive; if (!colSpanActive) { return leftCols; } return this.getColsForRow(rowNode, leftCols); } getRightColsForRow(rowNode) { const { rightCols, beans: { colModel }, } = this; const colSpanActive = colModel.colSpanActive; if (!colSpanActive) { return rightCols; } return this.getColsForRow(rowNode, rightCols); } getColsForRow(rowNode, displayedColumns, filterCallback, emptySpaceBeforeColumn) { const result = []; let lastConsideredCol = null; for (let i = 0; i < displayedColumns.length; i++) { const col = displayedColumns[i]; const maxAllowedColSpan = displayedColumns.length - i; const colSpan = Math.min(col.getColSpan(rowNode), maxAllowedColSpan); const columnsToCheckFilter = [col]; if (colSpan > 1) { const colsToRemove = colSpan - 1; for (let j = 1; j <= colsToRemove; j++) { columnsToCheckFilter.push(displayedColumns[i + j]); } i += colsToRemove; } // see which cols we should take out for column virtualisation let filterPasses; if (filterCallback) { // if user provided a callback, means some columns may not be in the viewport. // the user will NOT provide a callback if we are talking about pinned areas, // as pinned areas have no horizontal scroll and do not virtualise the columns. // if lots of columns, that means column spanning, and we set filterPasses = true // if one or more of the columns spanned pass the filter. filterPasses = false; columnsToCheckFilter.forEach((colForFilter) => { if (filterCallback(colForFilter)) { filterPasses = true; } }); } else { filterPasses = true; } if (filterPasses) { if (result.length === 0 && lastConsideredCol) { const gapBeforeColumn = emptySpaceBeforeColumn ? emptySpaceBeforeColumn(col) : false; if (gapBeforeColumn) { result.push(lastConsideredCol); } } result.push(col); } lastConsideredCol = col; } return result; } getContainerWidth(pinned) { switch (pinned) { case 'left': return this.leftWidth; case 'right': return this.rightWidth; default: return this.bodyWidth; } } getColBefore(col) { const allDisplayedColumns = this.allCols; const oldIndex = allDisplayedColumns.indexOf(col); if (oldIndex > 0) { return allDisplayedColumns[oldIndex - 1]; } return null; } isPinningLeft() { return this.leftCols.length > 0; } isPinningRight() { return this.rightCols.length > 0; } updateColsAndGroupsMap() { this.colsAndGroupsMap = {}; const func = (child) => { this.colsAndGroupsMap[child.getUniqueId()] = child; }; depthFirstAllColumnTreeSearch(this.treeCenter, false, func); depthFirstAllColumnTreeSearch(this.treeLeft, false, func); depthFirstAllColumnTreeSearch(this.treeRight, false, func); } isVisible(item) { const fromMap = this.colsAndGroupsMap[item.getUniqueId()]; // check for reference, in case new column / group with same id is now present return fromMap === item; } getFirstColumn() { const isRtl = this.gos.get('enableRtl'); const queryOrder = ['leftCols', 'centerCols', 'rightCols']; if (isRtl) { queryOrder.reverse(); } for (let i = 0; i < queryOrder.length; i++) { const container = this[queryOrder[i]]; if (container.length) { return isRtl ? (0, array_1._last)(container) : container[0]; } } return null; } // used by: // + rowRenderer -> for navigation getColAfter(col) { const allDisplayedColumns = this.allCols; const oldIndex = allDisplayedColumns.indexOf(col); if (oldIndex < allDisplayedColumns.length - 1) { return allDisplayedColumns[oldIndex + 1]; } return null; } // used by: // + angularGrid -> setting pinned body width // note: this should be cached getColsLeftWidth() { return (0, columnUtils_1.getWidthOfColsInList)(this.leftCols); } // note: this should be cached getDisplayedColumnsRightWidth() { return (0, columnUtils_1.getWidthOfColsInList)(this.rightCols); } isColAtEdge(col, edge) { const allColumns = this.allCols; if (!allColumns.length) { return false; } const isFirst = edge === 'first'; let columnToCompare; if ((0, agColumnGroup_1.isColumnGroup)(col)) { const leafColumns = col.getDisplayedLeafColumns(); if (!leafColumns.length) { return false; } columnToCompare = isFirst ? leafColumns[0] : (0, array_1._last)(leafColumns); } else { columnToCompare = col; } return (isFirst ? allColumns[0] : (0, array_1._last)(allColumns)) === columnToCompare; } } exports.VisibleColsService = VisibleColsService; function depthFirstAllColumnTreeSearch(tree, useDisplayedChildren, callback) { if (!tree) { return; } for (let i = 0; i < tree.length; i++) { const child = tree[i]; if ((0, agColumnGroup_1.isColumnGroup)(child)) { const childTree = useDisplayedChildren ? child.getDisplayedChildren() : child.getChildren(); depthFirstAllColumnTreeSearch(childTree, useDisplayedChildren, callback); } callback(child); } } exports.depthFirstAllColumnTreeSearch = depthFirstAllColumnTreeSearch; function pickDisplayedCols(tree) { const res = []; depthFirstAllColumnTreeSearch(tree, true, (child) => { if ((0, agColumn_1.isColumn)(child)) { res.push(child); } }); return res; } /***/ }), /***/ 3789: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.setupCompBean = exports.EmptyBean = void 0; const beanStub_1 = __webpack_require__(8731); /** * An EmptyBean can be used to manage the lifecycle of event handlers that are tied to a component instead of a controller. * Used in React to avoid duplicating listeners and setup logic while React is running in StrictMode where setComp will be called multiple times. * This is only required for the Components where the ctrl is managed by AG Grid and passed into the React component. * Both React and the Ctrl can decide to destroy the EmptyBean which will clean up listeners setup against it. */ class EmptyBean extends beanStub_1.BeanStub { } exports.EmptyBean = EmptyBean; /** * Sets up the logic for managing the lifecycle of a compBean against a ctrl so that we always cleanup * our listeners and destroy the compBean when the ctrl is destroyed no matter which is destroyed first. * Closely related to React StrictMode as the compBean is provided from React so it can double render * and correctly cleanup listeners from the first render. * @param ctrl Ctrl that has setComp called against it * @param ctx Context to use to destroy the compBean * @param compBean Optional compBean to use, if not provided, the ctrl will be used * @returns The compBean if provided, otherwise the ctrl */ function setupCompBean(ctrl, ctx, compBean) { if (compBean) { // If the ctrl is destroyed first, we need to destroy the compBean ctrl.addDestroyFunc(() => ctx.destroyBean(compBean)); } return compBean ?? ctrl; } exports.setupCompBean = setupCompBean; /***/ }), /***/ 4309: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.AgComponentUtils = void 0; const beanStub_1 = __webpack_require__(8731); const dom_1 = __webpack_require__(3507); class AgComponentUtils extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'agCompUtils'; } adaptFunction(type, jsCompFunc) { if (!type.cellRenderer) { return null; } class Adapter { refresh() { return false; } getGui() { return this.eGui; } init(params) { const callbackResult = jsCompFunc(params); const type = typeof callbackResult; if (type === 'string' || type === 'number' || type === 'boolean') { this.eGui = (0, dom_1._loadTemplate)('' + callbackResult + ''); return; } if (callbackResult == null) { this.eGui = (0, dom_1._loadTemplate)(''); return; } this.eGui = callbackResult; } } return Adapter; } } exports.AgComponentUtils = AgComponentUtils; /***/ }), /***/ 8414: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.CellRendererFunctionModule = void 0; const version_1 = __webpack_require__(7205); const agComponentUtils_1 = __webpack_require__(4309); /** * @internal */ exports.CellRendererFunctionModule = { moduleName: 'CellRendererFunction', version: version_1.VERSION, beans: [agComponentUtils_1.AgComponentUtils], }; /***/ }), /***/ 8759: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.BaseComponentWrapper = void 0; const logging_1 = __webpack_require__(7764); class BaseComponentWrapper { wrap(OriginalConstructor, mandatoryMethods, optionalMethods, componentType) { const wrapper = this.createWrapper(OriginalConstructor, componentType); mandatoryMethods?.forEach((methodName) => { this.createMethod(wrapper, methodName, true); }); optionalMethods?.forEach((methodName) => { this.createMethod(wrapper, methodName, false); }); return wrapper; } createMethod(wrapper, methodName, mandatory) { wrapper.addMethod(methodName, this.createMethodProxy(wrapper, methodName, mandatory)); } createMethodProxy(wrapper, methodName, mandatory) { return function () { if (wrapper.hasMethod(methodName)) { // eslint-disable-next-line return wrapper.callMethod(methodName, arguments); } if (mandatory) { (0, logging_1._warn)(49, { methodName }); } // multiple features rely on this returning `null` rather than `undefined`, // so that they can differentiate whether the underlying component has implemented a void method or not return null; }; } } exports.BaseComponentWrapper = BaseComponentWrapper; /***/ }), /***/ 4110: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.Registry = void 0; const beanStub_1 = __webpack_require__(8731); const logging_1 = __webpack_require__(7764); class Registry extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'registry'; this.agGridDefaults = {}; this.agGridDefaultParams = {}; this.jsComps = {}; this.dynamicBeans = {}; this.selectors = {}; this.icons = {}; } postConstruct() { const comps = this.gos.get('components'); if (comps != null) { for (const key of Object.keys(comps)) { this.jsComps[key] = comps[key]; } } } registerModule(module) { const { icons, userComponents, dynamicBeans, selectors } = module; if (userComponents) { const registerUserComponent = (name, component, params) => { this.agGridDefaults[name] = component; if (params) { this.agGridDefaultParams[name] = params; } }; for (const name of Object.keys(userComponents)) { const comp = userComponents[name]; if (typeof comp === 'object') { registerUserComponent(name, comp.classImp, comp.params); } else { registerUserComponent(name, comp); } } } if (dynamicBeans) { for (const name of Object.keys(dynamicBeans)) { this.dynamicBeans[name] = dynamicBeans[name]; } } selectors?.forEach((selector) => { this.selectors[selector.selector] = selector; }); if (icons) { for (const name of Object.keys(icons)) { this.icons[name] = icons[name]; } } } getUserComponent(propertyName, name) { const createResult = (component, componentFromFramework, params) => ({ componentFromFramework, component, params, }); const { frameworkOverrides } = this.beans; // FrameworkOverrides.frameworkComponent() is used in two locations: // 1) for Vue, user provided components get registered via a framework specific way. // 2) for React, it's how the React UI provides alternative default components (eg GroupCellRenderer and DetailCellRenderer) const registeredViaFrameworkComp = frameworkOverrides.frameworkComponent(name, this.gos.get('components')); if (registeredViaFrameworkComp != null) { return createResult(registeredViaFrameworkComp, true); } const jsComponent = this.jsComps[name]; if (jsComponent) { const isFwkComp = frameworkOverrides.isFrameworkComponent(jsComponent); return createResult(jsComponent, isFwkComp); } const defaultComponent = this.agGridDefaults[name]; if (defaultComponent) { return createResult(defaultComponent, false, this.agGridDefaultParams[name]); } this.beans.validation?.missingUserComponent(propertyName, name, this.agGridDefaults, this.jsComps); return null; } createDynamicBean(name, mandatory, ...args) { const BeanClass = this.dynamicBeans[name]; if (BeanClass == null) { if (mandatory) { throw new Error((0, logging_1._errMsg)(256)); } return undefined; } return new BeanClass(...args); } getSelector(name) { return this.selectors[name]; } getIcon(name) { return this.icons[name]; } } exports.Registry = Registry; /***/ }), /***/ 4126: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports._unwrapUserComp = void 0; function _unwrapUserComp(comp) { const compAsAny = comp; const isProxy = compAsAny != null && compAsAny.getFrameworkComponentInstance != null; return isProxy ? compAsAny.getFrameworkComponentInstance() : comp; } exports._unwrapUserComp = _unwrapUserComp; /***/ }), /***/ 2036: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports._mergeFilterParamsWithApplicationProvidedParams = exports._getFilterCompKeys = exports._getFloatingFilterCompDetails = exports._getTooltipCompDetails = exports._getNoRowsOverlayCompDetails = exports._getLoadingOverlayCompDetails = exports._getDateCompDetails = exports._getFilterDetails = exports._getCellEditorDetails = exports._getLoadingCellRendererDetails = exports._getEditorRendererDetails = exports._getCellRendererDetails = exports._getFullWidthDetailCellRendererDetails = exports._getFullWidthGroupCellRendererDetails = exports._getFullWidthLoadingCellRendererDetails = exports._getFullWidthCellRendererDetails = exports._getInnerHeaderGroupCompDetails = exports._getHeaderGroupCompDetails = exports._getInnerHeaderCompDetails = exports._getHeaderCompDetails = exports._getInnerCellRendererDetails = exports._getDragAndDropImageCompDetails = void 0; const userComponentFactory_1 = __webpack_require__(1585); const DateComponent = { name: 'dateComponent', mandatoryMethods: ['getDate', 'setDate'], optionalMethods: ['afterGuiAttached', 'setInputPlaceholder', 'setInputAriaLabel', 'setDisabled', 'refresh'], }; const DragAndDropImageComponent = { name: 'dragAndDropImageComponent', mandatoryMethods: ['setIcon', 'setLabel'], }; const HeaderComponent = { name: 'headerComponent', optionalMethods: ['refresh'] }; const InnerHeaderComponent = { name: 'innerHeaderComponent' }; const InnerHeaderGroupComponent = { name: 'innerHeaderGroupComponent' }; const HeaderGroupComponent = { name: 'headerGroupComponent' }; const InnerCellRendererComponent = { name: 'innerRenderer', cellRenderer: true, optionalMethods: ['afterGuiAttached'], }; const CellRendererComponent = { name: 'cellRenderer', optionalMethods: ['refresh', 'afterGuiAttached'], cellRenderer: true, }; const EditorRendererComponent = { name: 'cellRenderer', optionalMethods: ['refresh', 'afterGuiAttached'], }; const LoadingCellRendererComponent = { name: 'loadingCellRenderer', cellRenderer: true }; const CellEditorComponent = { name: 'cellEditor', mandatoryMethods: ['getValue'], optionalMethods: [ 'isPopup', 'isCancelBeforeStart', 'isCancelAfterEnd', 'getPopupPosition', 'focusIn', 'focusOut', 'afterGuiAttached', 'refresh', ], }; const LoadingOverlayComponent = { name: 'loadingOverlayComponent', optionalMethods: ['refresh'] }; const NoRowsOverlayComponent = { name: 'noRowsOverlayComponent', optionalMethods: ['refresh'] }; const TooltipComponent = { name: 'tooltipComponent' }; const FilterComponent = { name: 'filter', mandatoryMethods: ['isFilterActive', 'doesFilterPass', 'getModel', 'setModel'], optionalMethods: [ 'afterGuiAttached', 'afterGuiDetached', 'onNewRowsLoaded', 'getModelAsString', 'onFloatingFilterChanged', 'onAnyFilterChanged', 'refresh', ], }; const FloatingFilterComponent = { name: 'floatingFilterComponent', mandatoryMethods: ['onParentModelChanged'], optionalMethods: ['afterGuiAttached', 'refresh'], }; const FullWidth = { name: 'fullWidthCellRenderer', optionalMethods: ['refresh', 'afterGuiAttached'], cellRenderer: true, }; const FullWidthLoading = { name: 'loadingCellRenderer', cellRenderer: true }; const FullWidthGroup = { name: 'groupRowRenderer', optionalMethods: ['afterGuiAttached'], cellRenderer: true, }; const FullWidthDetail = { name: 'detailCellRenderer', optionalMethods: ['refresh'], cellRenderer: true }; function _getDragAndDropImageCompDetails(userCompFactory, params) { return userCompFactory.getCompDetailsFromGridOptions(DragAndDropImageComponent, 'agDragAndDropImage', params, true); } exports._getDragAndDropImageCompDetails = _getDragAndDropImageCompDetails; function _getInnerCellRendererDetails(userCompFactory, def, params) { return userCompFactory.getCompDetails(def, InnerCellRendererComponent, undefined, params); } exports._getInnerCellRendererDetails = _getInnerCellRendererDetails; function _getHeaderCompDetails(userCompFactory, colDef, params) { return userCompFactory.getCompDetails(colDef, HeaderComponent, 'agColumnHeader', params); } exports._getHeaderCompDetails = _getHeaderCompDetails; function _getInnerHeaderCompDetails(userCompFactory, headerCompParams, params) { return userCompFactory.getCompDetails(headerCompParams, InnerHeaderComponent, undefined, params); } exports._getInnerHeaderCompDetails = _getInnerHeaderCompDetails; function _getHeaderGroupCompDetails(userCompFactory, params) { const colGroupDef = params.columnGroup.getColGroupDef(); return userCompFactory.getCompDetails(colGroupDef, HeaderGroupComponent, 'agColumnGroupHeader', params); } exports._getHeaderGroupCompDetails = _getHeaderGroupCompDetails; function _getInnerHeaderGroupCompDetails(userCompFactory, headerGroupCompParams, params) { return userCompFactory.getCompDetails(headerGroupCompParams, InnerHeaderGroupComponent, undefined, params); } exports._getInnerHeaderGroupCompDetails = _getInnerHeaderGroupCompDetails; // this one is unusual, as it can be LoadingCellRenderer, DetailCellRenderer, FullWidthCellRenderer or GroupRowRenderer. // so we have to pass the type in. function _getFullWidthCellRendererDetails(userCompFactory, params) { return userCompFactory.getCompDetailsFromGridOptions(FullWidth, undefined, params, true); } exports._getFullWidthCellRendererDetails = _getFullWidthCellRendererDetails; function _getFullWidthLoadingCellRendererDetails(userCompFactory, params) { return userCompFactory.getCompDetailsFromGridOptions(FullWidthLoading, 'agLoadingCellRenderer', params, true); } exports._getFullWidthLoadingCellRendererDetails = _getFullWidthLoadingCellRendererDetails; function _getFullWidthGroupCellRendererDetails(userCompFactory, params) { return userCompFactory.getCompDetailsFromGridOptions(FullWidthGroup, 'agGroupRowRenderer', params, true); } exports._getFullWidthGroupCellRendererDetails = _getFullWidthGroupCellRendererDetails; function _getFullWidthDetailCellRendererDetails(userCompFactory, params) { return userCompFactory.getCompDetailsFromGridOptions(FullWidthDetail, 'agDetailCellRenderer', params, true); } exports._getFullWidthDetailCellRendererDetails = _getFullWidthDetailCellRendererDetails; // CELL RENDERER function _getCellRendererDetails(userCompFactory, def, params) { return userCompFactory.getCompDetails(def, CellRendererComponent, undefined, params); } exports._getCellRendererDetails = _getCellRendererDetails; function _getEditorRendererDetails(userCompFactory, def, params) { return userCompFactory.getCompDetails(def, EditorRendererComponent, undefined, params); } exports._getEditorRendererDetails = _getEditorRendererDetails; function _getLoadingCellRendererDetails(userCompFactory, def, params) { return userCompFactory.getCompDetails(def, LoadingCellRendererComponent, 'agSkeletonCellRenderer', params, true); } exports._getLoadingCellRendererDetails = _getLoadingCellRendererDetails; // CELL EDITOR function _getCellEditorDetails(userCompFactory, def, params) { return userCompFactory.getCompDetails(def, CellEditorComponent, 'agCellEditor', params, true); } exports._getCellEditorDetails = _getCellEditorDetails; // FILTER /** * @param defaultFilter provided filters only */ function _getFilterDetails(userCompFactory, def, params, defaultFilter) { return userCompFactory.getCompDetails(def, FilterComponent, defaultFilter, params, true); } exports._getFilterDetails = _getFilterDetails; function _getDateCompDetails(userCompFactory, params) { return userCompFactory.getCompDetailsFromGridOptions(DateComponent, 'agDateInput', params, true); } exports._getDateCompDetails = _getDateCompDetails; function _getLoadingOverlayCompDetails(userCompFactory, params) { return userCompFactory.getCompDetailsFromGridOptions(LoadingOverlayComponent, 'agLoadingOverlay', params, true); } exports._getLoadingOverlayCompDetails = _getLoadingOverlayCompDetails; function _getNoRowsOverlayCompDetails(userCompFactory, params) { return userCompFactory.getCompDetailsFromGridOptions(NoRowsOverlayComponent, 'agNoRowsOverlay', params, true); } exports._getNoRowsOverlayCompDetails = _getNoRowsOverlayCompDetails; function _getTooltipCompDetails(userCompFactory, params) { return userCompFactory.getCompDetails(params.colDef, TooltipComponent, 'agTooltipComponent', params, true); } exports._getTooltipCompDetails = _getTooltipCompDetails; /** * @param defaultFloatingFilter provided floating filters only */ function _getFloatingFilterCompDetails(userCompFactory, def, params, defaultFloatingFilter) { return userCompFactory.getCompDetails(def, FloatingFilterComponent, defaultFloatingFilter, params); } exports._getFloatingFilterCompDetails = _getFloatingFilterCompDetails; function _getFilterCompKeys(frameworkOverrides, def) { return (0, userComponentFactory_1._getUserCompKeys)(frameworkOverrides, def, FilterComponent); } exports._getFilterCompKeys = _getFilterCompKeys; function _mergeFilterParamsWithApplicationProvidedParams(userCompFactory, defObject, paramsFromGrid) { return userCompFactory.mergeParams(defObject, FilterComponent, paramsFromGrid); } exports._mergeFilterParamsWithApplicationProvidedParams = _mergeFilterParamsWithApplicationProvidedParams; /***/ }), /***/ 1585: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.UserComponentFactory = exports._getUserCompKeys = void 0; const beanStub_1 = __webpack_require__(8731); const object_1 = __webpack_require__(6996); const promise_1 = __webpack_require__(7990); const logging_1 = __webpack_require__(7764); function doesImplementIComponent(candidate) { if (!candidate) { return false; } return candidate.prototype && 'getGui' in candidate.prototype; } function _getUserCompKeys(frameworkOverrides, defObject, type, params) { const { name } = type; let compName; let jsComp; let fwComp; let paramsFromSelector; let popupFromSelector; let popupPositionFromSelector; // there are two types of js comps, class based and func based. we can only check for // class based, by checking if getGui() exists. no way to differentiate js func based vs eg react func based // const isJsClassComp = (comp: any) => doesImplementIComponent(comp); // const fwActive = this.frameworkCompWrapper != null; // pull from defObject if available if (defObject) { const defObjectAny = defObject; // if selector, use this const selectorFunc = defObjectAny[name + 'Selector']; const selectorRes = selectorFunc ? selectorFunc(params) : null; const assignComp = (providedJsComp) => { if (typeof providedJsComp === 'string') { compName = providedJsComp; } else if (providedJsComp != null && providedJsComp !== true) { const isFwkComp = frameworkOverrides.isFrameworkComponent(providedJsComp); if (isFwkComp) { fwComp = providedJsComp; } else { jsComp = providedJsComp; } } }; if (selectorRes) { assignComp(selectorRes.component); paramsFromSelector = selectorRes.params; popupFromSelector = selectorRes.popup; popupPositionFromSelector = selectorRes.popupPosition; } else { // if no selector, or result of selector is empty, take from defObject assignComp(defObjectAny[name]); } } return { compName, jsComp, fwComp, paramsFromSelector, popupFromSelector, popupPositionFromSelector }; } exports._getUserCompKeys = _getUserCompKeys; class UserComponentFactory extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'userCompFactory'; } wireBeans(beans) { this.agCompUtils = beans.agCompUtils; this.registry = beans.registry; this.frameworkCompWrapper = beans.frameworkCompWrapper; this.gridOptions = beans.gridOptions; } getCompDetailsFromGridOptions(type, defaultName, params, mandatory = false) { return this.getCompDetails(this.gridOptions, type, defaultName, params, mandatory); } getCompDetails(defObject, type, defaultName, params, mandatory = false) { const { name, cellRenderer } = type; let { compName, jsComp, fwComp, paramsFromSelector, popupFromSelector, popupPositionFromSelector } = _getUserCompKeys(this.beans.frameworkOverrides, defObject, type, params); // for grid-provided comps only let defaultCompParams; const lookupFromRegistry = (key) => { const item = this.registry.getUserComponent(name, key); if (item) { jsComp = !item.componentFromFramework ? item.component : undefined; fwComp = item.componentFromFramework ? item.component : undefined; defaultCompParams = item.params; } }; // if compOption is a string, means we need to look the item up if (compName != null) { lookupFromRegistry(compName); } // if lookup brought nothing back, and we have a default, lookup the default if (jsComp == null && fwComp == null && defaultName != null) { lookupFromRegistry(defaultName); } // if we have a comp option, and it's a function, replace it with an object equivalent adaptor if (jsComp && cellRenderer && !doesImplementIComponent(jsComp)) { jsComp = this.agCompUtils?.adaptFunction(type, jsComp); } if (!jsComp && !fwComp) { const { validation } = this.beans; if (mandatory && (compName !== defaultName || !defaultName)) { // expecting the user to provide a component with this name if (compName) { // If we have validation and this is a grid comp without a default (e.g. filters tool panel), // we will have already warned about this if (!validation?.isProvidedUserComp(compName)) { (0, logging_1._error)(50, { compName }); } } else { if (defaultName) { // validation will have already warned about this if (!validation) { (0, logging_1._error)(260, { ...this.gos.getModuleErrorParams(), propName: name, compName: defaultName, }); } } else { (0, logging_1._error)(216, { name }); } } } else if (defaultName && !validation) { // Grid should be providing this component. // Validation service will have already warned about this with the correct module name if it was present. (0, logging_1._error)(146, { comp: defaultName }); } return; } const paramsMerged = this.mergeParams(defObject, type, params, paramsFromSelector, defaultCompParams); const componentFromFramework = jsComp == null; const componentClass = jsComp ?? fwComp; return { componentFromFramework, componentClass, params: paramsMerged, type: type, popupFromSelector, popupPositionFromSelector, newAgStackInstance: () => this.newAgStackInstance(componentClass, componentFromFramework, paramsMerged, type), }; } newAgStackInstance(ComponentClass, componentFromFramework, params, type) { const jsComponent = !componentFromFramework; // using javascript component let instance; if (jsComponent) { instance = new ComponentClass(); } else { // Using framework component instance = this.frameworkCompWrapper.wrap(ComponentClass, type.mandatoryMethods, type.optionalMethods, type); } this.createBean(instance); const deferredInit = instance.init?.(params); if (deferredInit == null) { return promise_1.AgPromise.resolve(instance); } return deferredInit.then(() => instance); } /** * merges params with application provided params * used by Floating Filter */ mergeParams(defObject, type, paramsFromGrid, paramsFromSelector = null, defaultCompParams) { const params = { ...paramsFromGrid, ...defaultCompParams }; // pull user params from the defObject const defObjectAny = defObject; const userParams = defObjectAny && defObjectAny[type.name + 'Params']; if (typeof userParams === 'function') { const userParamsFromFunc = userParams(paramsFromGrid); (0, object_1._mergeDeep)(params, userParamsFromFunc); } else if (typeof userParams === 'object') { (0, object_1._mergeDeep)(params, userParams); } (0, object_1._mergeDeep)(params, paramsFromSelector); return params; } } exports.UserComponentFactory = UserComponentFactory; /***/ }), /***/ 9853: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.KeyCode = void 0; exports.KeyCode = { BACKSPACE: 'Backspace', TAB: 'Tab', ENTER: 'Enter', ESCAPE: 'Escape', SPACE: ' ', LEFT: 'ArrowLeft', UP: 'ArrowUp', RIGHT: 'ArrowRight', DOWN: 'ArrowDown', DELETE: 'Delete', F2: 'F2', PAGE_UP: 'PageUp', PAGE_DOWN: 'PageDown', PAGE_HOME: 'Home', PAGE_END: 'End', // these should be used with `event.code` instead of `event.key` // as `event.key` changes when non-latin keyboards are used A: 'KeyA', C: 'KeyC', D: 'KeyD', V: 'KeyV', X: 'KeyX', Y: 'KeyY', Z: 'KeyZ', }; /***/ }), /***/ 8731: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.BeanStub = void 0; const localEventService_1 = __webpack_require__(5889); const localeUtils_1 = __webpack_require__(7230); const event_1 = __webpack_require__(2979); class BeanStub { constructor() { this.destroyFunctions = []; this.destroyed = false; // for vue 3 - prevents Vue from trying to make this (and obviously any sub classes) from being reactive // prevents vue from creating proxies for created objects and prevents identity related issues this.__v_skip = true; this.propertyListenerId = 0; // Enable multiple grid properties to be updated together by the user but only trigger shared logic once. // Closely related to logic in GridOptionsUtils.ts _processOnChange this.lastChangeSetIdLookup = {}; this.isAlive = () => !this.destroyed; } preWireBeans(beans) { this.beans = beans; this.stubContext = beans.context; this.eventSvc = beans.eventSvc; this.gos = beans.gos; } // this was a test constructor niall built, when active, it prints after 5 seconds all beans/components that are // not destroyed. to use, create a new grid, then api.destroy() before 5 seconds. then anything that gets printed // points to a bean or component that was not properly disposed of. // constructor() { // setTimeout(()=> { // if (this.isAlive()) { // let prototype: any = Object.getPrototypeOf(this); // const constructor: any = prototype.constructor; // const constructorString = constructor.toString(); // const beanName = constructorString.substring(9, constructorString.indexOf("(")); // console.log('is alive ' + beanName); // } // }, 5000); // } destroy() { const { destroyFunctions } = this; for (let i = 0; i < destroyFunctions.length; i++) { destroyFunctions[i](); } destroyFunctions.length = 0; this.destroyed = true; // cast destroy type as we do not want to expose destroy event type to the dispatchLocalEvent method // as no one else should be firing destroyed at the bean stub. this.dispatchLocalEvent({ type: 'destroyed' }); } // The typing of AgEventListener is not ideal, but it's the best we can do at the moment to enable // eventSvc to have the best typing at the expense of BeanStub local events /** Add a local event listener against this BeanStub */ addEventListener(eventType, listener, async) { if (!this.localEventService) { this.localEventService = new localEventService_1.LocalEventService(); } this.localEventService.addEventListener(eventType, listener, async); } /** Remove a local event listener from this BeanStub */ removeEventListener(eventType, listener, async) { this.localEventService?.removeEventListener(eventType, listener, async); } dispatchLocalEvent(event) { this.localEventService?.dispatchEvent(event); } addManagedElementListeners(object, handlers) { return this._setupListeners(object, handlers); } addManagedEventListeners(handlers) { return this._setupListeners(this.eventSvc, handlers); } addManagedListeners(object, handlers) { return this._setupListeners(object, handlers); } _setupListeners(object, handlers) { const destroyFuncs = []; for (const k of Object.keys(handlers)) { const handler = handlers[k]; if (handler) { destroyFuncs.push(this._setupListener(object, k, handler)); } } return destroyFuncs; } _setupListener(object, event, listener) { if (this.destroyed) { return () => null; } let destroyFunc; if (isAgEventEmitter(object)) { object.__addEventListener(event, listener); destroyFunc = () => { object.__removeEventListener(event, listener); return null; }; } else { if (object instanceof HTMLElement) { (0, event_1._addSafePassiveEventListener)(this.beans.frameworkOverrides, object, event, listener); } else { object.addEventListener(event, listener); } destroyFunc = () => { object.removeEventListener(event, listener); return null; }; } this.destroyFunctions.push(destroyFunc); return () => { destroyFunc(); // Only remove if manually called before bean is destroyed this.destroyFunctions = this.destroyFunctions.filter((fn) => fn !== destroyFunc); return null; }; } /** * Setup a managed property listener for the given GridOption property. * However, stores the destroy function in the beanStub so that if this bean * is a component the destroy function will be called when the component is destroyed * as opposed to being cleaned up only when the GridOptionsService is destroyed. */ setupGridOptionListener(event, listener) { const { gos } = this; gos.addPropertyEventListener(event, listener); const destroyFunc = () => { gos.removePropertyEventListener(event, listener); return null; }; this.destroyFunctions.push(destroyFunc); return () => { destroyFunc(); // Only remove if manually called before bean is destroyed this.destroyFunctions = this.destroyFunctions.filter((fn) => fn !== destroyFunc); return null; }; } /** * Setup a managed property listener for the given GridOption property. * @param event GridOption property to listen to changes for. * @param listener Listener to run when property value changes */ addManagedPropertyListener(event, listener) { if (this.destroyed) { return () => null; } return this.setupGridOptionListener(event, listener); } /** * Setup managed property listeners for the given set of GridOption properties. * The listener will be run if any of the property changes but will only run once if * multiple of the properties change within the same framework lifecycle event. * Works on the basis that GridOptionsService updates all properties *before* any property change events are fired. * @param events Array of GridOption properties to listen for changes too. * @param listener Shared listener to run if any of the properties change */ addManagedPropertyListeners(events, listener) { if (this.destroyed) { return; } // Ensure each set of events can run for the same changeSetId const eventsKey = events.join('-') + this.propertyListenerId++; const wrappedListener = (event) => { if (event.changeSet) { // ChangeSet is only set when the property change is part of a group of changes from ComponentUtils // Direct api calls should always be run as if (event.changeSet && event.changeSet.id === this.lastChangeSetIdLookup[eventsKey]) { // Already run the listener for this set of prop changes so don't run again return; } this.lastChangeSetIdLookup[eventsKey] = event.changeSet.id; } // Don't expose the underlying event value changes to the group listener. const propertiesChangeEvent = { type: 'gridPropertyChanged', changeSet: event.changeSet, source: event.source, }; listener(propertiesChangeEvent); }; events.forEach((event) => this.setupGridOptionListener(event, wrappedListener)); } getLocaleTextFunc() { return (0, localeUtils_1._getLocaleTextFunc)(this.beans.localeSvc); } addDestroyFunc(func) { // if we are already destroyed, we execute the func now if (this.isAlive()) { this.destroyFunctions.push(func); } else { func(); } } /** doesn't throw an error if `bean` is undefined */ createOptionalManagedBean(bean, context) { return bean ? this.createManagedBean(bean, context) : undefined; } createManagedBean(bean, context) { const res = this.createBean(bean, context); this.addDestroyFunc(this.destroyBean.bind(this, bean, context)); return res; } createBean(bean, context, afterPreCreateCallback) { return (context || this.stubContext).createBean(bean, afterPreCreateCallback); } /** * Destroys a bean and returns undefined to support destruction and clean up in a single line. * this.dateComp = this.context.destroyBean(this.dateComp); */ destroyBean(bean, context) { return (context || this.stubContext).destroyBean(bean); } /** * Destroys an array of beans and returns an empty array to support destruction and clean up in a single line. * this.dateComps = this.context.destroyBeans(this.dateComps); */ destroyBeans(beans, context) { return (context || this.stubContext).destroyBeans(beans); } } exports.BeanStub = BeanStub; // type guard for IAgEventEmitter function isAgEventEmitter(object) { return object.__addEventListener !== undefined; } /***/ }), /***/ 2342: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.Context = void 0; const moduleRegistry_1 = __webpack_require__(2132); const genericContext_1 = __webpack_require__(569); class Context extends genericContext_1.GenericContext { init(params) { this.gridId = params.gridId; this.beans.context = this; this.destroyCallback = params.destroyCallback; super.init(params); } destroy() { super.destroy(); (0, moduleRegistry_1._unRegisterGridModules)(this.gridId); this.destroyCallback?.(); } getGridId() { return this.gridId; } } exports.Context = Context; /***/ }), /***/ 569: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.GenericContext = void 0; class GenericContext { constructor(params) { this.beans = {}; this.createdBeans = []; this.destroyed = false; if (!params || !params.beanClasses) { return; } this.beanDestroyComparator = params.beanDestroyComparator; this.init(params); } init(params) { for (const beanName of Object.keys(params.providedBeanInstances)) { this.beans[beanName] = params.providedBeanInstances[beanName]; } params.beanClasses.forEach((BeanClass) => { const instance = new BeanClass(); if (instance.beanName) { this.beans[instance.beanName] = instance; } else { // eslint-disable-next-line no-console console.error(`Bean ${BeanClass.name} is missing beanName`); } this.createdBeans.push(instance); }); params.derivedBeans?.forEach((beanFunc) => { const { beanName, bean } = beanFunc(this); this.beans[beanName] = bean; this.createdBeans.push(bean); }); if (params.beanInitComparator) { // sort the beans so that they are in a consistent order this.createdBeans.sort(params.beanInitComparator); } this.initBeans(this.createdBeans); } getBeanInstances() { return Object.values(this.beans); } createBean(bean, afterPreCreateCallback) { if (!bean) { throw Error('null bean'); } this.initBeans([bean], afterPreCreateCallback); return bean; } initBeans(beanInstances, afterPreCreateCallback) { beanInstances.forEach((instance) => { // used by BaseBeans to avoid the need for calling super.wireBeans() in every subclasses instance.preWireBeans?.(this.beans); instance.wireBeans?.(this.beans); }); // used by the component class beanInstances.forEach((instance) => instance.preConstruct?.()); if (afterPreCreateCallback) { beanInstances.forEach(afterPreCreateCallback); } beanInstances.forEach((instance) => instance.postConstruct?.()); } getBeans() { return this.beans; } getBean(name) { return this.beans[name]; } destroy() { if (this.destroyed) { return; } // Set before doing the destroy, so if context.destroy() gets called via another bean // we are marked as destroyed already to prevent running destroy() twice this.destroyed = true; const beanInstances = this.getBeanInstances(); if (this.beanDestroyComparator) { beanInstances.sort(this.beanDestroyComparator); } this.destroyBeans(beanInstances); this.beans = {}; this.createdBeans = []; } /** * Destroys a bean and returns undefined to support destruction and clean up in a single line. * this.dateComp = this.context.destroyBean(this.dateComp); */ destroyBean(bean) { bean?.destroy?.(); } /** * Destroys an array of beans and returns an empty array to support destruction and clean up in a single line. * this.dateComps = this.context.destroyBeans(this.dateComps); */ destroyBeans(beans) { if (beans) { for (let i = 0; i < beans.length; i++) { this.destroyBean(beans[i]); } } return []; } isDestroyed() { return this.destroyed; } } exports.GenericContext = GenericContext; /***/ }), /***/ 3943: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.gridBeanDestroyComparator = exports.gridBeanInitComparator = void 0; /** * We know that there is a risk in a change of behaviour if beans are registered in a different order due to the way * that this means that their event listeners will be registered in a different order. If they fire in a different order * there is a risk that behaviour will be inconsistent. * As core beans are going to become optional and could be registered in unpredictable orders via feature modules, * we need to provide a consistent order for them to be registered in. * * We have not included beans from modules as they will be registered after the core beans in the order they are provided. */ const orderedCoreBeans = [ // Validate license first 'licenseManager', // core beans only 'environment', 'eventSvc', 'gos', 'paginationAutoPageSizeSvc', 'apiFunctionSvc', 'gridApi', 'registry', 'agCompUtils', 'userCompFactory', 'rowContainerHeight', 'horizontalResizeSvc', 'localeSvc', 'pinnedRowModel', 'dragSvc', 'colGroupSvc', 'visibleCols', 'popupSvc', 'selectionSvc', 'colFilter', 'quickFilter', 'filterManager', 'colModel', 'headerNavigation', 'pageBounds', 'pagination', 'rowSpanSvc', 'pageBoundsListener', 'stickyRowSvc', 'rowRenderer', 'expressionSvc', 'alignedGridsSvc', 'navigation', 'valueCache', 'valueSvc', 'autoWidthCalc', 'filterMenuFactory', 'dragAndDrop', 'focusSvc', 'cellNavigation', 'cellStyles', 'scrollVisibleSvc', 'sortSvc', 'colHover', 'colAnimation', 'autoColSvc', 'selectionColSvc', 'changeDetectionSvc', 'animationFrameSvc', 'undoRedo', 'colDefFactory', 'rowStyleSvc', 'rowNodeBlockLoader', 'rowNodeSorter', 'ctrlsSvc', 'pinnedCols', 'dataTypeSvc', 'syncSvc', 'overlays', 'stateSvc', 'expansionSvc', 'apiEventSvc', 'ariaAnnounce', 'menuSvc', 'colMoves', 'colAutosize', 'colFlex', 'colResize', 'pivotColsSvc', 'valueColsSvc', 'rowGroupColsSvc', 'funcColsSvc', 'colNames', 'colViewport', 'pivotResultCols', 'showRowGroupCols', 'validation', // Have validations run last ]; const beanNamePosition = Object.fromEntries(orderedCoreBeans.map((beanName, index) => [beanName, index])); function gridBeanInitComparator(bean1, bean2) { // if the beans are not in the ordered list, just ensure they are after the ordered beans and stable to provided order const index1 = (bean1.beanName ? beanNamePosition[bean1.beanName] : undefined) ?? Number.MAX_SAFE_INTEGER; const index2 = (bean2.beanName ? beanNamePosition[bean2.beanName] : undefined) ?? Number.MAX_SAFE_INTEGER; return index1 - index2; } exports.gridBeanInitComparator = gridBeanInitComparator; function gridBeanDestroyComparator(bean1, // eslint-disable-next-line @typescript-eslint/no-unused-vars bean2) { return bean1?.beanName === 'gridDestroySvc' ? -1 : 0; } exports.gridBeanDestroyComparator = gridBeanDestroyComparator; /***/ }), /***/ 1310: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.CsvCreator = void 0; const baseCreator_1 = __webpack_require__(7331); const downloader_1 = __webpack_require__(3885); const gridOptionsUtils_1 = __webpack_require__(7274); const logging_1 = __webpack_require__(7764); const csvSerializingSession_1 = __webpack_require__(2927); class CsvCreator extends baseCreator_1.BaseCreator { constructor() { super(...arguments); this.beanName = 'csvCreator'; } wireBeans(beans) { this.colModel = beans.colModel; this.colNames = beans.colNames; this.rowGroupColsSvc = beans.rowGroupColsSvc; this.valueSvc = beans.valueSvc; } getMergedParams(params) { const baseParams = this.gos.get('defaultCsvExportParams'); return Object.assign({}, baseParams, params); } export(userParams) { if (this.isExportSuppressed()) { // Export cancelled. (0, logging_1._warn)(51); return; } const mergedParams = this.getMergedParams(userParams); const data = this.getData(mergedParams); const packagedFile = new Blob(['\ufeff', data], { type: 'text/plain' }); const fileName = typeof mergedParams.fileName === 'function' ? mergedParams.fileName((0, gridOptionsUtils_1._addGridCommonParams)(this.gos, {})) : mergedParams.fileName; (0, downloader_1._downloadFile)(this.getFileName(fileName), packagedFile); } exportDataAsCsv(params) { this.export(params); } getDataAsCsv(params, skipDefaultParams = false) { const mergedParams = skipDefaultParams ? Object.assign({}, params) : this.getMergedParams(params); return this.getData(mergedParams); } getDefaultFileExtension() { return 'csv'; } createSerializingSession(params) { const { colModel, colNames, rowGroupColsSvc, valueSvc, gos } = this; const { processCellCallback, processHeaderCallback, processGroupHeaderCallback, processRowGroupCallback, suppressQuotes, columnSeparator, } = params; return new csvSerializingSession_1.CsvSerializingSession({ colModel, colNames, valueSvc, gos, processCellCallback: processCellCallback || undefined, processHeaderCallback: processHeaderCallback || undefined, processGroupHeaderCallback: processGroupHeaderCallback || undefined, processRowGroupCallback: processRowGroupCallback || undefined, suppressQuotes: suppressQuotes || false, columnSeparator: columnSeparator || ',', rowGroupColsSvc, }); } isExportSuppressed() { return this.gos.get('suppressCsvExport'); } } exports.CsvCreator = CsvCreator; /***/ }), /***/ 2984: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.exportDataAsCsv = exports.getDataAsCsv = void 0; function getDataAsCsv(beans, params) { return beans.csvCreator?.getDataAsCsv(params); } exports.getDataAsCsv = getDataAsCsv; function exportDataAsCsv(beans, params) { beans.csvCreator?.exportDataAsCsv(params); } exports.exportDataAsCsv = exportDataAsCsv; /***/ }), /***/ 9734: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.CsvExportModule = void 0; const exportModule_1 = __webpack_require__(2728); const version_1 = __webpack_require__(7205); const csvCreator_1 = __webpack_require__(1310); const csvExportApi_1 = __webpack_require__(2984); /** * @feature Import & Export -> CSV Export */ exports.CsvExportModule = { moduleName: 'CsvExport', version: version_1.VERSION, beans: [csvCreator_1.CsvCreator], apiFunctions: { getDataAsCsv: csvExportApi_1.getDataAsCsv, exportDataAsCsv: csvExportApi_1.exportDataAsCsv, }, dependsOn: [exportModule_1.SharedExportModule], }; /***/ }), /***/ 2927: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.CsvSerializingSession = void 0; const baseGridSerializingSession_1 = __webpack_require__(8376); const logging_1 = __webpack_require__(7764); const LINE_SEPARATOR = '\r\n'; class CsvSerializingSession extends baseGridSerializingSession_1.BaseGridSerializingSession { constructor(config) { super(config); this.isFirstLine = true; this.result = ''; const { suppressQuotes, columnSeparator } = config; this.suppressQuotes = suppressQuotes; this.columnSeparator = columnSeparator; } addCustomContent(content) { if (!content) { return; } if (typeof content === 'string') { if (!/^\s*\n/.test(content)) { this.beginNewLine(); } // replace whatever newlines are supplied with the style we're using content = content.replace(/\r?\n/g, LINE_SEPARATOR); this.result += content; } else { content.forEach((row) => { this.beginNewLine(); row.forEach((cell, index) => { if (index !== 0) { this.result += this.columnSeparator; } this.result += this.putInQuotes(cell.data.value || ''); if (cell.mergeAcross) { this.appendEmptyCells(cell.mergeAcross); } }); }); } } onNewHeaderGroupingRow() { this.beginNewLine(); return { onColumn: this.onNewHeaderGroupingRowColumn.bind(this), }; } onNewHeaderGroupingRowColumn(columnGroup, header, index, span) { if (index != 0) { this.result += this.columnSeparator; } this.result += this.putInQuotes(header); this.appendEmptyCells(span); } appendEmptyCells(count) { for (let i = 1; i <= count; i++) { this.result += this.columnSeparator + this.putInQuotes(''); } } onNewHeaderRow() { this.beginNewLine(); return { onColumn: this.onNewHeaderRowColumn.bind(this), }; } onNewHeaderRowColumn(column, index) { if (index != 0) { this.result += this.columnSeparator; } this.result += this.putInQuotes(this.extractHeaderValue(column)); } onNewBodyRow() { this.beginNewLine(); return { onColumn: this.onNewBodyRowColumn.bind(this), }; } onNewBodyRowColumn(column, index, node) { if (index != 0) { this.result += this.columnSeparator; } const rowCellValue = this.extractRowCellValue(column, index, index, 'csv', node); this.result += this.putInQuotes(rowCellValue.valueFormatted ?? rowCellValue.value); } putInQuotes(value) { if (this.suppressQuotes) { return value; } if (value === null || value === undefined) { return '""'; } let stringValue; if (typeof value === 'string') { stringValue = value; } else if (typeof value.toString === 'function') { stringValue = value.toString(); } else { (0, logging_1._warn)(53); stringValue = ''; } // replace each " with "" (ie two sets of double quotes is how to do double quotes in csv) const valueEscaped = stringValue.replace(/"/g, '""'); return '"' + valueEscaped + '"'; } parse() { return this.result; } beginNewLine() { if (!this.isFirstLine) { this.result += LINE_SEPARATOR; } this.isFirstLine = false; } } exports.CsvSerializingSession = CsvSerializingSession; /***/ }), /***/ 20: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.CtrlsService = void 0; const beanStub_1 = __webpack_require__(8731); /** * This is the number of controls defined above in `ReadyParams`. * This allows us to quickly know when all controls have been registered. */ const NUM_CTRLS = 23; // for all controllers that are singletons, they can register here so other parts // of the application can access them. class CtrlsService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'ctrlsSvc'; this.params = {}; this.ready = false; this.readyCallbacks = []; } postConstruct() { // With React 19 StrictMode, ctrlService can be ready twice. // The first time after the first render cycle, and the second time after the second render cycle which is only done in StrictMode. // By making the local events async, we effectively debounce the first ready event until after the second render cycle has completed. // This means that the ready logic across the grid will run against the currently rendered components and controllers. // We make this async only for React 19 as StrictMode in React 19 double fires ref callbacks whereas previous versions of React do not. this.addEventListener('ready', () => { this.updateReady(); if (this.ready) { this.readyCallbacks.forEach((c) => c(this.params)); this.readyCallbacks.length = 0; } }, this.beans.frameworkOverrides.runWhenReadyAsync?.() ?? false); } updateReady() { const values = Object.values(this.params); // ready when all ctrls have been registered and are alive this.ready = values.length === NUM_CTRLS && values.every((ctrl) => { return ctrl?.isAlive() ?? false; }); } whenReady(caller, callback) { if (this.ready) { callback(this.params); } else { this.readyCallbacks.push(callback); } caller.addDestroyFunc(() => { // remove the callback if the caller is destroyed so that we don't call it against a destroyed component const index = this.readyCallbacks.indexOf(callback); if (index >= 0) { this.readyCallbacks.splice(index, 1); } }); } register(ctrlType, ctrl) { this.params[ctrlType] = ctrl; this.updateReady(); if (this.ready) { this.dispatchLocalEvent({ type: 'ready' }); } ctrl.addDestroyFunc(() => { // Ensure ready is false when a controller is destroyed // We do not clear them as a lot of code still runs during destroy logic which may need access to the controllers // NOTE: This is not ideal and we should look to stop logic using controllers during destroy this.updateReady(); }); } get(ctrlType) { return this.params[ctrlType]; } getGridBodyCtrl() { return this.params.gridBodyCtrl; } getHeaderRowContainerCtrls() { const { leftHeader, centerHeader, rightHeader } = this.params; return [leftHeader, rightHeader, centerHeader]; } getHeaderRowContainerCtrl(pinned) { const params = this.params; switch (pinned) { case 'left': return params.leftHeader; case 'right': return params.rightHeader; default: return params.centerHeader; } } getScrollFeature() { return this.getGridBodyCtrl().scrollFeature; } } exports.CtrlsService = CtrlsService; /***/ }), /***/ 2671: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.dragAndDropImageComponentCSS = void 0; exports.dragAndDropImageComponentCSS = `.ag-dnd-ghost{align-items:center;background-color:var(--ag-drag-and-drop-image-background-color);border:var(--ag-drag-and-drop-image-border);border-radius:var(--ag-border-radius);box-shadow:var(--ag-drag-and-drop-image-shadow);color:var(--ag-text-color);cursor:move;display:flex;font-weight:500;gap:var(--ag-cell-widget-spacing);height:var(--ag-header-height);overflow:hidden;padding-left:var(--ag-cell-horizontal-padding);padding-right:var(--ag-cell-horizontal-padding);text-overflow:ellipsis;transform:translateY(calc(var(--ag-spacing)*2));white-space:nowrap}`; /***/ }), /***/ 3814: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.DragAndDropImageComponent = void 0; const dom_1 = __webpack_require__(3507); const icon_1 = __webpack_require__(9970); const component_1 = __webpack_require__(8020); const dragAndDropImageComponent_css_GENERATED_1 = __webpack_require__(2671); class DragAndDropImageComponent extends component_1.Component { constructor() { super(); this.dragSource = null; this.eIcon = component_1.RefPlaceholder; this.eLabel = component_1.RefPlaceholder; this.registerCSS(dragAndDropImageComponent_css_GENERATED_1.dragAndDropImageComponentCSS); } postConstruct() { const create = (iconName) => (0, icon_1._createIcon)(iconName, this.beans, null); this.dropIconMap = { pinned: create('columnMovePin'), hide: create('columnMoveHide'), move: create('columnMoveMove'), left: create('columnMoveLeft'), right: create('columnMoveRight'), group: create('columnMoveGroup'), aggregate: create('columnMoveValue'), pivot: create('columnMovePivot'), notAllowed: create('dropNotAllowed'), }; } init(params) { this.dragSource = params.dragSource; this.setTemplate( /* html */ `
`); } destroy() { this.dragSource = null; super.destroy(); } setIcon(iconName, shake) { const { eIcon, dragSource, dropIconMap, gos } = this; (0, dom_1._clearElement)(eIcon); let eIconChild = null; if (!iconName) { iconName = dragSource?.getDefaultIconName ? dragSource.getDefaultIconName() : 'notAllowed'; } eIconChild = dropIconMap[iconName]; eIcon.classList.toggle('ag-shake-left-to-right', shake); if (eIconChild === dropIconMap['hide'] && gos.get('suppressDragLeaveHidesColumns')) { return; } if (eIconChild) { eIcon.appendChild(eIconChild); } } setLabel(label) { this.eLabel.textContent = label; } } exports.DragAndDropImageComponent = DragAndDropImageComponent; /***/ }), /***/ 2903: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.DragAndDropService = exports.DragSourceType = void 0; const userCompUtils_1 = __webpack_require__(2036); const beanStub_1 = __webpack_require__(8731); const mouseEventUtils_1 = __webpack_require__(8399); const gridOptionsUtils_1 = __webpack_require__(7274); const array_1 = __webpack_require__(1502); const logging_1 = __webpack_require__(7764); var DragSourceType; (function (DragSourceType) { DragSourceType[DragSourceType["ToolPanel"] = 0] = "ToolPanel"; DragSourceType[DragSourceType["HeaderCell"] = 1] = "HeaderCell"; DragSourceType[DragSourceType["RowDrag"] = 2] = "RowDrag"; DragSourceType[DragSourceType["ChartPanel"] = 3] = "ChartPanel"; DragSourceType[DragSourceType["AdvancedFilterBuilder"] = 4] = "AdvancedFilterBuilder"; })(DragSourceType || (exports.DragSourceType = DragSourceType = {})); class DragAndDropService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'dragAndDrop'; this.dragSourceAndParamsList = []; this.dropTargets = []; } wireBeans(beans) { this.ctrlsSvc = beans.ctrlsSvc; this.dragSvc = beans.dragSvc; this.environment = beans.environment; this.userCompFactory = beans.userCompFactory; } addDragSource(dragSource, allowTouch = false) { const params = { eElement: dragSource.eElement, dragStartPixels: dragSource.dragStartPixels, onDragStart: this.onDragStart.bind(this, dragSource), onDragStop: this.onDragStop.bind(this), onDragging: this.onDragging.bind(this), onDragCancel: this.onDragCancel.bind(this), includeTouch: allowTouch, }; this.dragSourceAndParamsList.push({ params: params, dragSource: dragSource }); this.dragSvc.addDragSource(params); } getDragAndDropImageComponent() { const { dragAndDropImageComp } = this; if (!dragAndDropImageComp || !dragAndDropImageComp.comp) { return null; } return dragAndDropImageComp.comp; } removeDragSource(dragSource) { const { dragSourceAndParamsList, dragSvc } = this; const sourceAndParams = dragSourceAndParamsList.find((item) => item.dragSource === dragSource); if (sourceAndParams) { dragSvc.removeDragSource(sourceAndParams.params); (0, array_1._removeFromArray)(dragSourceAndParamsList, sourceAndParams); } } destroy() { const { dragSourceAndParamsList, dragSvc, dropTargets } = this; dragSourceAndParamsList.forEach((sourceAndParams) => dragSvc.removeDragSource(sourceAndParams.params)); dragSourceAndParamsList.length = 0; dropTargets.length = 0; this.clearDragAndDropProperties(); super.destroy(); } nudge() { if (this.dragging) { this.onDragging(this.eventLastTime, true); } } onDragStart(dragSource, mouseEvent) { this.dragging = true; this.dragSource = dragSource; this.eventLastTime = mouseEvent; this.dragItem = dragSource.getDragItem(); dragSource.onDragStarted?.(); this.createDragAndDropImageComponent(); } onDragStop(mouseEvent) { this.dragSource?.onDragStopped?.(); const { lastDropTarget } = this; if (lastDropTarget?.onDragStop) { const draggingEvent = this.createDropTargetEvent(lastDropTarget, mouseEvent, null, null, false); lastDropTarget.onDragStop(draggingEvent); } this.clearDragAndDropProperties(); } onDragCancel() { const { dragSource, lastDropTarget } = this; dragSource?.onDragCancelled?.(); if (lastDropTarget?.onDragCancel) { lastDropTarget.onDragCancel(this.createDropTargetEvent(lastDropTarget, this.eventLastTime, null, null, false)); } this.clearDragAndDropProperties(); } clearDragAndDropProperties() { this.eventLastTime = null; this.dragging = false; this.lastDropTarget = undefined; this.dragItem = null; this.dragSource = null; this.removeDragAndDropImageComponent(); } onDragging(mouseEvent, fromNudge = false) { const hDirection = this.getHorizontalDirection(mouseEvent); const vDirection = this.getVerticalDirection(mouseEvent); this.eventLastTime = mouseEvent; this.positionDragAndDropImageComp(mouseEvent); // check if mouseEvent intersects with any of the drop targets const validDropTargets = this.dropTargets.filter((target) => this.isMouseOnDropTarget(mouseEvent, target)); const dropTarget = this.findCurrentDropTarget(mouseEvent, validDropTargets); const { lastDropTarget, dragSource, dragAndDropImageComp, dragItem } = this; if (dropTarget !== lastDropTarget) { this.leaveLastTargetIfExists(mouseEvent, hDirection, vDirection, fromNudge); if (lastDropTarget !== null && dropTarget === null) { dragSource?.onGridExit?.(dragItem); } if (lastDropTarget === null && dropTarget !== null) { dragSource?.onGridEnter?.(dragItem); } this.enterDragTargetIfExists(dropTarget, mouseEvent, hDirection, vDirection, fromNudge); if (dropTarget && dragAndDropImageComp) { const { comp, promise } = dragAndDropImageComp; if (comp) { comp.setIcon(dropTarget.getIconName ? dropTarget.getIconName() : null, false); } else { promise.then((resolvedComponent) => { if (resolvedComponent) { resolvedComponent.setIcon(dropTarget.getIconName ? dropTarget.getIconName() : null, false); } }); } } this.lastDropTarget = dropTarget; } else if (dropTarget && dropTarget.onDragging) { const draggingEvent = this.createDropTargetEvent(dropTarget, mouseEvent, hDirection, vDirection, fromNudge); dropTarget.onDragging(draggingEvent); } } getAllContainersFromDropTarget(dropTarget) { const secondaryContainers = dropTarget.getSecondaryContainers ? dropTarget.getSecondaryContainers() : null; const containers = [[dropTarget.getContainer()]]; return secondaryContainers ? containers.concat(secondaryContainers) : containers; } // checks if the mouse is on the drop target. it checks eContainer and eSecondaryContainers isMouseOnDropTarget(mouseEvent, dropTarget) { const allContainersFromDropTarget = this.getAllContainersFromDropTarget(dropTarget); let mouseOverTarget = false; const allContainersIntersect = (mouseEvent, containers) => { for (const container of containers) { const { width, height, left, right, top, bottom } = container.getBoundingClientRect(); // if element is not visible, then width and height are zero if (width === 0 || height === 0) { return false; } const horizontalFit = mouseEvent.clientX >= left && mouseEvent.clientX < right; const verticalFit = mouseEvent.clientY >= top && mouseEvent.clientY < bottom; if (!horizontalFit || !verticalFit) { return false; } } return true; }; for (const currentContainers of allContainersFromDropTarget) { if (allContainersIntersect(mouseEvent, currentContainers)) { mouseOverTarget = true; break; } } const { eElement, type } = this.dragSource; if (dropTarget.targetContainsSource && !dropTarget.getContainer().contains(eElement)) { return false; } return mouseOverTarget && dropTarget.isInterestedIn(type, eElement); } findCurrentDropTarget(mouseEvent, validDropTargets) { const len = validDropTargets.length; if (len === 0) { return null; } if (len === 1) { return validDropTargets[0]; } const rootNode = (0, gridOptionsUtils_1._getRootNode)(this.beans); // elementsFromPoint return a list of elements under // the mouseEvent sorted from topMost to bottomMost const elementStack = rootNode.elementsFromPoint(mouseEvent.clientX, mouseEvent.clientY); // loop over the sorted elementStack to find which dropTarget comes first for (const el of elementStack) { for (const dropTarget of validDropTargets) { const containers = this.getAllContainersFromDropTarget(dropTarget).flatMap((a) => a); if (containers.indexOf(el) !== -1) { return dropTarget; } } } // we should never hit this point of the code because only // valid dropTargets should be provided to this method. return null; } enterDragTargetIfExists(dropTarget, mouseEvent, hDirection, vDirection, fromNudge) { if (!dropTarget) { return; } if (dropTarget.onDragEnter) { const dragEnterEvent = this.createDropTargetEvent(dropTarget, mouseEvent, hDirection, vDirection, fromNudge); dropTarget.onDragEnter(dragEnterEvent); } } leaveLastTargetIfExists(mouseEvent, hDirection, vDirection, fromNudge) { const { lastDropTarget } = this; if (!lastDropTarget) { return; } if (lastDropTarget.onDragLeave) { const dragLeaveEvent = this.createDropTargetEvent(lastDropTarget, mouseEvent, hDirection, vDirection, fromNudge); lastDropTarget.onDragLeave(dragLeaveEvent); } const dragAndDropImageComponent = this.getDragAndDropImageComponent(); if (dragAndDropImageComponent) { dragAndDropImageComponent.setIcon(null, false); } } addDropTarget(dropTarget) { this.dropTargets.push(dropTarget); } removeDropTarget(dropTarget) { this.dropTargets = this.dropTargets.filter((target) => target.getContainer() !== dropTarget.getContainer()); } hasExternalDropZones() { return this.dropTargets.some((zones) => zones.external); } findExternalZone(params) { const externalTargets = this.dropTargets.filter((target) => target.external); return externalTargets.find((zone) => zone.getContainer() === params.getContainer()) || null; } isDropZoneWithinThisGrid(draggingEvent) { const gridBodyCon = this.ctrlsSvc.getGridBodyCtrl(); const gridGui = gridBodyCon.eGridBody; const { dropZoneTarget } = draggingEvent; return gridGui.contains(dropZoneTarget); } getHorizontalDirection(event) { const clientX = this.eventLastTime?.clientX; const eClientX = event.clientX; if (clientX === eClientX) { return null; } return clientX > eClientX ? 'left' : 'right'; } getVerticalDirection(event) { const clientY = this.eventLastTime?.clientY; const eClientY = event.clientY; if (clientY === eClientY) { return null; } return clientY > eClientY ? 'up' : 'down'; } createDropTargetEvent(dropTarget, event, hDirection, vDirection, fromNudge) { // localise x and y to the target const dropZoneTarget = dropTarget.getContainer(); const rect = dropZoneTarget.getBoundingClientRect(); const { dragItem, dragSource, gos } = this; const x = event.clientX - rect.left; const y = event.clientY - rect.top; return (0, gridOptionsUtils_1._addGridCommonParams)(gos, { event, x, y, vDirection, hDirection, dragSource: dragSource, fromNudge, dragItem: dragItem, dropZoneTarget, }); } positionDragAndDropImageComp(event) { const dragAndDropImageComponent = this.getDragAndDropImageComponent(); if (!dragAndDropImageComponent) { return; } (0, gridOptionsUtils_1._anchorElementToMouseMoveEvent)(dragAndDropImageComponent.getGui(), event, this.beans); } removeDragAndDropImageComponent() { const { dragAndDropImageComp } = this; if (dragAndDropImageComp) { const { comp } = dragAndDropImageComp; if (comp) { const eGui = comp.getGui(); this.dragAndDropImageParent?.removeChild(eGui); this.destroyBean(comp); } } this.dragAndDropImageComp = null; } createDragAndDropImageComponent() { const { dragSource, gos, userCompFactory } = this; if (!dragSource) { return; } const userCompDetails = (0, userCompUtils_1._getDragAndDropImageCompDetails)(userCompFactory, (0, gridOptionsUtils_1._addGridCommonParams)(gos, { dragSource, })); if (!userCompDetails) { return; } const promise = userCompDetails.newAgStackInstance(); this.dragAndDropImageComp = { promise, }; promise.then((comp) => { if (!comp || !this.isAlive()) { return; } this.processDragAndDropImageComponent(comp); this.dragAndDropImageComp.comp = comp; }); } processDragAndDropImageComponent(dragAndDropImageComponent) { const { dragSource, environment } = this; if (!dragSource) { return; } const eGui = dragAndDropImageComponent.getGui(); eGui.style.setProperty('position', 'absolute'); eGui.style.setProperty('z-index', '9999'); (0, mouseEventUtils_1._stampTopLevelGridCompWithGridInstance)(this.gos, eGui); environment.applyThemeClasses(eGui); dragAndDropImageComponent.setIcon(null, false); let { dragItemName } = dragSource; if (typeof dragItemName === 'function') { dragItemName = dragItemName(); } dragAndDropImageComponent.setLabel(dragItemName || ''); eGui.style.top = '20px'; eGui.style.left = '20px'; const targetEl = (0, gridOptionsUtils_1._getPageBody)(this.beans); this.dragAndDropImageParent = targetEl; if (!targetEl) { (0, logging_1._warn)(54); } else { targetEl.appendChild(eGui); } } registerGridDropTarget(elementFn, ctrl) { // this drop target is just used to see if the drop event is inside the grid const dropTarget = { getContainer: elementFn, isInterestedIn: (type) => type === DragSourceType.HeaderCell || type === DragSourceType.ToolPanel, getIconName: () => 'notAllowed', }; this.addDropTarget(dropTarget); ctrl.addDestroyFunc(() => this.removeDropTarget(dropTarget)); } } exports.DragAndDropService = DragAndDropService; /***/ }), /***/ 2830: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getRowDropZoneParams = exports.removeRowDropZone = exports.addRowDropZone = void 0; function addRowDropZone(beans, params) { beans.rowDragSvc?.rowDragFeature?.addRowDropZone(params); } exports.addRowDropZone = addRowDropZone; function removeRowDropZone(beans, params) { const activeDropTarget = beans.dragAndDrop?.findExternalZone(params); if (activeDropTarget) { beans.dragAndDrop?.removeDropTarget(activeDropTarget); } } exports.removeRowDropZone = removeRowDropZone; function getRowDropZoneParams(beans, events) { return beans.rowDragSvc?.rowDragFeature?.getRowDropZone(events); } exports.getRowDropZoneParams = getRowDropZoneParams; /***/ }), /***/ 4388: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.HorizontalResizeModule = exports.RowDragModule = exports.SharedDragAndDropModule = exports.DragAndDropModule = exports.DragModule = void 0; const dndSourceComp_1 = __webpack_require__(714); const version_1 = __webpack_require__(7205); const dragAndDropImageComponent_1 = __webpack_require__(3814); const dragAndDropService_1 = __webpack_require__(2903); const dragApi_1 = __webpack_require__(2830); const dragService_1 = __webpack_require__(2165); const horizontalResizeService_1 = __webpack_require__(6843); const rowDragService_1 = __webpack_require__(2895); /** * @internal */ exports.DragModule = { moduleName: 'Drag', version: version_1.VERSION, beans: [dragService_1.DragService], }; /** * @feature Import & Export -> Drag & Drop * @colDef dndSource, dndSourceOnRowDrag */ exports.DragAndDropModule = { moduleName: 'DragAndDrop', version: version_1.VERSION, dynamicBeans: { dndSourceComp: dndSourceComp_1.DndSourceComp, }, icons: { // drag handle used to pick up draggable rows rowDrag: 'grip', }, }; /** * @internal */ exports.SharedDragAndDropModule = { moduleName: 'SharedDragAndDrop', version: version_1.VERSION, beans: [dragAndDropService_1.DragAndDropService], dependsOn: [exports.DragModule], userComponents: { agDragAndDropImage: dragAndDropImageComponent_1.DragAndDropImageComponent, }, icons: { // shown on drag and drop image component icon while dragging column to the side of the grid to pin columnMovePin: 'pin', // shown on drag and drop image component icon while dragging over part of the page that is not a drop zone columnMoveHide: 'eye-slash', // shown on drag and drop image component icon while dragging columns to reorder columnMoveMove: 'arrows', // animating icon shown when dragging a column to the right of the grid causes horizontal scrolling columnMoveLeft: 'left', // animating icon shown when dragging a column to the left of the grid causes horizontal scrolling columnMoveRight: 'right', // shown on drag and drop image component icon while dragging over Row Groups drop zone columnMoveGroup: 'group', // shown on drag and drop image component icon while dragging over Values drop zone columnMoveValue: 'aggregation', // shown on drag and drop image component icon while dragging over pivot drop zone columnMovePivot: 'pivot', // shown on drag and drop image component icon while dragging over drop zone that doesn't support it, e.g. // string column over aggregation drop zone dropNotAllowed: 'not-allowed', // drag handle used to pick up draggable rows rowDrag: 'grip', }, }; /** * @feature Rows -> Row Dragging * @colDef rowDrag */ exports.RowDragModule = { moduleName: 'RowDrag', version: version_1.VERSION, beans: [rowDragService_1.RowDragService], apiFunctions: { addRowDropZone: dragApi_1.addRowDropZone, removeRowDropZone: dragApi_1.removeRowDropZone, getRowDropZoneParams: dragApi_1.getRowDropZoneParams, }, dependsOn: [exports.SharedDragAndDropModule], }; /** * @internal */ exports.HorizontalResizeModule = { moduleName: 'HorizontalResize', version: version_1.VERSION, beans: [horizontalResizeService_1.HorizontalResizeService], dependsOn: [exports.DragModule], }; /***/ }), /***/ 2165: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.DragService = void 0; const keyCode_1 = __webpack_require__(9853); const beanStub_1 = __webpack_require__(8731); const mouseEventUtils_1 = __webpack_require__(8399); const gridOptionsUtils_1 = __webpack_require__(7274); const array_1 = __webpack_require__(1502); const browser_1 = __webpack_require__(8667); const dom_1 = __webpack_require__(3507); const generic_1 = __webpack_require__(4422); const mouse_1 = __webpack_require__(3276); /** Adds drag listening onto an element. In AG Grid this is used twice, first is resizing columns, * second is moving the columns and column groups around (ie the 'drag' part of Drag and Drop. */ class DragService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'dragSvc'; this.dragEndFunctions = []; this.dragSources = []; } destroy() { const { dragSources } = this; dragSources.forEach(this.removeListener.bind(this)); dragSources.length = 0; super.destroy(); } removeListener(dragSourceAndListener) { const element = dragSourceAndListener.dragSource.eElement; const mouseDownListener = dragSourceAndListener.mouseDownListener; element.removeEventListener('mousedown', mouseDownListener); // remove touch listener only if it exists if (dragSourceAndListener.touchEnabled) { const touchStartListener = dragSourceAndListener.touchStartListener; element.removeEventListener('touchstart', touchStartListener, { passive: true }); } } removeDragSource(params) { const { dragSources } = this; const dragSourceAndListener = dragSources.find((item) => item.dragSource === params); if (!dragSourceAndListener) { return; } this.removeListener(dragSourceAndListener); (0, array_1._removeFromArray)(dragSources, dragSourceAndListener); } addDragSource(params) { const mouseListener = this.onMouseDown.bind(this, params); const { eElement, includeTouch, stopPropagationForTouch } = params; eElement.addEventListener('mousedown', mouseListener); let touchListener = null; const suppressTouch = this.gos.get('suppressTouch'); if (includeTouch && !suppressTouch) { touchListener = (touchEvent) => { if ((0, dom_1._isFocusableFormField)(touchEvent.target)) { return; } if (stopPropagationForTouch) { touchEvent.stopPropagation(); } this.onTouchStart(params, touchEvent); }; // we set passive=false, as we want to prevent default on this event eElement.addEventListener('touchstart', touchListener, { passive: false }); } this.dragSources.push({ dragSource: params, mouseDownListener: mouseListener, touchStartListener: touchListener, touchEnabled: !!includeTouch, }); } // gets called whenever mouse down on any drag source onTouchStart(params, touchEvent) { this.currentDragParams = params; this.dragging = false; const touch = touchEvent.touches[0]; this.touchLastTime = touch; this.touchStart = touch; const touchMoveEvent = (e) => this.onTouchMove(e, params.eElement); const touchEndEvent = (e) => this.onTouchUp(e, params.eElement); const documentTouchMove = (e) => { if (e.cancelable) { e.preventDefault(); } }; const target = touchEvent.target; const events = [ // Prevents the page document from moving while we are dragging items around. // preventDefault needs to be called in the touchmove listener and never inside the // touchstart, because using touchstart causes the click event to be cancelled on touch devices. { target: (0, gridOptionsUtils_1._getRootNode)(this.beans), type: 'touchmove', listener: documentTouchMove, options: { passive: false }, }, { target, type: 'touchmove', listener: touchMoveEvent, options: { passive: true } }, { target, type: 'touchend', listener: touchEndEvent, options: { passive: true } }, { target, type: 'touchcancel', listener: touchEndEvent, options: { passive: true } }, ]; // temporally add these listeners, for the duration of the drag this.addTemporaryEvents(events); // see if we want to start dragging straight away if (params.dragStartPixels === 0) { this.onCommonMove(touch, this.touchStart, params.eElement); } } // gets called whenever mouse down on any drag source onMouseDown(params, mouseEvent) { const e = mouseEvent; if (params.skipMouseEvent && params.skipMouseEvent(mouseEvent)) { return; } // if there are two elements with parent / child relationship, and both are draggable, // when we drag the child, we should NOT drag the parent. an example of this is row moving // and range selection - row moving should get preference when use drags the rowDrag component. if (e._alreadyProcessedByDragService) { return; } e._alreadyProcessedByDragService = true; // only interested in left button clicks if (mouseEvent.button !== 0) { return; } if (this.shouldPreventMouseEvent(mouseEvent)) { mouseEvent.preventDefault(); } this.currentDragParams = params; this.dragging = false; this.mouseStartEvent = mouseEvent; this.startTarget = mouseEvent.target; const mouseMoveEvent = (event) => this.onMouseMove(event, params.eElement); const mouseUpEvent = (event) => this.onMouseUp(event, params.eElement); const contextEvent = (event) => event.preventDefault(); const keydownEvent = (event) => { if (event.key === keyCode_1.KeyCode.ESCAPE) { this.cancelDrag(params.eElement); } }; const target = (0, gridOptionsUtils_1._getRootNode)(this.beans); const events = [ { target, type: 'mousemove', listener: mouseMoveEvent }, { target, type: 'mouseup', listener: mouseUpEvent }, { target, type: 'contextmenu', listener: contextEvent }, { target, type: 'keydown', listener: keydownEvent }, ]; // temporally add these listeners, for the duration of the drag this.addTemporaryEvents(events); //see if we want to start dragging straight away if (params.dragStartPixels === 0) { this.onMouseMove(mouseEvent, params.eElement); } } addTemporaryEvents(events) { events.forEach((currentEvent) => { const { target, type, listener, options } = currentEvent; target.addEventListener(type, listener, options); }); this.dragEndFunctions.push(() => { events.forEach((currentEvent) => { const { target, type, listener, options } = currentEvent; target.removeEventListener(type, listener, options); }); }); } // returns true if the event is close to the original event by X pixels either vertically or horizontally. // we only start dragging after X pixels so this allows us to know if we should start dragging yet. isEventNearStartEvent(currentEvent, startEvent) { // by default, we wait 4 pixels before starting the drag const { dragStartPixels } = this.currentDragParams; const requiredPixelDiff = (0, generic_1._exists)(dragStartPixels) ? dragStartPixels : 4; return (0, mouse_1._areEventsNear)(currentEvent, startEvent, requiredPixelDiff); } getFirstActiveTouch(touchList) { for (let i = 0; i < touchList.length; i++) { if (touchList[i].identifier === this.touchStart.identifier) { return touchList[i]; } } return null; } onCommonMove(currentEvent, startEvent, el) { if (!this.dragging) { // if mouse hasn't travelled from the start position enough, do nothing if (this.isEventNearStartEvent(currentEvent, startEvent)) { return; } this.dragging = true; this.eventSvc.dispatchEvent({ type: 'dragStarted', target: el, }); this.currentDragParams.onDragStart(startEvent); // we need ONE drag action at the startEvent, so that we are guaranteed the drop target // at the start gets notified. this is because the drag can start outside of the element // that started it, as the mouse is allowed drag away from the mouse down before it's // considered a drag (the isEventNearStartEvent() above). if we didn't do this, then // it would be possible to click a column by the edge, then drag outside of the drop zone // in less than 4 pixels and the drag officially starts outside of the header but the header // wouldn't be notified of the dragging. // if currentDragParams is null here, it means that drag has been cancelled. if (!this.currentDragParams) { this.dragging = false; return; } this.currentDragParams.onDragging(startEvent); } this.currentDragParams?.onDragging(currentEvent); } onTouchMove(touchEvent, el) { const touch = this.getFirstActiveTouch(touchEvent.touches); if (!touch) { return; } // this.___statusPanel.setInfoText(Math.random() + ' onTouchMove preventDefault stopPropagation'); this.onCommonMove(touch, this.touchStart, el); } // only gets called after a mouse down - as this is only added after mouseDown // and is removed when mouseUp happens onMouseMove(mouseEvent, el) { if ((0, browser_1._isBrowserSafari)()) { const eDocument = (0, gridOptionsUtils_1._getDocument)(this.beans); eDocument.getSelection()?.removeAllRanges(); } if (this.shouldPreventMouseEvent(mouseEvent)) { mouseEvent.preventDefault(); } this.onCommonMove(mouseEvent, this.mouseStartEvent, el); } shouldPreventMouseEvent(mouseEvent) { const { gos } = this; const isEnableCellTextSelect = gos.get('enableCellTextSelection'); const isMouseMove = mouseEvent.type === 'mousemove'; const isOverFormFieldElement = (mouseEvent) => { const el = mouseEvent.target; const tagName = el?.tagName.toLocaleLowerCase(); return !!tagName?.match('^a$|textarea|input|select|button'); }; return ( // when `isEnableCellTextSelect` is `true`, we need to preventDefault on mouseMove // to avoid the grid text being selected while dragging components. isEnableCellTextSelect && isMouseMove && mouseEvent.cancelable && (0, mouseEventUtils_1._isEventFromThisGrid)(gos, mouseEvent) && !isOverFormFieldElement(mouseEvent)); } onTouchUp(touchEvent, el) { let touch = this.getFirstActiveTouch(touchEvent.changedTouches); // i haven't worked this out yet, but there is no matching touch // when we get the touch up event. to get around this, we swap in // the last touch. this is a hack to 'get it working' while we // figure out what's going on, why we are not getting a touch in // current event. if (!touch) { touch = this.touchLastTime; } // if mouse was left up before we started to move, then this is a tap. // we check this before onUpCommon as onUpCommon resets the dragging // let tap = !this.dragging; // let tapTarget = this.currentDragParams.eElement; this.onUpCommon(touch, el); // if tap, tell user // console.log(`${Math.random()} tap = ${tap}`); // if (tap) { // tapTarget.click(); // } } onMouseUp(mouseEvent, el) { this.onUpCommon(mouseEvent, el); } onUpCommon(eventOrTouch, el) { if (this.dragging) { this.dragging = false; this.currentDragParams.onDragStop(eventOrTouch); this.eventSvc.dispatchEvent({ type: 'dragStopped', target: el, }); } this.resetDragProperties(); } cancelDrag(el) { this.eventSvc.dispatchEvent({ type: 'dragCancelled', target: el, }); this.currentDragParams?.onDragCancel?.(); this.resetDragProperties(); } resetDragProperties() { this.mouseStartEvent = null; this.startTarget = null; this.touchStart = null; this.touchLastTime = null; this.currentDragParams = null; const { dragEndFunctions } = this; dragEndFunctions.forEach((func) => func()); dragEndFunctions.length = 0; } } exports.DragService = DragService; /***/ }), /***/ 6843: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.HorizontalResizeService = void 0; const beanStub_1 = __webpack_require__(8731); class HorizontalResizeService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'horizontalResizeSvc'; } addResizeBar(params) { const dragSource = { dragStartPixels: params.dragStartPixels || 0, eElement: params.eResizeBar, onDragStart: this.onDragStart.bind(this, params), onDragStop: this.onDragStop.bind(this, params), onDragging: this.onDragging.bind(this, params), onDragCancel: this.onDragStop.bind(this, params), includeTouch: true, stopPropagationForTouch: true, }; const { dragSvc } = this.beans; dragSvc.addDragSource(dragSource); // we pass remove func back to the caller, so call can tell us when they // are finished, and then we remove the listener from the drag source const finishedWithResizeFunc = () => dragSvc.removeDragSource(dragSource); return finishedWithResizeFunc; } onDragStart(params, mouseEvent) { this.dragStartX = mouseEvent.clientX; this.setResizeIcons(); const shiftKey = mouseEvent instanceof MouseEvent && mouseEvent.shiftKey === true; params.onResizeStart(shiftKey); } setResizeIcons() { const ctrl = this.beans.ctrlsSvc.get('gridCtrl'); // change the body cursor, so when drag moves out of the drag bar, the cursor is still 'resize' (or 'move' ctrl.setResizeCursor(true); // we don't want text selection outside the grid (otherwise it looks weird as text highlights when we move) ctrl.disableUserSelect(true); } onDragStop(params) { params.onResizeEnd(this.resizeAmount); this.resetIcons(); } resetIcons() { const ctrl = this.beans.ctrlsSvc.get('gridCtrl'); ctrl.setResizeCursor(false); ctrl.disableUserSelect(false); } onDragging(params, mouseEvent) { this.resizeAmount = mouseEvent.clientX - this.dragStartX; params.onResizing(this.resizeAmount); } } exports.HorizontalResizeService = HorizontalResizeService; /***/ }), /***/ 1633: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.RowDragComp = void 0; const beanStub_1 = __webpack_require__(8731); const icon_1 = __webpack_require__(9970); const component_1 = __webpack_require__(8020); const dragAndDropService_1 = __webpack_require__(2903); class RowDragComp extends component_1.Component { constructor(cellValueFn, rowNode, column, customGui, dragStartPixels, suppressVisibilityChange) { super(); this.cellValueFn = cellValueFn; this.rowNode = rowNode; this.column = column; this.customGui = customGui; this.dragStartPixels = dragStartPixels; this.suppressVisibilityChange = suppressVisibilityChange; this.dragSource = null; } isCustomGui() { return this.customGui != null; } postConstruct() { const { beans, rowNode, column, gos } = this; if (!this.customGui) { this.setTemplate(/* html */ ``); this.getGui().appendChild((0, icon_1._createIconNoSpan)('rowDrag', beans, null)); this.addDragSource(); } else { this.setDragElement(this.customGui, this.dragStartPixels); } if (!this.suppressVisibilityChange) { const strategy = gos.get('rowDragManaged') ? new ManagedVisibilityStrategy(this, rowNode, column) : new NonManagedVisibilityStrategy(this, rowNode, column); this.createManagedBean(strategy, this.beans.context); } } setDragElement(dragElement, dragStartPixels) { // We set suppressDataRefValidation as the drag element could contain AG Grid comps with data references // that are not part of this row dragger's context. Maybe this should just setGui and not setTemplateFromElement? this.setTemplateFromElement(dragElement, undefined, undefined, true); this.addDragSource(dragStartPixels); } getSelectedNodes() { const rowNode = this.rowNode; const isRowDragMultiRow = this.gos.get('rowDragMultiRow'); if (!isRowDragMultiRow) { return [rowNode]; } const selection = this.beans.selectionSvc?.getSelectedNodes() ?? []; return selection.indexOf(rowNode) !== -1 ? selection : [rowNode]; } getDragItem() { const { column, rowNode } = this; return { rowNode, rowNodes: this.getSelectedNodes(), columns: column ? [column] : undefined, defaultTextValue: this.cellValueFn(), }; } getRowDragText(column) { if (column) { const colDef = column.getColDef(); if (colDef.rowDragText) { return colDef.rowDragText; } } return this.gos.get('rowDragText'); } addDragSource(dragStartPixels = 4) { // if this is changing the drag element, delete the previous dragSource if (this.dragSource) { this.removeDragSource(); } const eGui = this.getGui(); if (this.gos.get('enableCellTextSelection')) { this.removeMouseDownListener(); this.mouseDownListener = this.addManagedElementListeners(eGui, { mousedown: (e) => { e?.preventDefault(); }, })[0]; } const translate = this.getLocaleTextFunc(); this.dragSource = { type: dragAndDropService_1.DragSourceType.RowDrag, eElement: eGui, dragItemName: () => { const dragItem = this.getDragItem(); const dragItemCount = dragItem.rowNodes?.length || 1; const rowDragText = this.getRowDragText(this.column); if (rowDragText) { return rowDragText(dragItem, dragItemCount); } return dragItemCount === 1 ? this.cellValueFn() : `${dragItemCount} ${translate('rowDragRows', 'rows')}`; }, getDragItem: () => this.getDragItem(), dragStartPixels, dragSourceDomDataKey: this.gos.getDomDataKey(), }; this.beans.dragAndDrop.addDragSource(this.dragSource, true); } destroy() { this.removeDragSource(); this.removeMouseDownListener(); super.destroy(); } removeDragSource() { if (!this.dragSource) { return; } this.beans.dragAndDrop.removeDragSource(this.dragSource); this.dragSource = null; } removeMouseDownListener() { if (!this.mouseDownListener) { return; } this.mouseDownListener(); this.mouseDownListener = undefined; } } exports.RowDragComp = RowDragComp; class VisibilityStrategy extends beanStub_1.BeanStub { constructor(parent, rowNode, column) { super(); this.parent = parent; this.rowNode = rowNode; this.column = column; } setDisplayedOrVisible(neverDisplayed) { const displayedOptions = { skipAriaHidden: true }; if (neverDisplayed) { this.parent.setDisplayed(false, displayedOptions); } else { let shown = true; let isShownSometimes = false; const { column, rowNode, parent } = this; if (column) { shown = column.isRowDrag(rowNode) || parent.isCustomGui(); isShownSometimes = typeof column.getColDef().rowDrag === 'function'; } // if shown sometimes, them some rows can have drag handle while other don't, // so we use setVisible to keep the handles horizontally aligned (as _setVisible // keeps the empty space, whereas setDisplayed looses the space) if (isShownSometimes) { parent.setDisplayed(true, displayedOptions); parent.setVisible(shown, displayedOptions); } else { parent.setDisplayed(shown, displayedOptions); parent.setVisible(true, displayedOptions); } } } } // when non managed, the visibility depends on suppressRowDrag property only class NonManagedVisibilityStrategy extends VisibilityStrategy { postConstruct() { this.addManagedPropertyListener('suppressRowDrag', this.onSuppressRowDrag.bind(this)); // in case data changes, then we need to update visibility of drag item const listener = this.workOutVisibility.bind(this); this.addManagedListeners(this.rowNode, { dataChanged: listener, cellChanged: listener, }); this.addManagedListeners(this.beans.eventSvc, { newColumnsLoaded: listener }); this.workOutVisibility(); } onSuppressRowDrag() { this.workOutVisibility(); } workOutVisibility() { // only show the drag if both sort and filter are not present const neverDisplayed = this.gos.get('suppressRowDrag'); this.setDisplayedOrVisible(neverDisplayed); } } // when managed, the visibility depends on sort, filter and row group, as well as suppressRowDrag property class ManagedVisibilityStrategy extends VisibilityStrategy { postConstruct() { const listener = this.workOutVisibility.bind(this); // we do not show the component if sort, filter or grouping is active this.addManagedListeners(this.beans.eventSvc, { sortChanged: listener, filterChanged: listener, columnRowGroupChanged: listener, newColumnsLoaded: listener, }); // in case data changes, then we need to update visibility of drag item this.addManagedListeners(this.rowNode, { dataChanged: listener, cellChanged: listener, }); this.addManagedPropertyListener('suppressRowDrag', this.onSuppressRowDrag.bind(this)); this.workOutVisibility(); } onSuppressRowDrag() { this.workOutVisibility(); } workOutVisibility() { const { rowDragSvc, dragAndDrop, gos } = this.beans; // only show the drag if both sort and filter are not present const rowDragFeature = rowDragSvc.rowDragFeature; const shouldPreventRowMove = rowDragFeature && rowDragFeature.shouldPreventRowMove(); const suppressRowDrag = gos.get('suppressRowDrag'); const hasExternalDropZones = dragAndDrop.hasExternalDropZones(); const neverDisplayed = (shouldPreventRowMove && !hasExternalDropZones) || suppressRowDrag; this.setDisplayedOrVisible(neverDisplayed); } } /***/ }), /***/ 2254: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.RowDragFeature = void 0; const autoScrollService_1 = __webpack_require__(5628); const beanStub_1 = __webpack_require__(8731); const positionUtils_1 = __webpack_require__(6257); const mouseEventUtils_1 = __webpack_require__(8399); const gridOptionsUtils_1 = __webpack_require__(7274); const array_1 = __webpack_require__(1502); const logging_1 = __webpack_require__(7764); const dragAndDropService_1 = __webpack_require__(2903); class RowDragFeature extends beanStub_1.BeanStub { constructor(eContainer) { super(); this.eContainer = eContainer; } postConstruct() { const { rowModel, gos, ctrlsSvc } = this.beans; if ((0, gridOptionsUtils_1._isClientSideRowModel)(gos, rowModel)) { this.clientSideRowModel = rowModel; } ctrlsSvc.whenReady(this, (p) => { const gridBodyCon = p.gridBodyCtrl; this.autoScrollService = new autoScrollService_1.AutoScrollService({ scrollContainer: gridBodyCon.eBodyViewport, scrollAxis: 'y', getVerticalPosition: () => gridBodyCon.scrollFeature.getVScrollPosition().top, setVerticalPosition: (position) => gridBodyCon.scrollFeature.setVerticalScrollPosition(position), onScrollCallback: () => { this.onDragging(this.lastDraggingEvent); }, }); }); } getContainer() { return this.eContainer; } isInterestedIn(type) { return type === dragAndDropService_1.DragSourceType.RowDrag; } getIconName() { const managedDrag = this.gos.get('rowDragManaged'); if (managedDrag && this.shouldPreventRowMove()) { return 'notAllowed'; } return 'move'; } shouldPreventRowMove() { const { rowGroupColsSvc, filterManager, sortSvc } = this.beans; const rowGroupCols = rowGroupColsSvc?.columns ?? []; if (rowGroupCols.length) { return true; } const isFilterPresent = filterManager?.isAnyFilterPresent(); if (isFilterPresent) { return true; } const isSortActive = sortSvc?.isSortActive(); if (isSortActive) { return true; } return false; } getRowNodes(draggingEvent) { if (!this.isFromThisGrid(draggingEvent)) { return (draggingEvent.dragItem.rowNodes || []); } const currentNode = draggingEvent.dragItem.rowNode; const isRowDragMultiRow = this.gos.get('rowDragMultiRow'); if (isRowDragMultiRow) { const selectedNodes = [...(this.beans.selectionSvc?.getSelectedNodes() ?? [])].sort((a, b) => { if (a.rowIndex == null || b.rowIndex == null) { return 0; } return this.getRowIndexNumber(a) - this.getRowIndexNumber(b); }); if (selectedNodes.indexOf(currentNode) !== -1) { return selectedNodes; } } return [currentNode]; } onDragEnter(draggingEvent) { // builds a lits of all rows being dragged before firing events draggingEvent.dragItem.rowNodes = this.getRowNodes(draggingEvent); // when entering, we fire the enter event, then in onEnterOrDragging, // we also fire the move event. so we get both events when entering. this.dispatchGridEvent('rowDragEnter', draggingEvent); this.getRowNodes(draggingEvent).forEach((rowNode) => { this.setRowNodeDragging(rowNode, true); }); this.onEnterOrDragging(draggingEvent); } onDragging(draggingEvent) { this.onEnterOrDragging(draggingEvent); } isFromThisGrid(draggingEvent) { const { dragSourceDomDataKey } = draggingEvent.dragSource; return dragSourceDomDataKey === this.gos.getDomDataKey(); } onEnterOrDragging(draggingEvent) { // this event is fired for enter and move this.dispatchGridEvent('rowDragMove', draggingEvent); this.lastDraggingEvent = draggingEvent; const pixel = (0, mouseEventUtils_1._getNormalisedMousePosition)(this.beans, draggingEvent).y; const managedDrag = this.gos.get('rowDragManaged'); if (managedDrag) { this.doManagedDrag(draggingEvent, pixel); } this.autoScrollService.check(draggingEvent.event); } doManagedDrag(draggingEvent, pixel) { const { dragAndDrop, gos } = this.beans; const isFromThisGrid = this.isFromThisGrid(draggingEvent); const managedDrag = gos.get('rowDragManaged'); const rowNodes = draggingEvent.dragItem.rowNodes; if (managedDrag && this.shouldPreventRowMove()) { return; } if (gos.get('suppressMoveWhenRowDragging') || !isFromThisGrid) { if (dragAndDrop.isDropZoneWithinThisGrid(draggingEvent)) { this.clientSideRowModel.highlightRowAtPixel(rowNodes[0], pixel); } } else { this.moveRows(rowNodes, pixel); } } getRowIndexNumber(rowNode) { const rowIndexStr = rowNode.getRowIndexString(); return parseInt((0, array_1._last)(rowIndexStr.split('-')), 10); } moveRowAndClearHighlight(draggingEvent) { const clientSideRowModel = this.clientSideRowModel; const lastHighlightedRowNode = clientSideRowModel.getLastHighlightedRowNode(); const isBelow = lastHighlightedRowNode && lastHighlightedRowNode.highlighted === 'Below'; const pixel = (0, mouseEventUtils_1._getNormalisedMousePosition)(this.beans, draggingEvent).y; const rowNodes = draggingEvent.dragItem.rowNodes; let increment = isBelow ? 1 : 0; if (this.isFromThisGrid(draggingEvent)) { rowNodes.forEach((rowNode) => { if (rowNode.rowTop < pixel) { increment -= 1; } }); this.moveRows(rowNodes, pixel, increment); } else { const getRowIdFunc = (0, gridOptionsUtils_1._getRowIdCallback)(this.gos); let addIndex = clientSideRowModel.getRowIndexAtPixel(pixel) + 1; if (clientSideRowModel.getHighlightPosition(pixel) === 'Above') { addIndex--; } clientSideRowModel.updateRowData({ add: rowNodes .filter((node) => !clientSideRowModel.getRowNode(getRowIdFunc?.({ data: node.data, level: 0, rowPinned: node.rowPinned }) ?? node.data.id)) .map((node) => node.data), addIndex, }); } this.clearRowHighlight(); } clearRowHighlight() { this.clientSideRowModel.highlightRowAtPixel(null); } moveRows(rowNodes, pixel, increment = 0) { const focusSvc = this.beans.focusSvc; // Get the focussed cell so we can ensure it remains focussed after the move const cellPosition = focusSvc.getFocusedCell(); const cellCtrl = cellPosition && (0, positionUtils_1._getCellByPosition)(this.beans, cellPosition); const rowWasMoved = this.clientSideRowModel.ensureRowsAtPixel(rowNodes, pixel, increment); if (rowWasMoved) { if (cellCtrl) { cellCtrl.focusCell(); } else { focusSvc.clearFocusedCell(); } } } addRowDropZone(params) { if (!params.getContainer()) { (0, logging_1._warn)(55); return; } const dragAndDrop = this.beans.dragAndDrop; if (dragAndDrop.findExternalZone(params)) { (0, logging_1._warn)(56); return; } let processedParams = { getContainer: params.getContainer, }; if (params.fromGrid) { processedParams = params; } else { if (params.onDragEnter) { processedParams.onDragEnter = (e) => { params.onDragEnter(this.draggingToRowDragEvent('rowDragEnter', e)); }; } if (params.onDragLeave) { processedParams.onDragLeave = (e) => { params.onDragLeave(this.draggingToRowDragEvent('rowDragLeave', e)); }; } if (params.onDragging) { processedParams.onDragging = (e) => { params.onDragging(this.draggingToRowDragEvent('rowDragMove', e)); }; } if (params.onDragStop) { processedParams.onDragStop = (e) => { params.onDragStop(this.draggingToRowDragEvent('rowDragEnd', e)); }; } if (params.onDragCancel) { processedParams.onDragCancel = (e) => { params.onDragCancel(this.draggingToRowDragEvent('rowDragCancel', e)); }; } } const dropTarget = { isInterestedIn: (type) => type === dragAndDropService_1.DragSourceType.RowDrag, getIconName: () => 'move', external: true, ...processedParams, }; dragAndDrop.addDropTarget(dropTarget); this.addDestroyFunc(() => dragAndDrop.removeDropTarget(dropTarget)); } getRowDropZone(events) { const getContainer = this.getContainer.bind(this); const onDragEnter = this.onDragEnter.bind(this); const onDragLeave = this.onDragLeave.bind(this); const onDragging = this.onDragging.bind(this); const onDragStop = this.onDragStop.bind(this); const onDragCancel = this.onDragCancel.bind(this); let params; if (!events) { params = { getContainer, onDragEnter, onDragLeave, onDragging, onDragStop, onDragCancel, /* @private */ fromGrid: true, }; } else { params = { getContainer, onDragEnter: events.onDragEnter ? (e) => { onDragEnter(e); events.onDragEnter(this.draggingToRowDragEvent('rowDragEnter', e)); } : onDragEnter, onDragLeave: events.onDragLeave ? (e) => { onDragLeave(e); events.onDragLeave(this.draggingToRowDragEvent('rowDragLeave', e)); } : onDragLeave, onDragging: events.onDragging ? (e) => { onDragging(e); events.onDragging(this.draggingToRowDragEvent('rowDragMove', e)); } : onDragging, onDragStop: events.onDragStop ? (e) => { onDragStop(e); events.onDragStop(this.draggingToRowDragEvent('rowDragEnd', e)); } : onDragStop, onDragCancel: events.onDragCancel ? (e) => { onDragCancel(e); events.onDragCancel(this.draggingToRowDragEvent('rowDragCancel', e)); } : onDragCancel, fromGrid: true /* @private */, }; } // Cast to RowDropZoneParams to hide the internal properties return params; } draggingToRowDragEvent(type, draggingEvent) { const beans = this.beans; const { pageBounds, rowModel, gos } = beans; const yNormalised = (0, mouseEventUtils_1._getNormalisedMousePosition)(beans, draggingEvent).y; const mouseIsPastLastRow = yNormalised > pageBounds.getCurrentPageHeight(); let overIndex = -1; let overNode; if (!mouseIsPastLastRow) { overIndex = rowModel.getRowIndexAtPixel(yNormalised); overNode = rowModel.getRow(overIndex); } const event = (0, gridOptionsUtils_1._addGridCommonParams)(gos, { type: type, event: draggingEvent.event, node: draggingEvent.dragItem.rowNode, nodes: draggingEvent.dragItem.rowNodes, overIndex: overIndex, overNode: overNode, y: yNormalised, vDirection: draggingEvent.vDirection, }); return event; } dispatchGridEvent(type, draggingEvent) { const event = this.draggingToRowDragEvent(type, draggingEvent); this.eventSvc.dispatchEvent(event); } onDragLeave(draggingEvent) { this.dispatchGridEvent('rowDragLeave', draggingEvent); this.stopDragging(draggingEvent); if (this.gos.get('rowDragManaged')) { this.clearRowHighlight(); } } onDragStop(draggingEvent) { this.dispatchGridEvent('rowDragEnd', draggingEvent); this.stopDragging(draggingEvent); const { dragAndDrop, gos } = this.beans; if (gos.get('rowDragManaged') && (gos.get('suppressMoveWhenRowDragging') || !this.isFromThisGrid(draggingEvent)) && dragAndDrop.isDropZoneWithinThisGrid(draggingEvent)) { this.moveRowAndClearHighlight(draggingEvent); } } onDragCancel(draggingEvent) { this.dispatchGridEvent('rowDragCancel', draggingEvent); this.stopDragging(draggingEvent); const { dragAndDrop, gos } = this.beans; if (gos.get('rowDragManaged') && (gos.get('suppressMoveWhenRowDragging') || !this.isFromThisGrid(draggingEvent)) && dragAndDrop.isDropZoneWithinThisGrid(draggingEvent)) { this.clearRowHighlight(); } } stopDragging(draggingEvent) { this.autoScrollService.ensureCleared(); this.getRowNodes(draggingEvent).forEach((rowNode) => { this.setRowNodeDragging(rowNode, false); }); } setRowNodeDragging(rowNode, dragging) { if (rowNode.dragging !== dragging) { rowNode.dragging = dragging; rowNode.dispatchRowEvent('draggingChanged'); } } } exports.RowDragFeature = RowDragFeature; /***/ }), /***/ 2895: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.RowDragService = void 0; const beanStub_1 = __webpack_require__(8731); const gridOptionsUtils_1 = __webpack_require__(7274); const rowDragComp_1 = __webpack_require__(1633); const rowDragFeature_1 = __webpack_require__(2254); class RowDragService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'rowDragSvc'; } setupRowDrag(element, ctrl) { const rowDragFeature = ctrl.createManagedBean(new rowDragFeature_1.RowDragFeature(element)); const dragAndDrop = this.beans.dragAndDrop; dragAndDrop.addDropTarget(rowDragFeature); ctrl.addDestroyFunc(() => dragAndDrop.removeDropTarget(rowDragFeature)); this.rowDragFeature = rowDragFeature; } createRowDragComp(cellValueFn, rowNode, column, customGui, dragStartPixels, suppressVisibilityChange) { return new rowDragComp_1.RowDragComp(cellValueFn, rowNode, column, customGui, dragStartPixels, suppressVisibilityChange); } createRowDragCompForRow(rowNode, element) { if ((0, gridOptionsUtils_1._isCellSelectionEnabled)(this.gos)) { return undefined; } const translate = this.getLocaleTextFunc(); return this.createRowDragComp(() => `1 ${translate('rowDragRow', 'row')}`, rowNode, undefined, element, undefined, true); } createRowDragCompForCell(rowNode, column, cellValueFn, element, dragStartPixels, suppressVisibilityChange) { const gos = this.gos; if (gos.get('rowDragManaged')) { // row dragging only available in default row model and when not using pagination if (!(0, gridOptionsUtils_1._isClientSideRowModel)(gos) || gos.get('pagination')) { return undefined; } } // otherwise (normal case) we are creating a RowDraggingComp for the first time const rowDragComp = this.createRowDragComp(cellValueFn, rowNode, column, element, dragStartPixels, suppressVisibilityChange); return rowDragComp; } } exports.RowDragService = RowDragService; /***/ }), /***/ 6564: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.cellEditingCSS = void 0; exports.cellEditingCSS = `.ag-cell-inline-editing{border:var(--ag-cell-editing-border)!important;border-radius:var(--ag-border-radius);box-shadow:var(--ag-cell-editing-shadow);padding:0;z-index:1;.ag-cell-edit-wrapper,.ag-cell-editor,.ag-cell-wrapper,:where(.ag-cell-editor) .ag-input-field-input,:where(.ag-cell-editor) .ag-wrapper{height:100%;line-height:normal;width:100%}}:where(.ag-popup-editor) .ag-large-text{background-color:var(--ag-background-color);border-radius:var(--ag-border-radius);box-shadow:var(--ag-dropdown-shadow);padding:0}.ag-large-text-input{height:auto;padding:var(--ag-cell-horizontal-padding)}:where(.ag-rtl .ag-large-text-input) textarea{resize:none}:where(.ag-ltr) .ag-checkbox-edit{padding-left:var(--ag-cell-horizontal-padding)}:where(.ag-rtl) .ag-checkbox-edit{padding-right:var(--ag-cell-horizontal-padding)}`; /***/ }), /***/ 227: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.CheckboxCellEditor = void 0; const aria_1 = __webpack_require__(5230); const agCheckbox_1 = __webpack_require__(66); const component_1 = __webpack_require__(8020); const popupComponent_1 = __webpack_require__(3598); class CheckboxCellEditor extends popupComponent_1.PopupComponent { constructor() { super( /* html */ `
`, [agCheckbox_1.AgCheckboxSelector]); this.eCheckbox = component_1.RefPlaceholder; } init(params) { this.params = params; const isSelected = params.value ?? undefined; const eCheckbox = this.eCheckbox; eCheckbox.setValue(isSelected); const inputEl = eCheckbox.getInputElement(); inputEl.setAttribute('tabindex', '-1'); this.setAriaLabel(isSelected); this.addManagedListeners(eCheckbox, { fieldValueChanged: (event) => this.setAriaLabel(event.selected), }); } getValue() { return this.eCheckbox.getValue(); } focusIn() { this.eCheckbox.getFocusableElement().focus(); } afterGuiAttached() { if (this.params.cellStartedEdit) { this.focusIn(); } } isPopup() { return false; } setAriaLabel(isSelected) { const translate = this.getLocaleTextFunc(); const stateName = (0, aria_1._getAriaCheckboxStateName)(translate, isSelected); const ariaLabel = translate('ariaToggleCellValue', 'Press SPACE to toggle cell value'); this.eCheckbox.setInputAriaLabel(`${ariaLabel} (${stateName})`); } } exports.CheckboxCellEditor = CheckboxCellEditor; /***/ }), /***/ 5314: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.DateCellEditor = void 0; const date_1 = __webpack_require__(9827); const generic_1 = __webpack_require__(4422); const agInputDateField_1 = __webpack_require__(3611); const simpleCellEditor_1 = __webpack_require__(5336); class DateCellEditorInput { getTemplate() { return /* html */ ``; } getAgComponents() { return [agInputDateField_1.AgInputDateFieldSelector]; } init(eInput, params) { this.eInput = eInput; this.params = params; const { min, max, step } = params; if (min != null) { eInput.setMin(min); } if (max != null) { eInput.setMax(max); } if (step != null) { eInput.setStep(step); } } getValue() { const { eInput, params } = this; const value = eInput.getDate(); if (!(0, generic_1._exists)(value) && !(0, generic_1._exists)(params.value)) { return params.value; } return value ?? null; } getStartValue() { const { value } = this.params; if (!(value instanceof Date)) { return undefined; } return (0, date_1._serialiseDate)(value, false); } } class DateCellEditor extends simpleCellEditor_1.SimpleCellEditor { constructor() { super(new DateCellEditorInput()); } } exports.DateCellEditor = DateCellEditor; /***/ }), /***/ 2059: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.DateStringCellEditor = void 0; const date_1 = __webpack_require__(9827); const generic_1 = __webpack_require__(4422); const agInputDateField_1 = __webpack_require__(3611); const simpleCellEditor_1 = __webpack_require__(5336); class DateStringCellEditorInput { constructor(getDataTypeService) { this.getDataTypeService = getDataTypeService; } getTemplate() { return /* html */ ``; } getAgComponents() { return [agInputDateField_1.AgInputDateFieldSelector]; } init(eInput, params) { this.eInput = eInput; this.params = params; const { min, max, step } = params; if (min != null) { eInput.setMin(min); } if (max != null) { eInput.setMax(max); } if (step != null) { eInput.setStep(step); } } getValue() { const { params, eInput } = this; const value = this.formatDate(eInput.getDate()); if (!(0, generic_1._exists)(value) && !(0, generic_1._exists)(params.value)) { return params.value; } return params.parseValue(value ?? ''); } getStartValue() { return (0, date_1._serialiseDate)(this.parseDate(this.params.value ?? undefined) ?? null, false); } parseDate(value) { const dataTypeSvc = this.getDataTypeService(); return dataTypeSvc ? dataTypeSvc.getDateParserFunction(this.params.column)(value) : (0, date_1._parseDateTimeFromString)(value) ?? undefined; } formatDate(value) { const dataTypeSvc = this.getDataTypeService(); return dataTypeSvc ? dataTypeSvc.getDateFormatterFunction(this.params.column)(value) : (0, date_1._serialiseDate)(value ?? null, false) ?? undefined; } } class DateStringCellEditor extends simpleCellEditor_1.SimpleCellEditor { constructor() { super(new DateStringCellEditorInput(() => this.beans.dataTypeSvc)); } } exports.DateStringCellEditor = DateStringCellEditor; /***/ }), /***/ 4578: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.LargeTextCellEditor = void 0; const keyCode_1 = __webpack_require__(9853); const generic_1 = __webpack_require__(4422); const agInputTextArea_1 = __webpack_require__(6209); const component_1 = __webpack_require__(8020); const popupComponent_1 = __webpack_require__(3598); class LargeTextCellEditor extends popupComponent_1.PopupComponent { constructor() { super( /* html */ `
`, [agInputTextArea_1.AgInputTextAreaSelector]); this.eTextArea = component_1.RefPlaceholder; } init(params) { this.params = params; this.focusAfterAttached = params.cellStartedEdit; this.eTextArea .setMaxLength(params.maxLength || 200) .setCols(params.cols || 60) .setRows(params.rows || 10); if (params.value != null) { this.eTextArea.setValue(params.value.toString(), true); } this.addGuiEventListener('keydown', this.onKeyDown.bind(this)); this.activateTabIndex(); } onKeyDown(event) { const key = event.key; if (key === keyCode_1.KeyCode.LEFT || key === keyCode_1.KeyCode.UP || key === keyCode_1.KeyCode.RIGHT || key === keyCode_1.KeyCode.DOWN || (event.shiftKey && key === keyCode_1.KeyCode.ENTER)) { // shift+enter allows for newlines event.stopPropagation(); } } afterGuiAttached() { const translate = this.getLocaleTextFunc(); this.eTextArea.setInputAriaLabel(translate('ariaInputEditor', 'Input Editor')); if (this.focusAfterAttached) { this.eTextArea.getFocusableElement().focus(); } } getValue() { const value = this.eTextArea.getValue(); const params = this.params; if (!(0, generic_1._exists)(value) && !(0, generic_1._exists)(params.value)) { return params.value; } return params.parseValue(value); } } exports.LargeTextCellEditor = LargeTextCellEditor; /***/ }), /***/ 4371: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.NumberCellEditor = void 0; const keyCode_1 = __webpack_require__(9853); const browser_1 = __webpack_require__(8667); const generic_1 = __webpack_require__(4422); const agInputNumberField_1 = __webpack_require__(8792); const simpleCellEditor_1 = __webpack_require__(5336); class NumberCellEditorInput { getTemplate() { return /* html */ ``; } getAgComponents() { return [agInputNumberField_1.AgInputNumberFieldSelector]; } init(eInput, params) { this.eInput = eInput; this.params = params; const { max, min, precision, step } = params; if (max != null) { eInput.setMax(max); } if (min != null) { eInput.setMin(min); } if (precision != null) { eInput.setPrecision(precision); } if (step != null) { eInput.setStep(step); } const inputEl = eInput.getInputElement(); if (params.preventStepping) { eInput.addManagedElementListeners(inputEl, { keydown: this.preventStepping }); } else if (params.showStepperButtons) { inputEl.classList.add('ag-number-field-input-stepper'); } } preventStepping(e) { if (e.key === keyCode_1.KeyCode.UP || e.key === keyCode_1.KeyCode.DOWN) { e.preventDefault(); } } getValue() { const { eInput, params } = this; const value = eInput.getValue(); if (!(0, generic_1._exists)(value) && !(0, generic_1._exists)(params.value)) { return params.value; } let parsedValue = params.parseValue(value); if (parsedValue == null) { return parsedValue; } if (typeof parsedValue === 'string') { if (parsedValue === '') { return null; } parsedValue = Number(parsedValue); } return isNaN(parsedValue) ? null : parsedValue; } getStartValue() { return this.params.value; } setCaret() { if ((0, browser_1._isBrowserSafari)()) { // If not safari, input is already focused. // For safari we need to focus only for this use case to avoid AG-3238, // but still ensure the input has focus. this.eInput.getInputElement().focus({ preventScroll: true }); } } } class NumberCellEditor extends simpleCellEditor_1.SimpleCellEditor { constructor() { super(new NumberCellEditorInput()); } } exports.NumberCellEditor = NumberCellEditor; /***/ }), /***/ 5609: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.PopupEditorWrapper = void 0; const gridOptionsUtils_1 = __webpack_require__(7274); const keyboard_1 = __webpack_require__(6466); const popupComponent_1 = __webpack_require__(3598); class PopupEditorWrapper extends popupComponent_1.PopupComponent { constructor(params) { super(/* html */ `
`); this.params = params; } postConstruct() { (0, gridOptionsUtils_1._setDomData)(this.gos, this.getGui(), 'popupEditorWrapper', true); this.addKeyDownListener(); } addKeyDownListener() { const eGui = this.getGui(); const params = this.params; const listener = (event) => { if (!(0, keyboard_1._isUserSuppressingKeyboardEvent)(this.gos, event, params.node, params.column, true)) { params.onKeyDown(event); } }; this.addManagedElementListeners(eGui, { keydown: listener }); } } exports.PopupEditorWrapper = PopupEditorWrapper; /***/ }), /***/ 8774: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.SelectCellEditor = void 0; const keyCode_1 = __webpack_require__(9853); const generic_1 = __webpack_require__(4422); const logging_1 = __webpack_require__(7764); const agSelect_1 = __webpack_require__(159); const component_1 = __webpack_require__(8020); const popupComponent_1 = __webpack_require__(3598); class SelectCellEditor extends popupComponent_1.PopupComponent { wireBeans(beans) { this.valueSvc = beans.valueSvc; } constructor() { super( /* html */ `
`, [agSelect_1.AgSelectSelector]); this.eSelect = component_1.RefPlaceholder; this.startedByEnter = false; } init(params) { this.focusAfterAttached = params.cellStartedEdit; const { eSelect, valueSvc, gos } = this; const { values, value, eventKey } = params; if ((0, generic_1._missing)(values)) { (0, logging_1._warn)(58); return; } this.startedByEnter = eventKey != null ? eventKey === keyCode_1.KeyCode.ENTER : false; let hasValue = false; values.forEach((currentValue) => { const option = { value: currentValue }; const valueFormatted = valueSvc.formatValue(params.column, null, currentValue); const valueFormattedExits = valueFormatted !== null && valueFormatted !== undefined; option.text = valueFormattedExits ? valueFormatted : currentValue; eSelect.addOption(option); hasValue = hasValue || value === currentValue; }); if (hasValue) { eSelect.setValue(params.value, true); } else if (params.values.length) { eSelect.setValue(params.values[0], true); } const { valueListGap, valueListMaxWidth, valueListMaxHeight } = params; if (valueListGap != null) { eSelect.setPickerGap(valueListGap); } if (valueListMaxHeight != null) { eSelect.setPickerMaxHeight(valueListMaxHeight); } if (valueListMaxWidth != null) { eSelect.setPickerMaxWidth(valueListMaxWidth); } // we don't want to add this if full row editing, otherwise selecting will stop the // full row editing. if (gos.get('editType') !== 'fullRow') { this.addManagedListeners(this.eSelect, { selectedItem: () => params.stopEditing() }); } } afterGuiAttached() { if (this.focusAfterAttached) { this.eSelect.getFocusableElement().focus(); } if (this.startedByEnter) { setTimeout(() => { if (this.isAlive()) { this.eSelect.showPicker(); } }); } } focusIn() { this.eSelect.getFocusableElement().focus(); } getValue() { return this.eSelect.getValue(); } isPopup() { return false; } } exports.SelectCellEditor = SelectCellEditor; /***/ }), /***/ 5336: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.SimpleCellEditor = void 0; const keyCode_1 = __webpack_require__(9853); const browser_1 = __webpack_require__(8667); const component_1 = __webpack_require__(8020); const popupComponent_1 = __webpack_require__(3598); class SimpleCellEditor extends popupComponent_1.PopupComponent { constructor(cellEditorInput) { super( /* html */ `
${cellEditorInput.getTemplate()}
`, cellEditorInput.getAgComponents()); this.cellEditorInput = cellEditorInput; this.eInput = component_1.RefPlaceholder; } init(params) { this.params = params; const { cellStartedEdit, eventKey, suppressPreventDefault } = params; const eInput = this.eInput; this.cellEditorInput.init(eInput, params); let startValue; let shouldSetStartValue = true; // cellStartedEdit is only false if we are doing fullRow editing if (cellStartedEdit) { this.focusAfterAttached = true; if (eventKey === keyCode_1.KeyCode.BACKSPACE || eventKey === keyCode_1.KeyCode.DELETE) { startValue = ''; } else if (eventKey && eventKey.length === 1) { if (suppressPreventDefault) { shouldSetStartValue = false; } else { startValue = eventKey; } } else { startValue = this.cellEditorInput.getStartValue(); if (eventKey !== keyCode_1.KeyCode.F2) { this.highlightAllOnFocus = true; } } } else { this.focusAfterAttached = false; startValue = this.cellEditorInput.getStartValue(); } if (shouldSetStartValue && startValue != null) { eInput.setStartValue(startValue); } this.addManagedElementListeners(eInput.getGui(), { keydown: (event) => { const { key } = event; if (key === keyCode_1.KeyCode.PAGE_UP || key === keyCode_1.KeyCode.PAGE_DOWN) { event.preventDefault(); } }, }); } afterGuiAttached() { const translate = this.getLocaleTextFunc(); const eInput = this.eInput; eInput.setInputAriaLabel(translate('ariaInputEditor', 'Input Editor')); if (!this.focusAfterAttached) { return; } // Added for AG-3238. We can't remove this explicit focus() because Chrome requires an input // to be focused before setSelectionRange will work. But it triggers a bug in Safari where // explicitly focusing then blurring an empty field will cause the parent container to scroll. if (!(0, browser_1._isBrowserSafari)()) { eInput.getFocusableElement().focus(); } const inputEl = eInput.getInputElement(); if (this.highlightAllOnFocus) { inputEl.select(); } else { this.cellEditorInput.setCaret?.(); } } // gets called when tabbing through cells and in full row edit mode focusIn() { const eInput = this.eInput; const focusEl = eInput.getFocusableElement(); const inputEl = eInput.getInputElement(); focusEl.focus(); inputEl.select(); } getValue() { return this.cellEditorInput.getValue(); } isPopup() { return false; } } exports.SimpleCellEditor = SimpleCellEditor; /***/ }), /***/ 5457: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.TextCellEditor = void 0; const generic_1 = __webpack_require__(4422); const agInputTextField_1 = __webpack_require__(5946); const simpleCellEditor_1 = __webpack_require__(5336); class TextCellEditorInput { getTemplate() { return /* html */ ``; } getAgComponents() { return [agInputTextField_1.AgInputTextFieldSelector]; } init(eInput, params) { this.eInput = eInput; this.params = params; const maxLength = params.maxLength; if (maxLength != null) { eInput.setMaxLength(maxLength); } } getValue() { const { eInput, params } = this; const value = eInput.getValue(); if (!(0, generic_1._exists)(value) && !(0, generic_1._exists)(params.value)) { return params.value; } return params.parseValue(value); } getStartValue() { const params = this.params; const formatValue = params.useFormatter || params.column.getColDef().refData; return formatValue ? params.formatValue(params.value) : params.value; } setCaret() { // when we started editing, we want the caret at the end, not the start. // this comes into play in two scenarios: // a) when user hits F2 // b) when user hits a printable character const eInput = this.eInput; const value = eInput.getValue(); const len = ((0, generic_1._exists)(value) && value.length) || 0; if (len) { eInput.getInputElement().setSelectionRange(len, len); } } } class TextCellEditor extends simpleCellEditor_1.SimpleCellEditor { constructor() { super(new TextCellEditorInput()); } } exports.TextCellEditor = TextCellEditor; /***/ }), /***/ 89: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getCurrentRedoSize = exports.getCurrentUndoSize = exports.startEditingCell = exports.stopEditing = exports.getEditingCells = exports.getCellEditorInstances = exports.redoCellEditing = exports.undoCellEditing = void 0; const scrollApi_1 = __webpack_require__(1765); const unwrapUserComp_1 = __webpack_require__(4126); const positionUtils_1 = __webpack_require__(6257); const gridOptionsUtils_1 = __webpack_require__(7274); const logging_1 = __webpack_require__(7764); function undoCellEditing(beans) { beans.undoRedo?.undo('api'); } exports.undoCellEditing = undoCellEditing; function redoCellEditing(beans) { beans.undoRedo?.redo('api'); } exports.redoCellEditing = redoCellEditing; function getCellEditorInstances(beans, params = {}) { const res = []; beans.rowRenderer.getCellCtrls(params.rowNodes, params.columns).forEach((cellCtrl) => { const cellEditor = cellCtrl.comp?.getCellEditor(); if (cellEditor) { res.push((0, unwrapUserComp_1._unwrapUserComp)(cellEditor)); } }); return res; } exports.getCellEditorInstances = getCellEditorInstances; function getEditingCells(beans) { const res = []; beans.rowRenderer.getAllCellCtrls().forEach((cellCtrl) => { if (cellCtrl.editing) { const { cellPosition } = cellCtrl; res.push(cellPosition); } }); return res; } exports.getEditingCells = getEditingCells; function stopEditing(beans, cancel = false) { beans.editSvc?.stopAllEditing(cancel); } exports.stopEditing = stopEditing; function startEditingCell(beans, params) { const column = beans.colModel.getCol(params.colKey); if (!column) { (0, logging_1._warn)(12, { colKey: params.colKey }); return; } const cellPosition = { rowIndex: params.rowIndex, rowPinned: params.rowPinned || null, column: column, }; const notPinned = params.rowPinned == null; if (notPinned) { (0, scrollApi_1.ensureIndexVisible)(beans, params.rowIndex); } (0, scrollApi_1.ensureColumnVisible)(beans, params.colKey); const cell = (0, positionUtils_1._getCellByPosition)(beans, cellPosition); if (!cell) { return; } const { focusSvc, gos, editSvc } = beans; const isFocusWithinCell = () => { const activeElement = (0, gridOptionsUtils_1._getActiveDomElement)(beans); const eCell = cell.eGui; return activeElement !== eCell && !!eCell?.contains(activeElement); }; const forceBrowserFocus = gos.get('stopEditingWhenCellsLoseFocus') && isFocusWithinCell(); if (forceBrowserFocus || !focusSvc.isCellFocused(cellPosition)) { focusSvc.setFocusedCell({ ...cellPosition, forceBrowserFocus, preventScrollOnBrowserFocus: true, }); } editSvc?.startRowOrCellEdit(cell, params.key); } exports.startEditingCell = startEditingCell; function getCurrentUndoSize(beans) { return beans.undoRedo?.getCurrentUndoStackSize() ?? 0; } exports.getCurrentUndoSize = getCurrentUndoSize; function getCurrentRedoSize(beans) { return beans.undoRedo?.getCurrentRedoStackSize() ?? 0; } exports.getCurrentRedoSize = getCurrentRedoSize; /***/ }), /***/ 4652: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.CustomEditorModule = exports.LargeTextEditorModule = exports.SelectEditorModule = exports.CheckboxEditorModule = exports.DateEditorModule = exports.NumberEditorModule = exports.TextEditorModule = exports.UndoRedoEditModule = exports.EditCoreModule = void 0; const undoRedoService_1 = __webpack_require__(7113); const version_1 = __webpack_require__(7205); const popupModule_1 = __webpack_require__(3137); const cell_editing_css_GENERATED_1 = __webpack_require__(6564); const checkboxCellEditor_1 = __webpack_require__(227); const dateCellEditor_1 = __webpack_require__(5314); const dateStringCellEditor_1 = __webpack_require__(2059); const largeTextCellEditor_1 = __webpack_require__(4578); const numberCellEditor_1 = __webpack_require__(4371); const selectCellEditor_1 = __webpack_require__(8774); const textCellEditor_1 = __webpack_require__(5457); const editApi_1 = __webpack_require__(89); const editService_1 = __webpack_require__(1277); const rowEditService_1 = __webpack_require__(6359); /** * @internal */ exports.EditCoreModule = { moduleName: 'EditCore', version: version_1.VERSION, beans: [editService_1.EditService, rowEditService_1.RowEditService], apiFunctions: { getCellEditorInstances: editApi_1.getCellEditorInstances, getEditingCells: editApi_1.getEditingCells, stopEditing: editApi_1.stopEditing, startEditingCell: editApi_1.startEditingCell, }, dependsOn: [popupModule_1.PopupModule], css: [cell_editing_css_GENERATED_1.cellEditingCSS], }; /** * @feature Editing -> Undo / Redo Edits */ exports.UndoRedoEditModule = { moduleName: 'UndoRedoEdit', version: version_1.VERSION, beans: [undoRedoService_1.UndoRedoService], apiFunctions: { undoCellEditing: editApi_1.undoCellEditing, redoCellEditing: editApi_1.redoCellEditing, getCurrentUndoSize: editApi_1.getCurrentUndoSize, getCurrentRedoSize: editApi_1.getCurrentRedoSize, }, dependsOn: [exports.EditCoreModule], }; /** * @feature Editing -> Text Editor */ exports.TextEditorModule = { moduleName: 'TextEditor', version: version_1.VERSION, userComponents: { agCellEditor: textCellEditor_1.TextCellEditor, agTextCellEditor: textCellEditor_1.TextCellEditor }, dependsOn: [exports.EditCoreModule], }; /** * @feature Editing -> Number Editor */ exports.NumberEditorModule = { moduleName: 'NumberEditor', version: version_1.VERSION, userComponents: { agNumberCellEditor: { classImp: numberCellEditor_1.NumberCellEditor, params: { suppressPreventDefault: true, }, }, }, dependsOn: [exports.EditCoreModule], }; /** * @feature Editing -> Date Editor */ exports.DateEditorModule = { moduleName: 'DateEditor', version: version_1.VERSION, userComponents: { agDateCellEditor: dateCellEditor_1.DateCellEditor, agDateStringCellEditor: dateStringCellEditor_1.DateStringCellEditor, }, dependsOn: [exports.EditCoreModule], }; /** * @feature Editing -> Checkbox Editor */ exports.CheckboxEditorModule = { moduleName: 'CheckboxEditor', version: version_1.VERSION, userComponents: { agCheckboxCellEditor: checkboxCellEditor_1.CheckboxCellEditor, }, dependsOn: [exports.EditCoreModule], }; /** * @feature Editing -> Select Editor */ exports.SelectEditorModule = { moduleName: 'SelectEditor', version: version_1.VERSION, userComponents: { agSelectCellEditor: selectCellEditor_1.SelectCellEditor }, dependsOn: [exports.EditCoreModule], }; /** * @feature Editing -> Large Text Editor */ exports.LargeTextEditorModule = { moduleName: 'LargeTextEditor', version: version_1.VERSION, userComponents: { agLargeTextCellEditor: largeTextCellEditor_1.LargeTextCellEditor }, dependsOn: [exports.EditCoreModule], }; /** * @feature Editing */ exports.CustomEditorModule = { moduleName: 'CustomEditor', version: version_1.VERSION, dependsOn: [exports.EditCoreModule], }; /***/ }), /***/ 1277: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.EditService = void 0; const userCompUtils_1 = __webpack_require__(2036); const keyCode_1 = __webpack_require__(9853); const beanStub_1 = __webpack_require__(8731); const mouseEventUtils_1 = __webpack_require__(8399); const gridOptionsUtils_1 = __webpack_require__(7274); const browser_1 = __webpack_require__(8667); const popupEditorWrapper_1 = __webpack_require__(5609); class EditService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'editSvc'; } startEditing(cellCtrl, key = null, cellStartedEdit = false, event = null) { if (!cellCtrl.isCellEditable() || cellCtrl.editing) { return true; } // because of async in React, the cellComp may not be set yet, if no cellComp then we are // yet to initialise the cell, so we re-schedule this operation for when celLComp is attached if (!cellCtrl.comp) { cellCtrl.onCompAttachedFuncs.push(() => { this.startEditing(cellCtrl, key, cellStartedEdit, event); }); return true; } const editorParams = this.createCellEditorParams(cellCtrl, key, cellStartedEdit); const colDef = cellCtrl.column.getColDef(); const compDetails = (0, userCompUtils_1._getCellEditorDetails)(this.beans.userCompFactory, colDef, editorParams); // if cellEditorSelector was used, we give preference to popup and popupPosition from the selector const popup = compDetails?.popupFromSelector != null ? compDetails.popupFromSelector : !!colDef.cellEditorPopup; const position = compDetails?.popupPositionFromSelector != null ? compDetails.popupPositionFromSelector : colDef.cellEditorPopupPosition; setEditing(cellCtrl, true, compDetails); cellCtrl.comp.setEditDetails(compDetails, popup, position, this.gos.get('reactiveCustomComponents')); this.eventSvc.dispatchEvent(cellCtrl.createEvent(event, 'cellEditingStarted')); return !compDetails?.params?.suppressPreventDefault; } /** * Ends the Cell Editing * @param cancel `True` if the edit process is being canceled. * @returns `True` if the value of the `GridCell` has been updated, otherwise `False`. */ stopEditing(cellCtrl, cancel = false) { cellCtrl.onEditorAttachedFuncs = []; if (!cellCtrl.editing) { return false; } const { comp: cellComp, column, rowNode } = cellCtrl; const { newValue, newValueExists } = takeValueFromCellEditor(cancel, cellComp); const oldValue = this.beans.valueSvc.getValueForDisplay(column, rowNode); let valueChanged = false; if (newValueExists) { valueChanged = saveNewValue(cellCtrl, oldValue, newValue, rowNode, column); } setEditing(cellCtrl, false, undefined); cellComp.setEditDetails(); // passing nothing stops editing cellCtrl.updateAndFormatValue(false); cellCtrl.refreshCell({ forceRefresh: true, suppressFlash: true }); this.eventSvc.dispatchEvent({ ...cellCtrl.createEvent(null, 'cellEditingStopped'), oldValue, newValue, valueChanged, }); return valueChanged; } handleColDefChanged(cellCtrl) { const cellEditor = cellCtrl.comp?.getCellEditor(); if (cellEditor?.refresh) { const { eventKey, cellStartedEdit } = cellCtrl.editCompDetails.params; const editorParams = this.createCellEditorParams(cellCtrl, eventKey, cellStartedEdit); const colDef = cellCtrl.column.getColDef(); const compDetails = (0, userCompUtils_1._getCellEditorDetails)(this.beans.userCompFactory, colDef, editorParams); cellEditor.refresh(compDetails.params); } } setFocusOutOnEditor(cellCtrl) { if (!cellCtrl.editing) { return; } const cellEditor = cellCtrl.comp.getCellEditor(); if (cellEditor && cellEditor.focusOut) { cellEditor.focusOut(); } } setFocusInOnEditor(cellCtrl) { if (!cellCtrl.editing) { return; } const cellComp = cellCtrl.comp; const cellEditor = cellComp.getCellEditor(); if (cellEditor?.focusIn) { // if the editor is present, then we just focus it cellEditor.focusIn(); } else { // if the editor is not present, it means async cell editor (e.g. React) // and we are trying to set focus before the cell editor is present, so we // focus the cell instead cellCtrl.focusCell(true); cellCtrl.onEditorAttachedFuncs.push(() => cellComp.getCellEditor()?.focusIn?.()); } } stopEditingAndFocus(cellCtrl, suppressNavigateAfterEdit = false, shiftKey = false) { this.stopRowOrCellEdit(cellCtrl); cellCtrl.focusCell(true); if (!suppressNavigateAfterEdit) { this.navigateAfterEdit(shiftKey, cellCtrl.cellPosition); } } createPopupEditorWrapper(params) { return new popupEditorWrapper_1.PopupEditorWrapper(params); } stopAllEditing(cancel = false) { this.beans.rowRenderer.getAllRowCtrls().forEach((rowCtrl) => this.stopRowEditing(rowCtrl, cancel)); } stopRowEditing(rowCtrl, cancel = false) { // if we are already stopping row edit, there is // no need to start this process again. if (rowCtrl.stoppingRowEdit) { return; } const cellControls = rowCtrl.getAllCellCtrls(); const isRowEdit = rowCtrl.editing; rowCtrl.stoppingRowEdit = true; let fireRowEditEvent = false; for (const ctrl of cellControls) { const valueChanged = ctrl.stopEditing(cancel); if (isRowEdit && !cancel && !fireRowEditEvent && valueChanged) { fireRowEditEvent = true; } } if (fireRowEditEvent) { this.eventSvc.dispatchEvent(rowCtrl.createRowEvent('rowValueChanged')); } if (isRowEdit) { this.beans.rowEditSvc?.setEditing(rowCtrl, false); } rowCtrl.stoppingRowEdit = false; } addStopEditingWhenGridLosesFocus(viewports) { if (!this.gos.get('stopEditingWhenCellsLoseFocus')) { return; } const focusOutListener = (event) => { // this is the element the focus is moving to const elementWithFocus = event.relatedTarget; if ((0, browser_1._getTabIndex)(elementWithFocus) === null) { this.stopAllEditing(); return; } let clickInsideGrid = // see if click came from inside the viewports viewports.some((viewport) => viewport.contains(elementWithFocus)) && // and also that it's not from a detail grid (0, mouseEventUtils_1._isElementInThisGrid)(this.gos, elementWithFocus); if (!clickInsideGrid) { const popupSvc = this.beans.popupSvc; clickInsideGrid = !!popupSvc && (popupSvc.getActivePopups().some((popup) => popup.contains(elementWithFocus)) || popupSvc.isElementWithinCustomPopup(elementWithFocus)); } if (!clickInsideGrid) { this.stopAllEditing(); } }; viewports.forEach((viewport) => this.addManagedElementListeners(viewport, { focusout: focusOutListener })); } setInlineEditingCss(rowCtrl) { const editing = rowCtrl.editing || rowCtrl.getAllCellCtrls().some((cellCtrl) => cellCtrl.editing); rowCtrl.forEachGui(undefined, (gui) => { gui.rowComp.addOrRemoveCssClass('ag-row-inline-editing', editing); gui.rowComp.addOrRemoveCssClass('ag-row-not-inline-editing', !editing); }); } isCellEditable(column, rowNode) { if (rowNode.group) { // This is a group - it could be a tree group or a grouping group... if (this.gos.get('treeData')) { // tree - allow editing of groups with data by default. // Allow editing filler nodes (node without data) only if enableGroupEdit is true. if (!rowNode.data && !this.gos.get('enableGroupEdit')) { return false; } } else { // grouping - allow editing of groups if the user has enableGroupEdit option enabled if (!this.gos.get('enableGroupEdit')) { return false; } } } return column.isColumnFunc(rowNode, column.colDef.editable); } // called by rowRenderer when user navigates via tab key startRowOrCellEdit(cellCtrl, key, event = null) { // because of async in React, the cellComp may not be set yet, if no cellComp then we are // yet to initialise the cell, so we re-schedule this operation for when celLComp is attached if (!cellCtrl.comp) { cellCtrl.onCompAttachedFuncs.push(() => { this.startRowOrCellEdit(cellCtrl, key, event); }); return true; } if (this.gos.get('editType') === 'fullRow') { return this.beans.rowEditSvc?.startEditing(cellCtrl.rowCtrl, key, cellCtrl) ?? true; } else { return this.startEditing(cellCtrl, key, true, event); } } // pass in 'true' to cancel the editing. stopRowOrCellEdit(cellCtrl, cancel = false) { if (this.gos.get('editType') === 'fullRow') { this.stopRowEditing(cellCtrl.rowCtrl, cancel); } else { this.stopEditing(cellCtrl, cancel); } } createCellEditorParams(cellCtrl, key, cellStartedEdit) { const { column, rowNode, cellPosition: { rowIndex }, } = cellCtrl; const { valueSvc, gos } = this.beans; return (0, gridOptionsUtils_1._addGridCommonParams)(gos, { value: valueSvc.getValueForDisplay(column, rowNode), eventKey: key, column, colDef: column.getColDef(), rowIndex, node: rowNode, data: rowNode.data, cellStartedEdit: cellStartedEdit, onKeyDown: cellCtrl.onKeyDown.bind(cellCtrl), stopEditing: cellCtrl.stopEditingAndFocus.bind(cellCtrl), eGridCell: cellCtrl.eGui, parseValue: (newValue) => valueSvc.parseValue(column, rowNode, newValue, cellCtrl.value), formatValue: cellCtrl.formatValue.bind(cellCtrl), }); } navigateAfterEdit(shiftKey, cellPosition) { const enterNavigatesVerticallyAfterEdit = this.gos.get('enterNavigatesVerticallyAfterEdit'); if (enterNavigatesVerticallyAfterEdit) { const key = shiftKey ? keyCode_1.KeyCode.UP : keyCode_1.KeyCode.DOWN; this.beans.navigation?.navigateToNextCell(null, key, cellPosition, false); } } } exports.EditService = EditService; function setEditing(cellCtrl, editing, compDetails) { cellCtrl.editCompDetails = compDetails; if (cellCtrl.editing === editing) { return; } cellCtrl.editing = editing; } function takeValueFromCellEditor(cancel, cellComp) { const noValueResult = { newValueExists: false }; if (cancel) { return noValueResult; } const cellEditor = cellComp.getCellEditor(); if (!cellEditor) { return noValueResult; } const userWantsToCancel = cellEditor.isCancelAfterEnd && cellEditor.isCancelAfterEnd(); if (userWantsToCancel) { return noValueResult; } const newValue = cellEditor.getValue(); return { newValue: newValue, newValueExists: true, }; } /** * @returns `True` if the value changes, otherwise `False`. */ function saveNewValue(cellCtrl, oldValue, newValue, rowNode, column) { if (newValue === oldValue) { return false; } // we suppressRefreshCell because the call to rowNode.setDataValue() results in change detection // getting triggered, which results in all cells getting refreshed. we do not want this refresh // to happen on this call as we want to call it explicitly below. otherwise refresh gets called twice. // if we only did this refresh (and not the one below) then the cell would flash and not be forced. cellCtrl.suppressRefreshCell = true; const valueChanged = rowNode.setDataValue(column, newValue, 'edit'); cellCtrl.suppressRefreshCell = false; return valueChanged; } /***/ }), /***/ 6359: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.RowEditService = void 0; const beanStub_1 = __webpack_require__(8731); class RowEditService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'rowEditSvc'; } startEditing(rowCtrl, key = null, sourceRenderedCell = null, event = null) { // don't do it if already editing if (rowCtrl.editing) { return true; } let preventDefault = true; let atLeastOneEditing = false; const { editSvc } = this.beans; rowCtrl.getAllCellCtrls().forEach((cellCtrl) => { const cellStartedEdit = cellCtrl === sourceRenderedCell; if (cellStartedEdit) { preventDefault = editSvc?.startEditing(cellCtrl, key, cellStartedEdit, event) ?? true; } else { editSvc?.startEditing(cellCtrl, null, cellStartedEdit, event); } atLeastOneEditing || (atLeastOneEditing = cellCtrl.editing); }); if (atLeastOneEditing) { this.setEditing(rowCtrl, true); } return preventDefault; } setEditing(rowCtrl, value) { rowCtrl.editing = value; rowCtrl.forEachGui(undefined, (gui) => gui.rowComp.addOrRemoveCssClass('ag-row-editing', value)); const event = value ? rowCtrl.createRowEvent('rowEditingStarted') : rowCtrl.createRowEvent('rowEditingStopped'); this.eventSvc.dispatchEvent(event); } } exports.RowEditService = RowEditService; /***/ }), /***/ 3355: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.AgColumn = exports.isColumn = exports.getNextColInstanceId = void 0; const beanStub_1 = __webpack_require__(8731); const gridOptionsUtils_1 = __webpack_require__(7274); const localEventService_1 = __webpack_require__(5889); const generic_1 = __webpack_require__(4422); const object_1 = __webpack_require__(6996); const string_1 = __webpack_require__(7766); const logging_1 = __webpack_require__(7764); const COL_DEF_DEFAULTS = { resizable: true, sortable: true, }; let instanceIdSequence = 0; function getNextColInstanceId() { return instanceIdSequence++; } exports.getNextColInstanceId = getNextColInstanceId; function isColumn(col) { return col instanceof AgColumn; } exports.isColumn = isColumn; // Wrapper around a user provide column definition. The grid treats the column definition as ready only. // This class contains all the runtime information about a column, plus some logic (the definition has no logic). // This class implements both interfaces ColumnGroupChild and ProvidedColumnGroupChild as the class can // appear as a child of either the original tree or the displayed tree. However the relevant group classes // for each type only implements one, as each group can only appear in it's associated tree (eg ProvidedColumnGroup // can only appear in OriginalColumn tree). class AgColumn extends beanStub_1.BeanStub { constructor(colDef, // We do NOT use this anywhere, we just keep a reference. this is to check object equivalence // when the user provides an updated list of columns - so we can check if we have a column already // existing for a col def. we cannot use the this.colDef as that is the result of a merge. // This is used in ColumnFactory userProvidedColDef, colId, primary) { super(); this.colDef = colDef; this.userProvidedColDef = userProvidedColDef; this.colId = colId; this.primary = primary; this.isColumn = true; // used by React (and possibly other frameworks) as key for rendering. also used to // identify old vs new columns for destroying cols when no longer used. this.instanceId = getNextColInstanceId(); // The measured height of this column's header when autoHeaderHeight is enabled this.autoHeaderHeight = null; this.moving = false; this.menuVisible = false; this.lastLeftPinned = false; this.firstRightPinned = false; this.filterActive = false; this.colEventSvc = new localEventService_1.LocalEventService(); this.tooltipEnabled = false; this.rowGroupActive = false; this.pivotActive = false; this.aggregationActive = false; this.flex = null; this.colIdSanitised = (0, string_1._escapeString)(colId); } destroy() { super.destroy(); this.beans.rowSpanSvc?.deregister(this); } getInstanceId() { return this.instanceId; } setState() { const { colDef, beans: { sortSvc, pinnedCols, colFlex }, } = this; sortSvc?.initCol(this); const hide = colDef.hide; if (hide !== undefined) { this.visible = !hide; } else { this.visible = !colDef.initialHide; } pinnedCols?.initCol(this); colFlex?.initCol(this); } // gets called when user provides an alternative colDef, eg setColDef(colDef, userProvidedColDef, source) { const colSpanChanged = colDef.spanRows !== this.colDef.spanRows; this.colDef = colDef; this.userProvidedColDef = userProvidedColDef; this.initMinAndMaxWidths(); this.initDotNotation(); this.initTooltip(); if (colSpanChanged) { this.beans.rowSpanSvc?.deregister(this); this.initRowSpan(); } this.dispatchColEvent('colDefChanged', source); } getUserProvidedColDef() { return this.userProvidedColDef; } getParent() { return this.parent; } getOriginalParent() { return this.originalParent; } // this is done after constructor as it uses gridOptionsService postConstruct() { this.setState(); this.initMinAndMaxWidths(); this.resetActualWidth('gridInitializing'); this.initDotNotation(); this.initTooltip(); this.initRowSpan(); } initDotNotation() { const { gos, colDef: { field, tooltipField }, } = this; const suppressDotNotation = gos.get('suppressFieldDotNotation'); this.fieldContainsDots = (0, generic_1._exists)(field) && field.indexOf('.') >= 0 && !suppressDotNotation; this.tooltipFieldContainsDots = (0, generic_1._exists)(tooltipField) && tooltipField.indexOf('.') >= 0 && !suppressDotNotation; } initMinAndMaxWidths() { const colDef = this.colDef; this.minWidth = colDef.minWidth ?? this.beans.environment.getDefaultColumnMinWidth(); this.maxWidth = colDef.maxWidth ?? Number.MAX_SAFE_INTEGER; } initTooltip() { this.beans.tooltipSvc?.initCol(this); } initRowSpan() { if (this.colDef.spanRows) { this.beans.rowSpanSvc?.register(this); } } resetActualWidth(source) { const initialWidth = this.calculateColInitialWidth(this.colDef); this.setActualWidth(initialWidth, source, true); } calculateColInitialWidth(colDef) { let width; const colDefWidth = colDef.width; const colDefInitialWidth = colDef.initialWidth; if (colDefWidth != null) { width = colDefWidth; } else if (colDefInitialWidth != null) { width = colDefInitialWidth; } else { width = 200; } return Math.max(Math.min(width, this.maxWidth), this.minWidth); } isEmptyGroup() { return false; } isRowGroupDisplayed(colId) { return this.beans.showRowGroupCols?.isRowGroupDisplayed(this, colId) ?? false; } isPrimary() { return this.primary; } isFilterAllowed() { // filter defined means it's a string, class or true. // if its false, null or undefined then it's false. const filterDefined = !!this.colDef.filter; return filterDefined; } isFieldContainsDots() { return this.fieldContainsDots; } isTooltipEnabled() { return this.tooltipEnabled; } isTooltipFieldContainsDots() { return this.tooltipFieldContainsDots; } getHighlighted() { return this.highlighted; } __addEventListener(eventType, listener) { this.colEventSvc.addEventListener(eventType, listener); } __removeEventListener(eventType, listener) { this.colEventSvc.removeEventListener(eventType, listener); } /** * PUBLIC USE ONLY: for internal use within AG Grid use the `__addEventListener` and `__removeEventListener` methods. */ addEventListener(eventType, userListener) { this.frameworkEventListenerService = this.beans.frameworkOverrides.createLocalEventListenerWrapper?.(this.frameworkEventListenerService, this.colEventSvc); const listener = this.frameworkEventListenerService?.wrap(userListener) ?? userListener; this.colEventSvc.addEventListener(eventType, listener); } /** * PUBLIC USE ONLY: for internal use within AG Grid use the `__addEventListener` and `__removeEventListener` methods. */ removeEventListener(eventType, userListener) { const listener = this.frameworkEventListenerService?.unwrap(userListener) ?? userListener; this.colEventSvc.removeEventListener(eventType, listener); } createColumnFunctionCallbackParams(rowNode) { return (0, gridOptionsUtils_1._addGridCommonParams)(this.gos, { node: rowNode, data: rowNode.data, column: this, colDef: this.colDef, }); } isSuppressNavigable(rowNode) { return this.beans.cellNavigation?.isSuppressNavigable(this, rowNode) ?? false; } isCellEditable(rowNode) { return this.beans.editSvc?.isCellEditable(this, rowNode) ?? false; } isSuppressFillHandle() { return !!this.colDef.suppressFillHandle; } isAutoHeight() { return !!this.colDef.autoHeight; } isAutoHeaderHeight() { return !!this.colDef.autoHeaderHeight; } isRowDrag(rowNode) { return this.isColumnFunc(rowNode, this.colDef.rowDrag); } isDndSource(rowNode) { return this.isColumnFunc(rowNode, this.colDef.dndSource); } isCellCheckboxSelection(rowNode) { return this.beans.selectionSvc?.isCellCheckboxSelection(this, rowNode) ?? false; } isSuppressPaste(rowNode) { return this.isColumnFunc(rowNode, this.colDef?.suppressPaste ?? null); } isResizable() { return !!this.getColDefValue('resizable'); } /** Get value from ColDef or default if it exists. */ getColDefValue(key) { return this.colDef[key] ?? COL_DEF_DEFAULTS[key]; } isColumnFunc(rowNode, value) { // if boolean set, then just use it if (typeof value === 'boolean') { return value; } // if function, then call the function to find out if (typeof value === 'function') { const params = this.createColumnFunctionCallbackParams(rowNode); const editableFunc = value; return editableFunc(params); } return false; } createColumnEvent(type, source) { return (0, gridOptionsUtils_1._addGridCommonParams)(this.gos, { type, column: this, columns: [this], source, }); } isMoving() { return this.moving; } getSort() { return this.sort; } isSortable() { return !!this.getColDefValue('sortable'); } /** @deprecated v32 use col.getSort() === 'asc */ isSortAscending() { return this.sort === 'asc'; } /** @deprecated v32 use col.getSort() === 'desc */ isSortDescending() { return this.sort === 'desc'; } /** @deprecated v32 use col.getSort() === undefined */ isSortNone() { return (0, generic_1._missing)(this.sort); } /** @deprecated v32 use col.getSort() !== undefined */ isSorting() { return (0, generic_1._exists)(this.sort); } getSortIndex() { return this.sortIndex; } isMenuVisible() { return this.menuVisible; } getAggFunc() { return this.aggFunc; } getLeft() { return this.left; } getOldLeft() { return this.oldLeft; } getRight() { return this.left + this.actualWidth; } setLeft(left, source) { this.oldLeft = this.left; if (this.left !== left) { this.left = left; this.dispatchColEvent('leftChanged', source); } } isFilterActive() { return this.filterActive; } /** @deprecated v33 Use `api.isColumnHovered(column)` instead. */ isHovered() { (0, logging_1._warn)(261); return !!this.beans.colHover?.isHovered(this); } setFirstRightPinned(firstRightPinned, source) { if (this.firstRightPinned !== firstRightPinned) { this.firstRightPinned = firstRightPinned; this.dispatchColEvent('firstRightPinnedChanged', source); } } setLastLeftPinned(lastLeftPinned, source) { if (this.lastLeftPinned !== lastLeftPinned) { this.lastLeftPinned = lastLeftPinned; this.dispatchColEvent('lastLeftPinnedChanged', source); } } isFirstRightPinned() { return this.firstRightPinned; } isLastLeftPinned() { return this.lastLeftPinned; } isPinned() { return this.pinned === 'left' || this.pinned === 'right'; } isPinnedLeft() { return this.pinned === 'left'; } isPinnedRight() { return this.pinned === 'right'; } getPinned() { return this.pinned; } setVisible(visible, source) { const newValue = visible === true; if (this.visible !== newValue) { this.visible = newValue; this.dispatchColEvent('visibleChanged', source); } this.dispatchStateUpdatedEvent('hide'); } isVisible() { return this.visible; } isSpanHeaderHeight() { const colDef = this.getColDef(); return !colDef.suppressSpanHeaderHeight; } getColumnGroupPaddingInfo() { let parent = this.getParent(); if (!parent || !parent.isPadding()) { return { numberOfParents: 0, isSpanningTotal: false }; } const numberOfParents = parent.getPaddingLevel() + 1; let isSpanningTotal = true; while (parent) { if (!parent.isPadding()) { isSpanningTotal = false; break; } parent = parent.getParent(); } return { numberOfParents, isSpanningTotal }; } getColDef() { return this.colDef; } getDefinition() { return this.colDef; } getColumnGroupShow() { return this.colDef.columnGroupShow; } getColId() { return this.colId; } getId() { return this.colId; } getUniqueId() { return this.colId; } getActualWidth() { return this.actualWidth; } getAutoHeaderHeight() { return this.autoHeaderHeight; } /** Returns true if the header height has changed */ setAutoHeaderHeight(height) { const changed = height !== this.autoHeaderHeight; this.autoHeaderHeight = height; return changed; } createBaseColDefParams(rowNode) { const params = (0, gridOptionsUtils_1._addGridCommonParams)(this.gos, { node: rowNode, data: rowNode.data, colDef: this.colDef, column: this, }); return params; } getColSpan(rowNode) { if ((0, generic_1._missing)(this.colDef.colSpan)) { return 1; } const params = this.createBaseColDefParams(rowNode); const colSpan = this.colDef.colSpan(params); // colSpan must be number equal to or greater than 1 return Math.max(colSpan, 1); } getRowSpan(rowNode) { if ((0, generic_1._missing)(this.colDef.rowSpan)) { return 1; } const params = this.createBaseColDefParams(rowNode); const rowSpan = this.colDef.rowSpan(params); // rowSpan must be number equal to or greater than 1 return Math.max(rowSpan, 1); } setActualWidth(actualWidth, source, silent = false) { actualWidth = Math.max(actualWidth, this.minWidth); actualWidth = Math.min(actualWidth, this.maxWidth); if (this.actualWidth !== actualWidth) { // disable flex for this column if it was manually resized. this.actualWidth = actualWidth; if (this.flex != null && source !== 'flex' && source !== 'gridInitializing') { this.flex = null; } if (!silent) { this.fireColumnWidthChangedEvent(source); } } this.dispatchStateUpdatedEvent('width'); } fireColumnWidthChangedEvent(source) { this.dispatchColEvent('widthChanged', source); } isGreaterThanMax(width) { return width > this.maxWidth; } getMinWidth() { return this.minWidth; } getMaxWidth() { return this.maxWidth; } getFlex() { return this.flex; } isRowGroupActive() { return this.rowGroupActive; } isPivotActive() { return this.pivotActive; } isAnyFunctionActive() { return this.isPivotActive() || this.isRowGroupActive() || this.isValueActive(); } isAnyFunctionAllowed() { return this.isAllowPivot() || this.isAllowRowGroup() || this.isAllowValue(); } isValueActive() { return this.aggregationActive; } isAllowPivot() { return this.colDef.enablePivot === true; } isAllowValue() { return this.colDef.enableValue === true; } isAllowRowGroup() { return this.colDef.enableRowGroup === true; } dispatchColEvent(type, source, additionalEventAttributes) { const colEvent = this.createColumnEvent(type, source); if (additionalEventAttributes) { (0, object_1._mergeDeep)(colEvent, additionalEventAttributes); } this.colEventSvc.dispatchEvent(colEvent); } dispatchStateUpdatedEvent(key) { this.colEventSvc.dispatchEvent({ type: 'columnStateUpdated', key, }); } } exports.AgColumn = AgColumn; /***/ }), /***/ 6908: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.AgColumnGroup = exports.isColumnGroup = exports.createUniqueColumnGroupId = void 0; const beanStub_1 = __webpack_require__(8731); const array_1 = __webpack_require__(1502); const agColumn_1 = __webpack_require__(3355); function createUniqueColumnGroupId(groupId, instanceId) { return (groupId + '_' + instanceId); } exports.createUniqueColumnGroupId = createUniqueColumnGroupId; function isColumnGroup(col) { return col instanceof AgColumnGroup; } exports.isColumnGroup = isColumnGroup; class AgColumnGroup extends beanStub_1.BeanStub { constructor(providedColumnGroup, groupId, partId, pinned) { super(); this.providedColumnGroup = providedColumnGroup; this.groupId = groupId; this.partId = partId; this.pinned = pinned; this.isColumn = false; // depends on the open/closed state of the group, only displaying columns are stored here this.displayedChildren = []; // The measured height of this column's header when autoHeaderHeight is enabled this.autoHeaderHeight = null; this.parent = null; } // as the user is adding and removing columns, the groups are recalculated. // this reset clears out all children, ready for children to be added again reset() { this.parent = null; this.children = null; this.displayedChildren = null; } getParent() { return this.parent; } getUniqueId() { return createUniqueColumnGroupId(this.groupId, this.partId); } isEmptyGroup() { return this.displayedChildren.length === 0; } isMoving() { const allLeafColumns = this.getProvidedColumnGroup().getLeafColumns(); if (!allLeafColumns || allLeafColumns.length === 0) { return false; } return allLeafColumns.every((col) => col.isMoving()); } checkLeft() { // first get all children to setLeft, as it impacts our decision below this.displayedChildren.forEach((child) => { if (isColumnGroup(child)) { child.checkLeft(); } }); // set our left based on first displayed column if (this.displayedChildren.length > 0) { if (this.gos.get('enableRtl')) { const lastChild = (0, array_1._last)(this.displayedChildren); const lastChildLeft = lastChild.getLeft(); this.setLeft(lastChildLeft); } else { const firstChildLeft = this.displayedChildren[0].getLeft(); this.setLeft(firstChildLeft); } } else { // this should never happen, as if we have no displayed columns, then // this groups should not even exist. this.setLeft(null); } } getLeft() { return this.left; } getOldLeft() { return this.oldLeft; } setLeft(left) { this.oldLeft = this.left; if (this.left !== left) { this.left = left; this.dispatchLocalEvent({ type: 'leftChanged' }); } } getPinned() { return this.pinned; } getGroupId() { return this.groupId; } getPartId() { return this.partId; } getActualWidth() { let groupActualWidth = 0; this.displayedChildren?.forEach((child) => { groupActualWidth += child.getActualWidth(); }); return groupActualWidth; } isResizable() { if (!this.displayedChildren) { return false; } // if at least one child is resizable, then the group is resizable let result = false; this.displayedChildren.forEach((child) => { if (child.isResizable()) { result = true; } }); return result; } getMinWidth() { let result = 0; this.displayedChildren.forEach((groupChild) => { result += groupChild.getMinWidth(); }); return result; } addChild(child) { if (!this.children) { this.children = []; } this.children.push(child); } getDisplayedChildren() { return this.displayedChildren; } getLeafColumns() { const result = []; this.addLeafColumns(result); return result; } getDisplayedLeafColumns() { const result = []; this.addDisplayedLeafColumns(result); return result; } getDefinition() { return this.providedColumnGroup.getColGroupDef(); } getColGroupDef() { return this.providedColumnGroup.getColGroupDef(); } isPadding() { return this.providedColumnGroup.isPadding(); } isExpandable() { return this.providedColumnGroup.isExpandable(); } isExpanded() { return this.providedColumnGroup.isExpanded(); } setExpanded(expanded) { this.providedColumnGroup.setExpanded(expanded); } isAutoHeaderHeight() { return !!this.getColGroupDef()?.autoHeaderHeight; } getAutoHeaderHeight() { return this.autoHeaderHeight; } /** Returns true if the header height has changed */ setAutoHeaderHeight(height) { const changed = height !== this.autoHeaderHeight; this.autoHeaderHeight = height; return changed; } addDisplayedLeafColumns(leafColumns) { this.displayedChildren.forEach((child) => { if ((0, agColumn_1.isColumn)(child)) { leafColumns.push(child); } else if (isColumnGroup(child)) { child.addDisplayedLeafColumns(leafColumns); } }); } addLeafColumns(leafColumns) { this.children.forEach((child) => { if ((0, agColumn_1.isColumn)(child)) { leafColumns.push(child); } else if (isColumnGroup(child)) { child.addLeafColumns(leafColumns); } }); } getChildren() { return this.children; } getColumnGroupShow() { return this.providedColumnGroup.getColumnGroupShow(); } getProvidedColumnGroup() { return this.providedColumnGroup; } getPaddingLevel() { const parent = this.getParent(); if (!this.isPadding() || !parent || !parent.isPadding()) { return 0; } return 1 + parent.getPaddingLevel(); } calculateDisplayedColumns() { // clear out last time we calculated this.displayedChildren = []; // find the column group that is controlling expandable. this is relevant when we have padding (empty) // groups, where the expandable is actually the first parent that is not a padding group. let parentWithExpansion = this; while (parentWithExpansion != null && parentWithExpansion.isPadding()) { parentWithExpansion = parentWithExpansion.getParent(); } const isExpandable = parentWithExpansion ? parentWithExpansion.getProvidedColumnGroup().isExpandable() : false; // it not expandable, everything is visible if (!isExpandable) { this.displayedChildren = this.children; this.dispatchLocalEvent({ type: 'displayedChildrenChanged' }); return; } // Add cols based on columnGroupShow // Note - the below also adds padding groups, these are always added because they never have // colDef.columnGroupShow set. this.children.forEach((child) => { // never add empty groups const emptyGroup = isColumnGroup(child) && (!child.displayedChildren || !child.displayedChildren.length); if (emptyGroup) { return; } const headerGroupShow = child.getColumnGroupShow(); switch (headerGroupShow) { case 'open': // when set to open, only show col if group is open if (parentWithExpansion.getProvidedColumnGroup().isExpanded()) { this.displayedChildren.push(child); } break; case 'closed': // when set to open, only show col if group is open if (!parentWithExpansion.getProvidedColumnGroup().isExpanded()) { this.displayedChildren.push(child); } break; default: this.displayedChildren.push(child); break; } }); this.dispatchLocalEvent({ type: 'displayedChildrenChanged' }); } } exports.AgColumnGroup = AgColumnGroup; /***/ }), /***/ 9409: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.AgProvidedColumnGroup = exports.isProvidedColumnGroup = void 0; const beanStub_1 = __webpack_require__(8731); const agColumn_1 = __webpack_require__(3355); function isProvidedColumnGroup(col) { return col instanceof AgProvidedColumnGroup; } exports.isProvidedColumnGroup = isProvidedColumnGroup; class AgProvidedColumnGroup extends beanStub_1.BeanStub { constructor(colGroupDef, groupId, padding, level) { super(); this.colGroupDef = colGroupDef; this.groupId = groupId; this.padding = padding; this.level = level; this.isColumn = false; this.expandable = false; // used by React (and possibly other frameworks) as key for rendering. also used to // identify old vs new columns for destroying cols when no longer used. this.instanceId = (0, agColumn_1.getNextColInstanceId)(); this.expandableListenerRemoveCallback = null; this.expanded = !!colGroupDef?.openByDefault; } destroy() { if (this.expandableListenerRemoveCallback) { this.reset(null, undefined); } super.destroy(); } reset(colGroupDef, level) { this.colGroupDef = colGroupDef; this.level = level; this.originalParent = null; if (this.expandableListenerRemoveCallback) { this.expandableListenerRemoveCallback(); } // we use ! below, as we want to set the object back to the // way it was when it was first created this.children = undefined; this.expandable = undefined; } getInstanceId() { return this.instanceId; } getOriginalParent() { return this.originalParent; } getLevel() { return this.level; } isVisible() { // return true if at least one child is visible if (this.children) { return this.children.some((child) => child.isVisible()); } return false; } isPadding() { return this.padding; } setExpanded(expanded) { this.expanded = expanded === undefined ? false : expanded; this.dispatchLocalEvent({ type: 'expandedChanged' }); } isExpandable() { return this.expandable; } isExpanded() { return this.expanded; } getGroupId() { return this.groupId; } getId() { return this.getGroupId(); } setChildren(children) { this.children = children; } getChildren() { return this.children; } getColGroupDef() { return this.colGroupDef; } getLeafColumns() { const result = []; this.addLeafColumns(result); return result; } addLeafColumns(leafColumns) { if (!this.children) { return; } this.children.forEach((child) => { if ((0, agColumn_1.isColumn)(child)) { leafColumns.push(child); } else if (isProvidedColumnGroup(child)) { child.addLeafColumns(leafColumns); } }); } getColumnGroupShow() { const colGroupDef = this.colGroupDef; if (!colGroupDef) { return; } return colGroupDef.columnGroupShow; } // need to check that this group has at least one col showing when both expanded and contracted. // if not, then we don't allow expanding and contracting on this group setupExpandable() { this.setExpandable(); if (this.expandableListenerRemoveCallback) { this.expandableListenerRemoveCallback(); } const listener = this.onColumnVisibilityChanged.bind(this); this.getLeafColumns().forEach((col) => col.__addEventListener('visibleChanged', listener)); this.expandableListenerRemoveCallback = () => { this.getLeafColumns().forEach((col) => col.__removeEventListener('visibleChanged', listener)); this.expandableListenerRemoveCallback = null; }; } setExpandable() { if (this.isPadding()) { return; } // want to make sure the group doesn't disappear when it's open let atLeastOneShowingWhenOpen = false; // want to make sure the group doesn't disappear when it's closed let atLeastOneShowingWhenClosed = false; // want to make sure the group has something to show / hide let atLeastOneChangeable = false; const children = this.findChildrenRemovingPadding(); for (let i = 0, j = children.length; i < j; i++) { const abstractColumn = children[i]; if (!abstractColumn.isVisible()) { continue; } // if the abstractColumn is a grid generated group, there will be no colDef const headerGroupShow = abstractColumn.getColumnGroupShow(); if (headerGroupShow === 'open') { atLeastOneShowingWhenOpen = true; atLeastOneChangeable = true; } else if (headerGroupShow === 'closed') { atLeastOneShowingWhenClosed = true; atLeastOneChangeable = true; } else { atLeastOneShowingWhenOpen = true; atLeastOneShowingWhenClosed = true; } } const expandable = atLeastOneShowingWhenOpen && atLeastOneShowingWhenClosed && atLeastOneChangeable; if (this.expandable !== expandable) { this.expandable = expandable; this.dispatchLocalEvent({ type: 'expandableChanged' }); } } findChildrenRemovingPadding() { const res = []; const process = (items) => { items.forEach((item) => { // if padding, we add this children instead of the padding const skipBecausePadding = isProvidedColumnGroup(item) && item.isPadding(); if (skipBecausePadding) { process(item.children); } else { res.push(item); } }); }; process(this.children); return res; } onColumnVisibilityChanged() { this.setExpandable(); } } exports.AgProvidedColumnGroup = AgProvidedColumnGroup; /***/ }), /***/ 5449: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.DefaultColumnTypes = void 0; exports.DefaultColumnTypes = { numericColumn: { headerClass: 'ag-right-aligned-header', cellClass: 'ag-right-aligned-cell', }, rightAligned: { headerClass: 'ag-right-aligned-header', cellClass: 'ag-right-aligned-cell', }, }; /***/ }), /***/ 6257: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports._getCellByPosition = exports._getRowNode = exports._getLastRow = exports._getFirstRow = exports._isSameRow = exports._isRowBefore = exports._areCellsEqual = exports._createCellId = void 0; const generic_1 = __webpack_require__(4422); function _createCellId(cellPosition) { const { rowIndex, rowPinned, column } = cellPosition; return `${rowIndex}.${rowPinned == null ? 'null' : rowPinned}.${column.getId()}`; } exports._createCellId = _createCellId; function _areCellsEqual(cellA, cellB) { const colsMatch = cellA.column === cellB.column; const floatingMatch = cellA.rowPinned === cellB.rowPinned; const indexMatch = cellA.rowIndex === cellB.rowIndex; return colsMatch && floatingMatch && indexMatch; } exports._areCellsEqual = _areCellsEqual; // tests if this row selection is before the other row selection function _isRowBefore(rowA, rowB) { switch (rowA.rowPinned) { case 'top': // we we are floating top, and other isn't, then we are always before if (rowB.rowPinned !== 'top') { return true; } break; case 'bottom': // if we are floating bottom, and the other isn't, then we are never before if (rowB.rowPinned !== 'bottom') { return false; } break; default: // if we are not floating, but the other one is floating... if ((0, generic_1._exists)(rowB.rowPinned)) { return rowB.rowPinned !== 'top'; } break; } return rowA.rowIndex < rowB.rowIndex; } exports._isRowBefore = _isRowBefore; function _isSameRow(rowA, rowB) { // if both missing if (!rowA && !rowB) { return true; } // if only one missing if ((rowA && !rowB) || (!rowA && rowB)) { return false; } // otherwise compare (use == to compare rowPinned because it can be null or undefined) return rowA.rowIndex === rowB.rowIndex && rowA.rowPinned == rowB.rowPinned; } exports._isSameRow = _isSameRow; function _getFirstRow(beans) { let rowIndex = 0; let rowPinned; const { pinnedRowModel, rowModel, pageBounds } = beans; if (pinnedRowModel?.getPinnedTopRowCount()) { rowPinned = 'top'; } else if (rowModel.getRowCount()) { rowPinned = null; rowIndex = pageBounds.getFirstRow(); } else if (pinnedRowModel?.getPinnedBottomRowCount()) { rowPinned = 'bottom'; } return rowPinned === undefined ? null : { rowIndex, rowPinned }; } exports._getFirstRow = _getFirstRow; function _getLastRow(beans) { let rowIndex; let rowPinned = null; const { pinnedRowModel, pageBounds } = beans; const pinnedBottomCount = pinnedRowModel?.getPinnedBottomRowCount(); const pinnedTopCount = pinnedRowModel?.getPinnedTopRowCount(); if (pinnedBottomCount) { rowPinned = 'bottom'; rowIndex = pinnedBottomCount - 1; } else if (beans.rowModel.getRowCount()) { rowPinned = null; rowIndex = pageBounds.getLastRow(); } else if (pinnedTopCount) { rowPinned = 'top'; rowIndex = pinnedTopCount - 1; } return rowIndex === undefined ? null : { rowIndex, rowPinned }; } exports._getLastRow = _getLastRow; function _getRowNode(beans, gridRow) { switch (gridRow.rowPinned) { case 'top': return beans.pinnedRowModel?.getPinnedTopRow(gridRow.rowIndex); case 'bottom': return beans.pinnedRowModel?.getPinnedBottomRow(gridRow.rowIndex); default: return beans.rowModel.getRow(gridRow.rowIndex); } } exports._getRowNode = _getRowNode; function _getCellByPosition(beans, cellPosition) { // if spanned, return cell ctrl from spanned renderer const spannedCellCtrl = beans.spannedRowRenderer?.getCellByPosition(cellPosition); if (spannedCellCtrl) { return spannedCellCtrl; } const rowCtrl = beans.rowRenderer.getRowByPosition(cellPosition); if (!rowCtrl) { return null; } return rowCtrl.getCellCtrl(cellPosition.column); } exports._getCellByPosition = _getCellByPosition; /***/ }), /***/ 3373: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.RowNode = exports.ROW_ID_PREFIX_BOTTOM_PINNED = exports.ROW_ID_PREFIX_TOP_PINNED = exports.ROW_ID_PREFIX_ROW_GROUP = void 0; const gridOptionsUtils_1 = __webpack_require__(7274); const localEventService_1 = __webpack_require__(5889); const logging_1 = __webpack_require__(7764); exports.ROW_ID_PREFIX_ROW_GROUP = 'row-group-'; exports.ROW_ID_PREFIX_TOP_PINNED = 't-'; exports.ROW_ID_PREFIX_BOTTOM_PINNED = 'b-'; let OBJECT_ID_SEQUENCE = 0; class RowNode { constructor(beans) { /** `true` if this row is a master row, part of master / detail (ie row can be expanded to show detail) */ this.master = false; /** `true` if this row is a detail row, part of master / detail (ie child row of an expanded master row)*/ this.detail = undefined; /** The current row index. If the row is filtered out or in a collapsed group, this value will be `null`. */ this.rowIndex = null; /** The key for the group eg Ireland, UK, USA */ this.key = null; /** * The index of the row in the source rowData array including any updates via transactions. * It does not change when sorting, filtering, grouping, pivoting or any other UI related operations. * If this is a filler node (a visual row created by AG Grid in tree data or grouping) the value will be `-1`. * * Generally readonly. It is modified only by: * - ClientSideNodeManager, cast to ClientSideNodeManagerRowNode * - ClientSideRowModel, cast to ClientSideRowModelRowNode */ this.sourceRowIndex = -1; /** * Children mapped by the pivot columns. * * TODO: this field is currently used only by the GroupStrategy and Pivot. * TreeStrategy does not use it, and pivot cannot be enabled with tree data. * Creating a new object for every row when not pivoting and not grouping * consumes memory unnecessarily. Setting it to null however currently breaks * transactional updates in groups so this requires a deeper investigation on GroupStrategy. */ this.childrenMapped = {}; /** The TreeNode associated to this row. Used only with tree data. */ this.treeNode = null; /** The flags associated to this node. Used only with tree data. */ this.treeNodeFlags = 0; /** * This will be `true` if it has a rowIndex assigned, otherwise `false`. */ this.displayed = false; /** The row top position in pixels. */ this.rowTop = null; /** The top pixel for this row last time, makes sense if data set was ordered or filtered, * it is used so new rows can animate in from their old position. */ this.oldRowTop = null; /** `true` by default - can be overridden via gridOptions.isRowSelectable(rowNode) */ this.selectable = true; /** * Used by sorting service - to give deterministic sort to groups. Previously we * just id for this, however id is a string and had slower sorting compared to numbers. * If re-naming this property, you must also update `IGNORED_SIBLING_PROPERTIES` */ this.__objectId = OBJECT_ID_SEQUENCE++; /** `true` when nodes with the same id are being removed and added as part of the same batch transaction */ this.alreadyRendered = false; this.highlighted = null; this.hovered = false; this.__selected = false; this.beans = beans; } /** * Replaces the data on the `rowNode`. When this method is called, the grid will refresh the entire rendered row if it is displayed. */ setData(data) { this.setDataCommon(data, false); } // similar to setRowData, however it is expected that the data is the same data item. this // is intended to be used with Redux type stores, where the whole data can be changed. we are // guaranteed that the data is the same entity (so grid doesn't need to worry about the id of the // underlying data changing, hence doesn't need to worry about selection). the grid, upon receiving // dataChanged event, will refresh the cells rather than rip them all out (so user can show transitions). /** * Updates the data on the `rowNode`. When this method is called, the grid will refresh the entire rendered row if it is displayed. */ updateData(data) { this.setDataCommon(data, true); } setDataCommon(data, update) { const { valueCache, selectionSvc, rowSpanSvc } = this.beans; const oldData = this.data; this.data = data; valueCache?.onDataChanged(); this.updateDataOnDetailNode(); selectionSvc?.updateRowSelectable(this); this.resetQuickFilterAggregateText(); const event = this.createDataChangedEvent(data, oldData, update); this.__localEventService?.dispatchEvent(event); rowSpanSvc?.onRowDataUpdated(this); } // when we are doing master / detail, the detail node is lazy created, but then kept around. // so if we show / hide the detail, the same detail rowNode is used. so we need to keep the data // in sync, otherwise expand/collapse of the detail would still show the old values. updateDataOnDetailNode() { if (this.detailNode) { this.detailNode.data = this.data; } } createDataChangedEvent(newData, oldData, update) { return { type: 'dataChanged', node: this, oldData: oldData, newData: newData, update: update, }; } getRowIndexString() { if (this.rowIndex == null) { // Row has been removed so no index (0, logging_1._error)(13); return null; } if (this.rowPinned === 'top') { return exports.ROW_ID_PREFIX_TOP_PINNED + this.rowIndex; } if (this.rowPinned === 'bottom') { return exports.ROW_ID_PREFIX_BOTTOM_PINNED + this.rowIndex; } return this.rowIndex.toString(); } setDataAndId(data, id) { const { selectionSvc } = this.beans; const oldNode = selectionSvc?.createDaemonNode?.(this); const oldData = this.data; this.data = data; this.updateDataOnDetailNode(); this.setId(id); if (selectionSvc) { selectionSvc.updateRowSelectable(this); selectionSvc.syncInRowNode(this, oldNode); } const event = this.createDataChangedEvent(data, oldData, false); this.__localEventService?.dispatchEvent(event); } setId(id) { // see if user is providing the id's const getRowIdFunc = (0, gridOptionsUtils_1._getRowIdCallback)(this.beans.gos); if (getRowIdFunc) { // if user is providing the id's, then we set the id only after the data has been set. // this is important for virtual pagination and viewport, where empty rows exist. if (this.data) { // we pass 'true' as we skip this level when generating keys, // as we don't always have the key for this level (eg when updating // data via transaction on SSRM, we are getting key to look up the // RowNode, don't have the RowNode yet, thus no way to get the current key) const parentKeys = this.parent?.getRoute() ?? []; this.id = getRowIdFunc({ data: this.data, parentKeys: parentKeys.length > 0 ? parentKeys : undefined, level: this.level, rowPinned: this.rowPinned, }); // make sure id provided doesn't start with 'row-group-' as this is reserved. if (this.id.startsWith(exports.ROW_ID_PREFIX_ROW_GROUP)) { (0, logging_1._error)(14, { groupPrefix: exports.ROW_ID_PREFIX_ROW_GROUP, }); } } else { // this can happen if user has set blank into the rowNode after the row previously // having data. this happens in virtual page row model, when data is delete and // the page is refreshed. this.id = undefined; } } else { this.id = id; } } setRowTop(rowTop) { this.oldRowTop = this.rowTop; if (this.rowTop === rowTop) { return; } this.rowTop = rowTop; this.dispatchRowEvent('topChanged'); this.setDisplayed(rowTop !== null); } clearRowTopAndRowIndex() { this.oldRowTop = null; this.setRowTop(null); this.setRowIndex(null); } setHovered(hovered) { this.hovered = hovered; } isHovered() { return this.hovered; } /** * Sets the row height. * Call if you want to change the height initially assigned to the row. * After calling, you must call `api.onRowHeightChanged()` so the grid knows it needs to work out the placement of the rows. */ setRowHeight(rowHeight, estimated = false) { this.rowHeight = rowHeight; this.rowHeightEstimated = estimated; this.dispatchRowEvent('heightChanged'); } setExpanded(expanded, e, forceSync) { this.beans.expansionSvc?.setExpanded(this, expanded, e, forceSync); } /** * Replaces the value on the `rowNode` for the specified column. When complete, * the grid will refresh the rendered cell on the required row only. * **Note**: This method only fires `onCellEditRequest` when the Grid is in **Read Only** mode. * * @param colKey The column where the value should be updated * @param newValue The new value * @param eventSource The source of the event * @returns `true` if the value was changed, otherwise `false`. */ setDataValue(colKey, newValue, eventSource) { // When it is done via the editors, no 'cell changed' event gets fired, as it's assumed that // the cell knows about the change given it's in charge of the editing. // this method is for the client to call, so the cell listens for the change // event, and also flashes the cell when the change occurs. const { colModel, valueSvc, gos, selectionSvc, rowSpanSvc } = this.beans; // if in pivot mode, grid columns wont include primary columns const column = typeof colKey !== 'string' ? colKey : colModel.getCol(colKey) ?? colModel.getColDefCol(colKey); if (!column) { return false; } const oldValue = valueSvc.getValueForDisplay(column, this); if (gos.get('readOnlyEdit')) { const { beans: { eventSvc }, data, rowIndex, rowPinned, } = this; eventSvc.dispatchEvent({ type: 'cellEditRequest', event: null, rowIndex, rowPinned, column, colDef: column.colDef, data, node: this, oldValue, newValue, value: newValue, source: eventSource, }); return false; } const valueChanged = valueSvc.setValue(this, column, newValue, eventSource); this.dispatchCellChangedEvent(column, newValue, oldValue); selectionSvc?.updateRowSelectable(this); rowSpanSvc?.onRowDataUpdated(this); return valueChanged; } updateHasChildren() { // in CSRM, the group property will be set before the childrenAfterGroup property, check both to prevent flickering let newValue = (this.group && !this.footer) || (this.childrenAfterGroup && this.childrenAfterGroup.length > 0); const { rowChildrenSvc } = this.beans; if (rowChildrenSvc) { newValue = rowChildrenSvc.getHasChildrenValue(this); } if (newValue !== this.__hasChildren) { this.__hasChildren = !!newValue; this.dispatchRowEvent('hasChildrenChanged'); } } hasChildren() { if (this.__hasChildren == null) { this.updateHasChildren(); } return this.__hasChildren; } dispatchCellChangedEvent(column, newValue, oldValue) { const cellChangedEvent = { type: 'cellChanged', node: this, column: column, newValue: newValue, oldValue: oldValue, }; this.__localEventService?.dispatchEvent(cellChangedEvent); } /** * The first time `quickFilter` runs, the grid creates a one-off string representation of the row. * This string is then used for the quick filter instead of hitting each column separately. * When you edit, using grid editing, this string gets cleared down. * However if you edit without using grid editing, you will need to clear this string down for the row to be updated with the new values. * Otherwise new values will not work with the `quickFilter`. */ resetQuickFilterAggregateText() { this.quickFilterAggregateText = null; } /** Returns: * - `true` if the node can be expanded, i.e it is a group or master row. * - `false` if the node cannot be expanded */ isExpandable() { return this.beans.expansionSvc?.isExpandable(this) ?? false; } /** Returns: * - `true` if node is selected, * - `false` if the node isn't selected * - `undefined` if it's partially selected (group where not all children are selected). */ isSelected() { // for footers, we just return what our sibling selected state is, as cannot select a footer if (this.footer) { return this.sibling.isSelected(); } return this.__selected; } /** Perform a depth-first search of this node and its children. */ depthFirstSearch(callback) { this.childrenAfterGroup?.forEach((child) => child.depthFirstSearch(callback)); callback(this); } dispatchRowEvent(type) { this.__localEventService?.dispatchEvent({ type: type, node: this, }); } /** * Select (or deselect) the node. * @param newValue -`true` for selection, `false` for deselection. * @param clearSelection - If selecting, then passing `true` will select the node exclusively (i.e. NOT do multi select). If doing deselection, `clearSelection` has no impact. * @param source - Source property that will appear in the `selectionChanged` event. */ setSelected(newValue, clearSelection = false, source = 'api') { this.beans.selectionSvc?.setNodesSelected({ nodes: [this], newValue, clearSelection, source, }); } /** * Returns: * - `true` if node is either pinned to the `top` or `bottom` * - `false` if the node isn't pinned */ isRowPinned() { return !!this.rowPinned; } __addEventListener(eventType, listener) { if (!this.__localEventService) { this.__localEventService = new localEventService_1.LocalEventService(); } this.__localEventService.addEventListener(eventType, listener); } __removeEventListener(eventType, listener) { this.removeLocalListener(eventType, listener); } /** * PUBLIC USE ONLY: for internal use within AG Grid use the `__addEventListener` and `__removeEventListener` methods. */ addEventListener(eventType, userListener) { this.beans.validation?.checkRowEvents(eventType); if (!this.__localEventService) { this.__localEventService = new localEventService_1.LocalEventService(); } this.frameworkEventListenerService = this.beans.frameworkOverrides.createLocalEventListenerWrapper?.(this.frameworkEventListenerService, this.__localEventService); const listener = this.frameworkEventListenerService?.wrap(userListener) ?? userListener; this.__localEventService.addEventListener(eventType, listener); } /** * PUBLIC USE ONLY: for internal use within AG Grid use the `__addEventListener` and `__removeEventListener` methods. */ removeEventListener(eventType, userListener) { const listener = this.frameworkEventListenerService?.unwrap(userListener) ?? userListener; this.removeLocalListener(eventType, listener); } removeLocalListener(eventType, listener) { this.__localEventService?.removeEventListener(eventType, listener); if (this.__localEventService?.noRegisteredListenersExist()) { this.__localEventService = null; } } /** * @deprecated v32.2.0 Check `node.detail` then user provided callback `isFullWidthRow` instead. * * Returns: * - `true` if the node is a full width cell * - `false` if the node is not a full width cell */ isFullWidthCell() { // log deprecation (0, logging_1._warn)(61); if (this.detail) { return true; } const isFullWidthCellFunc = this.beans.gos.getCallback('isFullWidthRow'); return isFullWidthCellFunc ? isFullWidthCellFunc({ rowNode: this }) : false; } /** * Returns the route of keys to the row node. Returns undefined if the node has no key. */ getRoute() { // root node is still a valid route if (this.level === -1) { return []; } if (this.key == null) { return undefined; } const res = []; let pointer = this; while (pointer && pointer.key != null) { res.push(pointer.key); pointer = pointer.parent; } return res.reverse(); } setFirstChild(firstChild) { if (this.firstChild !== firstChild) { this.firstChild = firstChild; this.dispatchRowEvent('firstChildChanged'); } } setDisplayed(displayed) { if (this.displayed !== displayed) { this.displayed = displayed; this.dispatchRowEvent('displayedChanged'); } } setRowIndex(rowIndex) { if (this.rowIndex !== rowIndex) { this.rowIndex = rowIndex; this.dispatchRowEvent('rowIndexChanged'); } } setAllChildrenCount(allChildrenCount) { if (this.allChildrenCount !== allChildrenCount) { this.allChildrenCount = allChildrenCount; this.dispatchRowEvent('allChildrenCountChanged'); } } setUiLevel(uiLevel) { if (this.uiLevel !== uiLevel) { this.uiLevel = uiLevel; this.dispatchRowEvent('uiLevelChanged'); } } } exports.RowNode = RowNode; /***/ }), /***/ 9888: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports._createGlobalRowEvent = void 0; const gridOptionsUtils_1 = __webpack_require__(7274); function _createGlobalRowEvent(rowNode, gos, type) { return (0, gridOptionsUtils_1._addGridCommonParams)(gos, { type, node: rowNode, data: rowNode.data, rowIndex: rowNode.rowIndex, rowPinned: rowNode.rowPinned, }); } exports._createGlobalRowEvent = _createGlobalRowEvent; /***/ }), /***/ 9024: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.Environment = void 0; const beanStub_1 = __webpack_require__(8731); const Theme_1 = __webpack_require__(9621); const inject_1 = __webpack_require__(8951); const themes_1 = __webpack_require__(2525); const dom_1 = __webpack_require__(3507); const logging_1 = __webpack_require__(7764); const ROW_HEIGHT = { cssName: '--ag-row-height', changeKey: 'rowHeightChanged', defaultValue: 42, }; const HEADER_HEIGHT = { cssName: '--ag-header-height', changeKey: 'headerHeightChanged', defaultValue: 48, }; const LIST_ITEM_HEIGHT = { cssName: '--ag-list-item-height', changeKey: 'listItemHeightChanged', defaultValue: 24, }; const ROW_BORDER_WIDTH = { cssName: '--ag-row-border', changeKey: 'rowBorderWidthChanged', defaultValue: 1, border: true, }; let paramsId = 0; class Environment extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'environment'; this.sizeEls = new Map(); this.lastKnownValues = new Map(); this.sizesMeasured = false; this.paramsClass = `ag-theme-params-${++paramsId}`; this.globalCSS = []; } wireBeans(beans) { const { eGridDiv, gridOptions } = beans; this.eGridDiv = eGridDiv; // NOTE: need to use beans.gridOptions because beans.gos not yet initialised this.eStyleContainer = gridOptions.themeStyleContainer ?? (eGridDiv.getRootNode() === document ? document.head : eGridDiv); this.cssLayer = gridOptions.themeCssLayer; } postConstruct() { this.addManagedPropertyListener('theme', () => this.handleThemeGridOptionChange()); this.handleThemeGridOptionChange(); this.addManagedPropertyListener('rowHeight', () => this.refreshRowHeightVariable()); this.getSizeEl(ROW_HEIGHT); this.getSizeEl(HEADER_HEIGHT); this.getSizeEl(LIST_ITEM_HEIGHT); this.getSizeEl(ROW_BORDER_WIDTH); this.refreshRowBorderWidthVariable(); this.addDestroyFunc(() => (0, inject_1._unregisterGridUsingThemingAPI)(this)); this.mutationObserver = new MutationObserver(() => { this.fireGridStylesChangedEvent('themeChanged'); }); this.addDestroyFunc(() => this.mutationObserver.disconnect()); } getDefaultRowHeight() { return this.getCSSVariablePixelValue(ROW_HEIGHT); } getDefaultHeaderHeight() { return this.getCSSVariablePixelValue(HEADER_HEIGHT); } getDefaultColumnMinWidth() { // This replaces a table of hard-coded defaults for each theme, and is a // reasonable default that somewhat approximates the old table. This // value only needs to be a non-insane default - Applications are // expected to set column-specific defaults based on the icons and // header cell text they need to display return Math.min(36, this.getDefaultRowHeight()); } getDefaultListItemHeight() { return this.getCSSVariablePixelValue(LIST_ITEM_HEIGHT); } getRowBorderWidth() { return this.getCSSVariablePixelValue(ROW_BORDER_WIDTH); } applyThemeClasses(el) { const { gridTheme } = this; let themeClass = ''; if (gridTheme) { // Theming API mode themeClass = `${this.paramsClass} ${gridTheme._getCssClass()}`; } else { // legacy mode this.mutationObserver.disconnect(); let node = this.eGridDiv; while (node) { let isThemeEl = false; for (const className of Array.from(node.classList)) { if (className.startsWith('ag-theme-')) { isThemeEl = true; themeClass = themeClass ? `${themeClass} ${className}` : className; } } if (isThemeEl) { this.mutationObserver.observe(node, { attributes: true, attributeFilter: ['class'], }); } node = node.parentElement; } } for (const className of Array.from(el.classList)) { if (className.startsWith('ag-theme-')) { el.classList.remove(className); } } if (themeClass) { const oldClass = el.className; el.className = oldClass + (oldClass ? ' ' : '') + themeClass; } } refreshRowHeightVariable() { const { eGridDiv } = this; const oldRowHeight = eGridDiv.style.getPropertyValue('--ag-line-height').trim(); const height = this.gos.get('rowHeight'); if (height == null || isNaN(height) || !isFinite(height)) { if (oldRowHeight !== null) { eGridDiv.style.setProperty('--ag-line-height', null); } return -1; } const newRowHeight = `${height}px`; if (oldRowHeight != newRowHeight) { eGridDiv.style.setProperty('--ag-line-height', newRowHeight); return height; } return oldRowHeight != '' ? parseFloat(oldRowHeight) : -1; } addGlobalCSS(css, debugId) { if (this.gridTheme) { (0, inject_1._injectGlobalCSS)(css, this.eStyleContainer, debugId, this.cssLayer, 0); } else { this.globalCSS.push([css, debugId]); } } getCSSVariablePixelValue(variable) { const cached = this.lastKnownValues.get(variable); if (cached != null) { return cached; } const measurement = this.measureSizeEl(variable); if (measurement === 'detached' || measurement === 'no-styles') { return variable.defaultValue; } this.lastKnownValues.set(variable, measurement); return measurement; } measureSizeEl(variable) { const sizeEl = this.getSizeEl(variable); if (sizeEl.offsetParent == null) { return 'detached'; } const newSize = sizeEl.offsetWidth; if (newSize === NO_VALUE_SENTINEL) return 'no-styles'; this.sizesMeasured = true; return newSize; } getMeasurementContainer() { let container = this.eMeasurementContainer; if (!container) { container = this.eMeasurementContainer = document.createElement('div'); container.className = 'ag-measurement-container'; this.eGridDiv.appendChild(container); } return container; } getSizeEl(variable) { let sizeEl = this.sizeEls.get(variable); if (sizeEl) { return sizeEl; } const container = this.getMeasurementContainer(); sizeEl = document.createElement('div'); const { border } = variable; if (border) { sizeEl.className = 'ag-measurement-element-border'; sizeEl.style.setProperty('--ag-internal-measurement-border', `var(${variable.cssName}, solid ${NO_VALUE_SENTINEL}px`); } else { sizeEl.style.width = `var(${variable.cssName}, ${NO_VALUE_SENTINEL}px)`; } container.appendChild(sizeEl); this.sizeEls.set(variable, sizeEl); let lastMeasurement = this.measureSizeEl(variable); if (lastMeasurement === 'no-styles') { // No value for the variable (0, logging_1._warn)(9, { variable }); } const unsubscribe = (0, dom_1._observeResize)(this.beans, sizeEl, () => { const newMeasurement = this.measureSizeEl(variable); if (newMeasurement === 'detached' || newMeasurement === 'no-styles') { return; } this.lastKnownValues.set(variable, newMeasurement); if (newMeasurement !== lastMeasurement) { lastMeasurement = newMeasurement; this.fireGridStylesChangedEvent(variable.changeKey); } }); this.addDestroyFunc(() => unsubscribe()); return sizeEl; } fireGridStylesChangedEvent(change) { if (change === 'rowBorderWidthChanged') { this.refreshRowBorderWidthVariable(); } this.eventSvc.dispatchEvent({ type: 'gridStylesChanged', [change]: true, }); } refreshRowBorderWidthVariable() { const width = this.getCSSVariablePixelValue(ROW_BORDER_WIDTH); this.eGridDiv.style.setProperty('--ag-internal-row-border-width', `${width}px`); } handleThemeGridOptionChange() { const { gos, eGridDiv, globalCSS, gridTheme: oldGridTheme } = this; const themeGridOption = gos.get('theme'); let newGridTheme; if (themeGridOption === 'legacy') { newGridTheme = undefined; } else { const themeOrDefault = themeGridOption ?? themes_1.themeQuartz; if (themeOrDefault instanceof Theme_1.ThemeImpl) { newGridTheme = themeOrDefault; } else { (0, logging_1._error)(240, { theme: themeOrDefault }); } } if (newGridTheme !== oldGridTheme) { if (newGridTheme) { (0, inject_1._registerGridUsingThemingAPI)(this); (0, inject_1._injectCoreAndModuleCSS)(this.eStyleContainer, this.cssLayer); for (const [css, debugId] of globalCSS) { (0, inject_1._injectGlobalCSS)(css, this.eStyleContainer, debugId, this.cssLayer, 0); } globalCSS.length = 0; } this.gridTheme = newGridTheme; newGridTheme?._startUse({ loadThemeGoogleFonts: gos.get('loadThemeGoogleFonts'), styleContainer: this.eStyleContainer, cssLayer: this.cssLayer, }); let eParamsStyle = this.eParamsStyle; if (!eParamsStyle) { eParamsStyle = this.eParamsStyle = document.createElement('style'); eGridDiv.appendChild(eParamsStyle); } if (!inject_1.IS_SSR) { eParamsStyle.textContent = newGridTheme?._getPerGridCss(this.paramsClass) || ''; } this.applyThemeClasses(eGridDiv); this.fireGridStylesChangedEvent('themeChanged'); } // --ag-legacy-styles-loaded is defined on .ag-measurement-container by the // legacy themes which shouldn't be used at the same time as Theming API if (newGridTheme && getComputedStyle(this.getMeasurementContainer()).getPropertyValue('--ag-legacy-styles-loaded')) { if (themeGridOption) { (0, logging_1._error)(106); } else { (0, logging_1._error)(239); } } } } exports.Environment = Environment; const NO_VALUE_SENTINEL = 15538; /***/ }), /***/ 8778: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.EventService = void 0; const beanStub_1 = __webpack_require__(8731); const gridOptionsUtils_1 = __webpack_require__(7274); const localEventService_1 = __webpack_require__(5889); class EventService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'eventSvc'; this.globalEventService = new localEventService_1.LocalEventService(); } postConstruct() { const { globalListener, globalSyncListener } = this.beans; if (globalListener) { this.addGlobalListener(globalListener, true); } if (globalSyncListener) { this.addGlobalListener(globalSyncListener, false); } } addEventListener(eventType, listener, async) { this.globalEventService.addEventListener(eventType, listener, async); } removeEventListener(eventType, listener, async) { this.globalEventService.removeEventListener(eventType, listener, async); } addGlobalListener(listener, async = false) { this.globalEventService.addGlobalListener(listener, async); } removeGlobalListener(listener, async = false) { this.globalEventService.removeGlobalListener(listener, async); } /** @deprecated DO NOT FIRE LOCAL EVENTS OFF THE EVENT SERVICE */ dispatchLocalEvent() { // only the destroy event from BeanStub should flow through here } dispatchEvent(event) { this.globalEventService.dispatchEvent((0, gridOptionsUtils_1._addGridCommonParams)(this.gos, event)); } dispatchEventOnce(event) { this.globalEventService.dispatchEventOnce((0, gridOptionsUtils_1._addGridCommonParams)(this.gos, event)); } } exports.EventService = EventService; /***/ }), /***/ 3080: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports._ALL_EVENTS = exports._INTERNAL_EVENTS = exports._PUBLIC_EVENTS = void 0; // events that are available for use by users of AG Grid and so should be documented /** EVENTS that should be exposed via code generation for the framework components. */ exports._PUBLIC_EVENTS = [ 'columnEverythingChanged', 'newColumnsLoaded', 'columnPivotModeChanged', 'pivotMaxColumnsExceeded', 'columnRowGroupChanged', 'expandOrCollapseAll', 'columnPivotChanged', 'gridColumnsChanged', 'columnValueChanged', 'columnMoved', 'columnVisible', 'columnPinned', 'columnGroupOpened', 'columnResized', 'displayedColumnsChanged', 'virtualColumnsChanged', 'columnHeaderMouseOver', 'columnHeaderMouseLeave', 'columnHeaderClicked', 'columnHeaderContextMenu', 'asyncTransactionsFlushed', 'rowGroupOpened', 'rowDataUpdated', 'pinnedRowDataChanged', 'rangeSelectionChanged', 'cellSelectionChanged', 'chartCreated', 'chartRangeSelectionChanged', 'chartOptionsChanged', 'chartDestroyed', 'toolPanelVisibleChanged', 'toolPanelSizeChanged', 'modelUpdated', 'cutStart', 'cutEnd', 'pasteStart', 'pasteEnd', 'fillStart', 'fillEnd', 'cellSelectionDeleteStart', 'cellSelectionDeleteEnd', 'rangeDeleteStart', 'rangeDeleteEnd', 'undoStarted', 'undoEnded', 'redoStarted', 'redoEnded', 'cellClicked', 'cellDoubleClicked', 'cellMouseDown', 'cellContextMenu', 'cellValueChanged', 'cellEditRequest', 'rowValueChanged', 'headerFocused', 'cellFocused', 'rowSelected', 'selectionChanged', 'tooltipShow', 'tooltipHide', 'cellKeyDown', 'cellMouseOver', 'cellMouseOut', 'filterChanged', 'filterModified', 'filterOpened', 'advancedFilterBuilderVisibleChanged', 'sortChanged', 'virtualRowRemoved', 'rowClicked', 'rowDoubleClicked', 'gridReady', 'gridPreDestroyed', 'gridSizeChanged', 'viewportChanged', 'firstDataRendered', 'dragStarted', 'dragStopped', 'dragCancelled', 'rowEditingStarted', 'rowEditingStopped', 'cellEditingStarted', 'cellEditingStopped', 'bodyScroll', 'bodyScrollEnd', 'paginationChanged', 'componentStateChanged', 'storeRefreshed', 'stateUpdated', 'columnMenuVisibleChanged', 'contextMenuVisibleChanged', 'rowDragEnter', 'rowDragMove', 'rowDragLeave', 'rowDragEnd', 'rowDragCancel', ]; // events that are internal to AG Grid and should not be exposed to users via documentation or generated framework components // These events are still available to users via the API if the eventName is cast to any to stop Typescript from complaining, but they are not intended for general use /** Exclude the following internal events from code generation to prevent exposing these events via framework components */ exports._INTERNAL_EVENTS = [ 'scrollbarWidthChanged', 'keyShortcutChangedCellStart', 'keyShortcutChangedCellEnd', 'pinnedHeightChanged', 'cellFocusCleared', 'fullWidthRowFocused', 'checkboxChanged', 'heightScaleChanged', 'suppressMovableColumns', 'suppressMenuHide', 'suppressFieldDotNotation', 'columnPanelItemDragStart', 'columnPanelItemDragEnd', 'bodyHeightChanged', 'columnContainerWidthChanged', 'displayedColumnsWidthChanged', 'scrollVisibilityChanged', 'scrollGapChanged', 'columnHoverChanged', 'flashCells', 'paginationPixelOffsetChanged', 'displayedRowsChanged', 'leftPinnedWidthChanged', 'rightPinnedWidthChanged', 'rowContainerHeightChanged', 'headerHeightChanged', 'columnGroupHeaderHeightChanged', 'columnHeaderHeightChanged', 'gridStylesChanged', 'storeUpdated', 'filterDestroyed', 'rowDataUpdateStarted', 'rowCountReady', 'advancedFilterEnabledChanged', 'dataTypesInferred', 'fieldValueChanged', 'fieldPickerValueSelected', 'richSelectListRowSelected', 'sideBarUpdated', 'alignedGridScroll', 'alignedGridColumn', 'gridOptionsChanged', 'chartTitleEdit', 'recalculateRowBounds', 'stickyTopOffsetChanged', 'overlayExclusiveChanged', 'beforeRefreshModel', ]; exports._ALL_EVENTS = [...exports._PUBLIC_EVENTS, ...exports._INTERNAL_EVENTS]; /***/ }), /***/ 7968: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ALWAYS_SYNC_GLOBAL_EVENTS = void 0; exports.ALWAYS_SYNC_GLOBAL_EVENTS = new Set(['gridPreDestroyed', 'fillStart', 'pasteStart']); /***/ }), /***/ 7331: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.BaseCreator = void 0; const beanStub_1 = __webpack_require__(8731); class BaseCreator extends beanStub_1.BeanStub { getFileName(fileName) { const extension = this.getDefaultFileExtension(); if (fileName == null || !fileName.length) { fileName = this.getDefaultFileName(); } return fileName.indexOf('.') === -1 ? `${fileName}.${extension}` : fileName; } getData(params) { const serializingSession = this.createSerializingSession(params); return this.beans.gridSerializer.serialize(serializingSession, params); } getDefaultFileName() { return `export.${this.getDefaultFileExtension()}`; } } exports.BaseCreator = BaseCreator; /***/ }), /***/ 8376: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.BaseGridSerializingSession = void 0; const gridOptionsUtils_1 = __webpack_require__(7274); class BaseGridSerializingSession { constructor(config) { this.groupColumns = []; const { colModel, rowGroupColsSvc, colNames, valueSvc, gos, processCellCallback, processHeaderCallback, processGroupHeaderCallback, processRowGroupCallback, } = config; this.colModel = colModel; this.rowGroupColsSvc = rowGroupColsSvc; this.colNames = colNames; this.valueSvc = valueSvc; this.gos = gos; this.processCellCallback = processCellCallback; this.processHeaderCallback = processHeaderCallback; this.processGroupHeaderCallback = processGroupHeaderCallback; this.processRowGroupCallback = processRowGroupCallback; } prepare(columnsToExport) { this.groupColumns = columnsToExport.filter((col) => !!col.getColDef().showRowGroup); } extractHeaderValue(column) { const value = this.getHeaderName(this.processHeaderCallback, column); return value ?? ''; } extractRowCellValue(column, index, accumulatedRowIndex, type, node) { // we render the group summary text e.g. "-> Parent -> Child"... const hideOpenParents = this.gos.get('groupHideOpenParents'); const value = (!hideOpenParents || node.footer) && this.shouldRenderGroupSummaryCell(node, column, index) ? this.createValueForGroupNode(column, node) : this.valueSvc.getValue(column, node); const processedValue = this.processCell({ accumulatedRowIndex, rowNode: node, column, value, processCellCallback: this.processCellCallback, type, }); return processedValue; } shouldRenderGroupSummaryCell(node, column, currentColumnIndex) { // only on group rows when grouping, and not for tree data group nodes const isGroupNode = node.group && !this.gos.get('treeData'); if (!isGroupNode) { return false; } const currentColumnGroupIndex = this.groupColumns.indexOf(column); if (currentColumnGroupIndex !== -1) { if (node.groupData?.[column.getId()] !== undefined) { return true; } if ((0, gridOptionsUtils_1._isServerSideRowModel)(this.gos) && node.group) { return true; } // if this is a top level footer, always render`Total` in the left-most cell if (node.footer && node.level === -1) { const colDef = column.getColDef(); const isFullWidth = colDef == null || colDef.showRowGroup === true; return isFullWidth || colDef.showRowGroup === this.rowGroupColsSvc?.columns[0].getId(); } } const isGroupUseEntireRow = (0, gridOptionsUtils_1._isGroupUseEntireRow)(this.gos, this.colModel.isPivotMode()); return currentColumnIndex === 0 && isGroupUseEntireRow; } getHeaderName(callback, column) { if (callback) { return callback((0, gridOptionsUtils_1._addGridCommonParams)(this.gos, { column })); } return this.colNames.getDisplayNameForColumn(column, 'csv', true); } createValueForGroupNode(column, node) { if (this.processRowGroupCallback) { return this.processRowGroupCallback((0, gridOptionsUtils_1._addGridCommonParams)(this.gos, { column, node })); } const isTreeData = this.gos.get('treeData'); // if not tree data then we get the value from the group data const getValueFromNode = (node) => { if (isTreeData) { return node.key; } const value = node.groupData?.[column.getId()]; if (!value || !node.rowGroupColumn || node.rowGroupColumn.getColDef().useValueFormatterForExport === false) { return value; } return this.valueSvc.formatValue(node.rowGroupColumn, node, value) ?? value; }; const isFooter = node.footer; const keys = [getValueFromNode(node)]; if (!(0, gridOptionsUtils_1._isGroupMultiAutoColumn)(this.gos)) { while (node.parent) { node = node.parent; keys.push(getValueFromNode(node)); } } const groupValue = keys.reverse().join(' -> '); return isFooter ? `Total ${groupValue}` : groupValue; } processCell(params) { const { accumulatedRowIndex, rowNode, column, value, processCellCallback, type } = params; if (processCellCallback) { return { value: processCellCallback((0, gridOptionsUtils_1._addGridCommonParams)(this.gos, { accumulatedRowIndex, column: column, node: rowNode, value: value, type: type, parseValue: (valueToParse) => this.valueSvc.parseValue(column, rowNode, valueToParse, this.valueSvc.getValue(column, rowNode)), formatValue: (valueToFormat) => this.valueSvc.formatValue(column, rowNode, valueToFormat) ?? valueToFormat, })) ?? '', }; } if (column.getColDef().useValueFormatterForExport !== false) { return { value: value ?? '', valueFormatted: this.valueSvc.formatValue(column, rowNode, value), }; } return { value: value ?? '' }; } } exports.BaseGridSerializingSession = BaseGridSerializingSession; /***/ }), /***/ 3885: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports._downloadFile = void 0; const logging_1 = __webpack_require__(7764); function _downloadFile(fileName, content) { const win = document.defaultView || window; if (!win) { (0, logging_1._warn)(52); return; } const element = document.createElement('a'); const url = win.URL.createObjectURL(content); element.setAttribute('href', url); element.setAttribute('download', fileName); element.style.display = 'none'; document.body.appendChild(element); element.dispatchEvent(new MouseEvent('click', { bubbles: false, cancelable: true, view: win, })); document.body.removeChild(element); win.setTimeout(() => { win.URL.revokeObjectURL(url); }, 0); } exports._downloadFile = _downloadFile; /***/ }), /***/ 2728: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.SharedExportModule = void 0; const version_1 = __webpack_require__(7205); const gridSerializer_1 = __webpack_require__(826); // Shared CSV and Excel logic /** * @internal */ exports.SharedExportModule = { moduleName: 'SharedExport', version: version_1.VERSION, beans: [gridSerializer_1.GridSerializer], }; /***/ }), /***/ 826: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.GridSerializer = void 0; const columnUtils_1 = __webpack_require__(3146); const groupInstanceIdCreator_1 = __webpack_require__(6034); const beanStub_1 = __webpack_require__(8731); const agColumnGroup_1 = __webpack_require__(6908); const gridOptionsUtils_1 = __webpack_require__(7274); const array_1 = __webpack_require__(1502); class GridSerializer extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'gridSerializer'; } wireBeans(beans) { this.visibleCols = beans.visibleCols; this.colModel = beans.colModel; this.rowModel = beans.rowModel; this.pinnedRowModel = beans.pinnedRowModel; } serialize(gridSerializingSession, params = {}) { const { allColumns, columnKeys, skipRowGroups, exportRowNumbers } = params; const columnsToExport = this.getColumnsToExport({ allColumns, skipRowGroups, columnKeys: columnKeys, exportRowNumbers, }); return [ // first pass, put in the header names of the cols this.prepareSession(columnsToExport), this.prependContent(params), this.exportColumnGroups(params, columnsToExport), this.exportHeaders(params, columnsToExport), this.processPinnedTopRows(params, columnsToExport), this.processRows(params, columnsToExport), this.processPinnedBottomRows(params, columnsToExport), this.appendContent(params), ] .reduce((composed, f) => f(composed), gridSerializingSession) .parse(); } processRow(gridSerializingSession, params, columnsToExport, node) { const rowSkipper = params.shouldRowBeSkipped || (() => false); // if onlySelected, we ignore groupHideOpenParents as the user has explicitly selected the rows they wish to export. // similarly, if specific rowNodes are provided we do the same. (the clipboard service uses rowNodes to define which rows to export) const isClipboardExport = params.rowPositions != null; const isExplicitExportSelection = isClipboardExport || !!params.onlySelected; const hideOpenParents = this.gos.get('groupHideOpenParents') && !isExplicitExportSelection; const isLeafNode = this.colModel.isPivotMode() ? node.leafGroup : !node.group; const isFooter = !!node.footer; const shouldSkipCurrentGroup = node.allChildrenCount === 1 && node.childrenAfterGroup?.length === 1 && (0, gridOptionsUtils_1._canSkipShowingRowGroup)(this.gos, node); if ((!isLeafNode && !isFooter && (params.skipRowGroups || shouldSkipCurrentGroup || hideOpenParents)) || (params.onlySelected && !node.isSelected()) || (params.skipPinnedTop && node.rowPinned === 'top') || (params.skipPinnedBottom && node.rowPinned === 'bottom')) { return; } // if we are in pivotMode, then the grid will show the root node only // if it's not a leaf group const nodeIsRootNode = node.level === -1; if (nodeIsRootNode && !isLeafNode && !isFooter) { return; } const shouldRowBeSkipped = rowSkipper((0, gridOptionsUtils_1._addGridCommonParams)(this.gos, { node })); if (shouldRowBeSkipped) { return; } const rowAccumulator = gridSerializingSession.onNewBodyRow(node); columnsToExport.forEach((column, index) => { rowAccumulator.onColumn(column, index, node); }); if (params.getCustomContentBelowRow) { const content = params.getCustomContentBelowRow((0, gridOptionsUtils_1._addGridCommonParams)(this.gos, { node })); if (content) { gridSerializingSession.addCustomContent(content); } } } appendContent(params) { return (gridSerializingSession) => { const appendContent = params.appendContent; if (appendContent) { gridSerializingSession.addCustomContent(appendContent); } return gridSerializingSession; }; } prependContent(params) { return (gridSerializingSession) => { const prependContent = params.prependContent; if (prependContent) { gridSerializingSession.addCustomContent(prependContent); } return gridSerializingSession; }; } prepareSession(columnsToExport) { return (gridSerializingSession) => { gridSerializingSession.prepare(columnsToExport); return gridSerializingSession; }; } exportColumnGroups(params, columnsToExport) { return (gridSerializingSession) => { if (!params.skipColumnGroupHeaders) { const idCreator = new groupInstanceIdCreator_1.GroupInstanceIdCreator(); const { colGroupSvc } = this.beans; const displayedGroups = colGroupSvc ? colGroupSvc.createColumnGroups({ columns: columnsToExport, idCreator, pinned: null, isStandaloneStructure: true, }) : columnsToExport; this.recursivelyAddHeaderGroups(displayedGroups, gridSerializingSession, params.processGroupHeaderCallback); } return gridSerializingSession; }; } exportHeaders(params, columnsToExport) { return (gridSerializingSession) => { if (!params.skipColumnHeaders) { const gridRowIterator = gridSerializingSession.onNewHeaderRow(); columnsToExport.forEach((column, index) => { gridRowIterator.onColumn(column, index, undefined); }); } return gridSerializingSession; }; } processPinnedTopRows(params, columnsToExport) { return (gridSerializingSession) => { const processRow = this.processRow.bind(this, gridSerializingSession, params, columnsToExport); if (params.rowPositions) { params.rowPositions // only pinnedTop rows, other models are processed by `processRows` and `processPinnedBottomsRows` .filter((position) => position.rowPinned === 'top') .sort((a, b) => a.rowIndex - b.rowIndex) .map((position) => this.pinnedRowModel?.getPinnedTopRow(position.rowIndex)) .forEach(processRow); } else { this.pinnedRowModel?.forEachPinnedRow('top', processRow); } return gridSerializingSession; }; } processRows(params, columnsToExport) { return (gridSerializingSession) => { // when in pivot mode, we always render cols on screen, never 'all columns' const rowModel = this.rowModel; const usingCsrm = (0, gridOptionsUtils_1._isClientSideRowModel)(this.gos, rowModel); const usingSsrm = (0, gridOptionsUtils_1._isServerSideRowModel)(this.gos, rowModel); const onlySelectedNonStandardModel = !usingCsrm && params.onlySelected; const processRow = this.processRow.bind(this, gridSerializingSession, params, columnsToExport); const { exportedRows = 'filteredAndSorted' } = params; if (params.rowPositions) { params.rowPositions // pinnedRows are processed by `processPinnedTopRows` and `processPinnedBottomsRows` .filter((position) => position.rowPinned == null) .sort((a, b) => a.rowIndex - b.rowIndex) .map((position) => rowModel.getRow(position.rowIndex)) .forEach(processRow); return gridSerializingSession; } if (this.colModel.isPivotMode()) { if (usingCsrm) { rowModel.forEachPivotNode(processRow, true, exportedRows === 'filteredAndSorted'); } else if (usingSsrm) { rowModel.forEachNodeAfterFilterAndSort(processRow, true); } else { // must be enterprise, so we can just loop through all the nodes rowModel.forEachNode(processRow); } return gridSerializingSession; } // onlySelectedAllPages: user doing pagination and wants selected items from // other pages, so cannot use the standard row model as it won't have rows from // other pages. // onlySelectedNonStandardModel: if user wants selected in non standard row model // (eg viewport) then again RowModel cannot be used, so need to use selected instead. if (params.onlySelectedAllPages || onlySelectedNonStandardModel) { const selectedNodes = this.beans.selectionSvc?.getSelectedNodes() ?? []; this.replicateSortedOrder(selectedNodes); // serialize each node selectedNodes.forEach(processRow); } else { // here is everything else - including standard row model and selected. we don't use // the selection model even when just using selected, so that the result is the order // of the rows appearing on the screen. if (exportedRows === 'all') { rowModel.forEachNode(processRow); } else if (usingCsrm || usingSsrm) { rowModel.forEachNodeAfterFilterAndSort(processRow, true); } else { rowModel.forEachNode(processRow); } } return gridSerializingSession; }; } replicateSortedOrder(rows) { const { sortSvc, rowNodeSorter } = this.beans; if (!sortSvc || !rowNodeSorter) { return; } const sortOptions = sortSvc.getSortOptions(); const compareNodes = (rowA, rowB) => { if (rowA.rowIndex != null && rowB.rowIndex != null) { // if the rows have rowIndexes, this is the easiest way to compare, // as they're already ordered return rowA.rowIndex - rowB.rowIndex; } // if the level is the same, compare these nodes, or their parents if (rowA.level === rowB.level) { if (rowA.parent?.id === rowB.parent?.id) { return rowNodeSorter.compareRowNodes(sortOptions, { rowNode: rowA, currentPos: rowA.rowIndex ?? -1, }, { rowNode: rowB, currentPos: rowB.rowIndex ?? -1, }); } // level is same, but parent isn't, compare parents return compareNodes(rowA.parent, rowB.parent); } // if level is different, match levels if (rowA.level > rowB.level) { return compareNodes(rowA.parent, rowB); } return compareNodes(rowA, rowB.parent); }; // sort the nodes either by existing row index or compare them rows.sort(compareNodes); } processPinnedBottomRows(params, columnsToExport) { return (gridSerializingSession) => { const processRow = this.processRow.bind(this, gridSerializingSession, params, columnsToExport); if (params.rowPositions) { params.rowPositions // only pinnedBottom rows, other models are processed by `processRows` and `processPinnedTopRows` .filter((position) => position.rowPinned === 'bottom') .sort((a, b) => a.rowIndex - b.rowIndex) .map((position) => this.pinnedRowModel?.getPinnedBottomRow(position.rowIndex)) .forEach(processRow); } else { this.pinnedRowModel?.forEachPinnedRow('bottom', processRow); } return gridSerializingSession; }; } getColumnsToExport(params) { const { allColumns = false, skipRowGroups = false, exportRowNumbers = false, columnKeys } = params; const { colModel, gos, visibleCols } = this; const isPivotMode = colModel.isPivotMode(); const filterSpecialColumns = (col) => { if ((0, columnUtils_1.isColumnSelectionCol)(col)) { return false; } return !(0, columnUtils_1.isRowNumberCol)(col) || exportRowNumbers; }; if (columnKeys && columnKeys.length) { return colModel.getColsForKeys(columnKeys).filter(filterSpecialColumns); } const isTreeData = gos.get('treeData'); let columnsToExport = []; if (allColumns && !isPivotMode) { columnsToExport = colModel.getCols(); } else { columnsToExport = visibleCols.allCols; } columnsToExport = columnsToExport.filter((column) => filterSpecialColumns(column) && (skipRowGroups && !isTreeData ? !(0, columnUtils_1.isColumnGroupAutoCol)(column) : true)); return columnsToExport; } recursivelyAddHeaderGroups(displayedGroups, gridSerializingSession, processGroupHeaderCallback) { const directChildrenHeaderGroups = []; displayedGroups.forEach((columnGroupChild) => { const columnGroup = columnGroupChild; if (!columnGroup.getChildren) { return; } columnGroup.getChildren().forEach((it) => directChildrenHeaderGroups.push(it)); }); if (displayedGroups.length > 0 && (0, agColumnGroup_1.isColumnGroup)(displayedGroups[0])) { this.doAddHeaderHeader(gridSerializingSession, displayedGroups, processGroupHeaderCallback); } if (directChildrenHeaderGroups && directChildrenHeaderGroups.length > 0) { this.recursivelyAddHeaderGroups(directChildrenHeaderGroups, gridSerializingSession, processGroupHeaderCallback); } } doAddHeaderHeader(gridSerializingSession, displayedGroups, processGroupHeaderCallback) { const gridRowIterator = gridSerializingSession.onNewHeaderGroupingRow(); let columnIndex = 0; displayedGroups.forEach((columnGroupChild) => { const columnGroup = columnGroupChild; let name; if (processGroupHeaderCallback) { name = processGroupHeaderCallback((0, gridOptionsUtils_1._addGridCommonParams)(this.gos, { columnGroup: columnGroup, })); } else { name = this.beans.colNames.getDisplayNameForColumnGroup(columnGroup, 'header'); } const collapsibleGroupRanges = columnGroup .getLeafColumns() .reduce((collapsibleGroups, currentColumn, currentIdx, arr) => { let lastGroup = (0, array_1._last)(collapsibleGroups); const groupShow = currentColumn.getColumnGroupShow() === 'open'; if (!groupShow) { if (lastGroup && lastGroup[1] == null) { lastGroup[1] = currentIdx - 1; } } else if (!lastGroup || lastGroup[1] != null) { lastGroup = [currentIdx]; collapsibleGroups.push(lastGroup); } if (currentIdx === arr.length - 1 && lastGroup && lastGroup[1] == null) { lastGroup[1] = currentIdx; } return collapsibleGroups; }, []); gridRowIterator.onColumn(columnGroup, name || '', columnIndex++, columnGroup.getLeafColumns().length - 1, collapsibleGroupRanges); }); } } exports.GridSerializer = GridSerializer; /***/ }), /***/ 6331: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.columnFiltersCSS = void 0; exports.columnFiltersCSS = `.ag-set-filter{--ag-indentation-level:0}.ag-set-filter-item{align-items:center;display:flex;height:100%}:where(.ag-ltr) .ag-set-filter-item{padding-left:calc(var(--ag-widget-container-horizontal-padding) + var(--ag-indentation-level)*var(--ag-set-filter-indent-size))}:where(.ag-rtl) .ag-set-filter-item{padding-right:calc(var(--ag-widget-container-horizontal-padding) + var(--ag-indentation-level)*var(--ag-set-filter-indent-size))}.ag-set-filter-item-checkbox{display:flex;height:100%;width:100%}.ag-set-filter-group-icons{display:block;>*{cursor:pointer}}:where(.ag-ltr) .ag-set-filter-group-icons{margin-right:var(--ag-widget-container-horizontal-padding)}:where(.ag-rtl) .ag-set-filter-group-icons{margin-left:var(--ag-widget-container-horizontal-padding)}.ag-filter-body-wrapper{display:flex;flex-direction:column}:where(.ag-menu:not(.ag-tabs) .ag-filter) .ag-filter-body-wrapper,:where(.ag-menu:not(.ag-tabs) .ag-filter)>:not(.ag-filter-wrapper){min-width:180px}.ag-filter-filter{flex:1 1 0px}.ag-filter-condition{display:flex;justify-content:center}.ag-floating-filter-body{display:flex;flex:1 1 auto;height:100%;position:relative}.ag-floating-filter-full-body{align-items:center;display:flex;flex:1 1 auto;height:100%;overflow:hidden;width:100%}:where(.ag-floating-filter-full-body)>div{flex:1 1 auto}.ag-floating-filter-input{align-items:center;display:flex;width:100%;>*{flex:1 1 auto}:where(.ag-input-field-input[type=date]){width:1px}}.ag-floating-filter-button{display:flex;flex:none}.ag-set-floating-filter-input [disabled]{pointer-events:none}.ag-floating-filter-button-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;height:var(--ag-icon-size);width:var(--ag-icon-size)}.ag-filter-loading{align-items:unset;background-color:var(--ag-chrome-background-color);height:100%;padding:var(--ag-widget-container-vertical-padding) var(--ag-widget-container-horizontal-padding);position:absolute;width:100%;z-index:1;:where(.ag-menu) &{background-color:var(--ag-menu-background-color)}}.ag-filter-separator{border-top:1px solid var(--menu-separator-color)}:where(.ag-filter-select) .ag-picker-field-wrapper{width:0}.ag-filter-condition-operator{height:17px}:where(.ag-ltr) .ag-filter-condition-operator-or{margin-left:calc(var(--ag-spacing)*2)}:where(.ag-rtl) .ag-filter-condition-operator-or{margin-right:calc(var(--ag-spacing)*2)}.ag-set-filter-select-all{padding-top:var(--ag-widget-container-vertical-padding)}.ag-filter-no-matches,.ag-set-filter-list{height:calc(var(--ag-list-item-height)*6)}.ag-filter-no-matches{padding:var(--ag-widget-container-vertical-padding) var(--ag-widget-container-horizontal-padding)}.ag-set-filter-tree-list{height:calc(var(--ag-list-item-height)*10)}.ag-set-filter-filter{margin-left:var(--ag-widget-container-horizontal-padding);margin-right:var(--ag-widget-container-horizontal-padding);margin-top:var(--ag-widget-container-vertical-padding)}.ag-filter-to{margin-top:var(--ag-widget-vertical-spacing)}.ag-mini-filter{margin:var(--ag-widget-container-vertical-padding) var(--ag-widget-container-horizontal-padding)}:where(.ag-ltr) .ag-set-filter-add-group-indent{margin-left:calc(var(--ag-icon-size) + var(--ag-widget-container-horizontal-padding))}:where(.ag-rtl) .ag-set-filter-add-group-indent{margin-right:calc(var(--ag-icon-size) + var(--ag-widget-container-horizontal-padding))}:where(.ag-filter-menu) .ag-set-filter-list{min-width:200px}.ag-filter-virtual-list-item:focus-visible{box-shadow:inset var(--ag-focus-shadow)}.ag-filter-apply-panel{display:flex;justify-content:flex-end;overflow:hidden;padding:var(--ag-widget-vertical-spacing) var(--ag-widget-container-horizontal-padding) var(--ag-widget-container-vertical-padding)}.ag-filter-apply-panel-button{line-height:1.5}:where(.ag-ltr) .ag-filter-apply-panel-button{margin-left:calc(var(--ag-spacing)*2)}:where(.ag-rtl) .ag-filter-apply-panel-button{margin-right:calc(var(--ag-spacing)*2)}.ag-simple-filter-body-wrapper{display:flex;flex-direction:column;min-height:calc(var(--ag-list-item-height) + var(--ag-widget-container-vertical-padding) + var(--ag-widget-vertical-spacing));overflow-y:auto;padding:var(--ag-widget-container-vertical-padding) var(--ag-widget-container-horizontal-padding);padding-bottom:calc(var(--ag-widget-container-vertical-padding) - var(--ag-widget-vertical-spacing));&>*{margin-bottom:var(--ag-widget-vertical-spacing)}:where(.ag-resizer-wrapper){margin:0}}.ag-multi-filter-menu-item{margin:var(--ag-spacing) 0}.ag-multi-filter-group-title-bar{background-color:transparent;color:var(--ag-header-text-color);font-weight:500;padding:calc(var(--ag-spacing)*1.5) var(--ag-spacing)}.ag-group-filter-field-select-wrapper{display:flex;flex-direction:column;gap:var(--ag-widget-vertical-spacing);padding:var(--ag-widget-container-vertical-padding) var(--ag-widget-container-horizontal-padding)}`; /***/ }), /***/ 4527: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.showColumnFilter = exports.setColumnFilterModel = exports.getColumnFilterModel = exports.getFilterModel = exports.setFilterModel = exports.destroyFilter = exports.getColumnFilterInstance = exports.isColumnFilterPresent = void 0; const logging_1 = __webpack_require__(7764); function isColumnFilterPresent(beans) { const filterManager = beans.filterManager; return !!filterManager?.isColumnFilterPresent() || !!filterManager?.isAggregateFilterPresent(); } exports.isColumnFilterPresent = isColumnFilterPresent; function getColumnFilterInstance(beans, key) { return beans.filterManager?.getColumnFilterInstance(key) ?? Promise.resolve(undefined); } exports.getColumnFilterInstance = getColumnFilterInstance; function destroyFilter(beans, key) { const column = beans.colModel.getColDefCol(key); if (column) { return beans.filterManager?.destroyFilter(column, 'api'); } } exports.destroyFilter = destroyFilter; function setFilterModel(beans, model) { beans.frameworkOverrides.wrapIncoming(() => beans.filterManager?.setFilterModel(model)); } exports.setFilterModel = setFilterModel; function getFilterModel(beans) { return beans.filterManager?.getFilterModel() ?? {}; } exports.getFilterModel = getFilterModel; function getColumnFilterModel(beans, column) { return beans.filterManager?.getColumnFilterModel(column) ?? null; } exports.getColumnFilterModel = getColumnFilterModel; function setColumnFilterModel(beans, column, model) { return beans.filterManager?.setColumnFilterModel(column, model) ?? Promise.resolve(); } exports.setColumnFilterModel = setColumnFilterModel; function showColumnFilter(beans, colKey) { const column = beans.colModel.getCol(colKey); if (!column) { // Column not found, can't show filter (0, logging_1._error)(12, { colKey }); return; } beans.menuSvc?.showFilterMenu({ column, containerType: 'columnFilter', positionBy: 'auto', }); } exports.showColumnFilter = showColumnFilter; /***/ }), /***/ 219: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ColumnFilterService = void 0; const unwrapUserComp_1 = __webpack_require__(4126); const userCompUtils_1 = __webpack_require__(2036); const beanStub_1 = __webpack_require__(8731); const gridOptionsUtils_1 = __webpack_require__(7274); const generic_1 = __webpack_require__(4422); const promise_1 = __webpack_require__(7990); const logging_1 = __webpack_require__(7764); const floatingFilterMapper_1 = __webpack_require__(9990); const MONTH_LOCALE_TEXT = { january: 'January', february: 'February', march: 'March', april: 'April', may: 'May', june: 'June', july: 'July', august: 'August', september: 'September', october: 'October', november: 'November', december: 'December', }; const MONTH_KEYS = [ 'january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december', ]; function setFilterNumberComparator(a, b) { if (a == null) { return -1; } if (b == null) { return 1; } return parseFloat(a) - parseFloat(b); } class ColumnFilterService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'colFilter'; this.allColumnFilters = new Map(); this.allColumnListeners = new Map(); this.activeAggregateFilters = []; this.activeColumnFilters = []; // this is true when the grid is processing the filter change. this is used by the cell comps, so that they // don't flash when data changes due to filter changes. there is no need to flash when filter changes as the // user is in control, so doesn't make sense to show flashing changes. for example, go to main demo where // this feature is turned off (hack code to always return false for isSuppressFlashingCellsBecauseFiltering(), put in) // 100,000 rows and group by country. then do some filtering. all the cells flash, which is silly. this.processingFilterChange = false; // when we're waiting for cell data types to be inferred, we need to defer filter model updates this.filterModelUpdateQueue = []; this.columnFilterModelUpdateQueue = []; } postConstruct() { this.addManagedEventListeners({ gridColumnsChanged: this.onColumnsChanged.bind(this), beforeRefreshModel: ({ params }) => { // We listen to both row data updated and treeData changed as the SetFilter needs it if (params.rowDataUpdated || params.changedProps?.has('treeData')) { this.onNewRowsLoaded('rowDataUpdated'); } }, dataTypesInferred: this.processFilterModelUpdateQueue.bind(this), }); this.initialFilterModel = { ...(this.gos.get('initialState')?.filter?.filterModel ?? {}), }; } setFilterModel(model, source = 'api') { const { colModel, dataTypeSvc, filterManager } = this.beans; if (dataTypeSvc?.isPendingInference) { this.filterModelUpdateQueue.push({ model, source }); return; } const allPromises = []; const previousModel = this.getFilterModel(true); if (model) { // mark the filters as we set them, so any active filters left over we stop const modelKeys = new Set(Object.keys(model)); this.allColumnFilters.forEach((filterWrapper, colId) => { const newModel = model[colId]; allPromises.push(setModelOnFilterWrapper(filterWrapper.filterPromise, newModel)); modelKeys.delete(colId); }); // at this point, processedFields contains data for which we don't have a filter working yet modelKeys.forEach((colId) => { const column = colModel.getColDefCol(colId) || colModel.getCol(colId); if (!column) { (0, logging_1._warn)(62, { colId }); return; } if (!column.isFilterAllowed()) { (0, logging_1._warn)(63, { colId }); return; } const filterWrapper = this.getOrCreateFilterWrapper(column); if (!filterWrapper) { (0, logging_1._warn)(64, { colId }); return; } allPromises.push(setModelOnFilterWrapper(filterWrapper.filterPromise, model[colId])); }); } else { this.allColumnFilters.forEach((filterWrapper) => { allPromises.push(setModelOnFilterWrapper(filterWrapper.filterPromise, null)); }); } promise_1.AgPromise.all(allPromises).then(() => { const currentModel = this.getFilterModel(true); const columns = []; this.allColumnFilters.forEach((filterWrapper, colId) => { const before = previousModel ? previousModel[colId] : null; const after = currentModel ? currentModel[colId] : null; if (!(0, generic_1._jsonEquals)(before, after)) { columns.push(filterWrapper.column); } }); if (columns.length > 0) { filterManager?.onFilterChanged({ columns, source }); } }); } getFilterModel(excludeInitialState) { const result = {}; const { allColumnFilters, initialFilterModel, beans: { colModel }, } = this; allColumnFilters.forEach((filterWrapper, key) => { const model = this.getModelFromFilterWrapper(filterWrapper); if ((0, generic_1._exists)(model)) { result[key] = model; } }); if (!excludeInitialState) { for (const colId of Object.keys(initialFilterModel)) { const model = initialFilterModel[colId]; if ((0, generic_1._exists)(model) && !allColumnFilters.has(colId) && colModel.getCol(colId)?.isFilterAllowed()) { result[colId] = model; } } } return result; } getModelFromFilterWrapper(filterWrapper) { const { filter } = filterWrapper; if (filter) { if (typeof filter.getModel !== 'function') { (0, logging_1._warn)(66); return null; } return filter.getModel(); } else { // filter still being created. return initial state if it exists and hasn't been applied yet return this.getModelFromInitialState(filterWrapper.column); } } getModelFromInitialState(column) { return this.initialFilterModel[column.getColId()] ?? null; } isColumnFilterPresent() { return this.activeColumnFilters.length > 0; } isAggregateFilterPresent() { return !!this.activeAggregateFilters.length; } disableColumnFilters() { const { allColumnFilters } = this; if (allColumnFilters.size) { allColumnFilters.forEach((filterWrapper) => this.disposeFilterWrapper(filterWrapper, 'advancedFilterEnabled')); return true; } return false; } doAggregateFiltersPass(node, filterToSkip) { return this.doColumnFiltersPass(node, filterToSkip, true); } updateActiveFilters() { const isFilterActive = (filter) => { if (!filter) { return false; } // this never happens, including to avoid compile error if (!filter.isFilterActive) { (0, logging_1._warn)(67); return false; } return filter.isFilterActive(); }; const { colModel, gos } = this.beans; const groupFilterEnabled = !!(0, gridOptionsUtils_1._getGroupAggFiltering)(gos); const isAggFilter = (column) => { const isSecondary = !column.isPrimary(); // the only filters that can appear on secondary columns are groupAgg filters if (isSecondary) { return true; } const isShowingPrimaryColumns = !colModel.isPivotActive(); const isValueActive = column.isValueActive(); // primary columns are only ever groupAgg filters if a) value is active and b) showing primary columns if (!isValueActive || !isShowingPrimaryColumns) { return false; } // from here on we know: isPrimary=true, isValueActive=true, isShowingPrimaryColumns=true if (colModel.isPivotMode()) { // primary column is pretending to be a pivot column, ie pivotMode=true, but we are // still showing primary columns return true; } // we are not pivoting, so we groupFilter when it's an agg column return groupFilterEnabled; }; const activeAggregateFilters = []; const activeColumnFilters = []; return this.forEachColumnFilter((filter, filterWrapper) => { const filterActive = isFilterActive(filter); if (filterActive) { if (isAggFilter(filterWrapper.column)) { activeAggregateFilters.push(filter); } else { activeColumnFilters.push(filter); } } }).then(() => { this.activeAggregateFilters = activeAggregateFilters; this.activeColumnFilters = activeColumnFilters; }); } updateFilterFlagInColumns(source, additionalEventAttributes) { return this.forEachColumnFilter((filter, filterWrapper) => this.setColFilterActive(filterWrapper.column, filter.isFilterActive(), source, additionalEventAttributes)); } forEachColumnFilter(callback) { const promises = []; this.allColumnFilters.forEach((filterWrapper) => { const filterPromise = filterWrapper.filterPromise; if (filterPromise) { promises.push(filterPromise.then((filter) => callback(filter, filterWrapper))); } }); return promise_1.AgPromise.all(promises); } doColumnFiltersPass(node, filterToSkip, targetAggregates) { const { data, aggData } = node; const targetedFilters = targetAggregates ? this.activeAggregateFilters : this.activeColumnFilters; const targetedData = targetAggregates ? aggData : data; for (let i = 0; i < targetedFilters.length; i++) { const filter = targetedFilters[i]; if (filter == null || filter === filterToSkip) { continue; } if (typeof filter.doesFilterPass !== 'function') { // because users can do custom filters, give nice error message (0, logging_1._error)(91); continue; } if (!filter.doesFilterPass({ node, data: targetedData })) { return false; } } return true; } // sometimes (especially in React) the filter can call onFilterChanged when we are in the middle // of a render cycle. this would be bad, so we wait for render cycle to complete when this happens. // this happens in react when we change React State in the grid (eg setting RowCtrl's in RowContainer) // which results in React State getting applied in the main application, triggering a useEffect() to // be kicked off adn then the application calling the grid's API. in AG-6554, the custom filter was // getting it's useEffect() triggered in this way. callOnFilterChangedOutsideRenderCycle(params) { const { rowRenderer, filterManager } = this.beans; const action = () => { if (this.isAlive()) { filterManager?.onFilterChanged(params); } }; if (rowRenderer.isRefreshInProgress()) { setTimeout(action, 0); } else { action(); } } updateBeforeFilterChanged(params = {}) { const { filterInstance, additionalEventAttributes } = params; this.updateDependentFilters(); return this.updateActiveFilters().then(() => this.updateFilterFlagInColumns('filterChanged', additionalEventAttributes).then(() => { this.allColumnFilters.forEach((filterWrapper) => { if (!filterWrapper.filterPromise) { return; } filterWrapper.filterPromise.then((filter) => { if (filter && filter !== filterInstance && filter.onAnyFilterChanged) { filter.onAnyFilterChanged(); } }); }); // because internal events are not async in ag-grid, when the dispatchEvent // method comes back, we know all listeners have finished executing. this.processingFilterChange = true; })); } updateAfterFilterChanged() { this.processingFilterChange = false; } isSuppressFlashingCellsBecauseFiltering() { // if user has elected to always flash cell changes, then always return false, otherwise we suppress flashing // changes when filtering const allowShowChangeAfterFilter = this.gos.get('allowShowChangeAfterFilter') ?? false; return !allowShowChangeAfterFilter && this.processingFilterChange; } onNewRowsLoaded(source) { this.forEachColumnFilter((filter) => { filter.onNewRowsLoaded?.(); }) .then(() => this.updateFilterFlagInColumns(source, { afterDataChange: true })) .then(() => this.updateActiveFilters()); } createGetValue(filterColumn) { const { filterValueSvc, colModel } = this.beans; return (rowNode, column) => { const columnToUse = column ? colModel.getCol(column) : filterColumn; return columnToUse ? filterValueSvc.getValue(columnToUse, rowNode) : undefined; }; } isFilterActive(column) { const { filter } = this.cachedFilter(column) ?? {}; if (filter) { return filter.isFilterActive(); } // if not created, should only be active if there's a model return this.getModelFromInitialState(column) != null; } getOrCreateFilterWrapper(column) { if (!column.isFilterAllowed()) { return null; } let filterWrapper = this.cachedFilter(column); if (!filterWrapper) { filterWrapper = this.createFilterWrapper(column); this.setColumnFilterWrapper(column, filterWrapper); } return filterWrapper; } cachedFilter(column) { return this.allColumnFilters.get(column.getColId()); } getDefaultFilter(column) { let defaultFilter; const { gos, dataTypeSvc } = this.beans; if ((0, gridOptionsUtils_1._isSetFilterByDefault)(gos)) { defaultFilter = 'agSetColumnFilter'; } else { const cellDataType = dataTypeSvc?.getBaseDataType(column); if (cellDataType === 'number') { defaultFilter = 'agNumberColumnFilter'; } else if (cellDataType === 'date' || cellDataType === 'dateString') { defaultFilter = 'agDateColumnFilter'; } else { defaultFilter = 'agTextColumnFilter'; } } return defaultFilter; } getDefaultFloatingFilter(column) { let defaultFloatingFilterType; const { gos, dataTypeSvc } = this.beans; if ((0, gridOptionsUtils_1._isSetFilterByDefault)(gos)) { defaultFloatingFilterType = 'agSetColumnFloatingFilter'; } else { const cellDataType = dataTypeSvc?.getBaseDataType(column); if (cellDataType === 'number') { defaultFloatingFilterType = 'agNumberColumnFloatingFilter'; } else if (cellDataType === 'date' || cellDataType === 'dateString') { defaultFloatingFilterType = 'agDateColumnFloatingFilter'; } else { defaultFloatingFilterType = 'agTextColumnFloatingFilter'; } } return defaultFloatingFilterType; } createFilterInstance(column, filterWrapper) { const defaultFilter = this.getDefaultFilter(column); const colDef = column.getColDef(); let filterInstance; const params = { ...this.createFilterParams(column, colDef), filterModifiedCallback: () => this.filterModifiedCallbackFactory(filterInstance, column)(), filterChangedCallback: (additionalEventAttributes) => this.filterChangedCallbackFactory(filterInstance, column)(additionalEventAttributes), doesRowPassOtherFilter: (node) => this.beans.filterManager?.doesRowPassOtherFilters(filterInstance, node) ?? true, }; const compDetails = (0, userCompUtils_1._getFilterDetails)(this.beans.userCompFactory, colDef, params, defaultFilter); if (!compDetails) { return { filterPromise: null, compDetails: null }; } return { filterPromise: () => { const filterPromise = compDetails.newAgStackInstance(); filterPromise.then((r) => { filterInstance = r; if (filterWrapper) { filterWrapper.filter = r ?? undefined; } }); return filterPromise; }, compDetails, }; } createFilterParams(column, colDef) { const params = (0, gridOptionsUtils_1._addGridCommonParams)(this.gos, { column, colDef, rowModel: this.beans.rowModel, filterChangedCallback: () => { }, filterModifiedCallback: () => { }, getValue: this.createGetValue(column), doesRowPassOtherFilter: () => true, }); return params; } createFilterWrapper(column) { const filterWrapper = { column, filterPromise: null, compDetails: null, }; const { filterPromise, compDetails } = this.createFilterInstance(column, filterWrapper); filterWrapper.filterPromise = filterPromise?.() ?? null; filterWrapper.compDetails = compDetails; return filterWrapper; } onColumnsChanged() { const columns = []; const { colModel, filterManager } = this.beans; this.allColumnFilters.forEach((wrapper, colId) => { let currentColumn; if (wrapper.column.isPrimary()) { currentColumn = colModel.getColDefCol(colId); } else { currentColumn = colModel.getCol(colId); } // group columns can be recreated with the same colId if (currentColumn && currentColumn === wrapper.column) { return; } columns.push(wrapper.column); this.disposeFilterWrapper(wrapper, 'columnChanged'); this.disposeColumnListener(colId); }); const allFiltersAreGroupFilters = columns.every(isGroupFilter); // don't call `onFilterChanged` if only group column filter is present as it has no model if (columns.length > 0 && !allFiltersAreGroupFilters) { // When a filter changes as a side effect of a column changes, // we report 'api' as the source, so that the client can distinguish filterManager?.onFilterChanged({ columns, source: 'api' }); } else { // onFilterChanged does this already this.updateDependentFilters(); } } updateDependentFilters() { // Group column filters can be dependant on underlying column filters, but don't normally get created until they're used for the first time. // Instead, create them by default when any filter changes. this.beans.autoColSvc?.getColumns()?.forEach((groupColumn) => { if (isGroupFilter(groupColumn)) { this.getOrCreateFilterWrapper(groupColumn); } }); } // for group filters, can change dynamically whether they are allowed or not isFilterAllowed(column) { const isFilterAllowed = column.isFilterAllowed(); if (!isFilterAllowed) { return false; } const { filter } = this.allColumnFilters.get(column.getColId()) ?? {}; if (filter) { // defer to filter component isFilterAllowed if it exists return typeof filter?.isFilterAllowed === 'function' ? filter.isFilterAllowed() : true; } return true; } getFloatingFilterCompDetails(column, showParentFilter) { const parentFilterInstance = (callback) => { const filterComponent = this.getOrCreateFilterWrapper(column)?.filterPromise; if (filterComponent == null) { return; } filterComponent.then((instance) => { callback((0, unwrapUserComp_1._unwrapUserComp)(instance)); }); }; const colDef = column.getColDef(); const filterParams = { ...this.createFilterParams(column, colDef), filterChangedCallback: () => parentFilterInstance((filterInstance) => this.filterChangedCallbackFactory(filterInstance, column)()), }; const { userCompFactory, frameworkOverrides } = this.beans; const finalFilterParams = (0, userCompUtils_1._mergeFilterParamsWithApplicationProvidedParams)(userCompFactory, colDef, filterParams); let defaultFloatingFilterType = (0, floatingFilterMapper_1._getDefaultFloatingFilterType)(frameworkOverrides, colDef, () => this.getDefaultFloatingFilter(column)); if (defaultFloatingFilterType == null) { defaultFloatingFilterType = 'agReadOnlyFloatingFilter'; } const params = (0, gridOptionsUtils_1._addGridCommonParams)(this.gos, { column: column, filterParams: finalFilterParams, currentParentModel: () => this.getCurrentFloatingFilterParentModel(column), parentFilterInstance, showParentFilter, }); return (0, userCompUtils_1._getFloatingFilterCompDetails)(userCompFactory, colDef, params, defaultFloatingFilterType); } getCurrentFloatingFilterParentModel(column) { return this.getModelFromFilterWrapper(this.cachedFilter(column) ?? { column }); } // destroys the filter, so it no longer takes part destroyFilter(column, source = 'api') { const colId = column.getColId(); const filterWrapper = this.allColumnFilters.get(colId); this.disposeColumnListener(colId); delete this.initialFilterModel[colId]; if (filterWrapper) { this.disposeFilterWrapper(filterWrapper, source).then((wasActive) => { if (wasActive && this.isAlive()) { this.beans.filterManager?.onFilterChanged({ columns: [column], source: 'api', }); } }); } } disposeColumnListener(colId) { const columnListener = this.allColumnListeners.get(colId); if (columnListener) { this.allColumnListeners.delete(colId); columnListener(); } } disposeFilterWrapper(filterWrapper, source) { return (filterWrapper.filterPromise?.then((filter) => { const isActive = !!filter?.isFilterActive(); this.destroyBean(filter); this.setColFilterActive(filterWrapper.column, false, 'filterDestroyed'); this.allColumnFilters.delete(filterWrapper.column.getColId()); this.eventSvc.dispatchEvent({ type: 'filterDestroyed', source, column: filterWrapper.column, }); return isActive; }) ?? promise_1.AgPromise.resolve(false)); } filterModifiedCallbackFactory(filter, column) { return () => { this.eventSvc.dispatchEvent({ type: 'filterModified', column, filterInstance: filter, }); }; } filterChangedCallbackFactory(filter, column) { return (additionalEventAttributes) => { const source = additionalEventAttributes?.source ?? 'columnFilter'; const params = { filter, additionalEventAttributes, columns: [column], source, }; this.callOnFilterChangedOutsideRenderCycle(params); }; } checkDestroyFilter(colId) { const filterWrapper = this.allColumnFilters.get(colId); if (!filterWrapper) { return; } const column = filterWrapper.column; const { compDetails } = column.isFilterAllowed() ? this.createFilterInstance(column) : { compDetails: null }; // Case when filter component changes if (this.areFilterCompsDifferent(filterWrapper.compDetails, compDetails)) { this.destroyFilter(column, 'paramsUpdated'); return; } // Case when filter params changes const newFilterParams = column.getColDef().filterParams; // When filter wrapper does not have promise to retrieve FilterComp, destroy if (!filterWrapper.filterPromise) { this.destroyFilter(column, 'paramsUpdated'); return; } // Otherwise - Check for refresh method before destruction // If refresh() method is implemented - call it and destroy filter if it returns false // Otherwise - do nothing ( filter will not be destroyed - we assume new params are compatible with old ones ) filterWrapper.filterPromise.then((filter) => { const shouldRefreshFilter = filter?.refresh ? filter.refresh({ ...this.createFilterParams(column, column.getColDef()), filterModifiedCallback: this.filterModifiedCallbackFactory(filter, column), filterChangedCallback: this.filterChangedCallbackFactory(filter, column), doesRowPassOtherFilter: (node) => this.beans.filterManager?.doesRowPassOtherFilters(filter, node) ?? true, ...newFilterParams, }) : true; // framework wrapper always implements optional methods, but returns null if no underlying method if (shouldRefreshFilter === false) { this.destroyFilter(column, 'paramsUpdated'); } }); } setColumnFilterWrapper(column, filterWrapper) { const colId = column.getColId(); this.allColumnFilters.set(colId, filterWrapper); this.allColumnListeners.set(colId, this.addManagedListeners(column, { colDefChanged: () => this.checkDestroyFilter(colId) })[0]); } areFilterCompsDifferent(oldCompDetails, newCompDetails) { if (!newCompDetails || !oldCompDetails) { return true; } const { componentClass: oldComponentClass } = oldCompDetails; const { componentClass: newComponentClass } = newCompDetails; const isSameComponentClass = oldComponentClass === newComponentClass || // react hooks returns new wrappers, so check nested render method (oldComponentClass?.render && newComponentClass?.render && oldComponentClass.render === newComponentClass.render); return !isSameComponentClass; } hasFloatingFilters() { const gridColumns = this.beans.colModel.getCols(); return gridColumns.some((col) => col.getColDef().floatingFilter); } getColumnFilterInstance(key) { return new Promise((resolve) => { this.getFilterInstanceImpl(key).then((filter) => { resolve((0, unwrapUserComp_1._unwrapUserComp)(filter)); }); }); } getFilterInstanceImpl(key) { const column = this.beans.colModel.getColDefCol(key); if (!column) { return promise_1.AgPromise.resolve(undefined); } const filterPromise = this.getOrCreateFilterWrapper(column)?.filterPromise; return filterPromise ?? promise_1.AgPromise.resolve(null); } processFilterModelUpdateQueue() { this.filterModelUpdateQueue.forEach(({ model, source }) => this.setFilterModel(model, source)); this.filterModelUpdateQueue = []; this.columnFilterModelUpdateQueue.forEach(({ key, model, resolve }) => { this.setColumnFilterModel(key, model).then(() => resolve()); }); this.columnFilterModelUpdateQueue = []; } getColumnFilterModel(key) { const filterWrapper = this.getFilterWrapper(key); return filterWrapper ? this.getModelFromFilterWrapper(filterWrapper) : null; } setColumnFilterModel(key, model) { const { colModel, dataTypeSvc } = this.beans; if (dataTypeSvc?.isPendingInference) { let resolve = () => { }; const promise = new Promise((res) => { resolve = res; }); this.columnFilterModelUpdateQueue.push({ key, model, resolve }); return promise; } const column = colModel.getColDefCol(key); const filterWrapper = column ? this.getOrCreateFilterWrapper(column) : null; const convertPromise = (promise) => { return new Promise((resolve) => { promise.then((result) => resolve(result)); }); }; return filterWrapper ? convertPromise(setModelOnFilterWrapper(filterWrapper.filterPromise, model)) : Promise.resolve(); } getFilterWrapper(key) { const column = this.beans.colModel.getColDefCol(key); return column ? this.cachedFilter(column) ?? null : null; } setColDefPropertiesForDataType(colDef, dataTypeDefinition, formatValue) { const usingSetFilter = (0, gridOptionsUtils_1._isSetFilterByDefault)(this.gos); const translate = this.getLocaleTextFunc(); const mergeFilterParams = (params) => { const { filterParams } = colDef; colDef.filterParams = typeof filterParams === 'object' ? { ...filterParams, ...params, } : params; }; switch (dataTypeDefinition.baseDataType) { case 'number': { if (usingSetFilter) { mergeFilterParams({ comparator: setFilterNumberComparator, }); } break; } case 'boolean': { if (usingSetFilter) { mergeFilterParams({ valueFormatter: (params) => { if (!(0, generic_1._exists)(params.value)) { return translate('blanks', '(Blanks)'); } return translate(String(params.value), params.value ? 'True' : 'False'); }, }); } else { mergeFilterParams({ maxNumConditions: 1, debounceMs: 0, filterOptions: [ 'empty', { displayKey: 'true', displayName: 'True', predicate: (_filterValues, cellValue) => cellValue, numberOfInputs: 0, }, { displayKey: 'false', displayName: 'False', predicate: (_filterValues, cellValue) => cellValue === false, numberOfInputs: 0, }, ], }); } break; } case 'date': { if (usingSetFilter) { mergeFilterParams({ valueFormatter: (params) => { const valueFormatted = formatValue(params); return (0, generic_1._exists)(valueFormatted) ? valueFormatted : translate('blanks', '(Blanks)'); }, treeList: true, treeListFormatter: (pathKey, level) => { if (pathKey === 'NaN') { return translate('invalidDate', 'Invalid Date'); } if (level === 1 && pathKey != null) { const monthKey = MONTH_KEYS[Number(pathKey) - 1]; return translate(monthKey, MONTH_LOCALE_TEXT[monthKey]); } return pathKey ?? translate('blanks', '(Blanks)'); }, }); } else { mergeFilterParams({ isValidDate, }); } break; } case 'dateString': { const convertToDate = dataTypeDefinition.dateParser; if (usingSetFilter) { mergeFilterParams({ valueFormatter: (params) => { const valueFormatted = formatValue(params); return (0, generic_1._exists)(valueFormatted) ? valueFormatted : translate('blanks', '(Blanks)'); }, treeList: true, treeListPathGetter: (value) => { const date = convertToDate(value ?? undefined); return date ? [String(date.getFullYear()), String(date.getMonth() + 1), String(date.getDate())] : null; }, treeListFormatter: (pathKey, level) => { if (level === 1 && pathKey != null) { const monthKey = MONTH_KEYS[Number(pathKey) - 1]; return translate(monthKey, MONTH_LOCALE_TEXT[monthKey]); } return pathKey ?? translate('blanks', '(Blanks)'); }, }); } else { mergeFilterParams({ comparator: (filterDate, cellValue) => { const cellAsDate = convertToDate(cellValue); if (cellValue == null || cellAsDate < filterDate) { return -1; } if (cellAsDate > filterDate) { return 1; } return 0; }, isValidDate: (value) => typeof value === 'string' && isValidDate(convertToDate(value)), }); } break; } case 'object': { if (usingSetFilter) { mergeFilterParams({ valueFormatter: (params) => { const valueFormatted = formatValue(params); return (0, generic_1._exists)(valueFormatted) ? valueFormatted : translate('blanks', '(Blanks)'); }, }); } else { colDef.filterValueGetter = (params) => formatValue({ column: params.column, node: params.node, value: this.beans.valueSvc.getValue(params.column, params.node), }); } break; } } } // additionalEventAttributes is used by provided simple floating filter, so it can add 'floatingFilter=true' to the event setColFilterActive(column, active, source, additionalEventAttributes) { if (column.filterActive !== active) { column.filterActive = active; column.dispatchColEvent('filterActiveChanged', source); } column.dispatchColEvent('filterChanged', source, additionalEventAttributes); } destroy() { super.destroy(); this.allColumnFilters.forEach((filterWrapper) => this.disposeFilterWrapper(filterWrapper, 'gridDestroyed')); // don't need to destroy the listeners as they are managed listeners this.allColumnListeners.clear(); } } exports.ColumnFilterService = ColumnFilterService; function setModelOnFilterWrapper(filterPromise, newModel) { if (!filterPromise) { return promise_1.AgPromise.resolve(); } return new promise_1.AgPromise((resolve) => { filterPromise.then((filter) => { if (typeof filter.setModel !== 'function') { (0, logging_1._warn)(65); resolve(); } (filter.setModel(newModel) || promise_1.AgPromise.resolve()).then(() => resolve()); }); }); } function isGroupFilter(column) { return column.getColDef().filter === 'agGroupColumnFilter'; } function isValidDate(value) { return value instanceof Date && !isNaN(value.getTime()); } /***/ }), /***/ 9002: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.onFilterChanged = exports.isAnyFilterPresent = void 0; function isAnyFilterPresent(beans) { return !!beans.filterManager?.isAnyFilterPresent(); } exports.isAnyFilterPresent = isAnyFilterPresent; function onFilterChanged(beans, source = 'api') { beans.filterManager?.onFilterChanged({ source }); } exports.onFilterChanged = onFilterChanged; /***/ }), /***/ 5741: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.FILTER_LOCALE_TEXT = void 0; exports.FILTER_LOCALE_TEXT = { applyFilter: 'Apply', clearFilter: 'Clear', resetFilter: 'Reset', cancelFilter: 'Cancel', textFilter: 'Text Filter', numberFilter: 'Number Filter', dateFilter: 'Date Filter', setFilter: 'Set Filter', filterOoo: 'Filter...', empty: 'Choose one', equals: 'Equals', notEqual: 'Does not equal', lessThan: 'Less than', greaterThan: 'Greater than', inRange: 'Between', inRangeStart: 'From', inRangeEnd: 'To', lessThanOrEqual: 'Less than or equal to', greaterThanOrEqual: 'Greater than or equal to', contains: 'Contains', notContains: 'Does not contain', startsWith: 'Begins with', endsWith: 'Ends with', blank: 'Blank', notBlank: 'Not blank', before: 'Before', after: 'After', andCondition: 'AND', orCondition: 'OR', dateFormatOoo: 'yyyy-mm-dd', }; /***/ }), /***/ 8681: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.FilterManager = void 0; const beanStub_1 = __webpack_require__(8731); const gridOptionsUtils_1 = __webpack_require__(7274); const object_1 = __webpack_require__(6996); const promise_1 = __webpack_require__(7990); const logging_1 = __webpack_require__(7764); class FilterManager extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'filterManager'; // when we're waiting for cell data types to be inferred, we need to defer filter model updates this.advFilterModelUpdateQueue = []; } wireBeans(beans) { this.quickFilter = beans.quickFilter; this.advancedFilter = beans.advancedFilter; this.colFilter = beans.colFilter; } postConstruct() { const refreshFiltersForAggregations = this.refreshFiltersForAggregations.bind(this); const updateAdvFilterColumns = this.updateAdvFilterColumns.bind(this); this.addManagedEventListeners({ columnValueChanged: refreshFiltersForAggregations, columnPivotChanged: refreshFiltersForAggregations, columnPivotModeChanged: refreshFiltersForAggregations, newColumnsLoaded: updateAdvFilterColumns, columnVisible: updateAdvFilterColumns, advancedFilterEnabledChanged: ({ enabled }) => this.onAdvFilterEnabledChanged(enabled), dataTypesInferred: this.processFilterModelUpdateQueue.bind(this), }); this.externalFilterPresent = this.isExternalFilterPresentCallback(); this.addManagedPropertyListeners(['isExternalFilterPresent', 'doesExternalFilterPass'], () => { this.onFilterChanged({ source: 'api' }); }); this.updateAggFiltering(); this.addManagedPropertyListener('groupAggFiltering', () => { this.updateAggFiltering(); this.onFilterChanged(); }); if (this.quickFilter) { this.addManagedListeners(this.quickFilter, { quickFilterChanged: () => this.onFilterChanged({ source: 'quickFilter' }), }); } const { gos } = this; this.alwaysPassFilter = gos.get('alwaysPassFilter'); this.addManagedPropertyListener('alwaysPassFilter', () => { this.alwaysPassFilter = gos.get('alwaysPassFilter'); this.onFilterChanged({ source: 'api' }); }); } isExternalFilterPresentCallback() { const isFilterPresent = this.gos.getCallback('isExternalFilterPresent'); return typeof isFilterPresent === 'function' && isFilterPresent({}); } doesExternalFilterPass(node) { const doesFilterPass = this.gos.get('doesExternalFilterPass'); return typeof doesFilterPass === 'function' && doesFilterPass(node); } setFilterModel(model, source = 'api') { if (this.isAdvFilterEnabled()) { this.warnAdvFilters(); return; } this.colFilter?.setFilterModel(model, source); } getFilterModel() { return this.colFilter?.getFilterModel() ?? {}; } isColumnFilterPresent() { return !!this.colFilter?.isColumnFilterPresent(); } isAggregateFilterPresent() { return !!this.colFilter?.isAggregateFilterPresent(); } isChildFilterPresent() { return (this.isColumnFilterPresent() || this.isQuickFilterPresent() || this.externalFilterPresent || this.isAdvFilterPresent()); } isAnyFilterPresent() { return this.isChildFilterPresent() || this.isAggregateFilterPresent(); } isAdvFilterPresent() { return this.isAdvFilterEnabled() && this.advancedFilter.isFilterPresent(); } onAdvFilterEnabledChanged(enabled) { if (enabled) { if (this.colFilter?.disableColumnFilters()) { this.onFilterChanged({ source: 'advancedFilter' }); } } else { if (this.advancedFilter?.isFilterPresent()) { this.advancedFilter.setModel(null); this.onFilterChanged({ source: 'advancedFilter' }); } } } isAdvFilterEnabled() { return !!this.advancedFilter?.isEnabled(); } isAdvFilterHeaderActive() { return this.isAdvFilterEnabled() && this.advancedFilter.isHeaderActive(); } refreshFiltersForAggregations() { const isAggFiltering = (0, gridOptionsUtils_1._getGroupAggFiltering)(this.gos); if (isAggFiltering) { this.onFilterChanged(); } } onFilterChanged(params = {}) { const { source, additionalEventAttributes, columns = [] } = params; this.externalFilterPresent = this.isExternalFilterPresentCallback(); (this.colFilter ? this.colFilter.updateBeforeFilterChanged(params) : promise_1.AgPromise.resolve()).then(() => { const filterChangedEvent = { source, type: 'filterChanged', columns, }; if (additionalEventAttributes) { (0, object_1._mergeDeep)(filterChangedEvent, additionalEventAttributes); } this.eventSvc.dispatchEvent(filterChangedEvent); this.colFilter?.updateAfterFilterChanged(); }); } isSuppressFlashingCellsBecauseFiltering() { return !!this.colFilter?.isSuppressFlashingCellsBecauseFiltering(); } isQuickFilterPresent() { return !!this.quickFilter?.isFilterPresent(); } updateAggFiltering() { this.aggFiltering = !!(0, gridOptionsUtils_1._getGroupAggFiltering)(this.gos); } isAggregateQuickFilterPresent() { return this.isQuickFilterPresent() && this.shouldApplyQuickFilterAfterAgg(); } isNonAggregateQuickFilterPresent() { return this.isQuickFilterPresent() && !this.shouldApplyQuickFilterAfterAgg(); } shouldApplyQuickFilterAfterAgg() { return ((this.aggFiltering || this.beans.colModel.isPivotMode()) && !this.gos.get('applyQuickFilterBeforePivotOrAgg')); } doesRowPassOtherFilters(filterToSkip, node) { return this.doesRowPassFilter({ rowNode: node, filterInstanceToSkip: filterToSkip }); } doesRowPassAggregateFilters(params) { const { rowNode } = params; if (this.alwaysPassFilter?.(rowNode)) { return true; } // check quick filter if (this.isAggregateQuickFilterPresent() && !this.quickFilter.doesRowPass(rowNode)) { return false; } if (this.isAggregateFilterPresent() && !this.colFilter.doAggregateFiltersPass(rowNode, params.filterInstanceToSkip)) { return false; } // got this far, all filters pass return true; } doesRowPassFilter(params) { const { rowNode } = params; if (this.alwaysPassFilter?.(rowNode)) { return true; } // the row must pass ALL of the filters, so if any of them fail, // we return true. that means if a row passes the quick filter, // but fails the column filter, it fails overall // first up, check quick filter if (this.isNonAggregateQuickFilterPresent() && !this.quickFilter.doesRowPass(rowNode)) { return false; } // secondly, give the client a chance to reject this row if (this.externalFilterPresent && !this.doesExternalFilterPass(rowNode)) { return false; } // lastly, check column filter if (this.isColumnFilterPresent() && !this.colFilter.doColumnFiltersPass(rowNode, params.filterInstanceToSkip)) { return false; } if (this.isAdvFilterPresent() && !this.advancedFilter.doesFilterPass(rowNode)) { return false; } // got this far, all filters pass return true; } isFilterActive(column) { return !!this.colFilter?.isFilterActive(column); } getOrCreateFilterWrapper(column) { return this.colFilter?.getOrCreateFilterWrapper(column) ?? null; } getDefaultFloatingFilter(column) { return this.colFilter.getDefaultFloatingFilter(column); } createFilterParams(column, colDef) { return this.colFilter.createFilterParams(column, colDef); } // for group filters, can change dynamically whether they are allowed or not isFilterAllowed(column) { if (this.isAdvFilterEnabled()) { return false; } return !!this.colFilter?.isFilterAllowed(column); } getFloatingFilterCompDetails(column, showParentFilter) { return this.colFilter?.getFloatingFilterCompDetails(column, showParentFilter); } getCurrentFloatingFilterParentModel(column) { return this.colFilter?.getCurrentFloatingFilterParentModel(column); } // destroys the filter, so it no longer takes part destroyFilter(column, source = 'api') { this.colFilter?.destroyFilter(column, source); } areFilterCompsDifferent(oldCompDetails, newCompDetails) { return !!this.colFilter?.areFilterCompsDifferent(oldCompDetails, newCompDetails); } getAdvFilterModel() { return this.isAdvFilterEnabled() ? this.advancedFilter.getModel() : null; } setAdvFilterModel(expression, source = 'api') { if (!this.isAdvFilterEnabled()) { return; } if (this.beans.dataTypeSvc?.isPendingInference) { this.advFilterModelUpdateQueue.push(expression); return; } this.advancedFilter.setModel(expression ?? null); this.onFilterChanged({ source }); } toggleAdvFilterBuilder(show, source) { if (!this.isAdvFilterEnabled()) { return; } this.advancedFilter.getCtrl().toggleFilterBuilder({ source, force: show }); } updateAdvFilterColumns() { if (!this.isAdvFilterEnabled()) { return; } if (this.advancedFilter.updateValidity()) { this.onFilterChanged({ source: 'advancedFilter' }); } } hasFloatingFilters() { if (this.isAdvFilterEnabled()) { return false; } return !!this.colFilter?.hasFloatingFilters(); } getColumnFilterInstance(key) { if (this.isAdvFilterEnabled()) { this.warnAdvFilters(); return Promise.resolve(undefined); } return this.colFilter?.getColumnFilterInstance(key) ?? Promise.resolve(undefined); } warnAdvFilters() { // Column Filter API methods have been disabled as Advanced Filters are enabled (0, logging_1._warn)(68); } setupAdvFilterHeaderComp(eCompToInsertBefore) { this.advancedFilter?.getCtrl().setupHeaderComp(eCompToInsertBefore); } getHeaderRowCount() { return this.isAdvFilterHeaderActive() ? 1 : 0; } getHeaderHeight() { return this.isAdvFilterHeaderActive() ? this.advancedFilter.getCtrl().getHeaderHeight() : 0; } processFilterModelUpdateQueue() { this.advFilterModelUpdateQueue.forEach((model) => this.setAdvFilterModel(model)); this.advFilterModelUpdateQueue = []; } getColumnFilterModel(key) { return this.colFilter?.getColumnFilterModel(key); } setColumnFilterModel(key, model) { if (this.isAdvFilterEnabled()) { this.warnAdvFilters(); return Promise.resolve(); } return this.colFilter?.setColumnFilterModel(key, model) ?? Promise.resolve(); } setColDefPropertiesForDataType(colDef, dataTypeDefinition, formatValue) { this.colFilter?.setColDefPropertiesForDataType(colDef, dataTypeDefinition, formatValue); } } exports.FilterManager = FilterManager; /***/ }), /***/ 9665: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.FilterMenuFactory = void 0; const keyCode_1 = __webpack_require__(9853); const beanStub_1 = __webpack_require__(8731); const gridOptionsUtils_1 = __webpack_require__(7274); const menuService_1 = __webpack_require__(8994); const aria_1 = __webpack_require__(5230); const dom_1 = __webpack_require__(3507); const focus_1 = __webpack_require__(2331); const logging_1 = __webpack_require__(7764); const filterWrapperComp_1 = __webpack_require__(1854); class FilterMenuFactory extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'filterMenuFactory'; } wireBeans(beans) { this.popupSvc = beans.popupSvc; } hideActiveMenu() { this.hidePopup?.(); } showMenuAfterMouseEvent(column, mouseEvent, containerType, onClosedCallback) { this.showPopup(column, (eMenu) => { this.popupSvc?.positionPopupUnderMouseEvent({ column, type: containerType, mouseEvent, ePopup: eMenu, }); }, containerType, mouseEvent.target, (0, gridOptionsUtils_1._isLegacyMenuEnabled)(this.gos), onClosedCallback); } showMenuAfterButtonClick(column, eventSource, containerType, onClosedCallback) { let multiplier = -1; let alignSide = 'left'; const isLegacyMenuEnabled = (0, gridOptionsUtils_1._isLegacyMenuEnabled)(this.gos); if (!isLegacyMenuEnabled && this.gos.get('enableRtl')) { multiplier = 1; alignSide = 'right'; } const nudgeX = isLegacyMenuEnabled ? undefined : 4 * multiplier; const nudgeY = isLegacyMenuEnabled ? undefined : 4; this.showPopup(column, (eMenu) => { this.popupSvc?.positionPopupByComponent({ type: containerType, eventSource, ePopup: eMenu, nudgeX, nudgeY, alignSide, keepWithinBounds: true, position: 'under', column, }); }, containerType, eventSource, isLegacyMenuEnabled, onClosedCallback); } showPopup(column, positionCallback, containerType, eventSource, isLegacyMenuEnabled, onClosedCallback) { const comp = column ? this.createBean(new filterWrapperComp_1.FilterWrapperComp(column, 'COLUMN_MENU')) : undefined; this.activeMenu = comp; if (!comp?.hasFilter() || !column) { (0, logging_1._error)(57); return; } const eMenu = document.createElement('div'); (0, aria_1._setAriaRole)(eMenu, 'presentation'); eMenu.classList.add('ag-menu'); if (!isLegacyMenuEnabled) { eMenu.classList.add('ag-filter-menu'); } [this.tabListener] = this.addManagedElementListeners(eMenu, { keydown: (e) => this.trapFocusWithin(e, eMenu), }); // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain eMenu.appendChild(comp?.getGui()); let hidePopup; const afterGuiDetached = () => comp?.afterGuiDetached(); const anchorToElement = (0, gridOptionsUtils_1._isColumnMenuAnchoringEnabled)(this.gos) ? eventSource ?? this.beans.ctrlsSvc.getGridBodyCtrl().eGridBody : undefined; const closedCallback = (e) => { (0, menuService_1._setColMenuVisible)(column, false, 'contextMenu'); const isKeyboardEvent = e instanceof KeyboardEvent; if (this.tabListener) { this.tabListener = this.tabListener(); } if (isKeyboardEvent && eventSource && (0, dom_1._isVisible)(eventSource)) { const focusableEl = (0, focus_1._findTabbableParent)(eventSource); focusableEl?.focus({ preventScroll: true }); } afterGuiDetached(); this.destroyBean(this.activeMenu); this.dispatchVisibleChangedEvent(false, containerType, column); onClosedCallback?.(); }; const translate = this.getLocaleTextFunc(); const ariaLabel = isLegacyMenuEnabled && containerType !== 'columnFilter' ? translate('ariaLabelColumnMenu', 'Column Menu') : translate('ariaLabelColumnFilter', 'Column Filter'); const addPopupRes = this.popupSvc?.addPopup({ modal: true, eChild: eMenu, closeOnEsc: true, closedCallback, positionCallback: () => positionCallback(eMenu), anchorToElement, ariaLabel, }); if (addPopupRes) { this.hidePopup = hidePopup = addPopupRes.hideFunc; } comp.afterInit().then(() => { // need to make sure the filter is present before positioning, as only // after filter it is visible can we find out what the width of it is positionCallback(eMenu); comp.afterGuiAttached({ container: containerType, hidePopup }); }); (0, menuService_1._setColMenuVisible)(column, true, 'contextMenu'); this.dispatchVisibleChangedEvent(true, containerType, column); } trapFocusWithin(e, menu) { if (e.key !== keyCode_1.KeyCode.TAB || e.defaultPrevented || (0, focus_1._findNextFocusableElement)(this.beans, menu, false, e.shiftKey)) { return; } e.preventDefault(); (0, focus_1._focusInto)(menu, e.shiftKey); } dispatchVisibleChangedEvent(visible, containerType, column) { this.eventSvc.dispatchEvent({ type: 'columnMenuVisibleChanged', visible, switchingTab: false, key: containerType, column: column ?? null, columnGroup: null, }); } isMenuEnabled(column) { // for standard, we show menu if filter is enabled, and the menu is not suppressed by passing an empty array return column.isFilterAllowed() && (column.getColDef().menuTabs ?? ['filterMenuTab']).includes('filterMenuTab'); } showMenuAfterContextMenuEvent() { // not supported in standard menu } destroy() { this.destroyBean(this.activeMenu); super.destroy(); } } exports.FilterMenuFactory = FilterMenuFactory; /***/ }), /***/ 5432: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ExternalFilterModule = exports.QuickFilterModule = exports.DateFilterModule = exports.NumberFilterModule = exports.TextFilterModule = exports.CustomFilterModule = exports.ColumnFilterModule = exports.FilterValueModule = exports.FilterCoreModule = exports.ClientSideRowModelFilterModule = void 0; const filterStage_1 = __webpack_require__(8287); const headerFilterCellCtrl_1 = __webpack_require__(3868); const sharedMenuModule_1 = __webpack_require__(3472); const version_1 = __webpack_require__(7205); const popupModule_1 = __webpack_require__(3137); const column_filters_css_GENERATED_1 = __webpack_require__(6331); const columnFilterApi_1 = __webpack_require__(4527); const columnFilterService_1 = __webpack_require__(219); const filterApi_1 = __webpack_require__(9002); const filterManager_1 = __webpack_require__(8681); const filterMenuFactory_1 = __webpack_require__(9665); const filterValueService_1 = __webpack_require__(3508); const readOnlyFloatingFilter_1 = __webpack_require__(6657); const dateFilter_1 = __webpack_require__(3725); const dateFloatingFilter_1 = __webpack_require__(3091); const defaultDateComponent_1 = __webpack_require__(5459); const numberFilter_1 = __webpack_require__(8988); const numberFloatingFilter_1 = __webpack_require__(4789); const textFilter_1 = __webpack_require__(2811); const textFloatingFilter_1 = __webpack_require__(8305); const quickFilterApi_1 = __webpack_require__(5381); const quickFilterService_1 = __webpack_require__(1238); /** * @internal */ exports.ClientSideRowModelFilterModule = { moduleName: 'ClientSideRowModelFilter', version: version_1.VERSION, rowModels: ['clientSide'], beans: [filterStage_1.FilterStage], }; /** * @internal */ exports.FilterCoreModule = { moduleName: 'FilterCore', version: version_1.VERSION, beans: [filterManager_1.FilterManager], apiFunctions: { isAnyFilterPresent: filterApi_1.isAnyFilterPresent, onFilterChanged: filterApi_1.onFilterChanged, }, css: [column_filters_css_GENERATED_1.columnFiltersCSS], dependsOn: [exports.ClientSideRowModelFilterModule], }; /** * @internal */ exports.FilterValueModule = { moduleName: 'FilterValue', version: version_1.VERSION, beans: [filterValueService_1.FilterValueService], }; /** * @internal */ exports.ColumnFilterModule = { moduleName: 'ColumnFilter', version: version_1.VERSION, beans: [columnFilterService_1.ColumnFilterService, filterMenuFactory_1.FilterMenuFactory], dynamicBeans: { headerFilterCellCtrl: headerFilterCellCtrl_1.HeaderFilterCellCtrl }, icons: { // open filter button - header, floating filter, menu filter: 'filter', // filter is applied - header (legacy column menu), filter tool panel filterActive: 'filter', }, apiFunctions: { isColumnFilterPresent: columnFilterApi_1.isColumnFilterPresent, getColumnFilterInstance: columnFilterApi_1.getColumnFilterInstance, destroyFilter: columnFilterApi_1.destroyFilter, setFilterModel: columnFilterApi_1.setFilterModel, getFilterModel: columnFilterApi_1.getFilterModel, getColumnFilterModel: columnFilterApi_1.getColumnFilterModel, setColumnFilterModel: columnFilterApi_1.setColumnFilterModel, showColumnFilter: columnFilterApi_1.showColumnFilter, }, dependsOn: [exports.FilterCoreModule, popupModule_1.PopupModule, exports.FilterValueModule, sharedMenuModule_1.SharedMenuModule], }; /** * @feature Filtering -> Custom Column Filters */ exports.CustomFilterModule = { moduleName: 'CustomFilter', version: version_1.VERSION, userComponents: { agReadOnlyFloatingFilter: readOnlyFloatingFilter_1.ReadOnlyFloatingFilter }, dependsOn: [exports.ColumnFilterModule], }; /** * @feature Filtering -> Text Filter */ exports.TextFilterModule = { moduleName: 'TextFilter', version: version_1.VERSION, dependsOn: [exports.ColumnFilterModule], userComponents: { agTextColumnFilter: textFilter_1.TextFilter, agTextColumnFloatingFilter: textFloatingFilter_1.TextFloatingFilter, }, }; /** * @feature Filtering -> Number Filter */ exports.NumberFilterModule = { moduleName: 'NumberFilter', version: version_1.VERSION, dependsOn: [exports.ColumnFilterModule], userComponents: { agNumberColumnFilter: numberFilter_1.NumberFilter, agNumberColumnFloatingFilter: numberFloatingFilter_1.NumberFloatingFilter, }, }; /** * @feature Filtering -> Date Filter */ exports.DateFilterModule = { moduleName: 'DateFilter', version: version_1.VERSION, dependsOn: [exports.ColumnFilterModule], userComponents: { agDateColumnFilter: dateFilter_1.DateFilter, agDateInput: defaultDateComponent_1.DefaultDateComponent, agDateColumnFloatingFilter: dateFloatingFilter_1.DateFloatingFilter, }, }; /** * @internal */ const QuickFilterCoreModule = { moduleName: 'QuickFilterCore', version: version_1.VERSION, rowModels: ['clientSide'], beans: [quickFilterService_1.QuickFilterService], dependsOn: [exports.FilterCoreModule, exports.FilterValueModule], }; /** * @feature Filtering -> Quick Filter * @gridOption quickFilterText */ exports.QuickFilterModule = { moduleName: 'QuickFilter', version: version_1.VERSION, apiFunctions: { isQuickFilterPresent: quickFilterApi_1.isQuickFilterPresent, getQuickFilter: quickFilterApi_1.getQuickFilter, resetQuickFilter: quickFilterApi_1.resetQuickFilter, }, dependsOn: [QuickFilterCoreModule], }; /** * @feature Filtering -> External Filter * @gridOption doesExternalFilterPass */ exports.ExternalFilterModule = { moduleName: 'ExternalFilter', version: version_1.VERSION, dependsOn: [exports.FilterCoreModule], }; /***/ }), /***/ 3508: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.FilterValueService = void 0; const beanStub_1 = __webpack_require__(8731); const gridOptionsUtils_1 = __webpack_require__(7274); class FilterValueService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'filterValueSvc'; } getValue(column, rowNode) { if (!rowNode) { return; } const colDef = column.getColDef(); const { filterValueGetter } = colDef; if (filterValueGetter) { return this.executeFilterValueGetter(filterValueGetter, rowNode.data, column, rowNode, colDef); } return this.beans.valueSvc.getValue(column, rowNode); } executeFilterValueGetter( // eslint-disable-next-line @typescript-eslint/ban-types valueGetter, data, column, node, colDef) { const { expressionSvc, valueSvc } = this.beans; const params = (0, gridOptionsUtils_1._addGridCommonParams)(this.gos, { data, node, column, colDef, getValue: valueSvc.getValueCallback.bind(valueSvc, node), }); if (typeof valueGetter === 'function') { return valueGetter(params); } return expressionSvc?.evaluate(valueGetter, params); } } exports.FilterValueService = FilterValueService; /***/ }), /***/ 1854: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.FilterWrapperComp = void 0; const dom_1 = __webpack_require__(3507); const generic_1 = __webpack_require__(4422); const promise_1 = __webpack_require__(7990); const logging_1 = __webpack_require__(7764); const component_1 = __webpack_require__(8020); class FilterWrapperComp extends component_1.Component { constructor(column, source) { super(/* html */ `
`); this.column = column; this.source = source; this.filterWrapper = null; } postConstruct() { this.createFilter(true); this.addManagedEventListeners({ filterDestroyed: this.onFilterDestroyed.bind(this) }); } hasFilter() { return !!this.filterWrapper; } getFilter() { return this.filterWrapper?.filterPromise ?? null; } afterInit() { return this.filterWrapper?.filterPromise?.then(() => { }) ?? promise_1.AgPromise.resolve(); } afterGuiAttached(params) { this.filterWrapper?.filterPromise?.then((filter) => { filter?.afterGuiAttached?.(params); }); } afterGuiDetached() { this.filterWrapper?.filterPromise?.then((filter) => { filter?.afterGuiDetached?.(); }); } createFilter(init) { const { column, source } = this; this.filterWrapper = this.beans.filterManager?.getOrCreateFilterWrapper(column) ?? null; if (!this.filterWrapper?.filterPromise) { return; } this.filterWrapper.filterPromise.then((filter) => { const guiFromFilter = filter.getGui(); if (!(0, generic_1._exists)(guiFromFilter)) { (0, logging_1._warn)(69, { guiFromFilter }); } this.appendChild(guiFromFilter); if (init) { this.eventSvc.dispatchEvent({ type: 'filterOpened', column, source, eGui: this.getGui(), }); } }); } onFilterDestroyed(event) { if ((event.source === 'api' || event.source === 'paramsUpdated') && event.column.getId() === this.column.getId() && this.beans.colModel.getColDefCol(this.column)) { // filter has been destroyed by the API or params changing. If the column still exists, need to recreate UI component (0, dom_1._clearElement)(this.getGui()); this.createFilter(); } } destroy() { this.filterWrapper = null; super.destroy(); } } exports.FilterWrapperComp = FilterWrapperComp; /***/ }), /***/ 9990: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports._getDefaultFloatingFilterType = void 0; const userCompUtils_1 = __webpack_require__(2036); function _getDefaultFloatingFilterType(frameworkOverrides, def, getFromDefault) { if (def == null) { return null; } let defaultFloatingFilterType = null; const { compName, jsComp, fwComp } = (0, userCompUtils_1._getFilterCompKeys)(frameworkOverrides, def); if (compName) { const floatingFilterTypeMap = { agSetColumnFilter: 'agSetColumnFloatingFilter', agMultiColumnFilter: 'agMultiColumnFloatingFilter', agGroupColumnFilter: 'agGroupColumnFloatingFilter', agNumberColumnFilter: 'agNumberColumnFloatingFilter', agDateColumnFilter: 'agDateColumnFloatingFilter', agTextColumnFilter: 'agTextColumnFloatingFilter', }; // will be undefined if not in the map defaultFloatingFilterType = floatingFilterTypeMap[compName]; } else { const usingDefaultFilter = jsComp == null && fwComp == null && def.filter === true; if (usingDefaultFilter) { defaultFloatingFilterType = getFromDefault(); } } return defaultFloatingFilterType; } exports._getDefaultFloatingFilterType = _getDefaultFloatingFilterType; /***/ }), /***/ 7287: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.FloatingFilterTextInputService = void 0; const beanStub_1 = __webpack_require__(8731); const agInputTextField_1 = __webpack_require__(5946); const component_1 = __webpack_require__(8020); class FloatingFilterTextInputService extends beanStub_1.BeanStub { constructor(params) { super(); this.params = params; this.eInput = component_1.RefPlaceholder; this.onValueChanged = () => { }; } setupGui(parentElement) { this.eInput = this.createManagedBean(new agInputTextField_1.AgInputTextField(this.params?.config)); const eInput = this.eInput.getGui(); parentElement.appendChild(eInput); const listener = (e) => this.onValueChanged(e); this.addManagedListeners(eInput, { input: listener, keydown: listener, }); } setEditable(editable) { this.eInput.setDisabled(!editable); } getValue() { return this.eInput.getValue(); } setValue(value, silent) { this.eInput.setValue(value, silent); } setValueChangedListener(listener) { this.onValueChanged = listener; } setParams({ ariaLabel, autoComplete }) { const { eInput } = this; eInput.setInputAriaLabel(ariaLabel); if (autoComplete !== undefined) { eInput.setAutoComplete(autoComplete); } } } exports.FloatingFilterTextInputService = FloatingFilterTextInputService; /***/ }), /***/ 361: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.isUseApplyButton = exports.getDebounceMs = void 0; const logging_1 = __webpack_require__(7764); function getDebounceMs(params, debounceDefault) { const { debounceMs } = params; if (isUseApplyButton(params)) { if (debounceMs != null) { (0, logging_1._warn)(71); } return 0; } return debounceMs ?? debounceDefault; } exports.getDebounceMs = getDebounceMs; function isUseApplyButton(params) { return (params.buttons?.indexOf('apply') ?? -1) >= 0; } exports.isUseApplyButton = isUseApplyButton; /***/ }), /***/ 6657: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ReadOnlyFloatingFilter = void 0; const agInputTextField_1 = __webpack_require__(5946); const component_1 = __webpack_require__(8020); // optional floating filter for user provided filters - instead of providing a floating filter, // they can provide a getModelAsString() method on the filter instead. this class just displays // the string returned from getModelAsString() class ReadOnlyFloatingFilter extends component_1.Component { constructor() { super( /* html */ ` `, [agInputTextField_1.AgInputTextFieldSelector]); this.eFloatingFilterText = component_1.RefPlaceholder; } init(params) { this.params = params; const displayName = this.beans.colNames.getDisplayNameForColumn(params.column, 'header', true); this.eFloatingFilterText .setDisabled(true) .setInputAriaLabel(`${displayName} ${this.getLocaleTextFunc()('ariaFilterInput', 'Filter Input')}`); } onParentModelChanged(parentModel) { if (parentModel == null) { this.eFloatingFilterText.setValue(''); return; } this.params.parentFilterInstance((filterInstance) => { // it would be nice to check if getModelAsString was present before creating this component, // however that is not possible, as React Hooks and VueJS don't attached the methods to the Filter until // AFTER the filter is created, not allowing inspection before this (we create floating filters as columns // are drawn, but the parent filters are only created when needed). if (filterInstance.getModelAsString) { const modelAsString = filterInstance.getModelAsString(parentModel); this.eFloatingFilterText.setValue(modelAsString); } }); } refresh(params) { this.init(params); } } exports.ReadOnlyFloatingFilter = ReadOnlyFloatingFilter; /***/ }), /***/ 3141: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.SimpleFloatingFilter = void 0; const component_1 = __webpack_require__(8020); const optionsFactory_1 = __webpack_require__(4824); class SimpleFloatingFilter extends component_1.Component { constructor() { super(...arguments); this.defaultDebounceMs = 0; } setLastTypeFromModel(model) { // if no model provided by the parent filter use default if (!model) { this.lastType = this.optionsFactory.defaultOption; return; } const isCombined = model.operator; let condition; if (isCombined) { const combinedModel = model; condition = combinedModel.conditions[0]; } else { condition = model; } this.lastType = condition.type; } canWeEditAfterModelFromParentFilter(model) { if (!model) { // if no model, then we can edit as long as the lastType is something we can edit, as this // is the type we will provide to the parent filter if the user decides to use the floating filter. return this.isTypeEditable(this.lastType); } // never allow editing if the filter is combined (ie has two parts) const isCombined = model.operator; if (isCombined) { return false; } const simpleModel = model; return this.isTypeEditable(simpleModel.type); } init(params) { this.setSimpleParams(params, false); } setSimpleParams(params, update = true) { const optionsFactory = new optionsFactory_1.OptionsFactory(); this.optionsFactory = optionsFactory; optionsFactory.init(params.filterParams, this.getDefaultOptions()); const defaultOption = optionsFactory.defaultOption; // Initial call if (!update) { this.lastType = defaultOption; } // readOnly is a property of ProvidedFilterParams - we need to find a better (type-safe) // way to support reading this in the future. this.readOnly = !!params.filterParams.readOnly; // we are editable if: // 1) there is a type (user has configured filter wrong if not type) // AND // 2) the default type is not 'inRange' const editable = this.isTypeEditable(defaultOption); this.setEditable(editable); } refresh(params) { this.setSimpleParams(params); } hasSingleInput(filterType) { const numberOfInputs = this.optionsFactory.getCustomOption(filterType)?.numberOfInputs; return numberOfInputs == null || numberOfInputs == 1; } isTypeEditable(type) { const uneditableTypes = ['inRange', 'empty', 'blank', 'notBlank']; return (!!type && !this.readOnly && this.hasSingleInput(type) && uneditableTypes.indexOf(type) < 0); } getAriaLabel(params) { const displayName = this.beans.colNames.getDisplayNameForColumn(params.column, 'header', true); return `${displayName} ${this.getLocaleTextFunc()('ariaFilterInput', 'Filter Input')}`; } } exports.SimpleFloatingFilter = SimpleFloatingFilter; /***/ }), /***/ 8922: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.TextInputFloatingFilter = void 0; const keyCode_1 = __webpack_require__(9853); const dom_1 = __webpack_require__(3507); const function_1 = __webpack_require__(2043); const component_1 = __webpack_require__(8020); const textFilterUtils_1 = __webpack_require__(2470); const providedFilterUtils_1 = __webpack_require__(361); const simpleFloatingFilter_1 = __webpack_require__(3141); class TextInputFloatingFilter extends simpleFloatingFilter_1.SimpleFloatingFilter { constructor() { super(...arguments); this.eFloatingFilterInputContainer = component_1.RefPlaceholder; this.defaultDebounceMs = 500; } postConstruct() { this.setTemplate(/* html */ ` `); } onParentModelChanged(model, event) { if (event?.afterFloatingFilter || event?.afterDataChange) { // if the floating filter triggered the change, it is already in sync. // Data changes also do not affect provided text floating filters return; } this.setLastTypeFromModel(model); this.setEditable(this.canWeEditAfterModelFromParentFilter(model)); this.inputSvc.setValue(this.filterModelFormatter.getModelAsString(model)); } init(params) { this.setupFloatingFilterInputService(params); super.init(params); this.setTextInputParams(params); } setupFloatingFilterInputService(params) { this.inputSvc = this.createFloatingFilterInputService(params); this.inputSvc.setupGui(this.eFloatingFilterInputContainer); } setTextInputParams(params) { this.params = params; const autoComplete = params.browserAutoComplete ?? false; const { inputSvc, defaultDebounceMs, readOnly } = this; inputSvc.setParams({ ariaLabel: this.getAriaLabel(params), autoComplete, }); this.applyActive = (0, providedFilterUtils_1.isUseApplyButton)(params.filterParams); if (!readOnly) { const debounceMs = (0, providedFilterUtils_1.getDebounceMs)(params.filterParams, defaultDebounceMs); const toDebounce = (0, function_1._debounce)(this, this.syncUpWithParentFilter.bind(this), debounceMs); inputSvc.setValueChangedListener(toDebounce); } } refresh(params) { super.refresh(params); this.setTextInputParams(params); } recreateFloatingFilterInputService(params) { const { inputSvc } = this; const value = inputSvc.getValue(); (0, dom_1._clearElement)(this.eFloatingFilterInputContainer); this.destroyBean(inputSvc); this.setupFloatingFilterInputService(params); inputSvc.setValue(value, true); } syncUpWithParentFilter(e) { const isEnterKey = e.key === keyCode_1.KeyCode.ENTER; if (this.applyActive && !isEnterKey) { return; } const { inputSvc, params } = this; let value = inputSvc.getValue(); if (params.filterParams.trimInput) { value = (0, textFilterUtils_1.trimInputForFilter)(value); inputSvc.setValue(value, true); // ensure visible value is trimmed } params.parentFilterInstance((filterInstance) => { // NumberFilter is typed as number, but actually receives string values filterInstance?.onFloatingFilterChanged(this.lastType || null, value || null); }); } setEditable(editable) { this.inputSvc.setEditable(editable); } } exports.TextInputFloatingFilter = TextInputFloatingFilter; /***/ }), /***/ 8713: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.DateCompWrapper = void 0; const userCompUtils_1 = __webpack_require__(2036); const dom_1 = __webpack_require__(3507); /** Provides sync access to async component. Date component can be lazy created - this class encapsulates * this by keeping value locally until DateComp has loaded, then passing DateComp the value. */ class DateCompWrapper { constructor(context, userCompFactory, dateComponentParams, eParent, onReady) { this.alive = true; this.context = context; this.eParent = eParent; const compDetails = (0, userCompUtils_1._getDateCompDetails)(userCompFactory, dateComponentParams); if (!compDetails) { return; } compDetails.newAgStackInstance().then((dateComp) => { // because async, check the filter still exists after component comes back if (!this.alive) { context.destroyBean(dateComp); return; } this.dateComp = dateComp; if (!dateComp) { return; } eParent.appendChild(dateComp.getGui()); dateComp?.afterGuiAttached?.(); const { tempValue, disabled } = this; if (tempValue) { dateComp.setDate(tempValue); } if (disabled != null) { dateComp.setDisabled?.(disabled); } onReady?.(this); }); } destroy() { this.alive = false; this.dateComp = this.context.destroyBean(this.dateComp); } getDate() { return this.dateComp ? this.dateComp.getDate() : this.tempValue; } setDate(value) { const dateComp = this.dateComp; if (dateComp) { dateComp.setDate(value); } else { this.tempValue = value; } } setDisabled(disabled) { const dateComp = this.dateComp; if (dateComp) { dateComp.setDisabled?.(disabled); } else { this.disabled = disabled; } } setDisplayed(displayed) { (0, dom_1._setDisplayed)(this.eParent, displayed); } setInputPlaceholder(placeholder) { this.dateComp?.setInputPlaceholder?.(placeholder); } setInputAriaLabel(label) { this.dateComp?.setInputAriaLabel?.(label); } afterGuiAttached(params) { this.dateComp?.afterGuiAttached?.(params); } updateParams(params) { this.dateComp?.refresh?.(params); } } exports.DateCompWrapper = DateCompWrapper; /***/ }), /***/ 3725: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.DateFilter = void 0; const gridOptionsUtils_1 = __webpack_require__(7274); const date_1 = __webpack_require__(9827); const logging_1 = __webpack_require__(7764); const scalarFilter_1 = __webpack_require__(5562); const simpleFilterUtils_1 = __webpack_require__(7535); const dateCompWrapper_1 = __webpack_require__(8713); const dateFilterConstants_1 = __webpack_require__(4200); const dateFilterModelFormatter_1 = __webpack_require__(4392); const DEFAULT_MIN_YEAR = 1000; const DEFAULT_MAX_YEAR = Infinity; class DateFilter extends scalarFilter_1.ScalarFilter { constructor() { super('dateFilter'); this.eConditionPanelsFrom = []; this.eConditionPanelsTo = []; this.dateConditionFromComps = []; this.dateConditionToComps = []; this.minValidYear = DEFAULT_MIN_YEAR; this.maxValidYear = DEFAULT_MAX_YEAR; this.minValidDate = null; this.maxValidDate = null; this.filterType = 'date'; } afterGuiAttached(params) { super.afterGuiAttached(params); this.dateConditionFromComps[0].afterGuiAttached(params); } mapValuesFromModel(filterModel) { // unlike the other filters, we do two things here: // 1) allow for different attribute names (same as done for other filters) (eg the 'from' and 'to' // are in different locations in Date and Number filter models) // 2) convert the type (because Date filter uses Dates, however model is 'string') // // NOTE: The conversion of string to date also removes the timezone - i.e. when user picks // a date from the UI, it will have timezone info in it. This is lost when creating // the model. When we recreate the date again here, it's without a timezone. const { dateFrom, dateTo, type } = filterModel || {}; return [ (dateFrom && (0, date_1._parseDateTimeFromString)(dateFrom)) || null, (dateTo && (0, date_1._parseDateTimeFromString)(dateTo)) || null, ].slice(0, this.getNumberOfInputs(type)); } comparator() { return this.dateFilterParams.comparator ?? defaultDateComparator; } isValid(value) { const isValidDate = this.dateFilterParams.isValidDate; return !isValidDate || isValidDate(value); } setParams(params) { this.dateFilterParams = params; super.setParams(params); const yearParser = (param, fallback) => { if (params[param] != null) { if (!isNaN(params[param])) { return params[param] == null ? fallback : Number(params[param]); } else { (0, logging_1._warn)(82, { param }); } } return fallback; }; this.minValidYear = yearParser('minValidYear', DEFAULT_MIN_YEAR); this.maxValidYear = yearParser('maxValidYear', DEFAULT_MAX_YEAR); if (this.minValidYear > this.maxValidYear) { (0, logging_1._warn)(83); } this.minValidDate = params.minValidDate ? params.minValidDate instanceof Date ? params.minValidDate : (0, date_1._parseDateTimeFromString)(params.minValidDate) : null; this.maxValidDate = params.maxValidDate ? params.maxValidDate instanceof Date ? params.maxValidDate : (0, date_1._parseDateTimeFromString)(params.maxValidDate) : null; if (this.minValidDate && this.maxValidDate && this.minValidDate > this.maxValidDate) { (0, logging_1._warn)(84); } this.filterModelFormatter = new dateFilterModelFormatter_1.DateFilterModelFormatter(this.dateFilterParams, this.getLocaleTextFunc.bind(this), this.optionsFactory); } createDateCompWrapper(element) { const { userCompFactory, context, gos } = this.beans; const dateCompWrapper = new dateCompWrapper_1.DateCompWrapper(context, userCompFactory, (0, gridOptionsUtils_1._addGridCommonParams)(gos, { onDateChanged: () => this.onUiChanged(), filterParams: this.dateFilterParams, location: 'filter', }), element); this.addDestroyFunc(() => dateCompWrapper.destroy()); return dateCompWrapper; } setElementValue(element, value) { element.setDate(value); } setElementDisplayed(element, displayed) { element.setDisplayed(displayed); } setElementDisabled(element, disabled) { element.setDisabled(disabled); } getDefaultFilterOptions() { return dateFilterConstants_1.DEFAULT_DATE_FILTER_OPTIONS; } createValueElement() { const eDocument = (0, gridOptionsUtils_1._getDocument)(this.beans); const eCondition = eDocument.createElement('div'); eCondition.classList.add('ag-filter-body'); this.createFromToElement(eCondition, this.eConditionPanelsFrom, this.dateConditionFromComps, 'from'); this.createFromToElement(eCondition, this.eConditionPanelsTo, this.dateConditionToComps, 'to'); return eCondition; } createFromToElement(eCondition, eConditionPanels, dateConditionComps, fromTo) { const eDocument = (0, gridOptionsUtils_1._getDocument)(this.beans); const eConditionPanel = eDocument.createElement('div'); eConditionPanel.classList.add(`ag-filter-${fromTo}`); eConditionPanel.classList.add(`ag-filter-date-${fromTo}`); eConditionPanels.push(eConditionPanel); eCondition.appendChild(eConditionPanel); dateConditionComps.push(this.createDateCompWrapper(eConditionPanel)); } removeValueElements(startPosition, deleteCount) { this.removeDateComps(this.dateConditionFromComps, startPosition, deleteCount); this.removeDateComps(this.dateConditionToComps, startPosition, deleteCount); (0, simpleFilterUtils_1.removeItems)(this.eConditionPanelsFrom, startPosition, deleteCount); (0, simpleFilterUtils_1.removeItems)(this.eConditionPanelsTo, startPosition, deleteCount); } removeDateComps(components, startPosition, deleteCount) { const removedComponents = (0, simpleFilterUtils_1.removeItems)(components, startPosition, deleteCount); removedComponents.forEach((comp) => comp.destroy()); } isValidDateValue(value) { if (value === null) { return false; } const { minValidDate, maxValidDate, minValidYear, maxValidYear } = this; if (minValidDate) { if (value < minValidDate) { return false; } } else { if (value.getUTCFullYear() < minValidYear) { return false; } } if (maxValidDate) { if (value > maxValidDate) { return false; } } else { if (value.getUTCFullYear() > maxValidYear) { return false; } } return true; } isConditionUiComplete(position) { if (!super.isConditionUiComplete(position)) { return false; } let valid = true; this.forEachInput((element, index, elPosition, numberOfInputs) => { if (elPosition !== position || !valid || index >= numberOfInputs) { return; } valid = valid && this.isValidDateValue(element.getDate()); }); return valid; } areSimpleModelsEqual(aSimple, bSimple) { return (aSimple.dateFrom === bSimple.dateFrom && aSimple.dateTo === bSimple.dateTo && aSimple.type === bSimple.type); } createCondition(position) { const type = this.getConditionType(position); const model = {}; const values = this.getValues(position); if (values.length > 0) { model.dateFrom = (0, date_1._serialiseDate)(values[0]); } if (values.length > 1) { model.dateTo = (0, date_1._serialiseDate)(values[1]); } return { dateFrom: null, dateTo: null, filterType: this.filterType, type, ...model, }; } resetPlaceholder() { const globalTranslate = this.getLocaleTextFunc(); const placeholder = this.translate('dateFormatOoo'); const ariaLabel = globalTranslate('ariaFilterValue', 'Filter Value'); this.forEachInput((element) => { element.setInputPlaceholder(placeholder); element.setInputAriaLabel(ariaLabel); }); } getInputs(position) { const { dateConditionFromComps, dateConditionToComps } = this; if (position >= dateConditionFromComps.length) { return [null, null]; } return [dateConditionFromComps[position], dateConditionToComps[position]]; } getValues(position) { const result = []; this.forEachPositionInput(position, (element, index, _elPosition, numberOfInputs) => { if (index < numberOfInputs) { result.push(element.getDate()); } }); return result; } translate(key) { if (key === 'lessThan') { return super.translate('before'); } if (key === 'greaterThan') { return super.translate('after'); } return super.translate(key); } getModelAsString(model) { return this.filterModelFormatter.getModelAsString(model) ?? ''; } } exports.DateFilter = DateFilter; function defaultDateComparator(filterDate, cellValue) { // The default comparator assumes that the cellValue is a date const cellAsDate = cellValue; if (cellAsDate < filterDate) { return -1; } if (cellAsDate > filterDate) { return 1; } return 0; } /***/ }), /***/ 4200: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.DEFAULT_DATE_FILTER_OPTIONS = void 0; exports.DEFAULT_DATE_FILTER_OPTIONS = [ 'equals', 'notEqual', 'lessThan', 'greaterThan', 'inRange', 'blank', 'notBlank', ]; /***/ }), /***/ 4392: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.DateFilterModelFormatter = void 0; const date_1 = __webpack_require__(9827); const simpleFilterModelFormatter_1 = __webpack_require__(2786); class DateFilterModelFormatter extends simpleFilterModelFormatter_1.SimpleFilterModelFormatter { constructor(dateFilterParams, getLocaleTextFunc, optionsFactory) { super(getLocaleTextFunc, optionsFactory); this.dateFilterParams = dateFilterParams; } conditionToString(condition, options) { const { type } = condition; const { numberOfInputs } = options || {}; const isRange = type == 'inRange' || numberOfInputs === 2; const dateFrom = (0, date_1._parseDateTimeFromString)(condition.dateFrom); const dateTo = (0, date_1._parseDateTimeFromString)(condition.dateTo); const format = this.dateFilterParams.inRangeFloatingFilterDateFormat; if (isRange) { const formattedFrom = dateFrom !== null ? (0, date_1._dateToFormattedString)(dateFrom, format) : 'null'; const formattedTo = dateTo !== null ? (0, date_1._dateToFormattedString)(dateTo, format) : 'null'; return `${formattedFrom}-${formattedTo}`; } if (dateFrom != null) { return (0, date_1._dateToFormattedString)(dateFrom, format); } // cater for when the type doesn't need a value return `${type}`; } updateParams(params) { super.updateParams(params); this.dateFilterParams = params.dateFilterParams; } } exports.DateFilterModelFormatter = DateFilterModelFormatter; /***/ }), /***/ 3091: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.DateFloatingFilter = void 0; const gridOptionsUtils_1 = __webpack_require__(7274); const date_1 = __webpack_require__(9827); const dom_1 = __webpack_require__(3507); const function_1 = __webpack_require__(2043); const agInputTextField_1 = __webpack_require__(5946); const component_1 = __webpack_require__(8020); const providedFilterUtils_1 = __webpack_require__(361); const simpleFloatingFilter_1 = __webpack_require__(3141); const dateCompWrapper_1 = __webpack_require__(8713); const dateFilterConstants_1 = __webpack_require__(4200); const dateFilterModelFormatter_1 = __webpack_require__(4392); class DateFloatingFilter extends simpleFloatingFilter_1.SimpleFloatingFilter { constructor() { super( /* html */ ` `, [agInputTextField_1.AgInputTextFieldSelector]); this.eReadOnlyText = component_1.RefPlaceholder; this.eDateWrapper = component_1.RefPlaceholder; } getDefaultOptions() { return dateFilterConstants_1.DEFAULT_DATE_FILTER_OPTIONS; } init(params) { super.init(params); this.params = params; this.filterParams = params.filterParams; this.createDateComponent(); this.filterModelFormatter = new dateFilterModelFormatter_1.DateFilterModelFormatter(this.filterParams, this.getLocaleTextFunc.bind(this), this.optionsFactory); const translate = this.getLocaleTextFunc(); this.eReadOnlyText.setDisabled(true).setInputAriaLabel(translate('ariaDateFilterInput', 'Date Filter Input')); } refresh(params) { super.refresh(params); this.params = params; this.filterParams = params.filterParams; this.dateComp.updateParams(this.getDateComponentParams()); this.filterModelFormatter.updateParams({ optionsFactory: this.optionsFactory, dateFilterParams: this.filterParams, }); this.updateCompOnModelChange(params.currentParentModel()); } updateCompOnModelChange(model) { // Update the read-only text field const allowEditing = !this.readOnly && this.canWeEditAfterModelFromParentFilter(model); this.setEditable(allowEditing); if (allowEditing) { const dateModel = model ? (0, date_1._parseDateTimeFromString)(model.dateFrom) : null; this.dateComp.setDate(dateModel); this.eReadOnlyText.setValue(''); } else { this.eReadOnlyText.setValue(this.filterModelFormatter.getModelAsString(model)); this.dateComp.setDate(null); } } setEditable(editable) { (0, dom_1._setDisplayed)(this.eDateWrapper, editable); (0, dom_1._setDisplayed)(this.eReadOnlyText.getGui(), !editable); } onParentModelChanged(model, event) { // We don't want to update the floating filter if the floating filter caused the change, // because the UI is already in sync. if we didn't do this, the UI would behave strangely // as it would be updating as the user is typing. // This is similar for data changes, which don't affect provided date floating filters if (event?.afterFloatingFilter || event?.afterDataChange) { return; } super.setLastTypeFromModel(model); this.updateCompOnModelChange(model); } onDateChanged() { const filterValueDate = this.dateComp.getDate(); const filterValueText = (0, date_1._serialiseDate)(filterValueDate); this.params.parentFilterInstance((filterInstance) => { if (filterInstance) { const date = (0, date_1._parseDateTimeFromString)(filterValueText); filterInstance.onFloatingFilterChanged(this.lastType || null, date); } }); } getDateComponentParams() { const { filterParams, column } = this.params; const debounceMs = (0, providedFilterUtils_1.getDebounceMs)(filterParams, this.defaultDebounceMs); return (0, gridOptionsUtils_1._addGridCommonParams)(this.gos, { onDateChanged: (0, function_1._debounce)(this, this.onDateChanged.bind(this), debounceMs), filterParams: column.getColDef().filterParams, location: 'floatingFilter', }); } createDateComponent() { const { beans: { context, userCompFactory }, eDateWrapper, } = this; this.dateComp = new dateCompWrapper_1.DateCompWrapper(context, userCompFactory, this.getDateComponentParams(), eDateWrapper, (dateComp) => { dateComp.setInputAriaLabel(this.getAriaLabel(this.params)); }); this.addDestroyFunc(() => this.dateComp.destroy()); } } exports.DateFloatingFilter = DateFloatingFilter; /***/ }), /***/ 5459: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.DefaultDateComponent = void 0; const gridOptionsUtils_1 = __webpack_require__(7274); const browser_1 = __webpack_require__(8667); const date_1 = __webpack_require__(9827); const logging_1 = __webpack_require__(7764); const agInputTextField_1 = __webpack_require__(5946); const component_1 = __webpack_require__(8020); class DefaultDateComponent extends component_1.Component { constructor() { super( /* html */ `
`, [agInputTextField_1.AgInputTextFieldSelector]); this.eDateInput = component_1.RefPlaceholder; this.isApply = false; this.applyOnFocusOut = false; } init(params) { this.params = params; this.setParams(params); const inputElement = this.eDateInput.getInputElement(); this.addManagedListeners(inputElement, { // ensures that the input element is focussed when a clear button is clicked, // unless using safari as there is no clear button and focus does not work properly mouseDown: () => { if (this.eDateInput.isDisabled() || this.usingSafariDatePicker) { return; } inputElement.focus({ preventScroll: true }); }, input: this.handleInput.bind(this, false), change: this.handleInput.bind(this, true), focusout: this.handleFocusOut.bind(this), }); } handleInput(isChange, e) { if (e.target !== (0, gridOptionsUtils_1._getActiveDomElement)(this.beans)) { return; } if (this.eDateInput.isDisabled()) { return; } if (this.isApply) { // If it's input event, queue up apply on focus out. // If it's change, clear and run. this.applyOnFocusOut = !isChange; if (isChange) { this.params.onDateChanged(); } return; } if (!isChange) { // if not apply, execute on input this.params.onDateChanged(); } } handleFocusOut() { if (this.applyOnFocusOut) { this.applyOnFocusOut = false; this.params.onDateChanged(); } } setParams(params) { const inputElement = this.eDateInput.getInputElement(); const shouldUseBrowserDatePicker = this.shouldUseBrowserDatePicker(params); this.usingSafariDatePicker = shouldUseBrowserDatePicker && (0, browser_1._isBrowserSafari)(); inputElement.type = shouldUseBrowserDatePicker ? 'date' : 'text'; const { minValidYear, maxValidYear, minValidDate, maxValidDate, buttons } = params.filterParams || {}; if (minValidDate && minValidYear) { (0, logging_1._warn)(85); } if (maxValidDate && maxValidYear) { (0, logging_1._warn)(86); } if (minValidDate && maxValidDate) { const [parsedMinValidDate, parsedMaxValidDate] = [minValidDate, maxValidDate].map((v) => v instanceof Date ? v : (0, date_1._parseDateTimeFromString)(v)); if (parsedMinValidDate && parsedMaxValidDate && parsedMinValidDate.getTime() > parsedMaxValidDate.getTime()) { (0, logging_1._warn)(87); } } if (minValidDate) { if (minValidDate instanceof Date) { inputElement.min = (0, date_1._dateToFormattedString)(minValidDate); } else { inputElement.min = minValidDate; } } else { if (minValidYear) { inputElement.min = `${minValidYear}-01-01`; } } if (maxValidDate) { if (maxValidDate instanceof Date) { inputElement.max = (0, date_1._dateToFormattedString)(maxValidDate); } else { inputElement.max = maxValidDate; } } else { if (maxValidYear) { inputElement.max = `${maxValidYear}-12-31`; } } this.isApply = params.location === 'floatingFilter' && !!buttons?.includes('apply'); } refresh(params) { this.params = params; this.setParams(params); } getDate() { return (0, date_1._parseDateTimeFromString)(this.eDateInput.getValue()); } setDate(date) { this.eDateInput.setValue((0, date_1._serialiseDate)(date, false)); } setInputPlaceholder(placeholder) { this.eDateInput.setInputPlaceholder(placeholder); } setInputAriaLabel(ariaLabel) { this.eDateInput.setAriaLabel(ariaLabel); } setDisabled(disabled) { this.eDateInput.setDisabled(disabled); } afterGuiAttached(params) { if (!params || !params.suppressFocus) { this.eDateInput.getInputElement().focus({ preventScroll: true }); } } shouldUseBrowserDatePicker(params) { return params?.filterParams?.browserDatePicker ?? true; } } exports.DefaultDateComponent = DefaultDateComponent; /***/ }), /***/ 8988: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.NumberFilter = void 0; const aria_1 = __webpack_require__(5230); const generic_1 = __webpack_require__(4422); const agInputNumberField_1 = __webpack_require__(8792); const agInputTextField_1 = __webpack_require__(5946); const scalarFilter_1 = __webpack_require__(5562); const numberFilterConstants_1 = __webpack_require__(846); const numberFilterModelFormatter_1 = __webpack_require__(1862); const numberFilterUtils_1 = __webpack_require__(730); class NumberFilter extends scalarFilter_1.ScalarFilter { constructor() { super('numberFilter'); this.eValuesFrom = []; this.eValuesTo = []; this.filterType = 'number'; this.defaultDebounceMs = 500; } refresh(params) { if (this.numberFilterParams.allowedCharPattern !== params.allowedCharPattern) { return false; } return super.refresh(params); } mapValuesFromModel(filterModel) { const { filter, filterTo, type } = filterModel || {}; return [this.processValue(filter), this.processValue(filterTo)].slice(0, this.getNumberOfInputs(type)); } comparator() { return (left, right) => { if (left === right) { return 0; } return left < right ? 1 : -1; }; } isValid(value) { return !isNaN(value); } setParams(params) { this.numberFilterParams = params; super.setParams(params); this.filterModelFormatter = new numberFilterModelFormatter_1.NumberFilterModelFormatter(this.getLocaleTextFunc.bind(this), this.optionsFactory, this.numberFilterParams.numberFormatter); } getDefaultFilterOptions() { return numberFilterConstants_1.DEFAULT_NUMBER_FILTER_OPTIONS; } setElementValue(element, value, fromFloatingFilter) { // values from floating filter are directly from the input, not from the model const { numberFormatter } = this.numberFilterParams; const valueToSet = !fromFloatingFilter && numberFormatter ? numberFormatter(value ?? null) : value; super.setElementValue(element, valueToSet); } createValueElement() { const allowedCharPattern = (0, numberFilterUtils_1.getAllowedCharPattern)(this.numberFilterParams); const eCondition = document.createElement('div'); eCondition.classList.add('ag-filter-body'); (0, aria_1._setAriaRole)(eCondition, 'presentation'); this.createFromToElement(eCondition, this.eValuesFrom, 'from', allowedCharPattern); this.createFromToElement(eCondition, this.eValuesTo, 'to', allowedCharPattern); return eCondition; } createFromToElement(eCondition, eValues, fromTo, allowedCharPattern) { const eValue = this.createManagedBean(allowedCharPattern ? new agInputTextField_1.AgInputTextField({ allowedCharPattern }) : new agInputNumberField_1.AgInputNumberField()); eValue.addCssClass(`ag-filter-${fromTo}`); eValue.addCssClass('ag-filter-filter'); eValues.push(eValue); eCondition.appendChild(eValue.getGui()); } removeValueElements(startPosition, deleteCount) { const removeComps = (eGui) => this.removeComponents(eGui, startPosition, deleteCount); removeComps(this.eValuesFrom); removeComps(this.eValuesTo); } getValues(position) { const result = []; this.forEachPositionInput(position, (element, index, _elPosition, numberOfInputs) => { if (index < numberOfInputs) { result.push(this.processValue(this.stringToFloat(element.getValue()))); } }); return result; } areSimpleModelsEqual(aSimple, bSimple) { return (aSimple.filter === bSimple.filter && aSimple.filterTo === bSimple.filterTo && aSimple.type === bSimple.type); } processValue(value) { if (value == null) { return null; } return isNaN(value) ? null : value; } stringToFloat(value) { if (typeof value === 'number') { return value; } let filterText = (0, generic_1._makeNull)(value); if (filterText != null && filterText.trim() === '') { filterText = null; } const numberParser = this.numberFilterParams.numberParser; if (numberParser) { return numberParser(filterText); } return filterText == null || filterText.trim() === '-' ? null : parseFloat(filterText); } createCondition(position) { const type = this.getConditionType(position); const model = { filterType: this.filterType, type, }; const values = this.getValues(position); if (values.length > 0) { model.filter = values[0]; } if (values.length > 1) { model.filterTo = values[1]; } return model; } getInputs(position) { const { eValuesFrom, eValuesTo } = this; if (position >= eValuesFrom.length) { return [null, null]; } return [eValuesFrom[position], eValuesTo[position]]; } getModelAsString(model) { return this.filterModelFormatter.getModelAsString(model) ?? ''; } hasInvalidInputs() { let invalidInputs = false; this.forEachInput((element) => { if (!element.getInputElement().validity.valid) { invalidInputs = true; return; } }); return invalidInputs; } } exports.NumberFilter = NumberFilter; /***/ }), /***/ 846: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.DEFAULT_NUMBER_FILTER_OPTIONS = void 0; exports.DEFAULT_NUMBER_FILTER_OPTIONS = [ 'equals', 'notEqual', 'greaterThan', 'greaterThanOrEqual', 'lessThan', 'lessThanOrEqual', 'inRange', 'blank', 'notBlank', ]; /***/ }), /***/ 1862: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.NumberFilterModelFormatter = void 0; const simpleFilterModelFormatter_1 = __webpack_require__(2786); class NumberFilterModelFormatter extends simpleFilterModelFormatter_1.SimpleFilterModelFormatter { conditionToString(condition, options) { const { numberOfInputs } = options || {}; const { filter, filterTo, type } = condition; const isRange = type == 'inRange' || numberOfInputs === 2; const formatValue = this.formatValue.bind(this); if (isRange) { return `${formatValue(filter)}-${formatValue(filterTo)}`; } // cater for when the type doesn't need a value if (filter != null) { return formatValue(filter); } return `${type}`; } } exports.NumberFilterModelFormatter = NumberFilterModelFormatter; /***/ }), /***/ 730: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getAllowedCharPattern = void 0; function getAllowedCharPattern(filterParams) { const { allowedCharPattern } = filterParams ?? {}; return allowedCharPattern ?? null; } exports.getAllowedCharPattern = getAllowedCharPattern; /***/ }), /***/ 4789: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.NumberFloatingFilter = void 0; const beanStub_1 = __webpack_require__(8731); const agInputNumberField_1 = __webpack_require__(8792); const agInputTextField_1 = __webpack_require__(5946); const floatingFilterTextInputService_1 = __webpack_require__(7287); const textInputFloatingFilter_1 = __webpack_require__(8922); const numberFilterConstants_1 = __webpack_require__(846); const numberFilterModelFormatter_1 = __webpack_require__(1862); const numberFilterUtils_1 = __webpack_require__(730); class FloatingFilterNumberInputService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.onValueChanged = () => { }; this.numberInputActive = true; } setupGui(parentElement) { this.eNumberInput = this.createManagedBean(new agInputNumberField_1.AgInputNumberField()); this.eTextInput = this.createManagedBean(new agInputTextField_1.AgInputTextField()); this.eTextInput.setDisabled(true); const eNumberInput = this.eNumberInput.getGui(); const eTextInput = this.eTextInput.getGui(); parentElement.appendChild(eNumberInput); parentElement.appendChild(eTextInput); this.setupListeners(eNumberInput, (e) => this.onValueChanged(e)); this.setupListeners(eTextInput, (e) => this.onValueChanged(e)); } setEditable(editable) { this.numberInputActive = editable; this.eNumberInput.setDisplayed(this.numberInputActive); this.eTextInput.setDisplayed(!this.numberInputActive); } setAutoComplete(autoComplete) { this.eNumberInput.setAutoComplete(autoComplete); this.eTextInput.setAutoComplete(autoComplete); } getValue() { return this.getActiveInputElement().getValue(); } setValue(value, silent) { this.getActiveInputElement().setValue(value, silent); } getActiveInputElement() { return this.numberInputActive ? this.eNumberInput : this.eTextInput; } setValueChangedListener(listener) { this.onValueChanged = listener; } setupListeners(element, listener) { this.addManagedListeners(element, { input: listener, keydown: listener, }); } setParams(params) { this.setAriaLabel(params.ariaLabel); if (params.autoComplete !== undefined) { this.setAutoComplete(params.autoComplete); } } setAriaLabel(ariaLabel) { this.eNumberInput.setInputAriaLabel(ariaLabel); this.eTextInput.setInputAriaLabel(ariaLabel); } } class NumberFloatingFilter extends textInputFloatingFilter_1.TextInputFloatingFilter { init(params) { super.init(params); this.filterModelFormatter = new numberFilterModelFormatter_1.NumberFilterModelFormatter(this.getLocaleTextFunc.bind(this), this.optionsFactory, params.filterParams?.numberFormatter); } refresh(params) { const allowedCharPattern = (0, numberFilterUtils_1.getAllowedCharPattern)(params.filterParams); if (allowedCharPattern !== this.allowedCharPattern) { this.recreateFloatingFilterInputService(params); } super.refresh(params); this.filterModelFormatter.updateParams({ optionsFactory: this.optionsFactory }); } getDefaultOptions() { return numberFilterConstants_1.DEFAULT_NUMBER_FILTER_OPTIONS; } createFloatingFilterInputService(params) { this.allowedCharPattern = (0, numberFilterUtils_1.getAllowedCharPattern)(params.filterParams); if (this.allowedCharPattern) { // need to use text input return this.createManagedBean(new floatingFilterTextInputService_1.FloatingFilterTextInputService({ config: { allowedCharPattern: this.allowedCharPattern }, })); } return this.createManagedBean(new FloatingFilterNumberInputService()); } } exports.NumberFloatingFilter = NumberFloatingFilter; /***/ }), /***/ 4824: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.OptionsFactory = void 0; const logging_1 = __webpack_require__(7764); /* Common logic for options, used by both filters and floating filters. */ class OptionsFactory { constructor() { this.customFilterOptions = {}; } init(params, defaultOptions) { this.filterOptions = params.filterOptions || defaultOptions; this.mapCustomOptions(); this.selectDefaultItem(params); } mapCustomOptions() { const { filterOptions } = this; if (!filterOptions) { return; } filterOptions.forEach((filterOption) => { if (typeof filterOption === 'string') { return; } const requiredProperties = [['displayKey'], ['displayName'], ['predicate', 'test']]; const propertyCheck = (keys) => { if (!keys.some((key) => filterOption[key] != null)) { (0, logging_1._warn)(72, { keys }); return false; } return true; }; if (!requiredProperties.every(propertyCheck)) { this.filterOptions = filterOptions.filter((v) => v === filterOption) || []; return; } this.customFilterOptions[filterOption.displayKey] = filterOption; }); } selectDefaultItem(params) { const { filterOptions } = this; if (params.defaultOption) { this.defaultOption = params.defaultOption; } else if (filterOptions.length >= 1) { const firstFilterOption = filterOptions[0]; if (typeof firstFilterOption === 'string') { this.defaultOption = firstFilterOption; } else if (firstFilterOption.displayKey) { this.defaultOption = firstFilterOption.displayKey; } else { // invalid FilterOptionDef supplied as it doesn't contain a 'displayKey (0, logging_1._warn)(73); } } else { //no filter options for filter (0, logging_1._warn)(74); } } getCustomOption(name) { return this.customFilterOptions[name]; } } exports.OptionsFactory = OptionsFactory; /***/ }), /***/ 2245: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ProvidedFilter = void 0; const positionableFeature_1 = __webpack_require__(2147); const dom_1 = __webpack_require__(3507); const function_1 = __webpack_require__(2043); const generic_1 = __webpack_require__(4422); const logging_1 = __webpack_require__(7764); const component_1 = __webpack_require__(8020); const managedFocusFeature_1 = __webpack_require__(1772); const filterLocaleText_1 = __webpack_require__(5741); const providedFilterUtils_1 = __webpack_require__(361); /** * Contains common logic to all provided filters (apply button, clear button, etc). * All the filters that come with AG Grid extend this class. User filters do not * extend this class. * * @param M type of filter-model managed by the concrete sub-class that extends this type * @param V type of value managed by the concrete sub-class that extends this type */ class ProvidedFilter extends component_1.Component { constructor(filterNameKey) { super(); this.filterNameKey = filterNameKey; this.applyActive = false; this.hidePopup = null; this.debouncePending = false; // after the user hits 'apply' the model gets copied to here. this is then the model that we use for // all filtering. so if user changes UI but doesn't hit apply, then the UI will be out of sync with this model. // this is what we want, as the UI should only become the 'active' filter once it's applied. when apply is // inactive, this model will be in sync (following the debounce ms). if the UI is not a valid filter // (eg the value is missing so nothing to filter on, or for set filter all checkboxes are checked so filter // not active) then this appliedModel will be null/undefined. this.appliedModel = null; this.eFilterBody = component_1.RefPlaceholder; this.buttonListeners = []; // subclasses can override this to provide alternative debounce defaults this.defaultDebounceMs = 0; } postConstruct() { this.resetTemplate(); // do this first to create the DOM this.createManagedBean(new managedFocusFeature_1.ManagedFocusFeature(this.getFocusableElement(), { handleKeyDown: this.handleKeyDown.bind(this), })); this.positionableFeature = new positionableFeature_1.PositionableFeature(this.getPositionableElement(), { forcePopupParentAsOffsetParent: true, }); this.createBean(this.positionableFeature); } // override // eslint-disable-next-line @typescript-eslint/no-unused-vars handleKeyDown(e) { } getFilterTitle() { return this.translate(this.filterNameKey); } isFilterActive() { // filter is active if we have a valid applied model return !!this.appliedModel; } resetTemplate(paramsMap) { let eGui = this.getGui(); if (eGui) { eGui.removeEventListener('submit', this.onFormSubmit); } const templateString = /* html */ `
${this.createBodyTemplate()}
`; this.setTemplate(templateString, this.getAgComponents(), paramsMap); eGui = this.getGui(); eGui?.addEventListener('submit', this.onFormSubmit); } isReadOnly() { return !!this.params.readOnly; } init(params) { this.setParams(params); this.resetUiToDefaults(true).then(() => { this.updateUiVisibility(); this.setupOnBtApplyDebounce(); }); } setParams(params) { this.params = params; this.applyActive = (0, providedFilterUtils_1.isUseApplyButton)(params); this.resetButtonsPanel(params); } updateParams(params) { this.params = params; this.applyActive = (0, providedFilterUtils_1.isUseApplyButton)(params); this.resetUiToActiveModel(this.getModel(), () => { this.updateUiVisibility(); this.setupOnBtApplyDebounce(); }); } resetButtonsPanel(newParams, oldParams) { const { buttons: oldButtons, readOnly: oldReadOnly } = oldParams ?? {}; const { buttons, readOnly } = newParams; if (oldReadOnly === readOnly && (0, generic_1._jsonEquals)(oldButtons, buttons)) { return; } const hasButtons = buttons && buttons.length > 0 && !this.isReadOnly(); if (!this.eButtonsPanel) { // Only create the buttons panel if we need to if (hasButtons) { this.eButtonsPanel = document.createElement('div'); this.eButtonsPanel.classList.add('ag-filter-apply-panel'); } } else { // Always empty the buttons panel before adding new buttons (0, dom_1._clearElement)(this.eButtonsPanel); this.buttonListeners.forEach((destroyFunc) => destroyFunc()); this.buttonListeners = []; } if (!hasButtons) { // The case when we need to hide the buttons panel because there are no buttons if (this.eButtonsPanel) { (0, dom_1._removeFromParent)(this.eButtonsPanel); } return; } // At this point we know we have a buttons and a buttons panel has been created. // Instead of appending each button to the DOM individually, we create a fragment and append that // to the DOM once. This is much faster than appending each button individually. const fragment = document.createDocumentFragment(); const addButton = (type) => { let clickListener; const text = type ? this.translate(`${type}Filter`) : undefined; switch (type) { case 'apply': clickListener = (e) => this.onBtApply(false, false, e); break; case 'clear': clickListener = () => this.onBtClear(); break; case 'reset': clickListener = () => this.onBtReset(); break; case 'cancel': clickListener = (e) => { this.onBtCancel(e); }; break; default: (0, logging_1._warn)(75); return; } const buttonType = type === 'apply' ? 'submit' : 'button'; const button = (0, dom_1._loadTemplate)( /* html */ ``); this.buttonListeners.push(...this.addManagedElementListeners(button, { click: clickListener })); fragment.append(button); }; buttons.forEach((type) => addButton(type)); this.eButtonsPanel.append(fragment); this.getGui().appendChild(this.eButtonsPanel); } setupOnBtApplyDebounce() { const debounceMs = (0, providedFilterUtils_1.getDebounceMs)(this.params, this.defaultDebounceMs); const debounceFunc = (0, function_1._debounce)(this, this.checkApplyDebounce.bind(this), debounceMs); this.onBtApplyDebounce = () => { this.debouncePending = true; debounceFunc(); }; } checkApplyDebounce() { if (this.debouncePending) { // May already have been applied, so don't apply again (e.g. closing filter before debounce timeout) this.debouncePending = false; this.onBtApply(); } } getModel() { return this.appliedModel ?? null; } setModel(model) { const promise = model != null ? this.setModelIntoUi(model) : this.resetUiToDefaults(); return promise.then(() => { this.updateUiVisibility(); // we set the model from the GUI, rather than the provided model, // so the model is consistent, e.g. handling of null/undefined will be the same, // or if model is case-insensitive, then casing is removed. this.applyModel('api'); }); } onBtCancel(e) { this.resetUiToActiveModel(this.getModel(), () => { this.handleCancelEnd(e); }); } handleCancelEnd(e) { if (this.params.closeOnApply) { this.close(e); } } resetUiToActiveModel(currentModel, afterUiUpdatedFunc) { const afterAppliedFunc = () => { this.onUiChanged(false, 'prevent'); afterUiUpdatedFunc?.(); }; if (currentModel != null) { this.setModelIntoUi(currentModel).then(afterAppliedFunc); } else { this.resetUiToDefaults().then(afterAppliedFunc); } } onBtClear() { this.resetUiToDefaults().then(() => this.onUiChanged()); } onBtReset() { this.onBtClear(); this.onBtApply(); } /** * Applies changes made in the UI to the filter, and returns true if the model has changed. */ // eslint-disable-next-line @typescript-eslint/no-unused-vars applyModel(source = 'api') { const newModel = this.getModelFromUi(); if (!this.isModelValid(newModel)) { return false; } const previousModel = this.appliedModel; this.appliedModel = newModel; // models can be same if user pasted same content into text field, or maybe just changed the case // and it's a case insensitive filter return !this.areModelsEqual(previousModel, newModel); } // eslint-disable-next-line @typescript-eslint/no-unused-vars isModelValid(model) { return true; } onFormSubmit(e) { e.preventDefault(); } onBtApply(afterFloatingFilter = false, afterDataChange = false, e) { // Prevent form submission if (e) { e.preventDefault(); } if (this.applyModel(afterDataChange ? 'rowDataUpdated' : 'ui')) { // the floating filter uses 'afterFloatingFilter' info, so it doesn't refresh after filter changed if change // came from floating filter const source = 'columnFilter'; this.params.filterChangedCallback({ afterFloatingFilter, afterDataChange, source }); } const { closeOnApply } = this.params; // only close if an apply button is visible, otherwise we'd be closing every time a change was made! if (closeOnApply && this.applyActive && !afterFloatingFilter && !afterDataChange) { this.close(e); } } onNewRowsLoaded() { } close(e) { if (!this.hidePopup) { return; } const keyboardEvent = e; const key = keyboardEvent && keyboardEvent.key; let params; if (key === 'Enter' || key === 'Space') { params = { keyboardEvent }; } this.hidePopup(params); this.hidePopup = null; } /** * By default, if the change came from a floating filter it will be applied immediately, otherwise if there is no * apply button it will be applied after a debounce, otherwise it will not be applied at all. This behaviour can * be adjusted by using the apply parameter. */ onUiChanged(fromFloatingFilter = false, apply) { this.updateUiVisibility(); this.params.filterModifiedCallback(); if (this.applyActive && !this.isReadOnly()) { const isValid = this.isModelValid(this.getModelFromUi()); const applyFilterButton = this.queryForHtmlElement(`[data-ref="applyFilterButton"]`); if (applyFilterButton) { (0, dom_1._setDisabled)(applyFilterButton, !isValid); } } if ((fromFloatingFilter && !apply) || apply === 'immediately') { this.onBtApply(fromFloatingFilter); } else if ((!this.applyActive && !apply) || apply === 'debounce') { this.onBtApplyDebounce(); } } afterGuiAttached(params) { if (params) { this.hidePopup = params.hidePopup; } this.refreshFilterResizer(params?.container); } refreshFilterResizer(containerType) { // tool panel is scrollable, so don't need to size const { positionableFeature, gos } = this; if (!positionableFeature || containerType === 'toolPanel') { return; } const isResizable = containerType === 'floatingFilter' || containerType === 'columnFilter'; if (isResizable) { positionableFeature.restoreLastSize(); positionableFeature.setResizable(gos.get('enableRtl') ? { bottom: true, bottomLeft: true, left: true } : { bottom: true, bottomRight: true, right: true }); } else { positionableFeature.removeSizeFromEl(); positionableFeature.setResizable(false); } positionableFeature.constrainSizeToAvailableHeight(true); } afterGuiDetached() { this.checkApplyDebounce(); this.positionableFeature?.constrainSizeToAvailableHeight(false); } refresh(newParams) { const oldParams = this.params; this.params = newParams; this.resetButtonsPanel(newParams, oldParams); return true; } destroy() { const eGui = this.getGui(); if (eGui) { eGui.removeEventListener('submit', this.onFormSubmit); } this.hidePopup = null; if (this.positionableFeature) { this.positionableFeature = this.destroyBean(this.positionableFeature); } this.appliedModel = null; super.destroy(); } translate(key) { return this.getLocaleTextFunc()(key, filterLocaleText_1.FILTER_LOCALE_TEXT[key]); } getCellValue(rowNode) { return this.params.getValue(rowNode); } // override to control positionable feature getPositionableElement() { return this.eFilterBody; } } exports.ProvidedFilter = ProvidedFilter; /***/ }), /***/ 5562: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ScalarFilter = void 0; const logging_1 = __webpack_require__(7764); const simpleFilter_1 = __webpack_require__(5220); const simpleFilterUtils_1 = __webpack_require__(7535); class ScalarFilter extends simpleFilter_1.SimpleFilter { setParams(params) { super.setParams(params); this.scalarFilterParams = params; } evaluateNullValue(filterType) { const { includeBlanksInEquals, includeBlanksInNotEqual, includeBlanksInGreaterThan, includeBlanksInLessThan, includeBlanksInRange, } = this.scalarFilterParams; switch (filterType) { case 'equals': if (includeBlanksInEquals) { return true; } break; case 'notEqual': if (includeBlanksInNotEqual) { return true; } break; case 'greaterThan': case 'greaterThanOrEqual': if (includeBlanksInGreaterThan) { return true; } break; case 'lessThan': case 'lessThanOrEqual': if (includeBlanksInLessThan) { return true; } break; case 'inRange': if (includeBlanksInRange) { return true; } break; case 'blank': return true; case 'notBlank': return false; } return false; } evaluateNonNullValue(values, cellValue, filterModel) { const type = filterModel.type; if (!this.isValid(cellValue)) { return type === 'notEqual' || type === 'notBlank'; } const comparator = this.comparator(); const compareResult = values[0] != null ? comparator(values[0], cellValue) : 0; switch (type) { case 'equals': return compareResult === 0; case 'notEqual': return compareResult !== 0; case 'greaterThan': return compareResult > 0; case 'greaterThanOrEqual': return compareResult >= 0; case 'lessThan': return compareResult < 0; case 'lessThanOrEqual': return compareResult <= 0; case 'inRange': { const compareToResult = comparator(values[1], cellValue); return this.scalarFilterParams.inRangeInclusive ? compareResult >= 0 && compareToResult <= 0 : compareResult > 0 && compareToResult < 0; } case 'blank': return (0, simpleFilterUtils_1.isBlank)(cellValue); case 'notBlank': return !(0, simpleFilterUtils_1.isBlank)(cellValue); default: (0, logging_1._warn)(76, { filterModelType: type }); return true; } } } exports.ScalarFilter = ScalarFilter; /***/ }), /***/ 5220: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.SimpleFilter = void 0; const array_1 = __webpack_require__(1502); const dom_1 = __webpack_require__(3507); const promise_1 = __webpack_require__(7990); const logging_1 = __webpack_require__(7764); const agAbstractInputField_1 = __webpack_require__(8085); const agRadioButton_1 = __webpack_require__(7336); const agSelect_1 = __webpack_require__(159); const component_1 = __webpack_require__(8020); const optionsFactory_1 = __webpack_require__(4824); const providedFilter_1 = __webpack_require__(2245); const simpleFilterUtils_1 = __webpack_require__(7535); /** * Every filter with a dropdown where the user can specify a comparing type against the filter values. * * @param M type of filter-model managed by the concrete sub-class that extends this type * @param V type of value managed by the concrete sub-class that extends this type * @param E type of UI element used for collecting user-input */ class SimpleFilter extends providedFilter_1.ProvidedFilter { constructor() { super(...arguments); this.eTypes = []; this.eJoinOperatorPanels = []; this.eJoinOperatorsAnd = []; this.eJoinOperatorsOr = []; this.eConditionBodies = []; this.listener = () => this.onUiChanged(); this.lastUiCompletePosition = null; this.joinOperatorId = 0; } getNumberOfInputs(type) { const customOpts = this.optionsFactory.getCustomOption(type); if (customOpts) { const { numberOfInputs } = customOpts; return numberOfInputs != null ? numberOfInputs : 1; } const zeroInputTypes = ['empty', 'notBlank', 'blank']; if (type && zeroInputTypes.indexOf(type) >= 0) { return 0; } else if (type === 'inRange') { return 2; } return 1; } // floating filter calls this when user applies filter from floating filter onFloatingFilterChanged(type, value) { this.setTypeFromFloatingFilter(type); this.setValueFromFloatingFilter(value); this.onUiChanged(true); } setTypeFromFloatingFilter(type) { this.eTypes.forEach((eType, position) => { const value = position === 0 ? type : this.optionsFactory.defaultOption; eType.setValue(value, true); }); } getModelFromUi() { const conditions = this.getUiCompleteConditions(); if (conditions.length === 0) { return null; } if (this.maxNumConditions > 1 && conditions.length > 1) { return { filterType: this.filterType, operator: this.getJoinOperator(), conditions, }; } return conditions[0]; } getConditionTypes() { return this.eTypes.map((eType) => eType.getValue()); } getConditionType(position) { return this.eTypes[position].getValue(); } getJoinOperator() { const { eJoinOperatorsOr, defaultJoinOperator } = this; return eJoinOperatorsOr.length === 0 ? defaultJoinOperator : eJoinOperatorsOr[0].getValue() === true ? 'OR' : 'AND'; } areModelsEqual(a, b) { // both are missing if (!a && !b) { return true; } // one is missing, other present if ((!a && b) || (a && !b)) { return false; } // one is combined, the other is not const aIsSimple = !a.operator; const bIsSimple = !b.operator; const oneSimpleOneCombined = (!aIsSimple && bIsSimple) || (aIsSimple && !bIsSimple); if (oneSimpleOneCombined) { return false; } let res; // otherwise both present, so compare if (aIsSimple) { const aSimple = a; const bSimple = b; res = this.areSimpleModelsEqual(aSimple, bSimple); } else { const aCombined = a; const bCombined = b; res = aCombined.operator === bCombined.operator && (0, array_1._areEqual)(aCombined.conditions, bCombined.conditions, (aModel, bModel) => this.areSimpleModelsEqual(aModel, bModel)); } return res; } shouldRefresh(newParams) { const model = this.getModel(); const conditions = model ? model.conditions ?? [model] : null; // Do Not refresh when one of the existing condition options is not in new options list const newOptionsList = newParams.filterOptions?.map((option) => (typeof option === 'string' ? option : option.displayKey)) ?? this.getDefaultFilterOptions(); const allConditionsExistInNewOptionsList = !conditions || conditions.every((condition) => newOptionsList.find((option) => option === condition.type) !== undefined); if (!allConditionsExistInNewOptionsList) { return false; } // Check number of conditions vs maxNumConditions if (typeof newParams.maxNumConditions === 'number' && conditions && conditions.length > newParams.maxNumConditions) { return false; } return true; } refresh(newParams) { if (!this.shouldRefresh(newParams)) { return false; } const parentRefreshed = super.refresh(newParams); if (!parentRefreshed) { return false; } this.setParams(newParams); this.removeConditionsAndOperators(0); this.createOption(); this.setModel(this.getModel()); return true; } setModelIntoUi(model) { const isCombined = model.operator; if (isCombined) { const combinedModel = model; let conditions = combinedModel.conditions; if (conditions == null) { conditions = []; (0, logging_1._warn)(77); } const numConditions = (0, simpleFilterUtils_1.validateAndUpdateConditions)(conditions, this.maxNumConditions); const numPrevConditions = this.getNumConditions(); if (numConditions < numPrevConditions) { this.removeConditionsAndOperators(numConditions); } else if (numConditions > numPrevConditions) { for (let i = numPrevConditions; i < numConditions; i++) { this.createJoinOperatorPanel(); this.createOption(); } } const orChecked = combinedModel.operator === 'OR'; this.eJoinOperatorsAnd.forEach((eJoinOperatorAnd) => eJoinOperatorAnd.setValue(!orChecked, true)); this.eJoinOperatorsOr.forEach((eJoinOperatorOr) => eJoinOperatorOr.setValue(orChecked, true)); conditions.forEach((condition, position) => { this.eTypes[position].setValue(condition.type, true); this.setConditionIntoUi(condition, position); }); } else { const simpleModel = model; if (this.getNumConditions() > 1) { this.removeConditionsAndOperators(1); } this.eTypes[0].setValue(simpleModel.type, true); this.setConditionIntoUi(simpleModel, 0); } this.lastUiCompletePosition = this.getNumConditions() - 1; this.createMissingConditionsAndOperators(); this.onUiChanged(); return promise_1.AgPromise.resolve(); } doesFilterPass(params) { const model = this.getModel(); if (model == null) { return true; } const { operator } = model; const models = []; if (operator) { const combinedModel = model; models.push(...(combinedModel.conditions ?? [])); } else { models.push(model); } const combineFunction = operator && operator === 'OR' ? 'some' : 'every'; return models[combineFunction]((m) => this.individualConditionPasses(params, m)); } setParams(params) { super.setParams(params); this.setNumConditions(params); this.defaultJoinOperator = (0, simpleFilterUtils_1.getDefaultJoinOperator)(params.defaultJoinOperator); this.filterPlaceholder = params.filterPlaceholder; this.optionsFactory = new optionsFactory_1.OptionsFactory(); this.optionsFactory.init(params, this.getDefaultFilterOptions()); this.createFilterListOptions(); this.createOption(); this.createMissingConditionsAndOperators(); if (this.isReadOnly()) { // only do this when read only (so no other focusable elements), otherwise the tab order breaks // as the tabbed layout managed focus feature will focus the body when it shouldn't this.eFilterBody.setAttribute('tabindex', '-1'); } } setNumConditions(params) { let maxNumConditions = params.maxNumConditions ?? 2; if (maxNumConditions < 1) { (0, logging_1._warn)(79); maxNumConditions = 1; } this.maxNumConditions = maxNumConditions; let numAlwaysVisibleConditions = params.numAlwaysVisibleConditions ?? 1; if (numAlwaysVisibleConditions < 1) { (0, logging_1._warn)(80); numAlwaysVisibleConditions = 1; } if (numAlwaysVisibleConditions > maxNumConditions) { (0, logging_1._warn)(81); numAlwaysVisibleConditions = maxNumConditions; } this.numAlwaysVisibleConditions = numAlwaysVisibleConditions; } createOption() { const eType = this.createManagedBean(new agSelect_1.AgSelect()); this.eTypes.push(eType); eType.addCssClass('ag-filter-select'); this.eFilterBody.appendChild(eType.getGui()); const eConditionBody = this.createValueElement(); this.eConditionBodies.push(eConditionBody); this.eFilterBody.appendChild(eConditionBody); this.putOptionsIntoDropdown(eType); this.resetType(eType); const position = this.getNumConditions() - 1; this.forEachPositionInput(position, (element) => this.resetInput(element)); this.addChangedListeners(eType, position); } createJoinOperatorPanel() { const eJoinOperatorPanel = document.createElement('div'); this.eJoinOperatorPanels.push(eJoinOperatorPanel); eJoinOperatorPanel.classList.add('ag-filter-condition'); const eJoinOperatorAnd = this.createJoinOperator(this.eJoinOperatorsAnd, eJoinOperatorPanel, 'and'); const eJoinOperatorOr = this.createJoinOperator(this.eJoinOperatorsOr, eJoinOperatorPanel, 'or'); this.eFilterBody.appendChild(eJoinOperatorPanel); const index = this.eJoinOperatorPanels.length - 1; const uniqueGroupId = this.joinOperatorId++; this.resetJoinOperatorAnd(eJoinOperatorAnd, index, uniqueGroupId); this.resetJoinOperatorOr(eJoinOperatorOr, index, uniqueGroupId); if (!this.isReadOnly()) { eJoinOperatorAnd.onValueChange(this.listener); eJoinOperatorOr.onValueChange(this.listener); } } createJoinOperator(eJoinOperators, eJoinOperatorPanel, andOr) { const eJoinOperator = this.createManagedBean(new agRadioButton_1.AgRadioButton()); eJoinOperators.push(eJoinOperator); const baseClass = 'ag-filter-condition-operator'; eJoinOperator.addCssClass(baseClass); eJoinOperator.addCssClass(`${baseClass}-${andOr}`); eJoinOperatorPanel.appendChild(eJoinOperator.getGui()); return eJoinOperator; } createFilterListOptions() { this.filterListOptions = this.optionsFactory.filterOptions.map((option) => typeof option === 'string' ? this.createBoilerplateListOption(option) : this.createCustomListOption(option)); } putOptionsIntoDropdown(eType) { const { filterListOptions } = this; // Add specified options to condition drop-down. filterListOptions.forEach((listOption) => { eType.addOption(listOption); }); // Make drop-downs read-only if there is only one option. eType.setDisabled(filterListOptions.length <= 1); } createBoilerplateListOption(option) { return { value: option, text: this.translate(option) }; } createCustomListOption(option) { const { displayKey } = option; const customOption = this.optionsFactory.getCustomOption(option.displayKey); return { value: displayKey, text: customOption ? this.getLocaleTextFunc()(customOption.displayKey, customOption.displayName) : this.translate(displayKey), }; } createBodyTemplate() { // created dynamically return ''; } getAgComponents() { // created dynamically return []; } getCssIdentifier() { return 'simple-filter'; } updateUiVisibility() { const joinOperator = this.getJoinOperator(); this.updateNumConditions(); // from here, the number of elements in all the collections is correct, so can just update the values/statuses this.updateConditionStatusesAndValues(this.lastUiCompletePosition, joinOperator); } updateNumConditions() { // Collection sizes are already correct if updated via API, so only need to handle UI updates here let lastUiCompletePosition = -1; let areAllConditionsUiComplete = true; for (let position = 0; position < this.getNumConditions(); position++) { if (this.isConditionUiComplete(position)) { lastUiCompletePosition = position; } else { areAllConditionsUiComplete = false; } } if (this.shouldAddNewConditionAtEnd(areAllConditionsUiComplete)) { this.createJoinOperatorPanel(); this.createOption(); } else { const activePosition = this.lastUiCompletePosition ?? this.getNumConditions() - 2; if (lastUiCompletePosition < activePosition) { // remove any incomplete conditions at the end, excluding the active position this.removeConditionsAndOperators(activePosition + 1); const removeStartPosition = lastUiCompletePosition + 1; const numConditionsToRemove = activePosition - removeStartPosition; if (numConditionsToRemove > 0) { this.removeConditionsAndOperators(removeStartPosition, numConditionsToRemove); } this.createMissingConditionsAndOperators(); } } this.lastUiCompletePosition = lastUiCompletePosition; } updateConditionStatusesAndValues(lastUiCompletePosition, joinOperator) { this.eTypes.forEach((eType, position) => { const disabled = this.isConditionDisabled(position, lastUiCompletePosition); eType.setDisabled(disabled || this.filterListOptions.length <= 1); if (position === 1) { (0, dom_1._setDisabled)(this.eJoinOperatorPanels[0], disabled); this.eJoinOperatorsAnd[0].setDisabled(disabled); this.eJoinOperatorsOr[0].setDisabled(disabled); } }); this.eConditionBodies.forEach((element, index) => { (0, dom_1._setDisplayed)(element, this.isConditionBodyVisible(index)); }); const orChecked = (joinOperator ?? this.getJoinOperator()) === 'OR'; this.eJoinOperatorsAnd.forEach((eJoinOperatorAnd) => { eJoinOperatorAnd.setValue(!orChecked, true); }); this.eJoinOperatorsOr.forEach((eJoinOperatorOr) => { eJoinOperatorOr.setValue(orChecked, true); }); this.forEachInput((element, index, position, numberOfInputs) => { this.setElementDisplayed(element, index < numberOfInputs); this.setElementDisabled(element, this.isConditionDisabled(position, lastUiCompletePosition)); }); this.resetPlaceholder(); } shouldAddNewConditionAtEnd(areAllConditionsUiComplete) { return areAllConditionsUiComplete && this.getNumConditions() < this.maxNumConditions && !this.isReadOnly(); } removeConditionsAndOperators(startPosition, deleteCount) { if (startPosition >= this.getNumConditions()) { return; } const { eTypes, eConditionBodies, eJoinOperatorPanels, eJoinOperatorsAnd, eJoinOperatorsOr } = this; this.removeComponents(eTypes, startPosition, deleteCount); this.removeElements(eConditionBodies, startPosition, deleteCount); this.removeValueElements(startPosition, deleteCount); const joinOperatorIndex = Math.max(startPosition - 1, 0); this.removeElements(eJoinOperatorPanels, joinOperatorIndex, deleteCount); this.removeComponents(eJoinOperatorsAnd, joinOperatorIndex, deleteCount); this.removeComponents(eJoinOperatorsOr, joinOperatorIndex, deleteCount); } removeElements(elements, startPosition, deleteCount) { const removedElements = (0, simpleFilterUtils_1.removeItems)(elements, startPosition, deleteCount); removedElements.forEach((element) => (0, dom_1._removeFromParent)(element)); } removeComponents(components, startPosition, deleteCount) { const removedComponents = (0, simpleFilterUtils_1.removeItems)(components, startPosition, deleteCount); removedComponents.forEach((comp) => { (0, dom_1._removeFromParent)(comp.getGui()); this.destroyBean(comp); }); } afterGuiAttached(params) { super.afterGuiAttached(params); this.resetPlaceholder(); if (!params?.suppressFocus) { const { eFilterBody, eTypes } = this; let elementToFocus; if (!this.isReadOnly()) { const firstInput = this.getInputs(0)[0]; if (firstInput instanceof agAbstractInputField_1.AgAbstractInputField && this.isConditionBodyVisible(0)) { elementToFocus = firstInput.getInputElement(); } else { // focus the dropdown instead elementToFocus = eTypes[0]?.getFocusableElement(); } } // something needs focus otherwise keyboard navigation breaks, so focus the filter body if missing (elementToFocus ?? eFilterBody).focus({ preventScroll: true }); } } afterGuiDetached() { super.afterGuiDetached(); const appliedModel = this.getModel(); // Reset temporary UI state that was applied to the DOM but not committed to the model this.resetUiToActiveModel(appliedModel); // remove incomplete positions let lastUiCompletePosition = -1; // as we remove incomplete positions, the last UI complete position will change let updatedLastUiCompletePosition = -1; let conditionsRemoved = false; const joinOperator = this.getJoinOperator(); for (let position = this.getNumConditions() - 1; position >= 0; position--) { if (this.isConditionUiComplete(position)) { if (lastUiCompletePosition === -1) { lastUiCompletePosition = position; updatedLastUiCompletePosition = position; } } else { const shouldRemovePositionAtEnd = position >= this.numAlwaysVisibleConditions && !this.isConditionUiComplete(position - 1); const positionBeforeLastUiCompletePosition = position < lastUiCompletePosition; if (shouldRemovePositionAtEnd || positionBeforeLastUiCompletePosition) { this.removeConditionsAndOperators(position, 1); conditionsRemoved = true; if (positionBeforeLastUiCompletePosition) { updatedLastUiCompletePosition--; } } } } let shouldUpdateConditionStatusesAndValues = false; if (this.getNumConditions() < this.numAlwaysVisibleConditions) { // if conditions have been removed, need to recreate new ones at the end up to the number required this.createMissingConditionsAndOperators(); shouldUpdateConditionStatusesAndValues = true; } if (this.shouldAddNewConditionAtEnd(updatedLastUiCompletePosition === this.getNumConditions() - 1)) { this.createJoinOperatorPanel(); this.createOption(); shouldUpdateConditionStatusesAndValues = true; } if (shouldUpdateConditionStatusesAndValues) { this.updateConditionStatusesAndValues(updatedLastUiCompletePosition, joinOperator); } if (conditionsRemoved) { this.updateJoinOperatorsDisabled(); } this.lastUiCompletePosition = updatedLastUiCompletePosition; } getPlaceholderText(defaultPlaceholder, position) { let placeholder = this.translate(defaultPlaceholder); if (typeof this.filterPlaceholder === 'function') { const filterOptionKey = this.eTypes[position].getValue(); const filterOption = this.translate(filterOptionKey); placeholder = this.filterPlaceholder({ filterOptionKey, filterOption, placeholder, }); } else if (typeof this.filterPlaceholder === 'string') { placeholder = this.filterPlaceholder; } return placeholder; } // allow sub-classes to reset HTML placeholders after UI update. resetPlaceholder() { const globalTranslate = this.getLocaleTextFunc(); this.forEachInput((element, index, position, numberOfInputs) => { if (!(element instanceof agAbstractInputField_1.AgAbstractInputField)) { return; } const placeholder = index === 0 && numberOfInputs > 1 ? 'inRangeStart' : index === 0 ? 'filterOoo' : 'inRangeEnd'; const ariaLabel = index === 0 && numberOfInputs > 1 ? globalTranslate('ariaFilterFromValue', 'Filter from value') : index === 0 ? globalTranslate('ariaFilterValue', 'Filter Value') : globalTranslate('ariaFilterToValue', 'Filter to Value'); element.setInputPlaceholder(this.getPlaceholderText(placeholder, position)); element.setInputAriaLabel(ariaLabel); }); } // eslint-disable-next-line @typescript-eslint/no-unused-vars setElementValue(element, value, fromFloatingFilter) { if (element instanceof agAbstractInputField_1.AgAbstractInputField) { element.setValue(value != null ? String(value) : null, true); } } setElementDisplayed(element, displayed) { if (element instanceof component_1.Component) { (0, dom_1._setDisplayed)(element.getGui(), displayed); } } setElementDisabled(element, disabled) { if (element instanceof component_1.Component) { (0, dom_1._setDisabled)(element.getGui(), disabled); } } attachElementOnChange(element, listener) { if (element instanceof agAbstractInputField_1.AgAbstractInputField) { element.onValueChange(listener); } } forEachInput(cb) { this.getConditionTypes().forEach((type, position) => { this.forEachPositionTypeInput(position, type, cb); }); } forEachPositionInput(position, cb) { const type = this.getConditionType(position); this.forEachPositionTypeInput(position, type, cb); } forEachPositionTypeInput(position, type, cb) { const numberOfInputs = this.getNumberOfInputs(type); const inputs = this.getInputs(position); for (let index = 0; index < inputs.length; index++) { const input = inputs[index]; if (input != null) { cb(input, index, position, numberOfInputs); } } } isConditionDisabled(position, lastUiCompletePosition) { if (this.isReadOnly()) { return true; } // Read-only mode trumps everything. if (position === 0) { return false; } // Position 0 should typically be editable. // Only allow editing of a 2nd or later condition if the previous condition is complete and no subsequent conditions are complete. return position > lastUiCompletePosition + 1; } isConditionBodyVisible(position) { // Check that the condition needs inputs. const type = this.getConditionType(position); const numberOfInputs = this.getNumberOfInputs(type); return numberOfInputs > 0; } // returns true if the UI represents a working filter, eg all parts are filled out. // eg if text filter and textfield blank then returns false. isConditionUiComplete(position) { if (position >= this.getNumConditions()) { return false; } // Condition doesn't exist. const type = this.getConditionType(position); if (type === 'empty') { return false; } if (this.getValues(position).some((v) => v == null)) { return false; } return true; } getNumConditions() { return this.eTypes.length; } getUiCompleteConditions() { const conditions = []; for (let position = 0; position < this.getNumConditions(); position++) { if (this.isConditionUiComplete(position)) { conditions.push(this.createCondition(position)); } } return conditions; } createMissingConditionsAndOperators() { if (this.isReadOnly()) { return; } // don't show incomplete conditions when read only for (let i = this.getNumConditions(); i < this.numAlwaysVisibleConditions; i++) { this.createJoinOperatorPanel(); this.createOption(); } } resetUiToDefaults(silent) { this.removeConditionsAndOperators(this.isReadOnly() ? 1 : this.numAlwaysVisibleConditions); this.eTypes.forEach((eType) => this.resetType(eType)); this.eJoinOperatorsAnd.forEach((eJoinOperatorAnd, index) => this.resetJoinOperatorAnd(eJoinOperatorAnd, index, this.joinOperatorId + index)); this.eJoinOperatorsOr.forEach((eJoinOperatorOr, index) => this.resetJoinOperatorOr(eJoinOperatorOr, index, this.joinOperatorId + index)); this.joinOperatorId++; this.forEachInput((element) => this.resetInput(element)); this.resetPlaceholder(); this.createMissingConditionsAndOperators(); this.lastUiCompletePosition = null; if (!silent) { this.onUiChanged(); } return promise_1.AgPromise.resolve(); } resetType(eType) { const translate = this.getLocaleTextFunc(); const filteringLabel = translate('ariaFilteringOperator', 'Filtering operator'); eType .setValue(this.optionsFactory.defaultOption, true) .setAriaLabel(filteringLabel) .setDisabled(this.isReadOnly() || this.filterListOptions.length <= 1); } resetJoinOperatorAnd(eJoinOperatorAnd, index, uniqueGroupId) { this.resetJoinOperator(eJoinOperatorAnd, index, this.defaultJoinOperator === 'AND', this.translate('andCondition'), uniqueGroupId); } resetJoinOperatorOr(eJoinOperatorOr, index, uniqueGroupId) { this.resetJoinOperator(eJoinOperatorOr, index, this.defaultJoinOperator === 'OR', this.translate('orCondition'), uniqueGroupId); } resetJoinOperator(eJoinOperator, index, value, label, uniqueGroupId) { this.updateJoinOperatorDisabled(eJoinOperator .setValue(value, true) .setName(`ag-simple-filter-and-or-${this.getCompId()}-${uniqueGroupId}`) .setLabel(label), index); } updateJoinOperatorsDisabled() { const updater = (eJoinOperator, index) => this.updateJoinOperatorDisabled(eJoinOperator, index); this.eJoinOperatorsAnd.forEach(updater); this.eJoinOperatorsOr.forEach(updater); } updateJoinOperatorDisabled(eJoinOperator, index) { eJoinOperator.setDisabled(this.isReadOnly() || index > 0); } resetInput(element) { this.setElementValue(element, null); this.setElementDisabled(element, this.isReadOnly()); } // puts model values into the UI setConditionIntoUi(model, position) { const values = this.mapValuesFromModel(model); this.forEachInput((element, index, elPosition) => { if (elPosition !== position) { return; } this.setElementValue(element, values[index] != null ? values[index] : null); }); } // after floating filter changes, this sets the 'value' section. this is implemented by the base class // (as that's where value is controlled), the 'type' part from the floating filter is dealt with in this class. setValueFromFloatingFilter(value) { this.forEachInput((element, index, position) => { this.setElementValue(element, index === 0 && position === 0 ? value : null, true); }); } addChangedListeners(eType, position) { if (this.isReadOnly()) { return; } eType.onValueChange(this.listener); this.forEachPositionInput(position, (element) => { this.attachElementOnChange(element, this.listener); }); } /** returns true if the row passes the said condition */ individualConditionPasses(params, filterModel) { const cellValue = this.getCellValue(params.node); const values = this.mapValuesFromModel(filterModel); const customFilterOption = this.optionsFactory.getCustomOption(filterModel.type); const customFilterResult = (0, simpleFilterUtils_1.evaluateCustomFilter)(customFilterOption, values, cellValue); if (customFilterResult != null) { return customFilterResult; } if (cellValue == null) { return this.evaluateNullValue(filterModel.type); } return this.evaluateNonNullValue(values, cellValue, filterModel, params); } hasInvalidInputs() { return false; } } exports.SimpleFilter = SimpleFilter; /***/ }), /***/ 2786: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.SimpleFilterModelFormatter = void 0; const filterLocaleText_1 = __webpack_require__(5741); class SimpleFilterModelFormatter { constructor(getLocaleTextFunc, optionsFactory, valueFormatter) { this.getLocaleTextFunc = getLocaleTextFunc; this.optionsFactory = optionsFactory; this.valueFormatter = valueFormatter; } // used by: // 1) NumberFloatingFilter & TextFloatingFilter: Always, for both when editable and read only. // 2) DateFloatingFilter: Only when read only (as we show text rather than a date picker when read only) getModelAsString(model) { if (!model) { return null; } const isCombined = model.operator != null; const translate = this.getLocaleTextFunc(); if (isCombined) { const combinedModel = model; const conditions = combinedModel.conditions ?? []; const customOptions = conditions.map((condition) => this.getModelAsString(condition)); const joinOperatorTranslateKey = combinedModel.operator === 'AND' ? 'andCondition' : 'orCondition'; return customOptions.join(` ${translate(joinOperatorTranslateKey, filterLocaleText_1.FILTER_LOCALE_TEXT[joinOperatorTranslateKey])} `); } else if (model.type === 'blank' || model.type === 'notBlank') { return translate(model.type, model.type); } else { const condition = model; const customOption = this.optionsFactory.getCustomOption(condition.type); // For custom filter options we display the Name of the filter instead // of displaying the `from` value, as it wouldn't be relevant const { displayKey, displayName, numberOfInputs } = customOption || {}; if (displayKey && displayName && numberOfInputs === 0) { translate(displayKey, displayName); return displayName; } return this.conditionToString(condition, customOption); } } updateParams(params) { this.optionsFactory = params.optionsFactory; } formatValue(value) { const valueFormatter = this.valueFormatter; return valueFormatter ? valueFormatter(value ?? null) ?? '' : String(value); } } exports.SimpleFilterModelFormatter = SimpleFilterModelFormatter; /***/ }), /***/ 7535: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.validateAndUpdateConditions = exports.evaluateCustomFilter = exports.getDefaultJoinOperator = exports.isBlank = exports.removeItems = void 0; const logging_1 = __webpack_require__(7764); function removeItems(items, startPosition, deleteCount) { return deleteCount == null ? items.splice(startPosition) : items.splice(startPosition, deleteCount); } exports.removeItems = removeItems; function isBlank(cellValue) { return cellValue == null || (typeof cellValue === 'string' && cellValue.trim().length === 0); } exports.isBlank = isBlank; function getDefaultJoinOperator(defaultJoinOperator) { return defaultJoinOperator === 'AND' || defaultJoinOperator === 'OR' ? defaultJoinOperator : 'AND'; } exports.getDefaultJoinOperator = getDefaultJoinOperator; function evaluateCustomFilter(customFilterOption, values, cellValue) { if (customFilterOption == null) { return; } const { predicate } = customFilterOption; // only execute the custom filter if a value exists or a value isn't required, i.e. input is hidden if (predicate != null && !values.some((v) => v == null)) { return predicate(values, cellValue); } // No custom filter invocation, indicate that to the caller. return; } exports.evaluateCustomFilter = evaluateCustomFilter; function validateAndUpdateConditions(conditions, maxNumConditions) { let numConditions = conditions.length; if (numConditions > maxNumConditions) { conditions.splice(maxNumConditions); // 'Filter Model contains more conditions than "filterParams.maxNumConditions". Additional conditions have been ignored.' (0, logging_1._warn)(78); numConditions = maxNumConditions; } return numConditions; } exports.validateAndUpdateConditions = validateAndUpdateConditions; /***/ }), /***/ 2811: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.TextFilter = void 0; const aria_1 = __webpack_require__(5230); const generic_1 = __webpack_require__(4422); const agInputTextField_1 = __webpack_require__(5946); const simpleFilter_1 = __webpack_require__(5220); const simpleFilterUtils_1 = __webpack_require__(7535); const textFilterConstants_1 = __webpack_require__(650); const textFilterModelFormatter_1 = __webpack_require__(330); const textFilterUtils_1 = __webpack_require__(2470); class TextFilter extends simpleFilter_1.SimpleFilter { constructor() { super('textFilter'); this.filterType = 'text'; this.defaultFormatter = (from) => from; this.defaultLowercaseFormatter = (from) => from == null ? null : from.toString().toLowerCase(); this.defaultMatcher = ({ filterOption, value, filterText }) => { if (filterText == null) { return false; } switch (filterOption) { case 'contains': return value.indexOf(filterText) >= 0; case 'notContains': return value.indexOf(filterText) < 0; case 'equals': return value === filterText; case 'notEqual': return value != filterText; case 'startsWith': return value.indexOf(filterText) === 0; case 'endsWith': { const index = value.lastIndexOf(filterText); return index >= 0 && index === value.length - filterText.length; } default: return false; } }; this.eValuesFrom = []; this.eValuesTo = []; this.defaultDebounceMs = 500; } setParams(params) { this.textFilterParams = params; super.setParams(params); this.matcher = params.textMatcher || this.defaultMatcher; this.formatter = params.textFormatter || (params.caseSensitive ? this.defaultFormatter : this.defaultLowercaseFormatter); this.filterModelFormatter = new textFilterModelFormatter_1.TextFilterModelFormatter(this.getLocaleTextFunc.bind(this), this.optionsFactory); } createCondition(position) { const type = this.getConditionType(position); const model = { filterType: this.filterType, type, }; const values = this.getValuesWithSideEffects(position, true); if (values.length > 0) { model.filter = values[0]; } if (values.length > 1) { model.filterTo = values[1]; } return model; } areSimpleModelsEqual(aSimple, bSimple) { return (aSimple.filter === bSimple.filter && aSimple.filterTo === bSimple.filterTo && aSimple.type === bSimple.type); } getInputs(position) { const { eValuesFrom, eValuesTo } = this; if (position >= eValuesFrom.length) { return [null, null]; } return [eValuesFrom[position], eValuesTo[position]]; } getValues(position) { return this.getValuesWithSideEffects(position, false); } getValuesWithSideEffects(position, applySideEffects) { const result = []; this.forEachPositionInput(position, (element, index, _elPosition, numberOfInputs) => { if (index < numberOfInputs) { let value = (0, generic_1._makeNull)(element.getValue()); if (applySideEffects && this.textFilterParams.trimInput) { value = (0, textFilterUtils_1.trimInputForFilter)(value) ?? null; element.setValue(value, true); // ensure clean value is visible } result.push(value); } }); return result; } getDefaultFilterOptions() { return textFilterConstants_1.DEFAULT_TEXT_FILTER_OPTIONS; } createValueElement() { const eCondition = document.createElement('div'); eCondition.classList.add('ag-filter-body'); (0, aria_1._setAriaRole)(eCondition, 'presentation'); this.createFromToElement(eCondition, this.eValuesFrom, 'from'); this.createFromToElement(eCondition, this.eValuesTo, 'to'); return eCondition; } createFromToElement(eCondition, eValues, fromTo) { const eValue = this.createManagedBean(new agInputTextField_1.AgInputTextField()); eValue.addCssClass(`ag-filter-${fromTo}`); eValue.addCssClass('ag-filter-filter'); eValues.push(eValue); eCondition.appendChild(eValue.getGui()); } removeValueElements(startPosition, deleteCount) { const removeComps = (eGui) => this.removeComponents(eGui, startPosition, deleteCount); removeComps(this.eValuesFrom); removeComps(this.eValuesTo); } mapValuesFromModel(filterModel) { const { filter, filterTo, type } = filterModel || {}; return [filter || null, filterTo || null].slice(0, this.getNumberOfInputs(type)); } evaluateNullValue(filterType) { const filterTypesAllowNulls = ['notEqual', 'notContains', 'blank']; return filterType ? filterTypesAllowNulls.indexOf(filterType) >= 0 : false; } evaluateNonNullValue(values, cellValue, filterModel, params) { const formattedValues = values.map((v) => this.formatter(v)) || []; const cellValueFormatted = this.formatter(cellValue); const { api, colDef, column, context, textFormatter } = this.textFilterParams; if (filterModel.type === 'blank') { return (0, simpleFilterUtils_1.isBlank)(cellValue); } else if (filterModel.type === 'notBlank') { return !(0, simpleFilterUtils_1.isBlank)(cellValue); } const matcherParams = { api, colDef, column, context, node: params.node, data: params.data, filterOption: filterModel.type, value: cellValueFormatted, textFormatter, }; return formattedValues.some((v) => this.matcher({ ...matcherParams, filterText: v })); } getModelAsString(model) { return this.filterModelFormatter.getModelAsString(model) ?? ''; } } exports.TextFilter = TextFilter; /***/ }), /***/ 650: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.DEFAULT_TEXT_FILTER_OPTIONS = void 0; exports.DEFAULT_TEXT_FILTER_OPTIONS = [ 'contains', 'notContains', 'equals', 'notEqual', 'startsWith', 'endsWith', 'blank', 'notBlank', ]; /***/ }), /***/ 330: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.TextFilterModelFormatter = void 0; const simpleFilterModelFormatter_1 = __webpack_require__(2786); class TextFilterModelFormatter extends simpleFilterModelFormatter_1.SimpleFilterModelFormatter { conditionToString(condition, options) { const { numberOfInputs } = options || {}; const { filter, filterTo, type } = condition; const isRange = type == 'inRange' || numberOfInputs === 2; if (isRange) { return `${filter}-${filterTo}`; } // cater for when the type doesn't need a value if (filter != null) { return `${filter}`; } return `${type}`; } } exports.TextFilterModelFormatter = TextFilterModelFormatter; /***/ }), /***/ 2470: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.trimInputForFilter = void 0; function trimInputForFilter(value) { const trimmedInput = value?.trim(); // trim the input, unless it is all whitespace (this is consistent with Excel behaviour) return trimmedInput === '' ? value : trimmedInput; } exports.trimInputForFilter = trimInputForFilter; /***/ }), /***/ 8305: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.TextFloatingFilter = void 0; const floatingFilterTextInputService_1 = __webpack_require__(7287); const textInputFloatingFilter_1 = __webpack_require__(8922); const textFilterConstants_1 = __webpack_require__(650); const textFilterModelFormatter_1 = __webpack_require__(330); class TextFloatingFilter extends textInputFloatingFilter_1.TextInputFloatingFilter { init(params) { super.init(params); this.filterModelFormatter = new textFilterModelFormatter_1.TextFilterModelFormatter(this.getLocaleTextFunc.bind(this), this.optionsFactory); } refresh(params) { super.refresh(params); this.filterModelFormatter.updateParams({ optionsFactory: this.optionsFactory }); } getDefaultOptions() { return textFilterConstants_1.DEFAULT_TEXT_FILTER_OPTIONS; } createFloatingFilterInputService() { return this.createManagedBean(new floatingFilterTextInputService_1.FloatingFilterTextInputService()); } } exports.TextFloatingFilter = TextFloatingFilter; /***/ }), /***/ 5381: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.resetQuickFilter = exports.getQuickFilter = exports.isQuickFilterPresent = void 0; function isQuickFilterPresent(beans) { return !!beans.quickFilter?.isFilterPresent(); } exports.isQuickFilterPresent = isQuickFilterPresent; function getQuickFilter(beans) { return beans.quickFilter?.getText(); } exports.getQuickFilter = getQuickFilter; function resetQuickFilter(beans) { beans.quickFilter?.resetCache(); } exports.resetQuickFilter = resetQuickFilter; /***/ }), /***/ 1238: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.QuickFilterService = void 0; const beanStub_1 = __webpack_require__(8731); const gridOptionsUtils_1 = __webpack_require__(7274); const generic_1 = __webpack_require__(4422); const logging_1 = __webpack_require__(7764); class QuickFilterService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'quickFilter'; this.quickFilter = null; this.quickFilterParts = null; } postConstruct() { const resetListener = this.resetCache.bind(this); const gos = this.gos; this.addManagedEventListeners({ columnPivotModeChanged: resetListener, newColumnsLoaded: resetListener, columnRowGroupChanged: resetListener, columnVisible: () => { if (!gos.get('includeHiddenColumnsInQuickFilter')) { this.resetCache(); } }, }); this.addManagedPropertyListener('quickFilterText', (e) => this.setFilter(e.currentValue)); this.addManagedPropertyListeners(['includeHiddenColumnsInQuickFilter', 'applyQuickFilterBeforePivotOrAgg'], () => this.onColumnConfigChanged()); this.quickFilter = this.parseFilter(gos.get('quickFilterText')); this.parser = gos.get('quickFilterParser'); this.matcher = gos.get('quickFilterMatcher'); this.setFilterParts(); this.addManagedPropertyListeners(['quickFilterMatcher', 'quickFilterParser'], () => this.setParserAndMatcher()); } // if we are using autoGroupCols, then they should be included for quick filter. this covers the // following scenarios: // a) user provides 'field' into autoGroupCol of normal grid, so now because a valid col to filter leafs on // b) using tree data and user depends on autoGroupCol for first col, and we also want to filter on this // (tree data is a bit different, as parent rows can be filtered on, unlike row grouping) refreshCols() { const { autoColSvc, colModel, gos, pivotResultCols } = this.beans; const pivotMode = colModel.isPivotMode(); const groupAutoCols = autoColSvc?.getColumns(); const providedCols = colModel.getColDefCols(); let columnsForQuickFilter = (pivotMode && !gos.get('applyQuickFilterBeforePivotOrAgg') ? pivotResultCols?.getPivotResultCols()?.list : providedCols) ?? []; if (groupAutoCols) { columnsForQuickFilter = columnsForQuickFilter.concat(groupAutoCols); } this.colsToUse = gos.get('includeHiddenColumnsInQuickFilter') ? columnsForQuickFilter : columnsForQuickFilter.filter((col) => col.isVisible() || col.isRowGroupActive()); } isFilterPresent() { return this.quickFilter !== null; } doesRowPass(node) { const usingCache = this.gos.get('cacheQuickFilter'); if (this.matcher) { return this.doesRowPassMatcher(usingCache, node); } // each part must pass, if any fails, then the whole filter fails return this.quickFilterParts.every((part) => usingCache ? this.doesRowPassCache(node, part) : this.doesRowPassNoCache(node, part)); } resetCache() { this.beans.rowModel.forEachNode((node) => (node.quickFilterAggregateText = null)); } getText() { return this.gos.get('quickFilterText'); } setFilterParts() { const { quickFilter, parser } = this; if (quickFilter) { this.quickFilterParts = parser ? parser(quickFilter) : quickFilter.split(' '); } else { this.quickFilterParts = null; } } parseFilter(newFilter) { if (!(0, generic_1._exists)(newFilter)) { return null; } return newFilter.toUpperCase(); } setFilter(newFilter) { if (newFilter != null && typeof newFilter !== 'string') { (0, logging_1._warn)(70, { newFilter }); return; } const parsedFilter = this.parseFilter(newFilter); if (this.quickFilter !== parsedFilter) { this.quickFilter = parsedFilter; this.setFilterParts(); this.dispatchLocalEvent({ type: 'quickFilterChanged' }); } } setParserAndMatcher() { const parser = this.gos.get('quickFilterParser'); const matcher = this.gos.get('quickFilterMatcher'); const hasChanged = parser !== this.parser || matcher !== this.matcher; this.parser = parser; this.matcher = matcher; if (hasChanged) { this.setFilterParts(); this.dispatchLocalEvent({ type: 'quickFilterChanged' }); } } onColumnConfigChanged() { this.refreshCols(); this.resetCache(); if (this.isFilterPresent()) { this.dispatchLocalEvent({ type: 'quickFilterChanged' }); } } doesRowPassNoCache(node, filterPart) { return this.colsToUse.some((column) => { const part = this.getTextForColumn(column, node); return (0, generic_1._exists)(part) && part.indexOf(filterPart) >= 0; }); } doesRowPassCache(node, filterPart) { this.checkGenerateAggText(node); return node.quickFilterAggregateText.indexOf(filterPart) >= 0; } doesRowPassMatcher(usingCache, node) { let quickFilterAggregateText; if (usingCache) { this.checkGenerateAggText(node); quickFilterAggregateText = node.quickFilterAggregateText; } else { quickFilterAggregateText = this.getAggText(node); } const { quickFilterParts, matcher } = this; return matcher(quickFilterParts, quickFilterAggregateText); } checkGenerateAggText(node) { if (!node.quickFilterAggregateText) { node.quickFilterAggregateText = this.getAggText(node); } } getTextForColumn(column, node) { let value = this.beans.filterValueSvc.getValue(column, node); const colDef = column.getColDef(); if (colDef.getQuickFilterText) { const params = (0, gridOptionsUtils_1._addGridCommonParams)(this.gos, { value, node, data: node.data, column, colDef, }); value = colDef.getQuickFilterText(params); } return (0, generic_1._exists)(value) ? value.toString().toUpperCase() : null; } getAggText(node) { const stringParts = []; this.colsToUse.forEach((column) => { const part = this.getTextForColumn(column, node); if ((0, generic_1._exists)(part)) { stringParts.push(part); } }); return stringParts.join('\n'); } } exports.QuickFilterService = QuickFilterService; /***/ }), /***/ 5626: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.FocusService = void 0; const keyCode_1 = __webpack_require__(9853); const beanStub_1 = __webpack_require__(8731); const positionUtils_1 = __webpack_require__(6257); const gridOptionsUtils_1 = __webpack_require__(7274); const abstractHeaderCellCtrl_1 = __webpack_require__(3534); const headerUtils_1 = __webpack_require__(1323); const headerNavigationService_1 = __webpack_require__(3990); const rowCtrl_1 = __webpack_require__(7632); const array_1 = __webpack_require__(1502); const focus_1 = __webpack_require__(2331); const generic_1 = __webpack_require__(4422); class FocusService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'focusSvc'; } wireBeans(beans) { this.colModel = beans.colModel; this.visibleCols = beans.visibleCols; this.rowRenderer = beans.rowRenderer; this.navigation = beans.navigation; this.filterManager = beans.filterManager; this.overlays = beans.overlays; } postConstruct() { const clearFocusedCellListener = this.clearFocusedCell.bind(this); this.addManagedEventListeners({ columnPivotModeChanged: clearFocusedCellListener, newColumnsLoaded: this.onColumnEverythingChanged.bind(this), columnGroupOpened: clearFocusedCellListener, columnRowGroupChanged: clearFocusedCellListener, }); this.addDestroyFunc((0, focus_1._registerKeyboardFocusEvents)(this.beans)); } onColumnEverythingChanged() { // if the columns change, check and see if this column still exists. if it does, then // we can keep the focused cell. if it doesn't, then we need to drop the focused cell. if (!this.focusedCell) { return; } const col = this.focusedCell.column; const colFromColumnModel = this.colModel.getCol(col.getId()); if (col !== colFromColumnModel) { this.clearFocusedCell(); } } // we check if the browser is focusing something, and if it is, and // it's the cell we think is focused, then return the cell. so this // methods returns the cell if a) we think it has focus and b) the // browser thinks it has focus. this then returns nothing if we // first focus a cell, then second click outside the grid, as then the // grid cell will still be focused as far as the grid is concerned, // however the browser focus will have moved somewhere else. getFocusCellToUseAfterRefresh() { if (this.gos.get('suppressFocusAfterRefresh') || !this.focusedCell) { return null; } // we check that the browser is actually focusing on the grid, if it is not, then // we have nothing to worry about. we check for ROW data, as this covers both focused Rows (for Full Width Rows) // and Cells (covers cells as cells live in rows) if (this.isDomDataMissingInHierarchy((0, gridOptionsUtils_1._getActiveDomElement)(this.beans), rowCtrl_1.DOM_DATA_KEY_ROW_CTRL)) { return null; } return this.focusedCell; } getFocusHeaderToUseAfterRefresh() { if (this.gos.get('suppressFocusAfterRefresh') || !this.focusedHeader) { return null; } // we check that the browser is actually focusing on the grid, if it is not, then // we have nothing to worry about if (this.isDomDataMissingInHierarchy((0, gridOptionsUtils_1._getActiveDomElement)(this.beans), abstractHeaderCellCtrl_1.DOM_DATA_KEY_HEADER_CTRL)) { return null; } return this.focusedHeader; } isDomDataMissingInHierarchy(eBrowserCell, key) { let ePointer = eBrowserCell; while (ePointer) { const data = (0, gridOptionsUtils_1._getDomData)(this.gos, ePointer, key); if (data) { return false; } ePointer = ePointer.parentNode; } return true; } getFocusedCell() { return this.focusedCell; } shouldRestoreFocus(cell) { if (this.isCellRestoreFocused(cell)) { setTimeout(() => { // Clear the restore focused cell position after the timeout to avoid // the cell being focused again and stealing focus from another part of the app. this.restoredFocusedCell = null; }, 0); return true; } return false; } clearRestoreFocus() { this.restoredFocusedCell = null; this.awaitRestoreFocusedCell = false; } restoreFocusedCell(cellPosition, setFocusCallback) { this.awaitRestoreFocusedCell = true; // this should be done asynchronously to work with React Renderers. setTimeout(() => { // if the cell has lost focus (react events are async), we don't want to restore if (!this.awaitRestoreFocusedCell) { return; } this.setRestoreFocusedCell(cellPosition); setFocusCallback(); }); } isCellRestoreFocused(cellPosition) { if (this.restoredFocusedCell == null) { return false; } if ('cellSpan' in cellPosition) { return cellPosition.doesSpanContain(this.restoredFocusedCell); } return (0, positionUtils_1._areCellsEqual)(cellPosition, this.restoredFocusedCell); } setRestoreFocusedCell(cellPosition) { if (this.beans.frameworkOverrides.renderingEngine === 'react') { // The restoredFocusedCellPosition is used in the React Rendering engine as we have to be able // to support restoring focus after an async rendering. this.restoredFocusedCell = cellPosition; } } getFocusEventParams(focusedCellPosition) { const { rowIndex, rowPinned, column } = focusedCellPosition; const params = { rowIndex: rowIndex, rowPinned: rowPinned, column: column, isFullWidthCell: false, }; const rowCtrl = this.rowRenderer.getRowByPosition({ rowIndex, rowPinned }); if (rowCtrl) { params.isFullWidthCell = rowCtrl.isFullWidth(); } return params; } clearFocusedCell() { this.restoredFocusedCell = null; if (this.focusedCell == null) { return; } const focusEventParams = this.getFocusEventParams(this.focusedCell); this.focusedCell = null; this.eventSvc.dispatchEvent({ type: 'cellFocusCleared', ...focusEventParams, }); } setFocusedCell(params) { const { column, rowIndex, rowPinned, forceBrowserFocus = false, preventScrollOnBrowserFocus = false } = params; const gridColumn = this.colModel.getCol(column); // if column doesn't exist, then blank the focused cell and return. this can happen when user sets new columns, // and the focused cell is in a column that no longer exists. after columns change, the grid refreshes and tries // to re-focus the focused cell. if (!gridColumn) { this.focusedCell = null; return; } this.focusedCell = { rowIndex: rowIndex, rowPinned: (0, generic_1._makeNull)(rowPinned), column: gridColumn, }; this.eventSvc.dispatchEvent({ type: 'cellFocused', ...this.getFocusEventParams(this.focusedCell), forceBrowserFocus, preventScrollOnBrowserFocus, }); } isCellFocused(cellPosition) { if (this.focusedCell == null) { return false; } return (0, positionUtils_1._areCellsEqual)(cellPosition, this.focusedCell); } isRowNodeFocused(rowNode) { return this.isRowFocused(rowNode.rowIndex, rowNode.rowPinned); } isHeaderWrapperFocused(headerCtrl) { if (this.focusedHeader == null) { return false; } const { column, rowCtrl: { rowIndex: headerRowIndex, pinned }, } = headerCtrl; const { column: focusedColumn, headerRowIndex: focusedHeaderRowIndex } = this.focusedHeader; return (column === focusedColumn && headerRowIndex === focusedHeaderRowIndex && pinned == focusedColumn.getPinned()); } focusHeaderPosition(params) { if ((0, focus_1._isHeaderFocusSuppressed)(this.beans)) { return false; } const { direction, fromTab, allowUserOverride, event, fromCell, rowWithoutSpanValue } = params; let { headerPosition } = params; if (fromCell && this.filterManager?.isAdvFilterHeaderActive()) { return this.focusAdvancedFilter(headerPosition); } if (allowUserOverride) { const currentPosition = this.focusedHeader; const headerRowCount = (0, headerUtils_1.getFocusHeaderRowCount)(this.beans); if (fromTab) { const userFunc = this.gos.getCallback('tabToNextHeader'); if (userFunc) { headerPosition = this.getHeaderPositionFromUserFunc({ userFunc, direction, currentPosition, headerPosition, headerRowCount, }); } } else { const userFunc = this.gos.getCallback('navigateToNextHeader'); if (userFunc && event) { const params = { key: event.key, previousHeaderPosition: currentPosition, nextHeaderPosition: headerPosition, headerRowCount, event, }; headerPosition = userFunc(params); } } } if (!headerPosition) { return false; } return this.focusProvidedHeaderPosition({ headerPosition, direction, event, fromCell, rowWithoutSpanValue, }); } focusHeaderPositionFromUserFunc(params) { if ((0, focus_1._isHeaderFocusSuppressed)(this.beans)) { return false; } const { userFunc, headerPosition, direction, event } = params; const currentPosition = this.focusedHeader; const headerRowCount = (0, headerUtils_1.getFocusHeaderRowCount)(this.beans); const newHeaderPosition = this.getHeaderPositionFromUserFunc({ userFunc, direction, currentPosition, headerPosition, headerRowCount, }); return (!!newHeaderPosition && this.focusProvidedHeaderPosition({ headerPosition: newHeaderPosition, direction, event, })); } getHeaderPositionFromUserFunc(params) { const { userFunc, direction, currentPosition, headerPosition, headerRowCount } = params; const userFuncParams = { backwards: direction === 'Before', previousHeaderPosition: currentPosition, nextHeaderPosition: headerPosition, headerRowCount, }; const userResult = userFunc(userFuncParams); if (userResult === true) { return currentPosition; } if (userResult === false) { return null; } return userResult; } focusProvidedHeaderPosition(params) { const { headerPosition, direction, fromCell, rowWithoutSpanValue, event } = params; const { column, headerRowIndex } = headerPosition; const { filterManager, ctrlsSvc, headerNavigation } = this.beans; if (headerRowIndex === -1) { if (filterManager?.isAdvFilterHeaderActive()) { return this.focusAdvancedFilter(headerPosition); } return this.focusGridView({ column: column, event }); } headerNavigation?.scrollToColumn(column, direction); const headerRowContainerCtrl = ctrlsSvc.getHeaderRowContainerCtrl(column.getPinned()); // this will automatically set the focused header const focusSuccess = headerRowContainerCtrl?.focusHeader(headerPosition.headerRowIndex, column, event) || false; if (headerNavigation && focusSuccess && (rowWithoutSpanValue != null || fromCell)) { headerNavigation.currentHeaderRowWithoutSpan = rowWithoutSpanValue ?? -1; } return focusSuccess; } focusFirstHeader() { if (this.overlays?.isExclusive() && this.focusOverlay()) { return true; } let firstColumn = this.visibleCols.allCols[0]; if (!firstColumn) { return false; } const { colGroupSvc } = this.beans; if (colGroupSvc && firstColumn.getParent()) { firstColumn = colGroupSvc.getColGroupAtLevel(firstColumn, 0); } const headerPosition = (0, headerNavigationService_1.getHeaderIndexToFocus)(firstColumn, 0); return this.focusHeaderPosition({ headerPosition, rowWithoutSpanValue: 0, }); } focusLastHeader(event) { if (this.overlays?.isExclusive() && this.focusOverlay(true)) { return true; } const headerRowIndex = (0, headerUtils_1.getFocusHeaderRowCount)(this.beans) - 1; const column = (0, array_1._last)(this.visibleCols.allCols); return this.focusHeaderPosition({ headerPosition: { headerRowIndex, column }, rowWithoutSpanValue: -1, event, }); } focusPreviousFromFirstCell(event) { if (this.filterManager?.isAdvFilterHeaderActive()) { return this.focusAdvancedFilter(null); } return this.focusLastHeader(event); } isAnyCellFocused() { return !!this.focusedCell; } isRowFocused(rowIndex, rowPinnedType) { if (this.focusedCell == null) { return false; } return this.focusedCell.rowIndex === rowIndex && this.focusedCell.rowPinned === (0, generic_1._makeNull)(rowPinnedType); } focusOverlay(backwards) { const overlayGui = this.overlays?.isVisible() && this.overlays.eWrapper?.getGui(); return !!overlayGui && (0, focus_1._focusInto)(overlayGui, backwards); } focusGridView(params) { const { backwards = false, canFocusOverlay = true, event } = params; if (this.overlays?.isExclusive()) { return canFocusOverlay && this.focusOverlay(backwards); } // if suppressCellFocus is `true`, it means the user does not want to // navigate between the cells using tab. Instead, we put focus on either // the header or after the grid, depending on whether tab or shift-tab was pressed. if ((0, focus_1._isCellFocusSuppressed)(this.beans)) { if (backwards) { if (!(0, focus_1._isHeaderFocusSuppressed)(this.beans)) { return this.focusLastHeader(); } } if (canFocusOverlay && this.focusOverlay(backwards)) { return true; } if (backwards) { return false; } return (0, focus_1._focusNextGridCoreContainer)(this.beans, backwards); } const nextRow = backwards ? (0, positionUtils_1._getLastRow)(this.beans) : (0, positionUtils_1._getFirstRow)(this.beans); if (nextRow) { const column = params.column ?? this.focusedHeader?.column; const { rowIndex, rowPinned } = nextRow; const rowNode = (0, positionUtils_1._getRowNode)(this.beans, nextRow); if (!column || !rowNode || rowIndex == null) { return false; } if (column.isSuppressNavigable(rowNode)) { const isRtl = this.gos.get('enableRtl'); let key; if (!event || event.key === keyCode_1.KeyCode.TAB) { key = isRtl ? keyCode_1.KeyCode.LEFT : keyCode_1.KeyCode.RIGHT; } else { key = event.key; } this.beans.navigation?.navigateToNextCell(null, key, { rowIndex, column, rowPinned: rowPinned || null }, true); return true; } this.navigation?.ensureCellVisible({ rowIndex, column, rowPinned }); if (backwards) { // if full width we need to focus into the full width cell in the correct direction const rowCtrl = this.rowRenderer.getRowByPosition(nextRow); if (rowCtrl?.isFullWidth() && this.navigation?.tryToFocusFullWidthRow(nextRow, backwards)) { return true; } } this.setFocusedCell({ rowIndex, column, rowPinned: (0, generic_1._makeNull)(rowPinned), forceBrowserFocus: true, }); this.beans.rangeSvc?.setRangeToCell({ rowIndex, rowPinned, column }); return true; } if (canFocusOverlay && this.focusOverlay(backwards)) { return true; } if (backwards && this.focusLastHeader()) { return true; } return false; } focusAdvancedFilter(position) { this.advFilterFocusColumn = position?.column; return this.beans.advancedFilter?.getCtrl().focusHeaderComp() ?? false; } focusNextFromAdvancedFilter(backwards, forceFirstColumn) { const column = (forceFirstColumn ? undefined : this.advFilterFocusColumn) ?? this.visibleCols.allCols?.[0]; if (backwards) { return this.focusHeaderPosition({ headerPosition: { column: column, headerRowIndex: (0, headerUtils_1.getFocusHeaderRowCount)(this.beans) - 1, }, }); } else { return this.focusGridView({ column }); } } clearAdvancedFilterColumn() { this.advFilterFocusColumn = undefined; } } exports.FocusService = FocusService; /***/ }), /***/ 1657: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.GridCoreCreator = exports.createGrid = exports._getGlobalGridOption = exports.provideGlobalGridOptions = void 0; const apiUtils_1 = __webpack_require__(6433); const context_1 = __webpack_require__(2342); const gridBeanComparator_1 = __webpack_require__(3943); const gridComp_1 = __webpack_require__(1678); const gridCoreModule_1 = __webpack_require__(1978); const moduleRegistry_1 = __webpack_require__(2132); const generic_1 = __webpack_require__(4422); const object_1 = __webpack_require__(6996); const logging_1 = __webpack_require__(7764); const vanillaFrameworkOverrides_1 = __webpack_require__(6511); class GlobalGridOptions { /** * @param providedOptions * @returns Shallow copy of the provided options with global options merged in. */ static applyGlobalGridOptions(providedOptions) { if (!GlobalGridOptions.gridOptions) { // No global options provided, return a shallow copy of the provided options return { ...providedOptions }; } let mergedGridOps = {}; // Merge deep to avoid leaking changes to the global options (0, object_1._mergeDeep)(mergedGridOps, GlobalGridOptions.gridOptions, true, true); if (GlobalGridOptions.mergeStrategy === 'deep') { (0, object_1._mergeDeep)(mergedGridOps, providedOptions, true, true); } else { // Shallow copy so that provided object properties completely override global options mergedGridOps = { ...mergedGridOps, ...providedOptions }; } if (GlobalGridOptions.gridOptions.context) { // Ensure context reference is maintained if it was provided mergedGridOps.context = GlobalGridOptions.gridOptions.context; } if (providedOptions.context) { if (GlobalGridOptions.mergeStrategy === 'deep' && mergedGridOps.context) { // Merge global context properties into the provided context whilst maintaining provided context reference (0, object_1._mergeDeep)(providedOptions.context, mergedGridOps.context, true, true); } mergedGridOps.context = providedOptions.context; } return mergedGridOps; } } GlobalGridOptions.gridOptions = undefined; GlobalGridOptions.mergeStrategy = 'shallow'; /** * Provide gridOptions that will be shared by all grid instances. * Individually defined GridOptions will take precedence over global options. * @param gridOptions - global grid options */ function provideGlobalGridOptions(gridOptions, mergeStrategy = 'shallow') { GlobalGridOptions.gridOptions = gridOptions; GlobalGridOptions.mergeStrategy = mergeStrategy; } exports.provideGlobalGridOptions = provideGlobalGridOptions; function _getGlobalGridOption(gridOption) { return GlobalGridOptions.gridOptions?.[gridOption]; } exports._getGlobalGridOption = _getGlobalGridOption; // **NOTE** If updating this JsDoc please also update the re-exported createGrid in main-umd-shared.ts /** * Creates a grid inside the provided HTML element. * @param eGridDiv Parent element to contain the grid. * @param gridOptions Configuration for the grid. * @param params Individually register AG Grid Modules to this grid. * @returns api to be used to interact with the grid. */ function createGrid(eGridDiv, gridOptions, params) { if (!gridOptions) { // No gridOptions provided, abort creating the grid (0, logging_1._error)(11); return {}; } const gridParams = params; let destroyCallback; if (!gridParams?.setThemeOnGridDiv) { // frameworks already create an element owned by our code, so we can set // the theme class on it. JS users calling createGrid directly are // passing an element owned by their application, so we can't set a // class name on it and must create a wrapper. const newGridDiv = document.createElement('div'); newGridDiv.style.height = '100%'; eGridDiv.appendChild(newGridDiv); eGridDiv = newGridDiv; destroyCallback = () => eGridDiv.remove(); } const api = new GridCoreCreator().create(eGridDiv, gridOptions, (context) => { const gridComp = new gridComp_1.GridComp(eGridDiv); context.createBean(gridComp); }, undefined, params, destroyCallback); return api; } exports.createGrid = createGrid; let nextGridId = 1; // creates services of grid only, no UI, so frameworks can use this if providing // their own UI class GridCoreCreator { create(eGridDiv, providedOptions, createUi, acceptChanges, params, destroyCallback) { // Returns a shallow copy of the provided options, with global options merged in const gridOptions = GlobalGridOptions.applyGlobalGridOptions(providedOptions); const gridId = gridOptions.gridId ?? String(nextGridId++); const rowModelType = gridOptions.rowModelType ?? 'clientSide'; const registeredModules = this.getRegisteredModules(params, gridId, rowModelType); const beanClasses = this.createBeansList(rowModelType, registeredModules, gridId); const providedBeanInstances = this.createProvidedBeans(eGridDiv, gridOptions, params); if (!beanClasses) { // Detailed error message will have been printed by createBeansList // Break typing so that the normal return type does not have to handle undefined. return undefined; } const contextParams = { providedBeanInstances, beanClasses, gridId, beanInitComparator: gridBeanComparator_1.gridBeanInitComparator, beanDestroyComparator: gridBeanComparator_1.gridBeanDestroyComparator, derivedBeans: [apiUtils_1.createGridApi], destroyCallback, }; const context = new context_1.Context(contextParams); this.registerModuleFeatures(context, registeredModules); createUi(context); context.getBean('syncSvc').start(); if (acceptChanges) { acceptChanges(context); } return context.getBean('gridApi'); } getRegisteredModules(params, gridId, rowModelType) { (0, moduleRegistry_1._registerModule)(gridCoreModule_1.CommunityCoreModule, undefined); params?.modules?.forEach((m) => (0, moduleRegistry_1._registerModule)(m, gridId)); return (0, moduleRegistry_1._getRegisteredModules)(gridId, rowModelType); } registerModuleFeatures(context, registeredModules) { const registry = context.getBean('registry'); const apiFunctionSvc = context.getBean('apiFunctionSvc'); registeredModules.forEach((module) => { registry.registerModule(module); const apiFunctions = module.apiFunctions; if (apiFunctions) { const names = Object.keys(apiFunctions); names.forEach((name) => { apiFunctionSvc?.addFunction(name, apiFunctions[name]); }); } }); } createProvidedBeans(eGridDiv, gridOptions, params) { let frameworkOverrides = params ? params.frameworkOverrides : null; if ((0, generic_1._missing)(frameworkOverrides)) { frameworkOverrides = new vanillaFrameworkOverrides_1.VanillaFrameworkOverrides(); } const seed = { gridOptions: gridOptions, eGridDiv: eGridDiv, globalListener: params ? params.globalListener : null, globalSyncListener: params ? params.globalSyncListener : null, frameworkOverrides: frameworkOverrides, }; if (params && params.providedBeanInstances) { Object.assign(seed, params.providedBeanInstances); } return seed; } createBeansList(rowModelType, registeredModules, gridId) { // assert that the relevant module has been loaded const rowModelModuleNames = { clientSide: 'ClientSideRowModel', infinite: 'InfiniteRowModel', serverSide: 'ServerSideRowModel', viewport: 'ViewportRowModel', }; const rowModuleModelName = rowModelModuleNames[rowModelType]; if (!rowModuleModelName) { // can't use validation service here as hasn't been created yet (0, logging_1._logPreInitErr)(201, { rowModelType }, `Unknown rowModelType ${rowModelType}.`); return; } if (!(0, moduleRegistry_1._isModuleRegistered)(rowModuleModelName, gridId, rowModelType)) { (0, logging_1._logPreInitErr)(200, { reasonOrId: `rowModelType = '${rowModelType}'`, moduleName: rowModuleModelName, gridScoped: (0, moduleRegistry_1._areModulesGridScoped)(), gridId, rowModelType, }, `Missing module ${rowModuleModelName}Module for rowModelType ${rowModelType}. \nIf upgrading from before v33, see ${logging_1.baseDocLink}/upgrading-to-ag-grid-33/#changes-to-modules/`); return; } const beans = new Set(); registeredModules.forEach((module) => module.beans?.forEach((bean) => beans.add(bean))); return Array.from(beans); } } exports.GridCoreCreator = GridCoreCreator; /***/ }), /***/ 736: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.AbstractFakeScrollComp = void 0; const animationFrameService_1 = __webpack_require__(2612); const browser_1 = __webpack_require__(8667); const dom_1 = __webpack_require__(3507); const function_1 = __webpack_require__(2043); const component_1 = __webpack_require__(8020); class AbstractFakeScrollComp extends component_1.Component { constructor(template, direction) { super(); this.direction = direction; this.eViewport = component_1.RefPlaceholder; this.eContainer = component_1.RefPlaceholder; this.hideTimeout = 0; this.setTemplate(template); } postConstruct() { this.addManagedEventListeners({ scrollVisibilityChanged: this.onScrollVisibilityChanged.bind(this), }); this.onScrollVisibilityChanged(); this.addOrRemoveCssClass('ag-apple-scrollbar', (0, browser_1._isMacOsUserAgent)() || (0, browser_1._isIOSUserAgent)()); } destroy() { super.destroy(); window.clearTimeout(this.hideTimeout); } initialiseInvisibleScrollbar() { if (this.invisibleScrollbar !== undefined) { return; } this.invisibleScrollbar = (0, browser_1._isInvisibleScrollbar)(); if (this.invisibleScrollbar) { this.hideAndShowInvisibleScrollAsNeeded(); this.addActiveListenerToggles(); } } addActiveListenerToggles() { const eGui = this.getGui(); const onActivate = () => this.addOrRemoveCssClass('ag-scrollbar-active', true); const onDeactivate = () => this.addOrRemoveCssClass('ag-scrollbar-active', false); this.addManagedListeners(eGui, { mouseenter: onActivate, mousedown: onActivate, touchstart: onActivate, mouseleave: onDeactivate, touchend: onDeactivate, }); } onScrollVisibilityChanged() { // initialiseInvisibleScrollbar should only be called once, but the reason // this can't be inside `setComp` or `postConstruct` is the DOM might not // be ready, so we call it until eventually, it gets calculated. if (this.invisibleScrollbar === undefined) { this.initialiseInvisibleScrollbar(); } (0, animationFrameService_1._requestAnimationFrame)(this.beans, () => this.setScrollVisible()); } hideAndShowInvisibleScrollAsNeeded() { this.addManagedEventListeners({ bodyScroll: (params) => { if (params.direction === this.direction) { if (this.hideTimeout) { window.clearTimeout(this.hideTimeout); this.hideTimeout = 0; } this.addOrRemoveCssClass('ag-scrollbar-scrolling', true); } }, bodyScrollEnd: () => { this.hideTimeout = window.setTimeout(() => { this.addOrRemoveCssClass('ag-scrollbar-scrolling', false); this.hideTimeout = 0; }, 400); }, }); } attemptSettingScrollPosition(value) { const viewport = this.eViewport; (0, function_1._waitUntil)(() => (0, dom_1._isVisible)(viewport), () => this.setScrollPosition(value), 100); } onScrollCallback(fn) { this.addManagedElementListeners(this.eViewport, { scroll: fn }); } } exports.AbstractFakeScrollComp = AbstractFakeScrollComp; /***/ }), /***/ 2218: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.CenterWidthFeature = void 0; const beanStub_1 = __webpack_require__(8731); const gridOptionsUtils_1 = __webpack_require__(7274); class CenterWidthFeature extends beanStub_1.BeanStub { constructor(callback, addSpacer = false) { super(); this.callback = callback; this.addSpacer = addSpacer; } postConstruct() { const listener = this.setWidth.bind(this); this.addManagedPropertyListener('domLayout', listener); this.addManagedEventListeners({ columnContainerWidthChanged: listener, displayedColumnsChanged: listener, leftPinnedWidthChanged: listener, }); if (this.addSpacer) { this.addManagedEventListeners({ rightPinnedWidthChanged: listener, scrollVisibilityChanged: listener, scrollbarWidthChanged: listener, }); } this.setWidth(); } setWidth() { const printLayout = (0, gridOptionsUtils_1._isDomLayout)(this.gos, 'print'); const { visibleCols, scrollVisibleSvc } = this.beans; const centerWidth = visibleCols.bodyWidth; const leftWidth = visibleCols.getColsLeftWidth(); const rightWidth = visibleCols.getDisplayedColumnsRightWidth(); let totalWidth; if (printLayout) { totalWidth = centerWidth + leftWidth + rightWidth; } else { totalWidth = centerWidth; if (this.addSpacer) { const relevantWidth = this.gos.get('enableRtl') ? leftWidth : rightWidth; if (relevantWidth === 0 && scrollVisibleSvc.verticalScrollShowing) { totalWidth += scrollVisibleSvc.getScrollbarWidth(); } } } this.callback(totalWidth); } } exports.CenterWidthFeature = CenterWidthFeature; /***/ }), /***/ 335: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.FakeHScrollSelector = exports.FakeHScrollComp = void 0; const dom_1 = __webpack_require__(3507); const component_1 = __webpack_require__(8020); const abstractFakeScrollComp_1 = __webpack_require__(736); const centerWidthFeature_1 = __webpack_require__(2218); class FakeHScrollComp extends abstractFakeScrollComp_1.AbstractFakeScrollComp { wireBeans(beans) { this.visibleCols = beans.visibleCols; this.scrollVisibleSvc = beans.scrollVisibleSvc; } constructor() { super( /* html */ ``, 'horizontal'); this.eLeftSpacer = component_1.RefPlaceholder; this.eRightSpacer = component_1.RefPlaceholder; this.setScrollVisibleDebounce = 0; } postConstruct() { super.postConstruct(); // When doing printing, this changes whether cols are pinned or not const spacerWidthsListener = this.setFakeHScrollSpacerWidths.bind(this); this.addManagedEventListeners({ displayedColumnsChanged: spacerWidthsListener, displayedColumnsWidthChanged: spacerWidthsListener, pinnedRowDataChanged: this.refreshCompBottom.bind(this), }); this.addManagedPropertyListener('domLayout', spacerWidthsListener); this.beans.ctrlsSvc.register('fakeHScrollComp', this); this.createManagedBean(new centerWidthFeature_1.CenterWidthFeature((width) => (this.eContainer.style.width = `${width}px`))); this.addManagedPropertyListeners(['suppressHorizontalScroll'], this.onScrollVisibilityChanged.bind(this)); } destroy() { window.clearTimeout(this.setScrollVisibleDebounce); super.destroy(); } initialiseInvisibleScrollbar() { if (this.invisibleScrollbar !== undefined) { return; } this.enableRtl = this.gos.get('enableRtl'); super.initialiseInvisibleScrollbar(); if (this.invisibleScrollbar) { this.refreshCompBottom(); } } refreshCompBottom() { if (!this.invisibleScrollbar) { return; } const bottomPinnedHeight = this.beans.pinnedRowModel?.getPinnedBottomTotalHeight() ?? 0; this.getGui().style.bottom = `${bottomPinnedHeight}px`; } onScrollVisibilityChanged() { super.onScrollVisibilityChanged(); this.setFakeHScrollSpacerWidths(); } setFakeHScrollSpacerWidths() { const vScrollShowing = this.scrollVisibleSvc.verticalScrollShowing; // we pad the right based on a) if cols are pinned to the right and // b) if v scroll is showing on the right (normal position of scroll) let rightSpacing = this.visibleCols.getDisplayedColumnsRightWidth(); const scrollOnRight = !this.enableRtl && vScrollShowing; const scrollbarWidth = this.scrollVisibleSvc.getScrollbarWidth(); if (scrollOnRight) { rightSpacing += scrollbarWidth; } (0, dom_1._setFixedWidth)(this.eRightSpacer, rightSpacing); this.eRightSpacer.classList.toggle('ag-scroller-corner', rightSpacing <= scrollbarWidth); // we pad the left based on a) if cols are pinned to the left and // b) if v scroll is showing on the left (happens in LTR layout only) let leftSpacing = this.visibleCols.getColsLeftWidth(); const scrollOnLeft = this.enableRtl && vScrollShowing; if (scrollOnLeft) { leftSpacing += scrollbarWidth; } (0, dom_1._setFixedWidth)(this.eLeftSpacer, leftSpacing); this.eLeftSpacer.classList.toggle('ag-scroller-corner', leftSpacing <= scrollbarWidth); } setScrollVisible() { const hScrollShowing = this.scrollVisibleSvc.horizontalScrollShowing; const invisibleScrollbar = this.invisibleScrollbar; const isSuppressHorizontalScroll = this.gos.get('suppressHorizontalScroll'); const scrollbarWidth = hScrollShowing ? this.scrollVisibleSvc.getScrollbarWidth() || 0 : 0; const adjustedScrollbarWidth = scrollbarWidth === 0 && invisibleScrollbar ? 16 : scrollbarWidth; const scrollContainerSize = !isSuppressHorizontalScroll ? adjustedScrollbarWidth : 0; // Avoid scrollbars flickering on as we resize the grid. Before showing // a scrollbar, give a little time for the grid to resize, after which a // scrollbar may no longer be required const apply = () => { this.setScrollVisibleDebounce = 0; this.addOrRemoveCssClass('ag-scrollbar-invisible', invisibleScrollbar); (0, dom_1._setFixedHeight)(this.getGui(), scrollContainerSize); (0, dom_1._setFixedHeight)(this.eViewport, scrollContainerSize); (0, dom_1._setFixedHeight)(this.eContainer, scrollContainerSize); this.setDisplayed(hScrollShowing, { skipAriaHidden: true }); }; window.clearTimeout(this.setScrollVisibleDebounce); if (!hScrollShowing) { apply(); } else { this.setScrollVisibleDebounce = window.setTimeout(apply, 100); } } getScrollPosition() { return (0, dom_1._getScrollLeft)(this.eViewport, this.enableRtl); } setScrollPosition(value) { if (!(0, dom_1._isVisible)(this.eViewport)) { this.attemptSettingScrollPosition(value); } (0, dom_1._setScrollLeft)(this.eViewport, value, this.enableRtl); } } exports.FakeHScrollComp = FakeHScrollComp; exports.FakeHScrollSelector = { selector: 'AG-FAKE-HORIZONTAL-SCROLL', component: FakeHScrollComp, }; /***/ }), /***/ 6070: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.FakeVScrollSelector = exports.FakeVScrollComp = void 0; const dom_1 = __webpack_require__(3507); const abstractFakeScrollComp_1 = __webpack_require__(736); const setHeightFeature_1 = __webpack_require__(9622); class FakeVScrollComp extends abstractFakeScrollComp_1.AbstractFakeScrollComp { constructor() { super( /* html */ ``, 'vertical'); } postConstruct() { super.postConstruct(); this.createManagedBean(new setHeightFeature_1.SetHeightFeature(this.eContainer)); const { ctrlsSvc } = this.beans; ctrlsSvc.register('fakeVScrollComp', this); this.addManagedEventListeners({ rowContainerHeightChanged: this.onRowContainerHeightChanged.bind(this, ctrlsSvc), }); } setScrollVisible() { const { scrollVisibleSvc } = this.beans; const vScrollShowing = scrollVisibleSvc.verticalScrollShowing; const invisibleScrollbar = this.invisibleScrollbar; const scrollbarWidth = vScrollShowing ? scrollVisibleSvc.getScrollbarWidth() || 0 : 0; const adjustedScrollbarWidth = scrollbarWidth === 0 && invisibleScrollbar ? 16 : scrollbarWidth; this.addOrRemoveCssClass('ag-scrollbar-invisible', invisibleScrollbar); (0, dom_1._setFixedWidth)(this.getGui(), adjustedScrollbarWidth); (0, dom_1._setFixedWidth)(this.eViewport, adjustedScrollbarWidth); (0, dom_1._setFixedWidth)(this.eContainer, adjustedScrollbarWidth); this.setDisplayed(vScrollShowing, { skipAriaHidden: true }); } onRowContainerHeightChanged(ctrlsSvc) { const gridBodyCtrl = ctrlsSvc.getGridBodyCtrl(); const gridBodyViewportEl = gridBodyCtrl.eBodyViewport; const eViewportScrollTop = this.getScrollPosition(); const gridBodyViewportScrollTop = gridBodyViewportEl.scrollTop; if (eViewportScrollTop != gridBodyViewportScrollTop) { this.setScrollPosition(gridBodyViewportScrollTop, true); } } getScrollPosition() { return this.eViewport.scrollTop; } setScrollPosition(value, force) { if (!force && !(0, dom_1._isVisible)(this.eViewport)) { this.attemptSettingScrollPosition(value); } this.eViewport.scrollTop = value; } } exports.FakeVScrollComp = FakeVScrollComp; exports.FakeVScrollSelector = { selector: 'AG-FAKE-VERTICAL-SCROLL', component: FakeVScrollComp, }; /***/ }), /***/ 9625: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.GridBodySelector = exports.GridBodyComp = void 0; const gridOptionsUtils_1 = __webpack_require__(7274); const gridHeaderComp_1 = __webpack_require__(1172); const layoutFeature_1 = __webpack_require__(9360); const aria_1 = __webpack_require__(5230); const dom_1 = __webpack_require__(3507); const component_1 = __webpack_require__(8020); const fakeHScrollComp_1 = __webpack_require__(335); const fakeVScrollComp_1 = __webpack_require__(6070); const gridBodyCtrl_1 = __webpack_require__(520); const rowContainerComp_1 = __webpack_require__(4633); function makeRowContainers(paramsMap, names) { return names .map((name) => { const refName = `e${name[0].toUpperCase() + name.substring(1)}RowContainer`; paramsMap[refName] = { name }; return /* html */ ``; }) .join(''); } function getGridBodyTemplate(includeOverlay) { const paramsMap = {}; const template = /* html */ `
${includeOverlay ? /* html */ `` : ''}
`; return { paramsMap, template }; } class GridBodyComp extends component_1.Component { constructor() { super(...arguments); this.eGridRoot = component_1.RefPlaceholder; this.eBodyViewport = component_1.RefPlaceholder; this.eStickyTop = component_1.RefPlaceholder; this.eStickyBottom = component_1.RefPlaceholder; this.eTop = component_1.RefPlaceholder; this.eBottom = component_1.RefPlaceholder; this.eBody = component_1.RefPlaceholder; } postConstruct() { const { overlays, rangeSvc } = this.beans; const overlaySelector = overlays?.getOverlayWrapperSelector(); const { paramsMap, template } = getGridBodyTemplate(!!overlaySelector); this.setTemplate(template, [ ...(overlaySelector ? [overlaySelector] : []), fakeHScrollComp_1.FakeHScrollSelector, fakeVScrollComp_1.FakeVScrollSelector, gridHeaderComp_1.GridHeaderSelector, rowContainerComp_1.RowContainerSelector, ], paramsMap); const setHeight = (height, element) => { const heightString = `${height}px`; element.style.minHeight = heightString; element.style.height = heightString; }; const compProxy = { setRowAnimationCssOnBodyViewport: (cssClass, animate) => this.setRowAnimationCssOnBodyViewport(cssClass, animate), setColumnCount: (count) => (0, aria_1._setAriaColCount)(this.getGui(), count), setRowCount: (count) => (0, aria_1._setAriaRowCount)(this.getGui(), count), setTopHeight: (height) => setHeight(height, this.eTop), setBottomHeight: (height) => setHeight(height, this.eBottom), setTopDisplay: (display) => (this.eTop.style.display = display), setBottomDisplay: (display) => (this.eBottom.style.display = display), setStickyTopHeight: (height) => (this.eStickyTop.style.height = height), setStickyTopTop: (top) => (this.eStickyTop.style.top = top), setStickyTopWidth: (width) => (this.eStickyTop.style.width = width), setStickyBottomHeight: (height) => { this.eStickyBottom.style.height = height; this.eStickyBottom.classList.toggle('ag-invisible', height === '0px'); }, setStickyBottomBottom: (bottom) => (this.eStickyBottom.style.bottom = bottom), setStickyBottomWidth: (width) => (this.eStickyBottom.style.width = width), setColumnMovingCss: (cssClass, flag) => this.addOrRemoveCssClass(cssClass, flag), updateLayoutClasses: (cssClass, params) => { const classLists = [this.eBodyViewport.classList, this.eBody.classList]; classLists.forEach((classList) => { classList.toggle(layoutFeature_1.LayoutCssClasses.AUTO_HEIGHT, params.autoHeight); classList.toggle(layoutFeature_1.LayoutCssClasses.NORMAL, params.normal); classList.toggle(layoutFeature_1.LayoutCssClasses.PRINT, params.print); }); this.addOrRemoveCssClass(layoutFeature_1.LayoutCssClasses.AUTO_HEIGHT, params.autoHeight); this.addOrRemoveCssClass(layoutFeature_1.LayoutCssClasses.NORMAL, params.normal); this.addOrRemoveCssClass(layoutFeature_1.LayoutCssClasses.PRINT, params.print); }, setAlwaysVerticalScrollClass: (cssClass, on) => this.eBodyViewport.classList.toggle(gridBodyCtrl_1.CSS_CLASS_FORCE_VERTICAL_SCROLL, on), registerBodyViewportResizeListener: (listener) => { const unsubscribeFromResize = (0, dom_1._observeResize)(this.beans, this.eBodyViewport, listener); this.addDestroyFunc(() => unsubscribeFromResize()); }, setPinnedTopBottomOverflowY: (overflow) => (this.eTop.style.overflowY = this.eBottom.style.overflowY = overflow), setCellSelectableCss: (cssClass, selectable) => { [this.eTop, this.eBodyViewport, this.eBottom].forEach((ct) => ct.classList.toggle(cssClass, selectable)); }, setBodyViewportWidth: (width) => (this.eBodyViewport.style.width = width), setGridRootRole: (role) => (0, aria_1._setAriaRole)(this.eGridRoot, role), }; this.ctrl = this.createManagedBean(new gridBodyCtrl_1.GridBodyCtrl()); this.ctrl.setComp(compProxy, this.getGui(), this.eBodyViewport, this.eTop, this.eBottom, this.eStickyTop, this.eStickyBottom); if ((rangeSvc && (0, gridOptionsUtils_1._isCellSelectionEnabled)(this.gos)) || (0, gridOptionsUtils_1._isMultiRowSelection)(this.gos)) { (0, aria_1._setAriaMultiSelectable)(this.getGui(), true); } } setRowAnimationCssOnBodyViewport(cssClass, animateRows) { const bodyViewportClassList = this.eBodyViewport.classList; bodyViewportClassList.toggle('ag-row-animation', animateRows); bodyViewportClassList.toggle('ag-row-no-animation', !animateRows); } } exports.GridBodyComp = GridBodyComp; exports.GridBodySelector = { selector: 'AG-GRID-BODY', component: GridBodyComp, }; /***/ }), /***/ 520: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.GridBodyCtrl = exports.CSS_CLASS_FORCE_VERTICAL_SCROLL = void 0; const beanStub_1 = __webpack_require__(8731); const gridOptionsUtils_1 = __webpack_require__(7274); const animationFrameService_1 = __webpack_require__(2612); const layoutFeature_1 = __webpack_require__(9360); const browser_1 = __webpack_require__(8667); const dom_1 = __webpack_require__(3507); const gridBodyScrollFeature_1 = __webpack_require__(5496); const mouseEventUtils_1 = __webpack_require__(8399); const rowContainerCtrl_1 = __webpack_require__(8115); exports.CSS_CLASS_FORCE_VERTICAL_SCROLL = 'ag-force-vertical-scroll'; const CSS_CLASS_CELL_SELECTABLE = 'ag-selectable'; const CSS_CLASS_COLUMN_MOVING = 'ag-column-moving'; class GridBodyCtrl extends beanStub_1.BeanStub { constructor() { super(...arguments); this.stickyTopHeight = 0; this.stickyBottomHeight = 0; } wireBeans(beans) { this.ctrlsSvc = beans.ctrlsSvc; this.colModel = beans.colModel; this.scrollVisibleSvc = beans.scrollVisibleSvc; this.pinnedRowModel = beans.pinnedRowModel; this.filterManager = beans.filterManager; this.rowGroupColsSvc = beans.rowGroupColsSvc; } setComp(comp, eGridBody, eBodyViewport, eTop, eBottom, eStickyTop, eStickyBottom) { this.comp = comp; this.eGridBody = eGridBody; this.eBodyViewport = eBodyViewport; this.eTop = eTop; this.eBottom = eBottom; this.eStickyTop = eStickyTop; this.eStickyBottom = eStickyBottom; this.eCenterColsViewport = eBodyViewport.querySelector(`.${(0, rowContainerCtrl_1._getRowViewportClass)('center')}`); this.eFullWidthContainer = eBodyViewport.querySelector(`.${(0, rowContainerCtrl_1._getRowContainerClass)('fullWidth')}`); this.eStickyTopFullWidthContainer = eStickyTop.querySelector(`.${(0, rowContainerCtrl_1._getRowContainerClass)('stickyTopFullWidth')}`); this.eStickyBottomFullWidthContainer = eStickyBottom.querySelector(`.${(0, rowContainerCtrl_1._getRowContainerClass)('stickyBottomFullWidth')}`); this.setCellTextSelection(this.gos.get('enableCellTextSelection')); this.addManagedPropertyListener('enableCellTextSelection', (props) => this.setCellTextSelection(props.currentValue)); this.createManagedBean(new layoutFeature_1.LayoutFeature(this.comp)); this.scrollFeature = this.createManagedBean(new gridBodyScrollFeature_1.GridBodyScrollFeature(this.eBodyViewport)); this.beans.rowDragSvc?.setupRowDrag(this.eBodyViewport, this); this.setupRowAnimationCssClass(); this.addEventListeners(); this.addFocusListeners([eTop, eBodyViewport, eBottom, eStickyTop, eStickyBottom]); this.setGridRootRole(); this.onGridColumnsChanged(); this.addBodyViewportListener(); this.setFloatingHeights(); this.disableBrowserDragging(); this.addStopEditingWhenGridLosesFocus(); this.updateScrollingClasses(); this.filterManager?.setupAdvFilterHeaderComp(eTop); this.ctrlsSvc.register('gridBodyCtrl', this); } addEventListeners() { const setFloatingHeights = this.setFloatingHeights.bind(this); const setGridRootRole = this.setGridRootRole.bind(this); this.addManagedEventListeners({ gridColumnsChanged: this.onGridColumnsChanged.bind(this), scrollVisibilityChanged: this.onScrollVisibilityChanged.bind(this), scrollGapChanged: this.updateScrollingClasses.bind(this), pinnedRowDataChanged: setFloatingHeights, pinnedHeightChanged: setFloatingHeights, headerHeightChanged: this.setStickyTopOffsetTop.bind(this), columnRowGroupChanged: setGridRootRole, columnPivotChanged: setGridRootRole, }); this.addManagedPropertyListener('treeData', setGridRootRole); } onGridColumnsChanged() { const columns = this.beans.colModel.getCols(); this.comp.setColumnCount(columns.length); } onScrollVisibilityChanged() { const { scrollVisibleSvc } = this; const visible = scrollVisibleSvc.verticalScrollShowing; this.setVerticalScrollPaddingVisible(visible); this.setStickyWidth(visible); this.setStickyBottomOffsetBottom(); const scrollbarWidth = visible ? scrollVisibleSvc.getScrollbarWidth() || 0 : 0; const pad = (0, browser_1._isInvisibleScrollbar)() ? 16 : 0; const width = `calc(100% + ${scrollbarWidth + pad}px)`; (0, animationFrameService_1._requestAnimationFrame)(this.beans, () => this.comp.setBodyViewportWidth(width)); this.updateScrollingClasses(); } setGridRootRole() { const { rowGroupColsSvc, colModel } = this; let isTreeGrid = this.gos.get('treeData'); if (!isTreeGrid) { const isPivotActive = colModel.isPivotMode(); const rowGroupColumnLen = !rowGroupColsSvc ? 0 : rowGroupColsSvc.columns.length; const columnsNeededForGrouping = isPivotActive ? 2 : 1; isTreeGrid = rowGroupColumnLen >= columnsNeededForGrouping; } this.comp.setGridRootRole(isTreeGrid ? 'treegrid' : 'grid'); } addFocusListeners(elements) { elements.forEach((element) => { this.addManagedElementListeners(element, { focusin: (e) => { const { target } = e; // element being focused is nested? const isFocusedElementNested = (0, dom_1._isElementChildOfClass)(target, 'ag-root', element); element.classList.toggle('ag-has-focus', !isFocusedElementNested); }, focusout: (e) => { const { target, relatedTarget } = e; const gridContainRelatedTarget = element.contains(relatedTarget); const isNestedRelatedTarget = (0, dom_1._isElementChildOfClass)(relatedTarget, 'ag-root', element); const isNestedTarget = (0, dom_1._isElementChildOfClass)(target, 'ag-root', element); // element losing focus belongs to a nested grid, // it should not be handled here. if (isNestedTarget) { return; } // the grid does not contain, or the focus element is within // a nested grid if (!gridContainRelatedTarget || isNestedRelatedTarget) { element.classList.remove('ag-has-focus'); } }, }); }); } // used by ColumnAnimationService setColumnMovingCss(moving) { this.comp.setColumnMovingCss(CSS_CLASS_COLUMN_MOVING, moving); } setCellTextSelection(selectable = false) { this.comp.setCellSelectableCss(CSS_CLASS_CELL_SELECTABLE, selectable); } updateScrollingClasses() { const { eGridBody: { classList }, scrollVisibleSvc, } = this; classList.toggle('ag-body-vertical-content-no-gap', !scrollVisibleSvc.verticalScrollGap); classList.toggle('ag-body-horizontal-content-no-gap', !scrollVisibleSvc.horizontalScrollGap); } // if we do not do this, then the user can select a pic in the grid (eg an image in a custom cell renderer) // and then that will start the browser native drag n' drop, which messes up with our own drag and drop. disableBrowserDragging() { this.addManagedElementListeners(this.eGridBody, { dragstart: (event) => { if (event.target instanceof HTMLImageElement) { event.preventDefault(); return false; } }, }); } addStopEditingWhenGridLosesFocus() { this.beans.editSvc?.addStopEditingWhenGridLosesFocus([ this.eBodyViewport, this.eBottom, this.eTop, this.eStickyTop, this.eStickyBottom, ]); } updateRowCount() { const headerCount = (this.ctrlsSvc.getHeaderRowContainerCtrl()?.getRowCount() ?? 0) + (this.filterManager?.getHeaderRowCount() ?? 0); const { rowModel } = this.beans; const rowCount = rowModel.isLastRowIndexKnown() ? rowModel.getRowCount() : -1; const total = rowCount === -1 ? -1 : headerCount + rowCount; this.comp.setRowCount(total); } registerBodyViewportResizeListener(listener) { this.comp.registerBodyViewportResizeListener(listener); } setVerticalScrollPaddingVisible(visible) { const overflowY = visible ? 'scroll' : 'hidden'; this.comp.setPinnedTopBottomOverflowY(overflowY); } isVerticalScrollShowing() { const show = this.gos.get('alwaysShowVerticalScroll'); const cssClass = show ? exports.CSS_CLASS_FORCE_VERTICAL_SCROLL : null; const allowVerticalScroll = (0, gridOptionsUtils_1._isDomLayout)(this.gos, 'normal'); this.comp.setAlwaysVerticalScrollClass(cssClass, show); return show || (allowVerticalScroll && (0, dom_1._isVerticalScrollShowing)(this.eBodyViewport)); } setupRowAnimationCssClass() { const { rowContainerHeight, environment } = this.beans; let initialSizeMeasurementComplete = environment.sizesMeasured; const updateAnimationClass = () => { // we don't want to use row animation if scaling, as rows jump strangely as you scroll, // when scaling and doing row animation. const animateRows = initialSizeMeasurementComplete && (0, gridOptionsUtils_1._isAnimateRows)(this.gos) && !rowContainerHeight.stretching; const animateRowsCssClass = animateRows ? 'ag-row-animation' : 'ag-row-no-animation'; this.comp.setRowAnimationCssOnBodyViewport(animateRowsCssClass, animateRows); }; updateAnimationClass(); this.addManagedEventListeners({ heightScaleChanged: updateAnimationClass }); this.addManagedPropertyListener('animateRows', updateAnimationClass); this.addManagedEventListeners({ gridStylesChanged: () => { if (!initialSizeMeasurementComplete && environment.sizesMeasured) { initialSizeMeasurementComplete = true; updateAnimationClass(); } }, }); } addBodyViewportListener() { const { popupSvc, touchSvc } = this.beans; // we want to listen for clicks directly on the eBodyViewport, so the user has a way of showing // the context menu if no rows or columns are displayed, or user simply clicks outside of a cell const listener = this.onBodyViewportContextMenu.bind(this); this.addManagedElementListeners(this.eBodyViewport, { contextmenu: listener }); touchSvc?.mockBodyContextMenu(this, listener); this.addManagedElementListeners(this.eBodyViewport, { wheel: this.onBodyViewportWheel.bind(this, popupSvc), }); this.addManagedElementListeners(this.eStickyTop, { wheel: this.onStickyWheel.bind(this) }); this.addManagedElementListeners(this.eStickyBottom, { wheel: this.onStickyWheel.bind(this) }); // allow mouseWheel on the Full Width Container to Scroll the Viewport this.addFullWidthContainerWheelListener(); } addFullWidthContainerWheelListener() { this.addManagedElementListeners(this.eFullWidthContainer, { wheel: (e) => this.onFullWidthContainerWheel(e), }); } onFullWidthContainerWheel(e) { const { deltaX, deltaY, shiftKey } = e; const isHorizontalScroll = shiftKey || Math.abs(deltaX) > Math.abs(deltaY); if (isHorizontalScroll && (0, mouseEventUtils_1._isEventFromThisGrid)(this.gos, e)) { this.scrollGridBodyToMatchEvent(e); } } onStickyWheel(e) { const { deltaX, deltaY, shiftKey } = e; const isHorizontalScroll = shiftKey || Math.abs(deltaX) > Math.abs(deltaY); // we test for shift key because some devices will // only change deltaY even when scrolling horizontally const target = e.target; if (!isHorizontalScroll) { e.preventDefault(); this.scrollVertically(deltaY); } else if (this.eStickyTopFullWidthContainer.contains(target) || this.eStickyBottomFullWidthContainer.contains(target)) { this.scrollGridBodyToMatchEvent(e); } } scrollGridBodyToMatchEvent(e) { const { deltaX, deltaY } = e; e.preventDefault(); // if it is a horizontal scroll and deltaX is zero, // it means the OS has flipped the axis and it's using deltaY this.eCenterColsViewport.scrollBy({ left: deltaX || deltaY }); } onBodyViewportContextMenu(mouseEvent, touch, touchEvent) { if (!mouseEvent && !touchEvent) { return; } if (this.gos.get('preventDefaultOnContextMenu')) { const event = (mouseEvent || touchEvent); event.preventDefault(); } const { target } = (mouseEvent || touch); if (target === this.eBodyViewport || target === this.ctrlsSvc.get('center').eViewport) { // show it this.beans.contextMenuSvc?.showContextMenu({ mouseEvent, touchEvent: touchEvent, value: null, anchorToElement: this.eGridBody, source: 'ui', }); } } onBodyViewportWheel(popupSvc, e) { if (!this.gos.get('suppressScrollWhenPopupsAreOpen')) { return; } if (popupSvc?.hasAnchoredPopup()) { e.preventDefault(); } } // called by rowDragFeature scrollVertically(pixels) { const oldScrollPosition = this.eBodyViewport.scrollTop; this.scrollFeature.setVerticalScrollPosition(oldScrollPosition + pixels); return this.eBodyViewport.scrollTop - oldScrollPosition; } setFloatingHeights() { const { pinnedRowModel } = this; const floatingTopHeight = pinnedRowModel?.getPinnedTopTotalHeight() ?? 0; const floatingBottomHeight = pinnedRowModel?.getPinnedBottomTotalHeight() ?? 0; this.comp.setTopHeight(floatingTopHeight); this.comp.setBottomHeight(floatingBottomHeight); this.comp.setTopDisplay(floatingTopHeight ? 'inherit' : 'none'); this.comp.setBottomDisplay(floatingBottomHeight ? 'inherit' : 'none'); this.setStickyTopOffsetTop(); this.setStickyBottomOffsetBottom(); } setStickyTopHeight(height = 0) { // console.log('setting sticky top height ' + height); this.comp.setStickyTopHeight(`${height}px`); this.stickyTopHeight = height; } setStickyBottomHeight(height = 0) { this.comp.setStickyBottomHeight(`${height}px`); this.stickyBottomHeight = height; } setStickyWidth(vScrollVisible) { if (!vScrollVisible) { this.comp.setStickyTopWidth('100%'); this.comp.setStickyBottomWidth('100%'); } else { const scrollbarWidth = this.scrollVisibleSvc.getScrollbarWidth(); this.comp.setStickyTopWidth(`calc(100% - ${scrollbarWidth}px)`); this.comp.setStickyBottomWidth(`calc(100% - ${scrollbarWidth}px)`); } } setStickyTopOffsetTop() { const headerCtrl = this.ctrlsSvc.get('gridHeaderCtrl'); const headerHeight = headerCtrl.headerHeight + (this.filterManager?.getHeaderHeight() ?? 0); const pinnedTopHeight = this.pinnedRowModel?.getPinnedTopTotalHeight() ?? 0; let height = 0; if (headerHeight > 0) { height += headerHeight; } if (pinnedTopHeight > 0) { height += pinnedTopHeight; } if (height > 0) { height += 1; } this.comp.setStickyTopTop(`${height}px`); } setStickyBottomOffsetBottom() { const { pinnedRowModel, scrollVisibleSvc, comp } = this; const pinnedBottomHeight = pinnedRowModel?.getPinnedBottomTotalHeight() ?? 0; const hScrollShowing = scrollVisibleSvc.horizontalScrollShowing; const scrollbarWidth = hScrollShowing ? scrollVisibleSvc.getScrollbarWidth() || 0 : 0; const height = pinnedBottomHeight + scrollbarWidth; comp.setStickyBottomBottom(`${height}px`); } } exports.GridBodyCtrl = GridBodyCtrl; /***/ }), /***/ 5496: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.GridBodyScrollFeature = void 0; const beanStub_1 = __webpack_require__(8731); const gridOptionsUtils_1 = __webpack_require__(7274); const browser_1 = __webpack_require__(8667); const dom_1 = __webpack_require__(3507); const function_1 = __webpack_require__(2043); const logging_1 = __webpack_require__(7764); var ScrollDir; (function (ScrollDir) { ScrollDir[ScrollDir["Vertical"] = 0] = "Vertical"; ScrollDir[ScrollDir["Horizontal"] = 1] = "Horizontal"; })(ScrollDir || (ScrollDir = {})); const VIEWPORT = 'Viewport'; const FAKE_V_SCROLLBAR = 'fakeVScrollComp'; const HORIZONTAL_SOURCES = [ 'fakeHScrollComp', 'centerHeader', 'topCenter', 'bottomCenter', 'stickyTopCenter', 'stickyBottomCenter', ]; // timeout used for the debounceVerticalScrollbar property const SCROLL_DEBOUNCE_TIMEOUT = 100; // timeout used to fire onBodyScrollEnd and to reset last scroll source const SCROLL_END_TIMEOUT = 150; class GridBodyScrollFeature extends beanStub_1.BeanStub { wireBeans(beans) { this.ctrlsSvc = beans.ctrlsSvc; this.animationFrameSvc = beans.animationFrameSvc; this.visibleCols = beans.visibleCols; } constructor(eBodyViewport) { super(); this.lastScrollSource = [null, null]; this.scrollLeft = -1; this.nextScrollTop = -1; this.scrollTop = -1; // Used to provide approximate values of scrollTop and offsetHeight // without forcing the browser to recalculate styles. this.lastOffsetHeight = -1; this.lastScrollTop = -1; this.scrollTimer = 0; this.needsRefreshedScrollPosition = true; this.eBodyViewport = eBodyViewport; this.resetLastHScrollDebounced = (0, function_1._debounce)(this, () => (this.lastScrollSource[ScrollDir.Horizontal] = null), SCROLL_END_TIMEOUT); this.resetLastVScrollDebounced = (0, function_1._debounce)(this, () => (this.lastScrollSource[ScrollDir.Vertical] = null), SCROLL_END_TIMEOUT); } destroy() { super.destroy(); window.clearTimeout(this.scrollTimer); } postConstruct() { this.enableRtl = this.gos.get('enableRtl'); const requireUpdatedScrollPosition = this.requireUpdatedScrollPosition.bind(this); this.addManagedEventListeners({ displayedColumnsWidthChanged: this.onDisplayedColumnsWidthChanged.bind(this), gridSizeChanged: requireUpdatedScrollPosition, }); this.addManagedElementListeners(this.eBodyViewport, { scroll: requireUpdatedScrollPosition, }); this.ctrlsSvc.whenReady(this, (p) => { this.centerRowsCtrl = p.center; this.onDisplayedColumnsWidthChanged(); this.addScrollListener(); }); } requireUpdatedScrollPosition() { this.needsRefreshedScrollPosition = true; } addScrollListener() { this.addHorizontalScrollListeners(); this.addVerticalScrollListeners(); } addHorizontalScrollListeners() { this.addManagedElementListeners(this.centerRowsCtrl.eViewport, { scroll: this.onHScroll.bind(this, VIEWPORT), }); for (const source of HORIZONTAL_SOURCES) { const scrollPartner = this.ctrlsSvc.get(source); this.registerScrollPartner(scrollPartner, this.onHScroll.bind(this, source)); } } addVerticalScrollListeners() { const fakeVScrollComp = this.ctrlsSvc.get('fakeVScrollComp'); const isDebounce = this.gos.get('debounceVerticalScrollbar'); const onVScroll = isDebounce ? (0, function_1._debounce)(this, this.onVScroll.bind(this, VIEWPORT), SCROLL_DEBOUNCE_TIMEOUT) : this.onVScroll.bind(this, VIEWPORT); const onFakeVScroll = isDebounce ? (0, function_1._debounce)(this, this.onVScroll.bind(this, FAKE_V_SCROLLBAR), SCROLL_DEBOUNCE_TIMEOUT) : this.onVScroll.bind(this, FAKE_V_SCROLLBAR); this.addManagedElementListeners(this.eBodyViewport, { scroll: onVScroll }); this.registerScrollPartner(fakeVScrollComp, onFakeVScroll); } registerScrollPartner(comp, callback) { comp.onScrollCallback(callback); } onDisplayedColumnsWidthChanged() { if (this.enableRtl) { // because RTL is all backwards, a change in the width of the row // can cause a change in the scroll position, without a scroll event, // because the scroll position in RTL is a function that depends on // the width. to be convinced of this, take out this line, enable RTL, // scroll all the way to the left and then resize a column this.horizontallyScrollHeaderCenterAndFloatingCenter(); } } horizontallyScrollHeaderCenterAndFloatingCenter(scrollLeft) { // when doing RTL, this method gets called once prematurely const notYetInitialised = this.centerRowsCtrl == null; if (notYetInitialised) { return; } if (scrollLeft === undefined) { scrollLeft = this.centerRowsCtrl.getCenterViewportScrollLeft(); } this.setScrollLeftForAllContainersExceptCurrent(Math.abs(scrollLeft)); } setScrollLeftForAllContainersExceptCurrent(scrollLeft) { for (const container of [...HORIZONTAL_SOURCES, VIEWPORT]) { if (this.lastScrollSource[ScrollDir.Horizontal] === container) { continue; } const viewport = this.getViewportForSource(container); (0, dom_1._setScrollLeft)(viewport, scrollLeft, this.enableRtl); } } getViewportForSource(source) { if (source === VIEWPORT) { return this.centerRowsCtrl.eViewport; } return this.ctrlsSvc.get(source).eViewport; } isControllingScroll(source, direction) { if (this.lastScrollSource[direction] == null) { if (direction === ScrollDir.Vertical) { this.lastScrollSource[0] = source; } else { this.lastScrollSource[1] = source; } return true; } return this.lastScrollSource[direction] === source; } onHScroll(source) { if (!this.isControllingScroll(source, ScrollDir.Horizontal)) { return; } const centerContainerViewport = this.centerRowsCtrl.eViewport; const { scrollLeft } = centerContainerViewport; if (this.shouldBlockScrollUpdate(ScrollDir.Horizontal, scrollLeft, true)) { return; } const newScrollLeft = (0, dom_1._getScrollLeft)(this.getViewportForSource(source), this.enableRtl); this.doHorizontalScroll(newScrollLeft); this.resetLastHScrollDebounced(); } onVScroll(source) { if (!this.isControllingScroll(source, ScrollDir.Vertical)) { return; } let scrollTop; if (source === VIEWPORT) { scrollTop = this.eBodyViewport.scrollTop; } else { scrollTop = this.ctrlsSvc.get('fakeVScrollComp').getScrollPosition(); } if (this.shouldBlockScrollUpdate(ScrollDir.Vertical, scrollTop, true)) { return; } const { animationFrameSvc } = this; animationFrameSvc?.setScrollTop(scrollTop); this.nextScrollTop = scrollTop; if (source === VIEWPORT) { this.ctrlsSvc.get('fakeVScrollComp').setScrollPosition(scrollTop); } else { this.eBodyViewport.scrollTop = scrollTop; } // the `scrollGridIfNeeded` will recalculate the rows to be rendered by the grid // so it should only be called after `eBodyViewport` has been scrolled to the correct // position, otherwise the `first` and `last` row could be miscalculated. if (!animationFrameSvc || this.gos.get('suppressAnimationFrame')) { this.scrollGridIfNeeded(true); } else { animationFrameSvc.schedule(); } this.resetLastVScrollDebounced(); } doHorizontalScroll(scrollLeft) { const fakeScrollLeft = this.ctrlsSvc.get('fakeHScrollComp').getScrollPosition(); if (this.scrollLeft === scrollLeft && scrollLeft === fakeScrollLeft) { return; } this.scrollLeft = scrollLeft; this.fireScrollEvent(ScrollDir.Horizontal); this.horizontallyScrollHeaderCenterAndFloatingCenter(scrollLeft); this.centerRowsCtrl.onHorizontalViewportChanged(true); } fireScrollEvent(direction) { const bodyScrollEvent = { type: 'bodyScroll', direction: direction === ScrollDir.Horizontal ? 'horizontal' : 'vertical', left: this.scrollLeft, top: this.scrollTop, }; this.eventSvc.dispatchEvent(bodyScrollEvent); window.clearTimeout(this.scrollTimer); this.scrollTimer = window.setTimeout(() => { this.scrollTimer = 0; this.eventSvc.dispatchEvent({ ...bodyScrollEvent, type: 'bodyScrollEnd', }); }, SCROLL_END_TIMEOUT); } shouldBlockScrollUpdate(direction, scrollTo, touchOnly = false) { // touch devices allow elastic scroll - which temporally scrolls the panel outside of the viewport // (eg user uses touch to go to the left of the grid, but drags past the left, the rows will actually // scroll past the left until the user releases the mouse). when this happens, we want ignore the scroll, // as otherwise it was causing the rows and header to flicker. // sometimes when scrolling, we got values that extended the maximum scroll allowed. we used to // ignore these scrolls. problem is the max scroll position could be skipped (eg the previous scroll event // could be 10px before the max position, and then current scroll event could be 20px after the max position). // if we just ignored the last event, we would be setting the scroll to 10px before the max position, when in // actual fact the user has exceeded the max scroll and thus scroll should be set to the max. if (touchOnly && !(0, browser_1._isIOSUserAgent)()) { return false; } if (direction === ScrollDir.Vertical) { return this.shouldBlockVerticalScroll(scrollTo); } return this.shouldBlockHorizontalScroll(scrollTo); } shouldBlockVerticalScroll(scrollTo) { const clientHeight = (0, dom_1._getInnerHeight)(this.eBodyViewport); const { scrollHeight } = this.eBodyViewport; if (scrollTo < 0 || scrollTo + clientHeight > scrollHeight) { return true; } return false; } shouldBlockHorizontalScroll(scrollTo) { const clientWidth = this.centerRowsCtrl.getCenterWidth(); const { scrollWidth } = this.centerRowsCtrl.eViewport; if (this.enableRtl && (0, dom_1._isRtlNegativeScroll)()) { if (scrollTo > 0) { return true; } } else if (scrollTo < 0) { return true; } if (Math.abs(scrollTo) + clientWidth > scrollWidth) { return true; } return false; } redrawRowsAfterScroll() { this.fireScrollEvent(ScrollDir.Vertical); } // this is to cater for AG-3274, where grid is removed from the dom and then inserted back in again. // (which happens with some implementations of tabbing). this can result in horizontal scroll getting // reset back to the left, however no scroll event is fired. so we need to get header to also scroll // back to the left to be kept in sync. // adding and removing the grid from the DOM both resets the scroll position and // triggers a resize event, so notify listeners if the scroll position has changed checkScrollLeft() { if (this.scrollLeft !== this.centerRowsCtrl.getCenterViewportScrollLeft()) { this.onHScroll(VIEWPORT); } } scrollGridIfNeeded(suppressedAnimationFrame = false) { const frameNeeded = this.scrollTop != this.nextScrollTop; if (frameNeeded) { this.scrollTop = this.nextScrollTop; if (suppressedAnimationFrame) { this.requireUpdatedScrollPosition(); } this.redrawRowsAfterScroll(); } return frameNeeded; } // called by scrollHorizontally method and alignedGridsService setHorizontalScrollPosition(hScrollPosition, fromAlignedGridsService = false) { const minScrollLeft = 0; const maxScrollLeft = this.centerRowsCtrl.eViewport.scrollWidth - this.centerRowsCtrl.getCenterWidth(); // if this is call is coming from the alignedGridsSvc, we don't need to validate the // scroll, because it has already been validated by the grid firing the scroll event. if (!fromAlignedGridsService && this.shouldBlockScrollUpdate(ScrollDir.Horizontal, hScrollPosition)) { if (this.enableRtl && (0, dom_1._isRtlNegativeScroll)()) { hScrollPosition = hScrollPosition > 0 ? 0 : maxScrollLeft; } else { hScrollPosition = Math.min(Math.max(hScrollPosition, minScrollLeft), maxScrollLeft); } } (0, dom_1._setScrollLeft)(this.centerRowsCtrl.eViewport, Math.abs(hScrollPosition), this.enableRtl); // we need to manually do the event handling (rather than wait for the event) // for the alignedGridsSvc, as if we don't, the aligned grid service gets // notified async, and then it's 'consuming' flag doesn't get used right, and // we can end up with an infinite loop this.doHorizontalScroll(hScrollPosition); } setVerticalScrollPosition(vScrollPosition) { this.requireUpdatedScrollPosition(); this.eBodyViewport.scrollTop = vScrollPosition; } getVScrollPosition() { if (!this.needsRefreshedScrollPosition) { const { lastOffsetHeight, lastScrollTop } = this; return { top: lastScrollTop, bottom: lastScrollTop + lastOffsetHeight, }; } this.needsRefreshedScrollPosition = false; const { scrollTop, offsetHeight } = this.eBodyViewport; this.lastScrollTop = scrollTop; this.lastOffsetHeight = offsetHeight; return { top: scrollTop, bottom: scrollTop + offsetHeight, }; } /** Get an approximate scroll position that returns the last real value read. * This is useful for avoiding repeated DOM reads that force the browser to recalculate styles. * This can have big performance improvements but may not be 100% accurate so only use if this is acceptable. */ getApproximateVScollPosition() { if (this.lastScrollTop >= 0 && this.lastOffsetHeight >= 0) { return { top: this.scrollTop, bottom: this.scrollTop + this.lastOffsetHeight, }; } return this.getVScrollPosition(); } getHScrollPosition() { return this.centerRowsCtrl.getHScrollPosition(); } isHorizontalScrollShowing() { return this.centerRowsCtrl.isHorizontalScrollShowing(); } // called by the headerRootComp and moveColumnController scrollHorizontally(pixels) { const oldScrollPosition = this.centerRowsCtrl.eViewport.scrollLeft; this.setHorizontalScrollPosition(oldScrollPosition + pixels); return this.centerRowsCtrl.eViewport.scrollLeft - oldScrollPosition; } // gets called by rowRenderer when new data loaded, as it will want to scroll to the top scrollToTop() { this.eBodyViewport.scrollTop = 0; } // Valid values for position are bottom, middle and top ensureNodeVisible(comparator, position = null) { const { rowModel } = this.beans; // look for the node index we want to display const rowCount = rowModel.getRowCount(); let indexToSelect = -1; // go through all the nodes, find the one we want to show for (let i = 0; i < rowCount; i++) { const node = rowModel.getRow(i); if (typeof comparator === 'function') { // Have to assert type here, as type could be TData & Function const predicate = comparator; if (node && predicate(node)) { indexToSelect = i; break; } } else { // check object equality against node and data if (comparator === node || comparator === node.data) { indexToSelect = i; break; } } } if (indexToSelect >= 0) { this.ensureIndexVisible(indexToSelect, position); } } // Valid values for position are bottom, middle and top // position should be {'top','middle','bottom', or undefined/null}. // if undefined/null, then the grid will to the minimal amount of scrolling, // eg if grid needs to scroll up, it scrolls until row is on top, // if grid needs to scroll down, it scrolls until row is on bottom, // if row is already in view, grid does not scroll ensureIndexVisible(index, position) { // if for print or auto height, everything is always visible if ((0, gridOptionsUtils_1._isDomLayout)(this.gos, 'print')) { return; } const { rowModel } = this.beans; const rowCount = rowModel.getRowCount(); if (typeof index !== 'number' || index < 0 || index >= rowCount) { (0, logging_1._warn)(88, { index }); return; } const isPaging = this.gos.get('pagination'); const paginationPanelEnabled = isPaging && !this.gos.get('suppressPaginationPanel'); const { frameworkOverrides, pagination, pageBounds, rowContainerHeight: heightScaler, rowRenderer, } = this.beans; frameworkOverrides.wrapIncoming(() => { if (!paginationPanelEnabled) { pagination?.goToPageWithIndex(index); } const gridBodyCtrl = this.ctrlsSvc.getGridBodyCtrl(); const stickyTopHeight = gridBodyCtrl.stickyTopHeight; const stickyBottomHeight = gridBodyCtrl.stickyBottomHeight; const rowNode = rowModel.getRow(index); let rowGotShiftedDuringOperation; do { const startingRowTop = rowNode.rowTop; const startingRowHeight = rowNode.rowHeight; const paginationOffset = pageBounds.getPixelOffset(); const rowTopPixel = rowNode.rowTop - paginationOffset; const rowBottomPixel = rowTopPixel + rowNode.rowHeight; const scrollPosition = this.getVScrollPosition(); const heightOffset = heightScaler.divStretchOffset; const vScrollTop = scrollPosition.top + heightOffset; const vScrollBottom = scrollPosition.bottom + heightOffset; const viewportHeight = vScrollBottom - vScrollTop; // work out the pixels for top, middle and bottom up front, // make the if/else below easier to read const pxTop = heightScaler.getScrollPositionForPixel(rowTopPixel); const pxBottom = heightScaler.getScrollPositionForPixel(rowBottomPixel - viewportHeight); // make sure if middle, the row is not outside the top of the grid const pxMiddle = Math.min((pxTop + pxBottom) / 2, rowTopPixel); const rowAboveViewport = vScrollTop + stickyTopHeight > rowTopPixel; const rowBelowViewport = vScrollBottom - stickyBottomHeight < rowBottomPixel; let newScrollPosition = null; if (position === 'top') { newScrollPosition = pxTop; } else if (position === 'bottom') { newScrollPosition = pxBottom; } else if (position === 'middle') { newScrollPosition = pxMiddle; } else if (rowAboveViewport) { // if row is before, scroll up with row at top newScrollPosition = pxTop - stickyTopHeight; } else if (rowBelowViewport) { // if row is after, scroll down with row at bottom newScrollPosition = pxBottom + stickyBottomHeight; } if (newScrollPosition !== null) { this.setVerticalScrollPosition(newScrollPosition); rowRenderer.redraw({ afterScroll: true }); } // the row can get shifted if during the rendering (during rowRenderer.redraw()), // the height of a row changes due to lazy calculation of row heights when using // colDef.autoHeight or gridOptions.getRowHeight. // if row was shifted, then the position we scrolled to is incorrect. rowGotShiftedDuringOperation = startingRowTop !== rowNode.rowTop || startingRowHeight !== rowNode.rowHeight; } while (rowGotShiftedDuringOperation); // so when we return back to user, the cells have rendered this.animationFrameSvc?.flushAllFrames(); }); } ensureColumnVisible(key, position = 'auto') { const { colModel, frameworkOverrides } = this.beans; const column = colModel.getCol(key); if (!column) { return; } // calling ensureColumnVisible on a pinned column doesn't make sense if (column.isPinned()) { return; } // defensive if (!this.visibleCols.isColDisplayed(column)) { return; } const newHorizontalScroll = this.getPositionedHorizontalScroll(column, position); frameworkOverrides.wrapIncoming(() => { if (newHorizontalScroll !== null) { this.centerRowsCtrl.setCenterViewportScrollLeft(newHorizontalScroll); } // this will happen anyway, as the move will cause a 'scroll' event on the body, however // it is possible that the ensureColumnVisible method is called from within AG Grid and // the caller will need to have the columns rendered to continue, which will be before // the event has been worked on (which is the case for cell navigation). this.centerRowsCtrl.onHorizontalViewportChanged(); // so when we return back to user, the cells have rendered this.animationFrameSvc?.flushAllFrames(); }); } getPositionedHorizontalScroll(column, position) { const { columnBeforeStart, columnAfterEnd } = this.isColumnOutsideViewport(column); const viewportTooSmallForColumn = this.centerRowsCtrl.getCenterWidth() < column.getActualWidth(); const viewportWidth = this.centerRowsCtrl.getCenterWidth(); const isRtl = this.enableRtl; let alignColToStart = (isRtl ? columnBeforeStart : columnAfterEnd) || viewportTooSmallForColumn; let alignColToEnd = isRtl ? columnAfterEnd : columnBeforeStart; if (position !== 'auto') { alignColToStart = position === 'start'; alignColToEnd = position === 'end'; } const isMiddle = position === 'middle'; if (alignColToStart || alignColToEnd || isMiddle) { const { colLeft, colMiddle, colRight } = this.getColumnBounds(column); if (isMiddle) { return colMiddle - viewportWidth / 2; } if (alignColToStart) { return isRtl ? colRight : colLeft; } return isRtl ? colLeft - viewportWidth : colRight - viewportWidth; } return null; } isColumnOutsideViewport(column) { const { start: viewportStart, end: viewportEnd } = this.getViewportBounds(); const { colLeft, colRight } = this.getColumnBounds(column); const isRtl = this.enableRtl; const columnBeforeStart = isRtl ? viewportStart > colRight : viewportEnd < colRight; const columnAfterEnd = isRtl ? viewportEnd < colLeft : viewportStart > colLeft; return { columnBeforeStart, columnAfterEnd }; } getColumnBounds(column) { const isRtl = this.enableRtl; const bodyWidth = this.visibleCols.bodyWidth; const colWidth = column.getActualWidth(); const colLeft = column.getLeft(); const multiplier = isRtl ? -1 : 1; const colLeftPixel = isRtl ? bodyWidth - colLeft : colLeft; const colRightPixel = colLeftPixel + colWidth * multiplier; const colMidPixel = colLeftPixel + (colWidth / 2) * multiplier; return { colLeft: colLeftPixel, colMiddle: colMidPixel, colRight: colRightPixel }; } getViewportBounds() { const viewportWidth = this.centerRowsCtrl.getCenterWidth(); const scrollPosition = this.centerRowsCtrl.getCenterViewportScrollLeft(); const viewportStartPixel = scrollPosition; const viewportEndPixel = viewportWidth + scrollPosition; return { start: viewportStartPixel, end: viewportEndPixel, width: viewportWidth }; } } exports.GridBodyScrollFeature = GridBodyScrollFeature; /***/ }), /***/ 8399: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports._getNormalisedMousePosition = exports._getCellPositionForEvent = exports._isElementInThisGrid = exports._isEventFromThisGrid = exports._stampTopLevelGridCompWithGridInstance = void 0; const gridOptionsUtils_1 = __webpack_require__(7274); const cellCtrl_1 = __webpack_require__(814); const generic_1 = __webpack_require__(4422); const GRID_DOM_KEY = '__ag_grid_instance'; // we put the instance id onto the main DOM element. this is used for events, when grids are inside grids, // so the grid can work out if the even came from this grid or a grid inside this one. see the ctrl+v logic // for where this is used. function _stampTopLevelGridCompWithGridInstance(gos, eGridDiv) { eGridDiv[GRID_DOM_KEY] = gos.gridInstanceId; } exports._stampTopLevelGridCompWithGridInstance = _stampTopLevelGridCompWithGridInstance; // walks the path of the event, and returns true if this grid is the first one that it finds. if doing // master / detail grids, and a child grid is found, then it returns false. this stops things like copy/paste // getting executed on many grids at the same time. function _isEventFromThisGrid(gos, event) { const res = _isElementInThisGrid(gos, event.target); return res; } exports._isEventFromThisGrid = _isEventFromThisGrid; function _isElementInThisGrid(gos, element) { let pointer = element; while (pointer) { const instanceId = pointer[GRID_DOM_KEY]; if ((0, generic_1._exists)(instanceId)) { const eventFromThisGrid = instanceId === gos.gridInstanceId; return eventFromThisGrid; } pointer = pointer.parentElement; } return false; } exports._isElementInThisGrid = _isElementInThisGrid; function _getCellPositionForEvent(gos, event) { return (0, cellCtrl_1._getCellCtrlForEventTarget)(gos, event.target)?.getFocusedCellPosition() ?? null; } exports._getCellPositionForEvent = _getCellPositionForEvent; function _getNormalisedMousePosition(beans, event) { const gridPanelHasScrolls = (0, gridOptionsUtils_1._isDomLayout)(beans.gos, 'normal'); const e = event; let x; let y; if (e.clientX != null || e.clientY != null) { x = e.clientX; y = e.clientY; } else { x = e.x; y = e.y; } if (gridPanelHasScrolls) { const scrollFeature = beans.ctrlsSvc.getScrollFeature(); const vRange = scrollFeature.getVScrollPosition(); const hRange = scrollFeature.getHScrollPosition(); x += hRange.left; y += vRange.top; } return { x, y }; } exports._getNormalisedMousePosition = _getNormalisedMousePosition; /***/ }), /***/ 4633: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.RowContainerSelector = exports.RowContainerComp = void 0; const rowComp_1 = __webpack_require__(3192); const dom_1 = __webpack_require__(3507); const component_1 = __webpack_require__(8020); const rowContainerCtrl_1 = __webpack_require__(8115); function templateFactory(name, options, beans) { const isCellSpanning = !!beans.gos.get('enableCellSpan') && !!options.getSpannedRowCtrls; const containerClass = (0, rowContainerCtrl_1._getRowContainerClass)(name); const eContainerTemplate = `
`; if (options.type === 'center' || isCellSpanning) { const spannedCellsContainerClass = (0, rowContainerCtrl_1._getRowSpanContainerClass)(name); const viewportClass = (0, rowContainerCtrl_1._getRowViewportClass)(name); const eSpannedContainerTemplate = `
`; return ``; } return eContainerTemplate; } class RowContainerComp extends component_1.Component { constructor(params) { super(); this.eViewport = component_1.RefPlaceholder; this.eContainer = component_1.RefPlaceholder; this.eSpannedContainer = component_1.RefPlaceholder; this.rowCompsNoSpan = {}; this.rowCompsWithSpan = {}; this.name = params?.name; this.options = (0, rowContainerCtrl_1._getRowContainerOptions)(this.name); } postConstruct() { this.setTemplate(templateFactory(this.name, this.options, this.beans)); const compProxy = { setHorizontalScroll: (offset) => (this.eViewport.scrollLeft = offset), setViewportHeight: (height) => (this.eViewport.style.height = height), setRowCtrls: ({ rowCtrls }) => this.setRowCtrls(rowCtrls), setSpannedRowCtrls: (rowCtrls) => this.setRowCtrls(rowCtrls, true), setDomOrder: (domOrder) => { this.domOrder = domOrder; }, setContainerWidth: (width) => { this.eContainer.style.width = width; if (this.eSpannedContainer) { this.eSpannedContainer.style.width = width; } }, setOffsetTop: (offset) => { const top = `translateY(${offset})`; this.eContainer.style.transform = top; if (this.eSpannedContainer) { this.eSpannedContainer.style.transform = top; } }, }; const ctrl = this.createManagedBean(new rowContainerCtrl_1.RowContainerCtrl(this.name)); ctrl.setComp(compProxy, this.eContainer, this.eSpannedContainer, this.eViewport); } destroy() { // destroys all row comps this.setRowCtrls([]); this.setRowCtrls([], true); super.destroy(); this.lastPlacedElement = null; } setRowCtrls(rowCtrls, spanContainer) { const { beans, options } = this; const container = spanContainer ? this.eSpannedContainer : this.eContainer; const oldRows = spanContainer ? { ...this.rowCompsWithSpan } : { ...this.rowCompsNoSpan }; const newComps = {}; if (spanContainer) { this.rowCompsWithSpan = newComps; } else { this.rowCompsNoSpan = newComps; } this.lastPlacedElement = null; const orderedRows = []; for (const rowCtrl of rowCtrls) { const instanceId = rowCtrl.instanceId; const existingRowComp = oldRows[instanceId]; let rowComp; if (existingRowComp) { rowComp = existingRowComp; delete oldRows[instanceId]; } else { if (!rowCtrl.rowNode.displayed) { continue; } rowComp = new rowComp_1.RowComp(rowCtrl, beans, options.type); } newComps[instanceId] = rowComp; orderedRows.push([rowComp, !existingRowComp]); } this.removeOldRows(Object.values(oldRows), container); this.addRowNodes(orderedRows, container); } addRowNodes(rows, container) { const { domOrder } = this; for (const [rowComp, isNew] of rows) { const eGui = rowComp.getGui(); if (!domOrder) { if (isNew) { container.appendChild(eGui); } } else { this.ensureDomOrder(eGui, container); } } } removeOldRows(rowComps, container) { for (const oldRowComp of rowComps) { container.removeChild(oldRowComp.getGui()); oldRowComp.destroy(); } } ensureDomOrder(eRow, container) { (0, dom_1._ensureDomOrder)(container, eRow, this.lastPlacedElement); this.lastPlacedElement = eRow; } } exports.RowContainerComp = RowContainerComp; exports.RowContainerSelector = { selector: 'AG-ROW-CONTAINER', component: RowContainerComp, }; /***/ }), /***/ 8115: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.RowContainerCtrl = exports._getRowContainerOptions = exports._getRowSpanContainerClass = exports._getRowContainerClass = exports._getRowViewportClass = void 0; const beanStub_1 = __webpack_require__(8731); const gridOptionsUtils_1 = __webpack_require__(7274); const dom_1 = __webpack_require__(3507); const centerWidthFeature_1 = __webpack_require__(2218); const viewportSizeFeature_1 = __webpack_require__(5858); const rowContainerEventsFeature_1 = __webpack_require__(2625); const setHeightFeature_1 = __webpack_require__(9622); const getTopRowCtrls = (r) => r.topRowCtrls; const getStickyTopRowCtrls = (r) => r.getStickyTopRowCtrls(); const getStickyBottomRowCtrls = (r) => r.getStickyBottomRowCtrls(); const getBottomRowCtrls = (r) => r.bottomRowCtrls; const getCentreRowCtrls = (r) => r.allRowCtrls; const getSpannedTopRowCtrls = (r) => r.getCtrls('top'); const getSpannedCenterRowCtrls = (r) => r.getCtrls('center'); const getSpannedBottomRowCtrls = (r) => r.getCtrls('bottom'); const ContainerCssClasses = { center: { type: 'center', name: 'center-cols', getRowCtrls: getCentreRowCtrls, getSpannedRowCtrls: getSpannedCenterRowCtrls, }, left: { type: 'left', name: 'pinned-left-cols', pinnedType: 'left', getRowCtrls: getCentreRowCtrls, getSpannedRowCtrls: getSpannedCenterRowCtrls, }, right: { type: 'right', name: 'pinned-right-cols', pinnedType: 'right', getRowCtrls: getCentreRowCtrls, getSpannedRowCtrls: getSpannedCenterRowCtrls, }, fullWidth: { type: 'fullWidth', name: 'full-width', fullWidth: true, getRowCtrls: getCentreRowCtrls, }, topCenter: { type: 'center', name: 'floating-top', getRowCtrls: getTopRowCtrls, getSpannedRowCtrls: getSpannedTopRowCtrls, }, topLeft: { type: 'left', name: 'pinned-left-floating', container: 'ag-pinned-left-floating-top', pinnedType: 'left', getRowCtrls: getTopRowCtrls, getSpannedRowCtrls: getSpannedTopRowCtrls, }, topRight: { type: 'right', name: 'pinned-right-floating', container: 'ag-pinned-right-floating-top', pinnedType: 'right', getRowCtrls: getTopRowCtrls, getSpannedRowCtrls: getSpannedTopRowCtrls, }, topFullWidth: { type: 'fullWidth', name: 'floating-top-full-width', fullWidth: true, getRowCtrls: getTopRowCtrls, }, stickyTopCenter: { type: 'center', name: 'sticky-top', getRowCtrls: getStickyTopRowCtrls, }, stickyTopLeft: { type: 'left', name: 'pinned-left-sticky-top', container: 'ag-pinned-left-sticky-top', pinnedType: 'left', getRowCtrls: getStickyTopRowCtrls, }, stickyTopRight: { type: 'right', name: 'pinned-right-sticky-top', container: 'ag-pinned-right-sticky-top', pinnedType: 'right', getRowCtrls: getStickyTopRowCtrls, }, stickyTopFullWidth: { type: 'fullWidth', name: 'sticky-top-full-width', fullWidth: true, getRowCtrls: getStickyTopRowCtrls, }, stickyBottomCenter: { type: 'center', name: 'sticky-bottom', getRowCtrls: getStickyBottomRowCtrls, }, stickyBottomLeft: { type: 'left', name: 'pinned-left-sticky-bottom', container: 'ag-pinned-left-sticky-bottom', pinnedType: 'left', getRowCtrls: getStickyBottomRowCtrls, }, stickyBottomRight: { type: 'right', name: 'pinned-right-sticky-bottom', container: 'ag-pinned-right-sticky-bottom', pinnedType: 'right', getRowCtrls: getStickyBottomRowCtrls, }, stickyBottomFullWidth: { type: 'fullWidth', name: 'sticky-bottom-full-width', fullWidth: true, getRowCtrls: getStickyBottomRowCtrls, }, bottomCenter: { type: 'center', name: 'floating-bottom', getRowCtrls: getBottomRowCtrls, getSpannedRowCtrls: getSpannedBottomRowCtrls, }, bottomLeft: { type: 'left', name: 'pinned-left-floating-bottom', container: 'ag-pinned-left-floating-bottom', pinnedType: 'left', getRowCtrls: getBottomRowCtrls, getSpannedRowCtrls: getSpannedBottomRowCtrls, }, bottomRight: { type: 'right', name: 'pinned-right-floating-bottom', container: 'ag-pinned-right-floating-bottom', pinnedType: 'right', getRowCtrls: getBottomRowCtrls, getSpannedRowCtrls: getSpannedBottomRowCtrls, }, bottomFullWidth: { type: 'fullWidth', name: 'floating-bottom-full-width', fullWidth: true, getRowCtrls: getBottomRowCtrls, }, }; function _getRowViewportClass(name) { const options = _getRowContainerOptions(name); return `ag-${options.name}-viewport`; } exports._getRowViewportClass = _getRowViewportClass; function _getRowContainerClass(name) { const options = _getRowContainerOptions(name); return options.container ?? `ag-${options.name}-container`; } exports._getRowContainerClass = _getRowContainerClass; function _getRowSpanContainerClass(name) { const options = _getRowContainerOptions(name); return `ag-${options.name}-spanned-cells-container`; } exports._getRowSpanContainerClass = _getRowSpanContainerClass; function _getRowContainerOptions(name) { return ContainerCssClasses[name]; } exports._getRowContainerOptions = _getRowContainerOptions; const allTopNoFW = ['topCenter', 'topLeft', 'topRight']; const allBottomNoFW = ['bottomCenter', 'bottomLeft', 'bottomRight']; const allMiddleNoFW = ['center', 'left', 'right']; const allMiddle = ['center', 'left', 'right', 'fullWidth']; const allCenter = ['stickyTopCenter', 'stickyBottomCenter', 'center', 'topCenter', 'bottomCenter']; const allLeft = ['left', 'bottomLeft', 'topLeft', 'stickyTopLeft', 'stickyBottomLeft']; const allRight = ['right', 'bottomRight', 'topRight', 'stickyTopRight', 'stickyBottomRight']; // sticky section must show rows in set order const allStickyTopNoFW = ['stickyTopCenter', 'stickyTopLeft', 'stickyTopRight']; const allStickyBottomNoFW = ['stickyBottomCenter', 'stickyBottomLeft', 'stickyBottomRight']; const allStickyContainers = [ ...allStickyTopNoFW, 'stickyTopFullWidth', ...allStickyBottomNoFW, 'stickyBottomFullWidth', ]; const allNoFW = [ ...allTopNoFW, ...allBottomNoFW, ...allMiddleNoFW, ...allStickyTopNoFW, ...allStickyBottomNoFW, ]; class RowContainerCtrl extends beanStub_1.BeanStub { constructor(name) { super(); this.name = name; this.visible = true; // Maintaining a constant reference enables optimization in React. this.EMPTY_CTRLS = []; this.options = _getRowContainerOptions(name); } postConstruct() { this.enableRtl = this.gos.get('enableRtl'); this.forContainers(['center'], () => { this.viewportSizeFeature = this.createManagedBean(new viewportSizeFeature_1.ViewportSizeFeature(this)); this.addManagedEventListeners({ stickyTopOffsetChanged: this.onStickyTopOffsetChanged.bind(this), }); }); } onStickyTopOffsetChanged(event) { this.comp.setOffsetTop(`${event.offset}px`); } registerWithCtrlsService() { // we don't register full width containers if (this.options.fullWidth) return; this.beans.ctrlsSvc.register(this.name, this); } forContainers(names, callback) { if (names.indexOf(this.name) >= 0) { callback(); } } setComp(view, eContainer, eSpannedContainer, eViewport) { this.comp = view; this.eContainer = eContainer; this.eSpannedContainer = eSpannedContainer; this.eViewport = eViewport; this.createManagedBean(new rowContainerEventsFeature_1.RowContainerEventsFeature(this.eViewport ?? this.eContainer)); this.addPreventScrollWhileDragging(); this.listenOnDomOrder(); const { pinnedCols, rangeSvc } = this.beans; const pinnedWidthChanged = () => this.onPinnedWidthChanged(); this.forContainers(allLeft, () => { this.pinnedWidthFeature = this.createOptionalManagedBean(pinnedCols?.createPinnedWidthFeature(true, this.eContainer, this.eSpannedContainer)); this.addManagedEventListeners({ leftPinnedWidthChanged: pinnedWidthChanged }); }); this.forContainers(allRight, () => { this.pinnedWidthFeature = this.createOptionalManagedBean(pinnedCols?.createPinnedWidthFeature(false, this.eContainer, this.eSpannedContainer)); this.addManagedEventListeners({ rightPinnedWidthChanged: pinnedWidthChanged }); }); this.forContainers(allMiddle, () => this.createManagedBean(new setHeightFeature_1.SetHeightFeature(this.eContainer, this.name === 'center' ? eViewport : undefined))); if (rangeSvc) { this.forContainers(allNoFW, () => this.createManagedBean(rangeSvc.createDragListenerFeature(this.eContainer))); } this.forContainers(allCenter, () => this.createManagedBean(new centerWidthFeature_1.CenterWidthFeature((width) => this.comp.setContainerWidth(`${width}px`)))); // Set the initial visibility of the container to avoid extra rendering this.visible = this.isContainerVisible(); this.addListeners(); this.registerWithCtrlsService(); } onScrollCallback(fn) { this.addManagedElementListeners(this.eViewport, { scroll: fn }); } addListeners() { const { spannedRowRenderer, gos } = this.beans; this.addManagedEventListeners({ displayedColumnsChanged: this.onDisplayedColumnsChanged.bind(this), displayedColumnsWidthChanged: this.onDisplayedColumnsChanged.bind(this), displayedRowsChanged: (params) => this.onDisplayedRowsChanged(params.afterScroll), }); this.onDisplayedColumnsChanged(); this.onDisplayedRowsChanged(); if (spannedRowRenderer && this.options.getSpannedRowCtrls && gos.get('enableCellSpan')) { this.addManagedListeners(spannedRowRenderer, { spannedRowsUpdated: () => { const spannedCtrls = this.options.getSpannedRowCtrls(spannedRowRenderer); if (!spannedCtrls) { return; } this.comp.setSpannedRowCtrls(spannedCtrls, false); }, }); } } listenOnDomOrder() { const isStickContainer = allStickyContainers.indexOf(this.name) >= 0; if (isStickContainer) { this.comp.setDomOrder(true); return; } const listener = () => { const isEnsureDomOrder = this.gos.get('ensureDomOrder'); const isPrintLayout = (0, gridOptionsUtils_1._isDomLayout)(this.gos, 'print'); this.comp.setDomOrder(isEnsureDomOrder || isPrintLayout); }; this.addManagedPropertyListener('domLayout', listener); listener(); } onDisplayedColumnsChanged() { this.forContainers(['center'], () => this.onHorizontalViewportChanged()); } // this methods prevents the grid views from being scrolled while the dragService is being used // eg. the view should not scroll up and down while dragging rows using the rowDragComp. addPreventScrollWhileDragging() { const { dragSvc } = this.beans; if (!dragSvc) { return; } const preventScroll = (e) => { if (dragSvc.dragging) { if (e.cancelable) { e.preventDefault(); } } }; this.eContainer.addEventListener('touchmove', preventScroll, { passive: false }); this.addDestroyFunc(() => this.eContainer.removeEventListener('touchmove', preventScroll)); } // this gets called whenever a change in the viewport, so we can inform column controller it has to work // out the virtual columns again. gets called from following locations: // + ensureColVisible, scroll, init, layoutChanged, displayedColumnsChanged onHorizontalViewportChanged(afterScroll = false) { const scrollWidth = this.getCenterWidth(); const scrollPosition = this.getCenterViewportScrollLeft(); this.beans.colViewport.setScrollPosition(scrollWidth, scrollPosition, afterScroll); } hasHorizontalScrollGap() { return this.eContainer.clientWidth - this.eViewport.clientWidth < 0; } hasVerticalScrollGap() { return this.eContainer.clientHeight - this.eViewport.clientHeight < 0; } getCenterWidth() { return (0, dom_1._getInnerWidth)(this.eViewport); } getCenterViewportScrollLeft() { // we defer to a util, as how you calculated scrollLeft when doing RTL depends on the browser return (0, dom_1._getScrollLeft)(this.eViewport, this.enableRtl); } registerViewportResizeListener(listener) { const unsubscribeFromResize = (0, dom_1._observeResize)(this.beans, this.eViewport, listener); this.addDestroyFunc(() => unsubscribeFromResize()); } isViewportInTheDOMTree() { return (0, dom_1._isInDOM)(this.eViewport); } getViewportScrollLeft() { return (0, dom_1._getScrollLeft)(this.eViewport, this.enableRtl); } isHorizontalScrollShowing() { const isAlwaysShowHorizontalScroll = this.gos.get('alwaysShowHorizontalScroll'); return isAlwaysShowHorizontalScroll || (0, dom_1._isHorizontalScrollShowing)(this.eViewport); } setHorizontalScroll(offset) { this.comp.setHorizontalScroll(offset); } getHScrollPosition() { const res = { left: this.eViewport.scrollLeft, right: this.eViewport.scrollLeft + this.eViewport.offsetWidth, }; return res; } setCenterViewportScrollLeft(value) { // we defer to a util, as how you calculated scrollLeft when doing RTL depends on the browser (0, dom_1._setScrollLeft)(this.eViewport, value, this.enableRtl); } isContainerVisible() { const pinned = this.options.pinnedType != null; return !pinned || (!!this.pinnedWidthFeature && this.pinnedWidthFeature.getWidth() > 0); } onPinnedWidthChanged() { const visible = this.isContainerVisible(); if (this.visible != visible) { this.visible = visible; this.onDisplayedRowsChanged(); } } onDisplayedRowsChanged(afterScroll = false) { const rows = this.options.getRowCtrls(this.beans.rowRenderer); if (!this.visible || rows.length === 0) { this.comp.setRowCtrls({ rowCtrls: this.EMPTY_CTRLS }); return; } const printLayout = (0, gridOptionsUtils_1._isDomLayout)(this.gos, 'print'); const embedFullWidthRows = this.gos.get('embedFullWidthRows'); const embedFW = embedFullWidthRows || printLayout; // this list contains either all pinned top, center or pinned bottom rows // this filters out rows not for this container, eg if it's a full with row, but we are not full with container const rowsThisContainer = rows.filter((rowCtrl) => { // this just justifies if the ctrl is in the correct place, this will be fed with zombie rows by the // row renderer, so should not block them as they still need to animate - the row renderer // will clean these up when they finish animating const fullWidthRow = rowCtrl.isFullWidth(); const match = this.options.fullWidth ? !embedFW && fullWidthRow : embedFW || !fullWidthRow; return match; }); this.comp.setRowCtrls({ rowCtrls: rowsThisContainer, useFlushSync: afterScroll }); } } exports.RowContainerCtrl = RowContainerCtrl; /***/ }), /***/ 2625: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.RowContainerEventsFeature = void 0; const keyCode_1 = __webpack_require__(9853); const beanStub_1 = __webpack_require__(8731); const gridOptionsUtils_1 = __webpack_require__(7274); const cellCtrl_1 = __webpack_require__(814); const rowCtrl_1 = __webpack_require__(7632); const event_1 = __webpack_require__(2979); const keyboard_1 = __webpack_require__(6466); const selection_1 = __webpack_require__(4009); const mouseEventUtils_1 = __webpack_require__(8399); const A_KEYCODE = 65; const C_KEYCODE = 67; const V_KEYCODE = 86; const D_KEYCODE = 68; const Z_KEYCODE = 90; const Y_KEYCODE = 89; function _normaliseQwertyAzerty(keyboardEvent) { const { keyCode } = keyboardEvent; let code; switch (keyCode) { case A_KEYCODE: code = keyCode_1.KeyCode.A; break; case C_KEYCODE: code = keyCode_1.KeyCode.C; break; case V_KEYCODE: code = keyCode_1.KeyCode.V; break; case D_KEYCODE: code = keyCode_1.KeyCode.D; break; case Z_KEYCODE: code = keyCode_1.KeyCode.Z; break; case Y_KEYCODE: code = keyCode_1.KeyCode.Y; break; default: code = keyboardEvent.code; } return code; } class RowContainerEventsFeature extends beanStub_1.BeanStub { constructor(element) { super(); this.element = element; } postConstruct() { this.addKeyboardListeners(); this.addMouseListeners(); this.beans.touchSvc?.mockRowContextMenu(this); } addKeyboardListeners() { const eventName = 'keydown'; const listener = this.processKeyboardEvent.bind(this, eventName); this.addManagedElementListeners(this.element, { [eventName]: listener }); } addMouseListeners() { const mouseDownEvent = (0, event_1._isEventSupported)('touchstart') ? 'touchstart' : 'mousedown'; const eventNames = ['dblclick', 'contextmenu', 'mouseover', 'mouseout', 'click', mouseDownEvent]; eventNames.forEach((eventName) => { const listener = this.processMouseEvent.bind(this, eventName); this.addManagedElementListeners(this.element, { [eventName]: listener }); }); } processMouseEvent(eventName, mouseEvent) { if (!(0, mouseEventUtils_1._isEventFromThisGrid)(this.gos, mouseEvent) || (0, event_1._isStopPropagationForAgGrid)(mouseEvent)) { return; } const { cellCtrl, rowCtrl } = this.getControlsForEventTarget(mouseEvent.target); if (eventName === 'contextmenu') { if (cellCtrl?.column) { cellCtrl.dispatchCellContextMenuEvent(mouseEvent); } this.beans.contextMenuSvc?.handleContextMenuMouseEvent(mouseEvent, undefined, rowCtrl, cellCtrl); } else { if (cellCtrl) { cellCtrl.onMouseEvent(eventName, mouseEvent); } if (rowCtrl) { rowCtrl.onMouseEvent(eventName, mouseEvent); } } } getControlsForEventTarget(target) { const { gos } = this; return { cellCtrl: (0, cellCtrl_1._getCellCtrlForEventTarget)(gos, target), rowCtrl: (0, event_1._getCtrlForEventTarget)(gos, target, rowCtrl_1.DOM_DATA_KEY_ROW_CTRL), }; } processKeyboardEvent(eventName, keyboardEvent) { const { cellCtrl, rowCtrl } = this.getControlsForEventTarget(keyboardEvent.target); if (keyboardEvent.defaultPrevented) { return; } if (cellCtrl) { this.processCellKeyboardEvent(cellCtrl, eventName, keyboardEvent); } else if (rowCtrl && rowCtrl.isFullWidth()) { this.processFullWidthRowKeyboardEvent(rowCtrl, eventName, keyboardEvent); } } processCellKeyboardEvent(cellCtrl, eventName, keyboardEvent) { const { rowNode, column, editing } = cellCtrl; const gridProcessingAllowed = !(0, keyboard_1._isUserSuppressingKeyboardEvent)(this.gos, keyboardEvent, rowNode, column, editing); if (gridProcessingAllowed) { if (eventName === 'keydown') { // first see if it's a scroll key, page up / down, home / end etc const wasScrollKey = !editing && this.beans.navigation?.handlePageScrollingKey(keyboardEvent); // if not a scroll key, then we pass onto cell if (!wasScrollKey) { cellCtrl.onKeyDown(keyboardEvent); } // perform clipboard and undo / redo operations this.doGridOperations(keyboardEvent, cellCtrl.editing); if ((0, keyboard_1._isEventFromPrintableCharacter)(keyboardEvent)) { cellCtrl.processCharacter(keyboardEvent); } } } if (eventName === 'keydown') { this.eventSvc.dispatchEvent(cellCtrl.createEvent(keyboardEvent, 'cellKeyDown')); } } processFullWidthRowKeyboardEvent(rowComp, eventName, keyboardEvent) { const { rowNode } = rowComp; const { focusSvc, navigation } = this.beans; const focusedCell = focusSvc.getFocusedCell(); const column = (focusedCell && focusedCell.column); const gridProcessingAllowed = !(0, keyboard_1._isUserSuppressingKeyboardEvent)(this.gos, keyboardEvent, rowNode, column, false); if (gridProcessingAllowed) { const key = keyboardEvent.key; if (eventName === 'keydown') { switch (key) { case keyCode_1.KeyCode.PAGE_HOME: case keyCode_1.KeyCode.PAGE_END: case keyCode_1.KeyCode.PAGE_UP: case keyCode_1.KeyCode.PAGE_DOWN: navigation?.handlePageScrollingKey(keyboardEvent, true); break; case keyCode_1.KeyCode.UP: case keyCode_1.KeyCode.DOWN: rowComp.onKeyboardNavigate(keyboardEvent); break; case keyCode_1.KeyCode.TAB: rowComp.onTabKeyDown(keyboardEvent); break; default: } } } if (eventName === 'keydown') { this.eventSvc.dispatchEvent(rowComp.createRowEvent('cellKeyDown', keyboardEvent)); } } doGridOperations(keyboardEvent, editing) { // check if ctrl or meta key pressed if (!keyboardEvent.ctrlKey && !keyboardEvent.metaKey) { return; } // if the cell the event came from is editing, then we do not // want to do the default shortcut keys, otherwise the editor // (eg a text field) would not be able to do the normal cut/copy/paste if (editing) { return; } // for copy / paste, we don't want to execute when the event // was from a child grid (happens in master detail) if (!(0, mouseEventUtils_1._isEventFromThisGrid)(this.gos, keyboardEvent)) { return; } const keyCode = _normaliseQwertyAzerty(keyboardEvent); const { clipboardSvc, undoRedo } = this.beans; if (keyCode === keyCode_1.KeyCode.A) { return this.onCtrlAndA(keyboardEvent); } if (keyCode === keyCode_1.KeyCode.C) { return this.onCtrlAndC(clipboardSvc, keyboardEvent); } if (keyCode === keyCode_1.KeyCode.D) { return this.onCtrlAndD(clipboardSvc, keyboardEvent); } if (keyCode === keyCode_1.KeyCode.V) { return this.onCtrlAndV(clipboardSvc, keyboardEvent); } if (keyCode === keyCode_1.KeyCode.X) { return this.onCtrlAndX(clipboardSvc, keyboardEvent); } if (keyCode === keyCode_1.KeyCode.Y) { return this.onCtrlAndY(undoRedo); } if (keyCode === keyCode_1.KeyCode.Z) { return this.onCtrlAndZ(undoRedo, keyboardEvent); } } onCtrlAndA(event) { const { beans: { rowModel, rangeSvc, selectionSvc }, gos, } = this; if (rangeSvc && (0, gridOptionsUtils_1._isCellSelectionEnabled)(gos) && rowModel.isRowsToRender()) { (0, selection_1._selectAllCells)(this.beans); } else if (selectionSvc) { selectionSvc?.selectAllRowNodes({ source: 'keyboardSelectAll', selectAll: (0, gridOptionsUtils_1._getSelectAll)(gos) }); } event.preventDefault(); } onCtrlAndC(clipboardSvc, event) { if (!clipboardSvc || this.gos.get('enableCellTextSelection')) { return; } const { cellCtrl, rowCtrl } = this.getControlsForEventTarget(event.target); if (cellCtrl?.editing || rowCtrl?.editing) { return; } event.preventDefault(); clipboardSvc.copyToClipboard(); } onCtrlAndX(clipboardSvc, event) { if (!clipboardSvc || this.gos.get('enableCellTextSelection') || this.gos.get('suppressCutToClipboard')) { return; } const { cellCtrl, rowCtrl } = this.getControlsForEventTarget(event.target); if (cellCtrl?.editing || rowCtrl?.editing) { return; } event.preventDefault(); clipboardSvc.cutToClipboard(undefined, 'ui'); } onCtrlAndV(clipboardSvc, event) { const { cellCtrl, rowCtrl } = this.getControlsForEventTarget(event.target); if (cellCtrl?.editing || rowCtrl?.editing) { return; } if (clipboardSvc && !this.gos.get('suppressClipboardPaste')) { clipboardSvc.pasteFromClipboard(); } } onCtrlAndD(clipboardSvc, event) { if (clipboardSvc && !this.gos.get('suppressClipboardPaste')) { clipboardSvc.copyRangeDown(); } event.preventDefault(); } onCtrlAndZ(undoRedo, event) { if (!this.gos.get('undoRedoCellEditing') || !undoRedo) { return; } event.preventDefault(); if (event.shiftKey) { undoRedo.redo('ui'); } else { undoRedo.undo('ui'); } } onCtrlAndY(undoRedo) { undoRedo?.redo('ui'); } } exports.RowContainerEventsFeature = RowContainerEventsFeature; /***/ }), /***/ 9622: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.SetHeightFeature = void 0; const beanStub_1 = __webpack_require__(8731); class SetHeightFeature extends beanStub_1.BeanStub { constructor(eContainer, eViewport) { super(); this.eContainer = eContainer; this.eViewport = eViewport; } postConstruct() { this.addManagedEventListeners({ rowContainerHeightChanged: this.onHeightChanged.bind(this, this.beans.rowContainerHeight), }); } onHeightChanged(maxDivHeightScaler) { const height = maxDivHeightScaler.uiContainerHeight; const heightString = height != null ? `${height}px` : ``; this.eContainer.style.height = heightString; if (this.eViewport) { this.eViewport.style.height = heightString; } } } exports.SetHeightFeature = SetHeightFeature; /***/ }), /***/ 2865: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.SetPinnedWidthFeature = void 0; const beanStub_1 = __webpack_require__(8731); const dom_1 = __webpack_require__(3507); class SetPinnedWidthFeature extends beanStub_1.BeanStub { constructor(isLeft, elements) { super(); this.isLeft = isLeft; this.elements = elements; this.getWidth = isLeft ? () => this.beans.pinnedCols.leftWidth : () => this.beans.pinnedCols.rightWidth; } postConstruct() { this.addManagedEventListeners({ [`${this.isLeft ? 'left' : 'right'}PinnedWidthChanged`]: this.onPinnedWidthChanged.bind(this), }); } onPinnedWidthChanged() { const width = this.getWidth(); const displayed = width > 0; for (const element of this.elements) { if (element) { (0, dom_1._setDisplayed)(element, displayed); (0, dom_1._setFixedWidth)(element, width); } } } } exports.SetPinnedWidthFeature = SetPinnedWidthFeature; /***/ }), /***/ 8913: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ScrollVisibleService = void 0; const beanStub_1 = __webpack_require__(8731); const browser_1 = __webpack_require__(8667); class ScrollVisibleService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'scrollVisibleSvc'; } wireBeans(beans) { this.ctrlsSvc = beans.ctrlsSvc; this.colAnimation = beans.colAnimation; } postConstruct() { // sets an initial calculation for the scrollbar width this.getScrollbarWidth(); this.addManagedEventListeners({ displayedColumnsChanged: this.updateScrollVisible.bind(this), displayedColumnsWidthChanged: this.updateScrollVisible.bind(this), }); } updateScrollVisible() { // Because of column animation, if user removes cols anywhere except at the RHS, // then the cols on the RHS will animate to the left to fill the gap. This animation // means just after the cols are removed, the remaining cols are still in the original // location at the start of the animation, so pre animation the H scrollbar is still // needed, but post animation it is not. So if animation is active, we only update // after the animation has ended. const { colAnimation } = this; if (colAnimation?.isActive()) { colAnimation.executeLaterVMTurn(() => { colAnimation.executeLaterVMTurn(() => this.updateScrollVisibleImpl()); }); } else { this.updateScrollVisibleImpl(); } } updateScrollVisibleImpl() { const centerRowCtrl = this.ctrlsSvc.get('center'); if (!centerRowCtrl || this.colAnimation?.isActive()) { return; } const params = { horizontalScrollShowing: centerRowCtrl.isHorizontalScrollShowing(), verticalScrollShowing: this.verticalScrollShowing, }; this.setScrollsVisible(params); this.updateScrollGap(); } updateScrollGap() { const centerRowCtrl = this.ctrlsSvc.get('center'); const horizontalGap = centerRowCtrl.hasHorizontalScrollGap(); const verticalGap = centerRowCtrl.hasVerticalScrollGap(); const atLeastOneDifferent = this.horizontalScrollGap !== horizontalGap || this.verticalScrollGap !== verticalGap; if (atLeastOneDifferent) { this.horizontalScrollGap = horizontalGap; this.verticalScrollGap = verticalGap; this.eventSvc.dispatchEvent({ type: 'scrollGapChanged', }); } } setScrollsVisible(params) { const atLeastOneDifferent = this.horizontalScrollShowing !== params.horizontalScrollShowing || this.verticalScrollShowing !== params.verticalScrollShowing; if (atLeastOneDifferent) { this.horizontalScrollShowing = params.horizontalScrollShowing; this.verticalScrollShowing = params.verticalScrollShowing; this.eventSvc.dispatchEvent({ type: 'scrollVisibilityChanged', }); } } // the user might be using some non-standard scrollbar, eg a scrollbar that has zero // width and overlays (like the Safari scrollbar, but presented in Chrome). so we // allow the user to provide the scroll width before we work it out. getScrollbarWidth() { if (this.scrollbarWidth == null) { const gridOptionsScrollbarWidth = this.gos.get('scrollbarWidth'); const useGridOptions = typeof gridOptionsScrollbarWidth === 'number' && gridOptionsScrollbarWidth >= 0; const scrollbarWidth = useGridOptions ? gridOptionsScrollbarWidth : (0, browser_1._getScrollbarWidth)(); if (scrollbarWidth != null) { this.scrollbarWidth = scrollbarWidth; this.eventSvc.dispatchEvent({ type: 'scrollbarWidthChanged', }); } } return this.scrollbarWidth; } } exports.ScrollVisibleService = ScrollVisibleService; /***/ }), /***/ 5858: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ViewportSizeFeature = void 0; const beanStub_1 = __webpack_require__(8731); const animationFrameService_1 = __webpack_require__(2612); const dom_1 = __webpack_require__(3507); // listens to changes in the center viewport size, for column and row virtualisation, // and adjusts grid as necessary. there are two viewports, one for horizontal and one for // vertical scrolling. class ViewportSizeFeature extends beanStub_1.BeanStub { wireBeans(beans) { this.scrollVisibleSvc = beans.scrollVisibleSvc; } constructor(centerContainerCtrl) { super(); this.centerContainerCtrl = centerContainerCtrl; } postConstruct() { this.beans.ctrlsSvc.whenReady(this, (p) => { this.gridBodyCtrl = p.gridBodyCtrl; this.listenForResize(); }); this.addManagedEventListeners({ scrollbarWidthChanged: this.onScrollbarWidthChanged.bind(this) }); this.addManagedPropertyListeners(['alwaysShowHorizontalScroll', 'alwaysShowVerticalScroll'], () => { this.checkViewportAndScrolls(); }); } listenForResize() { const { beans, centerContainerCtrl, gridBodyCtrl } = this; const listener = () => { // onCenterViewportResize causes resize events to be fired (flex-columns). // when any resize event happens, style and layout are re-evaluated — which in turn may // trigger more resize events. Infinite loops from cyclic dependencies are addressed by // only processing elements deeper in the DOM during each iteration. // so the solution here is to use the animation frame service to avoid infinite loops. // For more info, see: https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver#observation_errors (0, animationFrameService_1._requestAnimationFrame)(beans, () => { this.onCenterViewportResized(); }); }; // centerContainer gets horizontal resizes centerContainerCtrl.registerViewportResizeListener(listener); // eBodyViewport gets vertical resizes gridBodyCtrl.registerBodyViewportResizeListener(listener); } onScrollbarWidthChanged() { this.checkViewportAndScrolls(); } onCenterViewportResized() { this.scrollVisibleSvc.updateScrollGap(); if (this.centerContainerCtrl.isViewportInTheDOMTree()) { const { pinnedCols, colFlex } = this.beans; pinnedCols?.keepPinnedColumnsNarrowerThanViewport(); this.checkViewportAndScrolls(); const newWidth = this.centerContainerCtrl.getCenterWidth(); if (newWidth !== this.centerWidth) { this.centerWidth = newWidth; colFlex?.refreshFlexedColumns({ viewportWidth: this.centerWidth, updateBodyWidths: true, fireResizedEvent: true, }); } } else { this.bodyHeight = 0; } } // gets called every time the viewport size changes. we use this to check visibility of scrollbars // in the grid panel, and also to check size and position of viewport for row and column virtualisation. checkViewportAndScrolls() { // results in updating anything that depends on scroll showing this.updateScrollVisibleService(); // fires event if height changes, used by PaginationService, HeightScalerService, RowRenderer this.checkBodyHeight(); // check for virtual columns for ColumnController this.onHorizontalViewportChanged(); this.gridBodyCtrl.scrollFeature.checkScrollLeft(); } getBodyHeight() { return this.bodyHeight; } checkBodyHeight() { const eBodyViewport = this.gridBodyCtrl.eBodyViewport; const bodyHeight = (0, dom_1._getInnerHeight)(eBodyViewport); if (this.bodyHeight !== bodyHeight) { this.bodyHeight = bodyHeight; this.eventSvc.dispatchEvent({ type: 'bodyHeightChanged', }); } } updateScrollVisibleService() { // because of column animation (which takes 200ms), we have to do this twice. // eg if user removes cols anywhere except at the RHS, then the cols on the RHS // will animate to the left to fill the gap. this animation means just after // the cols are removed, the remaining cols are still in the original location // at the start of the animation, so pre animation the H scrollbar is still needed, // but post animation it is not. this.updateScrollVisibleServiceImpl(); setTimeout(this.updateScrollVisibleServiceImpl.bind(this), 500); } updateScrollVisibleServiceImpl() { const params = { horizontalScrollShowing: this.centerContainerCtrl.isHorizontalScrollShowing(), verticalScrollShowing: this.gridBodyCtrl.isVerticalScrollShowing(), }; this.scrollVisibleSvc.setScrollsVisible(params); } // this gets called whenever a change in the viewport, so we can inform column controller it has to work // out the virtual columns again. gets called from following locations: // + ensureColVisible, scroll, init, layoutChanged, displayedColumnsChanged onHorizontalViewportChanged() { const scrollWidth = this.centerContainerCtrl.getCenterWidth(); const scrollPosition = this.centerContainerCtrl.getViewportScrollLeft(); this.beans.colViewport.setScrollPosition(scrollWidth, scrollPosition); } } exports.ViewportSizeFeature = ViewportSizeFeature; /***/ }), /***/ 1678: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.GridComp = void 0; const gridBodyComp_1 = __webpack_require__(9625); const layoutFeature_1 = __webpack_require__(9360); const dom_1 = __webpack_require__(3507); const function_1 = __webpack_require__(2043); const component_1 = __webpack_require__(8020); const tabGuardComp_1 = __webpack_require__(8332); const gridCtrl_1 = __webpack_require__(7600); class GridComp extends tabGuardComp_1.TabGuardComp { constructor(eGridDiv) { super(); this.gridBody = component_1.RefPlaceholder; this.sideBar = component_1.RefPlaceholder; this.pagination = component_1.RefPlaceholder; this.rootWrapperBody = component_1.RefPlaceholder; this.eGridDiv = eGridDiv; } postConstruct() { const compProxy = { destroyGridUi: () => this.destroyBean(this), setRtlClass: (cssClass) => this.addCssClass(cssClass), forceFocusOutOfContainer: this.forceFocusOutOfContainer.bind(this), updateLayoutClasses: this.updateLayoutClasses.bind(this), getFocusableContainers: this.getFocusableContainers.bind(this), setUserSelect: (value) => { this.getGui().style.userSelect = value != null ? value : ''; this.getGui().style.webkitUserSelect = value != null ? value : ''; }, setCursor: (value) => { this.getGui().style.cursor = value != null ? value : ''; }, }; const ctrl = this.createManagedBean(new gridCtrl_1.GridCtrl()); const comps = ctrl.getOptionalSelectors(); const template = this.createTemplate(comps); const requiredComps = [gridBodyComp_1.GridBodySelector, ...Object.values(comps).filter((c) => !!c)]; this.setTemplate(template, requiredComps); ctrl.setComp(compProxy, this.eGridDiv, this.getGui()); this.insertGridIntoDom(); this.initialiseTabGuard({ // we want to override the default behaviour to do nothing for onTabKeyDown onTabKeyDown: () => undefined, focusInnerElement: (fromBottom) => ctrl.focusInnerElement(fromBottom), forceFocusOutWhenTabGuardsAreEmpty: true, isEmpty: () => !ctrl.isFocusable(), }); } insertGridIntoDom() { const eGui = this.getGui(); this.eGridDiv.appendChild(eGui); this.addDestroyFunc(() => { this.eGridDiv.removeChild(eGui); (0, function_1._logIfDebug)(this.gos, 'Grid removed from DOM'); }); } updateLayoutClasses(cssClass, params) { const eRootWrapperBodyClassList = this.rootWrapperBody.classList; const { AUTO_HEIGHT, NORMAL, PRINT } = layoutFeature_1.LayoutCssClasses; const { autoHeight, normal, print } = params; eRootWrapperBodyClassList.toggle(AUTO_HEIGHT, autoHeight); eRootWrapperBodyClassList.toggle(NORMAL, normal); eRootWrapperBodyClassList.toggle(PRINT, print); this.addOrRemoveCssClass(AUTO_HEIGHT, autoHeight); this.addOrRemoveCssClass(NORMAL, normal); this.addOrRemoveCssClass(PRINT, print); } createTemplate(params) { const dropZones = params.gridHeaderDropZonesSelector ? '' : ''; const sideBar = params.sideBarSelector ? '' : ''; const statusBar = params.statusBarSelector ? '' : ''; const watermark = params.watermarkSelector ? '' : ''; const pagination = params.paginationSelector ? '' : ''; const template = /* html */ ``; return template; } getFocusableElement() { return this.rootWrapperBody; } forceFocusOutOfContainer(up = false) { if (!up && this.pagination?.isDisplayed()) { this.pagination.forceFocusOutOfContainer(up); return; } super.forceFocusOutOfContainer(up); } getFocusableContainers() { const focusableContainers = [this.gridBody]; [this.sideBar, this.pagination].forEach((comp) => { if (comp) { focusableContainers.push(comp); } }); return focusableContainers.filter((el) => (0, dom_1._isVisible)(el.getGui())); } } exports.GridComp = GridComp; /***/ }), /***/ 7600: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.GridCtrl = void 0; const beanStub_1 = __webpack_require__(8731); const mouseEventUtils_1 = __webpack_require__(8399); const gridOptionsUtils_1 = __webpack_require__(7274); const layoutFeature_1 = __webpack_require__(9360); const array_1 = __webpack_require__(1502); const dom_1 = __webpack_require__(3507); const focus_1 = __webpack_require__(2331); class GridCtrl extends beanStub_1.BeanStub { constructor() { super(...arguments); this.additionalFocusableContainers = new Set(); } setComp(view, eGridDiv, eGui) { this.view = view; this.eGridHostDiv = eGridDiv; this.eGui = eGui; this.eGui.setAttribute('grid-id', this.beans.context.getGridId()); const { dragAndDrop, ctrlsSvc } = this.beans; dragAndDrop?.registerGridDropTarget(() => this.eGui, this); (0, mouseEventUtils_1._stampTopLevelGridCompWithGridInstance)(this.gos, eGridDiv); this.createManagedBean(new layoutFeature_1.LayoutFeature(this.view)); this.view.setRtlClass(this.gos.get('enableRtl') ? 'ag-rtl' : 'ag-ltr'); const unsubscribeFromResize = (0, dom_1._observeResize)(this.beans, this.eGridHostDiv, this.onGridSizeChanged.bind(this)); this.addDestroyFunc(() => unsubscribeFromResize()); ctrlsSvc.register('gridCtrl', this); } isDetailGrid() { const el = (0, focus_1._findTabbableParent)(this.getGui()); return el?.getAttribute('row-id')?.startsWith('detail') || false; } getOptionalSelectors() { const beans = this.beans; return { paginationSelector: beans.pagination?.getPaginationSelector(), gridHeaderDropZonesSelector: beans.registry.getSelector('AG-GRID-HEADER-DROP-ZONES'), sideBarSelector: beans.sideBar?.getSelector(), statusBarSelector: beans.registry?.getSelector('AG-STATUS-BAR'), watermarkSelector: beans.licenseManager?.getWatermarkSelector(), }; } onGridSizeChanged() { this.eventSvc.dispatchEvent({ type: 'gridSizeChanged', clientWidth: this.eGridHostDiv.clientWidth, clientHeight: this.eGridHostDiv.clientHeight, }); } destroyGridUi() { this.view.destroyGridUi(); } getGui() { return this.eGui; } setResizeCursor(on) { this.view.setCursor(on ? 'ew-resize' : null); } disableUserSelect(on) { this.view.setUserSelect(on ? 'none' : null); } focusNextInnerContainer(backwards) { const focusableContainers = this.getFocusableContainers(); const { indexWithFocus, nextIndex } = this.getNextFocusableIndex(focusableContainers, backwards); if (nextIndex < 0 || nextIndex >= focusableContainers.length) { return false; } if (nextIndex === 0) { if (indexWithFocus > 0) { const { visibleCols, focusSvc } = this.beans; const allColumns = visibleCols.allCols; const lastColumn = (0, array_1._last)(allColumns); if (focusSvc.focusGridView({ column: lastColumn, backwards: true })) { return true; } } return false; } return this.focusContainer(focusableContainers[nextIndex], backwards); } focusInnerElement(fromBottom) { const userCallbackFunction = this.gos.getCallback('focusGridInnerElement'); if (userCallbackFunction && userCallbackFunction({ fromBottom: !!fromBottom })) { return true; } const focusableContainers = this.getFocusableContainers(); const { focusSvc, visibleCols } = this.beans; const allColumns = visibleCols.allCols; if (fromBottom) { if (focusableContainers.length > 1) { return this.focusContainer((0, array_1._last)(focusableContainers), fromBottom); } const lastColumn = (0, array_1._last)(allColumns); if (focusSvc.focusGridView({ column: lastColumn, backwards: fromBottom })) { return true; } } if (this.gos.get('headerHeight') === 0 || (0, focus_1._isHeaderFocusSuppressed)(this.beans)) { if (focusSvc.focusGridView({ column: allColumns[0], backwards: fromBottom })) { return true; } for (let i = 1; i < focusableContainers.length; i++) { if ((0, focus_1._focusInto)(focusableContainers[i].getGui(), fromBottom)) { return true; } } return false; } return focusSvc.focusFirstHeader(); } forceFocusOutOfContainer(up = false) { this.view.forceFocusOutOfContainer(up); } addFocusableContainer(container) { this.additionalFocusableContainers.add(container); } removeFocusableContainer(container) { this.additionalFocusableContainers.delete(container); } allowFocusForNextCoreContainer(up) { const coreContainers = this.view.getFocusableContainers(); const { nextIndex, indexWithFocus } = this.getNextFocusableIndex(coreContainers, up); if (indexWithFocus === -1 || nextIndex < 0 || nextIndex >= coreContainers.length) { return; } const comp = coreContainers[nextIndex]; comp.setAllowFocus?.(true); // we're letting the browser handle the focus here, so need to wait for focus to move into the container before disabling focus again. // can't do this via event, as the container may not have anything focusable. In which case, the focus will just go out of the grid. setTimeout(() => { comp.setAllowFocus?.(false); }); } isFocusable() { const beans = this.beans; return (!(0, focus_1._isCellFocusSuppressed)(beans) || !(0, focus_1._isHeaderFocusSuppressed)(beans) || !!beans.sideBar?.comp?.isDisplayed()); } getNextFocusableIndex(focusableContainers, backwards) { const activeEl = (0, gridOptionsUtils_1._getActiveDomElement)(this.beans); const indexWithFocus = focusableContainers.findIndex((container) => container.getGui().contains(activeEl)); const nextIndex = indexWithFocus + (backwards ? -1 : 1); return { indexWithFocus, nextIndex, }; } focusContainer(comp, up) { comp.setAllowFocus?.(true); const result = (0, focus_1._focusInto)(comp.getGui(), up, false, true); comp.setAllowFocus?.(false); return result; } getFocusableContainers() { return [...this.view.getFocusableContainers(), ...this.additionalFocusableContainers]; } destroy() { this.additionalFocusableContainers.clear(); super.destroy(); } } exports.GridCtrl = GridCtrl; /***/ }), /***/ 1978: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.CommunityCoreModule = void 0; const apiFunctionService_1 = __webpack_require__(3907); const coreApi_1 = __webpack_require__(9875); const columnMoveModule_1 = __webpack_require__(4074); const columnResizeModule_1 = __webpack_require__(6924); const columnGroupModule_1 = __webpack_require__(6041); const columnModel_1 = __webpack_require__(2986); const columnModule_1 = __webpack_require__(2027); const columnNameService_1 = __webpack_require__(8997); const columnViewportService_1 = __webpack_require__(5034); const visibleColsService_1 = __webpack_require__(6869); const cellRendererFunctionModule_1 = __webpack_require__(8414); const registry_1 = __webpack_require__(4110); const userComponentFactory_1 = __webpack_require__(1585); const ctrlsService_1 = __webpack_require__(20); const environment_1 = __webpack_require__(9024); const eventService_1 = __webpack_require__(8778); const focusService_1 = __webpack_require__(5626); const scrollVisibleService_1 = __webpack_require__(8913); const gridDestroyService_1 = __webpack_require__(3888); const gridOptionsService_1 = __webpack_require__(8484); const headerModule_1 = __webpack_require__(8078); const animationFrameModule_1 = __webpack_require__(4011); const touchModule_1 = __webpack_require__(3705); const navigationModule_1 = __webpack_require__(928); const pageBoundsListener_1 = __webpack_require__(2550); const pageBoundsService_1 = __webpack_require__(3003); const pinnedColumnModule_1 = __webpack_require__(6219); const ariaModule_1 = __webpack_require__(3433); const overlayModule_1 = __webpack_require__(5366); const rowContainerHeightService_1 = __webpack_require__(7109); const rowRenderer_1 = __webpack_require__(557); const sortModule_1 = __webpack_require__(6620); const syncService_1 = __webpack_require__(7711); const valueModule_1 = __webpack_require__(6431); const valueService_1 = __webpack_require__(5736); const version_1 = __webpack_require__(7205); /** * @internal */ exports.CommunityCoreModule = { moduleName: 'CommunityCore', version: version_1.VERSION, beans: [ gridDestroyService_1.GridDestroyService, apiFunctionService_1.ApiFunctionService, registry_1.Registry, userComponentFactory_1.UserComponentFactory, rowContainerHeightService_1.RowContainerHeightService, visibleColsService_1.VisibleColsService, eventService_1.EventService, gridOptionsService_1.GridOptionsService, columnModel_1.ColumnModel, pageBoundsService_1.PageBoundsService, pageBoundsListener_1.PageBoundsListener, rowRenderer_1.RowRenderer, valueService_1.ValueService, focusService_1.FocusService, environment_1.Environment, scrollVisibleService_1.ScrollVisibleService, ctrlsService_1.CtrlsService, syncService_1.SyncService, columnNameService_1.ColumnNameService, columnViewportService_1.ColumnViewportService, ], icons: { // icon on select dropdowns (select cell editor, charts tool panels) selectOpen: 'small-down', /** @deprecated v33 */ smallDown: 'small-down', /** @deprecated v33 */ colorPicker: 'color-picker', /** @deprecated v33 */ smallUp: 'small-up', /** @deprecated v33 */ checkboxChecked: 'small-up', /** @deprecated v33 */ checkboxIndeterminate: 'checkbox-indeterminate', /** @deprecated v33 */ checkboxUnchecked: 'checkbox-unchecked', /** @deprecated v33 */ radioButtonOn: 'radio-button-on', /** @deprecated v33 */ radioButtonOff: 'radio-button-off', /** @deprecated v33 */ smallLeft: 'small-left', /** @deprecated v33 */ smallRight: 'small-right', }, apiFunctions: { getGridId: coreApi_1.getGridId, destroy: coreApi_1.destroy, isDestroyed: coreApi_1.isDestroyed, getGridOption: coreApi_1.getGridOption, setGridOption: coreApi_1.setGridOption, updateGridOptions: coreApi_1.updateGridOptions, }, dependsOn: [ columnModule_1.DataTypeModule, columnMoveModule_1.ColumnMoveModule, columnResizeModule_1.ColumnResizeModule, sortModule_1.SortModule, headerModule_1.ColumnHeaderCompModule, columnGroupModule_1.ColumnGroupModule, headerModule_1.ColumnGroupHeaderCompModule, overlayModule_1.OverlayModule, valueModule_1.ChangeDetectionModule, animationFrameModule_1.AnimationFrameModule, navigationModule_1.KeyboardNavigationModule, pinnedColumnModule_1.PinnedColumnModule, ariaModule_1.AriaModule, touchModule_1.TouchModule, cellRendererFunctionModule_1.CellRendererFunctionModule, columnModule_1.ColumnFlexModule, valueModule_1.ExpressionModule, ], }; /***/ }), /***/ 3888: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.GridDestroyService = void 0; const beanStub_1 = __webpack_require__(8731); class GridDestroyService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'gridDestroySvc'; this.destroyCalled = false; } destroy() { // prevent infinite loop if (this.destroyCalled) { return; } const { stateSvc, ctrlsSvc, context } = this.beans; this.eventSvc.dispatchEvent({ type: 'gridPreDestroyed', state: stateSvc?.getState() ?? {}, }); // Set after pre-destroy so user can still use the api in pre-destroy event and it is not marked as destroyed yet. this.destroyCalled = true; // destroy the UI first (as they use the services) ctrlsSvc.get('gridCtrl')?.destroyGridUi(); // destroy the services context.destroy(); super.destroy(); } } exports.GridDestroyService = GridDestroyService; /***/ }), /***/ 5266: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.GRID_OPTION_DEFAULTS = void 0; // Leave untyped. so it can be inferred. Might be possible to type in the future with NoInfer exports.GRID_OPTION_DEFAULTS = { suppressContextMenu: false, preventDefaultOnContextMenu: false, allowContextMenuWithControlKey: false, suppressMenuHide: true, enableBrowserTooltips: false, tooltipTrigger: 'hover', tooltipShowDelay: 2000, tooltipHideDelay: 10000, tooltipMouseTrack: false, tooltipShowMode: 'standard', tooltipInteraction: false, copyHeadersToClipboard: false, copyGroupHeadersToClipboard: false, clipboardDelimiter: '\t', suppressCopyRowsToClipboard: false, suppressCopySingleCellRanges: false, suppressLastEmptyLineOnPaste: false, suppressClipboardPaste: false, suppressClipboardApi: false, suppressCutToClipboard: false, maintainColumnOrder: false, enableStrictPivotColumnOrder: false, suppressFieldDotNotation: false, allowDragFromColumnsToolPanel: false, suppressMovableColumns: false, suppressColumnMoveAnimation: false, suppressMoveWhenColumnDragging: false, suppressDragLeaveHidesColumns: false, suppressRowGroupHidesColumns: false, suppressAutoSize: false, autoSizePadding: 20, skipHeaderOnAutoSize: false, singleClickEdit: false, suppressClickEdit: false, readOnlyEdit: false, stopEditingWhenCellsLoseFocus: false, enterNavigatesVertically: false, enterNavigatesVerticallyAfterEdit: false, enableCellEditingOnBackspace: false, undoRedoCellEditing: false, undoRedoCellEditingLimit: 10, suppressCsvExport: false, suppressExcelExport: false, cacheQuickFilter: false, includeHiddenColumnsInQuickFilter: false, excludeChildrenWhenTreeDataFiltering: false, enableAdvancedFilter: false, includeHiddenColumnsInAdvancedFilter: false, enableCharts: false, masterDetail: false, keepDetailRows: false, keepDetailRowsCount: 10, detailRowAutoHeight: false, tabIndex: 0, rowBuffer: 10, valueCache: false, valueCacheNeverExpires: false, enableCellExpressions: false, suppressTouch: false, suppressFocusAfterRefresh: false, suppressBrowserResizeObserver: false, suppressPropertyNamesCheck: false, suppressChangeDetection: false, debug: false, suppressLoadingOverlay: false, suppressNoRowsOverlay: false, pagination: false, paginationPageSize: 100, paginationPageSizeSelector: true, paginationAutoPageSize: false, paginateChildRows: false, suppressPaginationPanel: false, pivotMode: false, pivotPanelShow: 'never', pivotDefaultExpanded: 0, pivotSuppressAutoColumn: false, suppressExpandablePivotGroups: false, functionsReadOnly: false, suppressAggFuncInHeader: false, alwaysAggregateAtRootLevel: false, aggregateOnlyChangedColumns: false, suppressAggFilteredOnly: false, removePivotHeaderRowWhenSingleValueColumn: false, animateRows: true, cellFlashDuration: 500, cellFadeDuration: 1000, allowShowChangeAfterFilter: false, domLayout: 'normal', ensureDomOrder: false, enableRtl: false, suppressColumnVirtualisation: false, suppressMaxRenderedRowRestriction: false, suppressRowVirtualisation: false, rowDragManaged: false, suppressRowDrag: false, suppressMoveWhenRowDragging: false, rowDragEntireRow: false, rowDragMultiRow: false, embedFullWidthRows: false, groupDisplayType: 'singleColumn', groupDefaultExpanded: 0, groupMaintainOrder: false, groupSelectsChildren: false, groupSuppressBlankHeader: false, groupSelectsFiltered: false, showOpenedGroup: false, groupRemoveSingleChildren: false, groupRemoveLowestSingleChildren: false, groupHideOpenParents: false, groupAllowUnbalanced: false, rowGroupPanelShow: 'never', suppressMakeColumnVisibleAfterUnGroup: false, treeData: false, rowGroupPanelSuppressSort: false, suppressGroupRowsSticky: false, rowModelType: 'clientSide', asyncTransactionWaitMillis: 50, suppressModelUpdateAfterUpdateTransaction: false, cacheOverflowSize: 1, infiniteInitialRowCount: 1, serverSideInitialRowCount: 1, cacheBlockSize: 100, maxBlocksInCache: -1, maxConcurrentDatasourceRequests: 2, blockLoadDebounceMillis: 0, purgeClosedRowNodes: false, serverSideSortAllLevels: false, serverSideOnlyRefreshFilteredGroups: false, serverSidePivotResultFieldSeparator: '_', viewportRowModelPageSize: 5, viewportRowModelBufferSize: 5, alwaysShowHorizontalScroll: false, alwaysShowVerticalScroll: false, debounceVerticalScrollbar: false, suppressHorizontalScroll: false, suppressScrollOnNewData: false, suppressScrollWhenPopupsAreOpen: false, suppressAnimationFrame: false, suppressMiddleClickScrolls: false, suppressPreventDefaultOnMouseWheel: false, rowMultiSelectWithClick: false, suppressRowDeselection: false, suppressRowClickSelection: false, suppressCellFocus: false, suppressHeaderFocus: false, suppressMultiRangeSelection: false, enableCellTextSelection: false, enableRangeSelection: false, enableRangeHandle: false, enableFillHandle: false, fillHandleDirection: 'xy', suppressClearOnFillReduction: false, accentedSort: false, unSortIcon: false, suppressMultiSort: false, alwaysMultiSort: false, suppressMaintainUnsortedOrder: false, suppressRowHoverHighlight: false, suppressRowTransform: false, columnHoverHighlight: false, deltaSort: false, enableGroupEdit: false, groupLockGroupColumns: 0, serverSideEnableClientSideSort: false, suppressServerSideFullWidthLoadingRow: false, pivotMaxGeneratedColumns: -1, columnMenu: 'new', reactiveCustomComponents: true, suppressSetFilterByDefault: false, rowNumbers: false, }; // eslint-disable-next-line @typescript-eslint/no-unused-vars const allValidKeys = true; // eslint-disable-next-line @typescript-eslint/no-unused-vars const allValidValues = 'V'; /***/ }), /***/ 2891: /***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.INITIAL_GRID_OPTION_KEYS = void 0; exports.INITIAL_GRID_OPTION_KEYS = { enableBrowserTooltips: true, tooltipTrigger: true, tooltipMouseTrack: true, tooltipShowMode: true, tooltipInteraction: true, defaultColGroupDef: true, suppressAutoSize: true, skipHeaderOnAutoSize: true, autoSizeStrategy: true, components: true, stopEditingWhenCellsLoseFocus: true, undoRedoCellEditing: true, undoRedoCellEditingLimit: true, excelStyles: true, cacheQuickFilter: true, customChartThemes: true, chartThemeOverrides: true, chartToolPanelsDef: true, loadingCellRendererSelector: true, localeText: true, keepDetailRows: true, keepDetailRowsCount: true, detailRowHeight: true, detailRowAutoHeight: true, tabIndex: true, valueCache: true, valueCacheNeverExpires: true, enableCellExpressions: true, suppressTouch: true, suppressBrowserResizeObserver: true, suppressPropertyNamesCheck: true, debug: true, dragAndDropImageComponent: true, loadingOverlayComponent: true, suppressLoadingOverlay: true, noRowsOverlayComponent: true, paginationPageSizeSelector: true, paginateChildRows: true, pivotPanelShow: true, pivotSuppressAutoColumn: true, suppressExpandablePivotGroups: true, aggFuncs: true, allowShowChangeAfterFilter: true, ensureDomOrder: true, enableRtl: true, suppressColumnVirtualisation: true, suppressMaxRenderedRowRestriction: true, suppressRowVirtualisation: true, rowDragText: true, groupLockGroupColumns: true, suppressGroupRowsSticky: true, rowModelType: true, cacheOverflowSize: true, infiniteInitialRowCount: true, serverSideInitialRowCount: true, maxBlocksInCache: true, maxConcurrentDatasourceRequests: true, blockLoadDebounceMillis: true, serverSideOnlyRefreshFilteredGroups: true, serverSidePivotResultFieldSeparator: true, viewportRowModelPageSize: true, viewportRowModelBufferSize: true, debounceVerticalScrollbar: true, suppressAnimationFrame: true, suppressPreventDefaultOnMouseWheel: true, scrollbarWidth: true, icons: true, suppressRowTransform: true, gridId: true, enableGroupEdit: true, initialState: true, processUnpinnedColumns: true, createChartContainer: true, getLocaleText: true, getRowId: true, reactiveCustomComponents: true, columnMenu: true, suppressSetFilterByDefault: true, getDataPath: true, enableCellSpan: true, }; // eslint-disable-next-line @typescript-eslint/no-unused-vars const allValidKeys = true; /***/ }), /***/ 8484: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.GridOptionsService = void 0; const beanStub_1 = __webpack_require__(8731); const events_1 = __webpack_require__(7968); const gridOptionsDefault_1 = __webpack_require__(5266); const gridOptionsUtils_1 = __webpack_require__(7274); const localEventService_1 = __webpack_require__(5889); const moduleRegistry_1 = __webpack_require__(2132); const function_1 = __webpack_require__(2043); const generic_1 = __webpack_require__(4422); const logging_1 = __webpack_require__(7764); let changeSetId = 0; // this is added to the main DOM element let gridInstanceSequence = 0; class GridOptionsService extends beanStub_1.BeanStub { constructor() { super(...arguments); this.beanName = 'gos'; this.domDataKey = '__AG_' + Math.random().toString(); /** This is only used for the main DOM element */ this.gridInstanceId = gridInstanceSequence++; this.propEventSvc = new localEventService_1.LocalEventService(); // responsible for calling the onXXX functions on gridOptions // It forces events defined in GridOptionsService.alwaysSyncGlobalEvents to be fired synchronously. // This is required for events such as GridPreDestroyed. // Other events can be fired asynchronously or synchronously depending on config. this.globalEventHandlerFactory = (restrictToSyncOnly) => { return (eventName, event) => { // prevent events from being fired _after_ the grid has been destroyed if (!this.isAlive()) { return; } const alwaysSync = events_1.ALWAYS_SYNC_GLOBAL_EVENTS.has(eventName); if ((alwaysSync && !restrictToSyncOnly) || (!alwaysSync && restrictToSyncOnly)) { return; } const eventHandlerName = (0, gridOptionsUtils_1._getCallbackForEvent)(eventName); const eventHandler = this.gridOptions[eventHandlerName]; if (typeof eventHandler === 'function') { this.beans.frameworkOverrides.wrapOutgoing(() => { eventHandler(event); }); } }; }; } wireBeans(beans) { this.gridOptions = beans.gridOptions; this.validation = beans.validation; this.api = beans.gridApi; this.gridId = beans.context.getGridId(); } // This is quicker then having code call gridOptionsService.get('context') get gridOptionsContext() { return this.gridOptions['context']; } postConstruct() { this.eventSvc.addGlobalListener(this.globalEventHandlerFactory().bind(this), true); this.eventSvc.addGlobalListener(this.globalEventHandlerFactory(true).bind(this), false); // Ensure the propertyEventService has framework overrides set so that it can fire events outside of angular this.propEventSvc.setFrameworkOverrides(this.beans.frameworkOverrides); this.addManagedEventListeners({ gridOptionsChanged: ({ options }) => { this.updateGridOptions({ options, force: true, source: 'gridOptionsUpdated' }); }, }); } /** * Get the raw value of the GridOptions property provided. * @param property */ get(property) { return (this.gridOptions[property] ?? gridOptionsDefault_1.GRID_OPTION_DEFAULTS[property]); } /** * Get the GridOption callback but wrapped so that the common params of api and context are automatically applied to the params. * @param property GridOption callback properties based on the fact that this property has a callback with params extending AgGridCommon */ getCallback(property) { return this.mergeGridCommonParams(this.gridOptions[property]); } /** * Returns `true` if a value has been specified for this GridOption. * @param property GridOption property */ exists(property) { return (0, generic_1._exists)(this.gridOptions[property]); } /** * Wrap the user callback and attach the api and context to the params object on the way through. * @param callback User provided callback * @returns Wrapped callback where the params object not require api and context */ mergeGridCommonParams(callback) { if (callback) { const wrapped = (callbackParams) => { return callback(this.addGridCommonParams(callbackParams)); }; return wrapped; } return callback; } updateGridOptions({ options, force, source = 'api', }) { const changeSet = { id: changeSetId++, properties: [] }; // all events are fired after grid options has finished updating. const events = []; const { gridOptions, validation } = this; for (const key of Object.keys(options)) { const value = options[key]; validation?.warnOnInitialPropertyUpdate(source, key); const shouldForce = force || (typeof value === 'object' && source === 'api'); // force objects as they could have been mutated. const previousValue = gridOptions[key]; if (shouldForce || previousValue !== value) { gridOptions[key] = value; const event = { type: key, currentValue: value, previousValue, changeSet, source, }; events.push(event); } } validation?.processGridOptions(this.gridOptions); // changeSet should just include the properties that have changed. changeSet.properties = events.map((event) => event.type); events.forEach((event) => { (0, function_1._logIfDebug)(this, `Updated property ${event.type} from`, event.previousValue, ` to `, event.currentValue); this.propEventSvc.dispatchEvent(event); }); } addPropertyEventListener(key, listener) { this.propEventSvc.addEventListener(key, listener); } removePropertyEventListener(key, listener) { this.propEventSvc.removeEventListener(key, listener); } getDomDataKey() { return this.domDataKey; } /** Prefer _addGridCommonParams from gridOptionsUtils for bundle size savings */ addGridCommonParams(params) { params.api = this.api; params.context = this.gridOptionsContext; return params; } assertModuleRegistered(moduleName, reasonOrId) { const registered = Array.isArray(moduleName) ? moduleName.some((modName) => this.isModuleRegistered(modName)) : this.isModuleRegistered(moduleName); if (!registered) { (0, logging_1._error)(200, { ...this.getModuleErrorParams(), moduleName, reasonOrId, }); } return registered; } getModuleErrorParams() { return { gridId: this.gridId, gridScoped: (0, moduleRegistry_1._areModulesGridScoped)(), rowModelType: this.get('rowModelType'), isUmd: (0, moduleRegistry_1._isUmd)(), }; } isModuleRegistered(moduleName) { return (0, moduleRegistry_1._isModuleRegistered)(moduleName, this.gridId, this.get('rowModelType')); } } exports.GridOptionsService = GridOptionsService; /***/ }), /***/ 7274: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports._isLegacyMenuEnabled = exports._isSetFilterByDefault = exports._getMasterSelects = exports._getGroupSelectsDescendants = exports._getSelectAll = exports._getGroupSelection = exports._getEnableSelectionWithoutKeys = exports._isMultiRowSelection = exports._getRowSelectionMode = exports._getIsRowSelectable = exports._getEnableDeselection = exports._getEnableSelection = exports._getFillHandle = exports._isCellSelectionEnabled = exports._getSuppressMultiRanges = exports._isUsingNewCellSelectionAPI = exports._isUsingNewRowSelectionAPI = exports._getHideDisabledCheckboxes = exports._getCheckboxLocation = exports._getHeaderCheckbox = exports._getCheckboxes = exports._shouldUpdateColVisibilityAfterGroup = exports._getMaxConcurrentDatasourceRequests = exports._canSkipShowingRowGroup = exports._getRowIdCallback = exports._isGroupUseEntireRow = exports._isGroupMultiAutoColumn = exports._getGroupTotalRowCallback = exports._getGrandTotalRow = exports._getGroupAggFiltering = exports._isColumnsSortingCoupledToGroup = exports._isGroupRowsSticky = exports._isAnimateRows = exports._isNothingFocused = exports._anchorElementToMouseMoveEvent = exports._getPageBody = exports._getActiveDomElement = exports._getRootNode = exports._getWindow = exports._getDocument = exports._setDomData = exports._getDomData = exports._getRowHeightAsNumber = exports._getRowHeightForNode = exports._shouldMaintainColumnOrder = exports._isGetRowHeightFunction = exports._isRowSelection = exports._isDomLayout = exports._isServerSideRowModel = exports._isClientSideRowModel = void 0; exports._addGridCommonParams = exports._processOnChange = exports._combineAttributesAndGridOptions = exports._getCallbackForEvent = exports._areAdditionalColumnMenuItemsEnabled = exports._isColumnMenuAnchoringEnabled = void 0; const dom_1 = __webpack_require__(3507); const generic_1 = __webpack_require__(4422); const logging_1 = __webpack_require__(7764); function isRowModelType(gos, rowModelType) { return gos.get('rowModelType') === rowModelType; } function _isClientSideRowModel(gos, rowModel) { return isRowModelType(gos, 'clientSide'); } exports._isClientSideRowModel = _isClientSideRowModel; function _isServerSideRowModel(gos, rowModel) { return isRowModelType(gos, 'serverSide'); } exports._isServerSideRowModel = _isServerSideRowModel; function _isDomLayout(gos, domLayout) { return gos.get('domLayout') === domLayout; } exports._isDomLayout = _isDomLayout; function _isRowSelection(gos) { return _getRowSelectionMode(gos) !== undefined; } exports._isRowSelection = _isRowSelection; function _isGetRowHeightFunction(gos) { return typeof gos.get('getRowHeight') === 'function'; } exports._isGetRowHeightFunction = _isGetRowHeightFunction; function _shouldMaintainColumnOrder(gos, isPivotColumns) { if (isPivotColumns) { return !gos.get('enableStrictPivotColumnOrder'); } return gos.get('maintainColumnOrder'); } exports._shouldMaintainColumnOrder = _shouldMaintainColumnOrder; function _getRowHeightForNode(beans, rowNode, allowEstimate = false, defaultRowHeight) { const { gos, environment } = beans; if (defaultRowHeight == null) { defaultRowHeight = environment.getDefaultRowHeight(); } // check the function first, in case use set both function and // number, when using virtual pagination then function can be // used for pinned rows and the number for the body rows. if (_isGetRowHeightFunction(gos)) { if (allowEstimate) { return { height: defaultRowHeight, estimated: true }; } const params = { node: rowNode, data: rowNode.data, }; const height = gos.getCallback('getRowHeight')(params); if (isNumeric(height)) { if (height === 0) { (0, logging_1._warn)(23); } return { height: Math.max(1, height), estimated: false }; } } if (rowNode.detail && gos.get('masterDetail')) { return getMasterDetailRowHeight(gos); } const gridOptionsRowHeight = gos.get('rowHeight'); const rowHeight = gridOptionsRowHeight && isNumeric(gridOptionsRowHeight) ? gridOptionsRowHeight : defaultRowHeight; return { height: rowHeight, estimated: false }; } exports._getRowHeightForNode = _getRowHeightForNode; function getMasterDetailRowHeight(gos) { // if autoHeight, we want the height to grow to the new height starting at 1, as otherwise a flicker would happen, // as the detail goes to the default (eg 200px) and then immediately shrink up/down to the new measured height // (due to auto height) which looks bad, especially if doing row animation. if (gos.get('detailRowAutoHeight')) { return { height: 1, estimated: false }; } const defaultRowHeight = gos.get('detailRowHeight'); if (isNumeric(defaultRowHeight)) { return { height: defaultRowHeight, estimated: false }; } return { height: 300, estimated: false }; } // we don't allow dynamic row height for virtual paging function _getRowHeightAsNumber(beans) { const { environment, gos } = beans; const gridOptionsRowHeight = gos.get('rowHeight'); if (!gridOptionsRowHeight || (0, generic_1._missing)(gridOptionsRowHeight)) { return environment.getDefaultRowHeight(); } const rowHeight = environment.refreshRowHeightVariable(); if (rowHeight !== -1) { return rowHeight; } (0, logging_1._warn)(24); return environment.getDefaultRowHeight(); } exports._getRowHeightAsNumber = _getRowHeightAsNumber; function isNumeric(value) { return !isNaN(value) && typeof value === 'number' && isFinite(value); } // returns the dom data, or undefined if not found function _getDomData(gos, element, key) { const domData = element[gos.getDomDataKey()]; return domData ? domData[key] : undefined; } exports._getDomData = _getDomData; function _setDomData(gos, element, key, value) { const domDataKey = gos.getDomDataKey(); let domData = element[domDataKey]; if ((0, generic_1._missing)(domData)) { domData = {}; element[domDataKey] = domData; } domData[key] = value; } exports._setDomData = _setDomData; function _getDocument(beans) { // if user is providing document, we use the users one, // otherwise we use the document on the global namespace. const { gos, eGridDiv } = beans; let result = null; const gridOptionsGetDocument = gos.get('getDocument'); if (gridOptionsGetDocument && (0, generic_1._exists)(gridOptionsGetDocument)) { result = gridOptionsGetDocument(); } else if (eGridDiv) { result = eGridDiv.ownerDocument; } if (result && (0, generic_1._exists)(result)) { return result; } return document; } exports._getDocument = _getDocument; function _getWindow(beans) { const eDocument = _getDocument(beans); return eDocument.defaultView || window; } exports._getWindow = _getWindow; function _getRootNode(beans) { return beans.eGridDiv.getRootNode(); } exports._getRootNode = _getRootNode; function _getActiveDomElement(beans) { return _getRootNode(beans).activeElement; } exports._getActiveDomElement = _getActiveDomElement; function _getPageBody(beans) { let rootNode = null; let targetEl = null; try { rootNode = _getDocument(beans).fullscreenElement; } catch (e) { // some environments like SalesForce will throw errors // simply by trying to read the fullscreenElement property } finally { if (!rootNode) { rootNode = _getRootNode(beans); } const body = rootNode.querySelector('body'); if (body) { targetEl = body; } else if (rootNode instanceof ShadowRoot) { targetEl = rootNode; } else if (rootNode instanceof Document) { targetEl = rootNode?.documentElement; } else { targetEl = rootNode; } } return targetEl; } exports._getPageBody = _getPageBody; function _getBodyWidth(beans) { const body = _getPageBody(beans); return body?.clientWidth ?? (window.innerHeight || -1); } function _getBodyHeight(beans) { const body = _getPageBody(beans); return body?.clientHeight ?? (window.innerHeight || -1); } function _anchorElementToMouseMoveEvent(element, mouseMoveEvent, beans) { const eRect = element.getBoundingClientRect(); const height = eRect.height; const browserWidth = _getBodyWidth(beans) - 2; // 2px for 1px borderLeft and 1px borderRight const browserHeight = _getBodyHeight(beans) - 2; // 2px for 1px borderTop and 1px borderBottom const offsetParent = element.offsetParent; if (!offsetParent) { return; } const offsetParentSize = (0, dom_1._getElementRectWithOffset)(element.offsetParent); const { clientY, clientX } = mouseMoveEvent; let top = clientY - offsetParentSize.top - height / 2; let left = clientX - offsetParentSize.left - 10; const eDocument = _getDocument(beans); const win = eDocument.defaultView || window; const windowScrollY = win.pageYOffset || eDocument.documentElement.scrollTop; const windowScrollX = win.pageXOffset || eDocument.documentElement.scrollLeft; // check if the drag and drop image component is not positioned outside of the browser if (browserWidth > 0 && left + element.clientWidth > browserWidth + windowScrollX) { left = browserWidth + windowScrollX - element.clientWidth; } if (left < 0) { left = 0; } if (browserHeight > 0 && top + element.clientHeight > browserHeight + windowScrollY) { top = browserHeight + windowScrollY - element.clientHeight; } if (top < 0) { top = 0; } element.style.left = `${left}px`; element.style.top = `${top}px`; } exports._anchorElementToMouseMoveEvent = _anchorElementToMouseMoveEvent; function _isNothingFocused(beans) { const eDocument = _getDocument(beans); const activeEl = _getActiveDomElement(beans); return activeEl === null || activeEl === eDocument.body; } exports._isNothingFocused = _isNothingFocused; function _isAnimateRows(gos) { // never allow animating if enforcing the row order if (gos.get('ensureDomOrder')) { return false; } return gos.get('animateRows'); } exports._isAnimateRows = _isAnimateRows; function _isGroupRowsSticky(gos) { if (gos.get('paginateChildRows') || gos.get('groupHideOpenParents') || _isDomLayout(gos, 'print')) { return false; } return true; } exports._isGroupRowsSticky = _isGroupRowsSticky; function _isColumnsSortingCoupledToGroup(gos) { const autoGroupColumnDef = gos.get('autoGroupColumnDef'); return !autoGroupColumnDef?.comparator && !gos.get('treeData'); } exports._isColumnsSortingCoupledToGroup = _isColumnsSortingCoupledToGroup; function _getGroupAggFiltering(gos) { const userValue = gos.get('groupAggFiltering'); if (typeof userValue === 'function') { return gos.getCallback('groupAggFiltering'); } if (userValue === true) { return () => true; } return undefined; } exports._getGroupAggFiltering = _getGroupAggFiltering; function _getGrandTotalRow(gos) { return gos.get('grandTotalRow'); } exports._getGrandTotalRow = _getGrandTotalRow; function _getGroupTotalRowCallback(gos) { const userValue = gos.get('groupTotalRow'); if (typeof userValue === 'function') { return gos.getCallback('groupTotalRow'); } return () => userValue ?? undefined; } exports._getGroupTotalRowCallback = _getGroupTotalRowCallback; function _isGroupMultiAutoColumn(gos) { if (gos.exists('groupDisplayType')) { return gos.get('groupDisplayType') === 'multipleColumns'; } // if we are doing hideOpenParents we also show multiple columns, otherwise hideOpenParents would not work return gos.get('groupHideOpenParents'); } exports._isGroupMultiAutoColumn = _isGroupMultiAutoColumn; function _isGroupUseEntireRow(gos, pivotMode) { // we never allow groupDisplayType = 'groupRows' if in pivot mode, otherwise we won't see the pivot values. if (pivotMode) { return false; } return gos.get('groupDisplayType') === 'groupRows'; } exports._isGroupUseEntireRow = _isGroupUseEntireRow; // AG-9259 Can't use `WrappedCallback<'getRowId', ...>` here because of a strange typescript bug function _getRowIdCallback(gos) { const getRowId = gos.getCallback('getRowId'); if (getRowId === undefined) { return getRowId; } return (params) => { let id = getRowId(params); if (typeof id !== 'string') { (0, logging_1._warn)(25, { id }); id = String(id); } return id; }; } exports._getRowIdCallback = _getRowIdCallback; function _canSkipShowingRowGroup(gos, node) { const isSkippingGroups = gos.get('groupHideParentOfSingleChild'); if (isSkippingGroups === true) { return true; } if (isSkippingGroups === 'leafGroupsOnly' && node.leafGroup) { return true; } // deprecated if (gos.get('groupRemoveSingleChildren')) { return true; } if (gos.get('groupRemoveLowestSingleChildren') && node.leafGroup) { return true; } return false; } exports._canSkipShowingRowGroup = _canSkipShowingRowGroup; function _getMaxConcurrentDatasourceRequests(gos) { const res = gos.get('maxConcurrentDatasourceRequests'); // negative number, eg -1, means no max restriction return res > 0 ? res : undefined; } exports._getMaxConcurrentDatasourceRequests = _getMaxConcurrentDatasourceRequests; /** Get the selection checkbox configuration. Defaults to enabled. */ function _shouldUpdateColVisibilityAfterGroup(gos, isGrouped) { const preventVisibilityChanges = gos.get('suppressGroupChangesColumnVisibility'); if (preventVisibilityChanges === true) { return false; } if (isGrouped && preventVisibilityChanges === 'suppressHideOnGroup') { return false; } if (!isGrouped && preventVisibilityChanges === 'suppressShowOnUngroup') { return false; } const legacySuppressOnGroup = gos.get('suppressRowGroupHidesColumns'); if (isGrouped && legacySuppressOnGroup === true) { return false; } const legacySuppressOnUngroup = gos.get('suppressMakeColumnVisibleAfterUnGroup'); if (!isGrouped && legacySuppressOnUngroup === true) { return false; } return true; } exports._shouldUpdateColVisibilityAfterGroup = _shouldUpdateColVisibilityAfterGroup; /** Get the selection checkbox configuration. Defaults to enabled. */ function _getCheckboxes(selection) { return selection?.checkboxes ?? true; } exports._getCheckboxes = _getCheckboxes; /** Get the header checkbox configuration. Defaults to enabled in `multiRow`, otherwise disabled. */ function _getHeaderCheckbox(selection) { return selection?.mode === 'multiRow' && (selection.headerCheckbox ?? true); } exports._getHeaderCheckbox = _getHeaderCheckbox; function _getCheckboxLocation(rowSelection) { if (typeof rowSelection !== 'object') { return undefined; } return rowSelection.checkboxLocation ?? 'selectionColumn'; } exports._getCheckboxLocation = _getCheckboxLocation; /** Get the display configuration for disabled checkboxes. Defaults to displaying disabled checkboxes. */ function _getHideDisabledCheckboxes(selection) { return selection?.hideDisabledCheckboxes ?? false; } exports._getHideDisabledCheckboxes = _getHideDisabledCheckboxes; function _isUsingNewRowSelectionAPI(gos) { const rowSelection = gos.get('rowSelection'); return typeof rowSelection !== 'string'; } exports._isUsingNewRowSelectionAPI = _isUsingNewRowSelectionAPI; function _isUsingNewCellSelectionAPI(gos) { return gos.get('cellSelection') !== undefined; } exports._isUsingNewCellSelectionAPI = _isUsingNewCellSelectionAPI; function _getSuppressMultiRanges(gos) { const selection = gos.get('cellSelection'); const useNewAPI = selection !== undefined; if (!useNewAPI) { return gos.get('suppressMultiRangeSelection'); } return typeof selection !== 'boolean' ? selection?.suppressMultiRanges ?? false : false; } exports._getSuppressMultiRanges = _getSuppressMultiRanges; function _isCellSelectionEnabled(gos) { const selection = gos.get('cellSelection'); const useNewAPI = selection !== undefined; return useNewAPI ? !!selection : gos.get('enableRangeSelection'); } exports._isCellSelectionEnabled = _isCellSelectionEnabled; function _getFillHandle(gos) { const selection = gos.get('cellSelection'); const useNewAPI = selection !== undefined; if (!useNewAPI) { return { mode: 'fill', setFillValue: gos.get('fillOperation'), direction: gos.get('fillHandleDirection'), suppressClearOnFillReduction: gos.get('suppressClearOnFillReduction'), }; } return typeof selection !== 'boolean' && selection.handle?.mode === 'fill' ? selection.handle : undefined; } exports._getFillHandle = _getFillHandle; function _getEnableClickSelection(gos) { const selection = gos.get('rowSelection') ?? 'single'; if (typeof selection === 'string') { const suppressRowClickSelection = gos.get('suppressRowClickSelection'); const suppressRowDeselection = gos.get('suppressRowDeselection'); if (suppressRowClickSelection && suppressRowDeselection) { return false; } else if (suppressRowClickSelection) { return 'enableDeselection'; } else if (suppressRowDeselection) { return 'enableSelection'; } else { return true; } } return selection.mode === 'singleRow' || selection.mode === 'multiRow' ? selection.enableClickSelection ?? false : false; } function _getEnableSelection(gos) { const enableClickSelection = _getEnableClickSelection(gos); return enableClickSelection === true || enableClickSelection === 'enableSelection'; } exports._getEnableSelection = _getEnableSelection; function _getEnableDeselection(gos) { const enableClickSelection = _getEnableClickSelection(gos); return enableClickSelection === true || enableClickSelection === 'enableDeselection'; } exports._getEnableDeselection = _getEnableDeselection; function _getIsRowSelectable(gos) { const selection = gos.get('rowSelection'); if (typeof selection === 'string') { return gos.get('isRowSelectable'); } return selection?.isRowSelectable; } exports._getIsRowSelectable = _getIsRowSelectable; function _getRowSelectionMode(arg) { const selection = 'beanName' in arg && arg.beanName === 'gos' ? arg.get('rowSelection') : arg.rowSelection; if (typeof selection === 'string') { switch (selection) { case 'multiple': return 'multiRow'; case 'single': return 'singleRow'; default: return; } } // only permit expected values for selection mode switch (selection?.mode) { case 'multiRow': case 'singleRow': return selection.mode; default: return; } } exports._getRowSelectionMode = _getRowSelectionMode; function _isMultiRowSelection(arg) { const mode = _getRowSelectionMode(arg); return mode === 'multiRow'; } exports._isMultiRowSelection = _isMultiRowSelection; function _getEnableSelectionWithoutKeys(gos) { const selection = gos.get('rowSelection'); if (typeof selection === 'string') { return gos.get('rowMultiSelectWithClick'); } return selection?.enableSelectionWithoutKeys ?? false; } exports._getEnableSelectionWithoutKeys = _getEnableSelectionWithoutKeys; function _getGroupSelection(gos) { const selection = gos.get('rowSelection'); if (typeof selection === 'string') { const groupSelectsChildren = gos.get('groupSelectsChildren'); const groupSelectsFiltered = gos.get('groupSelectsFiltered'); if (groupSelectsChildren && groupSelectsFiltered) { return 'filteredDescendants'; } else if (groupSelectsChildren) { return 'descendants'; } else { return 'self'; } } return selection?.mode === 'multiRow' ? selection.groupSelects : undefined; } exports._getGroupSelection = _getGroupSelection; function _getSelectAll(gos, defaultValue = true) { const rowSelection = gos.get('rowSelection'); if (typeof rowSelection !== 'object') { return defaultValue ? 'all' : undefined; } return rowSelection.mode === 'multiRow' ? rowSelection.selectAll : 'all'; } exports._getSelectAll = _getSelectAll; function _getGroupSelectsDescendants(gos) { const groupSelection = _getGroupSelection(gos); return groupSelection === 'descendants' || groupSelection === 'filteredDescendants'; } exports._getGroupSelectsDescendants = _getGroupSelectsDescendants; function _getMasterSelects(gos) { const rowSelection = gos.get('rowSelection'); return (typeof rowSelection === 'object' && rowSelection.masterSelects) || 'self'; } exports._getMasterSelects = _getMasterSelects; function _isSetFilterByDefault(gos) { return gos.isModuleRegistered('SetFilter') && !gos.get('suppressSetFilterByDefault'); } exports._isSetFilterByDefault = _isSetFilterByDefault; function _isLegacyMenuEnabled(gos) { return gos.get('columnMenu') === 'legacy'; } exports._isLegacyMenuEnabled = _isLegacyMenuEnabled; function _isColumnMenuAnchoringEnabled(gos) { return !_isLegacyMenuEnabled(gos); } exports._isColumnMenuAnchoringEnabled = _isColumnMenuAnchoringEnabled; function _areAdditionalColumnMenuItemsEnabled(gos) { return gos.get('columnMenu') === 'new'; } exports._areAdditionalColumnMenuItemsEnabled = _areAdditionalColumnMenuItemsEnabled; function _getCallbackForEvent(eventName) { if (!eventName || eventName.length < 2) { return eventName; } return 'on' + eventName[0].toUpperCase() + eventName.substring(1); } exports._getCallbackForEvent = _getCallbackForEvent; /** Combines component props / attributes with the provided gridOptions returning a new combined gridOptions object */ function _combineAttributesAndGridOptions(gridOptions, component, gridOptionsKeys) { // create empty grid options if none were passed if (typeof gridOptions !== 'object') { gridOptions = {}; } // shallow copy (so we don't change the provided object) const mergedOptions = { ...gridOptions }; // Loop through component props, if they are not undefined and a valid gridOption copy to gridOptions gridOptionsKeys.forEach((key) => { const value = component[key]; if (typeof value !== 'undefined') { mergedOptions[key] = value; } }); return mergedOptions; } exports._combineAttributesAndGridOptions = _combineAttributesAndGridOptions; function _processOnChange(changes, api) { if (!changes) { return; } const gridChanges = {}; let hasChanges = false; Object.keys(changes).forEach((key) => { gridChanges[key] = changes[key]; hasChanges = true; }); if (!hasChanges) { return; } const internalUpdateEvent = { type: 'gridOptionsChanged', options: gridChanges, }; api.dispatchEvent(internalUpdateEvent); // copy gridChanges into an event for dispatch const event = { type: 'componentStateChanged', ...gridChanges, }; api.dispatchEvent(event); } exports._processOnChange = _processOnChange; function _addGridCommonParams(gos, params) { return gos.addGridCommonParams(params); } exports._addGridCommonParams = _addGridCommonParams; /***/ }), /***/ 9860: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.AbstractHeaderCellComp = void 0; const component_1 = __webpack_require__(8020); class AbstractHeaderCellComp extends component_1.Component { constructor(template, ctrl) { super(template); this.ctrl = ctrl; } getCtrl() { return this.ctrl; } } exports.AbstractHeaderCellComp = AbstractHeaderCellComp; /***/ }), /***/ 3534: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.AbstractHeaderCellCtrl = exports.DOM_DATA_KEY_HEADER_CTRL = void 0; const beanStub_1 = __webpack_require__(8731); const gridOptionsUtils_1 = __webpack_require__(7274); const animationFrameService_1 = __webpack_require__(2612); const aria_1 = __webpack_require__(5230); const dom_1 = __webpack_require__(3507); const focus_1 = __webpack_require__(2331); const generic_1 = __webpack_require__(4422); const keyCode_1 = __webpack_require__(9853); const cssClassApplier_1 = __webpack_require__(1295); let instanceIdSequence = 0; exports.DOM_DATA_KEY_HEADER_CTRL = 'headerCtrl'; class AbstractHeaderCellCtrl extends beanStub_1.BeanStub { constructor(column, rowCtrl) { super(); this.column = column; this.rowCtrl = rowCtrl; this.resizeToggleTimeout = 0; this.resizeMultiplier = 1; this.resizeFeature = null; this.lastFocusEvent = null; this.dragSource = null; // unique id to this instance, including the column ID to help with debugging in React as it's used in 'key' this.instanceId = (column.getUniqueId() + '-' + instanceIdSequence++); } postConstruct() { const refreshTabIndex = this.refreshTabIndex.bind(this); this.addManagedPropertyListeners(['suppressHeaderFocus'], refreshTabIndex); this.addManagedEventListeners({ overlayExclusiveChanged: refreshTabIndex, }); } shouldStopEventPropagation(event) { const { headerRowIndex, column } = this.beans.focusSvc.focusedHeader; const colDef = column.getDefinition(); const colDefFunc = colDef && colDef.suppressHeaderKeyboardEvent; if (!(0, generic_1._exists)(colDefFunc)) { return false; } const params = (0, gridOptionsUtils_1._addGridCommonParams)(this.gos, { colDef: colDef, column, headerRowIndex, event, }); return !!colDefFunc(params); } getWrapperHasFocus() { const activeEl = (0, gridOptionsUtils_1._getActiveDomElement)(this.beans); return activeEl === this.eGui; } setGui(eGui, compBean) { this.eGui = eGui; this.addDomData(compBean); compBean.addManagedListeners(this.beans.eventSvc, { displayedColumnsChanged: this.onDisplayedColumnsChanged.bind(this), }); compBean.addManagedElementListeners(this.eGui, { focus: this.onGuiFocus.bind(this), }); this.onDisplayedColumnsChanged(); this.refreshTabIndex(); } refreshHeaderStyles() { const colDef = this.column.getDefinition(); if (!colDef) { return; } const { headerStyle } = colDef; let styles; if (typeof headerStyle === 'function') { const cellStyleParams = this.getHeaderClassParams(); styles = headerStyle(cellStyleParams); } else { styles = headerStyle; } if (styles) { this.comp.setUserStyles(styles); } } onGuiFocus() { this.eventSvc.dispatchEvent({ type: 'headerFocused', column: this.column, }); } setupAutoHeight(params) { const { wrapperElement, checkMeasuringCallback, compBean } = params; const { beans } = this; const measureHeight = (timesCalled) => { if (!this.isAlive() || !compBean.isAlive()) { return; } const { paddingTop, paddingBottom, borderBottomWidth, borderTopWidth } = (0, dom_1._getElementSize)(this.eGui); const extraHeight = paddingTop + paddingBottom + borderBottomWidth + borderTopWidth; const wrapperHeight = wrapperElement.offsetHeight; const autoHeight = wrapperHeight + extraHeight; if (timesCalled < 5) { // if not in doc yet, means framework not yet inserted, so wait for next VM turn, // maybe it will be ready next VM turn const doc = (0, gridOptionsUtils_1._getDocument)(beans); const notYetInDom = !doc || !doc.contains(wrapperElement); // this happens in React, where React hasn't put any content in. we say 'possibly' // as a) may not be React and b) the cell could be empty anyway const possiblyNoContentYet = autoHeight == 0; if (notYetInDom || possiblyNoContentYet) { (0, animationFrameService_1._requestAnimationFrame)(beans, () => measureHeight(timesCalled + 1)); return; } } this.setColHeaderHeight(this.column, autoHeight); }; let isMeasuring = false; let stopResizeObserver; const checkMeasuring = () => { const newValue = this.column.isAutoHeaderHeight(); if (newValue && !isMeasuring) { startMeasuring(); } if (!newValue && isMeasuring) { stopMeasuring(); } }; const startMeasuring = () => { isMeasuring = true; measureHeight(0); this.comp.addOrRemoveCssClass('ag-header-cell-auto-height', true); stopResizeObserver = (0, dom_1._observeResize)(this.beans, wrapperElement, () => measureHeight(0)); }; const stopMeasuring = () => { isMeasuring = false; if (stopResizeObserver) { stopResizeObserver(); } this.comp.addOrRemoveCssClass('ag-header-cell-auto-height', false); stopResizeObserver = undefined; }; checkMeasuring(); compBean.addDestroyFunc(() => stopMeasuring()); // In theory we could rely on the resize observer for everything - but since it's debounced // it can be a little janky for smooth movement. in this case its better to react to our own events // And unfortunately we cant _just_ rely on our own events, since custom components can change whenever compBean.addManagedListeners(this.column, { widthChanged: () => isMeasuring && measureHeight(0) }); // Displaying the sort icon changes the available area for text, so sort changes can affect height compBean.addManagedEventListeners({ sortChanged: () => { // Rendering changes for sort, happen after the event... not ideal if (isMeasuring) { window.setTimeout(() => measureHeight(0)); } }, }); if (checkMeasuringCallback) { checkMeasuringCallback(checkMeasuring); } } onDisplayedColumnsChanged() { const { comp, column, beans, eGui } = this; if (!comp || !column || !eGui) { return; } (0, cssClassApplier_1.refreshFirstAndLastStyles)(comp, column, beans.visibleCols); (0, aria_1._setAriaColIndex)(eGui, beans.visibleCols.getAriaColIndex(column)); // for react, we don't use JSX, as it slowed down column moving } addResizeAndMoveKeyboardListeners(compBean) { compBean.addManagedListeners(this.eGui, { keydown: this.onGuiKeyDown.bind(this), keyup: this.onGuiKeyUp.bind(this), }); } refreshTabIndex() { const suppressHeaderFocus = (0, focus_1._isHeaderFocusSuppressed)(this.beans); if (this.eGui) { (0, dom_1._addOrRemoveAttribute)(this.eGui, 'tabindex', suppressHeaderFocus ? null : '-1'); } } onGuiKeyDown(e) { const activeEl = (0, gridOptionsUtils_1._getActiveDomElement)(this.beans); const isLeftOrRight = e.key === keyCode_1.KeyCode.LEFT || e.key === keyCode_1.KeyCode.RIGHT; if (this.isResizing) { e.preventDefault(); e.stopImmediatePropagation(); } if ( // if elements within the header are focused, we don't process the event activeEl !== this.eGui || // if shiftKey and altKey are not pressed, it's cell navigation so we don't process the event (!e.shiftKey && !e.altKey)) { return; } if (this.isResizing || isLeftOrRight) { e.preventDefault(); e.stopImmediatePropagation(); } if (!isLeftOrRight) { return; } const isLeft = (e.key === keyCode_1.KeyCode.LEFT) !== this.gos.get('enableRtl'); const direction = isLeft ? 'left' : 'right'; if (e.altKey) { this.isResizing = true; this.resizeMultiplier += 1; const diff = this.getViewportAdjustedResizeDiff(e); this.resizeHeader(diff, e.shiftKey); this.resizeFeature?.toggleColumnResizing(true); } else { this.moveHeader(direction); } } moveHeader(hDirection) { this.beans.colMoves?.moveHeader(hDirection, this.eGui, this.column, this.rowCtrl.pinned, this); } getViewportAdjustedResizeDiff(e) { const diff = this.getResizeDiff(e); const { pinnedCols } = this.beans; return pinnedCols ? pinnedCols.getHeaderResizeDiff(diff, this.column) : diff; } getResizeDiff(e) { const { gos, column } = this; let isLeft = (e.key === keyCode_1.KeyCode.LEFT) !== gos.get('enableRtl'); const pinned = column.getPinned(); const isRtl = gos.get('enableRtl'); if (pinned) { if (isRtl !== (pinned === 'right')) { isLeft = !isLeft; } } return (isLeft ? -1 : 1) * this.resizeMultiplier; } onGuiKeyUp() { if (!this.isResizing) { return; } if (this.resizeToggleTimeout) { window.clearTimeout(this.resizeToggleTimeout); this.resizeToggleTimeout = 0; } this.isResizing = false; this.resizeMultiplier = 1; this.resizeToggleTimeout = window.setTimeout(() => { this.resizeFeature?.toggleColumnResizing(false); }, 150); } handleKeyDown(e) { const wrapperHasFocus = this.getWrapperHasFocus(); switch (e.key) { case keyCode_1.KeyCode.PAGE_DOWN: case keyCode_1.KeyCode.PAGE_UP: case keyCode_1.KeyCode.PAGE_HOME: case keyCode_1.KeyCode.PAGE_END: if (wrapperHasFocus) { e.preventDefault(); } } } addDomData(compBean) { const key = exports.DOM_DATA_KEY_HEADER_CTRL; const { eGui, gos } = this; (0, gridOptionsUtils_1._setDomData)(gos, eGui, key, this); compBean.addDestroyFunc(() => (0, gridOptionsUtils_1._setDomData)(gos, eGui, key, null)); } focus(event) { const { eGui } = this; if (!eGui) { return false; } this.lastFocusEvent = event || null; eGui.focus(); return true; } focusThis() { this.beans.focusSvc.focusedHeader = { headerRowIndex: this.rowCtrl.rowIndex, column: this.column }; } removeDragSource() { if (this.dragSource) { this.beans.dragAndDrop?.removeDragSource(this.dragSource); this.dragSource = null; } } handleContextMenuMouseEvent(mouseEvent, touchEvent, column) { const event = mouseEvent ?? touchEvent; const { menuSvc, gos } = this.beans; if (gos.get('preventDefaultOnContextMenu')) { event.preventDefault(); } if (menuSvc?.isHeaderContextMenuEnabled(column)) { menuSvc.showHeaderContextMenu(column, mouseEvent, touchEvent); } this.dispatchColumnMouseEvent('columnHeaderContextMenu', column); } dispatchColumnMouseEvent(eventType, column) { this.eventSvc.dispatchEvent({ type: eventType, column, }); } setColHeaderHeight(col, height) { if (!col.setAutoHeaderHeight(height)) { return; } const { eventSvc } = this; if (col.isColumn) { eventSvc.dispatchEvent({ type: 'columnHeaderHeightChanged', column: col, columns: [col], source: 'autosizeColumnHeaderHeight', }); } else { eventSvc.dispatchEvent({ type: 'columnGroupHeaderHeightChanged', columnGroup: col, source: 'autosizeColumnGroupHeaderHeight', }); } } clearComponent() { this.removeDragSource(); this.resizeFeature = null; this.comp = null; this.eGui = null; } destroy() { super.destroy(); this.column = null; this.lastFocusEvent = null; this.rowCtrl = null; } } exports.AbstractHeaderCellCtrl = AbstractHeaderCellCtrl; /***/ }), /***/ 1906: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.HeaderCellComp = void 0; const aria_1 = __webpack_require__(5230); const dom_1 = __webpack_require__(3507); const component_1 = __webpack_require__(8020); const abstractHeaderCellComp_1 = __webpack_require__(9860); class HeaderCellComp extends abstractHeaderCellComp_1.AbstractHeaderCellComp { constructor(ctrl) { super( /* html */ `
`, ctrl); this.eResize = component_1.RefPlaceholder; this.eHeaderCompWrapper = component_1.RefPlaceholder; this.headerCompVersion = 0; } postConstruct() { const eGui = this.getGui(); const setAttribute = (name, value) => { if (value != null && value != '') { eGui.setAttribute(name, value); } else { eGui.removeAttribute(name); } }; setAttribute('col-id', this.ctrl.column.getColId()); const compProxy = { setWidth: (width) => (eGui.style.width = width), addOrRemoveCssClass: (cssClassName, on) => this.addOrRemoveCssClass(cssClassName, on), setUserStyles: (styles) => (0, dom_1._addStylesToElement)(eGui, styles), setAriaSort: (sort) => (sort ? (0, aria_1._setAriaSort)(eGui, sort) : (0, aria_1._removeAriaSort)(eGui)), setUserCompDetails: (compDetails) => this.setUserCompDetails(compDetails), getUserCompInstance: () => this.headerComp, }; this.ctrl.setComp(compProxy, this.getGui(), this.eResize, this.eHeaderCompWrapper, undefined); const selectAllGui = this.ctrl.getSelectAllGui(); if (selectAllGui) { this.eResize.insertAdjacentElement('afterend', selectAllGui); } } destroy() { this.destroyHeaderComp(); super.destroy(); } destroyHeaderComp() { if (this.headerComp) { this.eHeaderCompWrapper.removeChild(this.headerCompGui); this.headerComp = this.destroyBean(this.headerComp); this.headerCompGui = undefined; } } setUserCompDetails(compDetails) { this.headerCompVersion++; const versionCopy = this.headerCompVersion; compDetails.newAgStackInstance().then((comp) => this.afterCompCreated(versionCopy, comp)); } afterCompCreated(version, headerComp) { if (version != this.headerCompVersion || !this.isAlive()) { this.destroyBean(headerComp); return; } this.destroyHeaderComp(); this.headerComp = headerComp; this.headerCompGui = headerComp.getGui(); this.eHeaderCompWrapper.appendChild(this.headerCompGui); this.ctrl.setDragSource(this.getGui()); } } exports.HeaderCellComp = HeaderCellComp; /***/ }), /***/ 260: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.HeaderCellCtrl = void 0; const emptyBean_1 = __webpack_require__(3789); const userCompUtils_1 = __webpack_require__(2036); const keyCode_1 = __webpack_require__(9853); const gridOptionsUtils_1 = __webpack_require__(7274); const iColumn_1 = __webpack_require__(2783); const setLeftFeature_1 = __webpack_require__(8703); const aria_1 = __webpack_require__(5230); const dom_1 = __webpack_require__(3507); const focus_1 = __webpack_require__(2331); const managedFocusFeature_1 = __webpack_require__(1772); const headerUtils_1 = __webpack_require__(1323); const abstractHeaderCellCtrl_1 = __webpack_require__(3534); const cssClassApplier_1 = __webpack_require__(1295); class HeaderCellCtrl extends abstractHeaderCellCtrl_1.AbstractHeaderCellCtrl { constructor() { super(...arguments); this.refreshFunctions = {}; this.userHeaderClasses = new Set(); this.ariaDescriptionProperties = new Map(); } setComp(comp, eGui, eResize, eHeaderCompWrapper, compBeanInput) { this.comp = comp; const { rowCtrl, column, beans } = this; const { colResize, context, colHover, rangeSvc } = beans; const compBean = (0, emptyBean_1.setupCompBean)(this, context, compBeanInput); this.setGui(eGui, compBean); this.updateState(); this.setupWidth(compBean); this.setupMovingCss(compBean); this.setupMenuClass(compBean); this.setupSortableClass(compBean); this.setupWrapTextClass(); this.refreshSpanHeaderHeight(); this.setupAutoHeight({ wrapperElement: eHeaderCompWrapper, checkMeasuringCallback: (checkMeasuring) => this.setRefreshFunction('measuring', checkMeasuring), compBean, }); this.addColumnHoverListener(compBean); this.setupFilterClass(compBean); this.setupStylesFromColDef(); this.setupClassesFromColDef(); this.setupTooltip(); this.addActiveHeaderMouseListeners(compBean); this.setupSelectAll(compBean); this.setupUserComp(); this.refreshAria(); if (colResize) { this.resizeFeature = compBean.createManagedBean(colResize.createResizeFeature(rowCtrl.pinned, column, eResize, comp, this)); } else { (0, dom_1._setDisplayed)(eResize, false); } colHover?.createHoverFeature(compBean, [column], eGui); rangeSvc?.createRangeHighlightFeature(compBean, column, comp); compBean.createManagedBean(new setLeftFeature_1.SetLeftFeature(column, eGui, beans)); compBean.createManagedBean(new managedFocusFeature_1.ManagedFocusFeature(eGui, { shouldStopEventPropagation: (e) => this.shouldStopEventPropagation(e), onTabKeyDown: () => null, handleKeyDown: this.handleKeyDown.bind(this), onFocusIn: this.onFocusIn.bind(this), onFocusOut: this.onFocusOut.bind(this), })); this.addResizeAndMoveKeyboardListeners(compBean); compBean.addManagedPropertyListeners(['suppressMovableColumns', 'suppressMenuHide', 'suppressAggFuncInHeader', 'enableAdvancedFilter'], () => this.refresh()); compBean.addManagedListeners(column, { colDefChanged: () => this.refresh() }); compBean.addManagedListeners(column, { headerHighlightChanged: this.onHeaderHighlightChanged.bind(this) }); const listener = () => this.checkDisplayName(); compBean.addManagedEventListeners({ columnValueChanged: listener, columnRowGroupChanged: listener, columnPivotChanged: listener, headerHeightChanged: this.onHeaderHeightChanged.bind(this), }); compBean.addDestroyFunc(() => { this.refreshFunctions = {}; this.selectAllFeature = null; this.dragSourceElement = undefined; this.userCompDetails = null; this.userHeaderClasses.clear(); this.ariaDescriptionProperties.clear(); // Make sure this is the last destroy func as it clears the gui and comp this.clearComponent(); }); } resizeHeader(delta, shiftKey) { this.beans.colResize?.resizeHeader(this.column, delta, shiftKey); } getHeaderClassParams() { const { column, beans } = this; const colDef = column.colDef; return (0, gridOptionsUtils_1._addGridCommonParams)(beans.gos, { colDef, column, floatingFilter: false, }); } setupUserComp() { const compDetails = this.lookupUserCompDetails(); if (compDetails) { this.setCompDetails(compDetails); } } setCompDetails(compDetails) { this.userCompDetails = compDetails; this.comp.setUserCompDetails(compDetails); } lookupUserCompDetails() { const params = this.createParams(); const colDef = this.column.getColDef(); return (0, userCompUtils_1._getHeaderCompDetails)(this.beans.userCompFactory, colDef, params); } createParams() { const { menuSvc, sortSvc, colFilter, gos } = this.beans; const params = (0, gridOptionsUtils_1._addGridCommonParams)(gos, { column: this.column, displayName: this.displayName, enableSorting: this.column.isSortable(), enableMenu: this.menuEnabled, enableFilterButton: this.openFilterEnabled && !!menuSvc?.isHeaderFilterButtonEnabled(this.column), enableFilterIcon: !!colFilter && (!this.openFilterEnabled || (0, gridOptionsUtils_1._isLegacyMenuEnabled)(this.gos)), showColumnMenu: (buttonElement, onClosedCallback) => { menuSvc?.showColumnMenu({ column: this.column, buttonElement, positionBy: 'button', onClosedCallback, }); }, showColumnMenuAfterMouseClick: (mouseEvent, onClosedCallback) => { menuSvc?.showColumnMenu({ column: this.column, mouseEvent, positionBy: 'mouse', onClosedCallback, }); }, showFilter: (buttonElement) => { menuSvc?.showFilterMenu({ column: this.column, buttonElement: buttonElement, containerType: 'columnFilter', positionBy: 'button', }); }, progressSort: (multiSort) => { sortSvc?.progressSort(this.column, !!multiSort, 'uiColumnSorted'); }, setSort: (sort, multiSort) => { sortSvc?.setSortForColumn(this.column, sort, !!multiSort, 'uiColumnSorted'); }, eGridHeader: this.eGui, setTooltip: (value, shouldDisplayTooltip) => { gos.assertModuleRegistered('Tooltip', 3); this.setupTooltip(value, shouldDisplayTooltip); }, }); return params; } setupSelectAll(compBean) { const { selectionSvc } = this.beans; if (!selectionSvc) { return; } this.selectAllFeature = compBean.createManagedBean(selectionSvc.createSelectAllFeature(this.column)); this.selectAllFeature.setComp(this); } getSelectAllGui() { return this.selectAllFeature?.getCheckboxGui(); } handleKeyDown(e) { super.handleKeyDown(e); if (e.key === keyCode_1.KeyCode.SPACE) { this.selectAllFeature?.onSpaceKeyDown(e); } if (e.key === keyCode_1.KeyCode.ENTER) { this.onEnterKeyDown(e); } if (e.key === keyCode_1.KeyCode.DOWN && e.altKey) { this.showMenuOnKeyPress(e, false); } } onEnterKeyDown(e) { if (e.ctrlKey || e.metaKey) { this.showMenuOnKeyPress(e, true); } else if (this.sortable) { this.beans.sortSvc?.progressSort(this.column, e.shiftKey, 'uiColumnSorted'); } } showMenuOnKeyPress(e, isFilterShortcut) { const headerComp = this.comp.getUserCompInstance(); if (!isHeaderComp(headerComp)) { return; } // the header comp knows what features are enabled, so let it handle the shortcut if (headerComp.onMenuKeyboardShortcut(isFilterShortcut)) { e.preventDefault(); } } onFocusIn(e) { if (!this.eGui.contains(e.relatedTarget)) { this.focusThis(); this.announceAriaDescription(); } if ((0, focus_1._isKeyboardMode)()) { this.setActiveHeader(true); } } onFocusOut(e) { if (this.eGui.contains(e.relatedTarget)) { return; } this.setActiveHeader(false); } setupTooltip(value, shouldDisplayTooltip) { this.tooltipFeature = this.beans.tooltipSvc?.setupHeaderTooltip(this.tooltipFeature, this, value, shouldDisplayTooltip); } setupStylesFromColDef() { this.setRefreshFunction('headerStyles', this.refreshHeaderStyles.bind(this)); this.refreshHeaderStyles(); } setupClassesFromColDef() { const refreshHeaderClasses = () => { const colDef = this.column.getColDef(); const classes = (0, cssClassApplier_1._getHeaderClassesFromColDef)(colDef, this.gos, this.column, null); const oldClasses = this.userHeaderClasses; this.userHeaderClasses = new Set(classes); classes.forEach((c) => { if (oldClasses.has(c)) { // class already added, no need to apply it, but remove from old set oldClasses.delete(c); } else { // class new since last time, so apply it this.comp.addOrRemoveCssClass(c, true); } }); // now old set only has classes that were applied last time, but not this time, so remove them oldClasses.forEach((c) => this.comp.addOrRemoveCssClass(c, false)); }; this.setRefreshFunction('headerClasses', refreshHeaderClasses); refreshHeaderClasses(); } setDragSource(eSource) { this.dragSourceElement = eSource; this.removeDragSource(); if (!eSource || !this.draggable) { return; } this.dragSource = this.beans.colMoves?.setDragSourceForHeader(eSource, this.column, this.displayName) ?? null; } updateState() { const { menuSvc } = this.beans; this.menuEnabled = !!menuSvc?.isColumnMenuInHeaderEnabled(this.column); this.openFilterEnabled = !!menuSvc?.isFilterMenuInHeaderEnabled(this.column); this.sortable = this.column.isSortable(); this.displayName = this.calculateDisplayName(); this.draggable = this.workOutDraggable(); } setRefreshFunction(name, func) { this.refreshFunctions[name] = func; } refresh() { this.updateState(); this.refreshHeaderComp(); this.refreshAria(); Object.values(this.refreshFunctions).forEach((f) => f()); } refreshHeaderComp() { const newCompDetails = this.lookupUserCompDetails(); if (!newCompDetails) { return; } const compInstance = this.comp.getUserCompInstance(); // only try refresh if old comp exists adn it is the correct type const attemptRefresh = compInstance != null && this.userCompDetails.componentClass == newCompDetails.componentClass; const headerCompRefreshed = attemptRefresh ? this.attemptHeaderCompRefresh(newCompDetails.params) : false; if (headerCompRefreshed) { // we do this as a refresh happens after colDefs change, and it's possible the column has had it's // draggable property toggled. no need to call this if not refreshing, as setDragSource is done // as part of appendHeaderComp this.setDragSource(this.dragSourceElement); } else { this.setCompDetails(newCompDetails); } } attemptHeaderCompRefresh(params) { const headerComp = this.comp.getUserCompInstance(); if (!headerComp) { return false; } // if no refresh method, then we want to replace the headerComp if (!headerComp.refresh) { return false; } const res = headerComp.refresh(params); return res; } calculateDisplayName() { return this.beans.colNames.getDisplayNameForColumn(this.column, 'header', true); } checkDisplayName() { // display name can change if aggFunc different, eg sum(Gold) is now max(Gold) if (this.displayName !== this.calculateDisplayName()) { this.refresh(); } } workOutDraggable() { const colDef = this.column.getColDef(); const isSuppressMovableColumns = this.gos.get('suppressMovableColumns'); const colCanMove = !isSuppressMovableColumns && !colDef.suppressMovable && !colDef.lockPosition; // we should still be allowed drag the column, even if it can't be moved, if the column // can be dragged to a rowGroup or pivot drop zone return !!colCanMove || !!colDef.enableRowGroup || !!colDef.enablePivot; } setupWidth(compBean) { const listener = () => { const columnWidth = this.column.getActualWidth(); this.comp.setWidth(`${columnWidth}px`); }; compBean.addManagedListeners(this.column, { widthChanged: listener }); listener(); } setupMovingCss(compBean) { const listener = () => { // this is what makes the header go dark when it is been moved (gives impression to // user that the column was picked up). this.comp.addOrRemoveCssClass('ag-header-cell-moving', this.column.isMoving()); }; compBean.addManagedListeners(this.column, { movingChanged: listener }); listener(); } setupMenuClass(compBean) { const listener = () => { this.comp?.addOrRemoveCssClass('ag-column-menu-visible', this.column.isMenuVisible()); }; compBean.addManagedListeners(this.column, { menuVisibleChanged: listener }); listener(); } setupSortableClass(compBean) { const updateSortableCssClass = () => { this.comp.addOrRemoveCssClass('ag-header-cell-sortable', !!this.sortable); }; updateSortableCssClass(); this.setRefreshFunction('updateSortable', updateSortableCssClass); compBean.addManagedEventListeners({ sortChanged: this.refreshAriaSort.bind(this) }); } setupFilterClass(compBean) { const listener = () => { const isFilterActive = this.column.isFilterActive(); this.comp.addOrRemoveCssClass('ag-header-cell-filtered', isFilterActive); this.refreshAria(); }; compBean.addManagedListeners(this.column, { filterActiveChanged: listener }); listener(); } setupWrapTextClass() { const listener = () => { const wrapText = !!this.column.getColDef().wrapHeaderText; this.comp.addOrRemoveCssClass('ag-header-cell-wrap-text', wrapText); }; listener(); this.setRefreshFunction('wrapText', listener); } onHeaderHighlightChanged() { const highlighted = this.column.getHighlighted(); const beforeOn = highlighted === iColumn_1.ColumnHighlightPosition.Before; const afterOn = highlighted === iColumn_1.ColumnHighlightPosition.After; this.comp.addOrRemoveCssClass('ag-header-highlight-before', beforeOn); this.comp.addOrRemoveCssClass('ag-header-highlight-after', afterOn); } onDisplayedColumnsChanged() { super.onDisplayedColumnsChanged(); if (!this.isAlive()) { return; } this.onHeaderHeightChanged(); } onHeaderHeightChanged() { this.refreshSpanHeaderHeight(); } refreshSpanHeaderHeight() { const { eGui, column, comp, beans } = this; const groupHeaderHeight = (0, headerUtils_1.getGroupRowsHeight)(this.beans); const isZeroGroupHeight = groupHeaderHeight.reduce((total, next) => (total += next), 0) === 0; comp.addOrRemoveCssClass('ag-header-parent-hidden', isZeroGroupHeight); if (!column.isSpanHeaderHeight()) { eGui.style.removeProperty('top'); eGui.style.removeProperty('height'); comp.addOrRemoveCssClass('ag-header-span-height', false); comp.addOrRemoveCssClass('ag-header-span-total', false); return; } const { numberOfParents, isSpanningTotal } = this.column.getColumnGroupPaddingInfo(); comp.addOrRemoveCssClass('ag-header-span-height', numberOfParents > 0); const headerHeight = (0, headerUtils_1.getColumnHeaderRowHeight)(beans); if (numberOfParents === 0) { // if spanning has stopped then need to reset these values. comp.addOrRemoveCssClass('ag-header-span-total', false); eGui.style.setProperty('top', `0px`); eGui.style.setProperty('height', `${headerHeight}px`); return; } comp.addOrRemoveCssClass('ag-header-span-total', isSpanningTotal); let extraHeight = 0; for (let i = 0; i < numberOfParents; i++) { extraHeight += groupHeaderHeight[groupHeaderHeight.length - 1 - i]; } eGui.style.setProperty('top', `${-extraHeight}px`); eGui.style.setProperty('height', `${headerHeight + extraHeight}px`); } refreshAriaSort() { if (this.sortable) { const translate = this.getLocaleTextFunc(); const sort = this.beans.sortSvc?.getDisplaySortForColumn(this.column) || null; this.comp.setAriaSort((0, aria_1._getAriaSortState)(sort)); this.setAriaDescriptionProperty('sort', translate('ariaSortableColumn', 'Press ENTER to sort')); } else { this.comp.setAriaSort(); this.setAriaDescriptionProperty('sort', null); } } refreshAriaMenu() { if (this.menuEnabled) { const translate = this.getLocaleTextFunc(); this.setAriaDescriptionProperty('menu', translate('ariaMenuColumn', 'Press ALT DOWN to open column menu')); } else { this.setAriaDescriptionProperty('menu', null); } } refreshAriaFilterButton() { if (this.openFilterEnabled && !(0, gridOptionsUtils_1._isLegacyMenuEnabled)(this.gos)) { const translate = this.getLocaleTextFunc(); this.setAriaDescriptionProperty('filterButton', translate('ariaFilterColumn', 'Press CTRL ENTER to open filter')); } else { this.setAriaDescriptionProperty('filterButton', null); } } refreshAriaFiltered() { const translate = this.getLocaleTextFunc(); const isFilterActive = this.column.isFilterActive(); if (isFilterActive) { this.setAriaDescriptionProperty('filter', translate('ariaColumnFiltered', 'Column Filtered')); } else { this.setAriaDescriptionProperty('filter', null); } } setAriaDescriptionProperty(property, value) { if (value != null) { this.ariaDescriptionProperties.set(property, value); } else { this.ariaDescriptionProperties.delete(property); } } announceAriaDescription() { if (!this.eGui.contains((0, gridOptionsUtils_1._getActiveDomElement)(this.beans))) { return; } const ariaDescription = Array.from(this.ariaDescriptionProperties.keys()) // always announce the filter description first .sort((a, b) => (a === 'filter' ? -1 : b.charCodeAt(0) - a.charCodeAt(0))) .map((key) => this.ariaDescriptionProperties.get(key)) .join('. '); this.beans.ariaAnnounce?.announceValue(ariaDescription, 'columnHeader'); } refreshAria() { this.refreshAriaSort(); this.refreshAriaMenu(); this.refreshAriaFilterButton(); this.refreshAriaFiltered(); } addColumnHoverListener(compBean) { this.beans.colHover?.addHeaderColumnHoverListener(compBean, this.comp, this.column); } addActiveHeaderMouseListeners(compBean) { const listener = (e) => this.handleMouseOverChange(e.type === 'mouseenter'); const clickListener = () => { this.setActiveHeader(true); this.dispatchColumnMouseEvent('columnHeaderClicked', this.column); }; const contextMenuListener = (event) => this.handleContextMenuMouseEvent(event, undefined, this.column); compBean.addManagedListeners(this.eGui, { mouseenter: listener, mouseleave: listener, click: clickListener, contextmenu: contextMenuListener, }); } handleMouseOverChange(isMouseOver) { this.setActiveHeader(isMouseOver); this.eventSvc.dispatchEvent({ type: isMouseOver ? 'columnHeaderMouseOver' : 'columnHeaderMouseLeave', column: this.column, }); } setActiveHeader(active) { this.comp.addOrRemoveCssClass('ag-header-active', active); } getAnchorElementForMenu(isFilter) { const headerComp = this.comp.getUserCompInstance(); if (isHeaderComp(headerComp)) { return headerComp.getAnchorElementForMenu(isFilter); } return this.eGui; } destroy() { this.tooltipFeature = this.destroyBean(this.tooltipFeature); super.destroy(); } } exports.HeaderCellCtrl = HeaderCellCtrl; function isHeaderComp(headerComp) { // can't use `instanceof` here as it prevents tree shaking of `HeaderComp` return (typeof headerComp.getAnchorElementForMenu === 'function' && typeof headerComp.onMenuKeyboardShortcut === 'function'); } /***/ }), /***/ 9270: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.HeaderComp = void 0; const userCompUtils_1 = __webpack_require__(2036); const gridOptionsUtils_1 = __webpack_require__(7274); const dom_1 = __webpack_require__(3507); const icon_1 = __webpack_require__(9970); const string_1 = __webpack_require__(7766); const component_1 = __webpack_require__(8020); function getHeaderCompTemplate(includeSortIndicator) { return /* html */ ``; } class HeaderComp extends component_1.Component { constructor() { super(...arguments); this.eFilter = component_1.RefPlaceholder; this.eFilterButton = component_1.RefPlaceholder; this.eSortIndicator = component_1.RefPlaceholder; this.eMenu = component_1.RefPlaceholder; this.eLabel = component_1.RefPlaceholder; this.eText = component_1.RefPlaceholder; /** * Selectors for custom headers templates */ this.eSortOrder = component_1.RefPlaceholder; this.eSortAsc = component_1.RefPlaceholder; this.eSortDesc = component_1.RefPlaceholder; this.eSortMixed = component_1.RefPlaceholder; this.eSortNone = component_1.RefPlaceholder; this.isLoadingInnerComponent = false; } refresh(params) { const oldParams = this.params; this.params = params; // if template changed, then recreate the whole comp, the code required to manage // a changing template is to difficult for what it's worth. if (this.workOutTemplate() != this.currentTemplate || this.workOutShowMenu() != this.currentShowMenu || params.enableSorting != this.currentSort || (this.currentSuppressMenuHide != null && this.shouldSuppressMenuHide() != this.currentSuppressMenuHide) || oldParams.enableFilterButton != params.enableFilterButton || oldParams.enableFilterIcon != params.enableFilterIcon) { return false; } if (this.innerHeaderComponent) { this.innerHeaderComponent.refresh?.(params); } else { this.setDisplayName(params); } return true; } workOutTemplate() { const { params, beans } = this; const template = params.template ?? getHeaderCompTemplate(!!beans.sortSvc); // take account of any newlines & whitespace before/after the actual template return template?.trim ? template.trim() : template; } init(params) { this.params = params; const { sortSvc, touchSvc, rowNumbersSvc, userCompFactory } = this.beans; this.currentTemplate = this.workOutTemplate(); this.setTemplate(this.currentTemplate, sortSvc ? [sortSvc.getSortIndicatorSelector()] : undefined); touchSvc?.setupForHeader(this); this.setMenu(); this.setupSort(); rowNumbersSvc?.setupForHeader(this); this.setupFilterIcon(); this.setupFilterButton(); this.workOutInnerHeaderComponent(userCompFactory, params); this.setDisplayName(params); } workOutInnerHeaderComponent(userCompFactory, params) { const userCompDetails = (0, userCompUtils_1._getInnerHeaderCompDetails)(userCompFactory, params, params); if (!userCompDetails) { return; } this.isLoadingInnerComponent = true; userCompDetails.newAgStackInstance().then((comp) => { this.isLoadingInnerComponent = false; if (!comp) { return; } if (this.isAlive()) { this.innerHeaderComponent = comp; this.eText.appendChild(comp.getGui()); } else { this.destroyBean(comp); } }); } setDisplayName(params) { const { displayName } = params; const oldDisplayName = this.currentDisplayName; this.currentDisplayName = displayName; if (oldDisplayName === displayName || this.innerHeaderComponent || this.isLoadingInnerComponent) { return; } const displayNameSanitised = (0, string_1._escapeString)(displayName, true); this.eText.textContent = displayNameSanitised; } addInIcon(iconName, eParent, column) { if (eParent == null) { return; } const eIcon = (0, icon_1._createIconNoSpan)(iconName, this.beans, column); if (eIcon) { eParent.appendChild(eIcon); } } workOutShowMenu() { return this.params.enableMenu && !!this.beans.menuSvc?.isHeaderMenuButtonEnabled(); } shouldSuppressMenuHide() { return !!this.beans.menuSvc?.isHeaderMenuButtonAlwaysShowEnabled(); } setMenu() { // if no menu provided in template, do nothing if (!this.eMenu) { return; } this.currentShowMenu = this.workOutShowMenu(); if (!this.currentShowMenu) { (0, dom_1._removeFromParent)(this.eMenu); this.eMenu = undefined; return; } const { gos, eMenu, params } = this; const isLegacyMenu = (0, gridOptionsUtils_1._isLegacyMenuEnabled)(gos); this.addInIcon(isLegacyMenu ? 'menu' : 'menuAlt', eMenu, params.column); eMenu.classList.toggle('ag-header-menu-icon', !isLegacyMenu); const currentSuppressMenuHide = this.shouldSuppressMenuHide(); this.currentSuppressMenuHide = currentSuppressMenuHide; this.addManagedElementListeners(eMenu, { click: () => this.showColumnMenu(this.eMenu) }); this.toggleMenuAlwaysShow(currentSuppressMenuHide); } toggleMenuAlwaysShow(alwaysShow) { this.eMenu?.classList.toggle('ag-header-menu-always-show', alwaysShow); } showColumnMenu(element) { const { currentSuppressMenuHide, params } = this; if (!currentSuppressMenuHide) { this.toggleMenuAlwaysShow(true); } params.showColumnMenu(element, () => { if (!currentSuppressMenuHide) { this.toggleMenuAlwaysShow(false); } }); } onMenuKeyboardShortcut(isFilterShortcut) { const { params, gos, beans, eMenu, eFilterButton } = this; const column = params.column; const isLegacyMenuEnabled = (0, gridOptionsUtils_1._isLegacyMenuEnabled)(gos); if (isFilterShortcut && !isLegacyMenuEnabled) { if (beans.menuSvc?.isFilterMenuInHeaderEnabled(column)) { params.showFilter(eFilterButton ?? eMenu ?? this.getGui()); return true; } } else if (params.enableMenu) { this.showColumnMenu(eMenu ?? eFilterButton ?? this.getGui()); return true; } return false; } setupSort() { const { sortSvc } = this.beans; if (!sortSvc) { return; } const { enableSorting, column } = this.params; this.currentSort = enableSorting; // eSortIndicator will not be present when customers provided custom header // templates, in that case, we need to look for provided sort elements and // manually create eSortIndicator. if (!this.eSortIndicator) { this.eSortIndicator = this.createBean(sortSvc.createSortIndicator(true)); const { eSortIndicator, eSortOrder, eSortAsc, eSortDesc, eSortMixed, eSortNone } = this; eSortIndicator.attachCustomElements(eSortOrder, eSortAsc, eSortDesc, eSortMixed, eSortNone); } this.eSortIndicator.setupSort(column); // we set up the indicator prior to the check for whether this column is sortable, as it allows the indicator to // set up the multi sort indicator which can appear irrelevant of whether this column can itself be sorted. // this can occur in the case of a non-sortable group display column. if (!this.currentSort) { return; } sortSvc.setupHeader(this, column, this.eLabel); } setupFilterIcon() { const { eFilter, params } = this; if (!eFilter) { return; } this.configureFilter(params.enableFilterIcon, eFilter, this.onFilterChangedIcon.bind(this), 'filterActive'); } setupFilterButton() { const { eFilterButton, params } = this; if (!eFilterButton) { return; } const configured = this.configureFilter(params.enableFilterButton, eFilterButton, this.onFilterChangedButton.bind(this), 'filter'); if (configured) { this.addManagedElementListeners(eFilterButton, { click: () => params.showFilter(eFilterButton), }); } else { this.eFilterButton = undefined; } } configureFilter(enabled, element, filterChangedCallback, icon) { if (!enabled) { (0, dom_1._removeFromParent)(element); return false; } const column = this.params.column; this.addInIcon(icon, element, column); this.addManagedListeners(column, { filterChanged: filterChangedCallback }); filterChangedCallback(); return true; } onFilterChangedIcon() { const filterPresent = this.params.column.isFilterActive(); (0, dom_1._setDisplayed)(this.eFilter, filterPresent, { skipAriaHidden: true }); } onFilterChangedButton() { const filterPresent = this.params.column.isFilterActive(); this.eFilterButton.classList.toggle('ag-filter-active', filterPresent); } getAnchorElementForMenu(isFilter) { const { eFilterButton, eMenu } = this; if (isFilter) { return eFilterButton ?? eMenu ?? this.getGui(); } return eMenu ?? eFilterButton ?? this.getGui(); } destroy() { super.destroy(); if (this.innerHeaderComponent) { this.destroyBean(this.innerHeaderComponent); this.innerHeaderComponent = undefined; } } } exports.HeaderComp = HeaderComp; /***/ }), /***/ 4312: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.GroupWidthFeature = void 0; const beanStub_1 = __webpack_require__(8731); class GroupWidthFeature extends beanStub_1.BeanStub { constructor(comp, columnGroup) { super(); // the children can change, we keep destroy functions related to listening to the children here this.removeChildListenersFuncs = []; this.columnGroup = columnGroup; this.comp = comp; } postConstruct() { // we need to listen to changes in child columns, as they impact our width this.addListenersToChildrenColumns(); // the children belonging to this group can change, so we need to add and remove listeners as they change this.addManagedListeners(this.columnGroup, { displayedChildrenChanged: this.onDisplayedChildrenChanged.bind(this), }); this.onWidthChanged(); // the child listeners are not tied to this components life-cycle, as children can get added and removed // to the group - hence they are on a different life-cycle. so we must make sure the existing children // listeners are removed when we finally get destroyed this.addDestroyFunc(this.removeListenersOnChildrenColumns.bind(this)); } addListenersToChildrenColumns() { // first destroy any old listeners this.removeListenersOnChildrenColumns(); // now add new listeners to the new set of children const widthChangedListener = this.onWidthChanged.bind(this); this.columnGroup.getLeafColumns().forEach((column) => { column.__addEventListener('widthChanged', widthChangedListener); column.__addEventListener('visibleChanged', widthChangedListener); this.removeChildListenersFuncs.push(() => { column.__removeEventListener('widthChanged', widthChangedListener); column.__removeEventListener('visibleChanged', widthChangedListener); }); }); } removeListenersOnChildrenColumns() { this.removeChildListenersFuncs.forEach((func) => func()); this.removeChildListenersFuncs = []; } onDisplayedChildrenChanged() { this.addListenersToChildrenColumns(); this.onWidthChanged(); } onWidthChanged() { const columnWidth = this.columnGroup.getActualWidth(); this.comp.setWidth(`${columnWidth}px`); this.comp.addOrRemoveCssClass('ag-hidden', columnWidth === 0); } } exports.GroupWidthFeature = GroupWidthFeature; /***/ }), /***/ 7746: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.HeaderGroupCellComp = void 0; const dom_1 = __webpack_require__(3507); const component_1 = __webpack_require__(8020); const abstractHeaderCellComp_1 = __webpack_require__(9860); class HeaderGroupCellComp extends abstractHeaderCellComp_1.AbstractHeaderCellComp { constructor(ctrl) { super( /* html */ `
`, ctrl); this.eResize = component_1.RefPlaceholder; this.eHeaderCompWrapper = component_1.RefPlaceholder; } postConstruct() { const eGui = this.getGui(); const setAttribute = (key, value) => value != undefined ? eGui.setAttribute(key, value) : eGui.removeAttribute(key); eGui.setAttribute('col-id', this.ctrl.column.getUniqueId()); const compProxy = { addOrRemoveCssClass: (cssClassName, on) => this.addOrRemoveCssClass(cssClassName, on), setUserStyles: (styles) => (0, dom_1._addStylesToElement)(eGui, styles), setHeaderWrapperHidden: (hidden) => { if (hidden) { this.eHeaderCompWrapper.style.setProperty('display', 'none'); } else { this.eHeaderCompWrapper.style.removeProperty('display'); } }, setHeaderWrapperMaxHeight: (value) => { if (value != null) { this.eHeaderCompWrapper.style.setProperty('max-height', `${value}px`); } else { this.eHeaderCompWrapper.style.removeProperty('max-height'); } this.eHeaderCompWrapper.classList.toggle('ag-header-cell-comp-wrapper-limited-height', value != null); }, setResizableDisplayed: (displayed) => (0, dom_1._setDisplayed)(this.eResize, displayed), setWidth: (width) => (eGui.style.width = width), setAriaExpanded: (expanded) => setAttribute('aria-expanded', expanded), setUserCompDetails: (details) => this.setUserCompDetails(details), getUserCompInstance: () => this.headerGroupComp, }; this.ctrl.setComp(compProxy, eGui, this.eResize, this.eHeaderCompWrapper, undefined); } setUserCompDetails(details) { details.newAgStackInstance().then((comp) => this.afterHeaderCompCreated(comp)); } afterHeaderCompCreated(headerGroupComp) { const destroyFunc = () => this.destroyBean(headerGroupComp); if (!this.isAlive()) { destroyFunc(); return; } const eGui = this.getGui(); const eHeaderGroupGui = headerGroupComp.getGui(); this.eHeaderCompWrapper.appendChild(eHeaderGroupGui); this.addDestroyFunc(destroyFunc); this.headerGroupComp = headerGroupComp; this.ctrl.setDragSource(eGui); } addOrRemoveHeaderWrapperStyle(style, value) { const { eHeaderCompWrapper } = this; if (value) { eHeaderCompWrapper.style.setProperty(style, value); } else { eHeaderCompWrapper.style.removeProperty(style); } } } exports.HeaderGroupCellComp = HeaderGroupCellComp; /***/ }), /***/ 84: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.HeaderGroupCellCtrl = void 0; const emptyBean_1 = __webpack_require__(3789); const userCompUtils_1 = __webpack_require__(2036); const keyCode_1 = __webpack_require__(9853); const gridOptionsUtils_1 = __webpack_require__(7274); const iColumn_1 = __webpack_require__(2783); const setLeftFeature_1 = __webpack_require__(8703); const array_1 = __webpack_require__(1502); const managedFocusFeature_1 = __webpack_require__(1772); const abstractHeaderCellCtrl_1 = __webpack_require__(3534); const cssClassApplier_1 = __webpack_require__(1295); const groupWidthFeature_1 = __webpack_require__(4312); class HeaderGroupCellCtrl extends abstractHeaderCellCtrl_1.AbstractHeaderCellCtrl { constructor() { super(...arguments); this.onSuppressColMoveChange = () => { if (!this.isAlive() || this.isSuppressMoving()) { this.removeDragSource(); } else { if (!this.dragSource) { this.setDragSource(this.eGui); } } }; } setComp(comp, eGui, eResize, eHeaderCompWrapper, compBean) { const { column, beans } = this; const { context, colNames, colHover, rangeSvc, colResize } = beans; this.comp = comp; compBean = (0, emptyBean_1.setupCompBean)(this, context, compBean); this.setGui(eGui, compBean); this.displayName = colNames.getDisplayNameForColumnGroup(column, 'header'); this.refreshHeaderStyles(); this.addClasses(); this.setupMovingCss(compBean); this.setupExpandable(compBean); this.setupTooltip(); this.setupAutoHeight({ wrapperElement: eHeaderCompWrapper, compBean, }); this.setupUserComp(); this.addHeaderMouseListeners(compBean); this.addManagedPropertyListener('groupHeaderHeight', this.refreshMaxHeaderHeight.bind(this)); this.refreshMaxHeaderHeight(); const pinned = this.rowCtrl.pinned; const leafCols = column.getProvidedColumnGroup().getLeafColumns(); colHover?.createHoverFeature(compBean, leafCols, eGui); rangeSvc?.createRangeHighlightFeature(compBean, column, comp); compBean.createManagedBean(new setLeftFeature_1.SetLeftFeature(column, eGui, beans)); compBean.createManagedBean(new groupWidthFeature_1.GroupWidthFeature(comp, column)); if (colResize) { this.resizeFeature = compBean.createManagedBean(colResize.createGroupResizeFeature(comp, eResize, pinned, column)); } else { comp.setResizableDisplayed(false); } compBean.createManagedBean(new managedFocusFeature_1.ManagedFocusFeature(eGui, { shouldStopEventPropagation: this.shouldStopEventPropagation.bind(this), onTabKeyDown: () => undefined, handleKeyDown: this.handleKeyDown.bind(this), onFocusIn: this.onFocusIn.bind(this), })); this.addHighlightListeners(compBean, leafCols); compBean.addManagedPropertyListener('suppressMovableColumns', this.onSuppressColMoveChange); this.addResizeAndMoveKeyboardListeners(compBean); // Make sure this is the last destroy func as it clears the gui and comp compBean.addDestroyFunc(() => this.clearComponent()); } getHeaderClassParams() { const { column, beans } = this; const colDef = column.getDefinition(); return (0, gridOptionsUtils_1._addGridCommonParams)(beans.gos, { colDef, columnGroup: column, floatingFilter: false, }); } refreshMaxHeaderHeight() { const { gos, comp } = this; const groupHeaderHeight = gos.get('groupHeaderHeight'); if (groupHeaderHeight != null) { if (groupHeaderHeight === 0) { comp.setHeaderWrapperHidden(true); } else { comp.setHeaderWrapperMaxHeight(groupHeaderHeight); } } else { comp.setHeaderWrapperHidden(false); comp.setHeaderWrapperMaxHeight(null); } } addHighlightListeners(compBean, columns) { if (!this.beans.gos.get('suppressMoveWhenColumnDragging')) { return; } for (const column of columns) { compBean.addManagedListeners(column, { headerHighlightChanged: this.onLeafColumnHighlightChanged.bind(this, column), }); } } onLeafColumnHighlightChanged(column) { const displayedColumns = this.column.getDisplayedLeafColumns(); const isFirst = displayedColumns[0] === column; const isLast = (0, array_1._last)(displayedColumns) === column; if (!isFirst && !isLast) { return; } const highlighted = column.getHighlighted(); const isColumnMoveAtThisLevel = !!this.rowCtrl.findHeaderCellCtrl((ctrl) => { return ctrl.column.isMoving(); }); let beforeOn = false; let afterOn = false; if (isColumnMoveAtThisLevel) { const isRtl = this.beans.gos.get('enableRtl'); const isHighlightAfter = highlighted === iColumn_1.ColumnHighlightPosition.After; const isHighlightBefore = highlighted === iColumn_1.ColumnHighlightPosition.Before; if (isFirst) { if (isRtl) { afterOn = isHighlightAfter; } else { beforeOn = isHighlightBefore; } } if (isLast) { if (isRtl) { beforeOn = isHighlightBefore; } else { afterOn = isHighlightAfter; } } } this.comp.addOrRemoveCssClass('ag-header-highlight-before', beforeOn); this.comp.addOrRemoveCssClass('ag-header-highlight-after', afterOn); } resizeHeader(delta, shiftKey) { const { resizeFeature } = this; // check to avoid throwing when a component has not been setup yet (React 18) if (!resizeFeature) { return; } const initialValues = resizeFeature.getInitialValues(shiftKey); resizeFeature.resizeColumns(initialValues, initialValues.resizeStartWidth + delta, 'uiColumnResized', true); } resizeLeafColumnsToFit(source) { // check to avoid throwing when a component has not been setup yet (React 18) this.resizeFeature?.resizeLeafColumnsToFit(source); } setupUserComp() { const { colGroupSvc, userCompFactory, gos } = this.beans; const params = (0, gridOptionsUtils_1._addGridCommonParams)(gos, { displayName: this.displayName, columnGroup: this.column, setExpanded: (expanded) => { colGroupSvc.setColumnGroupOpened(this.column.getProvidedColumnGroup(), expanded, 'gridInitializing'); }, setTooltip: (value, shouldDisplayTooltip) => { gos.assertModuleRegistered('Tooltip', 3); this.setupTooltip(value, shouldDisplayTooltip); }, }); const compDetails = (0, userCompUtils_1._getHeaderGroupCompDetails)(userCompFactory, params); if (compDetails) { this.comp.setUserCompDetails(compDetails); } } addHeaderMouseListeners(compBean) { const listener = (e) => this.handleMouseOverChange(e.type === 'mouseenter'); const clickListener = () => this.dispatchColumnMouseEvent('columnHeaderClicked', this.column.getProvidedColumnGroup()); const contextMenuListener = (event) => this.handleContextMenuMouseEvent(event, undefined, this.column.getProvidedColumnGroup()); compBean.addManagedListeners(this.eGui, { mouseenter: listener, mouseleave: listener, click: clickListener, contextmenu: contextMenuListener, }); } handleMouseOverChange(isMouseOver) { this.eventSvc.dispatchEvent({ type: isMouseOver ? 'columnHeaderMouseOver' : 'columnHeaderMouseLeave', column: this.column.getProvidedColumnGroup(), }); } setupTooltip(value, shouldDisplayTooltip) { this.tooltipFeature = this.beans.tooltipSvc?.setupHeaderGroupTooltip(this.tooltipFeature, this, value, shouldDisplayTooltip); } setupExpandable(compBean) { const providedColGroup = this.column.getProvidedColumnGroup(); this.refreshExpanded(); const listener = this.refreshExpanded.bind(this); compBean.addManagedListeners(providedColGroup, { expandedChanged: listener, expandableChanged: listener, }); } refreshExpanded() { const { column } = this; this.expandable = column.isExpandable(); const expanded = column.isExpanded(); if (this.expandable) { this.comp.setAriaExpanded(expanded ? 'true' : 'false'); } else { this.comp.setAriaExpanded(undefined); } this.refreshHeaderStyles(); } addClasses() { const { column } = this; const colGroupDef = column.getColGroupDef(); const classes = (0, cssClassApplier_1._getHeaderClassesFromColDef)(colGroupDef, this.gos, null, column); // having different classes below allows the style to not have a bottom border // on the group header, if no group is specified if (column.isPadding()) { classes.push('ag-header-group-cell-no-group'); const leafCols = column.getLeafColumns(); if (leafCols.every((col) => col.isSpanHeaderHeight())) { classes.push('ag-header-span-height'); } } else { classes.push('ag-header-group-cell-with-group'); if (colGroupDef?.wrapHeaderText) { classes.push('ag-header-cell-wrap-text'); } } classes.forEach((c) => this.comp.addOrRemoveCssClass(c, true)); } setupMovingCss(compBean) { const { column } = this; const providedColumnGroup = column.getProvidedColumnGroup(); const leafColumns = providedColumnGroup.getLeafColumns(); // function adds or removes the moving css, based on if the col is moving. // this is what makes the header go dark when it is been moved (gives impression to // user that the column was picked up). const listener = () => this.comp.addOrRemoveCssClass('ag-header-cell-moving', column.isMoving()); leafColumns.forEach((col) => { compBean.addManagedListeners(col, { movingChanged: listener }); }); listener(); } onFocusIn(e) { if (!this.eGui.contains(e.relatedTarget)) { this.focusThis(); } } handleKeyDown(e) { super.handleKeyDown(e); const wrapperHasFocus = this.getWrapperHasFocus(); if (!this.expandable || !wrapperHasFocus) { return; } if (e.key === keyCode_1.KeyCode.ENTER) { const column = this.column; const newExpandedValue = !column.isExpanded(); this.beans.colGroupSvc.setColumnGroupOpened(column.getProvidedColumnGroup(), newExpandedValue, 'uiColumnExpanded'); } } // unlike columns, this will only get called once, as we don't react on props on column groups // (we will always destroy and recreate this comp if something changes) setDragSource(eHeaderGroup) { if (!this.isAlive() || this.isSuppressMoving()) { return; } this.removeDragSource(); if (!eHeaderGroup) { return; } this.dragSource = this.beans.colMoves?.setDragSourceForHeader(eHeaderGroup, this.column, this.displayName) ?? null; } isSuppressMoving() { // if any child is fixed, then don't allow moving return (this.gos.get('suppressMovableColumns') || this.column .getLeafColumns() .some((column) => column.getColDef().suppressMovable || column.getColDef().lockPosition)); } destroy() { this.tooltipFeature = this.destroyBean(this.tooltipFeature); super.destroy(); } } exports.HeaderGroupCellCtrl = HeaderGroupCellCtrl; /***/ }), /***/ 4998: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.HeaderGroupComp = void 0; const userCompUtils_1 = __webpack_require__(2036); const dom_1 = __webpack_require__(3507); const event_1 = __webpack_require__(2979); const generic_1 = __webpack_require__(4422); const icon_1 = __webpack_require__(9970); const string_1 = __webpack_require__(7766); const logging_1 = __webpack_require__(7764); const component_1 = __webpack_require__(8020); class HeaderGroupComp extends component_1.Component { constructor() { super(/* html */ ``); this.agOpened = component_1.RefPlaceholder; this.agClosed = component_1.RefPlaceholder; this.agLabel = component_1.RefPlaceholder; this.isLoadingInnerComponent = false; } init(params) { const { userCompFactory } = this.beans; this.params = params; this.checkWarnings(); this.workOutInnerHeaderGroupComponent(userCompFactory, params); this.setupLabel(params); this.addGroupExpandIcon(params); this.setupExpandIcons(); } checkWarnings() { const paramsAny = this.params; if (paramsAny.template) { (0, logging_1._warn)(89); } } workOutInnerHeaderGroupComponent(userCompFactory, params) { const userCompDetails = (0, userCompUtils_1._getInnerHeaderGroupCompDetails)(userCompFactory, params, params); if (!userCompDetails) { return; } this.isLoadingInnerComponent = true; userCompDetails.newAgStackInstance().then((comp) => { this.isLoadingInnerComponent = false; if (!comp) { return; } if (this.isAlive()) { this.innerHeaderGroupComponent = comp; this.agLabel.appendChild(comp.getGui()); } else { this.destroyBean(comp); } }); } setupExpandIcons() { const { agOpened, agClosed, params: { columnGroup }, beans, } = this; this.addInIcon('columnGroupOpened', agOpened); this.addInIcon('columnGroupClosed', agClosed); const expandAction = (event) => { if ((0, event_1._isStopPropagationForAgGrid)(event)) { return; } const newExpandedValue = !columnGroup.isExpanded(); beans.colGroupSvc.setColumnGroupOpened(columnGroup.getProvidedColumnGroup(), newExpandedValue, 'uiColumnExpanded'); }; this.addTouchAndClickListeners(beans, agClosed, expandAction); this.addTouchAndClickListeners(beans, agOpened, expandAction); const stopPropagationAction = (event) => { (0, event_1._stopPropagationForAgGrid)(event); }; // adding stopPropagation to the double click for the icons prevents double click action happening // when the icons are clicked. if the icons are double clicked, then the groups should open and // then close again straight away. if we also listened to double click, then the group would open, // close, then open, which is not what we want. double click should only action if the user double // clicks outside of the icons. this.addManagedElementListeners(agClosed, { dblclick: stopPropagationAction }); this.addManagedElementListeners(agOpened, { dblclick: stopPropagationAction }); this.addManagedElementListeners(this.getGui(), { dblclick: expandAction }); this.updateIconVisibility(); const providedColumnGroup = columnGroup.getProvidedColumnGroup(); const updateIcon = this.updateIconVisibility.bind(this); this.addManagedListeners(providedColumnGroup, { expandedChanged: updateIcon, expandableChanged: updateIcon, }); } addTouchAndClickListeners(beans, eElement, action) { beans.touchSvc?.setupForHeaderGroup(this, eElement, action); this.addManagedElementListeners(eElement, { click: action }); } updateIconVisibility() { const { agOpened, agClosed, params: { columnGroup }, } = this; if (columnGroup.isExpandable()) { const expanded = columnGroup.isExpanded(); (0, dom_1._setDisplayed)(agOpened, expanded); (0, dom_1._setDisplayed)(agClosed, !expanded); } else { (0, dom_1._setDisplayed)(agOpened, false); (0, dom_1._setDisplayed)(agClosed, false); } } addInIcon(iconName, element) { const eIcon = (0, icon_1._createIconNoSpan)(iconName, this.beans, null); if (eIcon) { element.appendChild(eIcon); } } addGroupExpandIcon(params) { if (!params.columnGroup.isExpandable()) { const { agOpened, agClosed } = this; (0, dom_1._setDisplayed)(agOpened, false); (0, dom_1._setDisplayed)(agClosed, false); return; } } setupLabel(params) { // no renderer, default text render const { displayName, columnGroup } = params; const hasInnerComponent = this.innerHeaderGroupComponent || this.isLoadingInnerComponent; if ((0, generic_1._exists)(displayName) && !hasInnerComponent) { const displayNameSanitised = (0, string_1._escapeString)(displayName, true); this.agLabel.textContent = displayNameSanitised; } this.addOrRemoveCssClass('ag-sticky-label', !columnGroup.getColGroupDef()?.suppressStickyLabel); } destroy() { super.destroy(); if (this.innerHeaderGroupComponent) { this.destroyBean(this.innerHeaderGroupComponent); this.innerHeaderGroupComponent = undefined; } } } exports.HeaderGroupComp = HeaderGroupComp; /***/ }), /***/ 1295: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.refreshFirstAndLastStyles = exports._getToolPanelClassesFromColDef = exports._getHeaderClassesFromColDef = void 0; const gridOptionsUtils_1 = __webpack_require__(7274); const generic_1 = __webpack_require__(4422); const CSS_FIRST_COLUMN = 'ag-column-first'; const CSS_LAST_COLUMN = 'ag-column-last'; function _getHeaderClassesFromColDef(abstractColDef, gos, column, columnGroup) { if ((0, generic_1._missing)(abstractColDef)) { return []; } return getColumnClassesFromCollDef(abstractColDef.headerClass, abstractColDef, gos, column, columnGroup); } exports._getHeaderClassesFromColDef = _getHeaderClassesFromColDef; function _getToolPanelClassesFromColDef(abstractColDef, gos, column, columnGroup) { if ((0, generic_1._missing)(abstractColDef)) { return []; } return getColumnClassesFromCollDef(abstractColDef.toolPanelClass, abstractColDef, gos, column, columnGroup); } exports._getToolPanelClassesFromColDef = _getToolPanelClassesFromColDef; function refreshFirstAndLastStyles(comp, column, presentedColsService) { comp.addOrRemoveCssClass(CSS_FIRST_COLUMN, presentedColsService.isColAtEdge(column, 'first')); comp.addOrRemoveCssClass(CSS_LAST_COLUMN, presentedColsService.isColAtEdge(column, 'last')); } exports.refreshFirstAndLastStyles = refreshFirstAndLastStyles; function getClassParams(abstractColDef, gos, column, columnGroup) { return (0, gridOptionsUtils_1._addGridCommonParams)(gos, { // bad naming, as colDef here can be a group or a column, // however most people won't appreciate the difference, // so keeping it as colDef to avoid confusion. colDef: abstractColDef, column: column, columnGroup: columnGroup, }); } function getColumnClassesFromCollDef(classesOrFunc, abstractColDef, gos, column, columnGroup) { if ((0, generic_1._missing)(classesOrFunc)) { return []; } let classToUse; if (typeof classesOrFunc === 'function') { const params = getClassParams(abstractColDef, gos, column, columnGroup); classToUse = classesOrFunc(params); } else { classToUse = classesOrFunc; } if (typeof classToUse === 'string') { return [classToUse]; } if (Array.isArray(classToUse)) { return [...classToUse]; } return []; } /***/ }), /***/ 3290: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.HeaderFilterCellComp = void 0; const dom_1 = __webpack_require__(3507); const component_1 = __webpack_require__(8020); const abstractHeaderCellComp_1 = __webpack_require__(9860); class HeaderFilterCellComp extends abstractHeaderCellComp_1.AbstractHeaderCellComp { constructor(ctrl) { super( /* html */ `
`, ctrl); this.eFloatingFilterBody = component_1.RefPlaceholder; this.eButtonWrapper = component_1.RefPlaceholder; this.eButtonShowMainFilter = component_1.RefPlaceholder; } postConstruct() { const eGui = this.getGui(); const compProxy = { addOrRemoveCssClass: (cssClassName, on) => this.addOrRemoveCssClass(cssClassName, on), setUserStyles: (styles) => (0, dom_1._addStylesToElement)(eGui, styles), addOrRemoveBodyCssClass: (cssClassName, on) => this.eFloatingFilterBody.classList.toggle(cssClassName, on), setButtonWrapperDisplayed: (displayed) => (0, dom_1._setDisplayed)(this.eButtonWrapper, displayed), setCompDetails: (compDetails) => this.setCompDetails(compDetails), getFloatingFilterComp: () => this.compPromise, setWidth: (width) => (eGui.style.width = width), setMenuIcon: (eIcon) => this.eButtonShowMainFilter.appendChild(eIcon), }; this.ctrl.setComp(compProxy, eGui, this.eButtonShowMainFilter, this.eFloatingFilterBody, undefined); } setCompDetails(compDetails) { if (!compDetails) { this.destroyFloatingFilterComp(); this.compPromise = null; return; } // because we are providing defaultFloatingFilterType, we know it will never be undefined; this.compPromise = compDetails.newAgStackInstance(); this.compPromise.then((comp) => this.afterCompCreated(comp)); } destroy() { this.destroyFloatingFilterComp(); super.destroy(); } destroyFloatingFilterComp() { if (this.floatingFilterComp) { this.eFloatingFilterBody.removeChild(this.floatingFilterComp.getGui()); this.floatingFilterComp = this.destroyBean(this.floatingFilterComp); } } afterCompCreated(comp) { if (!comp) { return; } if (!this.isAlive()) { this.destroyBean(comp); return; } this.destroyFloatingFilterComp(); this.floatingFilterComp = comp; this.eFloatingFilterBody.appendChild(comp.getGui()); if (comp.afterGuiAttached) { comp.afterGuiAttached(); } } } exports.HeaderFilterCellComp = HeaderFilterCellComp; /***/ }), /***/ 3868: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.HeaderFilterCellCtrl = void 0; const emptyBean_1 = __webpack_require__(3789); const keyCode_1 = __webpack_require__(9853); const gridOptionsUtils_1 = __webpack_require__(7274); const setLeftFeature_1 = __webpack_require__(8703); const aria_1 = __webpack_require__(5230); const dom_1 = __webpack_require__(3507); const focus_1 = __webpack_require__(2331); const icon_1 = __webpack_require__(9970); const managedFocusFeature_1 = __webpack_require__(1772); const abstractHeaderCellCtrl_1 = __webpack_require__(3534); class HeaderFilterCellCtrl extends abstractHeaderCellCtrl_1.AbstractHeaderCellCtrl { constructor() { super(...arguments); this.iconCreated = false; } setComp(comp, eGui, eButtonShowMainFilter, eFloatingFilterBody, compBeanInput) { this.comp = comp; const compBean = (0, emptyBean_1.setupCompBean)(this, this.beans.context, compBeanInput); this.eButtonShowMainFilter = eButtonShowMainFilter; this.eFloatingFilterBody = eFloatingFilterBody; this.setGui(eGui, compBean); this.setupActive(); this.refreshHeaderStyles(); this.setupWidth(compBean); this.setupLeft(compBean); this.setupHover(compBean); this.setupFocus(compBean); this.setupAria(); this.setupFilterButton(); this.setupUserComp(); this.setupSyncWithFilter(compBean); this.setupUi(); compBean.addManagedElementListeners(this.eButtonShowMainFilter, { click: this.showParentFilter.bind(this) }); this.setupFilterChangedListener(compBean); compBean.addManagedListeners(this.column, { colDefChanged: () => this.onColDefChanged(compBean) }); // Make sure this is the last destroy func as it clears the gui and comp compBean.addDestroyFunc(() => { this.eButtonShowMainFilter = null; this.eFloatingFilterBody = null; this.userCompDetails = null; this.clearComponent(); }); } // empty abstract method resizeHeader() { } moveHeader() { // doesn't support move } getHeaderClassParams() { const { column, beans } = this; const colDef = column.colDef; return (0, gridOptionsUtils_1._addGridCommonParams)(beans.gos, { colDef, column, floatingFilter: true, }); } setupActive() { const colDef = this.column.getColDef(); const filterExists = !!colDef.filter; const floatingFilterExists = !!colDef.floatingFilter; this.active = filterExists && floatingFilterExists; } setupUi() { this.comp.setButtonWrapperDisplayed(!this.suppressFilterButton && this.active); this.comp.addOrRemoveBodyCssClass('ag-floating-filter-full-body', this.suppressFilterButton); this.comp.addOrRemoveBodyCssClass('ag-floating-filter-body', !this.suppressFilterButton); if (!this.active || this.iconCreated) { return; } const eMenuIcon = (0, icon_1._createIconNoSpan)('filter', this.beans, this.column); if (eMenuIcon) { this.iconCreated = true; this.eButtonShowMainFilter.appendChild(eMenuIcon); } } setupFocus(compBean) { compBean.createManagedBean(new managedFocusFeature_1.ManagedFocusFeature(this.eGui, { shouldStopEventPropagation: this.shouldStopEventPropagation.bind(this), onTabKeyDown: this.onTabKeyDown.bind(this), handleKeyDown: this.handleKeyDown.bind(this), onFocusIn: this.onFocusIn.bind(this), })); } setupAria() { const localeTextFunc = this.getLocaleTextFunc(); (0, aria_1._setAriaLabel)(this.eButtonShowMainFilter, localeTextFunc('ariaFilterMenuOpen', 'Open Filter Menu')); } onTabKeyDown(e) { const { beans } = this; const activeEl = (0, gridOptionsUtils_1._getActiveDomElement)(beans); const wrapperHasFocus = activeEl === this.eGui; if (wrapperHasFocus) { return; } const nextFocusableEl = (0, focus_1._findNextFocusableElement)(beans, this.eGui, null, e.shiftKey); if (nextFocusableEl) { beans.headerNavigation?.scrollToColumn(this.column); e.preventDefault(); nextFocusableEl.focus(); return; } const nextFocusableColumn = this.findNextColumnWithFloatingFilter(e.shiftKey); if (!nextFocusableColumn) { return; } if (beans.focusSvc.focusHeaderPosition({ headerPosition: { headerRowIndex: this.rowCtrl.rowIndex, column: nextFocusableColumn, }, event: e, })) { e.preventDefault(); } } findNextColumnWithFloatingFilter(backwards) { const presentedColsService = this.beans.visibleCols; let nextCol = this.column; do { nextCol = backwards ? presentedColsService.getColBefore(nextCol) : presentedColsService.getColAfter(nextCol); if (!nextCol) { break; } } while (!nextCol.getColDef().filter || !nextCol.getColDef().floatingFilter); return nextCol; } handleKeyDown(e) { super.handleKeyDown(e); const wrapperHasFocus = this.getWrapperHasFocus(); switch (e.key) { case keyCode_1.KeyCode.UP: case keyCode_1.KeyCode.DOWN: if (!wrapperHasFocus) { e.preventDefault(); } // eslint-disable-next-line no-fallthrough case keyCode_1.KeyCode.LEFT: case keyCode_1.KeyCode.RIGHT: if (wrapperHasFocus) { return; } e.stopPropagation(); // eslint-disable-next-line no-fallthrough case keyCode_1.KeyCode.ENTER: if (wrapperHasFocus) { if ((0, focus_1._focusInto)(this.eGui)) { e.preventDefault(); } } break; case keyCode_1.KeyCode.ESCAPE: if (!wrapperHasFocus) { this.eGui.focus(); } } } onFocusIn(e) { const isRelatedWithin = this.eGui.contains(e.relatedTarget); // when the focus is already within the component, // we default to the browser's behavior if (isRelatedWithin) { return; } const notFromHeaderWrapper = !!e.relatedTarget && !e.relatedTarget.classList.contains('ag-floating-filter'); const fromWithinHeader = !!e.relatedTarget && (0, dom_1._isElementChildOfClass)(e.relatedTarget, 'ag-floating-filter'); if (notFromHeaderWrapper && fromWithinHeader && e.target === this.eGui) { const lastFocusEvent = this.lastFocusEvent; const fromTab = !!(lastFocusEvent && lastFocusEvent.key === keyCode_1.KeyCode.TAB); if (lastFocusEvent && fromTab) { const shouldFocusLast = lastFocusEvent.shiftKey; (0, focus_1._focusInto)(this.eGui, shouldFocusLast); } } this.focusThis(); } setupHover(compBean) { this.beans.colHover?.addHeaderFilterColumnHoverListener(compBean, this.comp, this.column, this.eGui); } setupLeft(compBean) { const setLeftFeature = new setLeftFeature_1.SetLeftFeature(this.column, this.eGui, this.beans); compBean.createManagedBean(setLeftFeature); } setupFilterButton() { this.suppressFilterButton = !this.beans.menuSvc?.isFloatingFilterButtonEnabled(this.column); this.highlightFilterButtonWhenActive = !(0, gridOptionsUtils_1._isLegacyMenuEnabled)(this.gos); } setupUserComp() { if (!this.active) { return; } const compDetails = this.beans.filterManager?.getFloatingFilterCompDetails(this.column, () => this.showParentFilter()); if (compDetails) { this.setCompDetails(compDetails); } } setCompDetails(compDetails) { this.userCompDetails = compDetails; this.comp.setCompDetails(compDetails); } showParentFilter() { const eventSource = this.suppressFilterButton ? this.eFloatingFilterBody : this.eButtonShowMainFilter; this.beans.menuSvc?.showFilterMenu({ column: this.column, buttonElement: eventSource, containerType: 'floatingFilter', positionBy: 'button', }); } setupSyncWithFilter(compBean) { if (!this.active) { return; } const { filterManager } = this.beans; const syncWithFilter = (event) => { if (event?.source === 'filterDestroyed' && !this.isAlive()) { return; } const compPromise = this.comp.getFloatingFilterComp(); if (!compPromise) { return; } compPromise.then((comp) => { if (comp) { const parentModel = filterManager?.getCurrentFloatingFilterParentModel(this.column); const filterChangedEvent = event ? { // event can have additional params like `afterDataChange` which need to be passed through ...event, columns: event.columns ?? [], source: event.source === 'api' ? 'api' : 'columnFilter', } : null; comp.onParentModelChanged(parentModel, filterChangedEvent); } }); }; [this.destroySyncListener] = compBean.addManagedListeners(this.column, { filterChanged: syncWithFilter }); if (filterManager?.isFilterActive(this.column)) { syncWithFilter(null); } } setupWidth(compBean) { const listener = () => { const width = `${this.column.getActualWidth()}px`; this.comp.setWidth(width); }; compBean.addManagedListeners(this.column, { widthChanged: listener }); listener(); } setupFilterChangedListener(compBean) { if (this.active) { [this.destroyFilterChangedListener] = compBean.addManagedListeners(this.column, { filterChanged: this.updateFilterButton.bind(this), }); this.updateFilterButton(); } } updateFilterButton() { if (!this.suppressFilterButton && this.comp) { const isFilterAllowed = !!this.beans.filterManager?.isFilterAllowed(this.column); this.comp.setButtonWrapperDisplayed(isFilterAllowed); if (this.highlightFilterButtonWhenActive && isFilterAllowed) { this.eButtonShowMainFilter.classList.toggle('ag-filter-active', this.column.isFilterActive()); } } } onColDefChanged(compBean) { const wasActive = this.active; this.setupActive(); const becomeActive = !wasActive && this.active; if (wasActive && !this.active) { this.destroySyncListener(); this.destroyFilterChangedListener(); } const newCompDetails = this.active ? this.beans.filterManager?.getFloatingFilterCompDetails(this.column, () => this.showParentFilter()) : null; const compPromise = this.comp.getFloatingFilterComp(); if (!compPromise || !newCompDetails) { this.updateCompDetails(compBean, newCompDetails, becomeActive); } else { compPromise.then((compInstance) => { if (!compInstance || this.beans.filterManager?.areFilterCompsDifferent(this.userCompDetails ?? null, newCompDetails)) { this.updateCompDetails(compBean, newCompDetails, becomeActive); } else { this.updateFloatingFilterParams(newCompDetails); } }); } } updateCompDetails(compBean, compDetails, becomeActive) { if (!this.isAlive()) { return; } this.setCompDetails(compDetails); // filter button and UI can change based on params, so always want to update this.setupFilterButton(); this.setupUi(); if (becomeActive) { this.setupSyncWithFilter(compBean); this.setupFilterChangedListener(compBean); } } updateFloatingFilterParams(userCompDetails) { if (!userCompDetails) { return; } const params = userCompDetails.params; this.comp.getFloatingFilterComp()?.then((floatingFilter) => { if (floatingFilter?.refresh && typeof floatingFilter.refresh === 'function') { floatingFilter.refresh(params); // framework wrapper always implements optional methods, but returns null if no underlying method } }); } addResizeAndMoveKeyboardListeners() { // do nothing } destroy() { super.destroy(); this.destroySyncListener = null; this.destroyFilterChangedListener = null; } } exports.HeaderFilterCellCtrl = HeaderFilterCellCtrl; /***/ }), /***/ 8078: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ColumnGroupHeaderCompModule = exports.ColumnHeaderCompModule = void 0; const version_1 = __webpack_require__(7205); const headerComp_1 = __webpack_require__(9270); const headerGroupComp_1 = __webpack_require__(4998); /** * @feature Columns -> Column Header * @colDef headerComponent */ exports.ColumnHeaderCompModule = { moduleName: 'ColumnHeaderComp', version: version_1.VERSION, userComponents: { agColumnHeader: headerComp_1.HeaderComp, }, icons: { // button to launch legacy column menu menu: 'menu', // button to launch new enterprise column menu menuAlt: 'menu-alt', }, }; /** * @feature Columns -> Column Groups * @colGroupDef headerGroupComponent */ exports.ColumnGroupHeaderCompModule = { moduleName: 'ColumnGroupHeaderComp', version: version_1.VERSION, userComponents: { agColumnGroupHeader: headerGroupComp_1.HeaderGroupComp, }, icons: { // header column group shown when expanded (click to contract) columnGroupOpened: 'expanded', // header column group shown when contracted (click to expand) columnGroupClosed: 'contracted', }, }; /***/ }), /***/ 1172: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.GridHeaderSelector = exports.GridHeaderComp = void 0; const component_1 = __webpack_require__(8020); const gridHeaderCtrl_1 = __webpack_require__(9); const headerRowContainerComp_1 = __webpack_require__(7260); class GridHeaderComp extends component_1.Component { constructor() { super(/* html */ `