var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod2) => __copyProps(__defProp({}, "__esModule", { value: true }), mod2);
// packages/ag-grid-community/src/main.ts
var main_exports = {};
__export(main_exports, {
ALWAYS_SYNC_GLOBAL_EVENTS: () => ALWAYS_SYNC_GLOBAL_EVENTS,
AbstractClientSideNodeManager: () => AbstractClientSideNodeManager,
AgAbstractInputField: () => AgAbstractInputField,
AgAbstractLabel: () => AgAbstractLabel,
AgCheckbox: () => AgCheckbox,
AgCheckboxSelector: () => AgCheckboxSelector,
AgColumn: () => AgColumn,
AgColumnGroup: () => AgColumnGroup,
AgInputDateField: () => AgInputDateField,
AgInputNumberField: () => AgInputNumberField,
AgInputNumberFieldSelector: () => AgInputNumberFieldSelector,
AgInputTextArea: () => AgInputTextArea,
AgInputTextField: () => AgInputTextField,
AgInputTextFieldSelector: () => AgInputTextFieldSelector,
AgPickerField: () => AgPickerField,
AgPromise: () => AgPromise,
AgProvidedColumnGroup: () => AgProvidedColumnGroup,
AgRadioButton: () => AgRadioButton,
AgSelect: () => AgSelect,
AgSelectSelector: () => AgSelectSelector,
AgToggleButton: () => AgToggleButton,
AgToggleButtonSelector: () => AgToggleButtonSelector,
AlignedGridsModule: () => AlignedGridsModule,
AllCommunityModule: () => AllCommunityModule,
AutoScrollService: () => AutoScrollService,
BaseColsService: () => BaseColsService,
BaseComponentWrapper: () => BaseComponentWrapper,
BaseCreator: () => BaseCreator,
BaseGridSerializingSession: () => BaseGridSerializingSession,
BaseSelectionService: () => BaseSelectionService,
BeanStub: () => BeanStub,
CellApiModule: () => CellApiModule,
CellRangeType: () => CellRangeType,
CellSpanModule: () => CellSpanModule,
CellStyleModule: () => CellStyleModule,
ChangedPath: () => ChangedPath,
CheckboxEditorModule: () => CheckboxEditorModule,
ClientSideRowModelApiModule: () => ClientSideRowModelApiModule,
ClientSideRowModelModule: () => ClientSideRowModelModule,
ColumnApiModule: () => ColumnApiModule,
ColumnAutoSizeModule: () => ColumnAutoSizeModule,
ColumnHoverModule: () => ColumnHoverModule,
ColumnKeyCreator: () => ColumnKeyCreator,
Component: () => Component,
CssClassManager: () => CssClassManager,
CsvExportModule: () => CsvExportModule,
CustomEditorModule: () => CustomEditorModule,
CustomFilterModule: () => CustomFilterModule,
DateEditorModule: () => DateEditorModule,
DateFilterModule: () => DateFilterModule,
DragAndDropModule: () => DragAndDropModule,
DragSourceType: () => DragSourceType,
EventApiModule: () => EventApiModule,
ExternalFilterModule: () => ExternalFilterModule,
FakeHScrollComp: () => FakeHScrollComp,
FakeVScrollComp: () => FakeVScrollComp,
FilterWrapperComp: () => FilterWrapperComp,
GROUP_AUTO_COLUMN_ID: () => GROUP_AUTO_COLUMN_ID,
GridBodyCtrl: () => GridBodyCtrl,
GridCoreCreator: () => GridCoreCreator,
GridCtrl: () => GridCtrl,
GridHeaderCtrl: () => GridHeaderCtrl,
GridStateModule: () => GridStateModule,
GroupInstanceIdCreator: () => GroupInstanceIdCreator,
HeaderRowContainerCtrl: () => HeaderRowContainerCtrl,
HighlightChangesModule: () => HighlightChangesModule,
InfiniteRowModelModule: () => InfiniteRowModelModule,
KeyCode: () => KeyCode,
LargeTextEditorModule: () => LargeTextEditorModule,
LocalEventService: () => LocalEventService,
LocaleModule: () => LocaleModule,
LocaleService: () => LocaleService,
ManagedFocusFeature: () => ManagedFocusFeature,
ModuleRegistry: () => ModuleRegistry,
NumberEditorModule: () => NumberEditorModule,
NumberFilterModule: () => NumberFilterModule,
PaginationModule: () => PaginationModule,
PinnedRowModule: () => PinnedRowModule,
PopupComponent: () => PopupComponent,
PositionableFeature: () => PositionableFeature,
ProvidedFilter: () => ProvidedFilter,
QuickFilterModule: () => QuickFilterModule,
ROW_NUMBERS_COLUMN_ID: () => ROW_NUMBERS_COLUMN_ID,
RefPlaceholder: () => RefPlaceholder,
RenderApiModule: () => RenderApiModule,
RowApiModule: () => RowApiModule,
RowAutoHeightModule: () => RowAutoHeightModule,
RowContainerCtrl: () => RowContainerCtrl,
RowDragModule: () => RowDragModule,
RowNode: () => RowNode,
RowSelectionModule: () => RowSelectionModule,
RowStyleModule: () => RowStyleModule,
SELECTION_COLUMN_ID: () => SELECTION_COLUMN_ID,
ScrollApiModule: () => ScrollApiModule,
SelectEditorModule: () => SelectEditorModule,
ServerSideTransactionResultStatus: () => ServerSideTransactionResultStatus,
TabGuardClassNames: () => TabGuardClassNames,
TabGuardComp: () => TabGuardComp,
TabGuardCtrl: () => TabGuardCtrl,
TabGuardFeature: () => TabGuardFeature,
TextEditorModule: () => TextEditorModule,
TextFilterModule: () => TextFilterModule,
TooltipFeature: () => TooltipFeature,
TooltipModule: () => TooltipModule,
TouchListener: () => TouchListener,
UndoRedoEditModule: () => UndoRedoEditModule,
ValidationModule: () => ValidationModule,
ValueCacheModule: () => ValueCacheModule,
VanillaFrameworkOverrides: () => VanillaFrameworkOverrides,
_ALL_EVENTS: () => _ALL_EVENTS,
_ALL_GRID_OPTIONS: () => _ALL_GRID_OPTIONS,
_BOOLEAN_MIXED_GRID_OPTIONS: () => _BOOLEAN_MIXED_GRID_OPTIONS,
_ColumnFilterModule: () => ColumnFilterModule,
_ColumnGroupModule: () => ColumnGroupModule,
_ColumnMoveModule: () => ColumnMoveModule,
_CsrmSsrmSharedApiModule: () => CsrmSsrmSharedApiModule,
_DragModule: () => DragModule,
_EditCoreModule: () => EditCoreModule,
_EmptyArray: () => _EmptyArray,
_EmptyBean: () => EmptyBean,
_FOCUS_MANAGED_CLASS: () => FOCUS_MANAGED_CLASS,
_FilterCoreModule: () => FilterCoreModule,
_FilterValueModule: () => FilterValueModule,
_HeaderComp: () => HeaderComp,
_HorizontalResizeModule: () => HorizontalResizeModule,
_KeyboardNavigationModule: () => KeyboardNavigationModule,
_PUBLIC_EVENTS: () => _PUBLIC_EVENTS,
_PopupModule: () => PopupModule,
_ROW_ID_PREFIX_ROW_GROUP: () => ROW_ID_PREFIX_ROW_GROUP,
_SharedDragAndDropModule: () => SharedDragAndDropModule,
_SharedExportModule: () => SharedExportModule,
_SharedMenuModule: () => SharedMenuModule,
_SharedRowSelectionModule: () => SharedRowSelectionModule,
_SortModule: () => SortModule,
_SsrmInfiniteSharedApiModule: () => SsrmInfiniteSharedApiModule,
_addColumnDefaultAndTypes: () => _addColumnDefaultAndTypes,
_addFocusableContainerListener: () => _addFocusableContainerListener,
_addGridCommonParams: () => _addGridCommonParams,
_anchorElementToMouseMoveEvent: () => _anchorElementToMouseMoveEvent,
_applyColumnState: () => _applyColumnState,
_areCellsEqual: () => _areCellsEqual,
_areColIdsEqual: () => _areColIdsEqual,
_areEqual: () => _areEqual,
_asThemeImpl: () => _asThemeImpl,
_bindCellRendererToHtmlElement: () => _bindCellRendererToHtmlElement,
_canSkipShowingRowGroup: () => _canSkipShowingRowGroup,
_clearElement: () => _clearElement,
_columnsMatch: () => _columnsMatch,
_combineAttributesAndGridOptions: () => _combineAttributesAndGridOptions,
_convertColumnEventSourceType: () => _convertColumnEventSourceType,
_createCellId: () => _createCellId,
_createColumnTree: () => _createColumnTree,
_createGlobalRowEvent: () => _createGlobalRowEvent,
_createIcon: () => _createIcon,
_createIconNoSpan: () => _createIconNoSpan,
_debounce: () => _debounce,
_defaultComparator: () => _defaultComparator,
_destroyColumnTree: () => _destroyColumnTree,
_doOnce: () => _doOnce,
_downloadFile: () => _downloadFile,
_errMsg: () => _errMsg,
_error: () => _error,
_escapeString: () => _escapeString,
_exists: () => _exists,
_findFocusableElements: () => _findFocusableElements,
_findNextFocusableElement: () => _findNextFocusableElement,
_findTabbableParent: () => _findTabbableParent,
_focusGridInnerElement: () => _focusGridInnerElement,
_focusInto: () => _focusInto,
_focusNextGridCoreContainer: () => _focusNextGridCoreContainer,
_formatNumberCommas: () => _formatNumberCommas,
_fuzzySuggestions: () => _fuzzySuggestions,
_getAbsoluteHeight: () => _getAbsoluteHeight,
_getAbsoluteWidth: () => _getAbsoluteWidth,
_getActiveDomElement: () => _getActiveDomElement,
_getAriaPosInSet: () => _getAriaPosInSet,
_getCallbackForEvent: () => _getCallbackForEvent,
_getCellByPosition: () => _getCellByPosition,
_getCellCtrlForEventTarget: () => _getCellCtrlForEventTarget,
_getCellPositionForEvent: () => _getCellPositionForEvent,
_getCellRendererDetails: () => _getCellRendererDetails,
_getCheckboxLocation: () => _getCheckboxLocation,
_getCheckboxes: () => _getCheckboxes,
_getClientSideRowModel: () => _getClientSideRowModel,
_getColumnState: () => _getColumnState,
_getColumnsFromTree: () => _getColumnsFromTree,
_getDefaultFloatingFilterType: () => _getDefaultFloatingFilterType,
_getDocument: () => _getDocument,
_getEditorRendererDetails: () => _getEditorRendererDetails,
_getFillHandle: () => _getFillHandle,
_getFilterDetails: () => _getFilterDetails,
_getFloatingFilterCompDetails: () => _getFloatingFilterCompDetails,
_getFloatingFiltersHeight: () => getFloatingFiltersHeight,
_getGlobalGridOption: () => _getGlobalGridOption,
_getGrandTotalRow: () => _getGrandTotalRow,
_getGridRegisteredModules: () => _getGridRegisteredModules,
_getGroupAggFiltering: () => _getGroupAggFiltering,
_getGroupSelection: () => _getGroupSelection,
_getGroupSelectsDescendants: () => _getGroupSelectsDescendants,
_getGroupTotalRowCallback: () => _getGroupTotalRowCallback,
_getHeaderCheckbox: () => _getHeaderCheckbox,
_getHeaderClassesFromColDef: () => _getHeaderClassesFromColDef,
_getHeaderRowCount: () => getHeaderRowCount,
_getInnerCellRendererDetails: () => _getInnerCellRendererDetails,
_getInnerHeight: () => _getInnerHeight,
_getInnerWidth: () => _getInnerWidth,
_getIsRowSelectable: () => _getIsRowSelectable,
_getLocaleTextFunc: () => _getLocaleTextFunc,
_getMaxConcurrentDatasourceRequests: () => _getMaxConcurrentDatasourceRequests,
_getNormalisedMousePosition: () => _getNormalisedMousePosition,
_getPageBody: () => _getPageBody,
_getRootNode: () => _getRootNode,
_getRowContainerClass: () => _getRowContainerClass,
_getRowContainerOptions: () => _getRowContainerOptions,
_getRowHeightAsNumber: () => _getRowHeightAsNumber,
_getRowHeightForNode: () => _getRowHeightForNode,
_getRowIdCallback: () => _getRowIdCallback,
_getRowNode: () => _getRowNode,
_getRowSelectionMode: () => _getRowSelectionMode,
_getRowSpanContainerClass: () => _getRowSpanContainerClass,
_getRowViewportClass: () => _getRowViewportClass,
_getServerSideRowModel: () => _getServerSideRowModel,
_getShouldDisplayTooltip: () => _getShouldDisplayTooltip,
_getSuppressMultiRanges: () => _getSuppressMultiRanges,
_getToolPanelClassesFromColDef: () => _getToolPanelClassesFromColDef,
_isAnimateRows: () => _isAnimateRows,
_isCellSelectionEnabled: () => _isCellSelectionEnabled,
_isClientSideRowModel: () => _isClientSideRowModel,
_isColumnMenuAnchoringEnabled: () => _isColumnMenuAnchoringEnabled,
_isColumnsSortingCoupledToGroup: () => _isColumnsSortingCoupledToGroup,
_isDomLayout: () => _isDomLayout,
_isElementInEventPath: () => _isElementInEventPath,
_isEventFromPrintableCharacter: () => _isEventFromPrintableCharacter,
_isGetRowHeightFunction: () => _isGetRowHeightFunction,
_isGroupMultiAutoColumn: () => _isGroupMultiAutoColumn,
_isGroupRowsSticky: () => _isGroupRowsSticky,
_isGroupUseEntireRow: () => _isGroupUseEntireRow,
_isIOSUserAgent: () => _isIOSUserAgent,
_isKeyboardMode: () => _isKeyboardMode,
_isLegacyMenuEnabled: () => _isLegacyMenuEnabled,
_isMultiRowSelection: () => _isMultiRowSelection,
_isNodeOrElement: () => _isNodeOrElement,
_isNothingFocused: () => _isNothingFocused,
_isPromise: () => _isPromise,
_isRowBefore: () => _isRowBefore,
_isRowSelection: () => _isRowSelection,
_isSameRow: () => _isSameRow,
_isServerSideRowModel: () => _isServerSideRowModel,
_isShowTooltipWhenTruncated: () => _isShowTooltipWhenTruncated,
_isStopPropagationForAgGrid: () => _isStopPropagationForAgGrid,
_isUsingNewCellSelectionAPI: () => _isUsingNewCellSelectionAPI,
_isUsingNewRowSelectionAPI: () => _isUsingNewRowSelectionAPI,
_isVisible: () => _isVisible,
_jsonEquals: () => _jsonEquals,
_last: () => _last,
_loadTemplate: () => _loadTemplate,
_makeNull: () => _makeNull,
_mergeDeep: () => _mergeDeep,
_missing: () => _missing,
_observeResize: () => _observeResize,
_parseDateTimeFromString: () => _parseDateTimeFromString,
_preInitErrMsg: () => _preInitErrMsg,
_preserveRangesWhile: () => _preserveRangesWhile,
_processOnChange: () => _processOnChange,
_radioCssClass: () => _radioCssClass,
_removeAriaExpanded: () => _removeAriaExpanded,
_removeAriaSort: () => _removeAriaSort,
_removeFromArray: () => _removeFromArray,
_removeFromParent: () => _removeFromParent,
_requestAnimationFrame: () => _requestAnimationFrame,
_resetColumnState: () => _resetColumnState,
_selectAllCells: () => _selectAllCells,
_serialiseDate: () => _serialiseDate,
_setAriaActiveDescendant: () => _setAriaActiveDescendant,
_setAriaChecked: () => _setAriaChecked,
_setAriaColCount: () => _setAriaColCount,
_setAriaColIndex: () => _setAriaColIndex,
_setAriaColSpan: () => _setAriaColSpan,
_setAriaControls: () => _setAriaControls,
_setAriaDescribedBy: () => _setAriaDescribedBy,
_setAriaDisabled: () => _setAriaDisabled,
_setAriaExpanded: () => _setAriaExpanded,
_setAriaHasPopup: () => _setAriaHasPopup,
_setAriaHidden: () => _setAriaHidden,
_setAriaLabel: () => _setAriaLabel,
_setAriaLabelledBy: () => _setAriaLabelledBy,
_setAriaLevel: () => _setAriaLevel,
_setAriaPosInSet: () => _setAriaPosInSet,
_setAriaRole: () => _setAriaRole,
_setAriaRowCount: () => _setAriaRowCount,
_setAriaRowIndex: () => _setAriaRowIndex,
_setAriaSelected: () => _setAriaSelected,
_setAriaSetSize: () => _setAriaSetSize,
_setAriaSort: () => _setAriaSort,
_setColMenuVisible: () => _setColMenuVisible,
_setDisabled: () => _setDisabled,
_setDisplayed: () => _setDisplayed,
_setFixedWidth: () => _setFixedWidth,
_setUmd: () => _setUmd,
_setVisible: () => _setVisible,
_shouldDisplayTooltip: () => _shouldDisplayTooltip,
_shouldUpdateColVisibilityAfterGroup: () => _shouldUpdateColVisibilityAfterGroup,
_stopPropagationForAgGrid: () => _stopPropagationForAgGrid,
_toStringOrNull: () => _toStringOrNull,
_unwrapUserComp: () => _unwrapUserComp,
_updateColsMap: () => _updateColsMap,
_updateColumnState: () => _updateColumnState,
_waitUntil: () => _waitUntil,
_warn: () => _warn,
_warnOnce: () => _warnOnce,
buttonStyleAlpine: () => buttonStyleAlpine,
buttonStyleBalham: () => buttonStyleBalham,
buttonStyleBase: () => buttonStyleBase,
buttonStyleQuartz: () => buttonStyleQuartz,
checkboxStyleDefault: () => checkboxStyleDefault,
colorSchemeDark: () => colorSchemeDark,
colorSchemeDarkBlue: () => colorSchemeDarkBlue,
colorSchemeDarkWarm: () => colorSchemeDarkWarm,
colorSchemeLight: () => colorSchemeLight,
colorSchemeLightCold: () => colorSchemeLightCold,
colorSchemeLightWarm: () => colorSchemeLightWarm,
colorSchemeVariable: () => colorSchemeVariable,
columnDropStyleBordered: () => columnDropStyleBordered,
columnDropStylePlain: () => columnDropStylePlain,
createGrid: () => createGrid,
createPart: () => createPart,
createTheme: () => createTheme,
iconOverrides: () => iconOverrides,
iconSetAlpine: () => iconSetAlpine,
iconSetMaterial: () => iconSetMaterial,
iconSetQuartz: () => iconSetQuartz,
iconSetQuartzBold: () => iconSetQuartzBold,
iconSetQuartzLight: () => iconSetQuartzLight,
iconSetQuartzRegular: () => iconSetQuartzRegular,
inputStyleBase: () => inputStyleBase,
inputStyleBordered: () => inputStyleBordered,
inputStyleUnderlined: () => inputStyleUnderlined,
isColumn: () => isColumn,
isColumnGroup: () => isColumnGroup2,
isColumnGroupAutoCol: () => isColumnGroupAutoCol,
isColumnSelectionCol: () => isColumnSelectionCol,
isProvidedColumnGroup: () => isProvidedColumnGroup,
isRowNumberCol: () => isRowNumberCol,
provideGlobalGridOptions: () => provideGlobalGridOptions,
styleMaterial: () => styleMaterial,
tabStyleAlpine: () => tabStyleAlpine,
tabStyleBase: () => tabStyleBase,
tabStyleMaterial: () => tabStyleMaterial,
tabStyleQuartz: () => tabStyleQuartz,
tabStyleRolodex: () => tabStyleRolodex,
themeAlpine: () => themeAlpine,
themeBalham: () => themeBalham,
themeMaterial: () => themeMaterial,
themeQuartz: () => themeQuartz
});
module.exports = __toCommonJS(main_exports);
// packages/ag-grid-community/src/localEventService.ts
var LocalEventService = class {
constructor() {
this.allSyncListeners = /* @__PURE__ */ new Map();
this.allAsyncListeners = /* @__PURE__ */ new Map();
this.globalSyncListeners = /* @__PURE__ */ new Set();
this.globalAsyncListeners = /* @__PURE__ */ new Set();
this.asyncFunctionsQueue = [];
this.scheduled = false;
// using an object performs better than a Set for the number of different events we have
this.firedEvents = {};
}
setFrameworkOverrides(frameworkOverrides) {
this.frameworkOverrides = frameworkOverrides;
}
getListeners(eventType, async, autoCreateListenerCollection) {
const listenerMap = async ? this.allAsyncListeners : this.allSyncListeners;
let listeners = listenerMap.get(eventType);
if (!listeners && autoCreateListenerCollection) {
listeners = /* @__PURE__ */ new Set();
listenerMap.set(eventType, listeners);
}
return listeners;
}
noRegisteredListenersExist() {
return this.allSyncListeners.size === 0 && this.allAsyncListeners.size === 0 && this.globalSyncListeners.size === 0 && this.globalAsyncListeners.size === 0;
}
addEventListener(eventType, listener, async = false) {
this.getListeners(eventType, async, true).add(listener);
}
removeEventListener(eventType, listener, async = false) {
const listeners = this.getListeners(eventType, async, false);
if (!listeners) {
return;
}
listeners.delete(listener);
if (listeners.size === 0) {
const listenerMap = async ? this.allAsyncListeners : this.allSyncListeners;
listenerMap.delete(eventType);
}
}
addGlobalListener(listener, async = false) {
(async ? this.globalAsyncListeners : this.globalSyncListeners).add(listener);
}
removeGlobalListener(listener, async = false) {
(async ? this.globalAsyncListeners : this.globalSyncListeners).delete(listener);
}
dispatchEvent(event) {
const agEvent = event;
this.dispatchToListeners(agEvent, true);
this.dispatchToListeners(agEvent, false);
this.firedEvents[agEvent.type] = true;
}
dispatchEventOnce(event) {
if (!this.firedEvents[event.type]) {
this.dispatchEvent(event);
}
}
dispatchToListeners(event, async) {
const eventType = event.type;
if (async && "event" in event) {
const browserEvent = event.event;
if (browserEvent instanceof Event) {
event.eventPath = browserEvent.composedPath();
}
}
const processEventListeners = (listeners2, originalListeners2) => listeners2.forEach((listener) => {
if (!originalListeners2.has(listener)) {
return;
}
const callback = this.frameworkOverrides ? () => this.frameworkOverrides.wrapIncoming(() => listener(event)) : () => listener(event);
if (async) {
this.dispatchAsync(callback);
} else {
callback();
}
});
const originalListeners = this.getListeners(eventType, async, false) ?? /* @__PURE__ */ new Set();
const listeners = new Set(originalListeners);
if (listeners.size > 0) {
processEventListeners(listeners, originalListeners);
}
const globalListeners = new Set(
async ? this.globalAsyncListeners : this.globalSyncListeners
);
globalListeners.forEach((listener) => {
const callback = this.frameworkOverrides ? () => this.frameworkOverrides.wrapIncoming(() => listener(eventType, event)) : () => listener(eventType, event);
if (async) {
this.dispatchAsync(callback);
} else {
callback();
}
});
}
// this gets called inside the grid's thread, for each event that it
// wants to set async. the grid then batches the events into one setTimeout()
// because setTimeout() is an expensive operation. ideally we would have
// each event in it's own setTimeout(), but we batch for performance.
dispatchAsync(func) {
this.asyncFunctionsQueue.push(func);
if (!this.scheduled) {
const flush = () => {
window.setTimeout(this.flushAsyncQueue.bind(this), 0);
};
this.frameworkOverrides ? this.frameworkOverrides.wrapIncoming(flush) : flush();
this.scheduled = true;
}
}
// this happens in the next VM turn only, and empties the queue of events
flushAsyncQueue() {
this.scheduled = false;
const queueCopy = this.asyncFunctionsQueue.slice();
this.asyncFunctionsQueue = [];
queueCopy.forEach((func) => func());
}
};
// packages/ag-grid-community/src/misc/locale/localeUtils.ts
function defaultLocaleTextFunc(_key, defaultValue) {
return defaultValue;
}
function _getLocaleTextFunc(localeSvc) {
return localeSvc?.getLocaleTextFunc() ?? defaultLocaleTextFunc;
}
// packages/ag-grid-community/src/utils/aria.ts
function _toggleAriaAttribute(element, attribute, value) {
if (value == null || typeof value === "string" && value == "") {
_removeAriaAttribute(element, attribute);
} else {
_setAriaAttribute(element, attribute, value);
}
}
function _setAriaAttribute(element, attribute, value) {
element.setAttribute(_ariaAttributeName(attribute), value.toString());
}
function _removeAriaAttribute(element, attribute) {
element.removeAttribute(_ariaAttributeName(attribute));
}
function _ariaAttributeName(attribute) {
return `aria-${attribute}`;
}
function _setAriaRole(element, role) {
if (role) {
element.setAttribute("role", role);
} else {
element.removeAttribute("role");
}
}
function _getAriaSortState(sortDirection) {
let sort;
if (sortDirection === "asc") {
sort = "ascending";
} else if (sortDirection === "desc") {
sort = "descending";
} else if (sortDirection === "mixed") {
sort = "other";
} else {
sort = "none";
}
return sort;
}
function _getAriaPosInSet(element) {
return parseInt(element.getAttribute("aria-posinset"), 10);
}
function _getAriaLabel(element) {
return element.getAttribute("aria-label");
}
function _setAriaLabel(element, label) {
_toggleAriaAttribute(element, "label", label);
}
function _setAriaLabelledBy(element, labelledBy) {
_toggleAriaAttribute(element, "labelledby", labelledBy);
}
function _setAriaDescribedBy(element, describedby) {
_toggleAriaAttribute(element, "describedby", describedby);
}
function _setAriaLive(element, live) {
_toggleAriaAttribute(element, "live", live);
}
function _setAriaAtomic(element, atomic) {
_toggleAriaAttribute(element, "atomic", atomic);
}
function _setAriaRelevant(element, relevant) {
_toggleAriaAttribute(element, "relevant", relevant);
}
function _setAriaLevel(element, level) {
_toggleAriaAttribute(element, "level", level);
}
function _setAriaDisabled(element, disabled) {
_toggleAriaAttribute(element, "disabled", disabled);
}
function _setAriaHidden(element, hidden) {
_toggleAriaAttribute(element, "hidden", hidden);
}
function _setAriaActiveDescendant(element, descendantId) {
_toggleAriaAttribute(element, "activedescendant", descendantId);
}
function _setAriaExpanded(element, expanded) {
_setAriaAttribute(element, "expanded", expanded);
}
function _removeAriaExpanded(element) {
_removeAriaAttribute(element, "expanded");
}
function _setAriaSetSize(element, setsize) {
_setAriaAttribute(element, "setsize", setsize);
}
function _setAriaPosInSet(element, position) {
_setAriaAttribute(element, "posinset", position);
}
function _setAriaMultiSelectable(element, multiSelectable) {
_setAriaAttribute(element, "multiselectable", multiSelectable);
}
function _setAriaRowCount(element, rowCount) {
_setAriaAttribute(element, "rowcount", rowCount);
}
function _setAriaRowIndex(element, rowIndex) {
_setAriaAttribute(element, "rowindex", rowIndex);
}
function _setAriaRowSpan(element, spanCount) {
_setAriaAttribute(element, "rowspan", spanCount);
}
function _setAriaColCount(element, colCount) {
_setAriaAttribute(element, "colcount", colCount);
}
function _setAriaColIndex(element, colIndex) {
_setAriaAttribute(element, "colindex", colIndex);
}
function _setAriaColSpan(element, colSpan) {
_setAriaAttribute(element, "colspan", colSpan);
}
function _setAriaSort(element, sort) {
_setAriaAttribute(element, "sort", sort);
}
function _removeAriaSort(element) {
_removeAriaAttribute(element, "sort");
}
function _setAriaSelected(element, selected) {
_toggleAriaAttribute(element, "selected", selected);
}
function _setAriaChecked(element, checked) {
_setAriaAttribute(element, "checked", checked === void 0 ? "mixed" : checked);
}
function _setAriaControls(controllerElement, controlledElement) {
_toggleAriaAttribute(controllerElement, "controls", controlledElement.id);
_setAriaLabelledBy(controlledElement, controllerElement.id);
}
function _setAriaHasPopup(element, hasPopup) {
_toggleAriaAttribute(element, "haspopup", hasPopup === false ? null : hasPopup);
}
function _getAriaCheckboxStateName(translate, state) {
return state === void 0 ? translate("ariaIndeterminate", "indeterminate") : state === true ? translate("ariaChecked", "checked") : translate("ariaUnchecked", "unchecked");
}
// packages/ag-grid-community/src/utils/browser.ts
var isSafari;
var isChrome;
var isFirefox;
var isMacOs;
var isIOS;
var invisibleScrollbar;
var browserScrollbarWidth;
var maxDivHeight;
function _isBrowserSafari() {
if (isSafari === void 0) {
isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
}
return isSafari;
}
function _isBrowserChrome() {
if (isChrome === void 0) {
const win = window;
isChrome = !!win.chrome && (!!win.chrome.webstore || !!win.chrome.runtime) || /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
}
return isChrome;
}
function _isBrowserFirefox() {
if (isFirefox === void 0) {
isFirefox = /(firefox)/i.test(navigator.userAgent);
}
return isFirefox;
}
function _isMacOsUserAgent() {
if (isMacOs === void 0) {
isMacOs = /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform);
}
return isMacOs;
}
function _isIOSUserAgent() {
if (isIOS === void 0) {
isIOS = /iPad|iPhone|iPod/.test(navigator.platform) || navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1;
}
return isIOS;
}
function _getTabIndex(el) {
if (!el) {
return null;
}
const numberTabIndex = el.tabIndex;
const tabIndex = el.getAttribute("tabIndex");
if (numberTabIndex === -1 && (tabIndex === null || tabIndex === "" && !_isBrowserFirefox())) {
return null;
}
return numberTabIndex.toString();
}
function _getMaxDivHeight() {
if (maxDivHeight !== void 0) {
return maxDivHeight;
}
if (!document.body) {
return -1;
}
let res = 1e6;
const testUpTo = _isBrowserFirefox() ? 6e6 : 1e9;
const div = document.createElement("div");
document.body.appendChild(div);
while (true) {
const test = res * 2;
div.style.height = test + "px";
if (test > testUpTo || div.clientHeight !== test) {
break;
} else {
res = test;
}
}
document.body.removeChild(div);
maxDivHeight = res;
return res;
}
function _getScrollbarWidth() {
if (browserScrollbarWidth == null) {
initScrollbarWidthAndVisibility();
}
return browserScrollbarWidth;
}
function initScrollbarWidthAndVisibility() {
const body = document.body;
const div = document.createElement("div");
div.style.width = div.style.height = "100px";
div.style.opacity = "0";
div.style.overflow = "scroll";
div.style.msOverflowStyle = "scrollbar";
div.style.position = "absolute";
body.appendChild(div);
let width = div.offsetWidth - div.clientWidth;
if (width === 0 && div.clientWidth === 0) {
width = null;
}
if (div.parentNode) {
div.parentNode.removeChild(div);
}
if (width != null) {
browserScrollbarWidth = width;
invisibleScrollbar = width === 0;
}
}
function _isInvisibleScrollbar() {
if (invisibleScrollbar == null) {
initScrollbarWidthAndVisibility();
}
return invisibleScrollbar;
}
// packages/ag-grid-community/src/utils/dom.ts
var rtlNegativeScroll;
function _radioCssClass(element, elementClass, otherElementClass) {
const parent = element.parentElement;
let sibling = parent && parent.firstChild;
while (sibling) {
if (elementClass) {
sibling.classList.toggle(elementClass, sibling === element);
}
if (otherElementClass) {
sibling.classList.toggle(otherElementClass, sibling !== element);
}
sibling = sibling.nextSibling;
}
}
var FOCUSABLE_SELECTOR = "[tabindex], input, select, button, textarea, [href]";
var FOCUSABLE_EXCLUDE = "[disabled], .ag-disabled:not(.ag-button), .ag-disabled *";
function _isFocusableFormField(element) {
const matches = Element.prototype.matches || Element.prototype.msMatchesSelector;
const inputSelector = "input, select, button, textarea";
const isFocusable = matches.call(element, inputSelector);
const isNotFocusable = matches.call(element, FOCUSABLE_EXCLUDE);
const isElementVisible = _isVisible(element);
const focusable = isFocusable && !isNotFocusable && isElementVisible;
return focusable;
}
function _setDisplayed(element, displayed, options = {}) {
const { skipAriaHidden } = options;
element.classList.toggle("ag-hidden", !displayed);
if (!skipAriaHidden) {
_setAriaHidden(element, !displayed);
}
}
function _setVisible(element, visible, options = {}) {
const { skipAriaHidden } = options;
element.classList.toggle("ag-invisible", !visible);
if (!skipAriaHidden) {
_setAriaHidden(element, !visible);
}
}
function _setDisabled(element, disabled) {
const attributeName = "disabled";
const addOrRemoveDisabledAttribute = disabled ? (e) => e.setAttribute(attributeName, "") : (e) => e.removeAttribute(attributeName);
addOrRemoveDisabledAttribute(element);
_nodeListForEach(element.querySelectorAll("input"), (input) => addOrRemoveDisabledAttribute(input));
}
function _isElementChildOfClass(element, cls, maxNest) {
let counter = 0;
while (element) {
if (element.classList.contains(cls)) {
return true;
}
element = element.parentElement;
if (typeof maxNest == "number") {
if (++counter > maxNest) {
break;
}
} else if (element === maxNest) {
break;
}
}
return false;
}
function _getElementSize(el) {
const {
height,
width,
borderTopWidth,
borderRightWidth,
borderBottomWidth,
borderLeftWidth,
paddingTop,
paddingRight,
paddingBottom,
paddingLeft,
marginTop,
marginRight,
marginBottom,
marginLeft,
boxSizing
} = window.getComputedStyle(el);
return {
height: parseFloat(height || "0"),
width: parseFloat(width || "0"),
borderTopWidth: parseFloat(borderTopWidth || "0"),
borderRightWidth: parseFloat(borderRightWidth || "0"),
borderBottomWidth: parseFloat(borderBottomWidth || "0"),
borderLeftWidth: parseFloat(borderLeftWidth || "0"),
paddingTop: parseFloat(paddingTop || "0"),
paddingRight: parseFloat(paddingRight || "0"),
paddingBottom: parseFloat(paddingBottom || "0"),
paddingLeft: parseFloat(paddingLeft || "0"),
marginTop: parseFloat(marginTop || "0"),
marginRight: parseFloat(marginRight || "0"),
marginBottom: parseFloat(marginBottom || "0"),
marginLeft: parseFloat(marginLeft || "0"),
boxSizing
};
}
function _getInnerHeight(el) {
const size = _getElementSize(el);
if (size.boxSizing === "border-box") {
return size.height - size.paddingTop - size.paddingBottom;
}
return size.height;
}
function _getInnerWidth(el) {
const size = _getElementSize(el);
if (size.boxSizing === "border-box") {
return size.width - size.paddingLeft - size.paddingRight;
}
return size.width;
}
function _getAbsoluteHeight(el) {
const { height, marginBottom, marginTop } = _getElementSize(el);
return Math.floor(height + marginBottom + marginTop);
}
function _getAbsoluteWidth(el) {
const { width, marginLeft, marginRight } = _getElementSize(el);
return Math.floor(width + marginLeft + marginRight);
}
function _getElementRectWithOffset(el) {
const offsetElementRect = el.getBoundingClientRect();
const { borderTopWidth, borderLeftWidth, borderRightWidth, borderBottomWidth } = _getElementSize(el);
return {
top: offsetElementRect.top + (borderTopWidth || 0),
left: offsetElementRect.left + (borderLeftWidth || 0),
right: offsetElementRect.right + (borderRightWidth || 0),
bottom: offsetElementRect.bottom + (borderBottomWidth || 0)
};
}
function _isRtlNegativeScroll() {
if (typeof rtlNegativeScroll === "boolean") {
return rtlNegativeScroll;
}
const template = document.createElement("div");
template.style.direction = "rtl";
template.style.width = "1px";
template.style.height = "1px";
template.style.position = "fixed";
template.style.top = "0px";
template.style.overflow = "hidden";
template.dir = "rtl";
template.innerHTML = /* html */
`
`;
document.body.appendChild(template);
template.scrollLeft = 1;
rtlNegativeScroll = Math.floor(template.scrollLeft) === 0;
document.body.removeChild(template);
return rtlNegativeScroll;
}
function _getScrollLeft(element, rtl) {
let scrollLeft = element.scrollLeft;
if (rtl) {
scrollLeft = Math.abs(scrollLeft);
if (_isBrowserChrome() && !_isRtlNegativeScroll()) {
scrollLeft = element.scrollWidth - element.getBoundingClientRect().width - scrollLeft;
}
}
return scrollLeft;
}
function _setScrollLeft(element, value, rtl) {
if (rtl) {
if (_isRtlNegativeScroll()) {
value *= -1;
} else if (_isBrowserSafari() || _isBrowserChrome()) {
value = element.scrollWidth - element.getBoundingClientRect().width - value;
}
}
element.scrollLeft = value;
}
function _clearElement(el) {
while (el && el.firstChild) {
el.removeChild(el.firstChild);
}
}
function _removeFromParent(node) {
if (node && node.parentNode) {
node.parentNode.removeChild(node);
}
}
function _isInDOM(element) {
return !!element.offsetParent;
}
function _isVisible(element) {
const el = element;
if (el.checkVisibility) {
return el.checkVisibility({ checkVisibilityCSS: true });
}
const isHidden = !_isInDOM(element) || window.getComputedStyle(element).visibility !== "visible";
return !isHidden;
}
function _loadTemplate(template) {
const tempDiv = document.createElement("div");
tempDiv.innerHTML = (template || "").trim();
return tempDiv.firstChild;
}
function _ensureDomOrder(eContainer, eChild, eChildBefore) {
if (eChildBefore && eChildBefore.nextSibling === eChild) {
return;
}
if (!eContainer.firstChild) {
eContainer.appendChild(eChild);
} else if (eChildBefore) {
if (eChildBefore.nextSibling) {
eContainer.insertBefore(eChild, eChildBefore.nextSibling);
} else {
eContainer.appendChild(eChild);
}
} else if (eContainer.firstChild && eContainer.firstChild !== eChild) {
eContainer.insertAdjacentElement("afterbegin", eChild);
}
}
function _setDomChildOrder(eContainer, orderedChildren) {
for (let i = 0; i < orderedChildren.length; i++) {
const correctCellAtIndex = orderedChildren[i];
const actualCellAtIndex = eContainer.children[i];
if (actualCellAtIndex !== correctCellAtIndex) {
eContainer.insertBefore(correctCellAtIndex, actualCellAtIndex);
}
}
}
function _camelCaseToHyphenated(camelCase) {
return camelCase.replace(/[A-Z]/g, (s) => `-${s.toLocaleLowerCase()}`);
}
function _addStylesToElement(eElement, styles) {
if (!styles) {
return;
}
for (const key of Object.keys(styles)) {
const value = styles[key];
if (!key || !key.length || value == null) {
continue;
}
const parsedKey = _camelCaseToHyphenated(key);
const valueAsString = value.toString();
const parsedValue = valueAsString.replace(/\s*!important/g, "");
const priority = parsedValue.length != valueAsString.length ? "important" : void 0;
eElement.style.setProperty(parsedKey, parsedValue, priority);
}
}
function _isHorizontalScrollShowing(element) {
return element.clientWidth < element.scrollWidth;
}
function _isVerticalScrollShowing(element) {
return element.clientHeight < element.scrollHeight;
}
function _setElementWidth(element, width) {
if (width === "flex") {
element.style.removeProperty("width");
element.style.removeProperty("minWidth");
element.style.removeProperty("maxWidth");
element.style.flex = "1 1 auto";
} else {
_setFixedWidth(element, width);
}
}
function _setFixedWidth(element, width) {
width = _formatSize(width);
element.style.width = width.toString();
element.style.maxWidth = width.toString();
element.style.minWidth = width.toString();
}
function _setFixedHeight(element, height) {
height = _formatSize(height);
element.style.height = height.toString();
element.style.maxHeight = height.toString();
element.style.minHeight = height.toString();
}
function _formatSize(size) {
if (typeof size === "number") {
return `${size}px`;
}
return size;
}
function _isNodeOrElement(o) {
return o instanceof Node || o instanceof HTMLElement;
}
function _copyNodeList(nodeList) {
if (nodeList == null) {
return [];
}
const result = [];
_nodeListForEach(nodeList, (node) => result.push(node));
return result;
}
function _iterateNamedNodeMap(map, callback) {
if (!map) {
return;
}
for (let i = 0; i < map.length; i++) {
const attr = map[i];
callback(attr.name, attr.value);
}
}
function _addOrRemoveAttribute(element, name, value) {
if (value == null || value === "") {
element.removeAttribute(name);
} else {
element.setAttribute(name, value.toString());
}
}
function _nodeListForEach(nodeList, action) {
if (nodeList == null) {
return;
}
for (let i = 0; i < nodeList.length; i++) {
action(nodeList[i]);
}
}
function _bindCellRendererToHtmlElement(cellRendererPromise, eTarget) {
cellRendererPromise.then((cellRenderer) => {
const gui = cellRenderer.getGui();
if (gui != null) {
if (typeof gui === "object") {
eTarget.appendChild(gui);
} else {
eTarget.innerHTML = gui;
}
}
});
}
function _observeResize(beans, element, callback) {
const win = _getWindow(beans);
const ResizeObserverImpl = win.ResizeObserver;
const resizeObserver = ResizeObserverImpl ? new ResizeObserverImpl(callback) : null;
resizeObserver?.observe(element);
return () => resizeObserver?.disconnect();
}
function _getTextSelectionRanges(beans) {
const rootNode = _getRootNode(beans);
const selection = "getSelection" in rootNode ? rootNode.getSelection() : null;
const ranges = [];
for (let i = 0; i < (selection?.rangeCount ?? 0); i++) {
const range = selection?.getRangeAt(i);
if (range) {
ranges.push(range);
}
}
return { selection, ranges };
}
function _preserveRangesWhile(beans, fn) {
const enableCellTextSelection = beans.gos.get("enableCellTextSelection");
if (!enableCellTextSelection) {
return fn();
}
if (!_isBrowserFirefox() && !_isBrowserSafari()) {
return fn();
}
const { selection, ranges } = _getTextSelectionRanges(beans);
fn();
selection?.removeAllRanges();
for (const range of ranges) {
selection?.addRange(range);
}
}
// packages/ag-grid-community/src/utils/generic.ts
function _makeNull(value) {
if (value == null || value === "") {
return null;
}
return value;
}
function _exists(value) {
return value != null && value !== "";
}
function _missing(value) {
return !_exists(value);
}
function _toStringOrNull(value) {
return value != null && typeof value.toString === "function" ? value.toString() : null;
}
function _jsonEquals(val1, val2) {
const val1Json = val1 ? JSON.stringify(val1) : null;
const val2Json = val2 ? JSON.stringify(val2) : null;
return val1Json === val2Json;
}
function _defaultComparator(valueA, valueB, accentedCompare = false) {
const valueAMissing = valueA == null;
const valueBMissing = valueB == null;
if (valueA && valueA.toNumber) {
valueA = valueA.toNumber();
}
if (valueB && valueB.toNumber) {
valueB = valueB.toNumber();
}
if (valueAMissing && valueBMissing) {
return 0;
}
if (valueAMissing) {
return -1;
}
if (valueBMissing) {
return 1;
}
function doQuickCompare(a, b) {
return a > b ? 1 : a < b ? -1 : 0;
}
if (typeof valueA !== "string") {
return doQuickCompare(valueA, valueB);
}
if (!accentedCompare) {
return doQuickCompare(valueA, valueB);
}
try {
return valueA.localeCompare(valueB);
} catch (e) {
return doQuickCompare(valueA, valueB);
}
}
// packages/ag-grid-community/src/baseUrl.ts
var BASE_URL = "https://www.ag-grid.com";
// packages/ag-grid-community/src/utils/function.ts
var doOnceFlags = {};
function _doOnce(func, key) {
if (doOnceFlags[key]) {
return;
}
func();
doOnceFlags[key] = true;
}
function _logIfDebug(gos, message, ...args) {
if (gos.get("debug")) {
console.log("AG Grid: " + message, ...args);
}
}
function _warnOnce(msg, ...args) {
_doOnce(() => console.warn("AG Grid: " + msg, ...args), msg + args?.join(""));
}
function _errorOnce(msg, ...args) {
_doOnce(() => console.error("AG Grid: " + msg, ...args), msg + args?.join(""));
}
var executeNextVMTurnFuncs = [];
var executeNextVMTurnPending = false;
function _executeNextVMTurn(func) {
executeNextVMTurnFuncs.push(func);
if (executeNextVMTurnPending) {
return;
}
executeNextVMTurnPending = true;
window.setTimeout(() => {
const funcsCopy = executeNextVMTurnFuncs.slice();
executeNextVMTurnFuncs.length = 0;
executeNextVMTurnPending = false;
funcsCopy.forEach((func2) => func2());
}, 0);
}
function _debounce(bean, func, delay) {
let timeout;
return function(...args) {
const context = this;
window.clearTimeout(timeout);
timeout = window.setTimeout(function() {
if (bean.isAlive()) {
func.apply(context, args);
}
}, delay);
};
}
function _throttle(func, wait) {
let previousCall = 0;
return function(...args) {
const context = this;
const currentCall = (/* @__PURE__ */ new Date()).getTime();
if (currentCall - previousCall < wait) {
return;
}
previousCall = currentCall;
func.apply(context, args);
};
}
function _waitUntil(condition, callback, timeout = 100, timeoutMessage) {
const timeStamp = (/* @__PURE__ */ new Date()).getTime();
let interval = null;
let executed = false;
const internalCallback = () => {
const reachedTimeout = (/* @__PURE__ */ new Date()).getTime() - timeStamp > timeout;
if (condition() || reachedTimeout) {
callback();
executed = true;
if (interval != null) {
window.clearInterval(interval);
interval = null;
}
if (reachedTimeout && timeoutMessage) {
_warnOnce(timeoutMessage);
}
}
};
internalCallback();
if (!executed) {
interval = window.setInterval(internalCallback, 10);
}
}
// packages/ag-grid-community/src/version.ts
var VERSION = "33.1.1";
// packages/ag-grid-community/src/validation/logging.ts
var MAX_URL_LENGTH = 2e3;
var MIN_PARAM_LENGTH = 100;
var VERSION_PARAM_NAME = "_version_";
var validation = null;
var suppressAllLogging = false;
var baseDocLink = `${BASE_URL}/javascript-data-grid`;
function provideValidationServiceLogger(logger) {
validation = logger;
}
function setValidationDocLink(docLink) {
baseDocLink = docLink;
}
function getErrorParts(id, args, defaultMessage) {
return validation?.getConsoleMessage(id, args) ?? [minifiedLog(id, args, defaultMessage)];
}
function getMsgOrDefault(logger, id, args, defaultMessage) {
if (suppressAllLogging)
return;
logger(`error #${id}`, ...getErrorParts(id, args, defaultMessage));
}
function stringifyObject(inputObj) {
if (!inputObj)
return String(inputObj);
const object = {};
for (const prop of Object.keys(inputObj)) {
if (typeof inputObj[prop] !== "object" && typeof inputObj[prop] !== "function") {
object[prop] = inputObj[prop];
}
}
return JSON.stringify(object);
}
function stringifyValue(value) {
let output = value;
if (value instanceof Error) {
output = value.toString();
} else if (typeof value === "object") {
output = stringifyObject(value);
}
return output;
}
function toStringWithNullUndefined(str) {
return str === void 0 ? "undefined" : str === null ? "null" : str;
}
function getParamsUrl(baseUrl, params) {
return `${baseUrl}?${params.toString()}`;
}
function truncateUrl(baseUrl, params, maxLength) {
const sortedParams = Array.from(params.entries()).sort((a, b) => b[1].length - a[1].length);
let url = getParamsUrl(baseUrl, params);
for (const [key, value] of sortedParams) {
if (key === VERSION_PARAM_NAME) {
continue;
}
const excessLength = url.length - maxLength;
if (excessLength <= 0) {
break;
}
const ellipse = "...";
const truncateAmount = excessLength + ellipse.length;
const truncatedValue = value.length - truncateAmount > MIN_PARAM_LENGTH ? value.slice(0, value.length - truncateAmount) + ellipse : value.slice(0, MIN_PARAM_LENGTH) + ellipse;
params.set(key, truncatedValue);
url = getParamsUrl(baseUrl, params);
}
return url;
}
function getErrorLink(errorNum, args) {
const params = new URLSearchParams();
params.append(VERSION_PARAM_NAME, VERSION);
if (args) {
for (const key of Object.keys(args)) {
params.append(key, stringifyValue(args[key]));
}
}
const baseUrl = `${baseDocLink}/errors/${errorNum}`;
const url = getParamsUrl(baseUrl, params);
return url.length <= MAX_URL_LENGTH ? url : truncateUrl(baseUrl, params, MAX_URL_LENGTH);
}
var minifiedLog = (errorNum, args, defaultMessage) => {
const errorLink = getErrorLink(errorNum, args);
return `${defaultMessage ? defaultMessage + " \n" : ""}Visit ${errorLink}${defaultMessage ? "" : " \n Alternatively register the ValidationModule to see the full message in the console."}`;
};
function _warn(...args) {
getMsgOrDefault(_warnOnce, args[0], args[1]);
}
function _error(...args) {
getMsgOrDefault(_errorOnce, args[0], args[1]);
}
function _logPreInitErr(id, args, defaultMessage) {
getMsgOrDefault(_errorOnce, id, args, defaultMessage);
}
function getErrMsg(defaultMessage, args) {
const id = args[0];
return `error #${id} ` + getErrorParts(id, args[1], defaultMessage).join(" ");
}
function _errMsg(...args) {
return getErrMsg(void 0, args);
}
function _preInitErrMsg(...args) {
return getErrMsg("\n", args);
}
// packages/ag-grid-community/src/gridOptionsUtils.ts
function isRowModelType(gos, rowModelType) {
return gos.get("rowModelType") === rowModelType;
}
function _isClientSideRowModel(gos, rowModel) {
return isRowModelType(gos, "clientSide");
}
function _isServerSideRowModel(gos, rowModel) {
return isRowModelType(gos, "serverSide");
}
function _isDomLayout(gos, domLayout) {
return gos.get("domLayout") === domLayout;
}
function _isRowSelection(gos) {
return _getRowSelectionMode(gos) !== void 0;
}
function _isGetRowHeightFunction(gos) {
return typeof gos.get("getRowHeight") === "function";
}
function _shouldMaintainColumnOrder(gos, isPivotColumns) {
if (isPivotColumns) {
return !gos.get("enableStrictPivotColumnOrder");
}
return gos.get("maintainColumnOrder");
}
function _getRowHeightForNode(beans, rowNode, allowEstimate = false, defaultRowHeight) {
const { gos, environment } = beans;
if (defaultRowHeight == null) {
defaultRowHeight = environment.getDefaultRowHeight();
}
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) {
_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 };
}
function getMasterDetailRowHeight(gos) {
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 };
}
function _getRowHeightAsNumber(beans) {
const { environment, gos } = beans;
const gridOptionsRowHeight = gos.get("rowHeight");
if (!gridOptionsRowHeight || _missing(gridOptionsRowHeight)) {
return environment.getDefaultRowHeight();
}
const rowHeight = environment.refreshRowHeightVariable();
if (rowHeight !== -1) {
return rowHeight;
}
_warn(24);
return environment.getDefaultRowHeight();
}
function isNumeric(value) {
return !isNaN(value) && typeof value === "number" && isFinite(value);
}
function _getDomData(gos, element, key) {
const domData = element[gos.getDomDataKey()];
return domData ? domData[key] : void 0;
}
function _setDomData(gos, element, key, value) {
const domDataKey = gos.getDomDataKey();
let domData = element[domDataKey];
if (_missing(domData)) {
domData = {};
element[domDataKey] = domData;
}
domData[key] = value;
}
function _getDocument(beans) {
const { gos, eGridDiv } = beans;
let result = null;
const gridOptionsGetDocument = gos.get("getDocument");
if (gridOptionsGetDocument && _exists(gridOptionsGetDocument)) {
result = gridOptionsGetDocument();
} else if (eGridDiv) {
result = eGridDiv.ownerDocument;
}
if (result && _exists(result)) {
return result;
}
return document;
}
function _getWindow(beans) {
const eDocument = _getDocument(beans);
return eDocument.defaultView || window;
}
function _getRootNode(beans) {
return beans.eGridDiv.getRootNode();
}
function _getActiveDomElement(beans) {
return _getRootNode(beans).activeElement;
}
function _getPageBody(beans) {
let rootNode = null;
let targetEl = null;
try {
rootNode = _getDocument(beans).fullscreenElement;
} catch (e) {
} 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;
}
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;
const browserHeight = _getBodyHeight(beans) - 2;
const offsetParent = element.offsetParent;
if (!offsetParent) {
return;
}
const offsetParentSize = _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;
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`;
}
function _isNothingFocused(beans) {
const eDocument = _getDocument(beans);
const activeEl = _getActiveDomElement(beans);
return activeEl === null || activeEl === eDocument.body;
}
function _isAnimateRows(gos) {
if (gos.get("ensureDomOrder")) {
return false;
}
return gos.get("animateRows");
}
function _isGroupRowsSticky(gos) {
if (gos.get("paginateChildRows") || gos.get("groupHideOpenParents") || _isDomLayout(gos, "print")) {
return false;
}
return true;
}
function _isColumnsSortingCoupledToGroup(gos) {
const autoGroupColumnDef = gos.get("autoGroupColumnDef");
return !autoGroupColumnDef?.comparator && !gos.get("treeData");
}
function _getGroupAggFiltering(gos) {
const userValue = gos.get("groupAggFiltering");
if (typeof userValue === "function") {
return gos.getCallback("groupAggFiltering");
}
if (userValue === true) {
return () => true;
}
return void 0;
}
function _getGrandTotalRow(gos) {
return gos.get("grandTotalRow");
}
function _getGroupTotalRowCallback(gos) {
const userValue = gos.get("groupTotalRow");
if (typeof userValue === "function") {
return gos.getCallback("groupTotalRow");
}
return () => userValue ?? void 0;
}
function _isGroupMultiAutoColumn(gos) {
if (gos.exists("groupDisplayType")) {
return gos.get("groupDisplayType") === "multipleColumns";
}
return gos.get("groupHideOpenParents");
}
function _isGroupUseEntireRow(gos, pivotMode) {
if (pivotMode) {
return false;
}
return gos.get("groupDisplayType") === "groupRows";
}
function _getRowIdCallback(gos) {
const getRowId = gos.getCallback("getRowId");
if (getRowId === void 0) {
return getRowId;
}
return (params) => {
let id = getRowId(params);
if (typeof id !== "string") {
_warn(25, { id });
id = String(id);
}
return id;
};
}
function _canSkipShowingRowGroup(gos, node) {
const isSkippingGroups = gos.get("groupHideParentOfSingleChild");
if (isSkippingGroups === true) {
return true;
}
if (isSkippingGroups === "leafGroupsOnly" && node.leafGroup) {
return true;
}
if (gos.get("groupRemoveSingleChildren")) {
return true;
}
if (gos.get("groupRemoveLowestSingleChildren") && node.leafGroup) {
return true;
}
return false;
}
function _getMaxConcurrentDatasourceRequests(gos) {
const res = gos.get("maxConcurrentDatasourceRequests");
return res > 0 ? res : void 0;
}
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;
}
function _getCheckboxes(selection) {
return selection?.checkboxes ?? true;
}
function _getHeaderCheckbox(selection) {
return selection?.mode === "multiRow" && (selection.headerCheckbox ?? true);
}
function _getCheckboxLocation(rowSelection) {
if (typeof rowSelection !== "object") {
return void 0;
}
return rowSelection.checkboxLocation ?? "selectionColumn";
}
function _getHideDisabledCheckboxes(selection) {
return selection?.hideDisabledCheckboxes ?? false;
}
function _isUsingNewRowSelectionAPI(gos) {
const rowSelection = gos.get("rowSelection");
return typeof rowSelection !== "string";
}
function _isUsingNewCellSelectionAPI(gos) {
return gos.get("cellSelection") !== void 0;
}
function _getSuppressMultiRanges(gos) {
const selection = gos.get("cellSelection");
const useNewAPI = selection !== void 0;
if (!useNewAPI) {
return gos.get("suppressMultiRangeSelection");
}
return typeof selection !== "boolean" ? selection?.suppressMultiRanges ?? false : false;
}
function _isCellSelectionEnabled(gos) {
const selection = gos.get("cellSelection");
const useNewAPI = selection !== void 0;
return useNewAPI ? !!selection : gos.get("enableRangeSelection");
}
function _getFillHandle(gos) {
const selection = gos.get("cellSelection");
const useNewAPI = selection !== void 0;
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 : void 0;
}
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";
}
function _getEnableDeselection(gos) {
const enableClickSelection = _getEnableClickSelection(gos);
return enableClickSelection === true || enableClickSelection === "enableDeselection";
}
function _getIsRowSelectable(gos) {
const selection = gos.get("rowSelection");
if (typeof selection === "string") {
return gos.get("isRowSelectable");
}
return selection?.isRowSelectable;
}
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;
}
}
switch (selection?.mode) {
case "multiRow":
case "singleRow":
return selection.mode;
default:
return;
}
}
function _isMultiRowSelection(arg) {
const mode = _getRowSelectionMode(arg);
return mode === "multiRow";
}
function _getEnableSelectionWithoutKeys(gos) {
const selection = gos.get("rowSelection");
if (typeof selection === "string") {
return gos.get("rowMultiSelectWithClick");
}
return selection?.enableSelectionWithoutKeys ?? false;
}
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 : void 0;
}
function _getSelectAll(gos, defaultValue = true) {
const rowSelection = gos.get("rowSelection");
if (typeof rowSelection !== "object") {
return defaultValue ? "all" : void 0;
}
return rowSelection.mode === "multiRow" ? rowSelection.selectAll : "all";
}
function _getGroupSelectsDescendants(gos) {
const groupSelection = _getGroupSelection(gos);
return groupSelection === "descendants" || groupSelection === "filteredDescendants";
}
function _getMasterSelects(gos) {
const rowSelection = gos.get("rowSelection");
return typeof rowSelection === "object" && rowSelection.masterSelects || "self";
}
function _isSetFilterByDefault(gos) {
return gos.isModuleRegistered("SetFilter") && !gos.get("suppressSetFilterByDefault");
}
function _isLegacyMenuEnabled(gos) {
return gos.get("columnMenu") === "legacy";
}
function _isColumnMenuAnchoringEnabled(gos) {
return !_isLegacyMenuEnabled(gos);
}
function _getCallbackForEvent(eventName) {
if (!eventName || eventName.length < 2) {
return eventName;
}
return "on" + eventName[0].toUpperCase() + eventName.substring(1);
}
function _combineAttributesAndGridOptions(gridOptions, component, gridOptionsKeys) {
if (typeof gridOptions !== "object") {
gridOptions = {};
}
const mergedOptions = { ...gridOptions };
gridOptionsKeys.forEach((key) => {
const value = component[key];
if (typeof value !== "undefined") {
mergedOptions[key] = value;
}
});
return mergedOptions;
}
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);
const event = {
type: "componentStateChanged",
...gridChanges
};
api.dispatchEvent(event);
}
function _addGridCommonParams(gos, params) {
return gos.addGridCommonParams(params);
}
// packages/ag-grid-community/src/utils/event.ts
var AG_GRID_STOP_PROPAGATION = "__ag_Grid_Stop_Propagation";
var PASSIVE_EVENTS = ["touchstart", "touchend", "touchmove", "touchcancel", "scroll"];
var NON_PASSIVE_EVENTS = ["wheel"];
var supports = {};
function _stopPropagationForAgGrid(event) {
event[AG_GRID_STOP_PROPAGATION] = true;
}
function _isStopPropagationForAgGrid(event) {
return event[AG_GRID_STOP_PROPAGATION] === true;
}
var _isEventSupported = /* @__PURE__ */ (() => {
const tags = {
select: "input",
change: "input",
submit: "form",
reset: "form",
error: "img",
load: "img",
abort: "img"
};
const eventChecker = (eventName) => {
if (typeof supports[eventName] === "boolean") {
return supports[eventName];
}
const el = document.createElement(tags[eventName] || "div");
eventName = "on" + eventName;
return supports[eventName] = eventName in el;
};
return eventChecker;
})();
function _getCtrlForEventTarget(gos, eventTarget, type) {
let sourceElement = eventTarget;
while (sourceElement) {
const renderedComp = _getDomData(gos, sourceElement, type);
if (renderedComp) {
return renderedComp;
}
sourceElement = sourceElement.parentElement;
}
return null;
}
function _isElementInEventPath(element, event) {
if (!event || !element) {
return false;
}
return _getEventPath(event).indexOf(element) >= 0;
}
function _createEventPath(event) {
const res = [];
let pointer = event.target;
while (pointer) {
res.push(pointer);
pointer = pointer.parentElement;
}
return res;
}
function _getEventPath(event) {
const eventNoType = event;
if (eventNoType.path) {
return eventNoType.path;
}
if (eventNoType.composedPath) {
return eventNoType.composedPath();
}
return _createEventPath(eventNoType);
}
function _addSafePassiveEventListener(frameworkOverrides, eElement, event, listener) {
const passive = getPassiveStateForEvent(event);
let options;
if (passive != null) {
options = { passive };
}
if (frameworkOverrides && frameworkOverrides.addEventListener) {
frameworkOverrides.addEventListener(eElement, event, listener, options);
}
}
var getPassiveStateForEvent = (event) => {
const isPassive = PASSIVE_EVENTS.includes(event);
const isNonPassive = NON_PASSIVE_EVENTS.includes(event);
if (isPassive) {
return true;
}
if (isNonPassive) {
return false;
}
};
// packages/ag-grid-community/src/context/beanStub.ts
var BeanStub = class {
constructor() {
// not named context to allow children to use 'context' as a variable name
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;
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();
}
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) {
_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();
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();
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;
}
const eventsKey = events.join("-") + this.propertyListenerId++;
const wrappedListener = (event) => {
if (event.changeSet) {
if (event.changeSet && event.changeSet.id === this.lastChangeSetIdLookup[eventsKey]) {
return;
}
this.lastChangeSetIdLookup[eventsKey] = event.changeSet.id;
}
const propertiesChangeEvent = {
type: "gridPropertyChanged",
changeSet: event.changeSet,
source: event.source
};
listener(propertiesChangeEvent);
};
events.forEach((event) => this.setupGridOptionListener(event, wrappedListener));
}
getLocaleTextFunc() {
return _getLocaleTextFunc(this.beans.localeSvc);
}
addDestroyFunc(func) {
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) : void 0;
}
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);
}
};
function isAgEventEmitter(object) {
return object.__addEventListener !== void 0;
}
// packages/ag-grid-community/src/utils/object.ts
var SKIP_JS_BUILTINS = /* @__PURE__ */ new Set(["__proto__", "constructor", "prototype"]);
function _iterateObject(object, callback) {
if (object == null) {
return;
}
if (Array.isArray(object)) {
for (let i = 0; i < object.length; i++) {
callback(i.toString(), object[i]);
}
return;
}
for (const key of Object.keys(object)) {
callback(key, object[key]);
}
}
function _mergeDeep(dest, source, copyUndefined = true, makeCopyOfSimpleObjects = false) {
if (!_exists(source)) {
return;
}
_iterateObject(source, (key, sourceValue) => {
if (SKIP_JS_BUILTINS.has(key)) {
return;
}
let destValue = dest[key];
if (destValue === sourceValue) {
return;
}
if (makeCopyOfSimpleObjects) {
const objectIsDueToBeCopied = destValue == null && sourceValue != null;
if (objectIsDueToBeCopied) {
const doNotCopyAsSourceIsSimpleObject = typeof sourceValue === "object" && sourceValue.constructor === Object;
if (doNotCopyAsSourceIsSimpleObject) {
destValue = {};
dest[key] = destValue;
}
}
}
if (_isNonNullObject(sourceValue) && _isNonNullObject(destValue) && !Array.isArray(destValue)) {
_mergeDeep(destValue, sourceValue, copyUndefined, makeCopyOfSimpleObjects);
} else if (copyUndefined || sourceValue !== void 0) {
dest[key] = sourceValue;
}
});
}
function _getValueUsingField(data, field, fieldContainsDots) {
if (!field || !data) {
return;
}
if (!fieldContainsDots) {
return data[field];
}
const fields = field.split(".");
let currentObject = data;
for (let i = 0; i < fields.length; i++) {
if (currentObject == null) {
return void 0;
}
currentObject = currentObject[fields[i]];
}
return currentObject;
}
function _isNonNullObject(value) {
return typeof value === "object" && value !== null;
}
// packages/ag-grid-community/src/utils/string.ts
var reUnescapedHtml = /[&<>"']/g;
var HTML_ESCAPES = {
"&": "&",
"<": "<",
">": ">",
'"': """,
"'": "'"
};
function _escapeString(toEscape, skipEscapingHtmlChars) {
if (toEscape == null) {
return null;
}
const stringResult = toEscape.toString().toString();
if (skipEscapingHtmlChars) {
return stringResult;
}
return stringResult.replace(reUnescapedHtml, (chr) => HTML_ESCAPES[chr]);
}
// packages/ag-grid-community/src/entities/agColumn.ts
var COL_DEF_DEFAULTS = {
resizable: true,
sortable: true
};
var instanceIdSequence = 0;
function getNextColInstanceId() {
return instanceIdSequence++;
}
function isColumn(col) {
return col instanceof AgColumn;
}
var AgColumn = class extends BeanStub {
constructor(colDef, 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();
this.tooltipEnabled = false;
this.rowGroupActive = false;
this.pivotActive = false;
this.aggregationActive = false;
this.flex = null;
this.colIdSanitised = _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 !== void 0) {
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 = _exists(field) && field.indexOf(".") >= 0 && !suppressDotNotation;
this.tooltipFieldContainsDots = _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() {
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 _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 (typeof value === "boolean") {
return value;
}
if (typeof value === "function") {
const params = this.createColumnFunctionCallbackParams(rowNode);
const editableFunc = value;
return editableFunc(params);
}
return false;
}
createColumnEvent(type, source) {
return _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 _missing(this.sort);
}
/** @deprecated v32 use col.getSort() !== undefined */
isSorting() {
return _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() {
_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 = _addGridCommonParams(this.gos, {
node: rowNode,
data: rowNode.data,
colDef: this.colDef,
column: this
});
return params;
}
getColSpan(rowNode) {
if (_missing(this.colDef.colSpan)) {
return 1;
}
const params = this.createBaseColDefParams(rowNode);
const colSpan = this.colDef.colSpan(params);
return Math.max(colSpan, 1);
}
getRowSpan(rowNode) {
if (_missing(this.colDef.rowSpan)) {
return 1;
}
const params = this.createBaseColDefParams(rowNode);
const rowSpan = this.colDef.rowSpan(params);
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) {
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) {
_mergeDeep(colEvent, additionalEventAttributes);
}
this.colEventSvc.dispatchEvent(colEvent);
}
dispatchStateUpdatedEvent(key) {
this.colEventSvc.dispatchEvent({
type: "columnStateUpdated",
key
});
}
};
// packages/ag-grid-community/src/entities/agProvidedColumnGroup.ts
function isProvidedColumnGroup(col) {
return col instanceof AgProvidedColumnGroup;
}
var AgProvidedColumnGroup = class extends 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 = getNextColInstanceId();
this.expandableListenerRemoveCallback = null;
this.expanded = !!colGroupDef?.openByDefault;
}
destroy() {
if (this.expandableListenerRemoveCallback) {
this.reset(null, void 0);
}
super.destroy();
}
reset(colGroupDef, level) {
this.colGroupDef = colGroupDef;
this.level = level;
this.originalParent = null;
if (this.expandableListenerRemoveCallback) {
this.expandableListenerRemoveCallback();
}
this.children = void 0;
this.expandable = void 0;
}
getInstanceId() {
return this.instanceId;
}
getOriginalParent() {
return this.originalParent;
}
getLevel() {
return this.level;
}
isVisible() {
if (this.children) {
return this.children.some((child) => child.isVisible());
}
return false;
}
isPadding() {
return this.padding;
}
setExpanded(expanded) {
this.expanded = expanded === void 0 ? 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 (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;
}
let atLeastOneShowingWhenOpen = false;
let atLeastOneShowingWhenClosed = false;
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;
}
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) => {
const skipBecausePadding = isProvidedColumnGroup(item) && item.isPadding();
if (skipBecausePadding) {
process(item.children);
} else {
res.push(item);
}
});
};
process(this.children);
return res;
}
onColumnVisibilityChanged() {
this.setExpandable();
}
};
// packages/ag-grid-community/src/entities/defaultColumnTypes.ts
var DefaultColumnTypes = {
numericColumn: {
headerClass: "ag-right-aligned-header",
cellClass: "ag-right-aligned-cell"
},
rightAligned: {
headerClass: "ag-right-aligned-header",
cellClass: "ag-right-aligned-cell"
}
};
// packages/ag-grid-community/src/columns/columnKeyCreator.ts
var ColumnKeyCreator = class {
constructor() {
this.existingKeys = {};
}
addExistingKeys(keys) {
for (let i = 0; i < keys.length; i++) {
this.existingKeys[keys[i]] = true;
}
}
getUniqueKey(colId, colField) {
colId = _toStringOrNull(colId);
let count = 0;
while (true) {
let idToTry = colId ?? colField;
if (idToTry) {
if (count !== 0) {
idToTry += "_" + count;
}
} else {
idToTry = count;
}
if (!this.existingKeys[idToTry]) {
this.existingKeys[idToTry] = true;
return String(idToTry);
}
count++;
}
}
};
// packages/ag-grid-community/src/utils/array.ts
var _EmptyArray = Object.freeze([]);
function _last(arr) {
if (!arr?.length) {
return;
}
return arr[arr.length - 1];
}
function _areEqual(a, b, comparator) {
if (a == null && b == null) {
return true;
}
return a != null && b != null && a.length === b.length && a.every((value, index) => comparator ? comparator(value, b[index]) : b[index] === value);
}
function _sortNumerically(array) {
return array.sort((a, b) => a - b);
}
function _removeFromArray(array, object) {
const index = array.indexOf(object);
if (index >= 0) {
array.splice(index, 1);
}
}
function _moveInArray(array, objectsToMove, toIndex) {
for (let i = 0; i < objectsToMove.length; i++) {
_removeFromArray(array, objectsToMove[i]);
}
for (let i = objectsToMove.length - 1; i >= 0; i--) {
array.splice(toIndex, 0, objectsToMove[i]);
}
}
// packages/ag-grid-community/src/columns/columnUtils.ts
var GROUP_AUTO_COLUMN_ID = "ag-Grid-AutoColumn";
var SELECTION_COLUMN_ID = "ag-Grid-SelectionColumn";
var ROW_NUMBERS_COLUMN_ID = "ag-Grid-RowNumbersColumn";
function _getColumnsFromTree(rootColumns) {
const result = [];
const recursiveFindColumns = (childColumns) => {
for (let i = 0; i < childColumns.length; i++) {
const child = childColumns[i];
if (isColumn(child)) {
result.push(child);
} else if (isProvidedColumnGroup(child)) {
recursiveFindColumns(child.getChildren());
}
}
};
recursiveFindColumns(rootColumns);
return result;
}
function getWidthOfColsInList(columnList) {
return columnList.reduce((width, col) => width + col.getActualWidth(), 0);
}
function _destroyColumnTree(beans, oldTree, newTree) {
const oldObjectsById = {};
if (!oldTree) {
return;
}
depthFirstOriginalTreeSearch(null, oldTree, (child) => {
oldObjectsById[child.getInstanceId()] = child;
});
if (newTree) {
depthFirstOriginalTreeSearch(null, newTree, (child) => {
oldObjectsById[child.getInstanceId()] = null;
});
}
const colsToDestroy = Object.values(oldObjectsById).filter((item) => item != null);
beans.context.destroyBeans(colsToDestroy);
}
function isColumnGroupAutoCol(col) {
const colId = col.getId();
return colId.startsWith(GROUP_AUTO_COLUMN_ID);
}
function isColumnSelectionCol(col) {
const id = typeof col === "string" ? col : "getColId" in col ? col.getColId() : col.colId;
return id?.startsWith(SELECTION_COLUMN_ID) ?? false;
}
function isRowNumberCol(col) {
const id = typeof col === "string" ? col : "getColId" in col ? col.getColId() : col.colId;
return id?.startsWith(ROW_NUMBERS_COLUMN_ID) ?? false;
}
function convertColumnTypes(type) {
let typeKeys = [];
if (type instanceof Array) {
typeKeys = type;
} else if (typeof type === "string") {
typeKeys = type.split(",");
}
return typeKeys;
}
function _areColIdsEqual(colsA, colsB) {
return _areEqual(colsA, colsB, (a, b) => a.getColId() === b.getColId());
}
function _updateColsMap(cols) {
cols.map = {};
cols.list.forEach((col) => cols.map[col.getId()] = col);
}
function _convertColumnEventSourceType(source) {
return source === "gridOptionsUpdated" ? "gridOptionsChanged" : source;
}
function _columnsMatch(column, key) {
const columnMatches = column === key;
const colDefMatches = column.getColDef() === key;
const idMatches = column.getColId() == key;
return columnMatches || colDefMatches || idMatches;
}
var getValueFactory = (stateItem, defaultState) => (key1, key2) => {
const obj = {
value1: void 0,
value2: void 0
};
let calculated = false;
if (stateItem) {
if (stateItem[key1] !== void 0) {
obj.value1 = stateItem[key1];
calculated = true;
}
if (_exists(key2) && stateItem[key2] !== void 0) {
obj.value2 = stateItem[key2];
calculated = true;
}
}
if (!calculated && defaultState) {
if (defaultState[key1] !== void 0) {
obj.value1 = defaultState[key1];
}
if (_exists(key2) && defaultState[key2] !== void 0) {
obj.value2 = defaultState[key2];
}
}
return obj;
};
// packages/ag-grid-community/src/columns/columnFactoryUtils.ts
function _createColumnTree(beans, defs = null, primaryColumns, existingTree, source) {
const columnKeyCreator = new ColumnKeyCreator();
const { existingCols, existingGroups, existingColKeys } = extractExistingTreeData(existingTree);
columnKeyCreator.addExistingKeys(existingColKeys);
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 (isProvidedColumnGroup(child)) {
child.setupExpandable();
}
child.originalParent = parent;
};
depthFirstOriginalTreeSearch(null, columnTree, deptFirstCallback);
return {
columnTree,
treeDept
};
}
function extractExistingTreeData(existingTree) {
const existingCols = [];
const existingGroups = [];
const existingColKeys = [];
if (existingTree) {
depthFirstOriginalTreeSearch(null, existingTree, (item) => {
if (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;
}
function createColumn(beans, primaryColumns, colDef, existingColsCopy, columnKeyCreator, source) {
const existingColAndIndex = findExistingColumn(colDef, existingColsCopy);
if (existingColAndIndex) {
existingColsCopy?.splice(existingColAndIndex.idx, 1);
}
let column = existingColAndIndex?.column;
if (!column) {
const colId = columnKeyCreator.getUniqueKey(colDef.colId, colDef.field);
const colDefMerged = _addColumnDefaultAndTypes(beans, colDef, colId);
column = new 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;
}
function updateSomeColumnState(beans, column, hide, sort, sortIndex, pinned, flex, source) {
const { sortSvc, pinnedCols, colFlex } = beans;
if (hide !== void 0) {
column.setVisible(!hide, source);
}
if (sortSvc) {
sortSvc.updateColSort(column, sort, source);
if (sortIndex !== void 0) {
sortSvc.setColSortIndex(column, sortIndex);
}
}
if (pinned !== void 0) {
pinnedCols?.setColPinned(column, pinned);
}
if (flex !== void 0) {
colFlex?.setColFlex(column, flex);
}
}
function _updateColumnState(beans, column, colDef, source) {
updateSomeColumnState(
beans,
column,
colDef.hide,
colDef.sort,
colDef.sortIndex,
colDef.pinned,
colDef.flex,
source
);
const colFlex = column.getFlex();
if (colFlex != null && colFlex > 0) {
return;
}
if (colDef.width != null) {
column.setActualWidth(colDef.width, source);
} else {
const widthBeforeUpdate = column.getActualWidth();
column.setActualWidth(widthBeforeUpdate, source);
}
}
function findExistingColumn(newColDef, existingColsCopy) {
if (!existingColsCopy)
return void 0;
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 void 0;
}
function _addColumnDefaultAndTypes(beans, colDef, colId, isAutoCol) {
const { gos, dataTypeSvc, validation: validation2 } = beans;
const res = {};
const defaultColDef = gos.get("defaultColDef");
_mergeDeep(res, defaultColDef, false, true);
const columnType = updateColDefAndGetColumnType(beans, res, colDef, colId);
if (columnType) {
assignColumnTypes(beans, columnType, res);
}
_mergeDeep(res, colDef, false, true);
const autoGroupColDef = gos.get("autoGroupColumnDef");
const isSortingCoupled = _isColumnsSortingCoupledToGroup(gos);
if (colDef.rowGroup && autoGroupColDef && isSortingCoupled) {
_mergeDeep(
res,
{ sort: autoGroupColDef.sort, initialSort: autoGroupColDef.initialSort },
false,
true
);
}
dataTypeSvc?.validateColDef(res);
validation2?.validateColDef(res, colId, isAutoCol);
return res;
}
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 ? convertColumnTypes(columnTypes) : void 0;
}
function assignColumnTypes(beans, typeKeys, colDefMerged) {
if (!typeKeys.length) {
return;
}
const allColumnTypes = Object.assign({}, DefaultColumnTypes);
const userTypes = beans.gos.get("columnTypes") || {};
for (const key of Object.keys(userTypes)) {
const value = userTypes[key];
if (key in allColumnTypes) {
_warn(34, { key });
} else {
const colType = value;
if (colType.type) {
_warn(35);
}
allColumnTypes[key] = value;
}
}
typeKeys.forEach((t) => {
const typeColDef = allColumnTypes[t.trim()];
if (typeColDef) {
_mergeDeep(colDefMerged, typeColDef, false, true);
} else {
_warn(36, { t });
}
});
}
function isColumnGroup(abstractColDef) {
return abstractColDef.children !== void 0;
}
function depthFirstOriginalTreeSearch(parent, tree, callback) {
if (!tree) {
return;
}
for (let i = 0; i < tree.length; i++) {
const child = tree[i];
if (isProvidedColumnGroup(child)) {
depthFirstOriginalTreeSearch(child, child.getChildren(), callback);
}
callback(child, parent);
}
}
// packages/ag-grid-community/src/columnMove/columnMoveUtils.ts
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];
}
function doesMovePassMarryChildren(allColumnsCopy, gridBalancedTree) {
let rulePassed = true;
depthFirstOriginalTreeSearch(null, gridBalancedTree, (child) => {
if (!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);
});
const maxIndex = Math.max.apply(Math, newIndexes);
const minIndex = Math.min.apply(Math, newIndexes);
const spread = maxIndex - minIndex;
const maxSpread = columnGroup.getLeafColumns().length - 1;
if (spread > maxSpread) {
rulePassed = false;
}
});
return rulePassed;
}
// packages/ag-grid-community/src/columns/columnEventUtils.ts
function getCommonValue(cols, valueGetter) {
if (!cols || cols.length == 0) {
return void 0;
}
const firstValue = valueGetter(cols[0]);
for (let i = 1; i < cols.length; i++) {
if (firstValue !== valueGetter(cols[i])) {
return void 0;
}
}
return firstValue;
}
function dispatchColumnPinnedEvent(eventSvc, changedColumns, source) {
if (!changedColumns.length) {
return;
}
const column = changedColumns.length === 1 ? changedColumns[0] : null;
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
});
}
function dispatchColumnVisibleEvent(eventSvc, changedColumns, source) {
if (!changedColumns.length) {
return;
}
const column = changedColumns.length === 1 ? changedColumns[0] : null;
const visible = getCommonValue(changedColumns, (col) => col.isVisible());
eventSvc.dispatchEvent({
type: "columnVisible",
visible,
columns: changedColumns,
column,
source
});
}
function dispatchColumnChangedEvent(eventSvc, type, columns, source) {
eventSvc.dispatchEvent({
type,
columns,
column: columns && columns.length == 1 ? columns[0] : null,
source
});
}
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
});
}
}
// packages/ag-grid-community/src/columns/columnStateUtils.ts
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) {
_warn(32);
return false;
}
const syncColumnWithStateItem = (column, stateItem, rowGroupIndexes, pivotIndexes, autoCol) => {
if (!column) {
return;
}
const getValue = getValueFactory(stateItem, params.defaultState);
const flex = getValue("flex").value1;
updateSomeColumnState(
beans,
column,
getValue("hide").value1,
getValue("sort").value1,
getValue("sortIndex").value1,
getValue("pinned").value1,
flex,
source
);
if (flex == null) {
const width = getValue("width").value1;
if (width != null) {
const minColWidth = column.getColDef().minWidth ?? environment.getDefaultColumnMinWidth();
if (minColWidth != null && width >= minColWidth) {
column.setActualWidth(width, source);
}
}
}
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, getById2) => {
const dispatchEventsFunc = _compareColumnStatesAndDispatchEvents(beans, source);
const columnsWithNoState = existingColumns.slice();
const rowGroupIndexes = {};
const pivotIndexes = {};
const autoColStates = [];
const selectionColStates = [];
const unmatchedAndAutoStates2 = [];
let unmatchedCount2 = 0;
const previousRowGroupCols = rowGroupColsSvc?.columns.slice() ?? [];
const previousPivotCols = pivotColsSvc?.columns.slice() ?? [];
states.forEach((state) => {
const colId = state.colId;
const isAutoGroupColumn = colId.startsWith(GROUP_AUTO_COLUMN_ID);
if (isAutoGroupColumn) {
autoColStates.push(state);
unmatchedAndAutoStates2.push(state);
return;
}
if (isColumnSelectionCol(colId)) {
selectionColStates.push(state);
unmatchedAndAutoStates2.push(state);
return;
}
const column = getById2(colId);
if (!column) {
unmatchedAndAutoStates2.push(state);
unmatchedCount2 += 1;
} else {
syncColumnWithStateItem(column, state, rowGroupIndexes, pivotIndexes, false);
_removeFromArray(columnsWithNoState, column);
}
});
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);
_removeFromArray(columns, col);
syncColumnWithStateItem(col, stateItem, null, null, true);
});
columns.forEach(applyDefaultsFunc);
};
syncColStates(
(colId) => autoColSvc?.getColumn(colId) ?? null,
autoColStates,
autoColSvc?.getColumns()?.slice()
);
syncColStates(
(colId) => selectionColSvc?.getColumn(colId) ?? null,
selectionColStates,
selectionColSvc?.getColumns()?.slice()
);
orderLiveColsLikeState(params, colModel, gos);
visibleCols.refresh(source);
eventSvc.dispatchEvent({
type: "columnEverythingChanged",
source
});
dispatchEventsFunc();
return { unmatchedAndAutoStates: unmatchedAndAutoStates2, unmatchedCount: unmatchedCount2 };
};
colAnimation?.start();
let { unmatchedAndAutoStates, unmatchedCount } = applyStates(
params.state || [],
providedCols,
(id) => colModel.getColDefCol(id)
);
if (unmatchedAndAutoStates.length > 0 || _exists(params.defaultState)) {
const pivotResultColsList = pivotResultCols?.getPivotResultCols()?.list ?? [];
unmatchedCount = applyStates(
unmatchedAndAutoStates,
pivotResultColsList,
(id) => pivotResultCols?.getPivotResultCol(id) ?? null
).unmatchedCount;
}
colAnimation?.finish();
return unmatchedCount === 0;
}
function _resetColumnState(beans, source) {
const { colModel, autoColSvc } = beans;
const primaryCols = colModel.getColDefCols();
if (!primaryCols?.length) {
return;
}
const primaryColumnTree = colModel.getColDefColTree();
const primaryColumns = _getColumnsFromTree(primaryColumnTree);
const columnStates = [];
let letRowGroupIndex = 1e3;
let letPivotIndex = 1e3;
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 (_missing(stateItem.rowGroupIndex) && stateItem.rowGroup) {
stateItem.rowGroupIndex = letRowGroupIndex++;
}
if (_missing(stateItem.pivotIndex) && stateItem.pivot) {
stateItem.pivotIndex = letPivotIndex++;
}
columnStates.push(stateItem);
});
_applyColumnState(beans, { state: columnStates, applyOrder: true }, source);
}
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();
const dispatchWhenListsDifferent = (eventType, colsBefore, colsAfter, idMapper) => {
const beforeList = colsBefore.map(idMapper);
const afterList = colsAfter.map(idMapper);
const unchanged = _areEqual(beforeList, afterList);
if (unchanged) {
return;
}
const changes = new Set(colsBefore);
colsAfter.forEach((id) => {
if (!changes.delete(id)) {
changes.add(id);
}
});
const changesArr = [...changes];
eventSvc.dispatchEvent({
type: eventType,
columns: changesArr,
column: changesArr.length === 1 ? changesArr[0] : null,
source
});
};
const getChangedColumns = (changedPredicate) => {
const changedColumns2 = [];
colsForState.forEach((column) => {
const colStateBefore = columnStateBeforeMap[column.getColId()];
if (colStateBefore && changedPredicate(colStateBefore, column)) {
changedColumns2.push(column);
}
});
return changedColumns2;
};
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();
const aggFuncChanged = oldActive && cs.aggFunc != c.getAggFunc();
return activeChanged || aggFuncChanged;
};
const changedValues = getChangedColumns(valueChangePredicate);
if (changedValues.length > 0) {
dispatchColumnChangedEvent(eventSvc, "columnValueChanged", changedValues, source);
}
const resizeChangePredicate = (cs, c) => cs.width != c.getActualWidth();
dispatchColumnResizedEvent(eventSvc, getChangedColumns(resizeChangePredicate), true, source);
const pinnedChangePredicate = (cs, c) => cs.pinned != c.getPinned();
dispatchColumnPinnedEvent(eventSvc, getChangedColumns(pinnedChangePredicate), source);
const visibilityChangePredicate = (cs, c) => cs.hide == c.isVisible();
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);
normaliseColumnMovedEventForColumnState(columnStateBefore, colStateAfter, source, colModel, eventSvc);
};
}
function _getColumnState(beans) {
const { colModel, rowGroupColsSvc, pivotColsSvc } = beans;
const primaryCols = colModel.getColDefCols();
if (_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 res2 = {
colId: column.getColId(),
width: column.getActualWidth(),
hide: !column.isVisible(),
pinned: column.getPinned(),
sort,
sortIndex,
aggFunc,
rowGroup: column.isRowGroupActive(),
rowGroupIndex,
pivot: column.isPivotActive(),
pivotIndex,
flex: column.getFlex() ?? null
};
return res2;
};
const res = colsForState.map((col) => createStateItemFromColumn(col));
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;
}
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
};
}
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;
}
});
let autoGroupInsertIndex = 0;
cols.list.forEach((col) => {
const colId = col.getColId();
const alreadyProcessed = processedColIds[colId] != null;
if (alreadyProcessed) {
return;
}
const isAutoGroupCol = colId.startsWith(GROUP_AUTO_COLUMN_ID);
if (isAutoGroupCol) {
newOrder.splice(autoGroupInsertIndex++, 0, col);
} else {
newOrder.push(col);
}
});
newOrder = placeLockedColumns(newOrder, gos);
if (!doesMovePassMarryChildren(newOrder, colModel.getColTree())) {
_warn(39);
return;
}
cols.list = newOrder;
}
function normaliseColumnMovedEventForColumnState(colStateBefore, colStateAfter, source, colModel, eventSvc) {
const colStateAfterMapped = {};
colStateAfter.forEach((s) => colStateAfterMapped[s.colId] = s);
const colsIntersectIds = {};
colStateBefore.forEach((s) => {
if (colStateAfterMapped[s.colId]) {
colsIntersectIds[s.colId] = true;
}
});
const beforeFiltered = colStateBefore.filter((c) => colsIntersectIds[c.colId]);
const afterFiltered = colStateAfter.filter((c) => colsIntersectIds[c.colId]);
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
});
}
var 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) {
return indexA - indexB;
}
if (aHasIndex) {
return -1;
}
if (bHasIndex) {
return 1;
}
const oldIndexA = oldList.indexOf(colA);
const oldIndexB = oldList.indexOf(colB);
const aHasOldIndex = oldIndexA >= 0;
const bHasOldIndex = oldIndexB >= 0;
if (aHasOldIndex && bHasOldIndex) {
return oldIndexA - oldIndexB;
}
if (aHasOldIndex) {
return -1;
}
return 1;
};
// packages/ag-grid-community/src/columns/columnModel.ts
var ColumnModel = class extends 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(_convertColumnEventSourceType(event.source))
);
this.addManagedPropertyListeners(
["defaultColDef", "defaultColGroupDef", "columnTypes", "suppressFieldDotNotation"],
this.recreateColumnDefs.bind(this)
);
this.addManagedPropertyListener(
"pivotMode",
(event) => this.setPivotMode(this.gos.get("pivotMode"), _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;
const dispatchEventsFunc = this.colDefs ? _compareColumnStatesAndDispatchEvents(beans, source) : void 0;
valueCache?.expire();
const oldCols = this.colDefCols?.list;
const oldTree = this.colDefCols?.tree;
const newTree = _createColumnTree(beans, this.colDefs, true, oldTree, source);
_destroyColumnTree(beans, this.colDefCols?.tree, newTree.columnTree);
const tree = newTree.columnTree;
const treeDepth = newTree.treeDept;
const list = _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();
eventSvc.dispatchEvent({
type: "columnEverythingChanged",
source
});
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 = _shouldMaintainColumnOrder(this.gos, this.showingPivotResult);
if (!newColDefs || shouldSortNewColDefs) {
this.restoreColOrder(cols);
}
this.positionLockedCols(cols);
showRowGroupCols?.refresh();
quickFilter?.refreshCols();
this.setColSpanActive();
rowAutoHeight?.setAutoHeightActive(cols);
visibleCols.clear();
colViewport.clear();
const dispatchChangedEvent = !_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) {
const hasSameColumns = pivotResultCols.list.some((col) => this.cols?.map[col.getColId()] !== void 0);
if (!hasSameColumns) {
this.lastPivotOrder = null;
}
}
return this.cols;
}
getColsToShow() {
if (!this.cols) {
return [];
}
const showAutoGroupAndValuesOnly = this.isPivotMode() && !this.showingPivotResult;
const valueColumns = this.beans.valueColsSvc?.columns;
const res = this.cols.list.filter((col) => {
const isAutoGroupCol = isColumnGroupAutoCol(col);
if (showAutoGroupAndValuesOnly) {
const isValueCol = valueColumns?.includes(col);
return isAutoGroupCol || isValueCol;
} else {
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) {
_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]));
const noColsFound = !cols.list.some((col) => lastOrderMapped.has(col));
if (noColsFound) {
return;
}
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));
const res = lastOrderFiltered.slice();
missingFromLastOrder.forEach((newCol) => {
let parent = newCol.getOriginalParent();
if (!parent) {
res.push(newCol);
return;
}
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 (!siblings.length) {
res.push(newCol);
return;
}
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 = 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 ?? []
) : void 0;
}
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;
}
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;
}
this.beans.autoColSvc?.updateColumns(e);
const source = _convertColumnEventSourceType(e.source);
this.createColsFromColDefs(source);
}
setColumnDefs(columnDefs, source) {
this.colDefs = columnDefs;
this.createColsFromColDefs(source);
}
destroy() {
_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;
if (typeof key == "string" && map[key]) {
return map[key];
}
for (let i = 0; i < list.length; i++) {
if (_columnsMatch(list[i], key)) {
return list[i];
}
}
return this.beans.autoColSvc?.getColumn(key) ?? this.beans.selectionColSvc?.getColumn(key) ?? null;
}
};
// packages/ag-grid-community/src/columns/baseColsService.ts
var BaseColsService = class extends BeanStub {
constructor() {
super(...arguments);
this.dispatchColumnChangedEvent = 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 = /* @__PURE__ */ new Map();
masterList.forEach((col, idx) => changes.set(col, idx));
masterList.length = 0;
if (_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 (oldIndex === void 0) {
changes.set(col, 0);
return;
}
if (detectOrderChange && oldIndex !== idx) {
return;
}
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 = /* @__PURE__ */ 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++) {
updatedCols.add(masterList[i]);
}
_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() || [];
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 !== void 0;
const indexPresent = index !== void 0;
const initialValuePresent = initialValue !== void 0;
const initialIndexPresent = initialIndex !== void 0;
if (valuePresent) {
include = value;
} else if (indexPresent) {
if (index === null) {
include = false;
} else {
include = index >= 0;
}
} else {
if (colIsNew) {
if (initialValuePresent) {
include = initialValue;
} else if (initialIndexPresent) {
include = initialIndex != null && initialIndex >= 0;
} else {
include = false;
}
} else {
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;
};
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);
previousCols.forEach((col) => {
if (colsWithValue.indexOf(col) >= 0) {
res.push(col);
}
});
colsWithValue.forEach((col) => {
if (res.indexOf(col) < 0) {
res.push(col);
}
});
previousCols.forEach((col) => {
if (res.indexOf(col) < 0) {
setFlagFunc(col, false, source);
}
});
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++;
}
}
let index = 1e3;
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)) {
processPrecedingNewCols(colId);
incomingColumnState[colId][indexProp] = index++;
} else {
const colDef = column.getColDef();
const missingIndex = colDef[indexProp] === null || colDef[indexProp] === void 0 && colDef[initialIndexProp] == null;
if (missingIndex) {
if (!hasAddedNewCols) {
const propEnabled = colDef[enableProp] || colDef[enableProp] === void 0 && colDef[initialEnableProp];
if (propEnabled) {
processPrecedingNewCols(colId);
} else {
newColIds.forEach((newColId) => {
incomingColumnState[newColId][indexProp] = index + originalOrderMap[newColId];
});
index += colIdsInOriginalOrder.length;
hasAddedNewCols = true;
}
}
if (!columnStateAccumulator[colId]) {
columnStateAccumulator[colId] = { colId };
}
columnStateAccumulator[colId][indexProp] = index++;
}
}
});
return columnStateAccumulator;
}
};
// packages/ag-grid-community/src/columns/groupInstanceIdCreator.ts
var GroupInstanceIdCreator = class {
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") {
result = 0;
} else {
result = lastResult + 1;
}
this.existingIds[key] = result;
return result;
}
};
// packages/ag-grid-community/src/components/emptyBean.ts
var EmptyBean = class extends BeanStub {
};
function setupCompBean(ctrl, ctx, compBean) {
if (compBean) {
ctrl.addDestroyFunc(() => ctx.destroyBean(compBean));
}
return compBean ?? ctrl;
}
// packages/ag-grid-community/src/rendering/cssClassManager.ts
var CssClassManager = class {
constructor(getGui) {
// to minimise DOM hits, we only apply CSS classes if they have changed. as adding a CSS class that is already
// there, or removing one that wasn't present, all takes CPU.
this.cssClassStates = {};
this.getGui = getGui;
}
addCssClass(className) {
this.addOrRemoveCssClass(className, true);
}
removeCssClass(className) {
this.addOrRemoveCssClass(className, false);
}
containsCssClass(className) {
const eGui = this.getGui();
if (!eGui) {
return false;
}
return eGui.classList.contains(className);
}
addOrRemoveCssClass(className, addOrRemove) {
if (!className) {
return;
}
if (className.indexOf(" ") >= 0) {
const list = (className || "").split(" ");
if (list.length > 1) {
list.forEach((cls) => this.addOrRemoveCssClass(cls, addOrRemove));
return;
}
}
const updateNeeded = this.cssClassStates[className] !== addOrRemove;
if (updateNeeded && className.length) {
const eGui = this.getGui();
if (eGui) {
eGui.classList.toggle(className, addOrRemove);
}
this.cssClassStates[className] = addOrRemove;
}
}
};
// packages/ag-grid-community/src/widgets/component.ts
var compIdSequence = 0;
var RefPlaceholder = null;
var Component = class extends BeanStub {
constructor(template, componentSelectors) {
super();
this.suppressDataRefValidation = false;
// if false, then CSS class "ag-hidden" is applied, which sets "display: none"
this.displayed = true;
// if false, then CSS class "ag-invisible" is applied, which sets "visibility: hidden"
this.visible = true;
// unique id for this row component. this is used for getting a reference to the HTML dom.
// we cannot use the RowNode id as this is not unique (due to animation, old rows can be lying
// around as we create a new rowComp instance for the same row node).
this.compId = compIdSequence++;
this.cssClassManager = new CssClassManager(() => this.eGui);
this.componentSelectors = new Map((componentSelectors ?? []).map((comp) => [comp.selector, comp]));
if (template) {
this.setTemplate(template);
}
}
preConstruct() {
this.wireTemplate(this.getGui());
const debugId = "component-" + Object.getPrototypeOf(this)?.constructor?.name;
this.css?.forEach((css) => this.beans.environment.addGlobalCSS(css, debugId));
}
wireTemplate(element, paramsMap) {
if (element && this.gos) {
this.applyElementsToComponent(element);
this.createChildComponentsFromTags(element, paramsMap);
}
}
getCompId() {
return this.compId;
}
getDataRefAttribute(element) {
if (element.getAttribute) {
return element.getAttribute("data-ref");
}
return null;
}
applyElementsToComponent(element, elementRef, paramsMap, newComponent = null) {
if (elementRef === void 0) {
elementRef = this.getDataRefAttribute(element);
}
if (elementRef) {
const current = this[elementRef];
if (current === RefPlaceholder) {
this[elementRef] = newComponent ?? element;
} else {
const usedAsParamRef = paramsMap && paramsMap[elementRef];
if (!this.suppressDataRefValidation && !usedAsParamRef) {
throw new Error(`data-ref: ${elementRef} on ${this.constructor.name} with ${current}`);
}
}
}
}
// for registered components only, eg creates AgCheckbox instance from ag-checkbox HTML tag
createChildComponentsFromTags(parentNode, paramsMap) {
const childNodeList = _copyNodeList(parentNode.childNodes);
childNodeList.forEach((childNode) => {
if (!(childNode instanceof HTMLElement)) {
return;
}
const childComp = this.createComponentFromElement(
childNode,
(childComp2) => {
const childGui = childComp2.getGui();
if (childGui) {
this.copyAttributesFromNode(childNode, childComp2.getGui());
}
},
paramsMap
);
if (childComp) {
if (childComp.addItems && childNode.children.length) {
this.createChildComponentsFromTags(childNode, paramsMap);
const items = Array.prototype.slice.call(childNode.children);
childComp.addItems(items);
}
this.swapComponentForNode(childComp, parentNode, childNode);
} else if (childNode.childNodes) {
this.createChildComponentsFromTags(childNode, paramsMap);
}
});
}
createComponentFromElement(element, afterPreCreateCallback, paramsMap) {
const key = element.nodeName;
const elementRef = this.getDataRefAttribute(element);
const isAgGridComponent = key.indexOf("AG-") === 0;
const componentSelector = isAgGridComponent ? this.componentSelectors.get(key) : null;
let newComponent = null;
if (componentSelector) {
const componentParams = paramsMap && elementRef ? paramsMap[elementRef] : void 0;
newComponent = new componentSelector.component(componentParams);
newComponent.setParentComponent(this);
this.createBean(newComponent, null, afterPreCreateCallback);
} else if (isAgGridComponent) {
throw new Error(`selector: ${key}`);
}
this.applyElementsToComponent(element, elementRef, paramsMap, newComponent);
return newComponent;
}
copyAttributesFromNode(source, dest) {
_iterateNamedNodeMap(source.attributes, (name, value) => dest.setAttribute(name, value));
}
swapComponentForNode(newComponent, parentNode, childNode) {
const eComponent = newComponent.getGui();
parentNode.replaceChild(eComponent, childNode);
parentNode.insertBefore(document.createComment(childNode.nodeName), eComponent);
this.addDestroyFunc(this.destroyBean.bind(this, newComponent));
}
activateTabIndex(elements) {
const tabIndex = this.gos.get("tabIndex");
if (!elements) {
elements = [];
}
if (!elements.length) {
elements.push(this.getGui());
}
elements.forEach((el) => el.setAttribute("tabindex", tabIndex.toString()));
}
setTemplate(template, componentSelectors, paramsMap) {
const eGui = _loadTemplate(template);
this.setTemplateFromElement(eGui, componentSelectors, paramsMap);
}
setTemplateFromElement(element, components, paramsMap, suppressDataRefValidation = false) {
this.eGui = element;
this.suppressDataRefValidation = suppressDataRefValidation;
if (components) {
for (let i = 0; i < components.length; i++) {
const component = components[i];
this.componentSelectors.set(component.selector, component);
}
}
this.wireTemplate(element, paramsMap);
}
getGui() {
return this.eGui;
}
getFocusableElement() {
return this.eGui;
}
getAriaElement() {
return this.getFocusableElement();
}
setParentComponent(component) {
this.parentComponent = component;
}
getParentComponent() {
return this.parentComponent;
}
// this method is for older code, that wants to provide the gui element,
// it is not intended for this to be in ag-Stack
setGui(eGui) {
this.eGui = eGui;
}
queryForHtmlElement(cssSelector) {
return this.eGui.querySelector(cssSelector);
}
getContainerAndElement(newChild, container) {
let parent = container;
if (newChild == null) {
return null;
}
if (!parent) {
parent = this.eGui;
}
if (_isNodeOrElement(newChild)) {
return {
element: newChild,
parent
};
}
return {
element: newChild.getGui(),
parent
};
}
prependChild(newChild, container) {
const { element, parent } = this.getContainerAndElement(newChild, container) || {};
if (!element || !parent) {
return;
}
parent.insertAdjacentElement("afterbegin", element);
}
appendChild(newChild, container) {
const { element, parent } = this.getContainerAndElement(newChild, container) || {};
if (!element || !parent) {
return;
}
parent.appendChild(element);
}
isDisplayed() {
return this.displayed;
}
setVisible(visible, options = {}) {
if (visible !== this.visible) {
this.visible = visible;
const { skipAriaHidden } = options;
_setVisible(this.eGui, visible, { skipAriaHidden });
}
}
setDisplayed(displayed, options = {}) {
if (displayed !== this.displayed) {
this.displayed = displayed;
const { skipAriaHidden } = options;
_setDisplayed(this.eGui, displayed, { skipAriaHidden });
const event = {
type: "displayChanged",
visible: this.displayed
};
this.dispatchLocalEvent(event);
}
}
destroy() {
if (this.parentComponent) {
this.parentComponent = void 0;
}
super.destroy();
}
addGuiEventListener(event, listener, options) {
this.eGui.addEventListener(event, listener, options);
this.addDestroyFunc(() => this.eGui.removeEventListener(event, listener));
}
addCssClass(className) {
this.cssClassManager.addCssClass(className);
}
removeCssClass(className) {
this.cssClassManager.removeCssClass(className);
}
containsCssClass(className) {
return this.cssClassManager.containsCssClass(className);
}
addOrRemoveCssClass(className, addOrRemove) {
this.cssClassManager.addOrRemoveCssClass(className, addOrRemove);
}
registerCSS(css) {
this.css || (this.css = []);
this.css.push(css);
}
};
// packages/ag-grid-community/src/utils/promise.ts
function _isPromise(fn) {
if (typeof fn.then === "function") {
return true;
}
return false;
}
var AgPromise = class _AgPromise {
constructor(callback) {
this.status = 0 /* IN_PROGRESS */;
this.resolution = null;
this.waiters = [];
callback(
(value) => this.onDone(value),
(params) => this.onReject(params)
);
}
static all(promises) {
return promises.length ? new _AgPromise((resolve) => {
let remainingToResolve = promises.length;
const combinedValues = new Array(remainingToResolve);
promises.forEach((promise, index) => {
promise.then((value) => {
combinedValues[index] = value;
remainingToResolve--;
if (remainingToResolve === 0) {
resolve(combinedValues);
}
});
});
}) : _AgPromise.resolve();
}
static resolve(value = null) {
return new _AgPromise((resolve) => resolve(value));
}
then(func) {
return new _AgPromise((resolve) => {
if (this.status === 1 /* RESOLVED */) {
resolve(func(this.resolution));
} else {
this.waiters.push((value) => resolve(func(value)));
}
});
}
onDone(value) {
this.status = 1 /* RESOLVED */;
this.resolution = value;
this.waiters.forEach((waiter) => waiter(value));
}
onReject(_) {
}
};
// packages/ag-grid-community/src/components/framework/userComponentFactory.ts
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;
if (defObject) {
const defObjectAny = defObject;
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 {
assignComp(defObjectAny[name]);
}
}
return { compName, jsComp, fwComp, paramsFromSelector, popupFromSelector, popupPositionFromSelector };
}
var UserComponentFactory = class extends 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);
let defaultCompParams;
const lookupFromRegistry = (key) => {
const item = this.registry.getUserComponent(name, key);
if (item) {
jsComp = !item.componentFromFramework ? item.component : void 0;
fwComp = item.componentFromFramework ? item.component : void 0;
defaultCompParams = item.params;
}
};
if (compName != null) {
lookupFromRegistry(compName);
}
if (jsComp == null && fwComp == null && defaultName != null) {
lookupFromRegistry(defaultName);
}
if (jsComp && cellRenderer && !doesImplementIComponent(jsComp)) {
jsComp = this.agCompUtils?.adaptFunction(type, jsComp);
}
if (!jsComp && !fwComp) {
const { validation: validation2 } = this.beans;
if (mandatory && (compName !== defaultName || !defaultName)) {
if (compName) {
if (!validation2?.isProvidedUserComp(compName)) {
_error(50, { compName });
}
} else {
if (defaultName) {
if (!validation2) {
_error(260, {
...this.gos.getModuleErrorParams(),
propName: name,
compName: defaultName
});
}
} else {
_error(216, { name });
}
}
} else if (defaultName && !validation2) {
_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,
popupFromSelector,
popupPositionFromSelector,
newAgStackInstance: () => this.newAgStackInstance(componentClass, componentFromFramework, paramsMerged, type)
};
}
newAgStackInstance(ComponentClass, componentFromFramework, params, type) {
const jsComponent = !componentFromFramework;
let instance;
if (jsComponent) {
instance = new ComponentClass();
} else {
instance = this.frameworkCompWrapper.wrap(
ComponentClass,
type.mandatoryMethods,
type.optionalMethods,
type
);
}
this.createBean(instance);
const deferredInit = instance.init?.(params);
if (deferredInit == null) {
return 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 };
const defObjectAny = defObject;
const userParams = defObjectAny && defObjectAny[type.name + "Params"];
if (typeof userParams === "function") {
const userParamsFromFunc = userParams(paramsFromGrid);
_mergeDeep(params, userParamsFromFunc);
} else if (typeof userParams === "object") {
_mergeDeep(params, userParams);
}
_mergeDeep(params, paramsFromSelector);
return params;
}
};
// packages/ag-grid-community/src/components/framework/userCompUtils.ts
var DateComponent = {
name: "dateComponent",
mandatoryMethods: ["getDate", "setDate"],
optionalMethods: ["afterGuiAttached", "setInputPlaceholder", "setInputAriaLabel", "setDisabled", "refresh"]
};
var DragAndDropImageComponent = {
name: "dragAndDropImageComponent",
mandatoryMethods: ["setIcon", "setLabel"]
};
var HeaderComponent = { name: "headerComponent", optionalMethods: ["refresh"] };
var InnerHeaderComponent = { name: "innerHeaderComponent" };
var InnerHeaderGroupComponent = { name: "innerHeaderGroupComponent" };
var HeaderGroupComponent = { name: "headerGroupComponent" };
var InnerCellRendererComponent = {
name: "innerRenderer",
cellRenderer: true,
optionalMethods: ["afterGuiAttached"]
};
var CellRendererComponent = {
name: "cellRenderer",
optionalMethods: ["refresh", "afterGuiAttached"],
cellRenderer: true
};
var EditorRendererComponent = {
name: "cellRenderer",
optionalMethods: ["refresh", "afterGuiAttached"]
};
var LoadingCellRendererComponent = { name: "loadingCellRenderer", cellRenderer: true };
var CellEditorComponent = {
name: "cellEditor",
mandatoryMethods: ["getValue"],
optionalMethods: [
"isPopup",
"isCancelBeforeStart",
"isCancelAfterEnd",
"getPopupPosition",
"focusIn",
"focusOut",
"afterGuiAttached",
"refresh"
]
};
var LoadingOverlayComponent = { name: "loadingOverlayComponent", optionalMethods: ["refresh"] };
var NoRowsOverlayComponent = { name: "noRowsOverlayComponent", optionalMethods: ["refresh"] };
var TooltipComponent = { name: "tooltipComponent" };
var FilterComponent = {
name: "filter",
mandatoryMethods: ["isFilterActive", "doesFilterPass", "getModel", "setModel"],
optionalMethods: [
"afterGuiAttached",
"afterGuiDetached",
"onNewRowsLoaded",
"getModelAsString",
"onFloatingFilterChanged",
"onAnyFilterChanged",
"refresh"
]
};
var FloatingFilterComponent = {
name: "floatingFilterComponent",
mandatoryMethods: ["onParentModelChanged"],
optionalMethods: ["afterGuiAttached", "refresh"]
};
var FullWidth = {
name: "fullWidthCellRenderer",
optionalMethods: ["refresh", "afterGuiAttached"],
cellRenderer: true
};
var FullWidthLoading = { name: "loadingCellRenderer", cellRenderer: true };
var FullWidthGroup = {
name: "groupRowRenderer",
optionalMethods: ["afterGuiAttached"],
cellRenderer: true
};
var FullWidthDetail = { name: "detailCellRenderer", optionalMethods: ["refresh"], cellRenderer: true };
function _getDragAndDropImageCompDetails(userCompFactory, params) {
return userCompFactory.getCompDetailsFromGridOptions(DragAndDropImageComponent, "agDragAndDropImage", params, true);
}
function _getInnerCellRendererDetails(userCompFactory, def, params) {
return userCompFactory.getCompDetails(def, InnerCellRendererComponent, void 0, params);
}
function _getHeaderCompDetails(userCompFactory, colDef, params) {
return userCompFactory.getCompDetails(colDef, HeaderComponent, "agColumnHeader", params);
}
function _getInnerHeaderCompDetails(userCompFactory, headerCompParams, params) {
return userCompFactory.getCompDetails(headerCompParams, InnerHeaderComponent, void 0, params);
}
function _getHeaderGroupCompDetails(userCompFactory, params) {
const colGroupDef = params.columnGroup.getColGroupDef();
return userCompFactory.getCompDetails(colGroupDef, HeaderGroupComponent, "agColumnGroupHeader", params);
}
function _getInnerHeaderGroupCompDetails(userCompFactory, headerGroupCompParams, params) {
return userCompFactory.getCompDetails(headerGroupCompParams, InnerHeaderGroupComponent, void 0, params);
}
function _getFullWidthCellRendererDetails(userCompFactory, params) {
return userCompFactory.getCompDetailsFromGridOptions(FullWidth, void 0, params, true);
}
function _getFullWidthLoadingCellRendererDetails(userCompFactory, params) {
return userCompFactory.getCompDetailsFromGridOptions(FullWidthLoading, "agLoadingCellRenderer", params, true);
}
function _getFullWidthGroupCellRendererDetails(userCompFactory, params) {
return userCompFactory.getCompDetailsFromGridOptions(FullWidthGroup, "agGroupRowRenderer", params, true);
}
function _getFullWidthDetailCellRendererDetails(userCompFactory, params) {
return userCompFactory.getCompDetailsFromGridOptions(FullWidthDetail, "agDetailCellRenderer", params, true);
}
function _getCellRendererDetails(userCompFactory, def, params) {
return userCompFactory.getCompDetails(def, CellRendererComponent, void 0, params);
}
function _getEditorRendererDetails(userCompFactory, def, params) {
return userCompFactory.getCompDetails(
def,
EditorRendererComponent,
void 0,
params
);
}
function _getLoadingCellRendererDetails(userCompFactory, def, params) {
return userCompFactory.getCompDetails(def, LoadingCellRendererComponent, "agSkeletonCellRenderer", params, true);
}
function _getCellEditorDetails(userCompFactory, def, params) {
return userCompFactory.getCompDetails(def, CellEditorComponent, "agCellEditor", params, true);
}
function _getFilterDetails(userCompFactory, def, params, defaultFilter) {
return userCompFactory.getCompDetails(def, FilterComponent, defaultFilter, params, true);
}
function _getDateCompDetails(userCompFactory, params) {
return userCompFactory.getCompDetailsFromGridOptions(DateComponent, "agDateInput", params, true);
}
function _getLoadingOverlayCompDetails(userCompFactory, params) {
return userCompFactory.getCompDetailsFromGridOptions(LoadingOverlayComponent, "agLoadingOverlay", params, true);
}
function _getNoRowsOverlayCompDetails(userCompFactory, params) {
return userCompFactory.getCompDetailsFromGridOptions(NoRowsOverlayComponent, "agNoRowsOverlay", params, true);
}
function _getTooltipCompDetails(userCompFactory, params) {
return userCompFactory.getCompDetails(params.colDef, TooltipComponent, "agTooltipComponent", params, true);
}
function _getFloatingFilterCompDetails(userCompFactory, def, params, defaultFloatingFilter) {
return userCompFactory.getCompDetails(def, FloatingFilterComponent, defaultFloatingFilter, params);
}
function _getFilterCompKeys(frameworkOverrides, def) {
return _getUserCompKeys(frameworkOverrides, def, FilterComponent);
}
function _mergeFilterParamsWithApplicationProvidedParams(userCompFactory, defObject, paramsFromGrid) {
return userCompFactory.mergeParams(defObject, FilterComponent, paramsFromGrid);
}
// packages/ag-grid-community/src/components/framework/unwrapUserComp.ts
function _unwrapUserComp(comp) {
const compAsAny = comp;
const isProxy = compAsAny != null && compAsAny.getFrameworkComponentInstance != null;
return isProxy ? compAsAny.getFrameworkComponentInstance() : comp;
}
// packages/ag-grid-community/src/modules/moduleRegistry.ts
var allRegisteredModules = /* @__PURE__ */ new Set();
var globalModulesMap = {};
var gridModulesMap = {};
var currentModuleVersion;
var areGridScopedModules = false;
var isUmd = false;
function isValidModuleVersion(module2) {
const [moduleMajor, moduleMinor] = module2.version.split(".") || [];
const [currentModuleMajor, currentModuleMinor] = currentModuleVersion.split(".") || [];
return moduleMajor === currentModuleMajor && moduleMinor === currentModuleMinor;
}
function runVersionChecks(module2) {
if (!currentModuleVersion) {
currentModuleVersion = module2.version;
}
const errorMsg = (details) => `You are using incompatible versions of AG Grid modules. Major and minor versions should always match across modules. ${details} Please update all modules to the same version.`;
if (!module2.version) {
_errorOnce(errorMsg(`'${module2.moduleName}' is incompatible.`));
} else if (!isValidModuleVersion(module2)) {
_errorOnce(
errorMsg(
`'${module2.moduleName}' is version ${module2.version} but the other modules are version ${currentModuleVersion}.`
)
);
}
if (module2.validate) {
const result = module2.validate();
if (!result.isValid) {
const errorResult = result;
_errorOnce(`${errorResult.message}`);
}
}
}
function _registerModule(module2, gridId) {
runVersionChecks(module2);
const rowModels = module2.rowModels ?? ["all"];
allRegisteredModules.add(module2);
let moduleStore;
if (gridId !== void 0) {
areGridScopedModules = true;
if (gridModulesMap[gridId] === void 0) {
gridModulesMap[gridId] = {};
}
moduleStore = gridModulesMap[gridId];
} else {
moduleStore = globalModulesMap;
}
rowModels.forEach((rowModel) => {
if (moduleStore[rowModel] === void 0) {
moduleStore[rowModel] = {};
}
moduleStore[rowModel][module2.moduleName] = module2;
});
if (module2.dependsOn) {
module2.dependsOn.forEach((dependency) => _registerModule(dependency, gridId));
}
}
function _unRegisterGridModules(gridId) {
delete gridModulesMap[gridId];
}
function _isModuleRegistered(moduleName, gridId, rowModel) {
const isRegisteredForRowModel = (model) => !!globalModulesMap[model]?.[moduleName] || !!gridModulesMap[gridId]?.[model]?.[moduleName];
return isRegisteredForRowModel(rowModel) || isRegisteredForRowModel("all");
}
function _areModulesGridScoped() {
return areGridScopedModules;
}
function _getRegisteredModules(gridId, rowModel) {
const gridModules = gridModulesMap[gridId] ?? {};
return [
...Object.values(globalModulesMap["all"] ?? {}),
...Object.values(gridModules["all"] ?? {}),
...Object.values(globalModulesMap[rowModel] ?? {}),
...Object.values(gridModules[rowModel] ?? {})
];
}
function _getAllRegisteredModules() {
return new Set(allRegisteredModules);
}
function _getGridRegisteredModules(gridId, rowModel) {
const gridModules = gridModulesMap[gridId] ?? {};
return [...Object.values(gridModules["all"] ?? {}), ...Object.values(gridModules[rowModel] ?? {})];
}
function _isUmd() {
return isUmd;
}
function _setUmd() {
isUmd = true;
}
var ModuleRegistry = class {
/**
* @deprecated v33 Use `registerModules([module])` instead.
*/
static register(module2) {
_registerModule(module2, void 0);
}
/**
* Globally register the given modules for all grids.
* @param modules - modules to register
*/
static registerModules(modules) {
modules.forEach((module2) => _registerModule(module2, void 0));
}
};
// packages/ag-grid-community/src/context/genericContext.ts
var GenericContext = class {
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 {
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) {
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) => {
instance.preWireBeans?.(this.beans);
instance.wireBeans?.(this.beans);
});
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;
}
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;
}
};
// packages/ag-grid-community/src/context/context.ts
var Context = class extends GenericContext {
init(params) {
this.gridId = params.gridId;
this.beans.context = this;
this.destroyCallback = params.destroyCallback;
super.init(params);
}
destroy() {
super.destroy();
_unRegisterGridModules(this.gridId);
this.destroyCallback?.();
}
getGridId() {
return this.gridId;
}
};
// packages/ag-grid-community/src/headerRendering/cells/cssClassApplier.ts
var CSS_FIRST_COLUMN = "ag-column-first";
var CSS_LAST_COLUMN = "ag-column-last";
function _getHeaderClassesFromColDef(abstractColDef, gos, column, columnGroup) {
if (_missing(abstractColDef)) {
return [];
}
return getColumnClassesFromCollDef(abstractColDef.headerClass, abstractColDef, gos, column, columnGroup);
}
function _getToolPanelClassesFromColDef(abstractColDef, gos, column, columnGroup) {
if (_missing(abstractColDef)) {
return [];
}
return getColumnClassesFromCollDef(abstractColDef.toolPanelClass, abstractColDef, gos, column, columnGroup);
}
function refreshFirstAndLastStyles(comp, column, presentedColsService) {
comp.addOrRemoveCssClass(CSS_FIRST_COLUMN, presentedColsService.isColAtEdge(column, "first"));
comp.addOrRemoveCssClass(CSS_LAST_COLUMN, presentedColsService.isColAtEdge(column, "last"));
}
function getClassParams(abstractColDef, gos, column, columnGroup) {
return _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,
columnGroup
});
}
function getColumnClassesFromCollDef(classesOrFunc, abstractColDef, gos, column, columnGroup) {
if (_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 [];
}
// packages/ag-grid-community/src/misc/animationFrameService.ts
function _requestAnimationFrame(beans, callback) {
const win = _getWindow(beans);
if (win.requestAnimationFrame) {
win.requestAnimationFrame(callback);
} else if (win.webkitRequestAnimationFrame) {
win.webkitRequestAnimationFrame(callback);
} else {
win.setTimeout(callback, 0);
}
}
var AnimationFrameService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "animationFrameSvc";
// p1 and p2 are create tasks are to do with row and cell creation.
// for them we want to execute according to row order, so we use
// TaskItem so we know what index the item is for.
this.createTasksP1 = { list: [], sorted: false };
// eg drawing back-ground of rows
this.createTasksP2 = { list: [], sorted: false };
// eg cell renderers, adding hover functionality
// destroy tasks are to do with row removal. they are done after row creation as the user will need to see new
// rows first (as blank is scrolled into view), when we remove the old rows (no longer in view) is not as
// important.
this.destroyTasks = [];
this.ticking = false;
// we need to know direction of scroll, to build up rows in the direction of
// the scroll. eg if user scrolls down, we extend the rows by building down.
this.scrollGoingDown = true;
this.lastPage = 0;
this.lastScrollTop = 0;
this.taskCount = 0;
this.cancelledTasks = /* @__PURE__ */ new Set();
}
setScrollTop(scrollTop) {
const { gos, pagination } = this.beans;
const isPaginationActive = gos.get("pagination");
this.scrollGoingDown = scrollTop >= this.lastScrollTop;
if (isPaginationActive && scrollTop === 0) {
const currentPage = pagination?.getCurrentPage() ?? 0;
if (currentPage !== this.lastPage) {
this.lastPage = currentPage;
this.scrollGoingDown = true;
}
}
this.lastScrollTop = scrollTop;
}
postConstruct() {
this.active = !this.gos.get("suppressAnimationFrame");
}
// this method is for our AG Grid sanity only - if animation frames are turned off,
// then no place in the code should be looking to add any work to be done in animation
// frames. this stops bugs - where some code is asking for a frame to be executed
// when it should not.
verifyAnimationFrameOn(methodName) {
if (this.active === false) {
_warn(92, { methodName });
}
}
createTask(task, index, list) {
this.verifyAnimationFrameOn(list);
const taskItem = { task, index, createOrder: ++this.taskCount };
this.addTaskToList(this[list], taskItem);
this.schedule();
}
cancelTask(task) {
this.cancelledTasks.add(task);
}
addTaskToList(taskList, task) {
taskList.list.push(task);
taskList.sorted = false;
}
sortTaskList(taskList) {
if (taskList.sorted) {
return;
}
const sortDirection = this.scrollGoingDown ? 1 : -1;
taskList.list.sort(
(a, b) => a.index !== b.index ? sortDirection * (b.index - a.index) : b.createOrder - a.createOrder
);
taskList.sorted = true;
}
addDestroyTask(task) {
this.verifyAnimationFrameOn("createTasksP3");
this.destroyTasks.push(task);
this.schedule();
}
executeFrame(millis) {
this.verifyAnimationFrameOn("executeFrame");
const p1TaskList = this.createTasksP1;
const p1Tasks = p1TaskList.list;
const p2TaskList = this.createTasksP2;
const p2Tasks = p2TaskList.list;
const destroyTasks = this.destroyTasks;
const frameStart = (/* @__PURE__ */ new Date()).getTime();
let duration = (/* @__PURE__ */ new Date()).getTime() - frameStart;
const noMaxMillis = millis <= 0;
const scrollFeature = this.beans.ctrlsSvc.getScrollFeature();
while (noMaxMillis || duration < millis) {
const gridBodyDidSomething = scrollFeature.scrollGridIfNeeded();
if (!gridBodyDidSomething) {
let task;
if (p1Tasks.length) {
this.sortTaskList(p1TaskList);
task = p1Tasks.pop().task;
} else if (p2Tasks.length) {
this.sortTaskList(p2TaskList);
task = p2Tasks.pop().task;
} else if (destroyTasks.length) {
task = destroyTasks.pop();
} else {
this.cancelledTasks.clear();
break;
}
if (!this.cancelledTasks.has(task)) {
task();
}
}
duration = (/* @__PURE__ */ new Date()).getTime() - frameStart;
}
if (p1Tasks.length || p2Tasks.length || destroyTasks.length) {
this.requestFrame();
} else {
this.ticking = false;
}
}
flushAllFrames() {
if (!this.active) {
return;
}
this.executeFrame(-1);
}
schedule() {
if (!this.active) {
return;
}
if (!this.ticking) {
this.ticking = true;
this.requestFrame();
}
}
requestFrame() {
const callback = this.executeFrame.bind(this, 60);
_requestAnimationFrame(this.beans, callback);
}
isQueueEmpty() {
return !this.ticking;
}
};
// packages/ag-grid-community/src/constants/keyCode.ts
var 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"
};
// packages/ag-grid-community/src/utils/focus.ts
var keyboardModeActive = false;
var instanceCount = 0;
function addKeyboardModeEvents(doc) {
if (instanceCount > 0) {
return;
}
doc.addEventListener("keydown", toggleKeyboardMode);
doc.addEventListener("mousedown", toggleKeyboardMode);
}
function removeKeyboardModeEvents(doc) {
if (instanceCount > 0)
return;
doc.removeEventListener("keydown", toggleKeyboardMode);
doc.removeEventListener("mousedown", toggleKeyboardMode);
}
function toggleKeyboardMode(event) {
const isKeyboardActive = keyboardModeActive;
const isKeyboardEvent = event.type === "keydown";
if (isKeyboardEvent) {
if (event.ctrlKey || event.metaKey || event.altKey) {
return;
}
}
if (isKeyboardActive === isKeyboardEvent) {
return;
}
keyboardModeActive = isKeyboardEvent;
}
function _registerKeyboardFocusEvents(beans) {
const eDocument = _getDocument(beans);
addKeyboardModeEvents(eDocument);
instanceCount++;
return () => {
instanceCount--;
removeKeyboardModeEvents(eDocument);
};
}
function _isKeyboardMode() {
return keyboardModeActive;
}
function _addFocusableContainerListener(beans, comp, eGui) {
comp.addManagedElementListeners(eGui, {
keydown: (e) => {
if (!e.defaultPrevented && e.key === KeyCode.TAB) {
const backwards = e.shiftKey;
if (!_findNextFocusableElement(beans, eGui, false, backwards)) {
if (_focusNextGridCoreContainer(beans, backwards)) {
e.preventDefault();
}
}
}
}
});
}
function _findFocusableElements(rootNode, exclude, onlyUnmanaged = false) {
const focusableString = FOCUSABLE_SELECTOR;
let excludeString = FOCUSABLE_EXCLUDE;
if (exclude) {
excludeString += ", " + exclude;
}
if (onlyUnmanaged) {
excludeString += ', [tabindex="-1"]';
}
const nodes = Array.prototype.slice.apply(rootNode.querySelectorAll(focusableString)).filter((node) => {
return _isVisible(node);
});
const excludeNodes = Array.prototype.slice.apply(rootNode.querySelectorAll(excludeString));
if (!excludeNodes.length) {
return nodes;
}
const diff = (a, b) => a.filter((element) => b.indexOf(element) === -1);
return diff(nodes, excludeNodes);
}
function _focusInto(rootNode, up = false, onlyUnmanaged = false, excludeTabGuards = false) {
const focusableElements = _findFocusableElements(
rootNode,
excludeTabGuards ? ".ag-tab-guard" : null,
onlyUnmanaged
);
const toFocus = up ? _last(focusableElements) : focusableElements[0];
if (toFocus) {
toFocus.focus({ preventScroll: true });
return true;
}
return false;
}
function _findNextFocusableElement(beans, rootNode, onlyManaged, backwards) {
const focusable = _findFocusableElements(rootNode, onlyManaged ? ':not([tabindex="-1"])' : null);
const activeEl = _getActiveDomElement(beans);
let currentIndex;
if (onlyManaged) {
currentIndex = focusable.findIndex((el) => el.contains(activeEl));
} else {
currentIndex = focusable.indexOf(activeEl);
}
const nextIndex = currentIndex + (backwards ? -1 : 1);
if (nextIndex < 0 || nextIndex >= focusable.length) {
return null;
}
return focusable[nextIndex];
}
function _findTabbableParent(node, limit = 5) {
let counter = 0;
while (node && _getTabIndex(node) === null && ++counter <= limit) {
node = node.parentElement;
}
if (_getTabIndex(node) === null) {
return null;
}
return node;
}
function _focusGridInnerElement(beans, fromBottom) {
return beans.ctrlsSvc.get("gridCtrl").focusInnerElement(fromBottom);
}
function _isHeaderFocusSuppressed(beans) {
return beans.gos.get("suppressHeaderFocus") || !!beans.overlays?.isExclusive();
}
function _isCellFocusSuppressed(beans) {
return beans.gos.get("suppressCellFocus") || !!beans.overlays?.isExclusive();
}
function _focusNextGridCoreContainer(beans, backwards, forceOut = false) {
const gridCtrl = beans.ctrlsSvc.get("gridCtrl");
if (!forceOut && gridCtrl.focusNextInnerContainer(backwards)) {
return true;
}
if (forceOut || !backwards && !gridCtrl.isDetailGrid()) {
gridCtrl.forceFocusOutOfContainer(backwards);
}
return false;
}
// packages/ag-grid-community/src/rendering/cell/cellKeyboardListenerFeature.ts
function _isDeleteKey(key, alwaysReturnFalseOnBackspace = false) {
if (key === KeyCode.DELETE) {
return true;
}
if (!alwaysReturnFalseOnBackspace && key === KeyCode.BACKSPACE) {
return _isMacOsUserAgent();
}
return false;
}
var CellKeyboardListenerFeature = class extends BeanStub {
constructor(cellCtrl, beans, rowNode, rowCtrl) {
super();
this.cellCtrl = cellCtrl;
this.rowNode = rowNode;
this.rowCtrl = rowCtrl;
this.beans = beans;
}
init() {
this.eGui = this.cellCtrl.eGui;
}
onKeyDown(event) {
const key = event.key;
switch (key) {
case KeyCode.ENTER:
this.onEnterKeyDown(event);
break;
case KeyCode.F2:
this.onF2KeyDown(event);
break;
case KeyCode.ESCAPE:
this.onEscapeKeyDown(event);
break;
case KeyCode.TAB:
this.onTabKeyDown(event);
break;
case KeyCode.BACKSPACE:
case KeyCode.DELETE:
this.onBackspaceOrDeleteKeyDown(key, event);
break;
case KeyCode.DOWN:
case KeyCode.UP:
case KeyCode.RIGHT:
case KeyCode.LEFT:
this.onNavigationKeyDown(event, key);
break;
}
}
onNavigationKeyDown(event, key) {
if (this.cellCtrl.editing) {
return;
}
if (event.shiftKey && this.cellCtrl.isRangeSelectionEnabled()) {
this.onShiftRangeSelect(event);
} else {
const currentCellPosition = this.cellCtrl.getFocusedCellPosition();
this.beans.navigation?.navigateToNextCell(event, key, currentCellPosition, true);
}
event.preventDefault();
}
onShiftRangeSelect(event) {
const { rangeSvc, navigation } = this.beans;
if (!rangeSvc) {
return;
}
const endCell = rangeSvc.extendLatestRangeInDirection(event);
if (endCell) {
navigation?.ensureCellVisible(endCell);
}
}
onTabKeyDown(event) {
this.beans.navigation?.onTabKeyDown(this.cellCtrl, event);
}
onBackspaceOrDeleteKeyDown(key, event) {
const { cellCtrl, beans, rowNode } = this;
const { gos, rangeSvc, eventSvc } = beans;
if (cellCtrl.editing) {
return;
}
eventSvc.dispatchEvent({ type: "keyShortcutChangedCellStart" });
if (_isDeleteKey(key, gos.get("enableCellEditingOnBackspace"))) {
if (rangeSvc && _isCellSelectionEnabled(gos)) {
rangeSvc.clearCellRangeCellValues({ dispatchWrapperEvents: true, wrapperEventSource: "deleteKey" });
} else if (cellCtrl.isCellEditable()) {
const { column } = cellCtrl;
const emptyValue = this.beans.valueSvc.getDeleteValue(column, rowNode);
rowNode.setDataValue(column, emptyValue, "cellClear");
}
} else {
beans.editSvc?.startRowOrCellEdit(cellCtrl, key, event);
}
eventSvc.dispatchEvent({ type: "keyShortcutChangedCellEnd" });
}
onEnterKeyDown(e) {
const { cellCtrl, beans } = this;
if (cellCtrl.editing || this.rowCtrl.editing) {
cellCtrl.stopEditingAndFocus(false, e.shiftKey);
} else {
if (beans.gos.get("enterNavigatesVertically")) {
const key = e.shiftKey ? KeyCode.UP : KeyCode.DOWN;
beans.navigation?.navigateToNextCell(null, key, cellCtrl.cellPosition, false);
} else {
beans.editSvc?.startRowOrCellEdit(cellCtrl, KeyCode.ENTER, e);
if (cellCtrl.editing) {
e.preventDefault();
}
}
}
}
onF2KeyDown(event) {
const { cellCtrl, beans } = this;
if (!cellCtrl.editing) {
beans.editSvc?.startRowOrCellEdit(cellCtrl, KeyCode.F2, event);
}
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
onEscapeKeyDown(event) {
const { cellCtrl, beans } = this;
if (cellCtrl.editing) {
beans.editSvc?.stopRowOrCellEdit(cellCtrl, true);
cellCtrl.focusCell(true);
}
}
processCharacter(event) {
const eventTarget = event.target;
const eventOnChildComponent = eventTarget !== this.eGui;
if (eventOnChildComponent || this.cellCtrl.editing) {
return;
}
const key = event.key;
if (key === KeyCode.SPACE) {
this.onSpaceKeyDown(event);
} else {
if (this.beans.editSvc?.startRowOrCellEdit(this.cellCtrl, key, event)) {
event.preventDefault();
}
}
}
onSpaceKeyDown(event) {
const { gos } = this.beans;
if (!this.cellCtrl.editing && _isRowSelection(gos)) {
this.beans.selectionSvc?.handleSelectionEvent(event, this.rowNode, "spaceKey");
}
event.preventDefault();
}
destroy() {
super.destroy();
}
};
// packages/ag-grid-community/src/rendering/cell/cellMouseListenerFeature.ts
var CellMouseListenerFeature = class extends BeanStub {
constructor(cellCtrl, beans, column) {
super();
this.cellCtrl = cellCtrl;
this.column = column;
this.beans = beans;
}
onMouseEvent(eventName, mouseEvent) {
if (_isStopPropagationForAgGrid(mouseEvent)) {
return;
}
switch (eventName) {
case "click":
this.onCellClicked(mouseEvent);
break;
case "mousedown":
case "touchstart":
this.onMouseDown(mouseEvent);
break;
case "dblclick":
this.onCellDoubleClicked(mouseEvent);
break;
case "mouseout":
this.onMouseOut(mouseEvent);
break;
case "mouseover":
this.onMouseOver(mouseEvent);
break;
}
}
onCellClicked(mouseEvent) {
if (this.beans.touchSvc?.handleCellDoubleClick(this, mouseEvent)) {
return;
}
const { eventSvc, rangeSvc, gos, editSvc } = this.beans;
const isMultiKey = mouseEvent.ctrlKey || mouseEvent.metaKey;
if (rangeSvc && isMultiKey) {
if (rangeSvc.getCellRangeCount(this.cellCtrl.cellPosition) > 1) {
rangeSvc.intersectLastRange(true);
}
}
const cellClickedEvent = this.cellCtrl.createEvent(mouseEvent, "cellClicked");
eventSvc.dispatchEvent(cellClickedEvent);
const colDef = this.column.getColDef();
if (colDef.onCellClicked) {
window.setTimeout(() => {
this.beans.frameworkOverrides.wrapOutgoing(() => {
colDef.onCellClicked(cellClickedEvent);
});
}, 0);
}
const editOnSingleClick = (gos.get("singleClickEdit") || colDef.singleClickEdit) && !gos.get("suppressClickEdit");
if (editOnSingleClick && !(mouseEvent.shiftKey && rangeSvc?.getCellRanges().length != 0)) {
editSvc?.startRowOrCellEdit(this.cellCtrl, void 0, mouseEvent);
}
}
onCellDoubleClicked(mouseEvent) {
const { column, beans, cellCtrl } = this;
const { eventSvc, frameworkOverrides, gos, editSvc } = beans;
const colDef = column.getColDef();
const cellDoubleClickedEvent = cellCtrl.createEvent(mouseEvent, "cellDoubleClicked");
eventSvc.dispatchEvent(cellDoubleClickedEvent);
if (typeof colDef.onCellDoubleClicked === "function") {
window.setTimeout(() => {
frameworkOverrides.wrapOutgoing(() => {
colDef.onCellDoubleClicked(cellDoubleClickedEvent);
});
}, 0);
}
const editOnDoubleClick = !gos.get("singleClickEdit") && !gos.get("suppressClickEdit");
if (editOnDoubleClick) {
editSvc?.startRowOrCellEdit(cellCtrl, null, mouseEvent);
}
}
onMouseDown(mouseEvent) {
const { ctrlKey, metaKey, shiftKey } = mouseEvent;
const target = mouseEvent.target;
const { cellCtrl, beans } = this;
const { eventSvc, rangeSvc, rowNumbersSvc, focusSvc, gos } = beans;
if (this.isRightClickInExistingRange(mouseEvent)) {
return;
}
const hasRanges = rangeSvc && !rangeSvc.isEmpty();
const containsWidget = this.containsWidget(target);
const { cellPosition } = cellCtrl;
const isRowNumberColumn = isRowNumberCol(cellPosition.column);
if (rowNumbersSvc && isRowNumberColumn && !rowNumbersSvc.handleMouseDownOnCell(cellPosition, mouseEvent)) {
if (rangeSvc) {
mouseEvent.preventDefault();
}
mouseEvent.stopImmediatePropagation();
return;
}
if (!shiftKey || !hasRanges) {
const isEnableCellTextSelection = gos.get("enableCellTextSelection");
const shouldFocus = isEnableCellTextSelection && mouseEvent.defaultPrevented;
const forceBrowserFocus = (_isBrowserSafari() || shouldFocus) && !cellCtrl.editing && !_isFocusableFormField(target) && !containsWidget;
cellCtrl.focusCell(forceBrowserFocus);
}
if (shiftKey && hasRanges && !focusSvc.isCellFocused(cellPosition)) {
mouseEvent.preventDefault();
const focusedCellPosition = focusSvc.getFocusedCell();
if (focusedCellPosition) {
const { column, rowIndex, rowPinned } = focusedCellPosition;
const focusedRowCtrl = beans.rowRenderer.getRowByPosition({ rowIndex, rowPinned });
const focusedCellCtrl = focusedRowCtrl?.getCellCtrl(column);
if (focusedCellCtrl?.editing) {
focusedCellCtrl.stopEditing();
}
focusSvc.setFocusedCell({
column,
rowIndex,
rowPinned,
forceBrowserFocus: true,
preventScrollOnBrowserFocus: true
});
}
}
if (containsWidget) {
return;
}
if (rangeSvc) {
if (isRowNumberColumn) {
mouseEvent.preventDefault();
}
if (shiftKey) {
rangeSvc.extendLatestRangeToCell(cellPosition);
} else {
const isMultiKey = ctrlKey || metaKey;
rangeSvc.setRangeToCell(cellPosition, isMultiKey);
}
}
eventSvc.dispatchEvent(this.cellCtrl.createEvent(mouseEvent, "cellMouseDown"));
}
isRightClickInExistingRange(mouseEvent) {
const { rangeSvc } = this.beans;
if (rangeSvc) {
const cellInRange = rangeSvc.isCellInAnyRange(this.cellCtrl.cellPosition);
const isRightClick = mouseEvent.button === 2 || mouseEvent.ctrlKey && this.beans.gos.get("allowContextMenuWithControlKey");
if (cellInRange && isRightClick) {
return true;
}
}
return false;
}
containsWidget(target) {
return _isElementChildOfClass(target, "ag-selection-checkbox", 3) || _isElementChildOfClass(target, "ag-drag-handle", 3);
}
onMouseOut(mouseEvent) {
if (this.mouseStayingInsideCell(mouseEvent)) {
return;
}
const { eventSvc, colHover } = this.beans;
eventSvc.dispatchEvent(this.cellCtrl.createEvent(mouseEvent, "cellMouseOut"));
colHover?.clearMouseOver();
}
onMouseOver(mouseEvent) {
if (this.mouseStayingInsideCell(mouseEvent)) {
return;
}
const { eventSvc, colHover } = this.beans;
eventSvc.dispatchEvent(this.cellCtrl.createEvent(mouseEvent, "cellMouseOver"));
colHover?.setMouseOver([this.column]);
}
mouseStayingInsideCell(e) {
if (!e.target || !e.relatedTarget) {
return false;
}
const eCell = this.cellCtrl.eGui;
const cellContainsTarget = eCell.contains(e.target);
const cellContainsRelatedTarget = eCell.contains(e.relatedTarget);
return cellContainsTarget && cellContainsRelatedTarget;
}
destroy() {
super.destroy();
}
};
// packages/ag-grid-community/src/rendering/cell/cellPositionFeature.ts
var CellPositionFeature = class extends BeanStub {
constructor(cellCtrl, beans) {
super();
this.cellCtrl = cellCtrl;
this.beans = beans;
this.column = cellCtrl.column;
this.rowNode = cellCtrl.rowNode;
}
setupRowSpan() {
this.rowSpan = this.column.getRowSpan(this.rowNode);
this.addManagedListeners(this.beans.eventSvc, { newColumnsLoaded: () => this.onNewColumnsLoaded() });
}
init() {
this.eSetLeft = this.cellCtrl.getRootElement();
this.eContent = this.cellCtrl.eGui;
const cellSpan = this.cellCtrl.getCellSpan();
if (!cellSpan) {
this.setupColSpan();
this.setupRowSpan();
}
this.onLeftChanged();
this.onWidthChanged();
if (!cellSpan) {
this._legacyApplyRowSpan();
}
if (cellSpan) {
this.refreshSpanHeight(cellSpan);
this.addManagedListeners(this.beans.eventSvc, {
modelUpdated: this.refreshSpanHeight.bind(this, cellSpan),
recalculateRowBounds: this.refreshSpanHeight.bind(this, cellSpan)
});
}
}
refreshSpanHeight(cellSpan) {
const spanHeight = cellSpan.getCellHeight();
if (spanHeight != null) {
this.eContent.style.height = `${spanHeight}px`;
}
}
onNewColumnsLoaded() {
const rowSpan = this.column.getRowSpan(this.rowNode);
if (this.rowSpan === rowSpan) {
return;
}
this.rowSpan = rowSpan;
this._legacyApplyRowSpan(true);
}
onDisplayColumnsChanged() {
const colsSpanning = this.getColSpanningList();
if (!_areEqual(this.colsSpanning, colsSpanning)) {
this.colsSpanning = colsSpanning;
this.onWidthChanged();
this.onLeftChanged();
}
}
setupColSpan() {
if (this.column.getColDef().colSpan == null) {
return;
}
this.colsSpanning = this.getColSpanningList();
this.addManagedListeners(this.beans.eventSvc, {
// because we are col spanning, a reorder of the cols can change what cols we are spanning over
displayedColumnsChanged: this.onDisplayColumnsChanged.bind(this),
// because we are spanning over multiple cols, we check for width any time any cols width changes.
// this is expensive - really we should be explicitly checking only the cols we are spanning over
// instead of every col, however it would be tricky code to track the cols we are spanning over, so
// because hardly anyone will be using colSpan, am favouring this easier way for more maintainable code.
displayedColumnsWidthChanged: this.onWidthChanged.bind(this)
});
}
onWidthChanged() {
if (!this.eContent) {
return;
}
const width = this.getCellWidth();
this.eContent.style.width = `${width}px`;
}
getCellWidth() {
if (!this.colsSpanning) {
return this.column.getActualWidth();
}
return this.colsSpanning.reduce((width, col) => width + col.getActualWidth(), 0);
}
getColSpanningList() {
const { column, rowNode } = this;
const colSpan = column.getColSpan(rowNode);
const colsSpanning = [];
if (colSpan === 1) {
colsSpanning.push(column);
} else {
let pointer = column;
const pinned = column.getPinned();
for (let i = 0; pointer && i < colSpan; i++) {
colsSpanning.push(pointer);
pointer = this.beans.visibleCols.getColAfter(pointer);
if (!pointer || _missing(pointer)) {
break;
}
if (pinned !== pointer.getPinned()) {
break;
}
}
}
return colsSpanning;
}
onLeftChanged() {
if (!this.eSetLeft) {
return;
}
const left = this.modifyLeftForPrintLayout(this.getCellLeft());
this.eSetLeft.style.left = left + "px";
}
getCellLeft() {
let mostLeftCol;
if (this.beans.gos.get("enableRtl") && this.colsSpanning) {
mostLeftCol = _last(this.colsSpanning);
} else {
mostLeftCol = this.column;
}
return mostLeftCol.getLeft();
}
modifyLeftForPrintLayout(leftPosition) {
if (!this.cellCtrl.printLayout || this.column.getPinned() === "left") {
return leftPosition;
}
const { visibleCols } = this.beans;
const leftWidth = visibleCols.getColsLeftWidth();
if (this.column.getPinned() === "right") {
const bodyWidth = visibleCols.bodyWidth;
return leftWidth + bodyWidth + (leftPosition || 0);
}
return leftWidth + (leftPosition || 0);
}
_legacyApplyRowSpan(force) {
if (this.rowSpan === 1 && !force) {
return;
}
const singleRowHeight = _getRowHeightAsNumber(this.beans);
const totalRowHeight = singleRowHeight * this.rowSpan;
this.eContent.style.height = `${totalRowHeight}px`;
this.eContent.style.zIndex = "1";
}
// overriding to make public, as we don't dispose this bean via context
destroy() {
super.destroy();
}
};
// packages/ag-grid-community/src/rendering/cell/cellCtrl.ts
var CSS_CELL = "ag-cell";
var CSS_AUTO_HEIGHT = "ag-cell-auto-height";
var CSS_NORMAL_HEIGHT = "ag-cell-normal-height";
var CSS_CELL_FOCUS = "ag-cell-focus";
var CSS_CELL_FIRST_RIGHT_PINNED = "ag-cell-first-right-pinned";
var CSS_CELL_LAST_LEFT_PINNED = "ag-cell-last-left-pinned";
var CSS_CELL_NOT_INLINE_EDITING = "ag-cell-not-inline-editing";
var CSS_CELL_WRAP_TEXT = "ag-cell-wrap-text";
var DOM_DATA_KEY_CELL_CTRL = "cellCtrl";
function _getCellCtrlForEventTarget(gos, eventTarget) {
return _getCtrlForEventTarget(gos, eventTarget, DOM_DATA_KEY_CELL_CTRL);
}
var instanceIdSequence2 = 0;
var CellCtrl = class extends BeanStub {
constructor(column, rowNode, beans, rowCtrl) {
super();
this.column = column;
this.rowNode = rowNode;
this.rowCtrl = rowCtrl;
this.rangeFeature = void 0;
this.positionFeature = void 0;
this.customStyleFeature = void 0;
this.tooltipFeature = void 0;
this.mouseListener = void 0;
this.keyboardListener = void 0;
this.suppressRefreshCell = false;
this.onCompAttachedFuncs = [];
this.onEditorAttachedFuncs = [];
this.beans = beans;
const { colId, colIdSanitised } = column;
this.instanceId = colId + "-" + instanceIdSequence2++;
this.colIdSanitised = colIdSanitised;
this.createCellPosition();
this.updateAndFormatValue(false);
}
shouldRestoreFocus() {
return this.beans.focusSvc.shouldRestoreFocus(this.cellPosition);
}
onFocusOut() {
this.beans.focusSvc.clearRestoreFocus();
}
addFeatures() {
const { beans } = this;
this.positionFeature = new CellPositionFeature(this, beans);
this.customStyleFeature = beans.cellStyles?.createCellCustomStyleFeature(this, beans);
this.mouseListener = new CellMouseListenerFeature(this, beans, this.column);
this.keyboardListener = new CellKeyboardListenerFeature(this, beans, this.rowNode, this.rowCtrl);
if (this.column.isTooltipEnabled()) {
this.enableTooltipFeature();
}
const { rangeSvc } = beans;
const cellSelectionEnabled = rangeSvc && _isCellSelectionEnabled(beans.gos);
if (cellSelectionEnabled) {
this.rangeFeature = rangeSvc.createCellRangeFeature(beans, this);
}
}
isCellSpanning() {
return false;
}
getCellSpan() {
return void 0;
}
removeFeatures() {
const context = this.beans.context;
this.positionFeature = context.destroyBean(this.positionFeature);
this.customStyleFeature = context.destroyBean(this.customStyleFeature);
this.mouseListener = context.destroyBean(this.mouseListener);
this.keyboardListener = context.destroyBean(this.keyboardListener);
this.rangeFeature = context.destroyBean(this.rangeFeature);
this.disableTooltipFeature();
}
enableTooltipFeature(value, shouldDisplayTooltip) {
this.tooltipFeature = this.beans.tooltipSvc?.enableCellTooltipFeature(this, value, shouldDisplayTooltip);
}
disableTooltipFeature() {
this.tooltipFeature = this.beans.context.destroyBean(this.tooltipFeature);
}
setComp(comp, eCell, _eWrapper, eCellWrapper, printLayout, startEditing, compBean) {
this.comp = comp;
this.eGui = eCell;
this.printLayout = printLayout;
compBean ?? (compBean = this);
this.addDomData(compBean);
this.addFeatures();
compBean.addDestroyFunc(() => this.removeFeatures());
this.onSuppressCellFocusChanged(this.beans.gos.get("suppressCellFocus"));
this.onCellFocused(this.focusEventToRestore);
this.applyStaticCssClasses();
this.setWrapText();
this.onFirstRightPinnedChanged();
this.onLastLeftPinnedChanged();
this.onColumnHover();
this.setupControlComps();
this.setupAutoHeight(eCellWrapper, compBean);
this.refreshFirstAndLastStyles();
this.refreshAriaColIndex();
this.positionFeature?.init();
this.customStyleFeature?.setComp(comp);
this.tooltipFeature?.refreshTooltip();
this.keyboardListener?.init();
this.rangeFeature?.setComp(comp);
if (startEditing && this.isCellEditable()) {
this.beans.editSvc?.startEditing(this);
} else {
this.showValue(false, true);
}
if (this.onCompAttachedFuncs.length) {
this.onCompAttachedFuncs.forEach((func) => func());
this.onCompAttachedFuncs = [];
}
}
setupAutoHeight(eCellWrapper, compBean) {
this.isAutoHeight = this.beans.rowAutoHeight?.setupCellAutoHeight(this, eCellWrapper, compBean) ?? false;
}
getCellAriaRole() {
return this.column.getColDef().cellAriaRole ?? "gridcell";
}
isCellRenderer() {
const colDef = this.column.getColDef();
return colDef.cellRenderer != null || colDef.cellRendererSelector != null;
}
getValueToDisplay() {
return this.valueFormatted ?? this.value;
}
showValue(forceNewCellRendererInstance, skipRangeHandleRefresh) {
const { beans, column, rowNode, rangeFeature } = this;
const { userCompFactory } = beans;
const valueToDisplay = this.getValueToDisplay();
let compDetails;
const isSsrmLoading = rowNode.stub && rowNode.groupData?.[column.getId()] == null;
if (isSsrmLoading) {
const params = this.createCellRendererParams();
compDetails = _getLoadingCellRendererDetails(userCompFactory, column.getColDef(), params);
} else if (this.isCellRenderer()) {
const params = this.createCellRendererParams();
compDetails = _getCellRendererDetails(userCompFactory, column.getColDef(), params);
}
this.comp.setRenderDetails(compDetails, valueToDisplay, forceNewCellRendererInstance);
if (!skipRangeHandleRefresh && rangeFeature) {
_requestAnimationFrame(beans, () => rangeFeature?.refreshHandle());
}
}
setupControlComps() {
const colDef = this.column.getColDef();
this.includeSelection = this.isIncludeControl(this.isCheckboxSelection(colDef));
this.includeRowDrag = this.isIncludeControl(colDef.rowDrag);
this.includeDndSource = this.isIncludeControl(colDef.dndSource);
this.comp.setIncludeSelection(this.includeSelection);
this.comp.setIncludeDndSource(this.includeDndSource);
this.comp.setIncludeRowDrag(this.includeRowDrag);
}
isForceWrapper() {
const forceWrapper = this.beans.gos.get("enableCellTextSelection") || this.column.isAutoHeight();
return forceWrapper;
}
// eslint-disable-next-line @typescript-eslint/ban-types
isIncludeControl(value) {
const rowNodePinned = this.rowNode.rowPinned != null;
const isFunc = typeof value === "function";
const res = rowNodePinned ? false : isFunc || value === true;
return res;
}
isCheckboxSelection(colDef) {
const { rowSelection } = this.beans.gridOptions;
return colDef.checkboxSelection || isColumnSelectionCol(this.column) && rowSelection && typeof rowSelection !== "string" && _getCheckboxes(rowSelection);
}
refreshShouldDestroy() {
const colDef = this.column.getColDef();
const selectionChanged = this.includeSelection != this.isIncludeControl(this.isCheckboxSelection(colDef));
const rowDragChanged = this.includeRowDrag != this.isIncludeControl(colDef.rowDrag);
const dndSourceChanged = this.includeDndSource != this.isIncludeControl(colDef.dndSource);
const autoHeightChanged = this.isAutoHeight != this.column.isAutoHeight();
return selectionChanged || rowDragChanged || dndSourceChanged || autoHeightChanged;
}
onPopupEditorClosed() {
if (!this.editing) {
return;
}
this.stopEditingAndFocus();
}
/**
* 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(cancel = false) {
return this.beans.editSvc?.stopEditing(this, cancel) ?? false;
}
createCellRendererParams() {
const {
value,
valueFormatted,
column,
rowNode,
comp,
eGui,
beans: { valueSvc, gos }
} = this;
const res = _addGridCommonParams(gos, {
value,
valueFormatted,
getValue: () => valueSvc.getValueForDisplay(column, rowNode),
setValue: (value2) => valueSvc.setValue(rowNode, column, value2),
formatValue: this.formatValue.bind(this),
data: rowNode.data,
node: rowNode,
pinned: column.getPinned(),
colDef: column.getColDef(),
column,
refreshCell: this.refreshCell.bind(this),
eGridCell: eGui,
eParentOfValue: comp.getParentOfValue(),
registerRowDragger: (rowDraggerElement, dragStartPixels, value2, suppressVisibilityChange) => this.registerRowDragger(rowDraggerElement, dragStartPixels, suppressVisibilityChange),
setTooltip: (value2, shouldDisplayTooltip) => {
gos.assertModuleRegistered("Tooltip", 3);
if (this.tooltipFeature) {
this.disableTooltipFeature();
}
this.enableTooltipFeature(value2, shouldDisplayTooltip);
this.tooltipFeature?.refreshTooltip();
}
});
return res;
}
onCellChanged(event) {
const eventImpactsThisCell = event.column === this.column;
if (eventImpactsThisCell) {
this.refreshCell({});
}
}
refreshOrDestroyCell(params) {
if (this.refreshShouldDestroy()) {
this.rowCtrl?.recreateCell(this);
} else {
this.refreshCell(params);
}
}
// + stop editing {forceRefresh: true, suppressFlash: true}
// + event cellChanged {}
// + cellRenderer.params.refresh() {} -> method passes 'as is' to the cellRenderer, so params could be anything
// + rowCtrl: event dataChanged {suppressFlash: !update, newData: !update}
// + rowCtrl: api refreshCells() {animate: true/false}
// + rowRenderer: api softRefreshView() {}
refreshCell(params) {
if (this.suppressRefreshCell || this.editing) {
return;
}
const colDef = this.column.getColDef();
const newData = params != null && !!params.newData;
const suppressFlash = params != null && !!params.suppressFlash;
const noValueProvided = colDef.field == null && colDef.valueGetter == null && colDef.showRowGroup == null;
const forceRefresh = params && params.forceRefresh || noValueProvided || newData;
const isCellCompReady = !!this.comp;
const valuesDifferent = this.updateAndFormatValue(isCellCompReady);
const dataNeedsUpdating = forceRefresh || valuesDifferent;
if (!isCellCompReady) {
return;
}
if (dataNeedsUpdating) {
this.showValue(newData, false);
const processingFilterChange = this.beans.filterManager?.isSuppressFlashingCellsBecauseFiltering();
const flashCell = !suppressFlash && !processingFilterChange && colDef.enableCellChangeFlash;
if (flashCell) {
this.beans.cellFlashSvc?.flashCell(this);
}
this.customStyleFeature?.applyUserStyles();
this.customStyleFeature?.applyClassesFromColDef();
}
this.tooltipFeature?.refreshTooltip();
this.customStyleFeature?.applyCellClassRules();
}
// cell editors call this, when they want to stop for reasons other
// than what we pick up on. eg selecting from a dropdown ends editing.
stopEditingAndFocus(suppressNavigateAfterEdit = false, shiftKey = false) {
this.beans.editSvc?.stopEditingAndFocus(this, suppressNavigateAfterEdit, shiftKey);
}
isCellEditable() {
return this.column.isCellEditable(this.rowNode);
}
formatValue(value) {
return this.callValueFormatter(value) ?? value;
}
callValueFormatter(value) {
return this.beans.valueSvc.formatValue(this.column, this.rowNode, value);
}
updateAndFormatValue(compareValues) {
const oldValue = this.value;
const oldValueFormatted = this.valueFormatted;
this.value = this.beans.valueSvc.getValueForDisplay(this.column, this.rowNode);
this.valueFormatted = this.callValueFormatter(this.value);
if (compareValues) {
return !this.valuesAreEqual(oldValue, this.value) || this.valueFormatted != oldValueFormatted;
}
return true;
}
valuesAreEqual(val1, val2) {
const colDef = this.column.getColDef();
return colDef.equals ? colDef.equals(val1, val2) : val1 === val2;
}
addDomData(compBean) {
const element = this.eGui;
_setDomData(this.beans.gos, element, DOM_DATA_KEY_CELL_CTRL, this);
compBean.addDestroyFunc(() => _setDomData(this.beans.gos, element, DOM_DATA_KEY_CELL_CTRL, null));
}
createEvent(domEvent, eventType) {
const { rowNode, column, value, beans } = this;
const event = _addGridCommonParams(beans.gos, {
type: eventType,
node: rowNode,
data: rowNode.data,
value,
column,
colDef: column.getColDef(),
rowPinned: rowNode.rowPinned,
event: domEvent,
rowIndex: rowNode.rowIndex
});
return event;
}
processCharacter(event) {
this.keyboardListener?.processCharacter(event);
}
onKeyDown(event) {
this.keyboardListener?.onKeyDown(event);
}
onMouseEvent(eventName, mouseEvent) {
this.mouseListener?.onMouseEvent(eventName, mouseEvent);
}
getColSpanningList() {
return this.positionFeature.getColSpanningList();
}
onLeftChanged() {
if (!this.comp) {
return;
}
this.positionFeature?.onLeftChanged();
}
onDisplayedColumnsChanged() {
if (!this.eGui) {
return;
}
this.refreshAriaColIndex();
this.refreshFirstAndLastStyles();
}
refreshFirstAndLastStyles() {
const { comp, column, beans } = this;
refreshFirstAndLastStyles(comp, column, beans.visibleCols);
}
refreshAriaColIndex() {
const colIdx = this.beans.visibleCols.getAriaColIndex(this.column);
_setAriaColIndex(this.eGui, colIdx);
}
onWidthChanged() {
return this.positionFeature?.onWidthChanged();
}
getRowPosition() {
const { rowIndex, rowPinned } = this.cellPosition;
return {
rowIndex,
rowPinned
};
}
updateRangeBordersIfRangeCount() {
if (!this.comp) {
return;
}
this.rangeFeature?.updateRangeBordersIfRangeCount();
}
onCellSelectionChanged() {
if (!this.comp) {
return;
}
this.rangeFeature?.onCellSelectionChanged();
}
isRangeSelectionEnabled() {
return this.rangeFeature != null;
}
focusCell(forceBrowserFocus = false) {
this.beans.focusSvc.setFocusedCell({
...this.getFocusedCellPosition(),
forceBrowserFocus
});
}
onRowIndexChanged() {
this.createCellPosition();
this.onCellFocused();
this.rangeFeature?.onCellSelectionChanged();
}
onSuppressCellFocusChanged(suppressCellFocus) {
const element = this.eGui;
if (!element) {
return;
}
if (isRowNumberCol(this.column)) {
suppressCellFocus = true;
}
_addOrRemoveAttribute(element, "tabindex", suppressCellFocus ? void 0 : -1);
}
onFirstRightPinnedChanged() {
if (!this.comp) {
return;
}
const firstRightPinned = this.column.isFirstRightPinned();
this.comp.addOrRemoveCssClass(CSS_CELL_FIRST_RIGHT_PINNED, firstRightPinned);
}
onLastLeftPinnedChanged() {
if (!this.comp) {
return;
}
const lastLeftPinned = this.column.isLastLeftPinned();
this.comp.addOrRemoveCssClass(CSS_CELL_LAST_LEFT_PINNED, lastLeftPinned);
}
isCellFocused() {
return this.beans.focusSvc.isCellFocused(this.cellPosition);
}
onCellFocused(event) {
const { beans } = this;
if (_isCellFocusSuppressed(beans)) {
return;
}
const cellFocused = this.isCellFocused();
if (!this.comp) {
if (cellFocused && event?.forceBrowserFocus) {
this.focusEventToRestore = event;
}
return;
}
this.focusEventToRestore = void 0;
this.comp.addOrRemoveCssClass(CSS_CELL_FOCUS, cellFocused);
if (cellFocused && event && event.forceBrowserFocus) {
let focusEl = this.comp.getFocusableElement();
if (this.editing) {
const focusableEls = _findFocusableElements(focusEl, null, true);
if (focusableEls.length) {
focusEl = focusableEls[0];
}
}
focusEl.focus({ preventScroll: !!event.preventScrollOnBrowserFocus });
}
const fullRowEdit = beans.gos.get("editType") === "fullRow";
if (!cellFocused && !fullRowEdit && this.editing) {
beans.editSvc?.stopRowOrCellEdit(this);
}
if (cellFocused) {
this.rowCtrl.announceDescription();
}
}
createCellPosition() {
const { rowIndex, rowPinned } = this.rowNode;
this.cellPosition = {
rowIndex,
rowPinned: _makeNull(rowPinned),
column: this.column
};
}
setInlineEditingCss() {
this.beans.editSvc?.setInlineEditingCss(this.rowCtrl);
}
// CSS Classes that only get applied once, they never change
applyStaticCssClasses() {
const { comp } = this;
comp.addOrRemoveCssClass(CSS_CELL, true);
comp.addOrRemoveCssClass(CSS_CELL_NOT_INLINE_EDITING, true);
const autoHeight = this.column.isAutoHeight() == true;
comp.addOrRemoveCssClass(CSS_AUTO_HEIGHT, autoHeight);
comp.addOrRemoveCssClass(CSS_NORMAL_HEIGHT, !autoHeight);
}
onColumnHover() {
this.beans.colHover?.onCellColumnHover(this.column, this.comp);
}
onColDefChanged() {
if (!this.comp) {
return;
}
if (this.column.isTooltipEnabled()) {
this.disableTooltipFeature();
this.enableTooltipFeature();
} else {
this.disableTooltipFeature();
}
this.setWrapText();
if (!this.editing) {
this.refreshOrDestroyCell({ forceRefresh: true, suppressFlash: true });
} else {
this.beans.editSvc?.handleColDefChanged(this);
}
}
setWrapText() {
const value = this.column.getColDef().wrapText == true;
this.comp.addOrRemoveCssClass(CSS_CELL_WRAP_TEXT, value);
}
dispatchCellContextMenuEvent(event) {
const colDef = this.column.getColDef();
const cellContextMenuEvent = this.createEvent(event, "cellContextMenu");
const { beans } = this;
beans.eventSvc.dispatchEvent(cellContextMenuEvent);
if (colDef.onCellContextMenu) {
window.setTimeout(() => {
beans.frameworkOverrides.wrapOutgoing(() => {
colDef.onCellContextMenu(cellContextMenuEvent);
});
}, 0);
}
}
getCellRenderer() {
return this.comp?.getCellRenderer() ?? null;
}
destroy() {
this.onCompAttachedFuncs = [];
this.onEditorAttachedFuncs = [];
super.destroy();
}
createSelectionCheckbox() {
const cbSelectionComponent = this.beans.selectionSvc?.createCheckboxSelectionComponent();
if (!cbSelectionComponent) {
return void 0;
}
this.beans.context.createBean(cbSelectionComponent);
cbSelectionComponent.init({ rowNode: this.rowNode, column: this.column });
return cbSelectionComponent;
}
createDndSource() {
const dndSourceComp = this.beans.registry.createDynamicBean(
"dndSourceComp",
false,
this.rowNode,
this.column,
this.eGui
);
if (dndSourceComp) {
this.beans.context.createBean(dndSourceComp);
}
return dndSourceComp;
}
registerRowDragger(customElement, dragStartPixels, suppressVisibilityChange) {
if (this.customRowDragComp) {
this.customRowDragComp.setDragElement(customElement, dragStartPixels);
return;
}
const newComp = this.createRowDragComp(customElement, dragStartPixels, suppressVisibilityChange);
if (newComp) {
this.customRowDragComp = newComp;
this.addDestroyFunc(() => {
this.beans.context.destroyBean(newComp);
this.customRowDragComp = null;
});
}
}
createRowDragComp(customElement, dragStartPixels, suppressVisibilityChange) {
const rowDragComp = this.beans.rowDragSvc?.createRowDragCompForCell(
this.rowNode,
this.column,
() => this.value,
customElement,
dragStartPixels,
suppressVisibilityChange
);
if (!rowDragComp) {
return void 0;
}
this.beans.context.createBean(rowDragComp);
return rowDragComp;
}
cellEditorAttached() {
this.onEditorAttachedFuncs.forEach((func) => func());
this.onEditorAttachedFuncs = [];
}
setFocusedCellPosition(_cellPosition) {
}
getFocusedCellPosition() {
return this.cellPosition;
}
// used by spannedCellCtrl
refreshAriaRowIndex() {
}
/**
* Returns the root element of the cell, could be a span container rather than the cell element.
* @returns The root element of the cell.
*/
getRootElement() {
return this.eGui;
}
};
// packages/ag-grid-community/src/gridBodyComp/mouseEventUtils.ts
var GRID_DOM_KEY = "__ag_grid_instance";
function _stampTopLevelGridCompWithGridInstance(gos, eGridDiv) {
eGridDiv[GRID_DOM_KEY] = gos.gridInstanceId;
}
function _isEventFromThisGrid(gos, event) {
const res = _isElementInThisGrid(gos, event.target);
return res;
}
function _isElementInThisGrid(gos, element) {
let pointer = element;
while (pointer) {
const instanceId = pointer[GRID_DOM_KEY];
if (_exists(instanceId)) {
const eventFromThisGrid = instanceId === gos.gridInstanceId;
return eventFromThisGrid;
}
pointer = pointer.parentElement;
}
return false;
}
function _getCellPositionForEvent(gos, event) {
return _getCellCtrlForEventTarget(gos, event.target)?.getFocusedCellPosition() ?? null;
}
function _getNormalisedMousePosition(beans, event) {
const gridPanelHasScrolls = _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 };
}
// packages/ag-grid-community/src/dragAndDrop/dragAndDropService.ts
var DragSourceType = /* @__PURE__ */ ((DragSourceType2) => {
DragSourceType2[DragSourceType2["ToolPanel"] = 0] = "ToolPanel";
DragSourceType2[DragSourceType2["HeaderCell"] = 1] = "HeaderCell";
DragSourceType2[DragSourceType2["RowDrag"] = 2] = "RowDrag";
DragSourceType2[DragSourceType2["ChartPanel"] = 3] = "ChartPanel";
DragSourceType2[DragSourceType2["AdvancedFilterBuilder"] = 4] = "AdvancedFilterBuilder";
return DragSourceType2;
})(DragSourceType || {});
var DragAndDropService = class extends 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, 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);
_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 = void 0;
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);
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 = (mouseEvent2, containers) => {
for (const container of containers) {
const { width, height, left, right, top, bottom } = container.getBoundingClientRect();
if (width === 0 || height === 0) {
return false;
}
const horizontalFit = mouseEvent2.clientX >= left && mouseEvent2.clientX < right;
const verticalFit = mouseEvent2.clientY >= top && mouseEvent2.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 = _getRootNode(this.beans);
const elementStack = rootNode.elementsFromPoint(mouseEvent.clientX, mouseEvent.clientY);
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;
}
}
}
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) {
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 _addGridCommonParams(gos, {
event,
x,
y,
vDirection,
hDirection,
dragSource,
fromNudge,
dragItem,
dropZoneTarget
});
}
positionDragAndDropImageComp(event) {
const dragAndDropImageComponent = this.getDragAndDropImageComponent();
if (!dragAndDropImageComponent) {
return;
}
_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 = _getDragAndDropImageCompDetails(
userCompFactory,
_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");
_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 = _getPageBody(this.beans);
this.dragAndDropImageParent = targetEl;
if (!targetEl) {
_warn(54);
} else {
targetEl.appendChild(eGui);
}
}
registerGridDropTarget(elementFn, ctrl) {
const dropTarget = {
getContainer: elementFn,
isInterestedIn: (type) => type === 1 /* HeaderCell */ || type === 0 /* ToolPanel */,
getIconName: () => "notAllowed"
};
this.addDropTarget(dropTarget);
ctrl.addDestroyFunc(() => this.removeDropTarget(dropTarget));
}
};
// packages/ag-grid-community/src/autoScrollService.ts
var AutoScrollService = class {
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;
}
}
};
// packages/ag-grid-community/src/entities/positionUtils.ts
function _createCellId(cellPosition) {
const { rowIndex, rowPinned, column } = cellPosition;
return `${rowIndex}.${rowPinned == null ? "null" : rowPinned}.${column.getId()}`;
}
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;
}
function _isRowBefore(rowA, rowB) {
switch (rowA.rowPinned) {
case "top":
if (rowB.rowPinned !== "top") {
return true;
}
break;
case "bottom":
if (rowB.rowPinned !== "bottom") {
return false;
}
break;
default:
if (_exists(rowB.rowPinned)) {
return rowB.rowPinned !== "top";
}
break;
}
return rowA.rowIndex < rowB.rowIndex;
}
function _isSameRow(rowA, rowB) {
if (!rowA && !rowB) {
return true;
}
if (rowA && !rowB || !rowA && rowB) {
return false;
}
return rowA.rowIndex === rowB.rowIndex && rowA.rowPinned == rowB.rowPinned;
}
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 === void 0 ? null : { rowIndex, rowPinned };
}
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 === void 0 ? null : { rowIndex, rowPinned };
}
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);
}
}
function _getCellByPosition(beans, cellPosition) {
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);
}
// packages/ag-grid-community/src/dragAndDrop/rowDragFeature.ts
var RowDragFeature = class extends BeanStub {
constructor(eContainer) {
super();
this.eContainer = eContainer;
}
postConstruct() {
const { rowModel, gos, ctrlsSvc } = this.beans;
if (_isClientSideRowModel(gos, rowModel)) {
this.clientSideRowModel = rowModel;
}
ctrlsSvc.whenReady(this, (p) => {
const gridBodyCon = p.gridBodyCtrl;
this.autoScrollService = new 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 === 2 /* 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) {
draggingEvent.dragItem.rowNodes = this.getRowNodes(draggingEvent);
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.dispatchGridEvent("rowDragMove", draggingEvent);
this.lastDraggingEvent = draggingEvent;
const pixel = _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(_last(rowIndexStr.split("-")), 10);
}
moveRowAndClearHighlight(draggingEvent) {
const clientSideRowModel = this.clientSideRowModel;
const lastHighlightedRowNode = clientSideRowModel.getLastHighlightedRowNode();
const isBelow = lastHighlightedRowNode && lastHighlightedRowNode.highlighted === "Below";
const pixel = _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 = _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;
const cellPosition = focusSvc.getFocusedCell();
const cellCtrl = cellPosition && _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()) {
_warn(55);
return;
}
const dragAndDrop = this.beans.dragAndDrop;
if (dragAndDrop.findExternalZone(params)) {
_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 === 2 /* 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
};
}
return params;
}
draggingToRowDragEvent(type, draggingEvent) {
const beans = this.beans;
const { pageBounds, rowModel, gos } = beans;
const yNormalised = _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 = _addGridCommonParams(gos, {
type,
event: draggingEvent.event,
node: draggingEvent.dragItem.rowNode,
nodes: draggingEvent.dragItem.rowNodes,
overIndex,
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");
}
}
};
// packages/ag-grid-community/src/utils/mouse.ts
function _areEventsNear(e1, e2, pixelCount) {
if (pixelCount === 0) {
return false;
}
const diffX = Math.abs(e1.clientX - e2.clientX);
const diffY = Math.abs(e1.clientY - e2.clientY);
return Math.max(diffX, diffY) <= pixelCount;
}
// packages/ag-grid-community/src/dragAndDrop/dragService.ts
var DragService = class extends 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);
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);
_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 (_isFocusableFormField(touchEvent.target)) {
return;
}
if (stopPropagationForTouch) {
touchEvent.stopPropagation();
}
this.onTouchStart(params, touchEvent);
};
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: _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 } }
];
this.addTemporaryEvents(events);
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 (e._alreadyProcessedByDragService) {
return;
}
e._alreadyProcessedByDragService = true;
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.ESCAPE) {
this.cancelDrag(params.eElement);
}
};
const target = _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 }
];
this.addTemporaryEvents(events);
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) {
const { dragStartPixels } = this.currentDragParams;
const requiredPixelDiff = _exists(dragStartPixels) ? dragStartPixels : 4;
return _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 (this.isEventNearStartEvent(currentEvent, startEvent)) {
return;
}
this.dragging = true;
this.eventSvc.dispatchEvent({
type: "dragStarted",
target: el
});
this.currentDragParams.onDragStart(startEvent);
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.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 (_isBrowserSafari()) {
const eDocument = _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 = (mouseEvent2) => {
const el = mouseEvent2.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 && _isEventFromThisGrid(gos, mouseEvent) && !isOverFormFieldElement(mouseEvent)
);
}
onTouchUp(touchEvent, el) {
let touch = this.getFirstActiveTouch(touchEvent.changedTouches);
if (!touch) {
touch = this.touchLastTime;
}
this.onUpCommon(touch, el);
}
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;
}
};
// packages/ag-grid-community/src/entities/agColumnGroup.ts
function createUniqueColumnGroupId(groupId, instanceId) {
return groupId + "_" + instanceId;
}
function isColumnGroup2(col) {
return col instanceof AgColumnGroup;
}
var AgColumnGroup = class extends 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() {
this.displayedChildren.forEach((child) => {
if (isColumnGroup2(child)) {
child.checkLeft();
}
});
if (this.displayedChildren.length > 0) {
if (this.gos.get("enableRtl")) {
const lastChild = _last(this.displayedChildren);
const lastChildLeft = lastChild.getLeft();
this.setLeft(lastChildLeft);
} else {
const firstChildLeft = this.displayedChildren[0].getLeft();
this.setLeft(firstChildLeft);
}
} else {
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;
}
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 (isColumn(child)) {
leafColumns.push(child);
} else if (isColumnGroup2(child)) {
child.addDisplayedLeafColumns(leafColumns);
}
});
}
addLeafColumns(leafColumns) {
this.children.forEach((child) => {
if (isColumn(child)) {
leafColumns.push(child);
} else if (isColumnGroup2(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() {
this.displayedChildren = [];
let parentWithExpansion = this;
while (parentWithExpansion != null && parentWithExpansion.isPadding()) {
parentWithExpansion = parentWithExpansion.getParent();
}
const isExpandable = parentWithExpansion ? parentWithExpansion.getProvidedColumnGroup().isExpandable() : false;
if (!isExpandable) {
this.displayedChildren = this.children;
this.dispatchLocalEvent({ type: "displayedChildrenChanged" });
return;
}
this.children.forEach((child) => {
const emptyGroup = isColumnGroup2(child) && (!child.displayedChildren || !child.displayedChildren.length);
if (emptyGroup) {
return;
}
const headerGroupShow = child.getColumnGroupShow();
switch (headerGroupShow) {
case "open":
if (parentWithExpansion.getProvidedColumnGroup().isExpanded()) {
this.displayedChildren.push(child);
}
break;
case "closed":
if (!parentWithExpansion.getProvidedColumnGroup().isExpanded()) {
this.displayedChildren.push(child);
}
break;
default:
this.displayedChildren.push(child);
break;
}
});
this.dispatchLocalEvent({ type: "displayedChildrenChanged" });
}
};
// packages/ag-grid-community/src/entities/rowNode.ts
var ROW_ID_PREFIX_ROW_GROUP = "row-group-";
var ROW_ID_PREFIX_TOP_PINNED = "t-";
var ROW_ID_PREFIX_BOTTOM_PINNED = "b-";
var OBJECT_ID_SEQUENCE = 0;
var RowNode = class {
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 = void 0;
/** 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,
newData,
update
};
}
getRowIndexString() {
if (this.rowIndex == null) {
_error(13);
return null;
}
if (this.rowPinned === "top") {
return ROW_ID_PREFIX_TOP_PINNED + this.rowIndex;
}
if (this.rowPinned === "bottom") {
return 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) {
const getRowIdFunc = _getRowIdCallback(this.beans.gos);
if (getRowIdFunc) {
if (this.data) {
const parentKeys = this.parent?.getRoute() ?? [];
this.id = getRowIdFunc({
data: this.data,
parentKeys: parentKeys.length > 0 ? parentKeys : void 0,
level: this.level,
rowPinned: this.rowPinned
});
if (this.id.startsWith(ROW_ID_PREFIX_ROW_GROUP)) {
_error(14, {
groupPrefix: ROW_ID_PREFIX_ROW_GROUP
});
}
} else {
this.id = void 0;
}
} 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) {
const { colModel, valueSvc, gos, selectionSvc, rowSpanSvc } = this.beans;
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() {
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,
newValue,
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() {
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,
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();
}
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();
}
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() {
_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() {
if (this.level === -1) {
return [];
}
if (this.key == null) {
return void 0;
}
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");
}
}
};
// packages/ag-grid-community/src/entities/rowNodeUtils.ts
function _createGlobalRowEvent(rowNode, gos, type) {
return _addGridCommonParams(gos, {
type,
node: rowNode,
data: rowNode.data,
rowIndex: rowNode.rowIndex,
rowPinned: rowNode.rowPinned
});
}
// packages/ag-grid-community/src/filter/filterWrapperComp.ts
var FilterWrapperComp = class extends 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(() => {
}) ?? 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 (!_exists(guiFromFilter)) {
_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)) {
_clearElement(this.getGui());
this.createFilter();
}
}
destroy() {
this.filterWrapper = null;
super.destroy();
}
};
// packages/ag-grid-community/src/rendering/features/positionableFeature.ts
var RESIZE_CONTAINER_STYLE = "ag-resizer-wrapper";
var makeDiv = (dataRefPrefix, classSuffix) => ``;
var RESIZE_TEMPLATE = (
/* html */
`
${makeDiv("eTopLeft", "topLeft")}
${makeDiv("eTop", "top")}
${makeDiv("eTopRight", "topRight")}
${makeDiv("eRight", "right")}
${makeDiv("eBottomRight", "bottomRight")}
${makeDiv("eBottom", "bottom")}
${makeDiv("eBottomLeft", "bottomLeft")}
${makeDiv("eLeft", "left")}
`
);
var PositionableFeature = class extends BeanStub {
constructor(element, config) {
super();
this.element = element;
this.dragStartPosition = {
x: 0,
y: 0
};
this.position = {
x: 0,
y: 0
};
this.lastSize = {
width: -1,
height: -1
};
this.positioned = false;
this.resizersAdded = false;
this.resizeListeners = [];
this.boundaryEl = null;
this.isResizing = false;
this.isMoving = false;
this.resizable = {};
this.movable = false;
this.currentResizer = null;
this.config = Object.assign({}, { popup: false }, config);
}
wireBeans(beans) {
this.popupSvc = beans.popupSvc;
this.dragSvc = beans.dragSvc;
}
center() {
const { clientHeight, clientWidth } = this.offsetParent;
const x = clientWidth / 2 - this.getWidth() / 2;
const y = clientHeight / 2 - this.getHeight() / 2;
this.offsetElement(x, y);
}
initialisePosition() {
if (this.positioned) {
return;
}
const { centered, forcePopupParentAsOffsetParent, minWidth, width, minHeight, height, x, y } = this.config;
if (!this.offsetParent) {
this.setOffsetParent();
}
let computedMinHeight = 0;
let computedMinWidth = 0;
const isElementVisible = _isVisible(this.element);
if (isElementVisible) {
const boundaryEl = this.findBoundaryElement();
const offsetParentComputedStyles = window.getComputedStyle(boundaryEl);
if (offsetParentComputedStyles.minWidth != null) {
const paddingWidth = boundaryEl.offsetWidth - this.element.offsetWidth;
computedMinWidth = parseInt(offsetParentComputedStyles.minWidth, 10) - paddingWidth;
}
if (offsetParentComputedStyles.minHeight != null) {
const paddingHeight = boundaryEl.offsetHeight - this.element.offsetHeight;
computedMinHeight = parseInt(offsetParentComputedStyles.minHeight, 10) - paddingHeight;
}
}
this.minHeight = minHeight || computedMinHeight;
this.minWidth = minWidth || computedMinWidth;
if (width) {
this.setWidth(width);
}
if (height) {
this.setHeight(height);
}
if (!width || !height) {
this.refreshSize();
}
if (centered) {
this.center();
} else if (x || y) {
this.offsetElement(x, y);
} else if (isElementVisible && forcePopupParentAsOffsetParent) {
let boundaryEl = this.boundaryEl;
let initialisedDuringPositioning = true;
if (!boundaryEl) {
boundaryEl = this.findBoundaryElement();
initialisedDuringPositioning = false;
}
if (boundaryEl) {
const top = parseFloat(boundaryEl.style.top);
const left = parseFloat(boundaryEl.style.left);
if (initialisedDuringPositioning) {
this.offsetElement(isNaN(left) ? 0 : left, isNaN(top) ? 0 : top);
} else {
this.setPosition(left, top);
}
}
}
this.positioned = !!this.offsetParent;
}
isPositioned() {
return this.positioned;
}
getPosition() {
return this.position;
}
setMovable(movable, moveElement) {
if (!this.config.popup || movable === this.movable) {
return;
}
this.movable = movable;
const params = this.moveElementDragListener || {
eElement: moveElement,
onDragStart: this.onMoveStart.bind(this),
onDragging: this.onMove.bind(this),
onDragStop: this.onMoveEnd.bind(this)
};
if (movable) {
this.dragSvc?.addDragSource(params);
this.moveElementDragListener = params;
} else {
this.dragSvc?.removeDragSource(params);
this.moveElementDragListener = void 0;
}
}
setResizable(resizable) {
this.clearResizeListeners();
if (resizable) {
this.addResizers();
} else {
this.removeResizers();
}
if (typeof resizable === "boolean") {
if (resizable === false) {
return;
}
resizable = {
topLeft: resizable,
top: resizable,
topRight: resizable,
right: resizable,
bottomRight: resizable,
bottom: resizable,
bottomLeft: resizable,
left: resizable
};
}
Object.keys(resizable).forEach((side) => {
const resizableStructure = resizable;
const isSideResizable = !!resizableStructure[side];
const resizerEl = this.getResizerElement(side);
const params = {
dragStartPixels: 0,
eElement: resizerEl,
onDragStart: (e) => this.onResizeStart(e, side),
onDragging: this.onResize.bind(this),
onDragStop: (e) => this.onResizeEnd(e, side)
};
if (isSideResizable || !this.isAlive() && !isSideResizable) {
if (isSideResizable) {
this.dragSvc?.addDragSource(params);
this.resizeListeners.push(params);
resizerEl.style.pointerEvents = "all";
} else {
resizerEl.style.pointerEvents = "none";
}
this.resizable[side] = isSideResizable;
}
});
}
removeSizeFromEl() {
this.element.style.removeProperty("height");
this.element.style.removeProperty("width");
this.element.style.removeProperty("flex");
}
restoreLastSize() {
this.element.style.flex = "0 0 auto";
const { height, width } = this.lastSize;
if (width !== -1) {
this.element.style.width = `${width}px`;
}
if (height !== -1) {
this.element.style.height = `${height}px`;
}
}
getHeight() {
return this.element.offsetHeight;
}
setHeight(height) {
const { popup } = this.config;
const eGui = this.element;
let isPercent = false;
if (typeof height === "string" && height.indexOf("%") !== -1) {
_setFixedHeight(eGui, height);
height = _getAbsoluteHeight(eGui);
isPercent = true;
} else {
height = Math.max(this.minHeight, height);
if (this.positioned) {
const availableHeight = this.getAvailableHeight();
if (availableHeight && height > availableHeight) {
height = availableHeight;
}
}
}
if (this.getHeight() === height) {
return;
}
if (!isPercent) {
if (popup) {
_setFixedHeight(eGui, height);
} else {
eGui.style.height = `${height}px`;
eGui.style.flex = "0 0 auto";
this.lastSize.height = typeof height === "number" ? height : parseFloat(height);
}
} else {
eGui.style.maxHeight = "unset";
eGui.style.minHeight = "unset";
}
}
getAvailableHeight() {
const { popup, forcePopupParentAsOffsetParent } = this.config;
if (!this.positioned) {
this.initialisePosition();
}
const { clientHeight } = this.offsetParent;
if (!clientHeight) {
return null;
}
const elRect = this.element.getBoundingClientRect();
const offsetParentRect = this.offsetParent.getBoundingClientRect();
const yPosition = popup ? this.position.y : elRect.top;
const parentTop = popup ? 0 : offsetParentRect.top;
let additionalHeight = 0;
if (forcePopupParentAsOffsetParent) {
const parentEl = this.element.parentElement;
if (parentEl) {
const { bottom } = parentEl.getBoundingClientRect();
additionalHeight = bottom - elRect.bottom;
}
}
const availableHeight = clientHeight + parentTop - yPosition - additionalHeight;
return availableHeight;
}
getWidth() {
return this.element.offsetWidth;
}
setWidth(width) {
const eGui = this.element;
const { popup } = this.config;
let isPercent = false;
if (typeof width === "string" && width.indexOf("%") !== -1) {
_setFixedWidth(eGui, width);
width = _getAbsoluteWidth(eGui);
isPercent = true;
} else if (this.positioned) {
width = Math.max(this.minWidth, width);
const { clientWidth } = this.offsetParent;
const xPosition = popup ? this.position.x : this.element.getBoundingClientRect().left;
if (clientWidth && width + xPosition > clientWidth) {
width = clientWidth - xPosition;
}
}
if (this.getWidth() === width) {
return;
}
if (!isPercent) {
if (this.config.popup) {
_setFixedWidth(eGui, width);
} else {
eGui.style.width = `${width}px`;
eGui.style.flex = " unset";
this.lastSize.width = typeof width === "number" ? width : parseFloat(width);
}
} else {
eGui.style.maxWidth = "unset";
eGui.style.minWidth = "unset";
}
}
offsetElement(x = 0, y = 0) {
const { forcePopupParentAsOffsetParent } = this.config;
const ePopup = forcePopupParentAsOffsetParent ? this.boundaryEl : this.element;
if (!ePopup) {
return;
}
this.popupSvc?.positionPopup({
ePopup,
keepWithinBounds: true,
skipObserver: this.movable || this.isResizable(),
updatePosition: () => ({ x, y })
});
this.setPosition(parseFloat(ePopup.style.left), parseFloat(ePopup.style.top));
}
constrainSizeToAvailableHeight(constrain) {
if (!this.config.forcePopupParentAsOffsetParent) {
return;
}
const applyMaxHeightToElement = () => {
const availableHeight = this.getAvailableHeight();
this.element.style.setProperty("max-height", `${availableHeight}px`);
};
if (constrain && this.popupSvc) {
this.resizeObserverSubscriber = _observeResize(
this.beans,
this.popupSvc?.getPopupParent(),
applyMaxHeightToElement
);
} else {
this.element.style.removeProperty("max-height");
if (this.resizeObserverSubscriber) {
this.resizeObserverSubscriber();
this.resizeObserverSubscriber = void 0;
}
}
}
setPosition(x, y) {
this.position.x = x;
this.position.y = y;
}
updateDragStartPosition(x, y) {
this.dragStartPosition = { x, y };
}
calculateMouseMovement(params) {
const { e, isLeft, isTop, anywhereWithin, topBuffer } = params;
const xDiff = e.clientX - this.dragStartPosition.x;
const yDiff = e.clientY - this.dragStartPosition.y;
const movementX = this.shouldSkipX(e, !!isLeft, !!anywhereWithin, xDiff) ? 0 : xDiff;
const movementY = this.shouldSkipY(e, !!isTop, topBuffer, yDiff) ? 0 : yDiff;
return { movementX, movementY };
}
shouldSkipX(e, isLeft, anywhereWithin, diff) {
const elRect = this.element.getBoundingClientRect();
const parentRect = this.offsetParent.getBoundingClientRect();
const boundaryElRect = this.boundaryEl.getBoundingClientRect();
const xPosition = this.config.popup ? this.position.x : elRect.left;
let skipX = xPosition <= 0 && parentRect.left >= e.clientX || parentRect.right <= e.clientX && parentRect.right <= boundaryElRect.right;
if (skipX) {
return true;
}
if (isLeft) {
skipX = // skip if we are moving to the left and the cursor
// is positioned to the right of the left side anchor
diff < 0 && e.clientX > xPosition + parentRect.left || // skip if we are moving to the right and the cursor
// is positioned to the left of the dialog
diff > 0 && e.clientX < xPosition + parentRect.left;
} else {
if (anywhereWithin) {
skipX = diff < 0 && e.clientX > boundaryElRect.right || diff > 0 && e.clientX < xPosition + parentRect.left;
} else {
skipX = // if the movement is bound to the right side of the dialog
// we skip if we are moving to the left and the cursor
// is to the right of the dialog
diff < 0 && e.clientX > boundaryElRect.right || // or skip if we are moving to the right and the cursor
// is to the left of the right side anchor
diff > 0 && e.clientX < boundaryElRect.right;
}
}
return skipX;
}
shouldSkipY(e, isTop, topBuffer = 0, diff) {
const elRect = this.element.getBoundingClientRect();
const parentRect = this.offsetParent.getBoundingClientRect();
const boundaryElRect = this.boundaryEl.getBoundingClientRect();
const yPosition = this.config.popup ? this.position.y : elRect.top;
let skipY = yPosition <= 0 && parentRect.top >= e.clientY || parentRect.bottom <= e.clientY && parentRect.bottom <= boundaryElRect.bottom;
if (skipY) {
return true;
}
if (isTop) {
skipY = // skip if we are moving to towards top and the cursor is
// below the top anchor + topBuffer
// note: topBuffer is used when moving the dialog using the title bar
diff < 0 && e.clientY > yPosition + parentRect.top + topBuffer || // skip if we are moving to the bottom and the cursor is
// above the top anchor
diff > 0 && e.clientY < yPosition + parentRect.top;
} else {
skipY = // skip if we are moving towards the top and the cursor
// is below the bottom anchor
diff < 0 && e.clientY > boundaryElRect.bottom || // skip if we are moving towards the bottom and the cursor
// is above the bottom anchor
diff > 0 && e.clientY < boundaryElRect.bottom;
}
return skipY;
}
createResizeMap() {
const eGui = this.element;
this.resizerMap = {
topLeft: { element: eGui.querySelector("[data-ref=eTopLeftResizer]") },
top: { element: eGui.querySelector("[data-ref=eTopResizer]") },
topRight: { element: eGui.querySelector("[data-ref=eTopRightResizer]") },
right: { element: eGui.querySelector("[data-ref=eRightResizer]") },
bottomRight: { element: eGui.querySelector("[data-ref=eBottomRightResizer]") },
bottom: { element: eGui.querySelector("[data-ref=eBottomResizer]") },
bottomLeft: { element: eGui.querySelector("[data-ref=eBottomLeftResizer]") },
left: { element: eGui.querySelector("[data-ref=eLeftResizer]") }
};
}
addResizers() {
if (this.resizersAdded) {
return;
}
const eGui = this.element;
if (!eGui) {
return;
}
const parser = new DOMParser();
const resizers = parser.parseFromString(RESIZE_TEMPLATE, "text/html").body;
eGui.appendChild(resizers.firstChild);
this.createResizeMap();
this.resizersAdded = true;
}
removeResizers() {
this.resizerMap = void 0;
const resizerEl = this.element.querySelector(`.${RESIZE_CONTAINER_STYLE}`);
if (resizerEl) {
this.element.removeChild(resizerEl);
}
this.resizersAdded = false;
}
getResizerElement(side) {
return this.resizerMap[side].element;
}
onResizeStart(e, side) {
this.boundaryEl = this.findBoundaryElement();
if (!this.positioned) {
this.initialisePosition();
}
this.currentResizer = {
isTop: !!side.match(/top/i),
isRight: !!side.match(/right/i),
isBottom: !!side.match(/bottom/i),
isLeft: !!side.match(/left/i)
};
this.element.classList.add("ag-resizing");
this.resizerMap[side].element.classList.add("ag-active");
const { popup, forcePopupParentAsOffsetParent } = this.config;
if (!popup && !forcePopupParentAsOffsetParent) {
this.applySizeToSiblings(this.currentResizer.isBottom || this.currentResizer.isTop);
}
this.isResizing = true;
this.updateDragStartPosition(e.clientX, e.clientY);
}
getSiblings() {
const element = this.element;
const parent = element.parentElement;
if (!parent) {
return null;
}
return Array.prototype.slice.call(parent.children).filter((el) => !el.classList.contains("ag-hidden"));
}
getMinSizeOfSiblings() {
const siblings = this.getSiblings() || [];
let height = 0;
let width = 0;
for (let i = 0; i < siblings.length; i++) {
const currentEl = siblings[i];
const isFlex = !!currentEl.style.flex && currentEl.style.flex !== "0 0 auto";
if (currentEl === this.element) {
continue;
}
let nextHeight = this.minHeight || 0;
let nextWidth = this.minWidth || 0;
if (isFlex) {
const computedStyle = window.getComputedStyle(currentEl);
if (computedStyle.minHeight) {
nextHeight = parseInt(computedStyle.minHeight, 10);
}
if (computedStyle.minWidth) {
nextWidth = parseInt(computedStyle.minWidth, 10);
}
} else {
nextHeight = currentEl.offsetHeight;
nextWidth = currentEl.offsetWidth;
}
height += nextHeight;
width += nextWidth;
}
return { height, width };
}
applySizeToSiblings(vertical) {
let containerToFlex = null;
const siblings = this.getSiblings();
if (!siblings) {
return;
}
for (let i = 0; i < siblings.length; i++) {
const el = siblings[i];
if (el === containerToFlex) {
continue;
}
if (vertical) {
el.style.height = `${el.offsetHeight}px`;
} else {
el.style.width = `${el.offsetWidth}px`;
}
el.style.flex = "0 0 auto";
if (el === this.element) {
containerToFlex = siblings[i + 1];
}
}
if (containerToFlex) {
containerToFlex.style.removeProperty("height");
containerToFlex.style.removeProperty("min-height");
containerToFlex.style.removeProperty("max-height");
containerToFlex.style.flex = "1 1 auto";
}
}
isResizable() {
return Object.values(this.resizable).some((value) => value);
}
onResize(e) {
if (!this.isResizing || !this.currentResizer) {
return;
}
const { popup, forcePopupParentAsOffsetParent } = this.config;
const { isTop, isRight, isBottom, isLeft } = this.currentResizer;
const isHorizontal = isRight || isLeft;
const isVertical = isBottom || isTop;
const { movementX, movementY } = this.calculateMouseMovement({ e, isLeft, isTop });
const xPosition = this.position.x;
const yPosition = this.position.y;
let offsetLeft = 0;
let offsetTop = 0;
if (isHorizontal && movementX) {
const direction = isLeft ? -1 : 1;
const oldWidth = this.getWidth();
const newWidth = oldWidth + movementX * direction;
let skipWidth = false;
if (isLeft) {
offsetLeft = oldWidth - newWidth;
if (xPosition + offsetLeft <= 0 || newWidth <= this.minWidth) {
skipWidth = true;
offsetLeft = 0;
}
}
if (!skipWidth) {
this.setWidth(newWidth);
}
}
if (isVertical && movementY) {
const direction = isTop ? -1 : 1;
const oldHeight = this.getHeight();
const newHeight = oldHeight + movementY * direction;
let skipHeight = false;
if (isTop) {
offsetTop = oldHeight - newHeight;
if (yPosition + offsetTop <= 0 || newHeight <= this.minHeight) {
skipHeight = true;
offsetTop = 0;
}
} else {
if (!this.config.popup && !this.config.forcePopupParentAsOffsetParent && oldHeight < newHeight && this.getMinSizeOfSiblings().height + newHeight > this.element.parentElement.offsetHeight) {
skipHeight = true;
}
}
if (!skipHeight) {
this.setHeight(newHeight);
}
}
this.updateDragStartPosition(e.clientX, e.clientY);
if ((popup || forcePopupParentAsOffsetParent) && offsetLeft || offsetTop) {
this.offsetElement(xPosition + offsetLeft, yPosition + offsetTop);
}
}
onResizeEnd(e, side) {
this.isResizing = false;
this.currentResizer = null;
this.boundaryEl = null;
this.element.classList.remove("ag-resizing");
this.resizerMap[side].element.classList.remove("ag-active");
this.dispatchLocalEvent({ type: "resize" });
}
refreshSize() {
const eGui = this.element;
if (this.config.popup) {
if (!this.config.width) {
this.setWidth(eGui.offsetWidth);
}
if (!this.config.height) {
this.setHeight(eGui.offsetHeight);
}
}
}
onMoveStart(e) {
this.boundaryEl = this.findBoundaryElement();
if (!this.positioned) {
this.initialisePosition();
}
this.isMoving = true;
this.element.classList.add("ag-moving");
this.updateDragStartPosition(e.clientX, e.clientY);
}
onMove(e) {
if (!this.isMoving) {
return;
}
const { x, y } = this.position;
let topBuffer;
if (this.config.calculateTopBuffer) {
topBuffer = this.config.calculateTopBuffer();
}
const { movementX, movementY } = this.calculateMouseMovement({
e,
isTop: true,
anywhereWithin: true,
topBuffer
});
this.offsetElement(x + movementX, y + movementY);
this.updateDragStartPosition(e.clientX, e.clientY);
}
onMoveEnd() {
this.isMoving = false;
this.boundaryEl = null;
this.element.classList.remove("ag-moving");
}
setOffsetParent() {
if (this.config.forcePopupParentAsOffsetParent && this.popupSvc) {
this.offsetParent = this.popupSvc.getPopupParent();
} else {
this.offsetParent = this.element.offsetParent;
}
}
findBoundaryElement() {
let el = this.element;
while (el) {
if (window.getComputedStyle(el).position !== "static") {
return el;
}
el = el.parentElement;
}
return this.element;
}
clearResizeListeners() {
while (this.resizeListeners.length) {
const params = this.resizeListeners.pop();
this.dragSvc?.removeDragSource(params);
}
}
destroy() {
super.destroy();
if (this.moveElementDragListener) {
this.dragSvc?.removeDragSource(this.moveElementDragListener);
}
this.constrainSizeToAvailableHeight(false);
this.clearResizeListeners();
this.removeResizers();
}
};
// packages/ag-grid-community/src/widgets/managedFocusFeature.ts
var FOCUS_MANAGED_CLASS = "ag-focus-managed";
var ManagedFocusFeature = class extends BeanStub {
constructor(eFocusable, callbacks = {}) {
super();
this.eFocusable = eFocusable;
this.callbacks = callbacks;
this.callbacks = {
shouldStopEventPropagation: () => false,
onTabKeyDown: (e) => {
if (e.defaultPrevented) {
return;
}
const nextRoot = _findNextFocusableElement(this.beans, this.eFocusable, false, e.shiftKey);
if (!nextRoot) {
return;
}
nextRoot.focus();
e.preventDefault();
},
...callbacks
};
}
postConstruct() {
const {
eFocusable,
callbacks: { onFocusIn, onFocusOut }
} = this;
eFocusable.classList.add(FOCUS_MANAGED_CLASS);
this.addKeyDownListeners(eFocusable);
if (onFocusIn) {
this.addManagedElementListeners(eFocusable, { focusin: onFocusIn });
}
if (onFocusOut) {
this.addManagedElementListeners(eFocusable, { focusout: onFocusOut });
}
}
addKeyDownListeners(eGui) {
this.addManagedElementListeners(eGui, {
keydown: (e) => {
if (e.defaultPrevented || _isStopPropagationForAgGrid(e)) {
return;
}
const { callbacks } = this;
if (callbacks.shouldStopEventPropagation(e)) {
_stopPropagationForAgGrid(e);
return;
}
if (e.key === KeyCode.TAB) {
callbacks.onTabKeyDown(e);
} else if (callbacks.handleKeyDown) {
callbacks.handleKeyDown(e);
}
}
});
}
};
// packages/ag-grid-community/src/filter/filterLocaleText.ts
var 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"
};
// packages/ag-grid-community/src/filter/floating/provided/providedFilterUtils.ts
function getDebounceMs(params, debounceDefault) {
const { debounceMs } = params;
if (isUseApplyButton(params)) {
if (debounceMs != null) {
_warn(71);
}
return 0;
}
return debounceMs ?? debounceDefault;
}
function isUseApplyButton(params) {
return (params.buttons?.indexOf("apply") ?? -1) >= 0;
}
// packages/ag-grid-community/src/filter/provided/providedFilter.ts
var ProvidedFilter = class extends 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 = RefPlaceholder;
this.buttonListeners = [];
// subclasses can override this to provide alternative debounce defaults
this.defaultDebounceMs = 0;
}
postConstruct() {
this.resetTemplate();
this.createManagedBean(
new ManagedFocusFeature(this.getFocusableElement(), {
handleKeyDown: this.handleKeyDown.bind(this)
})
);
this.positionableFeature = new 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() {
return !!this.appliedModel;
}
resetTemplate(paramsMap) {
let eGui = this.getGui();
if (eGui) {
eGui.removeEventListener("submit", this.onFormSubmit);
}
const templateString = (
/* html */
`
`
);
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 = isUseApplyButton(params);
this.resetButtonsPanel(params);
}
updateParams(params) {
this.params = params;
this.applyActive = 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 && _jsonEquals(oldButtons, buttons)) {
return;
}
const hasButtons = buttons && buttons.length > 0 && !this.isReadOnly();
if (!this.eButtonsPanel) {
if (hasButtons) {
this.eButtonsPanel = document.createElement("div");
this.eButtonsPanel.classList.add("ag-filter-apply-panel");
}
} else {
_clearElement(this.eButtonsPanel);
this.buttonListeners.forEach((destroyFunc) => destroyFunc());
this.buttonListeners = [];
}
if (!hasButtons) {
if (this.eButtonsPanel) {
_removeFromParent(this.eButtonsPanel);
}
return;
}
const fragment = document.createDocumentFragment();
const addButton = (type) => {
let clickListener;
const text = type ? this.translate(`${type}Filter`) : void 0;
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:
_warn(75);
return;
}
const buttonType = type === "apply" ? "submit" : "button";
const button = _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 = getDebounceMs(this.params, this.defaultDebounceMs);
const debounceFunc = _debounce(this, this.checkApplyDebounce.bind(this), debounceMs);
this.onBtApplyDebounce = () => {
this.debouncePending = true;
debounceFunc();
};
}
checkApplyDebounce() {
if (this.debouncePending) {
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();
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;
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) {
if (e) {
e.preventDefault();
}
if (this.applyModel(afterDataChange ? "rowDataUpdated" : "ui")) {
const source = "columnFilter";
this.params.filterChangedCallback({ afterFloatingFilter, afterDataChange, source });
}
const { closeOnApply } = this.params;
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) {
_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) {
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, FILTER_LOCALE_TEXT[key]);
}
getCellValue(rowNode) {
return this.params.getValue(rowNode);
}
// override to control positionable feature
getPositionableElement() {
return this.eFilterBody;
}
};
// packages/ag-grid-community/src/filter/floating/floatingFilterMapper.ts
function _getDefaultFloatingFilterType(frameworkOverrides, def, getFromDefault) {
if (def == null) {
return null;
}
let defaultFloatingFilterType = null;
const { compName, jsComp, fwComp } = _getFilterCompKeys(frameworkOverrides, def);
if (compName) {
const floatingFilterTypeMap = {
agSetColumnFilter: "agSetColumnFloatingFilter",
agMultiColumnFilter: "agMultiColumnFloatingFilter",
agGroupColumnFilter: "agGroupColumnFloatingFilter",
agNumberColumnFilter: "agNumberColumnFloatingFilter",
agDateColumnFilter: "agDateColumnFloatingFilter",
agTextColumnFilter: "agTextColumnFloatingFilter"
};
defaultFloatingFilterType = floatingFilterTypeMap[compName];
} else {
const usingDefaultFilter = jsComp == null && fwComp == null && def.filter === true;
if (usingDefaultFilter) {
defaultFloatingFilterType = getFromDefault();
}
}
return defaultFloatingFilterType;
}
// packages/ag-grid-community/src/styling/layoutFeature.ts
var LayoutCssClasses = {
AUTO_HEIGHT: "ag-layout-auto-height",
NORMAL: "ag-layout-normal",
PRINT: "ag-layout-print"
};
var LayoutFeature = class extends BeanStub {
constructor(view) {
super();
this.view = view;
}
postConstruct() {
this.addManagedPropertyListener("domLayout", this.updateLayoutClasses.bind(this));
this.updateLayoutClasses();
}
updateLayoutClasses() {
const domLayout = this.gos.get("domLayout");
const params = {
autoHeight: domLayout === "autoHeight",
normal: domLayout === "normal",
print: domLayout === "print"
};
const cssClass = params.autoHeight ? LayoutCssClasses.AUTO_HEIGHT : params.print ? LayoutCssClasses.PRINT : LayoutCssClasses.NORMAL;
this.view.updateLayoutClasses(cssClass, params);
}
};
// packages/ag-grid-community/src/gridBodyComp/gridBodyScrollFeature.ts
var VIEWPORT = "Viewport";
var FAKE_V_SCROLLBAR = "fakeVScrollComp";
var HORIZONTAL_SOURCES = [
"fakeHScrollComp",
"centerHeader",
"topCenter",
"bottomCenter",
"stickyTopCenter",
"stickyBottomCenter"
];
var SCROLL_DEBOUNCE_TIMEOUT = 100;
var SCROLL_END_TIMEOUT = 150;
var GridBodyScrollFeature = class extends BeanStub {
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 = _debounce(
this,
() => this.lastScrollSource[1 /* Horizontal */] = null,
SCROLL_END_TIMEOUT
);
this.resetLastVScrollDebounced = _debounce(
this,
() => this.lastScrollSource[0 /* Vertical */] = null,
SCROLL_END_TIMEOUT
);
}
wireBeans(beans) {
this.ctrlsSvc = beans.ctrlsSvc;
this.animationFrameSvc = beans.animationFrameSvc;
this.visibleCols = beans.visibleCols;
}
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 ? _debounce(this, this.onVScroll.bind(this, VIEWPORT), SCROLL_DEBOUNCE_TIMEOUT) : this.onVScroll.bind(this, VIEWPORT);
const onFakeVScroll = isDebounce ? _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) {
this.horizontallyScrollHeaderCenterAndFloatingCenter();
}
}
horizontallyScrollHeaderCenterAndFloatingCenter(scrollLeft) {
const notYetInitialised = this.centerRowsCtrl == null;
if (notYetInitialised) {
return;
}
if (scrollLeft === void 0) {
scrollLeft = this.centerRowsCtrl.getCenterViewportScrollLeft();
}
this.setScrollLeftForAllContainersExceptCurrent(Math.abs(scrollLeft));
}
setScrollLeftForAllContainersExceptCurrent(scrollLeft) {
for (const container of [...HORIZONTAL_SOURCES, VIEWPORT]) {
if (this.lastScrollSource[1 /* Horizontal */] === container) {
continue;
}
const viewport = this.getViewportForSource(container);
_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 === 0 /* Vertical */) {
this.lastScrollSource[0] = source;
} else {
this.lastScrollSource[1] = source;
}
return true;
}
return this.lastScrollSource[direction] === source;
}
onHScroll(source) {
if (!this.isControllingScroll(source, 1 /* Horizontal */)) {
return;
}
const centerContainerViewport = this.centerRowsCtrl.eViewport;
const { scrollLeft } = centerContainerViewport;
if (this.shouldBlockScrollUpdate(1 /* Horizontal */, scrollLeft, true)) {
return;
}
const newScrollLeft = _getScrollLeft(this.getViewportForSource(source), this.enableRtl);
this.doHorizontalScroll(newScrollLeft);
this.resetLastHScrollDebounced();
}
onVScroll(source) {
if (!this.isControllingScroll(source, 0 /* Vertical */)) {
return;
}
let scrollTop;
if (source === VIEWPORT) {
scrollTop = this.eBodyViewport.scrollTop;
} else {
scrollTop = this.ctrlsSvc.get("fakeVScrollComp").getScrollPosition();
}
if (this.shouldBlockScrollUpdate(0 /* 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;
}
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(1 /* Horizontal */);
this.horizontallyScrollHeaderCenterAndFloatingCenter(scrollLeft);
this.centerRowsCtrl.onHorizontalViewportChanged(true);
}
fireScrollEvent(direction) {
const bodyScrollEvent = {
type: "bodyScroll",
direction: direction === 1 /* 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) {
if (touchOnly && !_isIOSUserAgent()) {
return false;
}
if (direction === 0 /* Vertical */) {
return this.shouldBlockVerticalScroll(scrollTo);
}
return this.shouldBlockHorizontalScroll(scrollTo);
}
shouldBlockVerticalScroll(scrollTo) {
const clientHeight = _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 && _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(0 /* 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 (!fromAlignedGridsService && this.shouldBlockScrollUpdate(1 /* Horizontal */, hScrollPosition)) {
if (this.enableRtl && _isRtlNegativeScroll()) {
hScrollPosition = hScrollPosition > 0 ? 0 : maxScrollLeft;
} else {
hScrollPosition = Math.min(Math.max(hScrollPosition, minScrollLeft), maxScrollLeft);
}
}
_setScrollLeft(this.centerRowsCtrl.eViewport, Math.abs(hScrollPosition), this.enableRtl);
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;
const rowCount = rowModel.getRowCount();
let indexToSelect = -1;
for (let i = 0; i < rowCount; i++) {
const node = rowModel.getRow(i);
if (typeof comparator === "function") {
const predicate = comparator;
if (node && predicate(node)) {
indexToSelect = i;
break;
}
} else {
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 (_isDomLayout(this.gos, "print")) {
return;
}
const { rowModel } = this.beans;
const rowCount = rowModel.getRowCount();
if (typeof index !== "number" || index < 0 || index >= rowCount) {
_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;
const pxTop = heightScaler.getScrollPositionForPixel(rowTopPixel);
const pxBottom = heightScaler.getScrollPositionForPixel(rowBottomPixel - viewportHeight);
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) {
newScrollPosition = pxTop - stickyTopHeight;
} else if (rowBelowViewport) {
newScrollPosition = pxBottom + stickyBottomHeight;
}
if (newScrollPosition !== null) {
this.setVerticalScrollPosition(newScrollPosition);
rowRenderer.redraw({ afterScroll: true });
}
rowGotShiftedDuringOperation = startingRowTop !== rowNode.rowTop || startingRowHeight !== rowNode.rowHeight;
} while (rowGotShiftedDuringOperation);
this.animationFrameSvc?.flushAllFrames();
});
}
ensureColumnVisible(key, position = "auto") {
const { colModel, frameworkOverrides } = this.beans;
const column = colModel.getCol(key);
if (!column) {
return;
}
if (column.isPinned()) {
return;
}
if (!this.visibleCols.isColDisplayed(column)) {
return;
}
const newHorizontalScroll = this.getPositionedHorizontalScroll(column, position);
frameworkOverrides.wrapIncoming(() => {
if (newHorizontalScroll !== null) {
this.centerRowsCtrl.setCenterViewportScrollLeft(newHorizontalScroll);
}
this.centerRowsCtrl.onHorizontalViewportChanged();
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 };
}
};
// packages/ag-grid-community/src/gridBodyComp/centerWidthFeature.ts
var CenterWidthFeature = class extends 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 = _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);
}
};
// packages/ag-grid-community/src/gridBodyComp/viewportSizeFeature.ts
var ViewportSizeFeature = class extends BeanStub {
constructor(centerContainerCtrl) {
super();
this.centerContainerCtrl = centerContainerCtrl;
}
wireBeans(beans) {
this.scrollVisibleSvc = beans.scrollVisibleSvc;
}
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 = () => {
_requestAnimationFrame(beans, () => {
this.onCenterViewportResized();
});
};
centerContainerCtrl.registerViewportResizeListener(listener);
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() {
this.updateScrollVisibleService();
this.checkBodyHeight();
this.onHorizontalViewportChanged();
this.gridBodyCtrl.scrollFeature.checkScrollLeft();
}
getBodyHeight() {
return this.bodyHeight;
}
checkBodyHeight() {
const eBodyViewport = this.gridBodyCtrl.eBodyViewport;
const bodyHeight = _getInnerHeight(eBodyViewport);
if (this.bodyHeight !== bodyHeight) {
this.bodyHeight = bodyHeight;
this.eventSvc.dispatchEvent({
type: "bodyHeightChanged"
});
}
}
updateScrollVisibleService() {
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);
}
};
// packages/ag-grid-community/src/styling/stylingUtils.ts
function processClassRules(expressionSvc, previousClassRules, classRules, params, onApplicableClass, onNotApplicableClass) {
if (classRules == null && previousClassRules == null) {
return;
}
const classesToApply = {};
const classesToRemove = {};
const forEachSingleClass = (className, callback) => {
className.split(" ").forEach((singleClass) => {
if (singleClass.trim() == "")
return;
callback(singleClass);
});
};
if (classRules) {
const classNames = Object.keys(classRules);
for (let i = 0; i < classNames.length; i++) {
const className = classNames[i];
const rule = classRules[className];
let resultOfRule;
if (typeof rule === "string") {
resultOfRule = expressionSvc ? expressionSvc.evaluate(rule, params) : true;
} else if (typeof rule === "function") {
resultOfRule = rule(params);
}
forEachSingleClass(className, (singleClass) => {
resultOfRule ? classesToApply[singleClass] = true : classesToRemove[singleClass] = true;
});
}
}
if (previousClassRules && onNotApplicableClass) {
Object.keys(previousClassRules).forEach(
(className) => forEachSingleClass(className, (singleClass) => {
if (!classesToApply[singleClass]) {
classesToRemove[singleClass] = true;
}
})
);
}
if (onNotApplicableClass) {
Object.keys(classesToRemove).forEach(onNotApplicableClass);
}
Object.keys(classesToApply).forEach(onApplicableClass);
}
// packages/ag-grid-community/src/styling/rowStyleService.ts
function calculateRowLevel(rowNode) {
if (rowNode.group) {
return rowNode.level;
}
const parent = rowNode.parent;
return parent ? parent.level + 1 : 0;
}
var RowStyleService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "rowStyleSvc";
}
processClassesFromGridOptions(classes, rowNode) {
const gos = this.gos;
const process = (rowCls) => {
if (typeof rowCls === "string") {
classes.push(rowCls);
} else if (Array.isArray(rowCls)) {
rowCls.forEach((e) => classes.push(e));
}
};
const rowClass = gos.get("rowClass");
if (rowClass) {
process(rowClass);
}
const rowClassFunc = gos.getCallback("getRowClass");
if (rowClassFunc) {
const params = {
data: rowNode.data,
node: rowNode,
rowIndex: rowNode.rowIndex
};
const rowClassFuncResult = rowClassFunc(params);
process(rowClassFuncResult);
}
}
preProcessRowClassRules(classes, rowNode) {
this.processRowClassRules(
rowNode,
(className) => {
classes.push(className);
},
() => {
}
);
}
processRowClassRules(rowNode, onApplicableClass, onNotApplicableClass) {
const { gos, expressionSvc } = this.beans;
const rowClassParams = _addGridCommonParams(gos, {
data: rowNode.data,
node: rowNode,
rowIndex: rowNode.rowIndex
});
processClassRules(
expressionSvc,
void 0,
gos.get("rowClassRules"),
rowClassParams,
onApplicableClass,
onNotApplicableClass
);
}
processStylesFromGridOptions(rowNode) {
const gos = this.gos;
const rowStyle = gos.get("rowStyle");
const rowStyleFunc = gos.getCallback("getRowStyle");
let rowStyleFuncResult;
if (rowStyleFunc) {
const params = {
data: rowNode.data,
node: rowNode,
rowIndex: rowNode.rowIndex
};
rowStyleFuncResult = rowStyleFunc(params);
}
if (rowStyleFuncResult || rowStyle) {
return Object.assign({}, rowStyle, rowStyleFuncResult);
}
return void 0;
}
};
// packages/ag-grid-community/src/rendering/row/rowCtrl.ts
var instanceIdSequence3 = 0;
var DOM_DATA_KEY_ROW_CTRL = "renderedRow";
var RowCtrl = class extends BeanStub {
constructor(rowNode, beans, animateIn, useAnimationFrameForCreate, printLayout) {
super();
this.rowNode = rowNode;
this.useAnimationFrameForCreate = useAnimationFrameForCreate;
this.printLayout = printLayout;
this.allRowGuis = [];
this.active = true;
this.centerCellCtrls = { list: [], map: {} };
this.leftCellCtrls = { list: [], map: {} };
this.rightCellCtrls = { list: [], map: {} };
this.slideInAnimation = {
left: false,
center: false,
right: false,
fullWidth: false
};
this.fadeInAnimation = {
left: false,
center: false,
right: false,
fullWidth: false
};
this.rowDragComps = [];
this.lastMouseDownOnDragger = false;
this.emptyStyle = {};
this.updateColumnListsPending = false;
this.rowId = null;
/** sanitised */
this.businessKey = null;
this.beans = beans;
this.gos = beans.gos;
this.paginationPage = beans.pagination?.getCurrentPage() ?? 0;
this.suppressRowTransform = this.gos.get("suppressRowTransform");
this.instanceId = rowNode.id + "-" + instanceIdSequence3++;
this.rowId = _escapeString(rowNode.id);
this.initRowBusinessKey();
this.rowFocused = beans.focusSvc.isRowFocused(this.rowNode.rowIndex, this.rowNode.rowPinned);
this.rowLevel = calculateRowLevel(this.rowNode);
this.setRowType();
this.setAnimateFlags(animateIn);
this.rowStyles = this.processStylesFromGridOptions();
this.addListeners();
}
initRowBusinessKey() {
this.businessKeyForNodeFunc = this.gos.get("getBusinessKeyForNode");
this.updateRowBusinessKey();
}
updateRowBusinessKey() {
if (typeof this.businessKeyForNodeFunc !== "function") {
return;
}
const businessKey = this.businessKeyForNodeFunc(this.rowNode);
this.businessKey = _escapeString(businessKey);
}
updateGui(containerType, gui) {
if (containerType === "left") {
this.leftGui = gui;
} else if (containerType === "right") {
this.rightGui = gui;
} else if (containerType === "fullWidth") {
this.fullWidthGui = gui;
} else {
this.centerGui = gui;
}
}
setComp(rowComp, element, containerType, compBean) {
compBean = setupCompBean(this, this.beans.context, compBean);
const gui = { rowComp, element, containerType, compBean };
this.allRowGuis.push(gui);
this.updateGui(containerType, gui);
this.initialiseRowComp(gui);
const isSsrmLoadingRow = this.rowType === "FullWidthLoading" || this.rowNode.stub;
if (!isSsrmLoadingRow && !this.rowNode.rowPinned) {
this.beans.rowRenderer.dispatchFirstDataRenderedEvent();
}
}
unsetComp(containerType) {
this.allRowGuis = this.allRowGuis.filter((rowGui) => rowGui.containerType !== containerType);
this.updateGui(containerType, void 0);
}
isCacheable() {
return this.rowType === "FullWidthDetail" && this.gos.get("keepDetailRows");
}
setCached(cached) {
const displayValue = cached ? "none" : "";
this.allRowGuis.forEach((rg) => rg.element.style.display = displayValue);
}
initialiseRowComp(gui) {
const gos = this.gos;
this.onSuppressCellFocusChanged(this.beans.gos.get("suppressCellFocus"));
this.listenOnDomOrder(gui);
this.onRowHeightChanged(gui);
this.updateRowIndexes(gui);
this.setFocusedClasses(gui);
this.setStylesFromGridOptions(false, gui);
if (_isRowSelection(gos) && this.rowNode.selectable) {
this.onRowSelected(gui);
}
this.updateColumnLists(!this.useAnimationFrameForCreate);
const comp = gui.rowComp;
const initialRowClasses = this.getInitialRowClasses(gui.containerType);
initialRowClasses.forEach((name) => comp.addOrRemoveCssClass(name, true));
this.executeSlideAndFadeAnimations(gui);
if (this.rowNode.group) {
_setAriaExpanded(gui.element, this.rowNode.expanded == true);
}
this.setRowCompRowId(comp);
this.setRowCompRowBusinessKey(comp);
_setDomData(gos, gui.element, DOM_DATA_KEY_ROW_CTRL, this);
gui.compBean.addDestroyFunc(() => _setDomData(gos, gui.element, DOM_DATA_KEY_ROW_CTRL, null));
if (this.useAnimationFrameForCreate) {
this.beans.animationFrameSvc.createTask(
this.addHoverFunctionality.bind(this, gui),
this.rowNode.rowIndex,
"createTasksP2"
);
} else {
this.addHoverFunctionality(gui);
}
if (this.isFullWidth()) {
this.setupFullWidth(gui);
}
if (gos.get("rowDragEntireRow")) {
this.addRowDraggerToRow(gui);
}
if (this.useAnimationFrameForCreate) {
this.beans.animationFrameSvc.addDestroyTask(() => {
if (!this.isAlive()) {
return;
}
gui.rowComp.addOrRemoveCssClass("ag-after-created", true);
});
}
this.executeProcessRowPostCreateFunc();
}
setRowCompRowBusinessKey(comp) {
if (this.businessKey == null) {
return;
}
comp.setRowBusinessKey(this.businessKey);
}
setRowCompRowId(comp) {
const rowId = _escapeString(this.rowNode.id);
this.rowId = rowId;
if (rowId == null) {
return;
}
comp.setRowId(rowId);
}
executeSlideAndFadeAnimations(gui) {
const { containerType } = gui;
const shouldSlide = this.slideInAnimation[containerType];
if (shouldSlide) {
_executeNextVMTurn(() => {
this.onTopChanged();
});
this.slideInAnimation[containerType] = false;
}
const shouldFade = this.fadeInAnimation[containerType];
if (shouldFade) {
_executeNextVMTurn(() => {
gui.rowComp.addOrRemoveCssClass("ag-opacity-zero", false);
});
this.fadeInAnimation[containerType] = false;
}
}
addRowDraggerToRow(gui) {
const rowDragComp = this.beans.rowDragSvc?.createRowDragCompForRow(this.rowNode, gui.element);
if (!rowDragComp) {
return;
}
const rowDragBean = this.createBean(rowDragComp, this.beans.context);
this.rowDragComps.push(rowDragBean);
gui.compBean.addDestroyFunc(() => {
this.rowDragComps = this.rowDragComps.filter((r) => r !== rowDragBean);
this.destroyBean(rowDragBean, this.beans.context);
});
}
setupFullWidth(gui) {
const pinned = this.getPinnedForContainer(gui.containerType);
const compDetails = this.createFullWidthCompDetails(gui.element, pinned);
gui.rowComp.showFullWidth(compDetails);
}
getFullWidthCellRenderers() {
if (this.gos.get("embedFullWidthRows")) {
return this.allRowGuis.map((gui) => gui?.rowComp?.getFullWidthCellRenderer());
}
return [this.fullWidthGui?.rowComp?.getFullWidthCellRenderer()];
}
executeProcessRowPostCreateFunc() {
const func = this.gos.getCallback("processRowPostCreate");
if (!func || !this.areAllContainersReady()) {
return;
}
const params = {
// areAllContainersReady asserts that centerGui is not null
eRow: this.centerGui.element,
ePinnedLeftRow: this.leftGui ? this.leftGui.element : void 0,
ePinnedRightRow: this.rightGui ? this.rightGui.element : void 0,
node: this.rowNode,
rowIndex: this.rowNode.rowIndex,
addRenderedRowListener: this.addEventListener.bind(this)
};
func(params);
}
areAllContainersReady() {
const {
leftGui,
centerGui,
rightGui,
beans: { visibleCols }
} = this;
const isLeftReady = !!leftGui || !visibleCols.isPinningLeft();
const isCenterReady = !!centerGui;
const isRightReady = !!rightGui || !visibleCols.isPinningRight();
return isLeftReady && isCenterReady && isRightReady;
}
isNodeFullWidthCell() {
if (this.rowNode.detail) {
return true;
}
const isFullWidthCellFunc = this.beans.gos.getCallback("isFullWidthRow");
return isFullWidthCellFunc ? isFullWidthCellFunc({ rowNode: this.rowNode }) : false;
}
setRowType() {
const isStub = this.rowNode.stub && !this.gos.get("suppressServerSideFullWidthLoadingRow") && !this.gos.get("groupHideOpenParents");
const isFullWidthCell = this.isNodeFullWidthCell();
const isDetailCell = this.gos.get("masterDetail") && this.rowNode.detail;
const pivotMode = this.beans.colModel.isPivotMode();
const isGroupRow = !!this.rowNode.group && !this.rowNode.footer;
const isFullWidthGroup = isGroupRow && _isGroupUseEntireRow(this.gos, pivotMode);
if (isStub) {
this.rowType = "FullWidthLoading";
} else if (isDetailCell) {
this.rowType = "FullWidthDetail";
} else if (isFullWidthCell) {
this.rowType = "FullWidth";
} else if (isFullWidthGroup) {
this.rowType = "FullWidthGroup";
} else {
this.rowType = "Normal";
}
}
updateColumnLists(suppressAnimationFrame = false, useFlushSync = false) {
if (this.isFullWidth()) {
return;
}
const { animationFrameSvc } = this.beans;
const noAnimation = !animationFrameSvc || suppressAnimationFrame || this.gos.get("suppressAnimationFrame") || this.printLayout;
if (noAnimation) {
this.updateColumnListsImpl(useFlushSync);
return;
}
if (this.updateColumnListsPending) {
return;
}
animationFrameSvc.createTask(
() => {
if (!this.active) {
return;
}
this.updateColumnListsImpl(true);
},
this.rowNode.rowIndex,
"createTasksP1"
);
this.updateColumnListsPending = true;
}
/**
* Overridden by SpannedRowCtrl
*/
getNewCellCtrl(col) {
const isCellSpan = this.beans.rowSpanSvc?.isCellSpanning(col, this.rowNode);
if (isCellSpan) {
return void 0;
}
return new CellCtrl(col, this.rowNode, this.beans, this);
}
/**
* Overridden by SpannedRowCtrl, if span context changes cell needs rebuilt
*/
shouldRecreateCellCtrl(cell) {
return !!this.beans.rowSpanSvc?.isCellSpanning(cell.column, this.rowNode);
}
createCellCtrls(prev, cols, pinned = null) {
const res = {
list: [],
map: {}
};
const addCell = (colInstanceId, cellCtrl, index) => {
if (index != null) {
res.list.splice(index, 0, cellCtrl);
} else {
res.list.push(cellCtrl);
}
res.map[colInstanceId] = cellCtrl;
};
const colsFromPrev = [];
for (const col of cols) {
const colInstanceId = col.getInstanceId();
let cellCtrl = prev.map[colInstanceId];
if (cellCtrl && this.shouldRecreateCellCtrl(cellCtrl)) {
cellCtrl.destroy();
cellCtrl = void 0;
}
if (!cellCtrl) {
cellCtrl = this.getNewCellCtrl(col);
}
if (!cellCtrl) {
continue;
}
addCell(colInstanceId, cellCtrl);
}
for (const prevCellCtrl of prev.list) {
const colInstanceId = prevCellCtrl.column.getInstanceId();
const cellInResult = res.map[colInstanceId] != null;
if (cellInResult) {
continue;
}
const keepCell = !this.isCellEligibleToBeRemoved(prevCellCtrl, pinned);
if (keepCell) {
colsFromPrev.push([colInstanceId, prevCellCtrl]);
} else {
prevCellCtrl.destroy();
}
}
if (colsFromPrev.length) {
for (const [colInstanceId, cellCtrl] of colsFromPrev) {
const index = res.list.findIndex((ctrl) => ctrl.column.getLeft() > cellCtrl.column.getLeft());
const normalisedIndex = index === -1 ? void 0 : Math.max(index - 1, 0);
addCell(colInstanceId, cellCtrl, normalisedIndex);
}
}
return res;
}
updateColumnListsImpl(useFlushSync) {
this.updateColumnListsPending = false;
this.createAllCellCtrls();
this.setCellCtrls(useFlushSync);
}
setCellCtrls(useFlushSync) {
this.allRowGuis.forEach((item) => {
const cellControls = this.getCellCtrlsForContainer(item.containerType);
item.rowComp.setCellCtrls(cellControls, useFlushSync);
});
}
getCellCtrlsForContainer(containerType) {
switch (containerType) {
case "left":
return this.leftCellCtrls.list;
case "right":
return this.rightCellCtrls.list;
case "fullWidth":
return [];
case "center":
return this.centerCellCtrls.list;
}
}
createAllCellCtrls() {
const colViewport = this.beans.colViewport;
const presentedColsService = this.beans.visibleCols;
if (this.printLayout) {
this.centerCellCtrls = this.createCellCtrls(this.centerCellCtrls, presentedColsService.allCols);
this.leftCellCtrls = { list: [], map: {} };
this.rightCellCtrls = { list: [], map: {} };
} else {
const centerCols = colViewport.getColsWithinViewport(this.rowNode);
this.centerCellCtrls = this.createCellCtrls(this.centerCellCtrls, centerCols);
const leftCols = presentedColsService.getLeftColsForRow(this.rowNode);
this.leftCellCtrls = this.createCellCtrls(this.leftCellCtrls, leftCols, "left");
const rightCols = presentedColsService.getRightColsForRow(this.rowNode);
this.rightCellCtrls = this.createCellCtrls(this.rightCellCtrls, rightCols, "right");
}
}
isCellEligibleToBeRemoved(cellCtrl, nextContainerPinned) {
const REMOVE_CELL = true;
const KEEP_CELL = false;
const { column } = cellCtrl;
if (column.getPinned() != nextContainerPinned) {
return REMOVE_CELL;
}
const { editing, cellPosition } = cellCtrl;
const { focusSvc, visibleCols } = this.beans;
const focused = focusSvc.isCellFocused(cellPosition);
const mightWantToKeepCell = editing || focused;
if (mightWantToKeepCell) {
const displayedColumns = visibleCols.allCols;
const cellStillDisplayed = displayedColumns.indexOf(column) >= 0;
return cellStillDisplayed ? KEEP_CELL : REMOVE_CELL;
}
return REMOVE_CELL;
}
getDomOrder() {
const isEnsureDomOrder = this.gos.get("ensureDomOrder");
return isEnsureDomOrder || _isDomLayout(this.gos, "print");
}
listenOnDomOrder(gui) {
const listener = () => {
gui.rowComp.setDomOrder(this.getDomOrder());
};
gui.compBean.addManagedPropertyListeners(["domLayout", "ensureDomOrder"], listener);
}
setAnimateFlags(animateIn) {
if (this.rowNode.sticky || !animateIn) {
return;
}
const oldRowTopExists = _exists(this.rowNode.oldRowTop);
const { visibleCols } = this.beans;
const pinningLeft = visibleCols.isPinningLeft();
const pinningRight = visibleCols.isPinningRight();
if (oldRowTopExists) {
const { slideInAnimation } = this;
if (this.isFullWidth() && !this.gos.get("embedFullWidthRows")) {
slideInAnimation.fullWidth = true;
return;
}
slideInAnimation.center = true;
slideInAnimation.left = pinningLeft;
slideInAnimation.right = pinningRight;
} else {
const { fadeInAnimation } = this;
if (this.isFullWidth() && !this.gos.get("embedFullWidthRows")) {
fadeInAnimation.fullWidth = true;
return;
}
fadeInAnimation.center = true;
fadeInAnimation.left = pinningLeft;
fadeInAnimation.right = pinningRight;
}
}
isFullWidth() {
return this.rowType !== "Normal";
}
refreshFullWidth() {
const tryRefresh = (gui, pinned) => {
if (!gui) {
return true;
}
return gui.rowComp.refreshFullWidth(() => {
const compDetails = this.createFullWidthCompDetails(gui.element, pinned);
return compDetails.params;
});
};
const fullWidthSuccess = tryRefresh(this.fullWidthGui, null);
const centerSuccess = tryRefresh(this.centerGui, null);
const leftSuccess = tryRefresh(this.leftGui, "left");
const rightSuccess = tryRefresh(this.rightGui, "right");
const allFullWidthRowsRefreshed = fullWidthSuccess && centerSuccess && leftSuccess && rightSuccess;
return allFullWidthRowsRefreshed;
}
addListeners() {
this.addManagedListeners(this.rowNode, {
heightChanged: () => this.onRowHeightChanged(),
rowSelected: () => this.onRowSelected(),
rowIndexChanged: this.onRowIndexChanged.bind(this),
topChanged: this.onTopChanged.bind(this),
...this.beans.expansionSvc?.getRowExpandedListeners(this) ?? {}
});
if (this.rowNode.detail) {
this.addManagedListeners(this.rowNode.parent, { dataChanged: this.onRowNodeDataChanged.bind(this) });
}
this.addManagedListeners(this.rowNode, {
dataChanged: this.onRowNodeDataChanged.bind(this),
cellChanged: this.postProcessCss.bind(this),
rowHighlightChanged: this.onRowNodeHighlightChanged.bind(this),
draggingChanged: this.postProcessRowDragging.bind(this),
uiLevelChanged: this.onUiLevelChanged.bind(this)
});
this.addManagedListeners(this.beans.eventSvc, {
paginationPixelOffsetChanged: this.onPaginationPixelOffsetChanged.bind(this),
heightScaleChanged: this.onTopChanged.bind(this),
displayedColumnsChanged: this.onDisplayedColumnsChanged.bind(this),
virtualColumnsChanged: this.onVirtualColumnsChanged.bind(this),
cellFocused: this.onCellFocusChanged.bind(this),
cellFocusCleared: this.onCellFocusChanged.bind(this),
paginationChanged: this.onPaginationChanged.bind(this),
modelUpdated: this.refreshFirstAndLastRowStyles.bind(this),
columnMoved: () => this.updateColumnLists()
});
if (this.beans.rowSpanSvc) {
this.addManagedListeners(this.beans.rowSpanSvc, {
spannedCellsUpdated: ({ pinned }) => {
if (pinned && !this.rowNode.rowPinned) {
return;
}
this.updateColumnLists();
}
});
}
this.addDestroyFunc(() => {
this.rowDragComps = this.destroyBeans(this.rowDragComps, this.beans.context);
this.tooltipFeature = this.destroyBean(this.tooltipFeature, this.beans.context);
});
this.addManagedPropertyListeners(
["rowStyle", "getRowStyle", "rowClass", "getRowClass", "rowClassRules"],
this.postProcessCss.bind(this)
);
this.addManagedPropertyListener("rowDragEntireRow", () => {
const useRowDragEntireRow = this.gos.get("rowDragEntireRow");
if (useRowDragEntireRow) {
this.allRowGuis.forEach((gui) => {
this.addRowDraggerToRow(gui);
});
return;
}
this.rowDragComps = this.destroyBeans(this.rowDragComps, this.beans.context);
});
this.addListenersForCellComps();
}
addListenersForCellComps() {
this.addManagedListeners(this.rowNode, {
rowIndexChanged: () => {
this.getAllCellCtrls().forEach((cellCtrl) => cellCtrl.onRowIndexChanged());
},
cellChanged: (event) => {
this.getAllCellCtrls().forEach((cellCtrl) => cellCtrl.onCellChanged(event));
}
});
}
onRowNodeDataChanged(event) {
const fullWidthChanged = this.isFullWidth() !== !!this.isNodeFullWidthCell();
if (fullWidthChanged) {
this.beans.rowRenderer.redrawRow(this.rowNode);
return;
}
if (this.isFullWidth()) {
const refresh = this.refreshFullWidth();
if (!refresh) {
this.beans.rowRenderer.redrawRow(this.rowNode);
}
return;
}
this.getAllCellCtrls().forEach(
(cellCtrl) => cellCtrl.refreshCell({
suppressFlash: !event.update,
newData: !event.update
})
);
this.allRowGuis.forEach((gui) => {
this.setRowCompRowId(gui.rowComp);
this.updateRowBusinessKey();
this.setRowCompRowBusinessKey(gui.rowComp);
});
this.onRowSelected();
this.postProcessCss();
}
postProcessCss() {
this.setStylesFromGridOptions(true);
this.postProcessClassesFromGridOptions();
this.postProcessRowClassRules();
this.postProcessRowDragging();
}
onRowNodeHighlightChanged() {
const highlighted = this.rowNode.highlighted;
this.allRowGuis.forEach((gui) => {
const aboveOn = highlighted === "Above";
const belowOn = highlighted === "Below";
gui.rowComp.addOrRemoveCssClass("ag-row-highlight-above", aboveOn);
gui.rowComp.addOrRemoveCssClass("ag-row-highlight-below", belowOn);
});
}
postProcessRowDragging() {
const dragging = this.rowNode.dragging;
this.allRowGuis.forEach((gui) => gui.rowComp.addOrRemoveCssClass("ag-row-dragging", dragging));
}
verifyCells() {
this.onDisplayedColumnsChanged();
}
onDisplayedColumnsChanged() {
this.updateColumnLists(true);
this.beans.rowAutoHeight?.requestCheckAutoHeight();
}
onVirtualColumnsChanged() {
this.updateColumnLists(false, true);
}
getRowPosition() {
return {
rowPinned: _makeNull(this.rowNode.rowPinned),
rowIndex: this.rowNode.rowIndex
};
}
onKeyboardNavigate(keyboardEvent) {
const groupInfo = this.findFullWidthInfoForEvent(keyboardEvent);
if (!groupInfo) {
return;
}
const { rowGui, column } = groupInfo;
const currentFullWidthContainer = rowGui.element;
const isFullWidthContainerFocused = currentFullWidthContainer === keyboardEvent.target;
if (!isFullWidthContainerFocused) {
return;
}
const node = this.rowNode;
const { focusSvc, navigation } = this.beans;
const lastFocusedCell = focusSvc.getFocusedCell();
const cellPosition = {
rowIndex: node.rowIndex,
rowPinned: node.rowPinned,
column: lastFocusedCell?.column ?? column
};
navigation?.navigateToNextCell(keyboardEvent, keyboardEvent.key, cellPosition, true);
keyboardEvent.preventDefault();
}
onTabKeyDown(keyboardEvent) {
if (keyboardEvent.defaultPrevented || _isStopPropagationForAgGrid(keyboardEvent)) {
return;
}
const currentFullWidthComp = this.allRowGuis.find(
(c) => c.element.contains(keyboardEvent.target)
);
const currentFullWidthContainer = currentFullWidthComp ? currentFullWidthComp.element : null;
const isFullWidthContainerFocused = currentFullWidthContainer === keyboardEvent.target;
const activeEl = _getActiveDomElement(this.beans);
let isDetailGridCellFocused = false;
if (currentFullWidthContainer && activeEl) {
isDetailGridCellFocused = currentFullWidthContainer.contains(activeEl) && activeEl.classList.contains("ag-cell");
}
let nextEl = null;
if (!isFullWidthContainerFocused && !isDetailGridCellFocused) {
nextEl = _findNextFocusableElement(this.beans, currentFullWidthContainer, false, keyboardEvent.shiftKey);
}
if (this.isFullWidth() && isFullWidthContainerFocused || !nextEl) {
this.beans.navigation?.onTabKeyDown(this, keyboardEvent);
}
}
getFullWidthElement() {
if (this.fullWidthGui) {
return this.fullWidthGui.element;
}
return null;
}
getRowYPosition() {
const displayedEl = this.allRowGuis.find((el) => _isVisible(el.element))?.element;
if (displayedEl) {
return displayedEl.getBoundingClientRect().top;
}
return 0;
}
onSuppressCellFocusChanged(suppressCellFocus) {
const tabIndex = this.isFullWidth() && suppressCellFocus ? void 0 : -1;
this.allRowGuis.forEach((gui) => {
_addOrRemoveAttribute(gui.element, "tabindex", tabIndex);
});
}
onFullWidthRowFocused(event) {
const node = this.rowNode;
const isFocused = !event ? false : this.isFullWidth() && event.rowIndex === node.rowIndex && event.rowPinned == node.rowPinned;
const element = this.fullWidthGui ? this.fullWidthGui.element : this.centerGui?.element;
if (!element) {
return;
}
element.classList.toggle("ag-full-width-focus", isFocused);
if (isFocused && event?.forceBrowserFocus) {
element.focus({ preventScroll: true });
}
}
recreateCell(cellCtrl) {
this.centerCellCtrls = this.removeCellCtrl(this.centerCellCtrls, cellCtrl);
this.leftCellCtrls = this.removeCellCtrl(this.leftCellCtrls, cellCtrl);
this.rightCellCtrls = this.removeCellCtrl(this.rightCellCtrls, cellCtrl);
cellCtrl.destroy();
this.updateColumnLists();
}
removeCellCtrl(prev, cellCtrlToRemove) {
const res = {
list: [],
map: {}
};
prev.list.forEach((cellCtrl) => {
if (cellCtrl === cellCtrlToRemove) {
return;
}
res.list.push(cellCtrl);
res.map[cellCtrl.column.getInstanceId()] = cellCtrl;
});
return res;
}
onMouseEvent(eventName, mouseEvent) {
switch (eventName) {
case "dblclick":
this.onRowDblClick(mouseEvent);
break;
case "click":
this.onRowClick(mouseEvent);
break;
case "touchstart":
case "mousedown":
this.onRowMouseDown(mouseEvent);
break;
}
}
createRowEvent(type, domEvent) {
const { rowNode } = this;
return _addGridCommonParams(this.gos, {
type,
node: rowNode,
data: rowNode.data,
rowIndex: rowNode.rowIndex,
rowPinned: rowNode.rowPinned,
event: domEvent
});
}
createRowEventWithSource(type, domEvent) {
const event = this.createRowEvent(type, domEvent);
event.source = this;
return event;
}
onRowDblClick(mouseEvent) {
if (_isStopPropagationForAgGrid(mouseEvent)) {
return;
}
this.beans.eventSvc.dispatchEvent(this.createRowEventWithSource("rowDoubleClicked", mouseEvent));
}
findFullWidthInfoForEvent(event) {
if (!event) {
return;
}
const rowGui = this.findFullWidthRowGui(event.target);
const column = this.getColumnForFullWidth(rowGui);
if (!rowGui || !column) {
return;
}
return { rowGui, column };
}
findFullWidthRowGui(target) {
return this.allRowGuis.find((c) => c.element.contains(target));
}
getColumnForFullWidth(fullWidthRowGui) {
const { visibleCols } = this.beans;
switch (fullWidthRowGui?.containerType) {
case "center":
return visibleCols.centerCols[0];
case "left":
return visibleCols.leftCols[0];
case "right":
return visibleCols.rightCols[0];
default:
return visibleCols.allCols[0];
}
}
onRowMouseDown(mouseEvent) {
this.lastMouseDownOnDragger = _isElementChildOfClass(mouseEvent.target, "ag-row-drag", 3);
if (!this.isFullWidth()) {
return;
}
const node = this.rowNode;
const { rangeSvc, focusSvc } = this.beans;
rangeSvc?.removeAllCellRanges();
const groupInfo = this.findFullWidthInfoForEvent(mouseEvent);
if (!groupInfo) {
return;
}
const { rowGui, column } = groupInfo;
const element = rowGui.element;
const target = mouseEvent.target;
let forceBrowserFocus = mouseEvent.defaultPrevented || _isBrowserSafari();
if (element && element.contains(target) && _isFocusableFormField(target)) {
forceBrowserFocus = false;
}
focusSvc.setFocusedCell({
rowIndex: node.rowIndex,
column,
rowPinned: node.rowPinned,
forceBrowserFocus
});
}
onRowClick(mouseEvent) {
const stop = _isStopPropagationForAgGrid(mouseEvent) || this.lastMouseDownOnDragger;
if (stop) {
return;
}
const { eventSvc, selectionSvc } = this.beans;
eventSvc.dispatchEvent(this.createRowEventWithSource("rowClicked", mouseEvent));
selectionSvc?.handleSelectionEvent(mouseEvent, this.rowNode, "rowClicked");
}
setupDetailRowAutoHeight(eDetailGui) {
if (this.rowType !== "FullWidthDetail") {
return;
}
this.beans.masterDetailSvc?.setupDetailRowAutoHeight(this, eDetailGui);
}
createFullWidthCompDetails(eRow, pinned) {
const { gos, rowNode } = this;
const params = _addGridCommonParams(gos, {
fullWidth: true,
data: rowNode.data,
node: rowNode,
value: rowNode.key,
valueFormatted: rowNode.key,
// these need to be taken out, as part of 'afterAttached' now
eGridCell: eRow,
eParentOfValue: eRow,
pinned,
addRenderedRowListener: this.addEventListener.bind(this),
// This is not on the type of ICellRendererParams
registerRowDragger: (rowDraggerElement, dragStartPixels, value, suppressVisibilityChange) => this.addFullWidthRowDragging(rowDraggerElement, dragStartPixels, value, suppressVisibilityChange),
setTooltip: (value, shouldDisplayTooltip) => {
gos.assertModuleRegistered("Tooltip", 3);
this.refreshRowTooltip(value, shouldDisplayTooltip);
}
});
const compFactory = this.beans.userCompFactory;
switch (this.rowType) {
case "FullWidthDetail":
return _getFullWidthDetailCellRendererDetails(compFactory, params);
case "FullWidthGroup":
return _getFullWidthGroupCellRendererDetails(compFactory, params);
case "FullWidthLoading":
return _getFullWidthLoadingCellRendererDetails(compFactory, params);
default:
return _getFullWidthCellRendererDetails(compFactory, params);
}
}
refreshRowTooltip(value, shouldDisplayTooltip) {
if (!this.fullWidthGui) {
return;
}
this.tooltipFeature = this.beans.tooltipSvc?.refreshRowTooltip(
this.tooltipFeature,
this,
value,
shouldDisplayTooltip
);
}
addFullWidthRowDragging(rowDraggerElement, dragStartPixels, value = "", suppressVisibilityChange) {
const { rowDragSvc, context } = this.beans;
if (!rowDragSvc || !this.isFullWidth()) {
return;
}
const rowDragComp = rowDragSvc.createRowDragComp(
() => value,
this.rowNode,
void 0,
rowDraggerElement,
dragStartPixels,
suppressVisibilityChange
);
this.createBean(rowDragComp, context);
this.addDestroyFunc(() => {
this.destroyBean(rowDragComp, context);
});
}
onUiLevelChanged() {
const newLevel = calculateRowLevel(this.rowNode);
if (this.rowLevel != newLevel) {
const classToAdd = "ag-row-level-" + newLevel;
const classToRemove = "ag-row-level-" + this.rowLevel;
this.allRowGuis.forEach((gui) => {
gui.rowComp.addOrRemoveCssClass(classToAdd, true);
gui.rowComp.addOrRemoveCssClass(classToRemove, false);
});
}
this.rowLevel = newLevel;
}
isFirstRowOnPage() {
return this.rowNode.rowIndex === this.beans.pageBounds.getFirstRow();
}
isLastRowOnPage() {
return this.rowNode.rowIndex === this.beans.pageBounds.getLastRow();
}
refreshFirstAndLastRowStyles() {
const newFirst = this.isFirstRowOnPage();
const newLast = this.isLastRowOnPage();
if (this.firstRowOnPage !== newFirst) {
this.firstRowOnPage = newFirst;
this.allRowGuis.forEach((gui) => gui.rowComp.addOrRemoveCssClass("ag-row-first", newFirst));
}
if (this.lastRowOnPage !== newLast) {
this.lastRowOnPage = newLast;
this.allRowGuis.forEach((gui) => gui.rowComp.addOrRemoveCssClass("ag-row-last", newLast));
}
}
getAllCellCtrls() {
if (this.leftCellCtrls.list.length === 0 && this.rightCellCtrls.list.length === 0) {
return this.centerCellCtrls.list;
}
const res = [...this.centerCellCtrls.list, ...this.leftCellCtrls.list, ...this.rightCellCtrls.list];
return res;
}
postProcessClassesFromGridOptions() {
const cssClasses = [];
this.beans.rowStyleSvc?.processClassesFromGridOptions(cssClasses, this.rowNode);
if (!cssClasses.length) {
return;
}
cssClasses.forEach((classStr) => {
this.allRowGuis.forEach((c) => c.rowComp.addOrRemoveCssClass(classStr, true));
});
}
postProcessRowClassRules() {
this.beans.rowStyleSvc?.processRowClassRules(
this.rowNode,
(className) => {
this.allRowGuis.forEach((gui) => gui.rowComp.addOrRemoveCssClass(className, true));
},
(className) => {
this.allRowGuis.forEach((gui) => gui.rowComp.addOrRemoveCssClass(className, false));
}
);
}
setStylesFromGridOptions(updateStyles, gui) {
if (updateStyles) {
this.rowStyles = this.processStylesFromGridOptions();
}
this.forEachGui(gui, (gui2) => gui2.rowComp.setUserStyles(this.rowStyles));
}
getPinnedForContainer(rowContainerType) {
if (rowContainerType === "left" || rowContainerType === "right") {
return rowContainerType;
}
return null;
}
getInitialRowClasses(rowContainerType) {
const pinned = this.getPinnedForContainer(rowContainerType);
const fullWidthRow = this.isFullWidth();
const { rowNode, beans } = this;
const classes = [];
classes.push("ag-row");
classes.push(this.rowFocused ? "ag-row-focus" : "ag-row-no-focus");
if (this.fadeInAnimation[rowContainerType]) {
classes.push("ag-opacity-zero");
}
classes.push(rowNode.rowIndex % 2 === 0 ? "ag-row-even" : "ag-row-odd");
if (rowNode.isRowPinned()) {
classes.push("ag-row-pinned");
}
if (rowNode.isSelected()) {
classes.push("ag-row-selected");
}
if (rowNode.footer) {
classes.push("ag-row-footer");
}
classes.push("ag-row-level-" + this.rowLevel);
if (rowNode.stub) {
classes.push("ag-row-loading");
}
if (fullWidthRow) {
classes.push("ag-full-width-row");
}
beans.expansionSvc?.addExpandedCss(classes, rowNode);
if (rowNode.dragging) {
classes.push("ag-row-dragging");
}
const { rowStyleSvc } = beans;
if (rowStyleSvc) {
rowStyleSvc.processClassesFromGridOptions(classes, rowNode);
rowStyleSvc.preProcessRowClassRules(classes, rowNode);
}
classes.push(this.printLayout ? "ag-row-position-relative" : "ag-row-position-absolute");
if (this.isFirstRowOnPage()) {
classes.push("ag-row-first");
}
if (this.isLastRowOnPage()) {
classes.push("ag-row-last");
}
if (fullWidthRow) {
if (pinned === "left") {
classes.push("ag-cell-last-left-pinned");
}
if (pinned === "right") {
classes.push("ag-cell-first-right-pinned");
}
}
return classes;
}
processStylesFromGridOptions() {
return this.beans.rowStyleSvc?.processStylesFromGridOptions(this.rowNode) ?? this.emptyStyle;
}
onRowSelected(gui) {
this.beans.selectionSvc?.onRowCtrlSelected(
this,
(gui2) => {
if (gui2 === this.centerGui || gui2 === this.fullWidthGui) {
this.announceDescription();
}
},
gui
);
}
announceDescription() {
this.beans.selectionSvc?.announceAriaRowSelection(this.rowNode);
}
addHoverFunctionality(eGui) {
if (!this.active) {
return;
}
const { element, compBean } = eGui;
const { rowNode, beans, gos } = this;
compBean.addManagedListeners(element, {
mouseenter: () => rowNode.dispatchRowEvent("mouseEnter"),
mouseleave: () => rowNode.dispatchRowEvent("mouseLeave")
});
compBean.addManagedListeners(rowNode, {
mouseEnter: () => {
if (!beans.dragSvc?.dragging && !gos.get("suppressRowHoverHighlight")) {
element.classList.add("ag-row-hover");
rowNode.setHovered(true);
}
},
mouseLeave: () => {
this.resetHoveredStatus(element);
}
});
}
resetHoveredStatus(el) {
const elements = el ? [el] : this.allRowGuis.map((gui) => gui.element);
for (const element of elements) {
element.classList.remove("ag-row-hover");
}
this.rowNode.setHovered(false);
}
// for animation, we don't want to animate entry or exit to a very far away pixel,
// otherwise the row would move so fast, it would appear to disappear. so this method
// moves the row closer to the viewport if it is far away, so the row slide in / out
// at a speed the user can see.
roundRowTopToBounds(rowTop) {
const range = this.beans.ctrlsSvc.getScrollFeature().getApproximateVScollPosition();
const minPixel = this.applyPaginationOffset(range.top, true) - 100;
const maxPixel = this.applyPaginationOffset(range.bottom, true) + 100;
return Math.min(Math.max(minPixel, rowTop), maxPixel);
}
forEachGui(gui, callback) {
if (gui) {
callback(gui);
} else {
this.allRowGuis.forEach(callback);
}
}
onRowHeightChanged(gui) {
if (this.rowNode.rowHeight == null) {
return;
}
const rowHeight = this.rowNode.rowHeight;
const defaultRowHeight = this.beans.environment.getDefaultRowHeight();
const isHeightFromFunc = _isGetRowHeightFunction(this.gos);
const heightFromFunc = isHeightFromFunc ? _getRowHeightForNode(this.beans, this.rowNode).height : void 0;
const lineHeight = heightFromFunc ? `${Math.min(defaultRowHeight, heightFromFunc) - 2}px` : void 0;
this.forEachGui(gui, (gui2) => {
gui2.element.style.height = `${rowHeight}px`;
if (lineHeight) {
gui2.element.style.setProperty("--ag-line-height", lineHeight);
}
});
}
// note - this is NOT called by context, as we don't wire / unwire the CellComp for performance reasons.
destroyFirstPass(suppressAnimation = false) {
this.active = false;
const { rowNode } = this;
if (!suppressAnimation && _isAnimateRows(this.gos) && !rowNode.sticky) {
const rowStillVisibleJustNotInViewport = rowNode.rowTop != null;
if (rowStillVisibleJustNotInViewport) {
const rowTop = this.roundRowTopToBounds(rowNode.rowTop);
this.setRowTop(rowTop);
} else {
this.allRowGuis.forEach((gui) => gui.rowComp.addOrRemoveCssClass("ag-opacity-zero", true));
}
}
rowNode.setHovered(false);
const event = this.createRowEvent("virtualRowRemoved");
this.dispatchLocalEvent(event);
this.beans.eventSvc.dispatchEvent(event);
super.destroy();
}
destroySecondPass() {
this.allRowGuis.length = 0;
this.beans.editSvc?.stopRowEditing(this);
const destroyCellCtrls = (ctrls) => {
ctrls.list.forEach((c) => c.destroy());
return { list: [], map: {} };
};
this.centerCellCtrls = destroyCellCtrls(this.centerCellCtrls);
this.leftCellCtrls = destroyCellCtrls(this.leftCellCtrls);
this.rightCellCtrls = destroyCellCtrls(this.rightCellCtrls);
}
setFocusedClasses(gui) {
this.forEachGui(gui, (gui2) => {
gui2.rowComp.addOrRemoveCssClass("ag-row-focus", this.rowFocused);
gui2.rowComp.addOrRemoveCssClass("ag-row-no-focus", !this.rowFocused);
});
}
onCellFocusChanged() {
const { focusSvc, editSvc } = this.beans;
const rowFocused = focusSvc.isRowFocused(this.rowNode.rowIndex, this.rowNode.rowPinned);
if (rowFocused !== this.rowFocused) {
this.rowFocused = rowFocused;
this.setFocusedClasses();
}
if (!rowFocused && this.editing) {
editSvc?.stopRowEditing(this, false);
}
}
onPaginationChanged() {
const currentPage = this.beans.pagination?.getCurrentPage() ?? 0;
if (this.paginationPage !== currentPage) {
this.paginationPage = currentPage;
this.onTopChanged();
}
this.refreshFirstAndLastRowStyles();
}
onTopChanged() {
this.setRowTop(this.rowNode.rowTop);
}
onPaginationPixelOffsetChanged() {
this.onTopChanged();
}
// applies pagination offset, eg if on second page, and page height is 500px, then removes
// 500px from the top position, so a row with rowTop 600px is displayed at location 100px.
// reverse will take the offset away rather than add.
applyPaginationOffset(topPx, reverse = false) {
if (this.rowNode.isRowPinned() || this.rowNode.sticky) {
return topPx;
}
const pixelOffset = this.beans.pageBounds.getPixelOffset();
const multiplier = reverse ? 1 : -1;
return topPx + pixelOffset * multiplier;
}
setRowTop(pixels) {
if (this.printLayout) {
return;
}
if (_exists(pixels)) {
const afterPaginationPixels = this.applyPaginationOffset(pixels);
const skipScaling = this.rowNode.isRowPinned() || this.rowNode.sticky;
const afterScalingPixels = skipScaling ? afterPaginationPixels : this.beans.rowContainerHeight.getRealPixelPosition(afterPaginationPixels);
const topPx = `${afterScalingPixels}px`;
this.setRowTopStyle(topPx);
}
}
// the top needs to be set into the DOM element when the element is created, not updated afterwards.
// otherwise the transition would not work, as it would be transitioning from zero (the unset value).
// for example, suppose a row that is outside the viewport, then user does a filter to remove other rows
// and this row now appears in the viewport, and the row moves up (ie it was under the viewport and not rendered,
// but now is in the viewport) then a new RowComp is created, however it should have it's position initialised
// to below the viewport, so the row will appear to animate up. if we didn't set the initial position at creation
// time, the row would animate down (ie from position zero).
getInitialRowTop(rowContainerType) {
return this.suppressRowTransform ? this.getInitialRowTopShared(rowContainerType) : void 0;
}
getInitialTransform(rowContainerType) {
return this.suppressRowTransform ? void 0 : `translateY(${this.getInitialRowTopShared(rowContainerType)})`;
}
getInitialRowTopShared(rowContainerType) {
if (this.printLayout) {
return "";
}
const rowNode = this.rowNode;
let rowTop;
if (rowNode.sticky) {
rowTop = rowNode.stickyRowTop;
} else {
const pixels = this.slideInAnimation[rowContainerType] ? this.roundRowTopToBounds(rowNode.oldRowTop) : rowNode.rowTop;
const afterPaginationPixels = this.applyPaginationOffset(pixels);
rowTop = rowNode.isRowPinned() ? afterPaginationPixels : this.beans.rowContainerHeight.getRealPixelPosition(afterPaginationPixels);
}
return rowTop + "px";
}
setRowTopStyle(topPx) {
this.allRowGuis.forEach(
(gui) => this.suppressRowTransform ? gui.rowComp.setTop(topPx) : gui.rowComp.setTransform(`translateY(${topPx})`)
);
}
getCellCtrl(column, skipColSpanSearch = false) {
let res = null;
this.getAllCellCtrls().forEach((cellCtrl) => {
if (cellCtrl.column == column) {
res = cellCtrl;
}
});
if (res != null || skipColSpanSearch) {
return res;
}
this.getAllCellCtrls().forEach((cellCtrl) => {
if (cellCtrl.getColSpanningList().indexOf(column) >= 0) {
res = cellCtrl;
}
});
return res;
}
onRowIndexChanged() {
if (this.rowNode.rowIndex != null) {
this.onCellFocusChanged();
this.updateRowIndexes();
this.postProcessCss();
}
}
updateRowIndexes(gui) {
const rowIndexStr = this.rowNode.getRowIndexString();
if (rowIndexStr === null) {
return;
}
const headerRowCount = (this.beans.ctrlsSvc.getHeaderRowContainerCtrl()?.getRowCount() ?? 0) + (this.beans.filterManager?.getHeaderRowCount() ?? 0);
const rowIsEven = this.rowNode.rowIndex % 2 === 0;
const ariaRowIndex = headerRowCount + this.rowNode.rowIndex + 1;
this.forEachGui(gui, (c) => {
c.rowComp.setRowIndex(rowIndexStr);
c.rowComp.addOrRemoveCssClass("ag-row-even", rowIsEven);
c.rowComp.addOrRemoveCssClass("ag-row-odd", !rowIsEven);
_setAriaRowIndex(c.element, ariaRowIndex);
});
}
};
// packages/ag-grid-community/src/utils/keyboard.ts
function _isEventFromPrintableCharacter(event) {
if (event.altKey || event.ctrlKey || event.metaKey) {
return false;
}
const printableCharacter = event.key?.length === 1;
return printableCharacter;
}
function _isUserSuppressingKeyboardEvent(gos, keyboardEvent, rowNode, column, editing) {
const colDefFunc = column ? column.getColDef().suppressKeyboardEvent : void 0;
if (!colDefFunc) {
return false;
}
const params = _addGridCommonParams(gos, {
event: keyboardEvent,
editing,
column,
node: rowNode,
data: rowNode.data,
colDef: column.getColDef()
});
if (colDefFunc) {
const colDefFuncResult = colDefFunc(params);
if (colDefFuncResult) {
return true;
}
}
return false;
}
// packages/ag-grid-community/src/utils/selection.ts
function _selectAllCells(beans) {
const { pinnedRowModel, rowModel } = beans;
const [isEmptyPinnedTop, isEmptyPinnedBottom] = [
pinnedRowModel?.isEmpty("top") ?? true,
pinnedRowModel?.isEmpty("bottom") ?? true
];
const floatingStart = isEmptyPinnedTop ? null : "top";
let floatingEnd;
let rowEnd;
if (isEmptyPinnedBottom) {
floatingEnd = null;
rowEnd = rowModel.getRowCount() - 1;
} else {
floatingEnd = "bottom";
rowEnd = pinnedRowModel?.getPinnedBottomRowCount() ?? 0 - 1;
}
const { visibleCols, rangeSvc } = beans;
const allDisplayedColumns = visibleCols.allCols;
if (!rangeSvc || !allDisplayedColumns?.length) {
return;
}
rangeSvc.setCellRange({
rowStartIndex: 0,
rowStartPinned: floatingStart,
rowEndIndex: rowEnd,
rowEndPinned: floatingEnd
});
}
// packages/ag-grid-community/src/gridBodyComp/rowContainer/rowContainerEventsFeature.ts
var A_KEYCODE = 65;
var C_KEYCODE = 67;
var V_KEYCODE = 86;
var D_KEYCODE = 68;
var Z_KEYCODE = 90;
var Y_KEYCODE = 89;
function _normaliseQwertyAzerty(keyboardEvent) {
const { keyCode } = keyboardEvent;
let code;
switch (keyCode) {
case A_KEYCODE:
code = KeyCode.A;
break;
case C_KEYCODE:
code = KeyCode.C;
break;
case V_KEYCODE:
code = KeyCode.V;
break;
case D_KEYCODE:
code = KeyCode.D;
break;
case Z_KEYCODE:
code = KeyCode.Z;
break;
case Y_KEYCODE:
code = KeyCode.Y;
break;
default:
code = keyboardEvent.code;
}
return code;
}
var RowContainerEventsFeature = class extends 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 = _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 (!_isEventFromThisGrid(this.gos, mouseEvent) || _isStopPropagationForAgGrid(mouseEvent)) {
return;
}
const { cellCtrl, rowCtrl } = this.getControlsForEventTarget(mouseEvent.target);
if (eventName === "contextmenu") {
if (cellCtrl?.column) {
cellCtrl.dispatchCellContextMenuEvent(mouseEvent);
}
this.beans.contextMenuSvc?.handleContextMenuMouseEvent(mouseEvent, void 0, rowCtrl, cellCtrl);
} else {
if (cellCtrl) {
cellCtrl.onMouseEvent(eventName, mouseEvent);
}
if (rowCtrl) {
rowCtrl.onMouseEvent(eventName, mouseEvent);
}
}
}
getControlsForEventTarget(target) {
const { gos } = this;
return {
cellCtrl: _getCellCtrlForEventTarget(gos, target),
rowCtrl: _getCtrlForEventTarget(gos, target, 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 = !_isUserSuppressingKeyboardEvent(
this.gos,
keyboardEvent,
rowNode,
column,
editing
);
if (gridProcessingAllowed) {
if (eventName === "keydown") {
const wasScrollKey = !editing && this.beans.navigation?.handlePageScrollingKey(keyboardEvent);
if (!wasScrollKey) {
cellCtrl.onKeyDown(keyboardEvent);
}
this.doGridOperations(keyboardEvent, cellCtrl.editing);
if (_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 = !_isUserSuppressingKeyboardEvent(this.gos, keyboardEvent, rowNode, column, false);
if (gridProcessingAllowed) {
const key = keyboardEvent.key;
if (eventName === "keydown") {
switch (key) {
case KeyCode.PAGE_HOME:
case KeyCode.PAGE_END:
case KeyCode.PAGE_UP:
case KeyCode.PAGE_DOWN:
navigation?.handlePageScrollingKey(keyboardEvent, true);
break;
case KeyCode.UP:
case KeyCode.DOWN:
rowComp.onKeyboardNavigate(keyboardEvent);
break;
case KeyCode.TAB:
rowComp.onTabKeyDown(keyboardEvent);
break;
default:
}
}
}
if (eventName === "keydown") {
this.eventSvc.dispatchEvent(rowComp.createRowEvent("cellKeyDown", keyboardEvent));
}
}
doGridOperations(keyboardEvent, editing) {
if (!keyboardEvent.ctrlKey && !keyboardEvent.metaKey) {
return;
}
if (editing) {
return;
}
if (!_isEventFromThisGrid(this.gos, keyboardEvent)) {
return;
}
const keyCode = _normaliseQwertyAzerty(keyboardEvent);
const { clipboardSvc, undoRedo } = this.beans;
if (keyCode === KeyCode.A) {
return this.onCtrlAndA(keyboardEvent);
}
if (keyCode === KeyCode.C) {
return this.onCtrlAndC(clipboardSvc, keyboardEvent);
}
if (keyCode === KeyCode.D) {
return this.onCtrlAndD(clipboardSvc, keyboardEvent);
}
if (keyCode === KeyCode.V) {
return this.onCtrlAndV(clipboardSvc, keyboardEvent);
}
if (keyCode === KeyCode.X) {
return this.onCtrlAndX(clipboardSvc, keyboardEvent);
}
if (keyCode === KeyCode.Y) {
return this.onCtrlAndY(undoRedo);
}
if (keyCode === KeyCode.Z) {
return this.onCtrlAndZ(undoRedo, keyboardEvent);
}
}
onCtrlAndA(event) {
const {
beans: { rowModel, rangeSvc, selectionSvc },
gos
} = this;
if (rangeSvc && _isCellSelectionEnabled(gos) && rowModel.isRowsToRender()) {
_selectAllCells(this.beans);
} else if (selectionSvc) {
selectionSvc?.selectAllRowNodes({ source: "keyboardSelectAll", selectAll: _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(void 0, "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");
}
};
// packages/ag-grid-community/src/gridBodyComp/rowContainer/setHeightFeature.ts
var SetHeightFeature = class extends 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;
}
}
};
// packages/ag-grid-community/src/gridBodyComp/rowContainer/rowContainerCtrl.ts
var getTopRowCtrls = (r) => r.topRowCtrls;
var getStickyTopRowCtrls = (r) => r.getStickyTopRowCtrls();
var getStickyBottomRowCtrls = (r) => r.getStickyBottomRowCtrls();
var getBottomRowCtrls = (r) => r.bottomRowCtrls;
var getCentreRowCtrls = (r) => r.allRowCtrls;
var getSpannedTopRowCtrls = (r) => r.getCtrls("top");
var getSpannedCenterRowCtrls = (r) => r.getCtrls("center");
var getSpannedBottomRowCtrls = (r) => r.getCtrls("bottom");
var 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`;
}
function _getRowContainerClass(name) {
const options = _getRowContainerOptions(name);
return options.container ?? `ag-${options.name}-container`;
}
function _getRowSpanContainerClass(name) {
const options = _getRowContainerOptions(name);
return `ag-${options.name}-spanned-cells-container`;
}
function _getRowContainerOptions(name) {
return ContainerCssClasses[name];
}
var allTopNoFW = ["topCenter", "topLeft", "topRight"];
var allBottomNoFW = ["bottomCenter", "bottomLeft", "bottomRight"];
var allMiddleNoFW = ["center", "left", "right"];
var allMiddle = ["center", "left", "right", "fullWidth"];
var allCenter = ["stickyTopCenter", "stickyBottomCenter", "center", "topCenter", "bottomCenter"];
var allLeft = ["left", "bottomLeft", "topLeft", "stickyTopLeft", "stickyBottomLeft"];
var allRight = ["right", "bottomRight", "topRight", "stickyTopRight", "stickyBottomRight"];
var allStickyTopNoFW = ["stickyTopCenter", "stickyTopLeft", "stickyTopRight"];
var allStickyBottomNoFW = ["stickyBottomCenter", "stickyBottomLeft", "stickyBottomRight"];
var allStickyContainers = [
...allStickyTopNoFW,
"stickyTopFullWidth",
...allStickyBottomNoFW,
"stickyBottomFullWidth"
];
var allNoFW = [
...allTopNoFW,
...allBottomNoFW,
...allMiddleNoFW,
...allStickyTopNoFW,
...allStickyBottomNoFW
];
var RowContainerCtrl = class extends 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(this));
this.addManagedEventListeners({
stickyTopOffsetChanged: this.onStickyTopOffsetChanged.bind(this)
});
});
}
onStickyTopOffsetChanged(event) {
this.comp.setOffsetTop(`${event.offset}px`);
}
registerWithCtrlsService() {
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(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(this.eContainer, this.name === "center" ? eViewport : void 0)
)
);
if (rangeSvc) {
this.forContainers(
allNoFW,
() => this.createManagedBean(rangeSvc.createDragListenerFeature(this.eContainer))
);
}
this.forContainers(
allCenter,
() => this.createManagedBean(new CenterWidthFeature((width) => this.comp.setContainerWidth(`${width}px`)))
);
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 = _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 _getInnerWidth(this.eViewport);
}
getCenterViewportScrollLeft() {
return _getScrollLeft(this.eViewport, this.enableRtl);
}
registerViewportResizeListener(listener) {
const unsubscribeFromResize = _observeResize(this.beans, this.eViewport, listener);
this.addDestroyFunc(() => unsubscribeFromResize());
}
isViewportInTheDOMTree() {
return _isInDOM(this.eViewport);
}
getViewportScrollLeft() {
return _getScrollLeft(this.eViewport, this.enableRtl);
}
isHorizontalScrollShowing() {
const isAlwaysShowHorizontalScroll = this.gos.get("alwaysShowHorizontalScroll");
return isAlwaysShowHorizontalScroll || _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) {
_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 = _isDomLayout(this.gos, "print");
const embedFullWidthRows = this.gos.get("embedFullWidthRows");
const embedFW = embedFullWidthRows || printLayout;
const rowsThisContainer = rows.filter((rowCtrl) => {
const fullWidthRow = rowCtrl.isFullWidth();
const match = this.options.fullWidth ? !embedFW && fullWidthRow : embedFW || !fullWidthRow;
return match;
});
this.comp.setRowCtrls({ rowCtrls: rowsThisContainer, useFlushSync: afterScroll });
}
};
// packages/ag-grid-community/src/gridBodyComp/gridBodyCtrl.ts
var CSS_CLASS_FORCE_VERTICAL_SCROLL = "ag-force-vertical-scroll";
var CSS_CLASS_CELL_SELECTABLE = "ag-selectable";
var CSS_CLASS_COLUMN_MOVING = "ag-column-moving";
var GridBodyCtrl = class extends 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(`.${_getRowViewportClass("center")}`);
this.eFullWidthContainer = eBodyViewport.querySelector(`.${_getRowContainerClass("fullWidth")}`);
this.eStickyTopFullWidthContainer = eStickyTop.querySelector(
`.${_getRowContainerClass("stickyTopFullWidth")}`
);
this.eStickyBottomFullWidthContainer = eStickyBottom.querySelector(
`.${_getRowContainerClass("stickyBottomFullWidth")}`
);
this.setCellTextSelection(this.gos.get("enableCellTextSelection"));
this.addManagedPropertyListener(
"enableCellTextSelection",
(props) => this.setCellTextSelection(props.currentValue)
);
this.createManagedBean(new LayoutFeature(this.comp));
this.scrollFeature = this.createManagedBean(new 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 = _isInvisibleScrollbar() ? 16 : 0;
const width = `calc(100% + ${scrollbarWidth + pad}px)`;
_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;
const isFocusedElementNested = _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 = _isElementChildOfClass(
relatedTarget,
"ag-root",
element
);
const isNestedTarget = _isElementChildOfClass(target, "ag-root", element);
if (isNestedTarget) {
return;
}
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 ? CSS_CLASS_FORCE_VERTICAL_SCROLL : null;
const allowVerticalScroll = _isDomLayout(this.gos, "normal");
this.comp.setAlwaysVerticalScrollClass(cssClass, show);
return show || allowVerticalScroll && _isVerticalScrollShowing(this.eBodyViewport);
}
setupRowAnimationCssClass() {
const { rowContainerHeight, environment } = this.beans;
let initialSizeMeasurementComplete = environment.sizesMeasured;
const updateAnimationClass = () => {
const animateRows = initialSizeMeasurementComplete && _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;
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) });
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 && _isEventFromThisGrid(this.gos, e)) {
this.scrollGridBodyToMatchEvent(e);
}
}
onStickyWheel(e) {
const { deltaX, deltaY, shiftKey } = e;
const isHorizontalScroll = shiftKey || Math.abs(deltaX) > Math.abs(deltaY);
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();
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) {
this.beans.contextMenuSvc?.showContextMenu({
mouseEvent,
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) {
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`);
}
};
// packages/ag-grid-community/src/gridBodyComp/abstractFakeScrollComp.ts
var AbstractFakeScrollComp = class extends Component {
constructor(template, direction) {
super();
this.direction = direction;
this.eViewport = RefPlaceholder;
this.eContainer = RefPlaceholder;
this.hideTimeout = 0;
this.setTemplate(template);
}
postConstruct() {
this.addManagedEventListeners({
scrollVisibilityChanged: this.onScrollVisibilityChanged.bind(this)
});
this.onScrollVisibilityChanged();
this.addOrRemoveCssClass("ag-apple-scrollbar", _isMacOsUserAgent() || _isIOSUserAgent());
}
destroy() {
super.destroy();
window.clearTimeout(this.hideTimeout);
}
initialiseInvisibleScrollbar() {
if (this.invisibleScrollbar !== void 0) {
return;
}
this.invisibleScrollbar = _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() {
if (this.invisibleScrollbar === void 0) {
this.initialiseInvisibleScrollbar();
}
_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;
_waitUntil(
() => _isVisible(viewport),
() => this.setScrollPosition(value),
100
);
}
onScrollCallback(fn) {
this.addManagedElementListeners(this.eViewport, { scroll: fn });
}
};
// packages/ag-grid-community/src/gridBodyComp/fakeHScrollComp.ts
var FakeHScrollComp = class extends AbstractFakeScrollComp {
constructor() {
super(
/* html */
``,
"horizontal"
);
this.eLeftSpacer = RefPlaceholder;
this.eRightSpacer = RefPlaceholder;
this.setScrollVisibleDebounce = 0;
}
wireBeans(beans) {
this.visibleCols = beans.visibleCols;
this.scrollVisibleSvc = beans.scrollVisibleSvc;
}
postConstruct() {
super.postConstruct();
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((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 !== void 0) {
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;
let rightSpacing = this.visibleCols.getDisplayedColumnsRightWidth();
const scrollOnRight = !this.enableRtl && vScrollShowing;
const scrollbarWidth = this.scrollVisibleSvc.getScrollbarWidth();
if (scrollOnRight) {
rightSpacing += scrollbarWidth;
}
_setFixedWidth(this.eRightSpacer, rightSpacing);
this.eRightSpacer.classList.toggle("ag-scroller-corner", rightSpacing <= scrollbarWidth);
let leftSpacing = this.visibleCols.getColsLeftWidth();
const scrollOnLeft = this.enableRtl && vScrollShowing;
if (scrollOnLeft) {
leftSpacing += scrollbarWidth;
}
_setFixedWidth(this.eLeftSpacer, leftSpacing);
this.eLeftSpacer.classList.toggle("ag-scroller-corner", leftSpacing <= scrollbarWidth);
}
setScrollVisible() {
const hScrollShowing = this.scrollVisibleSvc.horizontalScrollShowing;
const invisibleScrollbar2 = this.invisibleScrollbar;
const isSuppressHorizontalScroll = this.gos.get("suppressHorizontalScroll");
const scrollbarWidth = hScrollShowing ? this.scrollVisibleSvc.getScrollbarWidth() || 0 : 0;
const adjustedScrollbarWidth = scrollbarWidth === 0 && invisibleScrollbar2 ? 16 : scrollbarWidth;
const scrollContainerSize = !isSuppressHorizontalScroll ? adjustedScrollbarWidth : 0;
const apply = () => {
this.setScrollVisibleDebounce = 0;
this.addOrRemoveCssClass("ag-scrollbar-invisible", invisibleScrollbar2);
_setFixedHeight(this.getGui(), scrollContainerSize);
_setFixedHeight(this.eViewport, scrollContainerSize);
_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 _getScrollLeft(this.eViewport, this.enableRtl);
}
setScrollPosition(value) {
if (!_isVisible(this.eViewport)) {
this.attemptSettingScrollPosition(value);
}
_setScrollLeft(this.eViewport, value, this.enableRtl);
}
};
var FakeHScrollSelector = {
selector: "AG-FAKE-HORIZONTAL-SCROLL",
component: FakeHScrollComp
};
// packages/ag-grid-community/src/gridBodyComp/fakeVScrollComp.ts
var FakeVScrollComp = class extends AbstractFakeScrollComp {
constructor() {
super(
/* html */
``,
"vertical"
);
}
postConstruct() {
super.postConstruct();
this.createManagedBean(new 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 invisibleScrollbar2 = this.invisibleScrollbar;
const scrollbarWidth = vScrollShowing ? scrollVisibleSvc.getScrollbarWidth() || 0 : 0;
const adjustedScrollbarWidth = scrollbarWidth === 0 && invisibleScrollbar2 ? 16 : scrollbarWidth;
this.addOrRemoveCssClass("ag-scrollbar-invisible", invisibleScrollbar2);
_setFixedWidth(this.getGui(), adjustedScrollbarWidth);
_setFixedWidth(this.eViewport, adjustedScrollbarWidth);
_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 && !_isVisible(this.eViewport)) {
this.attemptSettingScrollPosition(value);
}
this.eViewport.scrollTop = value;
}
};
var FakeVScrollSelector = {
selector: "AG-FAKE-VERTICAL-SCROLL",
component: FakeVScrollComp
};
// packages/ag-grid-community/src/headerRendering/headerUtils.ts
function getHeaderRowCount(colModel) {
return colModel.cols ? colModel.cols.treeDepth + 1 : -1;
}
function getFocusHeaderRowCount(beans) {
return beans.ctrlsSvc.getHeaderRowContainerCtrl()?.getRowCount() ?? 0;
}
function getGroupRowsHeight(beans) {
const heights = [];
const headerRowContainerCtrls = beans.ctrlsSvc.getHeaderRowContainerCtrls();
for (const headerRowContainerCtrl of headerRowContainerCtrls) {
if (!headerRowContainerCtrl) {
continue;
}
const groupRowCount = headerRowContainerCtrl.getGroupRowCount() || 0;
for (let i = 0; i < groupRowCount; i++) {
const headerRowCtrl = headerRowContainerCtrl.getGroupRowCtrlAtIndex(i);
const currentHeightAtPos = heights[i];
if (headerRowCtrl) {
const newHeight = getColumnGroupHeaderRowHeight(beans, headerRowCtrl);
if (currentHeightAtPos == null || newHeight > currentHeightAtPos) {
heights[i] = newHeight;
}
}
}
}
return heights;
}
function getColumnGroupHeaderRowHeight(beans, headerRowCtrl) {
const defaultHeight = beans.colModel.isPivotMode() ? getPivotGroupHeaderHeight(beans) : getGroupHeaderHeight(beans);
let displayedHeights = 0;
const headerRowCellCtrls = headerRowCtrl.getHeaderCtrls();
for (const headerCellCtrl of headerRowCellCtrls) {
const { column } = headerCellCtrl;
if (column.isAutoHeaderHeight()) {
const height = column.getAutoHeaderHeight();
if (height != null && height > displayedHeights) {
displayedHeights = height;
}
}
}
return Math.max(defaultHeight, displayedHeights);
}
function getColumnHeaderRowHeight(beans) {
const defaultHeight = beans.colModel.isPivotMode() ? getPivotHeaderHeight(beans) : getHeaderHeight(beans);
const allDisplayedCols = beans.visibleCols.allCols;
const displayedHeights = allDisplayedCols.filter((col) => col.isAutoHeaderHeight()).map((col) => col.getAutoHeaderHeight() || 0);
return Math.max(defaultHeight, ...displayedHeights);
}
function getHeaderHeight(beans) {
return beans.gos.get("headerHeight") ?? beans.environment.getDefaultHeaderHeight();
}
function getFloatingFiltersHeight(beans) {
return beans.gos.get("floatingFiltersHeight") ?? getHeaderHeight(beans);
}
function getGroupHeaderHeight(beans) {
return beans.gos.get("groupHeaderHeight") ?? getHeaderHeight(beans);
}
function getPivotHeaderHeight(beans) {
return beans.gos.get("pivotHeaderHeight") ?? getHeaderHeight(beans);
}
function getPivotGroupHeaderHeight(beans) {
return beans.gos.get("pivotGroupHeaderHeight") ?? getGroupHeaderHeight(beans);
}
// packages/ag-grid-community/src/headerRendering/gridHeaderCtrl.ts
var GridHeaderCtrl = class extends BeanStub {
setComp(comp, eGui, eFocusableElement) {
this.comp = comp;
this.eGui = eGui;
const { beans } = this;
const { headerNavigation, touchSvc, ctrlsSvc } = beans;
if (headerNavigation) {
this.createManagedBean(
new ManagedFocusFeature(eFocusableElement, {
onTabKeyDown: this.onTabKeyDown.bind(this),
handleKeyDown: this.handleKeyDown.bind(this),
onFocusOut: this.onFocusOut.bind(this)
})
);
}
this.addManagedEventListeners({
columnPivotModeChanged: this.onPivotModeChanged.bind(this, beans),
displayedColumnsChanged: this.onDisplayedColumnsChanged.bind(this, beans)
});
this.onPivotModeChanged(beans);
this.setupHeaderHeight();
const listener = this.onHeaderContextMenu.bind(this);
this.addManagedElementListeners(this.eGui, { contextmenu: listener });
touchSvc?.mockHeaderContextMenu(this, listener);
ctrlsSvc.register("gridHeaderCtrl", this);
}
setupHeaderHeight() {
const listener = this.setHeaderHeight.bind(this);
listener();
this.addManagedPropertyListeners(
[
"headerHeight",
"pivotHeaderHeight",
"groupHeaderHeight",
"pivotGroupHeaderHeight",
"floatingFiltersHeight"
],
listener
);
this.addManagedEventListeners({
displayedColumnsChanged: listener,
columnHeaderHeightChanged: listener,
// add this to the animation frame to avoid a feedback loop
columnGroupHeaderHeightChanged: () => _requestAnimationFrame(this.beans, () => listener()),
gridStylesChanged: listener,
advancedFilterEnabledChanged: listener
});
}
setHeaderHeight() {
const { beans } = this;
let totalHeaderHeight = 0;
const groupHeight = getGroupRowsHeight(beans).reduce((prev, curr) => prev + curr, 0);
const headerHeight = getColumnHeaderRowHeight(beans);
if (beans.filterManager?.hasFloatingFilters()) {
totalHeaderHeight += getFloatingFiltersHeight(beans);
}
totalHeaderHeight += groupHeight;
totalHeaderHeight += headerHeight;
if (this.headerHeight === totalHeaderHeight) {
return;
}
this.headerHeight = totalHeaderHeight;
const px = `${totalHeaderHeight + 1}px`;
this.comp.setHeightAndMinHeight(px);
this.eventSvc.dispatchEvent({
type: "headerHeightChanged"
});
}
onPivotModeChanged(beans) {
const pivotMode = beans.colModel.isPivotMode();
this.comp.addOrRemoveCssClass("ag-pivot-on", pivotMode);
this.comp.addOrRemoveCssClass("ag-pivot-off", !pivotMode);
}
onDisplayedColumnsChanged(beans) {
const columns = beans.visibleCols.allCols;
const shouldAllowOverflow = columns.some((col) => col.isSpanHeaderHeight());
this.comp.addOrRemoveCssClass("ag-header-allow-overflow", shouldAllowOverflow);
}
onTabKeyDown(e) {
const isRtl = this.gos.get("enableRtl");
const backwards = e.shiftKey;
const direction = backwards !== isRtl ? "LEFT" : "RIGHT";
const { beans } = this;
const { headerNavigation, focusSvc } = beans;
if (headerNavigation.navigateHorizontally(direction, true, e) || !backwards && focusSvc.focusOverlay(false) || _focusNextGridCoreContainer(beans, backwards, true)) {
e.preventDefault();
}
}
handleKeyDown(e) {
let direction = null;
const { headerNavigation } = this.beans;
switch (e.key) {
case KeyCode.LEFT:
direction = "LEFT";
case KeyCode.RIGHT: {
if (!_exists(direction)) {
direction = "RIGHT";
}
if (headerNavigation.navigateHorizontally(direction, false, e)) {
e.preventDefault();
}
break;
}
case KeyCode.UP:
direction = "UP";
case KeyCode.DOWN: {
if (!_exists(direction)) {
direction = "DOWN";
}
if (headerNavigation.navigateVertically(direction, null, e)) {
e.preventDefault();
}
break;
}
default:
return;
}
}
onFocusOut(e) {
const { relatedTarget } = e;
const { eGui, beans } = this;
if (!relatedTarget && eGui.contains(_getActiveDomElement(beans))) {
return;
}
if (!eGui.contains(relatedTarget)) {
beans.focusSvc.focusedHeader = null;
}
}
onHeaderContextMenu(mouseEvent, touch, touchEvent) {
const { menuSvc, ctrlsSvc } = this.beans;
if (!mouseEvent && !touchEvent || !menuSvc?.isHeaderContextMenuEnabled()) {
return;
}
const { target } = mouseEvent ?? touch;
if (target === this.eGui || target === ctrlsSvc.getHeaderRowContainerCtrl()?.eViewport) {
menuSvc.showHeaderContextMenu(void 0, mouseEvent, touchEvent);
}
}
};
// packages/ag-grid-community/src/headerRendering/cells/abstractCell/abstractHeaderCellComp.ts
var AbstractHeaderCellComp = class extends Component {
constructor(template, ctrl) {
super(template);
this.ctrl = ctrl;
}
getCtrl() {
return this.ctrl;
}
};
// packages/ag-grid-community/src/headerRendering/cells/column/headerCellComp.ts
var HeaderCellComp = class extends AbstractHeaderCellComp {
constructor(ctrl) {
super(
/* html */
``,
ctrl
);
this.eResize = RefPlaceholder;
this.eHeaderCompWrapper = 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) => _addStylesToElement(eGui, styles),
setAriaSort: (sort) => sort ? _setAriaSort(eGui, sort) : _removeAriaSort(eGui),
setUserCompDetails: (compDetails) => this.setUserCompDetails(compDetails),
getUserCompInstance: () => this.headerComp
};
this.ctrl.setComp(compProxy, this.getGui(), this.eResize, this.eHeaderCompWrapper, void 0);
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 = void 0;
}
}
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());
}
};
// packages/ag-grid-community/src/headerRendering/cells/columnGroup/headerGroupCellComp.ts
var HeaderGroupCellComp = class extends AbstractHeaderCellComp {
constructor(ctrl) {
super(
/* html */
``,
ctrl
);
this.eResize = RefPlaceholder;
this.eHeaderCompWrapper = RefPlaceholder;
}
postConstruct() {
const eGui = this.getGui();
const setAttribute = (key, value) => value != void 0 ? 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) => _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) => _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, void 0);
}
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);
}
}
};
// packages/ag-grid-community/src/headerRendering/cells/floatingFilter/headerFilterCellComp.ts
var HeaderFilterCellComp = class extends AbstractHeaderCellComp {
constructor(ctrl) {
super(
/* html */
``,
ctrl
);
this.eFloatingFilterBody = RefPlaceholder;
this.eButtonWrapper = RefPlaceholder;
this.eButtonShowMainFilter = RefPlaceholder;
}
postConstruct() {
const eGui = this.getGui();
const compProxy = {
addOrRemoveCssClass: (cssClassName, on) => this.addOrRemoveCssClass(cssClassName, on),
setUserStyles: (styles) => _addStylesToElement(eGui, styles),
addOrRemoveBodyCssClass: (cssClassName, on) => this.eFloatingFilterBody.classList.toggle(cssClassName, on),
setButtonWrapperDisplayed: (displayed) => _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, void 0);
}
setCompDetails(compDetails) {
if (!compDetails) {
this.destroyFloatingFilterComp();
this.compPromise = null;
return;
}
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();
}
}
};
// packages/ag-grid-community/src/headerRendering/row/headerRowComp.ts
var HeaderRowComp = class extends Component {
constructor(ctrl) {
super();
this.ctrl = ctrl;
this.headerComps = {};
this.setTemplate(
/* html */
``
);
}
postConstruct() {
_setAriaRowIndex(this.getGui(), this.ctrl.getAriaRowIndex());
const compProxy = {
setHeight: (height) => this.getGui().style.height = height,
setTop: (top) => this.getGui().style.top = top,
setHeaderCtrls: (ctrls, forceOrder) => this.setHeaderCtrls(ctrls, forceOrder),
setWidth: (width) => this.getGui().style.width = width
};
this.ctrl.setComp(compProxy, void 0);
}
destroy() {
this.setHeaderCtrls([], false);
super.destroy();
}
setHeaderCtrls(ctrls, forceOrder) {
if (!this.isAlive()) {
return;
}
const oldComps = this.headerComps;
this.headerComps = {};
ctrls.forEach((ctrl) => {
const id = ctrl.instanceId;
let comp = oldComps[id];
delete oldComps[id];
if (comp == null) {
comp = this.createHeaderComp(ctrl);
this.getGui().appendChild(comp.getGui());
}
this.headerComps[id] = comp;
});
Object.values(oldComps).forEach((comp) => {
this.getGui().removeChild(comp.getGui());
this.destroyBean(comp);
});
if (forceOrder) {
const comps = Object.values(this.headerComps);
comps.sort(
(a, b) => {
const leftA = a.getCtrl().column.getLeft();
const leftB = b.getCtrl().column.getLeft();
return leftA - leftB;
}
);
const elementsInOrder = comps.map((c) => c.getGui());
_setDomChildOrder(this.getGui(), elementsInOrder);
}
}
createHeaderComp(headerCtrl) {
let result;
switch (this.ctrl.type) {
case "group":
result = new HeaderGroupCellComp(headerCtrl);
break;
case "filter":
result = new HeaderFilterCellComp(headerCtrl);
break;
default:
result = new HeaderCellComp(headerCtrl);
break;
}
this.createBean(result);
result.setParentComponent(this);
return result;
}
};
// packages/ag-grid-community/src/rendering/features/setLeftFeature.ts
var SetLeftFeature = class extends BeanStub {
constructor(columnOrGroup, eCell, beans, colsSpanning) {
super();
this.columnOrGroup = columnOrGroup;
this.eCell = eCell;
this.colsSpanning = colsSpanning;
this.columnOrGroup = columnOrGroup;
this.ariaEl = eCell.querySelector("[role=columnheader]") || eCell;
this.beans = beans;
}
setColsSpanning(colsSpanning) {
this.colsSpanning = colsSpanning;
this.onLeftChanged();
}
getColumnOrGroup() {
const { beans, colsSpanning } = this;
if (beans.gos.get("enableRtl") && colsSpanning) {
return _last(colsSpanning);
}
return this.columnOrGroup;
}
postConstruct() {
const onLeftChanged = this.onLeftChanged.bind(this);
this.addManagedListeners(this.columnOrGroup, { leftChanged: onLeftChanged });
this.setLeftFirstTime();
this.addManagedEventListeners({ displayedColumnsWidthChanged: onLeftChanged });
this.addManagedPropertyListener("domLayout", onLeftChanged);
}
setLeftFirstTime() {
const { gos, colAnimation } = this.beans;
const suppressMoveAnimation = gos.get("suppressColumnMoveAnimation");
const oldLeftExists = _exists(this.columnOrGroup.getOldLeft());
const animateColumnMove = colAnimation?.isActive() && oldLeftExists && !suppressMoveAnimation;
if (animateColumnMove) {
this.animateInLeft();
} else {
this.onLeftChanged();
}
}
animateInLeft() {
const colOrGroup = this.getColumnOrGroup();
const oldActualLeft = this.modifyLeftForPrintLayout(colOrGroup, colOrGroup.getOldLeft());
const actualLeft = this.modifyLeftForPrintLayout(colOrGroup, colOrGroup.getLeft());
this.setLeft(oldActualLeft);
this.actualLeft = actualLeft;
this.beans.colAnimation.executeNextVMTurn(() => {
if (this.actualLeft === actualLeft) {
this.setLeft(actualLeft);
}
});
}
onLeftChanged() {
const colOrGroup = this.getColumnOrGroup();
const left = colOrGroup.getLeft();
this.actualLeft = this.modifyLeftForPrintLayout(colOrGroup, left);
this.setLeft(this.actualLeft);
}
modifyLeftForPrintLayout(colOrGroup, leftPosition) {
const { gos, visibleCols } = this.beans;
const printLayout = _isDomLayout(gos, "print");
if (!printLayout) {
return leftPosition;
}
if (colOrGroup.getPinned() === "left") {
return leftPosition;
}
const leftWidth = visibleCols.getColsLeftWidth();
if (colOrGroup.getPinned() === "right") {
const bodyWidth = visibleCols.bodyWidth;
return leftWidth + bodyWidth + leftPosition;
}
return leftWidth + leftPosition;
}
setLeft(value) {
if (_exists(value)) {
this.eCell.style.left = `${value}px`;
}
if (isColumnGroup2(this.columnOrGroup)) {
const children = this.columnOrGroup.getLeafColumns();
if (!children.length) {
return;
}
if (children.length > 1) {
_setAriaColSpan(this.ariaEl, children.length);
}
}
}
};
// packages/ag-grid-community/src/headerRendering/cells/abstractCell/abstractHeaderCellCtrl.ts
var instanceIdSequence4 = 0;
var DOM_DATA_KEY_HEADER_CTRL = "headerCtrl";
var AbstractHeaderCellCtrl = class extends 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;
this.instanceId = column.getUniqueId() + "-" + instanceIdSequence4++;
}
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 (!_exists(colDefFunc)) {
return false;
}
const params = _addGridCommonParams(this.gos, {
colDef,
column,
headerRowIndex,
event
});
return !!colDefFunc(params);
}
getWrapperHasFocus() {
const activeEl = _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 } = _getElementSize(this.eGui);
const extraHeight = paddingTop + paddingBottom + borderBottomWidth + borderTopWidth;
const wrapperHeight = wrapperElement.offsetHeight;
const autoHeight = wrapperHeight + extraHeight;
if (timesCalled < 5) {
const doc = _getDocument(beans);
const notYetInDom = !doc || !doc.contains(wrapperElement);
const possiblyNoContentYet = autoHeight == 0;
if (notYetInDom || possiblyNoContentYet) {
_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 = _observeResize(this.beans, wrapperElement, () => measureHeight(0));
};
const stopMeasuring = () => {
isMeasuring = false;
if (stopResizeObserver) {
stopResizeObserver();
}
this.comp.addOrRemoveCssClass("ag-header-cell-auto-height", false);
stopResizeObserver = void 0;
};
checkMeasuring();
compBean.addDestroyFunc(() => stopMeasuring());
compBean.addManagedListeners(this.column, { widthChanged: () => isMeasuring && measureHeight(0) });
compBean.addManagedEventListeners({
sortChanged: () => {
if (isMeasuring) {
window.setTimeout(() => measureHeight(0));
}
}
});
if (checkMeasuringCallback) {
checkMeasuringCallback(checkMeasuring);
}
}
onDisplayedColumnsChanged() {
const { comp, column, beans, eGui } = this;
if (!comp || !column || !eGui) {
return;
}
refreshFirstAndLastStyles(comp, column, beans.visibleCols);
_setAriaColIndex(eGui, beans.visibleCols.getAriaColIndex(column));
}
addResizeAndMoveKeyboardListeners(compBean) {
compBean.addManagedListeners(this.eGui, {
keydown: this.onGuiKeyDown.bind(this),
keyup: this.onGuiKeyUp.bind(this)
});
}
refreshTabIndex() {
const suppressHeaderFocus = _isHeaderFocusSuppressed(this.beans);
if (this.eGui) {
_addOrRemoveAttribute(this.eGui, "tabindex", suppressHeaderFocus ? null : "-1");
}
}
onGuiKeyDown(e) {
const activeEl = _getActiveDomElement(this.beans);
const isLeftOrRight = e.key === KeyCode.LEFT || e.key === 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.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.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.PAGE_DOWN:
case KeyCode.PAGE_UP:
case KeyCode.PAGE_HOME:
case KeyCode.PAGE_END:
if (wrapperHasFocus) {
e.preventDefault();
}
}
}
addDomData(compBean) {
const key = DOM_DATA_KEY_HEADER_CTRL;
const { eGui, gos } = this;
_setDomData(gos, eGui, key, this);
compBean.addDestroyFunc(() => _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;
}
};
// packages/ag-grid-community/src/headerRendering/cells/column/headerCellCtrl.ts
var HeaderCellCtrl = class extends AbstractHeaderCellCtrl {
constructor() {
super(...arguments);
this.refreshFunctions = {};
this.userHeaderClasses = /* @__PURE__ */ new Set();
this.ariaDescriptionProperties = /* @__PURE__ */ new Map();
}
setComp(comp, eGui, eResize, eHeaderCompWrapper, compBeanInput) {
this.comp = comp;
const { rowCtrl, column, beans } = this;
const { colResize, context, colHover, rangeSvc } = beans;
const compBean = 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 {
_setDisplayed(eResize, false);
}
colHover?.createHoverFeature(compBean, [column], eGui);
rangeSvc?.createRangeHighlightFeature(compBean, column, comp);
compBean.createManagedBean(new SetLeftFeature(column, eGui, beans));
compBean.createManagedBean(
new 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 = void 0;
this.userCompDetails = null;
this.userHeaderClasses.clear();
this.ariaDescriptionProperties.clear();
this.clearComponent();
});
}
resizeHeader(delta, shiftKey) {
this.beans.colResize?.resizeHeader(this.column, delta, shiftKey);
}
getHeaderClassParams() {
const { column, beans } = this;
const colDef = column.colDef;
return _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 _getHeaderCompDetails(this.beans.userCompFactory, colDef, params);
}
createParams() {
const { menuSvc, sortSvc, colFilter, gos } = this.beans;
const params = _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 || _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,
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.SPACE) {
this.selectAllFeature?.onSpaceKeyDown(e);
}
if (e.key === KeyCode.ENTER) {
this.onEnterKeyDown(e);
}
if (e.key === 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;
}
if (headerComp.onMenuKeyboardShortcut(isFilterShortcut)) {
e.preventDefault();
}
}
onFocusIn(e) {
if (!this.eGui.contains(e.relatedTarget)) {
this.focusThis();
this.announceAriaDescription();
}
if (_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 = _getHeaderClassesFromColDef(colDef, this.gos, this.column, null);
const oldClasses = this.userHeaderClasses;
this.userHeaderClasses = new Set(classes);
classes.forEach((c) => {
if (oldClasses.has(c)) {
oldClasses.delete(c);
} else {
this.comp.addOrRemoveCssClass(c, true);
}
});
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();
const attemptRefresh = compInstance != null && this.userCompDetails.componentClass == newCompDetails.componentClass;
const headerCompRefreshed = attemptRefresh ? this.attemptHeaderCompRefresh(newCompDetails.params) : false;
if (headerCompRefreshed) {
this.setDragSource(this.dragSourceElement);
} else {
this.setCompDetails(newCompDetails);
}
}
attemptHeaderCompRefresh(params) {
const headerComp = this.comp.getUserCompInstance();
if (!headerComp) {
return false;
}
if (!headerComp.refresh) {
return false;
}
const res = headerComp.refresh(params);
return res;
}
calculateDisplayName() {
return this.beans.colNames.getDisplayNameForColumn(this.column, "header", true);
}
checkDisplayName() {
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;
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.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 === 0 /* Before */;
const afterOn = highlighted === 1 /* 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 = 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 = getColumnHeaderRowHeight(beans);
if (numberOfParents === 0) {
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(_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 && !_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(_getActiveDomElement(this.beans))) {
return;
}
const ariaDescription = Array.from(this.ariaDescriptionProperties.keys()).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, void 0, 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();
}
};
function isHeaderComp(headerComp) {
return typeof headerComp.getAnchorElementForMenu === "function" && typeof headerComp.onMenuKeyboardShortcut === "function";
}
// packages/ag-grid-community/src/headerRendering/row/headerRowCtrl.ts
var instanceIdSequence5 = 0;
var HeaderRowCtrl = class extends BeanStub {
constructor(rowIndex, pinned, type) {
super();
this.rowIndex = rowIndex;
this.pinned = pinned;
this.type = type;
this.instanceId = instanceIdSequence5++;
const typeClass = type == "group" ? `ag-header-row-column-group` : type == "filter" ? `ag-header-row-column-filter` : `ag-header-row-column`;
this.headerRowClass = `ag-header-row ${typeClass}`;
}
postConstruct() {
this.isPrintLayout = _isDomLayout(this.gos, "print");
this.isEnsureDomOrder = this.gos.get("ensureDomOrder");
}
/** Checks that every header cell that is currently visible has been rendered.
* Can only be false under some circumstances when using React
*/
areCellsRendered() {
if (!this.comp) {
return false;
}
return this.getHeaderCellCtrls().every((ctrl) => ctrl.eGui != null);
}
/**
*
* @param comp Proxy to the actual component
* @param initCompState Should the component be initialised with the current state of the controller. Default: true
*/
setComp(comp, compBean, initCompState = true) {
this.comp = comp;
compBean = setupCompBean(this, this.beans.context, compBean);
if (initCompState) {
this.onRowHeightChanged();
this.onVirtualColumnsChanged();
}
this.setWidth();
this.addEventListeners(compBean);
}
getAriaRowIndex() {
return this.rowIndex + 1;
}
addEventListeners(compBean) {
const onHeightChanged = this.onRowHeightChanged.bind(this);
const onDisplayedColumnsChanged = this.onDisplayedColumnsChanged.bind(this);
compBean.addManagedEventListeners({
columnResized: this.setWidth.bind(this),
displayedColumnsChanged: onDisplayedColumnsChanged,
virtualColumnsChanged: (params) => this.onVirtualColumnsChanged(params.afterScroll),
columnGroupHeaderHeightChanged: onHeightChanged,
columnHeaderHeightChanged: onHeightChanged,
gridStylesChanged: onHeightChanged,
advancedFilterEnabledChanged: onHeightChanged
});
compBean.addManagedPropertyListener("domLayout", onDisplayedColumnsChanged);
compBean.addManagedPropertyListener("ensureDomOrder", (e) => this.isEnsureDomOrder = e.currentValue);
compBean.addManagedPropertyListeners(
[
"headerHeight",
"pivotHeaderHeight",
"groupHeaderHeight",
"pivotGroupHeaderHeight",
"floatingFiltersHeight"
],
onHeightChanged
);
}
getHeaderCellCtrl(column) {
if (!this.headerCellCtrls) {
return;
}
for (const cellCtrl of this.headerCellCtrls.values()) {
if (cellCtrl.column === column) {
return cellCtrl;
}
}
return void 0;
}
onDisplayedColumnsChanged() {
this.isPrintLayout = _isDomLayout(this.gos, "print");
this.onVirtualColumnsChanged();
this.setWidth();
this.onRowHeightChanged();
}
setWidth() {
const width = this.getWidthForRow();
this.comp.setWidth(`${width}px`);
}
getWidthForRow() {
const { visibleCols } = this.beans;
if (this.isPrintLayout) {
const pinned = this.pinned != null;
if (pinned) {
return 0;
}
return visibleCols.getContainerWidth("right") + visibleCols.getContainerWidth("left") + visibleCols.getContainerWidth(null);
}
return visibleCols.getContainerWidth(this.pinned);
}
onRowHeightChanged() {
const { topOffset, rowHeight } = this.getTopAndHeight();
this.comp.setTop(topOffset + "px");
this.comp.setHeight(rowHeight + "px");
}
getTopAndHeight() {
const { filterManager } = this.beans;
const sizes = [];
const groupHeadersHeight = getGroupRowsHeight(this.beans);
const headerHeight = getColumnHeaderRowHeight(this.beans);
sizes.push(...groupHeadersHeight);
sizes.push(headerHeight);
if (filterManager?.hasFloatingFilters()) {
sizes.push(getFloatingFiltersHeight(this.beans));
}
let topOffset = 0;
for (let i = 0; i < this.rowIndex; i++) {
topOffset += sizes[i];
}
const rowHeight = sizes[this.rowIndex];
return { topOffset, rowHeight };
}
onVirtualColumnsChanged(afterScroll = false) {
const ctrlsToDisplay = this.getHeaderCtrls();
const forceOrder = this.isEnsureDomOrder || this.isPrintLayout;
this.comp.setHeaderCtrls(ctrlsToDisplay, forceOrder, afterScroll);
}
getHeaderCtrls() {
const oldCtrls = this.headerCellCtrls;
this.headerCellCtrls = /* @__PURE__ */ new Map();
const columns = this.getColumnsInViewport();
for (const child of columns) {
this.recycleAndCreateHeaderCtrls(child, oldCtrls);
}
const isFocusedAndDisplayed = (ctrl) => {
const { focusSvc, visibleCols } = this.beans;
const isFocused = focusSvc.isHeaderWrapperFocused(ctrl);
if (!isFocused) {
return false;
}
const isDisplayed = visibleCols.isVisible(ctrl.column);
return isDisplayed;
};
if (oldCtrls) {
for (const [id, oldCtrl] of oldCtrls) {
const keepCtrl = isFocusedAndDisplayed(oldCtrl);
if (keepCtrl) {
this.headerCellCtrls.set(id, oldCtrl);
} else {
this.destroyBean(oldCtrl);
}
}
}
return this.getHeaderCellCtrls();
}
getHeaderCellCtrls() {
return Array.from(this.headerCellCtrls?.values() ?? []);
}
recycleAndCreateHeaderCtrls(headerColumn, oldCtrls) {
if (!this.headerCellCtrls) {
return;
}
if (headerColumn.isEmptyGroup()) {
return;
}
const idOfChild = headerColumn.getUniqueId();
let headerCtrl;
if (oldCtrls) {
headerCtrl = oldCtrls.get(idOfChild);
oldCtrls.delete(idOfChild);
}
const forOldColumn = headerCtrl && headerCtrl.column != headerColumn;
if (forOldColumn) {
this.destroyBean(headerCtrl);
headerCtrl = void 0;
}
if (headerCtrl == null) {
switch (this.type) {
case "filter": {
headerCtrl = this.createBean(
this.beans.registry.createDynamicBean(
"headerFilterCellCtrl",
true,
headerColumn,
this
)
);
break;
}
case "group":
headerCtrl = this.createBean(
this.beans.registry.createDynamicBean(
"headerGroupCellCtrl",
true,
headerColumn,
this
)
);
break;
default:
headerCtrl = this.createBean(new HeaderCellCtrl(headerColumn, this));
break;
}
}
this.headerCellCtrls.set(idOfChild, headerCtrl);
}
getColumnsInViewport() {
return this.isPrintLayout ? this.getColumnsInViewportPrintLayout() : this.getColumnsInViewportNormalLayout();
}
getColumnsInViewportPrintLayout() {
if (this.pinned != null) {
return [];
}
let viewportColumns = [];
const actualDepth = this.getActualDepth();
const { colViewport } = this.beans;
["left", null, "right"].forEach((pinned) => {
const items = colViewport.getHeadersToRender(pinned, actualDepth);
viewportColumns = viewportColumns.concat(items);
});
return viewportColumns;
}
getActualDepth() {
return this.type == "filter" ? this.rowIndex - 1 : this.rowIndex;
}
getColumnsInViewportNormalLayout() {
return this.beans.colViewport.getHeadersToRender(this.pinned, this.getActualDepth());
}
findHeaderCellCtrl(column) {
if (!this.headerCellCtrls) {
return;
}
const allCtrls = this.getHeaderCellCtrls();
let ctrl;
if (typeof column === "function") {
ctrl = allCtrls.find(column);
} else {
ctrl = allCtrls.find((ctrl2) => ctrl2.column == column);
}
return ctrl;
}
focusHeader(column, event) {
const ctrl = this.findHeaderCellCtrl(column);
if (!ctrl) {
return false;
}
const focused = ctrl.focus(event);
return focused;
}
destroy() {
this.headerCellCtrls?.forEach((ctrl) => {
this.destroyBean(ctrl);
});
this.headerCellCtrls = void 0;
super.destroy();
}
};
// packages/ag-grid-community/src/headerRendering/rowContainer/headerRowContainerCtrl.ts
var HeaderRowContainerCtrl = class extends BeanStub {
constructor(pinned) {
super();
this.pinned = pinned;
this.hidden = false;
this.includeFloatingFilter = false;
this.groupsRowCtrls = [];
}
setComp(comp, eGui) {
this.comp = comp;
this.eViewport = eGui;
const { pinnedCols, ctrlsSvc, colModel, colMoves, filterManager } = this.beans;
this.setupCenterWidth();
pinnedCols?.setupHeaderPinnedWidth(this);
this.setupDragAndDrop(colMoves, this.eViewport);
const onDisplayedColsChanged = this.onDisplayedColumnsChanged.bind(this, filterManager);
this.addManagedEventListeners({
gridColumnsChanged: this.onGridColumnsChanged.bind(this),
displayedColumnsChanged: onDisplayedColsChanged,
advancedFilterEnabledChanged: onDisplayedColsChanged
});
const headerType = `${typeof this.pinned === "string" ? this.pinned : "center"}Header`;
ctrlsSvc.register(headerType, this);
if (colModel.ready) {
this.refresh();
}
}
getAllCtrls() {
const res = [...this.groupsRowCtrls];
if (this.columnsRowCtrl) {
res.push(this.columnsRowCtrl);
}
if (this.filtersRowCtrl) {
res.push(this.filtersRowCtrl);
}
return res;
}
refresh(keepColumns = false) {
const { focusSvc, colModel, filterManager } = this.beans;
let sequence = 0;
const focusedHeaderPosition = focusSvc.getFocusHeaderToUseAfterRefresh();
const refreshColumnGroups = () => {
const groupRowCount = getHeaderRowCount(colModel) - 1;
this.groupsRowCtrls = this.destroyBeans(this.groupsRowCtrls);
for (let i = 0; i < groupRowCount; i++) {
const ctrl = this.createBean(new HeaderRowCtrl(sequence++, this.pinned, "group"));
this.groupsRowCtrls.push(ctrl);
}
};
const refreshColumns = () => {
const rowIndex = sequence++;
const needNewInstance = !this.hidden && (this.columnsRowCtrl == null || !keepColumns || this.columnsRowCtrl.rowIndex !== rowIndex);
const shouldDestroyInstance = needNewInstance || this.hidden;
if (shouldDestroyInstance) {
this.columnsRowCtrl = this.destroyBean(this.columnsRowCtrl);
}
if (needNewInstance) {
this.columnsRowCtrl = this.createBean(new HeaderRowCtrl(rowIndex, this.pinned, "column"));
}
};
const refreshFilters = () => {
this.includeFloatingFilter = !!filterManager?.hasFloatingFilters() && !this.hidden;
const destroyPreviousComp = () => {
this.filtersRowCtrl = this.destroyBean(this.filtersRowCtrl);
};
if (!this.includeFloatingFilter) {
destroyPreviousComp();
return;
}
const rowIndex = sequence++;
if (this.filtersRowCtrl) {
const rowIndexMismatch = this.filtersRowCtrl.rowIndex !== rowIndex;
if (!keepColumns || rowIndexMismatch) {
destroyPreviousComp();
}
}
if (!this.filtersRowCtrl) {
this.filtersRowCtrl = this.createBean(new HeaderRowCtrl(rowIndex, this.pinned, "filter"));
}
};
refreshColumnGroups();
refreshColumns();
refreshFilters();
const allCtrls = this.getAllCtrls();
this.comp.setCtrls(allCtrls);
this.restoreFocusOnHeader(focusSvc, focusedHeaderPosition);
}
getHeaderCtrlForColumn(column) {
if (isColumn(column)) {
return this.columnsRowCtrl?.getHeaderCellCtrl(column);
}
if (this.groupsRowCtrls.length === 0) {
return;
}
for (let i = 0; i < this.groupsRowCtrls.length; i++) {
const ctrl = this.groupsRowCtrls[i].getHeaderCellCtrl(column);
if (ctrl) {
return ctrl;
}
}
}
getHtmlElementForColumnHeader(column) {
return this.getHeaderCtrlForColumn(column)?.eGui ?? null;
}
getRowType(rowIndex) {
return this.getAllCtrls()[rowIndex]?.type;
}
focusHeader(rowIndex, column, event) {
const allCtrls = this.getAllCtrls();
const ctrl = allCtrls[rowIndex];
if (!ctrl) {
return false;
}
return ctrl.focusHeader(column, event);
}
getGroupRowCount() {
return this.groupsRowCtrls.length;
}
getGroupRowCtrlAtIndex(index) {
return this.groupsRowCtrls[index];
}
getRowCount() {
return this.groupsRowCtrls.length + (this.columnsRowCtrl ? 1 : 0) + (this.filtersRowCtrl ? 1 : 0);
}
setHorizontalScroll(offset) {
this.comp.setViewportScrollLeft(offset);
}
onScrollCallback(fn) {
this.addManagedElementListeners(this.eViewport, { scroll: fn });
}
destroy() {
this.filtersRowCtrl = this.destroyBean(this.filtersRowCtrl);
this.columnsRowCtrl = this.destroyBean(this.columnsRowCtrl);
this.groupsRowCtrls = this.destroyBeans(this.groupsRowCtrls);
super.destroy();
}
setupDragAndDrop(colMoves, dropContainer) {
const bodyDropTarget = colMoves?.createBodyDropTarget(this.pinned, dropContainer);
if (bodyDropTarget) {
this.createManagedBean(bodyDropTarget);
}
}
restoreFocusOnHeader(focusSvc, position) {
if (!position) {
return;
}
const { column } = position;
if (column.getPinned() != this.pinned) {
return;
}
focusSvc.focusHeaderPosition({ headerPosition: position });
}
// grid cols have changed - this also means the number of rows in the header can have
// changed. so we remove all the old rows and insert new ones for a complete refresh
onGridColumnsChanged() {
this.refresh(true);
}
onDisplayedColumnsChanged(filterManager) {
const includeFloatingFilter = !!filterManager?.hasFloatingFilters() && !this.hidden;
if (this.includeFloatingFilter !== includeFloatingFilter) {
this.refresh(true);
}
}
setupCenterWidth() {
if (this.pinned != null) {
return;
}
this.createManagedBean(new CenterWidthFeature((width) => this.comp.setCenterWidth(`${width}px`), true));
}
};
// packages/ag-grid-community/src/misc/menu/menuService.ts
var MenuService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "menuSvc";
}
postConstruct() {
const { enterpriseMenuFactory, filterMenuFactory } = this.beans;
this.activeMenuFactory = enterpriseMenuFactory ?? filterMenuFactory;
}
showColumnMenu(params) {
this.showColumnMenuCommon(this.activeMenuFactory, params, "columnMenu");
}
showFilterMenu(params) {
const { enterpriseMenuFactory, filterMenuFactory } = this.beans;
const menuFactory = enterpriseMenuFactory && _isLegacyMenuEnabled(this.gos) ? enterpriseMenuFactory : filterMenuFactory;
this.showColumnMenuCommon(menuFactory, params, params.containerType, true);
}
showHeaderContextMenu(column, mouseEvent, touchEvent) {
this.activeMenuFactory?.showMenuAfterContextMenuEvent(column, mouseEvent, touchEvent);
}
hidePopupMenu() {
this.beans.contextMenuSvc?.hideActiveMenu();
this.activeMenuFactory?.hideActiveMenu();
}
isColumnMenuInHeaderEnabled(column) {
const { suppressHeaderMenuButton } = column.getColDef();
return !suppressHeaderMenuButton && !!this.activeMenuFactory?.isMenuEnabled(column) && (_isLegacyMenuEnabled(this.gos) || !!this.beans.enterpriseMenuFactory);
}
isFilterMenuInHeaderEnabled(column) {
return !column.getColDef().suppressHeaderFilterButton && !!this.beans.filterManager?.isFilterAllowed(column);
}
isHeaderContextMenuEnabled(column) {
const colDef = column && isColumn(column) ? column.getColDef() : column?.getColGroupDef();
return !colDef?.suppressHeaderContextMenu && this.gos.get("columnMenu") === "new";
}
isHeaderMenuButtonAlwaysShowEnabled() {
return this.isSuppressMenuHide();
}
isHeaderMenuButtonEnabled() {
const menuHides = !this.isSuppressMenuHide();
const onIpadAndMenuHides = _isIOSUserAgent() && menuHides;
return !onIpadAndMenuHides;
}
isHeaderFilterButtonEnabled(column) {
return this.isFilterMenuInHeaderEnabled(column) && !_isLegacyMenuEnabled(this.gos) && !this.isFloatingFilterButtonDisplayed(column);
}
isFilterMenuItemEnabled(column) {
return !!this.beans.filterManager?.isFilterAllowed(column) && !_isLegacyMenuEnabled(this.gos) && !this.isFilterMenuInHeaderEnabled(column) && !this.isFloatingFilterButtonDisplayed(column);
}
isFloatingFilterButtonEnabled(column) {
return !column.getColDef().suppressFloatingFilterButton;
}
isFloatingFilterButtonDisplayed(column) {
return !!column.getColDef().floatingFilter && this.isFloatingFilterButtonEnabled(column);
}
isSuppressMenuHide() {
const gos = this.gos;
const suppressMenuHide = gos.get("suppressMenuHide");
if (_isLegacyMenuEnabled(gos)) {
return gos.exists("suppressMenuHide") ? suppressMenuHide : false;
}
return suppressMenuHide;
}
showColumnMenuCommon(menuFactory, params, containerType, filtersOnly) {
const { positionBy, onClosedCallback } = params;
const column = params.column;
if (positionBy === "button") {
const { buttonElement } = params;
menuFactory?.showMenuAfterButtonClick(column, buttonElement, containerType, onClosedCallback, filtersOnly);
} else if (positionBy === "mouse") {
const { mouseEvent } = params;
menuFactory?.showMenuAfterMouseEvent(column, mouseEvent, containerType, onClosedCallback, filtersOnly);
} else if (column) {
const beans = this.beans;
const ctrlsSvc = beans.ctrlsSvc;
ctrlsSvc.getScrollFeature().ensureColumnVisible(column, "auto");
_requestAnimationFrame(beans, () => {
const headerCellCtrl = ctrlsSvc.getHeaderRowContainerCtrl(column.getPinned())?.getHeaderCtrlForColumn(column);
if (headerCellCtrl) {
menuFactory?.showMenuAfterButtonClick(
column,
headerCellCtrl.getAnchorElementForMenu(filtersOnly),
containerType,
onClosedCallback,
true
);
}
});
}
}
};
function _setColMenuVisible(column, visible, source) {
if (column.menuVisible !== visible) {
column.menuVisible = visible;
column.dispatchColEvent("menuVisibleChanged", source);
}
}
// packages/ag-grid-community/src/rendering/overlays/overlayComponent.ts
var OverlayComponent = class extends Component {
constructor() {
super();
}
};
// packages/ag-grid-community/src/rendering/overlays/loadingOverlayComponent.ts
var LoadingOverlayComponent2 = class extends OverlayComponent {
init() {
const customTemplate = _makeNull(this.gos.get("overlayLoadingTemplate")?.trim());
this.setTemplate(
customTemplate ?? /* html */
``
);
if (!customTemplate) {
const localeTextFunc = this.getLocaleTextFunc();
setTimeout(() => {
this.getGui().textContent = localeTextFunc("loadingOoo", "Loading...");
});
}
}
};
// packages/ag-grid-community/src/rendering/overlays/noRowsOverlayComponent.ts
var NoRowsOverlayComponent2 = class extends OverlayComponent {
init() {
const customTemplate = _makeNull(this.gos.get("overlayNoRowsTemplate")?.trim());
this.setTemplate(customTemplate ?? /* html */
``);
if (!customTemplate) {
const localeTextFunc = this.getLocaleTextFunc();
setTimeout(() => {
this.getGui().textContent = localeTextFunc("noRowsToShow", "No Rows To Show");
});
}
}
};
// packages/ag-grid-community/src/utils/icon.ts
function _createIcon(iconName, beans, column) {
const iconContents = _createIconNoSpan(iconName, beans, column);
if (iconContents) {
const { className } = iconContents;
if (typeof className === "string" && className.indexOf("ag-icon") > -1 || typeof className === "object" && className["ag-icon"]) {
return iconContents;
}
}
const eResult = document.createElement("span");
eResult.appendChild(iconContents);
return eResult;
}
function _createIconNoSpan(iconName, beans, column) {
let userProvidedIcon = null;
if (iconName === "smallDown") {
_warn(262);
} else if (iconName === "smallLeft") {
_warn(263);
} else if (iconName === "smallRight") {
_warn(264);
}
const icons = column && column.getColDef().icons;
if (icons) {
userProvidedIcon = icons[iconName];
}
if (beans.gos && !userProvidedIcon) {
const optionsIcons = beans.gos.get("icons");
if (optionsIcons) {
userProvidedIcon = optionsIcons[iconName];
}
}
if (userProvidedIcon) {
let rendererResult;
if (typeof userProvidedIcon === "function") {
rendererResult = userProvidedIcon();
} else if (typeof userProvidedIcon === "string") {
rendererResult = userProvidedIcon;
} else {
_warn(38, { iconName });
return void 0;
}
if (typeof rendererResult === "string") {
return _loadTemplate(rendererResult);
}
if (_isNodeOrElement(rendererResult)) {
return rendererResult;
}
_warn(133, { iconName });
return void 0;
} else {
const span = document.createElement("span");
const iconValue = beans.registry.getIcon(iconName);
if (!iconValue) {
beans.validation?.validateIcon(iconName);
}
const cssClass = iconValue ?? iconName;
span.setAttribute("class", `ag-icon ag-icon-${cssClass}`);
span.setAttribute("unselectable", "on");
_setAriaRole(span, "presentation");
return span;
}
}
// packages/ag-grid-community/src/dragAndDrop/dragAndDropImageComponent.css-GENERATED.ts
var dragAndDropImageComponentCSS = (
/*css*/
`.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}`
);
// packages/ag-grid-community/src/dragAndDrop/dragAndDropImageComponent.ts
var DragAndDropImageComponent2 = class extends Component {
constructor() {
super();
this.dragSource = null;
this.eIcon = RefPlaceholder;
this.eLabel = RefPlaceholder;
this.registerCSS(dragAndDropImageComponentCSS);
}
postConstruct() {
const create = (iconName) => _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;
_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;
}
};
// packages/ag-grid-community/src/widgets/agAbstractLabel.css-GENERATED.ts
var agAbstractLabelCSS = (
/*css*/
`.ag-label{white-space:nowrap}:where(.ag-ltr) .ag-label{margin-right:var(--ag-spacing)}:where(.ag-rtl) .ag-label{margin-left:var(--ag-spacing)}:where(.ag-label-align-right) .ag-label{order:1}:where(.ag-ltr) :where(.ag-label-align-right) .ag-label{margin-left:var(--ag-spacing)}:where(.ag-rtl) :where(.ag-label-align-right) .ag-label{margin-right:var(--ag-spacing)}.ag-label-align-right>*{flex:none}.ag-label-align-top{align-items:flex-start;flex-direction:column;>*{align-self:stretch}}.ag-label-ellipsis{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:where(.ag-label-align-top) .ag-label{margin-bottom:calc(var(--ag-spacing)*.5)}`
);
// packages/ag-grid-community/src/widgets/agAbstractLabel.ts
var AgAbstractLabel = class extends Component {
constructor(config, template, components) {
super(template, components);
this.labelSeparator = "";
this.labelAlignment = "left";
this.disabled = false;
this.label = "";
this.config = config || {};
this.registerCSS(agAbstractLabelCSS);
}
postConstruct() {
this.addCssClass("ag-labeled");
this.eLabel.classList.add("ag-label");
const { labelSeparator, label, labelWidth, labelAlignment, disabled } = this.config;
if (disabled != null) {
this.setDisabled(disabled);
}
if (labelSeparator != null) {
this.setLabelSeparator(labelSeparator);
}
if (label != null) {
this.setLabel(label);
}
if (labelWidth != null) {
this.setLabelWidth(labelWidth);
}
this.setLabelAlignment(labelAlignment || this.labelAlignment);
this.refreshLabel();
}
refreshLabel() {
const { label, eLabel } = this;
_clearElement(eLabel);
if (typeof label === "string") {
eLabel.innerText = label + this.labelSeparator;
} else if (label) {
eLabel.appendChild(label);
}
if (label === "") {
_setDisplayed(eLabel, false);
_setAriaRole(eLabel, "presentation");
} else {
_setDisplayed(eLabel, true);
_setAriaRole(eLabel, null);
}
}
setLabelSeparator(labelSeparator) {
if (this.labelSeparator === labelSeparator) {
return this;
}
this.labelSeparator = labelSeparator;
if (this.label != null) {
this.refreshLabel();
}
return this;
}
getLabelId() {
const eLabel = this.eLabel;
eLabel.id = eLabel.id || `ag-${this.getCompId()}-label`;
return eLabel.id;
}
getLabel() {
return this.label;
}
setLabel(label) {
if (this.label === label) {
return this;
}
this.label = label;
this.refreshLabel();
return this;
}
setLabelAlignment(alignment) {
const eGui = this.getGui();
const eGuiClassList = eGui.classList;
eGuiClassList.toggle("ag-label-align-left", alignment === "left");
eGuiClassList.toggle("ag-label-align-right", alignment === "right");
eGuiClassList.toggle("ag-label-align-top", alignment === "top");
return this;
}
setLabelEllipsis(hasEllipsis) {
this.eLabel.classList.toggle("ag-label-ellipsis", hasEllipsis);
return this;
}
setLabelWidth(width) {
if (this.label == null) {
return this;
}
_setElementWidth(this.eLabel, width);
return this;
}
setDisabled(disabled) {
disabled = !!disabled;
const element = this.getGui();
_setDisabled(element, disabled);
element.classList.toggle("ag-disabled", disabled);
this.disabled = disabled;
return this;
}
isDisabled() {
return !!this.disabled;
}
};
// packages/ag-grid-community/src/widgets/agAbstractField.ts
var AgAbstractField = class extends AgAbstractLabel {
constructor(config, template, components, className) {
super(config, template, components);
this.className = className;
}
postConstruct() {
super.postConstruct();
const { width, value, onValueChange } = this.config;
if (width != null) {
this.setWidth(width);
}
if (value != null) {
this.setValue(value);
}
if (onValueChange != null) {
this.onValueChange(onValueChange);
}
if (this.className) {
this.addCssClass(this.className);
}
this.refreshAriaLabelledBy();
}
setLabel(label) {
super.setLabel(label);
this.refreshAriaLabelledBy();
return this;
}
refreshAriaLabelledBy() {
const ariaEl = this.getAriaElement();
const labelId = this.getLabelId();
const label = this.getLabel();
if (label == null || label == "" || _getAriaLabel(ariaEl) !== null) {
_setAriaLabelledBy(ariaEl, "");
} else {
_setAriaLabelledBy(ariaEl, labelId ?? "");
}
}
setAriaLabel(label) {
_setAriaLabel(this.getAriaElement(), label);
this.refreshAriaLabelledBy();
return this;
}
onValueChange(callbackFn) {
this.addManagedListeners(this, { fieldValueChanged: () => callbackFn(this.getValue()) });
return this;
}
getWidth() {
return this.getGui().clientWidth;
}
setWidth(width) {
_setFixedWidth(this.getGui(), width);
return this;
}
getPreviousValue() {
return this.previousValue;
}
getValue() {
return this.value;
}
setValue(value, silent) {
if (this.value === value) {
return this;
}
this.previousValue = this.value;
this.value = value;
if (!silent) {
this.dispatchLocalEvent({ type: "fieldValueChanged" });
}
return this;
}
};
// packages/ag-grid-community/src/widgets/agAbstractInputField.ts
var AgAbstractInputField = class extends AgAbstractField {
constructor(config, className, inputType = "text", displayFieldTag = "input") {
super(
config,
config?.template ?? /* html */
`
<${displayFieldTag} data-ref="eInput" class="ag-input-field-input">${displayFieldTag}>
`,
[],
className
);
this.inputType = inputType;
this.displayFieldTag = displayFieldTag;
this.eLabel = RefPlaceholder;
this.eWrapper = RefPlaceholder;
this.eInput = RefPlaceholder;
}
postConstruct() {
super.postConstruct();
this.setInputType();
const { eLabel, eWrapper, eInput, className } = this;
eLabel.classList.add(`${className}-label`);
eWrapper.classList.add(`${className}-input-wrapper`);
eInput.classList.add(`${className}-input`);
this.addCssClass("ag-input-field");
eInput.id = eInput.id || `ag-${this.getCompId()}-input`;
const { inputName, inputWidth } = this.config;
if (inputName != null) {
this.setInputName(inputName);
}
if (inputWidth != null) {
this.setInputWidth(inputWidth);
}
this.addInputListeners();
this.activateTabIndex([eInput]);
}
addInputListeners() {
this.addManagedElementListeners(this.eInput, { input: (e) => this.setValue(e.target.value) });
}
setInputType() {
if (this.displayFieldTag === "input") {
this.eInput.setAttribute("type", this.inputType);
}
}
getInputElement() {
return this.eInput;
}
setInputWidth(width) {
_setElementWidth(this.eWrapper, width);
return this;
}
setInputName(name) {
this.getInputElement().setAttribute("name", name);
return this;
}
getFocusableElement() {
return this.eInput;
}
setMaxLength(length) {
const eInput = this.eInput;
eInput.maxLength = length;
return this;
}
setInputPlaceholder(placeholder) {
_addOrRemoveAttribute(this.eInput, "placeholder", placeholder);
return this;
}
setInputAriaLabel(label) {
_setAriaLabel(this.eInput, label);
this.refreshAriaLabelledBy();
return this;
}
setDisabled(disabled) {
_setDisabled(this.eInput, disabled);
return super.setDisabled(disabled);
}
setAutoComplete(value) {
if (value === true) {
_addOrRemoveAttribute(this.eInput, "autocomplete", null);
} else {
const autoCompleteValue = typeof value === "string" ? value : "off";
_addOrRemoveAttribute(this.eInput, "autocomplete", autoCompleteValue);
}
return this;
}
};
// packages/ag-grid-community/src/widgets/agCheckbox.ts
var AgCheckbox = class extends AgAbstractInputField {
constructor(config, className = "ag-checkbox", inputType = "checkbox") {
super(config, className, inputType);
this.labelAlignment = "right";
this.selected = false;
this.readOnly = false;
this.passive = false;
}
postConstruct() {
super.postConstruct();
const { readOnly, passive } = this.config;
if (typeof readOnly === "boolean")
this.setReadOnly(readOnly);
if (typeof passive === "boolean")
this.setPassive(passive);
}
addInputListeners() {
this.addManagedElementListeners(this.eInput, { click: this.onCheckboxClick.bind(this) });
this.addManagedElementListeners(this.eLabel, { click: this.toggle.bind(this) });
}
getNextValue() {
return this.selected === void 0 ? true : !this.selected;
}
setPassive(passive) {
this.passive = passive;
}
isReadOnly() {
return this.readOnly;
}
setReadOnly(readOnly) {
this.eWrapper.classList.toggle("ag-disabled", readOnly);
this.eInput.disabled = readOnly;
this.readOnly = readOnly;
}
setDisabled(disabled) {
this.eWrapper.classList.toggle("ag-disabled", disabled);
return super.setDisabled(disabled);
}
toggle() {
if (this.eInput.disabled) {
return;
}
const previousValue = this.isSelected();
const nextValue = this.getNextValue();
if (this.passive) {
this.dispatchChange(nextValue, previousValue);
} else {
this.setValue(nextValue);
}
}
getValue() {
return this.isSelected();
}
setValue(value, silent) {
this.refreshSelectedClass(value);
this.setSelected(value, silent);
return this;
}
setName(name) {
const input = this.getInputElement();
input.name = name;
return this;
}
isSelected() {
return this.selected;
}
setSelected(selected, silent) {
if (this.isSelected() === selected) {
return;
}
this.previousValue = this.isSelected();
selected = this.selected = typeof selected === "boolean" ? selected : void 0;
const eInput = this.eInput;
eInput.checked = selected;
eInput.indeterminate = selected === void 0;
if (!silent) {
this.dispatchChange(this.selected, this.previousValue);
}
}
dispatchChange(selected, previousValue, event) {
this.dispatchLocalEvent({ type: "fieldValueChanged", selected, previousValue, event });
const input = this.getInputElement();
this.eventSvc.dispatchEvent({
type: "checkboxChanged",
id: input.id,
name: input.name,
selected,
previousValue
});
}
onCheckboxClick(e) {
if (this.passive || this.eInput.disabled) {
return;
}
const previousValue = this.isSelected();
const selected = this.selected = e.target.checked;
this.refreshSelectedClass(selected);
this.dispatchChange(selected, previousValue, e);
}
refreshSelectedClass(value) {
const classList = this.eWrapper.classList;
classList.toggle("ag-checked", value === true);
classList.toggle("ag-indeterminate", value == null);
}
};
var AgCheckboxSelector = {
selector: "AG-CHECKBOX",
component: AgCheckbox
};
// packages/ag-grid-community/src/rendering/cellRenderers/checkboxCellRenderer.css-GENERATED.ts
var checkboxCellRendererCSS = (
/*css*/
`.ag-checkbox-cell{height:100%}`
);
// packages/ag-grid-community/src/rendering/cellRenderers/checkboxCellRenderer.ts
var CheckboxCellRenderer = class extends Component {
constructor() {
super(
/* html*/
`
`,
[AgCheckboxSelector]
);
this.eCheckbox = RefPlaceholder;
this.registerCSS(checkboxCellRendererCSS);
}
init(params) {
this.refresh(params);
const { eCheckbox, beans } = this;
const inputEl = eCheckbox.getInputElement();
inputEl.setAttribute("tabindex", "-1");
_setAriaLive(inputEl, "polite");
this.addManagedListeners(inputEl, {
click: (event) => {
_stopPropagationForAgGrid(event);
if (eCheckbox.isDisabled()) {
return;
}
const isSelected = eCheckbox.getValue();
this.onCheckboxChanged(isSelected);
},
dblclick: (event) => {
_stopPropagationForAgGrid(event);
}
});
this.addManagedElementListeners(params.eGridCell, {
keydown: (event) => {
if (event.key === KeyCode.SPACE && !eCheckbox.isDisabled()) {
if (params.eGridCell === _getActiveDomElement(beans)) {
eCheckbox.toggle();
}
const isSelected = eCheckbox.getValue();
this.onCheckboxChanged(isSelected);
event.preventDefault();
}
}
});
}
refresh(params) {
this.params = params;
this.updateCheckbox(params);
return true;
}
updateCheckbox(params) {
let isSelected;
let displayed = true;
const { value, column, node } = params;
if (node.group && column) {
if (typeof value === "boolean") {
isSelected = value;
} else {
const colId = column.getColId();
if (colId.startsWith(GROUP_AUTO_COLUMN_ID)) {
isSelected = value == null || value === "" ? void 0 : value === "true";
} else if (node.aggData && node.aggData[colId] !== void 0) {
isSelected = value ?? void 0;
} else {
displayed = false;
}
}
} else {
isSelected = value ?? void 0;
}
const { eCheckbox } = this;
if (!displayed) {
eCheckbox.setDisplayed(false);
return;
}
eCheckbox.setValue(isSelected);
const disabled = params.disabled ?? !column?.isCellEditable(node);
eCheckbox.setDisabled(disabled);
const translate = this.getLocaleTextFunc();
const stateName = _getAriaCheckboxStateName(translate, isSelected);
const ariaLabel = disabled ? stateName : `${translate("ariaToggleCellValue", "Press SPACE to toggle cell value")} (${stateName})`;
eCheckbox.setInputAriaLabel(ariaLabel);
}
onCheckboxChanged(isSelected) {
const { eventSvc, params } = this;
const { column, node, value } = params;
const sharedEventParams = {
column,
colDef: column.getColDef(),
data: node.data,
node,
rowIndex: node.rowIndex,
rowPinned: node.rowPinned,
value
};
eventSvc.dispatchEvent({
type: "cellEditingStarted",
...sharedEventParams
});
const valueChanged = node.setDataValue(column, isSelected, "edit");
eventSvc.dispatchEvent({
type: "cellEditingStopped",
...sharedEventParams,
oldValue: value,
newValue: isSelected,
valueChanged
});
if (!valueChanged) {
this.updateCheckbox(params);
}
}
};
// packages/ag-grid-community/src/clientSideRowModel/abstractClientSideNodeManager.ts
var ROOT_NODE_ID = "ROOT_NODE_ID";
var AbstractClientSideNodeManager = class extends BeanStub {
constructor() {
super(...arguments);
this.nextId = 0;
this.allNodesMap = {};
this.rootNode = null;
}
get treeData() {
return false;
}
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();
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();
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 = _getRowIdCallback(this.gos);
const reorder = !this.gos.get("suppressMaintainUnsortedOrder");
const changedRowNodes = params.changedRowNodes;
const processedNodes = /* @__PURE__ */ 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);
prevSourceRowIndex = sourceRowIndex;
}
if (node.data !== data) {
nodesUpdated = true;
node.updateData(data);
changedRowNodes.update(node);
}
}
processedNodes.add(node);
}
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);
let writeIdx = 0;
if (!reorder) {
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();
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 = _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) {
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;
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) {
const nodesBeforeIndex = allLeafChildren.slice(0, addIndex);
const nodesAfterIndex = allLeafChildren.slice(addIndex, allLeafChildren.length);
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];
result.rowsInserted = true;
} else {
allLeafChildren = allLeafChildren.concat(newNodes);
}
rootNode.allLeafChildren = allLeafChildren;
const sibling = rootNode.sibling;
if (sibling) {
sibling.allLeafChildren = allLeafChildren;
}
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);
}
rowNode.clearRowTopAndRowIndex();
rowIdsRemoved[rowNode.id] = true;
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;
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
});
}
selectionSvc?.updateGroupsFromChildrenSelections?.(source);
if (selectionChanged) {
this.eventSvc.dispatchEvent({
type: "selectionChanged",
source
});
}
}
sanitizeAddIndex(addIndex) {
const allChildrenCount = this.rootNode.allLeafChildren?.length ?? 0;
if (addIndex < 0 || addIndex >= allChildrenCount || Number.isNaN(addIndex)) {
return allChildrenCount;
}
return Math.ceil(addIndex);
}
createRowNode(data, sourceRowIndex) {
const node = new 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]) {
_warn(2, { nodeId: node.id });
}
this.allNodesMap[node.id] = node;
this.nextId++;
return node;
}
lookupRowNode(getRowIdFunc, data) {
let rowNode;
if (getRowIdFunc) {
const id = getRowIdFunc({ data, level: 0 });
rowNode = this.allNodesMap[id];
if (!rowNode) {
_error(4, { id });
return null;
}
} else {
rowNode = this.rootNode?.allLeafChildren?.find((node) => node.data === data);
if (!rowNode) {
_error(5, { data });
return null;
}
}
return rowNode || null;
}
};
// packages/ag-grid-community/src/interfaces/serverSideTransaction.ts
var ServerSideTransactionResultStatus = /* @__PURE__ */ ((ServerSideTransactionResultStatus2) => {
ServerSideTransactionResultStatus2["Applied"] = "Applied";
ServerSideTransactionResultStatus2["StoreNotFound"] = "StoreNotFound";
ServerSideTransactionResultStatus2["StoreLoading"] = "StoreLoading";
ServerSideTransactionResultStatus2["StoreWaitingToLoad"] = "StoreWaitingToLoad";
ServerSideTransactionResultStatus2["StoreLoadingFailed"] = "StoreLoadingFailed";
ServerSideTransactionResultStatus2["StoreWrongType"] = "StoreWrongType";
ServerSideTransactionResultStatus2["Cancelled"] = "Cancelled";
ServerSideTransactionResultStatus2["StoreNotStarted"] = "StoreNotStarted";
return ServerSideTransactionResultStatus2;
})(ServerSideTransactionResultStatus || {});
// packages/ag-grid-community/src/selection/checkboxSelectionComponent.ts
var CheckboxSelectionComponent = class extends Component {
constructor() {
super(
/* html*/
`
`,
[AgCheckboxSelector]
);
this.eCheckbox = RefPlaceholder;
}
postConstruct() {
this.eCheckbox.setPassive(true);
}
getCheckboxId() {
return this.eCheckbox.getInputElement().id;
}
onDataChanged() {
this.onSelectionChanged();
}
onSelectableChanged() {
this.showOrHideSelect();
}
onSelectionChanged() {
const translate = this.getLocaleTextFunc();
const { rowNode, eCheckbox } = this;
const state = rowNode.isSelected();
const stateName = _getAriaCheckboxStateName(translate, state);
const [ariaKey, ariaLabel] = rowNode.selectable ? ["ariaRowToggleSelection", "Press Space to toggle row selection"] : ["ariaRowSelectionDisabled", "Row Selection is disabled for this row"];
const translatedLabel = translate(ariaKey, ariaLabel);
eCheckbox.setValue(state, true);
eCheckbox.setInputAriaLabel(`${translatedLabel} (${stateName})`);
}
init(params) {
this.rowNode = params.rowNode;
this.column = params.column;
this.overrides = params.overrides;
this.onSelectionChanged();
this.addManagedListeners(this.eCheckbox.getInputElement(), {
// we don't want double click on this icon to open a group
dblclick: _stopPropagationForAgGrid,
click: (event) => {
_stopPropagationForAgGrid(event);
this.beans.selectionSvc?.handleSelectionEvent(event, this.rowNode, "checkboxSelected");
}
});
this.addManagedListeners(this.rowNode, {
rowSelected: this.onSelectionChanged.bind(this),
dataChanged: this.onDataChanged.bind(this),
selectableChanged: this.onSelectableChanged.bind(this)
});
this.addManagedPropertyListener("rowSelection", ({ currentValue, previousValue }) => {
const curr = typeof currentValue === "object" ? _getHideDisabledCheckboxes(currentValue) : void 0;
const prev = typeof previousValue === "object" ? _getHideDisabledCheckboxes(previousValue) : void 0;
if (curr !== prev) {
this.onSelectableChanged();
}
});
const isRowSelectableFunc = _getIsRowSelectable(this.gos);
const checkboxVisibleIsDynamic = isRowSelectableFunc || typeof this.getIsVisible() === "function";
if (checkboxVisibleIsDynamic) {
const showOrHideSelectListener = this.showOrHideSelect.bind(this);
this.addManagedEventListeners({ displayedColumnsChanged: showOrHideSelectListener });
this.addManagedListeners(this.rowNode, {
dataChanged: showOrHideSelectListener,
cellChanged: showOrHideSelectListener
});
this.showOrHideSelect();
}
this.eCheckbox.getInputElement().setAttribute("tabindex", "-1");
}
showOrHideSelect() {
const { column, rowNode, overrides, gos } = this;
let selectable = rowNode.selectable;
const isVisible = this.getIsVisible();
if (selectable) {
if (typeof isVisible === "function") {
const extraParams = overrides?.callbackParams;
if (!column) {
selectable = isVisible({ ...extraParams, node: rowNode, data: rowNode.data });
} else {
const params = column.createColumnFunctionCallbackParams(rowNode);
selectable = isVisible({ ...extraParams, ...params });
}
} else {
selectable = isVisible ?? false;
}
}
const so = gos.get("rowSelection");
const disableInsteadOfHide = so && typeof so !== "string" ? !_getHideDisabledCheckboxes(so) : column?.getColDef().showDisabledCheckboxes;
if (disableInsteadOfHide) {
this.eCheckbox.setDisabled(!selectable);
this.setVisible(true);
this.setDisplayed(true);
return;
}
if (overrides?.removeHidden) {
this.setDisplayed(selectable);
return;
}
this.setVisible(selectable);
}
getIsVisible() {
const overrides = this.overrides;
if (overrides) {
return overrides.isVisible;
}
const so = this.gos.get("rowSelection");
if (so && typeof so !== "string") {
return _getCheckboxes(so);
}
return this.column?.getColDef()?.checkboxSelection;
}
};
// packages/ag-grid-community/src/selection/rowRangeSelectionContext.ts
var RowRangeSelectionContext = class {
constructor(rowModel) {
this.rowModel = rowModel;
/** Whether the user is currently selecting all nodes either via the header checkbox or API */
this.selectAll = false;
this.rootId = null;
/**
* Note that the "end" `RowNode` may come before or after the "root" `RowNode` in the
* actual grid.
*/
this.endId = null;
this.cachedRange = [];
}
reset() {
this.rootId = null;
this.endId = null;
this.cachedRange.length = 0;
}
setRoot(node) {
this.rootId = node.id;
this.endId = null;
this.cachedRange.length = 0;
}
setEndRange(end) {
this.endId = end.id;
this.cachedRange.length = 0;
}
getRange() {
if (this.cachedRange.length === 0) {
const root = this.getRoot();
const end = this.getEnd();
if (root == null || end == null) {
return this.cachedRange;
}
this.cachedRange = this.rowModel.getNodesInRangeForSelection(root, end) ?? [];
}
return this.cachedRange;
}
isInRange(node) {
if (this.rootId === null) {
return false;
}
return this.getRange().some((nodeInRange) => nodeInRange.id === node.id);
}
getRoot(fallback) {
if (this.rootId) {
return this.rowModel.getRowNode(this.rootId) ?? null;
}
if (fallback) {
this.setRoot(fallback);
return fallback;
}
return null;
}
getEnd() {
if (this.endId) {
return this.rowModel.getRowNode(this.endId) ?? null;
}
return null;
}
/**
* Truncates the range to the given node (assumed to be within the current range).
* Returns nodes that remain in the current range and those that should be removed
*
* @param node - Node at which to truncate the range
* @returns Object of nodes to either keep or discard (i.e. deselect) from the range
*/
truncate(node) {
const range = this.getRange();
if (range.length === 0) {
return { keep: [], discard: [] };
}
const discardAfter = range[0].id === this.rootId;
const idx = range.findIndex((rowNode) => rowNode.id === node.id);
if (idx > -1) {
const above = range.slice(0, idx);
const below = range.slice(idx + 1);
this.setEndRange(node);
return discardAfter ? { keep: above, discard: below } : { keep: below, discard: above };
} else {
return { keep: range, discard: [] };
}
}
/**
* Extends the range to the given node. Returns nodes that remain in the current range
* and those that should be removed.
*
* @param node - Node marking the new end of the range
* @returns Object of nodes to either keep or discard (i.e. deselect) from the range
*/
extend(node, groupSelectsChildren = false) {
const root = this.getRoot();
if (root == null) {
const keep = this.getRange().slice();
if (groupSelectsChildren) {
node.depthFirstSearch((node2) => !node2.group && keep.push(node2));
}
keep.push(node);
this.setRoot(node);
return { keep, discard: [] };
}
const newRange = this.rowModel.getNodesInRangeForSelection(root, node);
if (!newRange) {
this.setRoot(node);
return { keep: [node], discard: [] };
}
if (newRange.find((newRangeNode) => newRangeNode.id === this.endId)) {
this.setEndRange(node);
return { keep: this.getRange(), discard: [] };
} else {
const discard = this.getRange().slice();
this.setEndRange(node);
return { keep: this.getRange(), discard };
}
}
};
// packages/ag-grid-community/src/selection/selectAllFeature.ts
var SelectAllFeature = class extends BeanStub {
constructor(column) {
super();
this.column = column;
this.cbSelectAllVisible = false;
this.processingEventFromCheckbox = false;
}
onSpaceKeyDown(e) {
const checkbox = this.cbSelectAll;
if (checkbox.isDisplayed() && !checkbox.getGui().contains(_getActiveDomElement(this.beans))) {
e.preventDefault();
checkbox.setValue(!checkbox.getValue());
}
}
getCheckboxGui() {
return this.cbSelectAll.getGui();
}
setComp(ctrl) {
this.headerCellCtrl = ctrl;
const cbSelectAll = this.createManagedBean(new AgCheckbox());
this.cbSelectAll = cbSelectAll;
cbSelectAll.addCssClass("ag-header-select-all");
_setAriaRole(cbSelectAll.getGui(), "presentation");
this.showOrHideSelectAll();
this.addManagedEventListeners({
newColumnsLoaded: () => this.showOrHideSelectAll(),
displayedColumnsChanged: this.onDisplayedColumnsChanged.bind(this),
selectionChanged: this.onSelectionChanged.bind(this),
paginationChanged: this.onSelectionChanged.bind(this),
modelUpdated: this.onModelChanged.bind(this)
});
this.addManagedPropertyListener("rowSelection", ({ currentValue, previousValue }) => {
const getSelectAll = (rowSelection) => typeof rowSelection === "string" || !rowSelection || rowSelection.mode === "singleRow" ? void 0 : rowSelection.selectAll;
if (getSelectAll(currentValue) !== getSelectAll(previousValue)) {
this.showOrHideSelectAll();
}
});
this.addManagedListeners(cbSelectAll, { fieldValueChanged: this.onCbSelectAll.bind(this) });
cbSelectAll.getInputElement().setAttribute("tabindex", "-1");
this.refreshSelectAllLabel();
}
onDisplayedColumnsChanged(e) {
if (!this.isAlive()) {
return;
}
this.showOrHideSelectAll(e.source === "uiColumnMoved");
}
showOrHideSelectAll(fromColumnMoved = false) {
const cbSelectAllVisible = this.isCheckboxSelection();
this.cbSelectAllVisible = cbSelectAllVisible;
this.cbSelectAll.setDisplayed(cbSelectAllVisible);
if (cbSelectAllVisible) {
this.checkRightRowModelType("selectAllCheckbox");
this.checkSelectionType("selectAllCheckbox");
this.updateStateOfCheckbox();
}
this.refreshSelectAllLabel(fromColumnMoved);
}
onModelChanged() {
if (!this.cbSelectAllVisible) {
return;
}
this.updateStateOfCheckbox();
}
onSelectionChanged() {
if (!this.cbSelectAllVisible) {
return;
}
this.updateStateOfCheckbox();
}
updateStateOfCheckbox() {
if (this.processingEventFromCheckbox) {
return;
}
this.processingEventFromCheckbox = true;
const selectAllMode = this.getSelectAllMode();
const selectionSvc = this.beans.selectionSvc;
const cbSelectAll = this.cbSelectAll;
const allSelected = selectionSvc.getSelectAllState(selectAllMode);
cbSelectAll.setValue(allSelected);
const hasNodesToSelect = selectionSvc.hasNodesToSelect(selectAllMode);
cbSelectAll.setDisabled(!hasNodesToSelect);
this.refreshSelectAllLabel();
this.processingEventFromCheckbox = false;
}
refreshSelectAllLabel(fromColumnMoved = false) {
const translate = this.getLocaleTextFunc();
const { headerCellCtrl, cbSelectAll, cbSelectAllVisible } = this;
const checked = cbSelectAll.getValue();
const ariaStatus = checked ? translate("ariaChecked", "checked") : translate("ariaUnchecked", "unchecked");
const ariaLabel = translate("ariaRowSelectAll", "Press Space to toggle all rows selection");
headerCellCtrl.setAriaDescriptionProperty(
"selectAll",
cbSelectAllVisible ? `${ariaLabel} (${ariaStatus})` : null
);
cbSelectAll.setInputAriaLabel(translate("ariaHeaderSelection", "Column with Header Selection"));
if (!fromColumnMoved) {
headerCellCtrl.announceAriaDescription();
}
}
checkSelectionType(feature) {
const isMultiSelect = _isMultiRowSelection(this.gos);
if (!isMultiSelect) {
_warn(128, { feature });
return false;
}
return true;
}
checkRightRowModelType(feature) {
const { gos, rowModel } = this.beans;
const rowModelMatches = _isClientSideRowModel(gos) || _isServerSideRowModel(gos);
if (!rowModelMatches) {
_warn(129, { feature, rowModel: rowModel.getType() });
return false;
}
return true;
}
onCbSelectAll() {
if (this.processingEventFromCheckbox) {
return;
}
if (!this.cbSelectAllVisible) {
return;
}
const value = this.cbSelectAll.getValue();
const selectAll2 = this.getSelectAllMode();
let source = "uiSelectAll";
if (selectAll2 === "currentPage") {
source = "uiSelectAllCurrentPage";
} else if (selectAll2 === "filtered") {
source = "uiSelectAllFiltered";
}
const params = { source, selectAll: selectAll2 };
const selectionSvc = this.beans.selectionSvc;
if (value) {
selectionSvc.selectAllRowNodes(params);
} else {
selectionSvc.deselectAllRowNodes(params);
}
}
/**
* Checkbox is enabled when either the `headerCheckbox` option is enabled in the new selection API
* or `headerCheckboxSelection` is enabled in the legacy API.
*/
isCheckboxSelection() {
const { column, gos, beans } = this;
const rowSelection = gos.get("rowSelection");
const colDef = column.getColDef();
const { headerCheckboxSelection } = colDef;
let result = false;
const newHeaderCheckbox = typeof rowSelection === "object";
if (newHeaderCheckbox) {
const isSelectionCol = isColumnSelectionCol(column);
const isAutoCol = isColumnGroupAutoCol(column);
const location = _getCheckboxLocation(rowSelection);
if (location === "autoGroupColumn" && isAutoCol || isSelectionCol && beans.selectionColSvc?.isSelectionColumnEnabled()) {
result = _getHeaderCheckbox(rowSelection);
}
} else {
if (typeof headerCheckboxSelection === "function") {
result = headerCheckboxSelection(_addGridCommonParams(gos, { column, colDef }));
} else {
result = !!headerCheckboxSelection;
}
}
const featureName = newHeaderCheckbox ? "headerCheckbox" : "headerCheckboxSelection";
return result && this.checkRightRowModelType(featureName) && this.checkSelectionType(featureName);
}
getSelectAllMode() {
const selectAll2 = _getSelectAll(this.gos, false);
if (selectAll2) {
return selectAll2;
}
const { headerCheckboxSelectionCurrentPageOnly, headerCheckboxSelectionFilteredOnly } = this.column.getColDef();
if (headerCheckboxSelectionCurrentPageOnly) {
return "currentPage";
}
if (headerCheckboxSelectionFilteredOnly) {
return "filtered";
}
return "all";
}
};
// packages/ag-grid-community/src/selection/baseSelectionService.ts
var BaseSelectionService = class extends BeanStub {
postConstruct() {
const { gos, beans } = this;
this.selectionCtx = new RowRangeSelectionContext(beans.rowModel);
this.addManagedPropertyListeners(["isRowSelectable", "rowSelection"], () => {
const callback = _getIsRowSelectable(gos);
if (callback !== this.isRowSelectable) {
this.isRowSelectable = callback;
this.updateSelectable();
}
});
this.isRowSelectable = _getIsRowSelectable(gos);
}
destroy() {
super.destroy();
this.selectionCtx.reset();
}
createCheckboxSelectionComponent() {
return new CheckboxSelectionComponent();
}
createSelectAllFeature(column) {
return new SelectAllFeature(column);
}
isMultiSelect() {
return _isMultiRowSelection(this.gos);
}
onRowCtrlSelected(rowCtrl, hasFocusFunc, gui) {
const selected = !!rowCtrl.rowNode.isSelected();
rowCtrl.forEachGui(gui, (gui2) => {
gui2.rowComp.addOrRemoveCssClass("ag-row-selected", selected);
const element = gui2.element;
_setAriaSelected(element, selected);
const hasFocus = element.contains(_getActiveDomElement(this.beans));
if (hasFocus) {
hasFocusFunc(gui2);
}
});
}
announceAriaRowSelection(rowNode) {
if (this.isRowSelectionBlocked(rowNode)) {
return;
}
const selected = rowNode.isSelected();
if (!rowNode.selectable) {
return;
}
const translate = this.getLocaleTextFunc();
const label = translate(
selected ? "ariaRowDeselect" : "ariaRowSelect",
`Press SPACE to ${selected ? "deselect" : "select"} this row`
);
this.beans.ariaAnnounce?.announceValue(label, "rowSelection");
}
dispatchSelectionChanged(source) {
this.eventSvc.dispatchEvent({
type: "selectionChanged",
source
});
}
isRowSelectionBlocked(rowNode) {
return !rowNode.selectable || !!rowNode.rowPinned || !_isRowSelection(this.gos);
}
updateRowSelectable(rowNode, suppressSelectionUpdate) {
const selectable = this.isRowSelectable?.(rowNode) ?? true;
this.setRowSelectable(rowNode, selectable, suppressSelectionUpdate);
return selectable;
}
setRowSelectable(rowNode, newVal, suppressSelectionUpdate) {
if (rowNode.selectable !== newVal) {
rowNode.selectable = newVal;
rowNode.dispatchRowEvent("selectableChanged");
if (suppressSelectionUpdate) {
return;
}
const isGroupSelectsChildren = _getGroupSelectsDescendants(this.gos);
if (isGroupSelectsChildren) {
const selected = this.calculateSelectedFromChildren(rowNode);
this.setNodesSelected({ nodes: [rowNode], newValue: selected ?? false, source: "selectableChanged" });
return;
}
if (rowNode.isSelected() && !rowNode.selectable) {
this.setNodesSelected({ nodes: [rowNode], newValue: false, source: "selectableChanged" });
}
}
}
calculateSelectedFromChildren(rowNode) {
let atLeastOneSelected = false;
let atLeastOneDeSelected = false;
if (!rowNode.childrenAfterGroup?.length) {
return rowNode.selectable ? rowNode.__selected : null;
}
for (let i = 0; i < rowNode.childrenAfterGroup.length; i++) {
const child = rowNode.childrenAfterGroup[i];
let childState = child.isSelected();
if (!child.selectable) {
const selectable = this.calculateSelectedFromChildren(child);
if (selectable === null) {
continue;
}
childState = selectable;
}
switch (childState) {
case true:
atLeastOneSelected = true;
break;
case false:
atLeastOneDeSelected = true;
break;
default:
return void 0;
}
}
if (atLeastOneSelected && atLeastOneDeSelected) {
return void 0;
}
if (atLeastOneSelected) {
return true;
}
if (atLeastOneDeSelected) {
return false;
}
if (!rowNode.selectable) {
return null;
}
return rowNode.__selected;
}
selectRowNode(rowNode, newValue, e, source = "api") {
const selectionNotAllowed = !rowNode.selectable && newValue;
const selectionNotChanged = rowNode.__selected === newValue;
if (selectionNotAllowed || selectionNotChanged) {
return false;
}
rowNode.__selected = newValue;
rowNode.dispatchRowEvent("rowSelected");
const sibling = rowNode.sibling;
if (sibling && sibling.footer && sibling.__localEventService) {
sibling.dispatchRowEvent("rowSelected");
}
this.eventSvc.dispatchEvent({
..._createGlobalRowEvent(rowNode, this.gos, "rowSelected"),
event: e || null,
source
});
return true;
}
isCellCheckboxSelection(column, rowNode) {
const so = this.gos.get("rowSelection");
if (so && typeof so !== "string") {
const checkbox = isColumnSelectionCol(column) && _getCheckboxes(so);
return column.isColumnFunc(rowNode, checkbox);
} else {
return column.isColumnFunc(rowNode, column.colDef.checkboxSelection);
}
}
inferNodeSelections(node, shiftKey, metaKey, source) {
const { gos, selectionCtx } = this;
const currentSelection = node.isSelected();
const groupSelectsDescendants = _getGroupSelectsDescendants(gos);
const enableClickSelection = _getEnableSelection(gos);
const enableDeselection = _getEnableDeselection(gos);
const isMultiSelect = this.isMultiSelect();
const isRowClicked = source === "rowClicked";
if (isRowClicked && groupSelectsDescendants && node.group)
return null;
if (isRowClicked && !(enableClickSelection || enableDeselection))
return null;
if (shiftKey && metaKey && isMultiSelect) {
const root = selectionCtx.getRoot();
if (!root) {
return null;
} else if (!root.isSelected()) {
const partition = selectionCtx.extend(node, groupSelectsDescendants);
return {
select: [],
deselect: partition.keep,
reset: false
};
} else {
const partition = selectionCtx.isInRange(node) ? selectionCtx.truncate(node) : selectionCtx.extend(node, groupSelectsDescendants);
return {
deselect: partition.discard,
select: partition.keep,
reset: false
};
}
} else if (shiftKey && isMultiSelect) {
const fallback = selectionCtx.selectAll ? this.beans.rowModel.getRow(0) : void 0;
const root = selectionCtx.getRoot(fallback);
const partition = selectionCtx.isInRange(node) ? selectionCtx.truncate(node) : selectionCtx.extend(node, groupSelectsDescendants);
return {
select: partition.keep,
deselect: partition.discard,
reset: selectionCtx.selectAll || !!(root && !root.isSelected())
};
} else if (metaKey) {
selectionCtx.setRoot(node);
if (isRowClicked && currentSelection && !enableDeselection) {
return null;
}
return {
node,
newValue: !currentSelection,
clearSelection: !isMultiSelect
};
} else {
selectionCtx.setRoot(node);
const enableSelectionWithoutKeys = _getEnableSelectionWithoutKeys(gos);
const groupSelectsFiltered = _getGroupSelection(gos) === "filteredDescendants";
const shouldClear = isRowClicked && (!enableSelectionWithoutKeys || !enableClickSelection);
if (groupSelectsFiltered && currentSelection === void 0 && _isClientSideRowModel(gos)) {
return {
node,
newValue: false,
clearSelection: !isMultiSelect || shouldClear
};
}
if (isRowClicked) {
const newValue = currentSelection ? !enableSelectionWithoutKeys : enableClickSelection;
const selectingWhenDisabled = newValue && !enableClickSelection;
const deselectingWhenDisabled = !newValue && !enableDeselection;
const wouldStateBeUnchanged = newValue === currentSelection && !shouldClear;
if (wouldStateBeUnchanged || selectingWhenDisabled || deselectingWhenDisabled)
return null;
return {
node,
newValue,
clearSelection: !isMultiSelect || shouldClear
};
}
return {
node,
newValue: !currentSelection,
clearSelection: !isMultiSelect || shouldClear
};
}
}
};
// packages/ag-grid-community/src/widgets/agRadioButton.ts
var AgRadioButton = class extends AgCheckbox {
constructor(config) {
super(config, "ag-radio-button", "radio");
}
isSelected() {
return this.eInput.checked;
}
toggle() {
if (this.eInput.disabled) {
return;
}
if (!this.isSelected()) {
this.setValue(true);
}
}
addInputListeners() {
super.addInputListeners();
this.addManagedEventListeners({ checkboxChanged: this.onChange.bind(this) });
}
/**
* This ensures that if another radio button in the same named group is selected, we deselect this radio button.
* By default the browser does this for you, but we are managing classes ourselves in order to ensure input
* elements are styled correctly in IE11, and the DOM 'changed' event is only fired when a button is selected,
* not deselected, so we need to use our own event.
*/
onChange(event) {
const eInput = this.eInput;
if (event.selected && event.name && eInput.name && eInput.name === event.name && event.id && eInput.id !== event.id) {
this.setValue(false, true);
}
}
};
// packages/ag-grid-community/src/widgets/agToggleButton.css-GENERATED.ts
var agToggleButtonCSS = (
/*css*/
`.ag-toggle-button{flex:none;min-width:unset;width:unset}.ag-toggle-button-input-wrapper{background-color:var(--ag-toggle-button-off-background-color);border-radius:calc(var(--ag-toggle-button-height)*.5);flex:none;height:var(--ag-toggle-button-height);max-width:var(--ag-toggle-button-width);min-width:var(--ag-toggle-button-width);position:relative;transition:background-color .1s;:where(.ag-toggle-button-input){-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;display:block;height:var(--ag-toggle-button-height);margin:0;max-width:var(--ag-toggle-button-width);min-width:var(--ag-toggle-button-width);opacity:0}&:before{background-color:var(--ag-toggle-button-switch-background-color);border-radius:100%;content:"";display:block;height:calc(var(--ag-toggle-button-height) - var(--ag-toggle-button-switch-inset)*2);left:var(--ag-toggle-button-switch-inset);pointer-events:none;position:absolute;top:var(--ag-toggle-button-switch-inset);transition:left .1s;width:calc(var(--ag-toggle-button-height) - var(--ag-toggle-button-switch-inset)*2)}&.ag-checked{background-color:var(--ag-toggle-button-on-background-color);&:before{left:calc(100% - var(--ag-toggle-button-height) + var(--ag-toggle-button-switch-inset))}}&:focus-within{box-shadow:var(--ag-focus-shadow)}&.ag-disabled{opacity:.5}}`
);
// packages/ag-grid-community/src/widgets/agToggleButton.ts
var AgToggleButton = class extends AgCheckbox {
constructor(config) {
super(config, "ag-toggle-button");
this.registerCSS(agToggleButtonCSS);
}
setValue(value, silent) {
super.setValue(value, silent);
this.addOrRemoveCssClass("ag-selected", this.getValue());
return this;
}
};
var AgToggleButtonSelector = {
selector: "AG-TOGGLE-BUTTON",
component: AgToggleButton
};
// packages/ag-grid-community/src/widgets/agInputTextField.ts
var AgInputTextField = class extends AgAbstractInputField {
constructor(config, className = "ag-text-field", inputType = "text") {
super(config, className, inputType);
}
postConstruct() {
super.postConstruct();
if (this.config.allowedCharPattern) {
this.preventDisallowedCharacters();
}
}
setValue(value, silent) {
const eInput = this.eInput;
if (eInput.value !== value) {
eInput.value = _exists(value) ? value : "";
}
return super.setValue(value, silent);
}
/** Used to set an initial value into the input without necessarily setting `this.value` or triggering events (e.g. to set an invalid value) */
setStartValue(value) {
this.setValue(value, true);
}
preventDisallowedCharacters() {
const pattern = new RegExp(`[${this.config.allowedCharPattern}]`);
const preventCharacters = (event) => {
if (!_isEventFromPrintableCharacter(event)) {
return;
}
if (event.key && !pattern.test(event.key)) {
event.preventDefault();
}
};
this.addManagedListeners(this.eInput, {
keydown: preventCharacters,
paste: (e) => {
const text = e.clipboardData?.getData("text");
if (text && text.split("").some((c) => !pattern.test(c))) {
e.preventDefault();
}
}
});
}
};
var AgInputTextFieldSelector = {
selector: "AG-INPUT-TEXT-FIELD",
component: AgInputTextField
};
// packages/ag-grid-community/src/widgets/agInputTextArea.ts
var AgInputTextArea = class extends AgAbstractInputField {
constructor(config) {
super(config, "ag-text-area", null, "textarea");
}
setValue(value, silent) {
const ret = super.setValue(value, silent);
this.eInput.value = value;
return ret;
}
setCols(cols) {
this.eInput.cols = cols;
return this;
}
setRows(rows) {
this.eInput.rows = rows;
return this;
}
};
var AgInputTextAreaSelector = {
selector: "AG-INPUT-TEXT-AREA",
component: AgInputTextArea
};
// packages/ag-grid-community/src/widgets/agInputNumberField.ts
var AgInputNumberField = class extends AgInputTextField {
constructor(config) {
super(config, "ag-number-field", "number");
}
postConstruct() {
super.postConstruct();
const eInput = this.eInput;
this.addManagedListeners(eInput, {
blur: () => {
const floatedValue = parseFloat(eInput.value);
const value = isNaN(floatedValue) ? "" : this.normalizeValue(floatedValue.toString());
if (this.value !== value) {
this.setValue(value);
}
},
wheel: this.onWheel.bind(this)
});
eInput.step = "any";
const { precision, min, max, step } = this.config;
if (typeof precision === "number")
this.setPrecision(precision);
if (typeof min === "number")
this.setMin(min);
if (typeof max === "number")
this.setMax(max);
if (typeof step === "number")
this.setStep(step);
}
onWheel(e) {
if (_getActiveDomElement(this.beans) === this.eInput) {
e.preventDefault();
}
}
normalizeValue(value) {
if (value === "") {
return "";
}
if (this.precision != null) {
value = this.adjustPrecision(value);
}
const val = parseFloat(value);
const { min, max } = this;
if (min != null && val < min) {
value = min.toString();
} else if (max != null && val > max) {
value = max.toString();
}
return value;
}
adjustPrecision(value, isScientificNotation) {
const precision = this.precision;
if (precision == null) {
return value;
}
if (isScientificNotation) {
const floatString = parseFloat(value).toFixed(precision);
return parseFloat(floatString).toString();
}
const parts = String(value).split(".");
if (parts.length > 1) {
if (parts[1].length <= precision) {
return value;
} else if (precision > 0) {
return `${parts[0]}.${parts[1].slice(0, precision)}`;
}
}
return parts[0];
}
setMin(min) {
if (this.min === min) {
return this;
}
this.min = min;
_addOrRemoveAttribute(this.eInput, "min", min);
return this;
}
setMax(max) {
if (this.max === max) {
return this;
}
this.max = max;
_addOrRemoveAttribute(this.eInput, "max", max);
return this;
}
setPrecision(precision) {
this.precision = precision;
return this;
}
setStep(step) {
if (this.step === step) {
return this;
}
this.step = step;
_addOrRemoveAttribute(this.eInput, "step", step);
return this;
}
setValue(value, silent) {
return this.setValueOrInputValue(
(v) => super.setValue(v, silent),
() => this,
value
);
}
setStartValue(value) {
return this.setValueOrInputValue(
(v) => super.setValue(v, true),
(v) => {
this.eInput.value = v;
},
value
);
}
setValueOrInputValue(setValueFunc, setInputValueOnlyFunc, value) {
if (_exists(value)) {
let setInputValueOnly = this.isScientificNotation(value);
if (setInputValueOnly && this.eInput.validity.valid) {
return setValueFunc(value);
}
if (!setInputValueOnly) {
value = this.adjustPrecision(value);
const normalizedValue = this.normalizeValue(value);
setInputValueOnly = value != normalizedValue;
}
if (setInputValueOnly) {
return setInputValueOnlyFunc(value);
}
}
return setValueFunc(value);
}
getValue() {
const eInput = this.eInput;
if (!eInput.validity.valid) {
return void 0;
}
const inputValue = eInput.value;
if (this.isScientificNotation(inputValue)) {
return this.adjustPrecision(inputValue, true);
}
return super.getValue();
}
isScientificNotation(value) {
return typeof value === "string" && value.includes("e");
}
};
var AgInputNumberFieldSelector = {
selector: "AG-INPUT-NUMBER-FIELD",
component: AgInputNumberField
};
// packages/ag-grid-community/src/utils/date.ts
function _padStartWidthZeros(value, totalStringSize) {
return value.toString().padStart(totalStringSize, "0");
}
function _serialiseDate(date, includeTime = true, separator = "-") {
if (!date) {
return null;
}
let serialised = [date.getFullYear(), date.getMonth() + 1, date.getDate()].map((part) => _padStartWidthZeros(part, 2)).join(separator);
if (includeTime) {
serialised += " " + [date.getHours(), date.getMinutes(), date.getSeconds()].map((part) => _padStartWidthZeros(part, 2)).join(":");
}
return serialised;
}
var calculateOrdinal = (value) => {
if (value > 3 && value < 21) {
return "th";
}
const remainder = value % 10;
switch (remainder) {
case 1:
return "st";
case 2:
return "nd";
case 3:
return "rd";
}
return "th";
};
function _dateToFormattedString(date, format = "YYYY-MM-DD") {
const fullYear = _padStartWidthZeros(date.getFullYear(), 4);
const months = [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
];
const days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
const replace = {
YYYY: () => fullYear.slice(fullYear.length - 4, fullYear.length),
YY: () => fullYear.slice(fullYear.length - 2, fullYear.length),
Y: () => `${date.getFullYear()}`,
MMMM: () => months[date.getMonth()],
MMM: () => months[date.getMonth()].slice(0, 3),
MM: () => _padStartWidthZeros(date.getMonth() + 1, 2),
Mo: () => `${date.getMonth() + 1}${calculateOrdinal(date.getMonth() + 1)}`,
M: () => `${date.getMonth() + 1}`,
Do: () => `${date.getDate()}${calculateOrdinal(date.getDate())}`,
DD: () => _padStartWidthZeros(date.getDate(), 2),
D: () => `${date.getDate()}`,
dddd: () => days[date.getDay()],
ddd: () => days[date.getDay()].slice(0, 3),
dd: () => days[date.getDay()].slice(0, 2),
do: () => `${date.getDay()}${calculateOrdinal(date.getDay())}`,
d: () => `${date.getDay()}`
};
const regexp = new RegExp(Object.keys(replace).join("|"), "g");
return format.replace(regexp, (match) => {
if (match in replace) {
return replace[match]();
}
return match;
});
}
function _parseDateTimeFromString(value) {
if (!value) {
return null;
}
const [dateStr, timeStr] = value.split(" ");
if (!dateStr) {
return null;
}
const fields = dateStr.split("-").map((f) => parseInt(f, 10));
if (fields.filter((f) => !isNaN(f)).length !== 3) {
return null;
}
const [year, month, day] = fields;
const date = new Date(year, month - 1, day);
if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) {
return null;
}
if (!timeStr || timeStr === "00:00:00") {
return date;
}
const [hours, minutes, seconds] = timeStr.split(":").map((part) => parseInt(part, 10));
if (hours >= 0 && hours < 24) {
date.setHours(hours);
}
if (minutes >= 0 && minutes < 60) {
date.setMinutes(minutes);
}
if (seconds >= 0 && seconds < 60) {
date.setSeconds(seconds);
}
return date;
}
// packages/ag-grid-community/src/widgets/agInputDateField.ts
var AgInputDateField = class extends AgInputTextField {
constructor(config) {
super(config, "ag-date-field", "date");
}
postConstruct() {
super.postConstruct();
const usingSafari = _isBrowserSafari();
this.addManagedListeners(this.eInput, {
wheel: this.onWheel.bind(this),
mousedown: () => {
if (this.isDisabled() || usingSafari) {
return;
}
this.eInput.focus();
}
});
this.eInput.step = "any";
}
onWheel(e) {
if (_getActiveDomElement(this.beans) === this.eInput) {
e.preventDefault();
}
}
setMin(minDate) {
const min = minDate instanceof Date ? _serialiseDate(minDate ?? null, false) ?? void 0 : minDate;
if (this.min === min) {
return this;
}
this.min = min;
_addOrRemoveAttribute(this.eInput, "min", min);
return this;
}
setMax(maxDate) {
const max = maxDate instanceof Date ? _serialiseDate(maxDate ?? null, false) ?? void 0 : maxDate;
if (this.max === max) {
return this;
}
this.max = max;
_addOrRemoveAttribute(this.eInput, "max", max);
return this;
}
setStep(step) {
if (this.step === step) {
return this;
}
this.step = step;
_addOrRemoveAttribute(this.eInput, "step", step);
return this;
}
getDate() {
if (!this.eInput.validity.valid) {
return void 0;
}
return _parseDateTimeFromString(this.getValue()) ?? void 0;
}
setDate(date, silent) {
this.setValue(_serialiseDate(date ?? null, false), silent);
}
};
var AgInputDateFieldSelector = {
selector: "AG-INPUT-DATE-FIELD",
component: AgInputDateField
};
// packages/ag-grid-community/src/tooltip/tooltipStateManager.ts
var SHOW_QUICK_TOOLTIP_DIFF = 1e3;
var FADE_OUT_TOOLTIP_TIMEOUT = 1e3;
var INTERACTIVE_HIDE_DELAY = 100;
var lastTooltipHideTime;
var isLocked = false;
var TooltipStateManager = class extends BeanStub {
constructor(tooltipCtrl, getTooltipValue) {
super();
this.tooltipCtrl = tooltipCtrl;
this.getTooltipValue = getTooltipValue;
this.interactionEnabled = false;
this.isInteractingWithTooltip = false;
this.state = 0 /* NOTHING */;
// when showing the tooltip, we need to make sure it's the most recent instance we request, as due to
// async we could request two tooltips before the first instance returns, in which case we should
// disregard the second instance.
this.tooltipInstanceCount = 0;
this.tooltipMouseTrack = false;
}
wireBeans(beans) {
this.popupSvc = beans.popupSvc;
this.userCompFactory = beans.userCompFactory;
}
postConstruct() {
if (this.gos.get("tooltipInteraction")) {
this.interactionEnabled = true;
}
this.tooltipTrigger = this.getTooltipTrigger();
this.tooltipMouseTrack = this.gos.get("tooltipMouseTrack");
const el = this.tooltipCtrl.getGui();
if (this.tooltipTrigger === 0 /* HOVER */) {
this.addManagedListeners(el, {
mouseenter: this.onMouseEnter.bind(this),
mouseleave: this.onMouseLeave.bind(this)
});
}
if (this.tooltipTrigger === 1 /* FOCUS */) {
this.addManagedListeners(el, {
focusin: this.onFocusIn.bind(this),
focusout: this.onFocusOut.bind(this)
});
}
this.addManagedListeners(el, { mousemove: this.onMouseMove.bind(this) });
if (!this.interactionEnabled) {
this.addManagedListeners(el, {
mousedown: this.onMouseDown.bind(this),
keydown: this.onKeyDown.bind(this)
});
}
}
getGridOptionsTooltipDelay(delayOption) {
const delay = this.gos.get(delayOption);
return Math.max(200, delay);
}
getTooltipDelay(type) {
if (type === "show") {
return this.tooltipCtrl.getTooltipShowDelayOverride?.() ?? this.getGridOptionsTooltipDelay("tooltipShowDelay");
}
return this.tooltipCtrl.getTooltipHideDelayOverride?.() ?? this.getGridOptionsTooltipDelay("tooltipHideDelay");
}
destroy() {
this.setToDoNothing();
super.destroy();
}
getTooltipTrigger() {
const trigger = this.gos.get("tooltipTrigger");
if (!trigger || trigger === "hover") {
return 0 /* HOVER */;
}
return 1 /* FOCUS */;
}
onMouseEnter(e) {
if (this.interactionEnabled && this.interactiveTooltipTimeoutId) {
this.unlockService();
this.startHideTimeout();
}
if (_isIOSUserAgent()) {
return;
}
if (isLocked) {
this.showTooltipTimeoutId = window.setTimeout(() => {
this.prepareToShowTooltip(e);
}, INTERACTIVE_HIDE_DELAY);
} else {
this.prepareToShowTooltip(e);
}
}
onMouseMove(e) {
if (this.lastMouseEvent) {
this.lastMouseEvent = e;
}
if (this.tooltipMouseTrack && this.state === 2 /* SHOWING */ && this.tooltipComp) {
this.positionTooltip();
}
}
onMouseDown() {
this.setToDoNothing();
}
onMouseLeave() {
if (this.interactionEnabled) {
this.lockService();
} else {
this.setToDoNothing();
}
}
onFocusIn() {
this.prepareToShowTooltip();
}
onFocusOut(e) {
const relatedTarget = e.relatedTarget;
const parentCompGui = this.tooltipCtrl.getGui();
const tooltipGui = this.tooltipComp?.getGui();
if (this.isInteractingWithTooltip || parentCompGui.contains(relatedTarget) || this.interactionEnabled && tooltipGui?.contains(relatedTarget)) {
return;
}
this.setToDoNothing();
}
onKeyDown() {
if (this.isInteractingWithTooltip) {
this.isInteractingWithTooltip = false;
}
this.setToDoNothing();
}
prepareToShowTooltip(mouseEvent) {
if (this.state != 0 /* NOTHING */ || isLocked) {
return;
}
let delay = 0;
if (mouseEvent) {
delay = this.isLastTooltipHiddenRecently() ? 200 : this.getTooltipDelay("show");
}
this.lastMouseEvent = mouseEvent || null;
this.showTooltipTimeoutId = window.setTimeout(this.showTooltip.bind(this), delay);
this.state = 1 /* WAITING_TO_SHOW */;
}
isLastTooltipHiddenRecently() {
const now = (/* @__PURE__ */ new Date()).getTime();
const then = lastTooltipHideTime;
return now - then < SHOW_QUICK_TOOLTIP_DIFF;
}
setToDoNothing(fromHideTooltip) {
if (!fromHideTooltip && this.state === 2 /* SHOWING */) {
this.hideTooltip();
}
if (this.onBodyScrollEventCallback) {
this.onBodyScrollEventCallback();
this.onBodyScrollEventCallback = void 0;
}
if (this.onColumnMovedEventCallback) {
this.onColumnMovedEventCallback();
this.onColumnMovedEventCallback = void 0;
}
if (this.onDocumentKeyDownCallback) {
this.onDocumentKeyDownCallback();
this.onDocumentKeyDownCallback = void 0;
}
this.clearTimeouts();
this.state = 0 /* NOTHING */;
this.lastMouseEvent = null;
}
showTooltip() {
const value = this.getTooltipValue();
const ctrl = this.tooltipCtrl;
if (!_exists(value) || ctrl.shouldDisplayTooltip && !ctrl.shouldDisplayTooltip()) {
this.setToDoNothing();
return;
}
const rowNode = ctrl.getRowNode?.();
const params = _addGridCommonParams(this.gos, {
location: ctrl.getLocation?.() ?? "UNKNOWN",
//'cell',
colDef: ctrl.getColDef?.(),
column: ctrl.getColumn?.(),
rowIndex: ctrl.getRowIndex?.(),
node: rowNode,
data: rowNode?.data,
value,
valueFormatted: ctrl.getValueFormatted?.(),
hideTooltipCallback: () => this.hideTooltip(true),
...ctrl.getAdditionalParams?.() ?? {}
});
this.state = 2 /* SHOWING */;
this.tooltipInstanceCount++;
const callback = this.newTooltipComponentCallback.bind(this, this.tooltipInstanceCount);
const userDetails = _getTooltipCompDetails(this.userCompFactory, params);
userDetails?.newAgStackInstance().then(callback);
}
hideTooltip(forceHide) {
if (!forceHide && this.isInteractingWithTooltip) {
return;
}
if (this.tooltipComp) {
this.destroyTooltipComp();
lastTooltipHideTime = (/* @__PURE__ */ new Date()).getTime();
}
this.eventSvc.dispatchEvent({
type: "tooltipHide",
parentGui: this.tooltipCtrl.getGui()
});
if (forceHide) {
this.isInteractingWithTooltip = false;
}
this.setToDoNothing(true);
}
newTooltipComponentCallback(tooltipInstanceCopy, tooltipComp) {
const compNoLongerNeeded = this.state !== 2 /* SHOWING */ || this.tooltipInstanceCount !== tooltipInstanceCopy;
if (compNoLongerNeeded) {
this.destroyBean(tooltipComp);
return;
}
const eGui = tooltipComp.getGui();
this.tooltipComp = tooltipComp;
if (!eGui.classList.contains("ag-tooltip")) {
eGui.classList.add("ag-tooltip-custom");
}
if (this.tooltipTrigger === 0 /* HOVER */) {
eGui.classList.add("ag-tooltip-animate");
}
if (this.interactionEnabled) {
eGui.classList.add("ag-tooltip-interactive");
}
const translate = this.getLocaleTextFunc();
const addPopupRes = this.popupSvc?.addPopup({
eChild: eGui,
ariaLabel: translate("ariaLabelTooltip", "Tooltip")
});
if (addPopupRes) {
this.tooltipPopupDestroyFunc = addPopupRes.hideFunc;
}
this.positionTooltip();
if (this.tooltipTrigger === 1 /* FOCUS */) {
const listener = () => this.setToDoNothing();
[this.onBodyScrollEventCallback, this.onColumnMovedEventCallback] = this.addManagedEventListeners({
bodyScroll: listener,
columnMoved: listener
});
}
if (this.interactionEnabled) {
[this.tooltipMouseEnterListener, this.tooltipMouseLeaveListener] = this.addManagedElementListeners(eGui, {
mouseenter: this.onTooltipMouseEnter.bind(this),
mouseleave: this.onTooltipMouseLeave.bind(this)
});
[this.onDocumentKeyDownCallback] = this.addManagedElementListeners(_getDocument(this.beans), {
keydown: (e) => {
if (!eGui.contains(e?.target)) {
this.onKeyDown();
}
}
});
if (this.tooltipTrigger === 1 /* FOCUS */) {
[this.tooltipFocusInListener, this.tooltipFocusOutListener] = this.addManagedElementListeners(eGui, {
focusin: this.onTooltipFocusIn.bind(this),
focusout: this.onTooltipFocusOut.bind(this)
});
}
}
this.eventSvc.dispatchEvent({
type: "tooltipShow",
tooltipGui: eGui,
parentGui: this.tooltipCtrl.getGui()
});
this.startHideTimeout();
}
onTooltipMouseEnter() {
this.isInteractingWithTooltip = true;
this.unlockService();
}
onTooltipMouseLeave() {
if (this.isTooltipFocused()) {
return;
}
this.isInteractingWithTooltip = false;
this.lockService();
}
onTooltipFocusIn() {
this.isInteractingWithTooltip = true;
}
isTooltipFocused() {
const tooltipGui = this.tooltipComp?.getGui();
const activeEl = _getActiveDomElement(this.beans);
return !!tooltipGui && tooltipGui.contains(activeEl);
}
onTooltipFocusOut(e) {
const parentGui = this.tooltipCtrl.getGui();
if (this.isTooltipFocused()) {
return;
}
this.isInteractingWithTooltip = false;
if (parentGui.contains(e.relatedTarget)) {
this.startHideTimeout();
} else {
this.hideTooltip();
}
}
positionTooltip() {
const params = {
type: "tooltip",
ePopup: this.tooltipComp.getGui(),
nudgeY: 18,
skipObserver: this.tooltipMouseTrack
};
if (this.lastMouseEvent) {
this.popupSvc?.positionPopupUnderMouseEvent({
...params,
mouseEvent: this.lastMouseEvent
});
} else {
this.popupSvc?.positionPopupByComponent({
...params,
eventSource: this.tooltipCtrl.getGui(),
position: "under",
keepWithinBounds: true,
nudgeY: 5
});
}
}
destroyTooltipComp() {
this.tooltipComp.getGui().classList.add("ag-tooltip-hiding");
const tooltipPopupDestroyFunc = this.tooltipPopupDestroyFunc;
const tooltipComp = this.tooltipComp;
const delay = this.tooltipTrigger === 0 /* HOVER */ ? FADE_OUT_TOOLTIP_TIMEOUT : 0;
window.setTimeout(() => {
tooltipPopupDestroyFunc();
this.destroyBean(tooltipComp);
}, delay);
this.clearTooltipListeners();
this.tooltipPopupDestroyFunc = void 0;
this.tooltipComp = void 0;
}
clearTooltipListeners() {
[
this.tooltipMouseEnterListener,
this.tooltipMouseLeaveListener,
this.tooltipFocusInListener,
this.tooltipFocusOutListener
].forEach((listener) => {
if (listener) {
listener();
}
});
this.tooltipMouseEnterListener = this.tooltipMouseLeaveListener = this.tooltipFocusInListener = this.tooltipFocusOutListener = null;
}
lockService() {
isLocked = true;
this.interactiveTooltipTimeoutId = window.setTimeout(() => {
this.unlockService();
this.setToDoNothing();
}, INTERACTIVE_HIDE_DELAY);
}
unlockService() {
isLocked = false;
this.clearInteractiveTimeout();
}
startHideTimeout() {
this.clearHideTimeout();
this.hideTooltipTimeoutId = window.setTimeout(this.hideTooltip.bind(this), this.getTooltipDelay("hide"));
}
clearShowTimeout() {
if (!this.showTooltipTimeoutId) {
return;
}
window.clearTimeout(this.showTooltipTimeoutId);
this.showTooltipTimeoutId = void 0;
}
clearHideTimeout() {
if (!this.hideTooltipTimeoutId) {
return;
}
window.clearTimeout(this.hideTooltipTimeoutId);
this.hideTooltipTimeoutId = void 0;
}
clearInteractiveTimeout() {
if (!this.interactiveTooltipTimeoutId) {
return;
}
window.clearTimeout(this.interactiveTooltipTimeoutId);
this.interactiveTooltipTimeoutId = void 0;
}
clearTimeouts() {
this.clearShowTimeout();
this.clearHideTimeout();
this.clearInteractiveTimeout();
}
};
// packages/ag-grid-community/src/tooltip/tooltipFeature.ts
function _isShowTooltipWhenTruncated(gos) {
return gos.get("tooltipShowMode") === "whenTruncated";
}
function _getShouldDisplayTooltip(gos, getElement) {
return _isShowTooltipWhenTruncated(gos) ? _shouldDisplayTooltip(getElement) : void 0;
}
function _shouldDisplayTooltip(getElement) {
return () => {
const element = getElement();
if (!element) {
return true;
}
return element.scrollWidth > element.clientWidth;
};
}
var TooltipFeature = class extends BeanStub {
constructor(ctrl, beans) {
super();
this.ctrl = ctrl;
if (beans) {
this.beans = beans;
}
}
postConstruct() {
this.refreshTooltip();
}
setBrowserTooltip(tooltip) {
const name = "title";
const eGui = this.ctrl.getGui();
if (!eGui) {
return;
}
if (tooltip != null && tooltip != "") {
eGui.setAttribute(name, tooltip);
} else {
eGui.removeAttribute(name);
}
}
updateTooltipText() {
const { getTooltipValue } = this.ctrl;
if (getTooltipValue) {
this.tooltip = getTooltipValue();
}
}
createTooltipFeatureIfNeeded() {
if (this.tooltipManager == null) {
this.tooltipManager = this.createBean(
new TooltipStateManager(this.ctrl, () => this.tooltip),
this.beans.context
);
}
}
setTooltipAndRefresh(tooltip) {
this.tooltip = tooltip;
this.refreshTooltip();
}
refreshTooltip() {
this.browserTooltips = this.beans.gos.get("enableBrowserTooltips");
this.updateTooltipText();
if (this.browserTooltips) {
this.setBrowserTooltip(this.tooltip);
this.tooltipManager = this.destroyBean(this.tooltipManager, this.beans.context);
} else {
this.setBrowserTooltip(null);
this.createTooltipFeatureIfNeeded();
}
}
destroy() {
this.tooltipManager = this.destroyBean(this.tooltipManager, this.beans.context);
super.destroy();
}
};
// packages/ag-grid-community/src/widgets/agList.ts
var AgList = class extends Component {
constructor(cssIdentifier = "default", unFocusable = false) {
super(
/* html */
``
);
this.cssIdentifier = cssIdentifier;
this.unFocusable = unFocusable;
this.activeClass = "ag-active-item";
this.options = [];
this.itemEls = [];
}
postConstruct() {
const eGui = this.getGui();
this.addManagedElementListeners(eGui, { mouseleave: () => this.clearHighlighted() });
if (this.unFocusable) {
return;
}
this.addManagedElementListeners(eGui, { keydown: this.handleKeyDown.bind(this) });
}
handleKeyDown(e) {
const key = e.key;
switch (key) {
case KeyCode.ENTER:
if (!this.highlightedEl) {
this.setValue(this.getValue());
} else {
const pos = this.itemEls.indexOf(this.highlightedEl);
this.setValueByIndex(pos);
}
break;
case KeyCode.DOWN:
case KeyCode.UP:
e.preventDefault();
this.navigate(key);
break;
case KeyCode.PAGE_DOWN:
case KeyCode.PAGE_UP:
case KeyCode.PAGE_HOME:
case KeyCode.PAGE_END:
e.preventDefault();
this.navigateToPage(key);
break;
}
}
navigate(key) {
const isDown = key === KeyCode.DOWN;
let itemToHighlight;
const { itemEls, highlightedEl } = this;
if (!highlightedEl) {
itemToHighlight = itemEls[isDown ? 0 : itemEls.length - 1];
} else {
const currentIdx = itemEls.indexOf(highlightedEl);
let nextPos = currentIdx + (isDown ? 1 : -1);
nextPos = Math.min(Math.max(nextPos, 0), itemEls.length - 1);
itemToHighlight = itemEls[nextPos];
}
this.highlightItem(itemToHighlight);
}
navigateToPage(key) {
const { itemEls, highlightedEl } = this;
if (!highlightedEl || itemEls.length === 0) {
return;
}
const currentIdx = itemEls.indexOf(highlightedEl);
const rowCount = this.options.length - 1;
const itemHeight = itemEls[0].clientHeight;
const pageSize = Math.floor(this.getGui().clientHeight / itemHeight);
let newIndex = -1;
if (key === KeyCode.PAGE_HOME) {
newIndex = 0;
} else if (key === KeyCode.PAGE_END) {
newIndex = rowCount;
} else if (key === KeyCode.PAGE_DOWN) {
newIndex = Math.min(currentIdx + pageSize, rowCount);
} else if (key === KeyCode.PAGE_UP) {
newIndex = Math.max(currentIdx - pageSize, 0);
}
if (newIndex === -1) {
return;
}
this.highlightItem(itemEls[newIndex]);
}
addOptions(listOptions) {
listOptions.forEach((listOption) => this.addOption(listOption));
return this;
}
addOption(listOption) {
const { value, text } = listOption;
const valueToRender = text || value;
this.options.push({ value, text: valueToRender });
this.renderOption(value, valueToRender);
this.updateIndices();
return this;
}
clearOptions() {
this.options = [];
this.reset(true);
this.itemEls.forEach((itemEl) => {
_removeFromParent(itemEl);
});
this.itemEls = [];
}
updateIndices() {
const options = this.getGui().querySelectorAll(".ag-list-item");
options.forEach((option, idx) => {
_setAriaPosInSet(option, idx + 1);
_setAriaSetSize(option, options.length);
});
}
renderOption(value, text) {
const eDocument = _getDocument(this.beans);
const itemEl = eDocument.createElement("div");
_setAriaRole(itemEl, "option");
itemEl.classList.add("ag-list-item", `ag-${this.cssIdentifier}-list-item`);
const span = eDocument.createElement("span");
itemEl.appendChild(span);
span.textContent = text;
if (!this.unFocusable) {
itemEl.tabIndex = -1;
}
this.itemEls.push(itemEl);
this.addManagedListeners(itemEl, {
mouseover: () => this.highlightItem(itemEl),
mousedown: (e) => {
e.preventDefault();
e.stopPropagation();
this.setValue(value);
}
});
this.createOptionalManagedBean(
this.beans.registry.createDynamicBean("tooltipFeature", false, {
getTooltipValue: () => text,
getGui: () => itemEl,
getLocation: () => "UNKNOWN",
// only show tooltips for items where the text cannot be fully displayed
shouldDisplayTooltip: () => span.scrollWidth > span.clientWidth
})
);
this.getGui().appendChild(itemEl);
}
setValue(value, silent) {
if (this.value === value) {
this.fireItemSelected();
return this;
}
if (value == null) {
this.reset(silent);
return this;
}
const idx = this.options.findIndex((option) => option.value === value);
if (idx !== -1) {
const option = this.options[idx];
this.value = option.value;
this.displayValue = option.text;
this.highlightItem(this.itemEls[idx]);
if (!silent) {
this.fireChangeEvent();
}
}
return this;
}
setValueByIndex(idx) {
return this.setValue(this.options[idx].value);
}
getValue() {
return this.value;
}
getDisplayValue() {
return this.displayValue;
}
refreshHighlighted() {
this.clearHighlighted();
const idx = this.options.findIndex((option) => option.value === this.value);
if (idx !== -1) {
this.highlightItem(this.itemEls[idx]);
}
}
reset(silent) {
this.value = null;
this.displayValue = null;
this.clearHighlighted();
if (!silent) {
this.fireChangeEvent();
}
}
highlightItem(el) {
if (!_isVisible(el)) {
return;
}
this.clearHighlighted();
this.highlightedEl = el;
el.classList.add(this.activeClass);
_setAriaSelected(el, true);
const eGui = this.getGui();
const { scrollTop, clientHeight } = eGui;
const { offsetTop, offsetHeight } = el;
if (offsetTop + offsetHeight > scrollTop + clientHeight || offsetTop < scrollTop) {
el.scrollIntoView({ block: "nearest" });
}
if (!this.unFocusable) {
el.focus();
}
}
clearHighlighted() {
const highlightedEl = this.highlightedEl;
if (!highlightedEl || !_isVisible(highlightedEl)) {
return;
}
highlightedEl.classList.remove(this.activeClass);
_setAriaSelected(highlightedEl, false);
this.highlightedEl = null;
}
fireChangeEvent() {
this.dispatchLocalEvent({ type: "fieldValueChanged" });
this.fireItemSelected();
}
fireItemSelected() {
this.dispatchLocalEvent({ type: "selectedItem" });
}
};
// packages/ag-grid-community/src/widgets/agPickerField.css-GENERATED.ts
var agPickerFieldCSS = (
/*css*/
`.ag-picker-field-display{flex:1 1 auto}.ag-picker-field{align-items:center;display:flex}.ag-picker-field-icon{border:0;cursor:pointer;display:flex;margin:0;padding:0}.ag-picker-field-wrapper{background-color:var(--ag-picker-button-background-color);border:var(--ag-picker-button-border);border-radius:5px;min-height:max(var(--ag-list-item-height),calc(var(--ag-spacing)*4));overflow:hidden;&:disabled{opacity:.5}&.ag-picker-has-focus,&:focus-within{background-color:var(--ag-picker-button-focus-background-color);border:var(--ag-picker-button-focus-border);box-shadow:var(--ag-focus-shadow)}}`
);
// packages/ag-grid-community/src/widgets/agPickerField.ts
var AgPickerField = class extends AgAbstractField {
constructor(config) {
super(
config,
config?.template || /* html */
`
`,
config?.agComponents || [],
config?.className
);
this.isPickerDisplayed = false;
this.skipClick = false;
this.pickerGap = 4;
this.hideCurrentPicker = null;
this.eLabel = RefPlaceholder;
this.eWrapper = RefPlaceholder;
this.eDisplayField = RefPlaceholder;
this.eIcon = RefPlaceholder;
this.registerCSS(agPickerFieldCSS);
this.ariaRole = config?.ariaRole;
this.onPickerFocusIn = this.onPickerFocusIn.bind(this);
this.onPickerFocusOut = this.onPickerFocusOut.bind(this);
if (!config) {
return;
}
const { pickerGap, maxPickerHeight, variableWidth, minPickerWidth, maxPickerWidth } = config;
if (pickerGap != null) {
this.pickerGap = pickerGap;
}
this.variableWidth = !!variableWidth;
if (maxPickerHeight != null) {
this.setPickerMaxHeight(maxPickerHeight);
}
if (minPickerWidth != null) {
this.setPickerMinWidth(minPickerWidth);
}
if (maxPickerWidth != null) {
this.setPickerMaxWidth(maxPickerWidth);
}
}
postConstruct() {
super.postConstruct();
this.setupAria();
const displayId = `ag-${this.getCompId()}-display`;
this.eDisplayField.setAttribute("id", displayId);
const ariaEl = this.getAriaElement();
this.addManagedElementListeners(ariaEl, { keydown: this.onKeyDown.bind(this) });
this.addManagedElementListeners(this.eLabel, { mousedown: this.onLabelOrWrapperMouseDown.bind(this) });
this.addManagedElementListeners(this.eWrapper, { mousedown: this.onLabelOrWrapperMouseDown.bind(this) });
const { pickerIcon, inputWidth } = this.config;
if (pickerIcon) {
const icon = _createIconNoSpan(pickerIcon, this.beans);
if (icon) {
this.eIcon.appendChild(icon);
}
}
if (inputWidth != null) {
this.setInputWidth(inputWidth);
}
}
setupAria() {
const ariaEl = this.getAriaElement();
ariaEl.setAttribute("tabindex", this.gos.get("tabIndex").toString());
_setAriaExpanded(ariaEl, false);
if (this.ariaRole) {
_setAriaRole(ariaEl, this.ariaRole);
}
}
onLabelOrWrapperMouseDown(e) {
if (e) {
const focusableEl = this.getFocusableElement();
if (focusableEl !== this.eWrapper && e?.target === focusableEl) {
return;
}
e.preventDefault();
this.getFocusableElement().focus();
}
if (this.skipClick) {
this.skipClick = false;
return;
}
if (this.isDisabled()) {
return;
}
if (this.isPickerDisplayed) {
this.hidePicker();
} else {
this.showPicker();
}
}
onKeyDown(e) {
switch (e.key) {
case KeyCode.UP:
case KeyCode.DOWN:
case KeyCode.ENTER:
case KeyCode.SPACE:
e.preventDefault();
this.onLabelOrWrapperMouseDown();
break;
case KeyCode.ESCAPE:
if (this.isPickerDisplayed) {
e.preventDefault();
e.stopPropagation();
if (this.hideCurrentPicker) {
this.hideCurrentPicker();
}
}
break;
}
}
showPicker() {
this.isPickerDisplayed = true;
if (!this.pickerComponent) {
this.pickerComponent = this.createPickerComponent();
}
const pickerGui = this.pickerComponent.getGui();
pickerGui.addEventListener("focusin", this.onPickerFocusIn);
pickerGui.addEventListener("focusout", this.onPickerFocusOut);
this.hideCurrentPicker = this.renderAndPositionPicker();
this.toggleExpandedStyles(true);
}
renderAndPositionPicker() {
const ePicker = this.pickerComponent.getGui();
if (!this.gos.get("suppressScrollWhenPopupsAreOpen")) {
[this.destroyMouseWheelFunc] = this.addManagedEventListeners({
bodyScroll: () => {
this.hidePicker();
}
});
}
const translate = this.getLocaleTextFunc();
const {
config: { pickerAriaLabelKey, pickerAriaLabelValue, modalPicker = true },
maxPickerHeight,
minPickerWidth,
maxPickerWidth,
variableWidth,
beans,
eWrapper
} = this;
const popupParams = {
modal: modalPicker,
eChild: ePicker,
closeOnEsc: true,
closedCallback: () => {
const shouldRestoreFocus = _isNothingFocused(beans);
this.beforeHidePicker();
if (shouldRestoreFocus && this.isAlive()) {
this.getFocusableElement().focus();
}
},
ariaLabel: translate(pickerAriaLabelKey, pickerAriaLabelValue),
anchorToElement: eWrapper
};
ePicker.style.position = "absolute";
const popupSvc = beans.popupSvc;
const addPopupRes = popupSvc.addPopup(popupParams);
if (variableWidth) {
if (minPickerWidth) {
ePicker.style.minWidth = minPickerWidth;
}
ePicker.style.width = _formatSize(_getAbsoluteWidth(eWrapper));
if (maxPickerWidth) {
ePicker.style.maxWidth = maxPickerWidth;
}
} else {
_setElementWidth(ePicker, maxPickerWidth ?? _getAbsoluteWidth(eWrapper));
}
const maxHeight = maxPickerHeight ?? `${_getInnerHeight(popupSvc.getPopupParent())}px`;
ePicker.style.setProperty("max-height", maxHeight);
this.alignPickerToComponent();
return addPopupRes.hideFunc;
}
alignPickerToComponent() {
if (!this.pickerComponent) {
return;
}
const {
pickerGap,
config: { pickerType },
beans: { popupSvc, gos },
eWrapper,
pickerComponent
} = this;
const alignSide = gos.get("enableRtl") ? "right" : "left";
popupSvc.positionPopupByComponent({
type: pickerType,
eventSource: eWrapper,
ePopup: pickerComponent.getGui(),
position: "under",
alignSide,
keepWithinBounds: true,
nudgeY: pickerGap
});
}
beforeHidePicker() {
if (this.destroyMouseWheelFunc) {
this.destroyMouseWheelFunc();
this.destroyMouseWheelFunc = void 0;
}
this.toggleExpandedStyles(false);
const pickerGui = this.pickerComponent.getGui();
pickerGui.removeEventListener("focusin", this.onPickerFocusIn);
pickerGui.removeEventListener("focusout", this.onPickerFocusOut);
this.isPickerDisplayed = false;
this.pickerComponent = void 0;
this.hideCurrentPicker = null;
}
toggleExpandedStyles(expanded) {
if (!this.isAlive()) {
return;
}
const ariaEl = this.getAriaElement();
_setAriaExpanded(ariaEl, expanded);
const classList = this.eWrapper.classList;
classList.toggle("ag-picker-expanded", expanded);
classList.toggle("ag-picker-collapsed", !expanded);
}
onPickerFocusIn() {
this.togglePickerHasFocus(true);
}
onPickerFocusOut(e) {
if (!this.pickerComponent?.getGui().contains(e.relatedTarget)) {
this.togglePickerHasFocus(false);
}
}
togglePickerHasFocus(focused) {
if (!this.pickerComponent) {
return;
}
this.eWrapper.classList.toggle("ag-picker-has-focus", focused);
}
hidePicker() {
this.hideCurrentPicker?.();
}
setInputWidth(width) {
_setElementWidth(this.eWrapper, width);
return this;
}
getFocusableElement() {
return this.eWrapper;
}
setPickerGap(gap) {
this.pickerGap = gap;
return this;
}
setPickerMinWidth(width) {
if (typeof width === "number") {
width = `${width}px`;
}
this.minPickerWidth = width == null ? void 0 : width;
return this;
}
setPickerMaxWidth(width) {
if (typeof width === "number") {
width = `${width}px`;
}
this.maxPickerWidth = width == null ? void 0 : width;
return this;
}
setPickerMaxHeight(height) {
if (typeof height === "number") {
height = `${height}px`;
}
this.maxPickerHeight = height == null ? void 0 : height;
return this;
}
destroy() {
this.hidePicker();
super.destroy();
}
};
// packages/ag-grid-community/src/widgets/agSelect.css-GENERATED.ts
var agSelectCSS = (
/*css*/
`.ag-select{align-items:center;display:flex;&.ag-disabled{opacity:.5}}:where(.ag-select){.ag-picker-field-wrapper{cursor:default}&.ag-disabled .ag-picker-field-wrapper:focus{box-shadow:none}&:not(.ag-cell-editor,.ag-label-align-top){min-height:var(--ag-list-item-height)}.ag-picker-field-display{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ag-picker-field-icon{align-items:center;display:flex}}:where(.ag-ltr) :where(.ag-select){.ag-picker-field-wrapper{padding-left:calc(var(--ag-cell-horizontal-padding)/2);padding-right:var(--ag-spacing)}}:where(.ag-rtl) :where(.ag-select){.ag-picker-field-wrapper{padding-left:var(--ag-spacing);padding-right:calc(var(--ag-cell-horizontal-padding)/2)}}`
);
// packages/ag-grid-community/src/widgets/agSelect.ts
var AgSelect = class extends AgPickerField {
constructor(config) {
super({
pickerAriaLabelKey: "ariaLabelSelectField",
pickerAriaLabelValue: "Select Field",
pickerType: "ag-list",
className: "ag-select",
pickerIcon: "selectOpen",
ariaRole: "combobox",
...config
});
this.registerCSS(agSelectCSS);
}
postConstruct() {
this.tooltipFeature = this.createOptionalManagedBean(
this.beans.registry.createDynamicBean("tooltipFeature", false, {
shouldDisplayTooltip: _shouldDisplayTooltip(() => this.eDisplayField),
getGui: () => this.getGui()
})
);
super.postConstruct();
this.createListComponent();
this.eWrapper.tabIndex = this.gos.get("tabIndex");
const { options, value, placeholder } = this.config;
if (options != null) {
this.addOptions(options);
}
if (value != null) {
this.setValue(value, true);
}
if (placeholder && value == null) {
this.eDisplayField.textContent = placeholder;
}
this.addManagedElementListeners(this.eWrapper, { focusout: this.onWrapperFocusOut.bind(this) });
}
onWrapperFocusOut(e) {
if (!this.eWrapper.contains(e.relatedTarget)) {
this.hidePicker();
}
}
createListComponent() {
const listComponent = this.createBean(new AgList("select", true));
this.listComponent = listComponent;
listComponent.setParentComponent(this);
const eListAriaEl = listComponent.getAriaElement();
const listId = `ag-select-list-${listComponent.getCompId()}`;
eListAriaEl.setAttribute("id", listId);
_setAriaControls(this.getAriaElement(), eListAriaEl);
listComponent.addManagedElementListeners(listComponent.getGui(), {
mousedown: (e) => {
e?.preventDefault();
}
});
listComponent.addManagedListeners(listComponent, {
selectedItem: () => {
this.hidePicker();
this.dispatchLocalEvent({ type: "selectedItem" });
},
fieldValueChanged: () => {
if (!this.listComponent) {
return;
}
this.setValue(this.listComponent.getValue(), false, true);
this.hidePicker();
}
});
}
createPickerComponent() {
return this.listComponent;
}
onKeyDown(e) {
const { key } = e;
if (key === KeyCode.TAB) {
this.hidePicker();
}
switch (key) {
case KeyCode.ENTER:
case KeyCode.UP:
case KeyCode.DOWN:
case KeyCode.PAGE_UP:
case KeyCode.PAGE_DOWN:
case KeyCode.PAGE_HOME:
case KeyCode.PAGE_END:
e.preventDefault();
if (this.isPickerDisplayed) {
this.listComponent?.handleKeyDown(e);
} else {
super.onKeyDown(e);
}
break;
case KeyCode.ESCAPE:
super.onKeyDown(e);
break;
case KeyCode.SPACE:
if (this.isPickerDisplayed) {
e.preventDefault();
} else {
super.onKeyDown(e);
}
break;
}
}
showPicker() {
const listComponent = this.listComponent;
if (!listComponent) {
return;
}
super.showPicker();
listComponent.refreshHighlighted();
}
addOptions(options) {
options.forEach((option) => this.addOption(option));
return this;
}
addOption(option) {
this.listComponent.addOption(option);
return this;
}
clearOptions() {
this.listComponent?.clearOptions();
return this;
}
setValue(value, silent, fromPicker) {
const {
listComponent,
config: { placeholder },
eDisplayField,
tooltipFeature
} = this;
if (this.value === value || !listComponent) {
return this;
}
if (!fromPicker) {
listComponent.setValue(value, true);
}
const newValue = listComponent.getValue();
if (newValue === this.getValue()) {
return this;
}
let displayValue = listComponent.getDisplayValue();
if (displayValue == null && placeholder) {
displayValue = placeholder;
}
eDisplayField.textContent = displayValue;
tooltipFeature?.setTooltipAndRefresh(displayValue ?? null);
return super.setValue(value, silent);
}
destroy() {
this.listComponent = this.destroyBean(this.listComponent);
super.destroy();
}
};
var AgSelectSelector = {
selector: "AG-SELECT",
component: AgSelect
};
// packages/ag-grid-community/src/widgets/tabGuardCtrl.ts
var TabGuardClassNames = {
TAB_GUARD: "ag-tab-guard",
TAB_GUARD_TOP: "ag-tab-guard-top",
TAB_GUARD_BOTTOM: "ag-tab-guard-bottom"
};
var TabGuardCtrl = class extends BeanStub {
constructor(params) {
super();
this.skipTabGuardFocus = false;
this.forcingFocusOut = false;
// Used when `isFocusableContainer` enabled
this.allowFocus = false;
const {
comp,
eTopGuard,
eBottomGuard,
focusTrapActive,
forceFocusOutWhenTabGuardsAreEmpty,
isFocusableContainer,
focusInnerElement,
onFocusIn,
onFocusOut,
shouldStopEventPropagation,
onTabKeyDown,
handleKeyDown,
isEmpty,
eFocusableElement
} = params;
this.comp = comp;
this.eTopGuard = eTopGuard;
this.eBottomGuard = eBottomGuard;
this.providedFocusInnerElement = focusInnerElement;
this.eFocusableElement = eFocusableElement;
this.focusTrapActive = !!focusTrapActive;
this.forceFocusOutWhenTabGuardsAreEmpty = !!forceFocusOutWhenTabGuardsAreEmpty;
this.isFocusableContainer = !!isFocusableContainer;
this.providedFocusIn = onFocusIn;
this.providedFocusOut = onFocusOut;
this.providedShouldStopEventPropagation = shouldStopEventPropagation;
this.providedOnTabKeyDown = onTabKeyDown;
this.providedHandleKeyDown = handleKeyDown;
this.providedIsEmpty = isEmpty;
}
postConstruct() {
this.createManagedBean(
new ManagedFocusFeature(this.eFocusableElement, {
shouldStopEventPropagation: () => this.shouldStopEventPropagation(),
onTabKeyDown: (e) => this.onTabKeyDown(e),
handleKeyDown: (e) => this.handleKeyDown(e),
onFocusIn: (e) => this.onFocusIn(e),
onFocusOut: (e) => this.onFocusOut(e)
})
);
this.activateTabGuards();
[this.eTopGuard, this.eBottomGuard].forEach(
(guard) => this.addManagedElementListeners(guard, { focus: this.onFocus.bind(this) })
);
}
handleKeyDown(e) {
if (this.providedHandleKeyDown) {
this.providedHandleKeyDown(e);
}
}
tabGuardsAreActive() {
return !!this.eTopGuard && this.eTopGuard.hasAttribute("tabIndex");
}
shouldStopEventPropagation() {
if (this.providedShouldStopEventPropagation) {
return this.providedShouldStopEventPropagation();
}
return false;
}
activateTabGuards() {
if (this.forcingFocusOut) {
return;
}
const tabIndex = this.gos.get("tabIndex");
this.comp.setTabIndex(tabIndex.toString());
}
deactivateTabGuards() {
this.comp.setTabIndex();
}
onFocus(e) {
if (this.isFocusableContainer && !this.eFocusableElement.contains(e.relatedTarget)) {
if (!this.allowFocus) {
this.findNextElementOutsideAndFocus(e.target === this.eBottomGuard);
return;
}
}
if (this.skipTabGuardFocus) {
this.skipTabGuardFocus = false;
return;
}
if (this.forceFocusOutWhenTabGuardsAreEmpty) {
const isEmpty = this.providedIsEmpty ? this.providedIsEmpty() : _findFocusableElements(this.eFocusableElement, ".ag-tab-guard").length === 0;
if (isEmpty) {
this.findNextElementOutsideAndFocus(e.target === this.eBottomGuard);
return;
}
}
if (this.isFocusableContainer && this.eFocusableElement.contains(e.relatedTarget)) {
return;
}
const fromBottom = e.target === this.eBottomGuard;
const hasFocusedInnerElement = this.providedFocusInnerElement ? this.providedFocusInnerElement(fromBottom) : this.focusInnerElement(fromBottom);
if (!hasFocusedInnerElement && this.forceFocusOutWhenTabGuardsAreEmpty) {
this.findNextElementOutsideAndFocus(e.target === this.eBottomGuard);
}
}
findNextElementOutsideAndFocus(up) {
const eDocument = _getDocument(this.beans);
const focusableEls = _findFocusableElements(eDocument.body, null, true);
const index = focusableEls.indexOf(up ? this.eTopGuard : this.eBottomGuard);
if (index === -1) {
return;
}
let start;
let end;
if (up) {
start = 0;
end = index;
} else {
start = index + 1;
end = focusableEls.length;
}
const focusableRange = focusableEls.slice(start, end);
const targetTabIndex = this.gos.get("tabIndex");
focusableRange.sort((a, b) => {
const indexA = parseInt(a.getAttribute("tabindex") || "0");
const indexB = parseInt(b.getAttribute("tabindex") || "0");
if (indexB === targetTabIndex) {
return 1;
}
if (indexA === targetTabIndex) {
return -1;
}
if (indexA === 0) {
return 1;
}
if (indexB === 0) {
return -1;
}
return indexA - indexB;
});
focusableRange[up ? focusableRange.length - 1 : 0]?.focus();
}
onFocusIn(e) {
if (this.focusTrapActive || this.forcingFocusOut) {
return;
}
if (this.providedFocusIn) {
this.providedFocusIn(e);
}
if (!this.isFocusableContainer) {
this.deactivateTabGuards();
}
}
onFocusOut(e) {
if (this.focusTrapActive) {
return;
}
if (this.providedFocusOut) {
this.providedFocusOut(e);
}
if (!this.eFocusableElement.contains(e.relatedTarget)) {
this.activateTabGuards();
}
}
onTabKeyDown(e) {
if (this.providedOnTabKeyDown) {
this.providedOnTabKeyDown(e);
return;
}
if (this.focusTrapActive) {
return;
}
if (e.defaultPrevented) {
return;
}
const tabGuardsAreActive = this.tabGuardsAreActive();
if (tabGuardsAreActive) {
this.deactivateTabGuards();
}
const nextRoot = this.getNextFocusableElement(e.shiftKey);
if (tabGuardsAreActive) {
setTimeout(() => this.activateTabGuards(), 0);
}
if (!nextRoot) {
return;
}
nextRoot.focus();
e.preventDefault();
}
focusInnerElement(fromBottom = false) {
const focusable = _findFocusableElements(this.eFocusableElement);
if (this.tabGuardsAreActive()) {
focusable.splice(0, 1);
focusable.splice(focusable.length - 1, 1);
}
if (!focusable.length) {
return false;
}
focusable[fromBottom ? focusable.length - 1 : 0].focus({ preventScroll: true });
return true;
}
getNextFocusableElement(backwards) {
return _findNextFocusableElement(this.beans, this.eFocusableElement, false, backwards);
}
forceFocusOutOfContainer(up = false) {
if (this.forcingFocusOut) {
return;
}
const tabGuardToFocus = up ? this.eTopGuard : this.eBottomGuard;
this.activateTabGuards();
this.skipTabGuardFocus = true;
this.forcingFocusOut = true;
tabGuardToFocus.focus();
window.setTimeout(() => {
this.forcingFocusOut = false;
this.activateTabGuards();
});
}
isTabGuard(element, bottom) {
return element === this.eTopGuard && !bottom || element === this.eBottomGuard && (bottom ?? true);
}
setAllowFocus(allowFocus) {
this.allowFocus = allowFocus;
}
};
// packages/ag-grid-community/src/widgets/tabGuardFeature.ts
var TabGuardFeature = class extends BeanStub {
constructor(comp) {
super();
this.comp = comp;
}
initialiseTabGuard(params) {
this.eTopGuard = this.createTabGuard("top");
this.eBottomGuard = this.createTabGuard("bottom");
this.eFocusableElement = this.comp.getFocusableElement();
const { eTopGuard, eBottomGuard, eFocusableElement } = this;
const tabGuards = [eTopGuard, eBottomGuard];
const compProxy = {
setTabIndex: (tabIndex) => {
tabGuards.forEach(
(tabGuard) => tabIndex != null ? tabGuard.setAttribute("tabindex", tabIndex) : tabGuard.removeAttribute("tabindex")
);
}
};
this.addTabGuards(eTopGuard, eBottomGuard);
const {
focusTrapActive = false,
onFocusIn,
onFocusOut,
focusInnerElement,
handleKeyDown,
onTabKeyDown,
shouldStopEventPropagation,
isEmpty,
forceFocusOutWhenTabGuardsAreEmpty,
isFocusableContainer
} = params;
this.tabGuardCtrl = this.createManagedBean(
new TabGuardCtrl({
comp: compProxy,
focusTrapActive,
eTopGuard,
eBottomGuard,
eFocusableElement,
onFocusIn,
onFocusOut,
focusInnerElement,
handleKeyDown,
onTabKeyDown,
shouldStopEventPropagation,
isEmpty,
forceFocusOutWhenTabGuardsAreEmpty,
isFocusableContainer
})
);
}
getTabGuardCtrl() {
return this.tabGuardCtrl;
}
createTabGuard(side) {
const tabGuard = _getDocument(this.beans).createElement("div");
const cls = side === "top" ? TabGuardClassNames.TAB_GUARD_TOP : TabGuardClassNames.TAB_GUARD_BOTTOM;
tabGuard.classList.add(TabGuardClassNames.TAB_GUARD, cls);
_setAriaRole(tabGuard, "presentation");
return tabGuard;
}
addTabGuards(topTabGuard, bottomTabGuard) {
const eFocusableElement = this.eFocusableElement;
eFocusableElement.insertAdjacentElement("afterbegin", topTabGuard);
eFocusableElement.insertAdjacentElement("beforeend", bottomTabGuard);
}
removeAllChildrenExceptTabGuards() {
const tabGuards = [this.eTopGuard, this.eBottomGuard];
_clearElement(this.comp.getFocusableElement());
this.addTabGuards(...tabGuards);
}
forceFocusOutOfContainer(up = false) {
this.tabGuardCtrl.forceFocusOutOfContainer(up);
}
appendChild(appendChild, newChild, container) {
if (!_isNodeOrElement(newChild)) {
newChild = newChild.getGui();
}
const { eBottomGuard: bottomTabGuard } = this;
if (bottomTabGuard) {
bottomTabGuard.insertAdjacentElement("beforebegin", newChild);
} else {
appendChild(newChild, container);
}
}
destroy() {
const { eFocusableElement, eTopGuard, eBottomGuard } = this;
eFocusableElement.removeChild(eTopGuard);
eFocusableElement.removeChild(eBottomGuard);
super.destroy();
}
};
// packages/ag-grid-community/src/widgets/tabGuardComp.ts
var TabGuardComp = class extends Component {
initialiseTabGuard(params) {
this.tabGuardFeature = this.createManagedBean(new TabGuardFeature(this));
this.tabGuardFeature.initialiseTabGuard(params);
}
forceFocusOutOfContainer(up = false) {
this.tabGuardFeature.forceFocusOutOfContainer(up);
}
appendChild(newChild, container) {
this.tabGuardFeature.appendChild(super.appendChild.bind(this), newChild, container);
}
};
// packages/ag-grid-community/src/widgets/popupComponent.ts
var PopupComponent = class extends Component {
isPopup() {
return true;
}
setParentComponent(container) {
container.addCssClass("ag-has-popup");
super.setParentComponent(container);
}
destroy() {
const parentComp = this.parentComponent;
const hasParent = parentComp && parentComp.isAlive();
if (hasParent) {
parentComp.getGui().classList.remove("ag-has-popup");
}
super.destroy();
}
};
// packages/ag-grid-community/src/widgets/touchListener.ts
var TouchListener = class {
constructor(eElement, preventMouseClick = false) {
this.DOUBLE_TAP_MILLIS = 500;
this.destroyFuncs = [];
this.touching = false;
this.localEventService = new LocalEventService();
this.preventMouseClick = preventMouseClick;
const startListener = this.onTouchStart.bind(this);
const moveListener = this.onTouchMove.bind(this);
const endListener = this.onTouchEnd.bind(this);
eElement.addEventListener("touchstart", startListener, { passive: true });
eElement.addEventListener("touchmove", moveListener, { passive: true });
eElement.addEventListener("touchend", endListener, { passive: false });
this.destroyFuncs.push(() => {
eElement.removeEventListener("touchstart", startListener, { passive: true });
eElement.removeEventListener("touchmove", moveListener, { passive: true });
eElement.removeEventListener("touchend", endListener, { passive: false });
});
}
getActiveTouch(touchList) {
for (let i = 0; i < touchList.length; i++) {
const matches = touchList[i].identifier === this.touchStart.identifier;
if (matches) {
return touchList[i];
}
}
return null;
}
addEventListener(eventType, listener) {
this.localEventService.addEventListener(eventType, listener);
}
removeEventListener(eventType, listener) {
this.localEventService.removeEventListener(eventType, listener);
}
onTouchStart(touchEvent) {
if (this.touching) {
return;
}
this.touchStart = touchEvent.touches[0];
this.touching = true;
this.moved = false;
const touchStartCopy = this.touchStart;
window.setTimeout(() => {
const touchesMatch = this.touchStart === touchStartCopy;
if (this.touching && touchesMatch && !this.moved) {
this.moved = true;
const event = {
type: "longTap",
touchStart: this.touchStart,
touchEvent
};
this.localEventService.dispatchEvent(event);
}
}, 500);
}
onTouchMove(touchEvent) {
if (!this.touching) {
return;
}
const touch = this.getActiveTouch(touchEvent.touches);
if (!touch) {
return;
}
const eventIsFarAway = !_areEventsNear(touch, this.touchStart, 4);
if (eventIsFarAway) {
this.moved = true;
}
}
onTouchEnd(touchEvent) {
if (!this.touching) {
return;
}
if (!this.moved) {
const event = {
type: "tap",
touchStart: this.touchStart
};
this.localEventService.dispatchEvent(event);
this.checkForDoubleTap();
}
if (this.preventMouseClick && touchEvent.cancelable) {
touchEvent.preventDefault();
}
this.touching = false;
}
checkForDoubleTap() {
const now = (/* @__PURE__ */ new Date()).getTime();
if (this.lastTapTime && this.lastTapTime > 0) {
const interval = now - this.lastTapTime;
if (interval > this.DOUBLE_TAP_MILLIS) {
const event = {
type: "doubleTap",
touchStart: this.touchStart
};
this.localEventService.dispatchEvent(event);
this.lastTapTime = null;
} else {
this.lastTapTime = now;
}
} else {
this.lastTapTime = now;
}
}
destroy() {
this.destroyFuncs.forEach((func) => func());
}
};
// packages/ag-grid-community/src/interfaces/IRangeService.ts
var CellRangeType = /* @__PURE__ */ ((CellRangeType2) => {
CellRangeType2[CellRangeType2["VALUE"] = 0] = "VALUE";
CellRangeType2[CellRangeType2["DIMENSION"] = 1] = "DIMENSION";
return CellRangeType2;
})(CellRangeType || {});
// packages/ag-grid-community/src/vanillaFrameworkOverrides.ts
var VanillaFrameworkOverrides = class {
constructor(frameworkName = "javascript") {
this.frameworkName = frameworkName;
this.renderingEngine = "vanilla";
this.wrapIncoming = (callback) => callback();
this.wrapOutgoing = (callback) => callback();
this.baseDocLink = `${BASE_URL}/${this.frameworkName}-data-grid`;
setValidationDocLink(this.baseDocLink);
}
setInterval(action, timeout) {
return new AgPromise((resolve) => {
resolve(window.setInterval(action, timeout));
});
}
// for Vanilla JS, we just add the event to the element
addEventListener(element, type, listener, options) {
let eventListenerOptions = {};
if (typeof options === "object") {
eventListenerOptions = options;
} else if (typeof options === "boolean") {
eventListenerOptions = { capture: options };
}
if (eventListenerOptions.passive == null) {
const passive = getPassiveStateForEvent(type);
if (passive != null) {
eventListenerOptions.passive = passive;
}
}
element.addEventListener(type, listener, eventListenerOptions);
}
frameworkComponent(_) {
return null;
}
isFrameworkComponent(_) {
return false;
}
getDocLink(path) {
return `${this.baseDocLink}${path ? `/${path}` : ""}`;
}
};
// packages/ag-grid-community/src/api/apiUtils.ts
function createGridApi(context) {
return {
beanName: "gridApi",
bean: context.getBean("apiFunctionSvc").api
};
}
// packages/ag-grid-community/src/context/gridBeanComparator.ts
var 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
];
var beanNamePosition = Object.fromEntries(
orderedCoreBeans.map((beanName, index) => [beanName, index])
);
function gridBeanInitComparator(bean1, bean2) {
const index1 = (bean1.beanName ? beanNamePosition[bean1.beanName] : void 0) ?? Number.MAX_SAFE_INTEGER;
const index2 = (bean2.beanName ? beanNamePosition[bean2.beanName] : void 0) ?? Number.MAX_SAFE_INTEGER;
return index1 - index2;
}
function gridBeanDestroyComparator(bean1, bean2) {
return bean1?.beanName === "gridDestroySvc" ? -1 : 0;
}
// packages/ag-grid-community/src/headerRendering/rowContainer/headerRowContainerComp.ts
var PINNED_LEFT_TEMPLATE = (
/* html */
``
);
var PINNED_RIGHT_TEMPLATE = (
/* html */
``
);
var CENTER_TEMPLATE = (
/* html */
``
);
var HeaderRowContainerComp = class extends Component {
constructor(pinned) {
super();
this.eCenterContainer = RefPlaceholder;
this.headerRowComps = {};
this.rowCompsList = [];
this.pinned = pinned;
}
postConstruct() {
this.selectAndSetTemplate();
const compProxy = {
setDisplayed: (displayed) => this.setDisplayed(displayed),
setCtrls: (ctrls) => this.setCtrls(ctrls),
// only gets called for center section
setCenterWidth: (width) => this.eCenterContainer.style.width = width,
setViewportScrollLeft: (left) => this.getGui().scrollLeft = left,
// only gets called for pinned sections
setPinnedContainerWidth: (width) => {
const eGui = this.getGui();
eGui.style.width = width;
eGui.style.maxWidth = width;
eGui.style.minWidth = width;
}
};
const ctrl = this.createManagedBean(new HeaderRowContainerCtrl(this.pinned));
ctrl.setComp(compProxy, this.getGui());
}
selectAndSetTemplate() {
const pinnedLeft = this.pinned == "left";
const pinnedRight = this.pinned == "right";
const template = pinnedLeft ? PINNED_LEFT_TEMPLATE : pinnedRight ? PINNED_RIGHT_TEMPLATE : CENTER_TEMPLATE;
this.setTemplate(template);
this.eRowContainer = this.eCenterContainer !== RefPlaceholder ? this.eCenterContainer : this.getGui();
}
destroy() {
this.setCtrls([]);
super.destroy();
}
destroyRowComp(rowComp) {
this.destroyBean(rowComp);
this.eRowContainer.removeChild(rowComp.getGui());
}
setCtrls(ctrls) {
const oldRowComps = this.headerRowComps;
this.headerRowComps = {};
this.rowCompsList = [];
let prevGui;
const appendEnsuringDomOrder = (rowComp) => {
const eGui = rowComp.getGui();
const notAlreadyIn = eGui.parentElement != this.eRowContainer;
if (notAlreadyIn) {
this.eRowContainer.appendChild(eGui);
}
if (prevGui) {
_ensureDomOrder(this.eRowContainer, eGui, prevGui);
}
prevGui = eGui;
};
ctrls.forEach((ctrl) => {
const ctrlId = ctrl.instanceId;
const existingComp = oldRowComps[ctrlId];
delete oldRowComps[ctrlId];
const rowComp = existingComp ? existingComp : this.createBean(new HeaderRowComp(ctrl));
this.headerRowComps[ctrlId] = rowComp;
this.rowCompsList.push(rowComp);
appendEnsuringDomOrder(rowComp);
});
Object.values(oldRowComps).forEach((c) => this.destroyRowComp(c));
}
};
// packages/ag-grid-community/src/headerRendering/gridHeaderComp.ts
var GridHeaderComp = class extends Component {
constructor() {
super(
/* html */
``
);
}
postConstruct() {
const compProxy = {
addOrRemoveCssClass: (cssClassName, on) => this.addOrRemoveCssClass(cssClassName, on),
setHeightAndMinHeight: (height) => {
this.getGui().style.height = height;
this.getGui().style.minHeight = height;
}
};
const ctrl = this.createManagedBean(new GridHeaderCtrl());
ctrl.setComp(compProxy, this.getGui(), this.getFocusableElement());
const addContainer = (container) => {
this.createManagedBean(container);
this.appendChild(container);
};
addContainer(new HeaderRowContainerComp("left"));
addContainer(new HeaderRowContainerComp(null));
addContainer(new HeaderRowContainerComp("right"));
}
};
var GridHeaderSelector = {
selector: "AG-HEADER-ROOT",
component: GridHeaderComp
};
// packages/ag-grid-community/src/rendering/cell/cellComp.ts
var CellComp = class extends Component {
constructor(beans, cellCtrl, printLayout, eRow, editingRow) {
super();
this.cellCtrl = cellCtrl;
// every time we go into edit mode, or back again, this gets incremented.
// it's the components way of dealing with the async nature of framework components,
// so if a framework component takes a while to be created, we know if the object
// is still relevant when creating is finished. eg we could click edit / un-edit 20
// times before the first React edit component comes back - we should discard
// the first 19.
this.rendererVersion = 0;
this.editorVersion = 0;
this.beans = beans;
this.column = cellCtrl.column;
this.rowNode = cellCtrl.rowNode;
this.eRow = eRow;
const cellDiv = document.createElement("div");
cellDiv.setAttribute("comp-id", `${this.getCompId()}`);
this.eCell = cellDiv;
let wrapperDiv;
if (cellCtrl.isCellSpanning()) {
wrapperDiv = document.createElement("div");
wrapperDiv.className = "ag-spanned-cell-wrapper";
wrapperDiv.appendChild(cellDiv);
_setAriaRole(wrapperDiv, "presentation");
this.setTemplateFromElement(wrapperDiv);
} else {
this.setTemplateFromElement(cellDiv);
}
this.cellCssClassManager = new CssClassManager(() => cellDiv);
this.forceWrapper = cellCtrl.isForceWrapper();
this.refreshWrapper(false);
_setAriaRole(cellDiv, cellCtrl.getCellAriaRole());
cellDiv.setAttribute("col-id", cellCtrl.colIdSanitised);
const compProxy = {
addOrRemoveCssClass: (cssClassName, on) => this.cellCssClassManager.addOrRemoveCssClass(cssClassName, on),
setUserStyles: (styles) => _addStylesToElement(cellDiv, styles),
getFocusableElement: () => cellDiv,
setIncludeSelection: (include) => this.includeSelection = include,
setIncludeRowDrag: (include) => this.includeRowDrag = include,
setIncludeDndSource: (include) => this.includeDndSource = include,
setRenderDetails: (compDetails, valueToDisplay, force) => this.setRenderDetails(compDetails, valueToDisplay, force),
setEditDetails: (compDetails, popup, position) => this.setEditDetails(compDetails, popup, position),
getCellEditor: () => this.cellEditor || null,
getCellRenderer: () => this.cellRenderer || null,
getParentOfValue: () => this.getParentOfValue()
};
cellCtrl.setComp(compProxy, cellDiv, wrapperDiv, this.eCellWrapper, printLayout, editingRow, void 0);
}
getParentOfValue() {
if (this.eCellValue) {
return this.eCellValue;
}
if (this.eCellWrapper) {
return this.eCellWrapper;
}
return this.eCell;
}
setRenderDetails(compDetails, valueToDisplay, forceNewCellRendererInstance) {
const isInlineEditing = this.cellEditor && !this.cellEditorPopupWrapper;
if (isInlineEditing) {
return;
}
this.firstRender = this.firstRender == null;
const controlWrapperChanged = this.refreshWrapper(false);
this.refreshEditStyles(false);
if (compDetails) {
const neverRefresh = forceNewCellRendererInstance || controlWrapperChanged;
const cellRendererRefreshSuccessful = neverRefresh ? false : this.refreshCellRenderer(compDetails);
if (!cellRendererRefreshSuccessful) {
this.destroyRenderer();
this.createCellRendererInstance(compDetails);
}
} else {
this.destroyRenderer();
this.insertValueWithoutCellRenderer(valueToDisplay);
}
}
setEditDetails(compDetails, popup, position) {
if (compDetails) {
this.createCellEditorInstance(compDetails, popup, position);
} else {
this.destroyEditor();
}
}
removeControls() {
this.checkboxSelectionComp = this.beans.context.destroyBean(this.checkboxSelectionComp);
this.dndSourceComp = this.beans.context.destroyBean(this.dndSourceComp);
this.rowDraggingComp = this.beans.context.destroyBean(this.rowDraggingComp);
}
// returns true if wrapper was changed
refreshWrapper(editing) {
const providingControls = this.includeRowDrag || this.includeDndSource || this.includeSelection;
const usingWrapper = providingControls || this.forceWrapper;
const putWrapperIn = usingWrapper && this.eCellWrapper == null;
if (putWrapperIn) {
const wrapperDiv = document.createElement("div");
wrapperDiv.setAttribute("role", "presentation");
wrapperDiv.setAttribute("class", "ag-cell-wrapper");
this.eCellWrapper = wrapperDiv;
this.eCell.appendChild(this.eCellWrapper);
}
const takeWrapperOut = !usingWrapper && this.eCellWrapper != null;
if (takeWrapperOut) {
_removeFromParent(this.eCellWrapper);
this.eCellWrapper = void 0;
}
this.cellCssClassManager.addOrRemoveCssClass("ag-cell-value", !usingWrapper);
const usingCellValue = !editing && usingWrapper;
const putCellValueIn = usingCellValue && this.eCellValue == null;
if (putCellValueIn) {
const cellSpan = document.createElement("span");
cellSpan.setAttribute("role", "presentation");
cellSpan.setAttribute("class", "ag-cell-value");
this.eCellValue = cellSpan;
this.eCellWrapper.appendChild(this.eCellValue);
}
const takeCellValueOut = !usingCellValue && this.eCellValue != null;
if (takeCellValueOut) {
_removeFromParent(this.eCellValue);
this.eCellValue = void 0;
}
const templateChanged = putWrapperIn || takeWrapperOut || putCellValueIn || takeCellValueOut;
if (templateChanged) {
this.removeControls();
}
if (!editing) {
if (providingControls) {
this.addControls();
}
}
return templateChanged;
}
addControls() {
if (this.includeRowDrag) {
if (this.rowDraggingComp == null) {
this.rowDraggingComp = this.cellCtrl.createRowDragComp();
if (this.rowDraggingComp) {
this.eCellWrapper.insertBefore(this.rowDraggingComp.getGui(), this.eCellValue);
}
}
}
if (this.includeDndSource) {
if (this.dndSourceComp == null) {
this.dndSourceComp = this.cellCtrl.createDndSource();
if (this.dndSourceComp) {
this.eCellWrapper.insertBefore(this.dndSourceComp.getGui(), this.eCellValue);
}
}
}
if (this.includeSelection) {
if (this.checkboxSelectionComp == null) {
this.checkboxSelectionComp = this.cellCtrl.createSelectionCheckbox();
if (this.checkboxSelectionComp) {
this.eCellWrapper.insertBefore(this.checkboxSelectionComp.getGui(), this.eCellValue);
}
}
}
}
createCellEditorInstance(compDetails, popup, position) {
const versionCopy = this.editorVersion;
const cellEditorPromise = compDetails.newAgStackInstance();
const { params } = compDetails;
cellEditorPromise.then((c) => this.afterCellEditorCreated(versionCopy, c, params, popup, position));
const cellEditorAsync = _missing(this.cellEditor);
if (cellEditorAsync && params.cellStartedEdit) {
this.cellCtrl.focusCell(true);
}
}
insertValueWithoutCellRenderer(valueToDisplay) {
const eParent = this.getParentOfValue();
_clearElement(eParent);
const escapedValue = valueToDisplay != null ? _escapeString(valueToDisplay, true) : null;
if (escapedValue != null) {
eParent.textContent = escapedValue;
}
}
destroyEditorAndRenderer() {
this.destroyRenderer();
this.destroyEditor();
}
destroyRenderer() {
const { context } = this.beans;
this.cellRenderer = context.destroyBean(this.cellRenderer);
_removeFromParent(this.cellRendererGui);
this.cellRendererGui = null;
this.rendererVersion++;
}
destroyEditor() {
const { context } = this.beans;
if (this.hideEditorPopup) {
this.hideEditorPopup();
}
this.hideEditorPopup = void 0;
this.cellEditor = context.destroyBean(this.cellEditor);
this.cellEditorPopupWrapper = context.destroyBean(this.cellEditorPopupWrapper);
_removeFromParent(this.cellEditorGui);
this.cellEditorGui = null;
this.editorVersion++;
}
refreshCellRenderer(compClassAndParams) {
if (this.cellRenderer == null || this.cellRenderer.refresh == null) {
return false;
}
if (this.cellRendererClass !== compClassAndParams.componentClass) {
return false;
}
const result = this.cellRenderer.refresh(compClassAndParams.params);
return result === true || result === void 0;
}
createCellRendererInstance(compDetails) {
const suppressAnimationFrame = this.beans.gos.get("suppressAnimationFrame");
const useTaskService = !suppressAnimationFrame && this.beans.animationFrameSvc;
const displayComponentVersionCopy = this.rendererVersion;
const { componentClass } = compDetails;
const createCellRendererFunc = () => {
const staleTask = this.rendererVersion !== displayComponentVersionCopy || !this.isAlive();
if (staleTask) {
return;
}
const componentPromise = compDetails.newAgStackInstance();
const callback = this.afterCellRendererCreated.bind(this, displayComponentVersionCopy, componentClass);
if (componentPromise) {
componentPromise.then(callback);
}
};
if (useTaskService && this.firstRender) {
this.beans.animationFrameSvc.createTask(createCellRendererFunc, this.rowNode.rowIndex, "createTasksP2");
} else {
createCellRendererFunc();
}
}
afterCellRendererCreated(cellRendererVersion, cellRendererClass, cellRenderer) {
const staleTask = !this.isAlive() || cellRendererVersion !== this.rendererVersion;
if (staleTask) {
this.beans.context.destroyBean(cellRenderer);
return;
}
this.cellRenderer = cellRenderer;
this.cellRendererClass = cellRendererClass;
this.cellRendererGui = this.cellRenderer.getGui();
if (this.cellRendererGui != null) {
const eParent = this.getParentOfValue();
_clearElement(eParent);
eParent.appendChild(this.cellRendererGui);
}
}
afterCellEditorCreated(requestVersion, cellEditor, params, popup, position) {
const staleComp = requestVersion !== this.editorVersion;
if (staleComp) {
this.beans.context.destroyBean(cellEditor);
return;
}
const editingCancelledByUserComp = cellEditor.isCancelBeforeStart && cellEditor.isCancelBeforeStart();
if (editingCancelledByUserComp) {
this.beans.context.destroyBean(cellEditor);
this.cellCtrl.stopEditing(true);
return;
}
if (!cellEditor.getGui) {
_warn(97, { colId: this.column.getId() });
this.beans.context.destroyBean(cellEditor);
return;
}
this.cellEditor = cellEditor;
this.cellEditorGui = cellEditor.getGui();
const cellEditorInPopup = popup || cellEditor.isPopup !== void 0 && cellEditor.isPopup();
if (cellEditorInPopup) {
this.addPopupCellEditor(params, position);
} else {
this.addInCellEditor();
}
this.refreshEditStyles(true, cellEditorInPopup);
if (cellEditor.afterGuiAttached) {
cellEditor.afterGuiAttached();
}
this.cellCtrl.cellEditorAttached();
}
refreshEditStyles(editing, isPopup) {
const { cellCssClassManager } = this;
cellCssClassManager.addOrRemoveCssClass("ag-cell-inline-editing", editing && !isPopup);
cellCssClassManager.addOrRemoveCssClass("ag-cell-popup-editing", editing && !!isPopup);
cellCssClassManager.addOrRemoveCssClass("ag-cell-not-inline-editing", !editing || !!isPopup);
this.cellCtrl.setInlineEditingCss();
}
addInCellEditor() {
const { eCell } = this;
if (eCell.contains(_getActiveDomElement(this.beans))) {
eCell.focus();
}
this.destroyRenderer();
this.refreshWrapper(true);
this.clearParentOfValue();
if (this.cellEditorGui) {
const eParent = this.getParentOfValue();
eParent.appendChild(this.cellEditorGui);
}
}
addPopupCellEditor(params, position) {
if (this.beans.gos.get("editType") === "fullRow") {
_warn(98);
}
const cellEditor = this.cellEditor;
this.cellEditorPopupWrapper = this.beans.context.createBean(
this.beans.editSvc.createPopupEditorWrapper(params)
);
const ePopupGui = this.cellEditorPopupWrapper.getGui();
if (this.cellEditorGui) {
ePopupGui.appendChild(this.cellEditorGui);
}
const popupSvc = this.beans.popupSvc;
const useModelPopup = this.beans.gos.get("stopEditingWhenCellsLoseFocus");
const positionToUse = position != null ? position : cellEditor.getPopupPosition?.() ?? "over";
const isRtl = this.beans.gos.get("enableRtl");
const positionParams = {
ePopup: ePopupGui,
column: this.column,
rowNode: this.rowNode,
type: "popupCellEditor",
eventSource: this.eCell,
position: positionToUse,
alignSide: isRtl ? "right" : "left",
keepWithinBounds: true
};
const positionCallback = popupSvc.positionPopupByComponent.bind(popupSvc, positionParams);
const translate = _getLocaleTextFunc(this.beans.localeSvc);
const addPopupRes = popupSvc.addPopup({
modal: useModelPopup,
eChild: ePopupGui,
closeOnEsc: true,
closedCallback: () => {
this.cellCtrl.onPopupEditorClosed();
},
anchorToElement: this.eCell,
positionCallback,
ariaLabel: translate("ariaLabelCellEditor", "Cell Editor")
});
if (addPopupRes) {
this.hideEditorPopup = addPopupRes.hideFunc;
}
}
detach() {
this.eRow.removeChild(this.getGui());
}
// if the row is also getting destroyed, then we don't need to remove from dom,
// as the row will also get removed, so no need to take out the cells from the row
// if the row is going (removing is an expensive operation, so only need to remove
// the top part)
//
// note - this is NOT called by context, as we don't wire / unwire the CellComp for performance reasons.
destroy() {
this.cellCtrl.stopEditing();
this.destroyEditorAndRenderer();
this.removeControls();
super.destroy();
}
clearParentOfValue() {
const { eCell } = this;
if (eCell.contains(_getActiveDomElement(this.beans))) {
eCell.focus({ preventScroll: true });
}
_clearElement(this.getParentOfValue());
}
};
// packages/ag-grid-community/src/rendering/row/rowComp.ts
var RowComp = class extends Component {
constructor(ctrl, beans, containerType) {
super();
this.cellComps = {};
this.beans = beans;
this.rowCtrl = ctrl;
const rowDiv = document.createElement("div");
rowDiv.setAttribute("comp-id", `${this.getCompId()}`);
rowDiv.setAttribute("style", this.getInitialStyle(containerType));
this.setTemplateFromElement(rowDiv);
const eGui = this.getGui();
const style = eGui.style;
this.domOrder = this.rowCtrl.getDomOrder();
_setAriaRole(eGui, "row");
const compProxy = {
setDomOrder: (domOrder) => this.domOrder = domOrder,
setCellCtrls: (cellCtrls) => this.setCellCtrls(cellCtrls),
showFullWidth: (compDetails) => this.showFullWidth(compDetails),
getFullWidthCellRenderer: () => this.fullWidthCellRenderer,
addOrRemoveCssClass: (name, on) => this.addOrRemoveCssClass(name, on),
setUserStyles: (styles) => _addStylesToElement(eGui, styles),
setTop: (top) => style.top = top,
setTransform: (transform) => style.transform = transform,
setRowIndex: (rowIndex) => eGui.setAttribute("row-index", rowIndex),
setRowId: (rowId) => eGui.setAttribute("row-id", rowId),
setRowBusinessKey: (businessKey) => eGui.setAttribute("row-business-key", businessKey),
refreshFullWidth: (getUpdatedParams) => this.fullWidthCellRenderer?.refresh?.(getUpdatedParams()) ?? false
};
ctrl.setComp(compProxy, this.getGui(), containerType, void 0);
this.addDestroyFunc(() => {
ctrl.unsetComp(containerType);
});
}
getInitialStyle(containerType) {
const transform = this.rowCtrl.getInitialTransform(containerType);
return transform ? `transform: ${transform}` : `top: ${this.rowCtrl.getInitialRowTop(containerType)}`;
}
showFullWidth(compDetails) {
const callback = (cellRenderer) => {
if (this.isAlive()) {
const eGui = cellRenderer.getGui();
this.getGui().appendChild(eGui);
this.rowCtrl.setupDetailRowAutoHeight(eGui);
this.setFullWidthRowComp(cellRenderer);
} else {
this.beans.context.destroyBean(cellRenderer);
}
};
const res = compDetails.newAgStackInstance();
res.then(callback);
}
setCellCtrls(cellCtrls) {
const cellsToRemove = Object.assign({}, this.cellComps);
cellCtrls.forEach((cellCtrl) => {
const key = cellCtrl.instanceId;
const existingCellComp = this.cellComps[key];
if (existingCellComp == null) {
this.newCellComp(cellCtrl);
} else {
cellsToRemove[key] = null;
}
});
this.destroyCells(Object.values(cellsToRemove));
this.ensureDomOrder(cellCtrls);
}
ensureDomOrder(cellCtrls) {
if (!this.domOrder) {
return;
}
const elementsInOrder = [];
cellCtrls.forEach((cellCtrl) => {
const cellComp = this.cellComps[cellCtrl.instanceId];
if (cellComp) {
elementsInOrder.push(cellComp.getGui());
}
});
_setDomChildOrder(this.getGui(), elementsInOrder);
}
newCellComp(cellCtrl) {
const cellComp = new CellComp(
this.beans,
cellCtrl,
this.rowCtrl.printLayout,
this.getGui(),
this.rowCtrl.editing
);
this.cellComps[cellCtrl.instanceId] = cellComp;
this.getGui().appendChild(cellComp.getGui());
}
destroy() {
super.destroy();
this.destroyCells(Object.values(this.cellComps));
}
setFullWidthRowComp(fullWidthRowComponent) {
this.fullWidthCellRenderer = fullWidthRowComponent;
this.addDestroyFunc(() => {
this.fullWidthCellRenderer = this.beans.context.destroyBean(this.fullWidthCellRenderer);
});
}
destroyCells(cellComps) {
cellComps.forEach((cellComp) => {
if (!cellComp) {
return;
}
const instanceId = cellComp.cellCtrl.instanceId;
if (this.cellComps[instanceId] !== cellComp) {
return;
}
cellComp.detach();
cellComp.destroy();
this.cellComps[instanceId] = null;
});
}
};
// packages/ag-grid-community/src/gridBodyComp/rowContainer/rowContainerComp.ts
function templateFactory(name, options, beans) {
const isCellSpanning = !!beans.gos.get("enableCellSpan") && !!options.getSpannedRowCtrls;
const containerClass = _getRowContainerClass(name);
const eContainerTemplate = ``;
if (options.type === "center" || isCellSpanning) {
const spannedCellsContainerClass = _getRowSpanContainerClass(name);
const viewportClass = _getRowViewportClass(name);
const eSpannedContainerTemplate = ``;
return `
${eContainerTemplate}
${isCellSpanning ? eSpannedContainerTemplate : ""}
`;
}
return eContainerTemplate;
}
var RowContainerComp = class extends Component {
constructor(params) {
super();
this.eViewport = RefPlaceholder;
this.eContainer = RefPlaceholder;
this.eSpannedContainer = RefPlaceholder;
this.rowCompsNoSpan = {};
this.rowCompsWithSpan = {};
this.name = params?.name;
this.options = _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(this.name));
ctrl.setComp(compProxy, this.eContainer, this.eSpannedContainer, this.eViewport);
}
destroy() {
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(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) {
_ensureDomOrder(container, eRow, this.lastPlacedElement);
this.lastPlacedElement = eRow;
}
};
var RowContainerSelector = {
selector: "AG-ROW-CONTAINER",
component: RowContainerComp
};
// packages/ag-grid-community/src/gridBodyComp/gridBodyComp.ts
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 */
`
${makeRowContainers(paramsMap, ["topLeft", "topCenter", "topRight", "topFullWidth"])}
${makeRowContainers(paramsMap, ["left", "center", "right", "fullWidth"])}
${makeRowContainers(paramsMap, ["stickyTopLeft", "stickyTopCenter", "stickyTopRight", "stickyTopFullWidth"])}
${makeRowContainers(paramsMap, ["stickyBottomLeft", "stickyBottomCenter", "stickyBottomRight", "stickyBottomFullWidth"])}
${makeRowContainers(paramsMap, ["bottomLeft", "bottomCenter", "bottomRight", "bottomFullWidth"])}
${includeOverlay ? (
/* html */
`
`
) : ""}
`
);
return { paramsMap, template };
}
var GridBodyComp = class extends Component {
constructor() {
super(...arguments);
this.eGridRoot = RefPlaceholder;
this.eBodyViewport = RefPlaceholder;
this.eStickyTop = RefPlaceholder;
this.eStickyBottom = RefPlaceholder;
this.eTop = RefPlaceholder;
this.eBottom = RefPlaceholder;
this.eBody = RefPlaceholder;
}
postConstruct() {
const { overlays, rangeSvc } = this.beans;
const overlaySelector = overlays?.getOverlayWrapperSelector();
const { paramsMap, template } = getGridBodyTemplate(!!overlaySelector);
this.setTemplate(
template,
[
...overlaySelector ? [overlaySelector] : [],
FakeHScrollSelector,
FakeVScrollSelector,
GridHeaderSelector,
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) => _setAriaColCount(this.getGui(), count),
setRowCount: (count) => _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(LayoutCssClasses.AUTO_HEIGHT, params.autoHeight);
classList.toggle(LayoutCssClasses.NORMAL, params.normal);
classList.toggle(LayoutCssClasses.PRINT, params.print);
});
this.addOrRemoveCssClass(LayoutCssClasses.AUTO_HEIGHT, params.autoHeight);
this.addOrRemoveCssClass(LayoutCssClasses.NORMAL, params.normal);
this.addOrRemoveCssClass(LayoutCssClasses.PRINT, params.print);
},
setAlwaysVerticalScrollClass: (cssClass, on) => this.eBodyViewport.classList.toggle(CSS_CLASS_FORCE_VERTICAL_SCROLL, on),
registerBodyViewportResizeListener: (listener) => {
const unsubscribeFromResize = _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) => _setAriaRole(this.eGridRoot, role)
};
this.ctrl = this.createManagedBean(new GridBodyCtrl());
this.ctrl.setComp(
compProxy,
this.getGui(),
this.eBodyViewport,
this.eTop,
this.eBottom,
this.eStickyTop,
this.eStickyBottom
);
if (rangeSvc && _isCellSelectionEnabled(this.gos) || _isMultiRowSelection(this.gos)) {
_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);
}
};
var GridBodySelector = {
selector: "AG-GRID-BODY",
component: GridBodyComp
};
// packages/ag-grid-community/src/gridComp/gridCtrl.ts
var GridCtrl = class extends BeanStub {
constructor() {
super(...arguments);
this.additionalFocusableContainers = /* @__PURE__ */ 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);
_stampTopLevelGridCompWithGridInstance(this.gos, eGridDiv);
this.createManagedBean(new LayoutFeature(this.view));
this.view.setRtlClass(this.gos.get("enableRtl") ? "ag-rtl" : "ag-ltr");
const unsubscribeFromResize = _observeResize(this.beans, this.eGridHostDiv, this.onGridSizeChanged.bind(this));
this.addDestroyFunc(() => unsubscribeFromResize());
ctrlsSvc.register("gridCtrl", this);
}
isDetailGrid() {
const el = _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 = _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(_last(focusableContainers), fromBottom);
}
const lastColumn = _last(allColumns);
if (focusSvc.focusGridView({ column: lastColumn, backwards: fromBottom })) {
return true;
}
}
if (this.gos.get("headerHeight") === 0 || _isHeaderFocusSuppressed(this.beans)) {
if (focusSvc.focusGridView({ column: allColumns[0], backwards: fromBottom })) {
return true;
}
for (let i = 1; i < focusableContainers.length; i++) {
if (_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);
setTimeout(() => {
comp.setAllowFocus?.(false);
});
}
isFocusable() {
const beans = this.beans;
return !_isCellFocusSuppressed(beans) || !_isHeaderFocusSuppressed(beans) || !!beans.sideBar?.comp?.isDisplayed();
}
getNextFocusableIndex(focusableContainers, backwards) {
const activeEl = _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 = _focusInto(comp.getGui(), up, false, true);
comp.setAllowFocus?.(false);
return result;
}
getFocusableContainers() {
return [...this.view.getFocusableContainers(), ...this.additionalFocusableContainers];
}
destroy() {
this.additionalFocusableContainers.clear();
super.destroy();
}
};
// packages/ag-grid-community/src/gridComp/gridComp.ts
var GridComp = class extends TabGuardComp {
constructor(eGridDiv) {
super();
this.gridBody = RefPlaceholder;
this.sideBar = RefPlaceholder;
this.pagination = RefPlaceholder;
this.rootWrapperBody = 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());
const comps = ctrl.getOptionalSelectors();
const template = this.createTemplate(comps);
const requiredComps = [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: () => void 0,
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);
_logIfDebug(this.gos, "Grid removed from DOM");
});
}
updateLayoutClasses(cssClass, params) {
const eRootWrapperBodyClassList = this.rootWrapperBody.classList;
const { AUTO_HEIGHT, NORMAL, PRINT } = 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 */
`
${dropZones}
${statusBar}
${pagination}
${watermark}
`
);
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) => _isVisible(el.getGui()));
}
};
// packages/ag-grid-community/src/api/gridApiFunctions.ts
var mod = (moduleName, input) => {
for (const key of Object.keys(input)) {
input[key] = moduleName;
}
return input;
};
var gridApiFunctionsMap = {
dispatchEvent: "CommunityCore",
// this is always registered
...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
})
};
// packages/ag-grid-community/src/api/apiFunctionService.ts
var defaultFns = {
isDestroyed: () => true,
destroy() {
},
preConstruct() {
},
postConstruct() {
},
preWireBeans() {
},
wireBeans() {
}
};
var dispatchEvent = (beans, event) => beans.eventSvc.dispatchEvent(event);
var GridApiClass = class {
};
Reflect.defineProperty(GridApiClass, "name", { value: "GridApi" });
var ApiFunctionService = class extends 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(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) {
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) {
_warn(26, { fnName, preDestroyLink });
} else {
const module2 = gridApiFunctionsMap[fnName];
if (gos.assertModuleRegistered(module2, `api.${fnName}`)) {
_warn(27, { fnName, module: module2 });
}
}
}
destroy() {
super.destroy();
this.fns = defaultFns;
this.beans = null;
}
};
// packages/ag-grid-community/src/api/coreApi.ts
function getGridId(beans) {
return beans.context.getGridId();
}
function destroy(beans) {
beans.gridDestroySvc.destroy();
}
function isDestroyed(beans) {
return beans.gridDestroySvc.destroyCalled;
}
function getGridOption(beans, key) {
return beans.gos.get(key);
}
function setGridOption(beans, key, value) {
updateGridOptions(beans, { [key]: value });
}
function updateGridOptions(beans, options) {
beans.gos.updateGridOptions({ options });
}
// packages/ag-grid-community/src/rendering/dndSourceComp.ts
var DndSourceComp = class extends Component {
constructor(rowNode, column, eCell) {
super(
/* html */
``
);
this.rowNode = rowNode;
this.column = column;
this.eCell = eCell;
}
postConstruct() {
const eGui = this.getGui();
eGui.appendChild(_createIconNoSpan("rowDrag", this.beans, null));
this.addGuiEventListener("mousedown", (e) => {
e.stopPropagation();
});
this.addDragSource();
this.checkVisibility();
}
addDragSource() {
this.addGuiEventListener("dragstart", this.onDragStart.bind(this));
}
onDragStart(dragEvent) {
const { rowNode, column, eCell, gos } = this;
const providedOnRowDrag = column.getColDef().dndSourceOnRowDrag;
const dataTransfer = dragEvent.dataTransfer;
dataTransfer.setDragImage(eCell, 0, 0);
if (providedOnRowDrag) {
const params = _addGridCommonParams(gos, {
rowNode,
dragEvent
});
providedOnRowDrag(params);
} else {
try {
const jsonData = JSON.stringify(rowNode.data);
dataTransfer.setData("application/json", jsonData);
dataTransfer.setData("text/plain", jsonData);
} catch (e) {
}
}
}
checkVisibility() {
const visible = this.column.isDndSource(this.rowNode);
this.setDisplayed(visible);
}
};
// packages/ag-grid-community/src/dragAndDrop/dragApi.ts
function addRowDropZone(beans, params) {
beans.rowDragSvc?.rowDragFeature?.addRowDropZone(params);
}
function removeRowDropZone(beans, params) {
const activeDropTarget = beans.dragAndDrop?.findExternalZone(params);
if (activeDropTarget) {
beans.dragAndDrop?.removeDropTarget(activeDropTarget);
}
}
function getRowDropZoneParams(beans, events) {
return beans.rowDragSvc?.rowDragFeature?.getRowDropZone(events);
}
// packages/ag-grid-community/src/dragAndDrop/horizontalResizeService.ts
var HorizontalResizeService = class extends 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);
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");
ctrl.setResizeCursor(true);
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);
}
};
// packages/ag-grid-community/src/dragAndDrop/rowDragComp.ts
var RowDragComp = class extends 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(_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) {
this.setTemplateFromElement(dragElement, void 0, void 0, 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] : void 0,
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.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: 2 /* 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 = void 0;
}
};
var VisibilityStrategy = class extends 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 (isShownSometimes) {
parent.setDisplayed(true, displayedOptions);
parent.setVisible(shown, displayedOptions);
} else {
parent.setDisplayed(shown, displayedOptions);
parent.setVisible(true, displayedOptions);
}
}
}
};
var NonManagedVisibilityStrategy = class extends VisibilityStrategy {
postConstruct() {
this.addManagedPropertyListener("suppressRowDrag", this.onSuppressRowDrag.bind(this));
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() {
const neverDisplayed = this.gos.get("suppressRowDrag");
this.setDisplayedOrVisible(neverDisplayed);
}
};
var ManagedVisibilityStrategy = class extends VisibilityStrategy {
postConstruct() {
const listener = this.workOutVisibility.bind(this);
this.addManagedListeners(this.beans.eventSvc, {
sortChanged: listener,
filterChanged: listener,
columnRowGroupChanged: listener,
newColumnsLoaded: listener
});
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;
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);
}
};
// packages/ag-grid-community/src/dragAndDrop/rowDragService.ts
var RowDragService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "rowDragSvc";
}
setupRowDrag(element, ctrl) {
const rowDragFeature = ctrl.createManagedBean(new 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(cellValueFn, rowNode, column, customGui, dragStartPixels, suppressVisibilityChange);
}
createRowDragCompForRow(rowNode, element) {
if (_isCellSelectionEnabled(this.gos)) {
return void 0;
}
const translate = this.getLocaleTextFunc();
return this.createRowDragComp(
() => `1 ${translate("rowDragRow", "row")}`,
rowNode,
void 0,
element,
void 0,
true
);
}
createRowDragCompForCell(rowNode, column, cellValueFn, element, dragStartPixels, suppressVisibilityChange) {
const gos = this.gos;
if (gos.get("rowDragManaged")) {
if (!_isClientSideRowModel(gos) || gos.get("pagination")) {
return void 0;
}
}
const rowDragComp = this.createRowDragComp(
cellValueFn,
rowNode,
column,
element,
dragStartPixels,
suppressVisibilityChange
);
return rowDragComp;
}
};
// packages/ag-grid-community/src/dragAndDrop/dragModule.ts
var DragModule = {
moduleName: "Drag",
version: VERSION,
beans: [DragService]
};
var DragAndDropModule = {
moduleName: "DragAndDrop",
version: VERSION,
dynamicBeans: {
dndSourceComp: DndSourceComp
},
icons: {
// drag handle used to pick up draggable rows
rowDrag: "grip"
}
};
var SharedDragAndDropModule = {
moduleName: "SharedDragAndDrop",
version: VERSION,
beans: [DragAndDropService],
dependsOn: [DragModule],
userComponents: {
agDragAndDropImage: DragAndDropImageComponent2
},
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"
}
};
var RowDragModule = {
moduleName: "RowDrag",
version: VERSION,
beans: [RowDragService],
apiFunctions: {
addRowDropZone,
removeRowDropZone,
getRowDropZoneParams
},
dependsOn: [SharedDragAndDropModule]
};
var HorizontalResizeModule = {
moduleName: "HorizontalResize",
version: VERSION,
beans: [HorizontalResizeService],
dependsOn: [DragModule]
};
// packages/ag-grid-community/src/columnMove/column-moving.css-GENERATED.ts
var columnMovingCSS = (
/*css*/
`: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}}`
);
// packages/ag-grid-community/src/columnMove/columnAnimationService.ts
var ColumnAnimationService = class extends 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 (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() {
this.animationThreadCount++;
const animationThreadCountCopy = this.animationThreadCount;
const { gridBodyCtrl } = this;
gridBodyCtrl.setColumnMovingCss(true);
this.executeLaterFuncs.push(() => {
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(() => {
callbackLater();
runFuncs(executeLaterFuncs);
}, 200);
});
}
};
// packages/ag-grid-community/src/columnMove/columnMoveApi.ts
function moveColumnByIndex(beans, fromIndex, toIndex) {
beans.colMoves?.moveColumnByIndex(fromIndex, toIndex, "api");
}
function moveColumns(beans, columnsToMoveKeys, toIndex) {
beans.colMoves?.moveColumns(columnsToMoveKeys, toIndex, "api");
}
// packages/ag-grid-community/src/columnMove/columnDrag/bodyDropPivotTarget.ts
var BodyDropPivotTarget = class extends BeanStub {
constructor(pinned) {
super();
this.pinned = pinned;
this.columnsToAggregate = [];
this.columnsToGroup = [];
this.columnsToPivot = [];
}
/** Callback for when drag enters */
onDragEnter(draggingEvent) {
this.clearColumnsList();
if (this.gos.get("functionsReadOnly")) {
return;
}
const dragColumns = draggingEvent.dragItem.columns;
if (!dragColumns) {
return;
}
dragColumns.forEach((column) => {
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) {
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();
}
};
// packages/ag-grid-community/src/columnMove/internalColumnMoveUtils.ts
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) {
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;
}
const allMovingColumnsOrdered = allMovingColumns.slice();
sortColsLikeCols(colModel.getCols(), allMovingColumnsOrdered);
const validMoves = calculateValidMoves({
movingCols: allMovingColumnsOrdered,
draggingRight: fromLeft,
xPosition,
pinned,
gos,
colModel,
visibleCols
});
const oldIndex = calculateOldIndex(allMovingColumnsOrdered, colModel);
if (validMoves.length === 0) {
return;
}
const firstValidMove = validMoves[0];
let constrainDirection = oldIndex !== null && !fromEnter;
if (isFromHeader) {
constrainDirection = oldIndex !== null;
}
if (constrainDirection && !fakeEvent) {
if (!fromLeft && firstValidMove >= oldIndex) {
return;
}
if (fromLeft && firstValidMove <= oldIndex) {
return;
}
}
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 (!_areEqual(displayedOrder, targetOrder)) {
break;
}
const fragCount = groupFragCount(order);
potentialMoves.push({ move, fragCount });
}
if (potentialMoves.length === 0) {
return;
}
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 };
}
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 };
}
function calculateOldIndex(movingCols, colModel) {
const gridCols = colModel.getCols();
const indexes = _sortNumerically(movingCols.map((col) => gridCols.indexOf(col)));
const firstIndex = indexes[0];
const lastIndex = _last(indexes);
const spread = lastIndex - firstIndex;
const gapsExist = spread !== indexes.length - 1;
return gapsExist ? null : firstIndex;
}
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]);
[a, b] = a.length > b.length ? [a, b] : [b, a];
a.forEach((parent) => {
if (b.indexOf(parent) === -1) {
count++;
}
});
}
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 [];
}
const allDisplayedCols = getDisplayedColumns(visibleCols, pinned);
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));
let displayIndex = 0;
let availableWidth = xPosition;
if (draggingRight) {
let widthOfMovingDisplayedCols = 0;
movingDisplayedCols.forEach((col) => widthOfMovingDisplayedCols += col.getActualWidth());
availableWidth -= widthOfMovingDisplayedCols;
}
if (availableWidth > 0) {
for (let i = 0; i < otherDisplayedCols.length; i++) {
const col = otherDisplayedCols[i];
availableWidth -= col.getActualWidth();
if (availableWidth < 0) {
break;
}
displayIndex++;
}
if (draggingRight) {
displayIndex++;
}
}
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;
if (draggingRight) {
let pointer = firstValidMove + 1;
const lastIndex = allGridCols.length - 1;
while (pointer <= lastIndex) {
validMoves.push(pointer);
pointer++;
}
validMoves.sort(numberComparator);
} else {
let pointer = firstValidMove;
const lastIndex = allGridCols.length - 1;
let displacedCol = allGridCols[pointer];
while (pointer <= lastIndex && allDisplayedCols.indexOf(displacedCol) < 0) {
pointer++;
validMoves.push(pointer);
displacedCol = allGridCols[pointer];
}
pointer = firstValidMove - 1;
const firstDisplayIndex = 0;
while (pointer >= firstDisplayIndex) {
validMoves.push(pointer);
pointer--;
}
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;
}
if (gos.get("enableRtl")) {
if (useHeaderRow) {
eViewport = eViewport.querySelector(".ag-header-row");
}
x = eViewport.clientWidth - x;
}
if (pinned == null && !skipScrollPadding) {
x += ctrlsSvc.get("center").getCenterViewportScrollLeft();
}
return x;
}
function setColumnsMoving(columns, isMoving) {
for (const column of columns) {
column.moving = isMoving;
column.dispatchColEvent("movingChanged", "uiColumnMoved");
}
}
// packages/ag-grid-community/src/columnMove/columnDrag/moveColumnFeature.ts
var MOVE_FAIL_THRESHOLD = 7;
var SCROLL_MOVE_WIDTH = 100;
var SCROLL_GAP_NEEDED_BEFORE_MOVE = SCROLL_MOVE_WIDTH / 2;
var SCROLL_ACCELERATION_RATE = 5;
var SCROLL_TIME_INTERVAL = 100;
var MoveColumnFeature = class extends BeanStub {
constructor(pinned) {
super();
this.pinned = pinned;
this.needToMoveLeft = false;
this.needToMoveRight = false;
this.lastMovedInfo = null;
this.isCenterContainer = !_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();
if (col.getColDef().lockPinned) {
if (colPinned == pinned) {
return "move";
}
continue;
}
if (colPinned === pinned || !pinned) {
return "move";
}
if (!colPinned && pinned) {
return "pinned";
}
}
return "notAllowed";
}
onDragEnter(draggingEvent) {
const dragItem = draggingEvent.dragItem;
const columns = dragItem.columns;
const dragCameFromToolPanel = draggingEvent.dragSource.type === 0 /* ToolPanel */;
if (dragCameFromToolPanel) {
this.setColumnsVisible(columns, true, "uiColumnDragged");
} else {
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 (!draggingEvent || !finished && _missing(draggingEvent.hDirection)) {
return;
}
const mouseX = normaliseX({
x: draggingEvent.x,
pinned: this.pinned,
gos,
ctrlsSvc
});
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) {
const isAttemptingToPin = this.isAttemptingToPin(allMovingColumns);
if (isAttemptingToPin) {
this.attemptToPinColumns(allMovingColumns, void 0, 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 === 1 /* HeaderCell */;
const params = this.getMoveColumnParams({
allMovingColumns,
isFromHeader,
xPosition: mouseX,
fromLeft,
fromEnter,
fakeEvent
});
const lastMovedInfo = 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;
}
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,
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) {
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 = _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 = 0 /* Before */;
} else {
position = 1 /* 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 === 0 /* 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 ? 1 /* After */ : 0 /* 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 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 } = 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;
}
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() {
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 {
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, void 0, 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;
}
};
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 };
}
// packages/ag-grid-community/src/columnMove/columnDrag/bodyDropTarget.ts
var BodyDropTarget = class extends 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(pinned));
this.bodyDropPivotTarget = this.createManagedBean(new BodyDropPivotTarget(pinned));
dragAndDrop.addDropTarget(this);
this.addDestroyFunc(() => dragAndDrop.removeDropTarget(this));
}
isInterestedIn(type) {
return type === 1 /* HeaderCell */ || type === 0 /* 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) {
return this.beans.colModel.isPivotMode() && draggingEvent.dragSource.type === 0 /* ToolPanel */;
}
onDragEnter(draggingEvent) {
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();
}
};
// packages/ag-grid-community/src/columnMove/columnMoveService.ts
var ColumnMoveService = class extends 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) {
_warn(30, { toIndex });
return;
}
colAnimation?.start();
const movedColumns = colModel.getColsForKeys(columnsToMoveKeys);
if (this.doesMovePassRules(movedColumns, toIndex)) {
_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) {
const proposedColumnOrder = this.getProposedColumnOrder(columnsToMove, toIndex);
return this.doesOrderPassRules(proposedColumnOrder);
}
doesOrderPassRules(gridOrder) {
const { colModel, gos } = this.beans;
if (!doesMovePassMarryChildren(gridOrder, colModel.getColTree())) {
return false;
}
const doesMovePassLockedPositions = (proposedColumnOrder) => {
const lockPositionToPlacement = (position) => {
if (!position) {
return 0 /* NONE */;
}
return position === "left" || position === true ? -1 /* LEFT */ : 1 /* RIGHT */;
};
const isRtl = gos.get("enableRtl");
let lastPlacement = isRtl ? 1 /* RIGHT */ : -1 /* LEFT */;
let rulePassed = true;
proposedColumnOrder.forEach((col) => {
const placement = lockPositionToPlacement(col.getColDef().lockPosition);
if (isRtl) {
if (placement > lastPlacement) {
rulePassed = false;
}
} else {
if (placement < lastPlacement) {
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();
_moveInArray(proposedColumnOrder, columnsToMove, toIndex);
return proposedColumnOrder;
}
createBodyDropTarget(pinned, dropContainer) {
return new 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 = isColumnGroup2(column);
const width = isGroup ? rect.width : column.getActualWidth();
const isLeft = hDirection === "left" !== gos.get("enableRtl");
const xPosition = normaliseX({
x: isLeft ? left - 20 : left + width + 20,
pinned,
fromKeyboard: true,
gos,
ctrlsSvc
});
const headerPosition = focusSvc.focusedHeader;
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] : _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 = isColumnGroup2(column);
const columns = isGroup ? column.getProvidedColumnGroup().getLeafColumns() : [column];
const getDragItem = isGroup ? () => createDragItemForGroup(column, visibleCols.allCols) : () => createDragItem(column);
const dragSource = {
type: 1 /* HeaderCell */,
eElement: eSource,
getDefaultIconName: () => hideColumnOnExit ? "hide" : "notAllowed",
getDragItem,
dragItemName: displayName,
onDragStarted: () => {
hideColumnOnExit = !gos.get("suppressDragLeaveHidesColumns");
setColumnsMoving(columns, true);
},
onDragStopped: () => setColumnsMoving(columns, false),
onDragCancelled: () => setColumnsMoving(columns, false),
onGridEnter: (dragItem) => {
if (hideColumnOnExit) {
const { columns: columns2 = [], visibleState } = dragItem ?? {};
const hasVisibleState = isGroup ? (col) => !visibleState || visibleState[col.getColId()] : () => true;
const unlockedColumns = columns2.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;
}
};
function findGroupWidthId(columnGroup, id) {
while (columnGroup) {
if (columnGroup.getGroupId() === id) {
return columnGroup;
}
columnGroup = columnGroup.getParent();
}
return void 0;
}
function createDragItem(column) {
const visibleState = {};
visibleState[column.getId()] = column.isVisible();
return {
columns: [column],
visibleState
};
}
function createDragItemForGroup(columnGroup, allCols) {
const allColumnsOriginalOrder = columnGroup.getProvidedColumnGroup().getLeafColumns();
const visibleState = {};
allColumnsOriginalOrder.forEach((column) => visibleState[column.getId()] = column.isVisible());
const allColumnsCurrentOrder = [];
allCols.forEach((column) => {
if (allColumnsOriginalOrder.indexOf(column) >= 0) {
allColumnsCurrentOrder.push(column);
_removeFromArray(allColumnsOriginalOrder, column);
}
});
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);
}
}
return {
columns: allColumnsCurrentOrder,
columnsInSplit,
visibleState
};
}
// packages/ag-grid-community/src/columnMove/columnMoveModule.ts
var ColumnMoveModule = {
moduleName: "ColumnMove",
version: VERSION,
beans: [ColumnMoveService, ColumnAnimationService],
apiFunctions: {
moveColumnByIndex,
moveColumns
},
dependsOn: [SharedDragAndDropModule],
css: [columnMovingCSS]
};
// packages/ag-grid-community/src/rendering/autoWidthCalculator.ts
var AutoWidthCalculator = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "autoWidthCalc";
}
postConstruct() {
this.beans.ctrlsSvc.whenReady(this, (p) => {
this.centerRowContainerCtrl = p.center;
});
}
// this is the trick: we create a dummy container and clone all the cells
// into the dummy, then check the dummy's width. then destroy the dummy
// as we don't need it any more.
// drawback: only the cells visible on the screen are considered
getPreferredWidthForColumn(column, skipHeader) {
const eHeaderCell = this.getHeaderCellForColumn(column);
if (!eHeaderCell) {
return -1;
}
const elements = this.beans.rowRenderer.getAllCellsNotSpanningForColumn(column);
if (!skipHeader) {
elements.push(eHeaderCell);
}
return this.getPreferredWidthForElements(elements);
}
getPreferredWidthForColumnGroup(columnGroup) {
const eHeaderCell = this.getHeaderCellForColumn(columnGroup);
if (!eHeaderCell) {
return -1;
}
return this.getPreferredWidthForElements([eHeaderCell]);
}
getPreferredWidthForElements(elements, extraPadding) {
const eDummyContainer = document.createElement("form");
eDummyContainer.style.position = "fixed";
const eBodyContainer = this.centerRowContainerCtrl.eContainer;
elements.forEach((el) => this.cloneItemIntoDummy(el, eDummyContainer));
eBodyContainer.appendChild(eDummyContainer);
const dummyContainerWidth = eDummyContainer.offsetWidth;
eBodyContainer.removeChild(eDummyContainer);
extraPadding = extraPadding ?? this.gos.get("autoSizePadding");
return dummyContainerWidth + extraPadding;
}
getHeaderCellForColumn(column) {
let element = null;
this.beans.ctrlsSvc.getHeaderRowContainerCtrls().forEach((container) => {
const res = container.getHtmlElementForColumnHeader(column);
if (res != null) {
element = res;
}
});
return element;
}
cloneItemIntoDummy(eCell, eDummyContainer) {
const eCellClone = eCell.cloneNode(true);
eCellClone.style.width = "";
eCellClone.style.position = "static";
eCellClone.style.left = "";
const eCloneParent = document.createElement("div");
const eCloneParentClassList = eCloneParent.classList;
const isHeader = ["ag-header-cell", "ag-header-group-cell"].some((cls) => eCellClone.classList.contains(cls));
if (isHeader) {
eCloneParentClassList.add("ag-header", "ag-header-row");
eCloneParent.style.position = "static";
} else {
eCloneParentClassList.add("ag-row");
}
let pointer = eCell.parentElement;
while (pointer) {
const isRow = ["ag-header-row", "ag-row"].some((cls) => pointer.classList.contains(cls));
if (isRow) {
for (let i = 0; i < pointer.classList.length; i++) {
const item = pointer.classList[i];
if (item != "ag-row-position-absolute") {
eCloneParentClassList.add(item);
}
}
break;
}
pointer = pointer.parentElement;
}
eCloneParent.appendChild(eCellClone);
eDummyContainer.appendChild(eCloneParent);
}
};
// packages/ag-grid-community/src/rendering/autoWidthModule.ts
var AutoWidthModule = {
moduleName: "AutoWidth",
version: VERSION,
beans: [AutoWidthCalculator]
};
// packages/ag-grid-community/src/columnResize/columnResizeApi.ts
function setColumnWidths(beans, columnWidths, finished = true, source = "api") {
beans.colResize?.setColumnWidths(columnWidths, false, finished, source);
}
// packages/ag-grid-community/src/columnResize/groupResizeFeature.ts
var GroupResizeFeature = class extends 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 = void 0;
columnSizeAndRatios.groupAfterStartWidth = void 0;
columnSizeAndRatios.groupAfterRatios = void 0;
}
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
});
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")) {
if (this.pinned !== "left") {
result *= -1;
}
} else if (this.pinned === "right") {
result *= -1;
}
return result;
}
destroy() {
super.destroy();
this.resizeCols = void 0;
this.resizeRatios = void 0;
this.resizeTakeFromCols = void 0;
this.resizeTakeFromRatios = void 0;
}
};
// packages/ag-grid-community/src/columnResize/resizeFeature.ts
var ResizeFeature = class extends 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 = () => {
_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 = _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")) {
if (notPinningLeft) {
result *= -1;
}
} else {
if (pinningRight) {
result *= -1;
}
}
return result;
}
};
// packages/ag-grid-community/src/columnResize/columnResizeService.ts
var ColumnResizeService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "colResize";
}
setColumnWidths(columnWidths, shiftKey, finished, 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]
});
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) {
if (finished) {
const columns = resizeSets && resizeSets.length > 0 ? resizeSets[0].columns : null;
dispatchColumnResizedEvent(this.eventSvc, columns, finished, source);
}
return;
}
const changedCols = [];
const allResizedCols = [];
resizeSets.forEach((set) => {
const { width, columns, ratios } = set;
const newWidths = {};
const finishedCols = {};
columns.forEach((col) => allResizedCols.push(col));
let finishedColsGrew = true;
let loopCount = 0;
while (finishedColsGrew) {
loopCount++;
if (loopCount > 1e3) {
_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;
}
});
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);
}
});
});
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();
}
const colsForEvent = allResizedCols.concat(flexedCols);
if (atLeastOneColChanged || finished) {
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(pinned, column, eResize, comp, ctrl);
}
createGroupResizeFeature(comp, eResize, pinned, columnGroup) {
return new GroupResizeFeature(comp, eResize, pinned, columnGroup);
}
};
function checkMinAndMaxWidthsForSet(columnResizeSet) {
const { columns, width } = columnResizeSet;
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 {
maxWidthActive = false;
}
});
const minWidthPasses = width >= minWidthAccumulated;
const maxWidthPasses = !maxWidthActive || width <= maxWidthAccumulated;
return minWidthPasses && maxWidthPasses;
}
// packages/ag-grid-community/src/columnResize/columnResizeModule.ts
var ColumnResizeModule = {
moduleName: "ColumnResize",
version: VERSION,
beans: [ColumnResizeService],
apiFunctions: {
setColumnWidths
},
dependsOn: [HorizontalResizeModule, AutoWidthModule]
};
// packages/ag-grid-community/src/headerRendering/cells/columnGroup/groupWidthFeature.ts
var GroupWidthFeature = class extends 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() {
this.addListenersToChildrenColumns();
this.addManagedListeners(this.columnGroup, {
displayedChildrenChanged: this.onDisplayedChildrenChanged.bind(this)
});
this.onWidthChanged();
this.addDestroyFunc(this.removeListenersOnChildrenColumns.bind(this));
}
addListenersToChildrenColumns() {
this.removeListenersOnChildrenColumns();
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);
}
};
// packages/ag-grid-community/src/headerRendering/cells/columnGroup/headerGroupCellCtrl.ts
var HeaderGroupCellCtrl = class extends 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 = 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(column, eGui, beans));
compBean.createManagedBean(new GroupWidthFeature(comp, column));
if (colResize) {
this.resizeFeature = compBean.createManagedBean(
colResize.createGroupResizeFeature(comp, eResize, pinned, column)
);
} else {
comp.setResizableDisplayed(false);
}
compBean.createManagedBean(
new ManagedFocusFeature(eGui, {
shouldStopEventPropagation: this.shouldStopEventPropagation.bind(this),
onTabKeyDown: () => void 0,
handleKeyDown: this.handleKeyDown.bind(this),
onFocusIn: this.onFocusIn.bind(this)
})
);
this.addHighlightListeners(compBean, leafCols);
compBean.addManagedPropertyListener("suppressMovableColumns", this.onSuppressColMoveChange);
this.addResizeAndMoveKeyboardListeners(compBean);
compBean.addDestroyFunc(() => this.clearComponent());
}
getHeaderClassParams() {
const { column, beans } = this;
const colDef = column.getDefinition();
return _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 = _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 === 1 /* After */;
const isHighlightBefore = highlighted === 0 /* 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;
if (!resizeFeature) {
return;
}
const initialValues = resizeFeature.getInitialValues(shiftKey);
resizeFeature.resizeColumns(initialValues, initialValues.resizeStartWidth + delta, "uiColumnResized", true);
}
resizeLeafColumnsToFit(source) {
this.resizeFeature?.resizeLeafColumnsToFit(source);
}
setupUserComp() {
const { colGroupSvc, userCompFactory, gos } = this.beans;
const params = _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 = _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, void 0, 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(void 0);
}
this.refreshHeaderStyles();
}
addClasses() {
const { column } = this;
const colGroupDef = column.getColGroupDef();
const classes = _getHeaderClassesFromColDef(colGroupDef, this.gos, null, column);
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();
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.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() {
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();
}
};
// packages/ag-grid-community/src/columns/columnGroups/columnGroupApi.ts
function setColumnGroupOpened(beans, group, newValue) {
beans.colGroupSvc?.setColumnGroupOpened(group, newValue, "api");
}
function getColumnGroup(beans, name, instanceId) {
return beans.colGroupSvc?.getColumnGroup(name, instanceId) ?? null;
}
function getProvidedColumnGroup(beans, name) {
return beans.colGroupSvc?.getProvidedColGroup(name) ?? null;
}
function getDisplayNameForColumnGroup(beans, columnGroup, location) {
return beans.colNames.getDisplayNameForColumnGroup(columnGroup, location) || "";
}
function getColumnGroupState(beans) {
return beans.colGroupSvc?.getColumnGroupState() ?? [];
}
function setColumnGroupState(beans, stateItems) {
beans.colGroupSvc?.setColumnGroupState(stateItems, "api");
}
function resetColumnGroupState(beans) {
beans.colGroupSvc?.resetColumnGroupState("api");
}
function getLeftDisplayedColumnGroups(beans) {
return beans.visibleCols.treeLeft;
}
function getCenterDisplayedColumnGroups(beans) {
return beans.visibleCols.treeCenter;
}
function getRightDisplayedColumnGroups(beans) {
return beans.visibleCols.treeRight;
}
function getAllDisplayedColumnGroups(beans) {
return beans.visibleCols.getAllTrees();
}
// packages/ag-grid-community/src/columns/visibleColsService.ts
function _removeAllFromUnorderedArray(array, toRemove) {
for (let i = 0; i < toRemove.length; i++) {
const index = array.indexOf(toRemove[i]);
if (index >= 0) {
array[index] = array[array.length - 1];
array.pop();
}
}
}
var VisibleColsService = class extends 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;
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 = getWidthOfColsInList(this.centerCols);
const newLeftWidth = getWidthOfColsInList(this.leftCols);
const newRightWidth = getWidthOfColsInList(this.rightCols);
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.eventSvc.dispatchEvent({
type: "columnContainerWidthChanged"
});
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 ? _last(rightCols) : null;
} else {
lastLeft = leftCols ? _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();
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 (isColumnGroup2(colOrGroup)) {
col = colOrGroup.getLeafColumns()[0];
} else {
col = colOrGroup;
}
return this.ariaOrderColumns.indexOf(col) + 1;
}
setLeftValuesOfGroups() {
[this.treeLeft, this.treeRight, this.treeCenter].forEach((columns) => {
columns.forEach((column) => {
if (isColumnGroup2(column)) {
const columnGroup = column;
columnGroup.checkLeft();
}
});
});
}
setLeftValuesOfCols(source) {
const { colModel } = this.beans;
const primaryCols = colModel.getColDefCols();
if (!primaryCols) {
return;
}
const allColumns = colModel.getCols().slice(0);
const doingRtl = this.gos.get("enableRtl");
[this.leftCols, this.rightCols, this.centerCols].forEach((columns) => {
if (doingRtl) {
let left = getWidthOfColsInList(columns);
columns.forEach((column) => {
left -= column.getActualWidth();
column.setLeft(left, source);
});
} else {
let left = 0;
columns.forEach((column) => {
column.setLeft(left, source);
left += column.getActualWidth();
});
}
_removeAllFromUnorderedArray(allColumns, columns);
});
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;
}
let filterPasses;
if (filterCallback) {
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()];
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 ? _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 getWidthOfColsInList(this.leftCols);
}
// note: this should be cached
getDisplayedColumnsRightWidth() {
return getWidthOfColsInList(this.rightCols);
}
isColAtEdge(col, edge) {
const allColumns = this.allCols;
if (!allColumns.length) {
return false;
}
const isFirst = edge === "first";
let columnToCompare;
if (isColumnGroup2(col)) {
const leafColumns = col.getDisplayedLeafColumns();
if (!leafColumns.length) {
return false;
}
columnToCompare = isFirst ? leafColumns[0] : _last(leafColumns);
} else {
columnToCompare = col;
}
return (isFirst ? allColumns[0] : _last(allColumns)) === columnToCompare;
}
};
function depthFirstAllColumnTreeSearch(tree, useDisplayedChildren, callback) {
if (!tree) {
return;
}
for (let i = 0; i < tree.length; i++) {
const child = tree[i];
if (isColumnGroup2(child)) {
const childTree = useDisplayedChildren ? child.getDisplayedChildren() : child.getChildren();
depthFirstAllColumnTreeSearch(childTree, useDisplayedChildren, callback);
}
callback(child);
}
}
function pickDisplayedCols(tree) {
const res = [];
depthFirstAllColumnTreeSearch(tree, true, (child) => {
if (isColumn(child)) {
res.push(child);
}
});
return res;
}
// packages/ag-grid-community/src/columns/columnGroups/columnGroupService.ts
var ColumnGroupService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "colGroupSvc";
}
getColumnGroupState() {
const columnGroupState = [];
const gridBalancedTree = this.beans.colModel.getColTree();
depthFirstOriginalTreeSearch(null, gridBalancedTree, (node) => {
if (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 = [];
depthFirstOriginalTreeSearch(null, primaryColumnTree, (child) => {
if (isProvidedColumnGroup(child)) {
const colGroupDef = child.getColGroupDef();
const groupState = {
groupId: child.getGroupId(),
open: !colGroupDef ? void 0 : 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] : void 0,
columnGroups: impactedGroups
});
}
colAnimation?.finish();
}
// called by headerRenderer - when a header is opened or closed
setColumnGroupOpened(key, newValue, source) {
let keyAsString;
if (isProvidedColumnGroup(key)) {
keyAsString = key.getId();
} else {
keyAsString = key || "";
}
this.setColumnGroupState([{ groupId: keyAsString, open: newValue }], source);
}
getProvidedColGroup(key) {
let res = null;
depthFirstOriginalTreeSearch(null, this.beans.colModel.getColTree(), (node) => {
if (isProvidedColumnGroup(node)) {
if (node.getId() === key) {
res = node;
}
}
});
return res;
}
getGroupAtDirection(columnGroup, direction) {
const requiredLevel = columnGroup.getProvidedColumnGroup().getLevel() + columnGroup.getPaddingLevel();
const colGroupLeafColumns = columnGroup.getDisplayedLeafColumns();
const col = direction === "After" ? _last(colGroupLeafColumns) : colGroupLeafColumns[0];
const getDisplayColMethod = `getCol${direction}`;
while (true) {
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) {
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();
depthFirstAllColumnTreeSearch(allColumnGroups, false, (child) => {
if (isColumnGroup2(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 (isColumnGroup2(colId)) {
return colId;
}
const allColumnGroups = this.beans.visibleCols.getAllTrees();
const checkPartId = typeof partId === "number";
let result = null;
depthFirstAllColumnTreeSearch(allColumnGroups, false, (child) => {
if (isColumnGroup2(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);
const topLevelResultCols = [];
let groupsOrColsAtCurrentLevel = columns;
while (groupsOrColsAtCurrentLevel.length) {
const currentlyIterating = groupsOrColsAtCurrentLevel;
groupsOrColsAtCurrentLevel = [];
let lastGroupedColIdx = 0;
const createGroupToIndex = (to) => {
const from = lastGroupedColIdx;
lastGroupedColIdx = to;
const previousNode = currentlyIterating[from];
const previousNodeProvided = isColumnGroup2(previousNode) ? previousNode.getProvidedColumnGroup() : previousNode;
const previousNodeParent = previousNodeProvided.getOriginalParent();
if (previousNodeParent == null) {
for (let i = from; i < to; i++) {
topLevelResultCols.push(currentlyIterating[i]);
}
return;
}
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 = isColumnGroup2(thisNode) ? thisNode.getProvidedColumnGroup() : thisNode;
const thisNodeParent = thisNodeProvided.getOriginalParent();
const previousNode = currentlyIterating[lastGroupedColIdx];
const previousNodeProvided = isColumnGroup2(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(colGroupDefMerged, groupId, false, level);
this.createBean(providedGroup);
const existingGroupAndIndex = this.findExistingGroup(colGroupDef, existingGroups);
if (existingGroupAndIndex) {
existingGroups.splice(existingGroupAndIndex.idx, 1);
}
const existingGroup = existingGroupAndIndex?.group;
if (existingGroup) {
providedGroup.setExpanded(existingGroup.isExpanded());
}
const children = _recursivelyCreateColumns(
this.beans,
colGroupDefMerged.children,
level + 1,
primaryColumns,
existingColumns,
columnKeyCreator,
existingGroups,
source
);
providedGroup.setChildren(children);
return providedGroup;
}
balanceColumnTree(unbalancedTree, currentDept, columnDept, columnKeyCreator) {
const result = [];
for (let i = 0; i < unbalancedTree.length; i++) {
const child = unbalancedTree[i];
if (isProvidedColumnGroup(child)) {
const originalGroup = child;
const newChildren = this.balanceColumnTree(
originalGroup.getChildren(),
currentDept + 1,
columnDept,
columnKeyCreator
);
originalGroup.setChildren(newChildren);
result.push(originalGroup);
} else {
let firstPaddedGroup;
let currentPaddedGroup;
for (let j = columnDept - 1; j >= currentDept; j--) {
const newColId = columnKeyCreator.getUniqueKey(null, null);
const colGroupDefMerged = this.createMergedColGroupDef(null, newColId);
const paddedGroup = new AgProvidedColumnGroup(colGroupDefMerged, newColId, true, currentDept);
this.createBean(paddedGroup);
if (currentPaddedGroup) {
currentPaddedGroup.setChildren([paddedGroup]);
}
currentPaddedGroup = paddedGroup;
if (!firstPaddedGroup) {
firstPaddedGroup = currentPaddedGroup;
}
}
if (firstPaddedGroup && currentPaddedGroup) {
result.push(firstPaddedGroup);
const hasGroups = unbalancedTree.some((leaf) => 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] && 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 (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) => {
let nextChild = col;
for (let i = depth - 1; i >= 0; i--) {
const autoGroup = new 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;
}
tree.push(nextChild);
});
return tree;
}
createMergedColGroupDef(colGroupDef, groupId) {
const colGroupDefMerged = {};
const { gos, validation: validation2 } = this.beans;
Object.assign(colGroupDefMerged, gos.get("defaultColGroupDef"));
Object.assign(colGroupDefMerged, colGroupDef);
validation2?.validateColDef(colGroupDefMerged, groupId);
return colGroupDefMerged;
}
findExistingGroup(newGroupDef, existingGroups) {
const newHasId = newGroupDef.groupId != null;
if (!newHasId) {
return void 0;
}
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 void 0;
}
createColumnGroup(providedGroup, groupInstanceIdCreator, oldColumnsMapped, pinned, isStandaloneStructure) {
const groupId = providedGroup.getGroupId();
const instanceId = groupInstanceIdCreator.getInstanceIdForKey(groupId);
const uniqueId = createUniqueColumnGroupId(groupId, instanceId);
let columnGroup = oldColumnsMapped[uniqueId];
if (columnGroup && columnGroup.getProvidedColumnGroup() !== providedGroup) {
columnGroup = null;
}
if (_exists(columnGroup)) {
columnGroup.reset();
} else {
columnGroup = new 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 (isColumnGroup2(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 (isColumnGroup2(columnsOrGroup)) {
const columnGroup = columnsOrGroup;
this.setupParentsIntoCols(columnGroup.getChildren(), columnGroup);
}
});
}
};
// packages/ag-grid-community/src/columns/columnGroups/columnGroupModule.ts
var ColumnGroupModule = {
moduleName: "ColumnGroup",
version: VERSION,
dynamicBeans: { headerGroupCellCtrl: HeaderGroupCellCtrl },
beans: [ColumnGroupService],
apiFunctions: {
getAllDisplayedColumnGroups,
getCenterDisplayedColumnGroups,
getColumnGroup,
getColumnGroupState,
getDisplayNameForColumnGroup,
getLeftDisplayedColumnGroups,
getProvidedColumnGroup,
getRightDisplayedColumnGroups,
resetColumnGroupState,
setColumnGroupOpened,
setColumnGroupState
}
};
// packages/ag-grid-community/src/rendering/cellRenderers/cellRendererModule.ts
var CheckboxCellRendererModule = {
moduleName: "CheckboxCellRenderer",
version: VERSION,
userComponents: {
agCheckboxCellRenderer: CheckboxCellRenderer
}
};
// packages/ag-grid-community/src/columns/columnApi.ts
function getColumnDef(beans, key) {
const column = beans.colModel.getColDefCol(key);
if (column) {
return column.getColDef();
}
return null;
}
function getColumnDefs(beans) {
return beans.colModel.getColumnDefs();
}
function getDisplayNameForColumn(beans, column, location) {
return beans.colNames.getDisplayNameForColumn(column, location) || "";
}
function getColumn(beans, key) {
return beans.colModel.getColDefCol(key);
}
function getColumns(beans) {
return beans.colModel.getColDefCols();
}
function applyColumnState(beans, params) {
return _applyColumnState(beans, params, "api");
}
function getColumnState(beans) {
return _getColumnState(beans);
}
function resetColumnState(beans) {
_resetColumnState(beans, "api");
}
function isPinning(beans) {
return beans.visibleCols.isPinningLeft() || beans.visibleCols.isPinningRight();
}
function isPinningLeft(beans) {
return beans.visibleCols.isPinningLeft();
}
function isPinningRight(beans) {
return beans.visibleCols.isPinningRight();
}
function getDisplayedColAfter(beans, col) {
return beans.visibleCols.getColAfter(col);
}
function getDisplayedColBefore(beans, col) {
return beans.visibleCols.getColBefore(col);
}
function setColumnsVisible(beans, keys, visible) {
beans.colModel.setColsVisible(keys, visible, "api");
}
function setColumnsPinned(beans, keys, pinned) {
beans.pinnedCols?.setColsPinned(keys, pinned, "api");
}
function getAllGridColumns(beans) {
return beans.colModel.getCols();
}
function getDisplayedLeftColumns(beans) {
return beans.visibleCols.leftCols;
}
function getDisplayedCenterColumns(beans) {
return beans.visibleCols.centerCols;
}
function getDisplayedRightColumns(beans) {
return beans.visibleCols.rightCols;
}
function getAllDisplayedColumns(beans) {
return beans.visibleCols.allCols;
}
function getAllDisplayedVirtualColumns(beans) {
return beans.colViewport.getViewportColumns();
}
// packages/ag-grid-community/src/columns/columnDefFactory.ts
function _deepCloneDefinition(object, keysToSkip) {
if (!object) {
return;
}
const obj = object;
const res = {};
Object.keys(obj).forEach((key) => {
if (keysToSkip && keysToSkip.indexOf(key) >= 0 || SKIP_JS_BUILTINS.has(key)) {
return;
}
const value = obj[key];
const sourceIsSimpleObject = typeof value === "object" && value !== null && value.constructor === Object;
if (sourceIsSimpleObject) {
res[key] = _deepCloneDefinition(value);
} else {
res[key] = value;
}
});
return res;
}
var ColumnDefFactory = class extends 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;
if (pointer.isPadding()) {
pointer = pointer.getOriginalParent();
continue;
}
const existingParentDef = colGroupDefs[pointer.getGroupId()];
if (existingParentDef) {
existingParentDef.children.push(childDef);
addToResult = false;
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;
}
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() ? void 0 : 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;
}
};
// packages/ag-grid-community/src/columns/columnFlexService.ts
var ColumnFlexService = class extends 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);
for (let i = visibleCenterCols.length - 1; i >= 0; i--) {
if (allResizingCols.has(visibleCenterCols[i])) {
flexAfterDisplayIndex = i;
break;
}
}
}
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;
for (const item of items) {
if (!item.isFlex) {
freeze(item, item.initialSize);
}
}
while (unfrozenItemCount > 0) {
const spaceToFill = Math.round(unfrozenFlex < 1 ? unfrozenSpace * unfrozenFlex : unfrozenSpace);
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) {
lastUnfrozenItem.targetSize += spaceToFill - actualLeft;
}
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 ? void 0 : clampedSize < unclampedSize ? "max" : "min";
item.targetSize = clampedSize;
}
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);
dispatchColumnResizedEvent(this.eventSvc, changedColumns, true, source, flexingColumns);
}
return unconstrainedFlexColumns;
}
initCol(column) {
const { flex, initialFlex } = column.colDef;
if (flex !== void 0) {
column.flex = flex;
} else if (initialFlex !== void 0) {
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");
}
};
// packages/ag-grid-community/src/columns/dataTypeService.ts
var DataTypeService = class extends 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) {
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) {
baseDataTypeDefinition = overriddenBaseDataTypeDefinition;
}
if (!validateDataTypeDefinition(dataTypeDefinition, baseDataTypeDefinition, extendsCellDataType)) {
return void 0;
}
mergedDataTypeDefinition = mergeDataTypeDefinitions(baseDataTypeDefinition, dataTypeDefinition);
} else {
if (alreadyProcessedDataTypes.includes(extendsCellDataType)) {
_warn(44);
return void 0;
}
const extendedDataTypeDefinition = dataTypeDefinitions[extendsCellDataType];
if (!validateDataTypeDefinition(dataTypeDefinition, extendedDataTypeDefinition, extendsCellDataType)) {
return void 0;
}
const mergedExtendedDataTypeDefinition = this.processDataTypeDefinition(
extendedDataTypeDefinition,
dataTypeDefinitions,
[...alreadyProcessedDataTypes, extendsCellDataType],
defaultDataTypes
);
if (!mergedExtendedDataTypeDefinition) {
return void 0;
}
mergedDataTypeDefinition = mergeDataTypeDefinitions(mergedExtendedDataTypeDefinition, dataTypeDefinition);
}
return {
...mergedDataTypeDefinition,
groupSafeValueFormatter: createGroupSafeValueFormatter(mergedDataTypeDefinition, this.gos)
};
}
updateColDefAndGetColumnType(colDef, userColDef, colId) {
let { cellDataType } = userColDef;
const { field } = userColDef;
if (cellDataType === void 0) {
cellDataType = colDef.cellDataType;
}
if (cellDataType == null || cellDataType === true) {
cellDataType = this.canInferCellDataType(colDef, userColDef) ? this.inferCellDataType(field, colId) : false;
}
if (!cellDataType) {
colDef.cellDataType = false;
return void 0;
}
const dataTypeDefinition = this.dataTypeDefinitions[cellDataType];
if (!dataTypeDefinition) {
_warn(47, { cellDataType });
return void 0;
}
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 (!_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 = 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 void 0;
}
let value;
const initialData = this.getInitialData();
if (initialData) {
const fieldContainsDots = field.indexOf(".") >= 0 && !this.gos.get("suppressFieldDotNotation");
value = _getValueUsingField(initialData, field, fieldContainsDots);
} else {
this.initWaitForRowData(colId);
}
if (value == null) {
return void 0;
}
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] = /* @__PURE__ */ 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) {
_applyColumnState(this.beans, { state }, "cellDataTypeInferred");
}
this.initialData = null;
}
generateColumnStateForRowGroupAndPivotIndexes(updatedRowGroupColumnState, updatedPivotColumnState) {
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 = _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 void 0;
}
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) => _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.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 colDef2 = column?.getColDef();
if (!column || !colDef2) {
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 : _toStringOrNull(params.newValue),
dataTypeMatcher: (value) => typeof value === "string"
},
boolean: {
baseDataType: "boolean",
valueParser: (params) => {
if (params.newValue == null) {
return params.newValue;
}
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) => _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 _serialiseDate(params.value, false) ?? "";
},
dataTypeMatcher: (value) => value instanceof Date
},
dateString: {
baseDataType: "dateString",
dateParser: (value) => _parseDateTimeFromString(value) ?? void 0,
dateFormatter: (value) => _serialiseDate(value ?? null, false) ?? void 0,
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) => _toStringOrNull(params.value) ?? ""
}
};
}
destroyColumnStateUpdateListeners() {
this.columnStateUpdateListenerDestroyFuncs.forEach((destroyFunc) => destroyFunc());
this.columnStateUpdateListenerDestroyFuncs = [];
}
destroy() {
this.dataTypeDefinitions = {};
this.dataTypeMatchers = {};
this.formatValueFuncs = {};
this.columnStateUpdatesPendingInference = {};
this.destroyColumnStateUpdateListeners();
super.destroy();
}
};
function mergeDataTypeDefinitions(parentDataTypeDefinition, childDataTypeDefinition) {
const mergedDataTypeDefinition = {
...parentDataTypeDefinition,
...childDataTypeDefinition
};
if (parentDataTypeDefinition.columnTypes && childDataTypeDefinition.columnTypes && childDataTypeDefinition.appendColumnTypes) {
mergedDataTypeDefinition.columnTypes = [
...convertColumnTypes(parentDataTypeDefinition.columnTypes),
...convertColumnTypes(childDataTypeDefinition.columnTypes)
];
}
return mergedDataTypeDefinition;
}
function validateDataTypeDefinition(dataTypeDefinition, parentDataTypeDefinition, parentCellDataType) {
if (!parentDataTypeDefinition) {
_warn(45, { parentCellDataType });
return false;
}
if (parentDataTypeDefinition.baseDataType !== dataTypeDefinition.baseDataType) {
_warn(46);
return false;
}
return true;
}
function createGroupSafeValueFormatter(dataTypeDefinition, gos) {
if (!dataTypeDefinition.valueFormatter) {
return void 0;
}
return (params) => {
if (params.node?.group) {
const aggFunc = (params.colDef.pivotValueColumn ?? params.column).getAggFunc();
if (aggFunc) {
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 void 0;
}
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
});
}
}
}
return void 0;
}
if (gos.get("groupDisplayType") === "groupRows" && !gos.get("treeData")) {
return void 0;
}
} else if (gos.get("groupHideOpenParents") && params.column.isRowGroupActive()) {
if (typeof params.value === "string" && !dataTypeDefinition.dataTypeMatcher?.(params.value)) {
return void 0;
}
}
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 === void 0 ? !!value : value === comparisonValue;
}
}
function doColDefPropsPreventInference(colDef, propsToCheckForInference) {
return [
["cellRenderer", "agSparklineCellRenderer"],
["valueGetter", void 0],
["valueParser", void 0],
["refData", void 0]
].some(
([prop, comparisonValue]) => doesColDefPropPreventInference(colDef, propsToCheckForInference, prop, comparisonValue)
);
}
function getUpdatedColumnState(column, columnStateUpdates) {
const columnState = getColumnStateFromColDef(column);
columnStateUpdates.forEach((key) => {
delete columnState[key];
if (key === "rowGroup") {
delete columnState.rowGroupIndex;
} else if (key === "pivot") {
delete columnState.pivotIndex;
}
});
return columnState;
}
// packages/ag-grid-community/src/columns/columnModule.ts
var DataTypeModule = {
moduleName: "DataType",
version: VERSION,
beans: [DataTypeService],
dependsOn: [CheckboxCellRendererModule]
};
var ColumnFlexModule = {
moduleName: "ColumnFlex",
version: VERSION,
beans: [ColumnFlexService]
};
var ColumnApiModule = {
moduleName: "ColumnApi",
version: VERSION,
beans: [ColumnDefFactory],
apiFunctions: {
getColumnDef,
getDisplayNameForColumn,
getColumn,
getColumns,
applyColumnState,
getColumnState,
resetColumnState,
isPinning,
isPinningLeft,
isPinningRight,
getDisplayedColAfter,
getDisplayedColBefore,
setColumnsVisible,
setColumnsPinned,
getAllGridColumns,
getDisplayedLeftColumns,
getDisplayedCenterColumns,
getDisplayedRightColumns,
getAllDisplayedColumns,
getAllDisplayedVirtualColumns,
getColumnDefs
}
};
// packages/ag-grid-community/src/columns/columnNameService.ts
function _camelCaseToHumanText(camelCase) {
if (!camelCase || camelCase == null) {
return null;
}
const rex = /([a-z])([A-Z])/g;
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(" ");
}
var ColumnNameService = class extends 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 = _addGridCommonParams(this.gos, {
colDef,
column,
columnGroup,
providedColumnGroup,
location
});
if (typeof headerValueGetter === "function") {
return headerValueGetter(params);
} else if (typeof headerValueGetter === "string") {
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 "";
}
};
// packages/ag-grid-community/src/columns/columnViewportService.ts
var ColumnViewportService = class extends 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;
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()) {
this.colsWithinViewport = displayedColumnsCenter;
this.headerColsWithinViewport = displayedColumnsCenter;
} else {
this.colsWithinViewport = displayedColumnsCenter.filter(this.isColumnInRowViewport.bind(this));
this.headerColsWithinViewport = displayedColumnsCenter.filter(this.isColumnInHeaderViewport.bind(this));
}
}
isColumnVirtualisationSuppressed() {
return this.suppressColumnVirtualisation || this.viewportRight === 0;
}
clear(suppressHashClear) {
this.rowsOfHeadersToRenderLeft = {};
this.rowsOfHeadersToRenderRight = {};
this.rowsOfHeadersToRenderCenter = {};
if (!suppressHashClear) {
this.colsWithinViewportHash = "";
}
}
isColumnInHeaderViewport(col) {
if (col.isAutoHeaderHeight() || isAnyParentAutoHeaderHeight(col)) {
return true;
}
return this.isColumnInRowViewport(col);
}
isColumnInRowViewport(col) {
if (col.isAutoHeight()) {
return true;
}
const columnLeft = col.getLeft() || 0;
const columnRight = columnLeft + col.getActualWidth();
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 _exists(left) && left > this.viewportLeft;
};
const inViewportCallback = this.isColumnVirtualisationSuppressed() ? void 0 : 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() {
this.clear(true);
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++) {
const child = children[i];
let addThisItem = false;
if (isColumn(child)) {
addThisItem = renderedColIds[child.getId()] === true;
} else {
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;
}
};
function isAnyParentAutoHeaderHeight(col) {
while (col) {
if (col.isAutoHeaderHeight()) {
return true;
}
col = col.getParent();
}
return false;
}
// packages/ag-grid-community/src/components/framework/agComponentUtils.ts
var AgComponentUtils = class extends 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 type2 = typeof callbackResult;
if (type2 === "string" || type2 === "number" || type2 === "boolean") {
this.eGui = _loadTemplate("" + callbackResult + "");
return;
}
if (callbackResult == null) {
this.eGui = _loadTemplate("");
return;
}
this.eGui = callbackResult;
}
}
return Adapter;
}
};
// packages/ag-grid-community/src/components/framework/cellRendererFunctionModule.ts
var CellRendererFunctionModule = {
moduleName: "CellRendererFunction",
version: VERSION,
beans: [AgComponentUtils]
};
// packages/ag-grid-community/src/components/framework/registry.ts
var Registry = class extends 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(module2) {
const { icons, userComponents, dynamicBeans, selectors } = module2;
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;
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(_errMsg(256));
}
return void 0;
}
return new BeanClass(...args);
}
getSelector(name) {
return this.selectors[name];
}
getIcon(name) {
return this.icons[name];
}
};
// packages/ag-grid-community/src/ctrlsService.ts
var NUM_CTRLS = 23;
var CtrlsService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "ctrlsSvc";
this.params = {};
this.ready = false;
this.readyCallbacks = [];
}
postConstruct() {
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);
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(() => {
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(() => {
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;
}
};
// packages/ag-grid-community/src/theming/core/core.css-GENERATED.ts
var coreCSS = (
/*css*/
`:where(.ag-root-wrapper,.ag-popup,.ag-dnd-ghost,.ag-chart),:where(.ag-root-wrapper,.ag-popup,.ag-dnd-ghost,.ag-chart) :where([class^=ag-]){box-sizing:border-box;&:after,&:before{box-sizing:border-box}&:where(div,span,label):focus-visible{box-shadow:inset var(--ag-focus-shadow);outline:none}}:where(.ag-root-wrapper,.ag-popup,.ag-dnd-ghost,.ag-chart) :where([class^=ag-]) ::-ms-clear{display:none}.ag-aria-description-container{border:0;z-index:9999;clip:rect(1px,1px,1px,1px);height:1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.ag-hidden{display:none!important}.ag-invisible{visibility:hidden!important}.ag-unselectable{-webkit-user-select:none;-moz-user-select:none;user-select:none}.ag-selectable{-webkit-user-select:text;-moz-user-select:text;user-select:text}.ag-tab-guard{display:block;height:0;position:absolute;width:0}:where(.ag-virtual-list-viewport) .ag-tab-guard{position:sticky}.ag-tab-guard-top{top:1px}.ag-tab-guard-bottom{bottom:1px}.ag-shake-left-to-right{animation-direction:alternate;animation-duration:.2s;animation-iteration-count:infinite;animation-name:ag-shake-left-to-right}@keyframes ag-shake-left-to-right{0%{padding-left:6px;padding-right:2px}to{padding-left:2px;padding-right:6px}}.ag-body-horizontal-scroll-viewport,.ag-body-vertical-scroll-viewport,.ag-body-viewport,.ag-center-cols-viewport,.ag-floating-bottom-viewport,.ag-floating-top-viewport,.ag-header-viewport,.ag-sticky-bottom-viewport,.ag-sticky-top-viewport,.ag-virtual-list-viewport{flex:1 1 auto;height:100%;min-width:0;overflow:hidden;position:relative}.ag-viewport{position:relative}.ag-spanning-container{position:absolute;top:0;z-index:1}.ag-body-viewport,.ag-center-cols-viewport,.ag-floating-bottom-viewport,.ag-floating-top-viewport,.ag-header-viewport,.ag-sticky-bottom-viewport,.ag-sticky-top-viewport{overflow-x:auto;-ms-overflow-style:none!important;scrollbar-width:none!important;&::-webkit-scrollbar{display:none!important}}.ag-body-viewport{display:flex;overflow-x:hidden;&:where(.ag-layout-normal){overflow-y:auto;-webkit-overflow-scrolling:touch}}.ag-sticky-bottom-container,.ag-sticky-top-container{min-height:1px}.ag-center-cols-viewport{min-height:100%;width:100%}.ag-body-horizontal-scroll-viewport{overflow-x:scroll}.ag-body-vertical-scroll-viewport{overflow-y:scroll}.ag-virtual-list-viewport{overflow:auto;width:100%}.ag-body-container,.ag-body-horizontal-scroll-container,.ag-body-vertical-scroll-container,.ag-center-cols-container,.ag-floating-bottom-container,.ag-floating-bottom-full-width-container,.ag-floating-top-container,.ag-full-width-container,.ag-header-container,.ag-pinned-left-cols-container,.ag-pinned-right-cols-container,.ag-sticky-bottom-container,.ag-sticky-top-container,.ag-virtual-list-container{position:relative}.ag-floating-bottom-container,.ag-floating-top-container,.ag-header-container,.ag-pinned-left-floating-bottom,.ag-pinned-left-floating-top,.ag-pinned-right-floating-bottom,.ag-pinned-right-floating-top,.ag-sticky-bottom-container,.ag-sticky-top-container{height:100%;white-space:nowrap}.ag-center-cols-container,.ag-pinned-right-cols-container{display:block}.ag-body-horizontal-scroll-container{height:100%}.ag-body-vertical-scroll-container{width:100%}.ag-floating-bottom-full-width-container,.ag-floating-top-full-width-container,.ag-full-width-container,.ag-sticky-bottom-full-width-container,.ag-sticky-top-full-width-container{pointer-events:none;position:absolute;top:0}:where(.ag-ltr) .ag-floating-bottom-full-width-container,:where(.ag-ltr) .ag-floating-top-full-width-container,:where(.ag-ltr) .ag-full-width-container,:where(.ag-ltr) .ag-sticky-bottom-full-width-container,:where(.ag-ltr) .ag-sticky-top-full-width-container{left:0}:where(.ag-rtl) .ag-floating-bottom-full-width-container,:where(.ag-rtl) .ag-floating-top-full-width-container,:where(.ag-rtl) .ag-full-width-container,:where(.ag-rtl) .ag-sticky-bottom-full-width-container,:where(.ag-rtl) .ag-sticky-top-full-width-container{right:0}.ag-full-width-container{width:100%}.ag-floating-bottom-full-width-container,.ag-floating-top-full-width-container{display:inline-block;height:100%;overflow:hidden;width:100%}.ag-virtual-list-container{overflow:hidden}.ag-body{display:flex;flex:1 1 auto;flex-direction:row!important;min-height:0;position:relative}.ag-body-horizontal-scroll,.ag-body-vertical-scroll{display:flex;min-height:0;min-width:0;position:relative;&:where(.ag-scrollbar-invisible){bottom:0;position:absolute;&:where(.ag-apple-scrollbar){opacity:0;transition:opacity .4s;visibility:hidden;&:where(.ag-scrollbar-scrolling,.ag-scrollbar-active){opacity:1;visibility:visible}}}}.ag-body-horizontal-scroll{width:100%;&:where(.ag-scrollbar-invisible){left:0;right:0}}.ag-body-vertical-scroll{height:100%;&:where(.ag-scrollbar-invisible){top:0;z-index:10}}:where(.ag-ltr) .ag-body-vertical-scroll{&:where(.ag-scrollbar-invisible){right:0}}:where(.ag-rtl) .ag-body-vertical-scroll{&:where(.ag-scrollbar-invisible){left:0}}.ag-force-vertical-scroll{overflow-y:scroll!important}.ag-horizontal-left-spacer,.ag-horizontal-right-spacer{height:100%;min-width:0;overflow-x:scroll;&:where(.ag-scroller-corner){overflow-x:hidden}}:where(.ag-row-animation) .ag-row{transition:transform .4s,top .4s,opacity .2s;&:where(.ag-after-created){transition:transform .4s,top .4s,height .4s,opacity .2s}}:where(.ag-row-no-animation) .ag-row{transition:none}.ag-row-loading{align-items:center;display:flex}.ag-row-position-absolute{position:absolute}.ag-row-position-relative{position:relative}.ag-full-width-row{overflow:hidden;pointer-events:all}.ag-row-inline-editing{z-index:1}.ag-row-dragging{z-index:2}.ag-stub-cell{align-items:center;display:flex}.ag-cell{display:inline-block;height:100%;position:absolute;white-space:nowrap;&:focus-visible{box-shadow:none}}.ag-cell-value{flex:1 1 auto}.ag-cell-value,.ag-group-value{overflow:hidden;text-overflow:ellipsis}.ag-cell-wrap-text{white-space:normal;word-break:break-word}:where(.ag-cell) .ag-icon{display:inline-block;vertical-align:middle}.ag-floating-top{border-bottom:var(--ag-pinned-row-border)}.ag-floating-bottom,.ag-floating-top{display:flex;overflow:hidden;position:relative;white-space:nowrap;width:100%}.ag-floating-bottom{border-top:var(--ag-pinned-row-border)}.ag-sticky-bottom,.ag-sticky-top{background-color:var(--ag-background-color);display:flex;height:0;overflow:hidden;position:absolute;width:100%;z-index:1}.ag-opacity-zero{opacity:0!important}.ag-cell-label-container{align-items:center;display:flex;flex-direction:row-reverse;height:100%;justify-content:space-between;width:100%}:where(.ag-right-aligned-header){.ag-cell-label-container{flex-direction:row}.ag-header-cell-text{text-align:end}}.ag-column-group-icons{display:block;>*{cursor:pointer}}:where(.ag-ltr){direction:ltr;.ag-body,.ag-body-horizontal-scroll,.ag-body-viewport,.ag-floating-bottom,.ag-floating-top,.ag-header,.ag-sticky-bottom,.ag-sticky-top{flex-direction:row}}:where(.ag-rtl){direction:rtl;text-align:right;.ag-body,.ag-body-horizontal-scroll,.ag-body-viewport,.ag-floating-bottom,.ag-floating-top,.ag-header,.ag-sticky-bottom,.ag-sticky-top{flex-direction:row-reverse}.ag-icon-contracted,.ag-icon-expanded,.ag-icon-tree-closed{display:block}}:where(.ag-rtl){.ag-icon-contracted,.ag-icon-expanded,.ag-icon-tree-closed{transform:rotate(180deg)}}:where(.ag-rtl){.ag-icon-contracted,.ag-icon-expanded,.ag-icon-tree-closed{transform:rotate(-180deg)}}.ag-measurement-container{height:0;overflow:hidden;visibility:hidden;width:0}.ag-measurement-element-border{display:inline-block;&:before{border-left:var(--ag-internal-measurement-border);content:"";display:block}}.ag-group{position:relative;width:100%}.ag-group-title-bar{align-items:center;display:flex;padding:var(--ag-spacing)}.ag-group-title{display:inline;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:where(.ag-group-title-bar) .ag-group-title{cursor:default}.ag-group-toolbar{align-items:center;display:flex;padding:var(--ag-spacing)}.ag-group-container{display:flex}.ag-disabled .ag-group-container{pointer-events:none}.ag-disabled-group-container,.ag-disabled-group-title-bar{opacity:.5}.ag-group-container-horizontal{flex-flow:row wrap}.ag-group-container-vertical{flex-direction:column}.ag-group-title-bar-icon{cursor:pointer;flex:none}:where(.ag-ltr) .ag-group-title-bar-icon{margin-right:var(--ag-spacing)}:where(.ag-rtl) .ag-group-title-bar-icon{margin-left:var(--ag-spacing)}:where(.ag-group-item-alignment-stretch) .ag-group-item{align-items:stretch}:where(.ag-group-item-alignment-start) .ag-group-item{align-items:flex-start}:where(.ag-group-item-alignment-end) .ag-group-item{align-items:flex-end}.ag-popup-child{top:0;z-index:5;&:where(:not(.ag-tooltip-custom)){box-shadow:var(--ag-popup-shadow)}}.ag-popup-editor{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none}.ag-large-text-input{display:block}:where(.ag-ltr) .ag-row:not(.ag-row-level-0) .ag-pivot-leaf-group{margin-left:var(--ag-row-group-indent-size)}:where(.ag-rtl) .ag-row:not(.ag-row-level-0) .ag-pivot-leaf-group{margin-right:var(--ag-row-group-indent-size)}:where(.ag-ltr) .ag-row-group-leaf-indent{margin-left:calc(var(--ag-cell-widget-spacing) + var(--ag-icon-size))}:where(.ag-rtl) .ag-row-group-leaf-indent{margin-right:calc(var(--ag-cell-widget-spacing) + var(--ag-icon-size))}.ag-value-change-delta{padding:0 2px}.ag-value-change-delta-up{color:var(--ag-value-change-delta-up-color)}.ag-value-change-delta-down{color:var(--ag-value-change-delta-down-color)}.ag-value-change-value{background-color:transparent;border-radius:1px;padding-left:1px;padding-right:1px;transition:background-color 1s}.ag-value-change-value-highlight{background-color:var(--ag-value-change-value-highlight-background-color);transition:background-color .1s}.ag-cell-data-changed{background-color:var(--ag-value-change-value-highlight-background-color)!important}.ag-cell-data-changed-animation{background-color:transparent}.ag-cell-highlight{background-color:var(--ag-range-selection-highlight-color)!important}.ag-row,.ag-spanned-row{color:var(--ag-cell-text-color);font-family:var(--ag-cell-font-family);font-size:var(--ag-data-font-size);white-space:nowrap;--ag-internal-content-line-height:calc(min(var(--ag-row-height), var(--ag-line-height, 1000px)) - var(--ag-internal-row-border-width, 1px) - 2px)}.ag-row{background-color:var(--ag-background-color);border-bottom:var(--ag-row-border);height:var(--ag-row-height);width:100%}:where(.ag-body-vertical-content-no-gap>div>div>div,.ag-body-vertical-content-no-gap>div>div>div>div)>.ag-row-last{border-bottom-color:transparent}.ag-sticky-bottom{border-top:var(--ag-row-border);box-sizing:content-box!important}.ag-group-contracted,.ag-group-expanded{cursor:pointer}.ag-cell,.ag-full-width-row .ag-cell-wrapper.ag-row-group{border:1px solid transparent;line-height:var(--ag-internal-content-line-height);-webkit-font-smoothing:subpixel-antialiased}:where(.ag-ltr) .ag-cell{border-right:var(--ag-column-border)}:where(.ag-rtl) .ag-cell{border-left:var(--ag-column-border)}.ag-spanned-cell-wrapper{background-color:var(--ag-background-color);position:absolute}.ag-spanned-cell-wrapper>.ag-spanned-cell{display:block;position:relative}:where(.ag-ltr) :where(.ag-body-horizontal-content-no-gap) .ag-column-last{border-right-color:transparent}:where(.ag-rtl) :where(.ag-body-horizontal-content-no-gap) .ag-column-last{border-left-color:transparent}.ag-cell-wrapper{align-items:center;display:flex;>:where(:not(.ag-cell-value,.ag-group-value)){align-items:center;display:flex;height:var(--ag-internal-content-line-height)}&:where(.ag-row-group){align-items:flex-start}:where(.ag-full-width-row) &:where(.ag-row-group){align-items:center;height:100%}}:where(.ag-ltr) .ag-cell-wrapper{padding-left:calc(var(--ag-indentation-level)*var(--ag-row-group-indent-size))}:where(.ag-rtl) .ag-cell-wrapper{padding-right:calc(var(--ag-indentation-level)*var(--ag-row-group-indent-size))}:where(.ag-cell-wrap-text:not(.ag-cell-auto-height)) .ag-cell-wrapper{align-items:normal;height:100%;:where(.ag-cell-value){height:100%}}:where(.ag-ltr) .ag-row>.ag-cell-wrapper.ag-row-group{padding-left:calc(var(--ag-cell-horizontal-padding) + var(--ag-row-group-indent-size)*var(--ag-indentation-level))}:where(.ag-rtl) .ag-row>.ag-cell-wrapper.ag-row-group{padding-right:calc(var(--ag-cell-horizontal-padding) + var(--ag-row-group-indent-size)*var(--ag-indentation-level))}.ag-cell-focus:not(.ag-cell-range-selected):focus-within,.ag-cell-range-single-cell,.ag-cell-range-single-cell.ag-cell-range-handle,.ag-context-menu-open .ag-cell-focus:not(.ag-cell-range-selected),.ag-context-menu-open .ag-full-width-row.ag-row-focus .ag-cell-wrapper.ag-row-group,.ag-full-width-row.ag-row-focus:focus .ag-cell-wrapper.ag-row-group{border:1px solid;border-color:var(--ag-range-selection-border-color);border-style:var(--ag-range-selection-border-style);outline:initial}.ag-full-width-row.ag-row-focus:focus{box-shadow:none}:where(.ag-ltr) .ag-group-contracted,:where(.ag-ltr) .ag-group-expanded,:where(.ag-ltr) .ag-row-drag,:where(.ag-ltr) .ag-selection-checkbox{margin-right:var(--ag-cell-widget-spacing)}:where(.ag-rtl) .ag-group-contracted,:where(.ag-rtl) .ag-group-expanded,:where(.ag-rtl) .ag-row-drag,:where(.ag-rtl) .ag-selection-checkbox{margin-left:var(--ag-cell-widget-spacing)}:where(.ag-ltr) .ag-group-child-count{margin-left:3px}:where(.ag-rtl) .ag-group-child-count{margin-right:3px}.ag-row-highlight-above:after,.ag-row-highlight-below:after{background-color:var(--ag-range-selection-border-color);content:"";height:1px;position:absolute;width:calc(100% - 1px)}:where(.ag-ltr) .ag-row-highlight-above:after,:where(.ag-ltr) .ag-row-highlight-below:after{left:1px}:where(.ag-rtl) .ag-row-highlight-above:after,:where(.ag-rtl) .ag-row-highlight-below:after{right:1px}.ag-row-highlight-above:after{top:0}.ag-row-highlight-below:after{bottom:0}.ag-row-odd{background-color:var(--ag-odd-row-background-color)}.ag-row-selected:before{background-color:var(--ag-selected-row-background-color);content:"";display:block;inset:0;pointer-events:none;position:absolute}.ag-row-hover.ag-full-width-row.ag-row-group:before,.ag-row-hover:not(.ag-full-width-row):before{background-color:var(--ag-row-hover-color);content:"";display:block;inset:0;pointer-events:none;position:absolute}.ag-row-hover.ag-row-selected:before{background-color:var(--ag-row-hover-color);background-image:linear-gradient(var(--ag-selected-row-background-color),var(--ag-selected-row-background-color))}.ag-row-hover.ag-full-width-row.ag-row-group>*{position:relative}.ag-column-hover{background-color:var(--ag-column-hover-color)}.ag-header-range-highlight{background-color:var(--ag-range-header-highlight-color)}.ag-right-aligned-cell{font-variant-numeric:tabular-nums}:where(.ag-ltr) .ag-right-aligned-cell{text-align:right}:where(.ag-rtl) .ag-right-aligned-cell{text-align:left}.ag-right-aligned-cell .ag-cell-value,.ag-right-aligned-cell .ag-group-value{margin-left:auto}:where(.ag-ltr) .ag-cell:not(.ag-cell-inline-editing),:where(.ag-ltr) .ag-full-width-row .ag-cell-wrapper.ag-row-group{padding-left:calc(var(--ag-cell-horizontal-padding) - 1px + var(--ag-row-group-indent-size)*var(--ag-indentation-level));padding-right:calc(var(--ag-cell-horizontal-padding) - 1px)}:where(.ag-rtl) .ag-cell:not(.ag-cell-inline-editing),:where(.ag-rtl) .ag-full-width-row .ag-cell-wrapper.ag-row-group{padding-left:calc(var(--ag-cell-horizontal-padding) - 1px);padding-right:calc(var(--ag-cell-horizontal-padding) - 1px + var(--ag-row-group-indent-size)*var(--ag-indentation-level))}.ag-row>.ag-cell-wrapper{padding-left:calc(var(--ag-cell-horizontal-padding) - 1px);padding-right:calc(var(--ag-cell-horizontal-padding) - 1px)}.ag-row-dragging{cursor:move;opacity:.5}.ag-details-row{background-color:var(--ag-background-color);padding:calc(var(--ag-spacing)*3.75)}.ag-layout-auto-height,.ag-layout-print{.ag-center-cols-container,.ag-center-cols-viewport{min-height:150px}}.ag-overlay-loading-wrapper{background-color:var(--ag-modal-overlay-background-color)}.ag-skeleton-container{align-content:center;height:100%;width:100%}.ag-skeleton-effect{animation:ag-skeleton-loading 1.5s ease-in-out .5s infinite;background-color:var(--ag-row-loading-skeleton-effect-color);border-radius:.25rem;height:1em;width:100%}:where(.ag-ltr) .ag-right-aligned-cell .ag-skeleton-effect{margin-left:auto}:where(.ag-rtl) .ag-right-aligned-cell .ag-skeleton-effect{margin-right:auto}@keyframes ag-skeleton-loading{0%{opacity:1}50%{opacity:.4}to{opacity:1}}.ag-loading{align-items:center;display:flex;height:100%}:where(.ag-ltr) .ag-loading{padding-left:var(--ag-cell-horizontal-padding)}:where(.ag-rtl) .ag-loading{padding-right:var(--ag-cell-horizontal-padding)}:where(.ag-ltr) .ag-loading-icon{padding-right:var(--ag-cell-widget-spacing)}:where(.ag-rtl) .ag-loading-icon{padding-left:var(--ag-cell-widget-spacing)}.ag-icon-loading{animation-duration:1s;animation-iteration-count:infinite;animation-name:spin;animation-timing-function:linear}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.ag-input-wrapper,.ag-picker-field-wrapper{align-items:center;display:flex;flex:1 1 auto;line-height:normal;position:relative}.ag-input-field{align-items:center;display:flex;flex-direction:row}.ag-input-field-input:where(:not([type=checkbox],[type=radio])){flex:1 1 auto;min-width:0;width:100%}.ag-header{background-color:var(--ag-header-background-color);border-bottom:var(--ag-header-row-border);color:var(--ag-header-text-color);display:flex;font-family:var(--ag-header-font-family);font-size:var(--ag-header-font-size);font-weight:var(--ag-header-font-weight);overflow:hidden;white-space:nowrap;width:100%}.ag-header-row{height:var(--ag-header-height);position:absolute}.ag-floating-filter-button-button,.ag-header-cell-filter-button,.ag-header-cell-menu-button,.ag-header-expand-icon,.ag-panel-title-bar-button,:where(.ag-header-cell-sortable) .ag-header-cell-label{cursor:pointer}:where(.ag-ltr) .ag-header-expand-icon{margin-left:4px}:where(.ag-rtl) .ag-header-expand-icon{margin-right:4px}.ag-header-row:where(:not(:first-child)){:where(.ag-header-cell:not(.ag-header-span-height.ag-header-span-total,.ag-header-parent-hidden),.ag-header-group-cell.ag-header-group-cell-with-group){border-top:var(--ag-header-row-border)}}.ag-header-row:where(:not(.ag-header-row-column-group)){overflow:hidden}:where(.ag-header.ag-header-allow-overflow) .ag-header-row{overflow:visible}.ag-header-cell{display:inline-flex;overflow:hidden}.ag-header-group-cell{contain:paint;display:flex}.ag-header-cell,.ag-header-group-cell{align-items:center;gap:var(--ag-cell-widget-spacing);height:100%;padding:0 var(--ag-cell-horizontal-padding);position:absolute}@property --ag-internal-moving-color{syntax:"";inherits:false;initial-value:transparent}@property --ag-internal-hover-color{syntax:"";inherits:false;initial-value:transparent}.ag-header-cell:where(:not(.ag-floating-filter)),.ag-header-group-cell{&:before{background-image:linear-gradient(var(--ag-internal-hover-color),var(--ag-internal-hover-color)),linear-gradient(var(--ag-internal-moving-color),var(--ag-internal-moving-color));content:"";inset:0;position:absolute;--ag-internal-moving-color:transparent;--ag-internal-hover-color:transparent;transition:--ag-internal-moving-color var(--ag-header-cell-background-transition-duration),--ag-internal-hover-color var(--ag-header-cell-background-transition-duration)}&:where(:hover):before{--ag-internal-hover-color:var(--ag-header-cell-hover-background-color)}&:where(.ag-header-cell-moving):before{--ag-internal-moving-color:var(--ag-header-cell-moving-background-color);--ag-internal-hover-color:var(--ag-header-cell-hover-background-color)}}:where(.ag-header-cell:not(.ag-floating-filter) *,.ag-header-group-cell *){position:relative;z-index:1}.ag-header-cell-menu-button:where(:not(.ag-header-menu-always-show)){opacity:0;transition:opacity .2s}.ag-header-cell-filter-button,:where(.ag-header-cell.ag-header-active) .ag-header-cell-menu-button{opacity:1}.ag-header-cell-label,.ag-header-group-cell-label{align-items:center;align-self:stretch;display:flex;flex:1 1 auto;overflow:hidden;padding:5px 0}:where(.ag-ltr) .ag-sort-indicator-icon{padding-left:var(--ag-spacing)}:where(.ag-rtl) .ag-sort-indicator-icon{padding-right:var(--ag-spacing)}.ag-header-cell-label{text-overflow:ellipsis}.ag-header-group-cell-label.ag-sticky-label{flex:none;max-width:100%;overflow:visible;position:sticky}:where(.ag-ltr) .ag-header-group-cell-label.ag-sticky-label{left:var(--ag-cell-horizontal-padding)}:where(.ag-rtl) .ag-header-group-cell-label.ag-sticky-label{right:var(--ag-cell-horizontal-padding)}.ag-header-cell-text,.ag-header-group-text{overflow:hidden;text-overflow:ellipsis}.ag-header-cell-text{word-break:break-word}.ag-header-cell-comp-wrapper{width:100%}:where(.ag-header-group-cell) .ag-header-cell-comp-wrapper{display:flex}:where(.ag-header-cell:not(.ag-header-cell-auto-height)) .ag-header-cell-comp-wrapper{align-items:center;display:flex;height:100%}.ag-header-cell-wrap-text .ag-header-cell-comp-wrapper{white-space:normal}.ag-header-cell-comp-wrapper-limited-height>*{overflow:hidden}:where(.ag-right-aligned-header) .ag-header-cell-label{flex-direction:row-reverse}:where(.ag-ltr) :where(.ag-header-cell:not(.ag-right-aligned-header)){.ag-header-label-icon,.ag-header-menu-icon{margin-left:var(--ag-spacing)}}:where(.ag-rtl) :where(.ag-header-cell:not(.ag-right-aligned-header)){.ag-header-label-icon,.ag-header-menu-icon{margin-right:var(--ag-spacing)}}:where(.ag-ltr) :where(.ag-header-cell.ag-right-aligned-header){.ag-header-label-icon,.ag-header-menu-icon{margin-right:var(--ag-spacing)}}:where(.ag-rtl) :where(.ag-header-cell.ag-right-aligned-header){.ag-header-label-icon,.ag-header-menu-icon{margin-left:var(--ag-spacing)}}.ag-header-cell:after,.ag-header-group-cell:where(:not(.ag-header-span-height.ag-header-group-cell-no-group)):after{content:"";height:var(--ag-header-column-border-height);position:absolute;top:calc(50% - var(--ag-header-column-border-height)*.5);z-index:1}:where(.ag-ltr) .ag-header-cell:after,:where(.ag-ltr) .ag-header-group-cell:where(:not(.ag-header-span-height.ag-header-group-cell-no-group)):after{border-right:var(--ag-header-column-border);right:0}:where(.ag-rtl) .ag-header-cell:after,:where(.ag-rtl) .ag-header-group-cell:where(:not(.ag-header-span-height.ag-header-group-cell-no-group)):after{border-left:var(--ag-header-column-border);left:0}.ag-header-highlight-after:after,.ag-header-highlight-before:after{background-color:var(--ag-accent-color);content:"";height:100%;position:absolute;width:1px}:where(.ag-ltr) .ag-header-highlight-before:after{left:0}:where(.ag-rtl) .ag-header-highlight-before:after{right:0}:where(.ag-ltr) .ag-header-highlight-after:after{right:0;:where(.ag-pinned-left-header) &{right:1px}}:where(.ag-rtl) .ag-header-highlight-after:after{left:0;:where(.ag-pinned-left-header) &{left:1px}}.ag-header-cell-resize{align-items:center;cursor:ew-resize;display:flex;height:100%;position:absolute;top:0;width:8px;z-index:2;&:after{background-color:var(--ag-header-column-resize-handle-color);content:"";height:var(--ag-header-column-resize-handle-height);position:absolute;top:calc(50% - var(--ag-header-column-resize-handle-height)*.5);width:var(--ag-header-column-resize-handle-width);z-index:1}}:where(.ag-ltr) .ag-header-cell-resize{right:-3px;&:after{left:calc(50% - var(--ag-header-column-resize-handle-width))}}:where(.ag-rtl) .ag-header-cell-resize{left:-3px;&:after{right:calc(50% - var(--ag-header-column-resize-handle-width))}}:where(.ag-header-cell.ag-header-span-height) .ag-header-cell-resize:after{height:calc(100% - var(--ag-spacing)*4);top:calc(var(--ag-spacing)*2)}.ag-header-group-cell-no-group:where(.ag-header-span-height){display:none}.ag-sort-indicator-container{display:flex;gap:var(--ag-spacing)}.ag-layout-print{&.ag-body{display:block;height:unset}&.ag-root-wrapper{display:inline-block}.ag-body-horizontal-scroll,.ag-body-vertical-scroll{display:none}&.ag-force-vertical-scroll{overflow-y:visible!important}}@media print{.ag-root-wrapper.ag-layout-print{display:table;.ag-body-horizontal-scroll-viewport,.ag-body-viewport,.ag-center-cols-container,.ag-center-cols-viewport,.ag-root,.ag-root-wrapper-body,.ag-virtual-list-viewport{display:block!important;height:auto!important;overflow:hidden!important}.ag-cell,.ag-row{-moz-column-break-inside:avoid;break-inside:avoid}}}ag-grid,ag-grid-angular{display:block}.ag-chart,.ag-dnd-ghost,.ag-popup,.ag-root-wrapper{cursor:default;line-height:normal;white-space:normal;-webkit-font-smoothing:antialiased;background-color:var(--ag-background-color);color:var(--ag-text-color);color-scheme:var(--ag-browser-color-scheme);font-family:var(--ag-font-family);font-size:var(--ag-font-size);--ag-indentation-level:0}.ag-root-wrapper{border:var(--ag-wrapper-border);border-radius:var(--ag-wrapper-border-radius);display:flex;flex-direction:column;overflow:hidden;position:relative;&.ag-layout-normal{height:100%}}.ag-root-wrapper-body{display:flex;flex-direction:row;&.ag-layout-normal{flex:1 1 auto;height:0;min-height:0}}.ag-root{display:flex;flex-direction:column;position:relative;&.ag-layout-auto-height,&.ag-layout-normal{flex:1 1 auto;overflow:hidden;width:0}&.ag-layout-normal{height:100%}}.ag-drag-handle{color:var(--ag-drag-handle-color);cursor:grab}.ag-list-item,.ag-virtual-list-item{height:var(--ag-list-item-height)}.ag-virtual-list-item{position:absolute;width:100%}.ag-select-list{background-color:var(--ag-picker-list-background-color);border:var(--ag-picker-list-border);border-radius:var(--ag-border-radius);box-shadow:var(--ag-dropdown-shadow);overflow:hidden auto}.ag-list-item{align-items:center;display:flex;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;&.ag-active-item{background-color:var(--ag-row-hover-color)}}.ag-select-list-item{cursor:default;-webkit-user-select:none;-moz-user-select:none;user-select:none;:where(span){overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}:where(.ag-ltr) .ag-select-list-item{padding-left:calc(var(--ag-cell-horizontal-padding)/2)}:where(.ag-rtl) .ag-select-list-item{padding-right:calc(var(--ag-cell-horizontal-padding)/2)}.ag-list-item-hovered:after{background-color:var(--ag-accent-color);content:"";height:1px;left:0;position:absolute;right:0}.ag-item-highlight-top:after{top:0}.ag-item-highlight-bottom:after{bottom:0}:where(.ag-icon):before{align-items:center;background-color:currentcolor;color:inherit;content:"";display:flex;font-family:inherit;font-size:var(--ag-icon-size);font-style:normal;font-variant:normal;height:var(--ag-icon-size);justify-content:center;line-height:var(--ag-icon-size);-webkit-mask-size:contain;mask-size:contain;text-transform:none;width:var(--ag-icon-size)}.ag-icon{background-position:50%;background-repeat:no-repeat;background-size:contain;color:var(--ag-icon-color);display:block;height:var(--ag-icon-size);position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:var(--ag-icon-size)}.ag-column-select-column-group-readonly,.ag-column-select-column-readonly,.ag-disabled,[disabled]{.ag-icon{opacity:.5}&.ag-icon-grip{opacity:.35}}.ag-column-select-column-readonly{&.ag-icon-grip,.ag-icon-grip{opacity:.35}}.ag-chart-menu-icon,.ag-chart-settings-next,.ag-chart-settings-prev,.ag-column-group-icons,.ag-column-select-header-icon,.ag-filter-toolpanel-expand,.ag-floating-filter-button-button,.ag-group-title-bar-icon,.ag-header-cell-filter-button,.ag-header-cell-menu-button,.ag-header-expand-icon,.ag-panel-title-bar-button,.ag-panel-title-bar-button-icon,.ag-set-filter-group-icons,:where(.ag-group-contracted) .ag-icon,:where(.ag-group-expanded) .ag-icon{background-color:var(--ag-icon-button-background-color);border-radius:var(--ag-icon-button-border-radius);box-shadow:0 0 0 var(--ag-icon-button-background-spread) var(--ag-icon-button-background-color);color:var(--ag-icon-button-color);&:hover{background-color:var(--ag-icon-button-hover-background-color);box-shadow:0 0 0 var(--ag-icon-button-background-spread) var(--ag-icon-button-hover-background-color);color:var(--ag-icon-button-hover-color)}}.ag-filter-active{background-image:linear-gradient(var(--ag-icon-button-active-background-color),var(--ag-icon-button-active-background-color));border-radius:1px;outline:solid var(--ag-icon-button-background-spread) var(--ag-icon-button-active-background-color);position:relative;&:after{background-color:var(--ag-accent-color);border-radius:50%;content:"";height:6px;position:absolute;top:-1px;width:6px}:where(.ag-icon-filter){clip-path:path("M8,0C8,4.415 11.585,8 16,8L16,16L0,16L0,0L8,0Z");color:var(--ag-icon-button-active-color)}}:where(.ag-ltr) .ag-filter-active{&:after{right:-1px}}:where(.ag-rtl) .ag-filter-active{&:after{left:-1px}}.ag-menu{background-color:var(--ag-menu-background-color);border:var(--ag-menu-border);border-radius:var(--ag-border-radius);box-shadow:var(--ag-menu-shadow);color:var(--ag-menu-text-color);max-height:100%;overflow-y:auto}.ag-menu,.ag-resizer{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none}.ag-resizer{pointer-events:none;z-index:1}:where(.ag-resizer){&.ag-resizer-topLeft{cursor:nwse-resize;height:5px;left:0;top:0;width:5px}&.ag-resizer-top{cursor:ns-resize;height:5px;left:5px;right:5px;top:0}&.ag-resizer-topRight{cursor:nesw-resize;height:5px;right:0;top:0;width:5px}&.ag-resizer-right{bottom:5px;cursor:ew-resize;right:0;top:5px;width:5px}&.ag-resizer-bottomRight{bottom:0;cursor:nwse-resize;height:5px;right:0;width:5px}&.ag-resizer-bottom{bottom:0;cursor:ns-resize;height:5px;left:5px;right:5px}&.ag-resizer-bottomLeft{bottom:0;cursor:nesw-resize;height:5px;left:0;width:5px}&.ag-resizer-left{bottom:5px;cursor:ew-resize;left:0;top:5px;width:5px}}`
);
// packages/ag-grid-community/src/theming/inject.ts
var IS_SSR = typeof window !== "object" || !window?.document?.fonts?.forEach;
var injectionsByContainer = /* @__PURE__ */ new WeakMap();
var _injectGlobalCSS = (css, styleContainer, debugId, layer, priority) => {
if (IS_SSR)
return;
if (FORCE_LEGACY_THEMES)
return;
if (layer) {
css = `@layer ${CSS.escape(layer)} { ${css} }`;
}
let injections = injectionsByContainer.get(styleContainer);
if (!injections) {
injections = [];
injectionsByContainer.set(styleContainer, injections);
}
if (injections.find((i) => i.css === css))
return;
const el = document.createElement("style");
el.dataset.agGlobalCss = debugId;
el.textContent = css;
const newInjection = { css, el, priority };
let insertAfter;
for (const injection of injections) {
if (injection.priority > priority)
break;
insertAfter = injection;
}
if (insertAfter) {
insertAfter.el.insertAdjacentElement("afterend", el);
const index = injections.indexOf(insertAfter);
injections.splice(index + 1, 0, newInjection);
} else {
styleContainer.insertBefore(el, styleContainer.querySelector(":not(title, meta)"));
injections.push(newInjection);
}
};
var _injectCoreAndModuleCSS = (styleContainer, layer) => {
_injectGlobalCSS(coreCSS, styleContainer, "core", layer, 0);
Array.from(_getAllRegisteredModules()).sort((a, b) => a.moduleName.localeCompare(b.moduleName)).forEach(
(module2) => module2.css?.forEach((css) => _injectGlobalCSS(css, styleContainer, `module-${module2.moduleName}`, layer, 0))
);
};
var gridsUsingThemingAPI = /* @__PURE__ */ new Set();
var _registerGridUsingThemingAPI = (environment) => {
gridsUsingThemingAPI.add(environment);
};
var _unregisterGridUsingThemingAPI = (environment) => {
gridsUsingThemingAPI.delete(environment);
if (gridsUsingThemingAPI.size === 0) {
injectionsByContainer = /* @__PURE__ */ new WeakMap();
for (const style of document.head.querySelectorAll("style[data-ag-global-css]")) {
style.remove();
}
}
};
// packages/ag-grid-community/src/theming/Part.ts
var createPart = (args) => {
return new PartImpl(args);
};
var defaultModeName = "$default";
var partCounter = 0;
var PartImpl = class {
constructor({ feature, params, modeParams = {}, css, cssImports }) {
this.feature = feature;
this.css = css;
this.cssImports = cssImports;
this.modeParams = {
// NOTE: it's important that default is defined first, putting it
// first in iteration order, because when merging params the default
// params override any prior modal params, so modal params in this
// part need to come after default params to prevent them from being
// immediately overridden.
[defaultModeName]: {
...modeParams[defaultModeName] ?? {},
...params ?? {}
},
...modeParams
};
}
use(styleContainer, layer) {
let inject = this._inject;
if (inject == null) {
let { css } = this;
if (css) {
const className = `ag-theme-${this.feature ?? "part"}-${++partCounter}`;
if (typeof css === "function")
css = css();
css = `:where(.${className}) {
${css}
}
`;
for (const cssImport of this.cssImports ?? []) {
css = `@import url(${JSON.stringify(cssImport)});
${css}`;
}
inject = { css, class: className };
} else {
inject = false;
}
this._inject = inject;
}
if (inject && styleContainer) {
_injectGlobalCSS(inject.css, styleContainer, inject.class, layer, 1);
}
return inject ? inject.class : false;
}
};
// packages/ag-grid-community/src/theming/theme-utils.ts
var kebabCase = (str) => str.replace(/[A-Z]/g, (m) => `-${m}`).toLowerCase();
var paramToVariableName = (paramName) => `--ag-${kebabCase(paramName)}`;
var paramToVariableExpression = (paramName) => `var(${paramToVariableName(paramName)})`;
var clamp = (value, min, max) => Math.max(min, Math.min(max, value));
var memoize = (fn) => {
const values = /* @__PURE__ */ new Map();
return (a) => {
const key = a;
if (!values.has(key)) {
values.set(key, fn(a));
}
return values.get(key);
};
};
var accentMix = (mix) => ({ ref: "accentColor", mix });
var foregroundMix = (mix) => ({ ref: "foregroundColor", mix });
var foregroundBackgroundMix = (mix) => ({
ref: "foregroundColor",
mix,
onto: "backgroundColor"
});
var foregroundHeaderBackgroundMix = (mix) => ({
ref: "foregroundColor",
mix,
onto: "headerBackgroundColor"
});
var backgroundColor = { ref: "backgroundColor" };
var foregroundColor = { ref: "foregroundColor" };
var accentColor = { ref: "accentColor" };
// packages/ag-grid-community/src/theming/core/core-css.ts
var defaultLightColorSchemeParams = {
backgroundColor: "#fff",
foregroundColor: "#181d1f",
borderColor: foregroundMix(0.15),
chromeBackgroundColor: foregroundBackgroundMix(0.02),
browserColorScheme: "light"
};
var coreDefaults = {
...defaultLightColorSchemeParams,
textColor: foregroundColor,
accentColor: "#2196f3",
invalidColor: "#e02525",
wrapperBorder: true,
rowBorder: true,
headerRowBorder: true,
footerRowBorder: {
ref: "rowBorder"
},
columnBorder: {
style: "solid",
width: 1,
color: "transparent"
},
headerColumnBorder: false,
headerColumnBorderHeight: "100%",
pinnedColumnBorder: true,
pinnedRowBorder: true,
sidePanelBorder: true,
sideBarPanelWidth: 250,
sideBarBackgroundColor: {
ref: "chromeBackgroundColor"
},
sideButtonBarBackgroundColor: {
ref: "sideBarBackgroundColor"
},
sideButtonBarTopPadding: 0,
sideButtonSelectedUnderlineWidth: 2,
sideButtonSelectedUnderlineColor: "transparent",
sideButtonSelectedUnderlineTransitionDuration: 0,
sideButtonBackgroundColor: "transparent",
sideButtonTextColor: { ref: "textColor" },
sideButtonHoverBackgroundColor: { ref: "sideButtonBackgroundColor" },
sideButtonHoverTextColor: { ref: "sideButtonTextColor" },
sideButtonSelectedBackgroundColor: backgroundColor,
sideButtonSelectedTextColor: { ref: "sideButtonTextColor" },
sideButtonBorder: "solid 1px transparent",
sideButtonSelectedBorder: true,
sideButtonLeftPadding: { ref: "spacing" },
sideButtonRightPadding: { ref: "spacing" },
sideButtonVerticalPadding: { calc: "spacing * 3" },
fontFamily: [
"-apple-system",
"BlinkMacSystemFont",
"Segoe UI",
"Roboto",
"Oxygen-Sans",
"Ubuntu",
"Cantarell",
"Helvetica Neue",
"sans-serif"
],
headerBackgroundColor: {
ref: "chromeBackgroundColor"
},
headerFontFamily: {
ref: "fontFamily"
},
cellFontFamily: {
ref: "fontFamily"
},
headerFontWeight: 500,
headerFontSize: {
ref: "fontSize"
},
dataFontSize: {
ref: "fontSize"
},
headerTextColor: {
ref: "textColor"
},
headerCellHoverBackgroundColor: "transparent",
headerCellMovingBackgroundColor: { ref: "headerCellHoverBackgroundColor" },
headerCellBackgroundTransitionDuration: "0.2s",
cellTextColor: {
ref: "textColor"
},
subtleTextColor: {
ref: "textColor",
mix: 0.5
},
rangeSelectionBorderStyle: "solid",
rangeSelectionBorderColor: accentColor,
rangeSelectionBackgroundColor: accentMix(0.2),
rangeSelectionChartBackgroundColor: "#0058FF1A",
rangeSelectionChartCategoryBackgroundColor: "#00FF841A",
rangeSelectionHighlightColor: accentMix(0.5),
rangeHeaderHighlightColor: foregroundHeaderBackgroundMix(0.08),
rowNumbersSelectedColor: accentMix(0.5),
rowHoverColor: accentMix(0.08),
columnHoverColor: accentMix(0.05),
selectedRowBackgroundColor: accentMix(0.12),
modalOverlayBackgroundColor: {
ref: "backgroundColor",
mix: 0.66
},
oddRowBackgroundColor: backgroundColor,
borderRadius: 4,
wrapperBorderRadius: 8,
cellHorizontalPadding: {
calc: "spacing * 2 * cellHorizontalPaddingScale"
},
cellWidgetSpacing: {
calc: "spacing * 1.5"
},
cellHorizontalPaddingScale: 1,
rowGroupIndentSize: {
calc: "cellWidgetSpacing + iconSize"
},
valueChangeDeltaUpColor: "#43a047",
valueChangeDeltaDownColor: "#e53935",
valueChangeValueHighlightBackgroundColor: "#16a08580",
spacing: 8,
fontSize: 14,
rowHeight: {
calc: "max(iconSize, dataFontSize) + spacing * 3.25 * rowVerticalPaddingScale"
},
rowVerticalPaddingScale: 1,
headerHeight: {
calc: "max(iconSize, dataFontSize) + spacing * 4 * headerVerticalPaddingScale"
},
headerVerticalPaddingScale: 1,
popupShadow: "0 0 16px #00000026",
cardShadow: "0 1px 4px 1px #00000018",
dropdownShadow: { ref: "cardShadow" },
dragAndDropImageBackgroundColor: backgroundColor,
dragAndDropImageBorder: true,
dragAndDropImageShadow: {
ref: "popupShadow"
},
dragHandleColor: foregroundMix(0.7),
focusShadow: {
spread: 3,
color: accentMix(0.5)
},
headerColumnResizeHandleHeight: "30%",
headerColumnResizeHandleWidth: 2,
headerColumnResizeHandleColor: {
ref: "borderColor"
},
widgetContainerHorizontalPadding: {
calc: "spacing * 1.5"
},
widgetContainerVerticalPadding: {
calc: "spacing * 1.5"
},
widgetHorizontalSpacing: {
calc: "spacing * 1.5"
},
widgetVerticalSpacing: {
ref: "spacing"
},
listItemHeight: {
calc: "max(iconSize, dataFontSize) + widgetVerticalSpacing"
},
iconSize: 16,
iconColor: "inherit",
iconButtonColor: { ref: "iconColor" },
iconButtonBackgroundColor: "transparent",
iconButtonBackgroundSpread: 4,
iconButtonBorderRadius: 1,
iconButtonHoverColor: { ref: "iconButtonColor" },
iconButtonHoverBackgroundColor: foregroundMix(0.1),
iconButtonActiveColor: accentColor,
iconButtonActiveBackgroundColor: accentMix(0.28),
iconButtonActiveIndicatorColor: accentColor,
toggleButtonWidth: 28,
toggleButtonHeight: 18,
toggleButtonOnBackgroundColor: accentColor,
toggleButtonOffBackgroundColor: foregroundBackgroundMix(0.3),
toggleButtonSwitchBackgroundColor: backgroundColor,
toggleButtonSwitchInset: 2,
menuBorder: {
color: foregroundMix(0.2)
},
menuBackgroundColor: foregroundBackgroundMix(0.03),
menuTextColor: foregroundBackgroundMix(0.95),
menuShadow: {
ref: "popupShadow"
},
menuSeparatorColor: {
ref: "borderColor"
},
setFilterIndentSize: {
ref: "iconSize"
},
chartMenuPanelWidth: 260,
chartMenuLabelColor: foregroundMix(0.8),
dialogShadow: {
ref: "popupShadow"
},
cellEditingBorder: {
color: accentColor
},
cellEditingShadow: { ref: "cardShadow" },
dialogBorder: {
color: foregroundMix(0.2)
},
panelBackgroundColor: backgroundColor,
panelTitleBarBackgroundColor: {
ref: "headerBackgroundColor"
},
panelTitleBarIconColor: {
ref: "headerTextColor"
},
panelTitleBarTextColor: {
ref: "headerTextColor"
},
panelTitleBarFontWeight: {
ref: "headerFontWeight"
},
panelTitleBarBorder: true,
columnSelectIndentSize: {
ref: "iconSize"
},
toolPanelSeparatorBorder: true,
tooltipBackgroundColor: {
ref: "chromeBackgroundColor"
},
tooltipTextColor: {
ref: "textColor"
},
tooltipBorder: true,
columnDropCellBackgroundColor: foregroundMix(0.07),
columnDropCellTextColor: {
ref: "textColor"
},
columnDropCellDragHandleColor: {
ref: "textColor"
},
columnDropCellBorder: {
color: foregroundMix(0.13)
},
selectCellBackgroundColor: foregroundMix(0.07),
selectCellBorder: {
color: foregroundMix(0.13)
},
advancedFilterBuilderButtonBarBorder: true,
advancedFilterBuilderIndentSize: {
calc: "spacing * 2 + iconSize"
},
advancedFilterBuilderJoinPillColor: "#f08e8d",
advancedFilterBuilderColumnPillColor: "#a6e194",
advancedFilterBuilderOptionPillColor: "#f3c08b",
advancedFilterBuilderValuePillColor: "#85c0e4",
filterToolPanelGroupIndent: {
ref: "spacing"
},
rowLoadingSkeletonEffectColor: foregroundMix(0.15),
statusBarLabelColor: foregroundColor,
statusBarLabelFontWeight: 500,
statusBarValueColor: foregroundColor,
statusBarValueFontWeight: 500
};
// packages/ag-grid-community/src/theming/parts/button-style/button-style-base.css-GENERATED.ts
var buttonStyleBaseCSS = (
/*css*/
`:where(.ag-button){background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;font-size:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0;text-indent:inherit;text-shadow:inherit;text-transform:inherit;word-spacing:inherit;&:disabled{cursor:default}&:focus-visible{box-shadow:var(--ag-focus-shadow);outline:none}}.ag-standard-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--ag-button-background-color);border:var(--ag-button-border);border-radius:var(--ag-button-border-radius);color:var(--ag-button-text-color);cursor:pointer;font-weight:var(--ag-button-font-weight);padding:var(--ag-button-vertical-padding) var(--ag-button-horizontal-padding);&:hover{background-color:var(--ag-button-hover-background-color);border:var(--ag-button-hover-border);color:var(--ag-button-hover-text-color)}&:active{background-color:var(--ag-button-active-background-color);border:var(--ag-button-active-border);color:var(--ag-button-active-text-color)}&:disabled{background-color:var(--ag-button-disabled-background-color);border:var(--ag-button-disabled-border);color:var(--ag-button-disabled-text-color)}}`
);
// packages/ag-grid-community/src/theming/parts/button-style/button-styles.ts
var baseParams = {
buttonTextColor: "inherit",
buttonFontWeight: "normal",
buttonBackgroundColor: "transparent",
buttonBorder: false,
buttonBorderRadius: { ref: "borderRadius" },
buttonHorizontalPadding: { calc: "spacing * 2" },
buttonVerticalPadding: { ref: "spacing" },
buttonHoverTextColor: { ref: "buttonTextColor" },
buttonHoverBackgroundColor: { ref: "buttonBackgroundColor" },
buttonHoverBorder: { ref: "buttonBorder" },
buttonActiveTextColor: { ref: "buttonHoverTextColor" },
buttonActiveBackgroundColor: { ref: "buttonHoverBackgroundColor" },
buttonActiveBorder: { ref: "buttonHoverBorder" },
buttonDisabledTextColor: { ref: "inputDisabledTextColor" },
buttonDisabledBackgroundColor: { ref: "inputDisabledBackgroundColor" },
buttonDisabledBorder: { ref: "inputDisabledBorder" }
};
var makeButtonStyleBaseTreeShakeable = () => createPart({
feature: "buttonStyle",
params: baseParams,
css: buttonStyleBaseCSS
});
var buttonStyleBase = /* @__PURE__ */ makeButtonStyleBaseTreeShakeable();
var makeButtonStyleQuartzTreeShakeable = () => createPart({
feature: "buttonStyle",
params: {
...baseParams,
buttonBackgroundColor: backgroundColor,
buttonBorder: true,
buttonHoverBackgroundColor: { ref: "rowHoverColor" },
buttonActiveBorder: { color: accentColor }
},
css: buttonStyleBaseCSS
});
var buttonStyleQuartz = /* @__PURE__ */ makeButtonStyleQuartzTreeShakeable();
var makeButtonStyleAlpineTreeShakeable = () => createPart({
feature: "buttonStyle",
params: {
...baseParams,
buttonBackgroundColor: backgroundColor,
buttonBorder: { color: accentColor },
buttonFontWeight: 600,
buttonTextColor: accentColor,
buttonHoverBackgroundColor: { ref: "rowHoverColor" },
buttonActiveBackgroundColor: accentColor,
buttonActiveTextColor: backgroundColor
},
css: buttonStyleBaseCSS
});
var buttonStyleAlpine = /* @__PURE__ */ makeButtonStyleAlpineTreeShakeable();
var makeButtonStyleBalhamTreeShakeable = () => createPart({
feature: "buttonStyle",
params: {
...baseParams,
buttonBorder: { color: foregroundColor, width: 2, style: "outset" },
buttonActiveBorder: { color: foregroundColor, width: 2, style: "inset" },
buttonBackgroundColor: foregroundBackgroundMix(0.07),
buttonHoverBackgroundColor: backgroundColor,
buttonVerticalPadding: { calc: "spacing * 0.5" }
},
css: buttonStyleBaseCSS
});
var buttonStyleBalham = /* @__PURE__ */ makeButtonStyleBalhamTreeShakeable();
// packages/ag-grid-community/src/theming/parts/column-drop-style/column-drop-style-bordered.css-GENERATED.ts
var columnDropStyleBorderedCSS = (
/*css*/
`.ag-column-drop-vertical-empty-message{align-items:center;border:1px dashed;border-color:var(--ag-border-color);display:flex;inset:0;justify-content:center;margin:calc(var(--ag-spacing)*1.5) calc(var(--ag-spacing)*2);overflow:hidden;padding:calc(var(--ag-spacing)*2);position:absolute}`
);
// packages/ag-grid-community/src/theming/parts/column-drop-style/column-drop-style-plain.css-GENERATED.ts
var columnDropStylePlainCSS = (
/*css*/
`.ag-column-drop-vertical-empty-message{color:var(--ag-subtle-text-color);font-size:calc(var(--ag-font-size) - 1px);font-weight:600;padding-top:var(--ag-spacing)}:where(.ag-ltr) .ag-column-drop-vertical-empty-message{padding-left:calc(var(--ag-icon-size) + var(--ag-spacing) + var(--ag-widget-horizontal-spacing));padding-right:var(--ag-spacing)}:where(.ag-rtl) .ag-column-drop-vertical-empty-message{padding-left:var(--ag-spacing);padding-right:calc(var(--ag-icon-size) + var(--ag-spacing) + var(--ag-widget-horizontal-spacing))}`
);
// packages/ag-grid-community/src/theming/parts/column-drop-style/column-drop-styles.ts
var makeColumnDropStyleBorderedTreeShakeable = () => {
return createPart({
feature: "columnDropStyle",
css: columnDropStyleBorderedCSS
});
};
var columnDropStyleBordered = /* @__PURE__ */ makeColumnDropStyleBorderedTreeShakeable();
var makeColumnDropStylePlainTreeShakeable = () => {
return createPart({
feature: "columnDropStyle",
css: columnDropStylePlainCSS
});
};
var columnDropStylePlain = /* @__PURE__ */ makeColumnDropStylePlainTreeShakeable();
// packages/ag-grid-community/src/theming/theme-types.ts
var paramTypes = [
"colorScheme",
"color",
"length",
"scale",
"borderStyle",
"border",
"shadow",
"image",
"fontFamily",
"fontWeight",
"duration"
];
var getParamType = memoize((param) => {
param = param.toLowerCase();
return paramTypes.find((type) => param.endsWith(type.toLowerCase())) ?? "length";
});
var literalToCSS = (value) => {
if (typeof value === "object" && value?.ref)
return paramToVariableExpression(value.ref);
if (typeof value === "string")
return value;
if (typeof value === "number")
return String(value);
return false;
};
var colorValueToCss = (value) => {
if (typeof value === "string")
return value;
if (value && "ref" in value) {
const colorExpr = paramToVariableExpression(value.ref);
if (value.mix == null) {
return colorExpr;
}
const backgroundExpr = value.onto ? paramToVariableExpression(value.onto) : "transparent";
return `color-mix(in srgb, ${backgroundExpr}, ${colorExpr} ${clamp(value.mix * 100, 0, 100)}%)`;
}
return false;
};
var colorSchemeValueToCss = literalToCSS;
var lengthValueToCss = (value) => {
if (typeof value === "string")
return value;
if (typeof value === "number")
return `${value}px`;
if (value && "calc" in value) {
const valueWithSpaces = value.calc.replace(/ ?[*/+] ?/g, " $& ");
return `calc(${valueWithSpaces.replace(/-?\b[a-z][a-z0-9]*\b(?![-(])/gi, (p) => p[0] === "-" ? p : ` ${paramToVariableExpression(p)} `)})`;
}
if (value && "ref" in value)
return paramToVariableExpression(value.ref);
return false;
};
var scaleValueToCss = literalToCSS;
var borderValueToCss = (value, param) => {
if (typeof value === "string")
return value;
if (value === true)
return "solid 1px var(--ag-border-color)";
if (value === false)
return param === "columnBorder" ? "solid 1px transparent" : "none";
if (value && "ref" in value)
return paramToVariableExpression(value.ref);
return borderStyleValueToCss(value.style ?? "solid") + " " + lengthValueToCss(value.width ?? 1) + " " + colorValueToCss(value.color ?? { ref: "borderColor" });
};
var shadowValueToCss = (value) => {
if (typeof value === "string")
return value;
if (value === false)
return "none";
if (value && "ref" in value)
return paramToVariableExpression(value.ref);
return [
lengthValueToCss(value.offsetX ?? 0),
lengthValueToCss(value.offsetY ?? 0),
lengthValueToCss(value.radius ?? 0),
lengthValueToCss(value.spread ?? 0),
colorValueToCss(value.color ?? { ref: "foregroundColor" })
].join(" ");
};
var borderStyleValueToCss = literalToCSS;
var fontFamilyValueToCss = (value) => {
if (typeof value === "string")
return value;
if (value && "googleFont" in value)
return fontFamilyValueToCss(value.googleFont);
if (value && "ref" in value)
return paramToVariableExpression(value.ref);
if (Array.isArray(value)) {
return value.map((font) => {
if (typeof font === "object" && "googleFont" in font) {
font = font.googleFont;
}
return quoteUnsafeChars(font);
}).join(", ");
}
return false;
};
var quoteUnsafeChars = (font) => (
// don't quote var() expressions or quote safe identifier names, so that
// people can specify fonts like sans-serif which are keywords not strings,
// or var(--my-var)
/^[\w-]+$|\w\(/.test(font) ? font : JSON.stringify(font)
);
var fontWeightValueToCss = literalToCSS;
var imageValueToCss = (value) => {
if (typeof value === "string")
return value;
if (value && "url" in value)
return `url(${JSON.stringify(value.url)})`;
if (value && "svg" in value)
return imageValueToCss({ url: `data:image/svg+xml,${encodeURIComponent(value.svg)}` });
if (value && "ref" in value)
return paramToVariableExpression(value.ref);
return false;
};
var durationValueToCss = (value, param) => {
if (typeof value === "string")
return value;
if (typeof value === "number") {
if (value >= 10) {
_error(104, { value, param });
}
return `${value}s`;
}
if (value && "ref" in value)
return paramToVariableExpression(value.ref);
return false;
};
var paramValidators = {
color: colorValueToCss,
colorScheme: colorSchemeValueToCss,
length: lengthValueToCss,
scale: scaleValueToCss,
border: borderValueToCss,
borderStyle: borderStyleValueToCss,
shadow: shadowValueToCss,
image: imageValueToCss,
fontFamily: fontFamilyValueToCss,
fontWeight: fontWeightValueToCss,
duration: durationValueToCss
};
var paramValueToCss = (param, value) => {
const type = getParamType(param);
return paramValidators[type](value, param);
};
// packages/ag-grid-community/src/theming/Theme.ts
var FORCE_LEGACY_THEMES = false;
var _asThemeImpl = (theme) => {
if (!(theme instanceof ThemeImpl)) {
throw new Error("theme is not an object created by createTheme");
}
return theme;
};
var createTheme = () => new ThemeImpl().withPart(buttonStyleQuartz).withPart(columnDropStyleBordered);
var ThemeImpl = class _ThemeImpl {
constructor(parts = []) {
this.parts = parts;
}
withPart(part) {
if (typeof part === "function")
part = part();
if (!(part instanceof PartImpl)) {
_logPreInitErr(259, { part }, "Invalid part");
return this;
}
return new _ThemeImpl([...this.parts, part]);
}
withoutPart(feature) {
return this.withPart(createPart({ feature }));
}
withParams(params, mode = defaultModeName) {
return this.withPart(
createPart({
modeParams: { [mode]: params }
})
);
}
/**
* Called by a grid instance when it starts using the theme. This installs
* the theme's parts into document head, or the shadow DOM if the provided
* container is within a shadow root.
*/
_startUse({ styleContainer, cssLayer, loadThemeGoogleFonts }) {
if (IS_SSR)
return;
if (FORCE_LEGACY_THEMES)
return;
uninstallLegacyCSS();
_injectCoreAndModuleCSS(styleContainer, cssLayer);
const googleFontsUsed = getGoogleFontsUsed(this);
if (googleFontsUsed.length > 0) {
for (const googleFont of googleFontsUsed) {
if (loadThemeGoogleFonts) {
loadGoogleFont(googleFont);
}
}
}
for (const part of this.parts) {
part.use(styleContainer, cssLayer);
}
}
/**
* Return CSS that that applies the params of this theme to elements with
* the provided class name
*/
_getCssClass() {
if (FORCE_LEGACY_THEMES)
return "ag-theme-quartz";
return this._cssClassCache ?? (this._cssClassCache = deduplicatePartsByFeature(this.parts).map((part) => part.use(void 0, void 0)).filter(Boolean).join(" "));
}
_getModeParams() {
let paramsCache = this._paramsCache;
if (!paramsCache) {
const mergedModeParams = {
// NOTE: defining the default mode here is important, it ensures
// that the default mode is first in iteration order, which puts
// it first in outputted CSS, allowing other modes to override it
[defaultModeName]: { ...coreDefaults }
};
for (const part of deduplicatePartsByFeature(this.parts)) {
for (const partMode of Object.keys(part.modeParams)) {
const partParams = part.modeParams[partMode];
if (partParams) {
const mergedParams = mergedModeParams[partMode] ?? (mergedModeParams[partMode] = {});
const partParamNames = /* @__PURE__ */ new Set();
for (const partParamName of Object.keys(partParams)) {
const partParamValue = partParams[partParamName];
if (partParamValue !== void 0) {
mergedParams[partParamName] = partParamValue;
partParamNames.add(partParamName);
}
}
if (partMode === defaultModeName) {
for (const mergedMode of Object.keys(mergedModeParams)) {
const mergedParams2 = mergedModeParams[mergedMode];
if (mergedMode !== defaultModeName) {
for (const partParamName of partParamNames) {
delete mergedParams2[partParamName];
}
}
}
}
}
}
}
this._paramsCache = paramsCache = mergedModeParams;
}
return paramsCache;
}
/**
* Return the CSS chunk that is inserted into the grid DOM, and will
* therefore be removed automatically when the grid is destroyed or it
* starts to use a new theme.
*
* @param className a unique class name on the grid wrapper used to scope the returned CSS to the grid instance
*/
_getPerGridCss(className) {
const selectorPlaceholder = "##SELECTOR##";
let innerParamsCss = this._paramsCssCache;
if (!innerParamsCss) {
let variablesCss = "";
let inheritanceCss = "";
const modeParams = this._getModeParams();
for (const mode of Object.keys(modeParams)) {
const params = modeParams[mode];
if (mode !== defaultModeName) {
const escapedMode = typeof CSS === "object" ? CSS.escape(mode) : mode;
const wrapPrefix = `:where([data-ag-theme-mode="${escapedMode}"]) & {
`;
variablesCss += wrapPrefix;
inheritanceCss += wrapPrefix;
}
for (const key of Object.keys(params).sort()) {
const value = params[key];
const cssValue = paramValueToCss(key, value);
if (cssValue === false) {
_error(107, { key, value });
} else {
const cssName = paramToVariableName(key);
const inheritedName = cssName.replace("--ag-", "--ag-inherited-");
variablesCss += ` ${cssName}: var(${inheritedName}, ${cssValue});
`;
inheritanceCss += ` ${inheritedName}: var(${cssName});
`;
}
}
if (mode !== defaultModeName) {
variablesCss += "}\n";
inheritanceCss += "}\n";
}
}
let css = `${selectorPlaceholder} {
${variablesCss}}
`;
css += `:has(> ${selectorPlaceholder}):not(${selectorPlaceholder}) {
${inheritanceCss}}
`;
this._paramsCssCache = innerParamsCss = css;
}
return innerParamsCss.replaceAll(selectorPlaceholder, `:where(.${className})`);
}
};
var deduplicatePartsByFeature = (parts) => {
const lastPartByFeature = /* @__PURE__ */ new Map();
for (const part of parts) {
lastPartByFeature.set(part.feature, part);
}
const result = [];
for (const part of parts) {
if (!part.feature || lastPartByFeature.get(part.feature) === part) {
result.push(part);
}
}
return result;
};
var getGoogleFontsUsed = (theme) => {
const googleFontsUsed = /* @__PURE__ */ new Set();
const visitParamValue = (paramValue) => {
if (Array.isArray(paramValue)) {
paramValue.forEach(visitParamValue);
} else {
const googleFont = paramValue?.googleFont;
if (typeof googleFont === "string") {
googleFontsUsed.add(googleFont);
}
}
};
const allModeValues = Object.values(theme._getModeParams());
const allValues = allModeValues.flatMap((mv) => Object.values(mv));
allValues.forEach(visitParamValue);
return Array.from(googleFontsUsed).sort();
};
var uninstalledLegacyCSS = false;
var uninstallLegacyCSS = () => {
if (uninstalledLegacyCSS)
return;
uninstalledLegacyCSS = true;
for (const style of Array.from(document.head.querySelectorAll('style[data-ag-scope="legacy"]'))) {
style.remove();
}
};
var googleFontsLoaded = /* @__PURE__ */ new Set();
var loadGoogleFont = async (font) => {
googleFontsLoaded.add(font);
const css = `@import url('https://${googleFontsDomain}/css2?family=${encodeURIComponent(font)}:wght@100;200;300;400;500;600;700;800;900&display=swap');
`;
_injectGlobalCSS(css, document.head, `googleFont:${font}`, void 0, 0);
};
var googleFontsDomain = "fonts.googleapis.com";
// packages/ag-grid-community/src/theming/parts/checkbox-style/checkbox-style-default.css-GENERATED.ts
var checkboxStyleDefaultCSS = (
/*css*/
`.ag-checkbox-input-wrapper,.ag-radio-button-input-wrapper{background-color:var(--ag-checkbox-unchecked-background-color);border:solid var(--ag-checkbox-border-width) var(--ag-checkbox-unchecked-border-color);flex:none;height:var(--ag-icon-size);position:relative;width:var(--ag-icon-size);:where(input){-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;display:block;height:var(--ag-icon-size);margin:0;opacity:0;width:var(--ag-icon-size)}&:after{content:"";display:block;inset:0;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;pointer-events:none;position:absolute}&:where(.ag-checked){background-color:var(--ag-checkbox-checked-background-color);border-color:var(--ag-checkbox-checked-border-color);&:after{background-color:var(--ag-checkbox-checked-shape-color)}}&:where(:focus-within,:active){box-shadow:var(--ag-focus-shadow)}&:where(.ag-disabled){filter:grayscale();opacity:.5}}.ag-checkbox-input-wrapper{border-radius:var(--ag-checkbox-border-radius);&:where(.ag-checked):after{-webkit-mask-image:var(--ag-checkbox-checked-shape-image);mask-image:var(--ag-checkbox-checked-shape-image)}&:where(.ag-indeterminate){background-color:var(--ag-checkbox-indeterminate-background-color);border-color:var(--ag-checkbox-indeterminate-border-color);&:after{background-color:var(--ag-checkbox-indeterminate-shape-color);-webkit-mask-image:var(--ag-checkbox-indeterminate-shape-image);mask-image:var(--ag-checkbox-indeterminate-shape-image)}}}.ag-radio-button-input-wrapper{border-radius:100%;&:where(.ag-checked):after{-webkit-mask-image:var(--ag-radio-checked-shape-image);mask-image:var(--ag-radio-checked-shape-image)}}`
);
// packages/ag-grid-community/src/theming/parts/checkbox-style/checkbox-styles.ts
var makeCheckboxStyleDefaultTreeShakeable = () => createPart({
feature: "checkboxStyle",
params: {
checkboxBorderWidth: 1,
checkboxBorderRadius: {
ref: "borderRadius"
},
checkboxUncheckedBackgroundColor: backgroundColor,
checkboxUncheckedBorderColor: foregroundBackgroundMix(0.3),
checkboxCheckedBackgroundColor: accentColor,
checkboxCheckedBorderColor: { ref: "checkboxCheckedBackgroundColor" },
checkboxCheckedShapeImage: {
svg: ''
},
checkboxCheckedShapeColor: backgroundColor,
checkboxIndeterminateBackgroundColor: foregroundBackgroundMix(0.3),
checkboxIndeterminateBorderColor: { ref: "checkboxIndeterminateBackgroundColor" },
checkboxIndeterminateShapeImage: {
svg: ''
},
checkboxIndeterminateShapeColor: backgroundColor,
radioCheckedShapeImage: {
svg: ''
}
},
css: checkboxStyleDefaultCSS
});
var checkboxStyleDefault = /* @__PURE__ */ makeCheckboxStyleDefaultTreeShakeable();
// packages/ag-grid-community/src/theming/parts/color-scheme/color-schemes.ts
var makeColorSchemeLightTreeShakeable = () => createPart({
feature: "colorScheme",
params: defaultLightColorSchemeParams
});
var colorSchemeLight = /* @__PURE__ */ makeColorSchemeLightTreeShakeable();
var makeColorSchemeLightWarmTreeShakeable = () => createPart({
feature: "colorScheme",
params: {
...defaultLightColorSchemeParams,
foregroundColor: "#000000de",
borderColor: "#60300026",
chromeBackgroundColor: "#60300005"
}
});
var colorSchemeLightWarm = /* @__PURE__ */ makeColorSchemeLightWarmTreeShakeable();
var makeColorSchemeLightColdTreeShakeable = () => createPart({
feature: "colorScheme",
params: {
...defaultLightColorSchemeParams,
foregroundColor: "#000",
chromeBackgroundColor: "#f3f8f8"
}
});
var colorSchemeLightCold = /* @__PURE__ */ makeColorSchemeLightColdTreeShakeable();
var darkParams = () => ({
...defaultLightColorSchemeParams,
backgroundColor: "hsl(217, 0%, 17%)",
foregroundColor: "#FFF",
chromeBackgroundColor: foregroundBackgroundMix(0.05),
rowHoverColor: accentMix(0.15),
selectedRowBackgroundColor: accentMix(0.2),
menuBackgroundColor: foregroundBackgroundMix(0.1),
browserColorScheme: "dark",
popupShadow: "0 0px 20px #000A",
cardShadow: "0 1px 4px 1px #000A",
advancedFilterBuilderJoinPillColor: "#7a3a37",
advancedFilterBuilderColumnPillColor: "#355f2d",
advancedFilterBuilderOptionPillColor: "#5a3168",
advancedFilterBuilderValuePillColor: "#374c86",
checkboxUncheckedBorderColor: foregroundBackgroundMix(0.4),
toggleButtonOffBackgroundColor: foregroundBackgroundMix(0.4)
});
var makeColorSchemeDarkTreeShakeable = () => createPart({
feature: "colorScheme",
params: darkParams()
});
var colorSchemeDark = /* @__PURE__ */ makeColorSchemeDarkTreeShakeable();
var makeColorSchemeDarkWarmTreeShakeable = () => createPart({
feature: "colorScheme",
params: {
backgroundColor: "hsl(29, 10%, 17%)",
foregroundColor: "#FFF",
browserColorScheme: "dark"
}
});
var darkBlueParams = () => ({
...darkParams(),
backgroundColor: "#1f2836"
});
var colorSchemeDarkWarm = /* @__PURE__ */ makeColorSchemeDarkWarmTreeShakeable();
var makeColorSchemeDarkBlueTreeShakeable = () => createPart({
feature: "colorScheme",
params: darkBlueParams()
});
var colorSchemeDarkBlue = /* @__PURE__ */ makeColorSchemeDarkBlueTreeShakeable();
var makeColorSchemeVariableTreeShakeable = () => createPart({
feature: "colorScheme",
params: defaultLightColorSchemeParams,
modeParams: {
light: defaultLightColorSchemeParams,
dark: darkParams(),
"dark-blue": darkBlueParams()
}
});
var colorSchemeVariable = /* @__PURE__ */ makeColorSchemeVariableTreeShakeable();
// packages/ag-grid-community/src/theming/parts/icon-set/balham/icon-set-balham.css-GENERATED.ts
var iconSetBalhamCSS = (
/*css*/
`.ag-icon-aggregation:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Eaggregation%3C/title%3E%3Cpath d='M25.128 2.002c2.56.096 4.772 2.292 4.87 4.87a712 712 0 0 1 0 18.256c-.096 2.56-2.292 4.772-4.87 4.87a712 712 0 0 1-18.256 0c-2.558-.096-4.772-2.29-4.87-4.87a712 712 0 0 1 0-18.256c.096-2.56 2.292-4.772 4.87-4.87a712 712 0 0 1 18.256 0M7.006 4c-1.57.02-2.946 1.348-3.004 2.922-.078 6.078-.23 12.16.002 18.234.094 1.484 1.354 2.746 2.84 2.84 6.1.232 12.212.232 18.312 0 1.48-.094 2.746-1.35 2.84-2.84.232-6.1.232-12.212 0-18.312-.094-1.48-1.35-2.746-2.84-2.84C19.11 3.774 13.056 4 7.006 4M22 12h-2v-2h-8v.092c.056 1.352 3.426 2.598 4.472 4.404.682 1.174.438 2.754-.572 3.72C14.29 19.618 12 20.924 12 22h8v-2h2v4H10c0-1.586-.098-3.304 1.016-4.314 1.904-1.632 4.89-3.108 3.54-4.42-1.918-1.68-4.464-2.936-4.554-5.12L10 8h12z'/%3E%3C/svg%3E")}.ag-icon-arrows:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Earrows%3C/title%3E%3Cpath d='m6.414 17 2.294 2.292-1.416 1.416L2.586 16l4.706-4.708 1.416 1.416L6.414 15H15V6.414l-2.292 2.294-1.416-1.416L16 2.586l4.708 4.706-1.416 1.416L17 6.414V15h8.586l-2.294-2.292 1.416-1.416L29.414 16l-4.706 4.708-1.416-1.416L25.586 17H17v8.586l2.292-2.294 1.416 1.416L16 29.414l-4.708-4.706 1.416-1.416L15 25.586V17z'/%3E%3C/svg%3E")}.ag-icon-asc:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Easc%3C/title%3E%3Cpath d='m15 10.621-4.292 4.294-1.416-1.416L16 6.793l6.708 6.706-1.416 1.416L17 10.621v14.586h-2z'/%3E%3C/svg%3E")}.ag-icon-cancel:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Ecancel%3C/title%3E%3Cpath d='M16 4C9.378 4 4 9.378 4 16s5.378 12 12 12 12-5.378 12-12S22.622 4 16 4m0 2c5.52 0 10 4.48 10 10s-4.48 10-10 10S6 21.52 6 16 10.48 6 16 6m0 8.586 5.292-5.294 1.416 1.416L17.414 16l5.294 5.292-1.416 1.416L16 17.414l-5.292 5.294-1.416-1.416L14.586 16l-5.294-5.292 1.416-1.416z'/%3E%3C/svg%3E")}.ag-icon-chart:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Echart%3C/title%3E%3Cpath d='M6.667 12.267h4v13.067h-4zm7.466-5.6h3.733v18.667h-3.733zM21.6 17.333h3.733v8H21.6z'/%3E%3C/svg%3E")}.ag-icon-color-picker:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Ecolor-picker%3C/title%3E%3Cpath d='M23.907 17.587 10.574 4.254l-1.88 1.88 3.173 3.173-8.28 8.28 10.16 10.16zm-16.547 0 6.387-6.387 6.387 6.387H7.361zm18.387 2s-2.667 2.893-2.667 4.667c0 1.467 1.2 2.667 2.667 2.667s2.667-1.2 2.667-2.667c0-1.773-2.667-4.667-2.667-4.667'/%3E%3C/svg%3E")}.ag-icon-columns:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Ecolumns%3C/title%3E%3Cpath d='M14 25h-2V7h2zm6 0h-2V7h2zm6 0h-2V7h2zM8 25H6V7h2z'/%3E%3C/svg%3E")}.ag-icon-contracted:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Econtracted%3C/title%3E%3Cpath d='m21.061 16-8.706 8.708-1.416-1.416L18.233 16l-7.294-7.292 1.416-1.416z'/%3E%3C/svg%3E")}.ag-icon-copy:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Ecopy%3C/title%3E%3Cpath d='M21.929 27.999h-7.828a5.09 5.09 0 0 1-5.086-5.086v-9.812a5.087 5.087 0 0 1 5.086-5.086h7.828a5.09 5.09 0 0 1 5.086 5.086v9.812a5.087 5.087 0 0 1-5.086 5.086m.16-17.984h-8.088a2.94 2.94 0 0 0-2.938 2.938v10.132a2.94 2.94 0 0 0 2.938 2.938h8.088a2.94 2.94 0 0 0 2.936-2.938V12.953a2.94 2.94 0 0 0-2.936-2.938M7.041 26.013h-2.05a4 4 0 0 1-.006-.228V9.065a5.07 5.07 0 0 1 5.064-5.064h12.812q.069 0 .134.002v2.012H9.915a2.876 2.876 0 0 0-2.874 2.874z'/%3E%3C/svg%3E")}.ag-icon-cross:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='4 4 24 24'%3E%3Ctitle%3Ecross%3C/title%3E%3Cpath d='m16 14.586 5.292-5.294 1.416 1.416L17.414 16l5.294 5.292-1.416 1.416L16 17.414l-5.292 5.294-1.416-1.416L14.586 16l-5.294-5.292 1.416-1.416z'/%3E%3C/svg%3E")}.ag-icon-csv:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M384 131.9c-7.753-8.433-110.425-128.473-114.9-133L48-.1C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48zm-35.9 2.1H257V27.9zM30 479V27h200l1 105c0 13.3-1.3 29 12 29h111l1 318z' style='fill-rule:nonzero' transform='matrix(.06285 0 0 .06285 3.934 -.054)'/%3E%3Cpath d='M.688-.226a.2.2 0 0 1-.017.074.28.28 0 0 1-.145.14.412.412 0 0 1-.234.013.28.28 0 0 1-.202-.168.468.468 0 0 1-.04-.19q0-.086.025-.155a.319.319 0 0 1 .182-.191.4.4 0 0 1 .134-.025q.087 0 .155.035a.3.3 0 0 1 .104.085.17.17 0 0 1 .036.097.06.06 0 0 1-.018.044.06.06 0 0 1-.042.019.06.06 0 0 1-.042-.013.2.2 0 0 1-.031-.046.2.2 0 0 0-.066-.079.16.16 0 0 0-.095-.027.17.17 0 0 0-.142.068.3.3 0 0 0-.053.193.4.4 0 0 0 .023.139.2.2 0 0 0 .067.083.2.2 0 0 0 .1.027q.063 0 .106-.031a.2.2 0 0 0 .065-.091.2.2 0 0 1 .023-.046q.014-.018.044-.018a.06.06 0 0 1 .044.018.06.06 0 0 1 .019.045' style='fill-rule:nonzero' transform='matrix(8.39799 0 0 12.455 7.122 25.977)'/%3E%3Cpath d='M.622-.215a.2.2 0 0 1-.033.117.23.23 0 0 1-.098.081.4.4 0 0 1-.153.029.34.34 0 0 1-.175-.04.23.23 0 0 1-.079-.077.17.17 0 0 1-.031-.093q0-.027.019-.045a.06.06 0 0 1 .046-.019.06.06 0 0 1 .039.014.1.1 0 0 1 .027.044.3.3 0 0 0 .03.057q.015.023.044.038.03.015.076.015.065 0 .105-.03a.09.09 0 0 0 .04-.075.08.08 0 0 0-.022-.058.14.14 0 0 0-.056-.034 1 1 0 0 0-.092-.025.7.7 0 0 1-.129-.042.2.2 0 0 1-.083-.066.17.17 0 0 1-.03-.104q0-.058.032-.105a.2.2 0 0 1 .093-.07.4.4 0 0 1 .144-.025q.066 0 .114.016a.3.3 0 0 1 .08.044.2.2 0 0 1 .046.057q.015.03.015.058a.07.07 0 0 1-.018.046.06.06 0 0 1-.046.021q-.025 0-.038-.012a.2.2 0 0 1-.028-.041.2.2 0 0 0-.047-.063Q.387-.625.326-.625a.15.15 0 0 0-.09.025q-.035.024-.035.059 0 .021.012.037a.1.1 0 0 0 .032.027.4.4 0 0 0 .111.036q.06.015.11.031.048.018.083.042a.2.2 0 0 1 .054.062.2.2 0 0 1 .019.091' style='fill-rule:nonzero' transform='matrix(8.39799 0 0 12.455 13.339 25.977)'/%3E%3Cpath d='m.184-.633.162.48.163-.483q.013-.038.019-.053a.062.062 0 0 1 .061-.039q.018 0 .034.009a.1.1 0 0 1 .025.025q.009.015.009.031L.654-.64l-.007.025-.009.024-.173.468-.019.051a.2.2 0 0 1-.021.042.1.1 0 0 1-.033.03.1.1 0 0 1-.049.012.1.1 0 0 1-.05-.011A.1.1 0 0 1 .26-.03a.2.2 0 0 1-.021-.042L.22-.123.05-.587.041-.612.033-.638.03-.662q0-.025.02-.046a.07.07 0 0 1 .05-.02q.037 0 .053.023.015.023.031.072' style='fill-rule:nonzero' transform='matrix(8.39799 0 0 12.455 18.94 25.977)'/%3E%3C/svg%3E")}.ag-icon-cut:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M14.703 15.096 6.215 4.719a1 1 0 1 1 1.548-1.267l13.058 15.965A5.001 5.001 0 0 1 28 23.916a5 5 0 0 1-4.999 4.999 5 5 0 0 1-4.999-4.999 4.98 4.98 0 0 1 1.23-3.283l-3.238-3.958-3.272 4.001a4.98 4.98 0 0 1 1.265 3.323 5 5 0 0 1-4.999 4.999 5 5 0 0 1-4.999-4.999 5 5 0 0 1 7.13-4.522zM8.991 20.8a3.1 3.1 0 0 0-3.1 3.1c0 1.711 1.389 3.1 3.1 3.1s3.1-1.389 3.1-3.1-1.389-3.1-3.1-3.1M23 20.8a3.1 3.1 0 0 0-3.1 3.1c0 1.711 1.389 3.1 3.1 3.1s3.1-1.389 3.1-3.1-1.389-3.1-3.1-3.1m-5.723-8.852 1.292 1.579 7.205-8.808a1 1 0 0 0-1.548-1.267z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-desc:before,.ag-icon-down:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Edesc%3C/title%3E%3Cpath d='m17 21.379 4.292-4.294 1.416 1.416L16 25.207l-6.708-6.706 1.416-1.416L15 21.379V6.793h2z'/%3E%3C/svg%3E")}.ag-icon-excel:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M384 131.9c-7.753-8.433-110.425-128.473-114.9-133L48-.1C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48zm-35.9 2.1H257V27.9zM30 479V27h200l1 105c0 13.3-1.3 29 12 29h111l1 318z' style='fill-rule:nonzero' transform='matrix(.06285 0 0 .06285 3.934 -.054)'/%3E%3Cpath d='m.052-.139.16-.234-.135-.208a.4.4 0 0 1-.028-.052.1.1 0 0 1-.01-.042.05.05 0 0 1 .018-.037.07.07 0 0 1 .045-.016q.03 0 .047.018a1 1 0 0 1 .047.066l.107.174.115-.174.024-.038.019-.026.021-.015a.1.1 0 0 1 .027-.005.06.06 0 0 1 .044.016.05.05 0 0 1 .018.039q0 .033-.038.089l-.141.211.152.234a.3.3 0 0 1 .03.051.1.1 0 0 1 .009.038.1.1 0 0 1-.008.031.1.1 0 0 1-.024.023.1.1 0 0 1-.034.008.1.1 0 0 1-.035-.008.1.1 0 0 1-.023-.022L.427-.067.301-.265l-.134.204-.022.034-.016.019a.1.1 0 0 1-.022.015.1.1 0 0 1-.03.005.06.06 0 0 1-.044-.016.06.06 0 0 1-.017-.047q0-.036.036-.088' style='fill-rule:nonzero' transform='matrix(17.82892 0 0 16.50777 10.371 25.928)'/%3E%3C/svg%3E")}.ag-icon-expanded:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Eexpanded%3C/title%3E%3Cpath d='M21.061 8.708 13.767 16l7.294 7.292-1.416 1.416L10.939 16l8.706-8.708z'/%3E%3C/svg%3E")}.ag-icon-eye-slash:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Eeye-slash%3C/title%3E%3Cpath d='M9.304 7.89a15.2 15.2 0 0 1 6.404-1.638c.294-.002.292-.002.584 0 5.956.174 11.328 4.088 13.62 9.748 0 0-1.318 3.178-3.224 5.174a13.6 13.6 0 0 1-2.226 1.874L26.414 25 25 26.414l-2.336-2.336C17.866 26.396 11.776 26.15 7.36 22.96a14.9 14.9 0 0 1-4.168-4.612c-.41-.71-.694-1.336-1.104-2.348 0 0 .898-2.218 2.002-3.718a14.6 14.6 0 0 1 3.442-3.334L5.586 7 7 5.586zm-.3 2.528c-2.038 1.344-3.708 3.246-4.724 5.508L4.248 16c2.46 5.762 9.622 9.064 15.63 7.15q.688-.219 1.342-.516l-.912-.912a6.96 6.96 0 0 1-4.19 1.394c-3.862 0-7-3.136-7-7 0-1.57.52-3.022 1.394-4.19zm14.032 11.204a13.25 13.25 0 0 0 4.684-5.548l.032-.074c-1.984-4.646-6.834-7.798-12.006-7.748-1.712.05-3.386.458-4.922 1.158l1.102 1.102a6.97 6.97 0 0 1 4.192-1.396 7.003 7.003 0 0 1 5.606 11.192zm-11.09-8.262a5.003 5.003 0 0 0 6.928 6.928zm8.342 5.514a5.002 5.002 0 0 0-6.928-6.928z'/%3E%3C/svg%3E")}.ag-icon-eye:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Eeye%3C/title%3E%3Cpath d='M16.292 6.32c5.956.174 11.328 4.086 13.62 9.746 0 0-1.318 3.18-3.224 5.176-4.862 5.088-13.534 5.97-19.328 1.784a14.9 14.9 0 0 1-4.168-4.612c-.41-.71-.694-1.336-1.104-2.348 0 0 .898-2.216 2.002-3.716 2.678-3.64 7.03-5.896 11.618-6.03.294-.004.292-.004.584 0m-.546 2c-4.896.142-9.458 3.202-11.466 7.672l-.032.074c2.46 5.762 9.622 9.066 15.63 7.152 3.458-1.102 6.342-3.738 7.842-7.076l.032-.076C25.768 11.42 20.918 8.27 15.746 8.32m.254.946c3.754 0 6.8 3.048 6.8 6.8 0 3.754-3.046 6.8-6.8 6.8s-6.8-3.046-6.8-6.8c0-3.752 3.046-6.8 6.8-6.8m5 6.768V16c0-2.76-2.24-5-5-5s-5 2.24-5 5v.066c0 2.76 2.24 5 5 5s5-2.24 5-5z'/%3E%3C/svg%3E")}.ag-icon-filter:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Efilter%3C/title%3E%3Cpath d='M26 8.184c-.066 2.658-4.058 5.154-6.742 7.974a1.05 1.05 0 0 0-.258.682v3.66L13 25c0-2.74.066-5.482-.002-8.222a1.05 1.05 0 0 0-.256-.62C10.026 13.304 6.06 10.61 6 8.184V6h20zM8 8c0 .304.06.612.258.842 2.716 2.854 6.682 5.548 6.742 7.974V21l2-1.5v-2.684c.066-2.658 4.058-5.154 6.742-7.974.198-.23.258-.538.258-.842z'/%3E%3C/svg%3E")}.ag-icon-first:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Efirst%3C/title%3E%3Cpath d='M24.354 8.708 17.06 16l7.294 7.292-1.416 1.416L14.232 16l8.706-8.708zM9.646 8v16h-2V8z'/%3E%3C/svg%3E")}.ag-icon-group:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Egroup%3C/title%3E%3Cpath d='M25.128 2.002c2.56.096 4.772 2.292 4.87 4.87a712 712 0 0 1 0 18.256c-.096 2.56-2.292 4.772-4.87 4.87a712 712 0 0 1-18.256 0c-2.558-.096-4.772-2.29-4.87-4.87a712 712 0 0 1 0-18.256c.096-2.56 2.292-4.772 4.87-4.87a712 712 0 0 1 18.256 0M7.006 4c-1.57.02-2.946 1.348-3.004 2.922-.078 6.078-.23 12.16.002 18.234.094 1.484 1.354 2.746 2.84 2.84 6.1.232 12.212.232 18.312 0 1.48-.094 2.746-1.35 2.84-2.84.232-6.1.232-12.212 0-18.312-.094-1.48-1.35-2.746-2.84-2.84C19.11 3.774 13.056 4 7.006 4M14 21h-4v-2h4zm12 0H16v-2h10zm-12-4h-4v-2h4zm12 0H16v-2h10zm-16-4H6v-2h4zm16 0H12v-2h14z'/%3E%3C/svg%3E")}.ag-icon-last:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Elast%3C/title%3E%3Cpath d='m17.768 16-8.706 8.708-1.416-1.416L14.94 16 7.646 8.708l1.416-1.416zm6.586 8h-2V8h2z'/%3E%3C/svg%3E")}.ag-icon-left:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Eleft%3C/title%3E%3Cpath d='m17.621 11-2 2h12.586v6H15.621l2 2-4.414 4.414L3.793 16l9.414-9.414zm-11 5 6.586 6.586L14.793 21l-4-4h15.414v-2H10.793l4-4-1.586-1.586z'/%3E%3C/svg%3E")}.ag-icon-linked:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Elinked%3C/title%3E%3Cpath d='M17.138 13.418a1.03 1.03 0 0 0-.298.658s.125.096.226.178c1.372 1.114 2.033 3.039 1.582 4.796a4.7 4.7 0 0 1-1.205 2.123c-1.145 1.151-2.296 2.294-3.445 3.441-1.241 1.232-3.185 1.691-4.864 1.105-1.546-.54-2.756-1.938-3.048-3.572-.267-1.496.246-3.108 1.319-4.186l.578-.578-.03-.092a10.5 10.5 0 0 1-.452-2.3v-.005c-.776.775-1.621 1.489-2.275 2.396-1.817 2.522-1.643 6.323.706 8.669 1.813 1.811 4.708 2.462 7.171 1.517a6.75 6.75 0 0 0 2.336-1.518l3.427-3.424c1.939-1.954 2.533-5.126 1.294-7.674a6.8 6.8 0 0 0-2.071-2.481l-.003-.002zM21.265 4a6.8 6.8 0 0 0-4.734 1.964l-3.427 3.424c-1.961 1.977-2.52 5.092-1.32 7.619a6.8 6.8 0 0 0 2.098 2.537l.003.002c.32-.32.643-.637.96-.96.167-.172.27-.401.286-.64l-.204-.167c-1.603-1.287-2.215-3.68-1.316-5.616a4.7 4.7 0 0 1 .918-1.32c1.145-1.151 2.296-2.294 3.445-3.441 1.239-1.23 3.178-1.694 4.864-1.105 1.83.639 3.16 2.498 3.12 4.493a4.8 4.8 0 0 1-1.391 3.265l-.578.578.03.092c.235.743.387 1.519.452 2.3v.005c.732-.731 1.521-1.406 2.162-2.244 1.192-1.559 1.643-3.651 1.204-5.575a6.8 6.8 0 0 0-3.98-4.703 6.8 6.8 0 0 0-2.529-.506h-.061z'/%3E%3C/svg%3E")}.ag-icon-loading:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Eloading%3C/title%3E%3Cpath d='M17 29h-2v-8h2zm-3.586-9L7 26.414 5.586 25 12 18.586zm13 5L25 26.414 18.586 20 20 18.586zM29 17h-8v-2h8zm-18 0H3v-2h8zm2.414-5L12 13.414 5.586 7 7 5.586zm13-5L20 13.414 18.586 12 25 5.586zM17 11h-2V3h2z'/%3E%3C/svg%3E")}.ag-icon-maximize:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='3 3 26 26'%3E%3Ctitle%3Emaximize%3C/title%3E%3Cpath d='m7.54 17.4.1 6.98 6.96.1-2.24-2.24L16 18.6 13.4 16l-3.64 3.64zm16.92-2.8-.1-6.98-6.96-.1 2.24 2.24L16 13.4l2.6 2.6 3.64-3.64z'/%3E%3C/svg%3E")}.ag-icon-menu:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Emenu%3C/title%3E%3Cpath d='M26 23H6v-2h20zm0-6H6v-2h20zm0-6H6V9h20z'/%3E%3C/svg%3E")}.ag-icon-menu-alt:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' fill='none'%3E%3Cpath fill='%23000' d='M16 18a2 2 0 1 0 0-4 2 2 0 0 0 0 4m0-7a2 2 0 1 0 0-4 2 2 0 0 0 0 4m0 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4'/%3E%3C/svg%3E")}.ag-icon-minimize:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='3 3 26 26'%3E%3Ctitle%3Eminimize%3C/title%3E%3Cpath d='m14.8 24.26-.1-6.96-6.96-.1 2.24 2.24-3.64 3.64 2.6 2.6 3.64-3.64zm2.4-16.52.1 6.96 6.96.1-2.24-2.24 3.64-3.64-2.6-2.6-3.64 3.64z'/%3E%3C/svg%3E")}.ag-icon-minus:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M7.515 7.515c-4.683 4.682-4.683 12.288 0 16.97 4.682 4.683 12.288 4.683 16.97 0 4.683-4.682 4.683-12.288 0-16.97-4.682-4.683-12.288-4.683-16.97 0m1.414 1.414c3.903-3.903 10.239-3.903 14.142 0s3.903 10.239 0 14.142-10.239 3.903-14.142 0-3.903-10.239 0-14.142m-1.414 6.07h16.97v2.002H7.515z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-next:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Enext%3C/title%3E%3Cpath d='m21.061 16-8.706 8.708-1.416-1.416L18.233 16l-7.294-7.292 1.416-1.416z'/%3E%3C/svg%3E")}.ag-icon-none:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Enone%3C/title%3E%3Cpath d='m10.044 21.258 4.478-4.198L16 18.444 9 25l-7-6.556 1.478-1.384 4.478 4.198V7h2.088zm14 3.742h-2.088V10.742l-4.478 4.198L16 13.556 23 7q3.5 3.28 7 6.556l-1.478 1.384-4.478-4.198z'/%3E%3C/svg%3E")}.ag-icon-not-allowed:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Enot-allowed%3C/title%3E%3Cpath d='M16.186 3.646c8.188.154 14.898 9.796 11.17 17.78-3.298 7.066-13.932 9.374-19.848 3.87-3.9-3.632-5.076-9.896-2.684-14.708 2.082-4.19 6.588-6.974 11.362-6.942m-.298 1.998c-6.922.132-12.578 8.308-9.33 15.052 3.342 6.934 15.246 7.646 18.932 0 3.076-6.386-1.988-15.1-9.602-15.052m7.596 6.422c2.864 5.33-1.744 13.186-8.306 12.536a8.6 8.6 0 0 1-3.232-.998l-1.266-.706L22.778 10.8q.351.633.706 1.266m-9.422 10.276c3.296 1.028 7.246-1.006 8.216-4.418a6.6 6.6 0 0 0-.056-3.742zm2.104-14.696a8.8 8.8 0 0 1 3.936 1.038l1.266.706L9.27 21.488c-3.018-5.41-.99-13.37 6.318-13.834q.289-.01.578-.008m-.31 2c-4.06.154-7.23 4.614-6.03 8.46l8.16-8.16a6.8 6.8 0 0 0-2.13-.3'/%3E%3C/svg%3E")}.ag-icon-paste:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Epaste%3C/title%3E%3Cpath d='M20 6.5c0-1-1-3-4-3s-4 2-4 3H8c-2.21 0-4 1.79-4 4v14c0 2.21 1.79 4 4 4h16c2.21 0 4-1.79 4-4v-14c0-2.21-1.79-4-4-4zm-4 .546c.734 0 1.334.572 1.334 1.272S16.734 9.59 16 9.59s-1.334-.572-1.334-1.272.6-1.272 1.334-1.272M24 26.5H8a2 2 0 0 1-2-2v-14a2 2 0 0 1 2-2h2v4h12v-4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2'/%3E%3C/svg%3E")}.ag-icon-pin:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Epin%3C/title%3E%3Cpath d='m10.78 19.777-4.668-4.666s.032-1 .67-1.87c1.366-1.86 4.052-1.96 6.056-1.572l3.158-3.108c-.7-2.342 3.352-5.046 3.352-5.046l9.166 9.168q-.334.447-.67.894c-1.074 1.426-2.538 2.63-4.272 2.338l-3.32 3.218c.046.344.042.03.118 1.152.144 2.13-.64 4.324-2.632 5.34l-.746.364-4.798-4.798-7.292 7.294-1.416-1.416zm8.24-13.672c-.688.568-1.416 1.45-1.024 2.072l.49.722-4.986 4.988c-1.988-.506-4.346-.636-5.156.614l9.02 9.032q.14-.099.272-.21c1.226-1.08.764-3.04.498-4.9l4.79-4.79s1.47.938 2.936-.776l-6.79-6.79q-.026.019-.05.038'/%3E%3C/svg%3E")}.ag-icon-pivot:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Epivot%3C/title%3E%3Cpath d='M25.128 2.002c2.56.096 4.772 2.292 4.87 4.87a712 712 0 0 1 0 18.256c-.096 2.56-2.292 4.772-4.87 4.87a712 712 0 0 1-18.256 0c-2.558-.096-4.772-2.29-4.87-4.87a712 712 0 0 1 0-18.256c.096-2.56 2.292-4.772 4.87-4.87a712 712 0 0 1 18.256 0m2.966 7.954H9.892v18.136c5.086.13 10.18.098 15.264-.096 1.48-.094 2.746-1.35 2.84-2.84.192-5.064.226-10.134.098-15.2M3.968 24.1q.015.528.036 1.056c.094 1.484 1.354 2.746 2.84 2.84l1.012.036V24.1zM22 15.414l-.292.294-1.416-1.416L23 11.586l2.708 2.706-1.416 1.416-.292-.294v3.592c-.032 2.604-2.246 4.892-4.872 4.992L15.414 24l.294.292-1.416 1.416L11.586 23l2.706-2.708 1.416 1.416-.322.32c3.372.03 6.578-.164 6.614-3.034zM3.88 18.038c.002 1.346.012 2.694.038 4.04h3.938v-4.04zm.05-6.062a681 681 0 0 0-.044 4.042h3.97v-4.042zm5.962-7.99Q8.449 3.999 7.006 4c-1.57.02-2.946 1.348-3.004 2.922q-.02 1.517-.042 3.034h3.896v-2.02h2.036zm14.244-.016v3.966h3.898q-.017-.546-.038-1.092c-.094-1.48-1.35-2.746-2.84-2.84q-.51-.019-1.02-.034m-8.14-.054q-2.035.022-4.07.048v3.972h4.07zm6.106.008c-1.358-.022-2.714-.026-4.07-.022v4.034h4.07z'/%3E%3C/svg%3E")}.ag-icon-plus:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M7.515 7.515c-4.683 4.682-4.683 12.288 0 16.97 4.682 4.683 12.288 4.683 16.97 0 4.683-4.682 4.683-12.288 0-16.97-4.682-4.683-12.288-4.683-16.97 0m1.414 1.414c3.903-3.903 10.239-3.903 14.142 0s3.903 10.239 0 14.142-10.239 3.903-14.142 0-3.903-10.239 0-14.142M15 15l-.001-7.485h2.002L17 15l7.485-.001v2.002L17 17l.001 7.485h-2.002L15 17l-7.485.001v-2.002z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-previous:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Eprevious%3C/title%3E%3Cpath d='M21.061 8.708 13.767 16l7.294 7.292-1.416 1.416L10.939 16l8.706-8.708z'/%3E%3C/svg%3E")}.ag-icon-right:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Eright%3C/title%3E%3Cpath d='m28.207 16-9.414 9.414L14.379 21l2-2H3.793v-6h12.586l-2-2 4.414-4.414zm-11-5 4 4H5.793v2h15.414l-4 4 1.586 1.586L25.379 16l-6.586-6.586z'/%3E%3C/svg%3E")}.ag-icon-save:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Esave%3C/title%3E%3Cpath d='M25.333 16v9.333H6.666V16H3.999v9.333C3.999 26.8 5.199 28 6.666 28h18.667C26.8 28 28 26.8 28 25.333V16zm-8 .893 3.453-3.44 1.88 1.88L15.999 22l-6.667-6.667 1.88-1.88 3.453 3.44V4h2.667v12.893z'/%3E%3C/svg%3E")}.ag-icon-small-down:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Esmall-down%3C/title%3E%3Cpath d='M24.708 12.355 16 21.061l-8.708-8.706 1.416-1.416L16 18.233l7.292-7.294z'/%3E%3C/svg%3E")}.ag-icon-small-left:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Esmall-left%3C/title%3E%3Cpath d='M21.061 8.708 13.767 16l7.294 7.292-1.416 1.416L10.939 16l8.706-8.708z'/%3E%3C/svg%3E")}.ag-icon-small-right:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Esmall-right%3C/title%3E%3Cpath d='m21.061 16-8.706 8.708-1.416-1.416L18.233 16l-7.294-7.292 1.416-1.416z'/%3E%3C/svg%3E")}.ag-icon-small-up:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Esmall-up%3C/title%3E%3Cpath d='m24.708 19.645-1.416 1.416L16 13.767l-7.292 7.294-1.416-1.416L16 10.939z'/%3E%3C/svg%3E")}.ag-icon-tick:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Etick%3C/title%3E%3Cpath d='M24.708 10.855 13 22.561l-5.708-5.706 1.416-1.416L13 19.733 23.292 9.439z'/%3E%3C/svg%3E")}.ag-icon-tree-closed:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Etree-closed%3C/title%3E%3Cpath d='m21.061 16-8.706 8.708-1.416-1.416L18.233 16l-7.294-7.292 1.416-1.416z'/%3E%3C/svg%3E")}.ag-icon-tree-indeterminate:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Etree-indeterminate%3C/title%3E%3Cpath d='M6 15h20v2H6z'/%3E%3C/svg%3E")}.ag-icon-tree-open:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Etree-open%3C/title%3E%3Cpath d='M24.708 12.355 16 21.061l-8.708-8.706 1.416-1.416L16 18.233l7.292-7.294z'/%3E%3C/svg%3E")}.ag-icon-unlinked:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Eunlinked%3C/title%3E%3Cpath d='M5.35 3.999a.2.2 0 0 0-.14.058c-.388.38-.768.768-1.152 1.152a.21.21 0 0 0-.002.288c7.459 7.506 14.965 14.965 22.447 22.447a.21.21 0 0 0 .288.002q.576-.574 1.151-1.151a.21.21 0 0 0 .002-.288C20.484 19.002 12.979 11.542 5.497 4.06a.2.2 0 0 0-.146-.061zm.611 12.548c-1.933 1.939-2.538 5.119-1.289 7.688a6.79 6.79 0 0 0 4.891 3.672 6.82 6.82 0 0 0 5.893-1.866l1.984-1.984-1.438-1.438-1.986 1.986c-1.486 1.476-3.993 1.81-5.834.629a4.73 4.73 0 0 1-2.024-2.853 4.76 4.76 0 0 1 1.241-4.393l1.986-1.986-1.438-1.438-1.984 1.984zM21.273 3.999a6.78 6.78 0 0 0-4.727 1.963l-1.984 1.984L16 9.384l1.985-1.985a4.74 4.74 0 0 1 2.776-1.338c1.974-.224 4.045.926 4.845 2.834.712 1.699.329 3.778-1.004 5.12L22.616 16l1.439 1.438q1-1 2-2c2.012-2.031 2.557-5.368 1.112-7.982-1.144-2.07-3.432-3.441-5.834-3.459h-.061z'/%3E%3C/svg%3E")}.ag-icon-up:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Easc%3C/title%3E%3Cpath d='m15 10.621-4.292 4.294-1.416-1.416L16 6.793l6.708 6.706-1.416 1.416L17 10.621v14.586h-2z'/%3E%3C/svg%3E")}.ag-icon-grip:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Egrip%3C/title%3E%3Cpath d='M8 24H6v-4h2zm6 0h-2v-4h2zm6 0h-2v-4h2zm6 0h-2v-4h2zM8 18H6v-4h2zm6 0h-2v-4h2zm6 0h-2v-4h2zm6 0h-2v-4h2zM8 12H6V8h2zm6 0h-2V8h2zm6 0h-2V8h2zm6 0h-2V8h2z'/%3E%3C/svg%3E")}.ag-icon-settings:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' fill='none' viewBox='0 0 32 32'%3E%3Cpath fill='%23000' d='M30 8h-4.1c-.5-2.3-2.5-4-4.9-4s-4.4 1.7-4.9 4H2v2h14.1c.5 2.3 2.5 4 4.9 4s4.4-1.7 4.9-4H30zm-9 4c-1.7 0-3-1.3-3-3s1.3-3 3-3 3 1.3 3 3-1.3 3-3 3M2 24h4.1c.5 2.3 2.5 4 4.9 4s4.4-1.7 4.9-4H30v-2H15.9c-.5-2.3-2.5-4-4.9-4s-4.4 1.7-4.9 4H2zm9-4c1.7 0 3 1.3 3 3s-1.3 3-3 3-3-1.3-3-3 1.3-3 3-3'/%3E%3C/svg%3E")}`
);
// packages/ag-grid-community/src/theming/parts/icon-set/balham/icon-set-balham.ts
var iconSetBalham = /* @__PURE__ */ createPart({
feature: "iconSet",
css: iconSetBalhamCSS
});
// packages/ag-grid-community/src/theming/parts/icon-set/alpine/icon-set-alpine.css-GENERATED.ts
var iconSetAlpineCSS = (
/*css*/
`.ag-icon-aggregation:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M24 6H8v2l8 8-8 8v2h16v-2H11l8-8-8-8h13z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-arrows:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M7.515 11.171 2.687 16l4.828 4.829-1.414 1.414L-.142 16l6.243-6.243zm16.97 0 1.414-1.414L32.142 16l-6.243 6.243-1.414-1.414L29.313 16zM16.028 13.2l2.829 2.828-2.829 2.829-2.828-2.829zm-4.857 11.285L16 29.313l4.829-4.828 1.414 1.414L16 32.142l-6.243-6.243zm0-16.97L9.757 6.101 16-.142l6.243 6.243-1.414 1.414L16 2.687z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-asc:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='m5.333 16 1.88 1.88 7.453-7.44v16.227h2.667V10.44l7.44 7.453L26.666 16 15.999 5.333 5.332 16z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-cancel:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M16 2.667A13.32 13.32 0 0 0 2.667 16c0 7.373 5.96 13.333 13.333 13.333S29.333 23.373 29.333 16 23.373 2.667 16 2.667m6.667 18.12-1.88 1.88L16 17.88l-4.787 4.787-1.88-1.88L14.12 16l-4.787-4.787 1.88-1.88L16 14.12l4.787-4.787 1.88 1.88L17.88 16z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-chart:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Echart%3C/title%3E%3Cg fill='%23000' fill-rule='nonzero'%3E%3Cpath d='M14 7h4v18h-4zM8 17h4v8H8zM20 13h4v12h-4z'/%3E%3C/g%3E%3C/svg%3E")}.ag-icon-color-picker:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M23.907 17.587 10.574 4.254l-1.88 1.88 3.173 3.173-8.28 8.28 10.16 10.16zm-16.547 0 6.387-6.387 6.387 6.387zm18.387 2s-2.667 2.893-2.667 4.667c0 1.467 1.2 2.667 2.667 2.667s2.667-1.2 2.667-2.667c0-1.773-2.667-4.667-2.667-4.667' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-columns:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M26 25H6V7h20zM12 11H8v12h4zm6 0h-4v12h4zm6 12V11h-4v12z' style='fill-rule:nonzero' transform='translate(0 -1)'/%3E%3C/svg%3E")}.ag-icon-contracted:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='m12 6 10 10-10 10-2-2 8-8-8-8z'/%3E%3C/svg%3E")}.ag-icon-copy:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M22 1.333H6A2.675 2.675 0 0 0 3.333 4v18.667H6V4h16zm4 5.334H11.333a2.675 2.675 0 0 0-2.667 2.667v18.667c0 1.467 1.2 2.667 2.667 2.667H26c1.467 0 2.667-1.2 2.667-2.667V9.334c0-1.467-1.2-2.667-2.667-2.667M26 28H11.333V9.333H26z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-cross:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M15.984 13.894 27.05 2.828l2.122 2.122-11.066 11.066 11.066 11.066-2.122 2.12-11.066-11.066L4.918 29.202l-2.12-2.12 11.066-11.066L2.798 4.95l2.12-2.122z'/%3E%3C/svg%3E")}.ag-icon-csv:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M384 131.9c-7.753-8.433-110.425-128.473-114.9-133L48-.1C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48zm-35.9 2.1H257V27.9zM30 479V27h200l1 105c0 13.3-1.3 29 12 29h111l1 318z' style='fill-rule:nonzero' transform='matrix(.06285 0 0 .06285 3.934 -.054)'/%3E%3Cpath d='M.688-.226a.2.2 0 0 1-.017.074.28.28 0 0 1-.145.14.412.412 0 0 1-.234.013.28.28 0 0 1-.202-.168.468.468 0 0 1-.04-.19q0-.086.025-.155a.319.319 0 0 1 .182-.191.4.4 0 0 1 .134-.025q.087 0 .155.035a.3.3 0 0 1 .104.085.17.17 0 0 1 .036.097.06.06 0 0 1-.018.044.06.06 0 0 1-.042.019.06.06 0 0 1-.042-.013.2.2 0 0 1-.031-.046.2.2 0 0 0-.066-.079.16.16 0 0 0-.095-.027.17.17 0 0 0-.142.068.3.3 0 0 0-.053.193.4.4 0 0 0 .023.139.2.2 0 0 0 .067.083.2.2 0 0 0 .1.027q.063 0 .106-.031a.2.2 0 0 0 .065-.091.2.2 0 0 1 .023-.046q.014-.018.044-.018a.06.06 0 0 1 .044.018.06.06 0 0 1 .019.045' style='fill-rule:nonzero' transform='matrix(8.39799 0 0 12.455 7.122 25.977)'/%3E%3Cpath d='M.622-.215a.2.2 0 0 1-.033.117.23.23 0 0 1-.098.081.4.4 0 0 1-.153.029.34.34 0 0 1-.175-.04.23.23 0 0 1-.079-.077.17.17 0 0 1-.031-.093q0-.027.019-.045a.06.06 0 0 1 .046-.019.06.06 0 0 1 .039.014.1.1 0 0 1 .027.044.3.3 0 0 0 .03.057q.015.023.044.038.03.015.076.015.065 0 .105-.03a.09.09 0 0 0 .04-.075.08.08 0 0 0-.022-.058.14.14 0 0 0-.056-.034 1 1 0 0 0-.092-.025.7.7 0 0 1-.129-.042.2.2 0 0 1-.083-.066.17.17 0 0 1-.03-.104q0-.058.032-.105a.2.2 0 0 1 .093-.07.4.4 0 0 1 .144-.025q.066 0 .114.016a.3.3 0 0 1 .08.044.2.2 0 0 1 .046.057q.015.03.015.058a.07.07 0 0 1-.018.046.06.06 0 0 1-.046.021q-.025 0-.038-.012a.2.2 0 0 1-.028-.041.2.2 0 0 0-.047-.063Q.387-.625.326-.625a.15.15 0 0 0-.09.025q-.035.024-.035.059 0 .021.012.037a.1.1 0 0 0 .032.027.4.4 0 0 0 .111.036q.06.015.11.031.048.018.083.042a.2.2 0 0 1 .054.062.2.2 0 0 1 .019.091' style='fill-rule:nonzero' transform='matrix(8.39799 0 0 12.455 13.339 25.977)'/%3E%3Cpath d='m.184-.633.162.48.163-.483q.013-.038.019-.053a.062.062 0 0 1 .061-.039q.018 0 .034.009a.1.1 0 0 1 .025.025q.009.015.009.031L.654-.64l-.007.025-.009.024-.173.468-.019.051a.2.2 0 0 1-.021.042.1.1 0 0 1-.033.03.1.1 0 0 1-.049.012.1.1 0 0 1-.05-.011A.1.1 0 0 1 .26-.03a.2.2 0 0 1-.021-.042L.22-.123.05-.587.041-.612.033-.638.03-.662q0-.025.02-.046a.07.07 0 0 1 .05-.02q.037 0 .053.023.015.023.031.072' style='fill-rule:nonzero' transform='matrix(8.39799 0 0 12.455 18.94 25.977)'/%3E%3C/svg%3E")}.ag-icon-cut:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M13.775 15.198 3.835 2.945a1.501 1.501 0 0 1 2.33-1.89l14.997 18.488A6.003 6.003 0 0 1 29.657 25c0 3.311-2.688 6-6 6s-6-2.689-6-6c0-1.335.437-2.569 1.176-3.566l-3.127-3.855-3.001 3.7A5.97 5.97 0 0 1 14 25c0 3.311-2.689 6-6 6s-6-2.689-6-6a6.003 6.003 0 0 1 8.315-5.536zm9.882 6.702a3.1 3.1 0 0 0-3.1 3.1c0 1.711 1.389 3.1 3.1 3.1s3.1-1.389 3.1-3.1-1.389-3.1-3.1-3.1M8 21.95a3.05 3.05 0 1 0 .001 6.101A3.05 3.05 0 0 0 8 21.95m9.63-11.505 1.932 2.381 8.015-9.881a1.5 1.5 0 0 0-2.329-1.89z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-desc:before,.ag-icon-down:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='m26.667 16-1.88-1.88-7.453 7.44V5.333h-2.667V21.56l-7.44-7.453L5.334 16l10.667 10.667z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-excel:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M384 131.9c-7.753-8.433-110.425-128.473-114.9-133L48-.1C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48zm-35.9 2.1H257V27.9zM30 479V27h200l1 105c0 13.3-1.3 29 12 29h111l1 318z' style='fill-rule:nonzero' transform='matrix(.06285 0 0 .06285 3.934 -.054)'/%3E%3Cpath d='m.052-.139.16-.234-.135-.208a.4.4 0 0 1-.028-.052.1.1 0 0 1-.01-.042.05.05 0 0 1 .018-.037.07.07 0 0 1 .045-.016q.03 0 .047.018a1 1 0 0 1 .047.066l.107.174.115-.174.024-.038.019-.026.021-.015a.1.1 0 0 1 .027-.005.06.06 0 0 1 .044.016.05.05 0 0 1 .018.039q0 .033-.038.089l-.141.211.152.234a.3.3 0 0 1 .03.051.1.1 0 0 1 .009.038.1.1 0 0 1-.008.031.1.1 0 0 1-.024.023.1.1 0 0 1-.034.008.1.1 0 0 1-.035-.008.1.1 0 0 1-.023-.022L.427-.067.301-.265l-.134.204-.022.034-.016.019a.1.1 0 0 1-.022.015.1.1 0 0 1-.03.005.06.06 0 0 1-.044-.016.06.06 0 0 1-.017-.047q0-.036.036-.088' style='fill-rule:nonzero' transform='matrix(17.82892 0 0 16.50777 10.371 25.928)'/%3E%3C/svg%3E")}.ag-icon-expanded:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M20 26 10 16 20 6l2 2-8 8 8 8z'/%3E%3C/svg%3E")}.ag-icon-eye-slash:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Eeye-slash%3C/title%3E%3Cpath fill='%23000' fill-rule='nonzero' d='M8.95 10.364 7 8.414 8.414 7l2.32 2.32A13.2 13.2 0 0 1 16.5 8c5.608 0 10.542 3.515 12.381 8.667L29 17l-.119.333a13 13 0 0 1-4.255 5.879l1.466 1.466-1.414 1.414-1.754-1.753A13.2 13.2 0 0 1 16.5 26c-5.608 0-10.542-3.515-12.381-8.667L4 17l.119-.333a13 13 0 0 1 4.83-6.303m1.445 1.445A11.02 11.02 0 0 0 6.148 17c1.646 4.177 5.728 7 10.352 7 1.76 0 3.441-.409 4.94-1.146l-1.878-1.878A5.06 5.06 0 0 1 16.5 22c-2.789 0-5.05-2.239-5.05-5 0-1.158.398-2.223 1.065-3.07zm1.855-.974 1.794 1.795A5.07 5.07 0 0 1 16.5 12c2.789 0 5.05 2.239 5.05 5 0 .9-.24 1.745-.661 2.474l2.305 2.306A11 11 0 0 0 26.852 17c-1.646-4.177-5.728-7-10.352-7-1.495 0-2.933.295-4.25.835'/%3E%3C/svg%3E")}.ag-icon-eye:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M16.5 23c4.624 0 8.706-2.823 10.352-7-1.646-4.177-5.728-7-10.352-7s-8.706 2.823-10.352 7c1.646 4.177 5.728 7 10.352 7M4.119 15.667C5.958 10.515 10.892 7 16.5 7s10.542 3.515 12.381 8.667L29 16l-.119.333C27.042 21.485 22.108 25 16.5 25S5.958 21.485 4.119 16.333L4 16zM16.5 21c2.789 0 5.049-2.239 5.049-5s-2.26-5-5.049-5-5.049 2.239-5.049 5 2.26 5 5.049 5' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-filter:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='m28 8-8 8v5l-6 6V16L6 8V6h22zM9 8l7 7v7l2-2v-5l7-7z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-first:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M24.273 22.12 18.153 16l6.12-6.12L22.393 8l-8 8 8 8zM7.727 8h2.667v16H7.727z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-group:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M14 7v1H9V7zm0-3v1H5.001V4zm-7 7H5v-1h2zm0-3H5V7h2zM3 5H1V4h2zm11 5v1H9v-1zm-7 4H5v-1h2zm7-1v1H9v-1z' style='fill-rule:nonzero' transform='matrix(2 0 0 2 0 -2)'/%3E%3C/svg%3E")}.ag-icon-last:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='m7.727 9.88 6.12 6.12-6.12 6.12L9.607 24l8-8-8-8zM21.607 8h2.667v16h-2.667z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-left:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M26.667 14.667H10.44l7.453-7.453L16 5.334 5.333 16.001 16 26.668l1.88-1.88-7.44-7.453h16.227z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-linked:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M5.2 16a4.136 4.136 0 0 1 4.133-4.133h5.333V9.334H9.333a6.67 6.67 0 0 0-6.667 6.667 6.67 6.67 0 0 0 6.667 6.667h5.333v-2.533H9.333A4.136 4.136 0 0 1 5.2 16.002zm5.467 1.333h10.667v-2.667H10.667zm12-8h-5.333v2.533h5.333a4.136 4.136 0 0 1 4.133 4.133 4.136 4.136 0 0 1-4.133 4.133h-5.333v2.533h5.333a6.67 6.67 0 0 0 6.667-6.667 6.67 6.67 0 0 0-6.667-6.667z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-loading:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M17 29h-2v-8h2zm-3.586-9L7 26.414 5.586 25 12 18.586zm13 5L25 26.414 18.586 20 20 18.586zM29 17h-8v-2h8zm-18 0H3v-2h8zm2.414-5L12 13.414 5.586 7 7 5.586zm13-5L20 13.414 18.586 12 25 5.586zM17 11h-2V3h2z' style='fill-rule:nonzero' transform='translate(-3.692 -3.692)scale(1.23077)'/%3E%3C/svg%3E")}.ag-icon-maximize:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M14 30H2V18h2.828v7.05l8.254-8.252 2.12 2.12-8.252 8.254H14zm4-28h12v12h-2.828V6.95l-8.254 8.252-2.12-2.12 8.252-8.254H18z'/%3E%3C/svg%3E")}.ag-icon-menu:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M20 13H0v-2h20zm0-6H0V5h20zm0-6H0v-2h20z' style='fill-rule:nonzero' transform='translate(6 9)'/%3E%3C/svg%3E")}.ag-icon-menu-alt:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' fill='none' viewBox='0 0 32 32'%3E%3Cpath fill='%23000' d='M16 19a3 3 0 1 0 0-6 3 3 0 0 0 0 6M16 11a3 3 0 1 0 0-6 3 3 0 0 0 0 6M16 27a3 3 0 1 0 0-6 3 3 0 0 0 0 6'/%3E%3C/svg%3E")}.ag-icon-minimize:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M2 18h12v12h-2.828v-7.05l-8.254 8.252-2.12-2.12 8.252-8.254H2zm28-4H18V2h2.828v7.05L29.082.798l2.12 2.12-8.252 8.254H30z'/%3E%3C/svg%3E")}.ag-icon-minus:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M6.572 6.572a13.32 13.32 0 0 0 0 18.856 13.32 13.32 0 0 0 18.856 0 13.32 13.32 0 0 0 0-18.856 13.32 13.32 0 0 0-18.856 0m17.527 8.099v2.658H7.901v-2.658z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-next:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M10.94 6 9.06 7.88 17.167 16 9.06 24.12 10.94 26l10-10z' style='fill-rule:nonzero' transform='translate(1)'/%3E%3C/svg%3E")}.ag-icon-none:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Enone%3C/title%3E%3Cg fill='%23000' fill-rule='nonzero'%3E%3Cpath d='M23.708 14.645 16 6.939l-7.708 7.706 1.416 1.416L16 9.767l6.292 6.294zM23.708 20.355 16 28.061l-7.708-7.706 1.416-1.416L16 25.233l6.292-6.294z'/%3E%3C/g%3E%3C/svg%3E")}.ag-icon-not-allowed:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M16 2.667C8.64 2.667 2.667 8.64 2.667 16S8.64 29.333 16 29.333 29.333 23.36 29.333 16 23.36 2.667 16 2.667M5.333 16c0-5.893 4.773-10.667 10.667-10.667 2.467 0 4.733.84 6.533 2.253L7.586 22.533A10.54 10.54 0 0 1 5.333 16M16 26.667c-2.467 0-4.733-.84-6.533-2.253L24.414 9.467A10.54 10.54 0 0 1 26.667 16c0 5.893-4.773 10.667-10.667 10.667' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-paste:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M25.334 4H19.76C19.2 2.453 17.733 1.333 16 1.333S12.8 2.453 12.24 4H6.667A2.675 2.675 0 0 0 4 6.667V28c0 1.467 1.2 2.667 2.667 2.667h18.667c1.467 0 2.667-1.2 2.667-2.667V6.667C28.001 5.2 26.801 4 25.334 4M16 4c.733 0 1.333.6 1.333 1.333s-.6 1.333-1.333 1.333-1.333-.6-1.333-1.333S15.267 4 16 4m9.333 24H6.666V6.667h2.667v4h13.333v-4h2.667z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-pin:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='m10.78 19.777-4.668-4.666s.032-1 .67-1.87c1.366-1.86 4.052-1.96 6.056-1.572l3.158-3.108c-.7-2.342 3.352-5.046 3.352-5.046l9.166 9.168q-.334.447-.67.894c-1.074 1.426-2.538 2.63-4.272 2.338l-3.32 3.218c.046.344.042.03.118 1.152.144 2.13-.64 4.324-2.632 5.34l-.746.364-4.798-4.798-7.292 7.294-1.416-1.416zm8.24-13.672c-.688.568-1.416 1.45-1.024 2.072l.49.722-4.986 4.988c-1.988-.506-4.346-.636-5.156.614l9.02 9.032q.14-.099.272-.21c1.226-1.08.764-3.04.498-4.9l4.79-4.79s1.47.938 2.936-.776l-6.79-6.79q-.026.019-.05.038' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-pivot:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M25.128 2.002c2.56.096 4.772 2.292 4.87 4.87a712 712 0 0 1 0 18.256c-.096 2.56-2.292 4.772-4.87 4.87a712 712 0 0 1-18.256 0c-2.558-.096-4.772-2.29-4.87-4.87a712 712 0 0 1 0-18.256c.096-2.56 2.292-4.772 4.87-4.87a712 712 0 0 1 18.256 0m2.966 7.954H9.892v18.136c5.086.13 10.18.098 15.264-.096 1.48-.094 2.746-1.35 2.84-2.84.192-5.064.226-10.134.098-15.2M3.968 24.1q.015.528.036 1.056c.094 1.484 1.354 2.746 2.84 2.84l1.012.036V24.1zM22 15.414l-.292.294-1.416-1.416L23 11.586l2.708 2.706-1.416 1.416-.292-.294v3.592c-.032 2.604-2.246 4.892-4.872 4.992L15.414 24l.294.292-1.416 1.416L11.586 23l2.706-2.708 1.416 1.416-.322.32c3.372.03 6.578-.164 6.614-3.034zM3.88 18.038c.002 1.346.012 2.694.038 4.04h3.938v-4.04zm.05-6.062a681 681 0 0 0-.044 4.042h3.97v-4.042zm5.962-7.99Q8.449 3.999 7.006 4c-1.57.02-2.946 1.348-3.004 2.922q-.02 1.517-.042 3.034h3.896v-2.02h2.036zm14.244-.016v3.966h3.898q-.017-.546-.038-1.092c-.094-1.48-1.35-2.746-2.84-2.84q-.51-.019-1.02-.034m-8.14-.054q-2.035.022-4.07.048v3.972h4.07zm6.106.008a213 213 0 0 0-4.07-.022v4.034h4.07z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-plus:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M6.572 6.572a13.32 13.32 0 0 0 0 18.856 13.32 13.32 0 0 0 18.856 0 13.32 13.32 0 0 0 0-18.856 13.32 13.32 0 0 0-18.856 0m17.527 8.099v2.658h-6.77v6.77h-2.658v-6.77h-6.77v-2.658h6.77v-6.77h2.658v6.77z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-previous:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M21.94 7.88 20.06 6l-10 10 10 10 1.88-1.88L13.833 16z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-right:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='m16 5.333-1.88 1.88 7.44 7.453H5.333v2.667H21.56l-7.44 7.453 1.88 1.88 10.667-10.667L16 5.332z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-save:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M15.708 2.355 8 10.061.292 2.355 1.708.939 8 7.233 14.292.939z' style='fill-rule:nonzero' transform='translate(8 14)'/%3E%3Cpath d='M5 26h22v2H5zM15 4h2v18h-2z'/%3E%3C/svg%3E")}.ag-icon-small-down:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M7.334 10.667 16 21.334l8.667-10.667z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-small-left:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M21.333 7.334 10.666 16l10.667 8.667z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-small-right:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M10.667 24.666 21.334 16 10.667 7.333z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-small-up:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M7.334 21.333 16 10.666l8.667 10.667z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-tick:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M11.586 22.96 27.718 6.828 29.84 8.95 11.586 27.202 2.4 18.016l2.12-2.122z'/%3E%3C/svg%3E")}.ag-icon-tree-closed:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='m11.94 6-1.88 1.88L18.167 16l-8.107 8.12L11.94 26l10-10z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-tree-indeterminate:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M6 13.5h20v3H6z'/%3E%3C/svg%3E")}.ag-icon-tree-open:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M24.12 9.06 16 17.167 7.88 9.06 6 10.94l10 10 10-10z' style='fill-rule:nonzero' transform='translate(0 1)'/%3E%3C/svg%3E")}.ag-icon-unlinked:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M22.667 9.333h-5.333v2.533h5.333a4.136 4.136 0 0 1 4.133 4.133c0 1.907-1.307 3.507-3.08 3.973l1.947 1.947c2.173-1.107 3.667-3.32 3.667-5.92a6.67 6.67 0 0 0-6.667-6.667zm-1.334 5.334h-2.92l2.667 2.667h.253zM2.667 5.693 6.814 9.84A6.65 6.65 0 0 0 2.667 16a6.67 6.67 0 0 0 6.667 6.667h5.333v-2.533H9.334a4.136 4.136 0 0 1-4.133-4.133c0-2.12 1.613-3.867 3.68-4.093l2.76 2.76h-.973v2.667h3.64l3.027 3.027v2.307h2.307l5.347 5.333 1.68-1.68L4.362 4.002 2.669 5.695z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-up:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='m5.333 16 1.88 1.88 7.453-7.44v16.227h2.667V10.44l7.44 7.453L26.666 16 15.999 5.333 5.332 16z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-grip:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M8 24H6v-4h2zm6 0h-2v-4h2zm6 0h-2v-4h2zm6 0h-2v-4h2zM8 18H6v-4h2zm6 0h-2v-4h2zm6 0h-2v-4h2zm6 0h-2v-4h2zM8 12H6V8h2zm6 0h-2V8h2zm6 0h-2V8h2zm6 0h-2V8h2z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-settings:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' fill='none' viewBox='0 0 32 32'%3E%3Cpath fill='%23000' d='M30 8h-4.1c-.5-2.3-2.5-4-4.9-4s-4.4 1.7-4.9 4H2v2h14.1c.5 2.3 2.5 4 4.9 4s4.4-1.7 4.9-4H30zm-9 4c-1.7 0-3-1.3-3-3s1.3-3 3-3 3 1.3 3 3-1.3 3-3 3M2 24h4.1c.5 2.3 2.5 4 4.9 4s4.4-1.7 4.9-4H30v-2H15.9c-.5-2.3-2.5-4-4.9-4s-4.4 1.7-4.9 4H2zm9-4c1.7 0 3 1.3 3 3s-1.3 3-3 3-3-1.3-3-3 1.3-3 3-3'/%3E%3C/svg%3E")}`
);
// packages/ag-grid-community/src/theming/parts/icon-set/alpine/icon-set-alpine.ts
var iconSetAlpine = /* @__PURE__ */ createPart({
feature: "iconSet",
css: iconSetAlpineCSS
});
// packages/ag-grid-community/src/theming/parts/icon-set/material/icon-set-material.css-GENERATED.ts
var iconSetMaterialCSS = (
/*css*/
`.ag-icon-aggregation:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Eaggregation%3C/title%3E%3Cpath d='M24 5.333H8V8l8.667 8L8 24v2.667h16v-4h-9.333L21.334 16l-6.667-6.667H24z'/%3E%3C/svg%3E")}.ag-icon-arrows:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Earrows%3C/title%3E%3Cpath d='M13.333 11.556h5.333V8h3.556L16 1.778 9.778 8h3.556zm-1.777 1.777H8V9.777l-6.222 6.222L8 22.221v-3.556h3.556zM30.222 16 24 9.778v3.556h-3.556v5.333H24v3.556l6.222-6.222zm-11.555 4.444h-5.333V24H9.778L16 30.222 22.222 24h-3.556z'/%3E%3C/svg%3E")}.ag-icon-asc:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Easc%3C/title%3E%3Cpath d='m5.333 16 1.88 1.88 7.453-7.44v16.227h2.667V10.44l7.44 7.453L26.666 16 15.999 5.333z'/%3E%3C/svg%3E")}.ag-icon-cancel:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Ecancel%3C/title%3E%3Cpath d='M16 2.667C8.627 2.667 2.667 8.627 2.667 16S8.627 29.333 16 29.333 29.333 23.373 29.333 16 23.373 2.667 16 2.667m6.667 18.12-1.88 1.88L16 17.88l-4.787 4.787-1.88-1.88L14.12 16l-4.787-4.787 1.88-1.88L16 14.12l4.787-4.787 1.88 1.88L17.88 16z'/%3E%3C/svg%3E")}.ag-icon-chart:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Echart%3C/title%3E%3Cpath d='M6.667 12.267h4v13.067h-4zm7.466-5.6h3.733v18.667h-3.733zM21.6 17.333h3.733v8H21.6z'/%3E%3C/svg%3E")}.ag-icon-color-picker:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Ecolor-picker%3C/title%3E%3Cpath d='M23.907 17.587 10.574 4.254l-1.88 1.88 3.173 3.173-8.28 8.28 10.16 10.16zm-16.547 0 6.387-6.387 6.387 6.387H7.361zm18.387 2s-2.667 2.893-2.667 4.667c0 1.467 1.2 2.667 2.667 2.667s2.667-1.2 2.667-2.667c0-1.773-2.667-4.667-2.667-4.667'/%3E%3C/svg%3E")}.ag-icon-columns:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Ecolumns%3C/title%3E%3Cpath d='M5.333 10.667h5.333V5.334H5.333zm8 16h5.333v-5.333h-5.333zm-8 0h5.333v-5.333H5.333zm0-8h5.333v-5.333H5.333zm8 0h5.333v-5.333h-5.333zm8-13.334v5.333h5.333V5.333zm-8 5.334h5.333V5.334h-5.333zm8 8h5.333v-5.333h-5.333zm0 8h5.333v-5.333h-5.333z'/%3E%3C/svg%3E")}.ag-icon-contracted:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Econtracted%3C/title%3E%3Cpath d='m12.94 8-1.88 1.88L17.167 16l-6.107 6.12L12.94 24l8-8z'/%3E%3C/svg%3E")}.ag-icon-copy:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Ecopy%3C/title%3E%3Cpath d='M22 1.333H6A2.675 2.675 0 0 0 3.333 4v18.667H6V4h16zm4 5.334H11.333a2.675 2.675 0 0 0-2.667 2.667v18.667c0 1.467 1.2 2.667 2.667 2.667H26c1.467 0 2.667-1.2 2.667-2.667V9.334c0-1.467-1.2-2.667-2.667-2.667M26 28H11.333V9.333H26z'/%3E%3C/svg%3E")}.ag-icon-cross:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Ecross%3C/title%3E%3Cpath d='m25.333 8.547-1.88-1.88L16 14.12 8.547 6.667l-1.88 1.88L14.12 16l-7.453 7.453 1.88 1.88L16 17.88l7.453 7.453 1.88-1.88L17.88 16z'/%3E%3C/svg%3E")}.ag-icon-csv:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M384 131.9c-7.753-8.433-110.425-128.473-114.9-133L48-.1C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48zm-35.9 2.1H257V27.9zM30 479V27h200l1 105c0 13.3-1.3 29 12 29h111l1 318z' style='fill-rule:nonzero' transform='matrix(.06285 0 0 .06285 3.934 -.054)'/%3E%3Cpath d='M.688-.226a.2.2 0 0 1-.017.074.28.28 0 0 1-.145.14.412.412 0 0 1-.234.013.28.28 0 0 1-.202-.168.468.468 0 0 1-.04-.19q0-.086.025-.155a.319.319 0 0 1 .182-.191.4.4 0 0 1 .134-.025q.087 0 .155.035a.3.3 0 0 1 .104.085.17.17 0 0 1 .036.097.06.06 0 0 1-.018.044.06.06 0 0 1-.042.019.06.06 0 0 1-.042-.013.2.2 0 0 1-.031-.046.2.2 0 0 0-.066-.079.16.16 0 0 0-.095-.027.17.17 0 0 0-.142.068.3.3 0 0 0-.053.193.4.4 0 0 0 .023.139.2.2 0 0 0 .067.083.2.2 0 0 0 .1.027q.063 0 .106-.031a.2.2 0 0 0 .065-.091.2.2 0 0 1 .023-.046q.014-.018.044-.018a.06.06 0 0 1 .044.018.06.06 0 0 1 .019.045' style='fill-rule:nonzero' transform='matrix(8.39799 0 0 12.455 7.122 25.977)'/%3E%3Cpath d='M.622-.215a.2.2 0 0 1-.033.117.23.23 0 0 1-.098.081.4.4 0 0 1-.153.029.34.34 0 0 1-.175-.04.23.23 0 0 1-.079-.077.17.17 0 0 1-.031-.093q0-.027.019-.045a.06.06 0 0 1 .046-.019.06.06 0 0 1 .039.014.1.1 0 0 1 .027.044.3.3 0 0 0 .03.057q.015.023.044.038.03.015.076.015.065 0 .105-.03a.09.09 0 0 0 .04-.075.08.08 0 0 0-.022-.058.14.14 0 0 0-.056-.034 1 1 0 0 0-.092-.025.7.7 0 0 1-.129-.042.2.2 0 0 1-.083-.066.17.17 0 0 1-.03-.104q0-.058.032-.105a.2.2 0 0 1 .093-.07.4.4 0 0 1 .144-.025q.066 0 .114.016a.3.3 0 0 1 .08.044.2.2 0 0 1 .046.057q.015.03.015.058a.07.07 0 0 1-.018.046.06.06 0 0 1-.046.021q-.025 0-.038-.012a.2.2 0 0 1-.028-.041.2.2 0 0 0-.047-.063Q.387-.625.326-.625a.15.15 0 0 0-.09.025q-.035.024-.035.059 0 .021.012.037a.1.1 0 0 0 .032.027.4.4 0 0 0 .111.036q.06.015.11.031.048.018.083.042a.2.2 0 0 1 .054.062.2.2 0 0 1 .019.091' style='fill-rule:nonzero' transform='matrix(8.39799 0 0 12.455 13.339 25.977)'/%3E%3Cpath d='m.184-.633.162.48.163-.483q.013-.038.019-.053a.062.062 0 0 1 .061-.039q.018 0 .034.009a.1.1 0 0 1 .025.025q.009.015.009.031L.654-.64l-.007.025-.009.024-.173.468-.019.051a.2.2 0 0 1-.021.042.1.1 0 0 1-.033.03.1.1 0 0 1-.049.012.1.1 0 0 1-.05-.011A.1.1 0 0 1 .26-.03a.2.2 0 0 1-.021-.042L.22-.123.05-.587.041-.612.033-.638.03-.662q0-.025.02-.046a.07.07 0 0 1 .05-.02q.037 0 .053.023.015.023.031.072' style='fill-rule:nonzero' transform='matrix(8.39799 0 0 12.455 18.94 25.977)'/%3E%3C/svg%3E")}.ag-icon-cut:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='m19 3-6 6 2 2 7-7V3m-10 9.5a.503.503 0 0 1-.5-.5c0-.274.226-.5.5-.5s.5.226.5.5-.226.5-.5.5M6 20c-1.097 0-2-.903-2-2a2 2 0 0 1 2-2c1.097 0 2 .903 2 2a2 2 0 0 1-2 2M6 8c-1.097 0-2-.903-2-2a2 2 0 0 1 2-2c1.097 0 2 .903 2 2a2 2 0 0 1-2 2m3.64-.36c.23-.5.36-1.05.36-1.64 0-2.194-1.806-4-4-4S2 3.806 2 6s1.806 4 4 4c.59 0 1.14-.13 1.64-.36L10 12l-2.36 2.36C7.14 14.13 6.59 14 6 14c-2.194 0-4 1.806-4 4s1.806 4 4 4 4-1.806 4-4c0-.59-.13-1.14-.36-1.64L12 14l7 7h3v-1z' style='fill-rule:nonzero' transform='translate(4 4)'/%3E%3C/svg%3E")}.ag-icon-desc:before,.ag-icon-down:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Edesc%3C/title%3E%3Cpath d='m26.667 16-1.88-1.88-7.453 7.44V5.333h-2.667V21.56l-7.44-7.453L5.334 16l10.667 10.667L26.668 16z'/%3E%3C/svg%3E")}.ag-icon-excel:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M384 131.9c-7.753-8.433-110.425-128.473-114.9-133L48-.1C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48zm-35.9 2.1H257V27.9zM30 479V27h200l1 105c0 13.3-1.3 29 12 29h111l1 318z' style='fill-rule:nonzero' transform='matrix(.06285 0 0 .06285 3.934 -.054)'/%3E%3Cpath d='m.052-.139.16-.234-.135-.208a.4.4 0 0 1-.028-.052.1.1 0 0 1-.01-.042.05.05 0 0 1 .018-.037.07.07 0 0 1 .045-.016q.03 0 .047.018a1 1 0 0 1 .047.066l.107.174.115-.174.024-.038.019-.026.021-.015a.1.1 0 0 1 .027-.005.06.06 0 0 1 .044.016.05.05 0 0 1 .018.039q0 .033-.038.089l-.141.211.152.234a.3.3 0 0 1 .03.051.1.1 0 0 1 .009.038.1.1 0 0 1-.008.031.1.1 0 0 1-.024.023.1.1 0 0 1-.034.008.1.1 0 0 1-.035-.008.1.1 0 0 1-.023-.022L.427-.067.301-.265l-.134.204-.022.034-.016.019a.1.1 0 0 1-.022.015.1.1 0 0 1-.03.005.06.06 0 0 1-.044-.016.06.06 0 0 1-.017-.047q0-.036.036-.088' style='fill-rule:nonzero' transform='matrix(17.82892 0 0 16.50777 10.371 25.928)'/%3E%3C/svg%3E")}.ag-icon-expanded:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Eexpanded%3C/title%3E%3Cpath d='M20.94 9.88 19.06 8l-8 8 8 8 1.88-1.88L14.833 16z'/%3E%3C/svg%3E")}.ag-icon-eye-slash:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Eeye-slash%3C/title%3E%3Cpath d='M21.106 15.088A5.19 5.19 0 0 0 16 10.814a5.17 5.17 0 0 0-3.668 1.522L9.866 9.868a12.2 12.2 0 0 1 6.133-1.646c5.186 0 9.614 3.225 11.408 7.778a12.34 12.34 0 0 1-5.276 6.133l-2.468-2.466a5.17 5.17 0 0 0 1.449-2.802h-2.123c-.148.508-.42.964-.782 1.33l-1.33-1.33h-2.514l2.196 2.196q-.272.049-.56.05a3.11 3.11 0 0 1-2.99-2.245h-2.123a5.19 5.19 0 0 0 7.3 3.836l2.247 2.247a12.2 12.2 0 0 1-4.434.828c-5.186 0-9.614-3.225-11.408-7.778a12.3 12.3 0 0 1 3.781-5.111l2.924 2.924a5.1 5.1 0 0 0-.404 1.275h4.206l-1.296-1.296a3.1 3.1 0 0 1 2.196-.903c1.404 0 2.587.924 2.976 2.199h2.13z'/%3E%3C/svg%3E")}.ag-icon-eye:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Eeye%3C/title%3E%3Cpath d='M16 8.222c-5.186 0-9.614 3.225-11.408 7.778 1.794 4.553 6.222 7.778 11.408 7.778S25.614 20.553 27.408 16C25.614 11.447 21.186 8.222 16 8.222m0 12.964c-2.862 0-5.186-2.324-5.186-5.186s2.324-5.186 5.186-5.186 5.186 2.324 5.186 5.186-2.324 5.186-5.186 5.186m0-8.297c-1.721 0-3.111 1.39-3.111 3.111s1.39 3.111 3.111 3.111 3.111-1.39 3.111-3.111-1.39-3.111-3.111-3.111'/%3E%3C/svg%3E")}.ag-icon-filter:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Efilter%3C/title%3E%3Cpath d='M13.333 24h5.333v-2.667h-5.333zM4 8v2.667h24V8zm4 9.333h16v-2.667H8z'/%3E%3C/svg%3E")}.ag-icon-first:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Efirst%3C/title%3E%3Cpath d='M24.273 22.12 18.153 16l6.12-6.12L22.393 8l-8 8 8 8zM7.727 8h2.667v16H7.727z'/%3E%3C/svg%3E")}.ag-icon-group:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Egroup%3C/title%3E%3Cpath d='M18.667 21.333h8.889A3.555 3.555 0 0 1 24 24.889h-5.333zm8.888-7.111v3.556h-8.889v-3.556zM24 7.111a3.555 3.555 0 0 1 3.556 3.556h-16V7.111zm-8.889 17.778h-3.556v-3.556h3.556zm0-7.111h-3.556v-3.556h3.556zM8 10.667H4.444A3.555 3.555 0 0 1 8 7.111z'/%3E%3C/svg%3E")}.ag-icon-last:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Elast%3C/title%3E%3Cpath d='m7.727 9.88 6.12 6.12-6.12 6.12L9.607 24l8-8-8-8zM21.607 8h2.667v16h-2.667z'/%3E%3C/svg%3E")}.ag-icon-left:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Eleft%3C/title%3E%3Cpath d='M26.667 14.667H10.44l7.453-7.453L16 5.334 5.333 16.001 16 26.668l1.88-1.88-7.44-7.453h16.227v-2.667z'/%3E%3C/svg%3E")}.ag-icon-linked:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Elinked%3C/title%3E%3Cpath d='M5.2 16a4.136 4.136 0 0 1 4.133-4.133h5.333V9.334H9.333c-3.68 0-6.667 2.987-6.667 6.667s2.987 6.667 6.667 6.667h5.333v-2.533H9.333A4.136 4.136 0 0 1 5.2 16.002zm5.467 1.333h10.667v-2.667H10.667zm12-8h-5.333v2.533h5.333c2.28 0 4.133 1.853 4.133 4.133s-1.853 4.133-4.133 4.133h-5.333v2.533h5.333c3.68 0 6.667-2.987 6.667-6.667s-2.987-6.667-6.667-6.667z'/%3E%3C/svg%3E")}.ag-icon-loading:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Eloading%3C/title%3E%3Cpath d='m17.778 11.708 3.25-3.251 2.516 2.516-3.251 3.25h4.597v3.556h-4.597l3.251 3.25-2.516 2.516-3.25-3.251v4.597h-3.556v-4.597l-3.25 3.251-2.516-2.516 3.251-3.25H7.11v-3.556h4.597l-3.251-3.25 2.516-2.516 3.25 3.251V7.111h3.556zm-3.251 7.847h2.944l2.084-2.084v-2.944l-2.084-2.084h-2.944l-2.084 2.084v2.944z'/%3E%3C/svg%3E")}.ag-icon-maximize:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Emaximize%3C/title%3E%3Cpath d='M4 4h24v2.667H4z'/%3E%3C/svg%3E")}.ag-icon-menu:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Emenu%3C/title%3E%3Cpath d='M4 24h24v-2.667H4zm0-6.667h24v-2.667H4zM4 8v2.667h24V8z'/%3E%3C/svg%3E")}.ag-icon-menu-alt:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' fill='none' viewBox='0 0 32 32'%3E%3Cpath fill='%23000' d='M16 26.667a2.57 2.57 0 0 1-1.883-.784A2.57 2.57 0 0 1 13.333 24q0-1.1.784-1.883A2.57 2.57 0 0 1 16 21.333q1.1 0 1.883.784.784.783.784 1.883t-.784 1.883a2.57 2.57 0 0 1-1.883.784m0-8a2.57 2.57 0 0 1-1.883-.784A2.57 2.57 0 0 1 13.333 16q0-1.1.784-1.883A2.57 2.57 0 0 1 16 13.333q1.1 0 1.883.784.784.783.784 1.883t-.784 1.883a2.57 2.57 0 0 1-1.883.784m0-8a2.57 2.57 0 0 1-1.883-.784A2.57 2.57 0 0 1 13.333 8q0-1.1.784-1.883A2.57 2.57 0 0 1 16 5.333q1.1 0 1.883.784.784.783.784 1.883t-.784 1.883a2.57 2.57 0 0 1-1.883.784'/%3E%3C/svg%3E")}.ag-icon-minimize:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Eminimize%3C/title%3E%3Cpath d='M8 25.333h16V28H8z'/%3E%3C/svg%3E")}.ag-icon-minus:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M6.572 6.572a13.32 13.32 0 0 0 0 18.856 13.32 13.32 0 0 0 18.856 0 13.32 13.32 0 0 0 0-18.856 13.32 13.32 0 0 0-18.856 0m17.527 8.099v2.658H7.901v-2.658z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-next:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Enext%3C/title%3E%3Cpath d='m12.94 8-1.88 1.88L17.167 16l-6.107 6.12L12.94 24l8-8z'/%3E%3C/svg%3E")}.ag-icon-none:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Enone%3C/title%3E%3Cpath d='M4 24h16v-2.667H4zM4 8v2.667h24V8zm0 9.333h24v-2.667H4z'/%3E%3C/svg%3E")}.ag-icon-not-allowed:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Enot-allowed%3C/title%3E%3Cpath d='M16 2.667C8.64 2.667 2.667 8.64 2.667 16S8.64 29.333 16 29.333 29.333 23.36 29.333 16 23.36 2.667 16 2.667M5.333 16c0-5.893 4.773-10.667 10.667-10.667 2.467 0 4.733.84 6.533 2.253L7.586 22.533A10.54 10.54 0 0 1 5.333 16M16 26.667c-2.467 0-4.733-.84-6.533-2.253L24.414 9.467A10.54 10.54 0 0 1 26.667 16c0 5.893-4.773 10.667-10.667 10.667'/%3E%3C/svg%3E")}.ag-icon-paste:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Epaste%3C/title%3E%3Cpath d='M25.333 4H19.76C19.2 2.453 17.733 1.333 16 1.333S12.8 2.453 12.24 4H6.667A2.675 2.675 0 0 0 4 6.667V28c0 1.467 1.2 2.667 2.667 2.667h18.667c1.467 0 2.667-1.2 2.667-2.667V6.667C28.001 5.2 26.801 4 25.334 4zM16 4c.733 0 1.333.6 1.333 1.333s-.6 1.333-1.333 1.333-1.333-.6-1.333-1.333S15.267 4 16 4m9.333 24H6.666V6.667h2.667v4h13.333v-4h2.667z'/%3E%3C/svg%3E")}.ag-icon-pin:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Epin%3C/title%3E%3Cpath d='m11.106 22.093-4.444 4.444-1.259-1.259 4.444-4.444zm5.872-16.63 9.618 9.62-.962.962-.962-.962-7.694 3.847 1.924 1.924-2.74 2.74-7.696-7.696 2.741-2.74 1.924 1.925 3.847-7.696-.962-.962z'/%3E%3C/svg%3E")}.ag-icon-pivot:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Epivot%3C/title%3E%3Cpath d='M26.667 30.223H5.334a3.556 3.556 0 0 1-3.556-3.556V5.334a3.556 3.556 0 0 1 3.556-3.556h21.333a3.556 3.556 0 0 1 3.556 3.556v21.333a3.556 3.556 0 0 1-3.556 3.556m-16-8.89H5.334v5.333h5.333zm16-7.11H12.444v12.444h14.223zm-9.15 6.85-2.039 2.037 2.039 2.039-1.257 1.257-3.295-3.296 3.295-3.295q.63.628 1.257 1.257zm-6.85-6.85H5.334v5.333h5.333zm15.74 3.816-1.257 1.256-2.039-2.037-2.037 2.037-1.257-1.256 3.295-3.296zM10.667 5.333H5.334v5.333h5.333zm8.889 0h-7.112v5.333h7.112zm7.111 0h-5.333v5.333h5.333z'/%3E%3C/svg%3E")}.ag-icon-plus:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 32 32'%3E%3Cpath d='M6.572 6.572a13.32 13.32 0 0 0 0 18.856 13.32 13.32 0 0 0 18.856 0 13.32 13.32 0 0 0 0-18.856 13.32 13.32 0 0 0-18.856 0m17.527 8.099v2.658h-6.77v6.77h-2.658v-6.77h-6.77v-2.658h6.77v-6.77h2.658v6.77z' style='fill-rule:nonzero'/%3E%3C/svg%3E")}.ag-icon-previous:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Eprevious%3C/title%3E%3Cpath d='M20.94 9.88 19.06 8l-8 8 8 8 1.88-1.88L14.833 16z'/%3E%3C/svg%3E")}.ag-icon-right:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Eright%3C/title%3E%3Cpath d='m16 5.333-1.88 1.88 7.44 7.453H5.333v2.667H21.56l-7.44 7.453 1.88 1.88 10.667-10.667L16 5.332z'/%3E%3C/svg%3E")}.ag-icon-save:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Esave%3C/title%3E%3Cpath d='M25.333 16v9.333H6.666V16H3.999v9.333C3.999 26.8 5.199 28 6.666 28h18.667C26.8 28 28 26.8 28 25.333V16zm-8 .893 3.453-3.44 1.88 1.88L15.999 22l-6.667-6.667 1.88-1.88 3.453 3.44V4h2.667v12.893z'/%3E%3C/svg%3E")}.ag-icon-small-down:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Esmall-down%3C/title%3E%3Cpath d='M9.333 12.667 16 19.334l6.667-6.667H9.334z'/%3E%3C/svg%3E")}.ag-icon-small-left:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Esmall-left%3C/title%3E%3Cpath d='M19.333 9.333 12.666 16l6.667 6.667V9.334z'/%3E%3C/svg%3E")}.ag-icon-small-right:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Esmall-right%3C/title%3E%3Cpath d='M12.667 22.667 19.334 16l-6.667-6.667v13.333z'/%3E%3C/svg%3E")}.ag-icon-small-up:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Esmall-up%3C/title%3E%3Cpath d='M9.333 19.333 16 12.666l6.667 6.667H9.334z'/%3E%3C/svg%3E")}.ag-icon-tick:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Etick%3C/title%3E%3Cpath d='m11.727 21.167-5.56-5.56-1.893 1.88 7.453 7.453 16-16-1.88-1.88z'/%3E%3C/svg%3E")}.ag-icon-tree-closed:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Etree-closed%3C/title%3E%3Cpath d='m12.94 8-1.88 1.88L17.167 16l-6.107 6.12L12.94 24l8-8z'/%3E%3C/svg%3E")}.ag-icon-tree-indeterminate:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Etree-indeterminate%3C/title%3E%3Cpath d='M6.667 14.667h18.667v2.667H6.667z'/%3E%3C/svg%3E")}.ag-icon-tree-open:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Etree-open%3C/title%3E%3Cpath d='M22.12 11.06 16 17.167 9.88 11.06 8 12.94l8 8 8-8z'/%3E%3C/svg%3E")}.ag-icon-unlinked:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Eunlinked%3C/title%3E%3Cpath d='M22.667 9.333h-5.333v2.533h5.333a4.136 4.136 0 0 1 4.133 4.133c0 1.907-1.307 3.507-3.08 3.973l1.947 1.947c2.173-1.107 3.667-3.32 3.667-5.92a6.67 6.67 0 0 0-6.667-6.667zm-1.334 5.334h-2.92l2.667 2.667h.253zM2.667 5.693 6.814 9.84A6.65 6.65 0 0 0 2.667 16a6.67 6.67 0 0 0 6.667 6.667h5.333v-2.533H9.334a4.136 4.136 0 0 1-4.133-4.133c0-2.12 1.613-3.867 3.68-4.093l2.76 2.76h-.973v2.667h3.64l3.027 3.027v2.307h2.307l5.347 5.333 1.68-1.68L4.362 4.002 2.669 5.695z'/%3E%3C/svg%3E")}.ag-icon-up:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Easc%3C/title%3E%3Cpath d='m5.333 16 1.88 1.88 7.453-7.44v16.227h2.667V10.44l7.44 7.453L26.666 16 15.999 5.333z'/%3E%3C/svg%3E")}.ag-icon-grip:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ctitle%3Egrip%3C/title%3E%3Cpath d='M26.667 12H5.334v2.667h21.333zM5.333 20h21.333v-2.667H5.333z'/%3E%3C/svg%3E")}.ag-icon-settings:before{mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' fill='none' viewBox='0 0 32 32'%3E%3Cpath fill='%23000' d='M30 8h-4.1c-.5-2.3-2.5-4-4.9-4s-4.4 1.7-4.9 4H2v2h14.1c.5 2.3 2.5 4 4.9 4s4.4-1.7 4.9-4H30zm-9 4c-1.7 0-3-1.3-3-3s1.3-3 3-3 3 1.3 3 3-1.3 3-3 3M2 24h4.1c.5 2.3 2.5 4 4.9 4s4.4-1.7 4.9-4H30v-2H15.9c-.5-2.3-2.5-4-4.9-4s-4.4 1.7-4.9 4H2zm9-4c1.7 0 3 1.3 3 3s-1.3 3-3 3-3-1.3-3-3 1.3-3 3-3'/%3E%3C/svg%3E")}`
);
// packages/ag-grid-community/src/theming/parts/icon-set/material/icon-set-material.ts
var iconSetMaterial = /* @__PURE__ */ createPart({
feature: "iconSet",
css: iconSetMaterialCSS
});
// packages/ag-grid-community/src/theming/parts/icon-set/overrides/icon-overrides.ts
var iconOverrides = (args) => {
const cssParts = [];
if (args.type === "image") {
const { icons, mask } = args;
for (const key of Object.keys(icons)) {
const imageCssValue = imageValueToCss(icons[key]);
if (mask) {
cssParts.push(`.ag-icon-${key}::before { mask-image: ${imageCssValue}; }`);
} else {
cssParts.push(`.ag-icon-${key}::before { background-image: ${imageCssValue}; ${unsetMaskIcon} }`);
}
}
}
if (args.type === "font") {
const { family, weight, color, icons } = args;
let properties = unsetMaskIcon;
if (family) {
properties += ` font-family: ${fontFamilyValueToCss(family)};`;
}
if (weight) {
properties += ` font-weight: ${fontWeightValueToCss(weight)};`;
}
if (color) {
properties += ` color: ${colorValueToCss(color)};`;
}
for (const key of Object.keys(icons)) {
cssParts.push(`.ag-icon-${key}::before { content: ${JSON.stringify(icons[key])}; ${properties} }`);
}
}
return createPart({
css: cssParts.join(";\n"),
cssImports: args.cssImports
});
};
var unsetMaskIcon = `background-color: unset; mask-image: unset; -webkit-mask-image: unset;`;
// packages/ag-grid-community/src/theming/parts/icon-set/quartz/quartz-icon-data.ts
var iconNameToSvgFragment = {
aggregation: '',
arrows: '',
asc: '',
cancel: '',
chart: '',
"color-picker": '',
columns: '',
contracted: '',
copy: '',
cross: '',
csv: '',
cut: '',
desc: '',
down: '',
excel: '',
expanded: '',
"eye-slash": '',
eye: '',
filter: '',
first: '',
group: '',
last: '',
left: '',
linked: '',
loading: '',
maximize: '',
menu: '',
"menu-alt": '',
minimize: '',
minus: '',
next: '',
none: '',
"not-allowed": '',
paste: '',
pin: '',
pivot: '',
plus: '',
previous: '',
right: '',
save: '',
"small-left": '',
"small-right": '',
tick: '',
"tree-closed": '',
"tree-indeterminate": '',
"tree-open": '',
unlinked: '',
up: '',
grip: '',
settings: ''
};
var iconNameToFullSvg = {
"small-down": '',
"small-up": ''
};
var getQuartzIconsCss = (args = {}) => {
let result = "";
for (const iconName of [...Object.keys(iconNameToSvgFragment), ...Object.keys(iconNameToFullSvg)]) {
const iconSvg = quartzIconSvg(iconName, args.strokeWidth);
result += `.ag-icon-${iconName}::before { mask-image: url('data:image/svg+xml,${encodeURIComponent(iconSvg)}'); }
`;
}
return result;
};
var quartzIconSvg = (name, strokeWidth = 1.5) => {
const fullSVG = iconNameToFullSvg[name];
if (fullSVG)
return fullSVG;
const svgFragment = iconNameToSvgFragment[name];
if (!svgFragment)
throw new Error(`Missing icon data for ${name}`);
return `";
};
// packages/ag-grid-community/src/theming/parts/icon-set/quartz/icon-set-quartz.ts
var iconSetQuartz = (args = {}) => {
return createPart({
feature: "iconSet",
css: () => getQuartzIconsCss(args)
});
};
var iconSetQuartzLight = /* @__PURE__ */ iconSetQuartz({ strokeWidth: 1 });
var iconSetQuartzRegular = /* @__PURE__ */ iconSetQuartz();
var iconSetQuartzBold = /* @__PURE__ */ iconSetQuartz({ strokeWidth: 2 });
// packages/ag-grid-community/src/theming/parts/input-style/input-style-base.css-GENERATED.ts
var inputStyleBaseCSS = (
/*css*/
`:where(.ag-input-field-input[type=number]:not(.ag-number-field-input-stepper)){-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield;&::-webkit-inner-spin-button,&::-webkit-outer-spin-button{-webkit-appearance:none;appearance:none;margin:0}}:where(input.ag-input-field-input:not([type]),input.ag-input-field-input[type=text],input.ag-input-field-input[type=number],input.ag-input-field-input[type=tel],input.ag-input-field-input[type=date],input.ag-input-field-input[type=datetime-local],textarea.ag-input-field-input){background-color:var(--ag-input-background-color);border:var(--ag-input-border);border-radius:var(--ag-input-border-radius);color:var(--ag-input-text-color);font-family:inherit;font-size:inherit;line-height:inherit;margin:0;min-height:var(--ag-input-height);padding:0;&:where(:disabled){background-color:var(--ag-input-disabled-background-color);border:var(--ag-input-disabled-border);color:var(--ag-input-disabled-text-color)}&:where(:focus){background-color:var(--ag-input-focus-background-color);border:var(--ag-input-focus-border);box-shadow:var(--ag-input-focus-shadow);color:var(--ag-input-focus-text-color);outline:none}&:where(:invalid){background-color:var(--ag-input-invalid-background-color);border:var(--ag-input-invalid-border);color:var(--ag-input-invalid-text-color)}&:where(.invalid){background-color:var(--ag-input-invalid-background-color);border:var(--ag-input-invalid-border);color:var(--ag-input-invalid-text-color)}&::-moz-placeholder{color:var(--ag-input-placeholder-text-color)}&::placeholder{color:var(--ag-input-placeholder-text-color)}}:where(.ag-ltr) :where(input.ag-input-field-input:not([type]),input.ag-input-field-input[type=text],input.ag-input-field-input[type=number],input.ag-input-field-input[type=tel],input.ag-input-field-input[type=date],input.ag-input-field-input[type=datetime-local],textarea.ag-input-field-input){padding-left:var(--ag-input-padding-start)}:where(.ag-rtl) :where(input.ag-input-field-input:not([type]),input.ag-input-field-input[type=text],input.ag-input-field-input[type=number],input.ag-input-field-input[type=tel],input.ag-input-field-input[type=date],input.ag-input-field-input[type=datetime-local],textarea.ag-input-field-input){padding-right:var(--ag-input-padding-start)}:where(.ag-column-select-header-filter-wrapper,.ag-filter-toolpanel-search,.ag-mini-filter,.ag-filter-filter){.ag-input-wrapper:before{background-color:currentcolor;color:var(--ag-input-icon-color);content:"";display:block;height:12px;-webkit-mask-image:url("data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMS41Ij48cGF0aCBkPSJNNS4zIDlhMy43IDMuNyAwIDEgMCAwLTcuNSAzLjcgMy43IDAgMCAwIDAgNy41Wk0xMC41IDEwLjUgOC4zIDguMiIvPjwvc3ZnPg==");mask-image:url("data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMS41Ij48cGF0aCBkPSJNNS4zIDlhMy43IDMuNyAwIDEgMCAwLTcuNSAzLjcgMy43IDAgMCAwIDAgNy41Wk0xMC41IDEwLjUgOC4zIDguMiIvPjwvc3ZnPg==");-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;opacity:.5;position:absolute;width:12px}}:where(.ag-ltr) :where(.ag-column-select-header-filter-wrapper,.ag-filter-toolpanel-search,.ag-mini-filter,.ag-filter-filter){.ag-input-wrapper:before{margin-left:var(--ag-spacing)}.ag-number-field-input,.ag-text-field-input{padding-left:calc(var(--ag-spacing)*1.5 + 12px)}}:where(.ag-rtl) :where(.ag-column-select-header-filter-wrapper,.ag-filter-toolpanel-search,.ag-mini-filter,.ag-filter-filter){.ag-input-wrapper:before{margin-right:var(--ag-spacing)}.ag-number-field-input,.ag-text-field-input{padding-right:calc(var(--ag-spacing)*1.5 + 12px)}}`
);
// packages/ag-grid-community/src/theming/parts/input-style/input-style-bordered.css-GENERATED.ts
var inputStyleBorderedCSS = (
/*css*/
`:where(input.ag-input-field-input:not([type]),input.ag-input-field-input[type=text],input.ag-input-field-input[type=number],input.ag-input-field-input[type=tel],input.ag-input-field-input[type=date],input.ag-input-field-input[type=datetime-local],textarea.ag-input-field-input){&:focus{box-shadow:var(--ag-focus-shadow)}}`
);
// packages/ag-grid-community/src/theming/parts/input-style/input-style-underlined.css-GENERATED.ts
var inputStyleUnderlinedCSS = (
/*css*/
`:where(input.ag-input-field-input:not([type]),input.ag-input-field-input[type=text],input.ag-input-field-input[type=number],input.ag-input-field-input[type=tel],input.ag-input-field-input[type=date],input.ag-input-field-input[type=datetime-local],textarea.ag-input-field-input){border-left:none;border-right:none;border-top:none}`
);
// packages/ag-grid-community/src/theming/parts/input-style/input-styles.ts
var baseParams2 = {
inputBackgroundColor: "transparent",
inputBorder: false,
inputBorderRadius: 0,
inputTextColor: {
ref: "textColor"
},
inputPlaceholderTextColor: {
ref: "inputTextColor",
mix: 0.5
},
inputPaddingStart: 0,
inputHeight: {
calc: "max(iconSize, fontSize) + spacing * 2"
},
inputFocusBackgroundColor: {
ref: "inputBackgroundColor"
},
inputFocusBorder: {
ref: "inputBorder"
},
inputFocusShadow: "none",
inputFocusTextColor: {
ref: "inputTextColor"
},
inputDisabledBackgroundColor: {
ref: "inputBackgroundColor"
},
inputDisabledBorder: {
ref: "inputBorder"
},
inputDisabledTextColor: {
ref: "inputTextColor"
},
inputInvalidBackgroundColor: {
ref: "inputBackgroundColor"
},
inputInvalidBorder: {
ref: "inputBorder"
},
inputInvalidTextColor: {
ref: "inputTextColor"
},
inputIconColor: {
ref: "inputTextColor"
},
pickerButtonBorder: false,
pickerButtonFocusBorder: { ref: "inputFocusBorder" },
pickerButtonBackgroundColor: { ref: "backgroundColor" },
pickerButtonFocusBackgroundColor: { ref: "backgroundColor" },
pickerListBorder: false,
pickerListBackgroundColor: { ref: "backgroundColor" }
};
var makeInputStyleBaseTreeShakeable = () => createPart({
feature: "inputStyle",
params: baseParams2,
css: inputStyleBaseCSS
});
var inputStyleBase = /* @__PURE__ */ makeInputStyleBaseTreeShakeable();
var makeInputStyleBorderedTreeShakeable = () => createPart({
feature: "inputStyle",
params: {
...baseParams2,
inputBackgroundColor: backgroundColor,
inputBorder: true,
inputBorderRadius: {
ref: "borderRadius"
},
inputPaddingStart: {
ref: "spacing"
},
inputFocusBorder: {
color: accentColor
},
inputFocusShadow: {
ref: "focusShadow"
},
inputDisabledBackgroundColor: foregroundBackgroundMix(0.06),
inputDisabledTextColor: {
ref: "textColor",
mix: 0.5
},
inputInvalidBorder: {
color: { ref: "invalidColor" }
},
pickerButtonBorder: true,
pickerListBorder: true
},
css: () => inputStyleBaseCSS + inputStyleBorderedCSS
});
var inputStyleBordered = /* @__PURE__ */ makeInputStyleBorderedTreeShakeable();
var makeInputStyleUnderlinedTreeShakeable = () => createPart({
feature: "inputStyle",
params: {
...baseParams2,
inputBackgroundColor: "transparent",
inputBorder: {
width: 2,
color: foregroundMix(0.3)
},
inputPaddingStart: {
ref: "spacing"
},
inputFocusBorder: "solid 2px var(--ag-accent-color)",
inputDisabledTextColor: {
ref: "textColor",
mix: 0.5
},
inputDisabledBorder: "solid 1px var(--ag-border-color)",
inputInvalidBorder: {
width: 2,
color: {
ref: "invalidColor",
mix: 0.3
}
}
},
css: () => inputStyleBaseCSS + inputStyleUnderlinedCSS
});
var inputStyleUnderlined = /* @__PURE__ */ makeInputStyleUnderlinedTreeShakeable();
// packages/ag-grid-community/src/theming/parts/tab-style/tab-style-base.css-GENERATED.ts
var tabStyleBaseCSS = (
/*css*/
`.ag-tabs-header{background-color:var(--ag-tab-bar-background-color);border-bottom:var(--ag-tab-bar-border);display:flex;flex:1;gap:var(--ag-tab-spacing);padding:var(--ag-tab-bar-top-padding) var(--ag-tab-bar-horizontal-padding) 0}.ag-tabs-header-wrapper{display:flex}.ag-tabs-close-button-wrapper{align-items:center;border:0;display:flex;padding:var(--ag-spacing)}:where(.ag-ltr) .ag-tabs-close-button-wrapper{border-right:1px solid var(--ag-border-color)}:where(.ag-rtl) .ag-tabs-close-button-wrapper{border-left:1px solid var(--ag-border-color)}.ag-tabs-close-button{background-color:unset;border:0;cursor:pointer;padding:0}.ag-tab{align-items:center;background-color:var(--ag-tab-background-color);border-left:var(--ag-tab-selected-border-width) solid transparent;border-right:var(--ag-tab-selected-border-width) solid transparent;color:var(--ag-tab-text-color);cursor:pointer;display:flex;flex:1;justify-content:center;padding:var(--ag-tab-top-padding) var(--ag-tab-horizontal-padding) var(--ag-tab-bottom-padding);position:relative;&:hover{background-color:var(--ag-tab-hover-background-color);color:var(--ag-tab-hover-text-color)}&.ag-tab-selected{background-color:var(--ag-tab-selected-background-color);color:var(--ag-tab-selected-text-color)}&:after{background-color:var(--ag-tab-selected-underline-color);bottom:0;content:"";display:block;height:var(--ag-tab-selected-underline-width);left:0;opacity:0;position:absolute;right:0;transition:opacity var(--ag-tab-selected-underline-transition-duration)}&.ag-tab-selected:after{opacity:1}}:where(.ag-ltr) .ag-tab{&.ag-tab-selected{&:where(:not(:first-of-type)){border-left-color:var(--ag-tab-selected-border-color)}&:where(:not(:last-of-type)){border-right-color:var(--ag-tab-selected-border-color)}}}:where(.ag-rtl) .ag-tab{&.ag-tab-selected{&:where(:not(:first-of-type)){border-right-color:var(--ag-tab-selected-border-color)}&:where(:not(:last-of-type)){border-left-color:var(--ag-tab-selected-border-color)}}}`
);
// packages/ag-grid-community/src/theming/parts/tab-style/tab-style-rolodex.css-GENERATED.ts
var tabStyleRolodexCSS = (
/*css*/
`.ag-tab{border-left:var(--ag-tab-selected-border-width) solid transparent;border-right:var(--ag-tab-selected-border-width) solid transparent;border-top:var(--ag-tab-selected-border-width) solid transparent;flex:none;&.ag-tab-selected{border-left-color:var(--ag-tab-selected-border-color);border-right-color:var(--ag-tab-selected-border-color);border-top-color:var(--ag-tab-selected-border-color);margin-bottom:-1px;padding-bottom:calc(var(--ag-tab-bottom-padding) + 1px)}}`
);
// packages/ag-grid-community/src/theming/parts/tab-style/tab-styles.ts
var baseParams3 = {
tabBarBackgroundColor: "transparent",
tabBarHorizontalPadding: 0,
tabBarTopPadding: 0,
tabBackgroundColor: "transparent",
tabTextColor: {
ref: "textColor"
},
tabHorizontalPadding: {
ref: "spacing"
},
tabTopPadding: {
ref: "spacing"
},
tabBottomPadding: {
ref: "spacing"
},
tabSpacing: "0",
tabHoverBackgroundColor: {
ref: "tabBackgroundColor"
},
tabHoverTextColor: {
ref: "tabTextColor"
},
tabSelectedBackgroundColor: {
ref: "tabBackgroundColor"
},
tabSelectedTextColor: {
ref: "tabTextColor"
},
tabSelectedBorderWidth: 1,
tabSelectedBorderColor: "transparent",
tabSelectedUnderlineColor: "transparent",
tabSelectedUnderlineWidth: 0,
tabSelectedUnderlineTransitionDuration: 0,
tabBarBorder: false
};
var makeTabStyleBaseTreeShakeable = () => createPart({
feature: "tabStyle",
params: baseParams3,
css: tabStyleBaseCSS
});
var tabStyleBase = /* @__PURE__ */ makeTabStyleBaseTreeShakeable();
var makeTabStyleQuartzTreeShakeable = () => createPart({
feature: "tabStyle",
params: {
...baseParams3,
tabBarBorder: true,
tabBarBackgroundColor: foregroundMix(0.05),
tabTextColor: {
ref: "textColor",
mix: 0.7
},
tabSelectedTextColor: {
ref: "textColor"
},
tabHoverTextColor: {
ref: "textColor"
},
tabSelectedBorderColor: {
ref: "borderColor"
},
tabSelectedBackgroundColor: backgroundColor
},
css: tabStyleBaseCSS
});
var tabStyleQuartz = /* @__PURE__ */ makeTabStyleQuartzTreeShakeable();
var makeTabStyleMaterialTreeShakeable = () => createPart({
feature: "tabStyle",
params: {
...baseParams3,
tabBarBackgroundColor: {
ref: "chromeBackgroundColor"
},
tabSelectedUnderlineColor: {
ref: "primaryColor"
},
tabSelectedUnderlineWidth: 2,
tabSelectedUnderlineTransitionDuration: 0
},
css: tabStyleBaseCSS
});
var tabStyleMaterial = /* @__PURE__ */ makeTabStyleMaterialTreeShakeable();
var makeTabStyleAlpineTreeShakeable = () => createPart({
feature: "tabStyle",
params: {
...baseParams3,
tabBarBorder: true,
tabBarBackgroundColor: {
ref: "chromeBackgroundColor"
},
tabHoverTextColor: accentColor,
tabSelectedTextColor: accentColor,
tabSelectedUnderlineColor: accentColor,
tabSelectedUnderlineWidth: 2,
tabSelectedUnderlineTransitionDuration: "0.3s"
},
css: tabStyleBaseCSS
});
var tabStyleAlpine = /* @__PURE__ */ makeTabStyleAlpineTreeShakeable();
var makeTabStyleRolodexTreeShakeable = () => createPart({
feature: "tabStyle",
params: {
...baseParams3,
tabBarBackgroundColor: {
ref: "chromeBackgroundColor"
},
tabBarHorizontalPadding: {
ref: "spacing"
},
tabBarTopPadding: {
ref: "spacing"
},
tabBarBorder: true,
tabHorizontalPadding: { calc: "spacing * 2" },
tabTopPadding: {
ref: "spacing"
},
tabBottomPadding: {
ref: "spacing"
},
tabSpacing: {
ref: "spacing"
},
tabSelectedBorderColor: {
ref: "borderColor"
},
tabSelectedBackgroundColor: backgroundColor
},
css: () => tabStyleBaseCSS + tabStyleRolodexCSS
});
var tabStyleRolodex = /* @__PURE__ */ makeTabStyleRolodexTreeShakeable();
// packages/ag-grid-community/src/theming/parts/theme/material-adjustments.css-GENERATED.ts
var materialAdjustmentsCSS = (
/*css*/
`.ag-dnd-ghost,.ag-filter-toolpanel-header,.ag-filter-toolpanel-search,.ag-header-row,.ag-multi-filter-group-title-bar,.ag-panel-title-bar-title,.ag-status-bar{color:var(--ag-header-text-color);font-size:calc(var(--ag-font-size) - 1px);font-weight:600}.ag-column-drop-horizontal{background-color:color-mix(in srgb,var(--ag-background-color),var(--ag-foreground-color) 8%)}.ag-cell.ag-cell-inline-editing{background-color:var(--ag-background-color);background-image:linear-gradient(0deg,var(--ag-input-background-color),var(--ag-input-background-color));border:var(--ag-input-border)!important;border-width:1px!important;height:calc(var(--ag-row-height) + var(--ag-spacing)*3);padding:var(--ag-spacing);:where(.ag-row-last:not(.ag-row-first)) &{bottom:0}:where(.ag-has-focus) &{border:var(--ag-input-focus-border)!important;border-width:1px!important}}.ag-advanced-filter-builder-button,.ag-standard-button{text-transform:uppercase}.ag-status-bar{border:1px solid var(--ag-border-color)}.ag-list-item-hovered:after{background-color:var(--ag-primary-color)}.ag-pill-button:hover{color:var(--ag-primary-color)}.ag-header-highlight-after:after,.ag-header-highlight-before:after{background-color:var(--ag-primary-color)}`
);
// packages/ag-grid-community/src/theming/parts/theme/themes.ts
var makeThemeQuartzTreeShakeable = () => createTheme().withPart(checkboxStyleDefault).withPart(colorSchemeVariable).withPart(iconSetQuartzRegular).withPart(tabStyleQuartz).withPart(inputStyleBordered).withPart(columnDropStyleBordered).withParams({
fontFamily: [
{ googleFont: "IBM Plex Sans" },
"-apple-system",
"BlinkMacSystemFont",
"Segoe UI",
"Roboto",
"Oxygen-Sans",
"Ubuntu"
]
});
var themeQuartz = /* @__PURE__ */ makeThemeQuartzTreeShakeable();
var makeThemeAlpineTreeShakeable = () => createTheme().withPart(buttonStyleAlpine).withPart(checkboxStyleDefault).withPart(colorSchemeVariable).withPart(iconSetAlpine).withPart(tabStyleAlpine).withPart(inputStyleBordered).withPart(columnDropStyleBordered).withParams({
accentColor: "#2196f3",
selectedRowBackgroundColor: accentMix(0.3),
inputFocusBorder: {
color: accentMix(0.4)
},
focusShadow: { radius: 2, spread: 1.6, color: accentMix(0.4) },
iconButtonHoverBackgroundColor: "transparent",
iconButtonActiveBackgroundColor: "transparent",
checkboxUncheckedBorderColor: foregroundBackgroundMix(0.45),
checkboxIndeterminateBackgroundColor: foregroundBackgroundMix(0.45),
checkboxIndeterminateBorderColor: foregroundBackgroundMix(0.45),
checkboxBorderWidth: 2,
checkboxBorderRadius: 2,
fontSize: 13,
dataFontSize: 14,
headerFontWeight: 700,
borderRadius: 3,
wrapperBorderRadius: 3,
tabSelectedUnderlineColor: accentColor,
tabSelectedBorderWidth: 0,
tabSelectedUnderlineTransitionDuration: 0.3,
sideButtonSelectedUnderlineColor: accentColor,
sideButtonSelectedUnderlineWidth: 2,
sideButtonSelectedUnderlineTransitionDuration: 0.3,
sideButtonBorder: false,
sideButtonSelectedBorder: false,
sideButtonBarTopPadding: { calc: "spacing * 3" },
sideButtonSelectedBackgroundColor: "transparent",
sideButtonHoverTextColor: accentColor,
iconButtonHoverColor: accentColor,
toggleButtonWidth: 28,
toggleButtonHeight: 18,
toggleButtonSwitchInset: 1,
toggleButtonOffBackgroundColor: foregroundBackgroundMix(0.45)
});
var themeAlpine = /* @__PURE__ */ makeThemeAlpineTreeShakeable();
var makeThemeBalhamTreeShakeable = () => createTheme().withPart(buttonStyleBalham).withPart(checkboxStyleDefault).withPart(colorSchemeVariable).withPart(iconSetBalham).withPart(tabStyleRolodex).withPart(inputStyleBordered).withPart(columnDropStylePlain).withParams({
accentColor: "#0091ea",
borderColor: foregroundMix(0.2),
spacing: 4,
widgetVerticalSpacing: { calc: "max(8px, spacing)" },
borderRadius: 2,
wrapperBorderRadius: 2,
headerColumnResizeHandleColor: "transparent",
headerColumnBorder: true,
headerColumnBorderHeight: "50%",
oddRowBackgroundColor: {
ref: "chromeBackgroundColor",
mix: 0.5
},
checkboxBorderRadius: 2,
checkboxBorderWidth: 1,
checkboxUncheckedBackgroundColor: backgroundColor,
checkboxUncheckedBorderColor: foregroundBackgroundMix(0.5),
checkboxCheckedBackgroundColor: backgroundColor,
checkboxCheckedBorderColor: accentColor,
checkboxCheckedShapeColor: accentColor,
checkboxIndeterminateBackgroundColor: backgroundColor,
checkboxIndeterminateBorderColor: foregroundBackgroundMix(0.5),
checkboxIndeterminateShapeColor: foregroundBackgroundMix(0.5),
focusShadow: { radius: 2, spread: 1, color: accentColor },
headerTextColor: foregroundMix(0.6),
iconButtonHoverBackgroundColor: "transparent",
iconButtonActiveBackgroundColor: "transparent",
fontSize: 12,
tabSelectedBackgroundColor: backgroundColor,
headerFontWeight: "bold",
toggleButtonWidth: 32,
toggleButtonHeight: 16,
toggleButtonSwitchInset: 1,
toggleButtonOffBackgroundColor: foregroundBackgroundMix(0.5),
sideButtonBorder: true,
sideButtonBarTopPadding: { calc: "spacing * 4" },
popupShadow: "5px 5px 10px rgba(0, 0, 0, 0.3)",
statusBarLabelColor: foregroundMix(0.54),
statusBarLabelFontWeight: 600,
statusBarValueFontWeight: 600,
panelTitleBarIconColor: foregroundColor
});
var themeBalham = /* @__PURE__ */ makeThemeBalhamTreeShakeable();
var makeStyleMaterialTreeShakeable = () => {
const sharedParams = {
tabSelectedUnderlineColor: { ref: "primaryColor" },
sideButtonSelectedUnderlineColor: { ref: "primaryColor" },
buttonTextColor: { ref: "primaryColor" },
rangeSelectionBackgroundColor: {
ref: "primaryColor",
mix: 0.2
},
rangeSelectionBorderColor: {
ref: "primaryColor"
},
rangeSelectionHighlightColor: {
ref: "primaryColor",
mix: 0.5
},
rangeHeaderHighlightColor: {
ref: "foregroundColor",
mix: 0.08
},
rowNumbersSelectedColor: {
ref: "primaryColor",
mix: 0.5
},
inputFocusBorder: {
width: 2,
color: { ref: "primaryColor" }
},
pickerButtonFocusBorder: {
width: 1,
color: { ref: "primaryColor" }
},
cellEditingBorder: {
color: { ref: "primaryColor" }
},
menuBackgroundColor: { ref: "backgroundColor" },
sideButtonBarBackgroundColor: backgroundColor,
sideButtonSelectedBackgroundColor: "transparent",
sideButtonBarTopPadding: { calc: "spacing * 4" },
headerColumnResizeHandleColor: "none",
headerBackgroundColor: {
ref: "backgroundColor"
},
rowHoverColor: foregroundMix(0.08),
columnHoverColor: foregroundMix(0.08),
headerCellHoverBackgroundColor: foregroundMix(0.05),
statusBarLabelColor: foregroundMix(0.63),
statusBarLabelFontWeight: 600,
statusBarValueFontWeight: 600,
valueChangeValueHighlightBackgroundColor: "#00acc1",
panelTitleBarIconColor: foregroundColor,
advancedFilterBuilderButtonBarBorder: false
};
const lightParams = {
...sharedParams,
primaryColor: "#3f51b5",
foregroundColor: "#000D",
headerTextColor: "#0008",
accentColor: "#ff4081",
checkboxUncheckedBorderColor: foregroundColor,
checkboxIndeterminateBackgroundColor: foregroundColor,
toggleButtonOffBackgroundColor: foregroundColor,
selectedRowBackgroundColor: "rgba(33, 150, 243, 0.3)"
};
const darkParams2 = {
...sharedParams,
primaryColor: "#3f51b5",
foregroundColor: "#fffD",
headerTextColor: "#fff8",
accentColor: "#bb86fc",
checkboxUncheckedBorderColor: foregroundBackgroundMix(0.5),
checkboxIndeterminateBackgroundColor: foregroundBackgroundMix(0.5),
toggleButtonOffBackgroundColor: foregroundBackgroundMix(0.5),
selectedRowBackgroundColor: "#bb86fc33"
};
return createPart({
feature: "styleMaterial",
css: materialAdjustmentsCSS,
params: lightParams,
modeParams: {
light: lightParams,
dark: darkParams2,
"dark-blue": darkParams2
}
});
};
var styleMaterial = /* @__PURE__ */ makeStyleMaterialTreeShakeable();
var makeThemeMaterialTreeShakeable = () => /* @__PURE__ */ createTheme().withPart(buttonStyleBase).withPart(checkboxStyleDefault).withPart(colorSchemeVariable).withPart(iconSetMaterial).withPart(tabStyleMaterial).withPart(inputStyleUnderlined).withPart(columnDropStylePlain).withPart(styleMaterial).withParams({
rowHeight: {
calc: "max(iconSize, dataFontSize) + spacing * 3.75 * rowVerticalPaddingScale"
},
headerHeight: {
calc: "max(iconSize, dataFontSize) + spacing * 4.75 * headerVerticalPaddingScale"
},
widgetVerticalSpacing: {
calc: "spacing * 1.75"
},
cellHorizontalPadding: { calc: "spacing * 3" },
buttonHorizontalPadding: { ref: "spacing" },
widgetContainerHorizontalPadding: { calc: "spacing * 1.5" },
widgetContainerVerticalPadding: { calc: "spacing * 2" },
fontSize: 13,
iconSize: 18,
borderRadius: 0,
wrapperBorderRadius: 0,
wrapperBorder: false,
menuBorder: false,
dialogBorder: false,
panelTitleBarBorder: false,
tabSelectedBorderWidth: 0,
tabSelectedUnderlineTransitionDuration: 0.3,
sidePanelBorder: false,
sideButtonSelectedBorder: false,
sideButtonSelectedUnderlineWidth: 2,
sideButtonSelectedUnderlineTransitionDuration: 0.3,
sideButtonBorder: false,
buttonBorder: false,
buttonDisabledBorder: false,
focusShadow: {
spread: 4,
color: foregroundMix(0.16)
},
fontFamily: [
{ googleFont: "Roboto" },
"-apple-system",
"BlinkMacSystemFont",
"Segoe UI",
"Oxygen-Sans",
"Ubuntu",
"Cantarell",
"Helvetica Neue",
"sans-serif"
],
inputHeight: {
calc: "max(iconSize, fontSize) + spacing * 3"
},
pickerButtonBorder: {
width: 1,
color: "transparent"
},
headerFontWeight: 600,
checkboxBorderWidth: 2,
checkboxBorderRadius: 2,
toggleButtonWidth: 34,
toggleButtonSwitchInset: 1,
cardShadow: "0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12)",
popupShadow: "5px 5px 10px rgba(0, 0, 0, 0.3)"
});
var themeMaterial = /* @__PURE__ */ makeThemeMaterialTreeShakeable();
// packages/ag-grid-community/src/environment.ts
var ROW_HEIGHT = {
cssName: "--ag-row-height",
changeKey: "rowHeightChanged",
defaultValue: 42
};
var HEADER_HEIGHT = {
cssName: "--ag-header-height",
changeKey: "headerHeightChanged",
defaultValue: 48
};
var LIST_ITEM_HEIGHT = {
cssName: "--ag-list-item-height",
changeKey: "listItemHeightChanged",
defaultValue: 24
};
var ROW_BORDER_WIDTH = {
cssName: "--ag-row-border",
changeKey: "rowBorderWidthChanged",
defaultValue: 1,
border: true
};
var paramsId = 0;
var Environment = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "environment";
this.sizeEls = /* @__PURE__ */ new Map();
this.lastKnownValues = /* @__PURE__ */ new Map();
this.sizesMeasured = false;
this.paramsClass = `ag-theme-params-${++paramsId}`;
this.globalCSS = [];
}
wireBeans(beans) {
const { eGridDiv, gridOptions } = beans;
this.eGridDiv = eGridDiv;
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(() => _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() {
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) {
themeClass = `${this.paramsClass} ${gridTheme._getCssClass()}`;
} else {
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) {
_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") {
_warn(9, { variable });
}
const unsubscribe = _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 = void 0;
} else {
const themeOrDefault = themeGridOption ?? themeQuartz;
if (themeOrDefault instanceof ThemeImpl) {
newGridTheme = themeOrDefault;
} else {
_error(240, { theme: themeOrDefault });
}
}
if (newGridTheme !== oldGridTheme) {
if (newGridTheme) {
_registerGridUsingThemingAPI(this);
_injectCoreAndModuleCSS(this.eStyleContainer, this.cssLayer);
for (const [css, debugId] of globalCSS) {
_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 (!IS_SSR) {
eParamsStyle.textContent = newGridTheme?._getPerGridCss(this.paramsClass) || "";
}
this.applyThemeClasses(eGridDiv);
this.fireGridStylesChangedEvent("themeChanged");
}
if (newGridTheme && getComputedStyle(this.getMeasurementContainer()).getPropertyValue("--ag-legacy-styles-loaded")) {
if (themeGridOption) {
_error(106);
} else {
_error(239);
}
}
}
};
var NO_VALUE_SENTINEL = 15538;
// packages/ag-grid-community/src/eventService.ts
var EventService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "eventSvc";
this.globalEventService = new 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() {
}
dispatchEvent(event) {
this.globalEventService.dispatchEvent(_addGridCommonParams(this.gos, event));
}
dispatchEventOnce(event) {
this.globalEventService.dispatchEventOnce(_addGridCommonParams(this.gos, event));
}
};
// packages/ag-grid-community/src/navigation/headerNavigationService.ts
function isAnyChildSpanningHeaderHeight(columnGroup) {
if (!columnGroup) {
return false;
}
return columnGroup.getLeafColumns().some((col) => col.isSpanHeaderHeight());
}
function getHeaderIndexToFocus(column, currentIndex) {
let nextColumn;
if (isColumnGroup2(column) && isAnyChildSpanningHeaderHeight(column) && column.isPadding()) {
const targetColumn = column;
nextColumn = targetColumn.getLeafColumns()[0];
let col = nextColumn;
while (col !== targetColumn) {
currentIndex++;
col = col.getParent();
}
}
return {
column: nextColumn || column,
headerRowIndex: currentIndex
};
}
var HeaderNavigationService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "headerNavigation";
this.currentHeaderRowWithoutSpan = -1;
}
postConstruct() {
const beans = this.beans;
beans.ctrlsSvc.whenReady(this, (p) => {
this.gridBodyCon = p.gridBodyCtrl;
});
const eDocument = _getDocument(beans);
this.addManagedElementListeners(eDocument, {
mousedown: () => {
this.currentHeaderRowWithoutSpan = -1;
}
});
}
getHeaderPositionForColumn(colKey, floatingFilter) {
let column;
const { colModel, colGroupSvc, ctrlsSvc } = this.beans;
if (typeof colKey === "string") {
column = colModel.getCol(colKey);
if (!column) {
column = colGroupSvc?.getColumnGroup(colKey) ?? null;
}
} else {
column = colKey;
}
if (!column) {
return null;
}
const centerHeaderContainer = ctrlsSvc.getHeaderRowContainerCtrl();
const allCtrls = centerHeaderContainer?.getAllCtrls();
const isFloatingFilterVisible = _last(allCtrls || []).type === "filter";
const headerRowCount = getFocusHeaderRowCount(this.beans) - 1;
let row = -1;
let col = column;
while (col) {
row++;
col = col.getParent();
}
let headerRowIndex = row;
if (floatingFilter && isFloatingFilterVisible && headerRowIndex === headerRowCount - 1) {
headerRowIndex++;
}
return headerRowIndex === -1 ? null : {
headerRowIndex,
column
};
}
/*
* This method navigates grid header vertically
* @return {boolean} true to preventDefault on the event that caused this navigation.
*/
navigateVertically(direction, fromHeader, event) {
const focusSvc = this.beans.focusSvc;
if (!fromHeader) {
fromHeader = focusSvc.focusedHeader;
}
if (!fromHeader) {
return false;
}
const { headerRowIndex } = fromHeader;
const column = fromHeader.column;
const rowLen = getFocusHeaderRowCount(this.beans);
const isUp = direction === "UP";
const currentRowType = this.getHeaderRowType(headerRowIndex);
let {
headerRowIndex: nextRow,
column: nextFocusColumn,
headerRowIndexWithoutSpan
} = isUp ? getColumnVisibleParent(currentRowType, column, headerRowIndex) : getColumnVisibleChild(currentRowType, column, headerRowIndex);
let skipColumn = false;
if (nextRow < 0) {
nextRow = 0;
nextFocusColumn = column;
skipColumn = true;
}
if (nextRow >= rowLen) {
nextRow = -1;
this.currentHeaderRowWithoutSpan = -1;
} else if (headerRowIndexWithoutSpan !== void 0) {
this.currentHeaderRowWithoutSpan = headerRowIndexWithoutSpan;
}
if (!skipColumn && !nextFocusColumn) {
return false;
}
return focusSvc.focusHeaderPosition({
headerPosition: { headerRowIndex: nextRow, column: nextFocusColumn },
allowUserOverride: true,
event
});
}
/*
* This method navigates grid header horizontally
* @return {boolean} true to preventDefault on the event that caused this navigation.
*/
navigateHorizontally(direction, fromTab = false, event) {
const { focusSvc, gos } = this.beans;
const focusedHeader = focusSvc.focusedHeader;
let nextHeader;
let normalisedDirection;
if (this.currentHeaderRowWithoutSpan !== -1) {
focusedHeader.headerRowIndex = this.currentHeaderRowWithoutSpan;
} else {
this.currentHeaderRowWithoutSpan = focusedHeader.headerRowIndex;
}
if (direction === "LEFT" !== gos.get("enableRtl")) {
normalisedDirection = "Before";
nextHeader = this.findHeader(focusedHeader, normalisedDirection);
} else {
normalisedDirection = "After";
nextHeader = this.findHeader(focusedHeader, normalisedDirection);
}
if (nextHeader || !fromTab) {
return focusSvc.focusHeaderPosition({
headerPosition: nextHeader,
direction: normalisedDirection,
fromTab,
allowUserOverride: true,
event
});
} else if (fromTab) {
const userFunc = gos.getCallback("tabToNextHeader");
if (userFunc) {
return focusSvc.focusHeaderPositionFromUserFunc({
userFunc,
headerPosition: nextHeader,
direction: normalisedDirection
});
}
}
return this.focusNextHeaderRow(focusedHeader, normalisedDirection, event);
}
focusNextHeaderRow(focusedHeader, direction, event) {
const currentIndex = focusedHeader.headerRowIndex;
let nextPosition = null;
let nextRowIndex;
const beans = this.beans;
if (direction === "Before") {
if (currentIndex > 0) {
nextRowIndex = currentIndex - 1;
this.currentHeaderRowWithoutSpan -= 1;
nextPosition = this.findColAtEdgeForHeaderRow(nextRowIndex, "end");
}
} else {
nextRowIndex = currentIndex + 1;
if (this.currentHeaderRowWithoutSpan < getFocusHeaderRowCount(beans)) {
this.currentHeaderRowWithoutSpan += 1;
} else {
this.currentHeaderRowWithoutSpan = -1;
}
nextPosition = this.findColAtEdgeForHeaderRow(nextRowIndex, "start");
}
if (!nextPosition) {
return false;
}
const { column, headerRowIndex } = getHeaderIndexToFocus(
nextPosition.column,
nextPosition?.headerRowIndex
);
return beans.focusSvc.focusHeaderPosition({
headerPosition: { column, headerRowIndex },
direction,
fromTab: true,
allowUserOverride: true,
event
});
}
scrollToColumn(column, direction = "After") {
if (column.getPinned()) {
return;
}
let columnToScrollTo;
if (isColumnGroup2(column)) {
const columns = column.getDisplayedLeafColumns();
columnToScrollTo = direction === "Before" ? _last(columns) : columns[0];
} else {
columnToScrollTo = column;
}
this.gridBodyCon.scrollFeature.ensureColumnVisible(columnToScrollTo);
}
findHeader(focusedHeader, direction) {
let nextColumn;
let getColMethod;
const { colGroupSvc, visibleCols } = this.beans;
if (isColumnGroup2(focusedHeader.column)) {
nextColumn = colGroupSvc?.getGroupAtDirection(focusedHeader.column, direction) ?? void 0;
} else {
getColMethod = `getCol${direction}`;
nextColumn = visibleCols[getColMethod](focusedHeader.column);
}
if (!nextColumn) {
return;
}
const { headerRowIndex } = focusedHeader;
if (this.getHeaderRowType(headerRowIndex) !== "filter") {
const columnsInPath = [nextColumn];
while (nextColumn.getParent()) {
nextColumn = nextColumn.getParent();
columnsInPath.push(nextColumn);
}
nextColumn = columnsInPath[Math.max(0, columnsInPath.length - 1 - headerRowIndex)];
}
const { column, headerRowIndex: indexToFocus } = getHeaderIndexToFocus(nextColumn, headerRowIndex);
return {
column,
headerRowIndex: indexToFocus
};
}
getHeaderRowType(rowIndex) {
const centerHeaderContainer = this.beans.ctrlsSvc.getHeaderRowContainerCtrl();
if (centerHeaderContainer) {
return centerHeaderContainer.getRowType(rowIndex);
}
}
findColAtEdgeForHeaderRow(level, position) {
const { visibleCols, ctrlsSvc, colGroupSvc } = this.beans;
const displayedColumns = visibleCols.allCols;
const column = displayedColumns[position === "start" ? 0 : displayedColumns.length - 1];
if (!column) {
return;
}
const childContainer = ctrlsSvc.getHeaderRowContainerCtrl(column.getPinned());
const type = childContainer?.getRowType(level);
if (type == "group") {
const columnGroup = colGroupSvc?.getColGroupAtLevel(column, level);
return {
headerRowIndex: level,
column: columnGroup
};
}
return {
// if type==null, means the header level didn't exist
headerRowIndex: type == null ? -1 : level,
column
};
}
};
function getColumnVisibleParent(currentRowType, currentColumn, currentIndex) {
const isFloatingFilter = currentRowType === "filter";
const isColumn2 = currentRowType === "column";
let nextFocusColumn = isFloatingFilter ? currentColumn : currentColumn.getParent();
let nextRow = currentIndex - 1;
let headerRowIndexWithoutSpan = nextRow;
if (isColumn2 && isAnyChildSpanningHeaderHeight(currentColumn.getParent())) {
while (nextFocusColumn && nextFocusColumn.isPadding()) {
nextFocusColumn = nextFocusColumn.getParent();
nextRow--;
}
headerRowIndexWithoutSpan = nextRow;
if (nextRow < 0) {
nextFocusColumn = currentColumn;
nextRow = currentIndex;
headerRowIndexWithoutSpan = void 0;
}
}
return { column: nextFocusColumn, headerRowIndex: nextRow, headerRowIndexWithoutSpan };
}
function getColumnVisibleChild(currentRowType, column, currentIndex, direction = "After") {
let nextFocusColumn = column;
let nextRow = currentIndex + 1;
const headerRowIndexWithoutSpan = nextRow;
if (currentRowType === "group") {
const leafColumns = column.getDisplayedLeafColumns();
const leafColumn = direction === "After" ? leafColumns[0] : _last(leafColumns);
const columnsInTheWay = [];
let currentColumn = leafColumn;
while (currentColumn.getParent() !== column) {
currentColumn = currentColumn.getParent();
columnsInTheWay.push(currentColumn);
}
nextFocusColumn = leafColumn;
if (leafColumn.isSpanHeaderHeight()) {
for (let i = columnsInTheWay.length - 1; i >= 0; i--) {
const colToFocus = columnsInTheWay[i];
if (!colToFocus.isPadding()) {
nextFocusColumn = colToFocus;
break;
}
nextRow++;
}
} else {
nextFocusColumn = _last(columnsInTheWay);
if (!nextFocusColumn) {
nextFocusColumn = leafColumn;
}
}
}
return { column: nextFocusColumn, headerRowIndex: nextRow, headerRowIndexWithoutSpan };
}
// packages/ag-grid-community/src/focusService.ts
var FocusService = class extends 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(_registerKeyboardFocusEvents(this.beans));
}
onColumnEverythingChanged() {
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;
}
if (this.isDomDataMissingInHierarchy(_getActiveDomElement(this.beans), DOM_DATA_KEY_ROW_CTRL)) {
return null;
}
return this.focusedCell;
}
getFocusHeaderToUseAfterRefresh() {
if (this.gos.get("suppressFocusAfterRefresh") || !this.focusedHeader) {
return null;
}
if (this.isDomDataMissingInHierarchy(_getActiveDomElement(this.beans), DOM_DATA_KEY_HEADER_CTRL)) {
return null;
}
return this.focusedHeader;
}
isDomDataMissingInHierarchy(eBrowserCell, key) {
let ePointer = eBrowserCell;
while (ePointer) {
const data = _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(() => {
this.restoredFocusedCell = null;
}, 0);
return true;
}
return false;
}
clearRestoreFocus() {
this.restoredFocusedCell = null;
this.awaitRestoreFocusedCell = false;
}
restoreFocusedCell(cellPosition, setFocusCallback) {
this.awaitRestoreFocusedCell = true;
setTimeout(() => {
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 _areCellsEqual(cellPosition, this.restoredFocusedCell);
}
setRestoreFocusedCell(cellPosition) {
if (this.beans.frameworkOverrides.renderingEngine === "react") {
this.restoredFocusedCell = cellPosition;
}
}
getFocusEventParams(focusedCellPosition) {
const { rowIndex, rowPinned, column } = focusedCellPosition;
const params = {
rowIndex,
rowPinned,
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 (!gridColumn) {
this.focusedCell = null;
return;
}
this.focusedCell = {
rowIndex,
rowPinned: _makeNull(rowPinned),
column: gridColumn
};
this.eventSvc.dispatchEvent({
type: "cellFocused",
...this.getFocusEventParams(this.focusedCell),
forceBrowserFocus,
preventScrollOnBrowserFocus
});
}
isCellFocused(cellPosition) {
if (this.focusedCell == null) {
return false;
}
return _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 (_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 = 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 params2 = {
key: event.key,
previousHeaderPosition: currentPosition,
nextHeaderPosition: headerPosition,
headerRowCount,
event
};
headerPosition = userFunc(params2);
}
}
}
if (!headerPosition) {
return false;
}
return this.focusProvidedHeaderPosition({
headerPosition,
direction,
event,
fromCell,
rowWithoutSpanValue
});
}
focusHeaderPositionFromUserFunc(params) {
if (_isHeaderFocusSuppressed(this.beans)) {
return false;
}
const { userFunc, headerPosition, direction, event } = params;
const currentPosition = this.focusedHeader;
const headerRowCount = 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, event });
}
headerNavigation?.scrollToColumn(column, direction);
const headerRowContainerCtrl = ctrlsSvc.getHeaderRowContainerCtrl(column.getPinned());
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 = getHeaderIndexToFocus(firstColumn, 0);
return this.focusHeaderPosition({
headerPosition,
rowWithoutSpanValue: 0
});
}
focusLastHeader(event) {
if (this.overlays?.isExclusive() && this.focusOverlay(true)) {
return true;
}
const headerRowIndex = getFocusHeaderRowCount(this.beans) - 1;
const column = _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 === _makeNull(rowPinnedType);
}
focusOverlay(backwards) {
const overlayGui = this.overlays?.isVisible() && this.overlays.eWrapper?.getGui();
return !!overlayGui && _focusInto(overlayGui, backwards);
}
focusGridView(params) {
const { backwards = false, canFocusOverlay = true, event } = params;
if (this.overlays?.isExclusive()) {
return canFocusOverlay && this.focusOverlay(backwards);
}
if (_isCellFocusSuppressed(this.beans)) {
if (backwards) {
if (!_isHeaderFocusSuppressed(this.beans)) {
return this.focusLastHeader();
}
}
if (canFocusOverlay && this.focusOverlay(backwards)) {
return true;
}
if (backwards) {
return false;
}
return _focusNextGridCoreContainer(this.beans, backwards);
}
const nextRow = backwards ? _getLastRow(this.beans) : _getFirstRow(this.beans);
if (nextRow) {
const column = params.column ?? this.focusedHeader?.column;
const { rowIndex, rowPinned } = nextRow;
const rowNode = _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.TAB) {
key = isRtl ? KeyCode.LEFT : 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) {
const rowCtrl = this.rowRenderer.getRowByPosition(nextRow);
if (rowCtrl?.isFullWidth() && this.navigation?.tryToFocusFullWidthRow(nextRow, backwards)) {
return true;
}
}
this.setFocusedCell({
rowIndex,
column,
rowPinned: _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 ? void 0 : this.advFilterFocusColumn) ?? this.visibleCols.allCols?.[0];
if (backwards) {
return this.focusHeaderPosition({
headerPosition: {
column,
headerRowIndex: getFocusHeaderRowCount(this.beans) - 1
}
});
} else {
return this.focusGridView({ column });
}
}
clearAdvancedFilterColumn() {
this.advFilterFocusColumn = void 0;
}
};
// packages/ag-grid-community/src/gridBodyComp/scrollVisibleService.ts
var ScrollVisibleService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "scrollVisibleSvc";
}
wireBeans(beans) {
this.ctrlsSvc = beans.ctrlsSvc;
this.colAnimation = beans.colAnimation;
}
postConstruct() {
this.getScrollbarWidth();
this.addManagedEventListeners({
displayedColumnsChanged: this.updateScrollVisible.bind(this),
displayedColumnsWidthChanged: this.updateScrollVisible.bind(this)
});
}
updateScrollVisible() {
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 : _getScrollbarWidth();
if (scrollbarWidth != null) {
this.scrollbarWidth = scrollbarWidth;
this.eventSvc.dispatchEvent({
type: "scrollbarWidthChanged"
});
}
}
return this.scrollbarWidth;
}
};
// packages/ag-grid-community/src/gridDestroyService.ts
var GridDestroyService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "gridDestroySvc";
this.destroyCalled = false;
}
destroy() {
if (this.destroyCalled) {
return;
}
const { stateSvc, ctrlsSvc, context } = this.beans;
this.eventSvc.dispatchEvent({
type: "gridPreDestroyed",
state: stateSvc?.getState() ?? {}
});
this.destroyCalled = true;
ctrlsSvc.get("gridCtrl")?.destroyGridUi();
context.destroy();
super.destroy();
}
};
// packages/ag-grid-community/src/events.ts
var ALWAYS_SYNC_GLOBAL_EVENTS = /* @__PURE__ */ new Set(["gridPreDestroyed", "fillStart", "pasteStart"]);
// packages/ag-grid-community/src/gridOptionsDefault.ts
var GRID_OPTION_DEFAULTS = {
suppressContextMenu: false,
preventDefaultOnContextMenu: false,
allowContextMenuWithControlKey: false,
suppressMenuHide: true,
enableBrowserTooltips: false,
tooltipTrigger: "hover",
tooltipShowDelay: 2e3,
tooltipHideDelay: 1e4,
tooltipMouseTrack: false,
tooltipShowMode: "standard",
tooltipInteraction: false,
copyHeadersToClipboard: false,
copyGroupHeadersToClipboard: false,
clipboardDelimiter: " ",
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: 1e3,
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
};
// packages/ag-grid-community/src/gridOptionsService.ts
var changeSetId = 0;
var gridInstanceSequence = 0;
var GridOptionsService = class extends 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();
// 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) => {
if (!this.isAlive()) {
return;
}
const alwaysSync = ALWAYS_SYNC_GLOBAL_EVENTS.has(eventName);
if (alwaysSync && !restrictToSyncOnly || !alwaysSync && restrictToSyncOnly) {
return;
}
const eventHandlerName = _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);
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] ?? 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 _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: [] };
const events = [];
const { gridOptions, validation: validation2 } = this;
for (const key of Object.keys(options)) {
const value = options[key];
validation2?.warnOnInitialPropertyUpdate(source, key);
const shouldForce = force || typeof value === "object" && source === "api";
const previousValue = gridOptions[key];
if (shouldForce || previousValue !== value) {
gridOptions[key] = value;
const event = {
type: key,
currentValue: value,
previousValue,
changeSet,
source
};
events.push(event);
}
}
validation2?.processGridOptions(this.gridOptions);
changeSet.properties = events.map((event) => event.type);
events.forEach((event) => {
_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) {
_error(200, {
...this.getModuleErrorParams(),
moduleName,
reasonOrId
});
}
return registered;
}
getModuleErrorParams() {
return {
gridId: this.gridId,
gridScoped: _areModulesGridScoped(),
rowModelType: this.get("rowModelType"),
isUmd: _isUmd()
};
}
isModuleRegistered(moduleName) {
return _isModuleRegistered(moduleName, this.gridId, this.get("rowModelType"));
}
};
// packages/ag-grid-community/src/headerRendering/cells/column/headerComp.ts
function getHeaderCompTemplate(includeSortIndicator) {
return (
/* html */
`
`
);
}
var HeaderComp = class extends Component {
constructor() {
super(...arguments);
this.eFilter = RefPlaceholder;
this.eFilterButton = RefPlaceholder;
this.eSortIndicator = RefPlaceholder;
this.eMenu = RefPlaceholder;
this.eLabel = RefPlaceholder;
this.eText = RefPlaceholder;
/**
* Selectors for custom headers templates
*/
this.eSortOrder = RefPlaceholder;
this.eSortAsc = RefPlaceholder;
this.eSortDesc = RefPlaceholder;
this.eSortMixed = RefPlaceholder;
this.eSortNone = RefPlaceholder;
this.isLoadingInnerComponent = false;
}
refresh(params) {
const oldParams = this.params;
this.params = params;
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);
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()] : void 0);
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 = _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 = _escapeString(displayName, true);
this.eText.textContent = displayNameSanitised;
}
addInIcon(iconName, eParent, column) {
if (eParent == null) {
return;
}
const eIcon = _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 (!this.eMenu) {
return;
}
this.currentShowMenu = this.workOutShowMenu();
if (!this.currentShowMenu) {
_removeFromParent(this.eMenu);
this.eMenu = void 0;
return;
}
const { gos, eMenu, params } = this;
const isLegacyMenu = _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 = _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;
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);
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 = void 0;
}
}
configureFilter(enabled, element, filterChangedCallback, icon) {
if (!enabled) {
_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();
_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 = void 0;
}
}
};
// packages/ag-grid-community/src/headerRendering/cells/columnGroup/headerGroupComp.ts
var HeaderGroupComp = class extends Component {
constructor() {
super(
/* html */
``
);
this.agOpened = RefPlaceholder;
this.agClosed = RefPlaceholder;
this.agLabel = 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) {
_warn(89);
}
}
workOutInnerHeaderGroupComponent(userCompFactory, params) {
const userCompDetails = _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 (_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) => {
_stopPropagationForAgGrid(event);
};
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();
_setDisplayed(agOpened, expanded);
_setDisplayed(agClosed, !expanded);
} else {
_setDisplayed(agOpened, false);
_setDisplayed(agClosed, false);
}
}
addInIcon(iconName, element) {
const eIcon = _createIconNoSpan(iconName, this.beans, null);
if (eIcon) {
element.appendChild(eIcon);
}
}
addGroupExpandIcon(params) {
if (!params.columnGroup.isExpandable()) {
const { agOpened, agClosed } = this;
_setDisplayed(agOpened, false);
_setDisplayed(agClosed, false);
return;
}
}
setupLabel(params) {
const { displayName, columnGroup } = params;
const hasInnerComponent = this.innerHeaderGroupComponent || this.isLoadingInnerComponent;
if (_exists(displayName) && !hasInnerComponent) {
const displayNameSanitised = _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 = void 0;
}
}
};
// packages/ag-grid-community/src/headerRendering/cells/headerModule.ts
var ColumnHeaderCompModule = {
moduleName: "ColumnHeaderComp",
version: VERSION,
userComponents: {
agColumnHeader: HeaderComp
},
icons: {
// button to launch legacy column menu
menu: "menu",
// button to launch new enterprise column menu
menuAlt: "menu-alt"
}
};
var ColumnGroupHeaderCompModule = {
moduleName: "ColumnGroupHeaderComp",
version: VERSION,
userComponents: {
agColumnGroupHeader: HeaderGroupComp
},
icons: {
// header column group shown when expanded (click to contract)
columnGroupOpened: "expanded",
// header column group shown when contracted (click to expand)
columnGroupClosed: "contracted"
}
};
// packages/ag-grid-community/src/misc/animationFrameModule.ts
var AnimationFrameModule = {
moduleName: "AnimationFrame",
version: VERSION,
beans: [AnimationFrameService]
};
// packages/ag-grid-community/src/misc/touchService.ts
var TouchService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "touchSvc";
}
mockBodyContextMenu(ctrl, listener) {
this.mockContextMenu(ctrl, ctrl.eBodyViewport, listener);
}
mockHeaderContextMenu(ctrl, listener) {
this.mockContextMenu(ctrl, ctrl.eGui, listener);
}
mockRowContextMenu(ctrl) {
if (!_isIOSUserAgent()) {
return;
}
const listener = (mouseListener, touch, touchEvent) => {
const { rowCtrl, cellCtrl } = ctrl.getControlsForEventTarget(touchEvent?.target ?? null);
if (cellCtrl?.column) {
cellCtrl.dispatchCellContextMenuEvent(touchEvent ?? null);
}
this.beans.contextMenuSvc?.handleContextMenuMouseEvent(void 0, touchEvent, rowCtrl, cellCtrl);
};
this.mockContextMenu(ctrl, ctrl.element, listener);
}
handleCellDoubleClick(ctrl, mouseEvent) {
const isDoubleClickOnIPad = () => {
if (!_isIOSUserAgent() || _isEventSupported("dblclick")) {
return false;
}
const nowMillis = (/* @__PURE__ */ new Date()).getTime();
const res = nowMillis - ctrl.lastIPadMouseClickEvent < 200;
ctrl.lastIPadMouseClickEvent = nowMillis;
return res;
};
if (isDoubleClickOnIPad()) {
ctrl.onCellDoubleClicked(mouseEvent);
mouseEvent.preventDefault();
return true;
}
return false;
}
setupForHeader(comp) {
const { gos, sortSvc } = this.beans;
if (gos.get("suppressTouch")) {
return;
}
const { params, eMenu, eFilterButton } = comp;
const touchListener = new TouchListener(comp.getGui(), true);
const suppressMenuHide = comp.shouldSuppressMenuHide();
const tapMenuButton = suppressMenuHide && _exists(eMenu);
const menuTouchListener = tapMenuButton ? new TouchListener(eMenu, true) : touchListener;
if (params.enableMenu) {
const eventType = tapMenuButton ? "tap" : "longTap";
const showMenuFn = (event) => params.showColumnMenuAfterMouseClick(event.touchStart);
comp.addManagedListeners(menuTouchListener, { [eventType]: showMenuFn });
}
if (params.enableSorting) {
const tapListener = (event) => {
const target = event.touchStart.target;
if (suppressMenuHide && (eMenu?.contains(target) || eFilterButton?.contains(target))) {
return;
}
sortSvc?.progressSort(params.column, false, "uiColumnSorted");
};
comp.addManagedListeners(touchListener, { tap: tapListener });
}
if (params.enableFilterButton && eFilterButton) {
const filterButtonTouchListener = new TouchListener(eFilterButton, true);
comp.addManagedListeners(filterButtonTouchListener, {
tap: () => params.showFilter(eFilterButton)
});
comp.addDestroyFunc(() => filterButtonTouchListener.destroy());
}
comp.addDestroyFunc(() => touchListener.destroy());
if (tapMenuButton) {
comp.addDestroyFunc(() => menuTouchListener.destroy());
}
}
setupForHeaderGroup(comp, eElement, action) {
const touchListener = new TouchListener(eElement, true);
comp.addManagedListeners(touchListener, { tap: action });
comp.addDestroyFunc(() => touchListener.destroy());
}
mockContextMenu(ctrl, element, listener) {
if (!_isIOSUserAgent()) {
return;
}
const touchListener = new TouchListener(element);
const longTapListener = (event) => {
listener(void 0, event.touchStart, event.touchEvent);
};
ctrl.addManagedListeners(touchListener, { longTap: longTapListener });
ctrl.addDestroyFunc(() => touchListener.destroy());
}
};
// packages/ag-grid-community/src/misc/touchModule.ts
var TouchModule = {
moduleName: "Touch",
version: VERSION,
beans: [TouchService]
};
// packages/ag-grid-community/src/navigation/cellNavigationService.ts
var CellNavigationService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "cellNavigation";
}
wireBeans(beans) {
this.rowSpanSvc = beans.rowSpanSvc;
}
// returns null if no cell to focus on, ie at the end of the grid
getNextCellToFocus(key, focusedCell, ctrlPressed = false) {
if (ctrlPressed) {
return this.getNextCellToFocusWithCtrlPressed(key, focusedCell);
}
return this.getNextCellToFocusWithoutCtrlPressed(key, focusedCell);
}
getNextCellToFocusWithCtrlPressed(key, focusedCell) {
const upKey = key === KeyCode.UP;
const downKey = key === KeyCode.DOWN;
const leftKey = key === KeyCode.LEFT;
let column;
let rowIndex;
const { pageBounds, gos, visibleCols } = this.beans;
if (upKey || downKey) {
rowIndex = upKey ? pageBounds.getFirstRow() : pageBounds.getLastRow();
column = focusedCell.column;
} else {
const isRtl = gos.get("enableRtl");
rowIndex = focusedCell.rowIndex;
const allColumns = leftKey !== isRtl ? visibleCols.allCols : [...visibleCols.allCols].reverse();
column = allColumns.find(
(col) => this.isCellGoodToFocusOn({
rowIndex,
rowPinned: null,
column: col
})
);
}
return column ? {
rowIndex,
rowPinned: null,
column
} : null;
}
getNextCellToFocusWithoutCtrlPressed(key, focusedCell) {
let pointer = focusedCell;
let finished = false;
while (!finished) {
switch (key) {
case KeyCode.UP:
pointer = this.getCellAbove(pointer);
break;
case KeyCode.DOWN:
pointer = this.getCellBelow(pointer);
break;
case KeyCode.RIGHT:
pointer = this.gos.get("enableRtl") ? this.getCellToLeft(pointer) : this.getCellToRight(pointer);
break;
case KeyCode.LEFT:
pointer = this.gos.get("enableRtl") ? this.getCellToRight(pointer) : this.getCellToLeft(pointer);
break;
default:
pointer = null;
_warn(8, { key });
break;
}
if (pointer) {
finished = this.isCellGoodToFocusOn(pointer);
} else {
finished = true;
}
}
return pointer;
}
isCellGoodToFocusOn(gridCell) {
const column = gridCell.column;
let rowNode;
const { pinnedRowModel, rowModel } = this.beans;
switch (gridCell.rowPinned) {
case "top":
rowNode = pinnedRowModel?.getPinnedTopRow(gridCell.rowIndex);
break;
case "bottom":
rowNode = pinnedRowModel?.getPinnedBottomRow(gridCell.rowIndex);
break;
default:
rowNode = rowModel.getRow(gridCell.rowIndex);
break;
}
if (!rowNode) {
return false;
}
const suppressNavigable = this.isSuppressNavigable(column, rowNode);
return !suppressNavigable;
}
getCellToLeft(lastCell) {
if (!lastCell) {
return null;
}
const colToLeft = this.beans.visibleCols.getColBefore(lastCell.column);
if (!colToLeft) {
return null;
}
return {
rowIndex: lastCell.rowIndex,
column: colToLeft,
rowPinned: lastCell.rowPinned
};
}
getCellToRight(lastCell) {
if (!lastCell) {
return null;
}
const colToRight = this.beans.visibleCols.getColAfter(lastCell.column);
if (!colToRight) {
return null;
}
return {
rowIndex: lastCell.rowIndex,
column: colToRight,
rowPinned: lastCell.rowPinned
};
}
getRowBelow(rowPosition) {
const index = rowPosition.rowIndex;
const pinned = rowPosition.rowPinned;
let ignoreSticky = false;
const { pageBounds, pinnedRowModel, rowModel } = this.beans;
if (this.isLastRowInContainer(rowPosition)) {
switch (pinned) {
case "bottom":
return null;
case "top":
if (rowModel.isRowsToRender()) {
return { rowIndex: pageBounds.getFirstRow(), rowPinned: null };
}
if (pinnedRowModel?.isRowsToRender("bottom")) {
return { rowIndex: 0, rowPinned: "bottom" };
}
return null;
default:
if (pinnedRowModel?.isRowsToRender("bottom")) {
return { rowIndex: 0, rowPinned: "bottom" };
}
return null;
}
} else if (pinned) {
ignoreSticky = true;
}
const rowNode = rowModel.getRow(rowPosition.rowIndex);
const nextStickyPosition = ignoreSticky ? void 0 : this.getNextStickyPosition(rowNode);
if (nextStickyPosition) {
return nextStickyPosition;
}
return { rowIndex: index + 1, rowPinned: pinned };
}
getNextStickyPosition(rowNode, up) {
const { gos, rowRenderer } = this.beans;
if (!_isGroupRowsSticky(gos) || !rowNode || !rowNode.sticky) {
return;
}
const isTopCtrls = rowRenderer.getStickyTopRowCtrls().some((ctrl) => ctrl.rowNode.rowIndex === rowNode.rowIndex);
let stickyRowCtrls = [];
if (isTopCtrls) {
stickyRowCtrls = [...rowRenderer.getStickyTopRowCtrls()].sort(
(a, b) => a.rowNode.rowIndex - b.rowNode.rowIndex
);
} else {
stickyRowCtrls = [...rowRenderer.getStickyBottomRowCtrls()].sort(
(a, b) => b.rowNode.rowIndex - a.rowNode.rowIndex
);
}
const diff = up ? -1 : 1;
const idx = stickyRowCtrls.findIndex((ctrl) => ctrl.rowNode.rowIndex === rowNode.rowIndex);
const nextCtrl = stickyRowCtrls[idx + diff];
if (nextCtrl) {
return { rowIndex: nextCtrl.rowNode.rowIndex, rowPinned: null };
}
}
getCellBelow(lastCell) {
if (!lastCell) {
return null;
}
const adjustedLastCell = this.rowSpanSvc?.getCellEnd(lastCell) ?? lastCell;
const rowBelow = this.getRowBelow(adjustedLastCell);
if (rowBelow) {
return {
rowIndex: rowBelow.rowIndex,
column: lastCell.column,
rowPinned: rowBelow.rowPinned
};
}
return null;
}
isLastRowInContainer(rowPosition) {
const pinned = rowPosition.rowPinned;
const index = rowPosition.rowIndex;
const { pinnedRowModel, pageBounds } = this.beans;
if (pinned === "top") {
const lastTopIndex = pinnedRowModel?.getPinnedTopRowCount() ?? 0 - 1;
return lastTopIndex <= index;
}
if (pinned === "bottom") {
const lastBottomIndex = pinnedRowModel?.getPinnedBottomRowCount() ?? 0 - 1;
return lastBottomIndex <= index;
}
const lastBodyIndex = pageBounds.getLastRow();
return lastBodyIndex <= index;
}
getRowAbove(rowPosition) {
const index = rowPosition.rowIndex;
const pinned = rowPosition.rowPinned;
const { pageBounds, pinnedRowModel, rowModel } = this.beans;
const isFirstRow = pinned ? index === 0 : index === pageBounds.getFirstRow();
let ignoreSticky = false;
const getLastFloatingTopRow = () => {
const lastFloatingRow = pinnedRowModel?.getPinnedTopRowCount() ?? 0 - 1;
return { rowIndex: lastFloatingRow, rowPinned: "top" };
};
if (isFirstRow) {
if (pinned === "top") {
return null;
}
if (!pinned) {
if (pinnedRowModel?.isRowsToRender("top")) {
return getLastFloatingTopRow();
}
return null;
}
if (rowModel.isRowsToRender()) {
const lastBodyRow = pageBounds.getLastRow();
return { rowIndex: lastBodyRow, rowPinned: null };
}
if (pinnedRowModel?.isRowsToRender("top")) {
return getLastFloatingTopRow();
}
return null;
} else if (pinned) {
ignoreSticky = true;
}
const rowNode = rowModel.getRow(rowPosition.rowIndex);
const nextStickyPosition = ignoreSticky ? void 0 : this.getNextStickyPosition(rowNode, true);
if (nextStickyPosition) {
return nextStickyPosition;
}
return { rowIndex: index - 1, rowPinned: pinned };
}
getCellAbove(lastCell) {
if (!lastCell) {
return null;
}
const adjustedLastCell = this.rowSpanSvc?.getCellStart(lastCell) ?? lastCell;
const rowAbove = this.getRowAbove({
rowIndex: adjustedLastCell.rowIndex,
rowPinned: adjustedLastCell.rowPinned
});
if (rowAbove) {
return {
rowIndex: rowAbove.rowIndex,
column: lastCell.column,
rowPinned: rowAbove.rowPinned
};
}
return null;
}
getNextTabbedCell(gridCell, backwards) {
if (backwards) {
return this.getNextTabbedCellBackwards(gridCell);
}
return this.getNextTabbedCellForwards(gridCell);
}
getNextTabbedCellForwards(gridCell) {
const { visibleCols, pagination } = this.beans;
const displayedColumns = visibleCols.allCols;
let newRowIndex = gridCell.rowIndex;
let newFloating = gridCell.rowPinned;
let newColumn = visibleCols.getColAfter(gridCell.column);
if (!newColumn) {
newColumn = displayedColumns[0];
const rowBelow = this.getRowBelow(gridCell);
if (_missing(rowBelow)) {
return null;
}
if (!rowBelow.rowPinned && !(pagination?.isRowInPage(rowBelow) ?? true)) {
return null;
}
newRowIndex = rowBelow ? rowBelow.rowIndex : null;
newFloating = rowBelow ? rowBelow.rowPinned : null;
}
return { rowIndex: newRowIndex, column: newColumn, rowPinned: newFloating };
}
getNextTabbedCellBackwards(gridCell) {
const { visibleCols, pagination } = this.beans;
const displayedColumns = visibleCols.allCols;
let newRowIndex = gridCell.rowIndex;
let newFloating = gridCell.rowPinned;
let newColumn = visibleCols.getColBefore(gridCell.column);
if (!newColumn) {
newColumn = _last(displayedColumns);
const rowAbove = this.getRowAbove({ rowIndex: gridCell.rowIndex, rowPinned: gridCell.rowPinned });
if (_missing(rowAbove)) {
return null;
}
if (!rowAbove.rowPinned && !(pagination?.isRowInPage(rowAbove) ?? true)) {
return null;
}
newRowIndex = rowAbove ? rowAbove.rowIndex : null;
newFloating = rowAbove ? rowAbove.rowPinned : null;
}
return { rowIndex: newRowIndex, column: newColumn, rowPinned: newFloating };
}
isSuppressNavigable(column, rowNode) {
const { suppressNavigable } = column.colDef;
if (typeof suppressNavigable === "boolean") {
return suppressNavigable;
}
if (typeof suppressNavigable === "function") {
const params = column.createColumnFunctionCallbackParams(rowNode);
const userFunc = suppressNavigable;
return userFunc(params);
}
return false;
}
};
// packages/ag-grid-community/src/navigation/navigationApi.ts
function getFocusedCell(beans) {
return beans.focusSvc.getFocusedCell();
}
function clearFocusedCell(beans) {
return beans.focusSvc.clearFocusedCell();
}
function setFocusedCell(beans, rowIndex, colKey, rowPinned) {
beans.focusSvc.setFocusedCell({ rowIndex, column: colKey, rowPinned, forceBrowserFocus: true });
}
function tabToNextCell(beans, event) {
return beans.navigation?.tabToNextCell(false, event) ?? false;
}
function tabToPreviousCell(beans, event) {
return beans.navigation?.tabToNextCell(true, event) ?? false;
}
function setFocusedHeader(beans, colKey, floatingFilter = false) {
const headerPosition = beans.headerNavigation?.getHeaderPositionForColumn(colKey, floatingFilter);
if (!headerPosition) {
return;
}
beans.focusSvc.focusHeaderPosition({ headerPosition });
}
// packages/ag-grid-community/src/navigation/navigationService.ts
var NavigationService = class extends BeanStub {
constructor() {
super();
this.beanName = "navigation";
this.onPageDown = _throttle(this.onPageDown, 100);
this.onPageUp = _throttle(this.onPageUp, 100);
}
postConstruct() {
this.beans.ctrlsSvc.whenReady(this, (p) => {
this.gridBodyCon = p.gridBodyCtrl;
});
}
handlePageScrollingKey(event, fromFullWidth = false) {
const key = event.key;
const alt = event.altKey;
const ctrl = event.ctrlKey || event.metaKey;
const rangeServiceShouldHandleShift = !!this.beans.rangeSvc && event.shiftKey;
const currentCell = _getCellPositionForEvent(this.gos, event);
let processed = false;
switch (key) {
case KeyCode.PAGE_HOME:
case KeyCode.PAGE_END:
if (!ctrl && !alt) {
this.onHomeOrEndKey(key);
processed = true;
}
break;
case KeyCode.LEFT:
case KeyCode.RIGHT:
case KeyCode.UP:
case KeyCode.DOWN:
if (!currentCell) {
return false;
}
if (ctrl && !alt && !rangeServiceShouldHandleShift) {
this.onCtrlUpDownLeftRight(key, currentCell);
processed = true;
}
break;
case KeyCode.PAGE_DOWN:
case KeyCode.PAGE_UP:
if (!ctrl && !alt) {
processed = this.handlePageUpDown(key, currentCell, fromFullWidth);
}
break;
}
if (processed) {
event.preventDefault();
}
return processed;
}
handlePageUpDown(key, currentCell, fromFullWidth) {
if (fromFullWidth) {
currentCell = this.beans.focusSvc.getFocusedCell();
}
if (!currentCell) {
return false;
}
if (key === KeyCode.PAGE_UP) {
this.onPageUp(currentCell);
} else {
this.onPageDown(currentCell);
}
return true;
}
navigateTo(navigateParams) {
const { scrollIndex, scrollType, scrollColumn, focusIndex, focusColumn } = navigateParams;
const { scrollFeature } = this.gridBodyCon;
if (_exists(scrollColumn) && !scrollColumn.isPinned()) {
scrollFeature.ensureColumnVisible(scrollColumn);
}
if (_exists(scrollIndex)) {
scrollFeature.ensureIndexVisible(scrollIndex, scrollType);
}
if (!navigateParams.isAsync) {
scrollFeature.ensureIndexVisible(focusIndex);
}
const { focusSvc, rangeSvc } = this.beans;
focusSvc.setFocusedCell({
rowIndex: focusIndex,
column: focusColumn,
rowPinned: null,
forceBrowserFocus: true
});
rangeSvc?.setRangeToCell({ rowIndex: focusIndex, rowPinned: null, column: focusColumn });
}
// this method is throttled, see the `constructor`
onPageDown(gridCell) {
const beans = this.beans;
const scrollPosition = getVScroll(beans);
const pixelsInOnePage = this.getViewportHeight();
const { pageBounds, rowModel, rowAutoHeight } = beans;
const pagingPixelOffset = pageBounds.getPixelOffset();
const currentPageBottomPixel = scrollPosition.top + pixelsInOnePage;
const currentPageBottomRow = rowModel.getRowIndexAtPixel(currentPageBottomPixel + pagingPixelOffset);
if (rowAutoHeight?.active) {
this.navigateToNextPageWithAutoHeight(gridCell, currentPageBottomRow);
} else {
this.navigateToNextPage(gridCell, currentPageBottomRow);
}
}
// this method is throttled, see the `constructor`
onPageUp(gridCell) {
const beans = this.beans;
const scrollPosition = getVScroll(beans);
const { pageBounds, rowModel, rowAutoHeight } = beans;
const pagingPixelOffset = pageBounds.getPixelOffset();
const currentPageTopPixel = scrollPosition.top;
const currentPageTopRow = rowModel.getRowIndexAtPixel(currentPageTopPixel + pagingPixelOffset);
if (rowAutoHeight?.active) {
this.navigateToNextPageWithAutoHeight(gridCell, currentPageTopRow, true);
} else {
this.navigateToNextPage(gridCell, currentPageTopRow, true);
}
}
navigateToNextPage(gridCell, scrollIndex, up = false) {
const { pageBounds, rowModel } = this.beans;
const pixelsInOnePage = this.getViewportHeight();
const firstRow = pageBounds.getFirstRow();
const lastRow = pageBounds.getLastRow();
const pagingPixelOffset = pageBounds.getPixelOffset();
const currentRowNode = rowModel.getRow(gridCell.rowIndex);
const rowPixelDiff = up ? (
// eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain
currentRowNode?.rowHeight - pixelsInOnePage - pagingPixelOffset
) : pixelsInOnePage - pagingPixelOffset;
const nextCellPixel = currentRowNode?.rowTop + rowPixelDiff;
let focusIndex = rowModel.getRowIndexAtPixel(nextCellPixel + pagingPixelOffset);
if (focusIndex === gridCell.rowIndex) {
const diff = up ? -1 : 1;
scrollIndex = focusIndex = gridCell.rowIndex + diff;
}
let scrollType;
if (up) {
scrollType = "bottom";
if (focusIndex < firstRow) {
focusIndex = firstRow;
}
if (scrollIndex < firstRow) {
scrollIndex = firstRow;
}
} else {
scrollType = "top";
if (focusIndex > lastRow) {
focusIndex = lastRow;
}
if (scrollIndex > lastRow) {
scrollIndex = lastRow;
}
}
if (this.isRowTallerThanView(rowModel.getRow(focusIndex))) {
scrollIndex = focusIndex;
scrollType = "top";
}
this.navigateTo({
scrollIndex,
scrollType,
scrollColumn: null,
focusIndex,
focusColumn: gridCell.column
});
}
navigateToNextPageWithAutoHeight(gridCell, scrollIndex, up = false) {
this.navigateTo({
scrollIndex,
scrollType: up ? "bottom" : "top",
scrollColumn: null,
focusIndex: scrollIndex,
focusColumn: gridCell.column
});
setTimeout(() => {
const focusIndex = this.getNextFocusIndexForAutoHeight(gridCell, up);
this.navigateTo({
scrollIndex,
scrollType: up ? "bottom" : "top",
scrollColumn: null,
focusIndex,
focusColumn: gridCell.column,
isAsync: true
});
}, 50);
}
getNextFocusIndexForAutoHeight(gridCell, up = false) {
const step = up ? -1 : 1;
const pixelsInOnePage = this.getViewportHeight();
const { pageBounds, rowModel } = this.beans;
const lastRowIndex = pageBounds.getLastRow();
let pixelSum = 0;
let currentIndex = gridCell.rowIndex;
while (currentIndex >= 0 && currentIndex <= lastRowIndex) {
const currentCell = rowModel.getRow(currentIndex);
if (currentCell) {
const currentCellHeight = currentCell.rowHeight ?? 0;
if (pixelSum + currentCellHeight > pixelsInOnePage) {
break;
}
pixelSum += currentCellHeight;
}
currentIndex += step;
}
return Math.max(0, Math.min(currentIndex, lastRowIndex));
}
getViewportHeight() {
const beans = this.beans;
const scrollPosition = getVScroll(beans);
const scrollbarWidth = this.beans.scrollVisibleSvc.getScrollbarWidth();
let pixelsInOnePage = scrollPosition.bottom - scrollPosition.top;
if (beans.ctrlsSvc.get("center").isHorizontalScrollShowing()) {
pixelsInOnePage -= scrollbarWidth;
}
return pixelsInOnePage;
}
isRowTallerThanView(rowNode) {
if (!rowNode) {
return false;
}
const rowHeight = rowNode.rowHeight;
if (typeof rowHeight !== "number") {
return false;
}
return rowHeight > this.getViewportHeight();
}
onCtrlUpDownLeftRight(key, gridCell) {
const cellToFocus = this.beans.cellNavigation.getNextCellToFocus(key, gridCell, true);
const { rowIndex } = cellToFocus;
const column = cellToFocus.column;
this.navigateTo({
scrollIndex: rowIndex,
scrollType: null,
scrollColumn: column,
focusIndex: rowIndex,
focusColumn: column
});
}
// home brings focus to top left cell, end brings focus to bottom right, grid scrolled to bring
// same cell into view (which means either scroll all the way up, or all the way down).
onHomeOrEndKey(key) {
const homeKey = key === KeyCode.PAGE_HOME;
const { visibleCols, pageBounds, rowModel } = this.beans;
const allColumns = visibleCols.allCols;
const scrollIndex = homeKey ? pageBounds.getFirstRow() : pageBounds.getLastRow();
const rowNode = rowModel.getRow(scrollIndex);
if (!rowNode) {
return;
}
const columnToSelect = (homeKey ? allColumns : [...allColumns].reverse()).find(
(col) => !col.isSuppressNavigable(rowNode)
);
if (!columnToSelect) {
return;
}
this.navigateTo({
scrollIndex,
scrollType: null,
scrollColumn: columnToSelect,
focusIndex: scrollIndex,
focusColumn: columnToSelect
});
}
// result of keyboard event
onTabKeyDown(previous, keyboardEvent) {
const backwards = keyboardEvent.shiftKey;
const movedToNextCell = this.tabToNextCellCommon(previous, backwards, keyboardEvent);
const beans = this.beans;
const { ctrlsSvc, pageBounds, focusSvc, gos } = beans;
if (movedToNextCell !== false) {
if (movedToNextCell) {
keyboardEvent.preventDefault();
} else if (movedToNextCell === null) {
ctrlsSvc.get("gridCtrl").allowFocusForNextCoreContainer(backwards);
}
return;
}
if (backwards) {
const { rowIndex, rowPinned } = previous.getRowPosition();
const firstRow = rowPinned ? rowIndex === 0 : rowIndex === pageBounds.getFirstRow();
if (firstRow) {
if (gos.get("headerHeight") === 0 || _isHeaderFocusSuppressed(beans)) {
_focusNextGridCoreContainer(beans, true, true);
} else {
keyboardEvent.preventDefault();
focusSvc.focusPreviousFromFirstCell(keyboardEvent);
}
}
} else {
if (previous instanceof CellCtrl) {
previous.focusCell(true);
}
if (!backwards && focusSvc.focusOverlay(false) || _focusNextGridCoreContainer(beans, backwards)) {
keyboardEvent.preventDefault();
}
}
}
// comes from API
tabToNextCell(backwards, event) {
const beans = this.beans;
const { focusSvc, rowRenderer } = beans;
const focusedCell = focusSvc.getFocusedCell();
if (!focusedCell) {
return false;
}
let cellOrRow = _getCellByPosition(beans, focusedCell);
if (!cellOrRow) {
cellOrRow = rowRenderer.getRowByPosition(focusedCell);
if (!cellOrRow || !cellOrRow.isFullWidth()) {
return false;
}
}
return !!this.tabToNextCellCommon(cellOrRow, backwards, event);
}
tabToNextCellCommon(previous, backwards, event) {
let editing = previous.editing;
if (!editing && previous instanceof CellCtrl) {
const cell = previous;
const row = cell.rowCtrl;
if (row) {
editing = row.editing;
}
}
let res;
if (editing) {
if (this.gos.get("editType") === "fullRow") {
res = this.moveToNextEditingRow(previous, backwards, event);
} else {
res = this.moveToNextEditingCell(previous, backwards, event);
}
} else {
res = this.moveToNextCellNotEditing(previous, backwards);
}
if (res === null) {
return res;
}
return res || !!this.beans.focusSvc.focusedHeader;
}
// returns null if no navigation should be performed
moveToNextEditingCell(previousCell, backwards, event = null) {
const previousPos = previousCell.cellPosition;
previousCell.eGui.focus();
previousCell.stopEditing();
const nextCell = this.findNextCellToFocusOn(previousPos, backwards, true);
if (nextCell === false) {
return null;
}
if (nextCell == null) {
return false;
}
this.beans.editSvc?.startEditing(nextCell, null, true, event);
nextCell.focusCell(false);
return true;
}
// returns null if no navigation should be performed
moveToNextEditingRow(previousCell, backwards, event = null) {
const previousPos = previousCell.cellPosition;
const nextCell = this.findNextCellToFocusOn(previousPos, backwards, true);
if (nextCell === false) {
return null;
}
if (nextCell == null) {
return false;
}
const nextPos = nextCell.cellPosition;
const previousEditable = this.isCellEditable(previousPos);
const nextEditable = this.isCellEditable(nextPos);
const rowsMatch = nextPos && previousPos.rowIndex === nextPos.rowIndex && previousPos.rowPinned === nextPos.rowPinned;
const { editSvc, rowEditSvc } = this.beans;
if (previousEditable) {
editSvc?.setFocusOutOnEditor(previousCell);
}
if (!rowsMatch) {
const pRow = previousCell.rowCtrl;
editSvc?.stopRowEditing(pRow);
const nRow = nextCell.rowCtrl;
rowEditSvc?.startEditing(nRow, void 0, void 0, event);
}
if (nextEditable) {
editSvc?.setFocusInOnEditor(nextCell);
nextCell.focusCell();
} else {
nextCell.focusCell(true);
}
return true;
}
// returns null if no navigation should be performed
moveToNextCellNotEditing(previousCell, backwards) {
const displayedColumns = this.beans.visibleCols.allCols;
let cellPos;
if (previousCell instanceof RowCtrl) {
cellPos = {
...previousCell.getRowPosition(),
column: backwards ? displayedColumns[0] : _last(displayedColumns)
};
} else {
cellPos = previousCell.getFocusedCellPosition();
}
const nextCell = this.findNextCellToFocusOn(cellPos, backwards, false);
if (nextCell === false) {
return null;
}
if (nextCell instanceof CellCtrl) {
nextCell.focusCell(true);
} else if (nextCell) {
return this.tryToFocusFullWidthRow(nextCell.getRowPosition(), backwards);
}
return _exists(nextCell);
}
/**
* called by the cell, when tab is pressed while editing.
* @return: RenderedCell when navigation successful, false if navigation should not be performed, otherwise null
*/
findNextCellToFocusOn(previousPosition, backwards, startEditing) {
let nextPosition = previousPosition;
const beans = this.beans;
const { cellNavigation, gos, focusSvc, rowRenderer, rangeSvc } = beans;
while (true) {
if (previousPosition !== nextPosition) {
previousPosition = nextPosition;
}
if (!backwards) {
nextPosition = this.getLastCellOfColSpan(nextPosition);
}
nextPosition = cellNavigation.getNextTabbedCell(nextPosition, backwards);
const userFunc = gos.getCallback("tabToNextCell");
if (_exists(userFunc)) {
const params = {
backwards,
editing: startEditing,
previousCellPosition: previousPosition,
nextCellPosition: nextPosition ? nextPosition : null
};
const userResult = userFunc(params);
if (userResult === true) {
nextPosition = previousPosition;
} else if (userResult === false) {
return false;
} else {
nextPosition = {
rowIndex: userResult.rowIndex,
column: userResult.column,
rowPinned: userResult.rowPinned
};
}
}
if (!nextPosition) {
return null;
}
if (nextPosition.rowIndex < 0) {
const headerLen = getFocusHeaderRowCount(beans);
focusSvc.focusHeaderPosition({
headerPosition: {
headerRowIndex: headerLen + nextPosition.rowIndex,
column: nextPosition.column
},
fromCell: true
});
return null;
}
const fullRowEdit = gos.get("editType") === "fullRow";
if (startEditing && !fullRowEdit) {
const cellIsEditable = this.isCellEditable(nextPosition);
if (!cellIsEditable) {
continue;
}
}
this.ensureCellVisible(nextPosition);
const nextCell = _getCellByPosition(beans, nextPosition);
if (!nextCell) {
const row = rowRenderer.getRowByPosition(nextPosition);
if (!row || !row.isFullWidth() || startEditing) {
continue;
}
return row;
}
if (cellNavigation.isSuppressNavigable(nextCell.column, nextCell.rowNode)) {
continue;
}
nextCell.setFocusedCellPosition(nextPosition);
rangeSvc?.setRangeToCell(nextPosition);
return nextCell;
}
}
isCellEditable(cell) {
const rowNode = this.lookupRowNodeForCell(cell);
if (rowNode) {
return cell.column.isCellEditable(rowNode);
}
return false;
}
lookupRowNodeForCell({ rowIndex, rowPinned }) {
const { pinnedRowModel, rowModel } = this.beans;
if (rowPinned === "top") {
return pinnedRowModel?.getPinnedTopRow(rowIndex);
}
if (rowPinned === "bottom") {
return pinnedRowModel?.getPinnedBottomRow(rowIndex);
}
return rowModel.getRow(rowIndex);
}
// we use index for rows, but column object for columns, as the next column (by index) might not
// be visible (header grouping) so it's not reliable, so using the column object instead.
navigateToNextCell(event, key, currentCell, allowUserOverride) {
let nextCell = currentCell;
let hitEdgeOfGrid = false;
const beans = this.beans;
const { cellNavigation, focusSvc, gos } = beans;
while (nextCell && (nextCell === currentCell || !this.isValidNavigateCell(nextCell))) {
if (gos.get("enableRtl")) {
if (key === KeyCode.LEFT) {
nextCell = this.getLastCellOfColSpan(nextCell);
}
} else if (key === KeyCode.RIGHT) {
nextCell = this.getLastCellOfColSpan(nextCell);
}
nextCell = cellNavigation.getNextCellToFocus(key, nextCell);
hitEdgeOfGrid = _missing(nextCell);
}
if (hitEdgeOfGrid && event && event.key === KeyCode.UP) {
nextCell = {
rowIndex: -1,
rowPinned: null,
column: currentCell.column
};
}
if (allowUserOverride) {
const userFunc = gos.getCallback("navigateToNextCell");
if (_exists(userFunc)) {
const params = {
key,
previousCellPosition: currentCell,
nextCellPosition: nextCell ? nextCell : null,
event
};
const userCell = userFunc(params);
if (_exists(userCell)) {
nextCell = {
rowPinned: userCell.rowPinned,
rowIndex: userCell.rowIndex,
column: userCell.column
};
} else {
nextCell = null;
}
}
}
if (!nextCell) {
return;
}
if (nextCell.rowIndex < 0) {
const headerLen = getFocusHeaderRowCount(beans);
focusSvc.focusHeaderPosition({
headerPosition: { headerRowIndex: headerLen + nextCell.rowIndex, column: currentCell.column },
event: event || void 0,
fromCell: true
});
return;
}
const normalisedPosition = this.getNormalisedPosition(nextCell);
if (normalisedPosition) {
this.focusPosition(normalisedPosition);
} else {
this.tryToFocusFullWidthRow(nextCell);
}
}
getNormalisedPosition(cellPosition) {
const isSpannedCell = !!this.beans.spannedRowRenderer?.getCellByPosition(cellPosition);
if (isSpannedCell) {
return cellPosition;
}
this.ensureCellVisible(cellPosition);
const cellCtrl = _getCellByPosition(this.beans, cellPosition);
if (!cellCtrl) {
return null;
}
cellPosition = cellCtrl.getFocusedCellPosition();
this.ensureCellVisible(cellPosition);
return cellPosition;
}
tryToFocusFullWidthRow(position, backwards) {
const { visibleCols, rowRenderer, focusSvc, eventSvc } = this.beans;
const displayedColumns = visibleCols.allCols;
const rowComp = rowRenderer.getRowByPosition(position);
if (!rowComp || !rowComp.isFullWidth()) {
return false;
}
const currentCellFocused = focusSvc.getFocusedCell();
const cellPosition = {
rowIndex: position.rowIndex,
rowPinned: position.rowPinned,
column: position.column || (backwards ? _last(displayedColumns) : displayedColumns[0])
};
this.focusPosition(cellPosition);
const fromBelow = backwards == null ? currentCellFocused != null && _isRowBefore(cellPosition, currentCellFocused) : backwards;
eventSvc.dispatchEvent({
type: "fullWidthRowFocused",
rowIndex: cellPosition.rowIndex,
rowPinned: cellPosition.rowPinned,
column: cellPosition.column,
isFullWidthCell: true,
fromBelow
});
return true;
}
focusPosition(cellPosition) {
const { focusSvc, rangeSvc } = this.beans;
focusSvc.setFocusedCell({
rowIndex: cellPosition.rowIndex,
column: cellPosition.column,
rowPinned: cellPosition.rowPinned,
forceBrowserFocus: true
});
rangeSvc?.setRangeToCell(cellPosition);
}
isValidNavigateCell(cell) {
const rowNode = _getRowNode(this.beans, cell);
return !!rowNode;
}
getLastCellOfColSpan(cell) {
const cellCtrl = _getCellByPosition(this.beans, cell);
if (!cellCtrl) {
return cell;
}
const colSpanningList = cellCtrl.getColSpanningList();
if (colSpanningList.length === 1) {
return cell;
}
return {
rowIndex: cell.rowIndex,
column: _last(colSpanningList),
rowPinned: cell.rowPinned
};
}
ensureCellVisible(gridCell) {
const isGroupStickyEnabled = _isGroupRowsSticky(this.gos);
const rowNode = this.beans.rowModel.getRow(gridCell.rowIndex);
const skipScrollToRow = isGroupStickyEnabled && rowNode?.sticky;
const { scrollFeature } = this.gridBodyCon;
if (!skipScrollToRow && _missing(gridCell.rowPinned)) {
scrollFeature.ensureIndexVisible(gridCell.rowIndex);
}
if (!gridCell.column.isPinned()) {
scrollFeature.ensureColumnVisible(gridCell.column);
}
}
};
function getVScroll(beans) {
return beans.ctrlsSvc.getScrollFeature().getVScrollPosition();
}
// packages/ag-grid-community/src/navigation/navigationModule.ts
var KeyboardNavigationModule = {
moduleName: "KeyboardNavigation",
version: VERSION,
beans: [NavigationService, CellNavigationService, HeaderNavigationService],
apiFunctions: {
getFocusedCell,
clearFocusedCell,
setFocusedCell,
setFocusedHeader,
tabToNextCell,
tabToPreviousCell
}
};
// packages/ag-grid-community/src/pagination/pageBoundsListener.ts
var PageBoundsListener = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "pageBoundsListener";
}
postConstruct() {
this.addManagedEventListeners({
modelUpdated: this.onModelUpdated.bind(this),
recalculateRowBounds: this.calculatePages.bind(this)
});
this.onModelUpdated();
}
onModelUpdated(modelUpdatedEvent) {
this.calculatePages();
this.eventSvc.dispatchEvent({
type: "paginationChanged",
animate: modelUpdatedEvent?.animate ?? false,
newData: modelUpdatedEvent?.newData ?? false,
newPage: modelUpdatedEvent?.newPage ?? false,
newPageSize: modelUpdatedEvent?.newPageSize ?? false,
keepRenderedRows: modelUpdatedEvent?.keepRenderedRows ?? false
});
}
calculatePages() {
const { pageBounds, pagination, rowModel } = this.beans;
if (pagination) {
pagination.calculatePages();
} else {
pageBounds.calculateBounds(0, rowModel.getRowCount() - 1);
}
}
};
// packages/ag-grid-community/src/pagination/pageBoundsService.ts
var PageBoundsService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "pageBounds";
this.pixelOffset = 0;
}
getFirstRow() {
return this.topRowBounds?.rowIndex ?? -1;
}
getLastRow() {
return this.bottomRowBounds?.rowIndex ?? -1;
}
getCurrentPageHeight() {
const { topRowBounds, bottomRowBounds } = this;
if (!topRowBounds || !bottomRowBounds) {
return 0;
}
return Math.max(bottomRowBounds.rowTop + bottomRowBounds.rowHeight - topRowBounds.rowTop, 0);
}
getCurrentPagePixelRange() {
const { topRowBounds, bottomRowBounds } = this;
const pageFirstPixel = topRowBounds?.rowTop ?? 0;
const pageLastPixel = bottomRowBounds ? bottomRowBounds.rowTop + bottomRowBounds.rowHeight : 0;
return { pageFirstPixel, pageLastPixel };
}
calculateBounds(topDisplayedRowIndex, bottomDisplayedRowIndex) {
const { rowModel } = this.beans;
const topRowBounds = rowModel.getRowBounds(topDisplayedRowIndex);
if (topRowBounds) {
topRowBounds.rowIndex = topDisplayedRowIndex;
}
this.topRowBounds = topRowBounds;
const bottomRowBounds = rowModel.getRowBounds(bottomDisplayedRowIndex);
if (bottomRowBounds) {
bottomRowBounds.rowIndex = bottomDisplayedRowIndex;
}
this.bottomRowBounds = bottomRowBounds;
this.calculatePixelOffset();
}
getPixelOffset() {
return this.pixelOffset;
}
calculatePixelOffset() {
const value = this.topRowBounds?.rowTop ?? 0;
if (this.pixelOffset === value) {
return;
}
this.pixelOffset = value;
this.eventSvc.dispatchEvent({ type: "paginationPixelOffsetChanged" });
}
};
// packages/ag-grid-community/src/pinnedColumns/pinnedColumnModule.css-GENERATED.ts
var pinnedColumnModuleCSS = (
/*css*/
`.ag-pinned-left-floating-bottom,.ag-pinned-left-floating-top,.ag-pinned-right-floating-bottom,.ag-pinned-right-floating-top{min-width:0;overflow:hidden;position:relative}.ag-pinned-left-sticky-top,.ag-pinned-right-sticky-top{height:100%;overflow:hidden;position:relative}.ag-sticky-bottom-full-width-container,.ag-sticky-top-full-width-container{height:100%;overflow:hidden;width:100%}.ag-pinned-left-header,.ag-pinned-right-header{display:inline-block;height:100%;overflow:hidden;position:relative}.ag-body-horizontal-scroll:not(.ag-scrollbar-invisible){.ag-horizontal-left-spacer:not(.ag-scroller-corner){border-right:var(--ag-pinned-column-border)}.ag-horizontal-right-spacer:not(.ag-scroller-corner){border-left:var(--ag-pinned-column-border)}}.ag-pinned-right-header{border-left:var(--ag-pinned-column-border)}.ag-pinned-left-header{border-right:var(--ag-pinned-column-border)}.ag-cell.ag-cell-first-right-pinned:not(.ag-cell-range-left,.ag-cell-range-single-cell,.ag-cell-focus:not(.ag-cell-range-selected):focus-within){border-left:var(--ag-pinned-column-border)}.ag-cell.ag-cell-last-left-pinned:not(.ag-cell-range-right,.ag-cell-range-single-cell,.ag-cell-focus:not(.ag-cell-range-selected):focus-within){border-right:var(--ag-pinned-column-border)}.ag-pinned-left-header .ag-header-cell-resize:after{left:calc(50% - var(--ag-header-column-resize-handle-width))}.ag-pinned-right-header .ag-header-cell-resize:after{left:50%}.ag-pinned-left-header .ag-header-cell-resize{right:-3px}.ag-pinned-right-header .ag-header-cell-resize{left:-3px}`
);
// packages/ag-grid-community/src/gridBodyComp/rowContainer/setPinnedWidthFeature.ts
var SetPinnedWidthFeature = class extends 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) {
_setDisplayed(element, displayed);
_setFixedWidth(element, width);
}
}
}
};
// packages/ag-grid-community/src/pinnedColumns/pinnedColumnService.ts
var PinnedColumnService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "pinnedCols";
}
postConstruct() {
this.beans.ctrlsSvc.whenReady(this, (p) => {
this.gridBodyCtrl = p.gridBodyCtrl;
});
const listener = this.checkContainerWidths.bind(this);
this.addManagedEventListeners({
displayedColumnsChanged: listener,
displayedColumnsWidthChanged: listener
});
this.addManagedPropertyListener("domLayout", listener);
}
checkContainerWidths() {
const { gos, visibleCols, eventSvc } = this.beans;
const printLayout = _isDomLayout(gos, "print");
const newLeftWidth = printLayout ? 0 : visibleCols.getColsLeftWidth();
const newRightWidth = printLayout ? 0 : visibleCols.getDisplayedColumnsRightWidth();
if (newLeftWidth != this.leftWidth) {
this.leftWidth = newLeftWidth;
eventSvc.dispatchEvent({ type: "leftPinnedWidthChanged" });
}
if (newRightWidth != this.rightWidth) {
this.rightWidth = newRightWidth;
eventSvc.dispatchEvent({ type: "rightPinnedWidthChanged" });
}
}
keepPinnedColumnsNarrowerThanViewport() {
const eBodyViewport = this.gridBodyCtrl.eBodyViewport;
const bodyWidth = _getInnerWidth(eBodyViewport);
if (bodyWidth <= 50) {
return;
}
const processedColumnsToRemove = this.getPinnedColumnsOverflowingViewport(bodyWidth - 50);
const processUnpinnedColumns = this.gos.getCallback("processUnpinnedColumns");
const { columns, hasLockedPinned } = processedColumnsToRemove;
let columnsToRemove = columns;
if (!columnsToRemove.length && !hasLockedPinned) {
return;
}
if (processUnpinnedColumns) {
const params = {
columns: columnsToRemove,
viewportWidth: bodyWidth
};
columnsToRemove = processUnpinnedColumns(params);
}
if (!columnsToRemove || !columnsToRemove.length) {
return;
}
columnsToRemove = columnsToRemove.filter((col) => !isRowNumberCol(col));
this.setColsPinned(columnsToRemove, null, "viewportSizeFeature");
}
createPinnedWidthFeature(isLeft, ...elements) {
return new SetPinnedWidthFeature(isLeft, elements);
}
setColsPinned(keys, pinned, source) {
const { colModel, colAnimation, visibleCols, gos } = this.beans;
if (!colModel.cols) {
return;
}
if (!keys?.length) {
return;
}
if (_isDomLayout(gos, "print")) {
_warn(37);
return;
}
colAnimation?.start();
let actualPinned;
if (pinned === true || pinned === "left") {
actualPinned = "left";
} else if (pinned === "right") {
actualPinned = "right";
} else {
actualPinned = null;
}
const updatedCols = [];
keys.forEach((key) => {
if (!key) {
return;
}
const column = colModel.getCol(key);
if (!column) {
return;
}
if (column.getPinned() !== actualPinned) {
this.setColPinned(column, actualPinned);
updatedCols.push(column);
}
});
if (updatedCols.length) {
visibleCols.refresh(source);
dispatchColumnPinnedEvent(this.eventSvc, updatedCols, source);
}
colAnimation?.finish();
}
initCol(column) {
const { pinned, initialPinned } = column.colDef;
if (pinned !== void 0) {
this.setColPinned(column, pinned);
} else {
this.setColPinned(column, initialPinned);
}
}
setColPinned(column, pinned) {
if (pinned === true || pinned === "left") {
column.pinned = "left";
} else if (pinned === "right") {
column.pinned = "right";
} else {
column.pinned = null;
}
column.dispatchStateUpdatedEvent("pinned");
}
setupHeaderPinnedWidth(ctrl) {
const { scrollVisibleSvc } = this.beans;
if (ctrl.pinned == null) {
return;
}
const pinningLeft = ctrl.pinned === "left";
const pinningRight = ctrl.pinned === "right";
ctrl.hidden = true;
const listener = () => {
const width = pinningLeft ? this.leftWidth : this.rightWidth;
if (width == null) {
return;
}
const hidden = width == 0;
const hiddenChanged = ctrl.hidden !== hidden;
const isRtl = this.gos.get("enableRtl");
const scrollbarWidth = scrollVisibleSvc.getScrollbarWidth();
const addPaddingForScrollbar = scrollVisibleSvc.verticalScrollShowing && (isRtl && pinningLeft || !isRtl && pinningRight);
const widthWithPadding = addPaddingForScrollbar ? width + scrollbarWidth : width;
ctrl.comp.setPinnedContainerWidth(`${widthWithPadding}px`);
ctrl.comp.setDisplayed(!hidden);
if (hiddenChanged) {
ctrl.hidden = hidden;
ctrl.refresh();
}
};
ctrl.addManagedEventListeners({
leftPinnedWidthChanged: listener,
rightPinnedWidthChanged: listener,
scrollVisibilityChanged: listener,
scrollbarWidthChanged: listener
});
}
getHeaderResizeDiff(diff, column) {
const pinned = column.getPinned();
if (pinned) {
const { leftWidth, rightWidth } = this;
const bodyWidth = _getInnerWidth(this.beans.ctrlsSvc.getGridBodyCtrl().eBodyViewport) - 50;
if (leftWidth + rightWidth + diff > bodyWidth) {
if (bodyWidth > leftWidth + rightWidth) {
diff = bodyWidth - leftWidth - rightWidth;
} else {
return 0;
}
}
}
return diff;
}
getPinnedColumnsOverflowingViewport(viewportWidth) {
const pinnedRightWidth = this.rightWidth ?? 0;
const pinnedLeftWidth = this.leftWidth ?? 0;
const totalPinnedWidth = pinnedRightWidth + pinnedLeftWidth;
let hasLockedPinned = false;
if (totalPinnedWidth < viewportWidth) {
return { columns: [], hasLockedPinned };
}
const { visibleCols } = this.beans;
const pinnedLeftColumns = [...visibleCols.leftCols];
const pinnedRightColumns = [...visibleCols.rightCols];
let indexRight = 0;
let indexLeft = 0;
const totalWidthRemoved = 0;
const columnsToRemove = [];
let spaceNecessary = totalPinnedWidth - totalWidthRemoved - viewportWidth;
while ((indexLeft < pinnedLeftColumns.length || indexRight < pinnedRightColumns.length) && spaceNecessary > 0) {
if (indexRight < pinnedRightColumns.length) {
const currentColumn = pinnedRightColumns[indexRight++];
if (currentColumn.colDef.lockPinned) {
hasLockedPinned = true;
continue;
}
spaceNecessary -= currentColumn.getActualWidth();
columnsToRemove.push(currentColumn);
}
if (indexLeft < pinnedLeftColumns.length && spaceNecessary > 0) {
const currentColumn = pinnedLeftColumns[indexLeft++];
if (currentColumn.colDef.lockPinned) {
hasLockedPinned = true;
continue;
}
spaceNecessary -= currentColumn.getActualWidth();
columnsToRemove.push(currentColumn);
}
}
return { columns: columnsToRemove, hasLockedPinned };
}
};
// packages/ag-grid-community/src/pinnedColumns/pinnedColumnModule.ts
var PinnedColumnModule = {
moduleName: "PinnedColumn",
version: VERSION,
beans: [PinnedColumnService],
css: [pinnedColumnModuleCSS]
};
// packages/ag-grid-community/src/rendering/ariaAnnouncementService.ts
var AriaAnnouncementService = class extends BeanStub {
constructor() {
super();
this.beanName = "ariaAnnounce";
this.descriptionContainer = null;
this.pendingAnnouncements = /* @__PURE__ */ new Map();
this.lastAnnouncement = "";
this.updateAnnouncement = _debounce(this, this.updateAnnouncement.bind(this), 200);
}
postConstruct() {
const beans = this.beans;
const eDocument = _getDocument(beans);
const div = this.descriptionContainer = eDocument.createElement("div");
div.classList.add("ag-aria-description-container");
_setAriaLive(div, "polite");
_setAriaRelevant(div, "additions text");
_setAriaAtomic(div, true);
beans.eGridDiv.appendChild(div);
}
/**
* @param key used for debouncing calls
*/
announceValue(value, key) {
this.pendingAnnouncements.set(key, value);
this.updateAnnouncement();
}
updateAnnouncement() {
if (!this.descriptionContainer) {
return;
}
const value = Array.from(this.pendingAnnouncements.values()).join(". ");
this.pendingAnnouncements.clear();
this.descriptionContainer.textContent = "";
setTimeout(() => {
if (this.isAlive() && this.descriptionContainer) {
let valueToAnnounce = value;
if (this.lastAnnouncement === valueToAnnounce) {
valueToAnnounce = `${valueToAnnounce}.`;
}
this.lastAnnouncement = valueToAnnounce;
this.descriptionContainer.textContent = valueToAnnounce;
}
}, 50);
}
destroy() {
super.destroy();
const { descriptionContainer } = this;
if (descriptionContainer) {
_clearElement(descriptionContainer);
descriptionContainer.parentElement?.removeChild(descriptionContainer);
}
this.descriptionContainer = null;
this.pendingAnnouncements.clear();
}
};
// packages/ag-grid-community/src/rendering/ariaModule.ts
var AriaModule = {
moduleName: "Aria",
version: VERSION,
beans: [AriaAnnouncementService]
};
// packages/ag-grid-community/src/rendering/overlays/overlayApi.ts
function showLoadingOverlay(beans) {
beans.overlays?.showLoadingOverlay();
}
function showNoRowsOverlay(beans) {
beans.overlays?.showNoRowsOverlay();
}
function hideOverlay(beans) {
beans.overlays?.hideOverlay();
}
// packages/ag-grid-community/src/rendering/overlays/overlayWrapperComponent.css-GENERATED.ts
var overlayWrapperComponentCSS = (
/*css*/
`.ag-overlay{inset:0;pointer-events:none;position:absolute;z-index:2}.ag-overlay-panel,.ag-overlay-wrapper{display:flex;height:100%;width:100%}.ag-overlay-wrapper{align-items:center;flex:none;justify-content:center;text-align:center}.ag-overlay-loading-wrapper{pointer-events:all}.ag-overlay-loading-center{background:var(--ag-background-color);border:1px solid var(--ag-border-color);border-radius:var(--ag-border-radius);box-shadow:var(--ag-popup-shadow);padding:var(--ag-spacing)}`
);
// packages/ag-grid-community/src/rendering/overlays/overlayWrapperComponent.ts
var OverlayWrapperComponent = class extends Component {
constructor() {
super(
/* html */
`
`
);
this.eOverlayWrapper = RefPlaceholder;
this.activePromise = null;
this.activeOverlay = null;
this.updateListenerDestroyFunc = null;
this.activeCssClass = null;
this.elToFocusAfter = null;
this.registerCSS(overlayWrapperComponentCSS);
}
handleKeyDown(e) {
if (e.key !== KeyCode.TAB || e.defaultPrevented || _isStopPropagationForAgGrid(e)) {
return;
}
const beans = this.beans;
const nextEl = _findNextFocusableElement(beans, this.eOverlayWrapper, false, e.shiftKey);
if (nextEl) {
return;
}
let isFocused = false;
if (e.shiftKey) {
isFocused = beans.focusSvc.focusGridView({
column: _last(beans.visibleCols.allCols),
backwards: true,
canFocusOverlay: false
});
} else {
isFocused = _focusNextGridCoreContainer(beans, false);
}
if (isFocused) {
e.preventDefault();
}
}
updateLayoutClasses(cssClass, params) {
const overlayWrapperClassList = this.eOverlayWrapper.classList;
const { AUTO_HEIGHT, NORMAL, PRINT } = LayoutCssClasses;
overlayWrapperClassList.toggle(AUTO_HEIGHT, params.autoHeight);
overlayWrapperClassList.toggle(NORMAL, params.normal);
overlayWrapperClassList.toggle(PRINT, params.print);
}
postConstruct() {
this.createManagedBean(new LayoutFeature(this));
this.setDisplayed(false, { skipAriaHidden: true });
this.beans.overlays.setOverlayWrapperComp(this);
this.addManagedElementListeners(this.getFocusableElement(), { keydown: this.handleKeyDown.bind(this) });
}
setWrapperTypeClass(overlayWrapperCssClass) {
const overlayWrapperClassList = this.eOverlayWrapper.classList;
if (this.activeCssClass) {
overlayWrapperClassList.toggle(this.activeCssClass, false);
}
this.activeCssClass = overlayWrapperCssClass;
overlayWrapperClassList.toggle(overlayWrapperCssClass, true);
}
showOverlay(overlayComponentPromise, overlayWrapperCssClass, exclusive, gridOption) {
this.setWrapperTypeClass(overlayWrapperCssClass);
this.destroyActiveOverlay();
this.elToFocusAfter = null;
this.activePromise = overlayComponentPromise;
if (!overlayComponentPromise) {
return;
}
this.setDisplayed(true, { skipAriaHidden: true });
if (exclusive && this.isGridFocused()) {
const activeElement = _getActiveDomElement(this.beans);
if (activeElement && !_isNothingFocused(this.beans)) {
this.elToFocusAfter = activeElement;
}
}
overlayComponentPromise.then((comp) => {
if (this.activePromise !== overlayComponentPromise) {
if (this.activeOverlay !== comp) {
this.destroyBean(comp);
comp = null;
}
return;
}
this.activePromise = null;
if (!comp) {
return;
}
if (this.activeOverlay !== comp) {
this.eOverlayWrapper.appendChild(comp.getGui());
this.activeOverlay = comp;
if (gridOption) {
const component = comp;
this.updateListenerDestroyFunc = this.addManagedPropertyListener(gridOption, ({ currentValue }) => {
component.refresh?.(_addGridCommonParams(this.gos, { ...currentValue ?? {} }));
});
}
}
if (exclusive && this.isGridFocused()) {
_focusInto(this.eOverlayWrapper);
}
});
}
updateOverlayWrapperPaddingTop(padding) {
this.eOverlayWrapper.style.setProperty("padding-top", `${padding}px`);
}
destroyActiveOverlay() {
this.activePromise = null;
const activeOverlay = this.activeOverlay;
if (!activeOverlay) {
return;
}
let elementToFocus = this.elToFocusAfter;
this.activeOverlay = null;
this.elToFocusAfter = null;
if (elementToFocus && !this.isGridFocused()) {
elementToFocus = null;
}
const updateListenerDestroyFunc = this.updateListenerDestroyFunc;
if (updateListenerDestroyFunc) {
updateListenerDestroyFunc();
this.updateListenerDestroyFunc = null;
}
this.destroyBean(activeOverlay);
_clearElement(this.eOverlayWrapper);
elementToFocus?.focus?.({ preventScroll: true });
}
hideOverlay() {
this.destroyActiveOverlay();
this.setDisplayed(false, { skipAriaHidden: true });
}
isGridFocused() {
const activeEl = _getActiveDomElement(this.beans);
return !!activeEl && this.beans.eGridDiv.contains(activeEl);
}
destroy() {
this.elToFocusAfter = null;
this.destroyActiveOverlay();
this.beans.overlays.setOverlayWrapperComp(void 0);
super.destroy();
}
};
var OverlayWrapperSelector = {
selector: "AG-OVERLAY-WRAPPER",
component: OverlayWrapperComponent
};
// packages/ag-grid-community/src/rendering/overlays/overlayService.ts
var OverlayService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "overlays";
this.state = 0 /* Hidden */;
this.showInitialOverlay = true;
this.wrapperPadding = 0;
}
postConstruct() {
this.isClientSide = _isClientSideRowModel(this.gos);
this.isServerSide = !this.isClientSide && _isServerSideRowModel(this.gos);
const updateOverlayVisibility = () => this.updateOverlayVisibility();
this.addManagedEventListeners({
newColumnsLoaded: updateOverlayVisibility,
rowDataUpdated: updateOverlayVisibility,
gridSizeChanged: this.refreshWrapperPadding.bind(this),
rowCountReady: () => {
this.showInitialOverlay = false;
this.updateOverlayVisibility();
}
});
this.addManagedPropertyListener("loading", updateOverlayVisibility);
}
setOverlayWrapperComp(overlayWrapperComp) {
this.eWrapper = overlayWrapperComp;
this.updateOverlayVisibility();
}
/** Returns true if the overlay is visible. */
isVisible() {
return this.state !== 0 /* Hidden */ && !!this.eWrapper;
}
/** Returns true if the overlay is visible and is exclusive (popup over the grid) */
isExclusive() {
return this.state === 1 /* Loading */ && !!this.eWrapper;
}
showLoadingOverlay() {
this.showInitialOverlay = false;
const gos = this.gos;
const loading = gos.get("loading");
if (!loading && (loading !== void 0 || gos.get("suppressLoadingOverlay"))) {
return;
}
this.doShowLoadingOverlay();
}
showNoRowsOverlay() {
this.showInitialOverlay = false;
const gos = this.gos;
if (gos.get("loading") || gos.get("suppressNoRowsOverlay")) {
return;
}
this.doShowNoRowsOverlay();
}
hideOverlay() {
this.showInitialOverlay = false;
if (this.gos.get("loading")) {
_warn(99);
return;
}
this.doHideOverlay();
}
getOverlayWrapperSelector() {
return OverlayWrapperSelector;
}
getOverlayWrapperCompClass() {
return OverlayWrapperComponent;
}
updateOverlayVisibility() {
if (!this.eWrapper) {
this.state = 0 /* Hidden */;
return;
}
const {
state,
isClientSide,
isServerSide,
beans: { gos, colModel, rowModel }
} = this;
let loading = this.gos.get("loading");
if (loading !== void 0) {
this.showInitialOverlay = false;
}
if (this.showInitialOverlay && loading === void 0 && !gos.get("suppressLoadingOverlay")) {
loading = !gos.get("columnDefs") || !colModel.ready || !gos.get("rowData") && isClientSide;
}
if (loading) {
if (state !== 1 /* Loading */) {
this.doShowLoadingOverlay();
}
} else {
this.showInitialOverlay = false;
if (isClientSide && rowModel.isEmpty() && !gos.get("suppressNoRowsOverlay")) {
if (state !== 2 /* NoRows */) {
this.doShowNoRowsOverlay();
}
} else if (state === 1 /* Loading */ || !isServerSide && state !== 0 /* Hidden */) {
this.doHideOverlay();
}
}
}
doShowLoadingOverlay() {
if (!this.eWrapper) {
return;
}
this.state = 1 /* Loading */;
this.showOverlay(
_getLoadingOverlayCompDetails(this.beans.userCompFactory, _addGridCommonParams(this.gos, {})),
"ag-overlay-loading-wrapper",
"loadingOverlayComponentParams"
);
this.updateExclusive();
}
doShowNoRowsOverlay() {
if (!this.eWrapper) {
return;
}
this.state = 2 /* NoRows */;
this.showOverlay(
_getNoRowsOverlayCompDetails(this.beans.userCompFactory, _addGridCommonParams(this.gos, {})),
"ag-overlay-no-rows-wrapper",
"noRowsOverlayComponentParams"
);
this.updateExclusive();
}
doHideOverlay() {
if (!this.eWrapper) {
return;
}
this.state = 0 /* Hidden */;
this.eWrapper.hideOverlay();
this.updateExclusive();
}
showOverlay(compDetails, wrapperCssClass, gridOption) {
const promise = compDetails?.newAgStackInstance() ?? null;
this.eWrapper?.showOverlay(promise, wrapperCssClass, this.isExclusive(), gridOption);
this.refreshWrapperPadding();
}
updateExclusive() {
const wasExclusive = this.exclusive;
this.exclusive = this.isExclusive();
if (this.exclusive !== wasExclusive) {
this.eventSvc.dispatchEvent({
type: "overlayExclusiveChanged"
});
}
}
refreshWrapperPadding() {
const eWrapper = this.eWrapper;
if (!eWrapper) {
return;
}
let newPadding = 0;
if (this.state === 2 /* NoRows */) {
const headerCtrl = this.beans.ctrlsSvc.get("gridHeaderCtrl");
const headerHeight = headerCtrl?.headerHeight || 0;
newPadding = headerHeight;
} else if (this.wrapperPadding !== 0) {
newPadding = 0;
}
if (this.wrapperPadding === newPadding) {
return;
}
this.wrapperPadding = newPadding;
eWrapper.updateOverlayWrapperPaddingTop(newPadding);
}
};
// packages/ag-grid-community/src/rendering/overlays/overlayModule.ts
var OverlayModule = {
moduleName: "Overlay",
version: VERSION,
userComponents: {
agLoadingOverlay: LoadingOverlayComponent2,
agNoRowsOverlay: NoRowsOverlayComponent2
},
apiFunctions: {
showLoadingOverlay,
showNoRowsOverlay,
hideOverlay
},
beans: [OverlayService]
};
// packages/ag-grid-community/src/rendering/rowContainerHeightService.ts
var RowContainerHeightService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "rowContainerHeight";
// the scrollY position
this.scrollY = 0;
// how tall the body is
this.uiBodyHeight = 0;
}
postConstruct() {
this.addManagedEventListeners({ bodyHeightChanged: this.updateOffset.bind(this) });
this.maxDivHeight = _getMaxDivHeight();
_logIfDebug(this.gos, "RowContainerHeightService - maxDivHeight = " + this.maxDivHeight);
}
updateOffset() {
if (!this.stretching) {
return;
}
const newScrollY = this.beans.ctrlsSvc.getScrollFeature().getVScrollPosition().top;
const newBodyHeight = this.getUiBodyHeight();
const atLeastOneChanged = newScrollY !== this.scrollY || newBodyHeight !== this.uiBodyHeight;
if (atLeastOneChanged) {
this.scrollY = newScrollY;
this.uiBodyHeight = newBodyHeight;
this.calculateOffset();
}
}
calculateOffset() {
this.setUiContainerHeight(this.maxDivHeight);
this.pixelsToShave = this.modelHeight - this.uiContainerHeight;
this.maxScrollY = this.uiContainerHeight - this.uiBodyHeight;
const scrollPercent = this.scrollY / this.maxScrollY;
const divStretchOffset = scrollPercent * this.pixelsToShave;
_logIfDebug(
this.gos,
`RowContainerHeightService - Div Stretch Offset = ${divStretchOffset} (${this.pixelsToShave} * ${scrollPercent})`
);
this.setDivStretchOffset(divStretchOffset);
}
setUiContainerHeight(height) {
if (height !== this.uiContainerHeight) {
this.uiContainerHeight = height;
this.eventSvc.dispatchEvent({ type: "rowContainerHeightChanged" });
}
}
clearOffset() {
this.setUiContainerHeight(this.modelHeight);
this.pixelsToShave = 0;
this.setDivStretchOffset(0);
}
setDivStretchOffset(newOffset) {
const newOffsetFloor = typeof newOffset === "number" ? Math.floor(newOffset) : null;
if (this.divStretchOffset === newOffsetFloor) {
return;
}
this.divStretchOffset = newOffsetFloor;
this.eventSvc.dispatchEvent({ type: "heightScaleChanged" });
}
setModelHeight(modelHeight) {
this.modelHeight = modelHeight;
this.stretching = modelHeight != null && // null happens when in print layout
this.maxDivHeight > 0 && modelHeight > this.maxDivHeight;
if (this.stretching) {
this.calculateOffset();
} else {
this.clearOffset();
}
}
getRealPixelPosition(modelPixel) {
return modelPixel - this.divStretchOffset;
}
getUiBodyHeight() {
const pos = this.beans.ctrlsSvc.getScrollFeature().getVScrollPosition();
return pos.bottom - pos.top;
}
getScrollPositionForPixel(rowTop) {
if (this.pixelsToShave <= 0) {
return rowTop;
}
const modelMaxScroll = this.modelHeight - this.getUiBodyHeight();
const scrollPercent = rowTop / modelMaxScroll;
const scrollPixel = this.maxScrollY * scrollPercent;
return scrollPixel;
}
};
// packages/ag-grid-community/src/rendering/rowRenderer.ts
var ROW_ANIMATION_TIMEOUT = 400;
var RowRenderer = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "rowRenderer";
this.destroyFuncsForColumnListeners = [];
// map of row ids to row objects. keeps track of which elements
// are rendered for which rows in the dom.
this.rowCtrlsByRowIndex = {};
this.zombieRowCtrls = {};
this.allRowCtrls = [];
this.topRowCtrls = [];
this.bottomRowCtrls = [];
// we only allow one refresh at a time, otherwise the internal memory structure here
// will get messed up. this can happen if the user has a cellRenderer, and inside the
// renderer they call an API method that results in another pass of the refresh,
// then it will be trying to draw rows in the middle of a refresh.
this.refreshInProgress = false;
this.dataFirstRenderedFired = false;
this.setupRangeSelectionListeners = () => {
const onCellSelectionChanged = () => {
this.getAllCellCtrls().forEach((cellCtrl) => cellCtrl.onCellSelectionChanged());
};
const onColumnMovedPinnedVisible = () => {
this.getAllCellCtrls().forEach((cellCtrl) => cellCtrl.updateRangeBordersIfRangeCount());
};
const addCellSelectionListeners = () => {
this.eventSvc.addEventListener("cellSelectionChanged", onCellSelectionChanged);
this.eventSvc.addEventListener("columnMoved", onColumnMovedPinnedVisible);
this.eventSvc.addEventListener("columnPinned", onColumnMovedPinnedVisible);
this.eventSvc.addEventListener("columnVisible", onColumnMovedPinnedVisible);
};
const removeCellSelectionListeners = () => {
this.eventSvc.removeEventListener("cellSelectionChanged", onCellSelectionChanged);
this.eventSvc.removeEventListener("columnMoved", onColumnMovedPinnedVisible);
this.eventSvc.removeEventListener("columnPinned", onColumnMovedPinnedVisible);
this.eventSvc.removeEventListener("columnVisible", onColumnMovedPinnedVisible);
};
this.addDestroyFunc(() => removeCellSelectionListeners());
this.addManagedPropertyListeners(["enableRangeSelection", "cellSelection"], () => {
const isEnabled = _isCellSelectionEnabled(this.gos);
if (isEnabled) {
addCellSelectionListeners();
} else {
removeCellSelectionListeners();
}
});
const cellSelectionEnabled = _isCellSelectionEnabled(this.gos);
if (cellSelectionEnabled) {
addCellSelectionListeners();
}
};
}
wireBeans(beans) {
this.pageBounds = beans.pageBounds;
this.colModel = beans.colModel;
this.pinnedRowModel = beans.pinnedRowModel;
this.rowModel = beans.rowModel;
this.focusSvc = beans.focusSvc;
this.rowContainerHeight = beans.rowContainerHeight;
this.ctrlsSvc = beans.ctrlsSvc;
}
postConstruct() {
this.ctrlsSvc.whenReady(this, (p) => {
this.gridBodyCtrl = p.gridBodyCtrl;
this.initialise();
});
}
initialise() {
this.addManagedEventListeners({
paginationChanged: this.onPageLoaded.bind(this),
pinnedRowDataChanged: this.onPinnedRowDataChanged.bind(this),
displayedColumnsChanged: this.onDisplayedColumnsChanged.bind(this),
bodyScroll: this.onBodyScroll.bind(this),
bodyHeightChanged: this.redraw.bind(this, {})
});
this.addManagedPropertyListeners(["domLayout", "embedFullWidthRows"], () => this.onDomLayoutChanged());
this.addManagedPropertyListeners(["suppressMaxRenderedRowRestriction", "rowBuffer"], () => this.redraw());
this.addManagedPropertyListener("suppressCellFocus", (e) => this.onSuppressCellFocusChanged(e.currentValue));
this.addManagedPropertyListeners(
[
"groupSuppressBlankHeader",
"getBusinessKeyForNode",
"fullWidthCellRenderer",
"fullWidthCellRendererParams",
"suppressStickyTotalRow",
"groupRowRenderer",
"groupRowRendererParams",
// maybe only needs to refresh FW rows...
"loadingCellRenderer",
"loadingCellRendererParams",
"detailCellRenderer",
"detailCellRendererParams",
"enableRangeSelection",
"enableCellTextSelection"
],
() => this.redrawRows()
);
this.addManagedPropertyListener("cellSelection", ({ currentValue, previousValue }) => {
if (!previousValue && currentValue || previousValue && !currentValue) {
this.redrawRows();
}
});
const { stickyRowSvc, gos } = this.beans;
if (stickyRowSvc) {
this.stickyRowFeature = stickyRowSvc.createStickyRowFeature(
this,
this.createRowCon.bind(this),
this.destroyRowCtrls.bind(this)
);
} else {
const gridBodyCtrl = this.gridBodyCtrl;
gridBodyCtrl.setStickyTopHeight(0);
gridBodyCtrl.setStickyBottomHeight(0);
}
this.registerCellEventListeners();
this.initialiseCache();
this.printLayout = _isDomLayout(gos, "print");
this.embedFullWidthRows = this.printLayout || gos.get("embedFullWidthRows");
this.redrawAfterModelUpdate();
}
initialiseCache() {
if (this.gos.get("keepDetailRows")) {
const countProp = this.getKeepDetailRowsCount();
const count = countProp != null ? countProp : 3;
this.cachedRowCtrls = new RowCtrlCache(count);
}
}
getKeepDetailRowsCount() {
return this.gos.get("keepDetailRowsCount");
}
getStickyTopRowCtrls() {
return this.stickyRowFeature?.stickyTopRowCtrls ?? [];
}
getStickyBottomRowCtrls() {
return this.stickyRowFeature?.stickyBottomRowCtrls ?? [];
}
updateAllRowCtrls() {
const liveList = Object.values(this.rowCtrlsByRowIndex);
const zombieList = Object.values(this.zombieRowCtrls);
const cachedList = this.cachedRowCtrls?.getEntries() ?? [];
if (zombieList.length > 0 || cachedList.length > 0) {
this.allRowCtrls = [...liveList, ...zombieList, ...cachedList];
} else {
this.allRowCtrls = liveList;
}
}
onCellFocusChanged(event) {
this.getAllCellCtrls().forEach((cellCtrl) => cellCtrl.onCellFocused(event));
this.getFullWidthRowCtrls().forEach((rowCtrl) => rowCtrl.onFullWidthRowFocused(event));
}
onSuppressCellFocusChanged(suppressCellFocus) {
this.getAllCellCtrls().forEach((cellCtrl) => cellCtrl.onSuppressCellFocusChanged(suppressCellFocus));
this.getFullWidthRowCtrls().forEach((rowCtrl) => rowCtrl.onSuppressCellFocusChanged(suppressCellFocus));
}
// in a clean design, each cell would register for each of these events. however when scrolling, all the cells
// registering and de-registering for events is a performance bottleneck. so we register here once and inform
// all active cells.
registerCellEventListeners() {
this.addManagedEventListeners({
cellFocused: (event) => {
this.onCellFocusChanged(event);
},
cellFocusCleared: () => this.onCellFocusChanged(),
flashCells: (event) => {
const { cellFlashSvc } = this.beans;
if (cellFlashSvc) {
this.getAllCellCtrls().forEach((cellCtrl) => cellFlashSvc.onFlashCells(cellCtrl, event));
}
},
columnHoverChanged: () => {
this.getAllCellCtrls().forEach((cellCtrl) => cellCtrl.onColumnHover());
},
displayedColumnsChanged: () => {
this.getAllCellCtrls().forEach((cellCtrl) => cellCtrl.onDisplayedColumnsChanged());
},
displayedColumnsWidthChanged: () => {
if (this.printLayout) {
this.getAllCellCtrls().forEach((cellCtrl) => cellCtrl.onLeftChanged());
}
}
});
this.setupRangeSelectionListeners();
this.refreshListenersToColumnsForCellComps();
this.addManagedEventListeners({
gridColumnsChanged: this.refreshListenersToColumnsForCellComps.bind(this)
});
this.addDestroyFunc(this.removeGridColumnListeners.bind(this));
}
// executes all functions in destroyFuncsForColumnListeners and then clears the list
removeGridColumnListeners() {
this.destroyFuncsForColumnListeners.forEach((func) => func());
this.destroyFuncsForColumnListeners.length = 0;
}
// this function adds listeners onto all the grid columns, which are the column that we could have cellComps for.
// when the grid columns change, we add listeners again. in an ideal design, each CellComp would just register to
// the column it belongs to on creation, however this was a bottleneck with the number of cells, so do it here
// once instead.
refreshListenersToColumnsForCellComps() {
this.removeGridColumnListeners();
const cols = this.colModel.getCols();
cols.forEach((col) => {
const forEachCellWithThisCol = (callback) => {
this.getAllCellCtrls().forEach((cellCtrl) => {
if (cellCtrl.column === col) {
callback(cellCtrl);
}
});
};
const leftChangedListener = () => {
forEachCellWithThisCol((cellCtrl) => cellCtrl.onLeftChanged());
};
const widthChangedListener = () => {
forEachCellWithThisCol((cellCtrl) => cellCtrl.onWidthChanged());
};
const firstRightPinnedChangedListener = () => {
forEachCellWithThisCol((cellCtrl) => cellCtrl.onFirstRightPinnedChanged());
};
const lastLeftPinnedChangedListener = () => {
forEachCellWithThisCol((cellCtrl) => cellCtrl.onLastLeftPinnedChanged());
};
const colDefChangedListener = () => {
forEachCellWithThisCol((cellCtrl) => cellCtrl.onColDefChanged());
};
col.__addEventListener("leftChanged", leftChangedListener);
col.__addEventListener("widthChanged", widthChangedListener);
col.__addEventListener("firstRightPinnedChanged", firstRightPinnedChangedListener);
col.__addEventListener("lastLeftPinnedChanged", lastLeftPinnedChangedListener);
col.__addEventListener("colDefChanged", colDefChangedListener);
this.destroyFuncsForColumnListeners.push(() => {
col.__removeEventListener("leftChanged", leftChangedListener);
col.__removeEventListener("widthChanged", widthChangedListener);
col.__removeEventListener("firstRightPinnedChanged", firstRightPinnedChangedListener);
col.__removeEventListener("lastLeftPinnedChanged", lastLeftPinnedChangedListener);
col.__removeEventListener("colDefChanged", colDefChangedListener);
});
});
}
onDomLayoutChanged() {
const printLayout = _isDomLayout(this.gos, "print");
const embedFullWidthRows = printLayout || this.gos.get("embedFullWidthRows");
const destroyRows = embedFullWidthRows !== this.embedFullWidthRows || this.printLayout !== printLayout;
this.printLayout = printLayout;
this.embedFullWidthRows = embedFullWidthRows;
if (destroyRows) {
this.redrawAfterModelUpdate({ domLayoutChanged: true });
}
}
// for row models that have datasources, when we update the datasource, we need to force the rowRenderer
// to redraw all rows. otherwise the old rows from the old datasource will stay displayed.
datasourceChanged() {
this.firstRenderedRow = 0;
this.lastRenderedRow = -1;
const rowIndexesToRemove = Object.keys(this.rowCtrlsByRowIndex);
this.removeRowCtrls(rowIndexesToRemove);
}
onPageLoaded(event) {
const params = {
recycleRows: event.keepRenderedRows,
animate: event.animate,
newData: event.newData,
newPage: event.newPage,
// because this is a model updated event (not pinned rows), we
// can skip updating the pinned rows. this is needed so that if user
// is doing transaction updates, the pinned rows are not getting constantly
// trashed - or editing cells in pinned rows are not refreshed and put into read mode
onlyBody: true
};
this.redrawAfterModelUpdate(params);
}
/**
* @param column AgColumn
* @returns An array with HTMLElement for every cell of the column passed as param.
* If the cell is spanning across multiple columns, it only returns the html element
* if the column passed is the first column of the span (used for auto width calculation).
*/
getAllCellsNotSpanningForColumn(column) {
const res = [];
this.getAllRowCtrls().forEach((rowCtrl) => {
const eCell = rowCtrl.getCellCtrl(column, true)?.eGui;
if (eCell) {
res.push(eCell);
}
});
return res;
}
refreshFloatingRowComps() {
this.refreshFloatingRows(this.topRowCtrls, "top");
this.refreshFloatingRows(this.bottomRowCtrls, "bottom");
}
/**
* Determines which row controllers need to be destroyed and re-created vs which ones can
* be re-used.
*
* This is operation is to pinned/floating rows as `this.recycleRows` is to normal/body rows.
*
* All `RowCtrl` instances in `rowCtrls` that don't correspond to `RowNode` instances in `rowNodes` are destroyed.
* All `RowNode` instances in `rowNodes` that don't correspond to `RowCtrl` instances in `rowCtrls` are created.
* All instances in `rowCtrls` must be in the same order as their corresponding nodes in `rowNodes`.
*
* @param rowCtrls The list of existing row controllers
* @param rowNodes The canonical list of row nodes that should have associated controllers
*/
refreshFloatingRows(rowCtrls, floating) {
const { pinnedRowModel, beans, printLayout } = this;
const rowCtrlMap = Object.fromEntries(rowCtrls.map((ctrl) => [ctrl.rowNode.id, ctrl]));
pinnedRowModel?.forEachPinnedRow(floating, (node, i) => {
const rowCtrl = rowCtrls[i];
const rowCtrlDoesNotExist = rowCtrl && pinnedRowModel.getPinnedRowById(rowCtrl.rowNode.id, floating) === void 0;
if (rowCtrlDoesNotExist) {
rowCtrl.destroyFirstPass();
rowCtrl.destroySecondPass();
}
if (node.id in rowCtrlMap) {
rowCtrls[i] = rowCtrlMap[node.id];
delete rowCtrlMap[node.id];
} else {
rowCtrls[i] = new RowCtrl(node, beans, false, false, printLayout);
}
});
const rowNodeCount = (floating === "top" ? pinnedRowModel?.getPinnedTopRowCount() : pinnedRowModel?.getPinnedBottomRowCount()) ?? 0;
rowCtrls.length = rowNodeCount;
}
onPinnedRowDataChanged() {
const params = {
recycleRows: true
};
this.redrawAfterModelUpdate(params);
}
redrawRow(rowNode, suppressEvent = false) {
if (rowNode.sticky) {
this.stickyRowFeature?.refreshStickyNode(rowNode);
} else if (this.cachedRowCtrls?.has(rowNode)) {
this.cachedRowCtrls.removeRow(rowNode);
return;
} else {
const destroyAndRecreateCtrl = (dataStruct) => {
const ctrl = dataStruct[rowNode.rowIndex];
if (!ctrl) {
return;
}
if (ctrl.rowNode !== rowNode) {
return;
}
ctrl.destroyFirstPass();
ctrl.destroySecondPass();
dataStruct[rowNode.rowIndex] = this.createRowCon(rowNode, false, false);
};
switch (rowNode.rowPinned) {
case "top":
destroyAndRecreateCtrl(this.topRowCtrls);
break;
case "bottom":
destroyAndRecreateCtrl(this.bottomRowCtrls);
break;
default:
destroyAndRecreateCtrl(this.rowCtrlsByRowIndex);
this.updateAllRowCtrls();
}
}
if (!suppressEvent) {
this.dispatchDisplayedRowsChanged(false);
}
}
redrawRows(rowNodes) {
const partialRefresh = rowNodes != null;
if (partialRefresh) {
rowNodes?.forEach((node) => this.redrawRow(node, true));
this.dispatchDisplayedRowsChanged(false);
return;
}
this.redrawAfterModelUpdate();
}
getCellToRestoreFocusToAfterRefresh(params) {
const focusedCell = params?.suppressKeepFocus ? null : this.focusSvc.getFocusCellToUseAfterRefresh();
if (focusedCell == null) {
return null;
}
const activeElement = _getActiveDomElement(this.beans);
const cellDomData = _getDomData(this.gos, activeElement, DOM_DATA_KEY_CELL_CTRL);
const rowDomData = _getDomData(this.gos, activeElement, DOM_DATA_KEY_ROW_CTRL);
const gridElementFocused = cellDomData || rowDomData;
return gridElementFocused ? focusedCell : null;
}
// gets called from:
// +) initialisation (in registerGridComp) params = null
// +) onDomLayoutChanged, params = null
// +) onPageLoaded, recycleRows, animate, newData, newPage from event, onlyBody=true
// +) onPinnedRowDataChanged, recycleRows = true
// +) redrawRows (from Grid API), recycleRows = true/false
redrawAfterModelUpdate(params = {}) {
this.getLockOnRefresh();
const focusedCell = this.getCellToRestoreFocusToAfterRefresh(params);
this.updateContainerHeights();
this.scrollToTopIfNewData(params);
const recycleRows = !params.domLayoutChanged && !!params.recycleRows;
const animate = params.animate && _isAnimateRows(this.gos);
const rowsToRecycle = recycleRows ? this.getRowsToRecycle() : null;
if (!recycleRows) {
this.removeAllRowComps();
}
this.workOutFirstAndLastRowsToRender();
const { stickyRowFeature } = this;
if (stickyRowFeature) {
stickyRowFeature.checkStickyRows();
const extraHeight = stickyRowFeature.extraTopHeight + stickyRowFeature.extraBottomHeight;
if (extraHeight) {
this.updateContainerHeights(extraHeight);
}
}
this.recycleRows(rowsToRecycle, animate);
this.gridBodyCtrl.updateRowCount();
if (!params.onlyBody) {
this.refreshFloatingRowComps();
}
this.dispatchDisplayedRowsChanged();
if (focusedCell != null) {
this.restoreFocusedCell(focusedCell);
}
this.releaseLockOnRefresh();
}
scrollToTopIfNewData(params) {
const scrollToTop = params.newData || params.newPage;
const suppressScrollToTop = this.gos.get("suppressScrollOnNewData");
if (scrollToTop && !suppressScrollToTop) {
this.gridBodyCtrl.scrollFeature.scrollToTop();
this.stickyRowFeature?.resetOffsets();
}
}
updateContainerHeights(additionalHeight = 0) {
const { rowContainerHeight } = this;
if (this.printLayout) {
rowContainerHeight.setModelHeight(null);
return;
}
let containerHeight = this.pageBounds.getCurrentPageHeight();
if (containerHeight === 0) {
containerHeight = 1;
}
rowContainerHeight.setModelHeight(containerHeight + additionalHeight);
}
getLockOnRefresh() {
if (this.refreshInProgress) {
throw new Error(_errMsg(252));
}
this.refreshInProgress = true;
this.beans.frameworkOverrides.getLockOnRefresh?.();
}
releaseLockOnRefresh() {
this.refreshInProgress = false;
this.beans.frameworkOverrides.releaseLockOnRefresh?.();
}
isRefreshInProgress() {
return this.refreshInProgress;
}
// sets the focus to the provided cell, if the cell is provided. this way, the user can call refresh without
// worry about the focus been lost. this is important when the user is using keyboard navigation to do edits
// and the cellEditor is calling 'refresh' to get other cells to update (as other cells might depend on the
// edited cell).
restoreFocusedCell(cellPosition) {
if (!cellPosition) {
return;
}
this.focusSvc.restoreFocusedCell(cellPosition, () => {
this.onCellFocusChanged(
_addGridCommonParams(this.gos, {
rowIndex: cellPosition.rowIndex,
column: cellPosition.column,
rowPinned: cellPosition.rowPinned,
forceBrowserFocus: true,
preventScrollOnBrowserFocus: true,
type: "cellFocused"
})
);
});
}
getAllCellCtrls() {
const res = [];
const rowCtrls = this.getAllRowCtrls();
const rowCtrlsLength = rowCtrls.length;
for (let i = 0; i < rowCtrlsLength; i++) {
const cellCtrls = rowCtrls[i].getAllCellCtrls();
const cellCtrlsLength = cellCtrls.length;
for (let j = 0; j < cellCtrlsLength; j++) {
res.push(cellCtrls[j]);
}
}
return res;
}
getAllRowCtrls() {
const { spannedRowRenderer } = this.beans;
const stickyTopRowCtrls = this.getStickyTopRowCtrls();
const stickyBottomRowCtrls = this.getStickyBottomRowCtrls();
const res = [
...this.topRowCtrls,
...this.bottomRowCtrls,
...stickyTopRowCtrls,
...stickyBottomRowCtrls,
...spannedRowRenderer?.getCtrls("top") ?? [],
...spannedRowRenderer?.getCtrls("bottom") ?? [],
...spannedRowRenderer?.getCtrls("center") ?? [],
...Object.values(this.rowCtrlsByRowIndex)
];
return res;
}
addRenderedRowListener(eventName, rowIndex, callback) {
const rowComp = this.rowCtrlsByRowIndex[rowIndex];
if (rowComp) {
rowComp.addEventListener(eventName, callback);
}
}
refreshCells(params = {}) {
const refreshCellParams = {
forceRefresh: params.force,
newData: false,
suppressFlash: params.suppressFlash
};
for (const cellCtrl of this.getCellCtrls(params.rowNodes, params.columns)) {
cellCtrl.refreshOrDestroyCell(refreshCellParams);
}
this.refreshFullWidth(params.rowNodes);
}
refreshFullWidth(rowNodes) {
if (!rowNodes) {
return;
}
let cellFocused = null;
if (this.stickyRowFeature) {
cellFocused = this.getCellToRestoreFocusToAfterRefresh() || null;
}
for (const rowCtrl of this.getRowCtrls(rowNodes)) {
if (!rowCtrl.isFullWidth()) {
continue;
}
const refreshed = rowCtrl.refreshFullWidth();
if (!refreshed) {
this.redrawRow(rowCtrl.rowNode, true);
}
}
this.dispatchDisplayedRowsChanged(false);
if (cellFocused) {
this.restoreFocusedCell(cellFocused);
}
}
/**
* @param rowNodes if provided, returns the RowCtrls for the provided rowNodes. otherwise returns all RowCtrls.
*/
getRowCtrls(rowNodes) {
const rowIdsMap = mapRowNodes(rowNodes);
const allRowCtrls = this.getAllRowCtrls();
if (!rowNodes || !rowIdsMap) {
return allRowCtrls;
}
return allRowCtrls.filter((rowCtrl) => {
const rowNode = rowCtrl.rowNode;
return isRowInMap(rowNode, rowIdsMap);
});
}
// returns CellCtrl's that match the provided rowNodes and columns. eg if one row node
// and two columns provided, that identifies 4 cells, so 4 CellCtrl's returned.
getCellCtrls(rowNodes, columns) {
let colIdsMap;
if (_exists(columns)) {
colIdsMap = {};
columns.forEach((colKey) => {
const column = this.colModel.getCol(colKey);
if (_exists(column)) {
colIdsMap[column.getId()] = true;
}
});
}
const res = [];
this.getRowCtrls(rowNodes).forEach((rowCtrl) => {
rowCtrl.getAllCellCtrls().forEach((cellCtrl) => {
const colId = cellCtrl.column.getId();
const excludeColFromRefresh = colIdsMap && !colIdsMap[colId];
if (excludeColFromRefresh) {
return;
}
res.push(cellCtrl);
});
});
return res;
}
destroy() {
this.removeAllRowComps(true);
super.destroy();
}
removeAllRowComps(suppressAnimation = false) {
const rowIndexesToRemove = Object.keys(this.rowCtrlsByRowIndex);
this.removeRowCtrls(rowIndexesToRemove, suppressAnimation);
this.stickyRowFeature?.destroyStickyCtrls();
}
getRowsToRecycle() {
const stubNodeIndexes = [];
for (const index of Object.keys(this.rowCtrlsByRowIndex)) {
const rowCtrl = this.rowCtrlsByRowIndex[index];
const stubNode = rowCtrl.rowNode.id == null;
if (stubNode) {
stubNodeIndexes.push(index);
}
}
this.removeRowCtrls(stubNodeIndexes);
const ctrlsByIdMap = {};
for (const rowCtrl of Object.values(this.rowCtrlsByRowIndex)) {
const rowNode = rowCtrl.rowNode;
ctrlsByIdMap[rowNode.id] = rowCtrl;
}
this.rowCtrlsByRowIndex = {};
return ctrlsByIdMap;
}
// takes array of row indexes
removeRowCtrls(rowsToRemove, suppressAnimation = false) {
rowsToRemove.forEach((indexToRemove) => {
const rowCtrl = this.rowCtrlsByRowIndex[indexToRemove];
if (rowCtrl) {
rowCtrl.destroyFirstPass(suppressAnimation);
rowCtrl.destroySecondPass();
}
delete this.rowCtrlsByRowIndex[indexToRemove];
});
}
onBodyScroll(e) {
if (e.direction !== "vertical") {
return;
}
this.redraw({ afterScroll: true });
}
// gets called when rows don't change, but viewport does, so after:
// 1) height of grid body changes, ie number of displayed rows has changed
// 2) grid scrolled to new position
// 3) ensure index visible (which is a scroll)
redraw(params = {}) {
const { afterScroll } = params;
let cellFocused;
const stickyRowFeature = this.stickyRowFeature;
if (stickyRowFeature) {
cellFocused = this.getCellToRestoreFocusToAfterRefresh() || void 0;
}
const oldFirstRow = this.firstRenderedRow;
const oldLastRow = this.lastRenderedRow;
this.workOutFirstAndLastRowsToRender();
let hasStickyRowChanges = false;
if (stickyRowFeature) {
hasStickyRowChanges = stickyRowFeature.checkStickyRows();
const extraHeight = stickyRowFeature.extraTopHeight + stickyRowFeature.extraBottomHeight;
if (extraHeight) {
this.updateContainerHeights(extraHeight);
}
}
const rangeChanged = this.firstRenderedRow !== oldFirstRow || this.lastRenderedRow !== oldLastRow;
if (afterScroll && !hasStickyRowChanges && !rangeChanged) {
return;
}
this.getLockOnRefresh();
this.recycleRows(null, false, afterScroll);
this.releaseLockOnRefresh();
this.dispatchDisplayedRowsChanged(afterScroll && !hasStickyRowChanges);
if (cellFocused != null) {
const newFocusedCell = this.getCellToRestoreFocusToAfterRefresh();
if (cellFocused != null && newFocusedCell == null) {
this.beans.animationFrameSvc?.flushAllFrames();
this.restoreFocusedCell(cellFocused);
}
}
}
removeRowCompsNotToDraw(indexesToDraw, suppressAnimation) {
const indexesToDrawMap = {};
indexesToDraw.forEach((index) => indexesToDrawMap[index] = true);
const existingIndexes = Object.keys(this.rowCtrlsByRowIndex);
const indexesNotToDraw = existingIndexes.filter((index) => !indexesToDrawMap[index]);
this.removeRowCtrls(indexesNotToDraw, suppressAnimation);
}
calculateIndexesToDraw(rowsToRecycle) {
const indexesToDraw = [];
for (let i = this.firstRenderedRow; i <= this.lastRenderedRow; i++) {
indexesToDraw.push(i);
}
const checkRowToDraw = (rowComp) => {
const index = rowComp.rowNode.rowIndex;
if (index == null) {
return;
}
if (index < this.firstRenderedRow || index > this.lastRenderedRow) {
if (this.doNotUnVirtualiseRow(rowComp)) {
indexesToDraw.push(index);
}
}
};
for (const rowCtrl of Object.values(this.rowCtrlsByRowIndex)) {
checkRowToDraw(rowCtrl);
}
if (rowsToRecycle) {
for (const rowCtrl of Object.values(rowsToRecycle)) {
checkRowToDraw(rowCtrl);
}
}
indexesToDraw.sort((a, b) => a - b);
const ret = [];
for (let i = 0; i < indexesToDraw.length; i++) {
const currRow = indexesToDraw[i];
const rowNode = this.rowModel.getRow(currRow);
if (rowNode && !rowNode.sticky) {
ret.push(currRow);
}
}
return ret;
}
recycleRows(rowsToRecycle, animate = false, afterScroll = false) {
const indexesToDraw = this.calculateIndexesToDraw(rowsToRecycle);
if (this.printLayout || afterScroll) {
animate = false;
}
this.removeRowCompsNotToDraw(indexesToDraw, !animate);
const rowCtrls = [];
indexesToDraw.forEach((rowIndex) => {
const rowCtrl = this.createOrUpdateRowCtrl(rowIndex, rowsToRecycle, animate, afterScroll);
if (_exists(rowCtrl)) {
rowCtrls.push(rowCtrl);
}
});
if (rowsToRecycle) {
const { animationFrameSvc } = this.beans;
const useAnimationFrame = animationFrameSvc && afterScroll && !this.gos.get("suppressAnimationFrame") && !this.printLayout;
if (useAnimationFrame) {
animationFrameSvc.addDestroyTask(() => {
this.destroyRowCtrls(rowsToRecycle, animate);
this.updateAllRowCtrls();
this.dispatchDisplayedRowsChanged();
});
} else {
this.destroyRowCtrls(rowsToRecycle, animate);
}
}
this.updateAllRowCtrls();
}
dispatchDisplayedRowsChanged(afterScroll = false) {
this.eventSvc.dispatchEvent({
type: "displayedRowsChanged",
afterScroll
});
}
onDisplayedColumnsChanged() {
const { visibleCols } = this.beans;
const pinningLeft = visibleCols.isPinningLeft();
const pinningRight = visibleCols.isPinningRight();
const atLeastOneChanged = this.pinningLeft !== pinningLeft || pinningRight !== this.pinningRight;
if (atLeastOneChanged) {
this.pinningLeft = pinningLeft;
this.pinningRight = pinningRight;
if (this.embedFullWidthRows) {
this.redrawFullWidthEmbeddedRows();
}
}
}
// when embedding, what gets showed in each section depends on what is pinned. eg if embedding group expand / collapse,
// then it should go into the pinned left area if pinning left, or the center area if not pinning.
redrawFullWidthEmbeddedRows() {
const rowsToRemove = [];
this.getFullWidthRowCtrls().forEach((fullWidthCtrl) => {
const rowIndex = fullWidthCtrl.rowNode.rowIndex;
rowsToRemove.push(rowIndex.toString());
});
this.refreshFloatingRowComps();
this.removeRowCtrls(rowsToRemove);
this.redraw({ afterScroll: true });
}
getFullWidthRowCtrls(rowNodes) {
const rowNodesMap = mapRowNodes(rowNodes);
return this.getAllRowCtrls().filter((rowCtrl) => {
if (!rowCtrl.isFullWidth()) {
return false;
}
const rowNode = rowCtrl.rowNode;
if (rowNodesMap != null && !isRowInMap(rowNode, rowNodesMap)) {
return false;
}
return true;
});
}
createOrUpdateRowCtrl(rowIndex, rowsToRecycle, animate, afterScroll) {
let rowNode;
let rowCtrl = this.rowCtrlsByRowIndex[rowIndex];
if (!rowCtrl) {
rowNode = this.rowModel.getRow(rowIndex);
if (_exists(rowNode) && _exists(rowsToRecycle) && rowsToRecycle[rowNode.id] && rowNode.alreadyRendered) {
rowCtrl = rowsToRecycle[rowNode.id];
rowsToRecycle[rowNode.id] = null;
}
}
const creatingNewRowCtrl = !rowCtrl;
if (creatingNewRowCtrl) {
if (!rowNode) {
rowNode = this.rowModel.getRow(rowIndex);
}
if (_exists(rowNode)) {
rowCtrl = this.createRowCon(rowNode, animate, afterScroll);
} else {
return;
}
}
if (rowNode) {
rowNode.alreadyRendered = true;
}
this.rowCtrlsByRowIndex[rowIndex] = rowCtrl;
return rowCtrl;
}
destroyRowCtrls(rowCtrlsMap, animate) {
const executeInAWhileFuncs = [];
if (rowCtrlsMap) {
for (const rowCtrl of Object.values(rowCtrlsMap)) {
if (!rowCtrl) {
continue;
}
if (this.cachedRowCtrls && rowCtrl.isCacheable()) {
this.cachedRowCtrls.addRow(rowCtrl);
continue;
}
rowCtrl.destroyFirstPass(!animate);
if (animate) {
const instanceId = rowCtrl.instanceId;
this.zombieRowCtrls[instanceId] = rowCtrl;
executeInAWhileFuncs.push(() => {
rowCtrl.destroySecondPass();
delete this.zombieRowCtrls[instanceId];
});
} else {
rowCtrl.destroySecondPass();
}
}
}
if (animate) {
executeInAWhileFuncs.push(() => {
this.updateAllRowCtrls();
this.dispatchDisplayedRowsChanged();
});
window.setTimeout(() => executeInAWhileFuncs.forEach((func) => func()), ROW_ANIMATION_TIMEOUT);
}
}
getRowBuffer() {
return this.gos.get("rowBuffer");
}
getRowBufferInPixels() {
const rowsToBuffer = this.getRowBuffer();
const defaultRowHeight = _getRowHeightAsNumber(this.beans);
return rowsToBuffer * defaultRowHeight;
}
workOutFirstAndLastRowsToRender() {
const { rowContainerHeight, pageBounds, rowModel } = this;
rowContainerHeight.updateOffset();
let newFirst;
let newLast;
if (!rowModel.isRowsToRender()) {
newFirst = 0;
newLast = -1;
} else if (this.printLayout) {
this.beans.environment.refreshRowHeightVariable();
newFirst = pageBounds.getFirstRow();
newLast = pageBounds.getLastRow();
} else {
const bufferPixels = this.getRowBufferInPixels();
const scrollFeature = this.ctrlsSvc.getScrollFeature();
const suppressRowVirtualisation = this.gos.get("suppressRowVirtualisation");
let rowHeightsChanged = false;
let firstPixel;
let lastPixel;
do {
const paginationOffset = pageBounds.getPixelOffset();
const { pageFirstPixel, pageLastPixel } = pageBounds.getCurrentPagePixelRange();
const divStretchOffset = rowContainerHeight.divStretchOffset;
const bodyVRange = scrollFeature.getVScrollPosition();
const bodyTopPixel = bodyVRange.top;
const bodyBottomPixel = bodyVRange.bottom;
if (suppressRowVirtualisation) {
firstPixel = pageFirstPixel + divStretchOffset;
lastPixel = pageLastPixel + divStretchOffset;
} else {
firstPixel = Math.max(bodyTopPixel + paginationOffset - bufferPixels, pageFirstPixel) + divStretchOffset;
lastPixel = Math.min(bodyBottomPixel + paginationOffset + bufferPixels, pageLastPixel) + divStretchOffset;
}
this.firstVisibleVPixel = Math.max(bodyTopPixel + paginationOffset, pageFirstPixel) + divStretchOffset;
this.lastVisibleVPixel = Math.min(bodyBottomPixel + paginationOffset, pageLastPixel) + divStretchOffset;
rowHeightsChanged = this.ensureAllRowsInRangeHaveHeightsCalculated(firstPixel, lastPixel);
} while (rowHeightsChanged);
let firstRowIndex = rowModel.getRowIndexAtPixel(firstPixel);
let lastRowIndex = rowModel.getRowIndexAtPixel(lastPixel);
const pageFirstRow = pageBounds.getFirstRow();
const pageLastRow = pageBounds.getLastRow();
if (firstRowIndex < pageFirstRow) {
firstRowIndex = pageFirstRow;
}
if (lastRowIndex > pageLastRow) {
lastRowIndex = pageLastRow;
}
newFirst = firstRowIndex;
newLast = lastRowIndex;
}
const rowLayoutNormal = _isDomLayout(this.gos, "normal");
const suppressRowCountRestriction = this.gos.get("suppressMaxRenderedRowRestriction");
const rowBufferMaxSize = Math.max(this.getRowBuffer(), 500);
if (rowLayoutNormal && !suppressRowCountRestriction) {
if (newLast - newFirst > rowBufferMaxSize) {
newLast = newFirst + rowBufferMaxSize;
}
}
const firstDiffers = newFirst !== this.firstRenderedRow;
const lastDiffers = newLast !== this.lastRenderedRow;
if (firstDiffers || lastDiffers) {
this.firstRenderedRow = newFirst;
this.lastRenderedRow = newLast;
this.eventSvc.dispatchEvent({
type: "viewportChanged",
firstRow: newFirst,
lastRow: newLast
});
}
}
/**
* This event will only be fired once, and is queued until after the browser next renders.
* This allows us to fire an event during the start of the render cycle, when we first see data being rendered
* but not execute the event until all of the data has finished being rendered to the dom.
*/
dispatchFirstDataRenderedEvent() {
if (this.dataFirstRenderedFired) {
return;
}
this.dataFirstRenderedFired = true;
_requestAnimationFrame(this.beans, () => {
this.beans.eventSvc.dispatchEvent({
type: "firstDataRendered",
firstRow: this.firstRenderedRow,
lastRow: this.lastRenderedRow
});
});
}
ensureAllRowsInRangeHaveHeightsCalculated(topPixel, bottomPixel) {
const pinnedRowHeightsChanged = this.pinnedRowModel?.ensureRowHeightsValid();
const stickyHeightsChanged = this.stickyRowFeature?.ensureRowHeightsValid();
const { pageBounds, rowModel } = this;
const rowModelHeightsChanged = rowModel.ensureRowHeightsValid(
topPixel,
bottomPixel,
pageBounds.getFirstRow(),
pageBounds.getLastRow()
);
if (rowModelHeightsChanged || stickyHeightsChanged) {
this.eventSvc.dispatchEvent({
type: "recalculateRowBounds"
});
}
if (stickyHeightsChanged || rowModelHeightsChanged || pinnedRowHeightsChanged) {
this.updateContainerHeights();
return true;
}
return false;
}
// check that none of the rows to remove are editing or focused as:
// a) if editing, we want to keep them, otherwise the user will loose the context of the edit,
// eg user starts editing, enters some text, then scrolls down and then up, next time row rendered
// the edit is reset - so we want to keep it rendered.
// b) if focused, we want ot keep keyboard focus, so if user ctrl+c, it goes to clipboard,
// otherwise the user can range select and drag (with focus cell going out of the viewport)
// and then ctrl+c, nothing will happen if cell is removed from dom.
// c) if detail record of master detail, as users complained that the context of detail rows
// was getting lost when detail row out of view. eg user expands to show detail row,
// then manipulates the detail panel (eg sorts the detail grid), then context is lost
// after detail panel is scrolled out of / into view.
doNotUnVirtualiseRow(rowCtrl) {
const REMOVE_ROW = false;
const KEEP_ROW = true;
const rowNode = rowCtrl.rowNode;
const rowHasFocus = this.focusSvc.isRowNodeFocused(rowNode);
const rowIsEditing = rowCtrl.editing;
const rowIsDetail = rowNode.detail;
const mightWantToKeepRow = rowHasFocus || rowIsEditing || rowIsDetail;
if (!mightWantToKeepRow) {
return REMOVE_ROW;
}
const rowNodePresent = this.isRowPresent(rowNode);
return rowNodePresent ? KEEP_ROW : REMOVE_ROW;
}
isRowPresent(rowNode) {
if (!this.rowModel.isRowPresent(rowNode)) {
return false;
}
return this.beans.pagination?.isRowPresent(rowNode) ?? true;
}
createRowCon(rowNode, animate, afterScroll) {
const rowCtrlFromCache = this.cachedRowCtrls?.getRow(rowNode) ?? null;
if (rowCtrlFromCache) {
return rowCtrlFromCache;
}
const suppressAnimationFrame = this.gos.get("suppressAnimationFrame");
const useAnimationFrameForCreate = afterScroll && !suppressAnimationFrame && !this.printLayout && !!this.beans.animationFrameSvc;
const res = new RowCtrl(rowNode, this.beans, animate, useAnimationFrameForCreate, this.printLayout);
return res;
}
getRenderedNodes() {
const viewportRows = Object.values(this.rowCtrlsByRowIndex).map((rowCtrl) => rowCtrl.rowNode);
const stickyTopRows = this.getStickyTopRowCtrls().map((rowCtrl) => rowCtrl.rowNode);
const stickyBottomRows = this.getStickyBottomRowCtrls().map((rowCtrl) => rowCtrl.rowNode);
return [...stickyTopRows, ...viewportRows, ...stickyBottomRows];
}
getRowByPosition(rowPosition) {
let rowCtrl;
const { rowIndex } = rowPosition;
switch (rowPosition.rowPinned) {
case "top":
rowCtrl = this.topRowCtrls[rowIndex];
break;
case "bottom":
rowCtrl = this.bottomRowCtrls[rowIndex];
break;
default:
rowCtrl = this.rowCtrlsByRowIndex[rowIndex];
if (!rowCtrl) {
rowCtrl = this.getStickyTopRowCtrls().find((ctrl) => ctrl.rowNode.rowIndex === rowIndex) || null;
if (!rowCtrl) {
rowCtrl = this.getStickyBottomRowCtrls().find((ctrl) => ctrl.rowNode.rowIndex === rowIndex) || null;
}
}
break;
}
return rowCtrl;
}
// returns true if any row between startIndex and endIndex is rendered. used by
// SSRM or IRM, as they don't want to purge visible blocks from cache.
isRangeInRenderedViewport(startIndex, endIndex) {
const parentClosed = startIndex == null || endIndex == null;
if (parentClosed) {
return false;
}
const blockAfterViewport = startIndex > this.lastRenderedRow;
const blockBeforeViewport = endIndex < this.firstRenderedRow;
const blockInsideViewport = !blockBeforeViewport && !blockAfterViewport;
return blockInsideViewport;
}
};
var RowCtrlCache = class {
constructor(maxCount) {
// map for fast access
this.entriesMap = {};
// list for keeping order
this.entriesList = [];
this.maxCount = maxCount;
}
addRow(rowCtrl) {
this.entriesMap[rowCtrl.rowNode.id] = rowCtrl;
this.entriesList.push(rowCtrl);
rowCtrl.setCached(true);
if (this.entriesList.length > this.maxCount) {
const rowCtrlToDestroy = this.entriesList[0];
rowCtrlToDestroy.destroyFirstPass();
rowCtrlToDestroy.destroySecondPass();
this.removeFromCache(rowCtrlToDestroy);
}
}
getRow(rowNode) {
if (rowNode == null || rowNode.id == null) {
return null;
}
const res = this.entriesMap[rowNode.id];
if (!res) {
return null;
}
this.removeFromCache(res);
res.setCached(false);
const rowNodeMismatch = res.rowNode != rowNode;
return rowNodeMismatch ? null : res;
}
has(rowNode) {
return this.entriesMap[rowNode.id] != null;
}
removeRow(rowNode) {
const rowNodeId = rowNode.id;
const ctrl = this.entriesMap[rowNodeId];
delete this.entriesMap[rowNodeId];
_removeFromArray(this.entriesList, ctrl);
}
removeFromCache(rowCtrl) {
const rowNodeId = rowCtrl.rowNode.id;
delete this.entriesMap[rowNodeId];
_removeFromArray(this.entriesList, rowCtrl);
}
getEntries() {
return this.entriesList;
}
};
function mapRowNodes(rowNodes) {
if (!rowNodes) {
return;
}
const res = {
top: {},
bottom: {},
normal: {}
};
rowNodes.forEach((rowNode) => {
const id = rowNode.id;
switch (rowNode.rowPinned) {
case "top":
res.top[id] = rowNode;
break;
case "bottom":
res.bottom[id] = rowNode;
break;
default:
res.normal[id] = rowNode;
break;
}
});
return res;
}
function isRowInMap(rowNode, rowIdsMap) {
const id = rowNode.id;
const floating = rowNode.rowPinned;
switch (floating) {
case "top":
return rowIdsMap.top[id] != null;
case "bottom":
return rowIdsMap.bottom[id] != null;
default:
return rowIdsMap.normal[id] != null;
}
}
// packages/ag-grid-community/src/sort/rowNodeSorter.ts
var RowNodeSorter = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "rowNodeSorter";
}
postConstruct() {
const { gos } = this;
this.isAccentedSort = gos.get("accentedSort");
this.primaryColumnsSortGroups = _isColumnsSortingCoupledToGroup(gos);
this.addManagedPropertyListener(
"accentedSort",
(propChange) => this.isAccentedSort = propChange.currentValue
);
this.addManagedPropertyListener(
"autoGroupColumnDef",
() => this.primaryColumnsSortGroups = _isColumnsSortingCoupledToGroup(gos)
);
}
doFullSort(rowNodes, sortOptions) {
const sortedRowNodes = rowNodes.map((rowNode, currentPos) => ({
currentPos,
rowNode
}));
sortedRowNodes.sort(this.compareRowNodes.bind(this, sortOptions));
return sortedRowNodes.map((item) => item.rowNode);
}
compareRowNodes(sortOptions, sortedNodeA, sortedNodeB) {
const nodeA = sortedNodeA.rowNode;
const nodeB = sortedNodeB.rowNode;
for (let i = 0, len = sortOptions.length; i < len; i++) {
const sortOption = sortOptions[i];
const isDescending = sortOption.sort === "desc";
const valueA = this.getValue(nodeA, sortOption.column);
const valueB = this.getValue(nodeB, sortOption.column);
let comparatorResult;
const providedComparator = this.getComparator(sortOption, nodeA);
if (providedComparator) {
comparatorResult = providedComparator(valueA, valueB, nodeA, nodeB, isDescending);
} else {
comparatorResult = _defaultComparator(valueA, valueB, this.isAccentedSort);
}
const validResult = !isNaN(comparatorResult);
if (validResult && comparatorResult !== 0) {
return sortOption.sort === "asc" ? comparatorResult : comparatorResult * -1;
}
}
return sortedNodeA.currentPos - sortedNodeB.currentPos;
}
getComparator(sortOption, rowNode) {
const column = sortOption.column;
const comparatorOnCol = column.getColDef().comparator;
if (comparatorOnCol != null) {
return comparatorOnCol;
}
if (!column.getColDef().showRowGroup) {
return;
}
const groupLeafField = !rowNode.group && column.getColDef().field;
if (!groupLeafField) {
return;
}
const primaryColumn = this.beans.colModel.getColDefCol(groupLeafField);
if (!primaryColumn) {
return;
}
return primaryColumn.getColDef().comparator;
}
getValue(node, column) {
const { valueSvc, colModel, showRowGroupCols, gos } = this.beans;
if (!this.primaryColumnsSortGroups) {
return valueSvc.getValue(column, node, false);
}
const isNodeGroupedAtLevel = node.rowGroupColumn === column;
if (isNodeGroupedAtLevel) {
const isGroupRows = _isGroupUseEntireRow(gos, colModel.isPivotActive());
if (isGroupRows) {
const leafChild = node.allLeafChildren?.[0];
if (leafChild) {
return valueSvc.getValue(column, leafChild, false);
}
return void 0;
}
const displayCol = showRowGroupCols?.getShowRowGroupCol(column.getId());
if (!displayCol) {
return void 0;
}
return node.groupData?.[displayCol.getId()];
}
if (node.group && column.getColDef().showRowGroup) {
return void 0;
}
return valueSvc.getValue(column, node, false);
}
};
// packages/ag-grid-community/src/sort/sortApi.ts
function onSortChanged(beans) {
beans.sortSvc?.onSortChanged("api");
}
// packages/ag-grid-community/src/sort/sortIndicatorComp.ts
function makeSpan(dataRefSuffix, classSuffix) {
return (
/* html */
``
);
}
var SortIndicatorTemplate = (
/* html */
`
${makeSpan("Order", "order")}
${makeSpan("Asc", "ascending-icon")}
${makeSpan("Desc", "descending-icon")}
${makeSpan("Mixed", "mixed-icon")}
${makeSpan("None", "none-icon")}
`
);
var SortIndicatorComp = class extends Component {
constructor(skipTemplate) {
super();
this.eSortOrder = RefPlaceholder;
this.eSortAsc = RefPlaceholder;
this.eSortDesc = RefPlaceholder;
this.eSortMixed = RefPlaceholder;
this.eSortNone = RefPlaceholder;
if (!skipTemplate) {
this.setTemplate(SortIndicatorTemplate);
}
}
attachCustomElements(eSortOrder, eSortAsc, eSortDesc, eSortMixed, eSortNone) {
this.eSortOrder = eSortOrder;
this.eSortAsc = eSortAsc;
this.eSortDesc = eSortDesc;
this.eSortMixed = eSortMixed;
this.eSortNone = eSortNone;
}
setupSort(column, suppressOrder = false) {
this.column = column;
this.suppressOrder = suppressOrder;
this.setupMultiSortIndicator();
if (!column.isSortable() && !column.getColDef().showRowGroup) {
return;
}
this.addInIcon("sortAscending", this.eSortAsc, column);
this.addInIcon("sortDescending", this.eSortDesc, column);
this.addInIcon("sortUnSort", this.eSortNone, column);
const updateIcons = this.updateIcons.bind(this);
const sortUpdated = this.onSortChanged.bind(this);
this.addManagedPropertyListener("unSortIcon", updateIcons);
this.addManagedEventListeners({
newColumnsLoaded: updateIcons,
// Watch global events, as row group columns can effect their display column.
sortChanged: sortUpdated,
// when grouping changes so can sort indexes and icons
columnRowGroupChanged: sortUpdated
});
this.onSortChanged();
}
addInIcon(iconName, eParent, column) {
if (eParent == null) {
return;
}
const eIcon = _createIconNoSpan(iconName, this.beans, column);
if (eIcon) {
eParent.appendChild(eIcon);
}
}
onSortChanged() {
this.updateIcons();
if (!this.suppressOrder) {
this.updateSortOrder();
}
}
updateIcons() {
const { eSortAsc, eSortDesc, eSortNone, column, gos, beans } = this;
const sortDirection = beans.sortSvc.getDisplaySortForColumn(column);
if (eSortAsc) {
const isAscending = sortDirection === "asc";
_setDisplayed(eSortAsc, isAscending, { skipAriaHidden: true });
}
if (eSortDesc) {
const isDescending = sortDirection === "desc";
_setDisplayed(eSortDesc, isDescending, { skipAriaHidden: true });
}
if (eSortNone) {
const alwaysHideNoSort = !column.getColDef().unSortIcon && !gos.get("unSortIcon");
const isNone = sortDirection === null || sortDirection === void 0;
_setDisplayed(eSortNone, !alwaysHideNoSort && isNone, { skipAriaHidden: true });
}
}
setupMultiSortIndicator() {
const { eSortMixed, column, gos } = this;
this.addInIcon("sortUnSort", eSortMixed, column);
const isColumnShowingRowGroup = column.getColDef().showRowGroup;
const areGroupsCoupled = _isColumnsSortingCoupledToGroup(gos);
if (areGroupsCoupled && isColumnShowingRowGroup) {
this.addManagedEventListeners({
// Watch global events, as row group columns can effect their display column.
sortChanged: this.updateMultiSortIndicator.bind(this),
// when grouping changes so can sort indexes and icons
columnRowGroupChanged: this.updateMultiSortIndicator.bind(this)
});
this.updateMultiSortIndicator();
}
}
updateMultiSortIndicator() {
const { eSortMixed, beans, column } = this;
if (eSortMixed) {
const isMixedSort = beans.sortSvc.getDisplaySortForColumn(column) === "mixed";
_setDisplayed(eSortMixed, isMixedSort, { skipAriaHidden: true });
}
}
// we listen here for global sort events, NOT column sort events, as we want to do this
// when sorting has been set on all column (if we listened just for our col (where we
// set the asc / desc icons) then it's possible other cols are yet to get their sorting state.
updateSortOrder() {
const {
eSortOrder,
column,
beans: { sortSvc }
} = this;
if (!eSortOrder) {
return;
}
const allColumnsWithSorting = sortSvc.getColumnsWithSortingOrdered();
const indexThisCol = sortSvc.getDisplaySortIndexForColumn(column) ?? -1;
const moreThanOneColSorting = allColumnsWithSorting.some(
(col) => sortSvc.getDisplaySortIndexForColumn(col) ?? -1 >= 1
);
const showIndex = indexThisCol >= 0 && moreThanOneColSorting;
_setDisplayed(eSortOrder, showIndex, { skipAriaHidden: true });
if (indexThisCol >= 0) {
eSortOrder.textContent = (indexThisCol + 1).toString();
} else {
_clearElement(eSortOrder);
}
}
};
var SortIndicatorSelector = {
selector: "AG-SORT-INDICATOR",
component: SortIndicatorComp
};
// packages/ag-grid-community/src/sort/sortService.ts
var DEFAULT_SORTING_ORDER = ["asc", "desc", null];
var SortService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "sortSvc";
}
progressSort(column, multiSort, source) {
const nextDirection = this.getNextSortDirection(column);
this.setSortForColumn(column, nextDirection, multiSort, source);
}
progressSortFromEvent(column, event) {
const sortUsingCtrl = this.gos.get("multiSortKey") === "ctrl";
const multiSort = sortUsingCtrl ? event.ctrlKey || event.metaKey : event.shiftKey;
this.progressSort(column, multiSort, "uiColumnSorted");
}
setSortForColumn(column, sort, multiSort, source) {
if (sort !== "asc" && sort !== "desc") {
sort = null;
}
const { gos, showRowGroupCols } = this.beans;
const isColumnsSortingCoupledToGroup = _isColumnsSortingCoupledToGroup(gos);
let columnsToUpdate = [column];
if (isColumnsSortingCoupledToGroup) {
if (column.getColDef().showRowGroup) {
const rowGroupColumns = showRowGroupCols?.getSourceColumnsForGroupColumn?.(column);
const sortableRowGroupColumns = rowGroupColumns?.filter((col) => col.isSortable());
if (sortableRowGroupColumns) {
columnsToUpdate = [column, ...sortableRowGroupColumns];
}
}
}
columnsToUpdate.forEach((col) => this.setColSort(col, sort, source));
const doingMultiSort = (multiSort || gos.get("alwaysMultiSort")) && !gos.get("suppressMultiSort");
const updatedColumns = [];
if (!doingMultiSort) {
const clearedColumns = this.clearSortBarTheseColumns(columnsToUpdate, source);
updatedColumns.push(...clearedColumns);
}
this.updateSortIndex(column);
updatedColumns.push(...columnsToUpdate);
this.dispatchSortChangedEvents(source, updatedColumns);
}
updateSortIndex(lastColToChange) {
const { gos, colModel, showRowGroupCols } = this.beans;
const isCoupled = _isColumnsSortingCoupledToGroup(gos);
const groupParent = showRowGroupCols?.getShowRowGroupCol(lastColToChange.getId());
const lastSortIndexCol = isCoupled ? groupParent || lastColToChange : lastColToChange;
const allSortedCols = this.getColumnsWithSortingOrdered();
colModel.getAllCols().forEach((col) => this.setColSortIndex(col, null));
const allSortedColsWithoutChangesOrGroups = allSortedCols.filter((col) => {
if (isCoupled && col.getColDef().showRowGroup) {
return false;
}
return col !== lastSortIndexCol;
});
const sortedColsWithIndices = lastSortIndexCol.getSort() ? [...allSortedColsWithoutChangesOrGroups, lastSortIndexCol] : allSortedColsWithoutChangesOrGroups;
sortedColsWithIndices.forEach((col, idx) => this.setColSortIndex(col, idx));
}
// gets called by API, so if data changes, use can call this, which will end up
// working out the sort order again of the rows.
onSortChanged(source, columns) {
this.dispatchSortChangedEvents(source, columns);
}
isSortActive() {
const allCols = this.beans.colModel.getAllCols();
const sortedCols = allCols.filter((column) => !!column.getSort());
return sortedCols && sortedCols.length > 0;
}
dispatchSortChangedEvents(source, columns) {
const event = {
type: "sortChanged",
source
};
if (columns) {
event.columns = columns;
}
this.eventSvc.dispatchEvent(event);
}
clearSortBarTheseColumns(columnsToSkip, source) {
const clearedColumns = [];
this.beans.colModel.getAllCols().forEach((columnToClear) => {
if (!columnsToSkip.includes(columnToClear)) {
if (columnToClear.getSort()) {
clearedColumns.push(columnToClear);
}
this.setColSort(columnToClear, void 0, source);
}
});
return clearedColumns;
}
getNextSortDirection(column) {
const sortingOrder = column.getColDef().sortingOrder ?? this.gos.get("sortingOrder") ?? DEFAULT_SORTING_ORDER;
const currentIndex = sortingOrder.indexOf(column.getSort());
const notInArray = currentIndex < 0;
const lastItemInArray = currentIndex == sortingOrder.length - 1;
return notInArray || lastItemInArray ? sortingOrder[0] : sortingOrder[currentIndex + 1];
}
/**
* @returns a map of sort indexes for every sorted column, if groups sort primaries then they will have equivalent indices
*/
getIndexedSortMap() {
const { gos, colModel, showRowGroupCols, rowGroupColsSvc } = this.beans;
let allSortedCols = colModel.getAllCols().filter((col) => !!col.getSort());
if (colModel.isPivotMode()) {
const isSortingLinked = _isColumnsSortingCoupledToGroup(gos);
allSortedCols = allSortedCols.filter((col) => {
const isAggregated = !!col.getAggFunc();
const isSecondary = !col.isPrimary();
const isGroup = isSortingLinked ? showRowGroupCols?.getShowRowGroupCol(col.getId()) : col.getColDef().showRowGroup;
return isAggregated || isSecondary || isGroup;
});
}
const sortedRowGroupCols = rowGroupColsSvc?.columns.filter((col) => !!col.getSort()) ?? [];
const allColsIndexes = {};
allSortedCols.forEach((col, index) => allColsIndexes[col.getId()] = index);
allSortedCols.sort((a, b) => {
const iA = a.getSortIndex();
const iB = b.getSortIndex();
if (iA != null && iB != null) {
return iA - iB;
} else if (iA == null && iB == null) {
const posA = allColsIndexes[a.getId()];
const posB = allColsIndexes[b.getId()];
return posA > posB ? 1 : -1;
} else if (iB == null) {
return -1;
} else {
return 1;
}
});
const isSortLinked = _isColumnsSortingCoupledToGroup(gos) && !!sortedRowGroupCols.length;
if (isSortLinked) {
allSortedCols = [
...new Set(
// if linked sorting, replace all columns with the display group column for index purposes, and ensure uniqueness
allSortedCols.map((col) => showRowGroupCols?.getShowRowGroupCol(col.getId()) ?? col)
)
];
}
const indexMap = /* @__PURE__ */ new Map();
allSortedCols.forEach((col, idx) => indexMap.set(col, idx));
if (isSortLinked) {
sortedRowGroupCols.forEach((col) => {
const groupDisplayCol = showRowGroupCols.getShowRowGroupCol(col.getId());
indexMap.set(col, indexMap.get(groupDisplayCol));
});
}
return indexMap;
}
getColumnsWithSortingOrdered() {
return [...this.getIndexedSortMap().entries()].sort(([col1, idx1], [col2, idx2]) => idx1 - idx2).map(([col]) => col);
}
// used by server side row models, to sent sort to server
getSortModel() {
return this.getColumnsWithSortingOrdered().filter((column) => column.getSort()).map((column) => ({
sort: column.getSort(),
colId: column.getId()
}));
}
getSortOptions() {
return this.getColumnsWithSortingOrdered().filter((column) => column.getSort()).map((column) => ({
sort: column.getSort(),
column
}));
}
canColumnDisplayMixedSort(column) {
const isColumnSortCouplingActive = _isColumnsSortingCoupledToGroup(this.gos);
const isGroupDisplayColumn = !!column.getColDef().showRowGroup;
return isColumnSortCouplingActive && isGroupDisplayColumn;
}
getDisplaySortForColumn(column) {
const linkedColumns = this.beans.showRowGroupCols?.getSourceColumnsForGroupColumn(column);
if (!this.canColumnDisplayMixedSort(column) || !linkedColumns?.length) {
return column.getSort();
}
const columnHasUniqueData = column.getColDef().field != null || !!column.getColDef().valueGetter;
const sortableColumns = columnHasUniqueData ? [column, ...linkedColumns] : linkedColumns;
const firstSort = sortableColumns[0].getSort();
const allMatch = sortableColumns.every((col) => col.getSort() == firstSort);
if (!allMatch) {
return "mixed";
}
return firstSort;
}
getDisplaySortIndexForColumn(column) {
return this.getIndexedSortMap().get(column);
}
setupHeader(comp, column, clickElement) {
let lastMovingChanged = 0;
comp.addManagedListeners(column, {
movingChanged: () => {
lastMovingChanged = (/* @__PURE__ */ new Date()).getTime();
}
});
if (clickElement) {
comp.addManagedElementListeners(clickElement, {
click: (event) => {
const moving = column.isMoving();
const nowTime = (/* @__PURE__ */ new Date()).getTime();
const movedRecently = nowTime - lastMovingChanged < 50;
const columnMoving = moving || movedRecently;
if (!columnMoving) {
this.progressSortFromEvent(column, event);
}
}
});
}
const onSortingChanged = () => {
const sort = column.getSort();
comp.addOrRemoveCssClass("ag-header-cell-sorted-asc", sort === "asc");
comp.addOrRemoveCssClass("ag-header-cell-sorted-desc", sort === "desc");
comp.addOrRemoveCssClass("ag-header-cell-sorted-none", !sort);
if (column.getColDef().showRowGroup) {
const sourceColumns = this.beans.showRowGroupCols?.getSourceColumnsForGroupColumn(column);
const sortDirectionsMatch = sourceColumns?.every(
(sourceCol) => column.getSort() == sourceCol.getSort()
);
const isMultiSorting = !sortDirectionsMatch;
comp.addOrRemoveCssClass("ag-header-cell-sorted-mixed", isMultiSorting);
}
};
comp.addManagedEventListeners({
sortChanged: onSortingChanged,
columnRowGroupChanged: onSortingChanged
});
}
initCol(column) {
const { sort, initialSort, sortIndex, initialSortIndex } = column.colDef;
if (sort !== void 0) {
if (sort === "asc" || sort === "desc") {
column.sort = sort;
}
} else {
if (initialSort === "asc" || initialSort === "desc") {
column.sort = initialSort;
}
}
if (sortIndex !== void 0) {
if (sortIndex !== null) {
column.sortIndex = sortIndex;
}
} else {
if (initialSortIndex !== null) {
column.sortIndex = initialSortIndex;
}
}
}
updateColSort(column, sort, source) {
if (sort !== void 0) {
if (sort === "desc" || sort === "asc") {
this.setColSort(column, sort, source);
} else {
this.setColSort(column, void 0, source);
}
}
}
setColSort(column, sort, source) {
if (column.sort !== sort) {
column.sort = sort;
column.dispatchColEvent("sortChanged", source);
}
column.dispatchStateUpdatedEvent("sort");
}
setColSortIndex(column, sortOrder) {
column.sortIndex = sortOrder;
column.dispatchStateUpdatedEvent("sortIndex");
}
createSortIndicator(skipTemplate) {
return new SortIndicatorComp(skipTemplate);
}
getSortIndicatorSelector() {
return SortIndicatorSelector;
}
};
// packages/ag-grid-community/src/sort/sortModule.ts
var SortModule = {
moduleName: "Sort",
version: VERSION,
beans: [SortService, RowNodeSorter],
apiFunctions: {
onSortChanged
},
userComponents: {
agSortIndicator: SortIndicatorComp
},
icons: {
// show on column header when column is sorted ascending
sortAscending: "asc",
// show on column header when column is sorted descending
sortDescending: "desc",
// show on column header when column has no sort, only when enabled with gridOptions.unSortIcon=true
sortUnSort: "none"
}
};
// packages/ag-grid-community/src/syncService.ts
var SyncService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "syncSvc";
this.waitingForColumns = false;
}
postConstruct() {
this.addManagedPropertyListener("columnDefs", (event) => this.setColumnDefs(event));
}
start() {
this.beans.ctrlsSvc.whenReady(this, () => {
const columnDefs = this.gos.get("columnDefs");
if (columnDefs) {
this.setColumnsAndData(columnDefs);
} else {
this.waitingForColumns = true;
}
this.gridReady();
});
}
setColumnsAndData(columnDefs) {
const { colModel, rowModel } = this.beans;
colModel.setColumnDefs(columnDefs ?? [], "gridInitializing");
rowModel.start();
}
gridReady() {
const { eventSvc, gos } = this;
eventSvc.dispatchEvent({
type: "gridReady"
});
_logIfDebug(gos, `initialised successfully, enterprise = ${gos.isModuleRegistered("EnterpriseCore")}`);
}
setColumnDefs(event) {
const columnDefs = this.gos.get("columnDefs");
if (!columnDefs) {
return;
}
if (this.waitingForColumns) {
this.waitingForColumns = false;
this.setColumnsAndData(columnDefs);
return;
}
this.beans.colModel.setColumnDefs(columnDefs, _convertColumnEventSourceType(event.source));
}
};
// packages/ag-grid-community/src/valueService/cellApi.ts
function expireValueCache(beans) {
beans.valueCache?.expire();
}
function getCellValue(beans, params) {
const { colKey, rowNode, useFormatter } = params;
const column = beans.colModel.getColDefCol(colKey) ?? beans.colModel.getCol(colKey);
if (_missing(column)) {
return null;
}
const value = beans.valueSvc.getValueForDisplay(column, rowNode);
if (useFormatter) {
const formattedValue = beans.valueSvc.formatValue(column, rowNode, value);
return formattedValue ?? _escapeString(value, true);
}
return value;
}
// packages/ag-grid-community/src/utils/changedPath.ts
var ChangedPath = class {
constructor(keepingColumns, rootNode) {
// whether changed path is active of not. it is active when a) doing
// a transaction update or b) doing change detection. if we are doing
// a CSRM refresh for other reasons (after sort or filter, or user calling
// setRowData() without delta mode) then we are not active. we are also
// marked as not active if secondary columns change in pivot (as this impacts
// aggregations).
// can be set inactive by:
// a) ClientSideRowModel, if no transactions or
// b) PivotService, if secondary columns changed
this.active = true;
// for each node in the change path, we also store which columns need
// to be re-aggregated.
this.nodeIdsToColumns = {};
// for quick lookup, all items in the change path are mapped by nodeId
this.mapToItems = {};
this.keepingColumns = keepingColumns;
this.pathRoot = {
rowNode: rootNode,
children: null
};
this.mapToItems[rootNode.id] = this.pathRoot;
}
depthFirstSearchChangedPath(pathItem, callback) {
const { rowNode, children } = pathItem;
if (children) {
for (let i = 0; i < children.length; ++i) {
this.depthFirstSearchChangedPath(children[i], callback);
}
}
callback(rowNode);
}
depthFirstSearchEverything(rowNode, callback, traverseEverything) {
const childrenAfterGroup = rowNode.childrenAfterGroup;
if (childrenAfterGroup) {
for (let i = 0, len = childrenAfterGroup.length; i < len; ++i) {
const childNode = childrenAfterGroup[i];
if (childNode.childrenAfterGroup) {
this.depthFirstSearchEverything(childNode, callback, traverseEverything);
} else if (traverseEverything) {
callback(childNode);
}
}
}
callback(rowNode);
}
// traverseLeafNodes -> used when NOT doing changed path, ie traversing everything. the callback
// will be called for child nodes in addition to parent nodes.
forEachChangedNodeDepthFirst(callback, traverseLeafNodes = false, includeUnchangedNodes = false) {
if (this.active && !includeUnchangedNodes) {
this.depthFirstSearchChangedPath(this.pathRoot, callback);
} else {
this.depthFirstSearchEverything(this.pathRoot.rowNode, callback, traverseLeafNodes);
}
}
executeFromRootNode(callback) {
callback(this.pathRoot.rowNode);
}
createPathItems(rowNode) {
let pointer = rowNode;
let newEntryCount = 0;
while (!this.mapToItems[pointer.id]) {
const newEntry = {
rowNode: pointer,
children: null
};
this.mapToItems[pointer.id] = newEntry;
newEntryCount++;
pointer = pointer.parent;
}
return newEntryCount;
}
populateColumnsMap(rowNode, columns) {
if (!this.keepingColumns || !columns) {
return;
}
let pointer = rowNode;
while (pointer) {
if (!this.nodeIdsToColumns[pointer.id]) {
this.nodeIdsToColumns[pointer.id] = {};
}
columns.forEach((col) => this.nodeIdsToColumns[pointer.id][col.getId()] = true);
pointer = pointer.parent;
}
}
linkPathItems(rowNode, newEntryCount) {
let pointer = rowNode;
for (let i = 0; i < newEntryCount; i++) {
const thisItem = this.mapToItems[pointer.id];
const parentItem = this.mapToItems[pointer.parent.id];
if (!parentItem.children) {
parentItem.children = [];
}
parentItem.children.push(thisItem);
pointer = pointer.parent;
}
}
// called by
// 1) change detection (provides cols) and
// 2) groupStage if doing transaction update (doesn't provide cols)
addParentNode(rowNode, columns) {
if (!rowNode || rowNode.isRowPinned()) {
return;
}
const newEntryCount = this.createPathItems(rowNode);
this.linkPathItems(rowNode, newEntryCount);
this.populateColumnsMap(rowNode, columns);
}
canSkip(rowNode) {
return this.active && !this.mapToItems[rowNode.id];
}
getValueColumnsForNode(rowNode, valueColumns) {
if (!this.keepingColumns) {
return valueColumns;
}
const colsForThisNode = this.nodeIdsToColumns[rowNode.id];
const result = valueColumns.filter((col) => colsForThisNode[col.getId()]);
return result;
}
getNotValueColumnsForNode(rowNode, valueColumns) {
if (!this.keepingColumns) {
return null;
}
const colsForThisNode = this.nodeIdsToColumns[rowNode.id];
const result = valueColumns.filter((col) => !colsForThisNode[col.getId()]);
return result;
}
};
// packages/ag-grid-community/src/valueService/changeDetectionService.ts
var SOURCE_PASTE = "paste";
var ChangeDetectionService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "changeDetectionSvc";
this.clientSideRowModel = null;
}
postConstruct() {
const { gos, rowModel } = this.beans;
if (_isClientSideRowModel(gos, rowModel)) {
this.clientSideRowModel = rowModel;
}
this.addManagedEventListeners({ cellValueChanged: this.onCellValueChanged.bind(this) });
}
onCellValueChanged(event) {
const { gos, rowRenderer } = this.beans;
if (event.source === SOURCE_PASTE || gos.get("suppressChangeDetection")) {
return;
}
const rowNode = event.node;
const nodesToRefresh = [rowNode];
const clientSideRowModel = this.clientSideRowModel;
const rootNode = clientSideRowModel?.rootNode;
if (rootNode && !rowNode.isRowPinned()) {
const onlyChangedColumns = gos.get("aggregateOnlyChangedColumns");
const changedPath = new ChangedPath(onlyChangedColumns, rootNode);
changedPath.addParentNode(rowNode.parent, [event.column]);
clientSideRowModel.doAggregate(changedPath);
changedPath.forEachChangedNodeDepthFirst((rowNode2) => {
nodesToRefresh.push(rowNode2);
});
}
rowRenderer.refreshCells({ rowNodes: nodesToRefresh });
}
};
// packages/ag-grid-community/src/valueService/expressionService.ts
var ExpressionService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "expressionSvc";
this.cache = {};
}
evaluate(expression, params) {
if (typeof expression === "string") {
return this.evaluateExpression(expression, params);
} else {
_error(15, { expression });
}
}
evaluateExpression(expression, params) {
try {
const javaScriptFunction = this.createExpressionFunction(expression);
const result = javaScriptFunction(
params.value,
params.context,
params.oldValue,
params.newValue,
params.value,
params.node,
params.data,
params.colDef,
params.rowIndex,
params.api,
params.getValue,
params.column,
params.columnGroup
);
return result;
} catch (e) {
_error(16, { expression, params, e });
return null;
}
}
createExpressionFunction(expression) {
const expressionToFunctionCache = this.cache;
if (expressionToFunctionCache[expression]) {
return expressionToFunctionCache[expression];
}
const functionBody = this.createFunctionBody(expression);
const theFunction = new Function(
"x, ctx, oldValue, newValue, value, node, data, colDef, rowIndex, api, getValue, column, columnGroup",
functionBody
);
expressionToFunctionCache[expression] = theFunction;
return theFunction;
}
createFunctionBody(expression) {
if (expression.indexOf("return") >= 0) {
return expression;
} else {
return "return " + expression + ";";
}
}
};
// packages/ag-grid-community/src/valueService/valueCache.ts
var ValueCache = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "valueCache";
this.cacheVersion = 0;
}
postConstruct() {
const gos = this.gos;
this.active = gos.get("valueCache");
this.neverExpires = gos.get("valueCacheNeverExpires");
}
onDataChanged() {
if (this.neverExpires) {
return;
}
this.expire();
}
expire() {
this.cacheVersion++;
}
setValue(rowNode, colId, value) {
if (this.active) {
const cacheVersion = this.cacheVersion;
if (rowNode.__cacheVersion !== cacheVersion) {
rowNode.__cacheVersion = cacheVersion;
rowNode.__cacheData = {};
}
rowNode.__cacheData[colId] = value;
}
}
getValue(rowNode, colId) {
if (!this.active || rowNode.__cacheVersion !== this.cacheVersion) {
return void 0;
}
return rowNode.__cacheData[colId];
}
};
// packages/ag-grid-community/src/valueService/valueModule.ts
var ValueCacheModule = {
moduleName: "ValueCache",
version: VERSION,
beans: [ValueCache],
apiFunctions: {
expireValueCache
}
};
var ExpressionModule = {
moduleName: "Expression",
version: VERSION,
beans: [ExpressionService]
};
var ChangeDetectionModule = {
moduleName: "ChangeDetection",
version: VERSION,
beans: [ChangeDetectionService]
};
var CellApiModule = {
moduleName: "CellApi",
version: VERSION,
apiFunctions: {
getCellValue
}
};
// packages/ag-grid-community/src/valueService/valueService.ts
var ValueService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "valueSvc";
this.initialised = false;
this.isSsrm = false;
}
wireBeans(beans) {
this.expressionSvc = beans.expressionSvc;
this.colModel = beans.colModel;
this.valueCache = beans.valueCache;
this.dataTypeSvc = beans.dataTypeSvc;
}
postConstruct() {
if (!this.initialised) {
this.init();
}
}
init() {
this.executeValueGetter = this.valueCache ? this.executeValueGetterWithValueCache.bind(this) : this.executeValueGetterWithoutValueCache.bind(this);
this.isSsrm = _isServerSideRowModel(this.gos);
this.cellExpressions = this.gos.get("enableCellExpressions");
this.isTreeData = this.gos.get("treeData");
this.initialised = true;
const listener = (event) => this.callColumnCellValueChangedHandler(event);
this.eventSvc.addEventListener("cellValueChanged", listener, true);
this.addDestroyFunc(() => this.eventSvc.removeEventListener("cellValueChanged", listener, true));
this.addManagedPropertyListener("treeData", (propChange) => this.isTreeData = propChange.currentValue);
}
/**
* Use this function to get a displayable cell value.
* This hides values in expanded group rows which are instead displayed by the footer row.
*/
getValueForDisplay(column, node) {
const lockedClosedGroup = node.leafGroup && this.colModel.isPivotMode();
const isOpenGroup = node.group && node.expanded && !node.footer && !lockedClosedGroup;
const groupAlwaysShowAggData = this.gos.get("groupSuppressBlankHeader");
if (!isOpenGroup || groupAlwaysShowAggData) {
return this.getValue(column, node);
}
let includeFooter = false;
const groupIncludeFooterOpt = this.gos.get("groupTotalRow");
if (typeof groupIncludeFooterOpt !== "function") {
includeFooter = !!groupIncludeFooterOpt;
} else {
const groupIncludeFooterCb = this.gos.getCallback("groupTotalRow");
includeFooter = !!groupIncludeFooterCb({ node: this });
}
const ignoreAggData = isOpenGroup && includeFooter;
return this.getValue(column, node, ignoreAggData);
}
getValue(column, rowNode, ignoreAggData = false) {
if (!this.initialised) {
this.init();
}
if (!rowNode) {
return;
}
const colDef = column.getColDef();
const field = colDef.field;
const colId = column.getColId();
const data = rowNode.data;
let result;
const groupDataExists = rowNode.groupData && rowNode.groupData[colId] !== void 0;
const aggDataExists = !ignoreAggData && rowNode.aggData && rowNode.aggData[colId] !== void 0;
const ignoreSsrmAggData = this.isSsrm && ignoreAggData && !!column.getColDef().aggFunc;
const ssrmFooterGroupCol = this.isSsrm && rowNode.footer && rowNode.field && (column.getColDef().showRowGroup === true || column.getColDef().showRowGroup === rowNode.field);
if (this.isTreeData && aggDataExists) {
result = rowNode.aggData[colId];
} else if (this.isTreeData && colDef.valueGetter) {
result = this.executeValueGetter(colDef.valueGetter, data, column, rowNode);
} else if (this.isTreeData && field && data) {
result = _getValueUsingField(data, field, column.isFieldContainsDots());
} else if (groupDataExists) {
result = rowNode.groupData[colId];
} else if (aggDataExists) {
result = rowNode.aggData[colId];
} else if (colDef.valueGetter) {
result = this.executeValueGetter(colDef.valueGetter, data, column, rowNode);
} else if (ssrmFooterGroupCol) {
result = _getValueUsingField(data, rowNode.field, column.isFieldContainsDots());
} else if (field && data && !ignoreSsrmAggData) {
result = _getValueUsingField(data, field, column.isFieldContainsDots());
}
if (this.cellExpressions && typeof result === "string" && result.indexOf("=") === 0) {
const cellValueGetter = result.substring(1);
result = this.executeValueGetter(cellValueGetter, data, column, rowNode);
}
if (result == null) {
const openedGroup = this.getOpenedGroup(rowNode, column);
if (openedGroup != null) {
return openedGroup;
}
}
return result;
}
parseValue(column, rowNode, newValue, oldValue) {
const colDef = column.getColDef();
const valueParser = colDef.valueParser;
if (_exists(valueParser)) {
const params = _addGridCommonParams(this.gos, {
node: rowNode,
data: rowNode?.data,
oldValue,
newValue,
colDef,
column
});
if (typeof valueParser === "function") {
return valueParser(params);
}
return this.expressionSvc?.evaluate(valueParser, params);
}
return newValue;
}
getDeleteValue(column, rowNode) {
if (_exists(column.getColDef().valueParser)) {
return this.parseValue(column, rowNode, "", this.getValueForDisplay(column, rowNode)) ?? null;
}
return null;
}
formatValue(column, node, value, suppliedFormatter, useFormatterFromColumn = true) {
let result = null;
let formatter;
const colDef = column.getColDef();
if (suppliedFormatter) {
formatter = suppliedFormatter;
} else if (useFormatterFromColumn) {
formatter = colDef.valueFormatter;
}
if (formatter) {
const params = _addGridCommonParams(this.gos, {
value,
node,
data: node ? node.data : null,
colDef,
column
});
if (typeof formatter === "function") {
result = formatter(params);
} else {
result = this.expressionSvc ? this.expressionSvc.evaluate(formatter, params) : null;
}
} else if (colDef.refData) {
return colDef.refData[value] || "";
}
if (result == null && Array.isArray(value)) {
result = value.join(", ");
}
return result;
}
getOpenedGroup(rowNode, column) {
if (!this.gos.get("showOpenedGroup")) {
return;
}
const colDef = column.getColDef();
if (!colDef.showRowGroup) {
return;
}
const showRowGroup = column.getColDef().showRowGroup;
let pointer = rowNode.parent;
while (pointer != null) {
if (pointer.rowGroupColumn && (showRowGroup === true || showRowGroup === pointer.rowGroupColumn.getColId())) {
return pointer.key;
}
pointer = pointer.parent;
}
return void 0;
}
/**
* Sets the value of a GridCell
* @param rowNode The `RowNode` to be updated
* @param colKey The `Column` to be updated
* @param newValue The new value to be set
* @param eventSource The event source
* @returns `True` if the value has been updated, otherwise`False`.
*/
setValue(rowNode, colKey, newValue, eventSource) {
const column = this.colModel.getColDefCol(colKey);
if (!rowNode || !column) {
return false;
}
if (_missing(rowNode.data)) {
rowNode.data = {};
}
const { field, valueSetter } = column.getColDef();
if (_missing(field) && _missing(valueSetter)) {
_warn(17);
return false;
}
if (this.dataTypeSvc && !this.dataTypeSvc.checkType(column, newValue)) {
_warn(135);
return false;
}
const params = _addGridCommonParams(this.gos, {
node: rowNode,
data: rowNode.data,
oldValue: this.getValue(column, rowNode),
newValue,
colDef: column.getColDef(),
column
});
params.newValue = newValue;
let valueWasDifferent;
if (_exists(valueSetter)) {
if (typeof valueSetter === "function") {
valueWasDifferent = valueSetter(params);
} else {
valueWasDifferent = this.expressionSvc?.evaluate(valueSetter, params);
}
} else {
valueWasDifferent = this.setValueUsingField(rowNode.data, field, newValue, column.isFieldContainsDots());
}
if (valueWasDifferent === void 0) {
valueWasDifferent = true;
}
if (!valueWasDifferent) {
return false;
}
rowNode.resetQuickFilterAggregateText();
this.valueCache?.onDataChanged();
const savedValue = this.getValue(column, rowNode);
this.eventSvc.dispatchEvent({
type: "cellValueChanged",
event: null,
rowIndex: rowNode.rowIndex,
rowPinned: rowNode.rowPinned,
column: params.column,
colDef: params.colDef,
data: rowNode.data,
node: rowNode,
oldValue: params.oldValue,
newValue: savedValue,
value: savedValue,
source: eventSource
});
return true;
}
callColumnCellValueChangedHandler(event) {
const onCellValueChanged = event.colDef.onCellValueChanged;
if (typeof onCellValueChanged === "function") {
this.beans.frameworkOverrides.wrapOutgoing(() => {
onCellValueChanged({
node: event.node,
data: event.data,
oldValue: event.oldValue,
newValue: event.newValue,
colDef: event.colDef,
column: event.column,
api: event.api,
context: event.context
});
});
}
}
setValueUsingField(data, field, newValue, isFieldContainsDots) {
if (!field) {
return false;
}
let valuesAreSame = false;
if (!isFieldContainsDots) {
valuesAreSame = data[field] === newValue;
if (!valuesAreSame) {
data[field] = newValue;
}
} else {
const fieldPieces = field.split(".");
let currentObject = data;
while (fieldPieces.length > 0 && currentObject) {
const fieldPiece = fieldPieces.shift();
if (fieldPieces.length === 0) {
valuesAreSame = currentObject[fieldPiece] === newValue;
if (!valuesAreSame) {
currentObject[fieldPiece] = newValue;
}
} else {
currentObject = currentObject[fieldPiece];
}
}
}
return !valuesAreSame;
}
executeValueGetterWithValueCache(valueGetter, data, column, rowNode) {
const colId = column.getColId();
const valueFromCache = this.valueCache.getValue(rowNode, colId);
if (valueFromCache !== void 0) {
return valueFromCache;
}
const result = this.executeValueGetterWithoutValueCache(valueGetter, data, column, rowNode);
this.valueCache.setValue(rowNode, colId, result);
return result;
}
executeValueGetterWithoutValueCache(valueGetter, data, column, rowNode) {
const params = _addGridCommonParams(this.gos, {
data,
node: rowNode,
column,
colDef: column.getColDef(),
getValue: this.getValueCallback.bind(this, rowNode)
});
let result;
if (typeof valueGetter === "function") {
result = valueGetter(params);
} else {
result = this.expressionSvc?.evaluate(valueGetter, params);
}
return result;
}
getValueCallback(node, field) {
const otherColumn = this.colModel.getColDefCol(field);
if (otherColumn) {
return this.getValue(otherColumn, node);
}
return null;
}
// used by row grouping and pivot, to get key for a row. col can be a pivot col or a row grouping col
getKeyForNode(col, rowNode) {
const value = this.getValue(col, rowNode);
const keyCreator = col.getColDef().keyCreator;
let result = value;
if (keyCreator) {
const keyParams = _addGridCommonParams(this.gos, {
value,
colDef: col.getColDef(),
column: col,
node: rowNode,
data: rowNode.data
});
result = keyCreator(keyParams);
}
if (typeof result === "string" || result == null) {
return result;
}
result = String(result);
if (result === "[object Object]") {
_warn(121);
}
return result;
}
};
// packages/ag-grid-community/src/gridCoreModule.ts
var CommunityCoreModule = {
moduleName: "CommunityCore",
version: VERSION,
beans: [
GridDestroyService,
ApiFunctionService,
Registry,
UserComponentFactory,
RowContainerHeightService,
VisibleColsService,
EventService,
GridOptionsService,
ColumnModel,
PageBoundsService,
PageBoundsListener,
RowRenderer,
ValueService,
FocusService,
Environment,
ScrollVisibleService,
CtrlsService,
SyncService,
ColumnNameService,
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,
destroy,
isDestroyed,
getGridOption,
setGridOption,
updateGridOptions
},
dependsOn: [
DataTypeModule,
ColumnMoveModule,
ColumnResizeModule,
SortModule,
ColumnHeaderCompModule,
ColumnGroupModule,
ColumnGroupHeaderCompModule,
OverlayModule,
ChangeDetectionModule,
AnimationFrameModule,
KeyboardNavigationModule,
PinnedColumnModule,
AriaModule,
TouchModule,
CellRendererFunctionModule,
ColumnFlexModule,
ExpressionModule
]
};
// packages/ag-grid-community/src/grid.ts
var _GlobalGridOptions = class _GlobalGridOptions {
/**
* @param providedOptions
* @returns Shallow copy of the provided options with global options merged in.
*/
static applyGlobalGridOptions(providedOptions) {
if (!_GlobalGridOptions.gridOptions) {
return { ...providedOptions };
}
let mergedGridOps = {};
_mergeDeep(mergedGridOps, _GlobalGridOptions.gridOptions, true, true);
if (_GlobalGridOptions.mergeStrategy === "deep") {
_mergeDeep(mergedGridOps, providedOptions, true, true);
} else {
mergedGridOps = { ...mergedGridOps, ...providedOptions };
}
if (_GlobalGridOptions.gridOptions.context) {
mergedGridOps.context = _GlobalGridOptions.gridOptions.context;
}
if (providedOptions.context) {
if (_GlobalGridOptions.mergeStrategy === "deep" && mergedGridOps.context) {
_mergeDeep(providedOptions.context, mergedGridOps.context, true, true);
}
mergedGridOps.context = providedOptions.context;
}
return mergedGridOps;
}
};
_GlobalGridOptions.gridOptions = void 0;
_GlobalGridOptions.mergeStrategy = "shallow";
var GlobalGridOptions = _GlobalGridOptions;
function provideGlobalGridOptions(gridOptions, mergeStrategy = "shallow") {
GlobalGridOptions.gridOptions = gridOptions;
GlobalGridOptions.mergeStrategy = mergeStrategy;
}
function _getGlobalGridOption(gridOption) {
return GlobalGridOptions.gridOptions?.[gridOption];
}
function createGrid(eGridDiv, gridOptions, params) {
if (!gridOptions) {
_error(11);
return {};
}
const gridParams = params;
let destroyCallback;
if (!gridParams?.setThemeOnGridDiv) {
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(eGridDiv);
context.createBean(gridComp);
},
void 0,
params,
destroyCallback
);
return api;
}
var nextGridId = 1;
var GridCoreCreator = class {
create(eGridDiv, providedOptions, createUi, acceptChanges, params, destroyCallback) {
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) {
return void 0;
}
const contextParams = {
providedBeanInstances,
beanClasses,
gridId,
beanInitComparator: gridBeanInitComparator,
beanDestroyComparator: gridBeanDestroyComparator,
derivedBeans: [createGridApi],
destroyCallback
};
const context = new Context(contextParams);
this.registerModuleFeatures(context, registeredModules);
createUi(context);
context.getBean("syncSvc").start();
if (acceptChanges) {
acceptChanges(context);
}
return context.getBean("gridApi");
}
getRegisteredModules(params, gridId, rowModelType) {
_registerModule(CommunityCoreModule, void 0);
params?.modules?.forEach((m) => _registerModule(m, gridId));
return _getRegisteredModules(gridId, rowModelType);
}
registerModuleFeatures(context, registeredModules) {
const registry = context.getBean("registry");
const apiFunctionSvc = context.getBean("apiFunctionSvc");
registeredModules.forEach((module2) => {
registry.registerModule(module2);
const apiFunctions = module2.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 (_missing(frameworkOverrides)) {
frameworkOverrides = new VanillaFrameworkOverrides();
}
const seed = {
gridOptions,
eGridDiv,
globalListener: params ? params.globalListener : null,
globalSyncListener: params ? params.globalSyncListener : null,
frameworkOverrides
};
if (params && params.providedBeanInstances) {
Object.assign(seed, params.providedBeanInstances);
}
return seed;
}
createBeansList(rowModelType, registeredModules, gridId) {
const rowModelModuleNames = {
clientSide: "ClientSideRowModel",
infinite: "InfiniteRowModel",
serverSide: "ServerSideRowModel",
viewport: "ViewportRowModel"
};
const rowModuleModelName = rowModelModuleNames[rowModelType];
if (!rowModuleModelName) {
_logPreInitErr(201, { rowModelType }, `Unknown rowModelType ${rowModelType}.`);
return;
}
if (!_isModuleRegistered(rowModuleModelName, gridId, rowModelType)) {
_logPreInitErr(
200,
{
reasonOrId: `rowModelType = '${rowModelType}'`,
moduleName: rowModuleModelName,
gridScoped: _areModulesGridScoped(),
gridId,
rowModelType
},
`Missing module ${rowModuleModelName}Module for rowModelType ${rowModelType}.
If upgrading from before v33, see ${baseDocLink}/upgrading-to-ag-grid-33/#changes-to-modules/`
);
return;
}
const beans = /* @__PURE__ */ new Set();
registeredModules.forEach((module2) => module2.beans?.forEach((bean) => beans.add(bean)));
return Array.from(beans);
}
};
// packages/ag-grid-community/src/api/rowModelApiUtils.ts
function _getClientSideRowModel(beans) {
const rowModel = beans.rowModel;
return rowModel.getType() === "clientSide" ? rowModel : void 0;
}
function _getInfiniteRowModel(beans) {
const rowModel = beans.rowModel;
return rowModel.getType() === "infinite" ? rowModel : void 0;
}
function _getServerSideRowModel(beans) {
const rowModel = beans.rowModel;
return rowModel.getType() === "serverSide" ? rowModel : void 0;
}
// packages/ag-grid-community/src/eventTypes.ts
var _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"
];
var _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"
];
var _ALL_EVENTS = [..._PUBLIC_EVENTS, ..._INTERNAL_EVENTS];
// packages/ag-grid-community/src/misc/locale/localeService.ts
var LocaleService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "localeSvc";
}
getLocaleTextFunc() {
const gos = this.gos;
const getLocaleText = gos.getCallback("getLocaleText");
if (getLocaleText) {
return (key, defaultValue, variableValues) => {
const params = {
key,
defaultValue,
variableValues
};
return getLocaleText(params);
};
}
const localeText = gos.get("localeText");
return (key, defaultValue, variableValues) => {
let localisedText = localeText && localeText[key];
if (localisedText && variableValues && variableValues.length) {
let found = 0;
while (true) {
if (found >= variableValues.length) {
break;
}
const idx = localisedText.indexOf("${variable}");
if (idx === -1) {
break;
}
localisedText = localisedText.replace("${variable}", variableValues[found++]);
}
}
return localisedText ?? defaultValue;
};
}
};
// packages/ag-grid-community/src/propertyKeys.ts
var STRING_GRID_OPTIONS = [
"overlayLoadingTemplate",
"overlayNoRowsTemplate",
"gridId",
"quickFilterText",
"rowModelType",
"editType",
"domLayout",
"clipboardDelimiter",
"rowGroupPanelShow",
"multiSortKey",
"pivotColumnGroupTotals",
"pivotRowTotals",
"pivotPanelShow",
"fillHandleDirection",
"groupDisplayType",
"treeDataDisplayType",
"treeDataChildrenField",
"colResizeDefault",
"tooltipTrigger",
"serverSidePivotResultFieldSeparator",
"columnMenu",
"tooltipShowMode",
"grandTotalRow",
"themeCssLayer"
];
var OBJECT_GRID_OPTIONS = [
"components",
"rowStyle",
"context",
"autoGroupColumnDef",
"localeText",
"icons",
"datasource",
"dragAndDropImageComponentParams",
"serverSideDatasource",
"viewportDatasource",
"groupRowRendererParams",
"aggFuncs",
"fullWidthCellRendererParams",
"defaultColGroupDef",
"defaultColDef",
"defaultCsvExportParams",
"defaultExcelExportParams",
"columnTypes",
"rowClassRules",
"detailCellRendererParams",
"loadingCellRendererParams",
"loadingOverlayComponentParams",
"noRowsOverlayComponentParams",
"popupParent",
"themeStyleContainer",
"statusBar",
"chartThemeOverrides",
"customChartThemes",
"chartToolPanelsDef",
"dataTypeDefinitions",
"advancedFilterParent",
"advancedFilterBuilderParams",
"initialState",
"autoSizeStrategy",
"selectionColumnDef"
];
var ARRAY_GRID_OPTIONS = [
"sortingOrder",
"alignedGrids",
"rowData",
"columnDefs",
"excelStyles",
"pinnedTopRowData",
"pinnedBottomRowData",
"chartThemes",
"rowClass",
"paginationPageSizeSelector"
];
var _NUMBER_GRID_OPTIONS = [
"rowHeight",
"detailRowHeight",
"rowBuffer",
"headerHeight",
"groupHeaderHeight",
"groupLockGroupColumns",
"floatingFiltersHeight",
"pivotHeaderHeight",
"pivotGroupHeaderHeight",
"groupDefaultExpanded",
"pivotDefaultExpanded",
"viewportRowModelPageSize",
"viewportRowModelBufferSize",
"autoSizePadding",
"maxBlocksInCache",
"maxConcurrentDatasourceRequests",
"tooltipShowDelay",
"tooltipHideDelay",
"cacheOverflowSize",
"paginationPageSize",
"cacheBlockSize",
"infiniteInitialRowCount",
"serverSideInitialRowCount",
"scrollbarWidth",
"asyncTransactionWaitMillis",
"blockLoadDebounceMillis",
"keepDetailRowsCount",
"undoRedoCellEditingLimit",
"cellFlashDuration",
"cellFadeDuration",
"tabIndex",
"pivotMaxGeneratedColumns"
];
var OTHER_GRID_OPTIONS = ["theme", "rowSelection"];
var _BOOLEAN_MIXED_GRID_OPTIONS = [
"cellSelection",
"sideBar",
"rowNumbers",
"suppressGroupChangesColumnVisibility",
"groupAggFiltering",
"suppressStickyTotalRow",
"groupHideParentOfSingleChild"
];
var _BOOLEAN_GRID_OPTIONS = [
"loadThemeGoogleFonts",
"suppressMakeColumnVisibleAfterUnGroup",
"suppressRowClickSelection",
"suppressCellFocus",
"suppressHeaderFocus",
"suppressHorizontalScroll",
"groupSelectsChildren",
"alwaysShowHorizontalScroll",
"alwaysShowVerticalScroll",
"debug",
"enableBrowserTooltips",
"enableCellExpressions",
"groupSuppressBlankHeader",
"suppressMenuHide",
"suppressRowDeselection",
"unSortIcon",
"suppressMultiSort",
"alwaysMultiSort",
"singleClickEdit",
"suppressLoadingOverlay",
"suppressNoRowsOverlay",
"suppressAutoSize",
"skipHeaderOnAutoSize",
"suppressColumnMoveAnimation",
"suppressMoveWhenColumnDragging",
"suppressMovableColumns",
"suppressFieldDotNotation",
"enableRangeSelection",
"enableRangeHandle",
"enableFillHandle",
"suppressClearOnFillReduction",
"deltaSort",
"suppressTouch",
"allowContextMenuWithControlKey",
"suppressContextMenu",
"suppressDragLeaveHidesColumns",
"suppressRowGroupHidesColumns",
"suppressMiddleClickScrolls",
"suppressPreventDefaultOnMouseWheel",
"suppressCopyRowsToClipboard",
"copyHeadersToClipboard",
"copyGroupHeadersToClipboard",
"pivotMode",
"suppressAggFuncInHeader",
"suppressColumnVirtualisation",
"alwaysAggregateAtRootLevel",
"suppressFocusAfterRefresh",
"functionsReadOnly",
"animateRows",
"groupSelectsFiltered",
"groupRemoveSingleChildren",
"groupRemoveLowestSingleChildren",
"enableRtl",
"enableCellSpan",
"suppressClickEdit",
"rowDragEntireRow",
"rowDragManaged",
"suppressRowDrag",
"suppressMoveWhenRowDragging",
"rowDragMultiRow",
"enableGroupEdit",
"embedFullWidthRows",
"suppressPaginationPanel",
"groupHideOpenParents",
"groupAllowUnbalanced",
"pagination",
"paginationAutoPageSize",
"suppressScrollOnNewData",
"suppressScrollWhenPopupsAreOpen",
"purgeClosedRowNodes",
"cacheQuickFilter",
"includeHiddenColumnsInQuickFilter",
"ensureDomOrder",
"accentedSort",
"suppressChangeDetection",
"valueCache",
"valueCacheNeverExpires",
"aggregateOnlyChangedColumns",
"suppressAnimationFrame",
"suppressExcelExport",
"suppressCsvExport",
"includeHiddenColumnsInAdvancedFilter",
"suppressMultiRangeSelection",
"enterNavigatesVerticallyAfterEdit",
"enterNavigatesVertically",
"suppressPropertyNamesCheck",
"rowMultiSelectWithClick",
"suppressRowHoverHighlight",
"suppressRowTransform",
"suppressClipboardPaste",
"suppressLastEmptyLineOnPaste",
"enableCharts",
"suppressMaintainUnsortedOrder",
"enableCellTextSelection",
"suppressBrowserResizeObserver",
"suppressMaxRenderedRowRestriction",
"excludeChildrenWhenTreeDataFiltering",
"tooltipMouseTrack",
"tooltipInteraction",
"keepDetailRows",
"paginateChildRows",
"preventDefaultOnContextMenu",
"undoRedoCellEditing",
"allowDragFromColumnsToolPanel",
"pivotSuppressAutoColumn",
"suppressExpandablePivotGroups",
"debounceVerticalScrollbar",
"detailRowAutoHeight",
"serverSideSortAllLevels",
"serverSideEnableClientSideSort",
"serverSideOnlyRefreshFilteredGroups",
"suppressAggFilteredOnly",
"showOpenedGroup",
"suppressClipboardApi",
"suppressModelUpdateAfterUpdateTransaction",
"stopEditingWhenCellsLoseFocus",
"groupMaintainOrder",
"columnHoverHighlight",
"readOnlyEdit",
"suppressRowVirtualisation",
"enableCellEditingOnBackspace",
"resetRowDataOnUpdate",
"removePivotHeaderRowWhenSingleValueColumn",
"suppressCopySingleCellRanges",
"suppressGroupRowsSticky",
"suppressCutToClipboard",
"rowGroupPanelSuppressSort",
"allowShowChangeAfterFilter",
"enableAdvancedFilter",
"masterDetail",
"treeData",
"reactiveCustomComponents",
"applyQuickFilterBeforePivotOrAgg",
"suppressServerSideFullWidthLoadingRow",
"suppressAdvancedFilterEval",
"loading",
"maintainColumnOrder",
"enableStrictPivotColumnOrder",
"suppressSetFilterByDefault"
];
var _FUNCTION_GRID_OPTIONS = [
"doesExternalFilterPass",
"processPivotResultColDef",
"processPivotResultColGroupDef",
"getBusinessKeyForNode",
"isRowSelectable",
"rowDragText",
"groupRowRenderer",
"dragAndDropImageComponent",
"fullWidthCellRenderer",
"loadingCellRenderer",
"loadingOverlayComponent",
"noRowsOverlayComponent",
"detailCellRenderer",
"quickFilterParser",
"quickFilterMatcher",
"getLocaleText",
"isExternalFilterPresent",
"getRowHeight",
"getRowClass",
"getRowStyle",
"getContextMenuItems",
"getMainMenuItems",
"processRowPostCreate",
"processCellForClipboard",
"getGroupRowAgg",
"isFullWidthRow",
"sendToClipboard",
"focusGridInnerElement",
"navigateToNextHeader",
"tabToNextHeader",
"navigateToNextCell",
"tabToNextCell",
"processCellFromClipboard",
"getDocument",
"postProcessPopup",
"getChildCount",
"getDataPath",
"isRowMaster",
"postSortRows",
"processHeaderForClipboard",
"processUnpinnedColumns",
"processGroupHeaderForClipboard",
"paginationNumberFormatter",
"processDataFromClipboard",
"getServerSideGroupKey",
"isServerSideGroup",
"createChartContainer",
"getChartToolbarItems",
"fillOperation",
"isApplyServerSideTransaction",
"getServerSideGroupLevelParams",
"isServerSideGroupOpenByDefault",
"isGroupOpenByDefault",
"initialGroupOrderComparator",
"loadingCellRendererSelector",
"getRowId",
"chartMenuItems",
"groupTotalRow",
"alwaysPassFilter"
];
var _ALL_GRID_OPTIONS = [
...ARRAY_GRID_OPTIONS,
...OBJECT_GRID_OPTIONS,
...STRING_GRID_OPTIONS,
..._NUMBER_GRID_OPTIONS,
..._FUNCTION_GRID_OPTIONS,
..._BOOLEAN_GRID_OPTIONS,
..._BOOLEAN_MIXED_GRID_OPTIONS,
...OTHER_GRID_OPTIONS
];
// packages/ag-grid-community/src/components/framework/frameworkComponentWrapper.ts
var BaseComponentWrapper = class {
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)) {
return wrapper.callMethod(methodName, arguments);
}
if (mandatory) {
_warn(49, { methodName });
}
return null;
};
}
};
// packages/ag-grid-community/src/tooltip/tooltipComponent.ts
var TooltipComponent2 = class extends PopupComponent {
constructor() {
super(
/* html */
``
);
}
// will need to type params
init(params) {
const { value } = params;
this.getGui().textContent = _escapeString(value, true);
}
};
// packages/ag-grid-community/src/utils/fuzzyMatch.ts
function _fuzzySuggestions(params) {
const { inputValue, allSuggestions, hideIrrelevant, filterByPercentageOfBestMatch, addSequentialWeight } = params;
let thisSuggestions = allSuggestions.map((text, idx) => ({
value: text,
relevance: levenshteinDistance(inputValue.toLowerCase(), text.toLocaleLowerCase(), addSequentialWeight),
idx
}));
thisSuggestions.sort((a, b) => b.relevance - a.relevance);
if (hideIrrelevant) {
thisSuggestions = thisSuggestions.filter((suggestion) => suggestion.relevance !== 0);
}
if (thisSuggestions.length > 0 && filterByPercentageOfBestMatch && filterByPercentageOfBestMatch > 0) {
const bestMatch = thisSuggestions[0].relevance;
const limit = bestMatch * filterByPercentageOfBestMatch;
thisSuggestions = thisSuggestions.filter((suggestion) => limit - suggestion.relevance < 0);
}
const values = [];
const indices = [];
for (const suggestion of thisSuggestions) {
values.push(suggestion.value);
indices.push(suggestion.idx);
}
return { values, indices };
}
function getAllSubstrings(str) {
const result = [];
const size = str.length;
for (let len = 1; len <= size; len++) {
for (let i = 0; i <= size - len; i++) {
const j = i + len - 1;
result.push(str.slice(i, j + 1));
}
}
return result;
}
function levenshteinDistance(str1, str2, addSequentialWeight = false) {
const a = str1.replace(/\s/g, "");
const b = str2.replace(/\s/g, "");
const len1 = a.length;
const len2 = b.length;
const m = new Array(len1 + 1).fill(null).map(() => new Array(len2 + 1).fill(0));
for (let i = 0; i <= len1; i += 1) {
m[i][0] = i;
}
for (let j = 0; j <= len2; j += 1) {
m[0][j] = j;
}
for (let i = 1; i <= len1; i++) {
for (let j = 1; j <= len2; j++) {
if (a[i - 1] === b[j - 1]) {
m[i][j] = m[i - 1][j - 1];
} else {
m[i][j] = 1 + Math.min(m[i][j - 1], Math.min(m[i - 1][j], m[i - 1][j - 1]));
}
}
}
const distance = m[len1][len2];
const maxDistance = Math.max(len1, len2);
let weight = maxDistance - distance;
if (addSequentialWeight) {
const substrings = getAllSubstrings(a);
for (let i = 0; i < substrings.length; i++) {
const currentSubstring = substrings[i];
if (b.indexOf(currentSubstring) !== -1) {
weight += 1;
weight *= currentSubstring.length;
}
}
}
return weight;
}
// packages/ag-grid-community/src/utils/number.ts
function _formatNumberCommas(value, getLocaleTextFunc) {
if (typeof value !== "number") {
return "";
}
const localeTextFunc = getLocaleTextFunc();
const thousandSeparator = localeTextFunc("thousandSeparator", ",");
const decimalSeparator = localeTextFunc("decimalSeparator", ".");
return value.toString().replace(".", decimalSeparator).replace(/(\d)(?=(\d{3})+(?!\d))/g, `$1${thousandSeparator}`);
}
// packages/ag-grid-community/src/export/baseCreator.ts
var BaseCreator = class extends 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()}`;
}
};
// packages/ag-grid-community/src/export/baseGridSerializingSession.ts
var BaseGridSerializingSession = class {
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) {
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) {
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()] !== void 0) {
return true;
}
if (_isServerSideRowModel(this.gos) && node.group) {
return true;
}
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 = _isGroupUseEntireRow(this.gos, this.colModel.isPivotMode());
return currentColumnIndex === 0 && isGroupUseEntireRow;
}
getHeaderName(callback, column) {
if (callback) {
return callback(_addGridCommonParams(this.gos, { column }));
}
return this.colNames.getDisplayNameForColumn(column, "csv", true);
}
createValueForGroupNode(column, node) {
if (this.processRowGroupCallback) {
return this.processRowGroupCallback(_addGridCommonParams(this.gos, { column, node }));
}
const isTreeData = this.gos.get("treeData");
const getValueFromNode = (node2) => {
if (isTreeData) {
return node2.key;
}
const value = node2.groupData?.[column.getId()];
if (!value || !node2.rowGroupColumn || node2.rowGroupColumn.getColDef().useValueFormatterForExport === false) {
return value;
}
return this.valueSvc.formatValue(node2.rowGroupColumn, node2, value) ?? value;
};
const isFooter = node.footer;
const keys = [getValueFromNode(node)];
if (!_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(
_addGridCommonParams(this.gos, {
accumulatedRowIndex,
column,
node: rowNode,
value,
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 ?? "" };
}
};
// packages/ag-grid-community/src/export/downloader.ts
function _downloadFile(fileName, content) {
const win = document.defaultView || window;
if (!win) {
_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);
}
// packages/ag-grid-community/src/gridOptionsInitial.ts
var 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
};
// packages/ag-grid-community/src/validation/apiFunctionValidator.ts
var clientSide = "clientSide";
var serverSide = "serverSide";
var infinite = "infinite";
var functionRowModels = {
onGroupExpandedOrCollapsed: [clientSide],
refreshClientSideRowModel: [clientSide],
isRowDataEmpty: [clientSide],
forEachLeafNode: [clientSide],
forEachNodeAfterFilter: [clientSide],
forEachNodeAfterFilterAndSort: [clientSide],
resetRowHeights: [clientSide],
applyTransaction: [clientSide],
applyTransactionAsync: [clientSide],
flushAsyncTransactions: [clientSide],
getBestCostNodeSelection: [clientSide],
getServerSideSelectionState: [serverSide],
setServerSideSelectionState: [serverSide],
applyServerSideTransaction: [serverSide],
applyServerSideTransactionAsync: [serverSide],
applyServerSideRowData: [serverSide],
retryServerSideLoads: [serverSide],
flushServerSideAsyncTransactions: [serverSide],
refreshServerSide: [serverSide],
getServerSideGroupLevelState: [serverSide],
refreshInfiniteCache: [infinite],
purgeInfiniteCache: [infinite],
getInfiniteRowCount: [infinite],
isLastRowIndexKnown: [infinite, serverSide],
expandAll: [clientSide, serverSide],
collapseAll: [clientSide, serverSide],
onRowHeightChanged: [clientSide, serverSide],
setRowCount: [infinite, serverSide],
getCacheBlockState: [infinite, serverSide]
};
var deprecatedFunctions = {
showLoadingOverlay: {
version: "v32",
message: '`showLoadingOverlay` is deprecated. Use the grid option "loading"=true instead or setGridOption("loading", true).'
},
clearRangeSelection: {
version: "v32.2",
message: "Use `clearCellSelection` instead."
},
getInfiniteRowCount: {
version: "v32.2",
old: "getInfiniteRowCount()",
new: "getDisplayedRowCount()"
},
selectAllFiltered: {
version: "v33",
old: "selectAllFiltered()",
new: 'selectAll("filtered")'
},
deselectAllFiltered: {
version: "v33",
old: "deselectAllFiltered()",
new: 'deselectAll("filtered")'
},
selectAllOnCurrentPage: {
version: "v33",
old: "selectAllOnCurrentPage()",
new: 'selectAll("currentPage")'
},
deselectAllOnCurrentPage: {
version: "v33",
old: "deselectAllOnCurrentPage()",
new: 'deselectAll("currentPage")'
}
};
function validateApiFunction(functionName, apiFunction, beans) {
const deprecation = deprecatedFunctions[functionName];
if (deprecation) {
const { version, new: replacement, old, message } = deprecation;
const apiMethod = old ?? functionName;
return (...args) => {
const replacementMessage = replacement ? `Please use ${replacement} instead. ` : "";
_warnOnce(`Since ${version} api.${apiMethod} is deprecated. ${replacementMessage}${message ?? ""}`);
return apiFunction.apply(apiFunction, args);
};
}
const rowModels = functionRowModels[functionName];
if (rowModels) {
return (...args) => {
const rowModel = beans.rowModel.getType();
if (!rowModels.includes(rowModel)) {
_errorOnce(
`api.${functionName} can only be called when gridOptions.rowModelType is ${rowModels.join(" or ")}`
);
return void 0;
}
return apiFunction.apply(apiFunction, args);
};
}
return apiFunction;
}
// packages/ag-grid-community/src/validation/enterpriseModuleNames.ts
var ENTERPRISE_MODULE_NAMES = {
AdvancedFilter: 1,
AllEnterprise: 1,
CellSelection: 1,
Clipboard: 1,
ColumnMenu: 1,
ColumnsToolPanel: 1,
ContextMenu: 1,
ExcelExport: 1,
FiltersToolPanel: 1,
GridCharts: 1,
IntegratedCharts: 1,
GroupFilter: 1,
MasterDetail: 1,
Menu: 1,
MultiFilter: 1,
Pivot: 1,
RangeSelection: 1,
RichSelect: 1,
RowNumbers: 1,
RowGrouping: 1,
RowGroupingPanel: 1,
ServerSideRowModelApi: 1,
ServerSideRowModel: 1,
SetFilter: 1,
SideBar: 1,
Sparklines: 1,
StatusBar: 1,
TreeData: 1,
ViewportRowModel: 1
};
// packages/ag-grid-community/src/validation/resolvableModuleNames.ts
var ALL_COLUMN_FILTERS = [
"TextFilter",
"NumberFilter",
"DateFilter",
"SetFilter",
"MultiFilter",
"GroupFilter",
"CustomFilter"
];
var RESOLVABLE_MODULE_NAMES = {
EditCore: [
"TextEditor",
"NumberEditor",
"DateEditor",
"CheckboxEditor",
"LargeTextEditor",
"SelectEditor",
"RichSelect",
"CustomEditor"
],
CheckboxCellRenderer: ["AllCommunity"],
ClientSideRowModelHierarchy: ["RowGrouping", "Pivot", "TreeData"],
ColumnFilter: ALL_COLUMN_FILTERS,
ColumnGroupHeaderComp: ["AllCommunity"],
ColumnGroup: ["AllCommunity"],
ColumnHeaderComp: ["AllCommunity"],
ColumnMove: ["AllCommunity"],
ColumnResize: ["AllCommunity"],
CommunityCore: ["AllCommunity"],
CsrmSsrmSharedApi: ["ClientSideRowModelApi", "ServerSideRowModelApi"],
EnterpriseCore: ["AllEnterprise"],
FilterCore: [...ALL_COLUMN_FILTERS, "QuickFilter", "ExternalFilter", "AdvancedFilter"],
GroupCellRenderer: ["RowGrouping", "Pivot", "TreeData", "MasterDetail", "ServerSideRowModel"],
KeyboardNavigation: ["AllCommunity"],
LoadingCellRenderer: ["ServerSideRowModel"],
MenuCore: ["ColumnMenu", "ContextMenu"],
MenuItem: ["ColumnMenu", "ContextMenu", "MultiFilter", "IntegratedCharts", "ColumnsToolPanel"],
Overlay: ["AllCommunity"],
PinnedColumn: ["AllCommunity"],
SharedAggregation: ["RowGrouping", "Pivot", "TreeData", "ServerSideRowModel"],
SharedDragAndDrop: ["AllCommunity"],
SharedMasterDetail: ["MasterDetail", "ServerSideRowModel"],
SharedMenu: [...ALL_COLUMN_FILTERS, "ColumnMenu", "ContextMenu"],
SharedPivot: ["Pivot", "ServerSideRowModel"],
SharedRowGrouping: ["RowGrouping", "ServerSideRowModel"],
SharedRowSelection: ["RowSelection", "ServerSideRowModel"],
SkeletonCellRenderer: ["ServerSideRowModel"],
Sort: ["AllCommunity"],
SsrmInfiniteSharedApi: ["InfiniteRowModel", "ServerSideRowModelApi"],
SharedTreeData: ["TreeData", "ServerSideRowModel"]
};
var MODULES_FOR_ROW_MODELS = {
InfiniteRowModel: "infinite",
ClientSideRowModelApi: "clientSide",
ClientSideRowModel: "clientSide",
ServerSideRowModelApi: "serverSide",
ServerSideRowModel: "serverSide",
ViewportRowModel: "viewport"
};
function resolveModuleNames(moduleName, rowModelType) {
const resolvedModuleNames = [];
(Array.isArray(moduleName) ? moduleName : [moduleName]).forEach((modName) => {
const resolved = RESOLVABLE_MODULE_NAMES[modName];
if (resolved) {
resolved.forEach((resolvedModName) => {
const rowModelForModule = MODULES_FOR_ROW_MODELS[resolvedModName];
if (!rowModelForModule || rowModelForModule === rowModelType) {
resolvedModuleNames.push(resolvedModName);
}
});
} else {
resolvedModuleNames.push(modName);
}
});
return resolvedModuleNames;
}
// packages/ag-grid-community/src/validation/rules/userCompValidations.ts
var USER_COMP_MODULES = {
agSetColumnFilter: "SetFilter",
agSetColumnFloatingFilter: "SetFilter",
agMultiColumnFilter: "MultiFilter",
agMultiColumnFloatingFilter: "MultiFilter",
agGroupColumnFilter: "GroupFilter",
agGroupColumnFloatingFilter: "GroupFilter",
agGroupCellRenderer: "GroupCellRenderer",
agGroupRowRenderer: "GroupCellRenderer",
agRichSelect: "RichSelect",
agRichSelectCellEditor: "RichSelect",
agDetailCellRenderer: "SharedMasterDetail",
agSparklineCellRenderer: "Sparklines",
agDragAndDropImage: "SharedDragAndDrop",
agColumnHeader: "ColumnHeaderComp",
agColumnGroupHeader: "ColumnGroupHeaderComp",
agSortIndicator: "Sort",
agAnimateShowChangeCellRenderer: "HighlightChanges",
agAnimateSlideCellRenderer: "HighlightChanges",
agLoadingCellRenderer: "LoadingCellRenderer",
agSkeletonCellRenderer: "SkeletonCellRenderer",
agCheckboxCellRenderer: "CheckboxCellRenderer",
agLoadingOverlay: "Overlay",
agNoRowsOverlay: "Overlay",
agTooltipComponent: "Tooltip",
agReadOnlyFloatingFilter: "CustomFilter",
agTextColumnFilter: "TextFilter",
agNumberColumnFilter: "NumberFilter",
agDateColumnFilter: "DateFilter",
agDateInput: "DateFilter",
agTextColumnFloatingFilter: "TextFilter",
agNumberColumnFloatingFilter: "NumberFilter",
agDateColumnFloatingFilter: "DateFilter",
agCellEditor: "TextEditor",
agSelectCellEditor: "SelectEditor",
agTextCellEditor: "TextEditor",
agNumberCellEditor: "NumberEditor",
agDateCellEditor: "DateEditor",
agDateStringCellEditor: "DateEditor",
agCheckboxCellEditor: "CheckboxEditor",
agLargeTextCellEditor: "LargeTextEditor",
agMenuItem: "MenuItem",
agColumnsToolPanel: "ColumnsToolPanel",
agFiltersToolPanel: "FiltersToolPanel",
agAggregationComponent: "StatusBar",
agSelectedRowCountComponent: "StatusBar",
agTotalRowCountComponent: "StatusBar",
agFilteredRowCountComponent: "StatusBar",
agTotalAndFilteredRowCountComponent: "StatusBar"
};
// packages/ag-grid-community/src/validation/errorMessages/errorText.ts
var moduleImportMsg = (moduleNames) => {
const imports = moduleNames.map(
(moduleName) => `import { ${convertToUserModuleName(moduleName)} } from '${ENTERPRISE_MODULE_NAMES[moduleName] ? "ag-grid-enterprise" : "ag-grid-community"}';`
);
const includeCharts = moduleNames.some((m) => m === "IntegratedCharts" || m === "Sparklines");
if (includeCharts) {
const chartImport = `import { AgChartsEnterpriseModule } from 'ag-charts-enterprise';`;
imports.push(chartImport);
}
return `import { ModuleRegistry } from 'ag-grid-community';
${imports.join(" \n")}
ModuleRegistry.registerModules([ ${moduleNames.map((m) => convertToUserModuleName(m, true)).join(", ")} ]);
For more info see: ${baseDocLink}/modules/`;
};
function convertToUserModuleName(moduleName, inModuleRegistration = false) {
if (inModuleRegistration && (moduleName === "IntegratedCharts" || moduleName === "Sparklines")) {
return `${moduleName}Module.with(AgChartsEnterpriseModule)`;
}
return `${moduleName}Module`;
}
function umdMissingModule(reasonOrId, moduleNames) {
const chartModules = moduleNames.filter((m) => m === "IntegratedCharts" || m === "Sparklines");
let message = "";
const agChartsDynamic = globalThis?.agCharts;
if (!agChartsDynamic && chartModules.length > 0) {
message = `Unable to use ${reasonOrId} as either the ag-charts-community or ag-charts-enterprise script needs to be included alongside ag-grid-enterprise.
`;
} else if (moduleNames.some((m) => ENTERPRISE_MODULE_NAMES[m])) {
message = message + `Unable to use ${reasonOrId} as that requires the ag-grid-enterprise script to be included.
`;
}
return message;
}
var missingModule = ({
reasonOrId,
moduleName,
gridScoped,
gridId,
rowModelType,
additionalText,
isUmd: isUmd2
}) => {
const resolvedModuleNames = resolveModuleNames(moduleName, rowModelType);
const reason = typeof reasonOrId === "string" ? reasonOrId : MISSING_MODULE_REASONS[reasonOrId];
if (isUmd2) {
return umdMissingModule(reason, resolvedModuleNames);
}
const chartModules = resolvedModuleNames.filter((m) => m === "IntegratedCharts" || m === "Sparklines");
const chartImportRequired = chartModules.length > 0 ? `${chartModules.map((m) => convertToUserModuleName(m)).join()} must be initialised with an AG Charts module. One of 'AgChartsCommunityModule' / 'AgChartsEnterpriseModule'.` : "";
const explanation = `Unable to use ${reason} as ${resolvedModuleNames.length > 1 ? "one of " + resolvedModuleNames.map((m) => convertToUserModuleName(m)).join(", ") : convertToUserModuleName(resolvedModuleNames[0])} is not registered${gridScoped ? " for gridId: " + gridId : ""}. ${chartImportRequired} Check if you have registered the module:
`;
return `${explanation}
${moduleImportMsg(resolvedModuleNames)}` + (additionalText ? `
${additionalText}` : "");
};
var missingChartsWithModule = (gridModule) => {
return `${gridModule} must be initialised with an AG Charts module. One of 'AgChartsCommunityModule' / 'AgChartsEnterpriseModule'.
import { AgChartsEnterpriseModule } from 'ag-charts-enterprise';
import { ModuleRegistry } from 'ag-grid-community';
import { ${gridModule} } from 'ag-grid-enterprise';
ModuleRegistry.registerModules([${gridModule}.with(AgChartsEnterpriseModule)]);
`;
};
var clipboardApiError = (method) => `AG Grid: Unable to use the Clipboard API (navigator.clipboard.${method}()). The reason why it could not be used has been logged in the previous line. For this reason the grid has defaulted to using a workaround which doesn't perform as well. Either fix why Clipboard API is blocked, OR stop this message from appearing by setting grid property suppressClipboardApi=true (which will default the grid to using the workaround rather than the API.`;
var AG_GRID_ERRORS = {
1: () => "`rowData` must be an array",
2: ({ nodeId }) => `Duplicate node id '${nodeId}' detected from getRowId callback, this could cause issues in your grid.`,
3: () => "Calling gridApi.resetRowHeights() makes no sense when using Auto Row Height.",
4: ({ id }) => `Could not find row id=${id}, data item was not found for this id`,
5: ({ data }) => [
`Could not find data item as object was not found.`,
data,
" Consider using getRowId to help the Grid find matching row data"
],
6: () => `'groupHideOpenParents' only works when specifying specific columns for 'colDef.showRowGroup'`,
7: () => "Pivoting is not supported with aligned grids as it may produce different columns in each grid.",
8: ({ key }) => `Unknown key for navigation ${key}`,
9: ({ variable }) => `No value for ${variable?.cssName}. This usually means that the grid has been initialised before styles have been loaded. The default value of ${variable?.defaultValue} will be used and updated when styles load.`,
10: ({ eventType }) => `As of v33, the '${eventType}' event is deprecated. Use the global 'modelUpdated' event to determine when row children have changed.`,
11: () => "No gridOptions provided to createGrid",
12: ({ colKey }) => ["column ", colKey, " not found"],
13: () => "Could not find rowIndex, this means tasks are being executed on a rowNode that has been removed from the grid.",
14: ({ groupPrefix }) => `Row IDs cannot start with ${groupPrefix}, this is a reserved prefix for AG Grid's row grouping feature.`,
15: ({ expression }) => ["value should be either a string or a function", expression],
16: ({ expression, params, e }) => [
"Processing of the expression failed",
"Expression = ",
expression,
"Params = ",
params,
"Exception = ",
e
],
17: () => "you need either field or valueSetter set on colDef for editing to work",
18: () => `alignedGrids contains an undefined option.`,
19: () => `alignedGrids - No api found on the linked grid.`,
20: () => `You may want to configure via a callback to avoid setup race conditions:
"alignedGrids: () => [linkedGrid]"`,
21: () => "pivoting is not supported with aligned grids. You can only use one of these features at a time in a grid.",
22: ({ key }) => `${key} is an initial property and cannot be updated.`,
23: () => "The return of `getRowHeight` cannot be zero. If the intention is to hide rows, use a filter instead.",
24: () => "row height must be a number if not using standard row model",
25: ({ id }) => [`The getRowId callback must return a string. The ID `, id, ` is being cast to a string.`],
26: ({ fnName, preDestroyLink }) => {
return `Grid API function ${fnName}() cannot be called as the grid has been destroyed.
Either clear local references to the grid api, when it is destroyed, or check gridApi.isDestroyed() to avoid calling methods against a destroyed grid.
To run logic when the grid is about to be destroyed use the gridPreDestroy event. See: ${preDestroyLink}`;
},
27: ({ fnName, module: module2 }) => `API function '${fnName}' not registered to module '${module2}'`,
28: () => "setRowCount cannot be used while using row grouping.",
29: () => "tried to call sizeColumnsToFit() but the grid is coming back with zero width, maybe the grid is not visible yet on the screen?",
30: ({ toIndex }) => [
"tried to insert columns in invalid location, toIndex = ",
toIndex,
"remember that you should not count the moving columns when calculating the new index"
],
31: () => "infinite loop in resizeColumnSets",
32: () => "applyColumnState() - the state attribute should be an array, however an array was not found. Please provide an array of items (one for each col you want to change) for state.",
33: () => "stateItem.aggFunc must be a string. if using your own aggregation functions, register the functions first before using them in get/set state. This is because it is intended for the column state to be stored and retrieved as simple JSON.",
34: ({ key }) => `the column type '${key}' is a default column type and cannot be overridden.`,
35: () => `Column type definitions 'columnTypes' with a 'type' attribute are not supported because a column type cannot refer to another column type. Only column definitions 'columnDefs' can use the 'type' attribute to refer to a column type.`,
36: ({ t }) => "colDef.type '" + t + "' does not correspond to defined gridOptions.columnTypes",
37: () => `Changing the column pinning status is not allowed with domLayout='print'`,
38: ({ iconName }) => `provided icon '${iconName}' needs to be a string or a function`,
39: () => "Applying column order broke a group where columns should be married together. Applying new order has been discarded.",
40: ({ e, method }) => `${e}
${clipboardApiError(method)}`,
41: () => "Browser did not allow document.execCommand('copy'). Ensure 'api.copySelectedRowsToClipboard() is invoked via a user event, i.e. button click, otherwise the browser will prevent it for security reasons.",
42: () => "Browser does not support document.execCommand('copy') for clipboard operations",
43: ({ iconName }) => `As of v33, icon '${iconName}' is deprecated. Use the icon CSS name instead.`,
44: () => 'Data type definition hierarchies (via the "extendsDataType" property) cannot contain circular references.',
45: ({ parentCellDataType }) => `The data type definition ${parentCellDataType} does not exist.`,
46: () => 'The "baseDataType" property of a data type definition must match that of its parent.',
47: ({ cellDataType }) => `Missing data type definition - "${cellDataType}"`,
48: ({ property }) => `Cell data type is "object" but no Value ${property} has been provided. Please either provide an object data type definition with a Value ${property}, or set "colDef.value${property}"`,
49: ({ methodName }) => `Framework component is missing the method ${methodName}()`,
50: ({ compName }) => `Could not find component ${compName}, did you forget to configure this component?`,
51: () => `Export cancelled. Export is not allowed as per your configuration.`,
52: () => "There is no `window` associated with the current `document`",
53: () => `unknown value type during csv conversion`,
54: () => "Could not find document body, it is needed for drag and drop and context menu.",
55: () => "addRowDropZone - A container target needs to be provided",
56: () => "addRowDropZone - target already exists in the list of DropZones. Use `removeRowDropZone` before adding it again.",
57: () => "unable to show popup filter, filter instantiation failed",
58: () => "no values found for select cellEditor",
59: () => "cannot select pinned rows",
60: () => "cannot select node until it has finished loading",
61: () => "since version v32.2.0, rowNode.isFullWidthCell() has been deprecated. Instead check `rowNode.detail` followed by the user provided `isFullWidthRow` grid option.",
62: ({ colId }) => `setFilterModel() - no column found for colId: ${colId}`,
63: ({ colId }) => `setFilterModel() - unable to fully apply model, filtering disabled for colId: ${colId}`,
64: ({ colId }) => `setFilterModel() - unable to fully apply model, unable to create filter for colId: ${colId}`,
65: () => "filter missing setModel method, which is needed for setFilterModel",
66: () => "filter API missing getModel method, which is needed for getFilterModel",
67: () => "Filter is missing isFilterActive() method",
68: () => "Column Filter API methods have been disabled as Advanced Filters are enabled.",
69: ({ guiFromFilter }) => `getGui method from filter returned ${guiFromFilter}; it should be a DOM element.`,
70: ({ newFilter }) => `Grid option quickFilterText only supports string inputs, received: ${typeof newFilter}`,
71: () => "debounceMs is ignored when apply button is present",
72: ({ keys }) => [`ignoring FilterOptionDef as it doesn't contain one of `, keys],
73: () => `invalid FilterOptionDef supplied as it doesn't contain a 'displayKey'`,
74: () => "no filter options for filter",
75: () => "Unknown button type specified",
76: ({ filterModelType }) => [
'Unexpected type of filter "',
filterModelType,
'", it looks like the filter was configured with incorrect Filter Options'
],
77: () => `Filter model is missing 'conditions'`,
78: () => 'Filter Model contains more conditions than "filterParams.maxNumConditions". Additional conditions have been ignored.',
79: () => '"filterParams.maxNumConditions" must be greater than or equal to zero.',
80: () => '"filterParams.numAlwaysVisibleConditions" must be greater than or equal to zero.',
81: () => '"filterParams.numAlwaysVisibleConditions" cannot be greater than "filterParams.maxNumConditions".',
82: ({ param }) => `DateFilter ${param} is not a number`,
83: () => `DateFilter minValidYear should be <= maxValidYear`,
84: () => `DateFilter minValidDate should be <= maxValidDate`,
85: () => "DateFilter should not have both minValidDate and minValidYear parameters set at the same time! minValidYear will be ignored.",
86: () => "DateFilter should not have both maxValidDate and maxValidYear parameters set at the same time! maxValidYear will be ignored.",
87: () => "DateFilter parameter minValidDate should always be lower than or equal to parameter maxValidDate.",
88: ({ index }) => `Invalid row index for ensureIndexVisible: ${index}`,
89: () => `A template was provided for Header Group Comp - templates are only supported for Header Comps (not groups)`,
90: () => `datasource is missing getRows method`,
91: () => "Filter is missing method doesFilterPass",
92: ({ methodName }) => `AnimationFrameService.${methodName} called but animation frames are off`,
93: () => "cannot add multiple ranges when `cellSelection.suppressMultiRanges = true`",
94: ({
paginationPageSizeOption,
pageSizeSet,
pageSizesSet,
pageSizeOptions
}) => `'paginationPageSize=${paginationPageSizeOption}'${pageSizeSet ? "" : " (default value)"}, but ${paginationPageSizeOption} is not included in${pageSizesSet ? "" : " the default"} paginationPageSizeSelector=[${pageSizeOptions?.join(", ")}].`,
95: ({
paginationPageSizeOption,
paginationPageSizeSelector: paginationPageSizeSelector2
}) => `Either set '${paginationPageSizeSelector2}' to an array that includes ${paginationPageSizeOption} or to 'false' to disable the page size selector.`,
96: ({ id, data }) => [
"Duplicate ID",
id,
"found for pinned row with data",
data,
"When `getRowId` is defined, it must return unique IDs for all pinned rows. Use the `rowPinned` parameter."
],
97: ({ colId }) => `cellEditor for column ${colId} is missing getGui() method`,
98: () => "popup cellEditor does not work with fullRowEdit - you cannot use them both - either turn off fullRowEdit, or stop using popup editors.",
99: () => "Since v32, `api.hideOverlay()` does not hide the loading overlay when `loading=true`. Set `loading=false` instead.",
100: ({ rowModelType }) => `selectAll only available when rowModelType='clientSide', ie not ${rowModelType}`,
101: ({
propertyName,
componentName,
agGridDefaults,
jsComps
}) => {
const textOutput = [];
const validComponents = [
// Don't include the old names / internals in potential suggestions
...Object.keys(agGridDefaults ?? []).filter(
(k) => !["agCellEditor", "agGroupRowRenderer", "agSortIndicator"].includes(k)
),
...Object.keys(jsComps ?? [])
];
const suggestions = _fuzzySuggestions({
inputValue: componentName,
allSuggestions: validComponents,
hideIrrelevant: true,
filterByPercentageOfBestMatch: 0.8
}).values;
textOutput.push(
`Could not find '${componentName}' component. It was configured as "${propertyName}: '${componentName}'" but it wasn't found in the list of registered components.
`
);
if (suggestions.length > 0) {
textOutput.push(` Did you mean: [${suggestions.slice(0, 3)}]?
`);
}
textOutput.push(`If using a custom component check it has been registered correctly.`);
return textOutput;
},
102: () => "selectAll: 'filtered' only works when gridOptions.rowModelType='clientSide'",
103: () => "Invalid selection state. When using client-side row model, the state must conform to `string[]`.",
104: ({ value, param }) => `Numeric value ${value} passed to ${param} param will be interpreted as ${value} seconds. If this is intentional use "${value}s" to silence this warning.`,
105: ({ e }) => [`chart rendering failed`, e],
106: () => `Theming API and Legacy Themes are both used in the same page. A Theming API theme has been provided to the 'theme' grid option, but the file (ag-grid.css) is also included and will cause styling issues. Remove ag-grid.css from the page. See the migration guide: ${baseDocLink}/theming-migration/`,
107: ({ key, value }) => `Invalid value for theme param ${key} - ${value}`,
108: ({ e }) => ["chart update failed", e],
109: ({ aggFuncOrString }) => `unrecognised aggregation function ${aggFuncOrString}`,
110: () => "groupHideOpenParents only works when specifying specific columns for colDef.showRowGroup",
111: () => "Invalid selection state. When `groupSelects` is enabled, the state must conform to `IServerSideGroupSelectionState`.",
113: () => "Set Filter cannot initialise because you are using a row model that does not contain all rows in the browser. Either use a different filter type, or configure Set Filter such that you provide it with values",
114: ({ component }) => `Could not find component with name of ${component}. Is it in Vue.components?`,
// 115: () => 'The provided selection state should be an object.' as const,
116: () => "Invalid selection state. The state must conform to `IServerSideSelectionState`.",
117: () => "selectAll must be of boolean type.",
118: () => "Infinite scrolling must be enabled in order to set the row count.",
119: () => "Unable to instantiate filter",
120: () => "MultiFloatingFilterComp expects MultiFilter as its parent",
121: () => "a column you are grouping or pivoting by has objects as values. If you want to group by complex objects then either a) use a colDef.keyCreator (see AG Grid docs) or b) to toString() on the object to return a key",
122: () => "could not find the document, document is empty",
123: () => "Advanced Filter is only supported with the Client-Side Row Model or Server-Side Row Model.",
124: () => "No active charts to update.",
125: ({ chartId }) => `Unable to update chart. No active chart found with ID: ${chartId}.`,
126: () => "unable to restore chart as no chart model is provided",
127: ({ allRange }) => `unable to create chart as ${allRange ? "there are no columns in the grid" : "no range is selected"}.`,
128: ({ feature }) => `${feature} is only available if using 'multiRow' selection mode.`,
129: ({ feature, rowModel }) => `${feature} is only available if using 'clientSide' or 'serverSide' rowModelType, you are using ${rowModel}.`,
130: () => 'cannot multi select unless selection mode is "multiRow"',
// 131: () => 'cannot range select while selecting multiple rows' as const,
132: () => "Row selection features are not available unless `rowSelection` is enabled.",
133: ({ iconName }) => `icon '${iconName}' function should return back a string or a dom object`,
134: ({ iconName }) => `Did not find icon '${iconName}'`,
135: () => `Data type of the new value does not match the cell data type of the column`,
136: () => `Unable to update chart as the 'type' is missing. It must be either 'rangeChartUpdate', 'pivotChartUpdate', or 'crossFilterChartUpdate'.`,
137: ({ type, currentChartType }) => `Unable to update chart as a '${type}' update type is not permitted on a ${currentChartType}.`,
138: ({ chartType }) => `invalid chart type supplied: ${chartType}`,
139: ({ customThemeName }) => `a custom chart theme with the name ${customThemeName} has been supplied but not added to the 'chartThemes' list`,
140: ({ name }) => `no stock theme exists with the name '${name}' and no custom chart theme with that name was supplied to 'customChartThemes'`,
141: () => "cross filtering with row grouping is not supported.",
142: () => "cross filtering is only supported in the client side row model.",
143: ({ panel }) => `'${panel}' is not a valid Chart Tool Panel name`,
144: ({ type }) => `Invalid charts data panel group name supplied: '${type}'`,
145: ({ group }) => `As of v32, only one charts customize panel group can be expanded at a time. '${group}' will not be expanded.`,
146: ({ comp }) => `Unable to instantiate component '${comp}' as its module hasn't been loaded. Add 'ValidationModule' to see which module is required.`,
147: ({ group }) => `Invalid charts customize panel group name supplied: '${group}'`,
148: ({ group }) => `invalid chartGroupsDef config '${group}'`,
149: ({ group, chartType }) => `invalid chartGroupsDef config '${group}.${chartType}'`,
150: () => `'seriesChartTypes' are required when the 'customCombo' chart type is specified.`,
151: ({ chartType }) => `invalid chartType '${chartType}' supplied in 'seriesChartTypes', converting to 'line' instead.`,
152: ({ colId }) => `no 'seriesChartType' found for colId = '${colId}', defaulting to 'line'.`,
153: ({ chartDataType }) => `unexpected chartDataType value '${chartDataType}' supplied, instead use 'category', 'series' or 'excluded'`,
154: ({ colId }) => `cross filtering requires a 'agSetColumnFilter' or 'agMultiColumnFilter' to be defined on the column with id: ${colId}`,
155: ({ option }) => `'${option}' is not a valid Chart Toolbar Option`,
156: ({ panel }) => `Invalid panel in chartToolPanelsDef.panels: '${panel}'`,
157: ({ unrecognisedGroupIds }) => ["unable to find group(s) for supplied groupIds:", unrecognisedGroupIds],
158: () => "can not expand a column item that does not represent a column group header",
159: () => "Invalid params supplied to createExcelFileForExcel() - `ExcelExportParams.data` is empty.",
160: () => `Export cancelled. Export is not allowed as per your configuration.`,
161: () => "The Excel Exporter is currently on Multi Sheet mode. End that operation by calling 'api.getMultipleSheetAsExcel()' or 'api.exportMultipleSheetsAsExcel()'",
162: ({ id, dataType }) => `Unrecognized data type for excel export [${id}.dataType=${dataType}]`,
163: ({ featureName }) => `Excel table export does not work with ${featureName}. The exported Excel file will not contain any Excel tables.
Please turn off ${featureName} to enable Excel table exports.`,
164: () => "Unable to add data table to Excel sheet: A table already exists.",
165: () => "Unable to add data table to Excel sheet: Missing required parameters.",
166: ({ unrecognisedGroupIds }) => ["unable to find groups for these supplied groupIds:", unrecognisedGroupIds],
167: ({ unrecognisedColIds }) => ["unable to find columns for these supplied colIds:", unrecognisedColIds],
168: () => "detailCellRendererParams.template should be function or string",
169: () => 'Reference to eDetailGrid was missing from the details template. Please add data-ref="eDetailGrid" to the template.',
170: ({ providedStrategy }) => `invalid cellRendererParams.refreshStrategy = ${providedStrategy} supplied, defaulting to refreshStrategy = 'rows'.`,
171: () => "could not find detail grid options for master detail, please set gridOptions.detailCellRendererParams.detailGridOptions",
172: () => "could not find getDetailRowData for master / detail, please set gridOptions.detailCellRendererParams.getDetailRowData",
173: ({ group }) => `invalid chartGroupsDef config '${group}'`,
174: ({ group, chartType }) => `invalid chartGroupsDef config '${group}.${chartType}'`,
175: ({ menuTabName, itemsToConsider }) => [
`Trying to render an invalid menu item '${menuTabName}'. Check that your 'menuTabs' contains one of `,
itemsToConsider
],
176: ({ key }) => `unknown menu item type ${key}`,
177: () => `valid values for cellSelection.handle.direction are 'x', 'y' and 'xy'. Default to 'xy'.`,
178: ({ colId }) => `column ${colId} is not visible`,
179: () => "totalValueGetter should be either a function or a string (expression)",
180: () => "agRichSelectCellEditor requires cellEditorParams.values to be set",
181: () => "agRichSelectCellEditor cannot have `multiSelect` and `allowTyping` set to `true`. AllowTyping has been turned off.",
182: () => 'you cannot mix groupDisplayType = "multipleColumns" with treeData, only one column can be used to display groups when doing tree data',
183: () => "Group Column Filter only works on group columns. Please use a different filter.",
184: ({ parentGroupData, childNodeData }) => [`duplicate group keys for row data, keys should be unique`, [parentGroupData, childNodeData]],
185: ({ data }) => [`getDataPath() should not return an empty path`, [data]],
186: ({
rowId,
rowData,
duplicateRowsData
}) => [
`duplicate group keys for row data, keys should be unique`,
rowId,
rowData,
...duplicateRowsData ?? []
],
187: ({ rowId, firstData, secondData }) => [
`Duplicate node id ${rowId}. Row IDs are provided via the getRowId() callback. Please modify the getRowId() callback code to provide unique row id values.`,
"first instance",
firstData,
"second instance",
secondData
],
188: () => `getRowId callback must be provided for Server Side Row Model selection to work correctly.`,
189: ({ startRow }) => `invalid value ${startRow} for startRow, the value should be >= 0`,
190: ({ rowGroupId, data }) => [
`null and undefined values are not allowed for server side row model keys`,
rowGroupId ? `column = ${rowGroupId}` : ``,
`data is `,
data
],
// 191: () => `cannot multi select unless selection mode is 'multiRow'` as const,
// 192: () => `cannot use range selection when multi selecting rows` as const,
// 193: () => "cannot multi select unless selection mode is 'multiRow'" as const,
194: ({ method }) => `calling gridApi.${method}() is only possible when using rowModelType=\`clientSide\`.`,
195: ({ justCurrentPage }) => `selecting just ${justCurrentPage ? "current page" : "filtered"} only works when gridOptions.rowModelType='clientSide'`,
196: ({ key }) => `Provided ids must be of string type. Invalid id provided: ${key}`,
197: () => "`toggledNodes` must be an array of string ids.",
// 198: () => `cannot multi select unless selection mode is 'multiRow'` as const,
199: () => `getSelectedNodes and getSelectedRows functions cannot be used with select all functionality with the server-side row model. Use \`api.getServerSideSelectionState()\` instead.`,
200: missingModule,
201: ({ rowModelType }) => `Could not find row model for rowModelType = ${rowModelType}`,
202: () => `\`getSelectedNodes\` and \`getSelectedRows\` functions cannot be used with \`groupSelectsChildren\` and the server-side row model. Use \`api.getServerSideSelectionState()\` instead.`,
203: () => "Server Side Row Model does not support Dynamic Row Height and Cache Purging. Either a) remove getRowHeight() callback or b) remove maxBlocksInCache property. Purging has been disabled.",
204: () => "Server Side Row Model does not support Auto Row Height and Cache Purging. Either a) remove colDef.autoHeight or b) remove maxBlocksInCache property. Purging has been disabled.",
205: ({ duplicateIdText }) => `Unable to display rows as duplicate row ids (${duplicateIdText}) were returned by the getRowId callback. Please modify the getRowId callback to provide unique ids.`,
206: () => "getRowId callback must be implemented for transactions to work. Transaction was ignored.",
207: () => 'The Set Filter Parameter "defaultToNothingSelected" value was ignored because it does not work when "excelMode" is used.',
208: () => `Set Filter Value Formatter must return string values. Please ensure the Set Filter Value Formatter returns string values for complex objects.`,
209: () => `Set Filter Key Creator is returning null for provided values and provided values are primitives. Please provide complex objects. See ${baseDocLink}/filter-set-filter-list/#filter-value-types`,
210: () => "Set Filter has a Key Creator, but provided values are primitives. Did you mean to provide complex objects?",
211: () => "property treeList=true for Set Filter params, but you did not provide a treeListPathGetter or values of type Date.",
212: () => `please review all your toolPanel components, it seems like at least one of them doesn't have an id`,
213: () => "Advanced Filter does not work with Filters Tool Panel. Filters Tool Panel has been disabled.",
214: ({ key }) => `unable to lookup Tool Panel as invalid key supplied: ${key}`,
215: ({ key, defaultByKey }) => `the key ${key} is not a valid key for specifying a tool panel, valid keys are: ${Object.keys(defaultByKey ?? {}).join(",")}`,
216: ({ name }) => `Missing component for '${name}'`,
217: ({ invalidColIds }) => ["unable to find grid columns for the supplied colDef(s):", invalidColIds],
218: ({ property, defaultOffset }) => `${property} must be a number, the value you provided is not a valid number. Using the default of ${defaultOffset}px.`,
219: ({ property }) => `Property ${property} does not exist on the target object.`,
220: ({ lineDash }) => `'${lineDash}' is not a valid 'lineDash' option.`,
221: () => `agAggregationComponent should only be used with the client and server side row model.`,
222: () => `agFilteredRowCountComponent should only be used with the client side row model.`,
223: () => `agSelectedRowCountComponent should only be used with the client and server side row model.`,
224: () => `agTotalAndFilteredRowCountComponent should only be used with the client side row model.`,
225: () => "agTotalRowCountComponent should only be used with the client side row model.",
226: () => "viewport is missing init method.",
227: () => "menu item icon must be DOM node or string",
228: ({ menuItemOrString }) => `unrecognised menu item ${menuItemOrString}`,
229: ({ index }) => ["invalid row index for ensureIndexVisible: ", index],
230: () => "detailCellRendererParams.template is not supported by AG Grid React. To change the template, provide a Custom Detail Cell Renderer. See https://www.ag-grid.com/react-data-grid/master-detail-custom-detail/",
// @deprecated v32 mark for removal as part of v32 deprecated features
231: () => "As of v32, using custom components with `reactiveCustomComponents = false` is deprecated.",
232: () => "Using both rowData and v-model. rowData will be ignored.",
233: ({ methodName }) => `Framework component is missing the method ${methodName}()`,
234: () => 'Group Column Filter does not work with the colDef property "field". This property will be ignored.',
235: () => 'Group Column Filter does not work with the colDef property "filterValueGetter". This property will be ignored.',
236: () => 'Group Column Filter does not work with the colDef property "filterParams". This property will be ignored.',
237: () => "Group Column Filter does not work with Tree Data enabled. Please disable Tree Data, or use a different filter.",
238: () => "setRowCount can only accept a positive row count.",
239: () => 'Theming API and CSS File Themes are both used in the same page. In v33 we released the Theming API as the new default method of styling the grid. See the migration docs https://www.ag-grid.com/react-data-grid/theming-migration/. Because no value was provided to the `theme` grid option it defaulted to themeQuartz. But the file (ag-grid.css) is also included and will cause styling issues. Either pass the string "legacy" to the theme grid option to use v32 style themes, or remove ag-grid.css from the page to use Theming API.',
240: ({ theme }) => `theme grid option must be a Theming API theme object or the string "legacy", received: ${theme}`,
// 241: () => `cannot select multiple rows when rowSelection.mode is set to 'singleRow'` as const,
// 242: () => 'cannot select multiple rows when using rangeSelect' as const,
243: () => "Failed to deserialize state - each provided state object must be an object.",
244: () => "Failed to deserialize state - `selectAllChildren` must be a boolean value or undefined.",
245: () => "Failed to deserialize state - `toggledNodes` must be an array.",
246: () => "Failed to deserialize state - Every `toggledNode` requires an associated string id.",
247: () => `Row selection state could not be parsed due to invalid data. Ensure all child state has toggledNodes or does not conform with the parent rule.
Please rebuild the selection state and reapply it.`,
248: () => "SetFloatingFilter expects SetFilter as its parent",
249: () => "Must supply a Value Formatter in Set Filter params when using a Key Creator",
250: () => "Must supply a Key Creator in Set Filter params when `treeList = true` on a group column, and Tree Data or Row Grouping is enabled.",
251: ({ chartType }) => `AG Grid: Unable to create chart as an invalid chartType = '${chartType}' was supplied.`,
252: () => "cannot get grid to draw rows when it is in the middle of drawing rows. \nYour code probably called a grid API method while the grid was in the render stage. \nTo overcome this, put the API call into a timeout, e.g. instead of api.redrawRows(), call setTimeout(function() { api.redrawRows(); }, 0). \nTo see what part of your code that caused the refresh check this stacktrace.",
253: ({ version }) => ["Illegal version string: ", version],
254: () => "Cannot create chart: no chart themes available.",
255: ({ point }) => `Lone surrogate U+${point?.toString(16).toUpperCase()} is not a scalar value`,
256: () => "Unable to initialise. See validation error, or load ValidationModule if missing.",
257: () => missingChartsWithModule("IntegratedChartsModule"),
258: () => missingChartsWithModule("SparklinesModule"),
259: ({ part }) => `the argument to theme.withPart must be a Theming API part object, received: ${part}`,
260: ({
propName,
compName,
gridScoped,
gridId,
rowModelType
}) => missingModule({
reasonOrId: `AG Grid '${propName}' component: ${compName}`,
moduleName: USER_COMP_MODULES[compName],
gridId,
gridScoped,
rowModelType
}),
261: () => "As of v33, `column.isHovered()` is deprecated. Use `api.isColumnHovered(column)` instead.",
262: () => 'As of v33, icon key "smallDown" is deprecated. Use "advancedFilterBuilderSelect" for Advanced Filter Builder dropdown, "selectOpen" for Select cell editor and dropdowns (e.g. Integrated Charts menu), "richSelectOpen" for Rich Select cell editor.',
263: () => 'As of v33, icon key "smallLeft" is deprecated. Use "panelDelimiterRtl" for Row Group Panel / Pivot Panel, "subMenuOpenRtl" for sub-menus.',
264: () => 'As of v33, icon key "smallRight" is deprecated. Use "panelDelimiter" for Row Group Panel / Pivot Panel, "subMenuOpen" for sub-menus.',
265: ({ colId }) => `Unable to infer chart data type for column '${colId}' if first data entry is null. Please specify "chartDataType", or a "cellDataType" in the column definition. For more information, see ${baseDocLink}/integrated-charts-range-chart#coldefchartdatatype .`,
266: () => 'As of v33.1, using "keyCreator" with the Rich Select Editor has been deprecated. It now requires the "formatValue" callback to convert complex data to strings.',
267: () => "Detail grids can not use a different theme to the master grid, the `theme` detail grid option will be ignored.",
268: () => "Transactions aren't supported with tree data when using treeDataChildrenField",
269: () => "When `masterSelects: 'detail'`, detail grids must be configured with multi-row selection"
};
function getError(errorId, args) {
const msgOrFunc = AG_GRID_ERRORS[errorId];
if (!msgOrFunc) {
return [`Missing error text for error id ${errorId}!`];
}
const errorBody = msgOrFunc(args);
const errorLink = getErrorLink(errorId, args);
const errorSuffix = `
See ${errorLink}`;
return Array.isArray(errorBody) ? errorBody.concat(errorSuffix) : [errorBody, errorSuffix];
}
var MISSING_MODULE_REASONS = {
1: "Charting Aggregation",
2: "pivotResultFields",
3: "setTooltip"
};
// packages/ag-grid-community/src/validation/rules/colDefValidations.ts
var COLUMN_DEFINITION_DEPRECATIONS = () => ({
checkboxSelection: { version: "32.2", message: "Use `rowSelection.checkboxes` in `GridOptions` instead." },
headerCheckboxSelection: {
version: "32.2",
message: "Use `rowSelection.headerCheckbox = true` in `GridOptions` instead."
},
headerCheckboxSelectionFilteredOnly: {
version: "32.2",
message: 'Use `rowSelection.selectAll = "filtered"` in `GridOptions` instead.'
},
headerCheckboxSelectionCurrentPageOnly: {
version: "32.2",
message: 'Use `rowSelection.selectAll = "currentPage"` in `GridOptions` instead.'
},
showDisabledCheckboxes: {
version: "32.2",
message: "Use `rowSelection.hideDisabledCheckboxes = true` in `GridOptions` instead."
}
});
var COLUMN_DEFINITION_VALIDATIONS = () => ({
aggFunc: { module: "SharedAggregation" },
autoHeight: {
supportedRowModels: ["clientSide", "serverSide"],
module: "RowAutoHeight"
},
cellClass: { module: "CellStyle" },
cellClassRules: { module: "CellStyle" },
cellEditor: ({ cellEditor, editable }) => {
if (!editable) {
return null;
}
if (typeof cellEditor === "string") {
const module2 = USER_COMP_MODULES[cellEditor];
if (module2) {
return { module: module2 };
}
}
return { module: "CustomEditor" };
},
cellRenderer: ({ cellRenderer }) => {
if (typeof cellRenderer !== "string") {
return null;
}
const module2 = USER_COMP_MODULES[cellRenderer];
if (module2) {
return { module: module2 };
}
return null;
},
cellRendererParams: {
validate: (colDef) => {
const groupColumn = colDef.rowGroup != null || colDef.rowGroupIndex != null || colDef.cellRenderer === "agGroupCellRenderer";
if (groupColumn && "checkbox" in colDef.cellRendererParams) {
return 'Since v33.0, `cellRendererParams.checkbox` has been deprecated. Use `rowSelection.checkboxLocation = "autoGroupColumn"` instead.';
}
return null;
}
},
cellStyle: { module: "CellStyle" },
children: () => COL_DEF_VALIDATORS(),
columnChooserParams: {
module: "ColumnMenu"
},
contextMenuItems: { module: "ContextMenu" },
dndSource: { module: "DragAndDrop" },
dndSourceOnRowDrag: { module: "DragAndDrop" },
editable: ({ editable, cellEditor }) => {
if (editable && !cellEditor) {
return {
module: "TextEditor"
};
}
return null;
},
enableCellChangeFlash: { module: "HighlightChanges" },
enablePivot: { module: "SharedPivot" },
enableRowGroup: { module: "SharedRowGrouping" },
enableValue: { module: "SharedAggregation" },
filter: ({ filter }) => {
if (filter && typeof filter !== "string" && typeof filter !== "boolean") {
return { module: "CustomFilter" };
}
if (typeof filter === "string") {
const module2 = USER_COMP_MODULES[filter];
if (module2) {
return { module: module2 };
}
}
return { module: "ColumnFilter" };
},
floatingFilter: { module: "ColumnFilter" },
headerCheckboxSelection: {
supportedRowModels: ["clientSide", "serverSide"],
validate: (_options, { rowSelection }) => rowSelection === "multiple" ? null : "headerCheckboxSelection is only supported with rowSelection=multiple"
},
headerCheckboxSelectionCurrentPageOnly: {
supportedRowModels: ["clientSide"],
validate: (_options, { rowSelection }) => rowSelection === "multiple" ? null : "headerCheckboxSelectionCurrentPageOnly is only supported with rowSelection=multiple"
},
headerCheckboxSelectionFilteredOnly: {
supportedRowModels: ["clientSide"],
validate: (_options, { rowSelection }) => rowSelection === "multiple" ? null : "headerCheckboxSelectionFilteredOnly is only supported with rowSelection=multiple"
},
headerTooltip: { module: "Tooltip" },
headerValueGetter: {
validate: (_options) => {
const headerValueGetter = _options.headerValueGetter;
if (typeof headerValueGetter === "function" || typeof headerValueGetter === "string") {
return null;
}
return "headerValueGetter must be a function or a valid string expression";
}
},
icons: {
validate: ({ icons }) => {
if (icons) {
if (icons["smallDown"]) {
return _errMsg(262);
}
if (icons["smallLeft"]) {
return _errMsg(263);
}
if (icons["smallRight"]) {
return _errMsg(264);
}
}
return null;
}
},
mainMenuItems: { module: "ColumnMenu" },
menuTabs: (options) => {
const enterpriseMenuTabs = ["columnsMenuTab", "generalMenuTab"];
if (options.menuTabs?.some((tab) => enterpriseMenuTabs.includes(tab))) {
return {
module: "ColumnMenu"
};
}
return null;
},
pivot: { module: "SharedPivot" },
pivotIndex: { module: "SharedPivot" },
rowDrag: { module: "RowDrag" },
rowGroup: { module: "SharedRowGrouping" },
rowGroupIndex: { module: "SharedRowGrouping" },
sortingOrder: {
validate: (_options) => {
const sortingOrder = _options.sortingOrder;
if (Array.isArray(sortingOrder) && sortingOrder.length > 0) {
const invalidItems = sortingOrder.filter((a) => !DEFAULT_SORTING_ORDER.includes(a));
if (invalidItems.length > 0) {
return `sortingOrder must be an array with elements from [${DEFAULT_SORTING_ORDER.map(toStringWithNullUndefined).join()}], currently it includes [${invalidItems.map(toStringWithNullUndefined).join()}]`;
}
} else if (!Array.isArray(sortingOrder) || sortingOrder.length <= 0) {
return `sortingOrder must be an array with at least one element, currently it's ${sortingOrder}`;
}
return null;
}
},
tooltipField: { module: "Tooltip" },
tooltipValueGetter: { module: "Tooltip" },
type: {
validate: (_options) => {
const type = _options.type;
if (type instanceof Array) {
const invalidArray = type.some((a) => typeof a !== "string");
if (invalidArray) {
return "if colDef.type is supplied an array it should be of type 'string[]'";
}
return null;
}
if (typeof type === "string") {
return null;
}
return "colDef.type should be of type 'string' | 'string[]'";
}
},
rowSpan: {
validate: (_options, { suppressRowTransform }) => {
if (!suppressRowTransform) {
return "colDef.rowSpan requires suppressRowTransform to be enabled.";
}
return null;
}
},
spanRows: {
module: "CellSpan",
dependencies: {
editable: { required: [false, void 0] },
rowDrag: { required: [false, void 0] },
colSpan: { required: [false, void 0] },
rowSpan: { required: [false, void 0] }
},
validate: (_options, {
rowSelection,
cellSelection,
suppressRowTransform,
enableCellSpan,
pagination,
rowDragEntireRow,
enableCellTextSelection
}) => {
if (typeof rowSelection === "object") {
if (rowSelection?.mode === "singleRow" && rowSelection?.enableClickSelection) {
return "colDef.spanRows is not supported with rowSelection.clickSelection";
}
}
if (cellSelection) {
return "colDef.spanRows is not supported with cellSelection.";
}
if (suppressRowTransform) {
return "colDef.spanRows is not supported with suppressRowTransform.";
}
if (!enableCellSpan) {
return "colDef.spanRows requires enableCellSpan to be enabled.";
}
if (pagination) {
return "colDef.spanRows is not supported with pagination.";
}
if (rowDragEntireRow) {
return "colDef.spanRows is not supported with rowDragEntireRow.";
}
if (enableCellTextSelection) {
return "colDef.spanRows is not supported with enableCellTextSelection.";
}
return null;
}
}
});
var colDefPropertyMap = {
headerName: void 0,
columnGroupShow: void 0,
headerStyle: void 0,
headerClass: void 0,
toolPanelClass: void 0,
headerValueGetter: void 0,
pivotKeys: void 0,
groupId: void 0,
colId: void 0,
sort: void 0,
initialSort: void 0,
field: void 0,
type: void 0,
cellDataType: void 0,
tooltipComponent: void 0,
tooltipField: void 0,
headerTooltip: void 0,
cellClass: void 0,
showRowGroup: void 0,
filter: void 0,
initialAggFunc: void 0,
defaultAggFunc: void 0,
aggFunc: void 0,
pinned: void 0,
initialPinned: void 0,
chartDataType: void 0,
cellAriaRole: void 0,
cellEditorPopupPosition: void 0,
headerGroupComponent: void 0,
headerGroupComponentParams: void 0,
cellStyle: void 0,
cellRenderer: void 0,
cellRendererParams: void 0,
cellEditor: void 0,
cellEditorParams: void 0,
filterParams: void 0,
pivotValueColumn: void 0,
headerComponent: void 0,
headerComponentParams: void 0,
floatingFilterComponent: void 0,
floatingFilterComponentParams: void 0,
tooltipComponentParams: void 0,
refData: void 0,
columnChooserParams: void 0,
children: void 0,
sortingOrder: void 0,
allowedAggFuncs: void 0,
menuTabs: void 0,
pivotTotalColumnIds: void 0,
cellClassRules: void 0,
icons: void 0,
sortIndex: void 0,
initialSortIndex: void 0,
flex: void 0,
initialFlex: void 0,
width: void 0,
initialWidth: void 0,
minWidth: void 0,
maxWidth: void 0,
rowGroupIndex: void 0,
initialRowGroupIndex: void 0,
pivotIndex: void 0,
initialPivotIndex: void 0,
suppressColumnsToolPanel: void 0,
suppressFiltersToolPanel: void 0,
openByDefault: void 0,
marryChildren: void 0,
suppressStickyLabel: void 0,
hide: void 0,
initialHide: void 0,
rowGroup: void 0,
initialRowGroup: void 0,
pivot: void 0,
initialPivot: void 0,
checkboxSelection: void 0,
showDisabledCheckboxes: void 0,
headerCheckboxSelection: void 0,
headerCheckboxSelectionFilteredOnly: void 0,
headerCheckboxSelectionCurrentPageOnly: void 0,
suppressHeaderMenuButton: void 0,
suppressMovable: void 0,
lockPosition: void 0,
lockVisible: void 0,
lockPinned: void 0,
unSortIcon: void 0,
suppressSizeToFit: void 0,
suppressAutoSize: void 0,
enableRowGroup: void 0,
enablePivot: void 0,
enableValue: void 0,
editable: void 0,
suppressPaste: void 0,
suppressNavigable: void 0,
enableCellChangeFlash: void 0,
rowDrag: void 0,
dndSource: void 0,
autoHeight: void 0,
wrapText: void 0,
sortable: void 0,
resizable: void 0,
singleClickEdit: void 0,
floatingFilter: void 0,
cellEditorPopup: void 0,
suppressFillHandle: void 0,
wrapHeaderText: void 0,
autoHeaderHeight: void 0,
dndSourceOnRowDrag: void 0,
valueGetter: void 0,
valueSetter: void 0,
filterValueGetter: void 0,
keyCreator: void 0,
valueFormatter: void 0,
valueParser: void 0,
comparator: void 0,
equals: void 0,
pivotComparator: void 0,
suppressKeyboardEvent: void 0,
suppressHeaderKeyboardEvent: void 0,
colSpan: void 0,
rowSpan: void 0,
spanRows: void 0,
getQuickFilterText: void 0,
onCellValueChanged: void 0,
onCellClicked: void 0,
onCellDoubleClicked: void 0,
onCellContextMenu: void 0,
rowDragText: void 0,
tooltipValueGetter: void 0,
cellRendererSelector: void 0,
cellEditorSelector: void 0,
suppressSpanHeaderHeight: void 0,
useValueFormatterForExport: void 0,
useValueParserForImport: void 0,
mainMenuItems: void 0,
contextMenuItems: void 0,
suppressFloatingFilterButton: void 0,
suppressHeaderFilterButton: void 0,
suppressHeaderContextMenu: void 0,
loadingCellRenderer: void 0,
loadingCellRendererParams: void 0,
loadingCellRendererSelector: void 0,
context: void 0
};
var ALL_PROPERTIES = () => Object.keys(colDefPropertyMap);
var COL_DEF_VALIDATORS = () => ({
objectName: "colDef",
allProperties: ALL_PROPERTIES(),
docsUrl: "column-properties/",
deprecations: COLUMN_DEFINITION_DEPRECATIONS(),
validations: COLUMN_DEFINITION_VALIDATIONS()
});
// packages/ag-grid-community/src/validation/rules/gridOptionsValidations.ts
var GRID_OPTION_DEPRECATIONS = () => ({
suppressLoadingOverlay: { version: "32", message: "Use `loading`=false instead." },
enableFillHandle: { version: "32.2", message: "Use `cellSelection.handle` instead." },
enableRangeHandle: { version: "32.2", message: "Use `cellSelection.handle` instead." },
enableRangeSelection: { version: "32.2", message: "Use `cellSelection = true` instead." },
suppressMultiRangeSelection: {
version: "32.2",
message: "Use `cellSelection.suppressMultiRanges` instead."
},
suppressClearOnFillReduction: {
version: "32.2",
message: "Use `cellSelection.handle.suppressClearOnFillReduction` instead."
},
fillHandleDirection: { version: "32.2", message: "Use `cellSelection.handle.direction` instead." },
fillOperation: { version: "32.2", message: "Use `cellSelection.handle.setFillValue` instead." },
suppressRowClickSelection: {
version: "32.2",
message: "Use `rowSelection.enableClickSelection` instead."
},
suppressRowDeselection: { version: "32.2", message: "Use `rowSelection.enableClickSelection` instead." },
rowMultiSelectWithClick: {
version: "32.2",
message: "Use `rowSelection.enableSelectionWithoutKeys` instead."
},
groupSelectsChildren: {
version: "32.2",
message: 'Use `rowSelection.groupSelects = "descendants"` instead.'
},
groupSelectsFiltered: {
version: "32.2",
message: 'Use `rowSelection.groupSelects = "filteredDescendants"` instead.'
},
isRowSelectable: { version: "32.2", message: "Use `selectionOptions.isRowSelectable` instead." },
suppressCopySingleCellRanges: { version: "32.2", message: "Use `rowSelection.copySelectedRows` instead." },
suppressCopyRowsToClipboard: { version: "32.2", message: "Use `rowSelection.copySelectedRows` instead." },
onRangeSelectionChanged: { version: "32.2", message: "Use `onCellSelectionChanged` instead." },
onRangeDeleteStart: { version: "32.2", message: "Use `onCellSelectionDeleteStart` instead." },
onRangeDeleteEnd: { version: "32.2", message: "Use `onCellSelectionDeleteEnd` instead." },
suppressBrowserResizeObserver: {
version: "32.2",
message: "The grid always uses the browser's ResizeObserver, this grid option has no effect."
},
onColumnEverythingChanged: {
version: "32.2",
message: "Either use `onDisplayedColumnsChanged` which is fired at the same time, or use one of the more specific column events."
},
groupRemoveSingleChildren: {
version: "33",
message: "Use `groupHideParentOfSingleChild` instead."
},
groupRemoveLowestSingleChildren: {
version: "33",
message: 'Use `groupHideParentOfSingleChild: "leafGroupsOnly"` instead.'
},
suppressRowGroupHidesColumns: {
version: "33",
message: 'Use `suppressGroupChangesColumnVisibility: "suppressHideOnGroup"` instead.'
},
suppressMakeColumnVisibleAfterUnGroup: {
version: "33",
message: 'Use `suppressGroupChangesColumnVisibility: "suppressShowOnUngroup"` instead.'
},
unSortIcon: { version: "33", message: "Use `defaultColDef.unSortIcon` instead." },
sortingOrder: { version: "33", message: "Use `defaultColDef.sortingOrder` instead." },
suppressPropertyNamesCheck: {
version: "33",
message: "`gridOptions` and `columnDefs` both have a `context` property that should be used for arbitrary user data. This means that column definitions and gridOptions should only contain valid properties making this property redundant."
}
});
function toConstrainedNum(key, value, min, max = Number.MAX_VALUE) {
if (typeof value === "number" || value == null) {
if (value == null) {
return null;
}
if (value >= min && value <= max) {
return null;
}
if (max === Number.MAX_VALUE) {
return `${key}: value should be greater than or equal to ${min}`;
}
return `${key}: value should be between ${min} and ${max}`;
}
return `${key}: value should be a number`;
}
var GRID_OPTION_VALIDATIONS = () => {
const definedValidations = {
alignedGrids: { module: "AlignedGrids" },
allowContextMenuWithControlKey: { module: "ContextMenu" },
autoSizePadding: {
validate({ autoSizePadding }) {
return toConstrainedNum("autoSizePadding", autoSizePadding, 0);
}
},
autoSizeStrategy: { module: "ColumnAutoSize" },
cacheBlockSize: {
supportedRowModels: ["serverSide", "infinite"],
validate({ cacheBlockSize }) {
return toConstrainedNum("cacheBlockSize", cacheBlockSize, 1);
}
},
cacheOverflowSize: {
validate({ cacheOverflowSize }) {
return toConstrainedNum("cacheOverflowSize", cacheOverflowSize, 1);
}
},
cellSelection: {
module: "CellSelection"
},
columnHoverHighlight: { module: "ColumnHover" },
datasource: {
supportedRowModels: ["infinite"],
module: "InfiniteRowModel"
},
doesExternalFilterPass: { module: "ExternalFilter" },
domLayout: {
validate: (options) => {
const domLayout = options.domLayout;
const validLayouts = ["autoHeight", "normal", "print"];
if (domLayout && !validLayouts.includes(domLayout)) {
return `domLayout must be one of [${validLayouts.join()}], currently it's ${domLayout}`;
}
return null;
}
},
editType: {
module: "EditCore"
},
enableAdvancedFilter: { module: "AdvancedFilter" },
enableCharts: { module: "IntegratedCharts" },
enableFillHandle: {
dependencies: {
enableRangeSelection: { required: [true] }
}
},
enableRangeHandle: {
dependencies: {
enableRangeSelection: { required: [true] }
}
},
enableRangeSelection: {
module: "CellSelection",
dependencies: {
rowDragEntireRow: { required: [false, void 0] }
}
},
rowNumbers: {
module: "RowNumbers"
},
getContextMenuItems: { module: "ContextMenu" },
getLocaleText: { module: "Locale" },
getMainMenuItems: { module: "ColumnMenu" },
getRowClass: { module: "RowStyle" },
getRowStyle: { module: "RowStyle" },
grandTotalRow: { module: "SharedRowGrouping" },
groupDefaultExpanded: {
supportedRowModels: ["clientSide"]
},
groupHideOpenParents: {
supportedRowModels: ["clientSide", "serverSide"],
dependencies: {
groupTotalRow: { required: [void 0, "bottom"] },
treeData: {
required: [void 0, false],
reason: "Tree Data has values at the group level so it doesn't make sense to hide them."
}
}
},
groupHideParentOfSingleChild: {
dependencies: {
groupHideOpenParents: { required: [void 0, false] }
}
},
groupRemoveLowestSingleChildren: {
dependencies: {
groupHideOpenParents: { required: [void 0, false] },
groupRemoveSingleChildren: { required: [void 0, false] }
}
},
groupRemoveSingleChildren: {
dependencies: {
groupHideOpenParents: { required: [void 0, false] },
groupRemoveLowestSingleChildren: { required: [void 0, false] }
}
},
groupSelectsChildren: {
dependencies: {
rowSelection: { required: ["multiple"] }
}
},
icons: {
validate: ({ icons }) => {
if (icons) {
if (icons["smallDown"]) {
return _errMsg(262);
}
if (icons["smallLeft"]) {
return _errMsg(263);
}
if (icons["smallRight"]) {
return _errMsg(264);
}
}
return null;
}
},
infiniteInitialRowCount: {
validate({ infiniteInitialRowCount }) {
return toConstrainedNum("infiniteInitialRowCount", infiniteInitialRowCount, 1);
}
},
initialGroupOrderComparator: {
supportedRowModels: ["clientSide"]
},
initialState: { module: "GridState" },
isExternalFilterPresent: { module: "ExternalFilter" },
keepDetailRowsCount: {
validate({ keepDetailRowsCount }) {
return toConstrainedNum("keepDetailRowsCount", keepDetailRowsCount, 1);
}
},
localeText: {
module: "Locale"
},
masterDetail: { module: "SharedMasterDetail" },
pagination: { module: "Pagination" },
paginationPageSize: {
validate({ paginationPageSize }) {
return toConstrainedNum("paginationPageSize", paginationPageSize, 1);
}
},
paginationPageSizeSelector: {
validate: (options) => {
const values = options.paginationPageSizeSelector;
if (typeof values === "boolean" || values == null) {
return null;
}
if (!values.length) {
return `'paginationPageSizeSelector' cannot be an empty array.
If you want to hide the page size selector, set paginationPageSizeSelector to false.`;
}
return null;
}
},
pinnedTopRowData: {
module: "PinnedRow"
},
pinnedBottomRowData: {
module: "PinnedRow"
},
pivotMode: {
dependencies: {
treeData: {
required: [false, void 0],
reason: "Pivot Mode is not supported with Tree Data."
}
},
module: "SharedPivot"
},
pivotPanelShow: { module: "RowGroupingPanel" },
quickFilterText: {
supportedRowModels: ["clientSide"],
module: "QuickFilter"
},
rowBuffer: {
validate({ rowBuffer }) {
return toConstrainedNum("rowBuffer", rowBuffer, 0);
}
},
rowClass: {
validate: (options) => {
const rowClass = options.rowClass;
if (typeof rowClass === "function") {
return "rowClass should not be a function, please use getRowClass instead";
}
return null;
},
module: "RowStyle"
},
rowClassRules: { module: "RowStyle" },
rowData: {
supportedRowModels: ["clientSide"],
module: "ClientSideRowModel"
},
rowDragManaged: {
supportedRowModels: ["clientSide"],
dependencies: {
treeData: {
required: [false, void 0]
},
pagination: {
required: [false, void 0]
}
},
module: "RowDrag"
},
rowGroupPanelShow: { module: "RowGroupingPanel" },
rowSelection: {
validate({ rowSelection }) {
if (rowSelection && typeof rowSelection === "string") {
return 'As of version 32.2.1, using `rowSelection` with the values "single" or "multiple" has been deprecated. Use the object value instead.';
}
if (rowSelection && typeof rowSelection !== "object") {
return "Expected `RowSelectionOptions` object for the `rowSelection` property.";
}
if (rowSelection && rowSelection.mode !== "multiRow" && rowSelection.mode !== "singleRow") {
return `Selection mode "${rowSelection.mode}" is invalid. Use one of 'singleRow' or 'multiRow'.`;
}
return null;
},
module: "SharedRowSelection"
},
rowStyle: {
validate: (options) => {
const rowStyle = options.rowStyle;
if (rowStyle && typeof rowStyle === "function") {
return "rowStyle should be an object of key/value styles, not be a function, use getRowStyle() instead";
}
return null;
},
module: "RowStyle"
},
serverSideDatasource: {
supportedRowModels: ["serverSide"],
module: "ServerSideRowModel"
},
serverSideInitialRowCount: {
supportedRowModels: ["serverSide"],
validate({ serverSideInitialRowCount }) {
return toConstrainedNum("serverSideInitialRowCount", serverSideInitialRowCount, 1);
}
},
serverSideOnlyRefreshFilteredGroups: {
supportedRowModels: ["serverSide"]
},
serverSideSortAllLevels: {
supportedRowModels: ["serverSide"]
},
sideBar: { module: "SideBar" },
sortingOrder: {
validate: (_options) => {
const sortingOrder = _options.sortingOrder;
if (Array.isArray(sortingOrder) && sortingOrder.length > 0) {
const invalidItems = sortingOrder.filter((a) => !DEFAULT_SORTING_ORDER.includes(a));
if (invalidItems.length > 0) {
return `sortingOrder must be an array with elements from [${DEFAULT_SORTING_ORDER.map(toStringWithNullUndefined).join()}], currently it includes [${invalidItems.map(toStringWithNullUndefined).join()}]`;
}
} else if (!Array.isArray(sortingOrder) || sortingOrder.length <= 0) {
return `sortingOrder must be an array with at least one element, currently it's ${sortingOrder}`;
}
return null;
}
},
statusBar: { module: "StatusBar" },
tooltipHideDelay: {
validate: (options) => {
if (options.tooltipHideDelay && options.tooltipHideDelay < 0) {
return "tooltipHideDelay should not be lower than 0";
}
return null;
}
},
tooltipShowDelay: {
validate: (options) => {
if (options.tooltipShowDelay && options.tooltipShowDelay < 0) {
return "tooltipShowDelay should not be lower than 0";
}
return null;
}
},
treeData: {
supportedRowModels: ["clientSide", "serverSide"],
module: "SharedTreeData",
validate: (options) => {
const rowModel = options.rowModelType ?? "clientSide";
switch (rowModel) {
case "clientSide": {
const { treeDataChildrenField, getDataPath } = options;
if (!treeDataChildrenField && !getDataPath) {
return "treeData requires either 'treeDataChildrenField' or 'getDataPath' in the clientSide row model.";
}
if (treeDataChildrenField && getDataPath) {
return "Cannot use both 'treeDataChildrenField' and 'getDataPath' at the same time.";
}
return null;
}
case "serverSide": {
const ssrmWarning = `treeData requires 'isServerSideGroup' and 'getServerSideGroupKey' in the ${rowModel} row model.`;
return options.isServerSideGroup && options.getServerSideGroupKey ? null : ssrmWarning;
}
}
return null;
}
},
treeDataChildrenField: {
module: "SharedTreeData"
},
undoRedoCellEditing: { module: "UndoRedoEdit" },
valueCache: { module: "ValueCache" },
viewportDatasource: {
supportedRowModels: ["viewport"],
module: "ViewportRowModel"
},
viewportRowModelBufferSize: {
validate({ viewportRowModelBufferSize }) {
return toConstrainedNum("viewportRowModelBufferSize", viewportRowModelBufferSize, 0);
}
},
viewportRowModelPageSize: {
validate({ viewportRowModelPageSize }) {
return toConstrainedNum("viewportRowModelPageSize", viewportRowModelPageSize, 1);
}
},
rowDragEntireRow: {
dependencies: {
cellSelection: { required: [void 0] }
}
},
enableCellSpan: {
module: "CellSpan"
}
};
const validations = {};
_BOOLEAN_GRID_OPTIONS.forEach((key) => {
validations[key] = { expectedType: "boolean" };
});
_NUMBER_GRID_OPTIONS.forEach((key) => {
validations[key] = { expectedType: "number" };
});
_mergeDeep(validations, definedValidations);
return validations;
};
var GRID_OPTIONS_VALIDATORS = () => ({
objectName: "gridOptions",
allProperties: [..._ALL_GRID_OPTIONS, ..._ALL_EVENTS.map((event) => _getCallbackForEvent(event))],
propertyExceptions: ["api"],
docsUrl: "grid-options/",
deprecations: GRID_OPTION_DEPRECATIONS(),
validations: GRID_OPTION_VALIDATIONS()
});
// packages/ag-grid-community/src/validation/rules/iconValidations.ts
var ICON_VALUES = {
expanded: 1,
contracted: 1,
"tree-closed": 1,
"tree-open": 1,
"tree-indeterminate": 1,
pin: 1,
"eye-slash": 1,
arrows: 1,
left: 1,
right: 1,
group: 1,
aggregation: 1,
pivot: 1,
"not-allowed": 1,
chart: 1,
cross: 1,
cancel: 1,
tick: 1,
first: 1,
previous: 1,
next: 1,
last: 1,
linked: 1,
unlinked: 1,
"color-picker": 1,
loading: 1,
menu: 1,
"menu-alt": 1,
filter: 1,
columns: 1,
maximize: 1,
minimize: 1,
copy: 1,
cut: 1,
paste: 1,
grip: 1,
save: 1,
csv: 1,
excel: 1,
"small-down": 1,
"small-left": 1,
"small-right": 1,
"small-up": 1,
asc: 1,
desc: 1,
none: 1,
up: 1,
down: 1,
plus: 1,
minus: 1,
settings: 1,
"checkbox-checked": 1,
"checkbox-indeterminate": 1,
"checkbox-unchecked": 1,
"radio-button-on": 1,
"radio-button-off": 1,
eye: 1
};
var ICON_MODULES = {
chart: "MenuCore",
cancel: "EnterpriseCore",
first: "Pagination",
previous: "Pagination",
next: "Pagination",
last: "Pagination",
linked: "IntegratedCharts",
loadingMenuItems: "MenuCore",
unlinked: "IntegratedCharts",
menu: "ColumnHeaderComp",
legacyMenu: "ColumnMenu",
filter: "ColumnFilter",
filterActive: "ColumnFilter",
filterTab: "ColumnMenu",
filtersToolPanel: "FiltersToolPanel",
columns: ["MenuCore"],
columnsToolPanel: ["ColumnsToolPanel"],
maximize: "EnterpriseCore",
minimize: "EnterpriseCore",
save: "MenuCore",
columnGroupOpened: "ColumnGroupHeaderComp",
columnGroupClosed: "ColumnGroupHeaderComp",
accordionOpen: "EnterpriseCore",
accordionClosed: "EnterpriseCore",
accordionIndeterminate: "EnterpriseCore",
columnSelectClosed: ["ColumnsToolPanel", "ColumnMenu"],
columnSelectOpen: ["ColumnsToolPanel", "ColumnMenu"],
columnSelectIndeterminate: ["ColumnsToolPanel", "ColumnMenu"],
columnMovePin: "SharedDragAndDrop",
columnMoveHide: "SharedDragAndDrop",
columnMoveMove: "SharedDragAndDrop",
columnMoveLeft: "SharedDragAndDrop",
columnMoveRight: "SharedDragAndDrop",
columnMoveGroup: "SharedDragAndDrop",
columnMoveValue: "SharedDragAndDrop",
columnMovePivot: "SharedDragAndDrop",
dropNotAllowed: "SharedDragAndDrop",
groupContracted: "GroupCellRenderer",
groupExpanded: "GroupCellRenderer",
setFilterGroupClosed: "SetFilter",
setFilterGroupOpen: "SetFilter",
setFilterGroupIndeterminate: "SetFilter",
setFilterLoading: "SetFilter",
close: "EnterpriseCore",
check: "MenuItem",
colorPicker: "CommunityCore",
groupLoading: "LoadingCellRenderer",
menuAlt: "ColumnHeaderComp",
menuPin: "MenuCore",
menuValue: "MenuCore",
menuAddRowGroup: ["MenuCore", "ColumnsToolPanel"],
menuRemoveRowGroup: ["MenuCore", "ColumnsToolPanel"],
clipboardCopy: "MenuCore",
clipboardCut: "MenuCore",
clipboardPaste: "MenuCore",
pivotPanel: ["ColumnsToolPanel", "RowGroupingPanel"],
rowGroupPanel: ["ColumnsToolPanel", "RowGroupingPanel"],
valuePanel: "ColumnsToolPanel",
columnDrag: "EnterpriseCore",
rowDrag: ["RowDrag", "DragAndDrop"],
csvExport: "MenuCore",
excelExport: "MenuCore",
smallDown: "CommunityCore",
selectOpen: "CommunityCore",
richSelectOpen: "RichSelect",
richSelectRemove: "RichSelect",
smallLeft: "CommunityCore",
smallRight: "CommunityCore",
subMenuOpen: "MenuItem",
subMenuOpenRtl: "MenuItem",
panelDelimiter: "RowGroupingPanel",
panelDelimiterRtl: "RowGroupingPanel",
smallUp: "CommunityCore",
sortAscending: ["MenuCore", "Sort"],
sortDescending: ["MenuCore", "Sort"],
sortUnSort: ["MenuCore", "Sort"],
advancedFilterBuilder: "AdvancedFilter",
advancedFilterBuilderDrag: "AdvancedFilter",
advancedFilterBuilderInvalid: "AdvancedFilter",
advancedFilterBuilderMoveUp: "AdvancedFilter",
advancedFilterBuilderMoveDown: "AdvancedFilter",
advancedFilterBuilderAdd: "AdvancedFilter",
advancedFilterBuilderRemove: "AdvancedFilter",
advancedFilterBuilderSelectOpen: "AdvancedFilter",
chartsMenu: "IntegratedCharts",
chartsMenuEdit: "IntegratedCharts",
chartsMenuAdvancedSettings: "IntegratedCharts",
chartsMenuAdd: "IntegratedCharts",
chartsColorPicker: "IntegratedCharts",
chartsThemePrevious: "IntegratedCharts",
chartsThemeNext: "IntegratedCharts",
chartsDownload: "IntegratedCharts",
checkboxChecked: "CommunityCore",
checkboxIndeterminate: "CommunityCore",
checkboxUnchecked: "CommunityCore",
radioButtonOn: "CommunityCore",
radioButtonOff: "CommunityCore"
};
var DEPRECATED_ICONS_V33 = /* @__PURE__ */ new Set([
"colorPicker",
"smallUp",
"checkboxChecked",
"checkboxIndeterminate",
"checkboxUnchecked",
"radioButtonOn",
"radioButtonOff",
"smallDown",
"smallLeft",
"smallRight"
]);
// packages/ag-grid-community/src/validation/rules/menuItemValidations.ts
var MENU_ITEM_MODULES = {
pinSubMenu: "PinnedColumn",
pinLeft: "PinnedColumn",
pinRight: "PinnedColumn",
clearPinned: "PinnedColumn",
valueAggSubMenu: "SharedAggregation",
autoSizeThis: "ColumnAutoSize",
autoSizeAll: "ColumnAutoSize",
rowGroup: "SharedRowGrouping",
rowUnGroup: "SharedRowGrouping",
resetColumns: "CommunityCore",
expandAll: ["ClientSideRowModelHierarchy", "ServerSideRowModel"],
contractAll: ["ClientSideRowModelHierarchy", "ServerSideRowModel"],
copy: "Clipboard",
copyWithHeaders: "Clipboard",
copyWithGroupHeaders: "Clipboard",
cut: "Clipboard",
paste: "Clipboard",
export: ["CsvExport", "ExcelExport"],
csvExport: "CsvExport",
excelExport: "ExcelExport",
separator: "CommunityCore",
pivotChart: "IntegratedCharts",
chartRange: "IntegratedCharts",
columnFilter: "ColumnFilter",
columnChooser: "ColumnMenu",
sortAscending: "Sort",
sortDescending: "Sort",
sortUnSort: "Sort"
};
// packages/ag-grid-community/src/validation/validationService.ts
var ValidationService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "validation";
}
wireBeans(beans) {
this.gridOptions = beans.gridOptions;
provideValidationServiceLogger(this);
}
postConstruct() {
this.processGridOptions(this.gridOptions);
}
warnOnInitialPropertyUpdate(source, key) {
if (source === "api" && INITIAL_GRID_OPTION_KEYS[key]) {
_warn(22, { key });
}
}
processGridOptions(options) {
this.processOptions(options, GRID_OPTIONS_VALIDATORS());
}
validateApiFunction(functionName, apiFunction) {
return validateApiFunction(functionName, apiFunction, this.beans);
}
missingUserComponent(propertyName, componentName, agGridDefaults, jsComps) {
const moduleForComponent = USER_COMP_MODULES[componentName];
if (moduleForComponent) {
this.gos.assertModuleRegistered(
moduleForComponent,
`AG Grid '${propertyName}' component: ${componentName}`
);
} else {
_warn(101, {
propertyName,
componentName,
agGridDefaults,
jsComps
});
}
}
checkRowEvents(eventType) {
if (DEPRECATED_ROW_NODE_EVENTS.has(eventType)) {
_warn(10, { eventType });
}
}
validateIcon(iconName) {
if (DEPRECATED_ICONS_V33.has(iconName)) {
_warn(43, { iconName });
}
if (ICON_VALUES[iconName]) {
return;
}
const moduleName = ICON_MODULES[iconName];
if (moduleName) {
_error(200, {
reasonOrId: `icon '${iconName}'`,
moduleName,
gridScoped: _areModulesGridScoped(),
gridId: this.beans.context.getGridId(),
rowModelType: this.gos.get("rowModelType"),
additionalText: "Alternatively, use the CSS icon name directly."
});
return;
}
_warn(134, { iconName });
}
validateMenuItem(key) {
const moduleName = MENU_ITEM_MODULES[key];
if (moduleName) {
this.gos.assertModuleRegistered(moduleName, `menu item '${key}'`);
}
}
isProvidedUserComp(compName) {
return !!USER_COMP_MODULES[compName];
}
validateColDef(colDef, colId, skipInferenceCheck) {
if (skipInferenceCheck || !this.beans.dataTypeSvc?.isColPendingInference(colId)) {
this.processOptions(colDef, COL_DEF_VALIDATORS());
}
}
processOptions(options, validator) {
const { validations, deprecations, allProperties, propertyExceptions, objectName, docsUrl } = validator;
if (allProperties && this.gridOptions.suppressPropertyNamesCheck !== true) {
this.checkProperties(
options,
[...propertyExceptions ?? [], ...Object.keys(deprecations)],
allProperties,
objectName,
docsUrl
);
}
const warnings = /* @__PURE__ */ new Set();
const getRules = (key) => {
const rulesOrGetter = validations[key];
if (!rulesOrGetter) {
return;
} else if (typeof rulesOrGetter === "function") {
const fromGetter = rulesOrGetter(options, this.gridOptions, this.beans);
if (!fromGetter) {
return;
}
if ("objectName" in fromGetter) {
const value = options[key];
if (Array.isArray(value)) {
value.forEach((item) => {
this.processOptions(item, fromGetter);
});
return;
}
this.processOptions(options[key], fromGetter);
return;
}
return fromGetter;
} else {
return rulesOrGetter;
}
};
const optionKeys = Object.keys(options);
optionKeys.forEach((key) => {
const deprecation = deprecations[key];
if (deprecation) {
const { message, version } = deprecation;
warnings.add(`As of v${version}, ${String(key)} is deprecated. ${message ?? ""}`);
}
const value = options[key];
if (value == null || value === false) {
return;
}
const rules = getRules(key);
if (!rules) {
return;
}
const { module: module2, dependencies, validate, supportedRowModels, expectedType } = rules;
if (expectedType) {
const actualType = typeof value;
if (actualType !== expectedType) {
warnings.add(
`${String(key)} should be of type '${expectedType}' but received '${actualType}' (${value}).`
);
return;
}
}
if (supportedRowModels) {
const rowModel = this.gridOptions.rowModelType ?? "clientSide";
if (!supportedRowModels.includes(rowModel)) {
warnings.add(
`${String(key)} is not supported with the '${rowModel}' row model. It is only valid with: ${supportedRowModels.join(", ")}.`
);
return;
}
}
if (module2) {
const modules = Array.isArray(module2) ? module2 : [module2];
let allRegistered = true;
modules.forEach((m) => {
if (!this.gos.assertModuleRegistered(m, String(key))) {
allRegistered = false;
}
});
if (!allRegistered) {
return;
}
}
if (dependencies) {
const warning = this.checkForRequiredDependencies(key, dependencies, options);
if (warning) {
warnings.add(warning);
return;
}
}
if (validate) {
const warning = validate(options, this.gridOptions, this.beans);
if (warning) {
warnings.add(warning);
return;
}
}
});
if (warnings.size > 0) {
warnings.forEach((warning) => {
_warnOnce(warning);
});
}
}
checkForRequiredDependencies(key, validator, options) {
const optionEntries = Object.entries(validator);
const failedOptions = optionEntries.filter(([key2, value]) => {
const gridOptionValue = options[key2];
return !value.required.includes(gridOptionValue);
});
if (failedOptions.length === 0) {
return null;
}
return failedOptions.map(
([failedKey, possibleOptions]) => `'${String(key)}' requires '${failedKey}' to be one of [${possibleOptions.required.map((o) => {
if (o === null) {
return "null";
} else if (o === void 0) {
return "undefined";
}
return o;
}).join(", ")}]. ${possibleOptions.reason ?? ""}`
).join("\n ");
}
checkProperties(object, exceptions, validProperties, containerName, docsUrl) {
const VUE_FRAMEWORK_PROPS = ["__ob__", "__v_skip", "__metadata__"];
const invalidProperties = _fuzzyCheckStrings(
Object.getOwnPropertyNames(object),
[...VUE_FRAMEWORK_PROPS, ...exceptions, ...validProperties],
validProperties
);
const invalidPropertiesKeys = Object.keys(invalidProperties);
for (const key of invalidPropertiesKeys) {
const value = invalidProperties[key];
let message = `invalid ${containerName} property '${key}' did you mean any of these: ${value.slice(0, 8).join(", ")}.`;
if (validProperties.includes("context")) {
message += `
If you are trying to annotate ${containerName} with application data, use the '${containerName}.context' property instead.`;
}
_warnOnce(message);
}
if (invalidPropertiesKeys.length > 0 && docsUrl) {
const url = this.beans.frameworkOverrides.getDocLink(docsUrl);
_warnOnce(`to see all the valid ${containerName} properties please check: ${url}`);
}
}
getConsoleMessage(id, args) {
return getError(id, args);
}
};
function _fuzzyCheckStrings(inputValues, validValues, allSuggestions) {
const fuzzyMatches = {};
const invalidInputs = inputValues.filter(
(inputValue) => !validValues.some((validValue) => validValue === inputValue)
);
if (invalidInputs.length > 0) {
invalidInputs.forEach(
(invalidInput) => fuzzyMatches[invalidInput] = _fuzzySuggestions({ inputValue: invalidInput, allSuggestions }).values
);
}
return fuzzyMatches;
}
var DEPRECATED_ROW_NODE_EVENTS = /* @__PURE__ */ new Set([
"firstChildChanged",
"lastChildChanged",
"childIndexChanged"
]);
// packages/ag-grid-community/src/validation/validationModule.ts
var ValidationModule = {
moduleName: "Validation",
version: VERSION,
beans: [ValidationService]
};
// packages/ag-grid-community/src/clientSideRowModel/filterStage.ts
function updateRowNodeAfterFilter(rowNode) {
if (rowNode.sibling) {
rowNode.sibling.childrenAfterFilter = rowNode.childrenAfterFilter;
}
}
var FilterStage = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "filterStage";
this.refreshProps = /* @__PURE__ */ 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) => {
if (rowNode.hasChildren()) {
if (filterActive && !includeChildNodes) {
rowNode.childrenAfterFilter = rowNode.childrenAfterGroup.filter((childNode) => {
const passBecauseChildren = childNode.childrenAfterFilter && childNode.childrenAfterFilter.length > 0;
const passBecauseDataPasses = childNode.data && this.filterManager.doesRowPassFilter({ rowNode: childNode });
return passBecauseChildren || passBecauseDataPasses;
});
} else {
rowNode.childrenAfterFilter = rowNode.childrenAfterGroup;
}
} else {
rowNode.childrenAfterFilter = rowNode.childrenAfterGroup;
}
updateRowNodeAfterFilter(rowNode);
};
if (this.doingTreeDataFiltering()) {
const treeDataDepthFirstFilter = (rowNode, alreadyFoundInParent) => {
if (rowNode.childrenAfterGroup) {
for (let i = 0; i < rowNode.childrenAfterGroup.length; i++) {
const childNode = rowNode.childrenAfterGroup[i];
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");
}
};
// packages/ag-grid-community/src/headerRendering/cells/floatingFilter/headerFilterCellCtrl.ts
var HeaderFilterCellCtrl = class extends AbstractHeaderCellCtrl {
constructor() {
super(...arguments);
this.iconCreated = false;
}
setComp(comp, eGui, eButtonShowMainFilter, eFloatingFilterBody, compBeanInput) {
this.comp = comp;
const compBean = 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) });
compBean.addDestroyFunc(() => {
this.eButtonShowMainFilter = null;
this.eFloatingFilterBody = null;
this.userCompDetails = null;
this.clearComponent();
});
}
// empty abstract method
resizeHeader() {
}
moveHeader() {
}
getHeaderClassParams() {
const { column, beans } = this;
const colDef = column.colDef;
return _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 = _createIconNoSpan("filter", this.beans, this.column);
if (eMenuIcon) {
this.iconCreated = true;
this.eButtonShowMainFilter.appendChild(eMenuIcon);
}
}
setupFocus(compBean) {
compBean.createManagedBean(
new 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();
_setAriaLabel(this.eButtonShowMainFilter, localeTextFunc("ariaFilterMenuOpen", "Open Filter Menu"));
}
onTabKeyDown(e) {
const { beans } = this;
const activeEl = _getActiveDomElement(beans);
const wrapperHasFocus = activeEl === this.eGui;
if (wrapperHasFocus) {
return;
}
const nextFocusableEl = _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.UP:
case KeyCode.DOWN:
if (!wrapperHasFocus) {
e.preventDefault();
}
case KeyCode.LEFT:
case KeyCode.RIGHT:
if (wrapperHasFocus) {
return;
}
e.stopPropagation();
case KeyCode.ENTER:
if (wrapperHasFocus) {
if (_focusInto(this.eGui)) {
e.preventDefault();
}
}
break;
case KeyCode.ESCAPE:
if (!wrapperHasFocus) {
this.eGui.focus();
}
}
}
onFocusIn(e) {
const isRelatedWithin = this.eGui.contains(e.relatedTarget);
if (isRelatedWithin) {
return;
}
const notFromHeaderWrapper = !!e.relatedTarget && !e.relatedTarget.classList.contains("ag-floating-filter");
const fromWithinHeader = !!e.relatedTarget && _isElementChildOfClass(e.relatedTarget, "ag-floating-filter");
if (notFromHeaderWrapper && fromWithinHeader && e.target === this.eGui) {
const lastFocusEvent = this.lastFocusEvent;
const fromTab = !!(lastFocusEvent && lastFocusEvent.key === KeyCode.TAB);
if (lastFocusEvent && fromTab) {
const shouldFocusLast = lastFocusEvent.shiftKey;
_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(this.column, this.eGui, this.beans);
compBean.createManagedBean(setLeftFeature);
}
setupFilterButton() {
this.suppressFilterButton = !this.beans.menuSvc?.isFloatingFilterButtonEnabled(this.column);
this.highlightFilterButtonWhenActive = !_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);
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);
}
});
}
addResizeAndMoveKeyboardListeners() {
}
destroy() {
super.destroy();
this.destroySyncListener = null;
this.destroyFilterChangedListener = null;
}
};
// packages/ag-grid-community/src/misc/menu/menuApi.ts
function showColumnMenu(beans, colKey) {
const column = beans.colModel.getCol(colKey);
if (!column) {
_error(12, { colKey });
return;
}
beans.menuSvc?.showColumnMenu({
column,
positionBy: "auto"
});
}
function hidePopupMenu(beans) {
beans.menuSvc?.hidePopupMenu();
}
// packages/ag-grid-community/src/misc/menu/sharedMenuModule.ts
var SharedMenuModule = {
moduleName: "SharedMenu",
version: VERSION,
beans: [MenuService],
apiFunctions: {
showColumnMenu,
hidePopupMenu
}
};
// packages/ag-grid-community/src/widgets/popupService.ts
var instanceIdSeq = 0;
var WAIT_FOR_POPUP_CONTENT_RESIZE = 200;
var PopupService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "popupSvc";
this.popupList = [];
}
postConstruct() {
this.beans.ctrlsSvc.whenReady(this, (p) => {
this.gridCtrl = p.gridCtrl;
});
this.addManagedEventListeners({ gridStylesChanged: this.handleThemeChange.bind(this) });
}
getPopupParent() {
const ePopupParent = this.gos.get("popupParent");
if (ePopupParent) {
return ePopupParent;
}
return this.gridCtrl.getGui();
}
positionPopupForMenu(params) {
const { eventSource, ePopup, column, node, event } = params;
const sourceRect = eventSource.getBoundingClientRect();
const parentRect = this.getParentRect();
this.setAlignedTo(eventSource, ePopup);
let minWidthSet = false;
const updatePosition = () => {
const y = this.keepXYWithinBounds(ePopup, sourceRect.top - parentRect.top, 0 /* vertical */);
const minWidth = ePopup.clientWidth > 0 ? ePopup.clientWidth : 200;
if (!minWidthSet) {
ePopup.style.minWidth = `${minWidth}px`;
minWidthSet = true;
}
const widthOfParent = parentRect.right - parentRect.left;
const maxX = widthOfParent - minWidth;
let x;
if (this.gos.get("enableRtl")) {
x = xLeftPosition();
if (x < 0) {
x = xRightPosition();
this.setAlignedStyles(ePopup, "left");
}
if (x > maxX) {
x = 0;
this.setAlignedStyles(ePopup, "right");
}
} else {
x = xRightPosition();
if (x > maxX) {
x = xLeftPosition();
this.setAlignedStyles(ePopup, "right");
}
if (x < 0) {
x = 0;
this.setAlignedStyles(ePopup, "left");
}
}
return { x, y };
function xRightPosition() {
return sourceRect.right - parentRect.left - 2;
}
function xLeftPosition() {
return sourceRect.left - parentRect.left - minWidth;
}
};
this.positionPopup({
ePopup,
keepWithinBounds: true,
updatePosition,
postProcessCallback: () => this.callPostProcessPopup(
"subMenu",
ePopup,
eventSource,
event instanceof MouseEvent ? event : void 0,
column,
node
)
});
}
positionPopupUnderMouseEvent(params) {
const { ePopup, nudgeX, nudgeY, skipObserver } = params;
this.positionPopup({
ePopup,
nudgeX,
nudgeY,
keepWithinBounds: true,
skipObserver,
updatePosition: () => this.calculatePointerAlign(params.mouseEvent),
postProcessCallback: () => this.callPostProcessPopup(
params.type,
params.ePopup,
null,
params.mouseEvent,
params.column,
params.rowNode
)
});
}
calculatePointerAlign(e) {
const parentRect = this.getParentRect();
return {
x: e.clientX - parentRect.left,
y: e.clientY - parentRect.top
};
}
positionPopupByComponent(params) {
const {
ePopup,
nudgeX,
nudgeY,
keepWithinBounds,
eventSource,
alignSide = "left",
position = "over",
column,
rowNode,
type
} = params;
const sourceRect = eventSource.getBoundingClientRect();
const parentRect = this.getParentRect();
this.setAlignedTo(eventSource, ePopup);
const updatePosition = () => {
let x = sourceRect.left - parentRect.left;
if (alignSide === "right") {
x -= ePopup.offsetWidth - sourceRect.width;
}
let y;
if (position === "over") {
y = sourceRect.top - parentRect.top;
this.setAlignedStyles(ePopup, "over");
} else {
this.setAlignedStyles(ePopup, "under");
const alignSide2 = this.shouldRenderUnderOrAbove(ePopup, sourceRect, parentRect, params.nudgeY || 0);
if (alignSide2 === "under") {
y = sourceRect.top - parentRect.top + sourceRect.height;
} else {
y = sourceRect.top - ePopup.offsetHeight - (nudgeY || 0) * 2 - parentRect.top;
}
}
return { x, y };
};
this.positionPopup({
ePopup,
nudgeX,
nudgeY,
keepWithinBounds,
updatePosition,
postProcessCallback: () => this.callPostProcessPopup(type, ePopup, eventSource, null, column, rowNode)
});
}
shouldRenderUnderOrAbove(ePopup, targetCompRect, parentRect, nudgeY) {
const spaceAvailableUnder = parentRect.bottom - targetCompRect.bottom;
const spaceAvailableAbove = targetCompRect.top - parentRect.top;
const spaceRequired = ePopup.offsetHeight + nudgeY;
if (spaceAvailableUnder > spaceRequired) {
return "under";
}
if (spaceAvailableAbove > spaceRequired || spaceAvailableAbove > spaceAvailableUnder) {
return "above";
}
return "under";
}
setAlignedStyles(ePopup, positioned) {
const popupIdx = this.getPopupIndex(ePopup);
if (popupIdx === -1) {
return;
}
const popup = this.popupList[popupIdx];
const { alignedToElement } = popup;
if (!alignedToElement) {
return;
}
const positions = ["right", "left", "over", "above", "under"];
positions.forEach((position) => {
alignedToElement.classList.remove(`ag-has-popup-positioned-${position}`);
ePopup.classList.remove(`ag-popup-positioned-${position}`);
});
if (!positioned) {
return;
}
alignedToElement.classList.add(`ag-has-popup-positioned-${positioned}`);
ePopup.classList.add(`ag-popup-positioned-${positioned}`);
}
setAlignedTo(eventSource, ePopup) {
const popupIdx = this.getPopupIndex(ePopup);
if (popupIdx !== -1) {
const popup = this.popupList[popupIdx];
popup.alignedToElement = eventSource;
}
}
callPostProcessPopup(type, ePopup, eventSource, mouseEvent, column, rowNode) {
const callback = this.gos.getCallback("postProcessPopup");
if (callback) {
const params = {
column,
rowNode,
ePopup,
type,
eventSource,
mouseEvent
};
callback(params);
}
}
positionPopup(params) {
const { ePopup, keepWithinBounds, nudgeX, nudgeY, skipObserver, updatePosition } = params;
const lastSize = { width: 0, height: 0 };
const updatePopupPosition = (fromResizeObserver = false) => {
let { x, y } = updatePosition();
if (fromResizeObserver && ePopup.clientWidth === lastSize.width && ePopup.clientHeight === lastSize.height) {
return;
}
lastSize.width = ePopup.clientWidth;
lastSize.height = ePopup.clientHeight;
if (nudgeX) {
x += nudgeX;
}
if (nudgeY) {
y += nudgeY;
}
if (keepWithinBounds) {
x = this.keepXYWithinBounds(ePopup, x, 1 /* horizontal */);
y = this.keepXYWithinBounds(ePopup, y, 0 /* vertical */);
}
ePopup.style.left = `${x}px`;
ePopup.style.top = `${y}px`;
if (params.postProcessCallback) {
params.postProcessCallback();
}
};
updatePopupPosition();
if (!skipObserver) {
const resizeObserverDestroyFunc = _observeResize(this.beans, ePopup, () => updatePopupPosition(true));
setTimeout(() => resizeObserverDestroyFunc(), WAIT_FOR_POPUP_CONTENT_RESIZE);
}
}
getActivePopups() {
return this.popupList.map((popup) => popup.element);
}
getParentRect() {
const eDocument = _getDocument(this.beans);
let popupParent = this.getPopupParent();
if (popupParent === eDocument.body) {
popupParent = eDocument.documentElement;
} else if (getComputedStyle(popupParent).position === "static") {
popupParent = popupParent.offsetParent;
}
return _getElementRectWithOffset(popupParent);
}
keepXYWithinBounds(ePopup, position, direction) {
const isVertical = direction === 0 /* vertical */;
const sizeProperty = isVertical ? "clientHeight" : "clientWidth";
const anchorProperty = isVertical ? "top" : "left";
const offsetProperty = isVertical ? "height" : "width";
const scrollPositionProperty = isVertical ? "scrollTop" : "scrollLeft";
const eDocument = _getDocument(this.beans);
const docElement = eDocument.documentElement;
const popupParent = this.getPopupParent();
const popupRect = ePopup.getBoundingClientRect();
const parentRect = popupParent.getBoundingClientRect();
const documentRect = eDocument.documentElement.getBoundingClientRect();
const isBody = popupParent === eDocument.body;
const offsetSize = Math.ceil(popupRect[offsetProperty]);
const getSize2 = isVertical ? _getAbsoluteHeight : _getAbsoluteWidth;
let sizeOfParent = isBody ? getSize2(docElement) + docElement[scrollPositionProperty] : popupParent[sizeProperty];
if (isBody) {
sizeOfParent -= Math.abs(documentRect[anchorProperty] - parentRect[anchorProperty]);
}
const max = sizeOfParent - offsetSize;
return Math.min(Math.max(position, 0), Math.abs(max));
}
addPopup(params) {
const eDocument = _getDocument(this.beans);
const { eChild, ariaLabel, alwaysOnTop, positionCallback, anchorToElement } = params;
if (!eDocument) {
_warn(122);
return { hideFunc: () => {
} };
}
const pos = this.getPopupIndex(eChild);
if (pos !== -1) {
const popup = this.popupList[pos];
return { hideFunc: popup.hideFunc };
}
this.initialisePopupPosition(eChild);
const wrapperEl = this.createPopupWrapper(eChild, ariaLabel, !!alwaysOnTop);
const removeListeners = this.addEventListenersToPopup({ ...params, wrapperEl });
if (positionCallback) {
positionCallback();
}
this.addPopupToPopupList(eChild, wrapperEl, removeListeners, anchorToElement);
return {
hideFunc: removeListeners
};
}
initialisePopupPosition(element) {
const ePopupParent = this.getPopupParent();
const ePopupParentRect = ePopupParent.getBoundingClientRect();
if (!_exists(element.style.top)) {
element.style.top = `${ePopupParentRect.top * -1}px`;
}
if (!_exists(element.style.left)) {
element.style.left = `${ePopupParentRect.left * -1}px`;
}
}
createPopupWrapper(element, ariaLabel, alwaysOnTop) {
const ePopupParent = this.getPopupParent();
const eWrapper = document.createElement("div");
const { environment, gos } = this.beans;
environment.applyThemeClasses(eWrapper);
eWrapper.classList.add("ag-popup");
element.classList.add(gos.get("enableRtl") ? "ag-rtl" : "ag-ltr", "ag-popup-child");
if (!element.hasAttribute("role")) {
_setAriaRole(element, "dialog");
}
_setAriaLabel(element, ariaLabel);
eWrapper.appendChild(element);
ePopupParent.appendChild(eWrapper);
if (alwaysOnTop) {
this.setAlwaysOnTop(element, true);
} else {
this.bringPopupToFront(element);
}
return eWrapper;
}
handleThemeChange(e) {
if (e.themeChanged) {
const environment = this.beans.environment;
for (const popup of this.popupList) {
environment.applyThemeClasses(popup.wrapper);
}
}
}
addEventListenersToPopup(params) {
const beans = this.beans;
const eDocument = _getDocument(beans);
const ePopupParent = this.getPopupParent();
const { wrapperEl, eChild: popupEl, closedCallback, afterGuiAttached, closeOnEsc, modal } = params;
let popupHidden = false;
const hidePopupOnKeyboardEvent = (event) => {
if (!wrapperEl.contains(_getActiveDomElement(beans))) {
return;
}
const key = event.key;
if (key === KeyCode.ESCAPE && !_isStopPropagationForAgGrid(event)) {
removeListeners({ keyboardEvent: event });
}
};
const hidePopupOnMouseEvent = (event) => removeListeners({ mouseEvent: event });
const hidePopupOnTouchEvent = (event) => removeListeners({ touchEvent: event });
const removeListeners = (popupParams = {}) => {
const { mouseEvent, touchEvent, keyboardEvent, forceHide } = popupParams;
if (!forceHide && // we don't hide popup if the event was on the child, or any
// children of this child
(this.isEventFromCurrentPopup({ mouseEvent, touchEvent }, popupEl) || // this method should only be called once. the client can have different
// paths, each one wanting to close, so this method may be called multiple times.
popupHidden)) {
return;
}
popupHidden = true;
ePopupParent.removeChild(wrapperEl);
eDocument.removeEventListener("keydown", hidePopupOnKeyboardEvent);
eDocument.removeEventListener("mousedown", hidePopupOnMouseEvent);
eDocument.removeEventListener("touchstart", hidePopupOnTouchEvent);
eDocument.removeEventListener("contextmenu", hidePopupOnMouseEvent);
this.eventSvc.removeEventListener("dragStarted", hidePopupOnMouseEvent);
if (closedCallback) {
closedCallback(mouseEvent || touchEvent || keyboardEvent);
}
this.removePopupFromPopupList(popupEl);
};
if (afterGuiAttached) {
afterGuiAttached({ hidePopup: removeListeners });
}
window.setTimeout(() => {
if (closeOnEsc) {
eDocument.addEventListener("keydown", hidePopupOnKeyboardEvent);
}
if (modal) {
eDocument.addEventListener("mousedown", hidePopupOnMouseEvent);
this.eventSvc.addEventListener("dragStarted", hidePopupOnMouseEvent);
eDocument.addEventListener("touchstart", hidePopupOnTouchEvent);
eDocument.addEventListener("contextmenu", hidePopupOnMouseEvent);
}
}, 0);
return removeListeners;
}
addPopupToPopupList(element, wrapperEl, removeListeners, anchorToElement) {
this.popupList.push({
element,
wrapper: wrapperEl,
hideFunc: removeListeners,
instanceId: instanceIdSeq++,
isAnchored: !!anchorToElement
});
if (anchorToElement) {
this.setPopupPositionRelatedToElement(element, anchorToElement);
}
}
getPopupIndex(el) {
return this.popupList.findIndex((p) => p.element === el);
}
setPopupPositionRelatedToElement(popupEl, relativeElement) {
const popupIndex = this.getPopupIndex(popupEl);
if (popupIndex === -1) {
return;
}
const popup = this.popupList[popupIndex];
if (popup.stopAnchoringPromise) {
popup.stopAnchoringPromise.then((destroyFunc) => destroyFunc && destroyFunc());
}
popup.stopAnchoringPromise = void 0;
popup.isAnchored = false;
if (!relativeElement) {
return;
}
const destroyPositionTracker = this.keepPopupPositionedRelativeTo({
element: relativeElement,
ePopup: popupEl,
hidePopup: popup.hideFunc
});
popup.stopAnchoringPromise = destroyPositionTracker;
popup.isAnchored = true;
return destroyPositionTracker;
}
removePopupFromPopupList(element) {
this.setAlignedStyles(element, null);
this.setPopupPositionRelatedToElement(element, null);
this.popupList = this.popupList.filter((p) => p.element !== element);
}
keepPopupPositionedRelativeTo(params) {
const eParent = this.getPopupParent();
const parentRect = eParent.getBoundingClientRect();
const { element, ePopup } = params;
const sourceRect = element.getBoundingClientRect();
const extractFromPixelValue = (pxSize) => parseInt(pxSize.substring(0, pxSize.length - 1), 10);
const createPosition = (prop, direction) => {
const initialDiff = parentRect[prop] - sourceRect[prop];
const initial = extractFromPixelValue(ePopup.style[prop]);
return {
initialDiff,
lastDiff: initialDiff,
initial,
last: initial,
direction
};
};
const topPosition = createPosition("top", 0 /* vertical */);
const leftPosition = createPosition("left", 1 /* horizontal */);
const fwOverrides = this.beans.frameworkOverrides;
return new AgPromise((resolve) => {
fwOverrides.wrapIncoming(() => {
fwOverrides.setInterval(() => {
const pRect = eParent.getBoundingClientRect();
const sRect = element.getBoundingClientRect();
const elementNotInDom = sRect.top == 0 && sRect.left == 0 && sRect.height == 0 && sRect.width == 0;
if (elementNotInDom) {
params.hidePopup();
return;
}
const calculateNewPosition = (position, prop) => {
const current = extractFromPixelValue(ePopup.style[prop]);
if (position.last !== current) {
position.initial = current;
position.last = current;
}
const currentDiff = pRect[prop] - sRect[prop];
if (currentDiff != position.lastDiff) {
const newValue = this.keepXYWithinBounds(
ePopup,
position.initial + position.initialDiff - currentDiff,
position.direction
);
ePopup.style[prop] = `${newValue}px`;
position.last = newValue;
}
position.lastDiff = currentDiff;
};
calculateNewPosition(topPosition, "top");
calculateNewPosition(leftPosition, "left");
}, 200).then((intervalId) => {
const result = () => {
if (intervalId != null) {
window.clearInterval(intervalId);
}
};
resolve(result);
});
}, "popupPositioning");
});
}
hasAnchoredPopup() {
return this.popupList.some((popup) => popup.isAnchored);
}
isEventFromCurrentPopup(params, target) {
const { mouseEvent, touchEvent } = params;
const event = mouseEvent ? mouseEvent : touchEvent;
if (!event) {
return false;
}
const indexOfThisChild = this.getPopupIndex(target);
if (indexOfThisChild === -1) {
return false;
}
for (let i = indexOfThisChild; i < this.popupList.length; i++) {
const popup = this.popupList[i];
if (_isElementInEventPath(popup.element, event)) {
return true;
}
}
return this.isElementWithinCustomPopup(event.target);
}
isElementWithinCustomPopup(el) {
const eDocument = _getDocument(this.beans);
while (el && el !== eDocument.body) {
if (el.classList.contains("ag-custom-component-popup") || el.parentElement === null) {
return true;
}
el = el.parentElement;
}
return false;
}
getWrapper(ePopup) {
while (!ePopup.classList.contains("ag-popup") && ePopup.parentElement) {
ePopup = ePopup.parentElement;
}
return ePopup.classList.contains("ag-popup") ? ePopup : null;
}
setAlwaysOnTop(ePopup, alwaysOnTop) {
const eWrapper = this.getWrapper(ePopup);
if (!eWrapper) {
return;
}
eWrapper.classList.toggle("ag-always-on-top", !!alwaysOnTop);
if (alwaysOnTop) {
this.bringPopupToFront(eWrapper);
}
}
/** @return true if moved */
bringPopupToFront(ePopup) {
const parent = this.getPopupParent();
const popupList = Array.prototype.slice.call(parent.querySelectorAll(".ag-popup"));
const popupLen = popupList.length;
const eWrapper = this.getWrapper(ePopup);
if (!eWrapper || popupLen <= 1 || !parent.contains(ePopup)) {
return;
}
const standardPopupList = [];
const alwaysOnTopList = [];
for (const popup of popupList) {
if (popup === eWrapper) {
continue;
}
if (popup.classList.contains("ag-always-on-top")) {
alwaysOnTopList.push(popup);
} else {
standardPopupList.push(popup);
}
}
const innerElsScrollMap = [];
const onTopLength = alwaysOnTopList.length;
const isPopupAlwaysOnTop = eWrapper.classList.contains("ag-always-on-top");
const shouldBeLast = isPopupAlwaysOnTop || !onTopLength;
const targetList = shouldBeLast ? [...standardPopupList, ...alwaysOnTopList, eWrapper] : [...standardPopupList, eWrapper, ...alwaysOnTopList];
for (let i = 0; i <= popupLen; i++) {
const currentPopup = targetList[i];
if (popupList[i] === targetList[i] || currentPopup === eWrapper) {
continue;
}
const innerEls = currentPopup.querySelectorAll("div");
innerEls.forEach((el) => {
if (el.scrollTop !== 0) {
innerElsScrollMap.push([el, el.scrollTop]);
}
});
if (i === 0) {
parent.insertAdjacentElement("afterbegin", currentPopup);
} else {
targetList[i - 1].insertAdjacentElement("afterend", currentPopup);
}
}
while (innerElsScrollMap.length) {
const currentEl = innerElsScrollMap.pop();
currentEl[0].scrollTop = currentEl[1];
}
}
};
// packages/ag-grid-community/src/widgets/popupModule.ts
var PopupModule = {
moduleName: "Popup",
version: VERSION,
beans: [PopupService]
};
// packages/ag-grid-community/src/filter/column-filters.css-GENERATED.ts
var columnFiltersCSS = (
/*css*/
`.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)}`
);
// packages/ag-grid-community/src/filter/columnFilterApi.ts
function isColumnFilterPresent(beans) {
const filterManager = beans.filterManager;
return !!filterManager?.isColumnFilterPresent() || !!filterManager?.isAggregateFilterPresent();
}
function getColumnFilterInstance(beans, key) {
return beans.filterManager?.getColumnFilterInstance(key) ?? Promise.resolve(void 0);
}
function destroyFilter(beans, key) {
const column = beans.colModel.getColDefCol(key);
if (column) {
return beans.filterManager?.destroyFilter(column, "api");
}
}
function setFilterModel(beans, model) {
beans.frameworkOverrides.wrapIncoming(() => beans.filterManager?.setFilterModel(model));
}
function getFilterModel(beans) {
return beans.filterManager?.getFilterModel() ?? {};
}
function getColumnFilterModel(beans, column) {
return beans.filterManager?.getColumnFilterModel(column) ?? null;
}
function setColumnFilterModel(beans, column, model) {
return beans.filterManager?.setColumnFilterModel(column, model) ?? Promise.resolve();
}
function showColumnFilter(beans, colKey) {
const column = beans.colModel.getCol(colKey);
if (!column) {
_error(12, { colKey });
return;
}
beans.menuSvc?.showFilterMenu({
column,
containerType: "columnFilter",
positionBy: "auto"
});
}
// packages/ag-grid-community/src/filter/columnFilterService.ts
var 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"
};
var 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);
}
var ColumnFilterService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "colFilter";
this.allColumnFilters = /* @__PURE__ */ new Map();
this.allColumnListeners = /* @__PURE__ */ 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 }) => {
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) {
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);
});
modelKeys.forEach((colId) => {
const column = colModel.getColDefCol(colId) || colModel.getCol(colId);
if (!column) {
_warn(62, { colId });
return;
}
if (!column.isFilterAllowed()) {
_warn(63, { colId });
return;
}
const filterWrapper = this.getOrCreateFilterWrapper(column);
if (!filterWrapper) {
_warn(64, { colId });
return;
}
allPromises.push(setModelOnFilterWrapper(filterWrapper.filterPromise, model[colId]));
});
} else {
this.allColumnFilters.forEach((filterWrapper) => {
allPromises.push(setModelOnFilterWrapper(filterWrapper.filterPromise, null));
});
}
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 (!_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 (_exists(model)) {
result[key] = model;
}
});
if (!excludeInitialState) {
for (const colId of Object.keys(initialFilterModel)) {
const model = initialFilterModel[colId];
if (_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") {
_warn(66);
return null;
}
return filter.getModel();
} else {
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;
}
if (!filter.isFilterActive) {
_warn(67);
return false;
}
return filter.isFilterActive();
};
const { colModel, gos } = this.beans;
const groupFilterEnabled = !!_getGroupAggFiltering(gos);
const isAggFilter = (column) => {
const isSecondary = !column.isPrimary();
if (isSecondary) {
return true;
}
const isShowingPrimaryColumns = !colModel.isPivotActive();
const isValueActive = column.isValueActive();
if (!isValueActive || !isShowingPrimaryColumns) {
return false;
}
if (colModel.isPivotMode()) {
return true;
}
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 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") {
_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();
}
});
});
this.processingFilterChange = true;
})
);
}
updateAfterFilterChanged() {
this.processingFilterChange = false;
}
isSuppressFlashingCellsBecauseFiltering() {
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) : void 0;
};
}
isFilterActive(column) {
const { filter } = this.cachedFilter(column) ?? {};
if (filter) {
return filter.isFilterActive();
}
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 (_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 (_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 = _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 ?? void 0;
}
});
return filterPromise;
},
compDetails
};
}
createFilterParams(column, colDef) {
const params = _addGridCommonParams(this.gos, {
column,
colDef,
rowModel: this.beans.rowModel,
// @deprecated v33.1
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);
}
if (currentColumn && currentColumn === wrapper.column) {
return;
}
columns.push(wrapper.column);
this.disposeFilterWrapper(wrapper, "columnChanged");
this.disposeColumnListener(colId);
});
const allFiltersAreGroupFilters = columns.every(isGroupFilter);
if (columns.length > 0 && !allFiltersAreGroupFilters) {
filterManager?.onFilterChanged({ columns, source: "api" });
} else {
this.updateDependentFilters();
}
}
updateDependentFilters() {
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) {
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(_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 = _mergeFilterParamsWithApplicationProvidedParams(
userCompFactory,
colDef,
filterParams
);
let defaultFloatingFilterType = _getDefaultFloatingFilterType(
frameworkOverrides,
colDef,
() => this.getDefaultFloatingFilter(column)
);
if (defaultFloatingFilterType == null) {
defaultFloatingFilterType = "agReadOnlyFloatingFilter";
}
const params = _addGridCommonParams(this.gos, {
column,
filterParams: finalFilterParams,
currentParentModel: () => this.getCurrentFloatingFilterParentModel(column),
parentFilterInstance,
showParentFilter
});
return _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;
}) ?? 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 };
if (this.areFilterCompsDifferent(filterWrapper.compDetails, compDetails)) {
this.destroyFilter(column, "paramsUpdated");
return;
}
const newFilterParams = column.getColDef().filterParams;
if (!filterWrapper.filterPromise) {
this.destroyFilter(column, "paramsUpdated");
return;
}
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;
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(_unwrapUserComp(filter));
});
});
}
getFilterInstanceImpl(key) {
const column = this.beans.colModel.getColDefCol(key);
if (!column) {
return AgPromise.resolve(void 0);
}
const filterPromise = this.getOrCreateFilterWrapper(column)?.filterPromise;
return filterPromise ?? 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 = _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 (!_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 _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 _exists(valueFormatted) ? valueFormatted : translate("blanks", "(Blanks)");
},
treeList: true,
treeListPathGetter: (value) => {
const date = convertToDate(value ?? void 0);
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 _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"));
this.allColumnListeners.clear();
}
};
function setModelOnFilterWrapper(filterPromise, newModel) {
if (!filterPromise) {
return AgPromise.resolve();
}
return new AgPromise((resolve) => {
filterPromise.then((filter) => {
if (typeof filter.setModel !== "function") {
_warn(65);
resolve();
}
(filter.setModel(newModel) || AgPromise.resolve()).then(() => resolve());
});
});
}
function isGroupFilter(column) {
return column.getColDef().filter === "agGroupColumnFilter";
}
function isValidDate(value) {
return value instanceof Date && !isNaN(value.getTime());
}
// packages/ag-grid-community/src/filter/filterApi.ts
function isAnyFilterPresent(beans) {
return !!beans.filterManager?.isAnyFilterPresent();
}
function onFilterChanged(beans, source = "api") {
beans.filterManager?.onFilterChanged({ source });
}
// packages/ag-grid-community/src/filter/filterManager.ts
var FilterManager = class extends 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 = _getGroupAggFiltering(this.gos);
if (isAggFiltering) {
this.onFilterChanged();
}
}
onFilterChanged(params = {}) {
const { source, additionalEventAttributes, columns = [] } = params;
this.externalFilterPresent = this.isExternalFilterPresentCallback();
(this.colFilter ? this.colFilter.updateBeforeFilterChanged(params) : AgPromise.resolve()).then(() => {
const filterChangedEvent = {
source,
type: "filterChanged",
columns
};
if (additionalEventAttributes) {
_mergeDeep(filterChangedEvent, additionalEventAttributes);
}
this.eventSvc.dispatchEvent(filterChangedEvent);
this.colFilter?.updateAfterFilterChanged();
});
}
isSuppressFlashingCellsBecauseFiltering() {
return !!this.colFilter?.isSuppressFlashingCellsBecauseFiltering();
}
isQuickFilterPresent() {
return !!this.quickFilter?.isFilterPresent();
}
updateAggFiltering() {
this.aggFiltering = !!_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;
}
if (this.isAggregateQuickFilterPresent() && !this.quickFilter.doesRowPass(rowNode)) {
return false;
}
if (this.isAggregateFilterPresent() && !this.colFilter.doAggregateFiltersPass(rowNode, params.filterInstanceToSkip)) {
return false;
}
return true;
}
doesRowPassFilter(params) {
const { rowNode } = params;
if (this.alwaysPassFilter?.(rowNode)) {
return true;
}
if (this.isNonAggregateQuickFilterPresent() && !this.quickFilter.doesRowPass(rowNode)) {
return false;
}
if (this.externalFilterPresent && !this.doesExternalFilterPass(rowNode)) {
return false;
}
if (this.isColumnFilterPresent() && !this.colFilter.doColumnFiltersPass(rowNode, params.filterInstanceToSkip)) {
return false;
}
if (this.isAdvFilterPresent() && !this.advancedFilter.doesFilterPass(rowNode)) {
return false;
}
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(void 0);
}
return this.colFilter?.getColumnFilterInstance(key) ?? Promise.resolve(void 0);
}
warnAdvFilters() {
_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);
}
};
// packages/ag-grid-community/src/filter/filterMenuFactory.ts
var FilterMenuFactory = class extends 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,
_isLegacyMenuEnabled(this.gos),
onClosedCallback
);
}
showMenuAfterButtonClick(column, eventSource, containerType, onClosedCallback) {
let multiplier = -1;
let alignSide = "left";
const isLegacyMenuEnabled = _isLegacyMenuEnabled(this.gos);
if (!isLegacyMenuEnabled && this.gos.get("enableRtl")) {
multiplier = 1;
alignSide = "right";
}
const nudgeX = isLegacyMenuEnabled ? void 0 : 4 * multiplier;
const nudgeY = isLegacyMenuEnabled ? void 0 : 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(column, "COLUMN_MENU")) : void 0;
this.activeMenu = comp;
if (!comp?.hasFilter() || !column) {
_error(57);
return;
}
const eMenu = document.createElement("div");
_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)
});
eMenu.appendChild(comp?.getGui());
let hidePopup;
const afterGuiDetached = () => comp?.afterGuiDetached();
const anchorToElement = _isColumnMenuAnchoringEnabled(this.gos) ? eventSource ?? this.beans.ctrlsSvc.getGridBodyCtrl().eGridBody : void 0;
const closedCallback = (e) => {
_setColMenuVisible(column, false, "contextMenu");
const isKeyboardEvent = e instanceof KeyboardEvent;
if (this.tabListener) {
this.tabListener = this.tabListener();
}
if (isKeyboardEvent && eventSource && _isVisible(eventSource)) {
const focusableEl = _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(() => {
positionCallback(eMenu);
comp.afterGuiAttached({ container: containerType, hidePopup });
});
_setColMenuVisible(column, true, "contextMenu");
this.dispatchVisibleChangedEvent(true, containerType, column);
}
trapFocusWithin(e, menu) {
if (e.key !== KeyCode.TAB || e.defaultPrevented || _findNextFocusableElement(this.beans, menu, false, e.shiftKey)) {
return;
}
e.preventDefault();
_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) {
return column.isFilterAllowed() && (column.getColDef().menuTabs ?? ["filterMenuTab"]).includes("filterMenuTab");
}
showMenuAfterContextMenuEvent() {
}
destroy() {
this.destroyBean(this.activeMenu);
super.destroy();
}
};
// packages/ag-grid-community/src/filter/filterValueService.ts
var FilterValueService = class extends 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(valueGetter, data, column, node, colDef) {
const { expressionSvc, valueSvc } = this.beans;
const params = _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);
}
};
// packages/ag-grid-community/src/filter/floating/provided/readOnlyFloatingFilter.ts
var ReadOnlyFloatingFilter = class extends Component {
constructor() {
super(
/* html */
`
`,
[AgInputTextFieldSelector]
);
this.eFloatingFilterText = 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) => {
if (filterInstance.getModelAsString) {
const modelAsString = filterInstance.getModelAsString(parentModel);
this.eFloatingFilterText.setValue(modelAsString);
}
});
}
refresh(params) {
this.init(params);
}
};
// packages/ag-grid-community/src/filter/provided/optionsFactory.ts
var OptionsFactory = class {
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)) {
_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 {
_warn(73);
}
} else {
_warn(74);
}
}
getCustomOption(name) {
return this.customFilterOptions[name];
}
};
// packages/ag-grid-community/src/filter/provided/simpleFilterUtils.ts
function removeItems(items, startPosition, deleteCount) {
return deleteCount == null ? items.splice(startPosition) : items.splice(startPosition, deleteCount);
}
function isBlank(cellValue) {
return cellValue == null || typeof cellValue === "string" && cellValue.trim().length === 0;
}
function getDefaultJoinOperator(defaultJoinOperator) {
return defaultJoinOperator === "AND" || defaultJoinOperator === "OR" ? defaultJoinOperator : "AND";
}
function evaluateCustomFilter(customFilterOption, values, cellValue) {
if (customFilterOption == null) {
return;
}
const { predicate } = customFilterOption;
if (predicate != null && !values.some((v) => v == null)) {
return predicate(values, cellValue);
}
return;
}
function validateAndUpdateConditions(conditions, maxNumConditions) {
let numConditions = conditions.length;
if (numConditions > maxNumConditions) {
conditions.splice(maxNumConditions);
_warn(78);
numConditions = maxNumConditions;
}
return numConditions;
}
// packages/ag-grid-community/src/filter/provided/simpleFilter.ts
var SimpleFilter = class extends 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) {
if (!a && !b) {
return true;
}
if (!a && b || a && !b) {
return false;
}
const aIsSimple = !a.operator;
const bIsSimple = !b.operator;
const oneSimpleOneCombined = !aIsSimple && bIsSimple || aIsSimple && !bIsSimple;
if (oneSimpleOneCombined) {
return false;
}
let res;
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 && _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;
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) !== void 0);
if (!allConditionsExistInNewOptionsList) {
return false;
}
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 = [];
_warn(77);
}
const numConditions = 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 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 = getDefaultJoinOperator(params.defaultJoinOperator);
this.filterPlaceholder = params.filterPlaceholder;
this.optionsFactory = new OptionsFactory();
this.optionsFactory.init(params, this.getDefaultFilterOptions());
this.createFilterListOptions();
this.createOption();
this.createMissingConditionsAndOperators();
if (this.isReadOnly()) {
this.eFilterBody.setAttribute("tabindex", "-1");
}
}
setNumConditions(params) {
let maxNumConditions = params.maxNumConditions ?? 2;
if (maxNumConditions < 1) {
_warn(79);
maxNumConditions = 1;
}
this.maxNumConditions = maxNumConditions;
let numAlwaysVisibleConditions = params.numAlwaysVisibleConditions ?? 1;
if (numAlwaysVisibleConditions < 1) {
_warn(80);
numAlwaysVisibleConditions = 1;
}
if (numAlwaysVisibleConditions > maxNumConditions) {
_warn(81);
numAlwaysVisibleConditions = maxNumConditions;
}
this.numAlwaysVisibleConditions = numAlwaysVisibleConditions;
}
createOption() {
const eType = this.createManagedBean(new 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());
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;
filterListOptions.forEach((listOption) => {
eType.addOption(listOption);
});
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() {
return "";
}
getAgComponents() {
return [];
}
getCssIdentifier() {
return "simple-filter";
}
updateUiVisibility() {
const joinOperator = this.getJoinOperator();
this.updateNumConditions();
this.updateConditionStatusesAndValues(this.lastUiCompletePosition, joinOperator);
}
updateNumConditions() {
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) {
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) {
_setDisabled(this.eJoinOperatorPanels[0], disabled);
this.eJoinOperatorsAnd[0].setDisabled(disabled);
this.eJoinOperatorsOr[0].setDisabled(disabled);
}
});
this.eConditionBodies.forEach((element, index) => {
_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 = removeItems(elements, startPosition, deleteCount);
removedElements.forEach((element) => _removeFromParent(element));
}
removeComponents(components, startPosition, deleteCount) {
const removedComponents = removeItems(components, startPosition, deleteCount);
removedComponents.forEach((comp) => {
_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 && this.isConditionBodyVisible(0)) {
elementToFocus = firstInput.getInputElement();
} else {
elementToFocus = eTypes[0]?.getFocusableElement();
}
}
(elementToFocus ?? eFilterBody).focus({ preventScroll: true });
}
}
afterGuiDetached() {
super.afterGuiDetached();
const appliedModel = this.getModel();
this.resetUiToActiveModel(appliedModel);
let lastUiCompletePosition = -1;
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) {
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)) {
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) {
element.setValue(value != null ? String(value) : null, true);
}
}
setElementDisplayed(element, displayed) {
if (element instanceof Component) {
_setDisplayed(element.getGui(), displayed);
}
}
setElementDisabled(element, disabled) {
if (element instanceof Component) {
_setDisabled(element.getGui(), disabled);
}
}
attachElementOnChange(element, listener) {
if (element instanceof 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;
}
if (position === 0) {
return false;
}
return position > lastUiCompletePosition + 1;
}
isConditionBodyVisible(position) {
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;
}
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;
}
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 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 = 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;
}
};
// packages/ag-grid-community/src/filter/provided/scalarFilter.ts
var ScalarFilter = class extends 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 isBlank(cellValue);
case "notBlank":
return !isBlank(cellValue);
default:
_warn(76, { filterModelType: type });
return true;
}
}
};
// packages/ag-grid-community/src/filter/provided/date/dateCompWrapper.ts
var DateCompWrapper = class {
constructor(context, userCompFactory, dateComponentParams, eParent, onReady) {
this.alive = true;
this.context = context;
this.eParent = eParent;
const compDetails = _getDateCompDetails(userCompFactory, dateComponentParams);
if (!compDetails) {
return;
}
compDetails.newAgStackInstance().then((dateComp) => {
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) {
_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);
}
};
// packages/ag-grid-community/src/filter/provided/date/dateFilterConstants.ts
var DEFAULT_DATE_FILTER_OPTIONS = [
"equals",
"notEqual",
"lessThan",
"greaterThan",
"inRange",
"blank",
"notBlank"
];
// packages/ag-grid-community/src/filter/provided/simpleFilterModelFormatter.ts
var SimpleFilterModelFormatter = class {
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, 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);
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);
}
};
// packages/ag-grid-community/src/filter/provided/date/dateFilterModelFormatter.ts
var DateFilterModelFormatter = class extends 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 = _parseDateTimeFromString(condition.dateFrom);
const dateTo = _parseDateTimeFromString(condition.dateTo);
const format = this.dateFilterParams.inRangeFloatingFilterDateFormat;
if (isRange) {
const formattedFrom = dateFrom !== null ? _dateToFormattedString(dateFrom, format) : "null";
const formattedTo = dateTo !== null ? _dateToFormattedString(dateTo, format) : "null";
return `${formattedFrom}-${formattedTo}`;
}
if (dateFrom != null) {
return _dateToFormattedString(dateFrom, format);
}
return `${type}`;
}
updateParams(params) {
super.updateParams(params);
this.dateFilterParams = params.dateFilterParams;
}
};
// packages/ag-grid-community/src/filter/provided/date/dateFilter.ts
var DEFAULT_MIN_YEAR = 1e3;
var DEFAULT_MAX_YEAR = Infinity;
var DateFilter = class extends 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) {
const { dateFrom, dateTo, type } = filterModel || {};
return [
dateFrom && _parseDateTimeFromString(dateFrom) || null,
dateTo && _parseDateTimeFromString(dateTo) || null
].slice(0, this.getNumberOfInputs(type));
}
comparator() {
return this.dateFilterParams.comparator ?? defaultDateComparator;
}
isValid(value) {
const isValidDate2 = this.dateFilterParams.isValidDate;
return !isValidDate2 || isValidDate2(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 {
_warn(82, { param });
}
}
return fallback;
};
this.minValidYear = yearParser("minValidYear", DEFAULT_MIN_YEAR);
this.maxValidYear = yearParser("maxValidYear", DEFAULT_MAX_YEAR);
if (this.minValidYear > this.maxValidYear) {
_warn(83);
}
this.minValidDate = params.minValidDate ? params.minValidDate instanceof Date ? params.minValidDate : _parseDateTimeFromString(params.minValidDate) : null;
this.maxValidDate = params.maxValidDate ? params.maxValidDate instanceof Date ? params.maxValidDate : _parseDateTimeFromString(params.maxValidDate) : null;
if (this.minValidDate && this.maxValidDate && this.minValidDate > this.maxValidDate) {
_warn(84);
}
this.filterModelFormatter = new DateFilterModelFormatter(
this.dateFilterParams,
this.getLocaleTextFunc.bind(this),
this.optionsFactory
);
}
createDateCompWrapper(element) {
const { userCompFactory, context, gos } = this.beans;
const dateCompWrapper = new DateCompWrapper(
context,
userCompFactory,
_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 DEFAULT_DATE_FILTER_OPTIONS;
}
createValueElement() {
const eDocument = _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 = _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);
removeItems(this.eConditionPanelsFrom, startPosition, deleteCount);
removeItems(this.eConditionPanelsTo, startPosition, deleteCount);
}
removeDateComps(components, startPosition, deleteCount) {
const removedComponents = 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 = _serialiseDate(values[0]);
}
if (values.length > 1) {
model.dateTo = _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) ?? "";
}
};
function defaultDateComparator(filterDate, cellValue) {
const cellAsDate = cellValue;
if (cellAsDate < filterDate) {
return -1;
}
if (cellAsDate > filterDate) {
return 1;
}
return 0;
}
// packages/ag-grid-community/src/filter/floating/provided/simpleFloatingFilter.ts
var SimpleFloatingFilter = class extends Component {
constructor() {
super(...arguments);
this.defaultDebounceMs = 0;
}
setLastTypeFromModel(model) {
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) {
return this.isTypeEditable(this.lastType);
}
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();
this.optionsFactory = optionsFactory;
optionsFactory.init(params.filterParams, this.getDefaultOptions());
const defaultOption = optionsFactory.defaultOption;
if (!update) {
this.lastType = defaultOption;
}
this.readOnly = !!params.filterParams.readOnly;
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")}`;
}
};
// packages/ag-grid-community/src/filter/provided/date/dateFloatingFilter.ts
var DateFloatingFilter = class extends SimpleFloatingFilter {
constructor() {
super(
/* html */
`
`,
[AgInputTextFieldSelector]
);
this.eReadOnlyText = RefPlaceholder;
this.eDateWrapper = RefPlaceholder;
}
getDefaultOptions() {
return DEFAULT_DATE_FILTER_OPTIONS;
}
init(params) {
super.init(params);
this.params = params;
this.filterParams = params.filterParams;
this.createDateComponent();
this.filterModelFormatter = new 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) {
const allowEditing = !this.readOnly && this.canWeEditAfterModelFromParentFilter(model);
this.setEditable(allowEditing);
if (allowEditing) {
const dateModel = model ? _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) {
_setDisplayed(this.eDateWrapper, editable);
_setDisplayed(this.eReadOnlyText.getGui(), !editable);
}
onParentModelChanged(model, event) {
if (event?.afterFloatingFilter || event?.afterDataChange) {
return;
}
super.setLastTypeFromModel(model);
this.updateCompOnModelChange(model);
}
onDateChanged() {
const filterValueDate = this.dateComp.getDate();
const filterValueText = _serialiseDate(filterValueDate);
this.params.parentFilterInstance((filterInstance) => {
if (filterInstance) {
const date = _parseDateTimeFromString(filterValueText);
filterInstance.onFloatingFilterChanged(this.lastType || null, date);
}
});
}
getDateComponentParams() {
const { filterParams, column } = this.params;
const debounceMs = getDebounceMs(filterParams, this.defaultDebounceMs);
return _addGridCommonParams(this.gos, {
onDateChanged: _debounce(this, this.onDateChanged.bind(this), debounceMs),
filterParams: column.getColDef().filterParams,
location: "floatingFilter"
});
}
createDateComponent() {
const {
beans: { context, userCompFactory },
eDateWrapper
} = this;
this.dateComp = new DateCompWrapper(
context,
userCompFactory,
this.getDateComponentParams(),
eDateWrapper,
(dateComp) => {
dateComp.setInputAriaLabel(this.getAriaLabel(this.params));
}
);
this.addDestroyFunc(() => this.dateComp.destroy());
}
};
// packages/ag-grid-community/src/filter/provided/date/defaultDateComponent.ts
var DefaultDateComponent = class extends Component {
constructor() {
super(
/* html */
`
`,
[AgInputTextFieldSelector]
);
this.eDateInput = 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 !== _getActiveDomElement(this.beans)) {
return;
}
if (this.eDateInput.isDisabled()) {
return;
}
if (this.isApply) {
this.applyOnFocusOut = !isChange;
if (isChange) {
this.params.onDateChanged();
}
return;
}
if (!isChange) {
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 && _isBrowserSafari();
inputElement.type = shouldUseBrowserDatePicker ? "date" : "text";
const { minValidYear, maxValidYear, minValidDate, maxValidDate, buttons } = params.filterParams || {};
if (minValidDate && minValidYear) {
_warn(85);
}
if (maxValidDate && maxValidYear) {
_warn(86);
}
if (minValidDate && maxValidDate) {
const [parsedMinValidDate, parsedMaxValidDate] = [minValidDate, maxValidDate].map(
(v) => v instanceof Date ? v : _parseDateTimeFromString(v)
);
if (parsedMinValidDate && parsedMaxValidDate && parsedMinValidDate.getTime() > parsedMaxValidDate.getTime()) {
_warn(87);
}
}
if (minValidDate) {
if (minValidDate instanceof Date) {
inputElement.min = _dateToFormattedString(minValidDate);
} else {
inputElement.min = minValidDate;
}
} else {
if (minValidYear) {
inputElement.min = `${minValidYear}-01-01`;
}
}
if (maxValidDate) {
if (maxValidDate instanceof Date) {
inputElement.max = _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 _parseDateTimeFromString(this.eDateInput.getValue());
}
setDate(date) {
this.eDateInput.setValue(_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;
}
};
// packages/ag-grid-community/src/filter/provided/number/numberFilterConstants.ts
var DEFAULT_NUMBER_FILTER_OPTIONS = [
"equals",
"notEqual",
"greaterThan",
"greaterThanOrEqual",
"lessThan",
"lessThanOrEqual",
"inRange",
"blank",
"notBlank"
];
// packages/ag-grid-community/src/filter/provided/number/numberFilterModelFormatter.ts
var NumberFilterModelFormatter = class extends 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)}`;
}
if (filter != null) {
return formatValue(filter);
}
return `${type}`;
}
};
// packages/ag-grid-community/src/filter/provided/number/numberFilterUtils.ts
function getAllowedCharPattern(filterParams) {
const { allowedCharPattern } = filterParams ?? {};
return allowedCharPattern ?? null;
}
// packages/ag-grid-community/src/filter/provided/number/numberFilter.ts
var NumberFilter = class extends 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(
this.getLocaleTextFunc.bind(this),
this.optionsFactory,
this.numberFilterParams.numberFormatter
);
}
getDefaultFilterOptions() {
return DEFAULT_NUMBER_FILTER_OPTIONS;
}
setElementValue(element, value, fromFloatingFilter) {
const { numberFormatter } = this.numberFilterParams;
const valueToSet = !fromFloatingFilter && numberFormatter ? numberFormatter(value ?? null) : value;
super.setElementValue(element, valueToSet);
}
createValueElement() {
const allowedCharPattern = getAllowedCharPattern(this.numberFilterParams);
const eCondition = document.createElement("div");
eCondition.classList.add("ag-filter-body");
_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({ allowedCharPattern }) : new 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 = _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;
}
};
// packages/ag-grid-community/src/filter/floating/provided/floatingFilterTextInputService.ts
var FloatingFilterTextInputService = class extends BeanStub {
constructor(params) {
super();
this.params = params;
this.eInput = RefPlaceholder;
this.onValueChanged = () => {
};
}
setupGui(parentElement) {
this.eInput = this.createManagedBean(new 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 !== void 0) {
eInput.setAutoComplete(autoComplete);
}
}
};
// packages/ag-grid-community/src/filter/provided/text/textFilterUtils.ts
function trimInputForFilter(value) {
const trimmedInput = value?.trim();
return trimmedInput === "" ? value : trimmedInput;
}
// packages/ag-grid-community/src/filter/floating/provided/textInputFloatingFilter.ts
var TextInputFloatingFilter = class extends SimpleFloatingFilter {
constructor() {
super(...arguments);
this.eFloatingFilterInputContainer = RefPlaceholder;
this.defaultDebounceMs = 500;
}
postConstruct() {
this.setTemplate(
/* html */
`
`
);
}
onParentModelChanged(model, event) {
if (event?.afterFloatingFilter || event?.afterDataChange) {
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 = isUseApplyButton(params.filterParams);
if (!readOnly) {
const debounceMs = getDebounceMs(params.filterParams, defaultDebounceMs);
const toDebounce = _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();
_clearElement(this.eFloatingFilterInputContainer);
this.destroyBean(inputSvc);
this.setupFloatingFilterInputService(params);
inputSvc.setValue(value, true);
}
syncUpWithParentFilter(e) {
const isEnterKey = e.key === KeyCode.ENTER;
if (this.applyActive && !isEnterKey) {
return;
}
const { inputSvc, params } = this;
let value = inputSvc.getValue();
if (params.filterParams.trimInput) {
value = trimInputForFilter(value);
inputSvc.setValue(value, true);
}
params.parentFilterInstance((filterInstance) => {
filterInstance?.onFloatingFilterChanged(this.lastType || null, value || null);
});
}
setEditable(editable) {
this.inputSvc.setEditable(editable);
}
};
// packages/ag-grid-community/src/filter/provided/number/numberFloatingFilter.ts
var FloatingFilterNumberInputService = class extends BeanStub {
constructor() {
super(...arguments);
this.onValueChanged = () => {
};
this.numberInputActive = true;
}
setupGui(parentElement) {
this.eNumberInput = this.createManagedBean(new AgInputNumberField());
this.eTextInput = this.createManagedBean(new 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 !== void 0) {
this.setAutoComplete(params.autoComplete);
}
}
setAriaLabel(ariaLabel) {
this.eNumberInput.setInputAriaLabel(ariaLabel);
this.eTextInput.setInputAriaLabel(ariaLabel);
}
};
var NumberFloatingFilter = class extends TextInputFloatingFilter {
init(params) {
super.init(params);
this.filterModelFormatter = new NumberFilterModelFormatter(
this.getLocaleTextFunc.bind(this),
this.optionsFactory,
params.filterParams?.numberFormatter
);
}
refresh(params) {
const allowedCharPattern = getAllowedCharPattern(params.filterParams);
if (allowedCharPattern !== this.allowedCharPattern) {
this.recreateFloatingFilterInputService(params);
}
super.refresh(params);
this.filterModelFormatter.updateParams({ optionsFactory: this.optionsFactory });
}
getDefaultOptions() {
return DEFAULT_NUMBER_FILTER_OPTIONS;
}
createFloatingFilterInputService(params) {
this.allowedCharPattern = getAllowedCharPattern(params.filterParams);
if (this.allowedCharPattern) {
return this.createManagedBean(
new FloatingFilterTextInputService({
config: { allowedCharPattern: this.allowedCharPattern }
})
);
}
return this.createManagedBean(new FloatingFilterNumberInputService());
}
};
// packages/ag-grid-community/src/filter/provided/text/textFilterConstants.ts
var DEFAULT_TEXT_FILTER_OPTIONS = [
"contains",
"notContains",
"equals",
"notEqual",
"startsWith",
"endsWith",
"blank",
"notBlank"
];
// packages/ag-grid-community/src/filter/provided/text/textFilterModelFormatter.ts
var TextFilterModelFormatter = class extends SimpleFilterModelFormatter {
conditionToString(condition, options) {
const { numberOfInputs } = options || {};
const { filter, filterTo, type } = condition;
const isRange = type == "inRange" || numberOfInputs === 2;
if (isRange) {
return `${filter}-${filterTo}`;
}
if (filter != null) {
return `${filter}`;
}
return `${type}`;
}
};
// packages/ag-grid-community/src/filter/provided/text/textFilter.ts
var TextFilter = class extends 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(
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 = _makeNull(element.getValue());
if (applySideEffects && this.textFilterParams.trimInput) {
value = trimInputForFilter(value) ?? null;
element.setValue(value, true);
}
result.push(value);
}
});
return result;
}
getDefaultFilterOptions() {
return DEFAULT_TEXT_FILTER_OPTIONS;
}
createValueElement() {
const eCondition = document.createElement("div");
eCondition.classList.add("ag-filter-body");
_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());
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 isBlank(cellValue);
} else if (filterModel.type === "notBlank") {
return !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) ?? "";
}
};
// packages/ag-grid-community/src/filter/provided/text/textFloatingFilter.ts
var TextFloatingFilter = class extends TextInputFloatingFilter {
init(params) {
super.init(params);
this.filterModelFormatter = new TextFilterModelFormatter(
this.getLocaleTextFunc.bind(this),
this.optionsFactory
);
}
refresh(params) {
super.refresh(params);
this.filterModelFormatter.updateParams({ optionsFactory: this.optionsFactory });
}
getDefaultOptions() {
return DEFAULT_TEXT_FILTER_OPTIONS;
}
createFloatingFilterInputService() {
return this.createManagedBean(new FloatingFilterTextInputService());
}
};
// packages/ag-grid-community/src/filter/quickFilterApi.ts
function isQuickFilterPresent(beans) {
return !!beans.quickFilter?.isFilterPresent();
}
function getQuickFilter(beans) {
return beans.quickFilter?.getText();
}
function resetQuickFilter(beans) {
beans.quickFilter?.resetCache();
}
// packages/ag-grid-community/src/filter/quickFilterService.ts
var QuickFilterService = class extends 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);
}
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 (!_exists(newFilter)) {
return null;
}
return newFilter.toUpperCase();
}
setFilter(newFilter) {
if (newFilter != null && typeof newFilter !== "string") {
_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 _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 = _addGridCommonParams(this.gos, {
value,
node,
data: node.data,
column,
colDef
});
value = colDef.getQuickFilterText(params);
}
return _exists(value) ? value.toString().toUpperCase() : null;
}
getAggText(node) {
const stringParts = [];
this.colsToUse.forEach((column) => {
const part = this.getTextForColumn(column, node);
if (_exists(part)) {
stringParts.push(part);
}
});
return stringParts.join("\n");
}
};
// packages/ag-grid-community/src/filter/filterModule.ts
var ClientSideRowModelFilterModule = {
moduleName: "ClientSideRowModelFilter",
version: VERSION,
rowModels: ["clientSide"],
beans: [FilterStage]
};
var FilterCoreModule = {
moduleName: "FilterCore",
version: VERSION,
beans: [FilterManager],
apiFunctions: {
isAnyFilterPresent,
onFilterChanged
},
css: [columnFiltersCSS],
dependsOn: [ClientSideRowModelFilterModule]
};
var FilterValueModule = {
moduleName: "FilterValue",
version: VERSION,
beans: [FilterValueService]
};
var ColumnFilterModule = {
moduleName: "ColumnFilter",
version: VERSION,
beans: [ColumnFilterService, FilterMenuFactory],
dynamicBeans: { headerFilterCellCtrl: 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,
getColumnFilterInstance,
destroyFilter,
setFilterModel,
getFilterModel,
getColumnFilterModel,
setColumnFilterModel,
showColumnFilter
},
dependsOn: [FilterCoreModule, PopupModule, FilterValueModule, SharedMenuModule]
};
var CustomFilterModule = {
moduleName: "CustomFilter",
version: VERSION,
userComponents: { agReadOnlyFloatingFilter: ReadOnlyFloatingFilter },
dependsOn: [ColumnFilterModule]
};
var TextFilterModule = {
moduleName: "TextFilter",
version: VERSION,
dependsOn: [ColumnFilterModule],
userComponents: {
agTextColumnFilter: TextFilter,
agTextColumnFloatingFilter: TextFloatingFilter
}
};
var NumberFilterModule = {
moduleName: "NumberFilter",
version: VERSION,
dependsOn: [ColumnFilterModule],
userComponents: {
agNumberColumnFilter: NumberFilter,
agNumberColumnFloatingFilter: NumberFloatingFilter
}
};
var DateFilterModule = {
moduleName: "DateFilter",
version: VERSION,
dependsOn: [ColumnFilterModule],
userComponents: {
agDateColumnFilter: DateFilter,
agDateInput: DefaultDateComponent,
agDateColumnFloatingFilter: DateFloatingFilter
}
};
var QuickFilterCoreModule = {
moduleName: "QuickFilterCore",
version: VERSION,
rowModels: ["clientSide"],
beans: [QuickFilterService],
dependsOn: [FilterCoreModule, FilterValueModule]
};
var QuickFilterModule = {
moduleName: "QuickFilter",
version: VERSION,
apiFunctions: {
isQuickFilterPresent,
getQuickFilter,
resetQuickFilter
},
dependsOn: [QuickFilterCoreModule]
};
var ExternalFilterModule = {
moduleName: "ExternalFilter",
version: VERSION,
dependsOn: [FilterCoreModule]
};
// packages/ag-grid-community/src/undoRedo/undoRedoStack.ts
var UndoRedoAction = class {
constructor(cellValueChanges) {
this.cellValueChanges = cellValueChanges;
}
};
var RangeUndoRedoAction = class extends UndoRedoAction {
constructor(cellValueChanges, initialRange, finalRange, ranges) {
super(cellValueChanges);
this.initialRange = initialRange;
this.finalRange = finalRange;
this.ranges = ranges;
}
};
var DEFAULT_STACK_SIZE = 10;
var UndoRedoStack = class {
constructor(maxStackSize) {
this.actionStack = [];
this.maxStackSize = maxStackSize ? maxStackSize : DEFAULT_STACK_SIZE;
this.actionStack = new Array(this.maxStackSize);
}
pop() {
return this.actionStack.pop();
}
push(item) {
const shouldAddActions = item.cellValueChanges && item.cellValueChanges.length > 0;
if (!shouldAddActions) {
return;
}
if (this.actionStack.length === this.maxStackSize) {
this.actionStack.shift();
}
this.actionStack.push(item);
}
clear() {
this.actionStack = [];
}
getCurrentStackSize() {
return this.actionStack.length;
}
};
// packages/ag-grid-community/src/undoRedo/undoRedoService.ts
var UndoRedoService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "undoRedo";
this.cellValueChanges = [];
this.activeCellEdit = null;
this.activeRowEdit = null;
this.isPasting = false;
this.isRangeInAction = false;
this.onCellValueChanged = (event) => {
const eventCell = { column: event.column, rowIndex: event.rowIndex, rowPinned: event.rowPinned };
const isCellEditing = this.activeCellEdit !== null && _areCellsEqual(this.activeCellEdit, eventCell);
const isRowEditing = this.activeRowEdit !== null && _isSameRow(this.activeRowEdit, eventCell);
const shouldCaptureAction = isCellEditing || isRowEditing || this.isPasting || this.isRangeInAction;
if (!shouldCaptureAction) {
return;
}
const { rowPinned, rowIndex, column, oldValue, value } = event;
const cellValueChange = {
rowPinned,
rowIndex,
columnId: column.getColId(),
newValue: value,
oldValue
};
this.cellValueChanges.push(cellValueChange);
};
this.clearStacks = () => {
this.undoStack.clear();
this.redoStack.clear();
};
}
postConstruct() {
const { gos, ctrlsSvc } = this.beans;
if (!gos.get("undoRedoCellEditing")) {
return;
}
const undoRedoLimit = gos.get("undoRedoCellEditingLimit");
if (undoRedoLimit <= 0) {
return;
}
this.undoStack = new UndoRedoStack(undoRedoLimit);
this.redoStack = new UndoRedoStack(undoRedoLimit);
this.addListeners();
const listener = this.clearStacks.bind(this);
this.addManagedEventListeners({
cellValueChanged: this.onCellValueChanged.bind(this),
// undo / redo is restricted to actual editing so we clear the stacks when other operations are
// performed that change the order of the row / cols.
modelUpdated: (e) => {
if (!e.keepUndoRedoStack) {
this.clearStacks();
}
},
columnPivotModeChanged: listener,
newColumnsLoaded: listener,
columnGroupOpened: listener,
columnRowGroupChanged: listener,
columnMoved: listener,
columnPinned: listener,
columnVisible: listener,
rowDragEnd: listener
});
ctrlsSvc.whenReady(this, (p) => {
this.gridBodyCtrl = p.gridBodyCtrl;
});
}
getCurrentUndoStackSize() {
return this.undoStack?.getCurrentStackSize() ?? 0;
}
getCurrentRedoStackSize() {
return this.redoStack?.getCurrentStackSize() ?? 0;
}
undo(source) {
const { eventSvc, undoStack, redoStack } = this;
eventSvc.dispatchEvent({
type: "undoStarted",
source
});
const operationPerformed = this.undoRedo(undoStack, redoStack, "initialRange", "oldValue", "undo");
eventSvc.dispatchEvent({
type: "undoEnded",
source,
operationPerformed
});
}
redo(source) {
const { eventSvc, undoStack, redoStack } = this;
eventSvc.dispatchEvent({
type: "redoStarted",
source
});
const operationPerformed = this.undoRedo(redoStack, undoStack, "finalRange", "newValue", "redo");
eventSvc.dispatchEvent({
type: "redoEnded",
source,
operationPerformed
});
}
undoRedo(undoRedoStack, opposingUndoRedoStack, rangeProperty, cellValueChangeProperty, source) {
if (!undoRedoStack) {
return false;
}
const undoRedoAction = undoRedoStack.pop();
if (!undoRedoAction || !undoRedoAction.cellValueChanges) {
return false;
}
this.processAction(
undoRedoAction,
(cellValueChange) => cellValueChange[cellValueChangeProperty],
source
);
if (undoRedoAction instanceof RangeUndoRedoAction) {
this.processRange(undoRedoAction.ranges || [undoRedoAction[rangeProperty]]);
} else {
this.processCell(undoRedoAction.cellValueChanges);
}
opposingUndoRedoStack.push(undoRedoAction);
return true;
}
processAction(action, valueExtractor, source) {
action.cellValueChanges.forEach((cellValueChange) => {
const { rowIndex, rowPinned, columnId } = cellValueChange;
const rowPosition = { rowIndex, rowPinned };
const currentRow = _getRowNode(this.beans, rowPosition);
if (!currentRow.displayed) {
return;
}
currentRow.setDataValue(columnId, valueExtractor(cellValueChange), source);
});
}
processRange(ranges) {
let lastFocusedCell;
const rangeSvc = this.beans.rangeSvc;
rangeSvc.removeAllCellRanges(true);
ranges.forEach((range, idx) => {
if (!range) {
return;
}
const startRow = range.startRow;
const endRow = range.endRow;
if (idx === ranges.length - 1) {
lastFocusedCell = {
rowPinned: startRow.rowPinned,
rowIndex: startRow.rowIndex,
columnId: range.startColumn.getColId()
};
this.setLastFocusedCell(lastFocusedCell);
}
const cellRangeParams = {
rowStartIndex: startRow.rowIndex,
rowStartPinned: startRow.rowPinned,
rowEndIndex: endRow.rowIndex,
rowEndPinned: endRow.rowPinned,
columnStart: range.startColumn,
columns: range.columns
};
rangeSvc.addCellRange(cellRangeParams);
});
}
processCell(cellValueChanges) {
const cellValueChange = cellValueChanges[0];
const { rowIndex, rowPinned } = cellValueChange;
const rowPosition = { rowIndex, rowPinned };
const row = _getRowNode(this.beans, rowPosition);
const lastFocusedCell = {
rowPinned: cellValueChange.rowPinned,
rowIndex: row.rowIndex,
columnId: cellValueChange.columnId
};
this.setLastFocusedCell(lastFocusedCell);
}
setLastFocusedCell(lastFocusedCell) {
const { rowIndex, columnId, rowPinned } = lastFocusedCell;
const { colModel, focusSvc, rangeSvc } = this.beans;
const column = colModel.getCol(columnId);
if (!column) {
return;
}
const { scrollFeature } = this.gridBodyCtrl;
scrollFeature.ensureIndexVisible(rowIndex);
scrollFeature.ensureColumnVisible(column);
const cellPosition = { rowIndex, column, rowPinned };
focusSvc.setFocusedCell({ ...cellPosition, forceBrowserFocus: true });
rangeSvc?.setRangeToCell(cellPosition);
}
addListeners() {
this.addManagedEventListeners({
rowEditingStarted: (e) => {
this.activeRowEdit = { rowIndex: e.rowIndex, rowPinned: e.rowPinned };
},
rowEditingStopped: () => {
const action = new UndoRedoAction(this.cellValueChanges);
this.pushActionsToUndoStack(action);
this.activeRowEdit = null;
},
cellEditingStarted: (e) => {
this.activeCellEdit = { column: e.column, rowIndex: e.rowIndex, rowPinned: e.rowPinned };
},
cellEditingStopped: (e) => {
this.activeCellEdit = null;
const shouldPushAction = e.valueChanged && !this.activeRowEdit && !this.isPasting && !this.isRangeInAction;
if (shouldPushAction) {
const action = new UndoRedoAction(this.cellValueChanges);
this.pushActionsToUndoStack(action);
}
},
pasteStart: () => {
this.isPasting = true;
},
pasteEnd: () => {
const action = new UndoRedoAction(this.cellValueChanges);
this.pushActionsToUndoStack(action);
this.isPasting = false;
},
fillStart: () => {
this.isRangeInAction = true;
},
fillEnd: (event) => {
const action = new RangeUndoRedoAction(this.cellValueChanges, event.initialRange, event.finalRange);
this.pushActionsToUndoStack(action);
this.isRangeInAction = false;
},
keyShortcutChangedCellStart: () => {
this.isRangeInAction = true;
},
keyShortcutChangedCellEnd: () => {
let action;
const { rangeSvc, gos } = this.beans;
if (rangeSvc && _isCellSelectionEnabled(gos)) {
action = new RangeUndoRedoAction(this.cellValueChanges, void 0, void 0, [
...rangeSvc.getCellRanges()
]);
} else {
action = new UndoRedoAction(this.cellValueChanges);
}
this.pushActionsToUndoStack(action);
this.isRangeInAction = false;
}
});
}
pushActionsToUndoStack(action) {
this.undoStack.push(action);
this.cellValueChanges = [];
this.redoStack.clear();
}
};
// packages/ag-grid-community/src/edit/cell-editing.css-GENERATED.ts
var cellEditingCSS = (
/*css*/
`.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)}`
);
// packages/ag-grid-community/src/edit/cellEditors/checkboxCellEditor.ts
var CheckboxCellEditor = class extends PopupComponent {
constructor() {
super(
/* html */
`
`,
[AgCheckboxSelector]
);
this.eCheckbox = RefPlaceholder;
}
init(params) {
this.params = params;
const isSelected = params.value ?? void 0;
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 = _getAriaCheckboxStateName(translate, isSelected);
const ariaLabel = translate("ariaToggleCellValue", "Press SPACE to toggle cell value");
this.eCheckbox.setInputAriaLabel(`${ariaLabel} (${stateName})`);
}
};
// packages/ag-grid-community/src/edit/cellEditors/simpleCellEditor.ts
var SimpleCellEditor = class extends PopupComponent {
constructor(cellEditorInput) {
super(
/* html */
`
${cellEditorInput.getTemplate()}
`,
cellEditorInput.getAgComponents()
);
this.cellEditorInput = cellEditorInput;
this.eInput = 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;
if (cellStartedEdit) {
this.focusAfterAttached = true;
if (eventKey === KeyCode.BACKSPACE || eventKey === KeyCode.DELETE) {
startValue = "";
} else if (eventKey && eventKey.length === 1) {
if (suppressPreventDefault) {
shouldSetStartValue = false;
} else {
startValue = eventKey;
}
} else {
startValue = this.cellEditorInput.getStartValue();
if (eventKey !== 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.PAGE_UP || key === KeyCode.PAGE_DOWN) {
event.preventDefault();
}
}
});
}
afterGuiAttached() {
const translate = this.getLocaleTextFunc();
const eInput = this.eInput;
eInput.setInputAriaLabel(translate("ariaInputEditor", "Input Editor"));
if (!this.focusAfterAttached) {
return;
}
if (!_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;
}
};
// packages/ag-grid-community/src/edit/cellEditors/dateCellEditor.ts
var DateCellEditorInput = class {
getTemplate() {
return (
/* html */
``
);
}
getAgComponents() {
return [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 (!_exists(value) && !_exists(params.value)) {
return params.value;
}
return value ?? null;
}
getStartValue() {
const { value } = this.params;
if (!(value instanceof Date)) {
return void 0;
}
return _serialiseDate(value, false);
}
};
var DateCellEditor = class extends SimpleCellEditor {
constructor() {
super(new DateCellEditorInput());
}
};
// packages/ag-grid-community/src/edit/cellEditors/dateStringCellEditor.ts
var DateStringCellEditorInput = class {
constructor(getDataTypeService) {
this.getDataTypeService = getDataTypeService;
}
getTemplate() {
return (
/* html */
``
);
}
getAgComponents() {
return [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 (!_exists(value) && !_exists(params.value)) {
return params.value;
}
return params.parseValue(value ?? "");
}
getStartValue() {
return _serialiseDate(this.parseDate(this.params.value ?? void 0) ?? null, false);
}
parseDate(value) {
const dataTypeSvc = this.getDataTypeService();
return dataTypeSvc ? dataTypeSvc.getDateParserFunction(this.params.column)(value) : _parseDateTimeFromString(value) ?? void 0;
}
formatDate(value) {
const dataTypeSvc = this.getDataTypeService();
return dataTypeSvc ? dataTypeSvc.getDateFormatterFunction(this.params.column)(value) : _serialiseDate(value ?? null, false) ?? void 0;
}
};
var DateStringCellEditor = class extends SimpleCellEditor {
constructor() {
super(new DateStringCellEditorInput(() => this.beans.dataTypeSvc));
}
};
// packages/ag-grid-community/src/edit/cellEditors/largeTextCellEditor.ts
var LargeTextCellEditor = class extends PopupComponent {
constructor() {
super(
/* html */
``,
[AgInputTextAreaSelector]
);
this.eTextArea = 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.LEFT || key === KeyCode.UP || key === KeyCode.RIGHT || key === KeyCode.DOWN || event.shiftKey && key === KeyCode.ENTER) {
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 (!_exists(value) && !_exists(params.value)) {
return params.value;
}
return params.parseValue(value);
}
};
// packages/ag-grid-community/src/edit/cellEditors/numberCellEditor.ts
var NumberCellEditorInput = class {
getTemplate() {
return (
/* html */
``
);
}
getAgComponents() {
return [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.UP || e.key === KeyCode.DOWN) {
e.preventDefault();
}
}
getValue() {
const { eInput, params } = this;
const value = eInput.getValue();
if (!_exists(value) && !_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 (_isBrowserSafari()) {
this.eInput.getInputElement().focus({ preventScroll: true });
}
}
};
var NumberCellEditor = class extends SimpleCellEditor {
constructor() {
super(new NumberCellEditorInput());
}
};
// packages/ag-grid-community/src/edit/cellEditors/selectCellEditor.ts
var SelectCellEditor = class extends PopupComponent {
constructor() {
super(
/* html */
``,
[AgSelectSelector]
);
this.eSelect = RefPlaceholder;
this.startedByEnter = false;
}
wireBeans(beans) {
this.valueSvc = beans.valueSvc;
}
init(params) {
this.focusAfterAttached = params.cellStartedEdit;
const { eSelect, valueSvc, gos } = this;
const { values, value, eventKey } = params;
if (_missing(values)) {
_warn(58);
return;
}
this.startedByEnter = eventKey != null ? eventKey === 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 !== void 0;
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);
}
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;
}
};
// packages/ag-grid-community/src/edit/cellEditors/textCellEditor.ts
var TextCellEditorInput = class {
getTemplate() {
return (
/* html */
``
);
}
getAgComponents() {
return [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 (!_exists(value) && !_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() {
const eInput = this.eInput;
const value = eInput.getValue();
const len = _exists(value) && value.length || 0;
if (len) {
eInput.getInputElement().setSelectionRange(len, len);
}
}
};
var TextCellEditor = class extends SimpleCellEditor {
constructor() {
super(new TextCellEditorInput());
}
};
// packages/ag-grid-community/src/api/scrollApi.ts
function getVerticalPixelRange(beans) {
return beans.ctrlsSvc.getScrollFeature().getVScrollPosition();
}
function getHorizontalPixelRange(beans) {
return beans.ctrlsSvc.getScrollFeature().getHScrollPosition();
}
function ensureColumnVisible(beans, key, position = "auto") {
beans.frameworkOverrides.wrapIncoming(
() => beans.ctrlsSvc.getScrollFeature().ensureColumnVisible(key, position),
"ensureVisible"
);
}
function ensureIndexVisible(beans, index, position) {
beans.frameworkOverrides.wrapIncoming(
() => beans.ctrlsSvc.getScrollFeature().ensureIndexVisible(index, position),
"ensureVisible"
);
}
function ensureNodeVisible(beans, nodeSelector, position = null) {
beans.frameworkOverrides.wrapIncoming(
() => beans.ctrlsSvc.getScrollFeature().ensureNodeVisible(nodeSelector, position),
"ensureVisible"
);
}
// packages/ag-grid-community/src/edit/editApi.ts
function undoCellEditing(beans) {
beans.undoRedo?.undo("api");
}
function redoCellEditing(beans) {
beans.undoRedo?.redo("api");
}
function getCellEditorInstances(beans, params = {}) {
const res = [];
beans.rowRenderer.getCellCtrls(params.rowNodes, params.columns).forEach((cellCtrl) => {
const cellEditor = cellCtrl.comp?.getCellEditor();
if (cellEditor) {
res.push(_unwrapUserComp(cellEditor));
}
});
return res;
}
function getEditingCells(beans) {
const res = [];
beans.rowRenderer.getAllCellCtrls().forEach((cellCtrl) => {
if (cellCtrl.editing) {
const { cellPosition } = cellCtrl;
res.push(cellPosition);
}
});
return res;
}
function stopEditing(beans, cancel = false) {
beans.editSvc?.stopAllEditing(cancel);
}
function startEditingCell(beans, params) {
const column = beans.colModel.getCol(params.colKey);
if (!column) {
_warn(12, { colKey: params.colKey });
return;
}
const cellPosition = {
rowIndex: params.rowIndex,
rowPinned: params.rowPinned || null,
column
};
const notPinned = params.rowPinned == null;
if (notPinned) {
ensureIndexVisible(beans, params.rowIndex);
}
ensureColumnVisible(beans, params.colKey);
const cell = _getCellByPosition(beans, cellPosition);
if (!cell) {
return;
}
const { focusSvc, gos, editSvc } = beans;
const isFocusWithinCell = () => {
const activeElement = _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);
}
function getCurrentUndoSize(beans) {
return beans.undoRedo?.getCurrentUndoStackSize() ?? 0;
}
function getCurrentRedoSize(beans) {
return beans.undoRedo?.getCurrentRedoStackSize() ?? 0;
}
// packages/ag-grid-community/src/edit/cellEditors/popupEditorWrapper.ts
var PopupEditorWrapper = class extends PopupComponent {
constructor(params) {
super(
/* html */
``
);
this.params = params;
}
postConstruct() {
_setDomData(this.gos, this.getGui(), "popupEditorWrapper", true);
this.addKeyDownListener();
}
addKeyDownListener() {
const eGui = this.getGui();
const params = this.params;
const listener = (event) => {
if (!_isUserSuppressingKeyboardEvent(this.gos, event, params.node, params.column, true)) {
params.onKeyDown(event);
}
};
this.addManagedElementListeners(eGui, { keydown: listener });
}
};
// packages/ag-grid-community/src/edit/editService.ts
var EditService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "editSvc";
}
startEditing(cellCtrl, key = null, cellStartedEdit = false, event = null) {
if (!cellCtrl.isCellEditable() || cellCtrl.editing) {
return true;
}
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 = _getCellEditorDetails(this.beans.userCompFactory, colDef, editorParams);
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, void 0);
cellComp.setEditDetails();
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 = _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) {
cellEditor.focusIn();
} else {
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(params);
}
stopAllEditing(cancel = false) {
this.beans.rowRenderer.getAllRowCtrls().forEach((rowCtrl) => this.stopRowEditing(rowCtrl, cancel));
}
stopRowEditing(rowCtrl, cancel = false) {
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) => {
const elementWithFocus = event.relatedTarget;
if (_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
_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(void 0, (gui) => {
gui.rowComp.addOrRemoveCssClass("ag-row-inline-editing", editing);
gui.rowComp.addOrRemoveCssClass("ag-row-not-inline-editing", !editing);
});
}
isCellEditable(column, rowNode) {
if (rowNode.group) {
if (this.gos.get("treeData")) {
if (!rowNode.data && !this.gos.get("enableGroupEdit")) {
return false;
}
} else {
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) {
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 _addGridCommonParams(gos, {
value: valueSvc.getValueForDisplay(column, rowNode),
eventKey: key,
column,
colDef: column.getColDef(),
rowIndex,
node: rowNode,
data: rowNode.data,
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.UP : KeyCode.DOWN;
this.beans.navigation?.navigateToNextCell(null, key, cellPosition, false);
}
}
};
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,
newValueExists: true
};
}
function saveNewValue(cellCtrl, oldValue, newValue, rowNode, column) {
if (newValue === oldValue) {
return false;
}
cellCtrl.suppressRefreshCell = true;
const valueChanged = rowNode.setDataValue(column, newValue, "edit");
cellCtrl.suppressRefreshCell = false;
return valueChanged;
}
// packages/ag-grid-community/src/edit/rowEditService.ts
var RowEditService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "rowEditSvc";
}
startEditing(rowCtrl, key = null, sourceRenderedCell = null, event = null) {
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(void 0, (gui) => gui.rowComp.addOrRemoveCssClass("ag-row-editing", value));
const event = value ? rowCtrl.createRowEvent("rowEditingStarted") : rowCtrl.createRowEvent("rowEditingStopped");
this.eventSvc.dispatchEvent(event);
}
};
// packages/ag-grid-community/src/edit/editModule.ts
var EditCoreModule = {
moduleName: "EditCore",
version: VERSION,
beans: [EditService, RowEditService],
apiFunctions: {
getCellEditorInstances,
getEditingCells,
stopEditing,
startEditingCell
},
dependsOn: [PopupModule],
css: [cellEditingCSS]
};
var UndoRedoEditModule = {
moduleName: "UndoRedoEdit",
version: VERSION,
beans: [UndoRedoService],
apiFunctions: {
undoCellEditing,
redoCellEditing,
getCurrentUndoSize,
getCurrentRedoSize
},
dependsOn: [EditCoreModule]
};
var TextEditorModule = {
moduleName: "TextEditor",
version: VERSION,
userComponents: { agCellEditor: TextCellEditor, agTextCellEditor: TextCellEditor },
dependsOn: [EditCoreModule]
};
var NumberEditorModule = {
moduleName: "NumberEditor",
version: VERSION,
userComponents: {
agNumberCellEditor: {
classImp: NumberCellEditor,
params: {
suppressPreventDefault: true
}
}
},
dependsOn: [EditCoreModule]
};
var DateEditorModule = {
moduleName: "DateEditor",
version: VERSION,
userComponents: {
agDateCellEditor: DateCellEditor,
agDateStringCellEditor: DateStringCellEditor
},
dependsOn: [EditCoreModule]
};
var CheckboxEditorModule = {
moduleName: "CheckboxEditor",
version: VERSION,
userComponents: {
agCheckboxCellEditor: CheckboxCellEditor
},
dependsOn: [EditCoreModule]
};
var SelectEditorModule = {
moduleName: "SelectEditor",
version: VERSION,
userComponents: { agSelectCellEditor: SelectCellEditor },
dependsOn: [EditCoreModule]
};
var LargeTextEditorModule = {
moduleName: "LargeTextEditor",
version: VERSION,
userComponents: { agLargeTextCellEditor: LargeTextCellEditor },
dependsOn: [EditCoreModule]
};
var CustomEditorModule = {
moduleName: "CustomEditor",
version: VERSION,
dependsOn: [EditCoreModule]
};
// packages/ag-grid-community/src/columns/selectionColService.ts
var SelectionColService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "selectionColSvc";
}
postConstruct() {
this.addManagedPropertyListener("rowSelection", (event) => {
this.onSelectionOptionsChanged(
event.currentValue,
event.previousValue,
_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);
_updateColsMap(cols);
}
createColumns(cols, updateOrders) {
const destroyCollection = () => {
_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 = _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 = (cols2) => {
if (!cols2) {
return null;
}
const colsFiltered = cols2.filter((col) => !isColumnSelectionCol(col));
return [...list, ...colsFiltered];
};
updateOrders(putSelectionColsFirstInList);
}
updateColumns(event) {
const source = _convertColumnEventSourceType(event.source);
const current = event.currentValue;
this.columns?.list.forEach((col) => {
const newColDef = this.createSelectionColDef(current);
col.setColDef(newColDef, null, source);
_applyColumnState(this.beans, { state: [{ colId: col.getColId(), ...newColDef }] }, source);
});
}
getColumn(key) {
return this.columns?.list.find((col) => _columnsMatch(col, key)) ?? null;
}
getColumns() {
return this.columns?.list ?? null;
}
isSelectionColumnEnabled() {
const { gos, beans } = this;
const rowSelection = gos.get("rowSelection");
if (typeof rowSelection !== "object" || !_isRowSelection(gos)) {
return false;
}
const hasAutoCols = (beans.autoColSvc?.getColumns()?.length ?? 0) > 0;
if (rowSelection.checkboxLocation === "autoGroupColumn" && hasAutoCols) {
return false;
}
const checkboxes = !!_getCheckboxes(rowSelection);
const headerCheckbox = _getHeaderCheckbox(rowSelection);
return checkboxes || headerCheckbox;
}
createSelectionColDef(def) {
const { gos } = this.beans;
const selectionColumnDef = def ?? gos.get("selectionColumnDef");
const enableRTL = gos.get("enableRtl");
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: 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(colDef, null, colId, false);
this.createBean(col);
return [col];
}
onSelectionOptionsChanged(current, prev, source) {
const prevCheckbox = prev && typeof prev !== "string" ? _getCheckboxes(prev) : void 0;
const currCheckbox = current && typeof current !== "string" ? _getCheckboxes(current) : void 0;
const checkboxHasChanged = prevCheckbox !== currCheckbox;
const prevHeaderCheckbox = prev && typeof prev !== "string" ? _getHeaderCheckbox(prev) : void 0;
const currHeaderCheckbox = current && typeof current !== "string" ? _getHeaderCheckbox(current) : void 0;
const headerCheckboxHasChanged = prevHeaderCheckbox !== currHeaderCheckbox;
const currLocation = _getCheckboxLocation(current);
const prevLocation = _getCheckboxLocation(prev);
const locationChanged = currLocation !== prevLocation;
if (checkboxHasChanged || headerCheckboxHasChanged || locationChanged) {
this.beans.colModel.refreshAll(source);
}
}
destroy() {
_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;
}
if (!visibleColumns.some(isLeafColumnSelectionCol)) {
const existingState = _getColumnState(beans).find((state) => isColumnSelectionCol(state.colId));
if (existingState) {
_applyColumnState(
beans,
{
state: [{ colId: existingState.colId, hide: !existingState.hide }]
},
source
);
}
}
if (visibleColumns.length === 1) {
const firstColumn = visibleColumns[0];
const leafSelectionCol = getLeafColumnSelectionCol(firstColumn);
if (!leafSelectionCol) {
return;
}
_applyColumnState(beans, { state: [{ colId: leafSelectionCol.getColId(), hide: true }] }, source);
}
}
};
var isLeafColumnSelectionCol = (c) => c.isColumn ? isColumnSelectionCol(c) : c.getChildren()?.some(isLeafColumnSelectionCol) ?? false;
function getLeafColumnSelectionCol(c) {
if (c.isColumn) {
return isColumnSelectionCol(c) ? c : null;
}
const children = c.getChildren() ?? [];
for (const child of children) {
const selCol = getLeafColumnSelectionCol(child);
if (selCol) {
return selCol;
}
}
return null;
}
// packages/ag-grid-community/src/selection/rowSelectionApi.ts
function setNodesSelected(beans, params) {
const allNodesValid = params.nodes.every((node) => {
if (node.rowPinned) {
_warn(59);
return false;
}
if (node.id === void 0) {
_warn(60);
return false;
}
return true;
});
if (!allNodesValid) {
return;
}
const { nodes, source, newValue } = params;
beans.selectionSvc?.setNodesSelected({ nodes, source: source ?? "api", newValue });
}
function selectAll(beans, selectAll2, source = "apiSelectAll") {
beans.selectionSvc?.selectAllRowNodes({ source, selectAll: selectAll2 });
}
function deselectAll(beans, selectAll2, source = "apiSelectAll") {
beans.selectionSvc?.deselectAllRowNodes({ source, selectAll: selectAll2 });
}
function selectAllFiltered(beans, source = "apiSelectAllFiltered") {
beans.selectionSvc?.selectAllRowNodes({ source, selectAll: "filtered" });
}
function deselectAllFiltered(beans, source = "apiSelectAllFiltered") {
beans.selectionSvc?.deselectAllRowNodes({ source, selectAll: "filtered" });
}
function selectAllOnCurrentPage(beans, source = "apiSelectAllCurrentPage") {
beans.selectionSvc?.selectAllRowNodes({ source, selectAll: "currentPage" });
}
function deselectAllOnCurrentPage(beans, source = "apiSelectAllCurrentPage") {
beans.selectionSvc?.deselectAllRowNodes({ source, selectAll: "currentPage" });
}
function getSelectedNodes(beans) {
return beans.selectionSvc?.getSelectedNodes() ?? [];
}
function getSelectedRows(beans) {
return beans.selectionSvc?.getSelectedRows() ?? [];
}
// packages/ag-grid-community/src/selection/selectionService.ts
var SelectionService = class extends BaseSelectionService {
constructor() {
super(...arguments);
this.beanName = "selectionSvc";
this.selectedNodes = /* @__PURE__ */ new Map();
/** Only used to track detail grid selection state when master/detail is enabled */
this.detailSelection = /* @__PURE__ */ new Map();
this.masterSelectsDetail = false;
}
postConstruct() {
super.postConstruct();
const { gos } = this;
this.mode = _getRowSelectionMode(gos);
this.groupSelectsDescendants = _getGroupSelectsDescendants(gos);
this.groupSelectsFiltered = _getGroupSelection(gos) === "filteredDescendants";
this.masterSelectsDetail = _getMasterSelects(gos) === "detail";
this.addManagedPropertyListeners(["groupSelectsChildren", "groupSelectsFiltered", "rowSelection"], () => {
const groupSelectsDescendants = _getGroupSelectsDescendants(gos);
const selectionMode = _getRowSelectionMode(gos);
const groupSelectsFiltered = _getGroupSelection(gos) === "filteredDescendants";
this.masterSelectsDetail = _getMasterSelects(gos) === "detail";
if (groupSelectsDescendants !== this.groupSelectsDescendants || groupSelectsFiltered !== this.groupSelectsFiltered || selectionMode !== this.mode) {
this.deselectAllRowNodes({ source: "api" });
this.groupSelectsDescendants = groupSelectsDescendants;
this.groupSelectsFiltered = groupSelectsFiltered;
this.mode = selectionMode;
}
});
this.addManagedEventListeners({ rowSelected: this.onRowSelected.bind(this) });
}
destroy() {
super.destroy();
this.resetNodes();
}
handleSelectionEvent(event, rowNode, source) {
if (this.isRowSelectionBlocked(rowNode))
return 0;
const selection = this.inferNodeSelections(rowNode, event.shiftKey, event.metaKey || event.ctrlKey, source);
if (selection == null) {
return 0;
}
this.selectionCtx.selectAll = false;
if ("select" in selection) {
if (selection.reset) {
this.resetNodes();
} else {
this.selectRange(selection.deselect, false, source);
}
return this.selectRange(selection.select, true, source);
} else {
return this.setNodesSelected({
nodes: [selection.node],
newValue: selection.newValue,
clearSelection: selection.clearSelection,
event,
source
});
}
}
setNodesSelected({
newValue,
clearSelection,
suppressFinishActions,
nodes,
event,
source
}) {
if (!_isRowSelection(this.gos) && newValue) {
_warn(132);
return 0;
}
if (nodes.length === 0)
return 0;
if (nodes.length > 1 && !this.isMultiSelect()) {
_warn(130);
return 0;
}
let updatedCount = 0;
for (let i = 0; i < nodes.length; i++) {
const rowNode = nodes[i];
const node = _normaliseFooterRef(rowNode);
const skipThisNode = this.groupSelectsFiltered && node.group;
if (node.rowPinned) {
_warn(59);
continue;
}
if (node.id === void 0) {
_warn(60);
continue;
}
if (!skipThisNode) {
const thisNodeWasSelected = this.selectRowNode(node, newValue, event, source);
if (thisNodeWasSelected) {
this.detailSelection.delete(node.id);
updatedCount++;
}
}
if (this.groupSelectsDescendants && node.childrenAfterGroup?.length) {
updatedCount += this.selectChildren(node, newValue, source);
}
}
if (!suppressFinishActions) {
const clearOtherNodes = newValue && (clearSelection || !this.isMultiSelect());
if (clearOtherNodes) {
updatedCount += this.clearOtherNodes(_normaliseFooterRef(nodes[0]), source);
}
if (updatedCount > 0) {
this.updateGroupsFromChildrenSelections(source);
this.dispatchSelectionChanged(source);
}
}
return updatedCount;
}
// not to be mixed up with 'cell range selection' where you drag the mouse, this is row range selection, by
// holding down 'shift'.
selectRange(nodesToSelect, value, source) {
let updatedCount = 0;
nodesToSelect.forEach((rowNode) => {
if (rowNode.group && this.groupSelectsDescendants) {
return;
}
const nodeWasSelected = this.selectRowNode(rowNode, value, void 0, source);
if (nodeWasSelected) {
updatedCount++;
}
});
if (updatedCount > 0) {
this.updateGroupsFromChildrenSelections(source);
this.dispatchSelectionChanged(source);
}
return updatedCount;
}
selectChildren(node, newValue, source) {
const children = this.groupSelectsFiltered ? node.childrenAfterAggFilter : node.childrenAfterGroup;
if (!children) {
return 0;
}
return this.setNodesSelected({
newValue,
clearSelection: false,
suppressFinishActions: true,
source,
nodes: children
});
}
getSelectedNodes() {
return Array.from(this.selectedNodes.values());
}
getSelectedRows() {
const selectedRows = [];
this.selectedNodes.forEach((rowNode) => selectedRows.push(rowNode.data));
return selectedRows;
}
getSelectionCount() {
return this.selectedNodes.size;
}
/**
* This method is used by the CSRM to remove groups which are being disposed of,
* events do not need fired in this case
*/
filterFromSelection(predicate) {
const newSelectedNodes = /* @__PURE__ */ new Map();
this.selectedNodes.forEach((rowNode, key) => {
if (predicate(rowNode)) {
newSelectedNodes.set(key, rowNode);
}
});
this.selectedNodes = newSelectedNodes;
}
updateGroupsFromChildrenSelections(source, changedPath) {
if (!this.groupSelectsDescendants) {
return false;
}
const { gos, rowModel } = this.beans;
if (!_isClientSideRowModel(gos, rowModel)) {
return false;
}
const rootNode = rowModel.rootNode;
if (!rootNode) {
return false;
}
if (!changedPath) {
changedPath = new ChangedPath(true, rootNode);
changedPath.active = false;
}
let selectionChanged = false;
changedPath.forEachChangedNodeDepthFirst((rowNode) => {
if (rowNode !== rootNode) {
const selected = this.calculateSelectedFromChildren(rowNode);
selectionChanged = this.selectRowNode(rowNode, selected === null ? false : selected, void 0, source) || selectionChanged;
}
});
return selectionChanged;
}
clearOtherNodes(rowNodeToKeepSelected, source) {
const groupsToRefresh = /* @__PURE__ */ new Map();
let updatedCount = 0;
this.selectedNodes.forEach((otherRowNode) => {
if (otherRowNode && otherRowNode.id !== rowNodeToKeepSelected.id) {
const rowNode = this.selectedNodes.get(otherRowNode.id);
updatedCount += this.setNodesSelected({
nodes: [rowNode],
newValue: false,
clearSelection: false,
suppressFinishActions: true,
source
});
if (this.groupSelectsDescendants && otherRowNode.parent) {
groupsToRefresh.set(otherRowNode.parent.id, otherRowNode.parent);
}
}
});
groupsToRefresh.forEach((group) => {
const selected = this.calculateSelectedFromChildren(group);
this.selectRowNode(group, selected === null ? false : selected, void 0, source);
});
return updatedCount;
}
onRowSelected(event) {
const rowNode = event.node;
if (this.groupSelectsDescendants && rowNode.group) {
return;
}
if (rowNode.isSelected()) {
this.selectedNodes.set(rowNode.id, rowNode);
} else {
this.selectedNodes.delete(rowNode.id);
}
}
syncInRowNode(rowNode, oldNode) {
this.syncInOldRowNode(rowNode, oldNode);
this.syncInNewRowNode(rowNode);
}
createDaemonNode(rowNode) {
if (!rowNode.id) {
return void 0;
}
const oldNode = new RowNode(this.beans);
oldNode.id = rowNode.id;
oldNode.data = rowNode.data;
oldNode.__daemon = true;
oldNode.__selected = rowNode.__selected;
oldNode.level = rowNode.level;
return oldNode;
}
// if the id has changed for the node, then this means the rowNode
// is getting used for a different data item, which breaks
// our selectedNodes, as the node now is mapped by the old id
// which is inconsistent. so to keep the old node as selected,
// we swap in the clone (with the old id and old data). this means
// the oldNode is effectively a daemon we keep a reference to,
// so if client calls api.getSelectedNodes(), it gets the daemon
// in the result. when the client un-selects, the reference to the
// daemon is removed. the daemon, because it's an oldNode, is not
// used by the grid for rendering, it's a copy of what the node used
// to be like before the id was changed.
syncInOldRowNode(rowNode, oldNode) {
if (oldNode && rowNode.id !== oldNode.id) {
const oldNodeSelected = this.selectedNodes.get(oldNode.id) == rowNode;
if (oldNodeSelected) {
this.selectedNodes.set(oldNode.id, oldNode);
}
}
}
syncInNewRowNode(rowNode) {
if (this.selectedNodes.has(rowNode.id)) {
rowNode.__selected = true;
this.selectedNodes.set(rowNode.id, rowNode);
} else {
rowNode.__selected = false;
}
}
reset(source) {
const selectionCount = this.getSelectionCount();
this.resetNodes();
if (selectionCount) {
this.dispatchSelectionChanged(source);
}
}
resetNodes() {
this.selectedNodes.forEach((node) => {
this.selectRowNode(node, false);
});
this.selectedNodes.clear();
}
// returns a list of all nodes at 'best cost' - a feature to be used
// with groups / trees. if a group has all it's children selected,
// then the group appears in the result, but not the children.
// Designed for use with 'children' as the group selection type,
// where groups don't actually appear in the selection normally.
getBestCostNodeSelection() {
const { gos, rowModel } = this.beans;
if (!_isClientSideRowModel(gos, rowModel)) {
return;
}
const topLevelNodes = rowModel.getTopLevelNodes();
if (topLevelNodes === null) {
return;
}
const result = [];
function traverse(nodes) {
for (let i = 0, l = nodes.length; i < l; i++) {
const node = nodes[i];
if (node.isSelected()) {
result.push(node);
} else {
if (node.group && node.childrenAfterGroup) {
traverse(node.childrenAfterGroup);
}
}
}
}
traverse(topLevelNodes);
return result;
}
isEmpty() {
return this.getSelectionCount() === 0;
}
deselectAllRowNodes({ source, selectAll: selectAll2 }) {
const rowModelClientSide = _isClientSideRowModel(this.gos);
let updatedNodes = false;
const callback = (rowNode) => {
const updated = this.selectRowNode(_normaliseFooterRef(rowNode), false, void 0, source);
updatedNodes || (updatedNodes = updated);
};
if (selectAll2 === "currentPage" || selectAll2 === "filtered") {
if (!rowModelClientSide) {
_error(102);
return;
}
this.getNodesToSelect(selectAll2).forEach(callback);
} else {
this.selectedNodes.forEach(callback);
this.reset(source);
}
this.selectionCtx.selectAll = false;
if (rowModelClientSide && this.groupSelectsDescendants) {
const updated = this.updateGroupsFromChildrenSelections(source);
updatedNodes || (updatedNodes = updated);
}
if (updatedNodes) {
this.dispatchSelectionChanged(source);
}
}
getSelectedCounts(selectAll2) {
let selectedCount = 0;
let notSelectedCount = 0;
this.getNodesToSelect(selectAll2).forEach((node) => {
if (this.groupSelectsDescendants && node.group) {
return;
}
if (node.isSelected()) {
selectedCount++;
} else if (node.selectable) {
notSelectedCount++;
}
});
return { selectedCount, notSelectedCount };
}
getSelectAllState(selectAll2) {
const { selectedCount, notSelectedCount } = this.getSelectedCounts(selectAll2);
return _calculateSelectAllState(selectedCount, notSelectedCount) ?? null;
}
hasNodesToSelect(selectAll2) {
return this.getNodesToSelect(selectAll2).filter((node) => node.selectable).length > 0;
}
/**
* @param selectAll See `MultiRowSelectionOptions.selectAll`
* @returns all nodes including unselectable nodes which are the target of this selection attempt
*/
getNodesToSelect(selectAll2) {
if (!this.canSelectAll()) {
return [];
}
const nodes = [];
if (selectAll2 === "currentPage") {
this.forEachNodeOnPage((node) => {
if (!node.group) {
nodes.push(node);
return;
}
if (!node.expanded && !node.footer) {
const recursivelyAddChildren = (child) => {
nodes.push(child);
if (child.childrenAfterFilter?.length) {
child.childrenAfterFilter.forEach(recursivelyAddChildren);
}
};
recursivelyAddChildren(node);
return;
}
if (!this.groupSelectsDescendants) {
nodes.push(node);
}
});
return nodes;
}
const clientSideRowModel = this.beans.rowModel;
if (selectAll2 === "filtered") {
clientSideRowModel.forEachNodeAfterFilter((node) => {
nodes.push(node);
});
return nodes;
}
clientSideRowModel.forEachNode((node) => {
nodes.push(node);
});
return nodes;
}
forEachNodeOnPage(callback) {
const { pageBounds, rowModel } = this.beans;
const firstRow = pageBounds.getFirstRow();
const lastRow = pageBounds.getLastRow();
for (let i = firstRow; i <= lastRow; i++) {
const node = rowModel.getRow(i);
if (node) {
callback(node);
}
}
}
selectAllRowNodes(params) {
const { gos, selectionCtx } = this;
if (!_isRowSelection(gos)) {
_warn(132);
return;
}
if (_isUsingNewRowSelectionAPI(gos) && !_isMultiRowSelection(gos)) {
_warn(130);
return;
}
if (!this.canSelectAll()) {
return;
}
const { source, selectAll: selectAll2 } = params;
let updatedNodes = false;
this.getNodesToSelect(selectAll2).forEach((rowNode) => {
const updated = this.selectRowNode(_normaliseFooterRef(rowNode), true, void 0, source);
updatedNodes || (updatedNodes = updated);
});
selectionCtx.selectAll = true;
if (_isClientSideRowModel(gos) && this.groupSelectsDescendants) {
const updated = this.updateGroupsFromChildrenSelections(source);
updatedNodes || (updatedNodes = updated);
}
if (updatedNodes) {
this.dispatchSelectionChanged(source);
}
}
getSelectionState() {
const selectedIds = [];
this.selectedNodes.forEach((node) => {
if (node?.id) {
selectedIds.push(node.id);
}
});
return selectedIds.length ? selectedIds : null;
}
setSelectionState(state, source) {
if (!Array.isArray(state)) {
_error(103);
return;
}
const rowIds = new Set(state);
const nodes = [];
this.beans.rowModel.forEachNode((node) => {
if (rowIds.has(node.id)) {
nodes.push(node);
}
});
this.setNodesSelected({
newValue: true,
nodes,
source
});
}
canSelectAll() {
const { gos, rowModel } = this.beans;
if (!_isClientSideRowModel(gos)) {
_error(100, { rowModelType: rowModel.getType() });
return false;
}
return true;
}
/**
* Updates the selectable state for a node by invoking isRowSelectable callback.
* If the node is not selectable, it will be deselected.
*
* Callers:
* - property isRowSelectable changed
* - after grouping / treeData via `updateSelectableAfterGrouping`
*/
updateSelectable(changedPath) {
const { gos, rowModel } = this.beans;
if (!_isRowSelection(gos)) {
return;
}
const source = "selectableChanged";
const skipLeafNodes = changedPath !== void 0;
const isCSRMGroupSelectsDescendants = _isClientSideRowModel(gos) && this.groupSelectsDescendants;
const nodesToDeselect = [];
const nodeCallback = (node) => {
if (skipLeafNodes && !node.group) {
return;
}
if (isCSRMGroupSelectsDescendants && node.group) {
const hasSelectableChild = node.childrenAfterGroup?.some((rowNode) => rowNode.selectable) ?? false;
this.setRowSelectable(node, hasSelectableChild, true);
return;
}
const rowSelectable = this.updateRowSelectable(node, true);
if (!rowSelectable && node.isSelected()) {
nodesToDeselect.push(node);
}
};
if (isCSRMGroupSelectsDescendants) {
if (changedPath === void 0) {
const rootNode = rowModel.rootNode;
changedPath = rootNode ? new ChangedPath(false, rootNode) : void 0;
}
changedPath?.forEachChangedNodeDepthFirst(nodeCallback, !skipLeafNodes, !skipLeafNodes);
} else {
rowModel.forEachNode(nodeCallback);
}
if (nodesToDeselect.length) {
this.setNodesSelected({
nodes: nodesToDeselect,
newValue: false,
source
});
}
if (!skipLeafNodes && isCSRMGroupSelectsDescendants) {
this.updateGroupsFromChildrenSelections?.(source);
}
}
// only called by CSRM
updateSelectableAfterGrouping(changedPath) {
this.updateSelectable(changedPath);
if (this.groupSelectsDescendants) {
const selectionChanged = this.updateGroupsFromChildrenSelections?.("rowGroupChanged", changedPath);
if (selectionChanged) {
this.dispatchSelectionChanged("rowGroupChanged");
}
}
}
refreshMasterNodeState(node, e) {
if (!this.masterSelectsDetail)
return;
const detailApi = node.detailNode?.detailGridInfo?.api;
if (!detailApi)
return;
const isSelectAll = _isAllSelected(detailApi);
const current = node.isSelected();
if (current !== isSelectAll) {
const selectionChanged = this.selectRowNode(node, isSelectAll, e, "masterDetail");
if (selectionChanged) {
this.dispatchSelectionChanged("masterDetail");
}
}
if (!isSelectAll) {
const detailSelected = this.detailSelection.get(node.id) ?? /* @__PURE__ */ new Set();
for (const n of detailApi.getSelectedNodes()) {
detailSelected.add(n.id);
}
this.detailSelection.set(node.id, detailSelected);
}
}
setDetailSelectionState(masterNode, detailGridOptions, detailApi) {
if (!this.masterSelectsDetail)
return;
if (!_isMultiRowSelection(detailGridOptions)) {
_warn(269);
return;
}
switch (masterNode.isSelected()) {
case true: {
detailApi.selectAll();
break;
}
case false: {
detailApi.deselectAll();
break;
}
case void 0: {
const selectedIds = this.detailSelection.get(masterNode.id);
if (selectedIds) {
const nodes = [];
for (const id of selectedIds) {
const n = detailApi.getRowNode(id);
if (n) {
nodes.push(n);
}
}
detailApi.setNodesSelected({ nodes, newValue: true, source: "masterDetail" });
}
break;
}
default:
break;
}
}
};
function _normaliseFooterRef(node) {
return node.footer ? node.sibling : node;
}
function _isAllSelected(api) {
let selectedCount = 0;
let notSelectedCount = 0;
api.forEachNode((node) => {
if (node.isSelected()) {
selectedCount++;
} else if (node.selectable) {
notSelectedCount++;
}
});
return _calculateSelectAllState(selectedCount, notSelectedCount);
}
function _calculateSelectAllState(selected, notSelected) {
if (selected === 0 && notSelected === 0) {
return false;
}
if (selected > 0 && notSelected > 0) {
return;
}
return selected > 0;
}
// packages/ag-grid-community/src/selection/rowSelectionModule.ts
var SharedRowSelectionModule = {
moduleName: "SharedRowSelection",
version: VERSION,
beans: [SelectionColService],
apiFunctions: {
setNodesSelected,
selectAll,
deselectAll,
selectAllFiltered,
deselectAllFiltered,
selectAllOnCurrentPage,
deselectAllOnCurrentPage,
getSelectedNodes,
getSelectedRows
}
};
var RowSelectionModule = {
moduleName: "RowSelection",
version: VERSION,
rowModels: ["clientSide", "infinite", "viewport"],
beans: [SelectionService],
dependsOn: [SharedRowSelectionModule]
};
// packages/ag-grid-community/src/api/csrmSsrmSharedApi.ts
function expandAll(beans) {
beans.expansionSvc?.expandAll(true);
}
function collapseAll(beans) {
beans.expansionSvc?.expandAll(false);
}
function onRowHeightChanged(beans) {
const clientSideRowModel = _getClientSideRowModel(beans);
const serverSideRowModel = _getServerSideRowModel(beans);
if (clientSideRowModel) {
clientSideRowModel.onRowHeightChanged();
} else if (serverSideRowModel) {
serverSideRowModel.onRowHeightChanged();
}
}
// packages/ag-grid-community/src/api/ssrmInfiniteSharedApi.ts
function setRowCount(beans, rowCount, maxRowFound) {
const serverSideRowModel = _getServerSideRowModel(beans);
if (serverSideRowModel) {
if (beans.rowGroupColsSvc?.columns.length === 0) {
if (rowCount < 0) {
_error(238);
return;
}
serverSideRowModel.setRowCount(rowCount, maxRowFound);
return;
}
_error(28);
return;
}
const infiniteRowModel = _getInfiniteRowModel(beans);
if (infiniteRowModel) {
infiniteRowModel.setRowCount(rowCount, maxRowFound);
return;
}
}
function getCacheBlockState(beans) {
if (_isServerSideRowModel(beans.gos)) {
const ssrm = beans.rowModel;
return ssrm.getBlockStates();
}
return beans.rowNodeBlockLoader?.getBlockState() ?? {};
}
function isLastRowIndexKnown(beans) {
return beans.rowModel.isLastRowIndexKnown();
}
// packages/ag-grid-community/src/api/sharedApiModule.ts
var CsrmSsrmSharedApiModule = {
moduleName: "CsrmSsrmSharedApi",
version: VERSION,
apiFunctions: {
expandAll,
collapseAll,
onRowHeightChanged
}
};
var SsrmInfiniteSharedApiModule = {
moduleName: "SsrmInfiniteSharedApi",
version: VERSION,
apiFunctions: {
setRowCount,
getCacheBlockState,
isLastRowIndexKnown
}
};
// packages/ag-grid-community/src/alignedGrids/alignedGridsService.ts
var AlignedGridsService = class extends 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) {
_error(18);
if (!isCallbackConfig) {
_error(20);
}
return;
}
if (this.isGridApi(alignedGrid)) {
return alignedGrid;
}
const refOrComp = alignedGrid;
if ("current" in refOrComp) {
return refOrComp.current?.api;
}
if (!refOrComp.api) {
_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 (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":
_warn(21);
break;
}
});
}
processGroupOpenedEvent(groupOpenedEvent) {
const { colGroupSvc } = this.beans;
if (!colGroupSvc) {
return;
}
groupOpenedEvent.columnGroups.forEach((masterGroup) => {
let otherColumnGroup = null;
if (masterGroup) {
otherColumnGroup = colGroupSvc.getProvidedColGroup(masterGroup.getGroupId());
}
if (masterGroup && !otherColumnGroup) {
return;
}
colGroupSvc.setColumnGroupOpened(otherColumnGroup, masterGroup.isExpanded(), "alignedGridChanged");
});
}
processColumnEvent(colEvent) {
const masterColumn = colEvent.column;
let otherColumn = null;
const beans = this.beans;
const { colResize, ctrlsSvc, colModel } = beans;
if (masterColumn) {
otherColumn = colModel.getColDefCol(masterColumn.getColId());
}
if (masterColumn && !otherColumn) {
return;
}
const masterColumns = this.getMasterColumns(colEvent);
switch (colEvent.type) {
case "columnMoved":
{
const srcColState = colEvent.api.getColumnState();
const destColState = srcColState.map((s) => ({ colId: s.colId }));
_applyColumnState(beans, { state: destColState, applyOrder: true }, "alignedGridChanged");
}
break;
case "columnVisible":
{
const srcColState = colEvent.api.getColumnState();
const destColState = srcColState.map((s) => ({ colId: s.colId, hide: s.hide }));
_applyColumnState(beans, { state: destColState }, "alignedGridChanged");
}
break;
case "columnPinned":
{
const srcColState = colEvent.api.getColumnState();
const destColState = srcColState.map((s) => ({ colId: s.colId, pinned: s.pinned }));
_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() };
});
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);
});
}
};
// packages/ag-grid-community/src/alignedGrids/alignedGridsModule.ts
var AlignedGridsModule = {
moduleName: "AlignedGrids",
version: VERSION,
beans: [AlignedGridsService]
};
// packages/ag-grid-community/src/clientSideRowModel/clientSideNodeManager.ts
var ClientSideNodeManager = class extends AbstractClientSideNodeManager {
constructor() {
super(...arguments);
this.beanName = "csrmNodeSvc";
}
};
// packages/ag-grid-community/src/clientSideRowModel/changedRowNodes.ts
var ChangedRowNodes = class {
constructor() {
this.removals = /* @__PURE__ */ new Set();
this.updates = /* @__PURE__ */ new Set();
this.adds = /* @__PURE__ */ 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);
}
};
// packages/ag-grid-community/src/clientSideRowModel/sortStage.ts
function updateChildIndexes(rowNode) {
if (_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);
}
var SortStage = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "sortStage";
this.refreshProps = /* @__PURE__ */ new Set(["postSortRows", "groupDisplayType", "accentedSort"]);
this.step = "sort";
}
execute(params) {
const beans = this.beans;
const sortOptions = beans.sortSvc.getSortOptions();
const sortActive = _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 = _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) => {
groupHideOpenParentsSvc?.pullDownGroupDataForHideOpenParents(rowNode.childrenAfterAggFilter, true);
const skipSortingPivotLeafs = isPivotMode && rowNode.leafGroup;
const skipSortingGroups = groupMaintainOrder && groupColumnsPresent && !rowNode.leafGroup && !sortContainsGroupColumns;
let newChildrenAfterSort;
if (skipSortingGroups) {
const nextGroup = rowGroupColsSvc?.columns?.[rowNode.level + 1];
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) {
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);
}
};
function doDeltaSort(rowNodeSorter, rowNode, changedRowNodes, changedPath, sortOptions) {
const unsortedRows = rowNode.childrenAfterAggFilter;
const oldSortedRows = rowNode.childrenAfterSort;
if (!oldSortedRows) {
return rowNodeSorter.doFullSort(unsortedRows, sortOptions);
}
const untouchedRows = /* @__PURE__ */ 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((rowNode2, currentPos) => ({ currentPos, rowNode: rowNode2 }));
touchedRows.sort((a, b) => rowNodeSorter.compareRowNodes(sortOptions, a, b));
return mergeSortedArrays(rowNodeSorter, sortOptions, touchedRows, sortedUntouchedRows);
}
function mergeSortedArrays(rowNodeSorter, sortOptions, arr1, arr2) {
const res = [];
let i = 0;
let j = 0;
const arr1Length = arr1.length;
const arr2Length = arr2.length;
while (i < arr1Length && j < arr2Length) {
const a = arr1[i];
const b = arr2[j];
const compareResult = rowNodeSorter.compareRowNodes(sortOptions, a, b);
let chosen;
if (compareResult < 0) {
chosen = a;
++i;
} else {
chosen = b;
++j;
}
res.push(chosen.rowNode);
}
while (i < arr1Length) {
res.push(arr1[i++].rowNode);
}
while (j < arr2Length) {
res.push(arr2[j++].rowNode);
}
return res;
}
// packages/ag-grid-community/src/clientSideRowModel/clientSideRowModel.ts
var ClientSideRowModel = class extends 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 = [];
/** 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 = _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",
// after cols change, row grouping (the first stage) could of changed
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)
});
this.addPropertyListeners();
this.rootNode = new 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() {
const allProps = [
"treeData",
"treeDataChildrenField",
...this.orderedStages.flatMap(({ refreshProps }) => [...refreshProps])
];
this.addManagedPropertyListeners(allProps, (params) => {
const properties = params.changeSet?.properties;
if (properties) {
this.onPropChange(properties);
}
});
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;
do {
atLeastOneChange = false;
const rowAtStartPixel = this.getRowIndexAtPixel(startPixel);
const rowAtEndPixel = this.getRowIndexAtPixel(endPixel);
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 = _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;
}
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;
_warn(1);
}
}
if (reset) {
if (!rowDataChanged) {
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();
nodeManager.setImmutableRowData(params, newRowData);
} else {
params.rowDataUpdated = true;
params.newData = true;
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;
const displayedRowsMapped = /* @__PURE__ */ new Set();
const allowEstimate = _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 = _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) {
const isRootNode = rowNode.level == -1;
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;
}
rowNodes.forEach((rowNode) => {
_removeFromArray(allLeafChildren, rowNode);
});
rowNodes.forEach((rowNode, idx) => {
allLeafChildren.splice(Math.max(indexAtPixelNow + increment, 0) + idx, 0, rowNode);
});
rowNodes.forEach((rowNode, index) => {
rowNode.sourceRowIndex = index;
});
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;
}
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;
if (showingRootNode) {
return topLevelIndex;
}
const { childrenAfterSort } = rootNode;
const getDefaultIndex = (adjustedIndex) => {
let rowNode = childrenAfterSort[adjustedIndex];
if (this.gos.get("groupHideOpenParents")) {
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 = _isAnimateRows(this.gos);
this.refreshModel({ step: "map", keepRenderedRows: true, animate });
}
onFilterChanged(event) {
if (event.afterDataChange) {
return;
}
const animate = _isAnimateRows(this.gos);
const primaryOrQuickFilterChanged = event.columns.length === 0 || event.columns.some((col) => col.isPrimary());
const step = primaryOrQuickFilterChanged ? "filter" : "filter_aggregates";
this.refreshModel({ step, keepRenderedRows: true, animate });
}
onSortChanged() {
const animate = _isAnimateRows(this.gos);
this.refreshModel({
step: "sort",
keepRenderedRows: true,
animate
});
}
getType() {
return "clientSide";
}
onValueChanged() {
this.refreshModel({ step: this.colModel.isPivotActive() ? "pivot" : "aggregate" });
}
createChangePath(enabled) {
const changedPath = new ChangedPath(false, this.rootNode);
if (!enabled) {
changedPath.active = false;
}
return changedPath;
}
isSuppressModelUpdateAfterUpdateTransaction(params) {
if (!this.gos.get("suppressModelUpdateAfterUpdateTransaction")) {
return false;
}
const { changedRowNodes, newData, rowDataUpdated } = params;
if (!changedRowNodes || newData || !rowDataUpdated) {
return false;
}
if (changedRowNodes.removals.size || changedRowNodes.adds.size) {
return false;
}
return true;
}
refreshModel(params) {
if (!this.rootNode) {
return;
}
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;
}
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
);
}
case "filter":
this.doFilter(changedPath);
case "pivot":
this.doPivot(changedPath);
case "aggregate":
this.doAggregate(changedPath);
case "filter_aggregates":
this.doFilterAggregates(changedPath);
case "sort":
this.doSort(params.changedRowNodes, changedPath);
case "map":
this.doRowsToDisplay();
}
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 = _getGroupSelectsDescendants(this.gos);
this.forEachNodeAfterFilterAndSort((rowNode) => {
if (finished) {
return;
}
if (started) {
if (rowNode === lastInRange || rowNode === firstInRange) {
finished = true;
if (rowNode.group && groupsSelectChildren) {
result.push(...rowNode.allLeafChildren);
return;
}
}
}
if (!started) {
if (rowNode !== lastInRange && rowNode !== firstInRange) {
return;
}
started = true;
}
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;
}
let bottomPointer = 0;
let topPointer = rowsToDisplay.length - 1;
if (pixelToMatch <= 0) {
return 0;
}
const lastNode = _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;
}
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";
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 = (node2) => node2.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 node2 of children) {
index = this.depthFirstSearchRowNodes(callback, includeFooterNodes, getChildren, node2, 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 });
}
}
doFilterAggregates(changedPath) {
const rootNode = this.rootNode;
if (this.filterAggStage) {
this.filterAggStage.execute({ rowNode: rootNode, changedPath });
} else {
rootNode.childrenAfterAggFilter = rootNode.childrenAfterFilter;
}
}
doSort(changedRowNodes, changedPath) {
const { groupHideOpenParentsSvc } = this.beans;
if (this.sortStage) {
this.sortStage.execute({
rowNode: this.rootNode,
changedRowNodes,
changedPath
});
} else {
changedPath.forEachChangedNodeDepthFirst((rowNode) => {
groupHideOpenParentsSvc?.pullDownGroupDataForHideOpenParents(rowNode.childrenAfterAggFilter, true);
rowNode.childrenAfterSort = rowNode.childrenAfterAggFilter.slice(0);
updateRowNodeAfterSort(rowNode);
});
}
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) {
this.rowCountReady = true;
this.eventSvc.dispatchEventOnce({ type: "rowCountReady" });
}
}
doFilter(changedPath) {
if (this.filterStage) {
this.filterStage.execute({ rowNode: this.rootNode, changedPath });
} else {
changedPath.forEachChangedNodeDepthFirst((rowNode) => {
rowNode.childrenAfterFilter = rowNode.childrenAfterGroup;
updateRowNodeAfterFilter(rowNode);
}, true);
}
}
doPivot(changedPath) {
this.pivotStage?.execute({ rowNode: this.rootNode, changedPath });
}
getRowNode(id) {
const idIsGroup = typeof id == "string" && id.indexOf(ROW_ID_PREFIX_ROW_GROUP) == 0;
if (idIsGroup) {
let res = void 0;
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()) {
this.executeBatchUpdateRowData();
}
}, waitMillis);
}
this.rowDataTransactionBatch.push({ rowDataTransaction, callback });
}
flushAsyncTransactions() {
if (this.applyAsyncTransactionsTimeout != null) {
clearTimeout(this.applyAsyncTransactionsTimeout);
this.executeBatchUpdateRowData();
}
}
executeBatchUpdateRowData() {
this.valueCache?.onDataChanged();
const callbackFuncsBound = [];
const rowNodeTrans = [];
const changedRowNodes = new 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);
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 = void 0;
}
/**
* Used to apply transaction changes.
* Called by gridApi & rowDragFeature
*/
updateRowData(rowDataTran) {
this.valueCache?.onDataChanged();
this.rowNodesCountReady = true;
const changedRowNodes = new 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);
}
if (atLeastOne) {
this.onRowHeightChanged();
}
}
resetRowHeightsForAllRowNodes() {
let atLeastOne = false;
this.forEachNode((rowNode) => {
rowNode.setRowHeight(rowNode.rowHeight, true);
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) {
this.setInitialData();
}
}
isRowDataLoaded() {
return this.rowCountReady;
}
destroy() {
super.destroy();
this.clearHighlightedRow();
this.started = false;
this.rootNode = null;
this.nodeManager = null;
this.rowDataTransactionBatch = null;
this.lastHighlightedRow = null;
this.orderedStages = _EmptyArray;
this.rowsToDisplay = _EmptyArray;
}
/**
* @deprecated v33.1
*/
onRowHeightChangedDebounced() {
this.onRowHeightChanged_debounced();
}
};
// packages/ag-grid-community/src/clientSideRowModel/clientSideRowModelApi.ts
function onGroupExpandedOrCollapsed(beans) {
beans.expansionSvc?.onGroupExpandedOrCollapsed();
}
function refreshClientSideRowModel(beans, step) {
const clientSideRowModel = _getClientSideRowModel(beans);
if (clientSideRowModel) {
if (!step || step === "everything") {
step = "group";
}
clientSideRowModel.refreshModel({
step,
keepRenderedRows: true,
animate: !beans.gos.get("suppressAnimationFrame")
});
}
}
function isRowDataEmpty(beans) {
return _getClientSideRowModel(beans)?.isEmpty() ?? true;
}
function forEachLeafNode(beans, callback) {
_getClientSideRowModel(beans)?.forEachLeafNode(callback);
}
function forEachNodeAfterFilter(beans, callback) {
_getClientSideRowModel(beans)?.forEachNodeAfterFilter(callback);
}
function forEachNodeAfterFilterAndSort(beans, callback) {
_getClientSideRowModel(beans)?.forEachNodeAfterFilterAndSort(callback);
}
function resetRowHeights(beans) {
if (beans.rowAutoHeight?.active) {
_warn(3);
return;
}
_getClientSideRowModel(beans)?.resetRowHeights();
}
function applyTransaction(beans, rowDataTransaction) {
return beans.frameworkOverrides.wrapIncoming(
() => _getClientSideRowModel(beans)?.updateRowData(rowDataTransaction)
);
}
function applyTransactionAsync(beans, rowDataTransaction, callback) {
beans.frameworkOverrides.wrapIncoming(
() => _getClientSideRowModel(beans)?.batchUpdateRowData(rowDataTransaction, callback)
);
}
function flushAsyncTransactions(beans) {
beans.frameworkOverrides.wrapIncoming(() => _getClientSideRowModel(beans)?.flushAsyncTransactions());
}
function getBestCostNodeSelection(beans) {
return beans.selectionSvc?.getBestCostNodeSelection();
}
// packages/ag-grid-community/src/clientSideRowModel/clientSideRowModelModule.ts
var ClientSideRowModelModule = {
moduleName: "ClientSideRowModel",
version: VERSION,
rowModels: ["clientSide"],
beans: [ClientSideNodeManager, ClientSideRowModel, SortStage],
dependsOn: [SortModule]
};
var ClientSideRowModelApiModule = {
moduleName: "ClientSideRowModelApi",
version: VERSION,
apiFunctions: {
onGroupExpandedOrCollapsed,
refreshClientSideRowModel,
isRowDataEmpty,
forEachLeafNode,
forEachNodeAfterFilter,
forEachNodeAfterFilterAndSort,
resetRowHeights,
applyTransaction,
applyTransactionAsync,
flushAsyncTransactions,
getBestCostNodeSelection
},
dependsOn: [CsrmSsrmSharedApiModule]
};
// packages/ag-grid-community/src/export/gridSerializer.ts
var GridSerializer = class extends 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,
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);
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 && _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;
}
const nodeIsRootNode = node.level === -1;
if (nodeIsRootNode && !isLeafNode && !isFooter) {
return;
}
const shouldRowBeSkipped = rowSkipper(_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(_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();
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, void 0);
});
}
return gridSerializingSession;
};
}
processPinnedTopRows(params, columnsToExport) {
return (gridSerializingSession) => {
const processRow = this.processRow.bind(this, gridSerializingSession, params, columnsToExport);
if (params.rowPositions) {
params.rowPositions.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) => {
const rowModel = this.rowModel;
const usingCsrm = _isClientSideRowModel(this.gos, rowModel);
const usingSsrm = _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.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 {
rowModel.forEachNode(processRow);
}
return gridSerializingSession;
}
if (params.onlySelectedAllPages || onlySelectedNonStandardModel) {
const selectedNodes = this.beans.selectionSvc?.getSelectedNodes() ?? [];
this.replicateSortedOrder(selectedNodes);
selectedNodes.forEach(processRow);
} else {
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) {
return rowA.rowIndex - rowB.rowIndex;
}
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
}
);
}
return compareNodes(rowA.parent, rowB.parent);
}
if (rowA.level > rowB.level) {
return compareNodes(rowA.parent, rowB);
}
return compareNodes(rowA, rowB.parent);
};
rows.sort(compareNodes);
}
processPinnedBottomRows(params, columnsToExport) {
return (gridSerializingSession) => {
const processRow = this.processRow.bind(this, gridSerializingSession, params, columnsToExport);
if (params.rowPositions) {
params.rowPositions.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 (isColumnSelectionCol(col)) {
return false;
}
return !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 ? !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 && isColumnGroup2(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(
_addGridCommonParams(this.gos, {
columnGroup
})
);
} else {
name = this.beans.colNames.getDisplayNameForColumnGroup(columnGroup, "header");
}
const collapsibleGroupRanges = columnGroup.getLeafColumns().reduce((collapsibleGroups, currentColumn, currentIdx, arr) => {
let lastGroup = _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
);
});
}
};
// packages/ag-grid-community/src/export/exportModule.ts
var SharedExportModule = {
moduleName: "SharedExport",
version: VERSION,
beans: [GridSerializer]
};
// packages/ag-grid-community/src/csvExport/csvSerializingSession.ts
var LINE_SEPARATOR = "\r\n";
var CsvSerializingSession = class extends 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();
}
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 === void 0) {
return '""';
}
let stringValue;
if (typeof value === "string") {
stringValue = value;
} else if (typeof value.toString === "function") {
stringValue = value.toString();
} else {
_warn(53);
stringValue = "";
}
const valueEscaped = stringValue.replace(/"/g, '""');
return '"' + valueEscaped + '"';
}
parse() {
return this.result;
}
beginNewLine() {
if (!this.isFirstLine) {
this.result += LINE_SEPARATOR;
}
this.isFirstLine = false;
}
};
// packages/ag-grid-community/src/csvExport/csvCreator.ts
var CsvCreator = class extends 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 baseParams4 = this.gos.get("defaultCsvExportParams");
return Object.assign({}, baseParams4, params);
}
export(userParams) {
if (this.isExportSuppressed()) {
_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(_addGridCommonParams(this.gos, {})) : mergedParams.fileName;
_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({
colModel,
colNames,
valueSvc,
gos,
processCellCallback: processCellCallback || void 0,
processHeaderCallback: processHeaderCallback || void 0,
processGroupHeaderCallback: processGroupHeaderCallback || void 0,
processRowGroupCallback: processRowGroupCallback || void 0,
suppressQuotes: suppressQuotes || false,
columnSeparator: columnSeparator || ",",
rowGroupColsSvc
});
}
isExportSuppressed() {
return this.gos.get("suppressCsvExport");
}
};
// packages/ag-grid-community/src/csvExport/csvExportApi.ts
function getDataAsCsv(beans, params) {
return beans.csvCreator?.getDataAsCsv(params);
}
function exportDataAsCsv(beans, params) {
beans.csvCreator?.exportDataAsCsv(params);
}
// packages/ag-grid-community/src/csvExport/csvExportModule.ts
var CsvExportModule = {
moduleName: "CsvExport",
version: VERSION,
beans: [CsvCreator],
apiFunctions: {
getDataAsCsv,
exportDataAsCsv
},
dependsOn: [SharedExportModule]
};
// packages/ag-grid-community/src/infiniteRowModel/infiniteBlock.ts
var InfiniteBlock = class extends BeanStub {
constructor(id, parentCache, params) {
super();
this.id = id;
this.parentCache = parentCache;
this.params = params;
this.state = "needsLoading";
this.version = 0;
this.startRow = id * params.blockSize;
this.endRow = this.startRow + params.blockSize;
}
load() {
this.state = "loading";
this.loadFromDatasource();
}
setStateWaitingToLoad() {
this.version++;
this.state = "needsLoading";
}
pageLoadFailed(version) {
const requestMostRecentAndLive = this.isRequestMostRecentAndLive(version);
if (requestMostRecentAndLive) {
this.state = "failed";
}
this.dispatchLocalEvent({ type: "loadComplete" });
}
pageLoaded(version, rows, lastRow) {
this.successCommon(version, { rowData: rows, rowCount: lastRow });
}
isRequestMostRecentAndLive(version) {
const thisIsMostRecentRequest = version === this.version;
const weAreNotDestroyed = this.isAlive();
return thisIsMostRecentRequest && weAreNotDestroyed;
}
successCommon(version, params) {
this.dispatchLocalEvent({ type: "loadComplete" });
const requestMostRecentAndLive = this.isRequestMostRecentAndLive(version);
if (requestMostRecentAndLive) {
this.state = "loaded";
this.processServerResult(params);
}
}
postConstruct() {
this.rowNodes = [];
const {
params: { blockSize, rowHeight },
startRow,
beans,
rowNodes
} = this;
for (let i = 0; i < blockSize; i++) {
const rowIndex = startRow + i;
const rowNode = new RowNode(beans);
rowNode.setRowHeight(rowHeight);
rowNode.uiLevel = 0;
rowNode.setRowIndex(rowIndex);
rowNode.setRowTop(rowHeight * rowIndex);
rowNodes.push(rowNode);
}
}
getBlockStateJson() {
const { id, startRow, endRow, state: pageStatus } = this;
return {
id: "" + id,
state: {
blockNumber: id,
startRow,
endRow,
pageStatus
}
};
}
setDataAndId(rowNode, data, index) {
if (_exists(data)) {
rowNode.setDataAndId(data, index.toString());
} else {
rowNode.setDataAndId(void 0, void 0);
}
}
loadFromDatasource() {
const params = this.createLoadParams();
if (_missing(this.params.datasource.getRows)) {
_warn(90);
return;
}
window.setTimeout(() => {
this.params.datasource.getRows(params);
}, 0);
}
createLoadParams() {
const {
startRow,
endRow,
version,
params: { sortModel, filterModel },
gos
} = this;
const params = {
startRow,
endRow,
successCallback: this.pageLoaded.bind(this, version),
failCallback: this.pageLoadFailed.bind(this, version),
sortModel,
filterModel,
context: _addGridCommonParams(gos, {}).context
};
return params;
}
forEachNode(callback, sequence, rowCount) {
this.rowNodes.forEach((rowNode, index) => {
const rowIndex = this.startRow + index;
if (rowIndex < rowCount) {
callback(rowNode, sequence.value++);
}
});
}
getRow(rowIndex, dontTouchLastAccessed = false) {
if (!dontTouchLastAccessed) {
this.lastAccessed = this.params.lastAccessedSequence.value++;
}
const localIndex = rowIndex - this.startRow;
return this.rowNodes[localIndex];
}
processServerResult(params) {
const { rowNodes, beans } = this;
rowNodes.forEach((rowNode, index) => {
const data = params.rowData ? params.rowData[index] : void 0;
if (!rowNode.id && rowNode.alreadyRendered && data) {
rowNodes[index] = new RowNode(beans);
rowNodes[index].setRowIndex(rowNode.rowIndex);
rowNodes[index].setRowTop(rowNode.rowTop);
rowNodes[index].setRowHeight(rowNode.rowHeight);
rowNode.clearRowTopAndRowIndex();
}
this.setDataAndId(rowNodes[index], data, this.startRow + index);
});
const finalRowCount = params.rowCount != null && params.rowCount >= 0 ? params.rowCount : void 0;
this.parentCache.pageLoaded(this, finalRowCount);
}
destroy() {
this.rowNodes.forEach((rowNode) => {
rowNode.clearRowTopAndRowIndex();
});
super.destroy();
}
};
// packages/ag-grid-community/src/infiniteRowModel/infiniteCache.ts
var MAX_EMPTY_BLOCKS_TO_KEEP = 2;
var InfiniteCache = class extends BeanStub {
constructor(params) {
super();
this.params = params;
this.lastRowIndexKnown = false;
this.blocks = {};
this.blockCount = 0;
this.rowCount = params.initialRowCount;
}
// the rowRenderer will not pass dontCreatePage, meaning when rendering the grid,
// it will want new pages in the cache as it asks for rows. only when we are inserting /
// removing rows via the api is dontCreatePage set, where we move rows between the pages.
getRow(rowIndex, dontCreatePage = false) {
const blockId = Math.floor(rowIndex / this.params.blockSize);
let block = this.blocks[blockId];
if (!block) {
if (dontCreatePage) {
return void 0;
}
block = this.createBlock(blockId);
}
return block.getRow(rowIndex);
}
createBlock(blockNumber) {
const params = this.params;
const newBlock = this.createBean(new InfiniteBlock(blockNumber, this, params));
this.blocks[newBlock.id] = newBlock;
this.blockCount++;
this.purgeBlocksIfNeeded(newBlock);
params.rowNodeBlockLoader.addBlock(newBlock);
return newBlock;
}
// we have this on infinite row model only, not server side row model,
// because for server side, it would leave the children in inconsistent
// state - eg if a node had children, but after the refresh it had data
// for a different row, then the children would be with the wrong row node.
refreshCache() {
const nothingToRefresh = this.blockCount == 0;
if (nothingToRefresh) {
this.purgeCache();
return;
}
this.getBlocksInOrder().forEach((block) => block.setStateWaitingToLoad());
this.params.rowNodeBlockLoader.checkBlockToLoad();
}
destroy() {
this.getBlocksInOrder().forEach((block) => this.destroyBlock(block));
super.destroy();
}
getRowCount() {
return this.rowCount;
}
isLastRowIndexKnown() {
return this.lastRowIndexKnown;
}
// block calls this, when page loaded
pageLoaded(block, lastRow) {
if (!this.isAlive()) {
return;
}
_logIfDebug(this.gos, `InfiniteCache - onPageLoaded: page = ${block.id}, lastRow = ${lastRow}`);
this.checkRowCount(block, lastRow);
this.onCacheUpdated();
}
purgeBlocksIfNeeded(blockToExclude) {
const blocksForPurging = this.getBlocksInOrder().filter((b) => b != blockToExclude);
const lastAccessedComparator = (a, b) => b.lastAccessed - a.lastAccessed;
blocksForPurging.sort(lastAccessedComparator);
const maxBlocksProvided = this.params.maxBlocksInCache > 0;
const blocksToKeep = maxBlocksProvided ? this.params.maxBlocksInCache - 1 : null;
const emptyBlocksToKeep = MAX_EMPTY_BLOCKS_TO_KEEP - 1;
blocksForPurging.forEach((block, index) => {
const purgeBecauseBlockEmpty = block.state === "needsLoading" && index >= emptyBlocksToKeep;
const purgeBecauseCacheFull = maxBlocksProvided ? index >= blocksToKeep : false;
if (purgeBecauseBlockEmpty || purgeBecauseCacheFull) {
if (this.isBlockCurrentlyDisplayed(block)) {
return;
}
if (this.isBlockFocused(block)) {
return;
}
this.removeBlockFromCache(block);
}
});
}
isBlockFocused(block) {
const focusedCell = this.beans.focusSvc.getFocusCellToUseAfterRefresh();
if (!focusedCell) {
return false;
}
if (focusedCell.rowPinned != null) {
return false;
}
const { startRow, endRow } = block;
const hasFocus = focusedCell.rowIndex >= startRow && focusedCell.rowIndex < endRow;
return hasFocus;
}
isBlockCurrentlyDisplayed(block) {
const { startRow, endRow } = block;
return this.beans.rowRenderer.isRangeInRenderedViewport(startRow, endRow - 1);
}
removeBlockFromCache(blockToRemove) {
if (!blockToRemove) {
return;
}
this.destroyBlock(blockToRemove);
}
checkRowCount(block, lastRow) {
if (typeof lastRow === "number" && lastRow >= 0) {
this.rowCount = lastRow;
this.lastRowIndexKnown = true;
} else if (!this.lastRowIndexKnown) {
const { blockSize, overflowSize } = this.params;
const lastRowIndex = (block.id + 1) * blockSize;
const lastRowIndexPlusOverflow = lastRowIndex + overflowSize;
if (this.rowCount < lastRowIndexPlusOverflow) {
this.rowCount = lastRowIndexPlusOverflow;
}
}
}
setRowCount(rowCount, lastRowIndexKnown) {
this.rowCount = rowCount;
if (_exists(lastRowIndexKnown)) {
this.lastRowIndexKnown = lastRowIndexKnown;
}
if (!this.lastRowIndexKnown) {
if (this.rowCount % this.params.blockSize === 0) {
this.rowCount++;
}
}
this.onCacheUpdated();
}
forEachNodeDeep(callback) {
const sequence = { value: 0 };
this.getBlocksInOrder().forEach((block) => block.forEachNode(callback, sequence, this.rowCount));
}
getBlocksInOrder() {
const blockComparator = (a, b) => a.id - b.id;
const blocks = Object.values(this.blocks).sort(blockComparator);
return blocks;
}
destroyBlock(block) {
delete this.blocks[block.id];
this.destroyBean(block);
this.blockCount--;
this.params.rowNodeBlockLoader.removeBlock(block);
}
// gets called 1) row count changed 2) cache purged 3) items inserted
onCacheUpdated() {
if (this.isAlive()) {
this.destroyAllBlocksPastVirtualRowCount();
this.eventSvc.dispatchEvent({
type: "storeUpdated"
});
}
}
destroyAllBlocksPastVirtualRowCount() {
const blocksToDestroy = [];
this.getBlocksInOrder().forEach((block) => {
const startRow = block.id * this.params.blockSize;
if (startRow >= this.rowCount) {
blocksToDestroy.push(block);
}
});
if (blocksToDestroy.length > 0) {
blocksToDestroy.forEach((block) => this.destroyBlock(block));
}
}
purgeCache() {
this.getBlocksInOrder().forEach((block) => this.removeBlockFromCache(block));
this.lastRowIndexKnown = false;
if (this.rowCount === 0) {
this.rowCount = this.params.initialRowCount;
}
this.onCacheUpdated();
}
getRowNodesInRange(firstInRange, lastInRange) {
const result = [];
let lastBlockId = -1;
let inActiveRange = false;
const numberSequence = { value: 0 };
let foundGapInSelection = false;
this.getBlocksInOrder().forEach((block) => {
if (foundGapInSelection) {
return;
}
if (inActiveRange && lastBlockId + 1 !== block.id) {
foundGapInSelection = true;
return;
}
lastBlockId = block.id;
block.forEachNode(
(rowNode) => {
const hitFirstOrLast = rowNode === firstInRange || rowNode === lastInRange;
if (inActiveRange || hitFirstOrLast) {
result.push(rowNode);
}
if (hitFirstOrLast) {
inActiveRange = !inActiveRange;
}
},
numberSequence,
this.rowCount
);
});
const invalidRange = foundGapInSelection || inActiveRange;
return invalidRange ? [] : result;
}
};
// packages/ag-grid-community/src/infiniteRowModel/infiniteRowModel.ts
var InfiniteRowModel = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "rowModel";
}
getRowBounds(index) {
return {
rowHeight: this.rowHeight,
rowTop: this.rowHeight * index
};
}
// we don't implement as lazy row heights is not supported in this row model
ensureRowHeightsValid() {
return false;
}
postConstruct() {
if (this.gos.get("rowModelType") !== "infinite") {
return;
}
this.rowHeight = _getRowHeightAsNumber(this.beans);
this.addEventListeners();
this.addDestroyFunc(() => this.destroyCache());
}
start() {
this.setDatasource(this.gos.get("datasource"));
}
destroy() {
this.destroyDatasource();
super.destroy();
}
destroyDatasource() {
if (this.datasource) {
this.destroyBean(this.datasource);
this.beans.rowRenderer.datasourceChanged();
this.datasource = null;
}
}
addEventListeners() {
this.addManagedEventListeners({
filterChanged: this.reset.bind(this),
sortChanged: this.reset.bind(this),
newColumnsLoaded: this.onColumnEverything.bind(this),
storeUpdated: this.dispatchModelUpdatedEvent.bind(this)
});
this.addManagedPropertyListener("datasource", () => this.setDatasource(this.gos.get("datasource")));
this.addManagedPropertyListener("cacheBlockSize", () => this.resetCache());
this.addManagedPropertyListener("rowHeight", () => {
this.rowHeight = _getRowHeightAsNumber(this.beans);
this.cacheParams.rowHeight = this.rowHeight;
this.updateRowHeights();
});
}
onColumnEverything() {
let resetRequired;
if (this.cacheParams) {
resetRequired = !_jsonEquals(this.cacheParams.sortModel, this.beans.sortSvc?.getSortModel() ?? []);
} else {
resetRequired = true;
}
if (resetRequired) {
this.reset();
}
}
getType() {
return "infinite";
}
setDatasource(datasource) {
this.destroyDatasource();
this.datasource = datasource;
if (datasource) {
this.reset();
}
}
isEmpty() {
return !this.infiniteCache;
}
isRowsToRender() {
return !!this.infiniteCache;
}
getNodesInRangeForSelection(firstInRange, lastInRange) {
return this.infiniteCache?.getRowNodesInRange(firstInRange, lastInRange) ?? [];
}
reset() {
if (!this.datasource) {
return;
}
const getRowIdFunc = _getRowIdCallback(this.gos);
const userGeneratingIds = getRowIdFunc != null;
if (!userGeneratingIds) {
this.beans.selectionSvc?.reset("rowDataChanged");
}
this.resetCache();
}
dispatchModelUpdatedEvent() {
this.eventSvc.dispatchEvent({
type: "modelUpdated",
// not sure if these should all be false - noticed if after implementing,
// maybe they should be true?
newPage: false,
newPageSize: false,
newData: false,
keepRenderedRows: true,
animate: false
});
}
resetCache() {
this.destroyCache();
const beans = this.beans;
const { filterManager, sortSvc, rowNodeBlockLoader, eventSvc, gos } = beans;
this.cacheParams = {
// the user provided datasource
datasource: this.datasource,
// sort and filter model
filterModel: filterManager?.getFilterModel() ?? {},
sortModel: sortSvc?.getSortModel() ?? [],
rowNodeBlockLoader,
// properties - this way we take a snapshot of them, so if user changes any, they will be
// used next time we create a new cache, which is generally after a filter or sort change,
// or a new datasource is set
initialRowCount: gos.get("infiniteInitialRowCount"),
maxBlocksInCache: gos.get("maxBlocksInCache"),
rowHeight: _getRowHeightAsNumber(beans),
// if user doesn't provide overflow, we use default overflow of 1, so user can scroll past
// the current page and request first row of next page
overflowSize: gos.get("cacheOverflowSize"),
// page size needs to be 1 or greater. having it at 1 would be silly, as you would be hitting the
// server for one page at a time. so the default if not specified is 100.
blockSize: gos.get("cacheBlockSize"),
// the cache could create this, however it is also used by the pages, so handy to create it
// here as the settings are also passed to the pages
lastAccessedSequence: { value: 0 }
};
this.infiniteCache = this.createBean(new InfiniteCache(this.cacheParams));
eventSvc.dispatchEventOnce({
type: "rowCountReady"
});
this.dispatchModelUpdatedEvent();
}
updateRowHeights() {
this.forEachNode((node) => {
node.setRowHeight(this.rowHeight);
node.setRowTop(this.rowHeight * node.rowIndex);
});
this.dispatchModelUpdatedEvent();
}
destroyCache() {
this.infiniteCache = this.destroyBean(this.infiniteCache);
}
getRow(rowIndex) {
const infiniteCache = this.infiniteCache;
if (!infiniteCache) {
return void 0;
}
if (rowIndex >= infiniteCache.getRowCount()) {
return void 0;
}
return infiniteCache.getRow(rowIndex);
}
getRowNode(id) {
let result;
this.forEachNode((rowNode) => {
if (rowNode.id === id) {
result = rowNode;
}
});
return result;
}
forEachNode(callback) {
this.infiniteCache?.forEachNodeDeep(callback);
}
getTopLevelRowCount() {
return this.getRowCount();
}
getTopLevelRowDisplayedIndex(topLevelIndex) {
return topLevelIndex;
}
getRowIndexAtPixel(pixel) {
if (this.rowHeight !== 0) {
const rowIndexForPixel = Math.floor(pixel / this.rowHeight);
const lastRowIndex = this.getRowCount() - 1;
if (rowIndexForPixel > lastRowIndex) {
return lastRowIndex;
}
return rowIndexForPixel;
}
return 0;
}
getRowCount() {
return this.infiniteCache ? this.infiniteCache.getRowCount() : 0;
}
isRowPresent(rowNode) {
return !!this.getRowNode(rowNode.id);
}
refreshCache() {
this.infiniteCache?.refreshCache();
}
purgeCache() {
this.infiniteCache?.purgeCache();
}
// for iRowModel
isLastRowIndexKnown() {
return this.infiniteCache?.isLastRowIndexKnown() ?? false;
}
setRowCount(rowCount, lastRowIndexKnown) {
this.infiniteCache?.setRowCount(rowCount, lastRowIndexKnown);
}
};
// packages/ag-grid-community/src/infiniteRowModel/infiniteRowModelApi.ts
function refreshInfiniteCache(beans) {
_getInfiniteRowModel(beans)?.refreshCache();
}
function purgeInfiniteCache(beans) {
_getInfiniteRowModel(beans)?.purgeCache();
}
function getInfiniteRowCount(beans) {
return _getInfiniteRowModel(beans)?.getRowCount();
}
// packages/ag-grid-community/src/infiniteRowModel/rowNodeBlockLoader.ts
var RowNodeBlockLoader = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "rowNodeBlockLoader";
this.activeBlockLoadsCount = 0;
this.blocks = [];
this.active = true;
}
postConstruct() {
this.maxConcurrentRequests = _getMaxConcurrentDatasourceRequests(this.gos);
const blockLoadDebounceMillis = this.gos.get("blockLoadDebounceMillis");
if (blockLoadDebounceMillis && blockLoadDebounceMillis > 0) {
this.checkBlockToLoadDebounce = _debounce(
this,
this.performCheckBlocksToLoad.bind(this),
blockLoadDebounceMillis
);
}
}
addBlock(block) {
this.blocks.push(block);
block.addEventListener("loadComplete", this.loadComplete.bind(this));
this.checkBlockToLoad();
}
removeBlock(block) {
_removeFromArray(this.blocks, block);
}
destroy() {
super.destroy();
this.active = false;
}
loadComplete() {
this.activeBlockLoadsCount--;
this.checkBlockToLoad();
}
checkBlockToLoad() {
if (this.checkBlockToLoadDebounce) {
this.checkBlockToLoadDebounce();
} else {
this.performCheckBlocksToLoad();
}
}
performCheckBlocksToLoad() {
if (!this.active) {
return;
}
this.printCacheStatus();
if (this.maxConcurrentRequests != null && this.activeBlockLoadsCount >= this.maxConcurrentRequests) {
_logIfDebug(this.gos, `RowNodeBlockLoader - checkBlockToLoad: max loads exceeded`);
return;
}
const loadAvailability = this.maxConcurrentRequests != null ? this.maxConcurrentRequests - this.activeBlockLoadsCount : 1;
const blocksToLoad = this.blocks.filter((block) => block.state === "needsLoading").slice(0, loadAvailability);
this.activeBlockLoadsCount += blocksToLoad.length;
blocksToLoad.forEach((block) => block.load());
this.printCacheStatus();
}
getBlockState() {
const result = {};
this.blocks.forEach((block) => {
const { id, state } = block.getBlockStateJson();
result[id] = state;
});
return result;
}
printCacheStatus() {
_logIfDebug(
this.gos,
`RowNodeBlockLoader - printCacheStatus: activePageLoadsCount = ${this.activeBlockLoadsCount}, blocks = ${JSON.stringify(this.getBlockState())}`
);
}
};
// packages/ag-grid-community/src/infiniteRowModel/infiniteRowModelModule.ts
var InfiniteRowModelCoreModule = {
moduleName: "InfiniteRowModelCore",
version: VERSION,
rowModels: ["infinite"],
beans: [InfiniteRowModel, RowNodeBlockLoader]
};
var InfiniteRowModelModule = {
moduleName: "InfiniteRowModel",
version: VERSION,
apiFunctions: {
refreshInfiniteCache,
purgeInfiniteCache,
getInfiniteRowCount
},
dependsOn: [InfiniteRowModelCoreModule, SsrmInfiniteSharedApiModule]
};
// packages/ag-grid-community/src/rendering/cellRenderers/animateShowChangeCellRenderer.ts
var ARROW_UP = "\u2191";
var ARROW_DOWN = "\u2193";
var AnimateShowChangeCellRenderer = class extends Component {
constructor() {
super();
this.refreshCount = 0;
const template = document.createElement("span");
const delta = document.createElement("span");
delta.setAttribute("class", "ag-value-change-delta");
const value = document.createElement("span");
value.setAttribute("class", "ag-value-change-value");
template.appendChild(delta);
template.appendChild(value);
this.setTemplateFromElement(template);
}
init(params) {
this.eValue = this.queryForHtmlElement(".ag-value-change-value");
this.eDelta = this.queryForHtmlElement(".ag-value-change-delta");
this.refresh(params, true);
}
showDelta(params, delta) {
const absDelta = Math.abs(delta);
const valueFormatted = params.formatValue(absDelta);
const valueToUse = _exists(valueFormatted) ? valueFormatted : absDelta;
const deltaUp = delta >= 0;
const eDelta = this.eDelta;
if (deltaUp) {
eDelta.textContent = ARROW_UP + valueToUse;
} else {
eDelta.textContent = ARROW_DOWN + valueToUse;
}
eDelta.classList.toggle("ag-value-change-delta-up", deltaUp);
eDelta.classList.toggle("ag-value-change-delta-down", !deltaUp);
}
setTimerToRemoveDelta() {
this.refreshCount++;
const refreshCountCopy = this.refreshCount;
this.beans.frameworkOverrides.wrapIncoming(() => {
window.setTimeout(() => {
if (refreshCountCopy === this.refreshCount) {
this.hideDeltaValue();
}
}, 2e3);
});
}
hideDeltaValue() {
this.eValue.classList.remove("ag-value-change-value-highlight");
_clearElement(this.eDelta);
}
refresh(params, isInitialRender = false) {
const { value, valueFormatted } = params;
const { eValue, lastValue, beans } = this;
if (value === lastValue) {
return false;
}
if (_exists(valueFormatted)) {
eValue.textContent = valueFormatted;
} else if (_exists(value)) {
eValue.textContent = value;
} else {
_clearElement(eValue);
}
if (beans.filterManager?.isSuppressFlashingCellsBecauseFiltering()) {
return false;
}
if (typeof value === "number" && typeof lastValue === "number") {
const delta = value - lastValue;
this.showDelta(params, delta);
}
if (lastValue) {
eValue.classList.add("ag-value-change-value-highlight");
}
if (!isInitialRender) {
this.setTimerToRemoveDelta();
}
this.lastValue = value;
return true;
}
};
// packages/ag-grid-community/src/rendering/cellRenderers/animateSlideCellRenderer.css-GENERATED.ts
var animateSlideCellRendererCSS = (
/*css*/
`.ag-value-slide-out{opacity:1}:where(.ag-ltr) .ag-value-slide-out{margin-right:5px;transition:opacity 3s,margin-right 3s}:where(.ag-rtl) .ag-value-slide-out{margin-left:5px;transition:opacity 3s,margin-left 3s}:where(.ag-ltr,.ag-rtl) .ag-value-slide-out{transition-timing-function:linear}.ag-value-slide-out-end{opacity:0}:where(.ag-ltr) .ag-value-slide-out-end{margin-right:10px}:where(.ag-rtl) .ag-value-slide-out-end{margin-left:10px}`
);
// packages/ag-grid-community/src/rendering/cellRenderers/animateSlideCellRenderer.ts
var AnimateSlideCellRenderer = class extends Component {
constructor() {
super();
this.refreshCount = 0;
const template = document.createElement("span");
const slide = document.createElement("span");
slide.setAttribute("class", "ag-value-slide-current");
template.appendChild(slide);
this.setTemplateFromElement(template);
this.eCurrent = this.queryForHtmlElement(".ag-value-slide-current");
this.registerCSS(animateSlideCellRendererCSS);
}
init(params) {
this.refresh(params, true);
}
addSlideAnimation() {
this.refreshCount++;
const refreshCountCopy = this.refreshCount;
if (this.ePrevious) {
this.getGui().removeChild(this.ePrevious);
}
const { beans, eCurrent } = this;
const prevElement = _getDocument(beans).createElement("span");
prevElement.setAttribute("class", "ag-value-slide-previous ag-value-slide-out");
this.ePrevious = prevElement;
prevElement.textContent = eCurrent.textContent;
this.getGui().insertBefore(prevElement, eCurrent);
beans.frameworkOverrides.wrapIncoming(() => {
window.setTimeout(() => {
if (refreshCountCopy !== this.refreshCount) {
return;
}
this.ePrevious.classList.add("ag-value-slide-out-end");
}, 50);
window.setTimeout(() => {
if (refreshCountCopy !== this.refreshCount) {
return;
}
this.getGui().removeChild(this.ePrevious);
this.ePrevious = null;
}, 3e3);
});
}
refresh(params, isInitialRender = false) {
let value = params.value;
if (_missing(value)) {
value = "";
}
if (value === this.lastValue) {
return false;
}
if (this.beans.filterManager?.isSuppressFlashingCellsBecauseFiltering()) {
return false;
}
if (!isInitialRender) {
this.addSlideAnimation();
}
this.lastValue = value;
const eCurrent = this.eCurrent;
if (_exists(params.valueFormatted)) {
eCurrent.textContent = params.valueFormatted;
} else if (_exists(params.value)) {
eCurrent.textContent = value;
} else {
_clearElement(eCurrent);
}
return true;
}
};
// packages/ag-grid-community/src/rendering/cell/cellFlashService.ts
var CellFlashService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "cellFlashSvc";
}
onFlashCells(cellCtrl, event) {
if (!cellCtrl.comp) {
return;
}
const cellId = _createCellId(cellCtrl.cellPosition);
const shouldFlash = event.cells[cellId];
if (shouldFlash) {
this.animateCell(cellCtrl, "highlight");
}
}
flashCell(cellCtrl, delays) {
this.animateCell(cellCtrl, "data-changed", delays?.flashDuration, delays?.fadeDuration);
}
animateCell(cellCtrl, cssName, flashDuration, fadeDuration) {
const cellComp = cellCtrl.comp;
if (!cellComp) {
return;
}
const { gos } = this;
if (!flashDuration) {
flashDuration = gos.get("cellFlashDuration");
}
if (flashDuration === 0) {
return;
}
if (!_exists(fadeDuration)) {
fadeDuration = gos.get("cellFadeDuration");
}
const fullName = `ag-cell-${cssName}`;
const animationFullName = `ag-cell-${cssName}-animation`;
cellComp.addOrRemoveCssClass(fullName, true);
cellComp.addOrRemoveCssClass(animationFullName, false);
const eCell = cellCtrl.eGui;
this.beans.frameworkOverrides.wrapIncoming(() => {
window.setTimeout(() => {
if (!cellCtrl.isAlive()) {
return;
}
cellComp.addOrRemoveCssClass(fullName, false);
cellComp.addOrRemoveCssClass(animationFullName, true);
eCell.style.transition = `background-color ${fadeDuration}ms`;
window.setTimeout(() => {
if (!cellCtrl.isAlive()) {
return;
}
cellComp.addOrRemoveCssClass(animationFullName, false);
eCell.style.transition = "";
}, fadeDuration);
}, flashDuration);
});
}
};
// packages/ag-grid-community/src/rendering/cell/highlightChangesApi.ts
function flashCells(beans, params = {}) {
const { cellFlashSvc } = beans;
if (!cellFlashSvc) {
return;
}
beans.frameworkOverrides.wrapIncoming(() => {
beans.rowRenderer.getCellCtrls(params.rowNodes, params.columns).forEach((cellCtrl) => cellFlashSvc.flashCell(cellCtrl, params));
});
}
// packages/ag-grid-community/src/rendering/cell/highlightChangesModule.ts
var HighlightChangesModule = {
moduleName: "HighlightChanges",
version: VERSION,
beans: [CellFlashService],
userComponents: {
agAnimateShowChangeCellRenderer: AnimateShowChangeCellRenderer,
agAnimateSlideCellRenderer: AnimateSlideCellRenderer
},
apiFunctions: {
flashCells
}
};
// packages/ag-grid-community/src/misc/state/stateApi.ts
function getState(beans) {
return beans.stateSvc?.getState() ?? {};
}
// packages/ag-grid-community/src/misc/state/stateModelMigration.ts
function migrateGridStateModel(state) {
state = { ...state };
if (!state.version) {
state.version = "32.1.0";
}
switch (state.version) {
case "32.1.0":
state = migrateV32_1(state);
}
return state;
}
function migrateV32_1(state) {
state.cellSelection = jsonGet(state, "rangeSelection");
return state;
}
function jsonGet(json, key) {
if (json && typeof json === "object") {
return json[key];
}
}
// packages/ag-grid-community/src/misc/state/stateService.ts
var StateService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "stateSvc";
this.updateRowGroupExpansionStateTimer = 0;
this.suppressEvents = true;
this.queuedUpdateSources = /* @__PURE__ */ new Set();
this.dispatchStateUpdateEventDebounced = _debounce(this, () => this.dispatchQueuedStateUpdateEvents(), 0);
// If user is doing a manual expand all node by node, we don't want to process one at a time.
// EVENT_ROW_GROUP_OPENED is already async, so no impact of making the state async here.
this.onRowGroupOpenedDebounced = _debounce(
this,
() => {
this.updateCachedState("rowGroupExpansion", this.getRowGroupExpansionState());
},
0
);
// similar to row expansion, want to debounce. However, selection is synchronous, so need to mark as stale in case `getState` is called.
this.onRowSelectedDebounced = _debounce(
this,
() => {
this.staleStateKeys.delete("rowSelection");
this.updateCachedState("rowSelection", this.getRowSelectionState());
},
0
);
this.staleStateKeys = /* @__PURE__ */ new Set();
}
postConstruct() {
this.isClientSideRowModel = _isClientSideRowModel(this.gos);
this.cachedState = this.getInitialState();
this.setCachedStateValue("version", VERSION);
const suppressEventsAndDispatchInitEvent = this.suppressEventsAndDispatchInitEvent.bind(this);
this.beans.ctrlsSvc.whenReady(
this,
() => suppressEventsAndDispatchInitEvent(() => this.setupStateOnGridReady())
);
const [newColumnsLoadedDestroyFunc, rowCountReadyDestroyFunc, firstDataRenderedDestroyFunc] = this.addManagedEventListeners({
newColumnsLoaded: ({ source }) => {
if (source === "gridInitializing") {
newColumnsLoadedDestroyFunc();
suppressEventsAndDispatchInitEvent(() => this.setupStateOnColumnsInitialised());
}
},
rowCountReady: () => {
rowCountReadyDestroyFunc?.();
suppressEventsAndDispatchInitEvent(() => this.setupStateOnRowCountReady());
},
firstDataRendered: () => {
firstDataRenderedDestroyFunc?.();
suppressEventsAndDispatchInitEvent(() => this.setupStateOnFirstDataRendered());
}
});
}
destroy() {
super.destroy();
clearTimeout(this.updateRowGroupExpansionStateTimer);
this.queuedUpdateSources.clear();
}
getInitialState() {
return migrateGridStateModel(this.gos.get("initialState") ?? {});
}
getState() {
if (this.staleStateKeys.size) {
this.refreshStaleState();
}
return this.cachedState;
}
setupStateOnGridReady() {
const stateUpdater = () => this.updateCachedState("sideBar", this.getSideBarState());
stateUpdater();
this.addManagedEventListeners({
toolPanelVisibleChanged: stateUpdater,
sideBarUpdated: stateUpdater
});
}
setupStateOnColumnsInitialised() {
const initialState = this.getInitialState();
this.setColumnState(initialState);
this.setColumnGroupState(initialState);
this.updateColumnState([
"aggregation",
"columnOrder",
"columnPinning",
"columnSizing",
"columnVisibility",
"pivot",
"pivot",
"rowGroup",
"sort"
]);
this.updateCachedState("columnGroup", this.getColumnGroupState());
const onUpdate = (state) => () => this.updateColumnState([state]);
this.addManagedEventListeners({
columnValueChanged: onUpdate("aggregation"),
columnMoved: onUpdate("columnOrder"),
columnPinned: onUpdate("columnPinning"),
columnResized: onUpdate("columnSizing"),
columnVisible: onUpdate("columnVisibility"),
columnPivotChanged: onUpdate("pivot"),
columnPivotModeChanged: onUpdate("pivot"),
columnRowGroupChanged: onUpdate("rowGroup"),
sortChanged: onUpdate("sort"),
newColumnsLoaded: () => this.updateColumnState([
"aggregation",
"columnOrder",
"columnPinning",
"columnSizing",
"columnVisibility",
"pivot",
"rowGroup",
"sort"
]),
columnGroupOpened: () => this.updateCachedState("columnGroup", this.getColumnGroupState())
});
}
setupStateOnRowCountReady() {
const {
filter: filterState,
rowGroupExpansion: rowGroupExpansionState,
rowSelection: rowSelectionState,
pagination: paginationState
} = this.getInitialState();
if (filterState) {
this.setFilterState(filterState);
}
if (rowGroupExpansionState) {
this.setRowGroupExpansionState(rowGroupExpansionState);
}
if (rowSelectionState) {
this.setRowSelectionState(rowSelectionState);
}
if (paginationState) {
this.setPaginationState(paginationState);
}
const updateCachedState = this.updateCachedState.bind(this);
updateCachedState("filter", this.getFilterState());
updateCachedState("rowGroupExpansion", this.getRowGroupExpansionState());
updateCachedState("rowSelection", this.getRowSelectionState());
updateCachedState("pagination", this.getPaginationState());
const updateRowGroupExpansionState = () => {
this.updateRowGroupExpansionStateTimer = 0;
updateCachedState("rowGroupExpansion", this.getRowGroupExpansionState());
};
this.addManagedEventListeners({
filterChanged: () => updateCachedState("filter", this.getFilterState()),
rowGroupOpened: () => this.onRowGroupOpenedDebounced(),
expandOrCollapseAll: updateRowGroupExpansionState,
// `groupDefaultExpanded` updates expansion state without an expansion event
columnRowGroupChanged: updateRowGroupExpansionState,
rowDataUpdated: () => {
if (this.gos.get("groupDefaultExpanded") !== 0) {
this.updateRowGroupExpansionStateTimer || (this.updateRowGroupExpansionStateTimer = setTimeout(updateRowGroupExpansionState));
}
},
selectionChanged: () => {
this.staleStateKeys.add("rowSelection");
this.onRowSelectedDebounced();
},
paginationChanged: (event) => {
if (event.newPage || event.newPageSize) {
updateCachedState("pagination", this.getPaginationState());
}
}
});
}
setupStateOnFirstDataRendered() {
const {
scroll: scrollState,
cellSelection: cellSelectionState,
focusedCell: focusedCellState,
columnOrder: columnOrderState
} = this.getInitialState();
if (focusedCellState) {
this.setFocusedCellState(focusedCellState);
}
if (cellSelectionState) {
this.setCellSelectionState(cellSelectionState);
}
if (scrollState) {
this.setScrollState(scrollState);
}
this.setColumnPivotState(!!columnOrderState?.orderedColIds);
const updateCachedState = this.updateCachedState.bind(this);
updateCachedState("sideBar", this.getSideBarState());
updateCachedState("focusedCell", this.getFocusedCellState());
const cellSelection = this.getRangeSelectionState();
updateCachedState("rangeSelection", cellSelection);
updateCachedState("cellSelection", cellSelection);
updateCachedState("scroll", this.getScrollState());
this.addManagedEventListeners({
cellFocused: () => updateCachedState("focusedCell", this.getFocusedCellState()),
cellSelectionChanged: (event) => {
if (event.finished) {
const cellSelection2 = this.getRangeSelectionState();
updateCachedState("rangeSelection", cellSelection2);
updateCachedState("cellSelection", cellSelection2);
}
},
bodyScrollEnd: () => updateCachedState("scroll", this.getScrollState())
});
}
getColumnState() {
const beans = this.beans;
const pivotMode = beans.colModel.isPivotMode();
const sortColumns = [];
const groupColIds = [];
const aggregationColumns = [];
const pivotColIds = [];
const leftColIds = [];
const rightColIds = [];
const hiddenColIds = [];
const columnSizes = [];
const columns = [];
let defaultSortIndex = 0;
const columnState = _getColumnState(beans);
for (let i = 0; i < columnState.length; i++) {
const {
colId,
sort,
sortIndex,
rowGroup,
rowGroupIndex,
aggFunc,
pivot,
pivotIndex,
pinned,
hide,
width,
flex
} = columnState[i];
columns.push(colId);
if (sort) {
sortColumns[sortIndex ?? defaultSortIndex++] = { colId, sort };
}
if (rowGroup) {
groupColIds[rowGroupIndex ?? 0] = colId;
}
if (typeof aggFunc === "string") {
aggregationColumns.push({ colId, aggFunc });
}
if (pivot) {
pivotColIds[pivotIndex ?? 0] = colId;
}
if (pinned) {
(pinned === "right" ? rightColIds : leftColIds).push(colId);
}
if (hide) {
hiddenColIds.push(colId);
}
if (flex != null || width) {
columnSizes.push({ colId, flex: flex ?? void 0, width });
}
}
return {
sort: sortColumns.length ? { sortModel: sortColumns } : void 0,
rowGroup: groupColIds.length ? { groupColIds } : void 0,
aggregation: aggregationColumns.length ? { aggregationModel: aggregationColumns } : void 0,
pivot: pivotColIds.length || pivotMode ? { pivotMode, pivotColIds } : void 0,
columnPinning: leftColIds.length || rightColIds.length ? { leftColIds, rightColIds } : void 0,
columnVisibility: hiddenColIds.length ? { hiddenColIds } : void 0,
columnSizing: columnSizes.length ? { columnSizingModel: columnSizes } : void 0,
columnOrder: columns.length ? { orderedColIds: columns } : void 0
};
}
setColumnState(initialState) {
const {
sort: sortState,
rowGroup: groupState,
aggregation: aggregationState,
pivot: pivotState,
columnPinning: columnPinningState,
columnVisibility: columnVisibilityState,
columnSizing: columnSizingState,
columnOrder: columnOrderState,
partialColumnState
} = initialState;
const columnStateMap = {};
const getColumnState2 = (colId) => {
let columnState = columnStateMap[colId];
if (columnState) {
return columnState;
}
columnState = { colId };
columnStateMap[colId] = columnState;
return columnState;
};
const defaultState = partialColumnState ? {} : {
sort: null,
sortIndex: null,
rowGroup: null,
rowGroupIndex: null,
aggFunc: null,
pivot: null,
pivotIndex: null,
pinned: null,
hide: null,
flex: null
};
if (sortState) {
sortState.sortModel.forEach(({ colId, sort }, sortIndex) => {
const columnState = getColumnState2(colId);
columnState.sort = sort;
columnState.sortIndex = sortIndex;
});
defaultState.sort = null;
defaultState.sortIndex = null;
}
if (groupState) {
groupState.groupColIds.forEach((colId, rowGroupIndex) => {
const columnState = getColumnState2(colId);
columnState.rowGroup = true;
columnState.rowGroupIndex = rowGroupIndex;
});
defaultState.rowGroup = null;
defaultState.rowGroupIndex = null;
}
if (aggregationState) {
aggregationState.aggregationModel.forEach(({ colId, aggFunc }) => {
getColumnState2(colId).aggFunc = aggFunc;
});
defaultState.aggFunc = null;
}
if (pivotState) {
pivotState.pivotColIds.forEach((colId, pivotIndex) => {
const columnState = getColumnState2(colId);
columnState.pivot = true;
columnState.pivotIndex = pivotIndex;
});
this.gos.updateGridOptions({
options: { pivotMode: pivotState.pivotMode },
source: "gridInitializing"
});
defaultState.pivot = null;
defaultState.pivotIndex = null;
}
if (columnPinningState) {
columnPinningState.leftColIds.forEach((colId) => {
getColumnState2(colId).pinned = "left";
});
columnPinningState.rightColIds.forEach((colId) => {
getColumnState2(colId).pinned = "right";
});
defaultState.pinned = null;
}
if (columnVisibilityState) {
columnVisibilityState.hiddenColIds.forEach((colId) => {
getColumnState2(colId).hide = true;
});
defaultState.hide = null;
}
if (columnSizingState) {
columnSizingState.columnSizingModel.forEach(({ colId, flex, width }) => {
const columnState = getColumnState2(colId);
columnState.flex = flex ?? null;
columnState.width = width;
});
defaultState.flex = null;
}
const columns = columnOrderState?.orderedColIds;
const applyOrder = !!columns?.length;
const columnStates = applyOrder ? columns.map((colId) => getColumnState2(colId)) : Object.values(columnStateMap);
if (columnStates.length) {
this.columnStates = columnStates;
_applyColumnState(
this.beans,
{
state: columnStates,
applyOrder,
defaultState
},
"gridInitializing"
);
}
}
setColumnPivotState(applyOrder) {
const columnStates = this.columnStates;
this.columnStates = void 0;
const columnGroupStates = this.columnGroupStates;
this.columnGroupStates = void 0;
const beans = this.beans;
const { pivotResultCols, colGroupSvc } = beans;
if (!pivotResultCols?.isPivotResultColsPresent()) {
return;
}
if (columnStates) {
const secondaryColumnStates = [];
for (const columnState of columnStates) {
if (pivotResultCols.getPivotResultCol(columnState.colId)) {
secondaryColumnStates.push(columnState);
}
}
_applyColumnState(
beans,
{
state: secondaryColumnStates,
applyOrder
},
"gridInitializing"
);
}
if (columnGroupStates) {
colGroupSvc?.setColumnGroupState(columnGroupStates, "gridInitializing");
}
}
getColumnGroupState() {
const colGroupSvc = this.beans.colGroupSvc;
if (!colGroupSvc) {
return void 0;
}
const columnGroupState = colGroupSvc.getColumnGroupState();
const openColumnGroups = [];
columnGroupState.forEach(({ groupId, open }) => {
if (open) {
openColumnGroups.push(groupId);
}
});
return openColumnGroups.length ? { openColumnGroupIds: openColumnGroups } : void 0;
}
setColumnGroupState(initialState) {
const colGroupSvc = this.beans.colGroupSvc;
if (!Object.prototype.hasOwnProperty.call(initialState, "columnGroup") || !colGroupSvc) {
return;
}
const openColumnGroups = new Set(initialState.columnGroup?.openColumnGroupIds);
const existingColumnGroupState = colGroupSvc.getColumnGroupState();
const stateItems = existingColumnGroupState.map(({ groupId }) => {
const open = openColumnGroups.has(groupId);
if (open) {
openColumnGroups.delete(groupId);
}
return {
groupId,
open
};
});
openColumnGroups.forEach((groupId) => {
stateItems.push({
groupId,
open: true
});
});
if (stateItems.length) {
this.columnGroupStates = stateItems;
}
colGroupSvc.setColumnGroupState(stateItems, "gridInitializing");
}
getFilterState() {
const filterManager = this.beans.filterManager;
let filterModel = filterManager?.getFilterModel();
if (filterModel && Object.keys(filterModel).length === 0) {
filterModel = void 0;
}
const advancedFilterModel = filterManager?.getAdvFilterModel() ?? void 0;
return filterModel || advancedFilterModel ? { filterModel, advancedFilterModel } : void 0;
}
setFilterState(filterState) {
const filterManager = this.beans.filterManager;
const { filterModel, advancedFilterModel } = filterState ?? {};
if (filterModel) {
filterManager?.setFilterModel(filterModel, "columnFilter");
}
if (advancedFilterModel) {
filterManager?.setAdvFilterModel(advancedFilterModel, "advancedFilter");
}
}
getRangeSelectionState() {
const cellRanges = this.beans.rangeSvc?.getCellRanges().map((cellRange) => {
const { id, type, startRow, endRow, columns, startColumn } = cellRange;
return {
id,
type,
startRow,
endRow,
colIds: columns.map((column) => column.getColId()),
startColId: startColumn.getColId()
};
});
return cellRanges?.length ? { cellRanges } : void 0;
}
setCellSelectionState(cellSelectionState) {
const { gos, rangeSvc, colModel, visibleCols } = this.beans;
if (!_isCellSelectionEnabled(gos) || !rangeSvc) {
return;
}
const cellRanges = [];
cellSelectionState.cellRanges.forEach((cellRange) => {
const columns = [];
cellRange.colIds.forEach((colId) => {
const column = colModel.getCol(colId);
if (column) {
columns.push(column);
}
});
if (!columns.length) {
return;
}
let startColumn = colModel.getCol(cellRange.startColId);
if (!startColumn) {
const allColumns = visibleCols.allCols;
const columnSet = new Set(columns);
startColumn = allColumns.find((column) => columnSet.has(column));
}
cellRanges.push({
...cellRange,
columns,
startColumn
});
});
rangeSvc.setCellRanges(cellRanges);
}
getScrollState() {
if (!this.isClientSideRowModel) {
return void 0;
}
const scrollFeature = this.beans.ctrlsSvc.getScrollFeature();
const { left } = scrollFeature?.getHScrollPosition() ?? { left: 0 };
const { top } = scrollFeature?.getVScrollPosition() ?? { top: 0 };
return top || left ? {
top,
left
} : void 0;
}
setScrollState(scrollState) {
if (!this.isClientSideRowModel) {
return;
}
const { top, left } = scrollState;
const { frameworkOverrides, rowRenderer, animationFrameSvc, ctrlsSvc } = this.beans;
frameworkOverrides.wrapIncoming(() => {
ctrlsSvc.get("center").setCenterViewportScrollLeft(left);
ctrlsSvc.getScrollFeature()?.setVerticalScrollPosition(top);
rowRenderer.redraw({ afterScroll: true });
animationFrameSvc?.flushAllFrames();
});
}
getSideBarState() {
return this.beans.sideBar?.comp?.getState();
}
getFocusedCellState() {
if (!this.isClientSideRowModel) {
return void 0;
}
const focusedCell = this.beans.focusSvc.getFocusedCell();
if (focusedCell) {
const { column, rowIndex, rowPinned } = focusedCell;
return {
colId: column.getColId(),
rowIndex,
rowPinned
};
}
return void 0;
}
setFocusedCellState(focusedCellState) {
if (!this.isClientSideRowModel) {
return;
}
const { colId, rowIndex, rowPinned } = focusedCellState;
const { focusSvc, colModel } = this.beans;
focusSvc.setFocusedCell({
column: colModel.getCol(colId),
rowIndex,
rowPinned,
forceBrowserFocus: true,
preventScrollOnBrowserFocus: true
});
}
getPaginationState() {
const { pagination, gos } = this.beans;
if (!pagination) {
return void 0;
}
const page = pagination.getCurrentPage();
const pageSize = !gos.get("paginationAutoPageSize") ? pagination.getPageSize() : void 0;
if (!page && !pageSize) {
return;
}
return { page, pageSize };
}
setPaginationState(paginationState) {
const { pagination, gos } = this.beans;
if (!pagination) {
return;
}
if (paginationState.pageSize && !gos.get("paginationAutoPageSize")) {
pagination.setPageSize(paginationState.pageSize, "initialState");
}
if (typeof paginationState.page === "number") {
pagination.setPage(paginationState.page);
}
}
getRowSelectionState() {
const selectionSvc = this.beans.selectionSvc;
if (!selectionSvc) {
return void 0;
}
const selectionState = selectionSvc.getSelectionState();
const noSelections = !selectionState || !Array.isArray(selectionState) && (selectionState.selectAll === false || selectionState.selectAllChildren === false) && !selectionState?.toggledNodes?.length;
return noSelections ? void 0 : selectionState;
}
setRowSelectionState(rowSelectionState) {
this.beans.selectionSvc?.setSelectionState(rowSelectionState, "gridInitializing");
}
getRowGroupExpansionState() {
const { expansionSvc, rowModel } = this.beans;
if (!expansionSvc) {
return void 0;
}
const expandedRowGroups = [];
rowModel.forEachNode(({ expanded, id }) => {
if (expanded && id) {
expandedRowGroups.push(id);
}
});
return expandedRowGroups.length ? {
expandedRowGroupIds: expandedRowGroups
} : void 0;
}
setRowGroupExpansionState(rowGroupExpansionState) {
this.beans.expansionSvc?.expandRows(rowGroupExpansionState.expandedRowGroupIds);
}
updateColumnState(features) {
const newColumnState = this.getColumnState();
let hasChanged = false;
const cachedState = this.cachedState;
for (const key of Object.keys(newColumnState)) {
const value = newColumnState[key];
if (!_jsonEquals(value, cachedState[key])) {
hasChanged = true;
}
}
this.cachedState = {
...cachedState,
...newColumnState
};
if (hasChanged) {
this.dispatchStateUpdateEvent(features);
}
}
updateCachedState(key, value) {
const existingValue = this.cachedState[key];
this.setCachedStateValue(key, value);
if (!_jsonEquals(value, existingValue)) {
this.dispatchStateUpdateEvent([key]);
}
}
setCachedStateValue(key, value) {
this.cachedState = {
...this.cachedState,
[key]: value
};
}
refreshStaleState() {
const staleStateKeys = this.staleStateKeys;
staleStateKeys.forEach((key) => {
switch (key) {
case "rowSelection":
this.setCachedStateValue(key, this.getRowSelectionState());
break;
}
});
staleStateKeys.clear();
}
dispatchStateUpdateEvent(sources) {
if (this.suppressEvents) {
return;
}
sources.forEach((source) => this.queuedUpdateSources.add(source));
this.dispatchStateUpdateEventDebounced();
}
dispatchQueuedStateUpdateEvents() {
const queuedUpdateSources = this.queuedUpdateSources;
const sources = Array.from(queuedUpdateSources);
queuedUpdateSources.clear();
this.eventSvc.dispatchEvent({
type: "stateUpdated",
sources,
state: this.cachedState
});
}
suppressEventsAndDispatchInitEvent(updateFunc) {
this.suppressEvents = true;
const colAnimation = this.beans.colAnimation;
colAnimation?.setSuppressAnimation(true);
updateFunc();
setTimeout(() => {
this.suppressEvents = false;
this.queuedUpdateSources.clear();
if (!this.isAlive()) {
return;
}
colAnimation?.setSuppressAnimation(false);
this.dispatchStateUpdateEvent(["gridInitializing"]);
});
}
};
// packages/ag-grid-community/src/misc/state/stateModule.ts
var GridStateModule = {
moduleName: "GridState",
version: VERSION,
beans: [StateService],
apiFunctions: {
getState
}
};
// packages/ag-grid-community/src/pagination/paginationApi.ts
function paginationIsLastPageFound(beans) {
return beans.rowModel.isLastRowIndexKnown();
}
function paginationGetPageSize(beans) {
return beans.pagination?.getPageSize() ?? 100;
}
function paginationGetCurrentPage(beans) {
return beans.pagination?.getCurrentPage() ?? 0;
}
function paginationGetTotalPages(beans) {
return beans.pagination?.getTotalPages() ?? 1;
}
function paginationGetRowCount(beans) {
return beans.pagination ? beans.pagination.getMasterRowCount() : beans.rowModel.getRowCount();
}
function paginationGoToNextPage(beans) {
beans.pagination?.goToNextPage();
}
function paginationGoToPreviousPage(beans) {
beans.pagination?.goToPreviousPage();
}
function paginationGoToFirstPage(beans) {
beans.pagination?.goToFirstPage();
}
function paginationGoToLastPage(beans) {
beans.pagination?.goToLastPage();
}
function paginationGoToPage(beans, page) {
beans.pagination?.goToPage(page);
}
// packages/ag-grid-community/src/pagination/paginationAutoPageSizeService.ts
var PaginationAutoPageSizeService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "paginationAutoPageSizeSvc";
}
postConstruct() {
this.beans.ctrlsSvc.whenReady(this, (p) => {
this.centerRowsCtrl = p.center;
const listener = this.checkPageSize.bind(this);
this.addManagedEventListeners({
bodyHeightChanged: listener,
scrollVisibilityChanged: listener
});
this.addManagedPropertyListener("paginationAutoPageSize", this.onPaginationAutoSizeChanged.bind(this));
this.checkPageSize();
});
}
notActive() {
return !this.gos.get("paginationAutoPageSize") || this.centerRowsCtrl == null;
}
onPaginationAutoSizeChanged() {
if (this.notActive()) {
this.beans.pagination.unsetAutoCalculatedPageSize();
} else {
this.checkPageSize();
}
}
checkPageSize() {
if (this.notActive()) {
return;
}
const bodyHeight = this.centerRowsCtrl.viewportSizeFeature.getBodyHeight();
if (bodyHeight > 0) {
const beans = this.beans;
const update = () => {
const rowHeight = Math.max(_getRowHeightAsNumber(beans), 1);
const newPageSize = Math.floor(bodyHeight / rowHeight);
beans.pagination.setPageSize(newPageSize, "autoCalculated");
};
if (!this.isBodyRendered) {
update();
this.isBodyRendered = true;
} else {
_debounce(this, update, 50)();
}
} else {
this.isBodyRendered = false;
}
}
};
// packages/ag-grid-community/src/pagination/pageSizeSelector/pageSizeSelectorComp.ts
var paginationPageSizeSelector = "paginationPageSizeSelector";
var PageSizeSelectorComp = class extends Component {
constructor() {
super(
/* html */
``
);
this.hasEmptyOption = false;
this.handlePageSizeItemSelected = () => {
if (!this.selectPageSizeComp) {
return;
}
const newValue = this.selectPageSizeComp.getValue();
if (!newValue) {
return;
}
const paginationPageSize = Number(newValue);
if (isNaN(paginationPageSize) || paginationPageSize < 1 || paginationPageSize === this.pagination.getPageSize()) {
return;
}
this.pagination.setPageSize(paginationPageSize, "pageSizeSelector");
if (this.hasEmptyOption) {
this.toggleSelectDisplay(true);
}
this.selectPageSizeComp.getFocusableElement().focus();
};
}
wireBeans(beans) {
this.pagination = beans.pagination;
}
postConstruct() {
this.addManagedPropertyListener(paginationPageSizeSelector, () => {
this.onPageSizeSelectorValuesChange();
});
this.addManagedEventListeners({ paginationChanged: (event) => this.handlePaginationChanged(event) });
}
handlePaginationChanged(paginationChangedEvent) {
if (!this.selectPageSizeComp || !paginationChangedEvent?.newPageSize) {
return;
}
const paginationPageSize = this.pagination.getPageSize();
if (this.getPageSizeSelectorValues().includes(paginationPageSize)) {
this.selectPageSizeComp.setValue(paginationPageSize.toString());
} else {
if (this.hasEmptyOption) {
this.selectPageSizeComp.setValue("");
} else {
this.toggleSelectDisplay(true);
}
}
}
toggleSelectDisplay(show) {
if (this.selectPageSizeComp && !show) {
this.reset();
}
if (!show) {
return;
}
this.reloadPageSizesSelector();
if (!this.selectPageSizeComp) {
return;
}
}
reset() {
_clearElement(this.getGui());
if (!this.selectPageSizeComp) {
return;
}
this.selectPageSizeComp = this.destroyBean(this.selectPageSizeComp);
}
onPageSizeSelectorValuesChange() {
if (!this.selectPageSizeComp) {
return;
}
if (this.shouldShowPageSizeSelector()) {
this.reloadPageSizesSelector();
}
}
shouldShowPageSizeSelector() {
return this.gos.get("pagination") && !this.gos.get("suppressPaginationPanel") && !this.gos.get("paginationAutoPageSize") && this.gos.get(paginationPageSizeSelector) !== false;
}
reloadPageSizesSelector() {
const pageSizeOptions = this.getPageSizeSelectorValues();
const paginationPageSizeOption = this.pagination.getPageSize();
const shouldAddAndSelectEmptyOption = !paginationPageSizeOption || !pageSizeOptions.includes(paginationPageSizeOption);
if (shouldAddAndSelectEmptyOption) {
const pageSizeSet = this.gos.exists("paginationPageSize");
const pageSizesSet = this.gos.get(paginationPageSizeSelector) !== true;
_warn(94, { pageSizeSet, pageSizesSet, pageSizeOptions, paginationPageSizeOption });
if (!pageSizesSet) {
_warn(95, { paginationPageSizeOption, paginationPageSizeSelector });
}
pageSizeOptions.unshift("");
}
const value = String(shouldAddAndSelectEmptyOption ? "" : paginationPageSizeOption);
if (this.selectPageSizeComp) {
if (!_areEqual(this.pageSizeOptions, pageSizeOptions)) {
this.selectPageSizeComp.clearOptions().addOptions(this.createPageSizeSelectOptions(pageSizeOptions));
this.pageSizeOptions = pageSizeOptions;
}
this.selectPageSizeComp.setValue(value, true);
} else {
this.createPageSizeSelectorComp(pageSizeOptions, value);
}
this.hasEmptyOption = shouldAddAndSelectEmptyOption;
}
createPageSizeSelectOptions(pageSizeOptions) {
return pageSizeOptions.map((value) => ({
value: String(value)
}));
}
createPageSizeSelectorComp(pageSizeOptions, value) {
const localeTextFunc = this.getLocaleTextFunc();
const localisedLabel = localeTextFunc("pageSizeSelectorLabel", "Page Size:");
const localisedAriaLabel = localeTextFunc("ariaPageSizeSelectorLabel", "Page Size");
this.selectPageSizeComp = this.createManagedBean(new AgSelect()).addOptions(this.createPageSizeSelectOptions(pageSizeOptions)).setValue(value).setAriaLabel(localisedAriaLabel).setLabel(localisedLabel).onValueChange(() => this.handlePageSizeItemSelected());
this.appendChild(this.selectPageSizeComp);
}
getPageSizeSelectorValues() {
const defaultValues = [20, 50, 100];
const paginationPageSizeSelectorValues = this.gos.get(paginationPageSizeSelector);
if (!Array.isArray(paginationPageSizeSelectorValues) || !paginationPageSizeSelectorValues?.length) {
return defaultValues;
}
return [...paginationPageSizeSelectorValues].sort((a, b) => a - b);
}
destroy() {
this.toggleSelectDisplay(false);
super.destroy();
}
};
var PageSizeSelectorSelector = {
selector: "AG-PAGE-SIZE-SELECTOR",
component: PageSizeSelectorComp
};
// packages/ag-grid-community/src/pagination/paginationComp.css-GENERATED.ts
var paginationCompCSS = (
/*css*/
`.ag-paging-panel{align-items:center;border-top:var(--ag-footer-row-border);display:flex;gap:calc(var(--ag-spacing)*4);height:max(var(--ag-row-height),22px);justify-content:flex-end;padding:0 var(--ag-cell-horizontal-padding)}:where(.ag-paging-page-size) .ag-wrapper{min-width:50px}.ag-paging-page-summary-panel{align-items:center;display:flex;gap:var(--ag-cell-widget-spacing);.ag-disabled &{pointer-events:none}}.ag-paging-button{cursor:pointer;position:relative;&.ag-disabled{cursor:default;opacity:.5}}.ag-paging-number,.ag-paging-row-summary-panel-number{font-weight:500}`
);
// packages/ag-grid-community/src/pagination/paginationComp.ts
var PaginationComp = class extends TabGuardComp {
constructor() {
super();
this.btFirst = RefPlaceholder;
this.btPrevious = RefPlaceholder;
this.btNext = RefPlaceholder;
this.btLast = RefPlaceholder;
this.lbRecordCount = RefPlaceholder;
this.lbFirstRowOnPage = RefPlaceholder;
this.lbLastRowOnPage = RefPlaceholder;
this.lbCurrent = RefPlaceholder;
this.lbTotal = RefPlaceholder;
this.pageSizeComp = RefPlaceholder;
this.previousAndFirstButtonsDisabled = false;
this.nextButtonDisabled = false;
this.lastButtonDisabled = false;
this.areListenersSetup = false;
this.allowFocusInnerElement = false;
this.registerCSS(paginationCompCSS);
}
wireBeans(beans) {
this.rowModel = beans.rowModel;
this.pagination = beans.pagination;
this.ariaAnnounce = beans.ariaAnnounce;
}
postConstruct() {
const isRtl = this.gos.get("enableRtl");
this.setTemplate(this.getTemplate(), [PageSizeSelectorSelector]);
const { btFirst, btPrevious, btNext, btLast } = this;
this.activateTabIndex([btFirst, btPrevious, btNext, btLast]);
btFirst.insertAdjacentElement("afterbegin", _createIconNoSpan(isRtl ? "last" : "first", this.beans));
btPrevious.insertAdjacentElement("afterbegin", _createIconNoSpan(isRtl ? "next" : "previous", this.beans));
btNext.insertAdjacentElement("afterbegin", _createIconNoSpan(isRtl ? "previous" : "next", this.beans));
btLast.insertAdjacentElement("afterbegin", _createIconNoSpan(isRtl ? "first" : "last", this.beans));
this.addManagedPropertyListener("pagination", this.onPaginationChanged.bind(this));
this.addManagedPropertyListener("suppressPaginationPanel", this.onPaginationChanged.bind(this));
this.addManagedPropertyListeners(
["paginationPageSizeSelector", "paginationAutoPageSize", "suppressPaginationPanel"],
() => this.onPageSizeRelatedOptionsChange()
);
this.pageSizeComp.toggleSelectDisplay(this.pageSizeComp.shouldShowPageSizeSelector());
this.initialiseTabGuard({
// prevent tab guard default logic
onTabKeyDown: () => {
},
focusInnerElement: (fromBottom) => {
if (this.allowFocusInnerElement) {
return this.tabGuardFeature.getTabGuardCtrl().focusInnerElement(fromBottom);
} else {
return _focusGridInnerElement(this.beans, fromBottom);
}
},
forceFocusOutWhenTabGuardsAreEmpty: true
});
this.onPaginationChanged();
}
setAllowFocus(allowFocus) {
this.allowFocusInnerElement = allowFocus;
}
onPaginationChanged() {
const isPaging = this.gos.get("pagination");
const paginationPanelEnabled = isPaging && !this.gos.get("suppressPaginationPanel");
this.setDisplayed(paginationPanelEnabled);
if (!paginationPanelEnabled) {
return;
}
this.setupListeners();
this.enableOrDisableButtons();
this.updateLabels();
this.onPageSizeRelatedOptionsChange();
}
onPageSizeRelatedOptionsChange() {
this.pageSizeComp.toggleSelectDisplay(this.pageSizeComp.shouldShowPageSizeSelector());
}
setupListeners() {
if (!this.areListenersSetup) {
this.addManagedEventListeners({ paginationChanged: this.onPaginationChanged.bind(this) });
[
{ el: this.btFirst, fn: this.onBtFirst.bind(this) },
{ el: this.btPrevious, fn: this.onBtPrevious.bind(this) },
{ el: this.btNext, fn: this.onBtNext.bind(this) },
{ el: this.btLast, fn: this.onBtLast.bind(this) }
].forEach((item) => {
const { el, fn } = item;
this.addManagedListeners(el, {
click: fn,
keydown: (e) => {
if (e.key === KeyCode.ENTER || e.key === KeyCode.SPACE) {
e.preventDefault();
fn();
}
}
});
});
_addFocusableContainerListener(this.beans, this, this.getGui());
this.areListenersSetup = true;
}
}
onBtFirst() {
if (!this.previousAndFirstButtonsDisabled) {
this.pagination.goToFirstPage();
}
}
formatNumber(value) {
const userFunc = this.gos.getCallback("paginationNumberFormatter");
if (userFunc) {
const params = { value };
return userFunc(params);
}
return _formatNumberCommas(value, this.getLocaleTextFunc.bind(this));
}
getTemplate() {
const localeTextFunc = this.getLocaleTextFunc();
const strPage = localeTextFunc("page", "Page");
const strTo = localeTextFunc("to", "to");
const strOf = localeTextFunc("of", "of");
const strFirst = localeTextFunc("firstPage", "First Page");
const strPrevious = localeTextFunc("previousPage", "Previous Page");
const strNext = localeTextFunc("nextPage", "Next Page");
const strLast = localeTextFunc("lastPage", "Last Page");
const compId = this.getCompId();
return (
/* html */
`
${strTo}
${strOf}
${strPage}
${strOf}
`
);
}
onBtNext() {
if (!this.nextButtonDisabled) {
this.pagination.goToNextPage();
}
}
onBtPrevious() {
if (!this.previousAndFirstButtonsDisabled) {
this.pagination.goToPreviousPage();
}
}
onBtLast() {
if (!this.lastButtonDisabled) {
this.pagination.goToLastPage();
}
}
enableOrDisableButtons() {
const currentPage = this.pagination.getCurrentPage();
const maxRowFound = this.rowModel.isLastRowIndexKnown();
const totalPages = this.pagination.getTotalPages();
this.previousAndFirstButtonsDisabled = currentPage === 0;
this.toggleButtonDisabled(this.btFirst, this.previousAndFirstButtonsDisabled);
this.toggleButtonDisabled(this.btPrevious, this.previousAndFirstButtonsDisabled);
const zeroPagesToDisplay = this.isZeroPagesToDisplay();
const onLastPage = currentPage === totalPages - 1;
this.nextButtonDisabled = onLastPage || zeroPagesToDisplay;
this.lastButtonDisabled = !maxRowFound || zeroPagesToDisplay || currentPage === totalPages - 1;
this.toggleButtonDisabled(this.btNext, this.nextButtonDisabled);
this.toggleButtonDisabled(this.btLast, this.lastButtonDisabled);
}
toggleButtonDisabled(button, disabled) {
_setAriaDisabled(button, disabled);
button.classList.toggle("ag-disabled", disabled);
}
isZeroPagesToDisplay() {
const maxRowFound = this.rowModel.isLastRowIndexKnown();
const totalPages = this.pagination.getTotalPages();
return maxRowFound && totalPages === 0;
}
updateLabels() {
const lastPageFound = this.rowModel.isLastRowIndexKnown();
const totalPages = this.pagination.getTotalPages();
const masterRowCount = this.pagination.getMasterRowCount();
const rowCount = lastPageFound ? masterRowCount : null;
if (rowCount === 1) {
const firstRow = this.rowModel.getRow(0);
const hiddenGroupRow = firstRow && firstRow.group && !(firstRow.groupData || firstRow.aggData);
if (hiddenGroupRow) {
this.setTotalLabelsToZero();
return;
}
}
const currentPage = this.pagination.getCurrentPage();
const pageSize = this.pagination.getPageSize();
let startRow;
let endRow;
if (this.isZeroPagesToDisplay()) {
startRow = endRow = 0;
} else {
startRow = pageSize * currentPage + 1;
endRow = startRow + pageSize - 1;
if (lastPageFound && endRow > rowCount) {
endRow = rowCount;
}
}
const theoreticalEndRow = startRow + pageSize - 1;
const isLoadingPageSize = !lastPageFound && masterRowCount < theoreticalEndRow;
const lbFirstRowOnPage = this.formatNumber(startRow);
this.lbFirstRowOnPage.textContent = lbFirstRowOnPage;
let lbLastRowOnPage;
const localeTextFunc = this.getLocaleTextFunc();
if (isLoadingPageSize) {
lbLastRowOnPage = localeTextFunc("pageLastRowUnknown", "?");
} else {
lbLastRowOnPage = this.formatNumber(endRow);
}
this.lbLastRowOnPage.textContent = lbLastRowOnPage;
const pagesExist = totalPages > 0;
const toDisplay = pagesExist ? currentPage + 1 : 0;
const lbCurrent = this.formatNumber(toDisplay);
this.lbCurrent.textContent = lbCurrent;
let lbTotal;
let lbRecordCount;
if (lastPageFound) {
lbTotal = this.formatNumber(totalPages);
lbRecordCount = this.formatNumber(rowCount);
} else {
const moreText = localeTextFunc("more", "more");
lbTotal = moreText;
lbRecordCount = moreText;
}
this.lbTotal.textContent = lbTotal;
this.lbRecordCount.textContent = lbRecordCount;
this.announceAriaStatus(lbFirstRowOnPage, lbLastRowOnPage, lbRecordCount, lbCurrent, lbTotal);
}
announceAriaStatus(lbFirstRowOnPage, lbLastRowOnPage, lbRecordCount, lbCurrent, lbTotal) {
const localeTextFunc = this.getLocaleTextFunc();
const strPage = localeTextFunc("page", "Page");
const strTo = localeTextFunc("to", "to");
const strOf = localeTextFunc("of", "of");
const ariaRowStatus = `${lbFirstRowOnPage} ${strTo} ${lbLastRowOnPage} ${strOf} ${lbRecordCount}`;
const ariaPageStatus = `${strPage} ${lbCurrent} ${strOf} ${lbTotal}`;
if (ariaRowStatus !== this.ariaRowStatus) {
this.ariaRowStatus = ariaRowStatus;
this.ariaAnnounce?.announceValue(ariaRowStatus, "paginationRow");
}
if (ariaPageStatus !== this.ariaPageStatus) {
this.ariaPageStatus = ariaPageStatus;
this.ariaAnnounce?.announceValue(ariaPageStatus, "paginationPage");
}
}
setTotalLabelsToZero() {
const strZero = this.formatNumber(0);
this.lbFirstRowOnPage.textContent = strZero;
this.lbCurrent.textContent = strZero;
this.lbLastRowOnPage.textContent = strZero;
this.lbTotal.textContent = strZero;
this.lbRecordCount.textContent = strZero;
this.announceAriaStatus(strZero, strZero, strZero, strZero, strZero);
}
};
var PaginationSelector = {
selector: "AG-PAGINATION",
component: PaginationComp
};
// packages/ag-grid-community/src/pagination/paginationService.ts
var PaginationService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "pagination";
this.currentPage = 0;
this.topDisplayedRowIndex = 0;
this.bottomDisplayedRowIndex = 0;
this.masterRowCount = 0;
}
postConstruct() {
const gos = this.gos;
this.active = gos.get("pagination");
this.pageSizeFromGridOptions = gos.get("paginationPageSize");
this.paginateChildRows = this.isPaginateChildRows();
this.addManagedPropertyListener("pagination", this.onPaginationGridOptionChanged.bind(this));
this.addManagedPropertyListener("paginationPageSize", this.onPageSizeGridOptionChanged.bind(this));
}
getPaginationSelector() {
return PaginationSelector;
}
isPaginateChildRows() {
const gos = this.gos;
const shouldPaginate = gos.get("groupHideParentOfSingleChild") || // following two properties deprecated v32.3.0
gos.get("groupRemoveSingleChildren") || gos.get("groupRemoveLowestSingleChildren");
if (shouldPaginate) {
return true;
}
return gos.get("paginateChildRows");
}
onPaginationGridOptionChanged() {
this.active = this.gos.get("pagination");
this.calculatePages();
this.dispatchPaginationChangedEvent({ keepRenderedRows: true });
}
onPageSizeGridOptionChanged() {
this.setPageSize(this.gos.get("paginationPageSize"), "gridOptions");
}
goToPage(page) {
const currentPage = this.currentPage;
if (!this.active || currentPage === page || typeof currentPage !== "number") {
return;
}
this.currentPage = page;
this.calculatePages();
this.dispatchPaginationChangedEvent({ newPage: true });
}
isRowPresent(rowNode) {
const nodeIsInPage = rowNode.rowIndex >= this.topDisplayedRowIndex && rowNode.rowIndex <= this.bottomDisplayedRowIndex;
return nodeIsInPage;
}
getPageForIndex(index) {
return Math.floor(index / this.pageSize);
}
goToPageWithIndex(index) {
if (!this.active) {
return;
}
const pageNumber = this.getPageForIndex(index);
this.goToPage(pageNumber);
}
isRowInPage(row) {
if (!this.active) {
return true;
}
const rowPage = this.getPageForIndex(row.rowIndex);
return rowPage === this.currentPage;
}
getCurrentPage() {
return this.currentPage;
}
goToNextPage() {
this.goToPage(this.currentPage + 1);
}
goToPreviousPage() {
this.goToPage(this.currentPage - 1);
}
goToFirstPage() {
this.goToPage(0);
}
goToLastPage() {
const rowCount = this.beans.rowModel.getRowCount();
const lastPage = Math.floor(rowCount / this.pageSize);
this.goToPage(lastPage);
}
getPageSize() {
return this.pageSize;
}
getTotalPages() {
return this.totalPages;
}
/** This is only for state setting before data has been loaded */
setPage(page) {
this.currentPage = page;
}
get pageSize() {
if (_exists(this.pageSizeAutoCalculated) && this.gos.get("paginationAutoPageSize")) {
return this.pageSizeAutoCalculated;
}
if (_exists(this.pageSizeFromPageSizeSelector)) {
return this.pageSizeFromPageSizeSelector;
}
if (_exists(this.pageSizeFromInitialState)) {
return this.pageSizeFromInitialState;
}
if (_exists(this.pageSizeFromGridOptions)) {
return this.pageSizeFromGridOptions;
}
return this.defaultPageSize;
}
calculatePages() {
if (this.active) {
if (this.paginateChildRows) {
this.calculatePagesAllRows();
} else {
this.calculatePagesMasterRowsOnly();
}
} else {
this.calculatedPagesNotActive();
}
this.beans.pageBounds.calculateBounds(this.topDisplayedRowIndex, this.bottomDisplayedRowIndex);
}
unsetAutoCalculatedPageSize() {
if (this.pageSizeAutoCalculated === void 0) {
return;
}
const oldPageSize = this.pageSizeAutoCalculated;
this.pageSizeAutoCalculated = void 0;
if (this.pageSize === oldPageSize) {
return;
}
this.calculatePages();
this.dispatchPaginationChangedEvent({ newPageSize: true });
}
setPageSize(size, source) {
const currentSize = this.pageSize;
switch (source) {
case "autoCalculated":
this.pageSizeAutoCalculated = size;
break;
case "pageSizeSelector":
this.pageSizeFromPageSizeSelector = size;
if (this.currentPage !== 0) {
this.goToFirstPage();
}
break;
case "initialState":
this.pageSizeFromInitialState = size;
break;
case "gridOptions":
this.pageSizeFromGridOptions = size;
this.pageSizeFromInitialState = void 0;
this.pageSizeFromPageSizeSelector = void 0;
if (this.currentPage !== 0) {
this.goToFirstPage();
}
break;
}
if (currentSize !== this.pageSize) {
this.calculatePages();
this.dispatchPaginationChangedEvent({ newPageSize: true, keepRenderedRows: true });
}
}
setZeroRows() {
this.masterRowCount = 0;
this.topDisplayedRowIndex = 0;
this.bottomDisplayedRowIndex = -1;
this.currentPage = 0;
this.totalPages = 0;
}
adjustCurrentPageIfInvalid() {
const totalPages = this.totalPages;
if (this.currentPage >= totalPages) {
this.currentPage = totalPages - 1;
}
const currentPage = this.currentPage;
if (!isFinite(currentPage) || isNaN(currentPage) || currentPage < 0) {
this.currentPage = 0;
}
}
calculatePagesMasterRowsOnly() {
const rowModel = this.beans.rowModel;
const masterRowCount = rowModel.getTopLevelRowCount();
this.masterRowCount = masterRowCount;
if (masterRowCount <= 0) {
this.setZeroRows();
return;
}
const pageSize = this.pageSize;
const masterLastRowIndex = masterRowCount - 1;
this.totalPages = Math.floor(masterLastRowIndex / pageSize) + 1;
this.adjustCurrentPageIfInvalid();
const currentPage = this.currentPage;
const masterPageStartIndex = pageSize * currentPage;
let masterPageEndIndex = pageSize * (currentPage + 1) - 1;
if (masterPageEndIndex > masterLastRowIndex) {
masterPageEndIndex = masterLastRowIndex;
}
this.topDisplayedRowIndex = rowModel.getTopLevelRowDisplayedIndex(masterPageStartIndex);
if (masterPageEndIndex === masterLastRowIndex) {
this.bottomDisplayedRowIndex = rowModel.getRowCount() - 1;
} else {
const firstIndexNotToShow = rowModel.getTopLevelRowDisplayedIndex(masterPageEndIndex + 1);
this.bottomDisplayedRowIndex = firstIndexNotToShow - 1;
}
}
getMasterRowCount() {
return this.masterRowCount;
}
calculatePagesAllRows() {
const masterRowCount = this.beans.rowModel.getRowCount();
this.masterRowCount = masterRowCount;
if (masterRowCount === 0) {
this.setZeroRows();
return;
}
const { pageSize, currentPage } = this;
const maxRowIndex = masterRowCount - 1;
this.totalPages = Math.floor(maxRowIndex / pageSize) + 1;
this.adjustCurrentPageIfInvalid();
this.topDisplayedRowIndex = pageSize * currentPage;
this.bottomDisplayedRowIndex = pageSize * (currentPage + 1) - 1;
if (this.bottomDisplayedRowIndex > maxRowIndex) {
this.bottomDisplayedRowIndex = maxRowIndex;
}
}
calculatedPagesNotActive() {
this.setPageSize(void 0, "autoCalculated");
this.totalPages = 1;
this.currentPage = 0;
this.topDisplayedRowIndex = 0;
this.bottomDisplayedRowIndex = this.beans.rowModel.getRowCount() - 1;
}
dispatchPaginationChangedEvent(params) {
const { keepRenderedRows = false, newPage = false, newPageSize = false } = params;
this.eventSvc.dispatchEvent({
type: "paginationChanged",
animate: false,
newData: false,
newPage,
newPageSize,
keepRenderedRows
});
}
};
// packages/ag-grid-community/src/pagination/paginationModule.ts
var PaginationModule = {
moduleName: "Pagination",
version: VERSION,
beans: [PaginationService, PaginationAutoPageSizeService],
icons: {
// "go to first" button in pagination controls
first: "first",
// "go to previous" button in pagination controls
previous: "previous",
// "go to next" button in pagination controls
next: "next",
// "go to last" button in pagination controls
last: "last"
},
apiFunctions: {
paginationIsLastPageFound,
paginationGetPageSize,
paginationGetCurrentPage,
paginationGetTotalPages,
paginationGetRowCount,
paginationGoToNextPage,
paginationGoToPreviousPage,
paginationGoToFirstPage,
paginationGoToLastPage,
paginationGoToPage
},
dependsOn: [PopupModule]
};
// packages/ag-grid-community/src/api/rowApi.ts
function redrawRows(beans, params = {}) {
const rowNodes = params ? params.rowNodes : void 0;
beans.frameworkOverrides.wrapIncoming(() => beans.rowRenderer.redrawRows(rowNodes));
}
function setRowNodeExpanded(beans, rowNode, expanded, expandParents, forceSync) {
if (rowNode) {
if (expandParents && rowNode.parent && rowNode.parent.level !== -1) {
setRowNodeExpanded(beans, rowNode.parent, expanded, expandParents, forceSync);
}
rowNode.setExpanded(expanded, void 0, forceSync);
}
}
function getRowNode(beans, id) {
return beans.rowModel.getRowNode(id);
}
function addRenderedRowListener(beans, eventName, rowIndex, callback) {
beans.rowRenderer.addRenderedRowListener(eventName, rowIndex, callback);
}
function getRenderedNodes(beans) {
return beans.rowRenderer.getRenderedNodes();
}
function forEachNode(beans, callback, includeFooterNodes) {
beans.rowModel.forEachNode(callback, includeFooterNodes);
}
function getFirstDisplayedRowIndex(beans) {
return beans.rowRenderer.firstRenderedRow;
}
function getLastDisplayedRowIndex(beans) {
return beans.rowRenderer.lastRenderedRow;
}
function getDisplayedRowAtIndex(beans, index) {
return beans.rowModel.getRow(index);
}
function getDisplayedRowCount(beans) {
return beans.rowModel.getRowCount();
}
// packages/ag-grid-community/src/api/apiModule.ts
var RowApiModule = {
moduleName: "RowApi",
version: VERSION,
apiFunctions: {
redrawRows,
setRowNodeExpanded,
getRowNode,
addRenderedRowListener,
getRenderedNodes,
forEachNode,
getFirstDisplayedRowIndex,
getLastDisplayedRowIndex,
getDisplayedRowAtIndex,
getDisplayedRowCount
}
};
var ScrollApiModule = {
moduleName: "ScrollApi",
version: VERSION,
apiFunctions: {
getVerticalPixelRange,
getHorizontalPixelRange,
ensureColumnVisible,
ensureIndexVisible,
ensureNodeVisible
}
};
// packages/ag-grid-community/src/rendering/renderApi.ts
function setGridAriaProperty(beans, property, value) {
if (!property) {
return;
}
const eGrid = beans.ctrlsSvc.getGridBodyCtrl().eGridBody;
const ariaProperty = `aria-${property}`;
if (value === null) {
eGrid.removeAttribute(ariaProperty);
} else {
eGrid.setAttribute(ariaProperty, value);
}
}
function refreshCells(beans, params = {}) {
beans.frameworkOverrides.wrapIncoming(() => beans.rowRenderer.refreshCells(params));
}
function refreshHeader(beans) {
beans.frameworkOverrides.wrapIncoming(
() => beans.ctrlsSvc.getHeaderRowContainerCtrls().forEach((c) => c.refresh())
);
}
function isAnimationFrameQueueEmpty(beans) {
return beans.animationFrameSvc?.isQueueEmpty() ?? true;
}
function flushAllAnimationFrames(beans) {
beans.animationFrameSvc?.flushAllFrames();
}
function getSizesForCurrentTheme(beans) {
return {
rowHeight: _getRowHeightAsNumber(beans),
headerHeight: getHeaderHeight(beans)
};
}
function getCellRendererInstances(beans, params = {}) {
const cellRenderers = [];
beans.rowRenderer.getCellCtrls(params.rowNodes, params.columns).forEach((cellCtrl) => {
const cellRenderer = cellCtrl.getCellRenderer();
if (cellRenderer != null) {
cellRenderers.push(_unwrapUserComp(cellRenderer));
}
});
if (params.columns?.length) {
return cellRenderers;
}
const fullWidthRenderers = [];
const rowIdMap = mapRowNodes(params.rowNodes);
beans.rowRenderer.getAllRowCtrls().forEach((rowCtrl) => {
if (rowIdMap && !isRowInMap(rowCtrl.rowNode, rowIdMap)) {
return;
}
if (!rowCtrl.isFullWidth()) {
return;
}
const renderers = rowCtrl.getFullWidthCellRenderers();
for (let i = 0; i < renderers.length; i++) {
const renderer = renderers[i];
if (renderer != null) {
fullWidthRenderers.push(_unwrapUserComp(renderer));
}
}
});
return [...fullWidthRenderers, ...cellRenderers];
}
// packages/ag-grid-community/src/rendering/renderModule.ts
var RenderApiModule = {
moduleName: "RenderApi",
version: VERSION,
apiFunctions: {
setGridAriaProperty,
refreshCells,
refreshHeader,
isAnimationFrameQueueEmpty,
flushAllAnimationFrames,
getSizesForCurrentTheme,
getCellRendererInstances
}
};
// packages/ag-grid-community/src/columnAutosize/columnAutosizeApi.ts
function sizeColumnsToFit(beans, paramsOrGridWidth) {
if (typeof paramsOrGridWidth === "number") {
beans.colAutosize?.sizeColumnsToFit(paramsOrGridWidth, "api");
} else {
beans.colAutosize?.sizeColumnsToFitGridBody(paramsOrGridWidth);
}
}
function autoSizeColumns(beans, keys, skipHeader) {
beans.colAutosize?.autoSizeCols({ colKeys: keys, skipHeader, source: "api" });
}
function autoSizeAllColumns(beans, skipHeader) {
beans.colAutosize?.autoSizeAllColumns("api", skipHeader);
}
// packages/ag-grid-community/src/columnAutosize/columnAutosizeService.ts
var ColumnAutosizeService = class extends 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;
const { animationFrameSvc, renderStatus, colModel, autoWidthCalc, visibleCols } = this.beans;
animationFrameSvc?.flushAllFrames();
if (this.timesDelayed < 5 && renderStatus && !renderStatus.areHeaderCellsRendered()) {
this.timesDelayed++;
setTimeout(() => {
if (this.isAlive()) {
this.autoSizeCols(params);
}
});
return;
}
this.timesDelayed = 0;
const columnsAutoSized = [];
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 || isRowNumberCol(column)) {
return;
}
if (columnsAutoSized.indexOf(column) >= 0) {
return;
}
const preferredWidth = autoWidthCalc.getPreferredWidthForColumn(column, shouldSkipHeader);
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);
}
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 = /* @__PURE__ */ 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(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 = () => {
const keys = [];
const leafCols = columnGroup.getDisplayedLeafColumns();
leafCols.forEach((column) => {
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;
const bodyViewportWidth = _getInnerWidth(gridBodyCtrl.eGridBody);
const availableWidth = bodyViewportWidth - scrollWidthToRemove;
if (availableWidth > 0) {
this.sizeColumnsToFit(availableWidth, "sizeColumnsToFit", false, params);
return;
}
if (nextTimeout === void 0) {
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 {
_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;
});
}
const allDisplayedColumns = this.beans.visibleCols.allCols;
const doColumnsAlreadyFit = gridWidth === 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);
}
});
const colsToDispatchEventFor = colsToSpread.slice(0);
let finishedResizing = false;
const moveToNotSpread = (column) => {
_removeFromArray(colsToSpread, column);
colsToNotSpread.push(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 - getWidthOfColsInList(colsToNotSpread);
if (availablePixels <= 0) {
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 / getWidthOfColsInList(colsToSpread);
let pixelsForLastCol = availablePixels;
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) {
newWidth = pixelsForLastCol;
}
column.setActualWidth(newWidth, source, true);
pixelsForLastCol -= newWidth;
}
}
}
colsToDispatchEventFor.forEach((col) => {
col.fireColumnWidthChangedEvent(source);
});
const visibleCols = this.beans.visibleCols;
visibleCols.setLeftValues(source);
visibleCols.updateBodyWidths();
if (silent) {
return;
}
dispatchColumnResizedEvent(this.eventSvc, colsToDispatchEventFor, true, source);
}
applyAutosizeStrategy() {
const autoSizeStrategy = this.gos.get("autoSizeStrategy");
if (!autoSizeStrategy) {
return;
}
const { type } = autoSizeStrategy;
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;
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();
}
};
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;
}
// packages/ag-grid-community/src/columnAutosize/columnAutosizeModule.ts
var ColumnAutoSizeModule = {
moduleName: "ColumnAutoSize",
version: VERSION,
beans: [ColumnAutosizeService],
apiFunctions: {
sizeColumnsToFit,
autoSizeColumns,
autoSizeAllColumns
},
dependsOn: [AutoWidthModule]
};
// packages/ag-grid-community/src/pinnedRowModel/pinnedRowApi.ts
function getPinnedTopRowCount(beans) {
return beans.pinnedRowModel?.getPinnedTopRowCount() ?? 0;
}
function getPinnedBottomRowCount(beans) {
return beans.pinnedRowModel?.getPinnedBottomRowCount() ?? 0;
}
function getPinnedTopRow(beans, index) {
return beans.pinnedRowModel?.getPinnedTopRow(index);
}
function getPinnedBottomRow(beans, index) {
return beans.pinnedRowModel?.getPinnedBottomRow(index);
}
// packages/ag-grid-community/src/pinnedRowModel/pinnedRowModel.ts
var PinnedRowModel = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "pinnedRowModel";
this.nextId = 0;
this.pinnedTopRows = { cache: {}, order: [] };
this.pinnedBottomRows = { cache: {}, order: [] };
}
postConstruct() {
const gos = this.gos;
this.setPinnedRowData(gos.get("pinnedTopRowData"), "top");
this.setPinnedRowData(gos.get("pinnedBottomRowData"), "bottom");
this.addManagedPropertyListener("pinnedTopRowData", (e) => this.setPinnedRowData(e.currentValue, "top"));
this.addManagedPropertyListener("pinnedBottomRowData", (e) => this.setPinnedRowData(e.currentValue, "bottom"));
this.addManagedEventListeners({ gridStylesChanged: this.onGridStylesChanges.bind(this) });
}
isEmpty(floating) {
return this.getCache(floating).order.length === 0;
}
isRowsToRender(floating) {
return !this.isEmpty(floating);
}
onGridStylesChanges(e) {
if (e.rowHeightChanged) {
const estimateRowHeight = (rowNode) => {
rowNode.setRowHeight(rowNode.rowHeight, true);
};
forEach(this.pinnedBottomRows, estimateRowHeight);
forEach(this.pinnedTopRows, estimateRowHeight);
}
}
ensureRowHeightsValid() {
let anyChange = false;
let rowTop = 0;
const updateRowHeight = (rowNode) => {
if (rowNode.rowHeightEstimated) {
const rowHeight = _getRowHeightForNode(this.beans, rowNode);
rowNode.setRowTop(rowTop);
rowNode.setRowHeight(rowHeight.height);
rowTop += rowHeight.height;
anyChange = true;
}
};
forEach(this.pinnedBottomRows, updateRowHeight);
rowTop = 0;
forEach(this.pinnedTopRows, updateRowHeight);
this.eventSvc.dispatchEvent({
type: "pinnedHeightChanged"
});
return anyChange;
}
setPinnedRowData(rowData, floating) {
this.updateNodesFromRowData(rowData, floating);
this.eventSvc.dispatchEvent({
type: "pinnedRowDataChanged"
});
}
/**
* Updates existing RowNode instances and creates new ones if necessary
*
* Setting data as `undefined` will clear row nodes
*/
updateNodesFromRowData(allData, floating) {
const nodes = this.getCache(floating);
if (allData === void 0) {
nodes.order.length = 0;
nodes.cache = {};
return;
}
const getRowId = _getRowIdCallback(this.gos);
const idPrefix = floating === "top" ? ROW_ID_PREFIX_TOP_PINNED : ROW_ID_PREFIX_BOTTOM_PINNED;
const nodesToRemove = new Set(nodes.order);
const newOrder = [];
const dataIds = /* @__PURE__ */ new Set();
let nextRowTop = 0;
let i = -1;
for (const data of allData) {
const id = getRowId?.({ data, level: 0, rowPinned: floating }) ?? idPrefix + this.nextId++;
if (dataIds.has(id)) {
_warn(96, { id, data });
continue;
}
i++;
dataIds.add(id);
newOrder.push(id);
const existingNode = getById(nodes, id);
if (existingNode !== void 0) {
if (existingNode.data !== data) {
existingNode.setData(data);
}
nextRowTop += this.setRowTopAndRowIndex(existingNode, nextRowTop, i);
nodesToRemove.delete(id);
} else {
const rowNode = new RowNode(this.beans);
rowNode.id = id;
rowNode.data = data;
rowNode.rowPinned = floating;
nextRowTop += this.setRowTopAndRowIndex(rowNode, nextRowTop, i);
nodes.cache[id] = rowNode;
nodes.order.push(id);
}
}
nodesToRemove.forEach((id) => {
getById(nodes, id)?.clearRowTopAndRowIndex();
delete nodes.cache[id];
});
nodes.order = newOrder;
}
setRowTopAndRowIndex(rowNode, rowTop, rowIndex) {
rowNode.setRowTop(rowTop);
rowNode.setRowHeight(_getRowHeightForNode(this.beans, rowNode).height);
rowNode.setRowIndex(rowIndex);
return rowNode.rowHeight;
}
getPinnedTopTotalHeight() {
return getTotalHeight(this.pinnedTopRows);
}
getPinnedBottomTotalHeight() {
return getTotalHeight(this.pinnedBottomRows);
}
getPinnedTopRowCount() {
return getSize(this.pinnedTopRows);
}
getPinnedBottomRowCount() {
return getSize(this.pinnedBottomRows);
}
getPinnedTopRow(index) {
return getByIndex(this.pinnedTopRows, index);
}
getPinnedBottomRow(index) {
return getByIndex(this.pinnedBottomRows, index);
}
getPinnedRowById(id, floating) {
return getById(this.getCache(floating), id);
}
forEachPinnedRow(floating, callback) {
return forEach(this.getCache(floating), callback);
}
getCache(floating) {
return floating === "top" ? this.pinnedTopRows : this.pinnedBottomRows;
}
};
function getTotalHeight(rowNodes) {
const size = getSize(rowNodes);
if (size === 0) {
return 0;
}
const node = getByIndex(rowNodes, size - 1);
if (node === void 0) {
return 0;
}
return node.rowTop + node.rowHeight;
}
function getById(cache, id) {
return cache.cache[id];
}
function getByIndex(cache, i) {
return getById(cache, cache.order[i]);
}
function forEach(cache, callback) {
cache.order.forEach((id, index) => {
const node = getById(cache, id);
node && callback(node, index);
});
}
function getSize(cache) {
return cache.order.length;
}
// packages/ag-grid-community/src/pinnedRowModel/pinnedRowModule.ts
var PinnedRowModule = {
moduleName: "PinnedRow",
version: VERSION,
beans: [PinnedRowModel],
apiFunctions: {
getPinnedTopRowCount,
getPinnedBottomRowCount,
getPinnedTopRow,
getPinnedBottomRow
}
};
// packages/ag-grid-community/src/rendering/spanning/spannedCellCtrl.ts
var SpannedCellCtrl = class extends CellCtrl {
constructor(cellSpan, rowCtrl, beans) {
super(cellSpan.col, cellSpan.firstNode, beans, rowCtrl);
this.cellSpan = cellSpan;
this.SPANNED_CELL_CSS_CLASS = "ag-spanned-cell";
}
setComp(comp, eCell, eWrapper, eCellWrapper, printLayout, startEditing, compBean) {
this.eWrapper = eWrapper;
super.setComp(comp, eCell, eWrapper, eCellWrapper, printLayout, startEditing, compBean);
this.setAriaRowSpan();
this.refreshAriaRowIndex();
}
isCellSpanning() {
return true;
}
getCellSpan() {
return this.cellSpan;
}
/**
* When cell is spanning, ensure row index is also available on the cell
*/
refreshAriaRowIndex() {
if (this.rowNode.rowIndex == null) {
return;
}
_setAriaRowIndex(this.eGui, this.rowNode.rowIndex);
}
/**
* When cell is spanning, ensure row index is also available on the cell
*/
setAriaRowSpan() {
_setAriaRowSpan(this.eGui, this.cellSpan.spannedNodes.size);
}
shouldRestoreFocus() {
return this.beans.focusSvc.shouldRestoreFocus(this.cellSpan);
}
onFocusOut() {
this.focusedCellPosition = void 0;
super.onFocusOut();
}
// not ideal, for tabbing need to force the focused position
setFocusedCellPosition(cellPos) {
this.focusedCellPosition = cellPos;
}
getFocusedCellPosition() {
return this.focusedCellPosition ?? this.cellPosition;
}
isCellFocused() {
const focusedCell = this.beans.focusSvc.getFocusedCell();
return !!focusedCell && this.cellSpan.doesSpanContain(focusedCell);
}
applyStaticCssClasses() {
super.applyStaticCssClasses();
this.comp.addOrRemoveCssClass(this.SPANNED_CELL_CSS_CLASS, true);
}
onCellFocused(event) {
const { beans } = this;
if (_isCellFocusSuppressed(beans)) {
this.focusedCellPosition = void 0;
return;
}
const cellFocused = this.isCellFocused();
if (!cellFocused) {
this.focusedCellPosition = void 0;
}
if (event && cellFocused) {
this.focusedCellPosition = {
rowIndex: event.rowIndex,
rowPinned: event.rowPinned,
column: event.column
// fix
};
}
super.onCellFocused(event);
}
getRootElement() {
return this.eWrapper;
}
};
// packages/ag-grid-community/src/rendering/spanning/spannedRowCtrl.ts
var SpannedRowCtrl = class extends RowCtrl {
onRowIndexChanged() {
super.onRowIndexChanged();
this.getAllCellCtrls().forEach((c) => c.refreshAriaRowIndex());
}
getInitialRowClasses(_rowContainerType) {
return ["ag-spanned-row"];
}
getNewCellCtrl(col) {
const cellSpan = this.beans.rowSpanSvc?.getCellSpan(col, this.rowNode);
if (!cellSpan) {
return;
}
const firstRowOfSpan = cellSpan.firstNode !== this.rowNode;
if (firstRowOfSpan) {
return;
}
return new SpannedCellCtrl(cellSpan, this, this.beans);
}
shouldRecreateCellCtrl(cell) {
const cellSpan = this.beans.rowSpanSvc?.getCellSpan(cell.column, this.rowNode);
if (!cellSpan) {
return true;
}
const firstRowOfSpan = cellSpan.firstNode !== this.rowNode;
if (firstRowOfSpan) {
return true;
}
return cell.getCellSpan() !== cellSpan;
}
/**
* Below overrides are explicitly disabling styling and other unwanted behaviours for spannedRowCtrl
*/
// row height should be 0 in spanned row - they're only included for purpose of aria
onRowHeightChanged() {
}
// no styling spanned rows
refreshFirstAndLastRowStyles() {
}
// no hover functionality for spanned rows
addHoverFunctionality() {
}
resetHoveredStatus() {
}
};
// packages/ag-grid-community/src/rendering/spanning/spannedRowRenderer.ts
var SpannedRowRenderer = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "spannedRowRenderer";
this.topCtrls = /* @__PURE__ */ new Map();
this.bottomCtrls = /* @__PURE__ */ new Map();
this.centerCtrls = /* @__PURE__ */ new Map();
}
postConstruct() {
this.addManagedEventListeners({
displayedRowsChanged: this.createAllCtrls.bind(this)
});
}
createAllCtrls() {
this.createCtrls("top");
this.createCtrls("bottom");
this.createCtrls("center");
}
/**
* When displayed rows or cols change, the spanned cell ctrls need to update
*/
createCtrls(ctrlsKey) {
const { rowSpanSvc } = this.beans;
const ctrlsName = `${ctrlsKey}Ctrls`;
const previousCtrls = this[ctrlsName];
const previousCtrlsSize = previousCtrls.size;
const rowCtrls = this.getAllRelevantRowControls(ctrlsKey);
const newRowCtrls = /* @__PURE__ */ new Map();
let hasNewSpans = false;
for (const ctrl of rowCtrls) {
if (!ctrl.isAlive()) {
continue;
}
rowSpanSvc?.forEachSpannedColumn(ctrl.rowNode, (col, cellSpan) => {
if (newRowCtrls.has(cellSpan.firstNode)) {
return;
}
const existingCtrl = previousCtrls.get(cellSpan.firstNode);
if (existingCtrl) {
newRowCtrls.set(cellSpan.firstNode, existingCtrl);
previousCtrls.delete(cellSpan.firstNode);
return;
}
hasNewSpans = true;
const newCtrl = new SpannedRowCtrl(cellSpan.firstNode, this.beans, false, false, false);
newRowCtrls.set(cellSpan.firstNode, newCtrl);
});
}
this[ctrlsName] = newRowCtrls;
const sameCount = newRowCtrls.size === previousCtrlsSize;
if (!hasNewSpans && sameCount)
return;
for (const oldCtrl of previousCtrls.values()) {
oldCtrl.destroyFirstPass(true);
oldCtrl.destroySecondPass();
}
this.dispatchLocalEvent({
type: `spannedRowsUpdated`,
ctrlsKey
});
}
// cannot use getAllRowCtrls as it returns this services row ctrls.
getAllRelevantRowControls(ctrlsKey) {
const { rowRenderer } = this.beans;
switch (ctrlsKey) {
case "top":
return rowRenderer.topRowCtrls;
case "bottom":
return rowRenderer.bottomRowCtrls;
case "center":
return rowRenderer.allRowCtrls;
}
}
getCellByPosition(cellPosition) {
const { rowSpanSvc } = this.beans;
const cellSpan = rowSpanSvc?.getCellSpanByPosition(cellPosition);
if (!cellSpan) {
return void 0;
}
const ctrlsName = `${_normalisePinnedValue(cellPosition.rowPinned)}Ctrls`;
const ctrl = this[ctrlsName].get(cellSpan.firstNode);
if (!ctrl) {
return void 0;
}
return ctrl.getAllCellCtrls().find((cellCtrl) => cellCtrl.column === cellPosition.column);
}
getCtrls(container) {
const ctrlsName = `${container}Ctrls`;
return [...this[ctrlsName].values()];
}
destroyRowCtrls(container) {
const ctrlsName = `${container}Ctrls`;
for (const ctrl of this[ctrlsName].values()) {
ctrl.destroyFirstPass(true);
ctrl.destroySecondPass();
}
this[ctrlsName] = /* @__PURE__ */ new Map();
}
destroy() {
super.destroy();
this.destroyRowCtrls("top");
this.destroyRowCtrls("bottom");
this.destroyRowCtrls("center");
}
};
var _normalisePinnedValue = (pinned) => {
return pinned ?? "center";
};
// packages/ag-grid-community/src/rendering/spanning/rowSpanCache.ts
var CellSpan = class {
constructor(col, firstNode) {
this.col = col;
this.firstNode = firstNode;
// used for distinguishing between types
this.cellSpan = true;
this.spannedNodes = /* @__PURE__ */ new Set();
this.addSpannedNode(firstNode);
}
addSpannedNode(node) {
this.spannedNodes.add(node);
this.lastNode = node;
}
getLastNode() {
return this.lastNode;
}
getCellHeight() {
return this.lastNode.rowTop + this.lastNode.rowHeight - this.firstNode.rowTop - 1;
}
doesSpanContain(cellPosition) {
if (cellPosition.column !== this.col) {
return false;
}
if (cellPosition.rowPinned != this.firstNode.rowPinned) {
return false;
}
return this.firstNode.rowIndex <= cellPosition.rowIndex && cellPosition.rowIndex <= this.lastNode.rowIndex;
}
/**
* Gets the auto height value for last node in the spanned cell.
* The first node is used to store the auto height for the cell, but the additional height for this cell
* needs applied to the last row in the span.
*/
getLastNodeAutoHeight() {
const autoHeight = this.firstNode.__autoHeights?.[this.col.getColId()];
if (autoHeight == null) {
return void 0;
}
let allButLastHeights = 0;
this.spannedNodes.forEach((node) => {
if (node === this.lastNode)
return;
allButLastHeights += node.rowHeight;
});
return autoHeight - allButLastHeights;
}
};
var RowSpanCache = class extends BeanStub {
constructor(column) {
super();
this.column = column;
}
buildCache(pinned) {
const {
column,
beans: { gos, pinnedRowModel, rowModel, valueSvc }
} = this;
const { colDef } = column;
const newMap = /* @__PURE__ */ new Map();
const isFullWidthCellFunc = gos.getCallback("isFullWidthRow");
const equalsFnc = colDef.equals;
const customCompare = colDef.spanRows;
const isCustomCompare = typeof customCompare === "function";
let lastNode = null;
let spanData = null;
let lastValue;
const setNewHead = (node, value) => {
lastNode = node;
spanData = null;
lastValue = value;
};
const checkNodeForCache = (node) => {
const doesNodeSupportSpanning = !node.isExpandable() && !node.group && !node.detail && (isFullWidthCellFunc ? !isFullWidthCellFunc({ rowNode: node }) : true);
if (node.rowIndex == null || !doesNodeSupportSpanning) {
setNewHead(null, null);
return;
}
if (lastNode == null || node.level !== lastNode.level || // no span across groups
node.footer || spanData && node.rowIndex - 1 !== spanData?.getLastNode().rowIndex) {
setNewHead(node, valueSvc.getValue(column, node));
return;
}
const value = valueSvc.getValue(column, node);
if (isCustomCompare) {
const params = _addGridCommonParams(gos, {
valueA: lastValue,
nodeA: lastNode,
valueB: value,
nodeB: node,
column,
colDef
});
if (!customCompare(params)) {
setNewHead(node, value);
return;
}
} else {
if (equalsFnc ? !equalsFnc(lastValue, value) : lastValue !== value) {
setNewHead(node, value);
return;
}
}
if (!spanData) {
spanData = new CellSpan(column, lastNode);
newMap.set(lastNode, spanData);
}
spanData.addSpannedNode(node);
newMap.set(node, spanData);
};
switch (pinned) {
case "center":
rowModel.forEachDisplayedNode?.(checkNodeForCache);
break;
case "top":
pinnedRowModel?.forEachPinnedRow("top", checkNodeForCache);
break;
case "bottom":
pinnedRowModel?.forEachPinnedRow("bottom", checkNodeForCache);
break;
}
this[`${pinned}ValueNodeMap`] = newMap;
}
isCellSpanning(node) {
return !!this.getCellSpan(node);
}
getCellSpan(node) {
const map = this[`${_normalisePinnedValue(node.rowPinned)}ValueNodeMap`];
return map.get(node);
}
};
// packages/ag-grid-community/src/rendering/spanning/rowSpanService.ts
var RowSpanService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "rowSpanSvc";
this.spanningColumns = /* @__PURE__ */ new Map();
// debounced to allow spannedRowRenderer to run first, removing any old spanned rows
this.debouncePinnedEvent = _debounce(this, this.dispatchCellsUpdatedEvent.bind(this, true), 0);
this.debounceModelEvent = _debounce(this, this.dispatchCellsUpdatedEvent.bind(this, false), 0);
this.pinnedTimeout = null;
this.modelTimeout = null;
}
postConstruct() {
this.addManagedEventListeners({
modelUpdated: this.buildModelCaches.bind(this),
pinnedRowDataChanged: this.buildPinnedCaches.bind(this)
});
}
/**
* When a new column is created with spanning (or spanning changes for a column)
* @param column column that is now spanning
*/
register(column) {
const { gos } = this.beans;
if (!gos.get("enableCellSpan")) {
return;
}
if (this.spanningColumns.has(column)) {
return;
}
const cache = this.createManagedBean(new RowSpanCache(column));
this.spanningColumns.set(column, cache);
cache.buildCache("top");
cache.buildCache("bottom");
cache.buildCache("center");
this.debouncePinnedEvent();
this.debounceModelEvent();
}
dispatchCellsUpdatedEvent(pinned) {
this.dispatchLocalEvent({ type: "spannedCellsUpdated", pinned });
}
/**
* When a new column is destroyed with spanning (or spanning changes for a column)
* @param column column that is now spanning
*/
deregister(column) {
this.spanningColumns.delete(column);
}
// called by rowNode when data changes, as this could be a hot path it's debounced
// it uses timeouts instead of debounce so that it can be cancelled by `modelUpdated`
// which is expected to run immediately (to exec before the rowRenderer)
onRowDataUpdated(node) {
const { spannedRowRenderer } = this.beans;
if (node.rowPinned) {
if (this.pinnedTimeout != null) {
return;
}
this.pinnedTimeout = window.setTimeout(() => {
this.pinnedTimeout = null;
this.buildPinnedCaches();
spannedRowRenderer?.createCtrls("top");
spannedRowRenderer?.createCtrls("bottom");
}, 0);
return;
}
if (this.modelTimeout != null) {
return;
}
this.modelTimeout = window.setTimeout(() => {
this.modelTimeout = null;
this.buildModelCaches();
spannedRowRenderer?.createCtrls("center");
}, 0);
}
buildModelCaches() {
if (this.modelTimeout != null) {
clearTimeout(this.modelTimeout);
}
this.spanningColumns.forEach((cache) => cache.buildCache("center"));
this.debounceModelEvent();
}
buildPinnedCaches() {
if (this.pinnedTimeout != null) {
clearTimeout(this.pinnedTimeout);
}
this.spanningColumns.forEach((cache) => {
cache.buildCache("top");
cache.buildCache("bottom");
});
this.debouncePinnedEvent();
}
isCellSpanning(col, rowNode) {
const cache = this.spanningColumns.get(col);
if (!cache) {
return false;
}
return cache.isCellSpanning(rowNode);
}
getCellSpanByPosition(position) {
const { pinnedRowModel, rowModel } = this.beans;
const col = position.column;
const index = position.rowIndex;
const cache = this.spanningColumns.get(col);
if (!cache) {
return void 0;
}
let node;
switch (position.rowPinned) {
case "top":
node = pinnedRowModel?.getPinnedTopRow(index);
break;
case "bottom":
node = pinnedRowModel?.getPinnedBottomRow(index);
break;
default:
node = rowModel.getRow(index);
}
if (!node) {
return void 0;
}
return cache.getCellSpan(node);
}
getCellStart(position) {
const span = this.getCellSpanByPosition(position);
if (!span) {
return position;
}
return { ...position, rowIndex: span.firstNode.rowIndex };
}
getCellEnd(position) {
const span = this.getCellSpanByPosition(position);
if (!span) {
return position;
}
return { ...position, rowIndex: span.getLastNode().rowIndex };
}
/**
* Look-up a spanned cell given a col and node as position indicators
*
* @param col a column to lookup a span at this position
* @param rowNode a node that may be spanned at this position
* @returns the CellSpan object if one exists
*/
getCellSpan(col, rowNode) {
const cache = this.spanningColumns.get(col);
if (!cache) {
return void 0;
}
return cache.getCellSpan(rowNode);
}
forEachSpannedColumn(rowNode, callback) {
for (const [col, cache] of this.spanningColumns) {
if (cache.isCellSpanning(rowNode)) {
const spanningNode = cache.getCellSpan(rowNode);
callback(col, spanningNode);
}
}
}
destroy() {
super.destroy();
this.spanningColumns.clear();
}
};
// packages/ag-grid-community/src/rendering/spanning/cellSpanModule.ts
var CellSpanModule = {
moduleName: "CellSpan",
version: VERSION,
beans: [RowSpanService, SpannedRowRenderer]
};
// packages/ag-grid-community/src/styling/cellCustomStyleFeature.ts
var CellCustomStyleFeature = class extends BeanStub {
constructor(cellCtrl, beans) {
super();
this.cellCtrl = cellCtrl;
this.staticClasses = [];
this.beans = beans;
this.column = cellCtrl.column;
}
setComp(comp) {
this.cellComp = comp;
this.applyUserStyles();
this.applyCellClassRules();
this.applyClassesFromColDef();
}
applyCellClassRules() {
const { column, cellComp } = this;
const colDef = column.colDef;
const cellClassRules = colDef.cellClassRules;
const cellClassParams = this.getCellClassParams(column, colDef);
processClassRules(
this.beans.expressionSvc,
// if current was previous, skip
cellClassRules === this.cellClassRules ? void 0 : this.cellClassRules,
cellClassRules,
cellClassParams,
(className) => cellComp.addOrRemoveCssClass(className, true),
(className) => cellComp.addOrRemoveCssClass(className, false)
);
this.cellClassRules = cellClassRules;
}
applyUserStyles() {
const column = this.column;
const colDef = column.colDef;
const cellStyle = colDef.cellStyle;
if (!cellStyle) {
return;
}
let styles;
if (typeof cellStyle === "function") {
const cellStyleParams = this.getCellClassParams(column, colDef);
styles = cellStyle(cellStyleParams);
} else {
styles = cellStyle;
}
if (styles) {
this.cellComp.setUserStyles(styles);
}
}
applyClassesFromColDef() {
const { column, cellComp } = this;
const colDef = column.colDef;
const cellClassParams = this.getCellClassParams(column, colDef);
this.staticClasses.forEach((className) => cellComp.addOrRemoveCssClass(className, false));
const newStaticClasses = this.beans.cellStyles.getStaticCellClasses(colDef, cellClassParams);
this.staticClasses = newStaticClasses;
newStaticClasses.forEach((className) => cellComp.addOrRemoveCssClass(className, true));
}
getCellClassParams(column, colDef) {
const { value, rowNode } = this.cellCtrl;
return _addGridCommonParams(this.beans.gos, {
value,
data: rowNode.data,
node: rowNode,
colDef,
column,
rowIndex: rowNode.rowIndex
});
}
};
// packages/ag-grid-community/src/styling/cellStyleService.ts
var CellStyleService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "cellStyles";
}
processAllCellClasses(colDef, params, onApplicableClass, onNotApplicableClass) {
processClassRules(
this.beans.expressionSvc,
void 0,
colDef.cellClassRules,
params,
onApplicableClass,
onNotApplicableClass
);
this.processStaticCellClasses(colDef, params, onApplicableClass);
}
getStaticCellClasses(colDef, params) {
const { cellClass } = colDef;
if (!cellClass) {
return [];
}
let classOrClasses;
if (typeof cellClass === "function") {
const cellClassFunc = cellClass;
classOrClasses = cellClassFunc(params);
} else {
classOrClasses = cellClass;
}
if (typeof classOrClasses === "string") {
classOrClasses = [classOrClasses];
}
return classOrClasses || [];
}
createCellCustomStyleFeature(ctrl, beans) {
return new CellCustomStyleFeature(ctrl, beans);
}
processStaticCellClasses(colDef, params, onApplicableClass) {
const classOrClasses = this.getStaticCellClasses(colDef, params);
classOrClasses.forEach((cssClassItem) => {
onApplicableClass(cssClassItem);
});
}
};
// packages/ag-grid-community/src/styling/stylingModule.ts
var CellStyleModule = {
moduleName: "CellStyle",
version: VERSION,
beans: [CellStyleService]
};
var RowStyleModule = {
moduleName: "RowStyle",
version: VERSION,
beans: [RowStyleService]
};
// packages/ag-grid-community/src/columns/columnHover/columnHoverApi.ts
function isColumnHovered(beans, column) {
return !!beans.colHover?.isHovered(column);
}
// packages/ag-grid-community/src/columns/columnHover/hoverFeature.ts
var HoverFeature = class extends 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)
});
}
}
};
// packages/ag-grid-community/src/columns/columnHover/columnHoverService.ts
var CSS_COLUMN_HOVER = "ag-column-hover";
var ColumnHoverService = class extends 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(columns, eGui));
}
updateState(columns) {
this.selectedColumns = columns;
this.eventSvc.dispatchEvent({
type: "columnHoverChanged"
});
}
};
// packages/ag-grid-community/src/columns/columnHover/columnHoverModule.ts
var ColumnHoverModule = {
moduleName: "ColumnHover",
version: VERSION,
beans: [ColumnHoverService],
apiFunctions: {
isColumnHovered
}
};
// packages/ag-grid-community/src/misc/apiEvents/apiEventService.ts
var ApiEventService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "apiEventSvc";
this.syncListeners = /* @__PURE__ */ new Map();
this.asyncListeners = /* @__PURE__ */ new Map();
this.syncGlobalListeners = /* @__PURE__ */ new Set();
this.globalListenerPairs = /* @__PURE__ */ new Map();
}
postConstruct() {
this.wrapSvc = this.beans.frameworkOverrides.createGlobalEventListenerWrapper?.();
}
addEventListener(eventType, userListener) {
const listener = this.wrapSvc?.wrap(userListener) ?? userListener;
const async = !ALWAYS_SYNC_GLOBAL_EVENTS.has(eventType);
const listeners = async ? this.asyncListeners : this.syncListeners;
if (!listeners.has(eventType)) {
listeners.set(eventType, /* @__PURE__ */ new Set());
}
listeners.get(eventType).add(listener);
this.eventSvc.addEventListener(eventType, listener, async);
}
removeEventListener(eventType, userListener) {
const listener = this.wrapSvc?.unwrap(userListener) ?? userListener;
const asyncListeners = this.asyncListeners.get(eventType);
const hasAsync = !!asyncListeners?.delete(listener);
if (!hasAsync) {
this.syncListeners.get(eventType)?.delete(listener);
}
this.eventSvc.removeEventListener(eventType, listener, hasAsync);
}
addGlobalListener(userListener) {
const listener = this.wrapSvc?.wrapGlobal(userListener) ?? userListener;
const syncListener = (eventType, event) => {
if (ALWAYS_SYNC_GLOBAL_EVENTS.has(eventType)) {
listener(eventType, event);
}
};
const asyncListener = (eventType, event) => {
if (!ALWAYS_SYNC_GLOBAL_EVENTS.has(eventType)) {
listener(eventType, event);
}
};
this.globalListenerPairs.set(userListener, { syncListener, asyncListener });
const eventSvc = this.eventSvc;
eventSvc.addGlobalListener(syncListener, false);
eventSvc.addGlobalListener(asyncListener, true);
}
removeGlobalListener(userListener) {
const { eventSvc, wrapSvc, globalListenerPairs } = this;
const listener = wrapSvc?.unwrapGlobal(userListener) ?? userListener;
const hasAsync = globalListenerPairs.has(listener);
if (hasAsync) {
const { syncListener, asyncListener } = globalListenerPairs.get(listener);
eventSvc.removeGlobalListener(syncListener, false);
eventSvc.removeGlobalListener(asyncListener, true);
globalListenerPairs.delete(userListener);
} else {
this.syncGlobalListeners.delete(listener);
eventSvc.removeGlobalListener(listener, false);
}
}
destroyEventListeners(map, async) {
map.forEach((listeners, eventType) => {
listeners.forEach((listener) => this.eventSvc.removeEventListener(eventType, listener, async));
listeners.clear();
});
map.clear();
}
destroyGlobalListeners(set, async) {
set.forEach((listener) => this.eventSvc.removeGlobalListener(listener, async));
set.clear();
}
destroy() {
super.destroy();
this.destroyEventListeners(this.syncListeners, false);
this.destroyEventListeners(this.asyncListeners, true);
this.destroyGlobalListeners(this.syncGlobalListeners, false);
const { globalListenerPairs, eventSvc } = this;
globalListenerPairs.forEach(({ syncListener, asyncListener }) => {
eventSvc.removeGlobalListener(syncListener, false);
eventSvc.removeGlobalListener(asyncListener, true);
});
globalListenerPairs.clear();
}
};
// packages/ag-grid-community/src/misc/apiEvents/eventApi.ts
function addEventListener(beans, eventType, listener) {
beans.apiEventSvc?.addEventListener(eventType, listener);
}
function removeEventListener(beans, eventType, listener) {
beans.apiEventSvc?.removeEventListener(eventType, listener);
}
function addGlobalListener(beans, listener) {
beans.apiEventSvc?.addGlobalListener(listener);
}
function removeGlobalListener(beans, listener) {
beans.apiEventSvc?.removeGlobalListener(listener);
}
// packages/ag-grid-community/src/misc/apiEvents/apiEventModule.ts
var EventApiModule = {
moduleName: "EventApi",
version: VERSION,
apiFunctions: {
addEventListener,
addGlobalListener,
removeEventListener,
removeGlobalListener
},
beans: [ApiEventService]
};
// packages/ag-grid-community/src/tooltip/tooltip.css-GENERATED.ts
var tooltipCSS = (
/*css*/
`.ag-tooltip{background-color:var(--ag-tooltip-background-color);border:var(--ag-tooltip-border);border-radius:var(--ag-border-radius);color:var(--ag-tooltip-text-color);padding:var(--ag-widget-container-vertical-padding) var(--ag-widget-container-horizontal-padding);white-space:normal}.ag-tooltip,.ag-tooltip-custom{position:absolute;z-index:99999}.ag-tooltip-custom:where(:not(.ag-tooltip-interactive)),.ag-tooltip:where(:not(.ag-tooltip-interactive)){pointer-events:none}.ag-tooltip-animate{transition:opacity 1s;&:where(.ag-tooltip-hiding){opacity:0}}`
);
// packages/ag-grid-community/src/tooltip/tooltipService.ts
var TooltipService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "tooltipSvc";
}
setupHeaderTooltip(existingTooltipFeature, ctrl, value, shouldDisplayTooltip) {
if (existingTooltipFeature) {
ctrl.destroyBean(existingTooltipFeature);
}
const isTooltipWhenTruncated = _isShowTooltipWhenTruncated(this.gos);
const { column, eGui } = ctrl;
const colDef = column.getColDef();
if (!shouldDisplayTooltip && isTooltipWhenTruncated && !colDef.headerComponent) {
shouldDisplayTooltip = _shouldDisplayTooltip(
() => eGui.querySelector(".ag-header-cell-text")
);
}
const tooltipCtrl = {
getColumn: () => column,
getColDef: () => column.getColDef(),
getGui: () => eGui,
getLocation: () => "header",
getTooltipValue: () => {
if (value != null) {
return value;
}
const res = column.getColDef().headerTooltip;
return res;
},
shouldDisplayTooltip
};
let tooltipFeature = this.createTooltipFeature(tooltipCtrl);
if (tooltipFeature) {
tooltipFeature = ctrl.createBean(tooltipFeature);
ctrl.setRefreshFunction("tooltip", () => tooltipFeature.refreshTooltip());
}
return tooltipFeature;
}
setupHeaderGroupTooltip(existingTooltipFeature, ctrl, value, shouldDisplayTooltip) {
if (existingTooltipFeature) {
ctrl.destroyBean(existingTooltipFeature);
}
const isTooltipWhenTruncated = _isShowTooltipWhenTruncated(this.gos);
const { column, eGui } = ctrl;
const colGroupDef = column.getColGroupDef();
if (!shouldDisplayTooltip && isTooltipWhenTruncated && !colGroupDef?.headerGroupComponent) {
shouldDisplayTooltip = _shouldDisplayTooltip(
() => eGui.querySelector(".ag-header-group-text")
);
}
const tooltipCtrl = {
getColumn: () => column,
getGui: () => eGui,
getLocation: () => "headerGroup",
getTooltipValue: () => value ?? (colGroupDef && colGroupDef.headerTooltip),
shouldDisplayTooltip
};
if (colGroupDef) {
tooltipCtrl.getColDef = () => colGroupDef;
}
const tooltipFeature = this.createTooltipFeature(tooltipCtrl);
return tooltipFeature ? ctrl.createBean(tooltipFeature) : tooltipFeature;
}
enableCellTooltipFeature(ctrl, value, shouldDisplayTooltip) {
const { column, rowNode } = ctrl;
const getTooltipValue = () => {
const colDef = column.getColDef();
const data = rowNode.data;
if (colDef.tooltipField && _exists(data)) {
return _getValueUsingField(data, colDef.tooltipField, column.isTooltipFieldContainsDots());
}
const valueGetter = colDef.tooltipValueGetter;
if (valueGetter) {
return valueGetter(
_addGridCommonParams(this.gos, {
location: "cell",
colDef: column.getColDef(),
column,
rowIndex: ctrl.cellPosition.rowIndex,
node: rowNode,
data: rowNode.data,
value: ctrl.value,
valueFormatted: ctrl.valueFormatted
})
);
}
return null;
};
const isTooltipWhenTruncated = _isShowTooltipWhenTruncated(this.gos);
if (!shouldDisplayTooltip && isTooltipWhenTruncated && !ctrl.isCellRenderer()) {
shouldDisplayTooltip = _shouldDisplayTooltip(() => {
const eCell = ctrl.eGui;
return eCell.children.length === 0 ? eCell : eCell.querySelector(".ag-cell-value");
});
}
const tooltipCtrl = {
getColumn: () => column,
getColDef: () => column.getColDef(),
getRowIndex: () => ctrl.cellPosition.rowIndex,
getRowNode: () => rowNode,
getGui: () => ctrl.eGui,
getLocation: () => "cell",
getTooltipValue: value != null ? () => value : getTooltipValue,
// this makes no sense, why is the cell formatted value passed to the tooltip???
getValueFormatted: () => ctrl.valueFormatted,
shouldDisplayTooltip
};
return this.createTooltipFeature(tooltipCtrl, this.beans);
}
refreshRowTooltip(existingTooltipFeature, ctrl, value, shouldDisplayTooltip) {
const tooltipParams = {
getGui: () => ctrl.getFullWidthElement(),
getTooltipValue: () => value,
getLocation: () => "fullWidthRow",
shouldDisplayTooltip
};
const beans = this.beans;
const context = beans.context;
if (existingTooltipFeature) {
ctrl.destroyBean(existingTooltipFeature, context);
}
const tooltipFeature = this.createTooltipFeature(tooltipParams, beans);
return ctrl.createBean(tooltipFeature, context);
}
initCol(column) {
const { colDef } = column;
column.tooltipEnabled = _exists(colDef.tooltipField) || _exists(colDef.tooltipValueGetter) || _exists(colDef.tooltipComponent);
}
createTooltipFeature(tooltipCtrl, beans) {
return this.beans.registry.createDynamicBean("tooltipFeature", false, tooltipCtrl, beans);
}
};
// packages/ag-grid-community/src/tooltip/tooltipModule.ts
var TooltipModule = {
moduleName: "Tooltip",
version: VERSION,
beans: [TooltipService],
dynamicBeans: {
tooltipFeature: TooltipFeature
},
userComponents: {
agTooltipComponent: TooltipComponent2
},
dependsOn: [PopupModule],
css: [tooltipCSS]
};
// packages/ag-grid-community/src/misc/locale/localeModule.ts
var LocaleModule = {
moduleName: "Locale",
version: VERSION,
beans: [LocaleService]
};
// packages/ag-grid-community/src/rendering/row/rowAutoHeightService.ts
var RowAutoHeightService = class extends BeanStub {
constructor() {
super(...arguments);
this.beanName = "rowAutoHeight";
this.wasEverActive = false;
this._debouncedCalculateRowHeights = _debounce(this, this.calculateRowHeights.bind(this), 1);
}
/**
* If row height has been active, request a refresh of the row heights.
*/
requestCheckAutoHeight() {
if (!this.wasEverActive) {
return;
}
this._debouncedCalculateRowHeights();
}
calculateRowHeights() {
const { visibleCols, rowModel, rowSpanSvc } = this.beans;
const displayedAutoHeightCols = visibleCols.autoHeightCols;
let anyNodeChanged = false;
rowModel.forEachDisplayedNode?.((row) => {
const autoHeights = row.__autoHeights;
let newRowHeight = _getRowHeightForNode(this.beans, row).height;
for (const col of displayedAutoHeightCols) {
if (this.colSpanSkipRow(col, row)) {
return;
}
let cellHeight = autoHeights?.[col.getColId()];
const spannedCell = rowSpanSvc?.getCellSpan(col, row);
if (spannedCell) {
if (spannedCell.getLastNode() !== row) {
continue;
}
cellHeight = rowSpanSvc?.getCellSpan(col, row)?.getLastNodeAutoHeight();
if (!cellHeight) {
return;
}
}
if (cellHeight == null) {
return;
}
newRowHeight = Math.max(cellHeight, newRowHeight);
}
if (newRowHeight !== row.rowHeight) {
row.setRowHeight(newRowHeight);
anyNodeChanged = true;
}
});
if (anyNodeChanged) {
rowModel.onRowHeightChanged?.();
}
}
/**
* Set the cell height into the row node, and request a refresh of the row heights if there's been a change.
* @param rowNode the node to set the auto height on
* @param cellHeight the height to set, undefined if the cell has just been destroyed
* @param column the column of the cell
*/
setRowAutoHeight(rowNode, cellHeight, column) {
if (!rowNode.__autoHeights) {
rowNode.__autoHeights = {};
}
if (cellHeight == void 0) {
delete rowNode.__autoHeights[column.getId()];
return;
}
const previousCellHeight = rowNode.__autoHeights[column.getId()];
rowNode.__autoHeights[column.getId()] = cellHeight;
if (previousCellHeight !== cellHeight) {
this.requestCheckAutoHeight();
}
}
/**
* If using col span, we don't allow auto height on rows that span columns.
* @param col the column of the cell
* @param node the node of the cell
* @returns whether the row should skip auto height
*/
colSpanSkipRow(col, node) {
const { colModel, colViewport, visibleCols } = this.beans;
if (!colModel.colSpanActive) {
return false;
}
let activeColsForRow = [];
switch (col.getPinned()) {
case "left":
activeColsForRow = visibleCols.getLeftColsForRow(node);
break;
case "right":
activeColsForRow = visibleCols.getRightColsForRow(node);
break;
case null:
activeColsForRow = colViewport.getColsWithinViewport(node);
break;
}
return activeColsForRow.includes(col);
}
/**
* If required, sets up observers to continuously measure changes in the cell height.
* @param cellCtrl the cellCtrl of the cell
* @param eCellWrapper the HTMLElement to track the height of
* @param compBean the component bean to add the destroy/cleanup function to
* @returns whether or not auto height has been set up on this cell
*/
setupCellAutoHeight(cellCtrl, eCellWrapper, compBean) {
if (!cellCtrl.column.isAutoHeight() || !eCellWrapper) {
return false;
}
this.wasEverActive = true;
const eParentCell = eCellWrapper.parentElement;
const { rowNode, column } = cellCtrl;
const beans = this.beans;
const measureHeight = (timesCalled) => {
if (cellCtrl.editing) {
return;
}
if (!cellCtrl.isAlive() || !compBean.isAlive()) {
return;
}
const { paddingTop, paddingBottom, borderBottomWidth, borderTopWidth } = _getElementSize(eParentCell);
const extraHeight = paddingTop + paddingBottom + borderBottomWidth + borderTopWidth;
const wrapperHeight = eCellWrapper.offsetHeight;
const autoHeight = wrapperHeight + extraHeight;
if (timesCalled < 5) {
const doc = _getDocument(beans);
const notYetInDom = !doc || !doc.contains(eCellWrapper);
const possiblyNoContentYet = autoHeight == 0;
if (notYetInDom || possiblyNoContentYet) {
window.setTimeout(() => measureHeight(timesCalled + 1), 0);
return;
}
}
this.setRowAutoHeight(rowNode, autoHeight, column);
};
const listener = () => measureHeight(0);
listener();
const destroyResizeObserver = _observeResize(beans, eCellWrapper, listener);
compBean.addDestroyFunc(() => {
destroyResizeObserver();
this.setRowAutoHeight(rowNode, void 0, column);
});
return true;
}
setAutoHeightActive(cols) {
this.active = cols.list.some((col) => col.isVisible() && col.isAutoHeight());
}
};
// packages/ag-grid-community/src/rendering/row/rowAutoHeightModule.ts
var RowAutoHeightModule = {
moduleName: "RowAutoHeight",
version: VERSION,
beans: [RowAutoHeightService]
};
// packages/ag-grid-community/src/allCommunityModule.ts
var AllCommunityModule = {
moduleName: "AllCommunity",
version: VERSION,
dependsOn: [
ClientSideRowModelModule,
CsvExportModule,
InfiniteRowModelModule,
ValidationModule,
TextEditorModule,
NumberEditorModule,
DateEditorModule,
CheckboxEditorModule,
SelectEditorModule,
LargeTextEditorModule,
CustomEditorModule,
UndoRedoEditModule,
TextFilterModule,
NumberFilterModule,
DateFilterModule,
CustomFilterModule,
QuickFilterModule,
ExternalFilterModule,
GridStateModule,
AlignedGridsModule,
PaginationModule,
ColumnApiModule,
RowApiModule,
ScrollApiModule,
RenderApiModule,
ColumnAutoSizeModule,
RowDragModule,
PinnedRowModule,
RowSelectionModule,
ValueCacheModule,
CellStyleModule,
ColumnHoverModule,
RowStyleModule,
EventApiModule,
CellApiModule,
HighlightChangesModule,
TooltipModule,
LocaleModule,
RowAutoHeightModule,
DragAndDropModule,
ClientSideRowModelApiModule,
CellSpanModule
]
};