{
  "version": 3,
  "sources": ["../../src/slick.core.ts", "../../src/controls/slick.columnmenu.ts", "../../src/controls/slick.columnpicker.ts", "../../src/controls/slick.gridmenu.ts", "../../src/controls/slick.pager.ts", "../../src/models/fieldType.enum.ts", "../../src/models/sortDirectionNumber.enum.ts", "../../src/plugins/slick.autotooltips.ts", "../../src/plugins/slick.cellcopymanager.ts", "../../src/plugins/slick.cellexternalcopymanager.ts", "../../src/plugins/slick.cellmenu.ts", "../../src/plugins/slick.cellrangedecorator.ts", "../../src/slick.interactions.ts", "../../src/plugins/slick.cellrangeselector.ts", "../../src/plugins/slick.cellselectionmodel.ts", "../../src/plugins/slick.checkboxselectcolumn.ts", "../../src/plugins/slick.contextmenu.ts", "../../src/plugins/slick.crossgridrowmovemanager.ts", "../../src/plugins/slick.customtooltip.ts", "../../src/plugins/slick.draggablegrouping.ts", "../../src/plugins/slick.headerbuttons.ts", "../../src/plugins/slick.headermenu.ts", "../../src/plugins/slick.hybridselectionmodel.ts", "../../src/plugins/slick.resizer.ts", "../../src/plugins/slick.rowdetailview.ts", "../../src/plugins/slick.rowmovemanager.ts", "../../src/plugins/slick.rowselectionmodel.ts", "../../src/plugins/slick.state.ts", "../../src/slick.compositeeditor.ts", "../../src/slick.groupitemmetadataprovider.ts", "../../src/slick.dataview.ts", "../../src/slick.editors.ts", "../../src/slick.formatters.ts", "../../src/slick.grid.ts", "../../src/slick.remotemodel-yahoo.ts", "../../src/slick.remotemodel.ts"],
  "sourcesContent": ["/**\n * Contains core SlickGrid classes.\n * @module Core\n * @namespace Slick\n */\n\nimport type {\n  AnyFunction,\n  CSSStyleDeclarationWritable,\n  EditController,\n  ElementEventListener,\n  Handler,\n  InferDOMType,\n  MergeTypes,\n  DragRange\n} from './models/index.js';\nimport type { SlickGrid } from './slick.grid.js';\n\nexport interface BasePubSub {\n  publish<ArgType = any>(_eventName: string | any, _data?: ArgType): any;\n  subscribe<ArgType = any>(_eventName: string | Function, _callback: (data: ArgType) => void): any;\n}\n\n/**\n * An event object for passing data to event handlers and letting them control propagation.\n * <p>This is pretty much identical to how W3C and jQuery implement events.</p>\n * @class EventData\n * @constructor\n */\nexport class SlickEventData<ArgType = any> {\n  protected _isPropagationStopped = false;\n  protected _isImmediatePropagationStopped = false;\n  protected _isDefaultPrevented = false;\n  protected returnValues: string[] = [];\n  protected returnValue: any = undefined;\n  protected _eventTarget?: EventTarget | null;\n  protected nativeEvent?: Event | null;\n  protected arguments_?: ArgType;\n\n  // public props that can be optionally pulled from the provided Event in constructor\n  // they are all optional props because it really depends on the type of Event provided (KeyboardEvent, MouseEvent, ...)\n  readonly altKey?: boolean;\n  readonly ctrlKey?: boolean;\n  readonly metaKey?: boolean;\n  readonly shiftKey?: boolean;\n  readonly key?: string;\n  readonly keyCode?: number;\n  readonly clientX?: number;\n  readonly clientY?: number;\n  readonly offsetX?: number;\n  readonly offsetY?: number;\n  readonly pageX?: number;\n  readonly pageY?: number;\n  readonly bubbles?: boolean;\n  readonly target?: HTMLElement;\n  readonly type?: string;\n  readonly which?: number;\n  readonly x?: number;\n  readonly y?: number;\n\n  get defaultPrevented() {\n    return this._isDefaultPrevented;\n  }\n\n  constructor(protected event?: Event | null, protected args?: ArgType) {\n    this.nativeEvent = event;\n    this.arguments_ = args;\n\n    // when we already have an event, we want to keep some of the event properties\n    // looping through some props is the only way to keep and sync these properties to the returned EventData\n    if (event) {\n      [\n        'altKey', 'ctrlKey', 'metaKey', 'shiftKey', 'key', 'keyCode',\n        'clientX', 'clientY', 'offsetX', 'offsetY', 'pageX', 'pageY',\n        'bubbles', 'target', 'type', 'which', 'x', 'y'\n      ].forEach(key => (this as any)[key] = event[key as keyof Event]);\n    }\n    this._eventTarget = this.nativeEvent ? this.nativeEvent.target : undefined;\n  }\n\n  /**\n   * Stops event from propagating up the DOM tree.\n   * @method stopPropagation\n   */\n  stopPropagation() {\n    this._isPropagationStopped = true;\n    this.nativeEvent?.stopPropagation();\n  }\n\n  /**\n   * Returns whether stopPropagation was called on this event object.\n   * @method isPropagationStopped\n   * @return {Boolean}\n   */\n  isPropagationStopped() {\n    return this._isPropagationStopped;\n  }\n\n  /**\n   * Prevents the rest of the handlers from being executed.\n   * @method stopImmediatePropagation\n   */\n  stopImmediatePropagation() {\n    this._isImmediatePropagationStopped = true;\n    if (this.nativeEvent) {\n      this.nativeEvent.stopImmediatePropagation();\n    }\n  };\n\n  /**\n   * Returns whether stopImmediatePropagation was called on this event object.\\\n   * @method isImmediatePropagationStopped\n   * @return {Boolean}\n   */\n  isImmediatePropagationStopped() {\n    return this._isImmediatePropagationStopped;\n  };\n\n  getNativeEvent<E extends Event>() {\n    return this.nativeEvent as E;\n  }\n\n  preventDefault() {\n    if (this.nativeEvent) {\n      this.nativeEvent.preventDefault();\n    }\n    this._isDefaultPrevented = true;\n  }\n\n  isDefaultPrevented() {\n    if (this.nativeEvent) {\n      return this.nativeEvent.defaultPrevented;\n    }\n    return this._isDefaultPrevented;\n  }\n\n  addReturnValue(value: any) {\n    this.returnValues.push(value);\n    if (this.returnValue === undefined && value !== undefined) {\n      this.returnValue = value;\n    }\n  }\n\n  getReturnValue() {\n    return this.returnValue;\n  }\n\n  getArguments() {\n    return this.arguments_;\n  }\n}\n\n/**\n * A simple publisher-subscriber implementation.\n * @class Event\n * @constructor\n */\nexport class SlickEvent<ArgType = any> {\n  protected _handlers: Handler<ArgType>[] = [];\n  protected _pubSubService?: BasePubSub;\n\n  get subscriberCount() {\n    return this._handlers.length;\n  }\n\n  /**\n   * Constructor\n   * @param {String} [eventName] - event name that could be used for dispatching CustomEvent (when enabled)\n   * @param {BasePubSub} [pubSubService] - event name that could be used for dispatching CustomEvent (when enabled)\n   */\n  constructor(protected readonly eventName?: string, protected readonly pubSub?: BasePubSub) {\n    this._pubSubService = pubSub;\n  }\n\n  /**\n   * Adds an event handler to be called when the event is fired.\n   * <p>Event handler will receive two arguments - an <code>EventData</code> and the <code>data</code>\n   * object the event was fired with.<p>\n   * @method subscribe\n   * @param {Function} fn - Event handler.\n   */\n  subscribe(fn: Handler<ArgType>) {\n    this._handlers.push(fn);\n  }\n\n  /**\n   * Removes an event handler added with <code>subscribe(fn)</code>.\n   * @method unsubscribe\n   * @param {Function} [fn] - Event handler to be removed.\n   */\n  unsubscribe(fn?: Handler<ArgType>) {\n    for (let i = this._handlers.length - 1; i >= 0; i--) {\n      if (this._handlers[i] === fn) {\n        this._handlers.splice(i, 1);\n      }\n    }\n  }\n\n  /**\n   * Fires an event notifying all subscribers.\n   * @method notify\n   * @param {Object} args Additional data object to be passed to all handlers.\n   * @param {EventData} [event] - An <code>EventData</code> object to be passed to all handlers.\n   *      For DOM events, an existing W3C event object can be passed in.\n   * @param {Object} [scope] - The scope (\"this\") within which the handler will be executed.\n   *      If not specified, the scope will be set to the <code>Event</code> instance.\n   */\n  notify(args: ArgType, evt?: SlickEventData<ArgType> | Event | MergeTypes<SlickEventData<ArgType>, Event> | null, scope?: any) {\n    const sed: SlickEventData = evt instanceof SlickEventData\n      ? evt\n      : new SlickEventData(evt, args);\n    scope = scope || this;\n\n    for (let i = 0; i < this._handlers.length && !(sed.isPropagationStopped() || sed.isImmediatePropagationStopped()); i++) {\n      const returnValue = this._handlers[i].call(scope, sed, args);\n      sed.addReturnValue(returnValue);\n    }\n\n    // user can optionally add a global PubSub Service which makes it easy to publish/subscribe to events\n    if (typeof this._pubSubService?.publish === 'function' && this.eventName) {\n      const ret = this._pubSubService.publish<{ args: ArgType; eventData?: SlickEventData<ArgType>; nativeEvent?: Event; }>(this.eventName, { args, eventData: sed });\n      sed.addReturnValue(ret);\n    }\n    return sed;\n  }\n\n  setPubSubService(pubSub: BasePubSub) {\n    this._pubSubService = pubSub;\n  }\n}\n\nexport class SlickEventHandler {\n  protected handlers: Array<{ event: SlickEvent; handler: Handler<any>; }> = [];\n\n  subscribe<T = any>(event: SlickEvent<T>, handler: Handler<T>) {\n    this.handlers.push({ event, handler });\n    event.subscribe(handler);\n\n    return this as SlickEventHandler;  // allow chaining\n  }\n\n  unsubscribe<T = any>(event: SlickEvent<T>, handler: Handler<T>) {\n    let i = this.handlers.length;\n    while (i--) {\n      if (this.handlers[i].event === event &&\n        this.handlers[i].handler === handler) {\n        this.handlers.splice(i, 1);\n        event.unsubscribe(handler);\n        return;\n      }\n    }\n\n    return this as SlickEventHandler;  // allow chaining\n  }\n\n  unsubscribeAll() {\n    let i = this.handlers.length;\n    while (i--) {\n      this.handlers[i].event.unsubscribe(this.handlers[i].handler);\n    }\n    this.handlers = [];\n\n    return this as SlickEventHandler;  // allow chaining\n  }\n}\n\n/**\n * A structure containing a range of cells.\n * @class Range\n * @constructor\n * @param fromRow {Integer} Starting row.\n * @param fromCell {Integer} Starting cell.\n * @param toRow {Integer} Optional. Ending row. Defaults to <code>fromRow</code>.\n * @param toCell {Integer} Optional. Ending cell. Defaults to <code>fromCell</code>.\n */\nexport class SlickRange {\n  fromRow: number;\n  fromCell: number;\n  toCell: number;\n  toRow: number;\n\n  constructor(fromRow: number, fromCell: number, toRow?: number, toCell?: number) {\n    if (toRow === undefined && toCell === undefined) {\n      toRow = fromRow;\n      toCell = fromCell;\n    }\n\n    /**\n     * @property fromRow\n     * @type {Integer}\n     */\n    this.fromRow = Math.min(fromRow, toRow as number);\n\n    /**\n     * @property fromCell\n     * @type {Integer}\n     */\n    this.fromCell = Math.min(fromCell, toCell as number);\n\n    /**\n     * @property toCell\n     * @type {Integer}\n     */\n    this.toCell = Math.max(fromCell, toCell as number);\n\n    /**\n     * @property toRow\n     * @type {Integer}\n     */\n    this.toRow = Math.max(fromRow, toRow as number);\n  }\n\n\n  /**\n   * Returns whether a range represents a single row.\n   * @method isSingleRow\n   * @return {Boolean}\n   */\n  isSingleRow() {\n    return this.fromRow === this.toRow;\n  }\n\n  /**\n   * Returns whether a range represents a single cell.\n   * @method isSingleCell\n   * @return {Boolean}\n   */\n  isSingleCell() {\n    return this.fromRow === this.toRow && this.fromCell === this.toCell;\n  }\n\n  /**\n   * Row Count.\n   * @method rowCount\n   * @return {Number}\n   */\n  rowCount() {\n    return this.toRow - this.fromRow + 1;\n  }\n\n  /**\n   * Cell Count.\n   * @method cellCount\n   * @return {Number}\n   */\n  cellCount() {\n    return this.toCell - this.fromCell + 1;\n  }\n\n  /**\n   * Returns whether a range contains a given cell.\n   * @method contains\n   * @param row {Integer}\n   * @param cell {Integer}\n   * @return {Boolean}\n   */\n  contains(row: number, cell: number) {\n    return row >= this.fromRow && row <= this.toRow &&\n      cell >= this.fromCell && cell <= this.toCell;\n  }\n\n  /**\n   * Returns a readable representation of a range.\n   * @method toString\n   * @return {String}\n   */\n  toString() {\n    if (this.isSingleCell()) {\n      return `(${this.fromRow}:${this.fromCell})`;\n    }\n    else {\n      return `(${this.fromRow}:${this.fromCell} - ${this.toRow}:${this.toCell})`;\n    }\n  };\n}\n\n/**\n * A structure containing a range of cells to copy to.\n * @class SlickCopyRange\n * @constructor\n * @param fromRow {Integer} Starting row.\n * @param fromCell {Integer} Starting cell.\n * @param rowCount {Integer} Row Count.\n * @param cellCount {Integer} Cell Count.\n */\nexport class SlickCopyRange {\n  fromRow: number;\n  fromCell: number;\n  rowCount: number;\n  cellCount: number;\n\n  constructor(fromRow: number, fromCell: number, rowCount: number, cellCount: number) {\n    this.fromRow = fromRow;\n    this.fromCell = fromCell;\n    this.rowCount = rowCount;\n    this.cellCount = cellCount;\n  }\n\n}\n\n/**\n * Create a handle element for Excel style drag-replace\n * @class DragExtendHandle\n * @constructor\n * @param gridUid {String} string UID of parent grid\n */\nexport class SlickDragExtendHandle {\n  id: string;\n  cssClass = 'slick-drag-replace-handle';\n\n  constructor(gridUid: string) {\n    this.id = `${gridUid}_drag_replace_handle`;\n  }\n\n  removeEl() {\n    document.getElementById(this.id)?.remove();\n  }\n\n  createEl(activeCellNode: any) {\n    if (activeCellNode) {\n      const dragReplaceEl = document.createElement(\"div\");\n      dragReplaceEl.classList.add(\"slick-drag-replace-handle\");\n      dragReplaceEl.id = this.id;\n      activeCellNode.appendChild(dragReplaceEl);\n    }\n  }\n}\n\n/**\n * A base class that all special / non-data rows (like Group and GroupTotals) derive from.\n * @class NonDataItem\n * @constructor\n */\nexport class SlickNonDataItem {\n  __nonDataRow = true;\n}\n\n\n/**\n * Information about a group of rows.\n * @class Group\n * @extends Slick.NonDataItem\n * @constructor\n */\nexport class SlickGroup extends SlickNonDataItem {\n  __group = true;\n\n  /**\n   * Grouping level, starting with 0.\n   * @property level\n   * @type {Number}\n   */\n  level = 0;\n\n  /**\n   * Number of rows in the group.\n   * @property count\n   * @type {Integer}\n   */\n  count = 0;\n\n  /**\n   * Grouping value.\n   * @property value\n   * @type {Object}\n   */\n  value = null;\n\n  /**\n   * Formatted display value of the group.\n   * @property title\n   * @type {String}\n   */\n  title: string | null = null;\n\n  /**\n   * Whether a group is collapsed.\n   * @property collapsed\n   * @type {Boolean}\n   */\n  collapsed: boolean | number = false;\n\n  /**\n   * Whether a group selection checkbox is checked.\n   * @property selectChecked\n   * @type {Boolean}\n   */\n  selectChecked = false;\n\n  /**\n   * GroupTotals, if any.\n   * @property totals\n   * @type {GroupTotals}\n   */\n  totals: SlickGroupTotals = null as any;\n\n  /**\n   * Rows that are part of the group.\n   * @property rows\n   * @type {Array}\n   */\n  rows: number[] = [];\n\n  /**\n   * Sub-groups that are part of the group.\n   * @property groups\n   * @type {Array}\n   */\n  groups: any[] = null as any;\n\n  /**\n   * A unique key used to identify the group.  This key can be used in calls to DataView\n   * collapseGroup() or expandGroup().\n   * @property groupingKey\n   * @type {Object}\n   */\n  groupingKey: any = null;\n\n  constructor() {\n    super();\n  }\n  /**\n   * Compares two Group instances.\n   * @method equals\n   * @return {Boolean}\n   * @param group {Group} Group instance to compare to.\n   */\n  equals(group: SlickGroup): boolean {\n    return this.value === group.value &&\n      this.count === group.count &&\n      this.collapsed === group.collapsed &&\n      this.title === group.title;\n  };\n}\n\n/**\n * Information about group totals.\n * An instance of GroupTotals will be created for each totals row and passed to the aggregators\n * so that they can store arbitrary data in it.  That data can later be accessed by group totals\n * formatters during the display.\n * @class GroupTotals\n * @extends Slick.NonDataItem\n * @constructor\n */\nexport class SlickGroupTotals extends SlickNonDataItem {\n  __groupTotals = true;\n\n  /**\n   * Parent Group.\n   * @param group\n   * @type {Group}\n   */\n  group: SlickGroup = null as any;\n\n  /**\n   * Whether the totals have been fully initialized / calculated.\n   * Will be set to false for lazy-calculated group totals.\n   * @param initialized\n   * @type {Boolean}\n   */\n  initialized = false;\n\n  constructor() {\n    super();\n  }\n}\n\n/**\n * A locking helper to track the active edit controller and ensure that only a single controller\n * can be active at a time.  This prevents a whole class of state and validation synchronization\n * issues.  An edit controller (such as SlickGrid) can query if an active edit is in progress\n * and attempt a commit or cancel before proceeding.\n * @class EditorLock\n * @constructor\n */\nexport class SlickEditorLock {\n  activeEditController: any = null;\n\n  /**\n   * Returns true if a specified edit controller is active (has the edit lock).\n   * If the parameter is not specified, returns true if any edit controller is active.\n   * @method isActive\n   * @param editController {EditController}\n   * @return {Boolean}\n   */\n  isActive(editController?: EditController): boolean {\n    return (editController ? this.activeEditController === editController : this.activeEditController !== null);\n  };\n\n  /**\n   * Sets the specified edit controller as the active edit controller (acquire edit lock).\n   * If another edit controller is already active, and exception will be throw new Error(.\n   * @method activate\n   * @param editController {EditController} edit controller acquiring the lock\n   */\n  activate(editController: EditController) {\n    if (editController === this.activeEditController) { // already activated?\n      return;\n    }\n    if (this.activeEditController !== null) {\n      throw new Error(`Slick.EditorLock.activate: an editController is still active, can't activate another editController`);\n    }\n    if (!editController.commitCurrentEdit) {\n      throw new Error('Slick.EditorLock.activate: editController must implement .commitCurrentEdit()');\n    }\n    if (!editController.cancelCurrentEdit) {\n      throw new Error('Slick.EditorLock.activate: editController must implement .cancelCurrentEdit()');\n    }\n    this.activeEditController = editController;\n  };\n\n  /**\n   * Unsets the specified edit controller as the active edit controller (release edit lock).\n   * If the specified edit controller is not the active one, an exception will be throw new Error(.\n   * @method deactivate\n   * @param editController {EditController} edit controller releasing the lock\n   */\n  deactivate(editController: EditController) {\n    if (!this.activeEditController) {\n      return;\n    }\n    if (this.activeEditController !== editController) {\n      throw new Error('Slick.EditorLock.deactivate: specified editController is not the currently active one');\n    }\n    this.activeEditController = null;\n  };\n\n  /**\n   * Attempts to commit the current edit by calling \"commitCurrentEdit\" method on the active edit\n   * controller and returns whether the commit attempt was successful (commit may fail due to validation\n   * errors, etc.).  Edit controller's \"commitCurrentEdit\" must return true if the commit has succeeded\n   * and false otherwise.  If no edit controller is active, returns true.\n   * @method commitCurrentEdit\n   * @return {Boolean}\n   */\n  commitCurrentEdit(): boolean {\n    return (this.activeEditController ? this.activeEditController.commitCurrentEdit() : true);\n  };\n\n  /**\n   * Attempts to cancel the current edit by calling \"cancelCurrentEdit\" method on the active edit\n   * controller and returns whether the edit was successfully cancelled.  If no edit controller is\n   * active, returns true.\n   * @method cancelCurrentEdit\n   * @return {Boolean}\n   */\n  cancelCurrentEdit(): boolean {\n    return (this.activeEditController ? this.activeEditController.cancelCurrentEdit() : true);\n  };\n}\n\nfunction regexSanitizer(dirtyHtml: string) {\n  return dirtyHtml.replace(/(\\b)(on[a-z]+)(\\s*)=|javascript:([^>]*)[^>]*|(<\\s*)(\\/*)script([<>]*).*(<\\s*)(\\/*)script(>*)|(&lt;)(\\/*)(script|script defer)(.*)(&gt;|&gt;\">)/gi, '');\n}\n\n/**\n * A simple binding event service to keep track of all JavaScript events with callback listeners,\n * it allows us to unbind event(s) and their listener(s) by calling a simple unbind method call.\n * Unbinding is a necessary step to make sure that all event listeners are removed to avoid memory leaks when destroing the grid\n */\nexport class BindingEventService {\n  protected _boundedEvents: ElementEventListener[] = [];\n\n  getBoundedEvents() {\n    return this._boundedEvents;\n  }\n\n  destroy() {\n    this.unbindAll();\n  }\n\n  /** Bind an event listener to any element */\n  bind(element: Element | Window, eventName: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions, groupName = '') {\n    if (element) {\n      element.addEventListener(eventName, listener, options);\n      this._boundedEvents.push({ element, eventName, listener, groupName });\n    }\n  }\n\n  /** Unbind all will remove every every event handlers that were bounded earlier */\n  unbind(element: Element | Window, eventName: string, listener: EventListenerOrEventListenerObject) {\n    if (element?.removeEventListener) {\n      element.removeEventListener(eventName, listener);\n    }\n  }\n\n  unbindByEventName(element: Element | Window, eventName: string) {\n    const boundedEvent = this._boundedEvents.find(e => e.element === element && e.eventName === eventName);\n    if (boundedEvent) {\n      this.unbind(boundedEvent.element, boundedEvent.eventName, boundedEvent.listener);\n    }\n  }\n\n  /**\n   * Unbind all event listeners that were bounded, optionally provide a group name to unbind all listeners assigned to that specific group only.\n   */\n  unbindAll(groupName?: string | string[]) {\n    if (groupName) {\n      const groupNames = Array.isArray(groupName) ? groupName : [groupName];\n\n      // unbind only the bounded event with a specific group\n      // Note: we need to loop in reverse order to avoid array reindexing (causing index offset) after a splice is called\n      for (let i = this._boundedEvents.length - 1; i >= 0; --i) {\n        const boundedEvent = this._boundedEvents[i];\n        if (groupNames.some(g => g === boundedEvent.groupName)) {\n          const { element, eventName, listener } = boundedEvent;\n          this.unbind(element, eventName, listener);\n          this._boundedEvents.splice(i, 1);\n        }\n      }\n    } else {\n      // unbind everything\n      while (this._boundedEvents.length > 0) {\n        const boundedEvent = this._boundedEvents.pop() as ElementEventListener;\n        const { element, eventName, listener } = boundedEvent;\n        this.unbind(element, eventName, listener);\n      }\n    }\n  }\n}\n\nexport class Utils {\n  // jQuery's extend\n  private static getProto = Object.getPrototypeOf;\n  private static class2type: any = {};\n  private static toString = Utils.class2type.toString;\n  private static hasOwn = Utils.class2type.hasOwnProperty;\n  private static fnToString = Utils.hasOwn.toString;\n  private static ObjectFunctionString = Utils.fnToString.call(Object);\n  public static storage = {\n    // https://stackoverflow.com/questions/29222027/vanilla-alternative-to-jquery-data-function-any-native-javascript-alternati\n    _storage: new WeakMap(),\n    // eslint-disable-next-line object-shorthand\n    put: function (element: any, key: string, obj: any) {\n      if (!this._storage.has(element)) {\n        this._storage.set(element, new Map());\n      }\n      this._storage.get(element).set(key, obj);\n    },\n    // eslint-disable-next-line object-shorthand\n    get: function (element: any, key: string) {\n      const el = this._storage.get(element);\n      if (el) {\n        return el.get(key);\n      }\n      return null;\n    },\n    // eslint-disable-next-line object-shorthand\n    remove: function (element: any, key: string) {\n      const ret = this._storage.get(element).delete(key);\n      if (!(this._storage.get(element).size === 0)) {\n        this._storage.delete(element);\n      }\n      return ret;\n    }\n  };\n\n  public static isFunction(obj: any) {\n    return typeof obj === 'function' && typeof obj.nodeType !== 'number' && typeof obj.item !== 'function';\n  }\n\n  public static isPlainObject(obj: any) {\n    if (!obj || Utils.toString.call(obj) !== '[object Object]') {\n      return false;\n    }\n\n    const proto = Utils.getProto(obj);\n    if (!proto) {\n      return true;\n    }\n    const Ctor = Utils.hasOwn.call(proto, 'constructor') && proto.constructor;\n    return typeof Ctor === 'function' && Utils.fnToString.call(Ctor) === Utils.ObjectFunctionString;\n  }\n\n  public static calculateAvailableSpace(element: HTMLElement) {\n    let bottom = 0, top = 0, left = 0, right = 0;\n\n    const windowHeight = window.innerHeight || 0;\n    const windowWidth = window.innerWidth || 0;\n    const scrollPosition = Utils.windowScrollPosition();\n    const pageScrollTop = scrollPosition.top;\n    const pageScrollLeft = scrollPosition.left;\n    const elmOffset = Utils.offset(element);\n\n    if (elmOffset) {\n      const elementOffsetTop = elmOffset.top || 0;\n      const elementOffsetLeft = elmOffset.left || 0;\n      top = elementOffsetTop - pageScrollTop;\n      bottom = windowHeight - (elementOffsetTop - pageScrollTop);\n      left = elementOffsetLeft - pageScrollLeft;\n      right = windowWidth - (elementOffsetLeft - pageScrollLeft);\n    }\n\n    return { top, bottom, left, right };\n  }\n\n  public static extend<T = any>(...args: any[]): T {\n    let options, name, src, copy, copyIsArray, clone,\n      target = args[0],\n      i = 1,\n      deep = false;\n    const length = args.length;\n\n    if (typeof target === 'boolean') {\n      deep = target;\n      target = args[i] || {};\n      i++;\n    } else {\n      target = target || {};\n    }\n    if (typeof target !== 'object' && !Utils.isFunction(target)) {\n      target = {};\n    }\n    if (i === length) {\n      // eslint-disable-next-line @typescript-eslint/no-this-alias\n      target = this;\n      i--;\n    }\n    for (; i < length; i++) {\n      if (Utils.isDefined(options = args[i])) {\n        for (name in options) {\n          copy = options[name];\n          if (name === '__proto__' || target === copy) {\n            continue;\n          }\n          if (deep && copy && (Utils.isPlainObject(copy) ||\n            (copyIsArray = Array.isArray(copy)))) {\n            src = target[name];\n            if (copyIsArray && !Array.isArray(src)) {\n              clone = [];\n            } else if (!copyIsArray && !Utils.isPlainObject(src)) {\n              clone = {};\n            } else {\n              clone = src;\n            }\n            copyIsArray = false;\n            target[name] = Utils.extend(deep, clone, copy);\n          } else if (copy !== undefined) {\n            target[name] = copy;\n          }\n        }\n      }\n    }\n    return target as T;\n  }\n\n  /**\n   * Create a DOM Element with any optional attributes or properties.\n   * It will only accept valid DOM element properties that `createElement` would accept.\n   * For example: `createDomElement('div', { className: 'my-css-class' })`,\n   * for style or dataset you need to use nested object `{ style: { display: 'none' }}\n   * The last argument is to optionally append the created element to a parent container element.\n   * @param {String} tagName - html tag\n   * @param {Object} options - element properties\n   * @param {[HTMLElement]} appendToParent - parent element to append to\n   */\n  public static createDomElement<T extends keyof HTMLElementTagNameMap, K extends keyof HTMLElementTagNameMap[T]>(\n    tagName: T,\n    elementOptions?: null | { [P in K]: InferDOMType<HTMLElementTagNameMap[T][P]> },\n    appendToParent?: Element\n  ): HTMLElementTagNameMap[T] {\n    const elm = document.createElement<T>(tagName);\n\n    if (elementOptions) {\n      Object.keys(elementOptions).forEach((elmOptionKey) => {\n        if (elmOptionKey === 'innerHTML') {\n          console.warn(`[SlickGrid] For better CSP (Content Security Policy) support, do not use \"innerHTML\" directly in \"createDomElement('${tagName}', { innerHTML: 'some html'})\"` +\n            `, it is better as separate assignment: \"const elm = createDomElement('span'); elm.innerHTML = 'some html';\"`);\n        }\n\n        const elmValue = elementOptions[elmOptionKey as keyof typeof elementOptions];\n        if (typeof elmValue === 'object') {\n          Object.assign(elm[elmOptionKey as K] as object, elmValue);\n        } else {\n          elm[elmOptionKey as K] = (elementOptions as any)[elmOptionKey as keyof typeof elementOptions];\n        }\n      });\n    }\n    if (appendToParent?.appendChild) {\n      appendToParent.appendChild(elm);\n    }\n    return elm;\n  }\n\n  /**\n   * From any input provided, return the HTML string (when a string is provided, it will be returned \"as is\" but when it's a number it will be converted to string)\n   * When detecting HTMLElement/DocumentFragment, we can also specify which HTML type to retrieve innerHTML or outerHTML.\n   * We can get the HTML by looping through all fragment `childNodes`\n   * @param {DocumentFragment | HTMLElement | string | number} input\n   * @param {'innerHTML' | 'outerHTML'} [type] - when the input is a DocumentFragment or HTMLElement, which type of HTML do you want to return? 'innerHTML' or 'outerHTML'\n   * @returns {String}\n   */\n  public static getHtmlStringOutput(input: DocumentFragment | HTMLElement | string | number, type: 'innerHTML' | 'outerHTML' = 'innerHTML'): string {\n    if (input instanceof DocumentFragment) {\n      // a DocumentFragment doesn't have innerHTML/outerHTML, but we can loop through all children and concatenate them all to an HTML string\n      return [].map.call(input.childNodes, (x: HTMLElement) => x[type]).join('') || input.textContent || '';\n    } else if (input instanceof HTMLElement) {\n      return input[type];\n    }\n    return String(input); // reaching this line means it's already a string (or number) so just return it as string\n  }\n\n  public static emptyElement<T extends Element = Element>(element?: T | null): T | undefined | null {\n    while (element?.firstChild) {\n      element.removeChild(element.firstChild);\n    }\n    return element;\n  }\n\n  /**\n   * Accepts string containing the class or space-separated list of classes, and\n   * returns list of individual classes.\n   * Method properly takes into account extra whitespaces in the `className`\n   * e.g.: \" class1    class2   \" => will result in `['class1', 'class2']`.\n   * @param {String} className - space separated list of class names\n   */\n  public static classNameToList(className = ''): string[] {\n    return className.split(' ').filter(cls => cls);\n  }\n\n  public static innerSize(elm: HTMLElement, type: 'height' | 'width') {\n    let size = 0;\n\n    if (elm) {\n      const clientSize = type === 'height' ? 'clientHeight' : 'clientWidth';\n      const sides = type === 'height' ? ['top', 'bottom'] : ['left', 'right'];\n      size = elm[clientSize];\n      for (const side of sides) {\n        const sideSize = (parseFloat(Utils.getElementProp(elm, `padding-${side}`) || '') || 0);\n        size -= sideSize;\n      }\n    }\n    return size;\n  }\n\n  public static isDefined<T>(value: T | undefined | null): value is T {\n    return <T>value !== undefined && <T>value !== null && <T>value !== '';\n  }\n\n  public static getElementProp(elm: HTMLElement & { getComputedStyle?: () => CSSStyleDeclaration }, property: string) {\n    if (elm?.getComputedStyle) {\n      return window.getComputedStyle(elm, null).getPropertyValue(property);\n    }\n    return null;\n  }\n\n  /**\n   * Get the function details (param & body) of a function.\n   * It supports regular function and also ES6 arrow functions\n   * @param {Function} fn - function to analyze\n   * @param {Boolean} [addReturn] - when using ES6 function as single liner, we could add the missing `return ...`\n   * @returns\n   */\n  public static getFunctionDetails(fn: AnyFunction, addReturn = true) {\n    let isAsyncFn = false;\n\n    const getFunctionBody = (func: AnyFunction) => {\n      const fnStr = func.toString();\n      isAsyncFn = fnStr.includes('async ');\n\n      // when fn is one liner arrow fn returning an object in brackets e.g. `() => ({ hello: 'world' })`\n      if ((fnStr.replaceAll(' ', '').includes('=>({'))) {\n        const matches = fnStr.match(/(({.*}))/g) || [];\n        return matches.length >= 1 ? `return ${matches[0]!.trimStart()}` : fnStr;\n      }\n      const isOneLinerArrowFn = (!fnStr.includes('{') && fnStr.includes('=>'));\n      const body = fnStr.substring(\n        (fnStr.indexOf('{') + 1) || (fnStr.indexOf('=>') + 2),\n        fnStr.includes('}') ? fnStr.lastIndexOf('}') : fnStr.length\n      );\n      if (addReturn && isOneLinerArrowFn && !body.startsWith('return')) {\n        return 'return ' + body.trimStart(); // add the `return ...` to the body for ES6 arrow fn\n      }\n      return body;\n    };\n\n    const getFunctionParams = (func: AnyFunction): string[] => {\n      const STRIP_COMMENTS = /(\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/)|(\\s*=[^,)]*(('(?:\\\\'|[^'\\r\\n])*')|(\"(?:\\\\\"|[^\"\\r\\n])*\"))|(\\s*=[^,)]*))/mg;\n      const ARG_NAMES = /([^\\s,]+)/g;\n      const fnStr = func.toString().replace(STRIP_COMMENTS, '');\n      return fnStr.slice(fnStr.indexOf('(') + 1, fnStr.indexOf(')')).match(ARG_NAMES) ?? [];\n    };\n\n    return {\n      params: getFunctionParams(fn),\n      body: getFunctionBody(fn),\n      isAsync: isAsyncFn,\n    };\n  }\n\n  public static insertAfterElement(referenceNode: HTMLElement, newNode: HTMLElement) {\n    referenceNode.parentNode?.insertBefore(newNode, referenceNode.nextSibling);\n  }\n\n  public static isEmptyObject(obj: any) {\n    if (obj === null || obj === undefined) {\n      return true;\n    }\n    return Object.entries(obj).length === 0;\n  }\n\n  public static noop() { }\n\n  public static offset(el: HTMLElement | null) {\n    if (!el || !el.getBoundingClientRect) {\n      return undefined;\n    }\n    const box = el.getBoundingClientRect();\n    const docElem = document.documentElement;\n\n    return {\n      top: box.top + window.pageYOffset - docElem.clientTop,\n      left: box.left + window.pageXOffset - docElem.clientLeft\n    };\n  }\n\n  public static windowScrollPosition() {\n    return {\n      left: window.pageXOffset || document.documentElement.scrollLeft || 0,\n      top: window.pageYOffset || document.documentElement.scrollTop || 0,\n    };\n  }\n\n  public static width(el: HTMLElement, value?: number | string): number | void {\n    if (!el || !el.getBoundingClientRect) { return; }\n    if (value === undefined) {\n      return el.getBoundingClientRect().width;\n    }\n    Utils.setStyleSize(el, 'width', value);\n  }\n\n  public static height(el: HTMLElement, value?: number | string): number | void {\n    if (!el) { return; }\n    if (value === undefined) {\n      return el.getBoundingClientRect().height;\n    }\n    Utils.setStyleSize(el, 'height', value);\n  }\n\n  public static setStyleSize(el: HTMLElement, style: string, val?: number | string | Function) {\n    if (typeof val === 'function') {\n      val = val();\n    } else if (typeof val === 'string') {\n      el.style[style as CSSStyleDeclarationWritable] = val;\n    } else {\n      el.style[style as CSSStyleDeclarationWritable] = val + 'px';\n    }\n  }\n\n  public static contains(parent: HTMLElement, child: HTMLElement) {\n    if (!parent || !child) {\n      return false;\n    }\n\n    const parentList = Utils.parents(child);\n    return !parentList.every((p) => {\n      if (parent === p) {\n        return false;\n      }\n      return true;\n    });\n  }\n\n  public static isHidden(el: HTMLElement) {\n    return el.offsetWidth === 0 && el.offsetHeight === 0;\n  }\n\n  public static parents(el: HTMLElement | ParentNode, selector?: string) {\n    const parents: Array<HTMLElement | ParentNode> = [];\n    const visible = selector === ':visible';\n    const hidden = selector === ':hidden';\n\n    while ((el = el.parentNode as ParentNode) && el !== document) {\n      if (!el || !el.parentNode) {\n        break;\n      }\n      if (hidden) {\n        if (Utils.isHidden(el as HTMLElement)) {\n          parents.push(el);\n        }\n      } else if (visible) {\n        if (!Utils.isHidden(el as HTMLElement)) {\n          parents.push(el);\n        }\n      } else if (!selector || (el as any).matches(selector)) {\n        parents.push(el);\n      }\n    }\n    return parents;\n  }\n\n  public static toFloat(value: string | number) {\n    const x = parseFloat(value as string);\n    if (isNaN(x)) {\n      return 0;\n    }\n    return x;\n  }\n\n  public static show(el: HTMLElement | HTMLElement[], type = '') {\n    if (Array.isArray(el)) {\n      el.forEach((e) => e.style.display = type);\n    } else {\n      el.style.display = type;\n    }\n  }\n\n  public static hide(el: HTMLElement | HTMLElement[]) {\n    if (Array.isArray(el)) {\n      el.forEach((e) => e.style.display = 'none');\n    } else {\n      el.style.display = 'none';\n    }\n  }\n\n  public static slideUp(el: HTMLElement | HTMLElement[], callback: Function) {\n    return Utils.slideAnimation(el, 'slideUp', callback);\n  }\n\n  public static slideDown(el: HTMLElement | HTMLElement[], callback: Function) {\n    return Utils.slideAnimation(el, 'slideDown', callback);\n  }\n\n  public static slideAnimation(el: HTMLElement | HTMLElement[], slideDirection: 'slideDown' | 'slideUp', callback: Function) {\n    if ((window as any).jQuery !== undefined) {\n      (window as any).jQuery(el)[slideDirection]('fast', callback);\n      return;\n    }\n    (slideDirection === 'slideUp') ? Utils.hide(el) : Utils.show(el);\n    callback();\n  }\n\n  public static applyDefaults(targetObj: any, srcObj: any) {\n    if (typeof srcObj === 'object') {\n      Object.keys(srcObj).forEach(key => {\n        if (srcObj.hasOwnProperty(key) && !targetObj.hasOwnProperty(key)) {\n          targetObj[key] = srcObj[key];\n        }\n      });\n    }\n  }\n\n  /**\n   * User could optionally add PubSub Service to SlickEvent\n   * When it is defined then a SlickEvent `notify()` call will also dispatch it by using the PubSub publish() method\n   * @param {BasePubSub} [pubSubService]\n   * @param {*} scope\n   */\n  public static addSlickEventPubSubWhenDefined<T = any>(pubSub?: BasePubSub, scope?: T) {\n    if (pubSub) {\n      for (const prop in scope) {\n        if (scope[prop] instanceof SlickEvent && typeof (scope[prop] as SlickEvent).setPubSubService === 'function') {\n          (scope[prop] as SlickEvent).setPubSubService(pubSub);\n        }\n      }\n    }\n  }\n}\n\nexport class SelectionUtils {\n\n  //   |---0----|---1----|---2----|---3----|---4----|---5----|\n  // 0 |        |        |        |     ^  |        |        |\n  //   |--------|--------|--------|--------|--------|--------|\n  // 1 |        |        |        |        |        |        |\n  //   |--------|--------|--------|--------|--------|--------|\n  // 2 |        |        |   1    |   2    |    > h |        |\n  //   |--------|--------|--------|--------|--------|--------|\n  // 3 |   <    |        |   4    |   5   x|    > h |    >   |\n  //   |--------|--------|--------|--------|--------|--------|\n  // 4 |        |        |    > v |    > v |    > v |        |\n  //   |--------|--------|--------|--------|--------|--------|\n  // 5 |        |        |        |    v   |        |        |\n  //   |--------|--------|--------|--------|--------|--------|\n  //\n  // original range (1,2,4,5) expanded one cell to right and down\n  //  '> h' indicates horizontal target copy area\n  //  '> v' indicates vertical target copy area\n  // note bottom right (corner) cell is considered part of vertical copy area\n\n  public static normaliseDragRange(rawRange: DragRange) {\n    // depending how the range is created (drag up/down) the start row/cell may be\n    // greater or less thatn the end row/cell. Create a guaranteed left/down\n    // progressive range (ie. start row/cell < end row/cell)\n\n    const rtn: DragRange = {\n      start: {\n        row: (rawRange.end.row ?? 0) > (rawRange.start.row ?? 0) ? rawRange.start.row : rawRange.end.row,\n        cell: (rawRange.end.cell ?? 0) > (rawRange.start.cell ?? 0) ? rawRange.start.cell : rawRange.end.cell\n      },\n      end: {\n        row: (rawRange.end.row ?? 0) > (rawRange.start.row ?? 0) ? rawRange.end.row : rawRange.start.row,\n        cell: (rawRange.end.cell ?? 0) > (rawRange.start.cell ?? 0) ? rawRange.end.cell : rawRange.start.cell\n      }\n    };\n    rtn.rowCount = (rtn.end.row ?? 0) - (rtn.start.row ?? 0) + 1;\n    rtn.cellCount = (rtn.end.cell ?? 0) - (rtn.start.cell ?? 0) + 1;\n\n    rtn.wasDraggedUp = (rawRange.end.row ?? 0) < (rawRange.start.row ?? 0);\n    rtn.wasDraggedLeft = (rawRange.end.row ?? 0) < (rawRange.start.row ?? 0);\n\n    return rtn;\n  }\n\n  public static copyRangeIsLarger(baseRange: SlickRange, copyToRange: SlickRange): boolean {\n    return copyToRange.fromRow < baseRange.fromRow\n      || copyToRange.fromCell < baseRange.fromCell\n      || copyToRange.toRow > baseRange.toRow\n      || copyToRange.toCell > baseRange.toCell\n      ;\n  }\n\n  public static normalRangeOppositeCellFromCopy(normalisedDragRange: DragRange, targetCell: { row: number, cell: number }): { row: number, cell: number } {\n    const row = targetCell.row < (normalisedDragRange.end.row || 0)\n      ? (normalisedDragRange.end.row || 0)\n      : (normalisedDragRange.start.row || 0)\n      ;\n    const cell = targetCell.cell < (normalisedDragRange.end.cell || 0)\n      ? (normalisedDragRange.end.cell || 0)\n      : (normalisedDragRange.start.cell || 0)\n      ;\n    return { row, cell };\n  }\n\n  // copy to range above or below - includes corner space target range\n  public static verticalTargetRange(baseRange: SlickRange, copyToRange: SlickRange) {\n    const copyUp = copyToRange.fromRow < baseRange.fromRow;\n    const copyDown = copyToRange.toRow > baseRange.toRow;\n    if (!copyUp && !copyDown) {\n      return null;\n    }\n    let rtn;\n    if (copyUp) {\n      rtn = new Range(copyToRange.fromRow, copyToRange.fromCell, baseRange.fromRow - 1, baseRange.toCell);\n    } else {\n      rtn = new Range(baseRange.toRow + 1, copyToRange.fromCell, copyToRange.toRow, baseRange.toCell);\n    }\n    return rtn;\n  }\n\n  // copy to range left or right - excludes corner space target range\n  public static horizontalTargetRange(baseRange: SlickRange, copyToRange: SlickRange) {\n    const copyLeft = copyToRange.fromCell < baseRange.fromCell;\n    const copyRight = copyToRange.toCell > baseRange.toCell;\n    if (!copyLeft && !copyRight) {\n      return null;\n    }\n    let rtn;\n    if (copyLeft) {\n      rtn = new Range(baseRange.fromRow, copyToRange.fromCell, baseRange.toRow, baseRange.fromCell - 1);\n    } else {\n      rtn = new Range(baseRange.fromRow, baseRange.toCell + 1, baseRange.toRow, copyToRange.toCell);\n    }\n    return rtn;\n  }\n\n  // copy to corner space target range\n  public static cornerTargetRange(baseRange: SlickRange, copyToRange: SlickRange) {\n    const copyUp = copyToRange.fromRow < baseRange.fromRow;\n    const copyDown = copyToRange.toRow > baseRange.toRow;\n    const copyLeft = copyToRange.fromCell < baseRange.fromCell;\n    const copyRight = copyToRange.toCell > baseRange.toCell;\n    if ((!copyLeft && !copyRight) || (!copyUp && !copyDown)) {\n      return null;\n    }\n    let rtn;\n    if (copyLeft) {\n      if (copyUp) {\n        rtn = new Range(copyToRange.fromRow, copyToRange.fromCell, baseRange.fromRow - 1, baseRange.fromCell - 1);\n      } else {\n        rtn = new Range(baseRange.toRow + 1, copyToRange.fromCell, copyToRange.toRow, baseRange.fromCell - 1);\n      }\n    } else {\n      if (copyUp) {\n        rtn = new Range(copyToRange.fromRow, baseRange.toCell + 1, baseRange.fromRow - 1, copyToRange.toCell);\n      } else {\n        rtn = new Range(baseRange.toRow + 1, baseRange.toCell + 1, copyToRange.toRow, copyToRange.toCell);\n      }\n    }\n    return rtn;\n  }\n\n  public static copyCellsToTargetRange(baseRange: SlickRange, targetRange: SlickRange, grid: SlickGrid) {\n    let fromRowOffset = 0, fromCellOffset = 0;\n    const columns = grid.getVisibleColumns();\n    const options = grid.getOptions();\n\n    for (let i = 0; i < targetRange.rowCount(); i++) {\n      const toRow = grid.getDataItem(targetRange.fromRow + i);\n      const fromRow = grid.getDataItem(baseRange.fromRow + fromRowOffset);\n      fromCellOffset = 0;\n\n      for (let j = 0; j < targetRange.cellCount(); j++) {\n        const toColDef = columns[targetRange.fromCell + j];\n        const fromColDef = columns[baseRange.fromCell + fromCellOffset];\n\n        if (!toColDef.hidden && !fromColDef.hidden) {\n          let val = fromRow[fromColDef.field];\n          if (options.dataItemColumnValueExtractor) {\n            val = options.dataItemColumnValueExtractor(fromRow, fromColDef);\n          }\n          toRow[toColDef.field] = val;\n        }\n\n        fromCellOffset++;\n        if (fromCellOffset >= baseRange.cellCount()) { fromCellOffset = 0; }\n      }\n\n      fromRowOffset++;\n      if (fromRowOffset >= baseRange.rowCount()) { fromRowOffset = 0; }\n    }\n  }\n}\n\nexport const SlickGlobalEditorLock = new SlickEditorLock();\n\n// export Slick namespace on both global & window objects\nconst SlickCore = {\n  Event: SlickEvent,\n  EventData: SlickEventData,\n  EventHandler: SlickEventHandler,\n  Range: SlickRange,\n  CopyRange: SlickCopyRange,\n  DragExtendHandle: SlickDragExtendHandle,\n  NonDataRow: SlickNonDataItem,\n  Group: SlickGroup,\n  GroupTotals: SlickGroupTotals,\n  EditorLock: SlickEditorLock,\n  RegexSanitizer: regexSanitizer,\n\n  /**\n   * A global singleton editor lock.\n   * @class GlobalEditorLock\n   * @static\n   * @constructor\n   */\n  GlobalEditorLock: SlickGlobalEditorLock,\n\n  keyCode: {\n    SPACE: 8,\n    BACKSPACE: 8,\n    DELETE: 46,\n    DOWN: 40,\n    END: 35,\n    ENTER: 13,\n    ESCAPE: 27,\n    HOME: 36,\n    INSERT: 45,\n    LEFT: 37,\n    PAGE_DOWN: 34,\n    PAGE_UP: 33,\n    RIGHT: 39,\n    TAB: 9,\n    UP: 38,\n    A: 65\n  },\n  preClickClassName: 'slick-edit-preclick',\n\n  GridAutosizeColsMode: {\n    None: 'NOA',\n    LegacyOff: 'LOF',\n    LegacyForceFit: 'LFF',\n    IgnoreViewport: 'IGV',\n    FitColsToViewport: 'FCV',\n    FitViewportToCols: 'FVC'\n  },\n\n  'ColAutosizeMode': {\n    Locked: 'LCK',\n    Guide: 'GUI',\n    Content: 'CON',\n    ContentExpandOnly: 'CXO',\n    ContentIntelligent: 'CTI'\n  },\n\n  'RowSelectionMode': {\n    FirstRow: 'FS1',\n    FirstNRows: 'FSN',\n    AllRows: 'ALL',\n    LastRow: 'LS1'\n  },\n\n  'CellSelectionMode': {\n    Select: \"SEL\",\n    Replace: \"REP\"\n  },\n\n  'ValueFilterMode': {\n    None: 'NONE',\n    DeDuplicate: 'DEDP',\n    GetGreatestAndSub: 'GR8T',\n    GetLongestTextAndSub: 'LNSB',\n    GetLongestText: 'LNSC'\n  },\n\n  WidthEvalMode: {\n    Auto: 'AUTO',\n    TextOnly: 'CANV',\n    HTML: 'HTML'\n  }\n};\n\nexport const {\n  EditorLock, Event, EventData, EventHandler, Group, GroupTotals, NonDataRow, Range, CopyRange, DragExtendHandle,\n  RegexSanitizer, GlobalEditorLock, keyCode, preClickClassName, GridAutosizeColsMode, ColAutosizeMode,\n  RowSelectionMode, CellSelectionMode, ValueFilterMode, WidthEvalMode\n} = SlickCore;\n\n// also add to global object when exist\nif (IIFE_ONLY && typeof global !== 'undefined' && window.Slick) {\n  global.Slick = window.Slick;\n}\n", "import { BindingEventService as BindingEventService_, Event as SlickEvent_, type SlickEventData, Utils as Utils_ } from '../slick.core.js';\nimport type { Column, ColumnPickerOption, DOMMouseOrTouchEvent, GridOption, OnColumnsChangedArgs } from '../models/index.js';\nimport type { SlickGrid } from '../slick.grid.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst BindingEventService = IIFE_ONLY ? Slick.BindingEventService : BindingEventService_;\nconst SlickEvent = IIFE_ONLY ? Slick.Event : SlickEvent_;\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\n/***\n * A control to add a Column Picker (right+click on any column header to reveal the column picker)\n * NOTE: this a simplified and updated version of slick.columnpicker.js\n *\n * USAGE:\n *\n * Add the slick.columnpicker.(js|css) files and register it with the grid.\n *\n * Available options, by defining a columnPicker object:\n *\n *  let options = {\n *    enableCellNavigation: true,\n *    columnPicker: {\n *      columnTitle: \"Columns\",                 // default to empty string\n *\n *      // the last 2 checkboxes titles\n *      hideForceFitButton: false,              // show/hide checkbox near the end \"Force Fit Columns\" (default:false)\n *      hideSyncResizeButton: false,            // show/hide checkbox near the end \"Synchronous Resize\" (default:false)\n *      forceFitTitle: \"Force fit columns\",     // default to \"Force fit columns\"\n *      headerColumnValueExtractor: \"Extract the column label\" // default to column.name\n *      syncResizeTitle: \"Synchronous resize\",  // default to \"Synchronous resize\"\n *    }\n *  };\n */\n\nexport class SlickColumnMenu {\n  // --\n  // public API\n  onColumnsChanged = new SlickEvent<OnColumnsChangedArgs>('onColumnsChanged');\n\n  // --\n  // protected props\n  protected _gridUid: string;\n  protected _columnTitleElm!: HTMLElement;\n  protected _listElm!: HTMLElement;\n  protected _menuElm!: HTMLElement;\n  protected _columnCheckboxes: HTMLInputElement[] = [];\n  protected _bindingEventService = new BindingEventService();\n  protected _options: GridOption;\n  protected _defaults: ColumnPickerOption = {\n    fadeSpeed: 250,\n\n    // the last 2 checkboxes titles\n    hideForceFitButton: false,\n    hideSyncResizeButton: false,\n    forceFitTitle: 'Force fit columns',\n    syncResizeTitle: 'Synchronous resize',\n    headerColumnValueExtractor: (columnDef: Column) => Utils.getHtmlStringOutput(columnDef.name || '', 'innerHTML'),\n  };\n\n  constructor(protected columns: Column[], protected readonly grid: SlickGrid, options: GridOption) {\n    this._gridUid = grid.getUID();\n    this._options = Utils.extend({}, this._defaults, options);\n    this.init(this.grid);\n  }\n\n  init(grid: SlickGrid) {\n    Utils.addSlickEventPubSubWhenDefined(grid.getPubSubService(), this);\n    grid.onHeaderContextMenu.subscribe(this.handleHeaderContextMenu.bind(this));\n    grid.onColumnsReordered.subscribe(this.updateColumnOrder.bind(this));\n\n    this._menuElm = document.createElement('div');\n    this._menuElm.className = `slick-columnpicker ${this._gridUid}`;\n    this._menuElm.style.display = 'none';\n    document.body.appendChild(this._menuElm);\n\n    const buttonElm = document.createElement('button');\n    buttonElm.type = 'button';\n    buttonElm.className = 'close';\n    buttonElm.dataset.dismiss = 'slick-columnpicker';\n    buttonElm.ariaLabel = 'Close';\n\n    const spanCloseElm = document.createElement('span');\n    spanCloseElm.className = 'close';\n    spanCloseElm.ariaHidden = 'true';\n    spanCloseElm.textContent = '\u00D7';\n    buttonElm.appendChild(spanCloseElm);\n    this._menuElm.appendChild(buttonElm);\n\n    // user could pass a title on top of the columns list\n    if (this._options.columnPickerTitle || (this._options.columnPicker?.columnTitle)) {\n      const columnTitle = this._options.columnPickerTitle || this._options.columnPicker?.columnTitle;\n      this._columnTitleElm = document.createElement('div');\n      this._columnTitleElm.className = 'slick-gridmenu-custom';\n      this._columnTitleElm.textContent = columnTitle || '';\n      this._menuElm.appendChild(this._columnTitleElm);\n    }\n\n    this._bindingEventService.bind(this._menuElm, 'click', this.updateColumn.bind(this) as EventListener);\n\n    this._listElm = document.createElement('span');\n    this._listElm.className = 'slick-columnpicker-list';\n\n    // Hide the menu on outside click.\n    this._bindingEventService.bind(document.body, 'mousedown', this.handleBodyMouseDown.bind(this) as EventListener);\n\n    // destroy the picker if user leaves the page\n    this._bindingEventService.bind(document.body, 'beforeunload', this.destroy.bind(this));\n  }\n\n  destroy() {\n    this.grid.onHeaderContextMenu.unsubscribe(this.handleHeaderContextMenu.bind(this));\n    this.grid.onColumnsReordered.unsubscribe(this.updateColumnOrder.bind(this));\n    this._bindingEventService.unbindAll();\n    this._listElm?.remove();\n    this._menuElm?.remove();\n  }\n\n  handleBodyMouseDown(e: DOMMouseOrTouchEvent<HTMLDivElement>) {\n    if ((this._menuElm !== e.target && !(this._menuElm && this._menuElm.contains(e.target))) || e.target.className === 'close') {\n      this._menuElm.setAttribute('aria-expanded', 'false');\n      this._menuElm.style.display = 'none';\n    }\n  }\n\n  handleHeaderContextMenu(e: SlickEventData) {\n    e.preventDefault();\n    Utils.emptyElement(this._listElm);\n    this.updateColumnOrder();\n    this._columnCheckboxes = [];\n\n    let columnId, columnLabel, excludeCssClass;\n    for (let i = 0; i < this.columns.length; i++) {\n      columnId = this.columns[i].id;\n      const colName: string = this.columns[i].name instanceof HTMLElement\n        ? (this.columns[i].name as HTMLElement).innerHTML\n        : (this.columns[i].name || '') as string;\n      excludeCssClass = this.columns[i].excludeFromColumnPicker ? 'hidden' : '';\n\n      const liElm = document.createElement('li');\n      liElm.className = excludeCssClass;\n      liElm.ariaLabel = colName;\n\n      const checkboxElm = document.createElement('input');\n      checkboxElm.type = 'checkbox';\n      checkboxElm.id = `${this._gridUid}colpicker-${columnId}`;\n      checkboxElm.dataset.columnid = String(this.columns[i].id);\n      liElm.appendChild(checkboxElm);\n\n      this._columnCheckboxes.push(checkboxElm);\n\n      if (Utils.isDefined(this.grid.getColumnIndex(columnId)) && !this.columns[i].hidden) {\n        checkboxElm.checked = true;\n      }\n\n      columnLabel = (this._options?.columnPicker?.headerColumnValueExtractor)\n        ? this._options.columnPicker.headerColumnValueExtractor(this.columns[i], this._options)\n        : this._defaults.headerColumnValueExtractor!(this.columns[i], this._options);\n\n      const labelElm = document.createElement('label');\n      labelElm.htmlFor = `${this._gridUid}colpicker-${columnId}`;\n      this.grid.applyHtmlCode(labelElm, columnLabel);\n      liElm.appendChild(labelElm);\n      this._listElm.appendChild(liElm);\n    }\n\n    if (this._options.columnPicker && (!this._options.columnPicker.hideForceFitButton || !this._options.columnPicker.hideSyncResizeButton)) {\n      this._listElm.appendChild(document.createElement('hr'));\n    }\n\n    if (!this._options.columnPicker?.hideForceFitButton) {\n      const forceFitTitle = this._options.columnPicker?.forceFitTitle || this._options.forceFitTitle;\n\n      const liElm = document.createElement('li');\n      liElm.ariaLabel = forceFitTitle || '';\n      this._listElm.appendChild(liElm);\n\n      const forceFitCheckboxElm = document.createElement('input');\n      forceFitCheckboxElm.type = 'checkbox';\n      forceFitCheckboxElm.id = `${this._gridUid}colpicker-forcefit`;\n      forceFitCheckboxElm.dataset.option = 'autoresize';\n      liElm.appendChild(forceFitCheckboxElm);\n\n      const labelElm = document.createElement('label');\n      labelElm.htmlFor = `${this._gridUid}colpicker-forcefit`;\n      labelElm.textContent = forceFitTitle || '';\n      liElm.appendChild(labelElm);\n\n      if (this.grid.getOptions().forceFitColumns) {\n        forceFitCheckboxElm.checked = true;\n      }\n    }\n\n    if (!this._options.columnPicker?.hideSyncResizeButton) {\n      const syncResizeTitle = this._options.columnPicker?.syncResizeTitle || this._options.syncResizeTitle;\n\n      const liElm = document.createElement('li');\n      liElm.ariaLabel = syncResizeTitle || '';\n      this._listElm.appendChild(liElm);\n\n      const syncResizeCheckboxElm = document.createElement('input');\n      syncResizeCheckboxElm.type = 'checkbox';\n      syncResizeCheckboxElm.id = `${this._gridUid}colpicker-syncresize`;\n      syncResizeCheckboxElm.dataset.option = 'syncresize';\n      liElm.appendChild(syncResizeCheckboxElm);\n\n      const labelElm = document.createElement('label');\n      labelElm.htmlFor = `${this._gridUid}colpicker-syncresize`;\n      labelElm.textContent = syncResizeTitle || '';\n      liElm.appendChild(labelElm);\n\n      if (this.grid.getOptions().syncColumnCellResize) {\n        syncResizeCheckboxElm.checked = true;\n      }\n    }\n\n    this.repositionMenu(e);\n  }\n\n  repositionMenu(event: DOMMouseOrTouchEvent<HTMLDivElement> | SlickEventData) {\n    const targetEvent = (event as TouchEvent)?.touches?.[0] || event;\n    this._menuElm.style.top = `${targetEvent.pageY - 10}px`;\n    this._menuElm.style.left = `${targetEvent.pageX - 10}px`;\n    this._menuElm.style.maxHeight = `${window.innerHeight - targetEvent.clientY}px`;\n    this._menuElm.style.display = 'block';\n    this._menuElm.setAttribute('aria-expanded', 'true');\n    this._menuElm.appendChild(this._listElm);\n  }\n\n  updateColumnOrder() {\n    // Because columns can be reordered, we have to update the `columns`\n    // to reflect the new order, however we can't just take `grid.getColumns()`,\n    // as it does not include columns currently hidden by the picker.\n    // We create a new `columns` structure by leaving currently-hidden\n    // columns in their original ordinal position and interleaving the results\n    // of the current column sort.\n    const current = this.grid.getColumns().slice(0);\n    const ordered = new Array(this.columns.length);\n    for (let i = 0; i < ordered.length; i++) {\n      if (this.grid.getColumnIndex(this.columns[i].id) === undefined) {\n        // If the column doesn't return a value from getColumnIndex,\n        // it is hidden. Leave it in this position.\n        ordered[i] = this.columns[i];\n      } else {\n        // Otherwise, grab the next visible column.\n        ordered[i] = current.shift();\n      }\n    }\n    this.columns = ordered;\n  }\n\n  /** Update the Titles of each sections (command, customTitle, ...) */\n  updateAllTitles(pickerOptions: { columnTitle: string; }) {\n    this.grid.applyHtmlCode(this._columnTitleElm, pickerOptions.columnTitle);\n  }\n\n  updateColumn(e: DOMMouseOrTouchEvent<HTMLInputElement>) {\n    if (e.target.dataset.option === 'autoresize') {\n      // when calling setOptions, it will resize with ALL Columns (even the hidden ones)\n      // we can avoid this problem by keeping a reference to the visibleColumns before setOptions and then setColumns after\n      const previousVisibleColumns = this.getVisibleColumns();\n      const isChecked = e.target.checked;\n      this.grid.setOptions({ forceFitColumns: isChecked });\n      this.grid.setColumns(previousVisibleColumns);\n      return;\n    }\n\n    if (e.target.dataset.option === 'syncresize') {\n      if (e.target.checked) {\n        this.grid.setOptions({ syncColumnCellResize: true });\n      } else {\n        this.grid.setOptions({ syncColumnCellResize: false });\n      }\n      return;\n    }\n\n    if (e.target.type === 'checkbox') {\n      const isChecked = e.target.checked;\n      const columnId = e.target.dataset.columnid || '';\n      const visibleColumns: Column[] = [];\n      this._columnCheckboxes.forEach((columnCheckbox, idx) => {\n        if (this.columns[idx].hidden !== undefined) { this.columns[idx].hidden = !columnCheckbox.checked; }\n        if (columnCheckbox.checked) {\n          visibleColumns.push(this.columns[idx]);\n        }\n      });\n\n      if (!visibleColumns.length) {\n        e.target.checked = true;\n        return;\n      }\n\n      this.grid.setColumns(visibleColumns);\n      this.onColumnsChanged.notify({ columnId, showing: isChecked, allColumns: this.columns, columns: this.columns, visibleColumns, grid: this.grid });\n    }\n  }\n\n  /** @deprecated because of a typo @use `setColumnVisibility()` instead */\n  setColumnVisibiliy(idxOrId: number | string, show: boolean) {\n    this.setColumnVisibility(idxOrId, show);\n  }\n\n  setColumnVisibility(idxOrId: number | string, show: boolean) {\n    const idx = typeof idxOrId === 'number' ? idxOrId : this.getColumnIndexbyId(idxOrId);\n    let visibleColumns: Column[] = this.getVisibleColumns();\n    const col = this.columns[idx];\n    if (show) {\n      col.hidden = false;\n      visibleColumns.splice(idx, 0, col);\n    } else {\n      const newVisibleColumns: Column[] = [];\n      for (let i = 0; i < visibleColumns.length; i++) {\n        if (visibleColumns[i].id !== col.id) { newVisibleColumns.push(visibleColumns[i]); }\n      }\n      visibleColumns = newVisibleColumns;\n    }\n\n    this.grid.setColumns(visibleColumns);\n    this.onColumnsChanged.notify({ columnId: col.id, showing: show, allColumns: this.columns, columns: this.columns, visibleColumns, grid: this.grid });\n  }\n\n  getAllColumns() {\n    return this.columns;\n  }\n\n  getColumnbyId(id: number | string) {\n    for (let i = 0; i < this.columns.length; i++) {\n      if (this.columns[i].id === id) { return this.columns[i]; }\n    }\n    return null;\n  }\n\n  getColumnIndexbyId(id: number | string) {\n    for (let i = 0; i < this.columns.length; i++) {\n      if (this.columns[i].id === id) { return i; }\n    }\n    return -1;\n  }\n\n  /** visible columns, we can simply get them directly from the grid */\n  getVisibleColumns() {\n    return this.grid.getColumns();\n  }\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  window.Slick.Controls = window.Slick.Controls || {};\n  window.Slick.Controls.ColumnPicker = SlickColumnMenu;\n}\n", "import { BindingEventService as BindingEventService_, Event as SlickEvent_, type SlickEventData, Utils as Utils_ } from '../slick.core.js';\nimport type { Column, ColumnPickerOption, DOMMouseOrTouchEvent, GridOption, OnColumnsChangedArgs } from '../models/index.js';\nimport type { SlickGrid } from '../slick.grid.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst BindingEventService = IIFE_ONLY ? Slick.BindingEventService : BindingEventService_;\nconst SlickEvent = IIFE_ONLY ? Slick.Event : SlickEvent_;\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\n/***\n * A control to add a Column Picker (right+click on any column header to reveal the column picker)\n * NOTE: this is the old 'complex' column pciker that hides columns by removing them from the grid\n *        for a more modern version that uses the column.hidden property and is a lot simpler, use slick.columnmenu.js\n *\n * USAGE:\n *\n * Add the slick.columnpicker.(js|css) files and register it with the grid.\n *\n * Available options, by defining a columnPicker object:\n *\n *  let options = {\n *    enableCellNavigation: true,\n *    columnPicker: {\n *      columnTitle: \"Columns\",                 // default to empty string\n *\n *      // the last 2 checkboxes titles\n *      hideForceFitButton: false,              // show/hide checkbox near the end \"Force Fit Columns\" (default:false)\n *      hideSyncResizeButton: false,            // show/hide checkbox near the end \"Synchronous Resize\" (default:false)\n *      forceFitTitle: \"Force fit columns\",     // default to \"Force fit columns\"\n *      headerColumnValueExtractor: \"Extract the column label\" // default to column.name\n *      syncResizeTitle: \"Synchronous resize\",  // default to \"Synchronous resize\"\n *    }\n *  };\n */\n\nexport class SlickColumnPicker {\n  // --\n  // public API\n  onColumnsChanged = new SlickEvent<OnColumnsChangedArgs>('onColumnsChanged');\n\n  // --\n  // protected props\n  protected _gridUid: string;\n  protected _columnTitleElm!: HTMLElement;\n  protected _listElm!: HTMLElement;\n  protected _menuElm!: HTMLElement;\n  protected _columnCheckboxes: HTMLInputElement[] = [];\n  protected _bindingEventService = new BindingEventService();\n  protected _gridOptions: GridOption;\n  protected _defaults: ColumnPickerOption = {\n    fadeSpeed: 250,\n\n    // the last 2 checkboxes titles\n    hideForceFitButton: false,\n    hideSyncResizeButton: false,\n    forceFitTitle: 'Force fit columns',\n    syncResizeTitle: 'Synchronous resize',\n    headerColumnValueExtractor: (columnDef: Column) => Utils.getHtmlStringOutput(columnDef.name || '', 'innerHTML'),\n  };\n\n  constructor(protected columns: Column[], protected readonly grid: SlickGrid, gridOptions: GridOption) {\n    this._gridUid = grid.getUID();\n    this._gridOptions = Utils.extend({}, this._defaults, gridOptions);\n    this.init(this.grid);\n  }\n\n  init(grid: SlickGrid) {\n    Utils.addSlickEventPubSubWhenDefined(grid.getPubSubService(), this);\n    grid.onColumnsReordered.subscribe(this.updateColumnOrder.bind(this));\n    grid.onHeaderContextMenu.subscribe(this.handleHeaderContextMenu.bind(this));\n    grid.onPreHeaderContextMenu.subscribe((e) => {\n      if (['slick-column-name', 'slick-header-column'].some(className => e.target?.classList.contains(className))) {\n        this.handleHeaderContextMenu(e); // open picker only when preheader has column groups\n      }\n    });\n\n    this._menuElm = document.createElement('div');\n    this._menuElm.className = `slick-columnpicker ${this._gridUid}`;\n    this._menuElm.style.display = 'none';\n    document.body.appendChild(this._menuElm);\n\n    const buttonElm = document.createElement('button');\n    buttonElm.type = 'button';\n    buttonElm.className = 'close';\n    buttonElm.dataset.dismiss = 'slick-columnpicker';\n    buttonElm.ariaLabel = 'Close';\n\n    const spanCloseElm = document.createElement('span');\n    spanCloseElm.className = 'close';\n    spanCloseElm.ariaHidden = 'true';\n    spanCloseElm.textContent = '\u00D7';\n    buttonElm.appendChild(spanCloseElm);\n    this._menuElm.appendChild(buttonElm);\n\n    // user could pass a title on top of the columns list\n    if (this._gridOptions.columnPickerTitle || (this._gridOptions.columnPicker?.columnTitle)) {\n      const columnTitle = this._gridOptions.columnPickerTitle || this._gridOptions.columnPicker?.columnTitle;\n      this._columnTitleElm = document.createElement('div');\n      this._columnTitleElm.className = 'slick-gridmenu-custom';\n      this._columnTitleElm.textContent = columnTitle || '';\n      this._menuElm.appendChild(this._columnTitleElm);\n    }\n\n    this._bindingEventService.bind(this._menuElm, 'click', this.updateColumn.bind(this) as EventListener);\n\n    this._listElm = document.createElement('span');\n    this._listElm.className = 'slick-columnpicker-list';\n\n    // Hide the menu on outside click.\n    this._bindingEventService.bind(document.body, 'mousedown', this.handleBodyMouseDown.bind(this) as EventListener);\n\n    // destroy the picker if user leaves the page\n    this._bindingEventService.bind(document.body, 'beforeunload', this.destroy.bind(this));\n  }\n\n  destroy() {\n    this.grid.onPreHeaderContextMenu.unsubscribe(this.handleHeaderContextMenu.bind(this));\n    this.grid.onHeaderContextMenu.unsubscribe(this.handleHeaderContextMenu.bind(this));\n    this.grid.onColumnsReordered.unsubscribe(this.updateColumnOrder.bind(this));\n    this._bindingEventService.unbindAll();\n    this._listElm?.remove();\n    this._menuElm?.remove();\n  }\n\n  protected handleBodyMouseDown(e: DOMMouseOrTouchEvent<HTMLElement>) {\n    if ((this._menuElm !== e.target && !this._menuElm?.contains(e.target)) || e.target.className === 'close') {\n      this._menuElm.setAttribute('aria-expanded', 'false');\n      this._menuElm.style.display = 'none';\n    }\n  }\n\n  protected handleHeaderContextMenu(e: SlickEventData) {\n    e.preventDefault();\n    Utils.emptyElement(this._listElm);\n    this.updateColumnOrder();\n    this._columnCheckboxes = [];\n\n    let columnId, columnLabel, excludeCssClass;\n    for (let i = 0; i < this.columns.length; i++) {\n      columnId = this.columns[i].id;\n      const colName: string = this.columns[i].name instanceof HTMLElement\n        ? (this.columns[i].name as HTMLElement).innerHTML\n        : (this.columns[i].name || '') as string;\n      excludeCssClass = this.columns[i].excludeFromColumnPicker ? 'hidden' : '';\n\n      const liElm = document.createElement('li');\n      liElm.className = excludeCssClass;\n      liElm.ariaLabel = colName;\n\n      const checkboxElm = document.createElement('input');\n      checkboxElm.type = 'checkbox';\n      checkboxElm.id = `${this._gridUid}colpicker-${columnId}`;\n      checkboxElm.dataset.columnid = String(this.columns[i].id);\n      liElm.appendChild(checkboxElm);\n\n      this._columnCheckboxes.push(checkboxElm);\n\n      if (Utils.isDefined(this.grid.getColumnIndex(columnId)) && !this.columns[i].hidden) {\n        checkboxElm.checked = true;\n      }\n\n      columnLabel = (this._gridOptions?.columnPicker?.headerColumnValueExtractor)\n        ? this._gridOptions.columnPicker.headerColumnValueExtractor(this.columns[i], this._gridOptions)\n        : this._defaults.headerColumnValueExtractor!(this.columns[i], this._gridOptions);\n\n      const labelElm = document.createElement('label');\n      labelElm.htmlFor = `${this._gridUid}colpicker-${columnId}`;\n      this.grid.applyHtmlCode(labelElm, columnLabel);\n      liElm.appendChild(labelElm);\n      this._listElm.appendChild(liElm);\n    }\n\n    if (this._gridOptions.columnPicker && (!this._gridOptions.columnPicker.hideForceFitButton || !this._gridOptions.columnPicker.hideSyncResizeButton)) {\n      this._listElm.appendChild(document.createElement('hr'));\n    }\n\n    if (!(this._gridOptions.columnPicker?.hideForceFitButton)) {\n      const forceFitTitle = this._gridOptions.columnPicker?.forceFitTitle || this._gridOptions.forceFitTitle;\n\n      const liElm = document.createElement('li');\n      liElm.ariaLabel = forceFitTitle || '';\n      this._listElm.appendChild(liElm);\n\n      const forceFitCheckboxElm = document.createElement('input');\n      forceFitCheckboxElm.type = 'checkbox';\n      forceFitCheckboxElm.id = `${this._gridUid}colpicker-forcefit`;\n      forceFitCheckboxElm.dataset.option = 'autoresize';\n      liElm.appendChild(forceFitCheckboxElm);\n\n      const labelElm = document.createElement('label');\n      labelElm.htmlFor = `${this._gridUid}colpicker-forcefit`;\n      labelElm.textContent = forceFitTitle || '';\n      liElm.appendChild(labelElm);\n\n      if (this.grid.getOptions().forceFitColumns) {\n        forceFitCheckboxElm.checked = true;\n      }\n    }\n\n    if (!(this._gridOptions.columnPicker?.hideSyncResizeButton)) {\n      const syncResizeTitle = (this._gridOptions.columnPicker?.syncResizeTitle) || this._gridOptions.syncResizeTitle;\n\n      const liElm = document.createElement('li');\n      liElm.ariaLabel = syncResizeTitle || '';\n      this._listElm.appendChild(liElm);\n\n      const syncResizeCheckboxElm = document.createElement('input');\n      syncResizeCheckboxElm.type = 'checkbox';\n      syncResizeCheckboxElm.id = `${this._gridUid}colpicker-syncresize`;\n      syncResizeCheckboxElm.dataset.option = 'syncresize';\n      liElm.appendChild(syncResizeCheckboxElm);\n\n      const labelElm = document.createElement('label');\n      labelElm.htmlFor = `${this._gridUid}colpicker-syncresize`;\n      labelElm.textContent = syncResizeTitle || '';\n      liElm.appendChild(labelElm);\n\n      if (this.grid.getOptions().syncColumnCellResize) {\n        syncResizeCheckboxElm.checked = true;\n      }\n    }\n\n    this.repositionMenu(e);\n  }\n\n  protected repositionMenu(event: DOMMouseOrTouchEvent<HTMLDivElement> | SlickEventData) {\n    const targetEvent: MouseEvent | Touch = (event as TouchEvent)?.touches?.[0] ?? event;\n    if (this._menuElm) {\n      this._menuElm.style.display = 'block';\n\n      // auto-positioned menu left/right by available position\n      const gridPos = this.grid.getGridPosition();\n      const menuWidth = this._menuElm.clientWidth || 0;\n      let menuOffsetLeft = targetEvent.pageX || 0;\n      if (gridPos?.width && (menuOffsetLeft + menuWidth >= gridPos.width)) {\n        menuOffsetLeft = menuOffsetLeft - menuWidth;\n      }\n\n      this._menuElm.style.top = `${targetEvent.pageY - 10}px`;\n      this._menuElm.style.left = `${menuOffsetLeft}px`;\n      this._menuElm.style.maxHeight = `${window.innerHeight - targetEvent.clientY}px`;\n      this._menuElm.setAttribute('aria-expanded', 'true');\n      this._menuElm.appendChild(this._listElm);\n    }\n  }\n\n  protected updateColumnOrder() {\n    // Because columns can be reordered, we have to update the `columns`\n    // to reflect the new order, however we can't just take `grid.getColumns()`,\n    // as it does not include columns currently hidden by the picker.\n    // We create a new `columns` structure by leaving currently-hidden\n    // columns in their original ordinal position and interleaving the results\n    // of the current column sort.\n    const current = this.grid.getColumns().slice(0);\n    const ordered = new Array(this.columns.length);\n    for (let i = 0; i < ordered.length; i++) {\n      if (this.grid.getColumnIndex(this.columns[i].id) === undefined) {\n        // If the column doesn't return a value from getColumnIndex,\n        // it is hidden. Leave it in this position.\n        ordered[i] = this.columns[i];\n      } else {\n        // Otherwise, grab the next visible column.\n        ordered[i] = current.shift();\n      }\n    }\n    this.columns = ordered;\n  }\n\n  /** Update the Titles of each sections (command, customTitle, ...) */\n  updateAllTitles(pickerOptions: { columnTitle: string; }) {\n    this.grid.applyHtmlCode(this._columnTitleElm, pickerOptions.columnTitle);\n  }\n\n  protected updateColumn(e: DOMMouseOrTouchEvent<HTMLInputElement>) {\n    if (e.target.dataset.option === 'autoresize') {\n      // when calling setOptions, it will resize with ALL Columns (even the hidden ones)\n      // we can avoid this problem by keeping a reference to the visibleColumns before setOptions and then setColumns after\n      const previousVisibleColumns = this.getVisibleColumns();\n      const isChecked: boolean = e.target.checked || false;\n      this.grid.setOptions({ forceFitColumns: isChecked });\n      this.grid.setColumns(previousVisibleColumns);\n      return;\n    }\n\n    if (e.target.dataset.option === 'syncresize') {\n      if (e.target.checked) {\n        this.grid.setOptions({ syncColumnCellResize: true });\n      } else {\n        this.grid.setOptions({ syncColumnCellResize: false });\n      }\n      return;\n    }\n\n    if (e.target.type === 'checkbox') {\n      const isChecked = e.target.checked;\n      const columnId = e.target.dataset.columnid || '';\n      const visibleColumns: Column[] = [];\n      this._columnCheckboxes.forEach((columnCheckbox, idx) => {\n        if (this.columns[idx].hidden !== undefined) { this.columns[idx].hidden = !columnCheckbox.checked; }\n        if (columnCheckbox.checked) {\n          visibleColumns.push(this.columns[idx]);\n        }\n      });\n\n      if (!visibleColumns.length) {\n        e.target.checked = true;\n        return;\n      }\n\n      this.grid.setColumns(visibleColumns);\n      this.onColumnsChanged.notify({ columnId, showing: isChecked, allColumns: this.columns, columns: this.columns, visibleColumns, grid: this.grid });\n    }\n  }\n\n  /** @deprecated because of a typo @use `setColumnVisibility()` instead */\n  setColumnVisibiliy(idxOrId: number | string, show: boolean) {\n    this.setColumnVisibility(idxOrId, show);\n  }\n\n  setColumnVisibility(idxOrId: number | string, show: boolean) {\n    const idx = typeof idxOrId === 'number' ? idxOrId : this.getColumnIndexbyId(idxOrId);\n    let visibleColumns = this.getVisibleColumns();\n    const col = this.columns[idx];\n    if (show) {\n      col.hidden = false;\n      visibleColumns.splice(idx, 0, col);\n    } else {\n      const newVisibleColumns: Column[] = [];\n      for (let i = 0; i < visibleColumns.length; i++) {\n        if (visibleColumns[i].id !== col.id) { newVisibleColumns.push(visibleColumns[i]); }\n      }\n      visibleColumns = newVisibleColumns;\n    }\n\n    this.grid.setColumns(visibleColumns);\n    this.onColumnsChanged.notify({ columnId: col.id, showing: show, allColumns: this.columns, columns: this.columns, visibleColumns, grid: this.grid });\n  }\n\n  getAllColumns() {\n    return this.columns;\n  }\n\n  getColumnbyId(id: number | string) {\n    for (let i = 0; i < this.columns.length; i++) {\n      if (this.columns[i].id === id) { return this.columns[i]; }\n    }\n    return null;\n  }\n\n  getColumnIndexbyId(id: number | string) {\n    for (let i = 0; i < this.columns.length; i++) {\n      if (this.columns[i].id === id) { return i; }\n    }\n    return -1;\n  }\n\n  /** visible columns, we can simply get them directly from the grid */\n  getVisibleColumns() {\n    return this.grid.getColumns();\n  }\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  window.Slick.Controls = window.Slick.Controls || {};\n  window.Slick.Controls.ColumnPicker = SlickColumnPicker;\n}\n", "import type {\n  Column,\n  DOMMouseOrTouchEvent,\n  GridMenuCommandItemCallbackArgs,\n  GridMenuEventWithElementCallbackArgs,\n  GridMenuItem,\n  GridMenuOption,\n  GridOption,\n  MenuCommandItem,\n  onGridMenuColumnsChangedCallbackArgs\n} from '../models/index.js';\nimport { BindingEventService as BindingEventService_, SlickEvent as SlickEvent_, Utils as Utils_ } from '../slick.core.js';\nimport type { SlickGrid } from '../slick.grid.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst BindingEventService = IIFE_ONLY ? Slick.BindingEventService : BindingEventService_;\nconst SlickEvent = IIFE_ONLY ? Slick.Event : SlickEvent_;\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\n/**\n * A control to add a Grid Menu (hambuger menu on top-right of the grid)\n *\n * USAGE:\n *\n * Add the slick.gridmenu.(js|css) files and register it with the grid.\n *\n * To specify a menu in a column header, extend the column definition like so:\n * let gridMenuControl = new Slick.Controls.GridMenu(columns, grid, options);\n *\n * Available grid options, by defining a gridMenu object:\n *\n *  let options = {\n *    enableCellNavigation: true,\n *    gridMenu: {\n *      commandTitle: \"Command List\",                // default to empty string\n *      columnTitle: \"Columns\",                     // default to empty string\n *      iconImage: \"some-image.png\",                // this is the Grid Menu icon (hamburger icon)\n *      iconCssClass: \"fa fa-bars\",                 // you can provide iconImage OR iconCssClass\n *      leaveOpen: false,                           // do we want to leave the Grid Menu open after a command execution? (false by default)\n *      menuWidth: 18,                              // width (icon) that will be use to resize the column header container (18 by default)\n *      contentMinWidth: 0,\t\t\t\t\t\t\t            // defaults to 0 (auto), minimum width of grid menu content (command, column list)\n *      marginBottom: 15,                           // defaults to 15, margin to use at the bottom of the grid when using max-height (default)\n *      resizeOnShowHeaderRow: false,               // false by default\n *      showButton: true,                           // true by default - it allows the user to control if the\n *                                                          // default gridMenu button (located on the top right corner by default CSS)\n *                                                          // should be created or omitted\n *      useClickToRepositionMenu: true,             // true by default\n *\n *      // the last 2 checkboxes titles\n *      hideForceFitButton: false,                  // show/hide checkbox near the end \"Force Fit Columns\"\n *      hideSyncResizeButton: false,                // show/hide checkbox near the end \"Synchronous Resize\"\n *      forceFitTitle: \"Force fit columns\",         // default to \"Force fit columns\"\n *      syncResizeTitle: \"Synchronous resize\",      // default to \"Synchronous resize\"\n *\n *      commandItems: [\n *        {\n *          // command menu item options\n *        },\n *        {\n *          // command menu item options\n *        }\n *      ]\n *    }\n *  };\n *\n *\n * Available menu options:\n *    hideForceFitButton:         Hide the \"Force fit columns\" button (defaults to false)\n *    hideSyncResizeButton:       Hide the \"Synchronous resize\" button (defaults to false)\n *    forceFitTitle:              Text of the title \"Force fit columns\"\n *    contentMinWidth:\t\t\t\t\t\tminimum width of grid menu content (command, column list), defaults to 0 (auto)\n *    height:                     Height of the Grid Menu content, when provided it will be used instead of the max-height (defaults to undefined)\n *    menuWidth:                  Grid menu button width (defaults to 18)\n *    resizeOnShowHeaderRow:      Do we want to resize on the show header row event\n *    syncResizeTitle:            Text of the title \"Synchronous resize\"\n *    useClickToRepositionMenu:   Use the Click offset to reposition the Grid Menu (defaults to true), when set to False it will use the icon offset to reposition the grid menu\n *    menuUsabilityOverride:      Callback method that user can override the default behavior of enabling/disabling the menu from being usable (must be combined with a custom formatter)\n *    marginBottom:               Margin to use at the bottom of the grid menu, only in effect when height is undefined (defaults to 15)\n *    subItemChevronClass:        CSS class that can be added on the right side of a sub-item parent (typically a chevron-right icon)\n *    subMenuOpenByEvent:         defaults to \"mouseover\", what event type shoud we use to open sub-menu(s), 2 options are available: \"mouseover\" or \"click\"\n *\n * Available command menu item options:\n *    action:                     Optionally define a callback function that gets executed when item is chosen (and/or use the onCommand event)\n *    title:                      Menu item text.\n *    divider:                    Whether the current item is a divider, not an actual command.\n *    disabled:                   Whether the item/command is disabled.\n *    hidden:                     Whether the item/command is hidden.\n *    tooltip:                    Item tooltip.\n *    command:                    A command identifier to be passed to the onCommand event handlers.\n *    cssClass:                   A CSS class to be added to the menu item container.\n *    iconCssClass:               A CSS class to be added to the menu item icon.\n *    iconImage:                  A url to the icon image.\n *    textCssClass:               A CSS class to be added to the menu item text.\n *    subMenuTitle:               Optional sub-menu title that will shows up when sub-menu commmands/options list is opened\n *    subMenuTitleCssClass:       Optional sub-menu title CSS class to use with `subMenuTitle`\n *    itemVisibilityOverride:     Callback method that user can override the default behavior of showing/hiding an item from the list\n *    itemUsabilityOverride:      Callback method that user can override the default behavior of enabling/disabling an item from the list\n *\n *\n * The plugin exposes the following events:\n *\n *    onAfterMenuShow:   Fired after the menu is shown.  You can customize the menu or dismiss it by returning false.\n *      * ONLY works with a JS event (as per slick.core code), so we cannot notify when it's a button event (when grid menu is attached to an external button, not the hamburger menu)\n *        Event args:\n *            grid:     Reference to the grid.\n *            column:   Column definition.\n *            menu:     Menu options.  Note that you can change the menu items here.\n *\n *    onBeforeMenuShow:   Fired before the menu is shown.  You can customize the menu or dismiss it by returning false.\n *      * ONLY works with a JS event (as per slick.core code), so we cannot notify when it's a button event (when grid menu is attached to an external button, not the hamburger menu)\n *        Event args:\n *            grid:     Reference to the grid.\n *            column:   Column definition.\n *            menu:     Menu options.  Note that you can change the menu items here.\n *\n *    onMenuClose:      Fired when the menu is closing.\n *        Event args:\n *            grid:     Reference to the grid.\n *            column:   Column definition.\n *            menu:     Menu options.  Note that you can change the menu items here.\n *\n *    onCommand:    Fired on menu item click for buttons with 'command' specified.\n *        Event args:\n *            grid:     Reference to the grid.\n *            column:   Column definition.\n *            command:  Button command identified.\n *            button:   Button options.  Note that you can change the button options in your\n *                      event handler, and the column header will be automatically updated to\n *                      reflect them.  This is useful if you want to implement something like a\n *                      toggle button.\n */\n\nexport class SlickGridMenu {\n  // --\n  // public API\n  onAfterMenuShow = new SlickEvent<GridMenuEventWithElementCallbackArgs>('onAfterMenuShow');\n  onBeforeMenuShow = new SlickEvent<GridMenuEventWithElementCallbackArgs>('onBeforeMenuShow');\n  onMenuClose = new SlickEvent<GridMenuEventWithElementCallbackArgs>('onMenuClose');\n  onCommand = new SlickEvent<GridMenuCommandItemCallbackArgs>('onCommand');\n  onColumnsChanged = new SlickEvent<onGridMenuColumnsChangedCallbackArgs>('onColumnsChanged');\n\n  // --\n  // protected props\n  protected _bindingEventService: BindingEventService_;\n  protected _gridOptions: GridOption;\n  protected _gridUid: string;\n  protected _isMenuOpen = false;\n  protected _columnCheckboxes: HTMLInputElement[] = [];\n  protected _columnTitleElm!: HTMLElement;\n  protected _commandTitleElm!: HTMLElement;\n  protected _commandListElm!: HTMLDivElement;\n  protected _headerElm: HTMLDivElement | null = null;\n  protected _listElm!: HTMLElement;\n  protected _buttonElm!: HTMLElement;\n  protected _menuElm!: HTMLElement;\n  protected _subMenuParentId = '';\n  protected _gridMenuOptions: GridMenuOption | null = null;\n  protected _defaults: GridMenuOption = {\n    showButton: true,\n    hideForceFitButton: false,\n    hideSyncResizeButton: false,\n    forceFitTitle: 'Force fit columns',\n    marginBottom: 15,\n    menuWidth: 18,\n    contentMinWidth: 0,\n    resizeOnShowHeaderRow: false,\n    subMenuOpenByEvent: 'mouseover',\n    syncResizeTitle: 'Synchronous resize',\n    useClickToRepositionMenu: true,\n    headerColumnValueExtractor: (columnDef: Column) => Utils.getHtmlStringOutput(columnDef.name || '', 'innerHTML'),\n  };\n\n  constructor(protected columns: Column[], protected readonly grid: SlickGrid, gridOptions: GridOption) {\n    this._gridUid = grid.getUID();\n    this._gridOptions = gridOptions;\n    this._gridMenuOptions = Utils.extend({}, this._defaults, gridOptions.gridMenu);\n    this._bindingEventService = new BindingEventService();\n\n    // when a grid optionally changes from a regular grid to a frozen grid, we need to destroy & recreate the grid menu\n    // we do this change because the Grid Menu is on the left container for a regular grid, it is however on the right container for a frozen grid\n    grid.onSetOptions.subscribe((_e, args) => {\n      if (args && args.optionsBefore && args.optionsAfter) {\n        const switchedFromRegularToFrozen = args.optionsBefore.frozenColumn! >= 0 && args.optionsAfter.frozenColumn === -1;\n        const switchedFromFrozenToRegular = args.optionsBefore.frozenColumn === -1 && args.optionsAfter.frozenColumn! >= 0;\n        if (switchedFromRegularToFrozen || switchedFromFrozenToRegular) {\n          this.recreateGridMenu();\n        }\n      }\n    });\n    this.init(this.grid);\n  }\n\n  init(grid: SlickGrid) {\n    this._gridOptions = grid.getOptions();\n    Utils.addSlickEventPubSubWhenDefined(grid.getPubSubService(), this);\n    this.createGridMenu();\n\n    if (this._gridMenuOptions?.customItems || this._gridMenuOptions?.customTitle) {\n      console.warn('[SlickGrid] Grid Menu \"customItems\" and \"customTitle\" were deprecated to align with other Menu plugins, please use \"commandItems\" and \"commandTitle\" instead.');\n    }\n\n    // subscribe to the grid, when it's destroyed, we should also destroy the Grid Menu\n    grid.onBeforeDestroy.subscribe(this.destroy.bind(this));\n  }\n\n  setOptions(newOptions: GridMenuOption) {\n    this._gridMenuOptions = Utils.extend({}, this._gridMenuOptions, newOptions);\n  }\n\n  protected createGridMenu() {\n    const gridMenuWidth = (this._gridMenuOptions?.menuWidth) || this._defaults.menuWidth;\n    if (this._gridOptions && this._gridOptions.hasOwnProperty('frozenColumn') && this._gridOptions.frozenColumn! >= 0) {\n      this._headerElm = document.querySelector(`.${this._gridUid} .slick-header-right`);\n    } else {\n      this._headerElm = document.querySelector(`.${this._gridUid} .slick-header-left`);\n    }\n    this._headerElm!.style.width = `calc(100% - ${gridMenuWidth}px)`;\n\n    // if header row is enabled, we need to resize its width also\n    const enableResizeHeaderRow = (Utils.isDefined(this._gridMenuOptions?.resizeOnShowHeaderRow)) ? this._gridMenuOptions!.resizeOnShowHeaderRow : this._defaults.resizeOnShowHeaderRow;\n    if (enableResizeHeaderRow && this._gridOptions.showHeaderRow) {\n      const headerRow = document.querySelector<HTMLDivElement>(`.${this._gridUid}.slick-headerrow`);\n      if (headerRow) {\n        headerRow.style.width = `calc(100% - ${gridMenuWidth}px)`;\n      }\n    }\n\n    const showButton = (this._gridMenuOptions?.showButton !== undefined) ? this._gridMenuOptions.showButton : this._defaults.showButton;\n    if (showButton) {\n      this._buttonElm = document.createElement('button');\n      this._buttonElm.className = 'slick-gridmenu-button';\n      this._buttonElm.ariaLabel = 'Grid Menu';\n\n      if (this._gridMenuOptions?.iconCssClass) {\n        this._buttonElm.classList.add(...Utils.classNameToList(this._gridMenuOptions.iconCssClass));\n      } else {\n        const iconImageElm = document.createElement('img');\n        iconImageElm.src = (this._gridMenuOptions?.iconImage) ? this._gridMenuOptions.iconImage : '../images/drag-handle.png';\n        this._buttonElm.appendChild(iconImageElm);\n      }\n\n      // add the grid menu button in the preheader (when exists) or always in the column header (default)\n      const buttonContainerTarget = this._gridMenuOptions?.iconButtonContainer === 'preheader' ? 'firstChild' : 'lastChild';\n      this._headerElm!.parentElement!.insertBefore(this._buttonElm, this._headerElm!.parentElement![buttonContainerTarget]);\n\n      // add on click handler for the Grid Menu itself\n      this._bindingEventService.bind(this._buttonElm, 'click', this.showGridMenu.bind(this) as EventListener);\n    }\n\n    this._menuElm = this.createMenu(0);\n    this.populateColumnPicker();\n    document.body.appendChild(this._menuElm);\n\n    // Hide the menu on outside click.\n    this._bindingEventService.bind(document.body, 'mousedown', this.handleBodyMouseDown.bind(this) as EventListener);\n\n    // destroy the picker if user leaves the page\n    this._bindingEventService.bind(document.body, 'beforeunload', this.destroy.bind(this));\n  }\n\n  /** Create the menu or sub-menu(s) but without the column picker which is a separate single process */\n  createMenu(level = 0, item?: GridMenuItem | MenuCommandItem | 'divider') {\n    // create a new cell menu\n    const maxHeight = isNaN(this._gridMenuOptions?.maxHeight as number) ? this._gridMenuOptions?.maxHeight : `${this._gridMenuOptions?.maxHeight ?? 0}px`;\n    const width = isNaN(this._gridMenuOptions?.width as number) ? this._gridMenuOptions?.width : `${this._gridMenuOptions?.maxWidth ?? 0}px`;\n\n    // to avoid having multiple sub-menu trees opened,\n    // we need to somehow keep trace of which parent menu the tree belongs to\n    // and we should keep ref of only the first sub-menu parent, we can use the command name (remove any whitespaces though)\n    const subMenuCommand = (item as GridMenuItem)?.command;\n    let subMenuId = (level === 1 && subMenuCommand) ? subMenuCommand.replaceAll(' ', '') : '';\n    if (subMenuId) {\n      this._subMenuParentId = subMenuId;\n    }\n    if (level > 1) {\n      subMenuId = this._subMenuParentId;\n    }\n\n    const menuClasses = `slick-gridmenu slick-menu-level-${level} ${this._gridUid}`;\n    const bodyMenuElm = document.body.querySelector<HTMLDivElement>(`.slick-gridmenu.slick-menu-level-${level}${this.getGridUidSelector()}`);\n\n    // return menu/sub-menu if it's already opened unless we are on different sub-menu tree if so close them all\n    if (bodyMenuElm) {\n      if (bodyMenuElm.dataset.subMenuParent === subMenuId) {\n        return bodyMenuElm;\n      }\n      this.destroySubMenus();\n    }\n\n    const menuElm = document.createElement('div');\n    menuElm.role = 'menu';\n    menuElm.className = menuClasses;\n    if (level > 0) {\n      menuElm.classList.add('slick-submenu');\n      if (subMenuId) {\n        menuElm.dataset.subMenuParent = subMenuId;\n      }\n    }\n    menuElm.ariaLabel = level > 1 ? 'SubMenu' : 'Grid Menu';\n\n    if (width) {\n      menuElm.style.width = width as string;\n    }\n    if (maxHeight) {\n      menuElm.style.maxHeight = maxHeight as string;\n    }\n\n    menuElm.style.display = 'none';\n\n    let closeButtonElm: HTMLButtonElement | null = null;\n    if (level === 0) {\n      closeButtonElm = document.createElement('button');\n      closeButtonElm.type = 'button';\n      closeButtonElm.className = 'close';\n      closeButtonElm.dataset.dismiss = 'slick-gridmenu';\n      closeButtonElm.ariaLabel = 'Close';\n\n      const spanCloseElm = document.createElement('span');\n      spanCloseElm.className = 'close';\n      spanCloseElm.ariaHidden = 'true';\n      spanCloseElm.textContent = '\u00D7';\n      closeButtonElm.appendChild(spanCloseElm);\n      menuElm.appendChild(closeButtonElm);\n    }\n\n    // -- Command List section\n    this._commandListElm = document.createElement('div');\n    this._commandListElm.className = `slick-gridmenu-custom slick-gridmenu-command-list slick-menu-level-${level}`;\n    this._commandListElm.role = 'menu';\n    menuElm.appendChild(this._commandListElm);\n\n    const commandItems =\n      (item as GridMenuItem)?.commandItems\n      ?? (item as GridMenuItem)?.customItems\n      ?? this._gridMenuOptions?.commandItems\n      ?? this._gridMenuOptions?.customItems\n      ?? [];\n\n    if (commandItems.length > 0) {\n\n      // when creating sub-menu add its sub-menu title when exists\n      if (item && level > 0) {\n        this.addSubMenuTitleWhenExists(item, this._commandListElm); // add sub-menu title when exists\n      }\n    }\n    this.populateCommandsMenu(commandItems, this._commandListElm, { grid: this.grid, level });\n\n    // increment level for possible next sub-menus if exists\n    level++;\n\n    return menuElm;\n  }\n\n  /** Destroy the plugin by unsubscribing every events & also delete the menu DOM elements */\n  destroy() {\n    this.onAfterMenuShow.unsubscribe();\n    this.onBeforeMenuShow.unsubscribe();\n    this.onMenuClose.unsubscribe();\n    this.onCommand.unsubscribe();\n    this.onColumnsChanged.unsubscribe();\n    this.grid.onColumnsReordered.unsubscribe(this.updateColumnOrder.bind(this));\n    this.grid.onBeforeDestroy.unsubscribe();\n    this.grid.onSetOptions.unsubscribe();\n    this._bindingEventService.unbindAll();\n    this._menuElm?.remove();\n    this.deleteMenu();\n  }\n\n  /** Delete the menu DOM element but without unsubscribing any events */\n  deleteMenu() {\n    this._bindingEventService.unbindAll();\n    const gridMenuElm = document.querySelector<HTMLDivElement>(`div.slick-gridmenu.${this._gridUid}`);\n    if (gridMenuElm) {\n      gridMenuElm.style.display = 'none';\n    }\n    if (this._headerElm) {\n      // put back original width (fixes width and frozen+gridMenu on left header)\n      this._headerElm.style.width = '100%';\n    }\n    this._buttonElm?.remove();\n    this._menuElm?.remove();\n  }\n\n  /** Close and destroy all previously opened sub-menus */\n  destroySubMenus() {\n    this._bindingEventService.unbindAll('sub-menu');\n    document.querySelectorAll(`.slick-gridmenu.slick-submenu${this.getGridUidSelector()}`)\n      .forEach(subElm => subElm.remove());\n  }\n\n  /** Construct the custom command menu items. */\n  protected populateCommandsMenu(commandItems: Array<GridMenuItem | MenuCommandItem | 'divider'>, commandListElm: HTMLElement, args: { grid: SlickGrid, level: number }) {\n    // user could pass a title on top of the custom section\n    const level = args?.level || 0;\n    const isSubMenu = level > 0;\n    if (!isSubMenu && (this._gridMenuOptions?.commandTitle || this._gridMenuOptions?.customTitle)) {\n      this._commandTitleElm = document.createElement('div');\n      this._commandTitleElm.className = 'title';\n      this.grid.applyHtmlCode(this._commandTitleElm, this.grid.sanitizeHtmlString((this._gridMenuOptions.commandTitle || this._gridMenuOptions.customTitle) as string));\n      commandListElm.appendChild(this._commandTitleElm);\n    }\n\n    for (let i = 0, ln = commandItems.length; i < ln; i++) {\n      let addClickListener = true;\n      const item = commandItems[i];\n      const callbackArgs = {\n        grid: this.grid,\n        menu: this._menuElm,\n        columns: this.columns,\n        visibleColumns: this.getVisibleColumns()\n      };\n\n      // run each override functions to know if the item is visible and usable\n      const isItemVisible = this.runOverrideFunctionWhenExists<typeof callbackArgs>((item as GridMenuItem).itemVisibilityOverride, callbackArgs);\n      const isItemUsable = this.runOverrideFunctionWhenExists<typeof callbackArgs>((item as GridMenuItem).itemUsabilityOverride, callbackArgs);\n\n      // if the result is not visible then there's no need to go further\n      if (!isItemVisible) {\n        continue;\n      }\n\n      // when the override is defined, we need to use its result to update the disabled property\n      // so that \"handleMenuItemClick\" has the correct flag and won't trigger a command clicked event\n      if (Object.prototype.hasOwnProperty.call(item, 'itemUsabilityOverride')) {\n        (item as GridMenuItem).disabled = isItemUsable ? false : true;\n      }\n\n      const liElm = document.createElement('div');\n      liElm.className = 'slick-gridmenu-item';\n      liElm.role = 'menuitem';\n\n      if ((item as GridMenuItem).divider || item === 'divider') {\n        liElm.classList.add('slick-gridmenu-item-divider');\n        addClickListener = false;\n      }\n      if ((item as GridMenuItem).disabled) {\n        liElm.classList.add('slick-gridmenu-item-disabled');\n      }\n\n      if ((item as GridMenuItem).hidden) {\n        liElm.classList.add('slick-gridmenu-item-hidden');\n      }\n\n      if ((item as GridMenuItem).cssClass) {\n        liElm.classList.add(...Utils.classNameToList((item as GridMenuItem).cssClass));\n      }\n\n      if ((item as GridMenuItem).tooltip) {\n        liElm.title = (item as GridMenuItem).tooltip || '';\n      }\n\n      const iconElm = document.createElement('div');\n      iconElm.className = 'slick-gridmenu-icon';\n\n      liElm.appendChild(iconElm);\n\n      if ((item as GridMenuItem).iconCssClass) {\n        iconElm.classList.add(...Utils.classNameToList((item as GridMenuItem).iconCssClass));\n      }\n\n      if ((item as GridMenuItem).iconImage) {\n        iconElm.style.backgroundImage = `url(${(item as GridMenuItem).iconImage})`;\n      }\n\n      const textElm = document.createElement('span');\n      textElm.className = 'slick-gridmenu-content';\n      this.grid.applyHtmlCode(textElm, this.grid.sanitizeHtmlString((item as GridMenuItem).title || ''));\n\n      liElm.appendChild(textElm);\n\n      if ((item as GridMenuItem).textCssClass) {\n        textElm.classList.add(...Utils.classNameToList((item as GridMenuItem).textCssClass));\n      }\n\n      commandListElm.appendChild(liElm);\n\n      if (addClickListener) {\n        const eventGroup = isSubMenu ? 'sub-menu' : 'parent-menu';\n        this._bindingEventService.bind(liElm, 'click', this.handleMenuItemClick.bind(this, item, level) as EventListener, undefined, eventGroup);\n      }\n\n      // optionally open sub-menu(s) by mouseover\n      if (this._gridMenuOptions?.subMenuOpenByEvent === 'mouseover') {\n        this._bindingEventService.bind(liElm, 'mouseover', ((e: DOMMouseOrTouchEvent<HTMLDivElement>) => {\n          if ((item as GridMenuItem).commandItems || (item as GridMenuItem).customItems) {\n            this.repositionSubMenu(item, level, e);\n          } else if (!isSubMenu) {\n            this.destroySubMenus();\n          }\n        }) as EventListener);\n      }\n\n      // the option/command item could be a sub-menu if it has another list of commands/options\n      if ((item as GridMenuItem).commandItems || (item as GridMenuItem).customItems) {\n        const chevronElm = document.createElement('span');\n        chevronElm.className = 'sub-item-chevron';\n        if (this._gridMenuOptions?.subItemChevronClass) {\n          chevronElm.classList.add(...Utils.classNameToList(this._gridMenuOptions.subItemChevronClass));\n        } else {\n          chevronElm.textContent = '\u2B9E'; // \u2B9E or \u25B8\n        }\n\n        liElm.classList.add('slick-submenu-item');\n        liElm.appendChild(chevronElm);\n        continue;\n      }\n    }\n  }\n\n  /** Build the column picker, the code comes almost untouched from the file \"slick.columnpicker.js\" */\n  protected populateColumnPicker() {\n    this.grid.onColumnsReordered.subscribe(this.updateColumnOrder.bind(this));\n\n    // user could pass a title on top of the columns list\n    if (this._gridMenuOptions?.columnTitle) {\n      this._columnTitleElm = document.createElement('div');\n      this._columnTitleElm.className = 'title';\n      this.grid.applyHtmlCode(this._columnTitleElm, this.grid.sanitizeHtmlString(this._gridMenuOptions.columnTitle));\n      this._menuElm.appendChild(this._columnTitleElm);\n    }\n\n    this._bindingEventService.bind(this._menuElm, 'click', this.updateColumn.bind(this) as EventListener);\n    this._listElm = document.createElement('span');\n    this._listElm.className = 'slick-gridmenu-list';\n    this._listElm.role = 'menu';\n  }\n\n  /** Delete and then Recreate the Grid Menu (for example when we switch from regular to a frozen grid) */\n  recreateGridMenu() {\n    this.deleteMenu();\n    this.init(this.grid);\n  }\n\n  showGridMenu(e: DOMMouseOrTouchEvent<HTMLButtonElement>) {\n    const targetEvent = e.touches ? e.touches[0] : e;\n    e.preventDefault();\n\n    // empty both the picker list & the command list\n    Utils.emptyElement(this._listElm);\n    Utils.emptyElement(this._commandListElm);\n\n    const commandItems = this._gridMenuOptions?.commandItems ?? this._gridMenuOptions?.customItems ?? [];\n    this.populateCommandsMenu(commandItems, this._commandListElm, { grid: this.grid, level: 0 });\n    this.updateColumnOrder();\n    this._columnCheckboxes = [];\n\n    const callbackArgs = {\n      grid: this.grid,\n      menu: this._menuElm,\n      allColumns: this.columns,\n      visibleColumns: this.getVisibleColumns()\n    };\n\n    // run the override function (when defined), if the result is false it won't go further\n    if (this._gridMenuOptions && !this.runOverrideFunctionWhenExists<typeof callbackArgs>(this._gridMenuOptions.menuUsabilityOverride, callbackArgs)) {\n      return;\n    }\n\n    // notify of the onBeforeMenuShow only works when\n    // this mean that we cannot notify when the grid menu is attach to a button event\n    if (typeof e.stopPropagation === 'function') {\n      if (this.onBeforeMenuShow.notify(callbackArgs, e, this).getReturnValue() === false) {\n        return;\n      }\n    }\n\n    let columnId, columnLabel, excludeCssClass;\n    for (let i = 0; i < this.columns.length; i++) {\n      columnId = this.columns[i].id;\n      excludeCssClass = this.columns[i].excludeFromGridMenu ? 'hidden' : '';\n      const colName: string = this.columns[i].name instanceof HTMLElement\n        ? (this.columns[i].name as HTMLElement).innerHTML\n        : (this.columns[i].name || '') as string;\n\n      const liElm = document.createElement('li');\n      liElm.className = excludeCssClass;\n      liElm.ariaLabel = colName;\n\n      const checkboxElm = document.createElement('input');\n      checkboxElm.type = 'checkbox';\n      checkboxElm.id = `${this._gridUid}-gridmenu-colpicker-${columnId}`;\n      checkboxElm.dataset.columnid = String(this.columns[i].id);\n      liElm.appendChild(checkboxElm);\n\n      if (Utils.isDefined(this.grid.getColumnIndex(this.columns[i].id)) && !this.columns[i].hidden) {\n        checkboxElm.checked = true;\n      }\n\n      this._columnCheckboxes.push(checkboxElm);\n\n      // get the column label from the picker value extractor (user can optionally provide a custom extractor)\n      columnLabel = (this._gridMenuOptions?.headerColumnValueExtractor)\n        ? this._gridMenuOptions.headerColumnValueExtractor(this.columns[i], this._gridOptions)\n        : this._defaults.headerColumnValueExtractor!(this.columns[i]);\n\n      const labelElm = document.createElement('label');\n      labelElm.htmlFor = `${this._gridUid}-gridmenu-colpicker-${columnId}`;\n      this.grid.applyHtmlCode(labelElm, this.grid.sanitizeHtmlString(Utils.getHtmlStringOutput(columnLabel || '')));\n      liElm.appendChild(labelElm);\n      this._listElm.appendChild(liElm);\n    }\n\n    if (this._gridMenuOptions && (!this._gridMenuOptions.hideForceFitButton || !this._gridMenuOptions.hideSyncResizeButton)) {\n      this._listElm.appendChild(document.createElement('hr'));\n    }\n\n    if (!(this._gridMenuOptions?.hideForceFitButton)) {\n      const forceFitTitle = (this._gridMenuOptions?.forceFitTitle) || this._defaults.forceFitTitle as string;\n\n      const liElm = document.createElement('li');\n      liElm.ariaLabel = forceFitTitle;\n      liElm.role = 'menuitem';\n      this._listElm.appendChild(liElm);\n\n      const forceFitCheckboxElm = document.createElement('input');\n      forceFitCheckboxElm.type = 'checkbox';\n      forceFitCheckboxElm.id = `${this._gridUid}-gridmenu-colpicker-forcefit`;\n      forceFitCheckboxElm.dataset.option = 'autoresize';\n      liElm.appendChild(forceFitCheckboxElm);\n\n      const labelElm = document.createElement('label');\n      labelElm.htmlFor = `${this._gridUid}-gridmenu-colpicker-forcefit`;\n      labelElm.textContent = forceFitTitle;\n      liElm.appendChild(labelElm);\n\n      if (this.grid.getOptions().forceFitColumns) {\n        forceFitCheckboxElm.checked = true;\n      }\n    }\n\n    if (!(this._gridMenuOptions?.hideSyncResizeButton)) {\n      const syncResizeTitle = (this._gridMenuOptions?.syncResizeTitle) || this._defaults.syncResizeTitle as string;\n\n      const liElm = document.createElement('li');\n      liElm.ariaLabel = syncResizeTitle;\n      this._listElm.appendChild(liElm);\n\n      const syncResizeCheckboxElm = document.createElement('input');\n      syncResizeCheckboxElm.type = 'checkbox';\n      syncResizeCheckboxElm.id = `${this._gridUid}-gridmenu-colpicker-syncresize`;\n      syncResizeCheckboxElm.dataset.option = 'syncresize';\n      liElm.appendChild(syncResizeCheckboxElm);\n\n      const labelElm = document.createElement('label');\n      labelElm.htmlFor = `${this._gridUid}-gridmenu-colpicker-syncresize`;\n      labelElm.textContent = syncResizeTitle;\n      liElm.appendChild(labelElm);\n\n      if (this.grid.getOptions().syncColumnCellResize) {\n        syncResizeCheckboxElm.checked = true;\n      }\n    }\n\n    let buttonElm = (e.target.nodeName === 'BUTTON' ? e.target : e.target.querySelector('button')) as HTMLButtonElement; // get button element\n    if (!buttonElm) {\n      buttonElm = e.target.parentElement as HTMLButtonElement; // external grid menu might fall in this last case if wrapped in a span/div\n    }\n\n    // we need to display the menu to properly calculate its width but we can however make it invisible\n    this._menuElm.style.display = 'block';\n    this._menuElm.style.opacity = '0';\n\n    this.repositionMenu(e, this._menuElm, buttonElm);\n\n    // set \"height\" when defined OR ELSE use the \"max-height\" with available window size and optional margin bottom\n    const menuMarginBottom = (this._gridMenuOptions?.marginBottom !== undefined) ? this._gridMenuOptions.marginBottom : this._defaults.marginBottom as number;\n    if (this._gridMenuOptions?.height !== undefined) {\n      this._menuElm.style.height = `${this._gridMenuOptions.height}px`;\n    } else {\n      this._menuElm.style.maxHeight = `${window.innerHeight - targetEvent.clientY - menuMarginBottom}px`;\n    }\n\n    this._menuElm.style.display = 'block';\n    this._menuElm.style.opacity = '1'; // restore menu visibility\n    this._menuElm.appendChild(this._listElm);\n    this._isMenuOpen = true;\n\n    if (typeof e.stopPropagation === 'function') {\n      if (this.onAfterMenuShow.notify(callbackArgs, e, this).getReturnValue() === false) {\n        return;\n      }\n    }\n  }\n\n  protected getGridUidSelector() {\n    const gridUid = this.grid.getUID() || '';\n    return gridUid ? `.${gridUid}` : '';\n  }\n\n  protected handleBodyMouseDown(e: DOMMouseOrTouchEvent<HTMLElement>) {\n    // did we click inside the menu or any of its sub-menu(s)\n    let isMenuClicked = false;\n    if (this._menuElm?.contains(e.target)) {\n      isMenuClicked = true;\n    }\n    if (!isMenuClicked) {\n      document\n        .querySelectorAll(`.slick-gridmenu.slick-submenu${this.getGridUidSelector()}`)\n        .forEach(subElm => {\n          if (subElm.contains(e.target)) {\n            isMenuClicked = true;\n          }\n        });\n    }\n\n    if ((this._menuElm !== e.target && !isMenuClicked && !e.defaultPrevented && this._isMenuOpen) || e.target.className === 'close') {\n      this.hideMenu(e);\n    }\n  }\n\n  protected handleMenuItemClick(item: GridMenuItem | MenuCommandItem | 'divider', level = 0, e: DOMMouseOrTouchEvent<HTMLButtonElement | HTMLDivElement>) {\n    if (item !== 'divider' && !item.disabled && !item.divider) {\n      const command = item.command || '';\n\n      if (Utils.isDefined(command) && !item.commandItems && !(item as GridMenuItem).customItems) {\n        const callbackArgs: GridMenuCommandItemCallbackArgs = {\n          grid: this.grid,\n          command,\n          item,\n          allColumns: this.columns,\n          visibleColumns: this.getVisibleColumns()\n        };\n        this.onCommand.notify(callbackArgs, e, this);\n\n        // execute action callback when defined\n        if (typeof item.action === 'function') {\n          (item as MenuCommandItem).action!.call(this, e, callbackArgs);\n        }\n\n        // does the user want to leave open the Grid Menu after executing a command?\n        const leaveOpen = !!(this._gridMenuOptions?.leaveOpen);\n        if (!leaveOpen && !e.defaultPrevented) {\n          this.hideMenu(e);\n        }\n\n        // Stop propagation so that it doesn't register as a header click event.\n        e.preventDefault();\n        e.stopPropagation();\n      } else if (item.commandItems || (item as GridMenuItem).customItems) {\n        this.repositionSubMenu(item, level, e);\n      } else {\n        this.destroySubMenus();\n      }\n    }\n  }\n\n  hideMenu(e: DOMMouseOrTouchEvent<HTMLElement>) {\n    if (this._menuElm) {\n      const callbackArgs = {\n        grid: this.grid,\n        menu: this._menuElm,\n        allColumns: this.columns,\n        visibleColumns: this.getVisibleColumns()\n      };\n      if (this._isMenuOpen && this.onMenuClose.notify(callbackArgs, e, this).getReturnValue() === false) {\n        return;\n      }\n      this._isMenuOpen = false;\n      Utils.hide(this._menuElm);\n    }\n    this.destroySubMenus();\n  }\n\n  /** Update the Titles of each sections (command, commandTitle, ...) */\n  updateAllTitles(gridMenuOptions: GridMenuOption) {\n    if (this._commandTitleElm) {\n      this.grid.applyHtmlCode(this._commandTitleElm, this.grid.sanitizeHtmlString(gridMenuOptions.commandTitle || gridMenuOptions.customTitle || ''));\n    }\n    if (this._columnTitleElm) {\n      this.grid.applyHtmlCode(this._columnTitleElm, this.grid.sanitizeHtmlString(gridMenuOptions.columnTitle || ''));\n    }\n  }\n\n  protected addSubMenuTitleWhenExists(item: GridMenuItem | MenuCommandItem | 'divider', commandOrOptionMenu: HTMLDivElement) {\n    if (item !== 'divider' && item?.subMenuTitle) {\n      const subMenuTitleElm = document.createElement('div');\n      subMenuTitleElm.className = 'slick-menu-title';\n      subMenuTitleElm.textContent = item.subMenuTitle as string;\n      const subMenuTitleClass = item.subMenuTitleCssClass as string;\n      if (subMenuTitleClass) {\n        subMenuTitleElm.classList.add(...Utils.classNameToList(subMenuTitleClass));\n      }\n\n      commandOrOptionMenu.appendChild(subMenuTitleElm);\n    }\n  }\n\n  protected repositionSubMenu(item: GridMenuItem | MenuCommandItem | 'divider', level: number, e: DOMMouseOrTouchEvent<HTMLButtonElement | HTMLDivElement>) {\n    // when we're clicking a grid cell OR our last menu type (command/option) differs then we know that we need to start fresh and close any sub-menus that might still be open\n    if (e.target.classList.contains('slick-cell')) {\n      this.destroySubMenus();\n    }\n\n    // creating sub-menu, we'll also pass level & the item object since we might have \"subMenuTitle\" to show\n    const subMenuElm = this.createMenu(level + 1, item);\n    subMenuElm.style.display = 'block';\n    document.body.appendChild(subMenuElm);\n    this.repositionMenu(e, subMenuElm);\n  }\n\n  /**\n   * Reposition the menu drop (up/down) and the side (left/right)\n   * @param {*} event\n   */\n  protected repositionMenu(e: DOMMouseOrTouchEvent<HTMLButtonElement | HTMLDivElement>, menuElm: HTMLElement, buttonElm?: HTMLButtonElement) {\n    const targetEvent = e.touches ? e.touches[0] : e;\n    const isSubMenu = menuElm.classList.contains('slick-submenu');\n    const parentElm = isSubMenu\n      ? e.target.closest('.slick-gridmenu-item') as HTMLDivElement\n      : targetEvent.target as HTMLElement;\n\n    const menuIconOffset = Utils.offset(buttonElm || this._buttonElm); // get button offset position\n    const menuWidth = menuElm.offsetWidth;\n    const useClickToRepositionMenu = (this._gridMenuOptions?.useClickToRepositionMenu !== undefined) ? this._gridMenuOptions.useClickToRepositionMenu : this._defaults.useClickToRepositionMenu;\n    const contentMinWidth = (this._gridMenuOptions?.contentMinWidth) ? this._gridMenuOptions.contentMinWidth : this._defaults.contentMinWidth as number;\n    const currentMenuWidth = (contentMinWidth > menuWidth) ? contentMinWidth : menuWidth + 5;\n    let menuOffsetTop = (useClickToRepositionMenu && targetEvent.pageY > 0) ? targetEvent.pageY : menuIconOffset!.top + 10;\n    let menuOffsetLeft = (useClickToRepositionMenu && targetEvent.pageX > 0) ? targetEvent.pageX : menuIconOffset!.left + 10;\n\n    if (isSubMenu && parentElm) {\n      const parentOffset = Utils.offset(parentElm);\n      menuOffsetLeft = parentOffset?.left ?? 0;\n      menuOffsetTop = parentOffset?.top ?? 0;\n      const gridPos = this.grid.getGridPosition();\n      let subMenuPosCalc = menuOffsetLeft + Number(menuWidth); // calculate coordinate at caller element far right\n      if (isSubMenu) {\n        subMenuPosCalc += parentElm.clientWidth;\n      }\n      const browserWidth = document.documentElement.clientWidth;\n      const dropSide = (subMenuPosCalc >= gridPos.width || subMenuPosCalc >= browserWidth) ? 'left' : 'right';\n      if (dropSide === 'left') {\n        menuElm.classList.remove('dropright');\n        menuElm.classList.add('dropleft');\n        menuOffsetLeft -= menuWidth;\n      } else {\n        menuElm.classList.remove('dropleft');\n        menuElm.classList.add('dropright');\n        if (isSubMenu) {\n          menuOffsetLeft += parentElm.offsetWidth;\n        }\n      }\n    } else {\n      menuOffsetTop += 10;\n      menuOffsetLeft = menuOffsetLeft - currentMenuWidth + 10;\n    }\n\n    menuElm.style.top = `${menuOffsetTop}px`;\n    menuElm.style.left = `${menuOffsetLeft}px`;\n\n    if (contentMinWidth > 0) {\n      this._menuElm.style.minWidth = `${contentMinWidth}px`;\n    }\n  }\n\n  protected updateColumnOrder() {\n    // Because columns can be reordered, we have to update the `columns`\n    // to reflect the new order, however we can't just take `grid.getColumns()`,\n    // as it does not include columns currently hidden by the picker.\n    // We create a new `columns` structure by leaving currently-hidden\n    // columns in their original ordinal position and interleaving the results\n    // of the current column sort.\n    const current = this.grid.getColumns().slice(0);\n    const ordered = new Array(this.columns.length);\n    for (let i = 0; i < ordered.length; i++) {\n      if (this.grid.getColumnIndex(this.columns[i].id) === undefined) {\n        // If the column doesn't return a value from getColumnIndex,\n        // it is hidden. Leave it in this position.\n        ordered[i] = this.columns[i];\n      } else {\n        // Otherwise, grab the next visible column.\n        ordered[i] = current.shift();\n      }\n    }\n    this.columns = ordered;\n  }\n\n  protected updateColumn(e: DOMMouseOrTouchEvent<HTMLInputElement>) {\n    if (e.target.dataset.option === 'autoresize') {\n      // when calling setOptions, it will resize with ALL Columns (even the hidden ones)\n      // we can avoid this problem by keeping a reference to the visibleColumns before setOptions and then setColumns after\n      const previousVisibleColumns = this.getVisibleColumns();\n      const isChecked = e.target.checked;\n      this.grid.setOptions({ forceFitColumns: isChecked });\n      this.grid.setColumns(previousVisibleColumns);\n      return;\n    }\n\n    if (e.target.dataset.option === 'syncresize') {\n      this.grid.setOptions({ syncColumnCellResize: !!(e.target.checked) });\n      return;\n    }\n\n    if (e.target.type === 'checkbox') {\n      const isChecked = e.target.checked;\n      const columnId = e.target.dataset.columnid || '';\n      const visibleColumns: Column[] = [];\n      this._columnCheckboxes.forEach((columnCheckbox, idx) => {\n        if (columnCheckbox.checked) {\n          if (this.columns[idx].hidden) { this.columns[idx].hidden = false; }\n          visibleColumns.push(this.columns[idx]);\n        }\n      });\n\n      if (!visibleColumns.length) {\n        e.target.checked = true;\n        return;\n      }\n\n      const callbackArgs = {\n        columnId,\n        showing: isChecked,\n        grid: this.grid,\n        allColumns: this.columns,\n        columns: visibleColumns,\n        visibleColumns: this.getVisibleColumns()\n      };\n      this.grid.setColumns(visibleColumns);\n      this.onColumnsChanged.notify(callbackArgs, e, this);\n    }\n  }\n\n  getAllColumns() {\n    return this.columns;\n  }\n\n  /** visible columns, we can simply get them directly from the grid */\n  getVisibleColumns() {\n    return this.grid.getColumns();\n  }\n\n  /**\n   * Method that user can pass to override the default behavior.\n   * In order word, user can choose or an item is (usable/visible/enable) by providing his own logic.\n   * @param overrideFn: override function callback\n   * @param args: multiple arguments provided to the override (cell, row, columnDef, dataContext, grid)\n   */\n  protected runOverrideFunctionWhenExists<T = any>(overrideFn: ((args: any) => boolean) | undefined, args: T): boolean {\n    if (typeof overrideFn === 'function') {\n      return overrideFn.call(this, args);\n    }\n    return true;\n  }\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  window.Slick.Controls = window.Slick.Controls || {};\n  window.Slick.Controls.GridMenu = SlickGridMenu;\n}\n", "import type { PagingInfo } from '../models/index.js';\nimport { BindingEventService as BindingEventService_, SlickGlobalEditorLock as SlickGlobalEditorLock_, Utils as Utils_ } from '../slick.core.js';\nimport type { SlickDataView } from '../slick.dataview.js';\nimport type { SlickGrid } from '../slick.grid.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst BindingEventService = IIFE_ONLY ? Slick.BindingEventService : BindingEventService_;\nconst SlickGlobalEditorLock = IIFE_ONLY ? Slick.GlobalEditorLock : SlickGlobalEditorLock_;\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\nexport interface GridPagerOption {\n  showAllText: string;\n  showPageText: string;\n  showCountText: string;\n  showCount: boolean;\n  pagingOptions: Array<{ data: number; name: string; ariaLabel: string; }>;\n  showPageSizes: boolean;\n}\n\nexport class SlickGridPager {\n  // --\n  // public API\n\n  // --\n  // protected props\n  protected _container: HTMLElement; // the container might be a string, a jQuery object or a native element\n  protected _statusElm!: HTMLElement;\n  protected _bindingEventService: BindingEventService_;\n  protected _options: GridPagerOption;\n  protected _defaults: GridPagerOption = {\n    showAllText: 'Showing all {rowCount} rows',\n    showPageText: 'Showing page {pageNum} of {pageCount}',\n    showCountText: 'From {countBegin} to {countEnd} of {rowCount} rows',\n    showCount: false,\n    pagingOptions: [\n      { data: 0, name: 'All', ariaLabel: 'Show All Pages' },\n      { data: -1, name: 'Auto', ariaLabel: 'Auto Page Size' },\n      { data: 25, name: '25', ariaLabel: 'Show 25 rows per page' },\n      { data: 50, name: '50', ariaLabel: 'Show 50 rows per page' },\n      { data: 100, name: '100', ariaLabel: 'Show 100 rows per page' },\n    ],\n    showPageSizes: false\n  };\n\n  constructor(protected readonly dataView: SlickDataView, protected readonly grid: SlickGrid, selectorOrElm: HTMLElement | string, options?: Partial<GridPagerOption>) {\n    this._container = this.getContainerElement(selectorOrElm) as HTMLElement;\n    this._options = Utils.extend(true, {}, this._defaults, options);\n    this._bindingEventService = new BindingEventService();\n    this.init();\n  }\n\n  init() {\n    this.constructPagerUI();\n    this.updatePager(this.dataView.getPagingInfo());\n    this.dataView.onPagingInfoChanged.subscribe((_e, pagingInfo) => {\n      this.updatePager(pagingInfo);\n    });\n  }\n\n  /** Destroy function when element is destroyed */\n  destroy() {\n    this.setPageSize(0);\n    this._bindingEventService.unbindAll();\n    Utils.emptyElement(this._container);\n  }\n\n  protected getNavState() {\n    const cannotLeaveEditMode = !SlickGlobalEditorLock.commitCurrentEdit();\n    const pagingInfo = this.dataView.getPagingInfo();\n    const lastPage = pagingInfo.totalPages - 1;\n\n    return {\n      canGotoFirst: !cannotLeaveEditMode && pagingInfo.pageSize !== 0 && pagingInfo.pageNum > 0,\n      canGotoLast: !cannotLeaveEditMode && pagingInfo.pageSize !== 0 && pagingInfo.pageNum !== lastPage,\n      canGotoPrev: !cannotLeaveEditMode && pagingInfo.pageSize !== 0 && pagingInfo.pageNum > 0,\n      canGotoNext: !cannotLeaveEditMode && pagingInfo.pageSize !== 0 && pagingInfo.pageNum < lastPage,\n      pagingInfo\n    };\n  }\n\n  protected setPageSize(n: number) {\n    this.dataView.setRefreshHints({\n      isFilterUnchanged: true\n    });\n    this.dataView.setPagingOptions({ pageSize: n });\n  }\n\n  protected gotoFirst() {\n    if (this.getNavState().canGotoFirst) {\n      this.dataView.setPagingOptions({ pageNum: 0 });\n    }\n  }\n\n  protected gotoLast() {\n    const state = this.getNavState();\n    if (state.canGotoLast) {\n      this.dataView.setPagingOptions({ pageNum: state.pagingInfo.totalPages - 1 });\n    }\n  }\n\n  protected gotoPrev() {\n    const state = this.getNavState();\n    if (state.canGotoPrev) {\n      this.dataView.setPagingOptions({ pageNum: state.pagingInfo.pageNum - 1 });\n    }\n  }\n\n  protected gotoNext() {\n    const state = this.getNavState();\n    if (state.canGotoNext) {\n      this.dataView.setPagingOptions({ pageNum: state.pagingInfo.pageNum + 1 });\n    }\n  }\n\n  protected getContainerElement(selectorOrElm: object | HTMLElement | string) {\n    // the container might be a string, a jQuery object or a native element\n    return typeof selectorOrElm === 'string'\n      ? document.querySelector(selectorOrElm)\n      : typeof selectorOrElm === 'object' && (selectorOrElm as any)[0]\n        ? (selectorOrElm as any)[0] as HTMLElement\n        : selectorOrElm;\n  }\n\n  protected constructPagerUI() {\n    // the container might be a string, a jQuery object or a native element\n    const container = this.getContainerElement(this._container) as HTMLElement | HTMLElement[];\n    if (!container || ((container as any).jquery && !(container as HTMLElement[])[0])) { return; }\n\n    const navElm = document.createElement('span');\n    navElm.className = 'slick-pager-nav';\n\n    const settingsElm = document.createElement('span');\n    settingsElm.className = 'slick-pager-settings';\n\n    this._statusElm = document.createElement('span');\n    this._statusElm.className = 'slick-pager-status';\n\n    const pagerSettingsElm = document.createElement('span');\n    pagerSettingsElm.className = 'slick-pager-settings-expanded';\n    pagerSettingsElm.textContent = 'Show: ';\n\n    for (let o = 0; o < this._options.pagingOptions.length; o++) {\n      const p = this._options.pagingOptions[o];\n\n      const anchorElm = document.createElement('a');\n      anchorElm.textContent = p.name;\n      anchorElm.ariaLabel = p.ariaLabel;\n      anchorElm.dataset.val = String(p.data);\n      pagerSettingsElm.appendChild(anchorElm);\n\n      this._bindingEventService.bind(anchorElm, 'click', ((e: any) => {\n        const pagesize = e.target.dataset.val;\n        if (pagesize !== undefined) {\n          if (Number(pagesize) === -1) {\n            const vp = this.grid.getViewport();\n            this.setPageSize(vp.bottom - vp.top);\n          } else {\n            this.setPageSize(parseInt(pagesize));\n          }\n        }\n      }));\n    }\n\n    pagerSettingsElm.style.display = this._options.showPageSizes ? 'block' : 'none';\n\n    settingsElm.appendChild(pagerSettingsElm);\n\n    // light bulb icon\n    const displayPaginationContainer = document.createElement('span');\n    const displayIconElm = document.createElement('span');\n    displayPaginationContainer.className = 'sgi-container';\n    displayIconElm.ariaLabel = 'Show Pagination Options';\n    displayIconElm.role = 'button';\n    displayIconElm.className = 'sgi sgi-lightbulb';\n    displayPaginationContainer.appendChild(displayIconElm);\n\n    this._bindingEventService.bind(displayIconElm, 'click', () => {\n      const styleDisplay = pagerSettingsElm.style.display;\n      pagerSettingsElm.style.display = styleDisplay === 'none' ? 'inline-flex' : 'none';\n    });\n    settingsElm.appendChild(displayPaginationContainer);\n\n    const pageButtons = [\n      { key: 'start', ariaLabel: 'First Page', callback: this.gotoFirst },\n      { key: 'left', ariaLabel: 'Previous Page', callback: this.gotoPrev },\n      { key: 'right', ariaLabel: 'Next Page', callback: this.gotoNext },\n      { key: 'end', ariaLabel: 'Last Page', callback: this.gotoLast },\n    ];\n\n    pageButtons.forEach(pageBtn => {\n      const iconElm = document.createElement('span');\n      iconElm.className = 'sgi-container';\n\n      const innerIconElm = document.createElement('span');\n      innerIconElm.role = 'button';\n      innerIconElm.ariaLabel = pageBtn.ariaLabel;\n      innerIconElm.className = `sgi sgi-chevron-${pageBtn.key}`;\n      this._bindingEventService.bind(innerIconElm, 'click', pageBtn.callback.bind(this));\n\n      iconElm.appendChild(innerIconElm);\n      navElm.appendChild(iconElm);\n    });\n\n    const slickPagerElm = document.createElement('div');\n    slickPagerElm.className = 'slick-pager';\n\n    slickPagerElm.appendChild(navElm);\n    slickPagerElm.appendChild(this._statusElm);\n    slickPagerElm.appendChild(settingsElm);\n\n    (container as HTMLElement).appendChild(slickPagerElm);\n  }\n\n  protected updatePager(pagingInfo: PagingInfo) {\n    if (!this._container || ((this._container as any).jquery && !(this._container as any)[0])) { return; }\n    const state = this.getNavState();\n\n    // remove disabled class on all icons\n    this._container.querySelectorAll('.slick-pager-nav span')\n      .forEach(pagerIcon => pagerIcon.classList.remove('sgi-state-disabled'));\n\n    // add back disabled class to only necessary icons\n    if (!state.canGotoFirst) {\n      this._container!.querySelector('.sgi-chevron-start')?.classList.add('sgi-state-disabled');\n    }\n    if (!state.canGotoLast) {\n      this._container!.querySelector('.sgi-chevron-end')?.classList.add('sgi-state-disabled');\n    }\n    if (!state.canGotoNext) {\n      this._container!.querySelector('.sgi-chevron-right')?.classList.add('sgi-state-disabled');\n    }\n    if (!state.canGotoPrev) {\n      this._container!.querySelector('.sgi-chevron-left')?.classList.add('sgi-state-disabled');\n    }\n\n    if (pagingInfo.pageSize === 0) {\n      this._statusElm.textContent = (this._options.showAllText.replace('{rowCount}', pagingInfo.totalRows + '').replace('{pageCount}', pagingInfo.totalPages + ''));\n    } else {\n      this._statusElm.textContent = (this._options.showPageText.replace('{pageNum}', pagingInfo.pageNum + 1 + '').replace('{pageCount}', pagingInfo.totalPages + ''));\n    }\n\n    if (this._options.showCount && pagingInfo.pageSize !== 0) {\n      const pageBegin = pagingInfo.pageNum * pagingInfo.pageSize;\n      let currentText = this._statusElm.textContent;\n\n      if (currentText) {\n        currentText += ' - ';\n      }\n\n      this._statusElm.textContent =\n        currentText +\n        this._options.showCountText\n          .replace('{rowCount}', String(pagingInfo.totalRows))\n          .replace('{countBegin}', String(pageBegin + 1))\n          .replace('{countEnd}', String(Math.min(pageBegin + pagingInfo.pageSize, pagingInfo.totalRows)));\n    }\n  }\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  window.Slick.Controls = window.Slick.Controls || {};\n  window.Slick.Controls.Pager = SlickGridPager;\n}\n\n", "export const FieldType = {\n  /** unknown type */\n  unknown: 'unknown',\n\n  /** string type */\n  string: 'string',\n\n  /** boolean type (true/false) */\n  boolean: 'boolean',\n\n  /** integer number type (1,2,99) */\n  integer: 'integer',\n\n  /** float number (with decimal) type */\n  float: 'float',\n\n  /** number includes Integer and Float */\n  number: 'number',\n\n  /** new Date(), javascript Date object */\n  date: 'date',\n\n  /** Format: 'YYYY-MM-DD' <=> 2001-02-28 */\n  dateIso: 'dateIso',\n\n  /** Format: 'YYYY-MM-DDTHH:mm:ss.SSSZ' <=> 2001-02-28T14:00:00.123Z */\n  dateUtc: 'dateUtc',\n\n  /** new Date(), javacript Date Object with Time */\n  dateTime: 'dateTime',\n\n  /** Format: 'YYYY-MM-DD HH:mm:ss' <=> 2001-02-28 14:01:01 */\n  dateTimeIso: 'dateTimeIso',\n\n  /** Format: 'YYYY-MM-DD hh:mm:ss a' <=> 2001-02-28 11:01:01 pm */\n  dateTimeIsoAmPm: 'dateTimeIsoAmPm',\n\n  /** Format: 'YYYY-MM-DD hh:mm:ss A' <=> 2001-02-28 11:01:01 PM */\n  dateTimeIsoAM_PM: 'dateTimeIsoAM_PM',\n\n  /** Format: 'YYYY-MM-DD HH:mm' <=> 2001-02-28 14:01 */\n  dateTimeShortIso: 'dateTimeShortIso',\n\n  /** Format (Euro): 'DD/MM/YYYY' <=> 28/02/2001 */\n  dateEuro: 'dateEuro',\n\n  /** Format (Euro): 'D/M/YY' <=> 28/2/12 */\n  dateEuroShort: 'dateEuroShort',\n\n  /** Format (Euro): 'DD/MM/YYYY HH:mm' <=> 28/02/2001 13:01 */\n  dateTimeShortEuro: 'dateTimeShortEuro',\n\n  /** Format (Euro): 'DD/MM/YYYY HH:mm:ss' <=> 02/28/2001 13:01:01 */\n  dateTimeEuro: 'dateTimeEuro',\n\n  /** Format (Euro): 'DD/MM/YYYY hh:mm:ss a' <=> 28/02/2001 11:01:01 pm */\n  dateTimeEuroAmPm: 'dateTimeEuroAmPm',\n\n  /** Format (Euro): 'DD/MM/YYYY hh:mm:ss A' <=> 28/02/2001 11:01:01 PM */\n  dateTimeEuroAM_PM: 'dateTimeEuroAM_PM',\n\n  /** Format (Euro): 'D/M/YY H:m:s' <=> 28/2/14 14:1:2 */\n  dateTimeEuroShort: 'dateTimeEuroShort',\n\n  /** Format (Euro): 'D/M/YY h:m:s a' <=> 28/2/14 1:2:10 pm */\n  dateTimeEuroShortAmPm: 'dateTimeEuroShortAmPm',\n\n  /** Format (Euro): 'D/M/YY h:m:s A' <=> 28/2/14 14:1:1 PM */\n  dateTimeEuroShortAM_PM: 'dateTimeEuroShortAM_PM',\n\n  /** Format: 'MM/DD/YYYY' <=> 02/28/2001 */\n  dateUs: 'dateUs',\n\n  /** Format: 'M/D/YY' <=> 2/28/12 */\n  dateUsShort: 'dateUsShort',\n\n  /** Format: 'MM/DD/YYYY HH:mm' <=> 02/28/2001 13:01 */\n  dateTimeShortUs: 'dateTimeShortUs',\n\n  /** Format: 'MM/DD/YYYY HH:mm:ss' <=> 02/28/2001 13:01:01 */\n  dateTimeUs: 'dateTimeUs',\n\n  /** Format: 'MM/DD/YYYY hh:mm:ss a' <=> 02/28/2001 11:01:01 pm */\n  dateTimeUsAmPm: 'dateTimeUsAmPm',\n\n  /** Format: 'MM/DD/YYYY hh:mm:ss A' <=> 02/28/2001 11:01:01 PM */\n  dateTimeUsAM_PM: 'dateTimeUsAM_PM',\n\n  /** Format: 'M/D/YY H:m:s' <=> 2/28/14 14:1:2 */\n  dateTimeUsShort: 'dateTimeUsShort',\n\n  /** Format: 'M/D/YY h:m:s a' <=> 2/28/14 1:2:10 pm */\n  dateTimeUsShortAmPm: 'dateTimeUsShortAmPm',\n\n  /** Format: 'M/D/YY h:m:s A' <=> 2/28/14 14:1:1 PM */\n  dateTimeUsShortAM_PM: 'dateTimeUsShortAM_PM',\n\n  /** complex object with various properties */\n  object: 'object',\n\n  /** password text string */\n  password: 'password',\n\n  /** alias to string */\n  text: 'text',\n\n  /** readonly text string */\n  readonly: 'readonly',\n} as const;\n", "export enum SortDirectionNumber {\n  asc = 1,\n  desc = -1,\n  neutral = 0,\n}\n", "import type { AutoTooltipOption, Column, SlickPlugin } from '../models/index.js';\nimport { type SlickEventData, Utils as Utils_ } from '../slick.core.js';\nimport type { SlickGrid } from '../slick.grid.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\n/**\n * AutoTooltips plugin to show/hide tooltips when columns are too narrow to fit content.\n */\nexport class SlickAutoTooltips implements SlickPlugin {\n  // --\n  // public API\n  pluginName = 'AutoTooltips' as const;\n\n  // --\n  // protected props\n  protected _grid!: SlickGrid;\n  protected _options?: AutoTooltipOption;\n  protected _defaults: AutoTooltipOption = {\n    enableForCells: true,\n    enableForHeaderCells: false,\n    maxToolTipLength: undefined,\n    replaceExisting: true\n  };\n\n  /**\n   * Constructor of the SlickGrid 3rd party plugin, it can optionally receive options\n   * @param {boolean} [options.enableForCells=true]        - Enable tooltip for grid cells\n   * @param {boolean} [options.enableForHeaderCells=false] - Enable tooltip for header cells\n   * @param {number}  [options.maxToolTipLength=null]      - The maximum length for a tooltip\n   * @param {boolean} [options.replaceExisting=null]       - Allow preventing custom tooltips from being overwritten by auto tooltips\n   */\n  constructor(options?: AutoTooltipOption) {\n    this._options = Utils.extend(true, {}, this._defaults, options);\n  }\n\n  /**\n   * Initialize plugin.\n   */\n  init(grid: SlickGrid) {\n    this._grid = grid;\n    if (this._options?.enableForCells) {\n      this._grid.onMouseEnter.subscribe(this.handleMouseEnter.bind(this));\n    }\n    if (this._options?.enableForHeaderCells) {\n      this._grid.onHeaderMouseEnter.subscribe(this.handleHeaderMouseEnter.bind(this));\n    }\n  }\n\n  /**\n   * Destroy plugin.\n   */\n  destroy() {\n    if (this._options?.enableForCells) {\n      this._grid.onMouseEnter.unsubscribe(this.handleMouseEnter.bind(this));\n    }\n    if (this._options?.enableForHeaderCells) {\n      this._grid.onHeaderMouseEnter.unsubscribe(this.handleHeaderMouseEnter.bind(this));\n    }\n  }\n\n  /**\n   * Handle mouse entering grid cell to add/remove tooltip.\n   * @param {SlickEventData} event - The event\n   */\n  protected handleMouseEnter(event: SlickEventData) {\n    const cell = this._grid.getCellFromEvent(event);\n    if (cell) {\n      let node: HTMLElement | null = this._grid.getCellNode(cell.row, cell.cell);\n      let text;\n      if (this._options && node && (!node.title || this._options?.replaceExisting)) {\n        if (node.clientWidth < node.scrollWidth) {\n          text = node.textContent?.trim() ?? '';\n          if (this._options?.maxToolTipLength && text.length > this._options?.maxToolTipLength) {\n            text = text.substring(0, this._options.maxToolTipLength - 3) + '...';\n          }\n        } else {\n          text = '';\n        }\n        node.title = text;\n      }\n      node = null;\n    }\n  }\n\n  /**\n   * Handle mouse entering header cell to add/remove tooltip.\n   * @param {SlickEventData} event   - The event\n   * @param {object} args.column - The column definition\n   */\n  protected handleHeaderMouseEnter(event: SlickEventData, args: { column: Column; }) {\n    const column = args.column;\n    let node: HTMLDivElement | null;\n    const targetElm = (event.target as HTMLDivElement);\n\n    if (targetElm) {\n      node = targetElm.closest<HTMLDivElement>('.slick-header-column');\n      if (node && !(column?.toolTip)) {\n        const titleVal = (targetElm.clientWidth < node.clientWidth) ? column?.name ?? '' : '';\n        node.title = Utils.getHtmlStringOutput(titleVal, 'innerHTML');\n      }\n    }\n    node = null;\n  }\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  Utils.extend(true, window, {\n    Slick: {\n      AutoTooltips: SlickAutoTooltips\n    }\n  });\n}\n", "import type { CssStyleHash, SlickPlugin } from '../models/index.js';\nimport { keyCode as keyCode_, SlickEvent as SlickEvent_, type SlickEventData, Utils as Utils_, type SlickRange } from '../slick.core.js';\nimport type { SlickGrid } from '../slick.grid.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst keyCode = IIFE_ONLY ? Slick.keyCode : keyCode_;\nconst SlickEvent = IIFE_ONLY ? Slick.Event : SlickEvent_;\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\n/**\n * This manager enables users to copy/paste cell data\n */\nexport class SlickCellCopyManager implements SlickPlugin {\n  // --\n  // public API\n  pluginName = 'CellCopyManager' as const;\n  onCopyCells = new SlickEvent<{ ranges: SlickRange[] | null; }>('onCopyCells');\n  onCopyCancelled = new SlickEvent<{ ranges: SlickRange[] | null; }>('onCopyCancelled');\n  onPasteCells = new SlickEvent<{ from: SlickRange[] | undefined; to: SlickRange[] | undefined; }>('onPasteCells');\n\n  // --\n  // protected props\n  protected _grid!: SlickGrid;\n  protected _copiedRanges?: SlickRange[] | null = null;\n\n  init(grid: SlickGrid) {\n    this._grid = grid;\n    Utils.addSlickEventPubSubWhenDefined(grid.getPubSubService(), this);\n    this._grid.onKeyDown.subscribe(this.handleKeyDown.bind(this));\n  }\n\n  destroy() {\n    this._grid.onKeyDown.unsubscribe(this.handleKeyDown.bind(this));\n  }\n\n  protected handleKeyDown(e: SlickEventData) {\n    let ranges: SlickRange[] | undefined;\n    if (!this._grid.getEditorLock().isActive()) {\n      if (e.which === keyCode.ESCAPE) {\n        if (this._copiedRanges) {\n          e.preventDefault();\n          this.clearCopySelection();\n          this.onCopyCancelled.notify({ ranges: this._copiedRanges });\n          this._copiedRanges = null;\n        }\n      }\n\n      if (e.which === 67 && (e.ctrlKey || e.metaKey)) {\n        ranges = this._grid.getSelectionModel()?.getSelectedRanges() ?? [];\n        if (ranges.length !== 0) {\n          e.preventDefault();\n          this._copiedRanges = ranges;\n          this.markCopySelection(ranges);\n          this.onCopyCells.notify({ ranges });\n        }\n      }\n\n      if (e.which === 86 && (e.ctrlKey || e.metaKey)) {\n        if (this._copiedRanges) {\n          e.preventDefault();\n          ranges = this._grid.getSelectionModel()?.getSelectedRanges();\n          this.onPasteCells.notify({ from: this._copiedRanges, to: ranges });\n          if (!this._grid.getOptions().preserveCopiedSelectionOnPaste) {\n            this.clearCopySelection();\n            this._copiedRanges = null;\n          }\n        }\n      }\n    }\n  }\n\n  protected markCopySelection(ranges: SlickRange[]) {\n    const columns = this._grid.getColumns();\n    const hash: CssStyleHash = {};\n    for (let i = 0; i < ranges.length; i++) {\n      for (let j = ranges[i].fromRow; j <= ranges[i].toRow; j++) {\n        hash[j] = {};\n        for (let k = ranges[i].fromCell; k <= ranges[i].toCell; k++) {\n          hash[j][columns[k].id] = 'copied';\n        }\n      }\n    }\n    this._grid.setCellCssStyles('copy-manager', hash);\n  }\n\n  protected clearCopySelection() {\n    this._grid.removeCellCssStyles('copy-manager');\n  }\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  Utils.extend(true, window, {\n    Slick: {\n      CellCopyManager: SlickCellCopyManager\n    }\n  });\n}\n", "import type { Column, CssStyleHash, ExcelCopyBufferOption, ExternalCopyClipCommand, SlickPlugin } from '../models/index.js';\nimport type { SlickGrid } from '../slick.grid.js';\nimport { SlickEvent as SlickEvent_, type SlickEventData, SlickRange as SlickRange_, Utils as Utils_ } from '../slick.core.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst SlickEvent = IIFE_ONLY ? Slick.Event : SlickEvent_;\nconst SlickRange = IIFE_ONLY ? Slick.Range : SlickRange_;\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\nconst CLEAR_COPY_SELECTION_DELAY = 2000;\nconst CLIPBOARD_PASTE_DELAY = 100;\n\n/***\n  This manager enables users to copy/paste data from/to an external Spreadsheet application\n  such as MS-Excel\u00AE or OpenOffice-Spreadsheet.\n\n  Since it is not possible to access directly the clipboard in javascript, the plugin uses\n  a trick to do it's job. After detecting the keystroke, we dynamically create a textarea\n  where the browser copies/pastes the serialized data.\n\n  options:\n    copiedCellStyle : sets the css className used for copied cells. default : \"copied\"\n    copiedCellStyleLayerKey : sets the layer key for setting css values of copied cells. default : \"copy-manager\"\n    dataItemColumnValueExtractor : option to specify a custom column value extractor function\n    dataItemColumnValueSetter : option to specify a custom column value setter function\n    clipboardCommandHandler : option to specify a custom handler for paste actions\n    includeHeaderWhenCopying : set to true and the plugin will take the name property from each column (which is usually what appears in your header) and put that as the first row of the text that's copied to the clipboard\n    bodyElement: option to specify a custom DOM element which to will be added the hidden textbox. It's useful if the grid is inside a modal dialog.\n    onCopyInit: optional handler to run when copy action initializes\n    onCopySuccess: optional handler to run when copy action is complete\n    newRowCreator: function to add rows to table if paste overflows bottom of table, if this function is not provided new rows will be ignored.\n    readOnlyMode: suppresses paste\n    headerColumnValueExtractor : option to specify a custom column header value extractor function\n*/\nexport class SlickCellExternalCopyManager implements SlickPlugin {\n  // --\n  // public API\n  pluginName = 'CellExternalCopyManager' as const;\n  onCopyCells = new SlickEvent<{ ranges: SlickRange_[]; }>('onCopyCells');\n  onCopyCancelled = new SlickEvent<{ ranges: SlickRange_[]; }>('onCopyCancelled');\n  onPasteCells = new SlickEvent<{ ranges: SlickRange_[]; }>('onPasteCells');\n\n  // --\n  // protected props\n  protected _grid!: SlickGrid;\n  protected _bodyElement: HTMLElement;\n  protected _copiedRanges: SlickRange_[] | null = null;\n  protected _clearCopyTI?: number;\n  protected _copiedCellStyle: string;\n  protected _copiedCellStyleLayerKey: string;\n  protected _onCopyInit?: () => void;\n  protected _onCopySuccess?: (rowCount: number) => void;\n  protected _options: ExcelCopyBufferOption;\n\n  protected keyCodes = {\n    'C': 67,\n    'V': 86,\n    'ESC': 27,\n    'INSERT': 45\n  };\n\n  constructor(options: ExcelCopyBufferOption) {\n    this._options = options || {};\n    this._copiedCellStyleLayerKey = this._options.copiedCellStyleLayerKey || 'copy-manager';\n    this._copiedCellStyle = this._options.copiedCellStyle || 'copied';\n    this._bodyElement = this._options.bodyElement || document.body;\n    this._onCopyInit = this._options.onCopyInit || undefined;\n    this._onCopySuccess = this._options.onCopySuccess || undefined;\n  }\n\n  init(grid: SlickGrid) {\n    this._grid = grid;\n    Utils.addSlickEventPubSubWhenDefined(grid.getPubSubService(), this);\n    this._grid.onKeyDown.subscribe(this.handleKeyDown.bind(this));\n\n    // we need a cell selection model\n    const cellSelectionModel = grid.getSelectionModel();\n    if (!cellSelectionModel) {\n      throw new Error('Selection model is mandatory for this plugin. Please set a selection model on the grid before adding this plugin: grid.setSelectionModel(new Slick.CellSelectionModel())');\n    }\n    // we give focus on the grid when a selection is done on it.\n    // without this, if the user selects a range of cell without giving focus on a particular cell, the grid doesn't get the focus and key stroke handles (ctrl+c) don't work\n    cellSelectionModel.onSelectedRangesChanged.subscribe(() => {\n      if (!this._grid.getEditorLock().isActive()) {\n        this._grid.focus();\n      }\n    });\n  }\n\n  destroy() {\n    this._grid.onKeyDown.unsubscribe(this.handleKeyDown.bind(this));\n  }\n\n  protected getHeaderValueForColumn(columnDef: Column): string {\n    if (this._options.headerColumnValueExtractor) {\n      const val = Utils.getHtmlStringOutput(this._options.headerColumnValueExtractor(columnDef));\n      if (val) {\n        return val;\n      }\n    }\n\n    return Utils.getHtmlStringOutput(columnDef.name || '');\n  }\n\n  protected getDataItemValueForColumn(item: any, columnDef: Column, event: SlickEventData): string {\n    if (typeof this._options.dataItemColumnValueExtractor === 'function') {\n      const val = this._options.dataItemColumnValueExtractor(item, columnDef) as string | null;\n      if (val) {\n        return val;\n      }\n    }\n\n    let retVal = '';\n\n    // if a custom getter is not defined, we call serializeValue of the editor to serialize\n    if (columnDef?.editor) {\n      const tmpP = document.createElement('p');\n      const editor = new (columnDef.editor as any)({\n        container: tmpP,  // a dummy container\n        column: columnDef,\n        event,\n        position: { top: 0, left: 0 },  // a dummy position required by some editors\n        grid: this._grid,\n      });\n      editor.loadValue(item);\n      retVal = editor.serializeValue();\n      editor.destroy();\n      tmpP.remove();\n    } else {\n      retVal = item[columnDef.field || ''];\n    }\n\n    return retVal;\n  }\n\n  protected setDataItemValueForColumn(item: any, columnDef: Column, value: string): null | string | void {\n    if (columnDef.denyPaste) {\n      return null;\n    }\n\n    if (this._options.dataItemColumnValueSetter) {\n      return this._options.dataItemColumnValueSetter(item, columnDef, value) as string;\n    }\n\n    // if a custom setter is not defined, we call applyValue of the editor to unserialize\n    if (columnDef.editor) {\n      const tmpDiv = document.createElement('div');\n      const editor = new (columnDef.editor as any)({\n        container: tmpDiv, // a dummy container\n        column: columnDef,\n        position: { top: 0, left: 0 },  // a dummy position required by some editors\n        grid: this._grid\n      });\n      editor.loadValue(item);\n      editor.applyValue(item, value);\n      editor.destroy();\n      tmpDiv.remove();\n    } else {\n      item[columnDef.field] = value;\n    }\n  }\n\n\n  protected _createTextBox(innerText: string) {\n    const scrollPos = document.documentElement.scrollTop || document.body.scrollTop;\n    const ta = document.createElement('textarea');\n    ta.style.position = 'absolute';\n    ta.style.opacity = '0';\n    ta.value = innerText;\n    ta.style.top = `${scrollPos}px`;\n    this._bodyElement.appendChild(ta);\n    ta.select();\n\n    return ta;\n  }\n\n  protected _decodeTabularData(grid: SlickGrid, ta: HTMLTextAreaElement) {\n    const columns = grid.getColumns();\n    const clipText = ta.value;\n    const clipRows = clipText.split(/[\\n\\f\\r]/);\n    // trim trailing CR if present\n    if (clipRows[clipRows.length - 1] === '') {\n      clipRows.pop();\n    }\n\n    let j = 0;\n    const clippedRange: any[] = [];\n\n    this._bodyElement.removeChild(ta);\n    for (let i = 0; i < clipRows.length; i++) {\n      if (clipRows[i] !== '') {\n        clippedRange[j++] = clipRows[i].split('\\t');\n      } else {\n        clippedRange[j++] = [''];\n      }\n    }\n    const selectedCell = grid.getActiveCell();\n    const ranges = grid.getSelectionModel()?.getSelectedRanges();\n    const selectedRange = ranges && ranges.length ? ranges[0] : null;   // pick only one selection\n    let activeRow: number;\n    let activeCell: number;\n\n    if (selectedRange) {\n      activeRow = selectedRange.fromRow;\n      activeCell = selectedRange.fromCell;\n    } else if (selectedCell) {\n      activeRow = selectedCell.row;\n      activeCell = selectedCell.cell;\n    } else {\n      // we don't know where to paste\n      return;\n    }\n\n    let oneCellToMultiple = false;\n    let destH = clippedRange.length;\n    let destW = clippedRange.length ? clippedRange[0].length : 0;\n    if (clippedRange.length === 1 && clippedRange[0].length === 1 && selectedRange) {\n      oneCellToMultiple = true;\n      destH = selectedRange.toRow - selectedRange.fromRow + 1;\n      destW = selectedRange.toCell - selectedRange.fromCell + 1;\n    }\n    const availableRows = (grid.getData() as any[]).length - (activeRow || 0);\n    let addRows = 0;\n\n    // ignore new rows if we don't have a \"newRowCreator\"\n    if (availableRows < destH && typeof this._options.newRowCreator === 'function') {\n      const d = grid.getData<any[]>();\n      for (addRows = 1; addRows <= destH - availableRows; addRows++) {\n        d.push({});\n      }\n      grid.setData(d);\n      grid.render();\n    }\n\n    const overflowsBottomOfGrid = (activeRow || 0) + destH > grid.getDataLength();\n    if (this._options.newRowCreator && overflowsBottomOfGrid) {\n      const newRowsNeeded = (activeRow || 0) + destH - grid.getDataLength();\n      this._options.newRowCreator(newRowsNeeded);\n    }\n\n    const clipCommand: ExternalCopyClipCommand = {\n      isClipboardCommand: true,\n      clippedRange,\n      oldValues: [],\n      cellExternalCopyManager: this,\n      _options: this._options,\n      setDataItemValueForColumn: this.setDataItemValueForColumn.bind(this),\n      markCopySelection: this.markCopySelection.bind(this),\n      oneCellToMultiple,\n      activeRow,\n      activeCell,\n      destH,\n      destW,\n      maxDestY: grid.getDataLength(),\n      maxDestX: grid.getColumns().length,\n      h: 0,\n      w: 0,\n      execute: () => {\n        clipCommand.h = 0;\n        for (let y = 0; y < clipCommand.destH; y++) {\n          clipCommand.oldValues[y] = [];\n          clipCommand.w = 0;\n          clipCommand.h++;\n          let xOffset = 0; // the x offset for hidden col\n\n          for (let x = 0; x < clipCommand.destW; x++) {\n            const desty = activeRow + y;\n            const destx = activeCell + x;\n            const column = columns[destx];\n\n            // paste on hidden column will be skipped, but we need to paste 1 cell further on X axis\n            // we'll increase our X and increase the offset`\n            if (column.hidden) {\n              clipCommand.destW++;\n              xOffset++;\n              continue;\n            }\n            clipCommand.w++;\n\n            if (desty < clipCommand.maxDestY && destx < clipCommand.maxDestX) {\n              const dt = grid.getDataItem(desty);\n\n              clipCommand.oldValues[y][x - xOffset] = dt[column['field']];\n              if (oneCellToMultiple) {\n                clipCommand.setDataItemValueForColumn(dt, column, clippedRange[0][0]);\n              } else {\n                clipCommand.setDataItemValueForColumn(dt, column, clippedRange[y] ? clippedRange[y][x - xOffset] : '');\n              }\n              grid.updateCell(desty, destx);\n              grid.onCellChange.notify({\n                row: desty,\n                cell: destx,\n                item: dt,\n                grid,\n                column: {} as Column\n              });\n            }\n          }\n        }\n\n        const bRange = new SlickRange(\n          activeRow,\n          activeCell,\n          activeRow + clipCommand.h - 1,\n          activeCell + clipCommand.w - 1\n        );\n\n        this.markCopySelection([bRange]);\n        grid.getSelectionModel()?.setSelectedRanges([bRange]);\n        this.onPasteCells.notify({ ranges: [bRange] });\n      },\n      undo: () => {\n        for (let y = 0; y < clipCommand.destH; y++) {\n          for (let x = 0; x < clipCommand.destW; x++) {\n            const desty = activeRow + y;\n            const destx = activeCell + x;\n\n            if (desty < clipCommand.maxDestY && destx < clipCommand.maxDestX) {\n              const dt = grid.getDataItem(desty);\n              if (oneCellToMultiple) {\n                clipCommand.setDataItemValueForColumn(dt, columns[destx], clipCommand.oldValues[0][0]);\n              } else {\n                clipCommand.setDataItemValueForColumn(dt, columns[destx], clipCommand.oldValues[y][x]);\n              }\n              grid.updateCell(desty, destx);\n              grid.onCellChange.notify({\n                row: desty,\n                cell: destx,\n                item: dt,\n                grid,\n                column: {} as Column\n              });\n            }\n          }\n        }\n\n        const bRange = new SlickRange(\n          activeRow,\n          activeCell,\n          activeRow + clipCommand.h - 1,\n          activeCell + clipCommand.w - 1\n        );\n\n        this.markCopySelection([bRange]);\n        grid.getSelectionModel()?.setSelectedRanges([bRange]);\n        if (typeof this._options.onPasteCells === 'function') {\n          this.onPasteCells.notify({ ranges: [bRange] });\n        }\n\n        if (addRows > 1) {\n          const d = grid.getData<any[]>();\n          for (; addRows > 1; addRows--) {\n            d.splice(d.length - 1, 1);\n          }\n          grid.setData(d);\n          grid.render();\n        }\n      }\n    };\n\n    if (typeof this._options.clipboardCommandHandler === 'function') {\n      this._options.clipboardCommandHandler(clipCommand);\n    } else {\n      clipCommand.execute();\n    }\n  }\n\n  protected handleKeyDown(e: SlickEventData): boolean | void {\n    let ranges: SlickRange_[];\n    if (!this._grid.getEditorLock().isActive() || this._grid.getOptions().autoEdit) {\n      if (e.which === this.keyCodes.ESC) {\n        if (this._copiedRanges) {\n          e.preventDefault();\n          this.clearCopySelection();\n          this.onCopyCancelled.notify({ ranges: this._copiedRanges });\n          this._copiedRanges = null;\n        }\n      }\n\n      if ((e.which === this.keyCodes.C || e.which === this.keyCodes.INSERT) && (e.ctrlKey || e.metaKey) && !e.shiftKey) {    // CTRL+C or CTRL+INS\n        if (typeof this._onCopyInit === 'function') {\n          this._onCopyInit.call(this);\n        }\n        ranges = this._grid.getSelectionModel()?.getSelectedRanges() ?? [];\n        if (ranges.length !== 0) {\n          this._copiedRanges = ranges;\n          this.markCopySelection(ranges);\n          this.onCopyCells.notify({ ranges });\n\n          const columns = this._grid.getColumns();\n          let clipText = '';\n\n          for (let rg = 0; rg < ranges.length; rg++) {\n            const range = ranges[rg];\n            const clipTextRows: string[] = [];\n            for (let i = range.fromRow; i < range.toRow + 1; i++) {\n              const clipTextCells: string[] = [];\n              const dt = this._grid.getDataItem(i);\n\n              if (clipTextRows.length === 0 && this._options.includeHeaderWhenCopying) {\n                const clipTextHeaders: string[] = [];\n                for (let j = range.fromCell; j < range.toCell + 1; j++) {\n                  const colName: string = columns[j].name instanceof HTMLElement\n                    ? (columns[j].name as HTMLElement).innerHTML\n                    : columns[j].name as string;\n                  if (colName.length > 0 && !columns[j].hidden) {\n                    clipTextHeaders.push(this.getHeaderValueForColumn(columns[j]) || '');\n                  }\n                }\n                clipTextRows.push(clipTextHeaders.join('\\t'));\n              }\n\n              for (let j = range.fromCell; j < range.toCell + 1; j++) {\n                const colName: string = columns[j].name instanceof HTMLElement\n                  ? (columns[j].name as HTMLElement).innerHTML\n                  : columns[j].name as string;\n                if (colName.length > 0 && !columns[j].hidden) {\n                  clipTextCells.push(this.getDataItemValueForColumn(dt, columns[j], e));\n                }\n              }\n              clipTextRows.push(clipTextCells.join('\\t'));\n            }\n            clipText += clipTextRows.join('\\r\\n') + '\\r\\n';\n          }\n\n          if ((window as any).clipboardData) {\n            (window as any).clipboardData.setData('Text', clipText);\n            return true;\n          }\n          else {\n            const focusEl = document.activeElement as HTMLElement;\n            const ta = this._createTextBox(clipText);\n            ta.focus();\n\n            window.setTimeout(() => {\n              this._bodyElement.removeChild(ta);\n              // restore focus when possible\n              focusEl\n                ? focusEl.focus()\n                : console.log('No element to restore focus to after copy?');\n            }, this._options?.clipboardPasteDelay ?? CLIPBOARD_PASTE_DELAY);\n\n            if (typeof this._onCopySuccess === 'function') {\n              let rowCount = 0;\n              // If it's cell selection, use the toRow/fromRow fields\n              if (ranges.length === 1) {\n                rowCount = (ranges[0].toRow + 1) - ranges[0].fromRow;\n              } else {\n                rowCount = ranges.length;\n              }\n              this._onCopySuccess(rowCount);\n            }\n\n            return false;\n          }\n        }\n      }\n\n      if (!this._options.readOnlyMode && (\n        (e.which === this.keyCodes.V && (e.ctrlKey || e.metaKey) && !e.shiftKey)\n        || (e.which === this.keyCodes.INSERT && e.shiftKey && !e.ctrlKey)\n      )) {    // CTRL+V or Shift+INS\n        const focusEl = document.activeElement as HTMLElement;\n        const ta = this._createTextBox('');\n        window.setTimeout(() => {\n          this._decodeTabularData(this._grid, ta);\n          // restore focus when possible\n          focusEl?.focus();\n        }, this._options?.clipboardPasteDelay ?? CLIPBOARD_PASTE_DELAY);\n        return false;\n      }\n    }\n  }\n\n  protected markCopySelection(ranges: SlickRange_[]) {\n    this.clearCopySelection();\n\n    const columns = this._grid.getColumns();\n    const hash: CssStyleHash = {};\n    for (let i = 0; i < ranges.length; i++) {\n      for (let j = ranges[i].fromRow; j <= ranges[i].toRow; j++) {\n        hash[j] = {};\n        for (let k = ranges[i].fromCell; k <= ranges[i].toCell && k < columns.length; k++) {\n          hash[j][columns[k].id] = this._copiedCellStyle;\n        }\n      }\n    }\n    this._grid.setCellCssStyles(this._copiedCellStyleLayerKey, hash);\n    window.clearTimeout(this._clearCopyTI);\n    this._clearCopyTI = window.setTimeout(() => {\n      this.clearCopySelection();\n    }, this._options?.clearCopySelectionDelay || CLEAR_COPY_SELECTION_DELAY);\n  }\n\n  clearCopySelection() {\n    this._grid.removeCellCssStyles(this._copiedCellStyleLayerKey);\n  }\n\n  setIncludeHeaderWhenCopying(includeHeaderWhenCopying: boolean) {\n    this._options.includeHeaderWhenCopying = includeHeaderWhenCopying;\n  }\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  Utils.extend(true, window, {\n    Slick: {\n      CellExternalCopyManager: SlickCellExternalCopyManager\n    }\n  });\n}\n", "import {\n  BindingEventService as BindingEventService_,\n  SlickEvent as SlickEvent_,\n  SlickEventData as SlickEventData_,\n  SlickEventHandler as SlickEventHandler_,\n  Utils as Utils_\n} from '../slick.core.js';\nimport type {\n  CellMenuOption,\n  Column,\n  DOMMouseOrTouchEvent,\n  GridOption,\n  MenuCommandItem,\n  MenuCommandItemCallbackArgs,\n  MenuFromCellCallbackArgs,\n  MenuOptionItem,\n  MenuOptionItemCallbackArgs,\n  MenuType,\n  SlickPlugin\n} from '../models/index.js';\nimport type { SlickGrid } from '../slick.grid.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst BindingEventService = IIFE_ONLY ? Slick.BindingEventService : BindingEventService_;\nconst SlickEvent = IIFE_ONLY ? Slick.Event : SlickEvent_;\nconst SlickEventData = IIFE_ONLY ? Slick.EventData : SlickEventData_;\nconst EventHandler = IIFE_ONLY ? Slick.EventHandler : SlickEventHandler_;\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\n/**\n * A plugin to add Menu on a Cell click (click on the cell that has the cellMenu object defined)\n * The \"cellMenu\" is defined in a Column Definition object\n * Similar to the ContextMenu plugin (could be used in combo),\n * except that it subscribes to the cell \"onClick\" event (regular mouse click or touch).\n *\n * A general use of this plugin is for an Action Dropdown Menu to do certain things on the row that was clicked\n * You can use it to change the cell data property through a list of Options AND/OR through a list of Commands.\n *\n * USAGE:\n *\n * Add the slick.cellMenu.(js|css) files and register it with the grid.\n *\n * To specify a menu in a column header, extend the column definition like so:\n * var cellMenuPlugin = new Slick.Plugins.CellMenu(columns, grid, options);\n *\n * Available cellMenu options, by defining a cellMenu object:\n *\n *  var columns = [\n *    {\n *      id: \"action\", name: \"Action\", field: \"action\", formatter: fakeButtonFormatter,\n *      cellMenu: {\n *        optionTitle: \"Change Effort Driven\",\n *        optionItems: [\n *          { option: true, title: \"True\", iconCssClass: 'checkmark' },\n *          { option: false, title: \"False\" }\n *        ],\n *        commandTitle: \"Commands\",\n *        commandItems: [\n *          { command: \"delete-row\", title: \"Delete Row\", iconCssClass: \"sgi sgi-close\", cssClass: 'bold', textCssClass: \"red\" },\n *          { divider: true },\n *          \"divider\" // you can pass \"divider\" as a string or an object\n *          { command: \"help\", title: \"Help\", iconCssClass: \"icon-help\" },\n *          { command: \"help\", title: \"Disabled Command\", disabled: true },\n *        ],\n *      }\n *    }\n *  ];\n *\n *\n * Available cellMenu properties:\n *    commandTitle:               Title of the Command section (optional)\n *    commandItems:               Array of Command item objects (command/title pair)\n *    optionTitle:                Title of the Option section (optional)\n *    optionItems:                Array of Options item objects (option/title pair)\n *    hideCloseButton:            Hide the Close button on top right (defaults to false)\n *    hideCommandSection:         Hide the Commands section even when the commandItems array is filled (defaults to false)\n *    hideMenuOnScroll:           Do we want to hide the Cell Menu when a scrolling event occurs (defaults to true)?\n *    hideOptionSection:          Hide the Options section even when the optionItems array is filled (defaults to false)\n *    maxHeight:                  Maximum height that the drop menu will have, can be a number (250) or text (\"none\")\n *    width:                      Width that the drop menu will have, can be a number (250) or text (defaults to \"auto\")\n *    autoAdjustDrop:             Auto-align dropup or dropdown menu to the left or right depending on grid viewport available space (defaults to true)\n *    autoAdjustDropOffset:       Optionally add an offset to the auto-align of the drop menu (defaults to 0)\n *    autoAlignSide:              Auto-align drop menu to the left or right depending on grid viewport available space (defaults to true)\n *    autoAlignSideOffset:        Optionally add an offset to the left/right side auto-align (defaults to 0)\n *    menuUsabilityOverride:      Callback method that user can override the default behavior of enabling/disabling the menu from being usable (must be combined with a custom formatter)\n *    subItemChevronClass:        CSS class that can be added on the right side of a sub-item parent (typically a chevron-right icon)\n *    subMenuOpenByEvent:         defaults to \"mouseover\", what event type shoud we use to open sub-menu(s), 2 options are available: \"mouseover\" or \"click\"\n *\n *\n * Available menu Command/Option item properties:\n *    action:                     Optionally define a callback function that gets executed when item is chosen (and/or use the onCommand event)\n *    command:                    A command identifier to be passed to the onCommand event handlers (when using \"commandItems\").\n *    option:                     An option to be passed to the onOptionSelected event handlers (when using \"optionItems\").\n *    title:                      Menu item text label.\n *    divider:                    Boolean which tells if the current item is a divider, not an actual command. You could also pass \"divider\" instead of an object\n *    disabled:                   Whether the item/command is disabled.\n *    hidden:                     Whether the item/command is hidden.\n *    subMenuTitle:               Optional sub-menu title that will shows up when sub-menu commmands/options list is opened\n *    subMenuTitleCssClass:       Optional sub-menu title CSS class to use with `subMenuTitle`\n *    tooltip:                    Item tooltip.\n *    cssClass:                   A CSS class to be added to the menu item container.\n *    iconCssClass:               A CSS class to be added to the menu item icon.\n *    textCssClass:               A CSS class to be added to the menu item text.\n *    iconImage:                  A url to the icon image.\n *    itemVisibilityOverride:     Callback method that user can override the default behavior of showing/hiding an item from the list\n *    itemUsabilityOverride:      Callback method that user can override the default behavior of enabling/disabling an item from the list\n *\n *\n * The plugin exposes the following events:\n *\n *    onAfterMenuShow: Fired after the menu is shown.  You can customize the menu or dismiss it by returning false.\n *        Event args:\n *            cell:         Cell or column index\n *            row:          Row index\n *            grid:         Reference to the grid.\n *\n *    onBeforeMenuShow: Fired before the menu is shown.  You can customize the menu or dismiss it by returning false.\n *        Event args:\n *            cell:         Cell or column index\n *            row:          Row index\n *            grid:         Reference to the grid.\n *\n *    onBeforeMenuClose: Fired when the menu is closing.\n *        Event args:\n *            cell:         Cell or column index\n *            row:          Row index\n *            grid:         Reference to the grid.\n *            menu:         Menu DOM element\n *\n *    onCommand: Fired on menu option clicked from the Command items list\n *        Event args:\n *            cell:         Cell or column index\n *            row:          Row index\n *            grid:         Reference to the grid.\n *            command:      Menu command identified.\n *            item:         Menu item selected\n *            column:    Cell Column definition\n *            dataContext:  Cell Data Context (data object)\n *\n *    onOptionSelected: Fired on menu option clicked from the Option items list\n *        Event args:\n *            cell:         Cell or column index\n *            row:          Row index\n *            grid:         Reference to the grid.\n *            option:       Menu option selected.\n *            item:         Menu item selected\n *            column:    Cell Column definition\n *            dataContext:  Cell Data Context (data object)\n *\n *\n * @param options {Object} Cell Menu Options\n * @class Slick.Plugins.CellMenu\n */\nexport class SlickCellMenu implements SlickPlugin {\n  // --\n  // public API\n  pluginName = 'CellMenu' as const;\n  onAfterMenuShow = new SlickEvent<MenuFromCellCallbackArgs>('onAfterMenuShow');\n  onBeforeMenuShow = new SlickEvent<MenuFromCellCallbackArgs>('onBeforeMenuShow');\n  onBeforeMenuClose = new SlickEvent<MenuFromCellCallbackArgs>('onBeforeMenuClose');\n  onCommand = new SlickEvent<MenuCommandItemCallbackArgs>('onCommand');\n  onOptionSelected = new SlickEvent<MenuOptionItemCallbackArgs>('onOptionSelected');\n\n  // --\n  // protected props\n  protected _bindingEventService = new BindingEventService();\n  protected _cellMenuProperties: CellMenuOption;\n  protected _currentCell = -1;\n  protected _currentRow = -1;\n  protected _grid!: SlickGrid;\n  protected _gridOptions!: GridOption;\n  protected _gridUid = '';\n  protected _handler = new EventHandler();\n  protected _commandTitleElm?: HTMLSpanElement;\n  protected _optionTitleElm?: HTMLSpanElement;\n  protected _lastMenuTypeClicked = '';\n  protected _menuElm?: HTMLDivElement | null;\n  protected _subMenuParentId = '';\n  protected _defaults: CellMenuOption = {\n    autoAdjustDrop: true,     // dropup/dropdown\n    autoAlignSide: true,      // left/right\n    autoAdjustDropOffset: 0,\n    autoAlignSideOffset: 0,\n    hideMenuOnScroll: true,\n    maxHeight: 'none',\n    width: 'auto',\n    subMenuOpenByEvent: 'mouseover',\n  };\n\n  constructor(optionProperties: Partial<CellMenuOption>) {\n    this._cellMenuProperties = Utils.extend({}, this._defaults, optionProperties);\n  }\n\n  init(grid: SlickGrid) {\n    this._grid = grid;\n    this._gridOptions = grid.getOptions();\n    Utils.addSlickEventPubSubWhenDefined(grid.getPubSubService(), this);\n    this._gridUid = grid?.getUID() || '';\n    this._handler.subscribe(this._grid.onClick as any, this.handleCellClick.bind(this));\n    if (this._cellMenuProperties.hideMenuOnScroll) {\n      this._handler.subscribe(this._grid.onScroll, this.closeMenu.bind(this));\n    }\n  }\n\n  setOptions(newOptions: Partial<CellMenuOption>) {\n    this._cellMenuProperties = Utils.extend({}, this._cellMenuProperties, newOptions);\n  }\n\n  destroy() {\n    this.onAfterMenuShow.unsubscribe();\n    this.onBeforeMenuShow.unsubscribe();\n    this.onBeforeMenuClose.unsubscribe();\n    this.onCommand.unsubscribe();\n    this.onOptionSelected.unsubscribe();\n    this._handler.unsubscribeAll();\n    this._bindingEventService.unbindAll();\n    this._menuElm?.remove();\n    this._commandTitleElm = null as any;\n    this._optionTitleElm = null as any;\n    this._menuElm = null as any;\n  }\n\n  protected createParentMenu(e: DOMMouseOrTouchEvent<HTMLDivElement>) {\n    const cell = this._grid.getCellFromEvent(e);\n    this._currentCell = cell?.cell ?? 0;\n    this._currentRow = cell?.row ?? 0;\n    const columnDef = this._grid.getColumns()[this._currentCell];\n\n    const commandItems = this._cellMenuProperties.commandItems || [];\n    const optionItems = this._cellMenuProperties.optionItems || [];\n\n    // make sure there's at least something to show before creating the Cell Menu\n    if (!columnDef || !columnDef.cellMenu || (!commandItems.length && !optionItems.length)) {\n      return;\n    }\n\n    // delete any prior Cell Menu\n    this.closeMenu();\n\n    // Let the user modify the menu or cancel altogether,\n    // or provide alternative menu implementation.\n    if (this.onBeforeMenuShow.notify({\n      cell: this._currentCell,\n      row: this._currentRow,\n      grid: this._grid\n    }, e, this).getReturnValue() === false) {\n      return;\n    }\n\n    // create 1st parent menu container & reposition it\n    this._menuElm = this.createMenu(commandItems, optionItems);\n    this._menuElm.style.top = `${e.pageY + 5}px`;\n    this._menuElm.style.left = `${e.pageX}px`;\n    this._menuElm.style.display = 'block';\n    document.body.appendChild(this._menuElm);\n\n    if (this.onAfterMenuShow.notify({\n      cell: this._currentCell,\n      row: this._currentRow,\n      grid: this._grid\n    }, e, this).getReturnValue() === false) {\n      return;\n    }\n\n    return this._menuElm;\n  }\n\n  /**\n   * Create parent menu or sub-menu(s), a parent menu will start at level 0 while sub-menu(s) will be incremented\n   * @param commandItems - array of optional commands or dividers\n   * @param optionItems - array of optional options or dividers\n   * @param level - menu level\n   * @param item - command, option or divider\n   * @returns menu DOM element\n   */\n  protected createMenu(commandItems: Array<MenuCommandItem | 'divider'>, optionItems: Array<MenuOptionItem | 'divider'>, level = 0, item?: MenuCommandItem | MenuOptionItem | 'divider') {\n    const columnDef = this._grid.getColumns()[this._currentCell];\n    const dataContext = this._grid.getDataItem(this._currentRow);\n\n    // create a new cell menu\n    const maxHeight = isNaN(this._cellMenuProperties.maxHeight as number) ? this._cellMenuProperties.maxHeight : `${this._cellMenuProperties.maxHeight ?? 0}px`;\n    const width = isNaN(this._cellMenuProperties.width as number) ? this._cellMenuProperties.width : `${this._cellMenuProperties.maxWidth ?? 0}px`;\n\n    // to avoid having multiple sub-menu trees opened,\n    // we need to somehow keep trace of which parent menu the tree belongs to\n    // and we should keep ref of only the first sub-menu parent, we can use the command name (remove any whitespaces though)\n    const subMenuCommand = (item as MenuCommandItem)?.command;\n    let subMenuId = (level === 1 && subMenuCommand) ? subMenuCommand.replaceAll(' ', '') : '';\n    if (subMenuId) {\n      this._subMenuParentId = subMenuId;\n    }\n    if (level > 1) {\n      subMenuId = this._subMenuParentId;\n    }\n\n    const menuClasses = `slick-cell-menu slick-menu-level-${level} ${this._gridUid}`;\n    const bodyMenuElm = document.body.querySelector<HTMLDivElement>(`.slick-cell-menu.slick-menu-level-${level}${this.getGridUidSelector()}`);\n\n    // return menu/sub-menu if it's already opened unless we are on different sub-menu tree if so close them all\n    if (bodyMenuElm) {\n      if (bodyMenuElm.dataset.subMenuParent === subMenuId) {\n        return bodyMenuElm;\n      }\n      this.destroySubMenus();\n    }\n\n    const menuElm = document.createElement('div');\n    menuElm.className = menuClasses;\n    if (level > 0) {\n      menuElm.classList.add('slick-submenu');\n      if (subMenuId) {\n        menuElm.dataset.subMenuParent = subMenuId;\n      }\n    }\n    menuElm.ariaLabel = level > 1 ? 'SubMenu' : 'Cell Menu';\n    menuElm.role = 'menu';\n    if (width) {\n      menuElm.style.width = width as string;\n    }\n    if (maxHeight) {\n      menuElm.style.maxHeight = maxHeight as string;\n    }\n\n    menuElm.style.display = 'none';\n\n    let closeButtonElm: HTMLButtonElement | null = null;\n    if (level === 0) {\n      closeButtonElm = document.createElement('button');\n      closeButtonElm.type = 'button';\n      closeButtonElm.className = 'close';\n      closeButtonElm.dataset.dismiss = 'slick-cell-menu';\n      closeButtonElm.ariaLabel = 'Close';\n\n      const spanCloseElm = document.createElement('span');\n      spanCloseElm.className = 'close';\n      spanCloseElm.ariaHidden = 'true';\n      spanCloseElm.textContent = '\u00D7';\n      closeButtonElm.appendChild(spanCloseElm);\n    }\n\n    // -- Option List section\n    if (!this._cellMenuProperties.hideOptionSection && optionItems.length > 0) {\n      const optionMenuElm = document.createElement('div');\n      optionMenuElm.className = 'slick-cell-menu-option-list';\n      optionMenuElm.role = 'menu';\n\n      // when creating sub-menu add its sub-menu title when exists\n      if (item && level > 0) {\n        this.addSubMenuTitleWhenExists(item, optionMenuElm); // add sub-menu title when exists\n      }\n\n      if (closeButtonElm && !this._cellMenuProperties.hideCloseButton) {\n        this._bindingEventService.bind(closeButtonElm, 'click', this.handleCloseButtonClicked.bind(this) as EventListener);\n        menuElm.appendChild(closeButtonElm);\n      }\n      menuElm.appendChild(optionMenuElm);\n\n      this.populateCommandOrOptionItems(\n        'option',\n        this._cellMenuProperties,\n        optionMenuElm,\n        optionItems,\n        { cell: this._currentCell, row: this._currentRow, column: columnDef, dataContext, grid: this._grid, level }\n      );\n    }\n\n    // -- Command List section\n    if (!this._cellMenuProperties.hideCommandSection && commandItems.length > 0) {\n      const commandMenuElm = document.createElement('div');\n      commandMenuElm.className = 'slick-cell-menu-command-list';\n      commandMenuElm.role = 'menu';\n\n      // when creating sub-menu add its sub-menu title when exists\n      if (item && level > 0) {\n        this.addSubMenuTitleWhenExists(item, commandMenuElm); // add sub-menu title when exists\n      }\n\n      if (closeButtonElm && !this._cellMenuProperties.hideCloseButton && (optionItems.length === 0 || this._cellMenuProperties.hideOptionSection)) {\n        this._bindingEventService.bind(closeButtonElm, 'click', this.handleCloseButtonClicked.bind(this) as EventListener);\n        menuElm.appendChild(closeButtonElm);\n      }\n      menuElm.appendChild(commandMenuElm);\n\n      this.populateCommandOrOptionItems(\n        'command',\n        this._cellMenuProperties,\n        commandMenuElm,\n        commandItems,\n        { cell: this._currentCell, row: this._currentRow, column: columnDef, dataContext, grid: this._grid, level }\n      );\n    }\n\n    // increment level for possible next sub-menus if exists\n    level++;\n\n    return menuElm;\n  }\n\n  protected addSubMenuTitleWhenExists(item: MenuCommandItem | MenuOptionItem | 'divider', commandOrOptionMenu: HTMLDivElement) {\n    if (item !== 'divider' && item?.subMenuTitle) {\n      const subMenuTitleElm = document.createElement('div');\n      subMenuTitleElm.className = 'slick-menu-title';\n      subMenuTitleElm.textContent = item.subMenuTitle as string;\n      const subMenuTitleClass = item.subMenuTitleCssClass as string;\n      if (subMenuTitleClass) {\n        subMenuTitleElm.classList.add(...Utils.classNameToList(subMenuTitleClass));\n      }\n\n      commandOrOptionMenu.appendChild(subMenuTitleElm);\n    }\n  }\n\n  protected handleCloseButtonClicked(e: DOMMouseOrTouchEvent<HTMLButtonElement>) {\n    if (!e.defaultPrevented) {\n      this.closeMenu(e);\n    }\n  }\n\n  /** Close and destroy Cell Menu */\n  closeMenu(e?: DOMMouseOrTouchEvent<HTMLButtonElement | HTMLDivElement> | SlickEventData_, args?: MenuFromCellCallbackArgs) {\n    if (this._menuElm) {\n      if (this.onBeforeMenuClose.notify({\n        cell: args?.cell ?? 0,\n        row: args?.row ?? 0,\n        grid: this._grid,\n      }, e, this).getReturnValue() === false) {\n        return;\n      }\n      this._menuElm.remove();\n      this._menuElm = null;\n    }\n    this.destroySubMenus();\n  }\n\n  /** Destroy all parent menus and any sub-menus */\n  destroyAllMenus() {\n    this.destroySubMenus();\n\n    // remove all parent menu listeners before removing them from the DOM\n    this._bindingEventService.unbindAll('parent-menu');\n    document.querySelectorAll(`.slick-cell-menu${this.getGridUidSelector()}`)\n      .forEach(subElm => subElm.remove());\n  }\n\n  /** Close and destroy all previously opened sub-menus */\n  destroySubMenus() {\n    this._bindingEventService.unbindAll('sub-menu');\n    document.querySelectorAll(`.slick-cell-menu.slick-submenu${this.getGridUidSelector()}`)\n      .forEach(subElm => subElm.remove());\n  }\n\n  protected repositionSubMenu(item: MenuCommandItem | MenuOptionItem | 'divider', type: MenuType, level: number, e: DOMMouseOrTouchEvent<HTMLDivElement>) {\n    // when we're clicking a grid cell OR our last menu type (command/option) differs then we know that we need to start fresh and close any sub-menus that might still be open\n    if (e.target.classList.contains('slick-cell') || this._lastMenuTypeClicked !== type) {\n      this.destroySubMenus();\n    }\n\n    // creating sub-menu, we'll also pass level & the item object since we might have \"subMenuTitle\" to show\n    const subMenuElm = this.createMenu((item as MenuCommandItem)?.commandItems || [], (item as MenuOptionItem)?.optionItems || [], level + 1, item);\n    subMenuElm.style.display = 'block';\n    document.body.appendChild(subMenuElm);\n    this.repositionMenu(e, subMenuElm);\n  }\n\n  /**\n   * Reposition the menu drop (up/down) and the side (left/right)\n   * @param {*} event\n   */\n  repositionMenu(e: DOMMouseOrTouchEvent<HTMLDivElement>, menuElm: HTMLElement) {\n    const isSubMenu = menuElm.classList.contains('slick-submenu');\n    const parentElm = isSubMenu\n      ? e.target.closest('.slick-cell-menu-item') as HTMLDivElement\n      : e.target.closest('.slick-cell') as HTMLDivElement;\n\n    if (menuElm && parentElm) {\n      const parentOffset = Utils.offset(parentElm);\n      let menuOffsetLeft = parentElm ? parentOffset?.left ?? 0 : e?.pageX ?? 0;\n      let menuOffsetTop = parentElm ? parentOffset?.top ?? 0 : e?.pageY ?? 0;\n      const parentCellWidth = parentElm?.offsetWidth || 0;\n      const menuHeight = menuElm?.offsetHeight ?? 0;\n      const menuWidth = Number(menuElm?.offsetWidth ?? this._cellMenuProperties.width ?? 0);\n      const rowHeight = this._gridOptions.rowHeight;\n      const dropOffset = Number(this._cellMenuProperties.autoAdjustDropOffset || 0);\n      const sideOffset = Number(this._cellMenuProperties.autoAlignSideOffset || 0);\n\n      // if autoAdjustDrop is enable, we first need to see what position the drop will be located (defaults to bottom)\n      // without necessary toggling it's position just yet, we just want to know the future position for calculation\n      if (this._cellMenuProperties.autoAdjustDrop) {\n        // since we reposition menu below slick cell, we need to take it in consideration and do our calculation from that element\n        const spaceBottom = Utils.calculateAvailableSpace(parentElm).bottom;\n        const spaceTop = Utils.calculateAvailableSpace(parentElm).top;\n        const spaceBottomRemaining = spaceBottom + dropOffset - rowHeight!;\n        const spaceTopRemaining = spaceTop - dropOffset + rowHeight!;\n        const dropPosition = (spaceBottomRemaining < menuHeight && spaceTopRemaining > spaceBottomRemaining) ? 'top' : 'bottom';\n        if (dropPosition === 'top') {\n          menuElm.classList.remove('dropdown');\n          menuElm.classList.add('dropup');\n          if (isSubMenu) {\n            menuOffsetTop -= (menuHeight - dropOffset - parentElm.clientHeight);\n          } else {\n            menuOffsetTop -= menuHeight - dropOffset;\n          }\n        } else {\n          menuElm.classList.remove('dropup');\n          menuElm.classList.add('dropdown');\n          if (isSubMenu) {\n            menuOffsetTop += dropOffset;\n          } else {\n            menuOffsetTop += rowHeight! + dropOffset;\n          }\n        }\n      }\n\n      // when auto-align is set, it will calculate whether it has enough space in the viewport to show the drop menu on the right (default)\n      // if there isn't enough space on the right, it will automatically align the drop menu to the left (defaults to the right)\n      // to simulate an align left, we actually need to know the width of the drop menu\n      if (this._cellMenuProperties.autoAlignSide) {\n        const gridPos = this._grid.getGridPosition();\n        let subMenuPosCalc = menuOffsetLeft + Number(menuWidth); // calculate coordinate at caller element far right\n        if (isSubMenu) {\n          subMenuPosCalc += parentElm.clientWidth;\n        }\n        const browserWidth = document.documentElement.clientWidth;\n        const dropSide = (subMenuPosCalc >= gridPos.width || subMenuPosCalc >= browserWidth) ? 'left' : 'right';\n        if (dropSide === 'left') {\n          menuElm.classList.remove('dropright');\n          menuElm.classList.add('dropleft');\n          if (isSubMenu) {\n            menuOffsetLeft -= menuWidth - sideOffset;\n          } else {\n            menuOffsetLeft -= menuWidth - parentCellWidth - sideOffset;\n          }\n        } else {\n          menuElm.classList.remove('dropleft');\n          menuElm.classList.add('dropright');\n          if (isSubMenu) {\n            menuOffsetLeft += sideOffset + parentElm.offsetWidth;\n          } else {\n            menuOffsetLeft += sideOffset;\n          }\n        }\n      }\n\n      // ready to reposition the menu\n      menuElm.style.top = `${menuOffsetTop}px`;\n      menuElm.style.left = `${menuOffsetLeft}px`;\n    }\n  }\n\n  protected getGridUidSelector() {\n    const gridUid = this._grid.getUID() || '';\n    return gridUid ? `.${gridUid}` : '';\n  }\n\n  protected handleCellClick(evt: SlickEventData_ | DOMMouseOrTouchEvent<HTMLDivElement>, args: MenuCommandItemCallbackArgs) {\n    this.destroyAllMenus(); // make there's only 1 parent menu opened at a time\n    const e = (evt instanceof SlickEventData) ? evt.getNativeEvent<DOMMouseOrTouchEvent<HTMLDivElement>>() : evt;\n    const cell = this._grid.getCellFromEvent(e);\n\n    if (cell) {\n      const dataContext = this._grid.getDataItem(cell.row);\n      const columnDef = this._grid.getColumns()[cell.cell];\n\n      // prevent event from bubbling but only on column that has a cell menu defined\n      if (columnDef?.cellMenu) {\n        e.preventDefault();\n      }\n\n      // merge the cellMenu of the column definition with the default properties\n      this._cellMenuProperties = Utils.extend({}, this._cellMenuProperties, columnDef.cellMenu);\n\n      // run the override function (when defined), if the result is false it won't go further\n      args = args || {};\n      args.column = columnDef;\n      args.dataContext = dataContext;\n      args.grid = this._grid;\n      if (!this.runOverrideFunctionWhenExists<typeof args>(this._cellMenuProperties.menuUsabilityOverride, args)) {\n        return;\n      }\n\n      // create the DOM element\n      this._menuElm = this.createParentMenu(e);\n\n      // reposition the menu to where the user clicked\n      if (this._menuElm) {\n        this.repositionMenu(e, this._menuElm);\n        this._menuElm.setAttribute('aria-expanded', 'true');\n        this._menuElm.style.display = 'block';\n      }\n\n      // Hide the menu on outside click.\n      this._bindingEventService.bind(document.body, 'mousedown', this.handleBodyMouseDown.bind(this) as EventListener);\n    }\n  }\n\n  /** When users click outside the Cell Menu, we will typically close the Cell Menu (and any sub-menus) */\n  protected handleBodyMouseDown(e: DOMMouseOrTouchEvent<HTMLDivElement>) {\n    // did we click inside the menu or any of its sub-menu(s)\n    let isMenuClicked = false;\n    if (this._menuElm?.contains(e.target)) {\n      isMenuClicked = true;\n    }\n    if (!isMenuClicked) {\n      document\n        .querySelectorAll(`.slick-cell-menu.slick-submenu${this.getGridUidSelector()}`)\n        .forEach(subElm => {\n          if (subElm.contains(e.target)) {\n            isMenuClicked = true;\n          }\n        });\n    }\n\n    if (this._menuElm !== e.target && !isMenuClicked && !e.defaultPrevented) {\n      this.closeMenu(e, { cell: this._currentCell, row: this._currentRow, grid: this._grid });\n    }\n  }\n\n  /** Build the Command Items section. */\n  protected populateCommandOrOptionItems(\n    itemType: MenuType,\n    cellMenu: CellMenuOption,\n    commandOrOptionMenuElm: HTMLElement,\n    commandOrOptionItems: Array<MenuCommandItem | 'divider'> | Array<MenuOptionItem | 'divider'>,\n    args: { cell: number, row: number, column: Column, dataContext: any, grid: SlickGrid, level: number }\n  ) {\n    if (!args || !commandOrOptionItems || !cellMenu) {\n      return;\n    }\n\n    // user could pass a title on top of the Commands/Options section\n    const level = args?.level || 0;\n    const isSubMenu = level > 0;\n    if (cellMenu?.[`${itemType}Title`] && !isSubMenu) {\n      this[`_${itemType}TitleElm`] = document.createElement('div');\n      this[`_${itemType}TitleElm`]!.className = 'slick-menu-title';\n      this[`_${itemType}TitleElm`]!.textContent = cellMenu[`${itemType}Title`] as string;\n      commandOrOptionMenuElm.appendChild(this[`_${itemType}TitleElm`]!);\n    }\n\n    for (let i = 0, ln = commandOrOptionItems.length; i < ln; i++) {\n      let addClickListener = true;\n      const item = commandOrOptionItems[i];\n\n      // run each override functions to know if the item is visible and usable\n      const isItemVisible = this.runOverrideFunctionWhenExists<typeof args>((item as MenuCommandItem | MenuOptionItem).itemVisibilityOverride, args);\n      const isItemUsable = this.runOverrideFunctionWhenExists<typeof args>((item as MenuCommandItem | MenuOptionItem).itemUsabilityOverride, args);\n\n      // if the result is not visible then there's no need to go further\n      if (!isItemVisible) {\n        continue;\n      }\n\n      // when the override is defined, we need to use its result to update the disabled property\n      // so that \"handleMenuItemClick\" has the correct flag and won't trigger a command/option clicked event\n      if (Object.prototype.hasOwnProperty.call(item, 'itemUsabilityOverride')) {\n        (item as MenuCommandItem | MenuOptionItem).disabled = isItemUsable ? false : true;\n      }\n\n      const liElm = document.createElement('div');\n      liElm.className = 'slick-cell-menu-item';\n      liElm.role = 'menuitem';\n\n      if ((item as MenuCommandItem | MenuOptionItem).divider || item === 'divider') {\n        liElm.classList.add('slick-cell-menu-item-divider');\n        addClickListener = false;\n      }\n\n      // if the item is disabled then add the disabled css class\n      if ((item as MenuCommandItem | MenuOptionItem).disabled || !isItemUsable) {\n        liElm.classList.add('slick-cell-menu-item-disabled');\n      }\n\n      // if the item is hidden then add the hidden css class\n      if ((item as MenuCommandItem | MenuOptionItem).hidden) {\n        liElm.classList.add('slick-cell-menu-item-hidden');\n      }\n\n      if ((item as MenuCommandItem | MenuOptionItem).cssClass) {\n        liElm.classList.add(...Utils.classNameToList((item as MenuCommandItem | MenuOptionItem).cssClass));\n      }\n\n      if ((item as MenuCommandItem | MenuOptionItem).tooltip) {\n        liElm.title = (item as MenuCommandItem | MenuOptionItem).tooltip || '';\n      }\n\n      const iconElm = document.createElement('div');\n      iconElm.className = 'slick-cell-menu-icon';\n\n      liElm.appendChild(iconElm);\n\n      if ((item as MenuCommandItem | MenuOptionItem).iconCssClass) {\n        iconElm.classList.add(...Utils.classNameToList((item as MenuCommandItem | MenuOptionItem).iconCssClass));\n      }\n\n      if ((item as MenuCommandItem | MenuOptionItem).iconImage) {\n        iconElm.style.backgroundImage = `url(${(item as MenuCommandItem | MenuOptionItem).iconImage})`;\n      }\n\n      const textElm = document.createElement('span');\n      textElm.className = 'slick-cell-menu-content';\n      textElm.textContent = (item as MenuCommandItem | MenuOptionItem).title || '';\n\n      liElm.appendChild(textElm);\n\n      if ((item as MenuCommandItem | MenuOptionItem).textCssClass) {\n        textElm.classList.add(...Utils.classNameToList((item as MenuCommandItem | MenuOptionItem).textCssClass));\n      }\n\n      commandOrOptionMenuElm.appendChild(liElm);\n\n      if (addClickListener) {\n        const eventGroup = isSubMenu ? 'sub-menu' : 'parent-menu';\n        this._bindingEventService.bind(liElm, 'click', this.handleMenuItemClick.bind(this, item, itemType, level) as EventListener, undefined, eventGroup);\n      }\n\n      // optionally open sub-menu(s) by mouseover\n      if (this._cellMenuProperties.subMenuOpenByEvent === 'mouseover') {\n        this._bindingEventService.bind(liElm, 'mouseover', ((e: DOMMouseOrTouchEvent<HTMLDivElement>) => {\n          if ((item as MenuCommandItem).commandItems || (item as MenuOptionItem).optionItems) {\n            this.repositionSubMenu(item, itemType, level, e);\n            this._lastMenuTypeClicked = itemType;\n          } else if (!isSubMenu) {\n            this.destroySubMenus();\n          }\n        }) as EventListener);\n      }\n\n      // the option/command item could be a sub-menu if it has another list of commands/options\n      if ((item as MenuCommandItem).commandItems || (item as MenuOptionItem).optionItems) {\n        const chevronElm = document.createElement('span');\n        chevronElm.className = 'sub-item-chevron';\n        if (this._cellMenuProperties.subItemChevronClass) {\n          chevronElm.classList.add(...Utils.classNameToList(this._cellMenuProperties.subItemChevronClass));\n        } else {\n          chevronElm.textContent = '\u2B9E'; // \u2B9E or \u25B8\n        }\n\n        liElm.classList.add('slick-submenu-item');\n        liElm.appendChild(chevronElm);\n        continue;\n      }\n    }\n  }\n\n  protected handleMenuItemClick(item: MenuCommandItem | MenuOptionItem | 'divider', type: MenuType, level = 0, e: DOMMouseOrTouchEvent<HTMLDivElement>) {\n    if ((item as never)?.[type] !== undefined && item !== 'divider' && !item.disabled && !(item as MenuCommandItem | MenuOptionItem).divider && this._currentCell !== undefined && this._currentRow !== undefined) {\n      if (type === 'option' && !this._grid.getEditorLock().commitCurrentEdit()) {\n        return;\n      }\n      const optionOrCommand = (item as any)[type] !== undefined ? (item as any)[type] : '';\n      const row = this._currentRow;\n      const cell = this._currentCell;\n      const columnDef = this._grid.getColumns()[cell];\n      const dataContext = this._grid.getDataItem(row);\n\n      if (optionOrCommand !== undefined && !(item as any)[`${type}Items`]) {\n        // user could execute a callback through 2 ways\n        // via the onCommand/onOptionSelected event and/or an action callback\n        const callbackArgs = {\n          cell,\n          row,\n          grid: this._grid,\n          [type]: optionOrCommand,\n          item,\n          column: columnDef,\n          dataContext,\n        };\n        const eventType = type === 'command' ? 'onCommand' : 'onOptionSelected';\n        this[eventType].notify(callbackArgs as any, e, this);\n\n        // execute action callback when defined\n        if (typeof item.action === 'function') {\n          (item as any).action.call(this, e, callbackArgs);\n        }\n\n        // unless prevented, close the menu\n        if (!e.defaultPrevented) {\n          this.closeMenu(e, { cell, row, grid: this._grid });\n        }\n      } else if ((item as MenuCommandItem).commandItems || (item as MenuOptionItem).optionItems) {\n        this.repositionSubMenu(item, type, level, e);\n      } else {\n        this.destroySubMenus();\n      }\n      this._lastMenuTypeClicked = type;\n    }\n  }\n\n  /**\n   * Method that user can pass to override the default behavior.\n   * In order word, user can choose or an item is (usable/visible/enable) by providing his own logic.\n   * @param overrideFn: override function callback\n   * @param args: multiple arguments provided to the override (cell, row, columnDef, dataContext, grid)\n   */\n  protected runOverrideFunctionWhenExists<T = any>(overrideFn: ((args: any) => boolean) | undefined, args: T): boolean {\n    if (typeof overrideFn === 'function') {\n      return overrideFn.call(this, args);\n    }\n    return true;\n  }\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  Utils.extend(true, window, {\n    Slick: {\n      Plugins: {\n        CellMenu: SlickCellMenu\n      }\n    }\n  });\n}\n", "import type { CSSStyleDeclarationWritable, CellRangeDecoratorOption, SlickPlugin } from '../models/index.js';\nimport { Utils as Utils_, type SlickRange } from '../slick.core.js';\nimport type { SlickGrid } from '../slick.grid.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\n/***\n   * Displays an overlay on top of a given cell range.\n   *\n   * TODO:\n   * Currently, it blocks mouse events to DOM nodes behind it.\n   * Use FF and WebKit-specific \"pointer-events\" CSS style, or some kind of event forwarding.\n   * Could also construct the borders separately using 4 individual DIVs.\n   *\n   * @param {Grid} grid\n   * @param {Object} options\n   */\nexport class SlickCellRangeDecorator implements SlickPlugin {\n  // --\n  // public API\n  pluginName = 'CellRangeDecorator' as const;\n\n  // --\n  // protected props\n  protected _options: CellRangeDecoratorOption;\n  protected _elem?: HTMLDivElement | null;\n  protected _selectionCss: CSSStyleDeclaration;\n  protected _defaults = {\n    selectionCssClass: 'slick-range-decorator',\n    selectionCss: {\n      zIndex: '9999',\n      border: '2px dashed red'\n    },\n    copyToSelectionCss : {\n        \"zIndex\": \"9999\",\n        \"border\": \"2px dashed blue\"\n    },\n    offset: { top: -1, left: -1, height: -2, width: -2 }\n  } as CellRangeDecoratorOption;\n\n  constructor(protected readonly grid: SlickGrid, options?: Partial<CellRangeDecoratorOption>) {\n    this._options = Utils.extend(true, {}, this._defaults, options);\n    this._selectionCss = options?.selectionCss || {} as CSSStyleDeclaration;\n  }\n\n  destroy() {\n    this.hide();\n  }\n\n  getSelectionCss() {\n    return this._selectionCss;\n  }\n\n  setSelectionCss(cssProps: CSSStyleDeclaration) {\n    this._selectionCss = cssProps;\n  }\n\n  init() { }\n\n  hide() {\n    this._elem?.remove();\n    this._elem = null;\n  }\n\n  show(range: SlickRange, isCopyTo?: boolean) {\n    if (!this._elem) {\n      this._elem = document.createElement('div');\n      this._elem.className = this._options.selectionCssClass;\n      this._elem.style.position = 'absolute';\n      const canvasNode = this.grid.getActiveCanvasNode();\n      if (canvasNode) {\n        canvasNode.appendChild(this._elem);\n      }\n    }\n\n    const css = isCopyTo && this._options.copyToSelectionCss ? this._options.copyToSelectionCss :this._options.selectionCss;\n    Object.keys(css).forEach((cssStyleKey) => {\n      if (this._elem!.style[cssStyleKey as CSSStyleDeclarationWritable] !== css[cssStyleKey as CSSStyleDeclarationWritable]) {\n        this._elem!.style[cssStyleKey as CSSStyleDeclarationWritable] = css[cssStyleKey as CSSStyleDeclarationWritable];\n      }\n    });\n\n    const from = this.grid.getCellNodeBox(range.fromRow, range.fromCell);\n    const to = this.grid.getCellNodeBox(range.toRow, range.toCell);\n\n    if (from && to && this._options?.offset) {\n      this._elem.style.top = `${from.top + this._options.offset.top}px`;\n      this._elem.style.left = `${from.left + this._options.offset.left}px`;\n      this._elem.style.height = `${to.bottom - from.top + this._options.offset.height}px`;\n      this._elem.style.width = `${to.right - from.left + this._options.offset.width}px`;\n    }\n\n    return this._elem;\n  }\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  Utils.extend(true, window, {\n    Slick: {\n      CellRangeDecorator: SlickCellRangeDecorator\n    }\n  });\n}\n", "import type { DragItem, DragPosition, ClassDetectElement, DraggableOption, MouseWheelOption, ResizableOption } from './models/index.js';\nimport { Utils as Utils_ } from './slick.core.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\n/***\n * Interactions, add basic behaviors to any element.\n * All the packages are written in pure vanilla JS and supports both mouse & touch events.\n * @module Interactions\n * @namespace Slick\n */\n\n/**\n * Draggable Class, enables dragging functionality for any element for example cell & row selections.\n * Note that mouse/touch start is on the specified container element but all other events are on the document body.\n * code refs:\n *   https://betterprogramming.pub/perfecting-drag-and-drop-in-pure-vanilla-javascript-a761184b797a\n * available optional options:\n *   - containerElement: container DOM element, defaults to \"document\"\n *   - dragFromClassDetectArr: array of tags and query selectors/ids to match on dragstart, used to determine\n *     drag source element. eg:  [ { tag: 'B', id: 'myElement' }, { tag: 'A', cssSelector: 'div.myClass' } ]\n *   - allowDragFrom: when defined, only allow dragging from an element that matches a specific query selector\n *   - allowDragFromClosest: when defined, only allow dragging from an element or its parent matching a specific .closest() query selector\n *   - onDragInit: drag initialized callback\n *   - onDragStart: drag started callback\n *   - onDrag: drag callback\n *   - onDragEnd: drag ended callback\n * @param {Object} options\n * @returns - Draggable instance which includes destroy method\n * @class Draggable\n */\nexport function Draggable(options: DraggableOption) {\n  let { containerElement } = options;\n  const { onDragInit, onDragStart, onDrag, onDragEnd, preventDragFromKeys } = options;\n  let element: HTMLElement | null;\n  let startX: number;\n  let startY: number;\n  let deltaX: number;\n  let deltaY: number;\n  let dragStarted: boolean;\n  let matchClassTag: string;\n\n  if (!containerElement) {\n    containerElement = document.body;\n  }\n\n  let originaldd: Partial<DragItem> = {\n    dragSource: containerElement,\n    dragHandle: null,\n  };\n\n  function init() {\n    if (containerElement) {\n      containerElement.addEventListener('mousedown', userPressed as EventListener);\n      containerElement.addEventListener('touchstart', userPressed as EventListener);\n    }\n  }\n\n  function executeDragCallbackWhenDefined(callback?: (e: DragEvent, dd: DragItem) => boolean | void, evt?: MouseEvent | Touch | TouchEvent | KeyboardEvent, dd?: DragItem) {\n    if (typeof callback === 'function') {\n      return callback(evt as DragEvent, dd as DragItem);\n    }\n  }\n\n  function destroy() {\n    if (containerElement) {\n      containerElement.removeEventListener('mousedown', userPressed as EventListener);\n      containerElement.removeEventListener('touchstart', userPressed as EventListener);\n    }\n  }\n\n  /** Do we want to prevent Drag events from happening (for example prevent onDrag when Ctrl key is pressed while dragging) */\n  function preventDrag(event: MouseEvent | TouchEvent | KeyboardEvent) {\n    let eventPrevented = false;\n    if (preventDragFromKeys) {\n      preventDragFromKeys.forEach(key => {\n        if ((event as KeyboardEvent)[key]) {\n          eventPrevented = true;\n        }\n      });\n    }\n    return eventPrevented;\n  }\n\n  function userPressed(event: MouseEvent | TouchEvent | KeyboardEvent) {\n    if (!preventDrag(event)) {\n      element = event.target as HTMLElement;\n      const targetEvent: MouseEvent | Touch = (event as TouchEvent)?.touches?.[0] ?? event;\n      const { target } = targetEvent;\n\n      if (!options.allowDragFrom || (options.allowDragFrom && (element.matches(options.allowDragFrom)) || (options.allowDragFromClosest && element.closest(options.allowDragFromClosest)))) {\n        originaldd.dragHandle = element as HTMLElement;\n\n        matchClassTag = '';\n        if (options.dragFromClassDetectArr) {\n          for (let o: ClassDetectElement, i = 0; i < options.dragFromClassDetectArr.length; i++) {\n            o = options.dragFromClassDetectArr[i];\n\n            if ((o.id && element.id === o.id) || (o.cssSelector && element.matches(o.cssSelector))) {\n              matchClassTag = o.tag;\n              break;\n            }\n          }\n        }\n\n        const winScrollPos = Utils.windowScrollPosition();\n        startX = winScrollPos.left + targetEvent.clientX;\n        startY = winScrollPos.top + targetEvent.clientY;\n        deltaX = targetEvent.clientX - targetEvent.clientX;\n        deltaY = targetEvent.clientY - targetEvent.clientY;\n        originaldd = Object.assign(originaldd, { deltaX, deltaY, startX, startY, target, matchClassTag });\n        const result = executeDragCallbackWhenDefined(onDragInit as (e: DragEvent, dd: DragPosition) => boolean | void, event, originaldd as DragItem);\n\n        if (result !== false) {\n          document.body.addEventListener('mousemove', userMoved);\n          document.body.addEventListener('touchmove', userMoved);\n          // register mouseup/... events on the window object so that we can catch them even if the user moves the mouse outside the container element\n          window.addEventListener('mouseup', userReleased);\n          window.addEventListener('touchend', userReleased);\n          window.addEventListener('touchcancel', userReleased);\n        }\n      }\n    }\n  }\n\n  function userMoved(event: MouseEvent | TouchEvent | KeyboardEvent) {\n    if (!preventDrag(event)) {\n      const targetEvent: MouseEvent | Touch = (event as TouchEvent)?.touches?.[0] ?? event;\n      deltaX = targetEvent.clientX - startX;\n      deltaY = targetEvent.clientY - startY;\n      const { target } = targetEvent;\n\n      if (!dragStarted) {\n        originaldd = Object.assign(originaldd, { deltaX, deltaY, startX, startY, target, matchClassTag });\n        executeDragCallbackWhenDefined(onDragStart, event, originaldd as DragItem);\n        dragStarted = true;\n      }\n\n      originaldd = Object.assign(originaldd, { deltaX, deltaY, startX, startY, target, matchClassTag });\n      executeDragCallbackWhenDefined(onDrag, event, originaldd as DragItem);\n    }\n  }\n\n  function userReleased(event: MouseEvent | TouchEvent) {\n    document.body.removeEventListener('mousemove', userMoved);\n    document.body.removeEventListener('touchmove', userMoved);\n    window.removeEventListener('mouseup', userReleased);\n    window.removeEventListener('touchend', userReleased);\n    window.removeEventListener('touchcancel', userReleased);\n\n    // trigger a dragEnd event only after dragging started and stopped\n    if (dragStarted) {\n      const { target } = event;\n      originaldd = Object.assign(originaldd, { target });\n      executeDragCallbackWhenDefined(onDragEnd, event, originaldd as DragItem);\n      dragStarted = false;\n    }\n  }\n\n  // initialize Draggable service by attaching mouse/touch events\n  init();\n\n  // public API\n  return { destroy };\n}\n\n/**\n * MouseWheel Class, add mousewheel listeners and calculate delta values and return them in the callback function.\n * available optional options:\n *   - element: optional DOM element to attach mousewheel values, if undefined we'll attach it to the \"window\" object\n *   - onMouseWheel: mousewheel callback\n * @param {Object} options\n * @returns - MouseWheel instance which includes destroy method\n * @class MouseWheel\n */\nexport function MouseWheel(options: MouseWheelOption) {\n  const { element, onMouseWheel } = options;\n\n  function destroy() {\n    element.removeEventListener('wheel', wheelHandler as EventListener);\n    element.removeEventListener('mousewheel', wheelHandler as EventListener);\n  }\n\n  function init() {\n    element.addEventListener('wheel', wheelHandler as EventListener);\n    element.addEventListener('mousewheel', wheelHandler as EventListener);\n  }\n\n  // copy over the same event handler code used in jquery.mousewheel\n  function wheelHandler(event: WheelEvent & { axis: number; wheelDelta: number; wheelDeltaX: number; wheelDeltaY: number; HORIZONTAL_AXIS: number; }) {\n    const orgEvent = event || window.event;\n    let delta = 0;\n    let deltaX = 0;\n    let deltaY = 0;\n\n    // Old school scrollwheel delta\n    if (orgEvent.wheelDelta) {\n      delta = orgEvent.wheelDelta / 120;\n    }\n    if (orgEvent.detail) {\n      delta = -orgEvent.detail / 3;\n    }\n\n    // New school multidimensional scroll (touchpads) deltas\n    deltaY = delta;\n\n    // Gecko\n    if (orgEvent.axis !== undefined && orgEvent.axis === orgEvent.HORIZONTAL_AXIS) {\n      deltaY = 0;\n      deltaX = -1 * delta;\n    }\n\n    // WebKit\n    if (orgEvent.wheelDeltaY !== undefined) {\n      deltaY = orgEvent.wheelDeltaY / 120;\n    }\n    if (orgEvent.wheelDeltaX !== undefined) {\n      deltaX = -1 * orgEvent.wheelDeltaX / 120;\n    }\n\n    if (typeof onMouseWheel === 'function') {\n      onMouseWheel(event, delta, deltaX, deltaY);\n    }\n  }\n\n  // initialize MouseWheel service by attaching mousewheel events\n  init();\n\n  // public API\n  return { destroy };\n}\n\n/**\n * Resizable Class, enables resize functionality for any element\n * Code mostly comes from these 2 resources:\n *   https://spin.atomicobject.com/2019/11/21/creating-a-resizable-html-element/\n *   https://htmldom.dev/make-a-resizable-element/\n * available optional options:\n *   - resizeableElement: resizable DOM element\n *   - resizeableHandleElement: resizable DOM element\n *   - onResizeStart: resize start callback\n *   - onResize: resizing callback\n *   - onResizeEnd: resize ended callback\n * @param {Object} options\n * @returns - Resizable instance which includes destroy method\n * @class Resizable\n */\nexport function Resizable(options: ResizableOption) {\n  const { resizeableElement, resizeableHandleElement, onResizeStart, onResize, onResizeEnd } = options;\n  if (!resizeableHandleElement || typeof resizeableHandleElement.addEventListener !== 'function') {\n    throw new Error('[Slick.Resizable] You did not provide a valid html element that will be used for the handle to resize.');\n  }\n\n  function init() {\n    // add event listeners on the draggable element\n    resizeableHandleElement.addEventListener('mousedown', resizeStartHandler);\n    resizeableHandleElement.addEventListener('touchstart', resizeStartHandler);\n  }\n\n  function destroy() {\n    if (typeof resizeableHandleElement?.removeEventListener === 'function') {\n      resizeableHandleElement.removeEventListener('mousedown', resizeStartHandler);\n      resizeableHandleElement.removeEventListener('touchstart', resizeStartHandler);\n    }\n  }\n\n  function executeResizeCallbackWhenDefined(callback?: Function, e?: MouseEvent | TouchEvent | Touch) {\n    if (typeof callback === 'function') {\n      return callback(e, { resizeableElement, resizeableHandleElement });\n    }\n  }\n\n  function resizeStartHandler(e: MouseEvent | TouchEvent) {\n    e.preventDefault();\n    const event = (e as TouchEvent).touches ? (e as TouchEvent).changedTouches[0] : e;\n    const result = executeResizeCallbackWhenDefined(onResizeStart, event);\n    if (result !== false) {\n      document.body.addEventListener('mousemove', resizingHandler);\n      document.body.addEventListener('mouseup', resizeEndHandler);\n      document.body.addEventListener('touchmove', resizingHandler);\n      document.body.addEventListener('touchend', resizeEndHandler);\n    }\n  }\n\n  function resizingHandler(e: MouseEvent | TouchEvent) {\n    if (e.preventDefault && e.type !== 'touchmove') {\n      e.preventDefault();\n    }\n    const event = (e as TouchEvent).touches ? (e as TouchEvent).changedTouches[0] : e;\n    if (typeof onResize === 'function') {\n      onResize(event, { resizeableElement, resizeableHandleElement });\n    }\n  }\n\n  /** Remove all mouse/touch handlers */\n  function resizeEndHandler(e: MouseEvent | TouchEvent) {\n    const event = (e as TouchEvent).touches ? (e as TouchEvent).changedTouches[0] : e;\n    executeResizeCallbackWhenDefined(onResizeEnd, event);\n    document.body.removeEventListener('mousemove', resizingHandler);\n    document.body.removeEventListener('mouseup', resizeEndHandler);\n    document.body.removeEventListener('touchmove', resizingHandler);\n    document.body.removeEventListener('touchend', resizeEndHandler);\n  }\n\n  // initialize Resizable service by attaching mouse/touch events\n  init();\n\n  // public API\n  return { destroy };\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  Utils.extend(Slick, {\n    Draggable,\n    MouseWheel,\n    Resizable,\n  });\n}\n", "import { CellSelectionMode as CellSelectionMode_, SlickEvent as SlickEvent_, type SlickEventData, SlickEventHandler as SlickEventHandler_, SlickRange as SlickRange_, Utils as Utils_, SelectionUtils as SelectionUtils_ } from '../slick.core.js';\nimport { Draggable as Draggable_ } from '../slick.interactions.js';\nimport { SlickCellRangeDecorator as SlickCellRangeDecorator_ } from './slick.cellrangedecorator.js';\nimport type { CellRangeSelectorOption, DragPosition, DragRange, DragRowMove, GridOption, MouseOffsetViewport, OnScrollEventArgs, SlickPlugin } from '../models/index.js';\nimport type { SlickGrid } from '../slick.grid.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst SlickEvent = IIFE_ONLY ? Slick.Event : SlickEvent_;\nconst SlickEventHandler = IIFE_ONLY ? Slick.EventHandler : SlickEventHandler_;\nconst SlickRange = IIFE_ONLY ? Slick.Range : SlickRange_;\nconst Draggable = IIFE_ONLY ? Slick.Draggable : Draggable_;\nconst SlickCellRangeDecorator = IIFE_ONLY ? Slick.CellRangeDecorator : SlickCellRangeDecorator_;\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\nconst SelectionUtils = IIFE_ONLY ? Slick.SelectionUtils : SelectionUtils_;\nconst CellSelectionMode = IIFE_ONLY ? Slick.CellSelectionMode : CellSelectionMode_;\n\nexport class SlickCellRangeSelector implements SlickPlugin {\n  // --\n  // public API\n  pluginName = 'CellRangeSelector' as const;\n  onBeforeCellRangeSelected = new SlickEvent<{ row: number; cell: number; }>('onBeforeCellRangeSelected');\n  onCellRangeSelected = new SlickEvent<{ range: SlickRange_; selectionMode: string; allowAutoEdit: boolean; }>('onCellRangeSelected');\n  onCellRangeSelecting = new SlickEvent<{ range: SlickRange_; selectionMode: string; allowAutoEdit: boolean; }>('onCellRangeSelecting');\n\n  // --\n  // protected props\n  protected _grid!: SlickGrid;\n  protected _currentlySelectedRange: DragRange | null = null;\n  protected _previousSelectedRange: DragRange | null = null;\n  protected _canvas: HTMLElement | null = null;\n  protected _decorator!: SlickCellRangeDecorator_;\n  protected _gridOptions!: GridOption;\n  protected _activeCanvas!: HTMLElement;\n  protected _dragging = false;\n  protected _handler = new SlickEventHandler();\n  protected _options: CellRangeSelectorOption;\n  protected _selectionMode: string = CellSelectionMode.Select;\n  protected _dragReplaceHandleActive = false;\n  protected _dragReplaceHandleCell:  { row : number, cell: number } | null = null;\n  protected _defaults = {\n    autoScroll: true,\n    minIntervalToShowNextCell: 30,\n    maxIntervalToShowNextCell: 600, // better to a multiple of minIntervalToShowNextCell\n    accelerateInterval: 5,          // increase 5ms when cursor 1px outside the viewport.\n    selectionCss: {\n      border: '2px dashed blue'\n    }\n  } as CellRangeSelectorOption;\n\n  // Frozen row & column variables\n  protected _rowOffset = 0;\n  protected _columnOffset = 0;\n  protected _isRightCanvas = false;\n  protected _isBottomCanvas = false;\n\n  // autoScroll related constiables\n  protected _activeViewport!: HTMLElement;\n  protected _autoScrollTimerId?: number;\n  protected _draggingMouseOffset!: MouseOffsetViewport;\n  protected _moveDistanceForOneCell!: { x: number; y: number; };\n  protected _xDelayForNextCell = 0;\n  protected _yDelayForNextCell = 0;\n  protected _viewportHeight = 0;\n  protected _viewportWidth = 0;\n  protected _isRowMoveRegistered = false;\n\n  // Scrollings\n  protected _scrollLeft = 0;\n  protected _scrollTop = 0;\n\n  constructor(options?: Partial<CellRangeSelectorOption>) {\n    this._options = Utils.extend(true, {}, this._defaults, options);\n  }\n\n  init(grid: SlickGrid) {\n    if (Draggable === undefined) {\n      throw new Error('Slick.Draggable is undefined, make sure to import \"slick.interactions.js\"');\n    }\n\n    this._decorator = this._options.cellDecorator || new SlickCellRangeDecorator(grid, this._options);\n    this._grid = grid;\n    Utils.addSlickEventPubSubWhenDefined(grid.getPubSubService(), this);\n    this._canvas = this._grid.getCanvasNode();\n    this._gridOptions = this._grid.getOptions();\n    this._handler\n      .subscribe(this._grid.onScroll, this.handleScroll.bind(this))\n      .subscribe(this._grid.onDragInit, this.handleDragInit.bind(this))\n      .subscribe(this._grid.onDragStart, this.handleDragStart.bind(this))\n      .subscribe(this._grid.onDrag, this.handleDrag.bind(this))\n      .subscribe(this._grid.onDragEnd, this.handleDragEnd.bind(this));\n  }\n\n  destroy() {\n    this._handler.unsubscribeAll();\n    this._activeCanvas = null as any;\n    this._activeViewport = null as any;\n    this._canvas = null;\n    this._decorator?.destroy();\n  }\n\n  getCellDecorator() {\n    return this._decorator;\n  }\n\n  getSelectionMode() {\n    return this._selectionMode;\n  }\n\n  setSelectionMode(mode: string) {\n    this._selectionMode = mode;\n  }\n\n  protected handleScroll(_e: SlickEventData, args: OnScrollEventArgs) {\n    this._scrollTop = args.scrollTop;\n    this._scrollLeft = args.scrollLeft;\n  }\n\n  protected handleDragInit(e: SlickEventData, dd: DragRowMove) {\n    // Set the active canvas node because the decorator needs to append its\n    // box to the correct canvas\n    this._activeCanvas = this._grid.getActiveCanvasNode(e);\n    this._activeViewport = this._grid.getActiveViewportNode(e);\n\n    const scrollbarDimensions = this._grid.getDisplayedScrollbarDimensions();\n    this._viewportWidth = this._activeViewport.offsetWidth - scrollbarDimensions.width;\n    this._viewportHeight = this._activeViewport.offsetHeight - scrollbarDimensions.height;\n\n    this._moveDistanceForOneCell = {\n      x: this._grid.getAbsoluteColumnMinWidth() / 2,\n      y: this._grid.getOptions().rowHeight! / 2\n    };\n    this._isRowMoveRegistered = this.hasRowMoveManager();\n\n    this._rowOffset = 0;\n    this._columnOffset = 0;\n    this._isBottomCanvas = this._activeCanvas.classList.contains('grid-canvas-bottom');\n\n    if (this._gridOptions.frozenRow! > -1 && this._isBottomCanvas) {\n      const canvasSelector = `.${this._grid.getUID()} .grid-canvas-${this._gridOptions.frozenBottom ? 'bottom' : 'top'}`;\n      const canvasElm = document.querySelector(canvasSelector);\n      if (canvasElm) {\n        this._rowOffset = canvasElm.clientHeight || 0;\n      }\n    }\n\n    this._isRightCanvas = this._activeCanvas.classList.contains('grid-canvas-right');\n\n    if (this._gridOptions.frozenColumn! > -1 && this._isRightCanvas) {\n      const canvasLeftElm = document.querySelector(`.${this._grid.getUID()} .grid-canvas-left`);\n      if (canvasLeftElm) {\n        this._columnOffset = canvasLeftElm.clientWidth || 0;\n      }\n    }\n\n      this._dragReplaceHandleActive = (dd.matchClassTag === 'dragReplaceHandle');\n      if (this._dragReplaceHandleActive) { \n        this._dragReplaceHandleCell = this._grid.getCellFromEvent(e);\n      } else {\n        this._previousSelectedRange = null;\n      }\n\n    // prevent the grid from cancelling drag'n'drop by default\n    e.stopImmediatePropagation();\n    e.preventDefault();\n  }\n\n  protected handleDragStart(e: SlickEventData, dd: DragRowMove) {\n    let cell = this._grid.getCellFromEvent(e);\n    if (this._dragReplaceHandleActive) { cell = this._dragReplaceHandleCell; }\n    if (cell && this.onBeforeCellRangeSelected.notify(cell).getReturnValue() !== false && this._grid.canCellBeSelected(cell.row, cell.cell)) {\n      this._dragging = true;\n      e.stopImmediatePropagation();\n    }\n    if (!this._dragging) {\n      return;\n    }\n\n    this._grid.focus();\n\n    const canvasOffset = Utils.offset(this._canvas);\n\n    let startX = dd.startX - (canvasOffset?.left ?? 0);\n    if (this._gridOptions.frozenColumn! >= 0 && this._isRightCanvas) {\n      startX += this._scrollLeft;\n    }\n\n    let startY = dd.startY - (canvasOffset?.top ?? 0);\n    if (this._gridOptions.frozenRow! >= 0 && this._isBottomCanvas) {\n      startY += this._scrollTop;\n    }\n\n    let start: { row: number | undefined, cell: number | undefined; } | null;\n    this._selectionMode = this._dragReplaceHandleActive ? CellSelectionMode.Replace : CellSelectionMode.Select;\n    if (!this._dragReplaceHandleActive) {\n      start = this._grid.getCellFromPoint(startX, startY);\n    } else {\n      start = this._grid.getActiveCell() || { row: undefined, cell: undefined };\n    }\n\n    dd.range = { start, end: {} };\n    this._currentlySelectedRange = dd.range;\n    return this._decorator.show(new SlickRange(start.row ?? 0, start.cell ?? 0), this._dragReplaceHandleActive);\n  }\n\n  protected handleDrag(evt: SlickEventData, dd: DragRowMove) {\n    if (!this._dragging && !this._isRowMoveRegistered) {\n      return;\n    }\n    if (!this._isRowMoveRegistered) {\n      evt.stopImmediatePropagation();\n    }\n\n    const e = evt.getNativeEvent<MouseEvent>();\n    if (this._options.autoScroll) {\n      this._draggingMouseOffset = this.getMouseOffsetViewport(e, dd);\n      if (this._draggingMouseOffset.isOutsideViewport) {\n        return this.handleDragOutsideViewport();\n      }\n    }\n    this.stopIntervalTimer();\n    this.handleDragTo(e, dd);\n  }\n\n  protected getMouseOffsetViewport(e: MouseEvent | TouchEvent, dd: DragRowMove): MouseOffsetViewport {\n    const targetEvent: MouseEvent | Touch = (e as TouchEvent)?.touches?.[0] ?? e;\n    const viewportLeft = this._activeViewport.scrollLeft;\n    const viewportTop = this._activeViewport.scrollTop;\n    const viewportRight = viewportLeft + this._viewportWidth;\n    const viewportBottom = viewportTop + this._viewportHeight;\n\n    const viewportOffset = Utils.offset(this._activeViewport);\n    const viewportOffsetLeft = viewportOffset?.left ?? 0;\n    const viewportOffsetTop = viewportOffset?.top ?? 0;\n    const viewportOffsetRight = viewportOffsetLeft + this._viewportWidth;\n    const viewportOffsetBottom = viewportOffsetTop + this._viewportHeight;\n\n    const result = {\n      e,\n      dd,\n      viewport: {\n        left: viewportLeft,\n        top: viewportTop,\n        right: viewportRight,\n        bottom: viewportBottom,\n        offset: {\n          left: viewportOffsetLeft,\n          top: viewportOffsetTop,\n          right: viewportOffsetRight,\n          bottom: viewportOffsetBottom\n        }\n      },\n      // Consider the viewport as the origin, the `offset` is based on the coordinate system:\n      // the cursor is on the viewport's left/bottom when it is less than 0, and on the right/top when greater than 0.\n      offset: {\n        x: 0,\n        y: 0\n      },\n      isOutsideViewport: false\n    };\n    // ... horizontal\n    if (targetEvent.pageX < viewportOffsetLeft) {\n      result.offset.x = targetEvent.pageX - viewportOffsetLeft;\n    } else if (targetEvent.pageX > viewportOffsetRight) {\n      result.offset.x = targetEvent.pageX - viewportOffsetRight;\n    }\n    // ... vertical\n    if (targetEvent.pageY < viewportOffsetTop) {\n      result.offset.y = viewportOffsetTop - targetEvent.pageY;\n    } else if (targetEvent.pageY > viewportOffsetBottom) {\n      result.offset.y = viewportOffsetBottom - targetEvent.pageY;\n    }\n    result.isOutsideViewport = !!result.offset.x || !!result.offset.y;\n    return result;\n  }\n\n  protected handleDragOutsideViewport() {\n    this._xDelayForNextCell = this._options.maxIntervalToShowNextCell - Math.abs(this._draggingMouseOffset.offset.x) * this._options.accelerateInterval;\n    this._yDelayForNextCell = this._options.maxIntervalToShowNextCell - Math.abs(this._draggingMouseOffset.offset.y) * this._options.accelerateInterval;\n    // only one timer is created to handle the case that cursor outside the viewport\n    if (!this._autoScrollTimerId) {\n      let xTotalDelay = 0;\n      let yTotalDelay = 0;\n      this._autoScrollTimerId = window.setInterval(() => {\n        let xNeedUpdate = false;\n        let yNeedUpdate = false;\n        // ... horizontal\n        if (this._draggingMouseOffset.offset.x) {\n          xTotalDelay += this._options.minIntervalToShowNextCell;\n          xNeedUpdate = xTotalDelay >= this._xDelayForNextCell;\n        } else {\n          xTotalDelay = 0;\n        }\n        // ... vertical\n        if (this._draggingMouseOffset.offset.y) {\n          yTotalDelay += this._options.minIntervalToShowNextCell;\n          yNeedUpdate = yTotalDelay >= this._yDelayForNextCell;\n        } else {\n          yTotalDelay = 0;\n        }\n        if (xNeedUpdate || yNeedUpdate) {\n          if (xNeedUpdate) {\n            xTotalDelay = 0;\n          }\n          if (yNeedUpdate) {\n            yTotalDelay = 0;\n          }\n          this.handleDragToNewPosition(xNeedUpdate, yNeedUpdate);\n        }\n      }, this._options.minIntervalToShowNextCell);\n    }\n  }\n\n  protected handleDragToNewPosition(xNeedUpdate: boolean, yNeedUpdate: boolean) {\n    let pageX = this._draggingMouseOffset.e.pageX;\n    let pageY = this._draggingMouseOffset.e.pageY;\n    const mouseOffsetX = this._draggingMouseOffset.offset.x;\n    const mouseOffsetY = this._draggingMouseOffset.offset.y;\n    const viewportOffset = this._draggingMouseOffset.viewport.offset;\n    // ... horizontal\n    if (xNeedUpdate && mouseOffsetX) {\n      if (mouseOffsetX > 0) {\n        pageX = viewportOffset.right + this._moveDistanceForOneCell.x;\n      } else {\n        pageX = viewportOffset.left - this._moveDistanceForOneCell.x;\n      }\n    }\n    // ... vertical\n    if (yNeedUpdate && mouseOffsetY) {\n      if (mouseOffsetY > 0) {\n        pageY = viewportOffset.top - this._moveDistanceForOneCell.y;\n      } else {\n        pageY = viewportOffset.bottom + this._moveDistanceForOneCell.y;\n      }\n    }\n    this.handleDragTo({ pageX, pageY }, this._draggingMouseOffset.dd);\n  }\n\n  protected stopIntervalTimer() {\n    if (this._autoScrollTimerId) {\n      window.clearInterval(this._autoScrollTimerId);\n      this._autoScrollTimerId = undefined;\n    }\n  }\n\n  protected handleDragTo(e: { pageX: number; pageY: number; }, dd: DragPosition) {\n  //console.log('cellRangeSelector.handleDragTo: ' + JSON.stringify(dd.range));\n    const targetEvent: MouseEvent | Touch = (e as unknown as TouchEvent)?.touches?.[0] ?? e;\n    const canvasOffset = Utils.offset(this._activeCanvas);\n    const end = this._grid.getCellFromPoint(\n      targetEvent.pageX - (canvasOffset?.left ?? 0) + this._columnOffset,\n      targetEvent.pageY - (canvasOffset?.top ?? 0) + this._rowOffset\n    );\n\n    // ... frozen column(s),\n    if (this._gridOptions.frozenColumn! >= 0 && (!this._isRightCanvas && (end.cell > this._gridOptions.frozenColumn!)) || (this._isRightCanvas && (end.cell <= this._gridOptions.frozenColumn!))) {\n      return;\n    }\n\n    // ... or frozen row(s)\n    if (this._gridOptions.frozenRow! >= 0 && (!this._isBottomCanvas && (end.row >= this._gridOptions.frozenRow!)) || (this._isBottomCanvas && (end.row < this._gridOptions.frozenRow!))) {\n      return;\n    }\n\n    // scrolling the viewport to display the target `end` cell if it is not fully displayed\n    if (this._options.autoScroll && this._draggingMouseOffset) {\n      const endCellBox = this._grid.getCellNodeBox(end.row, end.cell);\n      if (!endCellBox) {\n        return;\n      }\n      const viewport = this._draggingMouseOffset.viewport;\n      if (endCellBox.left < viewport.left || endCellBox.right > viewport.right\n        || endCellBox.top < viewport.top || endCellBox.bottom > viewport.bottom) {\n        this._grid.scrollCellIntoView(end.row, end.cell);\n      }\n    }\n\n    // ... or regular grid (without any frozen options)\n    if (!this._grid.canCellBeSelected(end.row, end.cell)) {\n      return;\n    }\n\n    if (dd?.range) {\n      dd.range.end = end;\n\n      const cornerCell = !this._previousSelectedRange ? dd.range.start : SelectionUtils.normalRangeOppositeCellFromCopy(this._previousSelectedRange, end);\n      this._currentlySelectedRange = dd.range;\n\n      const range = new SlickRange(cornerCell.row!, cornerCell.cell!, end.row, end.cell);\n\n      this._decorator.show(range, this._dragReplaceHandleActive);\n      this.onCellRangeSelecting.notify({\n        range, selectionMode: '', \n        allowAutoEdit: false\n      });\n    }\n  }\n\n  protected hasRowMoveManager() {\n    return !!(this._grid.getPluginByName('RowMoveManager') || this._grid.getPluginByName('CrossGridRowMoveManager'));\n  }\n\n  protected handleDragEnd(e: SlickEventData, dd: DragPosition) {\n    //console.log('cellRangeSelector.handleDragEnd: ' + JSON.stringify(dd.range));\n\n    this._decorator.hide();\n\n    if (!this._dragging || !dd.range) {\n      if (this._autoScrollTimerId) {\n        this.stopIntervalTimer(); // stop the auto-scroll timer if it was running\n      }\n      return;\n    }\n\n    this._dragging = false;\n    e.stopImmediatePropagation();\n\n    this.stopIntervalTimer();\n\n    const targetEvent: MouseEvent | Touch = (e as unknown as TouchEvent)?.touches?.[0] ?? e;\n    const canvasOffset = Utils.offset(this._activeCanvas);\n    const end = this._grid.getCellFromPoint(\n      targetEvent.pageX - (canvasOffset?.left ?? 0) + this._columnOffset,\n      targetEvent.pageY - (canvasOffset?.top ?? 0) + this._rowOffset\n    );\n    const cornerCell = !this._dragReplaceHandleActive || !this._previousSelectedRange ? dd.range.start : SelectionUtils.normalRangeOppositeCellFromCopy(this._previousSelectedRange, end);\n\n    const r = new SlickRange(\n        cornerCell.row ?? 0,\n        cornerCell.cell ?? 0,\n        dd.range.end.row,\n        dd.range.end.cell\n      );\n\n    this.onCellRangeSelected.notify({ range: r, selectionMode: this._selectionMode, allowAutoEdit: (this._selectionMode === \"SEL\" && r.isSingleCell()) });\n    this._previousSelectedRange = SelectionUtils.normaliseDragRange(dd.range);\n  }\n\n  getCurrentRange() {\n    return this._currentlySelectedRange;\n  }\n\n  getPreviousRange() {\n    return this._previousSelectedRange;\n  } \n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  Utils.extend(Slick, {\n    CellRangeSelector: SlickCellRangeSelector\n  });\n}\n", "import { SlickEvent as SlickEvent_, SlickEventData as SlickEventData_, SlickRange as SlickRange_, Utils as Utils_ } from '../slick.core.js';\nimport { SlickCellRangeSelector as SlickCellRangeSelector_ } from './slick.cellrangeselector.js';\nimport type { CustomDataView, OnActiveCellChangedEventArgs, SelectionModel } from '../models/index.js';\nimport type { SlickDataView } from '../slick.dataview.js';\nimport type { SlickGrid } from '../slick.grid.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst SlickEvent = IIFE_ONLY ? Slick.Event : SlickEvent_;\nconst SlickEventData = IIFE_ONLY ? Slick.EventData : SlickEventData_;\nconst SlickRange = IIFE_ONLY ? Slick.Range : SlickRange_;\nconst SlickCellRangeSelector = IIFE_ONLY ? Slick.CellRangeSelector : SlickCellRangeSelector_;\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\nexport interface CellSelectionModelOption {\n  selectActiveCell: boolean;\n  cellRangeSelector?: SlickCellRangeSelector_;\n}\n\nexport class SlickCellSelectionModel implements SelectionModel {\n  // --\n  // public API\n  pluginName = 'CellSelectionModel' as const;\n  onSelectedRangesChanged = new SlickEvent<SlickRange_[]>('onSelectedRangesChanged');\n\n  // --\n  // protected props\n  protected _cachedPageRowCount = 0;\n  protected _dataView?: CustomDataView | SlickDataView;\n  protected _grid!: SlickGrid;\n  protected _prevSelectedRow?: number;\n  protected _prevKeyDown = '';\n  protected _ranges: SlickRange_[] = [];\n  protected _selector: SlickCellRangeSelector_;\n  protected _options?: CellSelectionModelOption;\n  protected _defaults: CellSelectionModelOption = {\n    selectActiveCell: true\n  };\n\n  constructor(options?: { selectActiveCell: boolean; cellRangeSelector: SlickCellRangeSelector_; }) {\n    if (options === undefined || options.cellRangeSelector === undefined) {\n      this._selector = new SlickCellRangeSelector({\n        selectionCss: { border: '2px solid black' } as CSSStyleDeclaration,\n        copyToSelectionCss: { border: '2px solid purple' } as CSSStyleDeclaration\n      });\n    } else {\n      this._selector = options.cellRangeSelector;\n    }\n  }\n\n  init(grid: SlickGrid) {\n    this._options = Utils.extend(true, {}, this._defaults, this._options);\n    this._grid = grid;\n    if (grid.hasDataView()) {\n      this._dataView = grid.getData<CustomDataView | SlickDataView>();\n    }\n    this._grid.onActiveCellChanged.subscribe(this.handleActiveCellChange.bind(this));\n    this._grid.onKeyDown.subscribe(this.handleKeyDown.bind(this));\n    grid.registerPlugin(this._selector);\n    this._selector.onCellRangeSelected.subscribe(this.handleCellRangeSelected.bind(this));\n    this._selector.onBeforeCellRangeSelected.subscribe(this.handleBeforeCellRangeSelected.bind(this));\n  }\n\n  destroy() {\n    this._grid.onActiveCellChanged.unsubscribe(this.handleActiveCellChange.bind(this));\n    this._grid.onKeyDown.unsubscribe(this.handleKeyDown.bind(this));\n    this._selector.onCellRangeSelected.unsubscribe(this.handleCellRangeSelected.bind(this));\n    this._selector.onBeforeCellRangeSelected.unsubscribe(this.handleBeforeCellRangeSelected.bind(this));\n    this._grid.unregisterPlugin(this._selector);\n    this._selector?.destroy();\n  }\n\n  getOptions(): CellSelectionModelOption | undefined {\n    return this._options;\n  }\n\n  protected removeInvalidRanges(ranges: SlickRange_[]) {\n    const result: SlickRange_[] = [];\n\n    for (let i = 0; i < ranges.length; i++) {\n      const r = ranges[i];\n      if (this._grid.canCellBeSelected(r.fromRow, r.fromCell) && this._grid.canCellBeSelected(r.toRow, r.toCell)) {\n        result.push(r);\n      }\n    }\n\n    return result;\n  }\n\n  protected rangesAreEqual(range1: SlickRange_[], range2: SlickRange_[]) {\n    let areDifferent = (range1.length !== range2.length);\n    if (!areDifferent) {\n      for (let i = 0; i < range1.length; i++) {\n        if (\n          range1[i].fromCell !== range2[i].fromCell\n          || range1[i].fromRow !== range2[i].fromRow\n          || range1[i].toCell !== range2[i].toCell\n          || range1[i].toRow !== range2[i].toRow\n        ) {\n          areDifferent = true;\n          break;\n        }\n      }\n    }\n    return !areDifferent;\n  }\n\n  /** Provide a way to force a recalculation of page row count (for example on grid resize) */\n  resetPageRowCount() {\n    this._cachedPageRowCount = 0;\n  }\n\n  setSelectedRanges(ranges: SlickRange_[], caller = 'SlickCellSelectionModel.setSelectedRanges', selectionMode = '') {\n    // simple check for: empty selection didn't change, prevent firing onSelectedRangesChanged\n    if ((!this._ranges || this._ranges.length === 0) && (!ranges || ranges.length === 0)) { return; }\n\n    // if range has not changed, don't fire onSelectedRangesChanged\n    const rangeHasChanged = !this.rangesAreEqual(this._ranges, ranges);\n\n    this._ranges = this.removeInvalidRanges(ranges);\n    if (rangeHasChanged) {\n      // provide extra \"caller\" argument through SlickEventData event to avoid breaking the previous pubsub event structure\n      // that only accepts an array of selected range `SlickRange[]`, the SlickEventData args will be merged and used later by `onSelectedRowsChanged`\n      const eventData = new SlickEventData(new CustomEvent('click', { detail: { caller, selectionMode, addDragHandle: true } }), this._ranges);\n      this.onSelectedRangesChanged.notify(this._ranges, eventData);\n    }\n  }\n\n  getSelectedRanges() {\n    return this._ranges;\n  }\n\n  refreshSelections() {\n    this.setSelectedRanges(this.getSelectedRanges(), undefined, '');\n  }\n\n  protected handleBeforeCellRangeSelected(e: SlickEventData_): boolean | void {\n    if (this._grid.getEditorLock().isActive()) {\n      e.stopPropagation();\n      return false;\n    }\n  }\n\n  protected handleCellRangeSelected(_e: SlickEventData_, args: { range: SlickRange_; selectionMode: string; }) {\n    this._grid.setActiveCell(args.range.fromRow, args.range.fromCell, false, false, true);\n    this.setSelectedRanges([args.range], undefined, args.selectionMode);\n  }\n\n  protected handleActiveCellChange(_e: SlickEventData_, args: OnActiveCellChangedEventArgs) {\n    this._prevSelectedRow = undefined;\n    const isCellDefined = Utils.isDefined(args.cell);\n    const isRowDefined = Utils.isDefined(args.row);\n\n    if (this._options?.selectActiveCell && isRowDefined && isCellDefined) {\n      this.setSelectedRanges([new SlickRange(args.row, args.cell)], undefined, '');\n    } else if (!this._options?.selectActiveCell || (!isRowDefined && !isCellDefined)) {\n      // clear the previous selection once the cell changes\n      this.setSelectedRanges([], undefined, '');\n    }\n  }\n\n  protected isKeyAllowed(key: string, isShiftKeyPressed?: boolean): boolean {\n    return [\n      'ArrowLeft',\n      'ArrowRight',\n      'ArrowUp',\n      'ArrowDown',\n      'PageDown',\n      'PageUp',\n      'Home',\n      'End',\n      ...(!isShiftKeyPressed ? ['a', 'A'] : []),\n    ].some((k) => k === key);\n  }\n\n  protected handleKeyDown(e: SlickEventData_) {\n    let ranges: SlickRange_[], last: SlickRange_;\n    const colLn = this._grid.getColumns().length;\n    const active = this._grid.getActiveCell();\n    let dataLn = 0;\n    if (this._dataView && 'getPagingInfo' in this._dataView) {\n      dataLn = this._dataView?.getPagingInfo().pageSize || this._dataView.getLength();\n    } else {\n      dataLn = this._grid.getDataLength();\n    }\n\n    if (active && (e.shiftKey || e.ctrlKey) && !e.altKey && this.isKeyAllowed(e.key as string, e.shiftKey)) {\n      ranges = this.getSelectedRanges().slice();\n      if (!ranges.length) {\n        ranges.push(new SlickRange(active.row, active.cell));\n      }\n      // keyboard can work with last range only\n      last = ranges.pop() as SlickRange_;\n\n      // can't handle selection out of active cell\n      if (!last.contains(active.row, active.cell)) {\n        last = new SlickRange(active.row, active.cell);\n      }\n\n      let dRow = last.toRow - last.fromRow;\n      let dCell = last.toCell - last.fromCell;\n      let toCell: undefined | number;\n      let toRow = 0;\n\n      // when using Ctrl+{a, A} we will change our position to cell 0,0 and select all grid cells\n      if (e.ctrlKey && e.key?.toLowerCase() === 'a') {\n        this._grid.setActiveCell(0, 0, false, false, true);\n        active.row = 0;\n        active.cell = 0;\n        toCell = colLn - 1;\n        toRow = dataLn - 1;\n      }\n\n      // walking direction\n      const dirRow = active.row === last.fromRow ? 1 : -1;\n      const dirCell = active.cell === last.fromCell ? 1 : -1;\n      const isSingleKeyMove = e.key!.startsWith('Arrow');\n\n      if (isSingleKeyMove && !e.ctrlKey) {\n        // single cell move: (Arrow{Up/ArrowDown/ArrowLeft/ArrowRight})\n        if (e.key === 'ArrowLeft') {\n          dCell -= dirCell;\n        } else if (e.key === 'ArrowRight') {\n          dCell += dirCell;\n        } else if (e.key === 'ArrowUp') {\n          dRow -= dirRow;\n        } else if (e.key === 'ArrowDown') {\n          dRow += dirRow;\n        }\n        toRow = active.row + dirRow * dRow;\n      } else {\n        // multiple cell moves: (Home, End, Page{Up/Down})\n        if (this._cachedPageRowCount < 1) {\n          this._cachedPageRowCount = this._grid.getViewportRowCount();\n        }\n        if (this._prevSelectedRow === undefined) {\n          this._prevSelectedRow = active.row;\n        }\n\n        if ((!e.ctrlKey && e.shiftKey && e.key === 'Home') || (e.ctrlKey && e.shiftKey && e.key === 'ArrowLeft')) {\n          toCell = 0;\n          toRow = active.row;\n        } else if ((!e.ctrlKey && e.shiftKey && e.key === 'End') || (e.ctrlKey && e.shiftKey && e.key === 'ArrowRight')) {\n          toCell = colLn - 1;\n          toRow = active.row;\n        } else if (e.ctrlKey && e.shiftKey && e.key === 'ArrowUp') {\n          toRow = 0;\n        } else if (e.ctrlKey && e.shiftKey && e.key === 'ArrowDown') {\n          toRow = dataLn - 1;\n        } else if (e.ctrlKey && e.shiftKey && e.key === 'Home') {\n          toCell = 0;\n          toRow = 0;\n        } else if (e.ctrlKey && e.shiftKey && e.key === 'End') {\n          toCell = colLn - 1;\n          toRow = dataLn - 1;\n        } else if (e.key === 'PageUp') {\n          if (this._prevSelectedRow >= 0) {\n            toRow = this._prevSelectedRow - this._cachedPageRowCount;\n          }\n          if (toRow < 0) {\n            toRow = 0;\n          }\n        } else if (e.key === 'PageDown') {\n          if (this._prevSelectedRow <= dataLn - 1) {\n            toRow = this._prevSelectedRow + this._cachedPageRowCount;\n          }\n          if (toRow > dataLn - 1) {\n            toRow = dataLn - 1;\n          }\n        }\n        this._prevSelectedRow = toRow;\n      }\n\n      // define new selection range\n      toCell ??= active.cell + dirCell * dCell;\n      const new_last = new SlickRange(active.row, active.cell, toRow, toCell);\n      if (this.removeInvalidRanges([new_last]).length) {\n        ranges.push(new_last);\n        const viewRow = dirRow > 0 ? new_last.toRow : new_last.fromRow;\n        const viewCell = dirCell > 0 ? new_last.toCell : new_last.fromCell;\n\n        if (isSingleKeyMove) {\n          this._grid.scrollRowIntoView(viewRow);\n          this._grid.scrollCellIntoView(viewRow, viewCell);\n        } else {\n          this._grid.scrollRowIntoView(toRow);\n          this._grid.scrollCellIntoView(toRow, viewCell);\n        }\n      } else {\n        ranges.push(last);\n      }\n\n      this.setSelectedRanges(ranges, undefined, '');\n\n      e.preventDefault();\n      e.stopPropagation();\n      this._prevKeyDown = e.key as string;\n    }\n  }\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  Utils.extend(true, window, {\n    Slick: {\n      CellSelectionModel: SlickCellSelectionModel\n    }\n  });\n}\n", "import type { CheckboxSelectorOption, Column, DOMEvent, SlickPlugin, SelectableOverrideCallback, OnHeaderClickEventArgs } from '../models/index.js';\nimport { BindingEventService as BindingEventService_, type SlickEventData, SlickEventHandler as SlickEventHandler_, Utils as Utils_ } from '../slick.core.js';\nimport type { SlickDataView } from '../slick.dataview.js';\nimport type { SlickGrid } from '../slick.grid.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst BindingEventService = IIFE_ONLY ? Slick.BindingEventService : BindingEventService_;\nconst SlickEventHandler = IIFE_ONLY ? Slick.EventHandler : SlickEventHandler_;\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\nexport class SlickCheckboxSelectColumn<T = any> implements SlickPlugin {\n  // --\n  // public API\n  pluginName = 'CheckboxSelectColumn' as const;\n\n  // --\n  // protected props\n  protected _dataView!: SlickDataView<T>;\n  protected _grid!: SlickGrid;\n  protected _isUsingDataView = false;\n  protected _selectableOverride: SelectableOverrideCallback<T> | null = null;\n  protected _headerRowNode?: HTMLElement;\n  protected _selectAll_UID: number;\n  protected _handler = new SlickEventHandler();\n  protected _selectedRowsLookup: any = {};\n  protected _checkboxColumnCellIndex: number | null = null;\n  protected _options: CheckboxSelectorOption;\n  protected _defaults: CheckboxSelectorOption = {\n    columnId: '_checkbox_selector',\n    cssClass: undefined,\n    hideSelectAllCheckbox: false,\n    name: '',\n    toolTip: 'Select/Deselect All',\n    width: 30,\n    reorderable: false,\n    applySelectOnAllPages: false, // defaults to false, when that is enabled the \"Select All\" will be applied to all pages (when using Pagination)\n    hideInColumnTitleRow: false,\n    hideInFilterHeaderRow: true\n  };\n  protected _isSelectAllChecked = false;\n  protected _bindingEventService: BindingEventService_;\n\n  constructor(options?: Partial<CheckboxSelectorOption>) {\n    this._bindingEventService = new BindingEventService();\n    this._options = Utils.extend(true, {}, this._defaults, options);\n    this._selectAll_UID = this.createUID();\n\n    // user could override the checkbox icon logic from within the options or after instantiating the plugin\n    if (typeof this._options.selectableOverride === 'function') {\n      this.selectableOverride(this._options.selectableOverride);\n    }\n  }\n\n  init(grid: SlickGrid) {\n    this._grid = grid;\n    this._isUsingDataView = !Array.isArray(grid.getData());\n    if (this._isUsingDataView) {\n      this._dataView = grid.getData();\n    }\n    this._handler\n      .subscribe(this._grid.onSelectedRowsChanged, this.handleSelectedRowsChanged.bind(this))\n      .subscribe(this._grid.onClick, this.handleClick.bind(this))\n      .subscribe(this._grid.onKeyDown, this.handleKeyDown.bind(this))\n      // whenever columns changed, we need to rerender Select All checkbox\n      .subscribe(this._grid.onAfterSetColumns, () => this.renderSelectAllCheckbox(this._isSelectAllChecked));\n\n    if (this._isUsingDataView && this._dataView && this._options.applySelectOnAllPages) {\n      this._handler\n        .subscribe(this._dataView.onSelectedRowIdsChanged, this.handleDataViewSelectedIdsChanged.bind(this))\n        .subscribe(this._dataView.onPagingInfoChanged, this.handleDataViewSelectedIdsChanged.bind(this));\n    }\n\n    if (!this._options.hideInFilterHeaderRow) {\n      this.addCheckboxToFilterHeaderRow(grid);\n    }\n    if (!this._options.hideInColumnTitleRow) {\n      this._handler.subscribe(this._grid.onHeaderClick, this.handleHeaderClick.bind(this));\n    }\n  }\n\n  destroy() {\n    this._handler.unsubscribeAll();\n    this._bindingEventService.unbindAll();\n  }\n\n  getOptions() {\n    return this._options;\n  }\n\n  setOptions(options: Partial<CheckboxSelectorOption>) {\n    this._options = Utils.extend(true, {}, this._options, options);\n\n    if (this._options.hideSelectAllCheckbox) {\n      this.hideSelectAllFromColumnHeaderTitleRow();\n      this.hideSelectAllFromColumnHeaderFilterRow();\n    } else {\n      if (!this._options.hideInColumnTitleRow) {\n        this.renderSelectAllCheckbox(this._isSelectAllChecked);\n        this._handler.subscribe(this._grid.onHeaderClick, this.handleHeaderClick.bind(this));\n      } else {\n        this.hideSelectAllFromColumnHeaderTitleRow();\n        if (this._options.name) {\n          this._grid.updateColumnHeader(this._options.columnId || '', this._options.name, '');\n        }\n      }\n\n      if (!this._options.hideInFilterHeaderRow) {\n        const selectAllContainerElm = this._headerRowNode?.querySelector<HTMLSpanElement>('#filter-checkbox-selectall-container');\n        if (selectAllContainerElm) {\n          selectAllContainerElm.style.display = 'flex';\n          const selectAllInputElm = selectAllContainerElm.querySelector<HTMLInputElement>('input[type=\"checkbox\"]');\n          if (selectAllInputElm) {\n            selectAllInputElm.checked = this._isSelectAllChecked;\n          }\n        }\n      } else {\n        this.hideSelectAllFromColumnHeaderFilterRow();\n      }\n    }\n  }\n\n  protected hideSelectAllFromColumnHeaderTitleRow() {\n    this._grid.updateColumnHeader(this._options.columnId || '', this._options.name || '', '');\n  }\n\n  protected hideSelectAllFromColumnHeaderFilterRow() {\n    const selectAllContainerElm = this._headerRowNode?.querySelector<HTMLSpanElement>('#filter-checkbox-selectall-container');\n    if (selectAllContainerElm) {\n      selectAllContainerElm.style.display = 'none';\n    }\n  }\n\n  protected handleSelectedRowsChanged() {\n    const selectedRows = this._grid.getSelectedRows();\n    const lookup: any = {};\n    let row = 0, i = 0, k = 0;\n    let disabledCount = 0;\n    if (typeof this._selectableOverride === 'function') {\n      for (k = 0; k < this._grid.getDataLength(); k++) {\n        // If we are allowed to select the row\n        const dataItem = this._grid.getDataItem(k);\n        if (!this.checkSelectableOverride(i, dataItem, this._grid)) {\n          disabledCount++;\n        }\n      }\n    }\n\n    const removeList: number[] = [];\n    for (i = 0; i < selectedRows.length; i++) {\n      row = selectedRows[i];\n\n      // If we are allowed to select the row\n      const rowItem = this._grid.getDataItem(row);\n      if (this.checkSelectableOverride(i, rowItem, this._grid)) {\n        lookup[row] = true;\n        if (lookup[row] !== this._selectedRowsLookup[row]) {\n          this._grid.invalidateRow(row);\n          delete this._selectedRowsLookup[row];\n        }\n      }\n      else {\n        removeList.push(row);\n      }\n    }\n    if (typeof this._selectedRowsLookup === 'object') {\n      Object.keys(this._selectedRowsLookup).forEach(selectedRow => {\n        if (selectedRow !== undefined) {\n          this._grid.invalidateRow(+selectedRow);\n        }\n      });\n    }\n    this._selectedRowsLookup = lookup;\n    this._grid.render();\n    this._isSelectAllChecked = (selectedRows?.length ?? 0) + disabledCount >= this._grid.getDataLength();\n\n    if (!this._isUsingDataView || !this._options.applySelectOnAllPages) {\n      if (!this._options.hideInColumnTitleRow && !this._options.hideSelectAllCheckbox) {\n        this.renderSelectAllCheckbox(this._isSelectAllChecked);\n      }\n      if (!this._options.hideInFilterHeaderRow) {\n        const selectAllElm = this._headerRowNode?.querySelector<HTMLInputElement>(`#header-filter-selector${this._selectAll_UID}`);\n        if (selectAllElm) {\n          selectAllElm.checked = this._isSelectAllChecked;\n        }\n      }\n    }\n\n    // Remove items that shouln't of been selected in the first place (Got here Ctrl + click)\n    if (removeList.length > 0) {\n      for (i = 0; i < removeList.length; i++) {\n        const remIdx = selectedRows.indexOf(removeList[i]);\n        selectedRows.splice(remIdx, 1);\n      }\n      this._grid.setSelectedRows(selectedRows, 'click.cleanup');\n    }\n  }\n\n  protected handleDataViewSelectedIdsChanged() {\n    const selectedIds = this._dataView.getAllSelectedFilteredIds();\n    const filteredItems = this._dataView.getFilteredItems();\n    let disabledCount = 0;\n\n    if (typeof this._selectableOverride === 'function' && selectedIds.length > 0) {\n      for (let k = 0; k < this._dataView.getItemCount(); k++) {\n        // If we are allowed to select the row\n        const dataItem: T = this._dataView.getItemByIdx(k);\n        const idProperty = this._dataView.getIdPropertyName();\n        const dataItemId = dataItem[idProperty as keyof T];\n        const foundItemIdx = filteredItems.findIndex(function (item) {\n          return item[idProperty as keyof T] === dataItemId;\n        });\n        if (foundItemIdx >= 0 && !this.checkSelectableOverride(k, dataItem, this._grid)) {\n          disabledCount++;\n        }\n      }\n    }\n    this._isSelectAllChecked = (selectedIds && selectedIds.length) + disabledCount >= filteredItems.length;\n\n    if (!this._options.hideInColumnTitleRow && !this._options.hideSelectAllCheckbox) {\n      this.renderSelectAllCheckbox(this._isSelectAllChecked);\n    }\n    if (!this._options.hideInFilterHeaderRow) {\n      const selectAllElm = this._headerRowNode?.querySelector<HTMLInputElement>(`#header-filter-selector${this._selectAll_UID}`);\n      if (selectAllElm) {\n        selectAllElm.checked = this._isSelectAllChecked;\n      }\n    }\n  }\n\n  protected handleKeyDown(e: SlickEventData, args: any) {\n    if (e.which === 32) {\n      if (this._grid.getColumns()[args.cell].id === this._options.columnId) {\n        // if editing, try to commit\n        if (!this._grid.getEditorLock().isActive() || this._grid.getEditorLock().commitCurrentEdit()) {\n          this.toggleRowSelection(args.row);\n        }\n        e.preventDefault();\n        e.stopImmediatePropagation();\n      }\n    }\n  }\n\n  protected handleClick(e: SlickEventData, args: { row: number; cell: number; }) {\n    // clicking on a row select checkbox\n    if (this._grid.getColumns()[args.cell].id === this._options.columnId && (e.target as HTMLInputElement).type === 'checkbox') {\n      // if editing, try to commit\n      if (this._grid.getEditorLock().isActive() && !this._grid.getEditorLock().commitCurrentEdit()) {\n        e.preventDefault();\n        e.stopImmediatePropagation();\n        return;\n      }\n\n      this.toggleRowSelection(args.row);\n      e.stopPropagation();\n      e.stopImmediatePropagation();\n    }\n  }\n\n  protected toggleRowSelection(row: number) {\n    const dataContext = this._grid.getDataItem(row);\n    if (!this.checkSelectableOverride(row, dataContext, this._grid)) {\n      return;\n    }\n\n    if (this._selectedRowsLookup[row]) {\n      const newSelectedRows = this._grid.getSelectedRows().filter((n) => n !== row);\n      this._grid.setSelectedRows(newSelectedRows, 'click.toggle');\n    } else {\n      this._grid.setSelectedRows(this._grid.getSelectedRows().concat(row), 'click.toggle');\n    }\n    this._grid.setActiveCell(row, this.getCheckboxColumnCellIndex());\n  }\n\n  selectRows(rowArray: number[]) {\n    const addRows: number[] = [];\n    for (let i = 0, l = rowArray.length; i < l; i++) {\n      if (!this._selectedRowsLookup[rowArray[i]]) {\n        addRows[addRows.length] = rowArray[i];\n      }\n    }\n    this._grid.setSelectedRows(this._grid.getSelectedRows().concat(addRows), 'SlickCheckboxSelectColumn.selectRows');\n  }\n\n  deSelectRows(rowArray: number[]) {\n    const removeRows: number[] = [];\n    for (let i = 0, l = rowArray.length; i < l; i++) {\n      if (this._selectedRowsLookup[rowArray[i]]) {\n        removeRows[removeRows.length] = rowArray[i];\n      }\n    }\n\n    this._grid.setSelectedRows(this._grid.getSelectedRows().filter((n) => removeRows.indexOf(n) < 0), 'SlickCheckboxSelectColumn.deSelectRows');\n  }\n\n  protected handleHeaderClick(e: DOMEvent<HTMLInputElement> | SlickEventData, args: OnHeaderClickEventArgs) {\n    if (args.column.id === this._options.columnId && (e.target as HTMLInputElement).type === 'checkbox') {\n      // if editing, try to commit\n      if (this._grid.getEditorLock().isActive() && !this._grid.getEditorLock().commitCurrentEdit()) {\n        e.preventDefault();\n        e.stopImmediatePropagation();\n        return;\n      }\n\n      let isAllSelected = (e.target as HTMLInputElement).checked;\n      const caller = isAllSelected ? 'click.selectAll' : 'click.unselectAll';\n      const rows: number[] = [];\n\n      if (isAllSelected) {\n        for (let i = 0; i < this._grid.getDataLength(); i++) {\n          // Get the row and check it's a selectable row before pushing it onto the stack\n          const rowItem = this._grid.getDataItem(i);\n          if (!rowItem.__group && !rowItem.__groupTotals && this.checkSelectableOverride(i, rowItem, this._grid)) {\n            rows.push(i);\n          }\n        }\n        isAllSelected = true;\n      }\n      if (this._isUsingDataView && this._dataView && this._options.applySelectOnAllPages) {\n        const ids: Array<number | string> = [];\n        const filteredItems = this._dataView.getFilteredItems();\n        for (let j = 0; j < filteredItems.length; j++) {\n          // Get the row and check it's a selectable ID (it could be in a different page) before pushing it onto the stack\n          const dataviewRowItem: T = filteredItems[j];\n          if (this.checkSelectableOverride(j, dataviewRowItem, this._grid)) {\n            ids.push(dataviewRowItem[this._dataView.getIdPropertyName() as keyof T] as number | string);\n          }\n        }\n        this._dataView.setSelectedIds(ids, { isRowBeingAdded: isAllSelected });\n      }\n      this._grid.setSelectedRows(rows, caller);\n      e.stopPropagation();\n      e.stopImmediatePropagation();\n    }\n  }\n\n  protected getCheckboxColumnCellIndex() {\n    if (this._checkboxColumnCellIndex === null) {\n      this._checkboxColumnCellIndex = 0;\n      const colArr = this._grid.getColumns();\n      for (let i = 0; i < colArr.length; i++) {\n        if (colArr[i].id === this._options.columnId) {\n          this._checkboxColumnCellIndex = i;\n        }\n      }\n    }\n    return this._checkboxColumnCellIndex;\n  }\n\n  /**\n   * use a DocumentFragment to return a fragment including an <input> then a <label> as siblings,\n   * the label is using `for` to link it to the input `id`\n   * @param {String} inputId - id to link the label\n   * @param {Boolean} [checked] - is the input checkbox checked? (defaults to false)\n   * @returns\n   */\n  createCheckboxElement(inputId: string, checked = false) {\n    const fragmentElm = new DocumentFragment();\n    fragmentElm.appendChild(\n      Utils.createDomElement('input', { id: inputId, type: 'checkbox', checked, ariaChecked: String(checked) })\n    );\n    fragmentElm.appendChild(\n      Utils.createDomElement('label', { htmlFor: inputId })\n    );\n\n    return fragmentElm;\n  }\n\n  getColumnDefinition() {\n    return {\n      id: this._options.columnId,\n      reorderable: this._options.reorderable,\n      name: (this._options.hideSelectAllCheckbox || this._options.hideInColumnTitleRow)\n        ? this._options.name || ''\n        : this.createCheckboxElement(`header-selector${this._selectAll_UID}`),\n      toolTip: (this._options.hideSelectAllCheckbox || this._options.hideInColumnTitleRow) ? '' : this._options.toolTip,\n      field: 'sel',\n      width: this._options.width,\n      resizable: false,\n      sortable: false,\n      cssClass: this._options.cssClass,\n      hideSelectAllCheckbox: this._options.hideSelectAllCheckbox,\n      formatter: this.checkboxSelectionFormatter.bind(this),\n      // exclude from all menus, defaults to true unless the option is provided differently by the user\n      excludeFromColumnPicker: this._options.excludeFromColumnPicker ?? true,\n      excludeFromGridMenu: this._options.excludeFromGridMenu ?? true,\n      excludeFromHeaderMenu: this._options.excludeFromHeaderMenu ?? true,\n    };\n  }\n\n  protected addCheckboxToFilterHeaderRow(grid: SlickGrid) {\n    this._handler.subscribe(grid.onHeaderRowCellRendered, (_e, args) => {\n      if (args.column.field === 'sel') {\n        Utils.emptyElement(args.node);\n        const spanElm = Utils.createDomElement('span', { id: 'filter-checkbox-selectall-container', ariaChecked: 'false' });\n        spanElm.appendChild(\n          Utils.createDomElement('input', { type: 'checkbox', id: `header-filter-selector${this._selectAll_UID}` })\n        );\n        spanElm.appendChild(\n          Utils.createDomElement('label', { htmlFor: `header-filter-selector${this._selectAll_UID}` })\n        );\n\n        args.node.appendChild(spanElm);\n        this._headerRowNode = args.node;\n\n        this._bindingEventService.bind(spanElm, 'click', ((e: DOMEvent<HTMLInputElement>) => this.handleHeaderClick(e, args)) as EventListener);\n      }\n    });\n  }\n\n  protected createUID() {\n    return Math.round(10000000 * Math.random());\n  }\n\n  protected checkboxSelectionFormatter(row: number, _cell: number, _val: any, _columnDef: Column, dataContext: any, grid: SlickGrid) {\n    if (dataContext && this.checkSelectableOverride(row, dataContext, grid)) {\n      const UID = this.createUID() + row;\n      return this.createCheckboxElement(`selector${UID}`, !!this._selectedRowsLookup[row]);\n    }\n    return null;\n  }\n\n  protected checkSelectableOverride(row: number, dataContext: any, grid: SlickGrid) {\n    if (typeof this._selectableOverride === 'function') {\n      return this._selectableOverride(row, dataContext, grid);\n    }\n    return true;\n  }\n\n  protected renderSelectAllCheckbox(isSelectAllChecked?: boolean) {\n    this._grid.updateColumnHeader(\n      this._options.columnId || '',\n      this.createCheckboxElement(`header-selector${this._selectAll_UID}`, !!isSelectAllChecked),\n      this._options.toolTip\n    );\n  }\n\n  /**\n   * Method that user can pass to override the default behavior or making every row a selectable row.\n   * In order word, user can choose which rows to be selectable or not by providing his own logic.\n   * @param overrideFn: override function callback\n   */\n  selectableOverride(overrideFn: SelectableOverrideCallback<T>) {\n    this._selectableOverride = overrideFn;\n  }\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  Utils.extend(true, window, {\n    Slick: {\n      CheckboxSelectColumn: SlickCheckboxSelectColumn\n    }\n  });\n}\n\n", "import {\n  BindingEventService as BindingEventService_,\n  SlickEvent as SlickEvent_,\n  SlickEventData as SlickEventData_,\n  SlickEventHandler as SlickEventHandler_,\n  Utils as Utils_\n} from '../slick.core.js';\nimport type {\n  Column,\n  ContextMenuOption,\n  DOMMouseOrTouchEvent,\n  GridOption,\n  MenuCommandItem,\n  MenuCommandItemCallbackArgs,\n  MenuFromCellCallbackArgs,\n  MenuOptionItem,\n  MenuOptionItemCallbackArgs,\n  MenuType,\n  SlickPlugin\n} from '../models/index.js';\nimport type { SlickGrid } from '../slick.grid.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst BindingEventService = IIFE_ONLY ? Slick.BindingEventService : BindingEventService_;\nconst SlickEvent = IIFE_ONLY ? Slick.Event : SlickEvent_;\nconst SlickEventData = IIFE_ONLY ? Slick.EventData : SlickEventData_;\nconst EventHandler = IIFE_ONLY ? Slick.EventHandler : SlickEventHandler_;\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\n/**\n * A plugin to add Context Menu (mouse right+click), it subscribes to the cell \"onContextMenu\" event.\n * The \"contextMenu\" is defined in the Grid Options object\n * You can use it to change a data property (only 1) through a list of Options AND/OR through a list of Commands.\n * A good example of a Command would be an Export to CSV, that can be run from anywhere in the grid by doing a mouse right+click\n *\n * Note:\n *   There is only 1 list of Options, so typically that would be use for 1 column\n *   if you plan to use different Options for different columns, then the CellMenu plugin might be better suited.\n *\n * USAGE:\n *\n * Add the slick.contextmenu.(js|css) files and register it with the grid.\n *\n * To specify a menu in a column header, extend the column definition like so:\n * var contextMenuPlugin = new Slick.Plugins.ContextMenu(columns, grid, options);\n *\n * Available grid options, by defining a contextMenu object:\n *\n *  var options = {\n *    enableCellNavigation: true,\n *    contextMenu: {\n *      optionTitle: 'Change Priority',\n *      optionShownOverColumnIds: [\"priority\"],\n *      optionItems: [\n *        { option: 0, title: 'none', cssClass: 'italic' },\n *        { divider: true },\n *        \"divider\" // just the string is also accepted\n *        { option: 1, iconCssClass: 'fa fa-fire grey', title: 'Low' },\n *        { option: 3, iconCssClass: 'fa fa-fire red', title: 'High' },\n *        { option: 2, iconCssClass: 'fa fa-fire orange', title: 'Medium' },\n *        { option: 4, iconCssClass: 'fa fa-fire', title: 'Extreme', disabled: true },\n *      ],\n *      commandTitle: 'Commands',\n *      commandShownOverColumnIds: [\"title\", \"complete\", \"start\", \"finish\", \"effortDriven\"],\n *      commandItems: [\n *        { command: 'export-excel', title: 'Export to CSV', iconCssClass: 'fa fa-file-excel-o', cssClass: '' },\n *        { command: 'delete-row', title: 'Delete Row', cssClass: 'bold', textCssClass: 'red' },\n *        { command: 'help', title: 'Help', iconCssClass: 'fa fa-question-circle',},\n *        { divider: true },\n *      ],\n *    }\n *  };\n *\n *\n * Available contextMenu properties:\n *    commandTitle:               Title of the Command section (optional)\n *    commandItems:               Array of Command item objects (command/title pair)\n *    commandShownOverColumnIds:  Define which column to show the Commands list. If not defined (defaults), the menu will be shown over all columns\n *    optionTitle:                Title of the Option section (optional)\n *    optionItems:                Array of Options item objects (option/title pair)\n *    optionShownOverColumnIds:   Define which column to show the Options list. If not defined (defaults), the menu will be shown over all columns\n *    hideCloseButton:            Hide the Close button on top right (defaults to false)\n *    hideCommandSection:         Hide the Commands section even when the commandItems array is filled (defaults to false)\n *    hideMenuOnScroll:           Do we want to hide the Cell Menu when a scrolling event occurs (defaults to false)?\n *    hideOptionSection:          Hide the Options section even when the optionItems array is filled (defaults to false)\n *    maxHeight:                  Maximum height that the drop menu will have, can be a number (250) or text (\"none\")\n *    width:                      Width that the drop menu will have, can be a number (250) or text (defaults to \"auto\")\n *    autoAdjustDrop:             Auto-align dropup or dropdown menu to the left or right depending on grid viewport available space (defaults to true)\n *    autoAdjustDropOffset:       Optionally add an offset to the auto-align of the drop menu (defaults to -4)\n *    autoAlignSide:              Auto-align drop menu to the left or right depending on grid viewport available space (defaults to true)\n *    autoAlignSideOffset:        Optionally add an offset to the left/right side auto-align (defaults to 0)\n *    menuUsabilityOverride:      Callback method that user can override the default behavior of enabling/disabling the menu from being usable (must be combined with a custom formatter)\n *    subItemChevronClass:        CSS class that can be added on the right side of a sub-item parent (typically a chevron-right icon)\n *    subMenuOpenByEvent:         defaults to \"mouseover\", what event type shoud we use to open sub-menu(s), 2 options are available: \"mouseover\" or \"click\"\n *\n *\n * Available menu Command/Option item properties:\n *    action:                     Optionally define a callback function that gets executed when item is chosen (and/or use the onCommand event)\n *    command:                    A command identifier to be passed to the onCommand event handlers (when using \"commandItems\").\n *    option:                     An option to be passed to the onOptionSelected event handlers (when using \"optionItems\").\n *    title:                      Menu item text.\n *    divider:                    Boolean which tell if the current item is a divider, not an actual command. You could also pass \"divider\" instead of an object\n *    disabled:                   Whether the item/command is disabled.\n *    hidden:                     Whether the item/command is hidden.\n *    subMenuTitle:               Optional sub-menu title that will shows up when sub-menu commmands/options list is opened\n *    subMenuTitleCssClass:       Optional sub-menu title CSS class to use with `subMenuTitle`\n *    tooltip:                    Item tooltip.\n *    cssClass:                   A CSS class to be added to the menu item container.\n *    iconCssClass:               A CSS class to be added to the menu item icon.\n *    textCssClass:               A CSS class to be added to the menu item text.\n *    iconImage:                  A url to the icon image.\n *    itemVisibilityOverride:     Callback method that user can override the default behavior of showing/hiding an item from the list\n *    itemUsabilityOverride:      Callback method that user can override the default behavior of enabling/disabling an item from the list\n *\n * The plugin exposes the following events:\n *\n *    onAfterMenuShow: Fired after the menu is shown.  You can customize the menu or dismiss it by returning false.\n *        Event args:\n *            cell:         Cell or column index\n *            row:          Row index\n *            grid:         Reference to the grid.\n *\n *    onBeforeMenuShow: Fired before the menu is shown.  You can customize the menu or dismiss it by returning false.\n *        Event args:\n *            cell:         Cell or column index\n *            row:          Row index\n *            grid:         Reference to the grid.\n *\n *    onBeforeMenuClose: Fired when the menu is closing.\n *        Event args:\n *            cell:         Cell or column index\n *            row:          Row index\n *            grid:         Reference to the grid.\n *            menu:         Menu DOM element\n *\n *    onCommand: Fired on menu option clicked from the Command items list\n *        Event args:\n *            cell:         Cell or column index\n *            row:          Row index\n *            grid:         Reference to the grid.\n *            command:      Menu command identified.\n *            item:         Menu item selected\n *            column:    Cell Column definition\n *            dataContext:  Cell Data Context (data object)\n *            value:        Value of the cell we triggered the context menu from\n *\n *    onOptionSelected: Fired on menu option clicked from the Option items list\n *        Event args:\n *            cell:         Cell or column index\n *            row:          Row index\n *            grid:         Reference to the grid.\n *            option:       Menu option selected.\n *            item:         Menu item selected\n *            column:    Cell Column definition\n *            dataContext:  Cell Data Context (data object)\n *\n *\n * @param options {Object} Context Menu Options\n * @class Slick.Plugins.ContextMenu\n */\nexport class SlickContextMenu implements SlickPlugin {\n  // --\n  // public API\n  pluginName = 'ContextMenu' as const;\n  onAfterMenuShow = new SlickEvent<MenuFromCellCallbackArgs>('onAfterMenuShow');\n  onBeforeMenuShow = new SlickEvent<MenuFromCellCallbackArgs>('onBeforeMenuShow');\n  onBeforeMenuClose = new SlickEvent<MenuFromCellCallbackArgs>('onBeforeMenuClose');\n  onCommand = new SlickEvent<MenuCommandItemCallbackArgs>('onCommand');\n  onOptionSelected = new SlickEvent<MenuOptionItemCallbackArgs>('onOptionSelected');\n\n  // --\n  // protected props\n  protected _bindingEventService = new BindingEventService();\n  protected _contextMenuProperties: ContextMenuOption;\n  protected _currentCell = -1;\n  protected _currentRow = -1;\n  protected _grid!: SlickGrid;\n  protected _gridOptions!: GridOption;\n  protected _gridUid = '';\n  protected _handler = new EventHandler();\n  protected _commandTitleElm?: HTMLSpanElement;\n  protected _optionTitleElm?: HTMLSpanElement;\n  protected _lastMenuTypeClicked = '';\n  protected _menuElm?: HTMLDivElement | null;\n  protected _subMenuParentId = '';\n  protected _defaults: ContextMenuOption = {\n    autoAdjustDrop: true,     // dropup/dropdown\n    autoAlignSide: true,      // left/right\n    autoAdjustDropOffset: -4,\n    autoAlignSideOffset: 0,\n    hideMenuOnScroll: false,\n    maxHeight: 'none',\n    width: 'auto',\n    optionShownOverColumnIds: [],\n    commandShownOverColumnIds: [],\n    subMenuOpenByEvent: 'mouseover',\n  };\n\n  constructor(optionProperties: Partial<ContextMenuOption>) {\n    this._contextMenuProperties = Utils.extend({}, this._defaults, optionProperties);\n  }\n\n  init(grid: SlickGrid) {\n    this._grid = grid;\n    this._gridOptions = grid.getOptions();\n    this._gridUid = grid.getUID() || '';\n    Utils.addSlickEventPubSubWhenDefined(grid.getPubSubService(), this);\n    this._handler.subscribe(this._grid.onContextMenu, this.handleOnContextMenu.bind(this));\n    if (this._contextMenuProperties.hideMenuOnScroll) {\n      this._handler.subscribe(this._grid.onScroll, this.destroyMenu.bind(this));\n    }\n  }\n\n  setOptions(newOptions: Partial<ContextMenuOption>) {\n    this._contextMenuProperties = Utils.extend({}, this._contextMenuProperties, newOptions);\n\n    // on the array properties, we want to make sure to overwrite them and not just extending them\n    if (newOptions.commandShownOverColumnIds) {\n      this._contextMenuProperties.commandShownOverColumnIds = newOptions.commandShownOverColumnIds;\n    }\n    if (newOptions.optionShownOverColumnIds) {\n      this._contextMenuProperties.optionShownOverColumnIds = newOptions.optionShownOverColumnIds;\n    }\n  }\n\n  destroy() {\n    this.onAfterMenuShow.unsubscribe();\n    this.onBeforeMenuShow.unsubscribe();\n    this.onBeforeMenuClose.unsubscribe();\n    this.onCommand.unsubscribe();\n    this.onOptionSelected.unsubscribe();\n    this._handler.unsubscribeAll();\n    this._bindingEventService.unbindAll();\n    this._menuElm?.remove();\n    this._commandTitleElm = null as any;\n    this._optionTitleElm = null as any;\n    this._menuElm = null as any;\n  }\n\n  protected createParentMenu(evt: SlickEventData_ | MouseEvent) {\n    const e = evt instanceof SlickEventData ? evt.getNativeEvent<MouseEvent | TouchEvent>() : evt;\n    const targetEvent = (e as TouchEvent).touches?.[0] ?? e;\n    const cell = this._grid.getCellFromEvent(e);\n    this._currentCell = cell?.cell ?? 0;\n    this._currentRow = cell?.row ?? 0;\n    const columnDef = this._grid.getColumns()[this._currentCell];\n\n    const isColumnOptionAllowed = this.checkIsColumnAllowed(this._contextMenuProperties.optionShownOverColumnIds ?? [], columnDef.id);\n    const isColumnCommandAllowed = this.checkIsColumnAllowed(this._contextMenuProperties.commandShownOverColumnIds ?? [], columnDef.id);\n    const commandItems = this._contextMenuProperties.commandItems || [];\n    const optionItems = this._contextMenuProperties.optionItems || [];\n\n    // make sure there's at least something to show before creating the Context Menu\n    if (!columnDef || (!isColumnCommandAllowed && !isColumnOptionAllowed) || (!commandItems.length && !optionItems.length)) {\n      return;\n    }\n\n    // delete any prior context menu\n    this.destroyMenu(e);\n\n    // Let the user modify the menu or cancel altogether,\n    // or provide alternative menu implementation.\n    if (this.onBeforeMenuShow.notify({\n      cell: this._currentCell,\n      row: this._currentRow,\n      grid: this._grid\n    }, e, this).getReturnValue() === false) {\n      return;\n    }\n\n    // create 1st parent menu container & reposition it\n    this._menuElm = this.createMenu(commandItems, optionItems);\n    this._menuElm.style.top = `${targetEvent.pageY}px`;\n    this._menuElm.style.left = `${targetEvent.pageX}px`;\n    this._menuElm.style.display = 'block';\n    document.body.appendChild(this._menuElm);\n\n    if (this.onAfterMenuShow.notify({\n      cell: this._currentCell,\n      row: this._currentRow,\n      grid: this._grid\n    }, e, this).getReturnValue() === false) {\n      return;\n    }\n\n    return this._menuElm;\n  }\n\n  protected createMenu(commandItems: Array<MenuCommandItem | 'divider'>, optionItems: Array<MenuOptionItem | 'divider'>, level = 0, item?: MenuCommandItem | MenuOptionItem | 'divider') {\n    const columnDef = this._grid.getColumns()[this._currentCell];\n    const dataContext = this._grid.getDataItem(this._currentRow);\n    const isColumnOptionAllowed = this.checkIsColumnAllowed(this._contextMenuProperties.optionShownOverColumnIds ?? [], columnDef.id);\n    const isColumnCommandAllowed = this.checkIsColumnAllowed(this._contextMenuProperties.commandShownOverColumnIds ?? [], columnDef.id);\n\n    // create a new context menu\n    const maxHeight = isNaN(this._contextMenuProperties.maxHeight as number) ? this._contextMenuProperties.maxHeight : `${this._contextMenuProperties.maxHeight ?? 0}px`;\n    const width = isNaN(this._contextMenuProperties.width as number) ? this._contextMenuProperties.width : `${this._contextMenuProperties.maxWidth ?? 0}px`;\n\n    // to avoid having multiple sub-menu trees opened,\n    // we need to somehow keep trace of which parent menu the tree belongs to\n    // and we should keep ref of only the first sub-menu parent, we can use the command name (remove any whitespaces though)\n    const subMenuCommand = (item as MenuCommandItem)?.command;\n    let subMenuId = (level === 1 && subMenuCommand) ? subMenuCommand.replaceAll(' ', '') : '';\n    if (subMenuId) {\n      this._subMenuParentId = subMenuId;\n    }\n    if (level > 1) {\n      subMenuId = this._subMenuParentId;\n    }\n\n    const menuClasses = `slick-context-menu slick-menu-level-${level} ${this._gridUid}`;\n    const bodyMenuElm = document.body.querySelector<HTMLDivElement>(`.slick-context-menu.slick-menu-level-${level}${this.getGridUidSelector()}`);\n\n    // return menu/sub-menu if it's already opened unless we are on different sub-menu tree if so close them all\n    if (bodyMenuElm) {\n      if (bodyMenuElm.dataset.subMenuParent === subMenuId) {\n        return bodyMenuElm;\n      }\n      this.destroySubMenus();\n    }\n\n    const menuElm = document.createElement('div');\n    menuElm.className = menuClasses;\n    if (level > 0) {\n      menuElm.classList.add('slick-submenu');\n      if (subMenuId) {\n        menuElm.dataset.subMenuParent = subMenuId;\n      }\n    }\n    menuElm.ariaLabel = level > 1 ? 'SubMenu' : 'Context Menu';\n    menuElm.role = 'menu';\n    if (width) {\n      menuElm.style.width = width as string;\n    }\n    if (maxHeight) {\n      menuElm.style.maxHeight = maxHeight as string;\n    }\n\n    menuElm.style.display = 'none';\n\n    let closeButtonElm: HTMLButtonElement | null = null;\n    if (level === 0) {\n      closeButtonElm = document.createElement('button');\n      closeButtonElm.type = 'button';\n      closeButtonElm.className = 'close';\n      closeButtonElm.dataset.dismiss = 'slick-context-menu';\n      closeButtonElm.ariaLabel = 'Close';\n\n      const spanCloseElm = document.createElement('span');\n      spanCloseElm.className = 'close';\n      spanCloseElm.ariaHidden = 'true';\n      spanCloseElm.textContent = '\u00D7';\n      closeButtonElm.appendChild(spanCloseElm);\n    }\n\n    // -- Option List section\n    if (!this._contextMenuProperties.hideOptionSection && isColumnOptionAllowed && optionItems.length > 0) {\n      const optionMenuElm = document.createElement('div');\n      optionMenuElm.className = 'slick-context-menu-option-list';\n      optionMenuElm.role = 'menu';\n\n      // when creating sub-menu add its sub-menu title when exists\n      if (item && level > 0) {\n        this.addSubMenuTitleWhenExists(item, optionMenuElm); // add sub-menu title when exists\n      }\n\n      if (closeButtonElm && !this._contextMenuProperties.hideCloseButton) {\n        this._bindingEventService.bind(closeButtonElm, 'click', this.handleCloseButtonClicked.bind(this) as EventListener);\n        menuElm.appendChild(closeButtonElm);\n      }\n      menuElm.appendChild(optionMenuElm);\n\n      this.populateCommandOrOptionItems(\n        'option',\n        this._contextMenuProperties,\n        optionMenuElm,\n        optionItems,\n        { cell: this._currentCell, row: this._currentRow, column: columnDef, dataContext, grid: this._grid, level }\n      );\n    }\n\n    // -- Command List section\n    if (!this._contextMenuProperties.hideCommandSection && isColumnCommandAllowed && commandItems.length > 0) {\n      const commandMenuElm = document.createElement('div');\n      commandMenuElm.className = 'slick-context-menu-command-list';\n      commandMenuElm.role = 'menu';\n\n      // when creating sub-menu add its sub-menu title when exists\n      if (item && level > 0) {\n        this.addSubMenuTitleWhenExists(item, commandMenuElm); // add sub-menu title when exists\n      }\n\n      if (closeButtonElm && !this._contextMenuProperties.hideCloseButton && (!isColumnOptionAllowed || optionItems.length === 0 || this._contextMenuProperties.hideOptionSection)) {\n        this._bindingEventService.bind(closeButtonElm, 'click', this.handleCloseButtonClicked.bind(this) as EventListener);\n        menuElm.appendChild(closeButtonElm);\n      }\n\n      menuElm.appendChild(commandMenuElm);\n      this.populateCommandOrOptionItems(\n        'command',\n        this._contextMenuProperties,\n        commandMenuElm,\n        commandItems,\n        { cell: this._currentCell, row: this._currentRow, column: columnDef, dataContext, grid: this._grid, level }\n      );\n    }\n\n    // increment level for possible next sub-menus if exists\n    level++;\n\n    return menuElm;\n  }\n\n  protected addSubMenuTitleWhenExists(item: MenuCommandItem | MenuOptionItem | 'divider', commandOrOptionMenu: HTMLDivElement) {\n    if (item !== 'divider' && item?.subMenuTitle) {\n      const subMenuTitleElm = document.createElement('div');\n      subMenuTitleElm.className = 'slick-menu-title';\n      subMenuTitleElm.textContent = item.subMenuTitle as string;\n      const subMenuTitleClass = item.subMenuTitleCssClass as string;\n      if (subMenuTitleClass) {\n        subMenuTitleElm.classList.add(...Utils.classNameToList(subMenuTitleClass));\n      }\n\n      commandOrOptionMenu.appendChild(subMenuTitleElm);\n    }\n  }\n\n  protected handleCloseButtonClicked(e: MouseEvent | TouchEvent) {\n    if (!e.defaultPrevented) {\n      this.destroyMenu(e);\n    }\n  }\n\n  destroyMenu(e?: Event | SlickEventData_, args?: { cell: number; row: number; }) {\n    this._menuElm = this._menuElm || document.querySelector(`.slick-context-menu${this.getGridUidSelector()}`);\n\n    if (this._menuElm?.remove) {\n      if (this.onBeforeMenuClose.notify({\n        cell: args?.cell ?? 0,\n        row: args?.row ?? 0,\n        grid: this._grid,\n      }, e, this).getReturnValue() === false) {\n        return;\n      }\n      this._menuElm.remove();\n      this._menuElm = null;\n    }\n    this.destroySubMenus();\n  }\n\n  /** Destroy all parent menus and any sub-menus */\n  destroyAllMenus() {\n    this.destroySubMenus();\n\n    // remove all parent menu listeners before removing them from the DOM\n    this._bindingEventService.unbindAll('parent-menu');\n    document.querySelectorAll(`.slick-context-menu${this.getGridUidSelector()}`)\n      .forEach(subElm => subElm.remove());\n  }\n\n  /** Close and destroy all previously opened sub-menus */\n  destroySubMenus() {\n    this._bindingEventService.unbindAll('sub-menu');\n    document.querySelectorAll(`.slick-context-menu.slick-submenu${this.getGridUidSelector()}`)\n      .forEach(subElm => subElm.remove());\n  }\n\n  protected checkIsColumnAllowed(columnIds: Array<number | string>, columnId: number | string) {\n    let isAllowedColumn = false;\n\n    if (columnIds?.length > 0) {\n      for (let o = 0, ln = columnIds.length; o < ln; o++) {\n        if (columnIds[o] === columnId) {\n          isAllowedColumn = true;\n        }\n      }\n    } else {\n      isAllowedColumn = true;\n    }\n    return isAllowedColumn;\n  }\n\n  protected getGridUidSelector() {\n    const gridUid = this._grid.getUID() || '';\n    return gridUid ? `.${gridUid}` : '';\n  }\n\n  protected handleOnContextMenu(evt: SlickEventData_ | DOMMouseOrTouchEvent<HTMLDivElement>, args: MenuCommandItemCallbackArgs) {\n    this.destroyAllMenus(); // make there's only 1 parent menu opened at a time\n    const e = evt instanceof SlickEventData ? evt.getNativeEvent<DOMMouseOrTouchEvent<HTMLDivElement>>() : evt;\n    e.preventDefault();\n    const cell = this._grid.getCellFromEvent(e);\n\n    if (cell) {\n      const columnDef = this._grid.getColumns()[cell.cell];\n      const dataContext = this._grid.getDataItem(cell.row);\n\n      // run the override function (when defined), if the result is false it won't go further\n      args = args || {};\n      args.cell = cell.cell;\n      args.row = cell.row;\n      args.column = columnDef;\n      args.dataContext = dataContext;\n      args.grid = this._grid;\n\n      if (!this.runOverrideFunctionWhenExists(this._contextMenuProperties.menuUsabilityOverride, args)) {\n        return;\n      }\n\n      // create the DOM element\n      this._menuElm = this.createParentMenu(e as MouseEvent);\n\n      // reposition the menu to where the user clicked\n      if (this._menuElm) {\n        this.repositionMenu(e, this._menuElm);\n        this._menuElm.style.display = 'block';\n      }\n\n      // Hide the menu on outside click.\n      this._bindingEventService.bind(document.body, 'mousedown', this.handleBodyMouseDown.bind(this) as EventListener);\n    }\n  }\n\n  /** When users click outside the Cell Menu, we will typically close the Cell Menu (and any sub-menus) */\n  protected handleBodyMouseDown(e: DOMMouseOrTouchEvent<HTMLDivElement>) {\n    // did we click inside the menu or any of its sub-menu(s)\n    let isMenuClicked = false;\n    if (this._menuElm?.contains(e.target)) {\n      isMenuClicked = true;\n    }\n    if (!isMenuClicked) {\n      document\n        .querySelectorAll(`.slick-context-menu.slick-submenu${this.getGridUidSelector()}`)\n        .forEach(subElm => {\n          if (subElm.contains(e.target)) {\n            isMenuClicked = true;\n          }\n        });\n    }\n\n    if (this._menuElm !== e.target && !isMenuClicked && !e.defaultPrevented) {\n      this.destroyMenu(e, { cell: this._currentCell, row: this._currentRow });\n    }\n  }\n\n  /** Construct the Command Items section. */\n  protected populateCommandOrOptionItems(\n    itemType: MenuType,\n    contextMenu: ContextMenuOption,\n    commandOrOptionMenuElm: HTMLElement,\n    commandOrOptionItems: Array<MenuCommandItem | 'divider'> | Array<MenuOptionItem | 'divider'>,\n    args: { cell: number, row: number, column: Column, dataContext: any, grid: SlickGrid, level: number }\n  ) {\n    if (!args || !commandOrOptionItems || !contextMenu) {\n      return;\n    }\n\n    // user could pass a title on top of the Commands/Options section\n    const level = args?.level || 0;\n    const isSubMenu = level > 0;\n    if (contextMenu?.[`${itemType}Title`] && !isSubMenu) {\n      this[`_${itemType}TitleElm`] = document.createElement('div');\n      this[`_${itemType}TitleElm`]!.className = 'slick-menu-title';\n      this[`_${itemType}TitleElm`]!.textContent = contextMenu[`${itemType}Title`] as string;\n      commandOrOptionMenuElm.appendChild(this[`_${itemType}TitleElm`]!);\n    }\n\n    for (let i = 0, ln = commandOrOptionItems.length; i < ln; i++) {\n      let addClickListener = true;\n      const item = commandOrOptionItems[i];\n\n      // run each override functions to know if the item is visible and usable\n      const isItemVisible = this.runOverrideFunctionWhenExists<typeof args>((item as MenuCommandItem | MenuOptionItem).itemVisibilityOverride, args);\n      const isItemUsable = this.runOverrideFunctionWhenExists<typeof args>((item as MenuCommandItem | MenuOptionItem).itemUsabilityOverride, args);\n\n      // if the result is not visible then there's no need to go further\n      if (!isItemVisible) {\n        continue;\n      }\n\n      // when the override is defined, we need to use its result to update the disabled property\n      // so that \"handleMenuItemClick\" has the correct flag and won't trigger a command clicked event\n      if (Object.prototype.hasOwnProperty.call(item, 'itemUsabilityOverride')) {\n        (item as MenuCommandItem | MenuOptionItem).disabled = isItemUsable ? false : true;\n      }\n\n      const liElm = document.createElement('div');\n      liElm.className = 'slick-context-menu-item';\n      liElm.role = 'menuitem';\n\n      if ((item as MenuCommandItem | MenuOptionItem).divider || item === 'divider') {\n        liElm.classList.add('slick-context-menu-item-divider');\n        addClickListener = false;\n      }\n\n      // if the item is disabled then add the disabled css class\n      if ((item as MenuCommandItem | MenuOptionItem).disabled || !isItemUsable) {\n        liElm.classList.add('slick-context-menu-item-disabled');\n      }\n\n      // if the item is hidden then add the hidden css class\n      if ((item as MenuCommandItem | MenuOptionItem).hidden) {\n        liElm.classList.add('slick-context-menu-item-hidden');\n      }\n\n      if ((item as MenuCommandItem | MenuOptionItem).cssClass) {\n        liElm.classList.add(...Utils.classNameToList((item as MenuCommandItem | MenuOptionItem).cssClass));\n      }\n\n      if ((item as MenuCommandItem | MenuOptionItem).tooltip) {\n        liElm.title = (item as MenuCommandItem | MenuOptionItem).tooltip || '';\n      }\n\n      const iconElm = document.createElement('div');\n      iconElm.className = 'slick-context-menu-icon';\n\n      liElm.appendChild(iconElm);\n\n      if ((item as MenuCommandItem | MenuOptionItem).iconCssClass) {\n        iconElm.classList.add(...Utils.classNameToList((item as MenuCommandItem | MenuOptionItem).iconCssClass));\n      }\n\n      if ((item as MenuCommandItem | MenuOptionItem).iconImage) {\n        iconElm.style.backgroundImage = `url(${(item as MenuCommandItem | MenuOptionItem).iconImage})`;\n      }\n\n      const textElm = document.createElement('span');\n      textElm.className = 'slick-context-menu-content';\n      textElm.textContent = (item as MenuCommandItem | MenuOptionItem).title || '';\n\n      liElm.appendChild(textElm);\n\n      if ((item as MenuCommandItem | MenuOptionItem).textCssClass) {\n        textElm.classList.add(...Utils.classNameToList((item as MenuCommandItem | MenuOptionItem).textCssClass));\n      }\n\n      commandOrOptionMenuElm.appendChild(liElm);\n\n      if (addClickListener) {\n        const eventGroup = isSubMenu ? 'sub-menu' : 'parent-menu';\n        this._bindingEventService.bind(liElm, 'click', this.handleMenuItemClick.bind(this, item, itemType, level) as EventListener, undefined, eventGroup);\n      }\n\n      // optionally open sub-menu(s) by mouseover\n      if (this._contextMenuProperties.subMenuOpenByEvent === 'mouseover') {\n        this._bindingEventService.bind(liElm, 'mouseover', ((e: DOMMouseOrTouchEvent<HTMLDivElement>) => {\n          if ((item as MenuCommandItem).commandItems || (item as MenuOptionItem).optionItems) {\n            this.repositionSubMenu(item, itemType, level, e);\n            this._lastMenuTypeClicked = itemType;\n          } else if (!isSubMenu) {\n            this.destroySubMenus();\n          }\n        }) as EventListener);\n      }\n\n      // the option/command item could be a sub-menu if it has another list of commands/options\n      if ((item as MenuCommandItem).commandItems || (item as MenuOptionItem).optionItems) {\n        const chevronElm = document.createElement('span');\n        chevronElm.className = 'sub-item-chevron';\n        if (this._contextMenuProperties.subItemChevronClass) {\n          chevronElm.classList.add(...Utils.classNameToList(this._contextMenuProperties.subItemChevronClass));\n        } else {\n          chevronElm.textContent = '\u2B9E'; // \u2B9E or \u25B8\n        }\n\n        liElm.classList.add('slick-submenu-item');\n        liElm.appendChild(chevronElm);\n        continue;\n      }\n    }\n  }\n\n  protected handleMenuItemClick(item: MenuCommandItem | MenuOptionItem | 'divider', type: MenuType, level = 0, e: DOMMouseOrTouchEvent<HTMLDivElement>) {\n    if ((item as never)?.[type] !== undefined && item !== 'divider' && !item.disabled && !(item as MenuCommandItem | MenuOptionItem).divider && this._currentCell !== undefined && this._currentRow !== undefined) {\n      if (type === 'option' && !this._grid.getEditorLock().commitCurrentEdit()) {\n        return;\n      }\n      const optionOrCommand = (item as any)[type] !== undefined ? (item as any)[type] : '';\n      const row = this._currentRow;\n      const cell = this._currentCell;\n      const columnDef = this._grid.getColumns()[cell];\n      const dataContext = this._grid.getDataItem(row);\n      let cellValue;\n\n      if (Object.prototype.hasOwnProperty.call(dataContext, columnDef?.field)) {\n        cellValue = dataContext[columnDef.field];\n      }\n\n      if (optionOrCommand !== undefined && !(item as any)[`${type}Items`]) {\n        // user could execute a callback through 2 ways\n        // via the onCommand event and/or an action callback\n        const callbackArgs = {\n          cell,\n          row,\n          grid: this._grid,\n          [type]: optionOrCommand,\n          item,\n          column: columnDef,\n          dataContext,\n          value: cellValue\n        };\n        const eventType = type === 'command' ? 'onCommand' : 'onOptionSelected';\n        this[eventType].notify(callbackArgs as any, e, this);\n\n        // execute action callback when defined\n        if (typeof (item as MenuCommandItem).action === 'function') {\n          (item as any).action.call(this, e, callbackArgs);\n        }\n\n        if (!e.defaultPrevented) {\n          this.destroyMenu(e, { cell, row });\n        }\n      } else if ((item as MenuCommandItem).commandItems || (item as MenuOptionItem).optionItems) {\n        this.repositionSubMenu(item, type, level, e);\n      } else {\n        this.destroySubMenus();\n      }\n      this._lastMenuTypeClicked = type;\n    }\n  }\n\n  protected repositionSubMenu(item: MenuCommandItem | MenuOptionItem | 'divider', type: MenuType, level: number, e: DOMMouseOrTouchEvent<HTMLDivElement>) {\n    // when we're clicking a grid cell OR our last menu type (command/option) differs then we know that we need to start fresh and close any sub-menus that might still be open\n    if (e.target.classList.contains('slick-cell') || this._lastMenuTypeClicked !== type) {\n      this.destroySubMenus();\n    }\n\n    // creating sub-menu, we'll also pass level & the item object since we might have \"subMenuTitle\" to show\n    const subMenuElm = this.createMenu((item as MenuCommandItem)?.commandItems || [], (item as MenuOptionItem)?.optionItems || [], level + 1, item);\n    subMenuElm.style.display = 'block';\n    document.body.appendChild(subMenuElm);\n    this.repositionMenu(e, subMenuElm);\n  }\n\n  /**\n   * Reposition the menu drop (up/down) and the side (left/right)\n   * @param {*} event\n   */\n  protected repositionMenu(e: DOMMouseOrTouchEvent<HTMLDivElement>, menuElm: HTMLElement) {\n    const isSubMenu = menuElm.classList.contains('slick-submenu');\n    const targetEvent = (e as TouchEvent).touches?.[0] ?? e;\n    const parentElm = isSubMenu\n      ? e.target.closest('.slick-context-menu-item') as HTMLDivElement\n      : e.target.closest('.slick-cell') as HTMLDivElement;\n\n    if (menuElm && parentElm) {\n      const parentOffset = Utils.offset(parentElm);\n      let menuOffsetLeft = (isSubMenu && parentElm) ? parentOffset?.left ?? 0 : targetEvent.pageX;\n      let menuOffsetTop = parentElm ? parentOffset?.top ?? 0 : targetEvent.pageY;\n      const menuHeight = menuElm?.offsetHeight || 0;\n      const menuWidth = Number(menuElm?.offsetWidth || this._contextMenuProperties.width || 0);\n      const rowHeight = this._gridOptions.rowHeight;\n      const dropOffset = Number(this._contextMenuProperties.autoAdjustDropOffset || 0);\n      const sideOffset = Number(this._contextMenuProperties.autoAlignSideOffset || 0);\n\n      // if autoAdjustDrop is enable, we first need to see what position the drop will be located\n      // without necessary toggling it's position just yet, we just want to know the future position for calculation\n      if (this._contextMenuProperties.autoAdjustDrop) {\n        // since we reposition menu below slick cell, we need to take it in consideration and do our calculation from that element\n        const spaceBottom = Utils.calculateAvailableSpace(parentElm).bottom;\n        const spaceTop = Utils.calculateAvailableSpace(parentElm).top;\n        const spaceBottomRemaining = spaceBottom + dropOffset - rowHeight!;\n        const spaceTopRemaining = spaceTop - dropOffset + rowHeight!;\n        const dropPosition = (spaceBottomRemaining < menuHeight && spaceTopRemaining > spaceBottomRemaining) ? 'top' : 'bottom';\n        if (dropPosition === 'top') {\n          menuElm.classList.remove('dropdown');\n          menuElm.classList.add('dropup');\n          if (isSubMenu) {\n            menuOffsetTop -= (menuHeight - dropOffset - parentElm.clientHeight);\n          } else {\n            menuOffsetTop -= menuHeight - dropOffset;\n          }\n        } else {\n          menuElm.classList.remove('dropup');\n          menuElm.classList.add('dropdown');\n          if (isSubMenu) {\n            menuOffsetTop += dropOffset;\n          } else {\n            menuOffsetTop += rowHeight! + dropOffset;\n          }\n        }\n      }\n\n      // when auto-align is set, it will calculate whether it has enough space in the viewport to show the drop menu on the right (default)\n      // if there isn't enough space on the right, it will automatically align the drop menu to the left\n      // to simulate an align left, we actually need to know the width of the drop menu\n      if (this._contextMenuProperties.autoAlignSide) {\n        const gridPos = this._grid.getGridPosition();\n        let subMenuPosCalc = menuOffsetLeft + Number(menuWidth); // calculate coordinate at caller element far right\n        if (isSubMenu) {\n          subMenuPosCalc += parentElm.clientWidth;\n        }\n        const browserWidth = document.documentElement.clientWidth;\n        const dropSide = (subMenuPosCalc >= gridPos.width || subMenuPosCalc >= browserWidth) ? 'left' : 'right';\n        if (dropSide === 'left') {\n          menuElm.classList.remove('dropright');\n          menuElm.classList.add('dropleft');\n          menuOffsetLeft -= menuWidth - sideOffset;\n        } else {\n          menuElm.classList.remove('dropleft');\n          menuElm.classList.add('dropright');\n          if (isSubMenu) {\n            menuOffsetLeft += sideOffset + parentElm.offsetWidth;\n          } else {\n            menuOffsetLeft += sideOffset;\n          }\n        }\n      }\n\n      // ready to reposition the menu\n      menuElm.style.top = `${menuOffsetTop}px`;\n      menuElm.style.left = `${menuOffsetLeft}px`;\n    }\n  }\n\n  /**\n   * Method that user can pass to override the default behavior.\n   * In order word, user can choose or an item is (usable/visible/enable) by providing his own logic.\n   * @param overrideFn: override function callback\n   * @param args: multiple arguments provided to the override (cell, row, columnDef, dataContext, grid)\n   */\n  protected runOverrideFunctionWhenExists<T = any>(overrideFn: ((args: any) => boolean) | undefined, args: T): boolean {\n    if (typeof overrideFn === 'function') {\n      return overrideFn.call(this, args);\n    }\n    return true;\n  }\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  Utils.extend(true, window, {\n    Slick: {\n      Plugins: {\n        ContextMenu: SlickContextMenu\n      }\n    }\n  });\n}\n", "import { SlickEvent as SlickEvent_, type SlickEventData as SlickEventData_, SlickEventHandler as SlickEventHandler_, Utils as Utils_ } from '../slick.core.js';\nimport type { Column, DragRowMove, CrossGridRowMoveManagerOption, FormatterResultWithText, UsabilityOverrideFn } from '../models/index.js';\nimport type { SlickGrid } from '../slick.grid.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst SlickEvent = IIFE_ONLY ? Slick.Event : SlickEvent_;\nconst SlickEventHandler = IIFE_ONLY ? Slick.EventHandler : SlickEventHandler_;\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\n/**\n * Row Move Manager options:\n *    cssClass:                 A CSS class to be added to the menu item container.\n *    columnId:                 Column definition id (defaults to \"_move\")\n *    cancelEditOnDrag:         Do we want to cancel any Editing while dragging a row (defaults to false)\n *    disableRowSelection:      Do we want to disable the row selection? (defaults to false)\n *    hideRowMoveShadow:        Do we want to hide the row move shadow clone? (defaults to true)\n *    rowMoveShadowMarginTop:   When row move shadow is shown, optional margin-top (defaults to 0)\n *    rowMoveShadowMarginLeft:  When row move shadow is shown, optional margin-left (defaults to 0)\n *    rowMoveShadowOpacity:     When row move shadow is shown, what is its opacity? (defaults to 0.95)\n *    rowMoveShadowScale:       When row move shadow is shown, what is its size scale? (default to 0.75)\n *    singleRowMove:            Do we want a single row move? Setting this to false means that it's a multple row move (defaults to false)\n *    width:                    Width of the column\n *    usabilityOverride:        Callback method that user can override the default behavior of the row being moveable or not\n *\n */\nexport class SlickCrossGridRowMoveManager {\n  // --\n  // public API\n  pluginName = 'CrossGridRowMoveManager' as const;\n  onBeforeMoveRows = new SlickEvent<{ rows: number[]; insertBefore: number; fromGrid: SlickGrid; toGrid: SlickGrid; }>('onBeforeMoveRows');\n  onMoveRows = new SlickEvent<{ rows: number[]; insertBefore: number; fromGrid: SlickGrid; toGrid: SlickGrid; }>('onMoveRows');\n\n  // --\n  // protected props\n  protected _grid!: SlickGrid;\n  protected _canvas!: HTMLElement;\n  protected _dragging = false;\n  protected _toGrid!: SlickGrid;\n  protected _toCanvas!: HTMLElement;\n  protected _usabilityOverride?: UsabilityOverrideFn;\n  protected _eventHandler: SlickEventHandler_;\n  protected _options: CrossGridRowMoveManagerOption;\n  protected _defaults: CrossGridRowMoveManagerOption = {\n    columnId: '_move',\n    cssClass: undefined,\n    cancelEditOnDrag: false,\n    disableRowSelection: false,\n    hideRowMoveShadow: true,\n    rowMoveShadowMarginTop: 0,\n    rowMoveShadowMarginLeft: 0,\n    rowMoveShadowOpacity: 0.95,\n    rowMoveShadowScale: 0.75,\n    singleRowMove: false,\n    toGrid: undefined as any,\n    width: 40,\n  };\n\n  constructor(options: Partial<CrossGridRowMoveManagerOption>) {\n    this._options = Utils.extend(true, {}, this._defaults, options);\n    this._eventHandler = new SlickEventHandler();\n  }\n\n  init(grid: SlickGrid) {\n    this._grid = grid;\n    this._canvas = this._grid.getCanvasNode();\n    this._toGrid = this._options.toGrid;\n    this._toCanvas = this._toGrid.getCanvasNode();\n    Utils.addSlickEventPubSubWhenDefined(grid.getPubSubService(), this);\n\n    // user could override the expandable icon logic from within the options or after instantiating the plugin\n    if (typeof this._options?.usabilityOverride === 'function') {\n      this.usabilityOverride(this._options.usabilityOverride);\n    }\n\n    this._eventHandler\n      .subscribe(this._grid.onDragInit, this.handleDragInit.bind(this))\n      .subscribe(this._grid.onDragStart as any, this.handleDragStart.bind(this))\n      .subscribe(this._grid.onDrag, this.handleDrag.bind(this))\n      .subscribe(this._grid.onDragEnd, this.handleDragEnd.bind(this));\n  }\n\n  destroy() {\n    this._eventHandler.unsubscribeAll();\n  }\n\n  setOptions(newOptions: CrossGridRowMoveManagerOption) {\n    this._options = Utils.extend({}, this._options, newOptions);\n  }\n\n  protected handleDragInit(e: SlickEventData_) {\n    // prevent the grid from cancelling drag'n'drop by default\n    e.stopImmediatePropagation();\n  }\n\n  protected handleDragStart(e: SlickEventData_, dd: DragRowMove & { fromGrid: SlickGrid; toGrid: SlickGrid; }): boolean | void {\n    const cell = this._grid.getCellFromEvent(e) || { cell: -1, row: -1 };\n    const currentRow = cell?.row ?? 0;\n    const dataContext = this._grid.getDataItem(currentRow);\n\n    if (!this.checkUsabilityOverride(currentRow, dataContext, this._grid)) {\n      return;\n    }\n\n    if (this._options.cancelEditOnDrag && this._grid.getEditorLock().isActive()) {\n      this._grid.getEditorLock().cancelCurrentEdit();\n    }\n\n    if (this._grid.getEditorLock().isActive() || !this.isHandlerColumn(cell.cell)) {\n      return false;\n    }\n\n    this._dragging = true;\n    e.stopImmediatePropagation();\n\n    // optionally create a shadow element of the row so that we can see all the time which row exactly we're dragging\n    if (!this._options.hideRowMoveShadow) {\n      const cellNodeElm = this._grid.getCellNode(cell.row, cell.cell);\n      const slickRowElm = cellNodeElm?.closest('.slick-row');\n      if (slickRowElm) {\n        dd.clonedSlickRow = slickRowElm.cloneNode(true) as HTMLDivElement;\n        dd.clonedSlickRow.classList.add('slick-reorder-shadow-row');\n        dd.clonedSlickRow.style.display = 'none';\n        dd.clonedSlickRow.style.marginLeft = Number(this._options.rowMoveShadowMarginLeft || 0) + 'px';\n        dd.clonedSlickRow.style.marginTop = Number(this._options.rowMoveShadowMarginTop || 0) + 'px';\n        dd.clonedSlickRow.style.opacity = `${this._options.rowMoveShadowOpacity || 0.95}`;\n        dd.clonedSlickRow.style.transform = `scale(${this._options.rowMoveShadowScale || 0.75})`;\n        this._canvas.appendChild(dd.clonedSlickRow);\n      }\n    }\n\n    let selectedRows = this._options.singleRowMove ? [cell.row] : this._grid.getSelectedRows();\n    if (selectedRows.length === 0 || !selectedRows.some(selectedRow => selectedRow === cell.row)) {\n      selectedRows = [cell.row];\n      if (!this._options.disableRowSelection) {\n        this._grid.setSelectedRows(selectedRows);\n      }\n    }\n\n    selectedRows.sort((a, b) => a - b);\n\n    const rowHeight = this._grid.getOptions().rowHeight;\n\n    dd.fromGrid = this._grid;\n    dd.toGrid = this._toGrid;\n    dd.selectedRows = selectedRows;\n\n    dd.selectionProxy = document.createElement('div');\n    dd.selectionProxy.className = 'slick-reorder-proxy';\n    dd.selectionProxy.style.display = 'none';\n    dd.selectionProxy.style.position = 'absolute';\n    dd.selectionProxy.style.zIndex = '99999';\n    dd.selectionProxy.style.width = `${this._toCanvas.clientWidth}px`;\n    dd.selectionProxy.style.height = `${rowHeight! * selectedRows.length}px`;\n    this._toCanvas.appendChild(dd.selectionProxy);\n\n    dd.guide = document.createElement('div');\n    dd.guide.className = 'slick-reorder-guide';\n    dd.guide.style.position = 'absolute';\n    dd.guide.style.zIndex = '99999';\n    dd.guide.style.width = `${this._toCanvas.clientWidth}px`;\n    dd.guide.style.top = `-1000px`;\n    this._toCanvas.appendChild(dd.guide);\n\n    dd.insertBefore = -1;\n  }\n\n  protected handleDrag(evt: SlickEventData_, dd: DragRowMove): boolean | void {\n    if (!this._dragging) {\n      return;\n    }\n\n    evt.stopImmediatePropagation();\n    const e = evt.getNativeEvent<MouseEvent | TouchEvent>();\n\n    const targetEvent = (e as TouchEvent).touches?.[0] ?? e;\n    const top = targetEvent.pageY - (Utils.offset(this._toCanvas)?.top ?? 0);\n    dd.selectionProxy.style.top = `${top - 5}px`;\n    dd.selectionProxy.style.display = 'block';\n\n    // if the row move shadow is enabled, we'll also make it follow the mouse cursor\n    if (dd.clonedSlickRow) {\n      dd.clonedSlickRow.style.top = `${top - 6}px`;\n      dd.clonedSlickRow.style.display = 'block';\n    }\n\n    const insertBefore = Math.max(0, Math.min(Math.round(top / this._toGrid.getOptions().rowHeight!), this._toGrid.getDataLength()));\n    if (insertBefore !== dd.insertBefore) {\n      const eventData = {\n        fromGrid: this._grid,\n        toGrid: this._toGrid,\n        rows: dd.selectedRows,\n        insertBefore\n      };\n\n      if (this.onBeforeMoveRows.notify(eventData).getReturnValue() === false) {\n        dd.canMove = false;\n      } else {\n        dd.canMove = true;\n      }\n\n      // if there's a UsabilityOverride defined, we also need to verify that the condition is valid\n      if (this._usabilityOverride && dd.canMove) {\n        const insertBeforeDataContext = this._toGrid.getDataItem(insertBefore);\n        dd.canMove = this.checkUsabilityOverride(insertBefore, insertBeforeDataContext, this._toGrid);\n      }\n\n      // if the new target is possible we'll display the dark blue bar (representin the acceptability) at the target position\n      // else it won't show up (it will be off the screen)\n      if (!dd.canMove) {\n        dd.guide.style.top = '-1000px';\n      } else {\n        dd.guide.style.top = `${insertBefore * (this._toGrid.getOptions().rowHeight || 0)}px`;\n      }\n\n      dd.insertBefore = insertBefore;\n    }\n  }\n\n  protected handleDragEnd(e: SlickEventData_, dd: DragRowMove) {\n    if (!this._dragging) {\n      return;\n    }\n    this._dragging = false;\n    e.stopImmediatePropagation();\n\n    dd.guide?.remove();\n    dd.selectionProxy?.remove();\n    dd.clonedSlickRow?.remove();\n\n    if (dd.canMove) {\n      const eventData = {\n        fromGrid: this._grid,\n        toGrid: this._toGrid,\n        rows: dd.selectedRows,\n        insertBefore: dd.insertBefore\n      };\n      // TODO:  this._grid.remapCellCssClasses ?\n      this.onMoveRows.notify(eventData);\n    }\n  }\n\n  getColumnDefinition(): Column {\n    const columnId = String(this._options?.columnId ?? this._defaults.columnId);\n\n    return {\n      id: columnId,\n      name: '',\n      field: 'move',\n      behavior: 'selectAndMove',\n      excludeFromColumnPicker: true,\n      excludeFromGridMenu: true,\n      excludeFromHeaderMenu: true,\n      selectable: false,\n      resizable: false,\n      width: this._options.width || 40,\n      formatter: this.moveIconFormatter.bind(this)\n    };\n  }\n\n  protected moveIconFormatter(row: number, _cell: number, _val: any, _column: Column, dataContext: any, grid: SlickGrid): FormatterResultWithText | string {\n    if (!this.checkUsabilityOverride(row, dataContext, grid)) {\n      return '';\n    } else {\n      return { addClasses: `cell-reorder dnd ${this._options.cssClass || ''}`.trim(), text: '' };\n    }\n  }\n\n  protected checkUsabilityOverride(row: number, dataContext: any, grid: SlickGrid) {\n    if (typeof this._usabilityOverride === 'function') {\n      return this._usabilityOverride(row, dataContext, grid);\n    }\n    return true;\n  }\n\n  /**\n   * Method that user can pass to override the default behavior or making every row moveable.\n   * In order word, user can choose which rows to be an available as moveable (or not) by providing his own logic show/hide icon and usability.\n   * @param overrideFn: override function callback\n   */\n  usabilityOverride(overrideFn: UsabilityOverrideFn) {\n    this._usabilityOverride = overrideFn;\n  }\n\n  isHandlerColumn(columnIndex: number | string) {\n    return /move|selectAndMove/.test(this._grid.getColumns()[+columnIndex].behavior || '');\n  }\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  Utils.extend(true, window, {\n    Slick: {\n      CrossGridRowMoveManager: SlickCrossGridRowMoveManager\n    }\n  });\n}\n\n", "import type { CancellablePromiseWrapper, Column, CustomDataView, CustomTooltipOption, Formatter, FormatterResultWithHtml, FormatterResultWithText, GridOption } from '../models/index.js';\nimport { type SlickEventData, SlickEventHandler as SlickEventHandler_, Utils as Utils_ } from '../slick.core.js';\nimport type { SlickGrid } from '../slick.grid.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst SlickEventHandler = IIFE_ONLY ? Slick.EventHandler : SlickEventHandler_;\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\n/**\n * A plugin to add Custom Tooltip when hovering a cell, it subscribes to the cell \"onMouseEnter\" and \"onMouseLeave\" events.\n * The \"customTooltip\" is defined in the Column Definition OR Grid Options (the first found will have priority over the second)\n *\n * USAGE:\n *\n * Add the slick.customTooltip.(js|css) files and register it with the grid.\n *\n * To specify a tooltip when hovering a cell, extend the column definition like so:\n * const customTooltipPlugin = new Slick.Plugins.CustomTooltip(columns, grid options);\n *\n * Available plugin options (same options are available in both column definition and/or grid options)\n *\n * Example 1  - via Column Definition\n *  const columns = [\n *    {\n *      id: \"action\", name: \"Action\", field: \"action\", formatter: fakeButtonFormatter,\n *      customTooltip: {\n *        formatter: tooltipTaskFormatter,\n *        usabilityOverride: (args) => !!(args.dataContext.id % 2) // show it only every second row\n *      }\n *    }\n *  ];\n *\n *  OR Example 2 - via Grid Options (for all columns), NOTE: the column definition tooltip options will win over the options defined in the grid options\n *  const gridOptions = {\n *    enableCellNavigation: true,\n *    customTooltip: {\n *      formatter: tooltipTaskFormatter,\n *      usabilityOverride: (args) => !!(args.dataContext.id % 2) // show it only every second row\n *    },\n *  };\n *\n * Available options that can be defined from either a column definition or in grid options (column definition options as precendence)\n *   asyncParamsPropName:                 defaults to \"__params\", optionally change the property name that will be used to merge the data returned by the async method into the `dataContext` object\n *   asyncProcess:                        Async Post method returning a Promise, it must return an object with 1 or more properties. internally the data that will automatically be merged into the `dataContext` object under the `__params` property so that you can use it in your `asyncPostFormatter` formatter.\n *   asyncPostFormatter:                  Formatter to execute once the async process is completed, to displayed the actual text result (used when dealing with an Async API to get data to display later in the tooltip)\n *   hideArrow:                           defaults to False, should we hide the tooltip pointer arrow?\n *   className:                           defaults to \"slick-custom-tooltip\"\n *   formatter:                           Formatter to execute for displaying the data that will show in the tooltip. NOTE: when using `asyncProcess`, this formatter will be executed first and prior to the actual async process.\n *   headerFormatter:                     Formatter to execute when custom tooltip is over a header column\n *   headerRowFormatter:                  Formatter to execute when custom tooltip is over a heade row column (e.g. filter)\n *   maxHeight:                           optional maximum height number (in pixel) of the tooltip container\n *   maxWidth:                            optional maximum width number (in pixel) of the tooltip container\n *   offsetLeft:                          defaults to 0, optional left offset, it must be a positive/negative number (in pixel) that will be added to the offset position calculation of the tooltip container.\n *   offsetRight:                         defaults to 0, optional right offset, it must be a positive/negative number (in pixel) that will be added to the offset position calculation of the tooltip container.\n *   offsetTopBottom:                     defaults to 4, optional top or bottom offset (depending on which side it shows), it must be a positive/negative number (in pixel) that will be added to the offset position calculation of the tooltip container.\n *   position:                            defaults to \"auto\" (available options: 'auto' | 'top' | 'bottom' | 'left-align' | 'right-align'), allows to align the tooltip to the best logical position in the window, by default it will show on top left but if it calculates that it doesn't have enough space it will use bottom (same goes for each side align)\n *   regularTooltipWhiteSpace:            defaults to `pre-line`, optionally change the style `white-space` when displaying regular text tooltip. NOTE: when using a formatter it will use the `whiteSpace` setting instead\n *   whiteSpace:                          defaults to `normal`, optionally change the style `white-space` when displaying tooltip with formatter (tooltip or regular formatter)\n *   useRegularTooltip:                   defaults to False, when set to True it will try parse through the regular cell formatter and try to find a `title` attribute to show as a regular tooltip (also note: this has precedence over customTooltip formatter defined)\n *   useRegularTooltipFromFormatterOnly:  defaults to False, optionally force to retrieve the `title` from the Formatter result instead of the cell itself.\n *                                            for example, when used in combo with the AutoTooltip plugin we might want to force the tooltip to read the `title` attribute from the formatter result first instead of the cell itself,\n *                                            make the cell as a 2nd read, in other words check the formatter prior to the cell which the AutoTooltip might have filled.\n *   renderRegularTooltipAsHtml:          defaults to false, regular \"title\" tooltip won't be rendered as html unless specified via this flag (also \"\\r\\n\" will be replaced by <br>)\n *   tooltipTextMaxLength:                defaults to 700 (characters), when defined the text will be truncated to the max length characters provided\n *   usabilityOverride:                   callback method that user can override the default behavior of showing the tooltip. If it returns False, then the tooltip won't show\n *\n * @param options {Object} Custom Tooltip Options\n * @class Slick.Plugins.CustomTooltip\n * @constructor\n */\n\ntype CellType = 'slick-cell' | 'slick-header-column' | 'slick-headerrow-column';\n\n/**\n * CustomTooltip plugin to show/hide tooltips when columns are too narrow to fit content.\n * @constructor\n * @param {boolean} [options.className=\"slick-custom-tooltip\"]  - custom tooltip class name\n * @param {boolean} [options.offsetTop=5]                       - tooltip offset from the top\n */\nexport class SlickCustomTooltip {\n  // --\n  // public API\n  pluginName = 'CustomTooltip' as const;\n\n  // --\n  // protected props\n  protected _cancellablePromise?: CancellablePromiseWrapper;\n  protected _cellNodeElm?: HTMLDivElement;\n  protected _dataView?: CustomDataView | null;\n  protected _grid!: SlickGrid;\n  protected _gridOptions!: GridOption;\n  protected _tooltipElm?: HTMLDivElement;\n  protected _options!: CustomTooltipOption;\n  protected _defaults: CustomTooltipOption = {\n    className: 'slick-custom-tooltip',\n    offsetLeft: 0,\n    offsetRight: 0,\n    offsetTopBottom: 4,\n    hideArrow: false,\n    tooltipTextMaxLength: 700,\n    regularTooltipWhiteSpace: 'pre-line',\n    whiteSpace: 'normal',\n  };\n  protected _eventHandler = new SlickEventHandler();\n  protected _cellTooltipOptions!: CustomTooltipOption;\n\n  constructor(protected readonly tooltipOptions: Partial<CustomTooltipOption>) { }\n\n  /**\n   * Initialize plugin.\n   */\n  init(grid: SlickGrid) {\n    this._grid = grid;\n    const _data = grid?.getData() || [];\n    this._dataView = Array.isArray(_data) ? null : _data as CustomDataView;\n    this._gridOptions = (grid.getOptions() || {}) as GridOption;\n    this._options = Utils.extend(true, {}, this._defaults, this._gridOptions.customTooltip, this.tooltipOptions);\n    this._eventHandler\n      .subscribe(grid.onMouseEnter, this.handleOnMouseEnter.bind(this))\n      .subscribe(grid.onHeaderMouseEnter, (e, args) => this.handleOnHeaderMouseEnterByType(e, args, 'slick-header-column'))\n      .subscribe(grid.onHeaderRowMouseEnter, (e, args) => this.handleOnHeaderMouseEnterByType(e, args, 'slick-headerrow-column'))\n      .subscribe(grid.onMouseLeave, () => this.hideTooltip())\n      .subscribe(grid.onHeaderMouseLeave, () => this.hideTooltip())\n      .subscribe(grid.onHeaderRowMouseLeave, () => this.hideTooltip());\n  }\n\n  /**\n   * Destroy plugin.\n   */\n  destroy() {\n    this.hideTooltip();\n    this._eventHandler.unsubscribeAll();\n  }\n\n  /** depending on the selector type, execute the necessary handler code */\n  protected handleOnHeaderMouseEnterByType(e: SlickEventData, args: any, selector: CellType) {\n    // before doing anything, let's remove any previous tooltip before\n    // and cancel any opened Promise/Observable when using async\n    this.hideTooltip();\n\n    const cell = {\n      row: -1, // negative row to avoid pulling any dataContext while rendering\n      cell: this._grid.getColumns().findIndex((col) => args?.column?.id === col.id)\n    };\n    const columnDef = args.column;\n    const item = {};\n    const isHeaderRowType = selector === 'slick-headerrow-column';\n\n    // run the override function (when defined), if the result is false it won't go further\n    args = args || {};\n    args.cell = cell.cell;\n    args.row = cell.row;\n    args.columnDef = columnDef;\n    args.dataContext = item;\n    args.grid = this._grid;\n    args.type = isHeaderRowType ? 'header-row' : 'header';\n\n    this._cellTooltipOptions = Utils.extend(true, {}, this._options, columnDef.customTooltip);\n    if ((columnDef?.disableTooltip) || !this.runOverrideFunctionWhenExists<typeof args>(this._cellTooltipOptions.usabilityOverride, args)) {\n      return;\n    }\n\n    if (columnDef && e.target) {\n      this._cellNodeElm = (e.target as HTMLDivElement).closest(`.${selector}`) as HTMLDivElement;\n      const formatter = isHeaderRowType ? this._cellTooltipOptions.headerRowFormatter : this._cellTooltipOptions.headerFormatter;\n\n      if (this._cellTooltipOptions.useRegularTooltip || !formatter) {\n        const formatterOrText = !isHeaderRowType ? columnDef.name : this._cellTooltipOptions.useRegularTooltip ? null : formatter;\n        this.renderRegularTooltip(formatterOrText, cell, null, columnDef, item);\n      } else if (this._cellNodeElm && typeof formatter === 'function') {\n        this.renderTooltipFormatter(formatter, cell, null, columnDef, item);\n      }\n    }\n  }\n\n  /**\n   * Handle mouse entering grid cell to show tooltip.\n   * @param {jQuery.Event} e - The event\n   */\n  protected handleOnMouseEnter(e: SlickEventData, args: any) {\n    // before doing anything, let's remove any previous tooltip before\n    // and cancel any opened Promise/Observable when using async\n    this.hideTooltip();\n\n    if (this._grid && e) {\n      // get cell only when it's possible (ie, Composite Editor will not be able to get cell and so it will never show any tooltip)\n      const targetClassName = (event?.target as HTMLDivElement)?.closest('.slick-cell')?.className;\n      const cell = (targetClassName && /l\\d+/.exec(targetClassName || '')) ? this._grid.getCellFromEvent(e) : null;\n\n      if (cell) {\n        const item = this._dataView ? this._dataView.getItem(cell.row) : this._grid.getDataItem(cell.row);\n        const columnDef = this._grid.getColumns()[cell.cell];\n        this._cellNodeElm = this._grid.getCellNode(cell.row, cell.cell) as HTMLDivElement;\n        this._cellTooltipOptions = Utils.extend(true, {}, this._options, columnDef.customTooltip);\n\n        if (item && columnDef) {\n          // run the override function (when defined), if the result is false it won't go further\n          args = args || {};\n          args.cell = cell.cell;\n          args.row = cell.row;\n          args.columnDef = columnDef;\n          args.dataContext = item;\n          args.grid = this._grid;\n          args.type = 'cell';\n          if ((columnDef?.disableTooltip) || !this.runOverrideFunctionWhenExists<typeof args>(this._cellTooltipOptions.usabilityOverride, args)) {\n            return;\n          }\n\n          const value = item.hasOwnProperty(columnDef.field) ? item[columnDef.field] : null;\n\n          if (this._cellTooltipOptions.useRegularTooltip || !this._cellTooltipOptions.formatter) {\n            this.renderRegularTooltip(columnDef.formatter, cell, value, columnDef, item);\n          } else {\n            if (typeof this._cellTooltipOptions.formatter === 'function') {\n              this.renderTooltipFormatter(this._cellTooltipOptions.formatter, cell, value, columnDef, item);\n            }\n            if (typeof this._cellTooltipOptions.asyncProcess === 'function') {\n              const asyncProcess = this._cellTooltipOptions.asyncProcess(cell.row, cell.cell, value, columnDef, item, this._grid);\n              if (!this._cellTooltipOptions.asyncPostFormatter) {\n                throw new Error('[SlickGrid] when using \"asyncProcess\", you must also provide an \"asyncPostFormatter\" formatter');\n              }\n\n              if (asyncProcess instanceof Promise) {\n                // create a new cancellable promise which will resolve, unless it's cancelled, with the udpated `dataContext` object that includes the `this._this._params`\n                this._cancellablePromise = this.cancellablePromise(asyncProcess);\n                this._cancellablePromise.promise\n                  .then((asyncResult) => {\n                    this.asyncProcessCallback(asyncResult, cell, value, columnDef, item);\n                  })\n                  .catch(function (error) {\n                    // we will throw back any errors, unless it's a cancelled promise which in that case will be disregarded (thrown by the promise wrapper cancel() call)\n                    if (!(error.isPromiseCancelled)) {\n                      throw error;\n                    }\n                  });\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  protected findFirstElementAttribute(inputElm: Element | null | undefined, attributes: string[]): string | null {\n    if (inputElm) {\n      let outputAttrData: string | null = null;\n      attributes.forEach((attribute) => {\n        const attrData = inputElm.getAttribute(attribute);\n        if (attrData) {\n          outputAttrData = attrData;\n        }\n      });\n      return outputAttrData;\n    }\n    return null;\n  }\n\n  /**\n   * Parse the cell formatter and assume it might be html\n   * then create a temporary html element to easily retrieve the first [title=\"\"] attribute text content\n   * also clear the \"title\" attribute from the grid div text content so that it won't show also as a 2nd browser tooltip\n   */\n  protected renderRegularTooltip(formatterOrText: Formatter | string | undefined, cell: { row: number; cell: number; }, value: any, columnDef: Column, item: any) {\n    const tmpDiv = document.createElement('div');\n    this._grid.applyHtmlCode(tmpDiv, this.parseFormatterAndSanitize(formatterOrText, cell, value, columnDef, item));\n    let tooltipText = columnDef.toolTip || '';\n    let tmpTitleElm;\n\n    if (!tooltipText) {\n      if ((this._cellNodeElm && (this._cellNodeElm.clientWidth < this._cellNodeElm.scrollWidth)) && !this._cellTooltipOptions.useRegularTooltipFromFormatterOnly) {\n        tooltipText = (this._cellNodeElm.textContent || '').trim() || '';\n        if (this._cellTooltipOptions.tooltipTextMaxLength && (tooltipText.length > this._cellTooltipOptions.tooltipTextMaxLength)) {\n          tooltipText = tooltipText.substring(0, this._cellTooltipOptions.tooltipTextMaxLength - 3) + '...';\n        }\n        tmpTitleElm = this._cellNodeElm;\n      } else {\n        if (this._cellTooltipOptions.useRegularTooltipFromFormatterOnly) {\n          tmpTitleElm = tmpDiv.querySelector('[title], [data-slick-tooltip]');\n        } else {\n          tmpTitleElm = this.findFirstElementAttribute(this._cellNodeElm, ['title', 'data-slick-tooltip']) ? this._cellNodeElm : tmpDiv.querySelector('[title], [data-slick-tooltip]');\n          if ((!tmpTitleElm || !this.findFirstElementAttribute(tmpTitleElm, ['title', 'data-slick-tooltip'])) && this._cellNodeElm) {\n            tmpTitleElm = this._cellNodeElm.querySelector('[title], [data-slick-tooltip]');\n          }\n        }\n        if (!tooltipText || (typeof formatterOrText === 'function' && this._cellTooltipOptions.useRegularTooltipFromFormatterOnly)) {\n          tooltipText = this.findFirstElementAttribute(tmpTitleElm, ['title', 'data-slick-tooltip']) || '';\n        }\n      }\n    }\n\n    if (tooltipText !== '') {\n      this.renderTooltipFormatter(formatterOrText, cell, value, columnDef, item, tooltipText);\n    }\n\n    // also clear any \"title\" attribute to avoid showing a 2nd browser tooltip\n    this.swapAndClearTitleAttribute(tmpTitleElm, tooltipText);\n  }\n\n  /**\n * swap and copy the \"title\" attribute into a new custom attribute then clear the \"title\" attribute\n * from the grid div text content so that it won't show also as a 2nd browser tooltip\n */\n  protected swapAndClearTitleAttribute(inputTitleElm?: Element | null, tooltipText?: string) {\n    // the title attribute might be directly on the slick-cell container element (when formatter returns a result object)\n    // OR in a child element (most commonly as a custom formatter)\n    const titleElm = inputTitleElm || (this._cellNodeElm && ((this._cellNodeElm.hasAttribute('title') && this._cellNodeElm.getAttribute('title')) ? this._cellNodeElm : this._cellNodeElm.querySelector('[title]')));\n\n    // flip tooltip text from `title` to `data-slick-tooltip`\n    if (titleElm && tooltipText) {\n      titleElm.setAttribute('data-slick-tooltip', tooltipText || '');\n      if (titleElm.hasAttribute('title')) {\n        titleElm.setAttribute('title', '');\n      }\n    }\n  }\n\n  protected asyncProcessCallback(asyncResult: any, cell: { row: number, cell: number }, value: any, columnDef: Column, dataContext: any) {\n    this.hideTooltip();\n    const itemWithAsyncData = Utils.extend(true, {}, dataContext, { [this._cellTooltipOptions.asyncParamsPropName || '__params']: asyncResult });\n    this.renderTooltipFormatter(this._cellTooltipOptions.asyncPostFormatter, cell, value, columnDef, itemWithAsyncData);\n  }\n\n  protected cancellablePromise<T = any>(inputPromise: Promise<T>): CancellablePromiseWrapper<T> {\n    let hasCancelled = false;\n\n    if (inputPromise instanceof Promise) {\n      return {\n        promise: inputPromise.then(function (result) {\n          if (hasCancelled) {\n            throw { isPromiseCancelled: true };\n          }\n          return result;\n        }),\n        cancel: () => hasCancelled = true\n      };\n    }\n    return inputPromise;\n  }\n\n  protected getHtmlElementOffset(element?: HTMLElement | null) {\n    if (!element) {\n      return undefined;\n    }\n    const rect = element.getBoundingClientRect();\n    let left = 0;\n    let top = 0;\n    let bottom = 0;\n    let right = 0;\n\n    if (rect.top !== undefined && rect.left !== undefined) {\n      top = rect.top + window.pageYOffset;\n      left = rect.left + window.pageXOffset;\n      right = rect.right;\n      bottom = rect.bottom;\n    }\n    return { top, left, bottom, right };\n  }\n\n  /**\n   * hide (remove) tooltip from the DOM,\n   * when using async process, it will also cancel any opened Promise/Observable that might still be opened/pending.\n   */\n  hideTooltip() {\n    this._cancellablePromise?.cancel();\n    const prevTooltip = document.body.querySelector(`.${this._cellTooltipOptions?.className ?? this._defaults.className}.${this._grid.getUID()}`);\n    prevTooltip?.remove();\n  }\n\n  /**\n   * Reposition the Tooltip to be top-left position over the cell.\n   * By default we use an \"auto\" mode which will allow to position the Tooltip to the best logical position in the window, also when we mention position, we are talking about the relative position against the grid cell.\n   * We can assume that in 80% of the time the default position is top-right, the default is \"auto\" but we can also override it and use a specific position.\n   * Most of the time positioning of the tooltip will be to the \"top-right\" of the cell is ok but if our column is completely on the right side then we'll want to change the position to \"left\" align.\n   * Same goes for the top/bottom position, Most of the time positioning the tooltip to the \"top\" but if we are hovering a cell at the top of the grid and there's no room to display it then we might need to reposition to \"bottom\" instead.\n   */\n  protected reposition(cell: { row: number; cell: number; }) {\n    if (this._tooltipElm) {\n      this._cellNodeElm = (this._cellNodeElm || this._grid.getCellNode(cell.row, cell.cell)) as HTMLDivElement;\n      const cellPosition = this.getHtmlElementOffset(this._cellNodeElm);\n      const cellContainerWidth = this._cellNodeElm.offsetWidth;\n      const calculatedTooltipHeight = this._tooltipElm.getBoundingClientRect().height;\n      const calculatedTooltipWidth = this._tooltipElm.getBoundingClientRect().width;\n      const calculatedBodyWidth = document.body.offsetWidth || window.innerWidth;\n\n      // first calculate the default (top/left) position\n      let newPositionTop = (cellPosition?.top || 0) - this._tooltipElm.offsetHeight - (this._cellTooltipOptions.offsetTopBottom ?? 0);\n      let newPositionLeft = (cellPosition?.left || 0) - (this._cellTooltipOptions.offsetRight ?? 0);\n\n      // user could explicitely use a \"left-align\" arrow position, (when user knows his column is completely on the right in the grid)\n      // or when using \"auto\" and we detect not enough available space then we'll position to the \"left\" of the cell\n      const position = this._cellTooltipOptions.position || 'auto';\n      if (position === 'center') {\n        newPositionLeft += (cellContainerWidth / 2) - (calculatedTooltipWidth / 2) + (this._cellTooltipOptions.offsetRight || 0);\n        this._tooltipElm.classList.remove('arrow-left-align');\n        this._tooltipElm.classList.remove('arrow-right-align');\n        this._tooltipElm.classList.add('arrow-center-align');\n\n      } else if (position === 'right-align' || ((position === 'auto' || position !== 'left-align') && (newPositionLeft + calculatedTooltipWidth) > calculatedBodyWidth)) {\n        newPositionLeft -= (calculatedTooltipWidth - cellContainerWidth - (this._cellTooltipOptions.offsetLeft || 0));\n        this._tooltipElm.classList.remove('arrow-center-align');\n        this._tooltipElm.classList.remove('arrow-left-align');\n        this._tooltipElm.classList.add('arrow-right-align');\n      } else {\n        this._tooltipElm.classList.remove('arrow-center-align');\n        this._tooltipElm.classList.remove('arrow-right-align');\n        this._tooltipElm.classList.add('arrow-left-align');\n      }\n\n      // do the same calculation/reposition with top/bottom (default is top of the cell or in other word starting from the cell going down)\n      if (position === 'bottom' || (position === 'auto' && calculatedTooltipHeight > Utils.calculateAvailableSpace(this._cellNodeElm).top)) {\n        newPositionTop = (cellPosition?.top || 0) + (this._gridOptions.rowHeight || 0) + (this._cellTooltipOptions.offsetTopBottom || 0);\n        this._tooltipElm.classList.remove('arrow-down');\n        this._tooltipElm.classList.add('arrow-up');\n      } else {\n        this._tooltipElm.classList.add('arrow-down');\n        this._tooltipElm.classList.remove('arrow-up');\n      }\n\n      // reposition the tooltip over the cell (90% of the time this will end up using a position on the \"right\" of the cell)\n      this._tooltipElm.style.top = newPositionTop + 'px';\n      this._tooltipElm.style.left = newPositionLeft + 'px';\n    }\n  }\n\n  /**\n   * Parse the Custom Formatter (when provided) or return directly the text when it is already a string.\n   * We will also sanitize the text in both cases before returning it so that it can be used safely.\n   */\n  protected parseFormatterAndSanitize(formatterOrText: Formatter | string | undefined, cell: { row: number; cell: number; }, value: any, columnDef: Column, item: unknown): string | HTMLElement {\n    if (typeof formatterOrText === 'function') {\n      const tooltipResult = formatterOrText(cell.row, cell.cell, value, columnDef, item, this._grid);\n      const formatterText = (Object.prototype.toString.call(tooltipResult) !== '[object Object]' ? tooltipResult : (tooltipResult as FormatterResultWithHtml).html || (tooltipResult as FormatterResultWithText).text);\n      if (formatterText instanceof HTMLElement) {\n        return formatterText;\n      }\n      return this._grid.sanitizeHtmlString(formatterText as string);\n    } else if (typeof formatterOrText === 'string') {\n      return this._grid.sanitizeHtmlString(formatterOrText);\n    }\n    return '';\n  }\n\n\n  protected renderTooltipFormatter(formatter: Formatter | string | undefined, cell: { row: number; cell: number; }, value: any, columnDef: Column, item: unknown, tooltipText?: string, inputTitleElm?: Element | null) {\n    // create the tooltip DOM element with the text returned by the Formatter\n    this._tooltipElm = document.createElement('div');\n    this._tooltipElm.className = (this._cellTooltipOptions.className || this._defaults.className) as string;\n    this._tooltipElm.classList.add(this._grid.getUID());\n    this._tooltipElm.classList.add('l' + cell.cell);\n    this._tooltipElm.classList.add('r' + cell.cell);\n    let outputText = tooltipText || this.parseFormatterAndSanitize(formatter, cell, value, columnDef, item) || '';\n    if (outputText instanceof HTMLElement) {\n      const content = outputText.textContent || '';\n      if (this._cellTooltipOptions.tooltipTextMaxLength && content.length > this._cellTooltipOptions.tooltipTextMaxLength) {\n        outputText.textContent = content.substring(0, this._cellTooltipOptions.tooltipTextMaxLength - 3) + '...';\n      }\n    } else {\n      outputText = (this._cellTooltipOptions.tooltipTextMaxLength && outputText.length > this._cellTooltipOptions.tooltipTextMaxLength) ? outputText.substring(0, this._cellTooltipOptions.tooltipTextMaxLength - 3) + '...' : outputText;\n    }\n\n    let finalOutputText = '';\n    if (!tooltipText || (this._cellTooltipOptions?.renderRegularTooltipAsHtml)) {\n      if (outputText instanceof HTMLElement) {\n        this._grid.applyHtmlCode(this._tooltipElm, outputText);\n        finalOutputText = this._grid.sanitizeHtmlString(outputText.textContent || '');\n      } else {\n        finalOutputText = this._grid.sanitizeHtmlString(outputText);\n        this._tooltipElm.innerHTML = finalOutputText;\n      }\n      this._tooltipElm.style.whiteSpace = this._cellTooltipOptions?.whiteSpace ?? this._defaults.whiteSpace as string;\n    } else {\n      finalOutputText = (outputText instanceof HTMLElement ? outputText.textContent : outputText) || '';\n      this._tooltipElm.textContent = finalOutputText;\n      this._tooltipElm.style.whiteSpace = this._cellTooltipOptions?.regularTooltipWhiteSpace ?? this._defaults.regularTooltipWhiteSpace as string; // use `pre` so that sequences of white space are collapsed. Lines are broken at newline characters\n    }\n\n    // optional max height/width of the tooltip container\n    if (this._cellTooltipOptions.maxHeight) {\n      this._tooltipElm.style.maxHeight = this._cellTooltipOptions.maxHeight + 'px';\n    }\n    if (this._cellTooltipOptions.maxWidth) {\n      this._tooltipElm.style.maxWidth = this._cellTooltipOptions.maxWidth + 'px';\n    }\n\n    // when do have text to show, then append the new tooltip to the html body & reposition the tooltip\n    if (finalOutputText) {\n      document.body.appendChild(this._tooltipElm);\n\n      // reposition the tooltip on top of the cell that triggered the mouse over event\n      this.reposition(cell);\n\n      // user could optionally hide the tooltip arrow (we can simply update the CSS variables, that's the only way we have to update CSS pseudo)\n      if (!this._cellTooltipOptions.hideArrow) {\n        this._tooltipElm.classList.add('tooltip-arrow');\n      }\n\n      // also clear any \"title\" attribute to avoid showing a 2nd browser tooltip\n      this.swapAndClearTitleAttribute(inputTitleElm, (outputText instanceof HTMLElement ? outputText.textContent : outputText) || '');\n    }\n  }\n\n  /**\n   * Method that user can pass to override the default behavior.\n   * In order word, user can choose or an item is (usable/visible/enable) by providing his own logic.\n   * @param overrideFn: override function callback\n   * @param args: multiple arguments provided to the override (cell, row, columnDef, dataContext, grid)\n   */\n  protected runOverrideFunctionWhenExists<T = any>(overrideFn: ((args: any) => boolean) | undefined, args: T): boolean {\n    if (typeof overrideFn === 'function') {\n      return overrideFn.call(this, args);\n    }\n    return true;\n  }\n\n  setOptions(newOptions: Partial<CustomTooltipOption>) {\n    this._options = Utils.extend({}, this._options, newOptions);\n  }\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  Utils.extend(true, window, {\n    Slick: {\n      Plugins: {\n        CustomTooltip: SlickCustomTooltip\n      }\n    }\n  });\n}\n", "// @ts-ignore\nimport type { SortableEvent, SortableInstance, SortableOptions } from 'sortablejs';\n\nimport type { Column, DOMMouseOrTouchEvent, DraggableGroupingOption, Grouping, GroupingGetterFunction } from '../models/index.js';\nimport { BindingEventService as BindingEventService_, SlickEvent as SlickEvent_, SlickEventHandler as SlickEventHandler_, Utils as Utils_ } from '../slick.core.js';\nimport type { SlickDataView } from '../slick.dataview.js';\nimport type { SlickGrid } from '../slick.grid.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst BindingEventService = IIFE_ONLY ? Slick.BindingEventService : BindingEventService_;\nconst SlickEvent = IIFE_ONLY ? Slick.Event : SlickEvent_;\nconst SlickEventHandler = IIFE_ONLY ? Slick.EventHandler : SlickEventHandler_;\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\n/**\n *\n * Draggable Grouping contributed by:  Muthukumar Selvarasu\n *  muthukumar{dot}se{at}gmail{dot}com\n *  github.com/muthukumarse/Slickgrid\n *\n * NOTES:\n *     This plugin provides the Draggable Grouping feature which could be located in either the Top-Header or the Pre-Header\n * A plugin to add Draggable Grouping feature.\n *\n * USAGE:\n *\n * Add the plugin .js & .css files and register it with the grid.\n *\n *\n * The plugin expose the following methods:\n *    destroy: used to destroy the plugin\n *    setDroppedGroups: provide option to set default grouping on loading\n *    clearDroppedGroups: provide option to clear grouping\n *    getSetupColumnReorder: its function to setup draggable feature agains Header Column, should be passed on grid option. Also possible to pass custom function\n *\n *\n * The plugin expose the following event(s):\n *    onGroupChanged: pass the grouped columns to who subscribed.\n *\n */\nexport class SlickDraggableGrouping {\n  // --\n  // public API\n  pluginName = 'DraggableGrouping' as const;\n  onGroupChanged = new SlickEvent<{ caller?: string; groupColumns: Grouping[]; }>('onGroupChanged');\n\n  // --\n  // protected props\n  protected _grid!: SlickGrid;\n  protected _gridUid = '';\n  protected _gridColumns: Column[] = [];\n  protected _dataView!: SlickDataView;\n  protected _dropzoneElm!: HTMLDivElement;\n  protected _droppableInstance?: SortableInstance;\n  protected _dropzonePlaceholder!: HTMLDivElement;\n  protected _groupToggler?: HTMLDivElement;\n  protected _isInitialized = false;\n  protected _options: DraggableGroupingOption;\n  protected _defaults: DraggableGroupingOption = {\n    dropPlaceHolderText: 'Drop a column header here to group by the column',\n    hideGroupSortIcons: false,\n    hideToggleAllButton: false,\n    toggleAllButtonText: '',\n    toggleAllPlaceholderText: 'Toggle all Groups',\n  };\n  protected _bindingEventService = new BindingEventService();\n  protected _handler = new SlickEventHandler();\n  protected _sortableLeftInstance?: SortableInstance;\n  protected _sortableRightInstance?: SortableInstance;\n  protected _columnsGroupBy: Column[] = [];\n\n  /**\n   * @param options {Object} Options:\n   *    deleteIconCssClass:  an extra CSS class to add to the delete button (default undefined), if deleteIconCssClass && deleteIconImage undefined then slick-groupby-remove-image class will be added\n   *    deleteIconImage:     a url to the delete button image (default undefined)\n   *    groupIconCssClass:   an extra CSS class to add to the grouping field hint  (default undefined)\n   *    groupIconImage:      a url to the grouping field hint image (default undefined)\n   *    dropPlaceHolderText:      option to specify set own placeholder note text\n   */\n  constructor(options: Partial<DraggableGroupingOption>) {\n    this._options = Utils.extend(true, {}, this._defaults, options);\n  }\n\n  /**\n   * Initialize plugin.\n   */\n  init(grid: SlickGrid) {\n    this._grid = grid;\n    Utils.addSlickEventPubSubWhenDefined(grid.getPubSubService(), this);\n\n    this._gridUid = this._grid.getUID();\n    this._gridColumns = this._grid.getColumns();\n    this._dataView = this._grid.getData();\n    this._dropzoneElm = this._grid.getTopHeaderPanel() || this._grid.getPreHeaderPanel();\n    if (!this._dropzoneElm) {\n      throw new Error(\n        '[Slickgrid] Draggable Grouping requires the pre-header to be created and shown for the plugin to work correctly (use `createPreHeaderPanel` and `showPreHeaderPanel`).'\n      );\n    }\n    this._dropzoneElm.classList.add('slick-dropzone');\n\n    const dropPlaceHolderText = this._options.dropPlaceHolderText || 'Drop a column header here to group by the column';\n\n    this._dropzonePlaceholder = document.createElement('div');\n    this._dropzonePlaceholder.className = 'slick-placeholder';\n    this._dropzonePlaceholder.textContent = dropPlaceHolderText;\n\n    this._groupToggler = document.createElement('div');\n    this._groupToggler.className = 'slick-group-toggle-all expanded';\n    this._groupToggler.style.display = 'none';\n\n    this._dropzoneElm.appendChild(this._dropzonePlaceholder);\n    this._dropzoneElm.appendChild(this._groupToggler);\n\n    this.setupColumnDropbox();\n\n\n    this._handler.subscribe(this._grid.onHeaderCellRendered, (_e, args) => {\n      const column = args.column;\n      const node = args.node;\n      if (!Utils.isEmptyObject(column.grouping) && node) {\n        node.style.cursor = 'pointer'; // add the pointer cursor on each column title\n\n        // also optionally add an icon beside each column title that can be dragged\n        if (this._options.groupIconCssClass || this._options.groupIconImage) {\n          const groupableIconElm = document.createElement('span');\n          groupableIconElm.className = 'slick-column-groupable';\n          if (this._options.groupIconCssClass) {\n            groupableIconElm.classList.add(...Utils.classNameToList(this._options.groupIconCssClass));\n          }\n          if (this._options.groupIconImage) {\n            groupableIconElm.style.background = `url(${this._options.groupIconImage}) no-repeat center center`;\n          }\n          node.appendChild(groupableIconElm);\n        }\n      }\n    });\n\n    for (let i = 0; i < this._gridColumns.length; i++) {\n      const columnId = this._gridColumns[i].field;\n      this._grid.updateColumnHeader(columnId);\n    }\n  }\n\n  /**\n   * Setup the column reordering\n   * NOTE: this function is a standalone function and is called externally and does not have access to `this` instance\n   * @param grid - slick grid object\n   * @param headers - slick grid column header elements\n   * @param _headerColumnWidthDiff - header column width difference\n   * @param setColumns - callback to reassign columns\n   * @param setupColumnResize - callback to setup the column resize\n   * @param columns - columns array\n   * @param getColumnIndex - callback to find index of a column\n   * @param uid - grid UID\n   * @param trigger - callback to execute when triggering a column grouping\n   */\n  getSetupColumnReorder(grid: SlickGrid, headers: any, _headerColumnWidthDiff: any, setColumns: (columns: Column[]) => void, setupColumnResize: () => void, _columns: Column[], getColumnIndex: (columnId: string) => number, _uid: string, trigger: (slickEvent: SlickEvent_, data?: any) => void) {\n    this.destroySortableInstances();\n    const dropzoneElm = grid.getTopHeaderPanel() || grid.getPreHeaderPanel();\n    const groupTogglerElm = dropzoneElm.querySelector<HTMLDivElement>('.slick-group-toggle-all');\n\n    const sortableOptions = {\n      animation: 50,\n      // chosenClass: 'slick-header-column-active',\n      ghostClass: 'slick-sortable-placeholder',\n      draggable: '.slick-header-column',\n      dataIdAttr: 'data-id',\n      group: {\n        name: 'shared',\n        pull: 'clone',\n        put: false,\n      },\n      revertClone: true,\n      // filter: function (_e, target) {\n      //   // block column from being able to be dragged if it's already a grouped column\n      //   // NOTE: need to disable for now since it also blocks the column reordering\n      //   return this.columnsGroupBy.some(c => c.id === target.getAttribute('data-id'));\n      // },\n      onStart: (e: SortableEvent) => {\n        e.item.classList.add('slick-header-column-active');\n        dropzoneElm.classList.add('slick-dropzone-hover');\n        dropzoneElm.classList.add('slick-dropzone-placeholder-hover');\n        const draggablePlaceholderElm = dropzoneElm.querySelector<HTMLDivElement>('.slick-placeholder');\n        if (draggablePlaceholderElm) {\n          draggablePlaceholderElm.style.display = 'inline-block';\n        }\n\n        const droppedGroupingElms = dropzoneElm.querySelectorAll<HTMLDivElement>('.slick-dropped-grouping');\n        droppedGroupingElms.forEach(droppedGroupingElm => droppedGroupingElm.style.display = 'none');\n        if (groupTogglerElm) {\n          groupTogglerElm.style.display = 'none';\n        }\n      },\n      onEnd: (e: SortableEvent) => {\n        e.item.classList.remove('slick-header-column-active');\n        const draggablePlaceholderElm = dropzoneElm.querySelector<HTMLDivElement>('.slick-placeholder');\n        dropzoneElm.classList.remove('slick-dropzone-hover');\n        draggablePlaceholderElm?.classList.remove('slick-dropzone-placeholder-hover');\n\n\n        if (this._dropzonePlaceholder) {\n          this._dropzonePlaceholder.style.display = 'none';\n        }\n        if (draggablePlaceholderElm) {\n          draggablePlaceholderElm.parentElement?.classList.remove('slick-dropzone-placeholder-hover');\n        }\n\n        const droppedGroupingElms = dropzoneElm.querySelectorAll<HTMLDivElement>('.slick-dropped-grouping');\n        if (droppedGroupingElms.length) {\n          droppedGroupingElms.forEach(droppedGroupingElm => droppedGroupingElm.style.display = 'inline-flex');\n          if (draggablePlaceholderElm) {\n            draggablePlaceholderElm.style.display = 'none';\n          }\n          if (groupTogglerElm) {\n            groupTogglerElm.style.display = 'inline-block';\n          }\n        }\n\n        if (!grid.getEditorLock().commitCurrentEdit()) {\n          return;\n        }\n\n        const reorderedIds = this._sortableLeftInstance?.toArray() ?? [];\n\n        // when frozen columns are used, headers has more than one entry and we need the ids from all of them.\n        // though there is only really a left and right header, this will work even if that should change.\n        if (headers.length > 1) {\n          const ids = this._sortableRightInstance?.toArray() ?? [];\n\n          // Note: the loop below could be simplified with:\n          // reorderedIds.push.apply(reorderedIds,ids);\n          // However, the loop is more in keeping with way-backward compatibility\n          for (const id of ids) {\n            reorderedIds.push(id);\n          }\n        }\n\n        const finalReorderedColumns: Column[] = [];\n        const reorderedColumns = grid.getColumns();\n        for (const reorderedId of reorderedIds) {\n          finalReorderedColumns.push(reorderedColumns[getColumnIndex.call(grid, reorderedId)]);\n        }\n        setColumns.call(grid, finalReorderedColumns);\n        trigger.call(grid, grid.onColumnsReordered, { grid, impactedColumns: finalReorderedColumns });\n        e.stopPropagation();\n        setupColumnResize.call(grid);\n      }\n    } as SortableOptions;\n\n    this._sortableLeftInstance = Sortable.create(document.querySelector(`.${grid.getUID()} .slick-header-columns.slick-header-columns-left`) as HTMLDivElement, sortableOptions);\n    this._sortableRightInstance = Sortable.create(document.querySelector(`.${grid.getUID()} .slick-header-columns.slick-header-columns-right`) as HTMLDivElement, sortableOptions);\n\n    // user can optionally provide initial groupBy columns\n    if (this._options.initialGroupBy && !this._isInitialized) {\n      setTimeout(() => this.setDroppedGroups(this._options.initialGroupBy || []), 0);\n    }\n    this._isInitialized = true;\n\n    return {\n      sortableLeftInstance: this._sortableLeftInstance,\n      sortableRightInstance: this._sortableRightInstance\n    };\n  }\n\n  /**\n   * Destroy plugin.\n   */\n  destroy() {\n    this.destroySortableInstances();\n    if (this._droppableInstance?.el) {\n      this._droppableInstance?.destroy();\n    }\n    this.onGroupChanged.unsubscribe();\n    this._handler.unsubscribeAll();\n    this._bindingEventService.unbindAll();\n    Utils.emptyElement(document.querySelector(`.${this._gridUid} .slick-preheader-panel,.${this._gridUid} .slick-topheader-panel`));\n  }\n\n  protected destroySortableInstances() {\n    if (this._sortableLeftInstance?.el) {\n      this._sortableLeftInstance?.destroy();\n    }\n    if (this._sortableRightInstance?.el) {\n      this._sortableRightInstance?.destroy();\n    }\n  }\n\n  protected addDragOverDropzoneListeners() {\n    const draggablePlaceholderElm = this._dropzoneElm.querySelector('.slick-placeholder');\n\n    if (draggablePlaceholderElm && this._dropzoneElm) {\n      this._bindingEventService.bind(draggablePlaceholderElm, 'dragover', (e) => e.preventDefault());\n      this._bindingEventService.bind(draggablePlaceholderElm, 'dragenter', () => this._dropzoneElm.classList.add('slick-dropzone-hover'));\n      this._bindingEventService.bind(draggablePlaceholderElm, 'dragleave', () => this._dropzoneElm.classList.remove('slick-dropzone-hover'));\n    }\n  }\n\n  protected setupColumnDropbox() {\n    const dropzoneElm = this._dropzoneElm;\n\n    this._droppableInstance = Sortable.create(dropzoneElm, {\n      group: 'shared',\n      // chosenClass: 'slick-header-column-active',\n      ghostClass: 'slick-droppable-sortitem-hover',\n      draggable: '.slick-dropped-grouping',\n      dragoverBubble: true,\n      onAdd: (evt: MouseEvent & { item: any; clone: HTMLElement; originalEvent: MouseEvent; }) => {\n        const el = evt.item;\n        const elId = el.getAttribute('id');\n        if (elId?.replace(this._gridUid, '')) {\n          this.handleGroupByDrop(dropzoneElm, (Sortable.utils).clone(evt.item));\n        }\n        evt.clone.style.opacity = '.5';\n        el.parentNode?.removeChild(el);\n      },\n      onUpdate: () => {\n        const sortArray = this._droppableInstance?.toArray() ?? [];\n        const newGroupingOrder: Column[] = [];\n        for (let i = 0, l = sortArray.length; i < l; i++) {\n          for (let a = 0, b = this._columnsGroupBy.length; a < b; a++) {\n            if (this._columnsGroupBy[a].id === sortArray[i]) {\n              newGroupingOrder.push(this._columnsGroupBy[a]);\n              break;\n            }\n          }\n        }\n        this._columnsGroupBy = newGroupingOrder;\n        this.updateGroupBy('sort-group');\n      },\n    });\n\n    // Sortable doesn't have onOver, we need to implement it ourselves\n    this.addDragOverDropzoneListeners();\n\n    if (this._groupToggler) {\n      this._bindingEventService.bind(this._groupToggler, 'click', ((event: DOMMouseOrTouchEvent<HTMLDivElement>) => {\n        const target = event.target;\n        this.toggleGroupToggler(target, target?.classList.contains('expanded'));\n      }) as EventListener);\n    }\n  }\n\n  protected handleGroupByDrop(containerElm: HTMLDivElement, headerColumnElm: HTMLDivElement) {\n    const headerColDataId = headerColumnElm.getAttribute('data-id');\n    const columnId = headerColDataId?.replace(this._gridUid, '');\n    let columnAllowed = true;\n    for (const colGroupBy of this._columnsGroupBy) {\n      if (colGroupBy.id === columnId) {\n        columnAllowed = false;\n      }\n    }\n\n    if (columnAllowed) {\n      for (const col of this._gridColumns) {\n        if (col.id === columnId && col.grouping && !Utils.isEmptyObject(col.grouping)) {\n          const columnNameElm = headerColumnElm.querySelector('.slick-column-name');\n          const entryElm = document.createElement('div');\n          entryElm.id = `${this._gridUid}_${col.id}_entry`;\n          entryElm.className = 'slick-dropped-grouping';\n          entryElm.dataset.id = `${col.id}`;\n\n          const groupTextElm = document.createElement('div');\n          groupTextElm.className = 'slick-dropped-grouping-title';\n          groupTextElm.style.display = 'inline-flex';\n          groupTextElm.textContent = columnNameElm ? columnNameElm.textContent : headerColumnElm.textContent;\n          entryElm.appendChild(groupTextElm);\n\n          // delete icon\n          const groupRemoveIconElm = document.createElement('div');\n          groupRemoveIconElm.className = 'slick-groupby-remove';\n          if (this._options.deleteIconCssClass) {\n            groupRemoveIconElm.classList.add(...Utils.classNameToList(this._options.deleteIconCssClass));\n          }\n          if (this._options.deleteIconImage) {\n            groupRemoveIconElm.classList.add(...Utils.classNameToList(this._options.deleteIconImage));\n          }\n          if (!this._options.deleteIconCssClass) {\n            groupRemoveIconElm.classList.add('slick-groupby-remove-icon');\n          }\n          if (!this._options.deleteIconCssClass && !this._options.deleteIconImage) {\n            groupRemoveIconElm.classList.add('slick-groupby-remove-image');\n          }\n\n          // sorting icons when enabled\n          if (this._options?.hideGroupSortIcons !== true && col.sortable) {\n            if (col.grouping?.sortAsc === undefined) {\n              col.grouping.sortAsc = true;\n            }\n          }\n\n          entryElm.appendChild(groupRemoveIconElm);\n          entryElm.appendChild(document.createElement('div'));\n          containerElm.appendChild(entryElm);\n\n          this.addColumnGroupBy(col);\n          this.addGroupByRemoveClickHandler(col.id, groupRemoveIconElm, headerColumnElm, entryElm);\n        }\n      }\n\n      // show the \"Toggle All\" when feature is enabled\n      if (this._groupToggler && this._columnsGroupBy.length > 0) {\n        this._groupToggler.style.display = 'inline-block';\n      }\n    }\n  }\n\n  protected addColumnGroupBy(column: Column) {\n    this._columnsGroupBy.push(column);\n    this.updateGroupBy('add-group');\n  }\n\n  protected addGroupByRemoveClickHandler(id: string | number, groupRemoveIconElm: HTMLDivElement, headerColumnElm: HTMLDivElement, entry: any) {\n    this._bindingEventService.bind(groupRemoveIconElm, 'click', () => {\n      const boundedElms = this._bindingEventService.getBoundedEvents().filter(boundedEvent => boundedEvent.element === groupRemoveIconElm);\n      for (const boundedEvent of boundedElms) {\n        this._bindingEventService.unbind(boundedEvent.element, 'click', boundedEvent.listener);\n      }\n      this.removeGroupBy(id, headerColumnElm, entry);\n    });\n  }\n\n  setDroppedGroups(groupingInfo: Array<string | GroupingGetterFunction> | string) {\n    const groupingInfos = Array.isArray(groupingInfo) ? groupingInfo : [groupingInfo];\n    this._dropzonePlaceholder.style.display = 'none';\n    for (const groupInfo of groupingInfos) {\n      const columnElm = this._grid.getHeaderColumn(groupInfo as string);\n      this.handleGroupByDrop(this._dropzoneElm, columnElm);\n    }\n  }\n\n  clearDroppedGroups() {\n    this._columnsGroupBy = [];\n    this.updateGroupBy('clear-all');\n    const allDroppedGroupingElms = this._dropzoneElm.querySelectorAll('.slick-dropped-grouping');\n\n    for (const groupElm of Array.from(allDroppedGroupingElms)) {\n      const groupRemoveBtnElm = this._dropzoneElm.querySelector('.slick-groupby-remove');\n      groupRemoveBtnElm?.remove();\n      groupElm?.remove();\n    }\n\n    // show placeholder text & hide the \"Toggle All\" when that later feature is enabled\n    this._dropzonePlaceholder.style.display = 'inline-block';\n    if (this._groupToggler) {\n      this._groupToggler.style.display = 'none';\n    }\n  }\n\n  protected removeFromArray(arrayToModify: any[], itemToRemove: any) {\n    if (Array.isArray(arrayToModify)) {\n      const itemIdx = arrayToModify.findIndex(a => a.id === itemToRemove.id);\n      if (itemIdx >= 0) {\n        arrayToModify.splice(itemIdx, 1);\n      }\n    }\n    return arrayToModify;\n  }\n\n  protected removeGroupBy(id: string | number, _hdrColumnElm: HTMLDivElement, entry: any) {\n    entry.remove();\n    const groupby: Column[] = [];\n    this._gridColumns.forEach((col) => groupby[col.id as any] = col);\n    this.removeFromArray(this._columnsGroupBy, groupby[id as any]);\n    if (this._columnsGroupBy.length === 0) {\n      this._dropzonePlaceholder.style.display = 'block';\n      if (this._groupToggler) {\n        this._groupToggler.style.display = 'none';\n      }\n    }\n    this.updateGroupBy('remove-group');\n  }\n\n  protected toggleGroupToggler(targetElm: Element | null, collapsing = true, shouldExecuteDataViewCommand = true) {\n    if (targetElm) {\n      if (collapsing === true) {\n        targetElm.classList.add('collapsed');\n        targetElm.classList.remove('expanded');\n        if (shouldExecuteDataViewCommand) {\n          this._dataView.collapseAllGroups();\n        }\n      } else {\n        targetElm.classList.remove('collapsed');\n        targetElm.classList.add('expanded');\n        if (shouldExecuteDataViewCommand) {\n          this._dataView.expandAllGroups();\n        }\n      }\n    }\n  }\n\n  protected updateGroupBy(originator: string) {\n    if (this._columnsGroupBy.length === 0) {\n      this._dataView.setGrouping([]);\n      this.onGroupChanged.notify({ caller: originator, groupColumns: [] });\n      return;\n    }\n    const groupingArray: Grouping<any>[] = [];\n    this._columnsGroupBy.forEach((element) => groupingArray.push(element.grouping!));\n    this._dataView.setGrouping(groupingArray);\n    this.onGroupChanged.notify({ caller: originator, groupColumns: groupingArray });\n  }\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  Utils.extend(true, window, {\n    Slick: {\n      DraggableGrouping: SlickDraggableGrouping\n    }\n  });\n}\n", "import type {\n  Column,\n  DOMEvent,\n  HeaderButtonItem,\n  HeaderButtonOnCommandArgs,\n  HeaderButtonOption,\n  OnHeaderCellRenderedEventArgs,\n  SlickPlugin\n} from '../models/index.js';\nimport { BindingEventService as BindingEventService_, EventHandler as EventHandler_, SlickEvent as SlickEvent_, type SlickEventData, Utils as Utils_ } from '../slick.core.js';\nimport type { SlickGrid } from '../slick.grid.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst BindingEventService = IIFE_ONLY ? Slick.BindingEventService : BindingEventService_;\nconst SlickEvent = IIFE_ONLY ? Slick.Event : SlickEvent_;\nconst EventHandler = IIFE_ONLY ? Slick.EventHandler : EventHandler_;\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\n/***\n   * A plugin to add custom buttons to column headers.\n   *\n   * USAGE:\n   *\n   * Add the plugin .js & .css files and register it with the grid.\n   *\n   * To specify a custom button in a column header, extend the column definition like so:\n   *\n   *   let columns = [\n   *     {\n   *       id: 'myColumn',\n   *       name: 'My column',\n   *\n   *       // This is the relevant part\n   *       header: {\n   *          buttons: [\n   *              {\n   *                // button options\n   *              },\n   *              {\n   *                // button options\n   *              }\n   *          ]\n   *       }\n   *     }\n   *   ];\n   *\n   * Available button options:\n   *    cssClass:     CSS class to add to the button.\n   *    image:        Relative button image path.\n   *    disabled:     Whether the item is disabled.\n   *    tooltip:      Button tooltip.\n   *    showOnHover:  Only show the button on hover.\n   *    handler:      Button click handler.\n   *    command:      A command identifier to be passed to the onCommand event handlers.\n   *\n   * Available menu item options:\n   *    action:                   Optionally define a callback function that gets executed when item is chosen (and/or use the onCommand event)\n   *    command:                  A command identifier to be passed to the onCommand event handlers.\n   *    cssClass:                 CSS class to add to the button.\n   *    handler:                  Button click handler.\n   *    image:                    Relative button image path.\n   *    showOnHover:              Only show the button on hover.\n   *    tooltip:                  Button tooltip.\n   *    itemVisibilityOverride:   Callback method that user can override the default behavior of showing/hiding an item from the list\n   *    itemUsabilityOverride:    Callback method that user can override the default behavior of enabling/disabling an item from the list\n   *\n   * The plugin exposes the following events:\n   *    onCommand:    Fired on button click for buttons with 'command' specified.\n   *        Event args:\n   *            grid:     Reference to the grid.\n   *            column:   Column definition.\n   *            command:  Button command identified.\n   *            button:   Button options.  Note that you can change the button options in your\n   *                      event handler, and the column header will be automatically updated to\n   *                      reflect them.  This is useful if you want to implement something like a\n   *                      toggle button.\n   *\n   *\n   * @param options {Object} Options:\n   *    buttonCssClass:   a CSS class to use for buttons (default 'slick-header-button')\n   * @class Slick.Plugins.HeaderButtons\n   * @constructor\n   */\nexport class SlickHeaderButtons implements SlickPlugin {\n  // --\n  // public API\n  pluginName = 'HeaderButtons' as const;\n  onCommand = new SlickEvent<HeaderButtonOnCommandArgs>('onCommand');\n\n  // --\n  // protected props\n  protected _grid!: SlickGrid;\n  protected _handler = new EventHandler();\n  protected _bindingEventService = new BindingEventService();\n  protected _defaults: HeaderButtonOption = {\n    buttonCssClass: 'slick-header-button'\n  };\n  protected _options: HeaderButtonOption;\n\n  constructor(options: Partial<HeaderButtonOption>) {\n    this._options = Utils.extend(true, {}, this._defaults, options);\n  }\n\n  init(grid: SlickGrid) {\n    this._grid = grid;\n    Utils.addSlickEventPubSubWhenDefined(grid.getPubSubService(), this);\n    this._handler\n      .subscribe(this._grid.onHeaderCellRendered, this.handleHeaderCellRendered.bind(this))\n      .subscribe(this._grid.onBeforeHeaderCellDestroy, this.handleBeforeHeaderCellDestroy.bind(this));\n\n    // Force the grid to re-render the header now that the events are hooked up.\n    this._grid.setColumns(this._grid.getColumns());\n  }\n\n  destroy() {\n    this._handler.unsubscribeAll();\n    this._bindingEventService.unbindAll();\n  }\n\n  protected handleHeaderCellRendered(_e: SlickEventData, args: OnHeaderCellRenderedEventArgs) {\n    const column = args.column;\n\n    if (column.header?.buttons) {\n      // Append buttons in reverse order since they are floated to the right.\n      let i = column.header.buttons.length;\n      while (i--) {\n        const button = column.header.buttons[i];\n\n        // run each override functions to know if the item is visible and usable\n        const isItemVisible = this.runOverrideFunctionWhenExists<typeof args>(button.itemVisibilityOverride, args);\n        const isItemUsable = this.runOverrideFunctionWhenExists<typeof args>(button.itemUsabilityOverride, args);\n\n        // if the result is not visible then there's no need to go further\n        if (!isItemVisible) {\n          continue;\n        }\n\n        // when the override is defined, we need to use its result to update the disabled property\n        // so that \"handleMenuItemCommandClick\" has the correct flag and won't trigger a command clicked event\n        if (Object.prototype.hasOwnProperty.call(button, 'itemUsabilityOverride')) {\n          button.disabled = isItemUsable ? false : true;\n        }\n\n        const btn = document.createElement('div');\n        btn.className = this._options.buttonCssClass || '';\n        btn.ariaLabel = 'Header Button';\n        btn.role = 'button';\n\n        if (button.disabled) {\n          btn.classList.add('slick-header-button-disabled');\n        }\n\n        if (button.showOnHover) {\n          btn.classList.add('slick-header-button-hidden');\n        }\n\n        if (button.image) {\n          btn.style.backgroundImage = `url(${button.image})`;\n        }\n\n        if (button.cssClass) {\n          btn.classList.add(...Utils.classNameToList(button.cssClass));\n        }\n\n        if (button.tooltip) {\n          btn.title = button.tooltip;\n        }\n\n        if (button.handler && !button.disabled) {\n          this._bindingEventService.bind(btn, 'click', button.handler);\n        }\n\n        this._bindingEventService.bind(btn, 'click', this.handleButtonClick.bind(this, button, args.column) as EventListener);\n        args.node.appendChild(btn);\n      }\n    }\n  }\n\n\n  protected handleBeforeHeaderCellDestroy(_e: SlickEventData, args: { column: Column; node: HTMLElement; }) {\n    const column = args.column;\n\n    if (column.header?.buttons) {\n      // Removing buttons via jQuery will also clean up any event handlers and data.\n      // NOTE: If you attach event handlers directly or using a different framework,\n      //       you must also clean them up here to avoid memory leaks.\n      const buttonCssClass = (this._options.buttonCssClass || '').replace(/(\\s+)/g, '.');\n      if (buttonCssClass) {\n        args.node.querySelectorAll(`.${buttonCssClass}`).forEach(elm => elm.remove());\n      }\n    }\n  }\n\n  protected handleButtonClick(button: HeaderButtonItem, columnDef: Column, e: DOMEvent<HTMLDivElement>) {\n    const command = button.command || '';\n    const callbackArgs = {\n      grid: this._grid,\n      column: columnDef,\n      button\n    } as HeaderButtonOnCommandArgs;\n\n    if (command) {\n      callbackArgs.command = command;\n    }\n\n    // execute action callback when defined\n    if (typeof button.action === 'function') {\n      button.action.call(this, e, callbackArgs);\n    }\n\n    if (command && !button.disabled) {\n      this.onCommand.notify(callbackArgs, e, this);\n\n      // Update the header in case the user updated the button definition in the handler.\n      this._grid.updateColumnHeader(columnDef.id);\n    }\n\n    // Stop propagation so that it doesn't register as a header click event.\n    e.preventDefault();\n    e.stopPropagation();\n  }\n\n  /**\n   * Method that user can pass to override the default behavior.\n   * In order word, user can choose or an item is (usable/visible/enable) by providing his own logic.\n   * @param overrideFn: override function callback\n   * @param args: multiple arguments provided to the override (cell, row, columnDef, dataContext, grid)\n   */\n  protected runOverrideFunctionWhenExists<T = any>(overrideFn: ((args: any) => boolean) | undefined, args: T): boolean {\n    if (typeof overrideFn === 'function') {\n      return overrideFn.call(this, args);\n    }\n    return true;\n  }\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  Utils.extend(true, window, {\n    Slick: {\n      Plugins: {\n        HeaderButtons: SlickHeaderButtons\n      }\n    }\n  });\n}\n", "import {\n  BindingEventService as BindingEventService_,\n  Event as SlickEvent_,\n  type SlickEventData,\n  SlickEventHandler as SlickEventHandler_,\n  Utils as Utils_\n} from '../slick.core.js';\nimport type {\n  Column,\n  DOMEvent,\n  DOMMouseOrTouchEvent,\n  HeaderMenuCommandItemCallbackArgs,\n  HeaderMenuItems,\n  HeaderMenuOption,\n  HeaderMenuCommandItem,\n  MenuCommandItemCallbackArgs,\n  SlickPlugin,\n  OnHeaderCellRenderedEventArgs,\n} from '../models/index.js';\nimport type { SlickGrid } from '../slick.grid.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst BindingEventService = IIFE_ONLY ? Slick.BindingEventService : BindingEventService_;\nconst SlickEvent = IIFE_ONLY ? Slick.Event : SlickEvent_;\nconst SlickEventHandler = IIFE_ONLY ? Slick.EventHandler : SlickEventHandler_;\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\n/**\n * A plugin to add drop-down menus to column headers.\n *\n * USAGE:\n *\n * Add the plugin .js & .css files and register it with the grid.\n *\n * To specify a menu in a column header, extend the column definition like so:\n *\n *   let columns = [\n *     {\n *       id: 'myColumn',\n *       name: 'My column',\n *\n *       // This is the relevant part\n *       header: {\n *          menu: {\n *              items: [\n *                {\n *                  // menu item options\n *                },\n *                {\n *                  // menu item options\n *                }\n *              ]\n *          }\n *       }\n *     }\n *   ];\n *\n *\n * Available menu options:\n *    autoAlign:              Auto-align drop menu to the left when not enough viewport space to show on the right\n *    autoAlignOffset:        When drop menu is aligned to the left, it might not be perfectly aligned with the header menu icon, if that is the case you can add an offset (positive/negative number to move right/left)\n *    buttonCssClass:         an extra CSS class to add to the menu button (default 'caret')\n *    buttonImage:            a url to the menu button image\n *    menuUsabilityOverride:  Callback method that user can override the default behavior of enabling/disabling the menu from being usable (must be combined with a custom formatter)\n *    minWidth:               Minimum width that the drop menu will have\n *    subItemChevronClass:        CSS class that can be added on the right side of a sub-item parent (typically a chevron-right icon)\n *    subMenuOpenByEvent:         defaults to \"mouseover\", what event type shoud we use to open sub-menu(s), 2 options are available: \"mouseover\" or \"click\"\n *\n *\n * Available menu item options:\n *    action:                   Optionally define a callback function that gets executed when item is chosen (and/or use the onCommand event)\n *    title:                    Menu item text.\n *    divider:                  Whether the current item is a divider, not an actual command.\n *    disabled:                 Whether the item/command is disabled.\n *    hidden:                   Whether the item/command is hidden.\n *    tooltip:                  Item tooltip.\n *    command:                  A command identifier to be passed to the onCommand event handlers.\n *    cssClass:                 A CSS class to be added to the menu item container.\n *    iconCssClass:             A CSS class to be added to the menu item icon.\n *    iconImage:                A url to the icon image.\n *    textCssClass:             A CSS class to be added to the menu item text.\n *    itemVisibilityOverride:   Callback method that user can override the default behavior of showing/hiding an item from the list\n *    itemUsabilityOverride:    Callback method that user can override the default behavior of enabling/disabling an item from the list\n *\n *\n * The plugin exposes the following events:\n\n  *    onAfterMenuShow:   Fired after the menu is shown.  You can customize the menu or dismiss it by returning false.\n  *        Event args:\n  *            grid:     Reference to the grid.\n  *            column:   Column definition.\n  *            menu:     Menu options.  Note that you can change the menu items here.\n  *\n  *    onBeforeMenuShow:   Fired before the menu is shown.  You can customize the menu or dismiss it by returning false.\n  *        Event args:\n  *            grid:     Reference to the grid.\n  *            column:   Column definition.\n  *            menu:     Menu options.  Note that you can change the menu items here.\n  *\n  *    onCommand:    Fired on menu item click for buttons with 'command' specified.\n  *        Event args:\n  *            grid:     Reference to the grid.\n  *            column:   Column definition.\n  *            command:  Button command identified.\n  *            button:   Button options.  Note that you can change the button options in your\n  *                      event handler, and the column header will be automatically updated to\n  *                      reflect them.  This is useful if you want to implement something like a\n  *                      toggle button.\n  *\n  *\n  * @param options {Object} Options:\n  *    buttonCssClass:   an extra CSS class to add to the menu button (default 'caret')\n  *    buttonImage:      a url to the menu button image\n  * @class Slick.Plugins.HeaderButtons\n  */\nexport class SlickHeaderMenu implements SlickPlugin {\n  // --\n  // public API\n  pluginName = 'HeaderMenu' as const;\n  onAfterMenuShow = new SlickEvent<HeaderMenuCommandItemCallbackArgs>('onAfterMenuShow');\n  onBeforeMenuShow = new SlickEvent<HeaderMenuCommandItemCallbackArgs>('onBeforeMenuShow');\n  onCommand = new SlickEvent<MenuCommandItemCallbackArgs>('onCommand');\n\n  // --\n  // protected props\n  protected _grid!: SlickGrid;\n  protected _gridUid = '';\n  protected _handler = new SlickEventHandler();\n  protected _bindingEventService = new BindingEventService();\n  protected _defaults: HeaderMenuOption = {\n    buttonCssClass: undefined,\n    buttonImage: undefined,\n    minWidth: 100,\n    autoAlign: true,\n    autoAlignOffset: 0,\n    subMenuOpenByEvent: 'mouseover',\n  };\n  protected _options: HeaderMenuOption;\n  protected _activeHeaderColumnElm?: HTMLDivElement | null;\n  protected _menuElm?: HTMLDivElement | null;\n  protected _subMenuParentId = '';\n\n  constructor(options: Partial<HeaderMenuOption>) {\n    this._options = Utils.extend(true, {}, options, this._defaults);\n  }\n\n  init(grid: SlickGrid) {\n    this._grid = grid;\n    this._gridUid = grid?.getUID() || '';\n    Utils.addSlickEventPubSubWhenDefined(grid.getPubSubService(), this);\n    this._handler\n      .subscribe(this._grid.onHeaderCellRendered, this.handleHeaderCellRendered.bind(this))\n      .subscribe(this._grid.onBeforeHeaderCellDestroy, this.handleBeforeHeaderCellDestroy.bind(this));\n\n    // Force the grid to re-render the header now that the events are hooked up.\n    this._grid.setColumns(this._grid.getColumns());\n\n    // Hide the menu on outside click.\n    this._bindingEventService.bind(document.body, 'click', this.handleBodyMouseDown.bind(this) as EventListener);\n  }\n\n  setOptions(newOptions: Partial<HeaderMenuOption>) {\n    this._options = Utils.extend(true, {}, this._options, newOptions);\n  }\n\n  protected getGridUidSelector() {\n    const gridUid = this._grid.getUID() || '';\n    return gridUid ? `.${gridUid}` : '';\n  }\n\n  destroy() {\n    this._handler.unsubscribeAll();\n    this._bindingEventService.unbindAll();\n    this._menuElm = this._menuElm || document.body.querySelector(`.slick-header-menu${this.getGridUidSelector()}`);\n    this._menuElm?.remove();\n    this._activeHeaderColumnElm = undefined;\n  }\n\n  destroyAllMenus() {\n    this.destroySubMenus();\n\n    // remove all parent menu listeners before removing them from the DOM\n    this._bindingEventService.unbindAll('parent-menu');\n    document.querySelectorAll(`.slick-header-menu${this.getGridUidSelector()}`)\n      .forEach(subElm => subElm.remove());\n  }\n\n  /** Close and destroy all previously opened sub-menus */\n  destroySubMenus() {\n    this._bindingEventService.unbindAll('sub-menu');\n    document.querySelectorAll(`.slick-header-menu.slick-submenu${this.getGridUidSelector()}`)\n      .forEach(subElm => subElm.remove());\n  }\n\n  protected handleBodyMouseDown(e: DOMEvent<HTMLElement>) {\n    // did we click inside the menu or any of its sub-menu(s)\n    let isMenuClicked = false;\n    if (this._menuElm?.contains(e.target)) {\n      isMenuClicked = true;\n    }\n    if (!isMenuClicked) {\n      document\n        .querySelectorAll(`.slick-header-menu.slick-submenu${this.getGridUidSelector()}`)\n        .forEach(subElm => {\n          if (subElm.contains(e.target)) {\n            isMenuClicked = true;\n          }\n        });\n    }\n\n    if (this._menuElm !== e.target && !isMenuClicked && !e.defaultPrevented || e.target.className === 'close') {\n      this.hideMenu();\n    }\n  }\n\n  hideMenu() {\n    if (this._menuElm) {\n      this._menuElm.remove();\n      this._menuElm = undefined;\n    }\n    this._activeHeaderColumnElm?.classList.remove('slick-header-column-active');\n    this.destroySubMenus();\n  }\n\n  protected handleHeaderCellRendered(_e: SlickEventData, args: OnHeaderCellRenderedEventArgs) {\n    const column = args.column;\n    const menu = column?.header?.menu as HeaderMenuItems;\n\n    if (menu?.items) {\n      console.warn('[SlickGrid] Header Menu \"items\" property was deprecated in favor of \"commandItems\" to align with all other Menu plugins.');\n    }\n\n    if (menu) {\n      // run the override function (when defined), if the result is false it won't go further\n      if (!this.runOverrideFunctionWhenExists<typeof args>(this._options.menuUsabilityOverride, args)) {\n        return;\n      }\n\n      const elm = document.createElement('div');\n      elm.className = 'slick-header-menubutton';\n      elm.ariaLabel = 'Header Menu';\n      elm.role = 'button';\n\n      if (!this._options.buttonCssClass && !this._options.buttonImage) {\n        this._options.buttonCssClass = 'caret'; // default when nothing is provided\n      }\n\n      if (this._options.buttonCssClass) {\n        // sgi icon with mask requires inner span to work properly\n        const icon = document.createElement('span');\n        icon.classList.add(...Utils.classNameToList(this._options.buttonCssClass));\n        elm.appendChild(icon);\n      }\n\n      if (this._options.buttonImage) {\n        elm.style.backgroundImage = `url(${this._options.buttonImage})`;\n      }\n\n      if (this._options.tooltip) {\n        elm.title = this._options.tooltip;\n      }\n\n      this._bindingEventService.bind(elm, 'click', ((e: DOMMouseOrTouchEvent<HTMLDivElement>) => {\n        this.destroyAllMenus(); // make there's only 1 parent menu opened at a time\n        this.createParentMenu(e, menu, args.column);\n      }) as EventListener);\n      args.node.appendChild(elm);\n    }\n  }\n\n  protected handleBeforeHeaderCellDestroy(_e: SlickEventData, args: { column: Column; node: HTMLElement; }) {\n    const column = args.column;\n\n    if (column.header?.menu) {\n      args.node.querySelectorAll('.slick-header-menubutton').forEach(elm => elm.remove());\n    }\n  }\n\n  protected addSubMenuTitleWhenExists(item: HeaderMenuCommandItem | 'divider', commandMenuElm: HTMLDivElement) {\n    if (item !== 'divider' && item?.subMenuTitle) {\n      const subMenuTitleElm = document.createElement('div');\n      subMenuTitleElm.className = 'slick-menu-title';\n      subMenuTitleElm.textContent = item.subMenuTitle as string;\n      const subMenuTitleClass = item.subMenuTitleCssClass as string;\n      if (subMenuTitleClass) {\n        subMenuTitleElm.classList.add(...Utils.classNameToList(subMenuTitleClass));\n      }\n\n      commandMenuElm.appendChild(subMenuTitleElm);\n    }\n  }\n\n  protected createParentMenu(event: DOMMouseOrTouchEvent<HTMLDivElement>, menu: HeaderMenuItems, columnDef: Column) {\n    // Let the user modify the menu or cancel altogether,\n    // or provide alternative menu implementation.\n    const callbackArgs = {\n      grid: this._grid,\n      column: columnDef,\n      menu\n    } as unknown as HeaderMenuCommandItemCallbackArgs;\n    if (this.onBeforeMenuShow.notify(callbackArgs, event, this).getReturnValue() === false) {\n      return;\n    }\n\n    // create 1st parent menu container & reposition it\n    this._menuElm = this.createMenu((menu.commandItems || menu.items) as Array<HeaderMenuCommandItem | 'divider'>, columnDef);\n    const containerNode = this._grid.getContainerNode();\n    if (containerNode) {\n      containerNode.appendChild(this._menuElm);\n    }\n    this.repositionMenu(event, this._menuElm);\n\n    if (this.onAfterMenuShow.notify(callbackArgs, event, this).getReturnValue() === false) {\n      return;\n    }\n\n    // Stop propagation so that it doesn't register as a header click event.\n    event.preventDefault();\n    event.stopPropagation();\n  }\n\n  protected createMenu(commandItems: Array<HeaderMenuCommandItem | 'divider'>, columnDef: Column, level = 0, item?: HeaderMenuCommandItem | 'divider') {\n    // to avoid having multiple sub-menu trees opened,\n    // we need to somehow keep trace of which parent menu the tree belongs to\n    // and we should keep ref of only the first sub-menu parent, we can use the command name (remove any whitespaces though)\n    const isSubMenu = level > 0;\n    const subMenuCommand = (item as HeaderMenuCommandItem)?.command;\n    let subMenuId = (level === 1 && subMenuCommand) ? subMenuCommand.replaceAll(' ', '') : '';\n    if (subMenuId) {\n      this._subMenuParentId = subMenuId;\n    }\n    if (isSubMenu) {\n      subMenuId = this._subMenuParentId;\n    }\n\n    // return menu/sub-menu if it's already opened unless we are on different sub-menu tree if so close them all\n    const menuClasses = `slick-header-menu slick-menu-level-${level} ${this._gridUid}`;\n    const bodyMenuElm = document.body.querySelector<HTMLDivElement>(`.slick-header-menu.slick-menu-level-${level}${this.getGridUidSelector()}`);\n    if (bodyMenuElm) {\n      if (bodyMenuElm.dataset.subMenuParent === subMenuId) {\n        return bodyMenuElm;\n      }\n      this.destroySubMenus();\n    }\n\n    const menuElm = document.createElement('div');\n    menuElm.className = menuClasses;\n    if (level > 0) {\n      menuElm.classList.add('slick-submenu');\n      if (subMenuId) {\n        menuElm.dataset.subMenuParent = subMenuId;\n      }\n    }\n    menuElm.classList.add(this._gridUid);\n    menuElm.role = 'menu';\n    menuElm.ariaLabel = level > 1 ? 'SubMenu' : 'Header Menu';\n    menuElm.style.minWidth = `${this._options.minWidth}px`;\n    menuElm.setAttribute('aria-expanded', 'true');\n\n    const callbackArgs = {\n      grid: this._grid,\n      column: columnDef,\n      menu: { items: commandItems }\n    } as unknown as HeaderMenuCommandItemCallbackArgs;\n\n    // when creating sub-menu add its sub-menu title when exists\n    if (item && level > 0) {\n      this.addSubMenuTitleWhenExists(item, menuElm); // add sub-menu title when exists\n    }\n\n    // Construct the menu items.\n    for (let i = 0; i < commandItems.length; i++) {\n      let addClickListener = true;\n      const item = commandItems[i];\n\n      // run each override functions to know if the item is visible and usable\n      const isItemVisible = this.runOverrideFunctionWhenExists((item as HeaderMenuCommandItem).itemVisibilityOverride, callbackArgs);\n      const isItemUsable = this.runOverrideFunctionWhenExists((item as HeaderMenuCommandItem).itemUsabilityOverride, callbackArgs);\n\n      // if the result is not visible then there's no need to go further\n      if (!isItemVisible) {\n        continue;\n      }\n\n      // when the override is defined, we need to use its result to update the disabled property\n      // so that \"handleMenuItemCommandClick\" has the correct flag and won't trigger a command clicked event\n      if (Object.prototype.hasOwnProperty.call(item, 'itemUsabilityOverride')) {\n        (item as HeaderMenuCommandItem).disabled = isItemUsable ? false : true;\n      }\n\n      const menuItemElm = document.createElement('div');\n      menuItemElm.className = 'slick-header-menuitem';\n      menuItemElm.role = 'menuitem';\n\n      if ((item as HeaderMenuCommandItem).divider || item === 'divider') {\n        menuItemElm.classList.add('slick-header-menuitem-divider');\n        addClickListener = false;\n      }\n\n      if ((item as HeaderMenuCommandItem).disabled) {\n        menuItemElm.classList.add('slick-header-menuitem-disabled');\n      }\n\n      if ((item as HeaderMenuCommandItem).hidden) {\n        menuItemElm.classList.add('slick-header-menuitem-hidden');\n      }\n\n      if ((item as HeaderMenuCommandItem).cssClass) {\n        menuItemElm.classList.add(...Utils.classNameToList((item as HeaderMenuCommandItem).cssClass));\n      }\n\n      if ((item as HeaderMenuCommandItem).tooltip) {\n        menuItemElm.title = (item as HeaderMenuCommandItem).tooltip || '';\n      }\n\n      const iconElm = document.createElement('div');\n      iconElm.className = 'slick-header-menuicon';\n      menuItemElm.appendChild(iconElm);\n\n      if ((item as HeaderMenuCommandItem).iconCssClass) {\n        iconElm.classList.add(...Utils.classNameToList((item as HeaderMenuCommandItem).iconCssClass));\n      }\n\n      if ((item as HeaderMenuCommandItem).iconImage) {\n        iconElm.style.backgroundImage = 'url(' + (item as HeaderMenuCommandItem).iconImage + ')';\n      }\n\n      const textElm = document.createElement('span');\n      textElm.className = 'slick-header-menucontent';\n      textElm.textContent = (item as HeaderMenuCommandItem).title || '';\n      menuItemElm.appendChild(textElm);\n\n      if ((item as HeaderMenuCommandItem).textCssClass) {\n        textElm.classList.add(...Utils.classNameToList((item as HeaderMenuCommandItem).textCssClass));\n      }\n      menuElm.appendChild(menuItemElm);\n\n      if (addClickListener) {\n        const eventGroup = isSubMenu ? 'sub-menu' : 'parent-menu';\n        this._bindingEventService.bind(menuItemElm, 'click', this.handleMenuItemClick.bind(this, item, columnDef, level) as EventListener, undefined, eventGroup);\n      }\n\n      // optionally open sub-menu(s) by mouseover\n      if (this._options.subMenuOpenByEvent === 'mouseover') {\n        this._bindingEventService.bind(menuItemElm, 'mouseover', ((e: DOMMouseOrTouchEvent<HTMLDivElement>) => {\n          if ((item as HeaderMenuCommandItem).commandItems || (item as HeaderMenuCommandItem).items) {\n            this.repositionSubMenu(item as HeaderMenuCommandItem, columnDef, level, e);\n          } else if (!isSubMenu) {\n            this.destroySubMenus();\n          }\n        }) as EventListener);\n      }\n\n      // the option/command item could be a sub-menu if it has another list of commands/options\n      if ((item as HeaderMenuCommandItem).commandItems || (item as HeaderMenuCommandItem).items) {\n        const chevronElm = document.createElement('div');\n        chevronElm.className = 'sub-item-chevron';\n        if (this._options.subItemChevronClass) {\n          chevronElm.classList.add(...Utils.classNameToList(this._options.subItemChevronClass));\n        } else {\n          chevronElm.textContent = '\u2B9E'; // \u2B9E or \u25B8\n        }\n\n        menuItemElm.classList.add('slick-submenu-item');\n        menuItemElm.appendChild(chevronElm);\n      }\n    }\n\n    return menuElm;\n  }\n\n  protected handleMenuItemClick(item: HeaderMenuCommandItem | 'divider', columnDef: Column, level = 0, e: DOMMouseOrTouchEvent<HTMLDivElement>): boolean | void {\n    if (item !== 'divider' && !item.disabled && !item.divider) {\n      const command = (item as HeaderMenuCommandItem).command || '';\n\n      if (Utils.isDefined(command) && !item.commandItems && !(item as HeaderMenuCommandItem).items) {\n        const callbackArgs = {\n          grid: this._grid,\n          column: columnDef,\n          command,\n          item,\n        };\n        this.onCommand.notify(callbackArgs, e, this);\n\n        // execute action callback when defined\n        if (typeof item.action === 'function') {\n          item.action.call(this, e, callbackArgs);\n        }\n\n        // unless prevented, close the menu\n        if (!e.defaultPrevented) {\n          this.hideMenu();\n        }\n      } else if (item.commandItems || (item as HeaderMenuCommandItem).items) {\n        this.repositionSubMenu(item as HeaderMenuCommandItem, columnDef, level, e);\n      } else {\n        this.destroySubMenus();\n      }\n    }\n  }\n\n  protected repositionSubMenu(item: HeaderMenuCommandItem, columnDef: Column, level: number, e: DOMMouseOrTouchEvent<HTMLDivElement>) {\n    // when we're clicking a grid cell OR our last menu type (command/option) differs then we know that we need to start fresh and close any sub-menus that might still be open\n    if (e.target.classList.contains('slick-header-menubutton')) {\n      this.destroySubMenus();\n    }\n\n    // creating sub-menu, we'll also pass level & the item object since we might have \"subMenuTitle\" to show\n    const subMenuElm = this.createMenu(item.commandItems || item.items || [], columnDef, level + 1, item);\n    document.body.appendChild(subMenuElm);\n    this.repositionMenu(e, subMenuElm);\n  }\n\n  protected repositionMenu(e: DOMMouseOrTouchEvent<HTMLDivElement>, menuElm: HTMLDivElement) {\n    const buttonElm = e.target;\n    const isSubMenu = menuElm.classList.contains('slick-submenu');\n    const parentElm = isSubMenu\n      ? e.target.closest('.slick-header-menuitem') as HTMLDivElement\n      : buttonElm as HTMLElement;\n\n    const btnOffset = Utils.offset(buttonElm);\n    const gridPos = this._grid.getGridPosition();\n    const menuWidth = menuElm.offsetWidth;\n    const menuOffset = Utils.offset(this._menuElm!);\n    const parentOffset = Utils.offset(parentElm);\n    const menuOffsetTop = isSubMenu\n      ? parentOffset?.top ?? 0\n      : buttonElm.clientHeight ?? btnOffset?.top ?? 0 + (this._options?.menuOffsetTop ?? 0);\n    let menuOffsetLeft = isSubMenu ? parentOffset?.left ?? 0 : btnOffset?.left ?? 0;\n\n    // when auto-align is set, it will calculate whether it has enough space in the viewport to show the drop menu on the right (default)\n    // if there isn't enough space on the right, it will automatically align the drop menu to the left\n    // to simulate an align left, we actually need to know the width of the drop menu\n    if (isSubMenu && parentElm) {\n      let subMenuPosCalc = menuOffsetLeft + Number(menuWidth); // calculate coordinate at caller element far right\n      if (isSubMenu) {\n        subMenuPosCalc += parentElm.clientWidth;\n      }\n      const browserWidth = document.documentElement.clientWidth;\n      const dropSide = (subMenuPosCalc >= gridPos.width || subMenuPosCalc >= browserWidth) ? 'left' : 'right';\n      if (dropSide === 'left') {\n        menuElm.classList.remove('dropright');\n        menuElm.classList.add('dropleft');\n        menuOffsetLeft -= menuWidth;\n      } else {\n        menuElm.classList.remove('dropleft');\n        menuElm.classList.add('dropright');\n        if (isSubMenu) {\n          menuOffsetLeft += parentElm.offsetWidth;\n        }\n      }\n    } else {\n      if (menuOffsetLeft + menuElm.offsetWidth >= gridPos.width) {\n        menuOffsetLeft = menuOffsetLeft + buttonElm.clientWidth - menuElm.clientWidth + (this._options.autoAlignOffset || 0);\n      }\n      menuOffsetLeft -= menuOffset?.left ?? 0;\n    }\n\n    // ready to reposition the menu\n    menuElm.style.top = `${menuOffsetTop}px`;\n    menuElm.style.left = `${menuOffsetLeft}px`;\n\n    // Mark the header as active to keep the highlighting.\n    this._activeHeaderColumnElm = menuElm.closest('.slick-header-column');\n    if (this._activeHeaderColumnElm) {\n      this._activeHeaderColumnElm.classList.add('slick-header-column-active');\n    }\n  }\n\n  /**\n   * Method that user can pass to override the default behavior.\n   * In order word, user can choose or an item is (usable/visible/enable) by providing his own logic.\n   * @param overrideFn: override function callback\n   * @param args: multiple arguments provided to the override (cell, row, columnDef, dataContext, grid)\n   */\n  protected runOverrideFunctionWhenExists<T = any>(overrideFn: ((args: any) => boolean) | undefined, args: T): boolean {\n    if (typeof overrideFn === 'function') {\n      return overrideFn.call(this, args);\n    }\n    return true;\n  }\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  Utils.extend(true, window, {\n    Slick: {\n      Plugins: {\n        HeaderMenu: SlickHeaderMenu\n      }\n    }\n  });\n}\n", "import {\n  keyCode as keyCode_,\n  SlickEvent as SlickEvent_,\n  SlickEventData as SlickEventData_,\n  SlickEventHandler as SlickEventHandler_,\n  SlickRange as SlickRange_,\n  Utils as Utils_\n} from '../slick.core.js';\nimport { Draggable as Draggable_ } from '../slick.interactions.js';\nimport { SlickCellRangeDecorator as SlickCellRangeDecorator_ } from './slick.cellrangedecorator.js';\nimport { SlickCellRangeSelector as SlickCellRangeSelector_ } from './slick.cellrangeselector.js';\nimport type { CustomDataView, HybridSelectionModelOption, OnActiveCellChangedEventArgs, SelectionModel } from '../models/index.js';\nimport type { SlickDataView } from '../slick.dataview.js';\nimport type { SlickCrossGridRowMoveManager as SlickCrossGridRowMoveManager_ } from './slick.crossgridrowmovemanager.js';\nimport type { SlickRowMoveManager as SlickRowMoveManager_ } from './slick.rowmovemanager.js';\nimport type { SlickGrid } from '../slick.grid.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst Draggable = IIFE_ONLY ? Slick.Draggable : Draggable_;\nconst keyCode = IIFE_ONLY ? Slick.keyCode : keyCode_;\nconst SlickEvent = IIFE_ONLY ? Slick.Event : SlickEvent_;\nconst SlickEventData = IIFE_ONLY ? Slick.EventData : SlickEventData_;\nconst SlickEventHandler = IIFE_ONLY ? Slick.EventHandler : SlickEventHandler_;\nconst SlickRange = IIFE_ONLY ? Slick.Range : SlickRange_;\nconst SlickCellRangeDecorator = IIFE_ONLY ? Slick.CellRangeDecorator : SlickCellRangeDecorator_;\nconst SlickCellRangeSelector = IIFE_ONLY ? Slick.CellRangeSelector : SlickCellRangeSelector_;\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\nexport class SlickHybridSelectionModel implements SelectionModel {\n  // hybrid selection model is CellSelectionModel except when selecting\n  // specific columns, which behave as RowSelectionModel\n\n  // --\n  // public API\n  pluginName = 'HybridSelectionModel' as const;\n  onSelectedRangesChanged = new SlickEvent<SlickRange_[]>('onSelectedRangesChanged');\n\n  // --\n  // protected props\n  protected _cachedPageRowCount = 0;\n  protected _dataView?: CustomDataView | SlickDataView;\n  protected _eventHandler = new SlickEventHandler();\n  protected _grid!: SlickGrid;\n  protected _prevSelectedRow?: number;\n  protected _prevKeyDown = '';\n  protected _ranges: SlickRange_[] = [];\n  protected _selector?: SlickCellRangeSelector_;\n  protected _isRowMoveManagerHandler: any;\n  protected _activeSelectionIsRow = false;\n  protected _options: HybridSelectionModelOption;\n  protected _defaults: HybridSelectionModelOption = {\n    selectActiveCell: true,\n    selectActiveRow: true,\n    dragToSelect: false,\n    autoScrollWhenDrag: true,\n    handleRowMoveManagerColumn: true, // Row Selection on RowMoveManage column\n    rowSelectColumnIds: [],         // Row Selection on these columns\n    rowSelectOverride: undefined,     // function to toggle Row Selection Models\n    cellRangeSelector: undefined,\n    selectionType: 'mixed',\n  };\n\n  constructor(options?: HybridSelectionModelOption) {\n    this._options = Utils.extend(true, {}, this._defaults, options);\n  }\n\n  // Region: Setup\n  // -----------------------------------------------------------------------------\n\n  init(grid: SlickGrid) {\n    if (Draggable === undefined) {\n      throw new Error('Slick.Draggable is undefined, make sure to import \"slick.interactions.js\"');\n    }\n\n    this._grid = grid;\n    Utils.addSlickEventPubSubWhenDefined(grid.getPubSubService(), this);\n\n    if (this._options?.selectionType === 'cell') {\n      this._activeSelectionIsRow = false;\n    } else if (this._options?.selectionType === 'row') {\n      this._activeSelectionIsRow = true;\n    }\n\n    if (!this._selector && (!this._activeSelectionIsRow || (this._activeSelectionIsRow && this._options.dragToSelect))) {\n      if (!SlickCellRangeDecorator) {\n        throw new Error('Slick.CellRangeDecorator is required when option dragToSelect set to true');\n      }\n      this._selector = new SlickCellRangeSelector(\n        this._options?.dragToSelect\n          ? {\n            selectionCss: { border: 'none' } as CSSStyleDeclaration,\n            autoScroll: this._options?.autoScrollWhenDrag,\n          }\n          : {\n            selectionCss: { border: '2px solid gray' } as CSSStyleDeclaration,\n            copyToSelectionCss: { border: '2px solid purple' } as CSSStyleDeclaration,\n          }\n      );\n      this._options.cellRangeSelector = this._selector;\n    }\n\n    if (grid.hasDataView()) {\n      this._dataView = grid.getData<CustomDataView | SlickDataView>();\n    }\n\n    this._eventHandler\n      .subscribe(this._grid.onActiveCellChanged, this.handleActiveCellChange.bind(this))\n      .subscribe(this._grid.onClick, this.handleClick.bind(this))\n      .subscribe(this._grid.onKeyDown, this.handleKeyDown.bind(this))\n\n    if (this._selector) {\n      grid.registerPlugin(this._selector);\n      this._eventHandler\n        .subscribe(this._selector.onCellRangeSelecting, (e, args) => this.handleCellRangeSelected(e, { ...args, caller: 'onCellRangeSelecting' }))\n        .subscribe(this._selector.onCellRangeSelected, (e, args) => this.handleCellRangeSelected(e, { ...args, caller: 'onCellRangeSelected' }))\n      this._selector.onBeforeCellRangeSelected.subscribe(this.handleBeforeCellRangeSelected.bind(this));\n    }\n  }\n\n  destroy() {\n    this._eventHandler.unsubscribeAll();\n    if (this._selector) {\n      this._grid?.unregisterPlugin(this._selector);\n    }\n    this._selector?.destroy();\n  }\n\n  getOptions(): HybridSelectionModelOption {\n    return this._options;\n  }\n\n  // Region: CellSelectionModel Members\n  // -----------------------------------------------------------------------------\n\n  protected removeInvalidRanges(ranges: SlickRange_[]) {\n    const result: SlickRange_[] = [];\n\n    for (let i = 0; i < ranges.length; i++) {\n      const r = ranges[i];\n      if (this._grid.canCellBeSelected(r.fromRow, r.fromCell) && this._grid.canCellBeSelected(r.toRow, r.toCell)) {\n        result.push(r);\n      }\n    }\n\n    return result;\n  }\n\n  protected rangesAreEqual(range1: SlickRange_[], range2: SlickRange_[]) {\n    let areDifferent = (range1.length !== range2.length);\n    if (!areDifferent) {\n      for (let i = 0; i < range1.length; i++) {\n        if (\n          range1[i].fromCell !== range2[i].fromCell\n          || range1[i].fromRow !== range2[i].fromRow\n          || range1[i].toCell !== range2[i].toCell\n          || range1[i].toRow !== range2[i].toRow\n        ) {\n          areDifferent = true;\n          break;\n        }\n      }\n    }\n    return !areDifferent;\n  }\n\n  // Region: RowSelectionModel Members\n  // -----------------------------------------------------------------------------\n\n  protected rangesToRows(ranges: SlickRange_[]): number[] {\n    const rows: number[] = [];\n    for (let i = 0; i < ranges.length; i++) {\n      for (let j = ranges[i].fromRow; j <= ranges[i].toRow; j++) {\n        rows.push(j);\n      }\n    }\n    return rows;\n  }\n\n  protected rowsToRanges(rows: number[]) {\n    const ranges: SlickRange_[] = [];\n    const lastCell = this._grid.getColumns().length - 1;\n    rows.forEach(row => ranges.push(new SlickRange(row, 0, row, lastCell)));\n    return ranges;\n  }\n\n  protected getRowsRange(from: number, to: number) {\n    let i;\n    const rows: number[] = [];\n    for (i = from; i <= to; i++) {\n      rows.push(i);\n    }\n    for (i = to; i < from; i++) {\n      rows.push(i);\n    }\n    return rows;\n  }\n\n  getCellRangeSelector(): SlickCellRangeSelector_ | undefined {\n    return this._selector;\n  }\n\n  getSelectedRanges(): SlickRange_[] {\n    return this._ranges;\n  }\n\n  getSelectedRows(): number[] {\n    return this.rangesToRows(this._ranges);\n  }\n\n  setSelectedRows(rows: number[]): void {\n    this.setSelectedRanges(this.rowsToRanges(rows), 'SlickHybridSelectionModel.setSelectedRows', '');\n  }\n\n  // Region: Shared Members\n  // -----------------------------------------------------------------------------\n\n  /** Provide a way to force a recalculation of page row count (for example on grid resize) */\n  resetPageRowCount() {\n    this._cachedPageRowCount = 0;\n  }\n\n  setSelectedRanges(ranges: SlickRange_[], caller = 'SlickHybridSelectionModel.setSelectedRanges', selectionMode = '') {\n    // simple check for: empty selection didn't change, prevent firing onSelectedRangesChanged\n    if ((!this._ranges || this._ranges.length === 0) && (!ranges || ranges.length === 0)) { return; }\n\n    // if range has not changed, don't fire onSelectedRangesChanged\n    const rangeHasChanged = !this.rangesAreEqual(this._ranges, ranges);\n\n    if (this._activeSelectionIsRow) {\n      this._ranges = ranges;\n\n      // provide extra \"caller\" argument through SlickEventData event to avoid breaking the previous pubsub event structure\n      // that only accepts an array of selected range `SlickRange[]`, the SlickEventData args will be merged and used later by `onSelectedRowsChanged`\n      const eventData = new SlickEventData(new CustomEvent('click', { detail: { caller, selectionMode } }), this._ranges);\n      this.onSelectedRangesChanged.notify(this._ranges, eventData);\n    } else {\n      this._ranges = this.removeInvalidRanges(ranges);\n      if (rangeHasChanged) {\n        // provide extra \"caller\" argument through SlickEventData event to avoid breaking the previous pubsub event structure\n        // that only accepts an array of selected range `SlickRange[]`, the SlickEventData args will be merged and used later by `onSelectedRowsChanged`\n        const eventData = new SlickEventData(new CustomEvent('click', { detail: { caller, selectionMode, addDragHandle: true } }), this._ranges);\n        this.onSelectedRangesChanged.notify(this._ranges, eventData);\n      }\n    }\n  }\n\n  currentSelectionModeIsRow() {\n    return this._activeSelectionIsRow;\n  }\n\n  refreshSelections() {\n    if (this._activeSelectionIsRow) {\n      this.setSelectedRows(this.getSelectedRows());\n    } else {\n      this.setSelectedRanges(this.getSelectedRanges(), undefined, '');\n    }\n  }\n\n  getRowMoveManagerPlugin(): SlickRowMoveManager_ | SlickCrossGridRowMoveManager_ | undefined {\n    return this._grid.getPluginByName('RowMoveManager') || this._grid.getPluginByName('CrossGridRowMoveManager');\n  }\n\n  rowSelectionModelIsActive(data: OnActiveCellChangedEventArgs): boolean {\n    if (this._options?.selectionType === 'cell') {\n      return false;\n    } else if (this._options?.selectionType === 'row') {\n      return true;\n    }\n\n    // work out required selection mode\n    if (this._options?.rowSelectOverride) {\n      return this._options?.rowSelectOverride(data, this, this._grid);\n    }\n\n    if (!Utils.isDefined(data.cell)) { return false; }\n\n    if (this._options?.handleRowMoveManagerColumn) {\n      const rowMoveManager = this.getRowMoveManagerPlugin();\n      if (rowMoveManager?.isHandlerColumn(data.cell)) { return true; }\n    }\n\n    const targetColumn = this._grid.getVisibleColumns()[data.cell];\n    if (targetColumn) {\n      return this._options?.rowSelectColumnIds?.includes('' + targetColumn.id) || false;\n    }\n    return false;\n  }\n\n  protected handleActiveCellChange(_e: SlickEventData_, args: OnActiveCellChangedEventArgs) {\n    this._prevSelectedRow = undefined;\n    const isCellDefined = Utils.isDefined(args.cell);\n    const isRowDefined = Utils.isDefined(args.row);\n    this._activeSelectionIsRow = this.rowSelectionModelIsActive(args);\n\n    if (this._activeSelectionIsRow) {\n      if (this._options?.selectActiveRow && isRowDefined) {\n        this.setSelectedRanges([new SlickRange(args.row, 0, args.row, this._grid.getColumns().length - 1)], undefined, '');\n      }\n    } else {\n      if (this._options?.selectActiveCell && isRowDefined && isCellDefined) {\n        // if any row selections are visible, leave them untouched unless `selectActiveCell` is enabled\n        if (this._options.selectActiveRow) {\n          this.setSelectedRanges([new SlickRange(args.row, args.cell)], undefined, '');\n        }\n      } else if (!this._options?.selectActiveCell || (!isRowDefined && !isCellDefined)) {\n        // clear the previous selection once the cell changes\n        this.setSelectedRanges([], undefined, '');\n      }\n    }\n  }\n\n  protected isKeyAllowed(key: string, isShiftKeyPressed?: boolean): boolean {\n    return [\n      'ArrowLeft',\n      'ArrowRight',\n      'ArrowUp',\n      'ArrowDown',\n      'PageDown',\n      'PageUp',\n      'Home',\n      'End',\n      ...(!isShiftKeyPressed ? ['a', 'A'] : []),\n    ].some((k) => k === key);\n  }\n\n  protected handleKeyDown(e: SlickEventData_) {\n    if (!this._activeSelectionIsRow) {\n      let ranges: SlickRange_[], last: SlickRange_;\n      const colLn = this._grid.getColumns().length;\n      const active = this._grid.getActiveCell();\n      let dataLn = 0;\n      if (this._dataView && 'getPagingInfo' in this._dataView) {\n        dataLn = this._dataView?.getPagingInfo().pageSize || this._dataView.getLength();\n      } else {\n        dataLn = this._grid.getDataLength();\n      }\n\n      if (active && (e.shiftKey || e.ctrlKey) && !e.altKey && this.isKeyAllowed(e.key as string, e.shiftKey)) {\n        ranges = this.getSelectedRanges().slice();\n        if (!ranges.length) {\n          ranges.push(new SlickRange(active.row, active.cell));\n        }\n        // keyboard can work with last range only\n        last = ranges.pop() as SlickRange_;\n\n        // can't handle selection out of active cell\n        if (!last.contains(active.row, active.cell)) {\n          last = new SlickRange(active.row, active.cell);\n        }\n\n        let dRow = last.toRow - last.fromRow;\n        let dCell = last.toCell - last.fromCell;\n        let toCell: undefined | number;\n        let toRow = 0;\n\n        // when using Ctrl+{a, A} we will change our position to cell 0,0 and select all grid cells\n        if (e.ctrlKey && e.key?.toLowerCase() === 'a') {\n          this._grid.setActiveCell(0, 0, false, false, true);\n          active.row = 0;\n          active.cell = 0;\n          toCell = colLn - 1;\n          toRow = dataLn - 1;\n        }\n\n        // walking direction\n        const dirRow = active.row === last.fromRow ? 1 : -1;\n        const dirCell = active.cell === last.fromCell ? 1 : -1;\n        const isSingleKeyMove = e.key!.startsWith('Arrow');\n\n        if (isSingleKeyMove && !e.ctrlKey) {\n          // single cell move: (Arrow{Up/ArrowDown/ArrowLeft/ArrowRight})\n          if (e.key === 'ArrowLeft') {\n            dCell -= dirCell;\n          } else if (e.key === 'ArrowRight') {\n            dCell += dirCell;\n          } else if (e.key === 'ArrowUp') {\n            dRow -= dirRow;\n          } else if (e.key === 'ArrowDown') {\n            dRow += dirRow;\n          }\n          toRow = active.row + dirRow * dRow;\n        } else {\n          // multiple cell moves: (Home, End, Page{Up/Down})\n          if (this._cachedPageRowCount < 1) {\n            this._cachedPageRowCount = this._grid.getViewportRowCount();\n          }\n          if (this._prevSelectedRow === undefined) {\n            this._prevSelectedRow = active.row;\n          }\n\n          if ((!e.ctrlKey && e.shiftKey && e.key === 'Home') || (e.ctrlKey && e.shiftKey && e.key === 'ArrowLeft')) {\n            toCell = 0;\n            toRow = active.row;\n          } else if ((!e.ctrlKey && e.shiftKey && e.key === 'End') || (e.ctrlKey && e.shiftKey && e.key === 'ArrowRight')) {\n            toCell = colLn - 1;\n            toRow = active.row;\n          } else if (e.ctrlKey && e.shiftKey && e.key === 'ArrowUp') {\n            toRow = 0;\n          } else if (e.ctrlKey && e.shiftKey && e.key === 'ArrowDown') {\n            toRow = dataLn - 1;\n          } else if (e.ctrlKey && e.shiftKey && e.key === 'Home') {\n            toCell = 0;\n            toRow = 0;\n          } else if (e.ctrlKey && e.shiftKey && e.key === 'End') {\n            toCell = colLn - 1;\n            toRow = dataLn - 1;\n          } else if (e.key === 'PageUp') {\n            if (this._prevSelectedRow >= 0) {\n              toRow = this._prevSelectedRow - this._cachedPageRowCount;\n            }\n            if (toRow < 0) {\n              toRow = 0;\n            }\n          } else if (e.key === 'PageDown') {\n            if (this._prevSelectedRow <= dataLn - 1) {\n              toRow = this._prevSelectedRow + this._cachedPageRowCount;\n            }\n            if (toRow > dataLn - 1) {\n              toRow = dataLn - 1;\n            }\n          }\n          this._prevSelectedRow = toRow;\n        }\n\n        // define new selection range\n        toCell ??= active.cell + dirCell * dCell;\n        const new_last = new SlickRange(active.row, active.cell, toRow, toCell);\n        if (this.removeInvalidRanges([new_last]).length) {\n          ranges.push(new_last);\n          const viewRow = dirRow > 0 ? new_last.toRow : new_last.fromRow;\n          const viewCell = dirCell > 0 ? new_last.toCell : new_last.fromCell;\n\n          if (isSingleKeyMove) {\n            this._grid.scrollRowIntoView(viewRow);\n            this._grid.scrollCellIntoView(viewRow, viewCell);\n          } else {\n            this._grid.scrollRowIntoView(toRow);\n            this._grid.scrollCellIntoView(toRow, viewCell);\n          }\n        } else {\n          ranges.push(last);\n        }\n\n        this.setSelectedRanges(ranges, undefined, '');\n\n        e.preventDefault();\n        e.stopPropagation();\n        this._prevKeyDown = e.key as string;\n      }\n    } else {\n      const activeRow = this._grid.getActiveCell();\n      if (this._grid.getOptions().multiSelect && activeRow\n        && e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey\n        && (e.which === keyCode.UP || e.which === keyCode.DOWN)) {\n        let selectedRows = this.getSelectedRows();\n        selectedRows.sort((x, y) => x - y);\n\n        if (!selectedRows.length) {\n          selectedRows = [activeRow.row];\n        }\n\n        let active: number;\n        let top = selectedRows[0];\n        let bottom = selectedRows[selectedRows.length - 1];\n\n        if (e.which === keyCode.DOWN) {\n          active = activeRow.row < bottom || top === bottom ? ++bottom : ++top;\n        } else {\n          active = activeRow.row < bottom ? --bottom : --top;\n        }\n\n        if (active >= 0 && active < this._grid.getDataLength()) {\n          this._grid.scrollRowIntoView(active);\n          const tempRanges = this.rowsToRanges(this.getRowsRange(top, bottom));\n          this.setSelectedRanges(tempRanges);\n        }\n\n        e.preventDefault();\n        e.stopPropagation();\n      }\n    }\n  }\n\n  protected handleClick(e: SlickEventData_): boolean | void {\n    if (!this._activeSelectionIsRow) { return; }\n\n    const cell = this._grid.getCellFromEvent(e);\n    if (!cell || !this._grid.canCellBeActive(cell.row, cell.cell)) {\n      return false;\n    }\n\n    if (!this._grid.getOptions().multiSelect || (\n      !e.ctrlKey && !e.shiftKey && !e.metaKey)) {\n      return false;\n    }\n\n    let selection = this.rangesToRows(this._ranges);\n    const idx = selection.indexOf(cell.row);\n\n    if (idx === -1 && (e.ctrlKey || e.metaKey)) {\n      selection.push(cell.row);\n      this._grid.setActiveCell(cell.row, cell.cell);\n    } else if (idx !== -1 && (e.ctrlKey || e.metaKey)) {\n      selection = selection.filter((o) => o !== cell.row);\n      this._grid.setActiveCell(cell.row, cell.cell);\n    } else if (selection.length && e.shiftKey) {\n      const last = selection.pop() as number;\n      const from = Math.min(cell.row, last);\n      const to = Math.max(cell.row, last);\n      selection = [];\n      for (let i = from; i <= to; i++) {\n        if (i !== last) {\n          selection.push(i);\n        }\n      }\n      selection.push(last);\n      this._grid.setActiveCell(cell.row, cell.cell);\n    }\n\n    const tempRanges = this.rowsToRanges(selection);\n    this.setSelectedRanges(tempRanges);\n    e.stopImmediatePropagation();\n\n    return true;\n  }\n\n  protected handleBeforeCellRangeSelected(e: SlickEventData_, cell: { row: number; cell: number; }): boolean | void {\n    if (this._activeSelectionIsRow) {\n      if (!this._isRowMoveManagerHandler) {\n        const rowMoveManager = this._grid.getPluginByName<SlickRowMoveManager_>('RowMoveManager') || this._grid.getPluginByName<SlickCrossGridRowMoveManager_>('CrossGridRowMoveManager');\n        this._isRowMoveManagerHandler = rowMoveManager ? rowMoveManager.isHandlerColumn : Utils.noop;\n      }\n      if (this._grid.getEditorLock().isActive() || this._isRowMoveManagerHandler(cell.cell)) {\n        e.stopPropagation();\n        return false;\n      }\n      this._grid.setActiveCell(cell.row, cell.cell);\n    } else {\n      if (this._grid.getEditorLock().isActive()) {\n        e.stopPropagation();\n        return false;\n      }\n    }\n  }\n\n  protected handleCellRangeSelected(_e: SlickEventData_, args: { range: SlickRange_; selectionMode: string; allowAutoEdit?: boolean; caller: 'onCellRangeSelecting' | 'onCellRangeSelected' }) {\n    //console.log('hybridSelectionModel.handleCellRangeSelected: ' + JSON.stringify(args.range) + '/' + args.selectionMode);\n    if (this._activeSelectionIsRow) {\n      if (!this._grid.getOptions().multiSelect || (!this._options?.selectActiveRow && this._options?.selectionType !== 'row')) {\n        return false;\n      }\n      this.setSelectedRanges([new SlickRange(args.range.fromRow, 0, args.range.toRow, this._grid.getColumns().length - 1)], undefined, args.selectionMode);\n    } else {\n      if (args.caller === 'onCellRangeSelecting') {\n        return false;\n      }\n      this._grid.setActiveCell(args.range.fromRow, args.range.fromCell, (args.allowAutoEdit ? undefined : false), false, true);\n      this.setSelectedRanges([args.range], undefined, args.selectionMode);\n    }\n    return true;\n  }\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  Utils.extend(true, window, {\n    Slick: {\n      HybridSelectionModel: SlickHybridSelectionModel\n    }\n  });\n}\n", "import { BindingEventService as BindingEventService_, Event as SlickEvent_, Utils as Utils_ } from '../slick.core.js';\nimport type { GridOption, GridSize, ResizerOption } from '../models/index.js';\nimport type { SlickGrid } from '../slick.grid.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst BindingEventService = IIFE_ONLY ? Slick.BindingEventService : BindingEventService_;\nconst SlickEvent = IIFE_ONLY ? Slick.Event : SlickEvent_;\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\n// define some constants, height/width are in pixels\nconst DATAGRID_MIN_HEIGHT = 180;\nconst DATAGRID_MIN_WIDTH = 300;\nconst DATAGRID_BOTTOM_PADDING = 20;\n\n/***\n * A Resizer plugin that can be used to auto-resize a grid and/or resize with fixed dimensions.\n * When fixed height is defined, it will auto-resize only the width and vice versa with the width defined.\n * You can also choose to use the flag \"enableAutoSizeColumns\" if you want to the plugin to\n * automatically call the grid \"autosizeColumns()\" method after each resize.\n *\n * USAGE:\n *\n * Add the \"slick.resizer.js\" file and register it with the grid.\n *\n * You can specify certain options as arguments when instantiating the plugin like so:\n * var resizer = new Slick.Plugins.Resizer({\n *   container: '#gridContainer',\n *   rightPadding: 15,\n *   bottomPadding: 20,\n *   minHeight: 180,\n *   minWidth: 300,\n * });\n * grid.registerPlugin(resizer);\n *\n *\n * The plugin exposes the following events:\n *\n *    onGridAfterResize:  Fired after the grid got resized.  You can customize the menu or dismiss it by returning false.\n *        Event args:\n *            grid:       Reference to the grid.\n *            dimensions: Resized grid dimensions used\n *\n *    onGridBeforeResize:   Fired before the grid gets resized.  You can customize the menu or dismiss it by returning false.\n *        Event args:\n *            grid:     Reference to the grid.\n *\n *\n * @param {Object} options available plugin options that can be passed in the constructor:\n *   container:      (REQUIRED) DOM element selector of the page container, basically what element in the page will be used to calculate the available space\n *   gridContainer:             DOM element selector of the grid container, optional but when provided it will be resized with same size as the grid (typically a container holding the grid and extra custom footer/pagination)\n *   applyResizeToContainer:    Defaults to false, do we want to apply the resized dimentions to the grid container as well?\n *   rightPadding:              Defaults to 0, right side padding to remove from the total dimension\n *   bottomPadding:             Defaults to 20, bottom padding to remove from the total dimension\n *   minHeight:                 Defaults to 180, minimum height of the grid\n *   minWidth:                  Defaults to 300, minimum width of the grid\n *   maxHeight:                 Maximum height of the grid\n *   maxWidth:                  Maximum width of the grid\n *   calculateAvailableSizeBy:  Defaults to \"window\", which DOM element (\"container\" or \"window\") are we using to calculate the available size for the grid?\n *\n * @class Slick.Plugins.Resizer\n */\n\nexport class SlickResizer {\n  // --\n  // public API\n  pluginName = 'Resizer' as const;\n  onGridAfterResize = new SlickEvent<{ grid: SlickGrid; dimensions: GridSize; }>('onGridAfterResize');\n  onGridBeforeResize = new SlickEvent<{ grid: SlickGrid; }>('onGridBeforeResize');\n\n  // --\n  // protected props\n  protected _bindingEventService: BindingEventService_;\n  protected _fixedHeight?: number | null;\n  protected _fixedWidth?: number | null;\n  protected _grid!: SlickGrid;\n  protected _gridDomElm!: HTMLElement;\n  protected _gridContainerElm!: HTMLElement;\n  protected _pageContainerElm!: HTMLElement;\n  protected _gridOptions!: GridOption;\n  protected _gridUid = '';\n  protected _lastDimensions?: GridSize;\n  protected _resizePaused = false;\n  protected _timer?: number;\n  protected _options: ResizerOption;\n  protected _defaults: ResizerOption = {\n    bottomPadding: 20,\n    applyResizeToContainer: false,\n    minHeight: 180,\n    minWidth: 300,\n    rightPadding: 0\n  };\n\n  constructor(options: Partial<ResizerOption>, fixedDimensions?: { height?: number; width?: number; }) {\n    this._bindingEventService = new BindingEventService();\n    this._options = Utils.extend(true, {}, this._defaults, options);\n    if (fixedDimensions) {\n      this._fixedHeight = fixedDimensions.height;\n      this._fixedWidth = fixedDimensions.width;\n    }\n  }\n\n  setOptions(newOptions: Partial<ResizerOption>) {\n    this._options = Utils.extend(true, {}, this._defaults, this._options, newOptions);\n  }\n\n  init(grid: SlickGrid) {\n    this.setOptions(this._options);\n    this._grid = grid;\n    this._gridOptions = this._grid.getOptions();\n    this._gridUid = this._grid.getUID();\n    this._gridDomElm = this._grid.getContainerNode();\n    this._pageContainerElm = typeof this._options.container === 'string'\n      ? document.querySelector(this._options.container) as HTMLElement\n      : this._options.container as HTMLElement;\n\n    if (this._options.gridContainer) {\n      this._gridContainerElm = this._options.gridContainer as HTMLElement;\n    }\n\n    Utils.addSlickEventPubSubWhenDefined(grid.getPubSubService(), this);\n    if (this._gridOptions) {\n      this.bindAutoResizeDataGrid();\n    }\n  }\n\n  /** Bind an auto resize trigger on the datagrid, if that is enable then it will resize itself to the available space\n  * Options: we could also provide a % factor to resize on each height/width independently\n  */\n  bindAutoResizeDataGrid(newSizes?: GridSize) {\n    const gridElmOffset = Utils.offset(this._gridDomElm);\n\n    // if we can't find the grid to resize, return without binding anything\n    if (this._gridDomElm !== undefined || gridElmOffset !== undefined) {\n      // -- 1st resize the datagrid size at first load (we need this because the .on event is not triggered on first load)\n      // -- also we add a slight delay (in ms) so that we resize after the grid render is done\n      this.resizeGrid(0, newSizes, null);\n\n      // -- 2nd bind a trigger on the Window DOM element, so that it happens also when resizing after first load\n      // -- bind auto-resize to Window object only if it exist\n      this._bindingEventService.bind(window, 'resize', (event) => {\n        this.onGridBeforeResize.notify({ grid: this._grid }, event, this);\n\n        // unless the resizer is paused, let's go and resize the grid\n        if (!this._resizePaused) {\n          // for some yet unknown reason, calling the resize twice removes any stuttering/flickering\n          // when changing the height and makes it much smoother experience\n          this.resizeGrid(0, newSizes, event);\n          this.resizeGrid(0, newSizes, event);\n        }\n      });\n    }\n  }\n\n  /**\n   * Calculate the datagrid new height/width from the available space, also consider that a % factor might be applied to calculation\n   */\n  calculateGridNewDimensions(): GridSize | null {\n    const gridElmOffset = Utils.offset(this._gridDomElm);\n\n    if (!window || this._pageContainerElm === undefined || this._gridDomElm === undefined || gridElmOffset === undefined) {\n      return null;\n    }\n\n    // calculate bottom padding\n    const bottomPadding = (this._options?.bottomPadding !== undefined) ? this._options.bottomPadding : DATAGRID_BOTTOM_PADDING;\n\n    let gridHeight = 0;\n    let gridOffsetTop = 0;\n\n    // which DOM element are we using to calculate the available size for the grid?\n    // defaults to \"window\"\n    if (this._options.calculateAvailableSizeBy === 'container') {\n      // uses the container's height to calculate grid height without any top offset\n      gridHeight = Utils.innerSize(this._pageContainerElm, 'height') || 0;\n    } else {\n      // uses the browser's window height with its top offset to calculate grid height\n      gridHeight = window.innerHeight || 0;\n      gridOffsetTop = (gridElmOffset !== undefined) ? gridElmOffset.top : 0;\n    }\n\n    const availableHeight = gridHeight - gridOffsetTop - bottomPadding;\n    const availableWidth = Utils.innerSize(this._pageContainerElm, 'width') || window.innerWidth || 0;\n    const maxHeight = this._options?.maxHeight || undefined;\n    const minHeight = (this._options?.minHeight !== undefined) ? this._options.minHeight : DATAGRID_MIN_HEIGHT;\n    const maxWidth = this._options?.maxWidth || undefined;\n    const minWidth = (this._options?.minWidth !== undefined) ? this._options.minWidth : DATAGRID_MIN_WIDTH;\n\n    let newHeight = availableHeight;\n    let newWidth = (this._options?.rightPadding) ? availableWidth - this._options.rightPadding : availableWidth;\n\n    // optionally (when defined), make sure that grid height & width are within their thresholds\n    if (newHeight < minHeight) {\n      newHeight = minHeight;\n    }\n    if (maxHeight && newHeight > maxHeight) {\n      newHeight = maxHeight;\n    }\n    if (newWidth < minWidth) {\n      newWidth = minWidth;\n    }\n    if (maxWidth && newWidth > maxWidth) {\n      newWidth = maxWidth;\n    }\n\n    // return the new dimensions unless a fixed height/width was defined\n    return {\n      height: this._fixedHeight || newHeight,\n      width: this._fixedWidth || newWidth\n    };\n  }\n\n  /** Destroy function when element is destroyed */\n  destroy() {\n    this.onGridBeforeResize.unsubscribe();\n    this.onGridAfterResize.unsubscribe();\n    this._bindingEventService.unbindAll();\n  }\n\n  /**\n  * Return the last resize dimensions used by the service\n  * @return {object} last dimensions (height: number, width: number)\n  */\n  getLastResizeDimensions() {\n    return this._lastDimensions;\n  }\n\n  /**\n   * Provide the possibility to pause the resizer for some time, until user decides to re-enabled it later if he wish to.\n   * @param {boolean} isResizePaused are we pausing the resizer?\n   */\n  pauseResizer(isResizePaused: boolean) {\n    this._resizePaused = isResizePaused;\n  }\n\n  /**\n   * Resize the datagrid to fit the browser height & width.\n   * @param {number} [delay] to wait before resizing, defaults to 0 (in milliseconds)\n   * @param {object} [newSizes] can optionally be passed (height: number, width: number)\n   * @param {object} [event] that triggered the resize, defaults to null\n   * @return If the browser supports it, we can return a Promise that would resolve with the new dimensions\n   */\n  resizeGrid(delay?: number, newSizes?: GridSize, event?: Event | null): Promise<GridSize | undefined> | void {\n    // because of the javascript async nature, we might want to delay the resize a little bit\n    const resizeDelay = delay || 0;\n\n    // return a Promise when supported by the browser\n    if (typeof Promise === 'function') {\n      return new Promise((resolve) => {\n        if (resizeDelay > 0) {\n          window.clearTimeout(this._timer);\n          this._timer = window.setTimeout(() => {\n            resolve(this.resizeGridCallback(newSizes, event));\n          }, resizeDelay);\n        } else {\n          resolve(this.resizeGridCallback(newSizes, event));\n        }\n      });\n    } else {\n      // OR no return when Promise isn't supported\n      if (resizeDelay > 0) {\n        window.clearTimeout(this._timer);\n        this._timer = window.setTimeout(() => {\n          this.resizeGridCallback(newSizes, event);\n        }, resizeDelay);\n      } else {\n        this.resizeGridCallback(newSizes, event);\n      }\n    }\n  }\n\n  protected resizeGridCallback(newSizes?: GridSize, event?: Event | null) {\n    const lastDimensions = this.resizeGridWithDimensions(newSizes) as GridSize;\n    this.onGridAfterResize.notify({ grid: this._grid, dimensions: lastDimensions }, event, this);\n    return lastDimensions;\n  }\n\n  protected resizeGridWithDimensions(newSizes?: GridSize): GridSize | undefined {\n    // calculate the available sizes with minimum height defined as a varant\n    const availableDimensions = this.calculateGridNewDimensions();\n\n    if ((newSizes || availableDimensions) && this._gridDomElm) {\n      try {\n        // get the new sizes, if new sizes are passed (not 0), we will use them else use available space\n        // basically if user passes 1 of the dimension, let say he passes just the height,\n        // we will use the height as a fixed height but the width will be resized by it's available space\n        const newHeight = (newSizes?.height) ? newSizes.height : availableDimensions?.height;\n        const newWidth = (newSizes?.width) ? newSizes.width : availableDimensions?.width;\n\n        // apply these new height/width to the datagrid\n        if (!this._gridOptions.autoHeight) {\n          this._gridDomElm.style.height = `${newHeight}px`;\n        }\n        this._gridDomElm.style.width = `${newWidth}px`;\n        if (this._gridContainerElm) {\n          this._gridContainerElm.style.width = `${newWidth}px`;\n        }\n\n        // resize the slickgrid canvas on all browser\n        if (this._grid?.resizeCanvas) {\n          this._grid.resizeCanvas();\n        }\n\n        // also call the grid auto-size columns so that it takes available when going bigger\n        if (this._gridOptions?.enableAutoSizeColumns && this._grid.autosizeColumns) {\n          // make sure that the grid still exist (by looking if the Grid UID is found in the DOM tree) to avoid SlickGrid error \"missing stylesheet\"\n          if (this._gridUid && document.querySelector(`.${this._gridUid}`)) {\n            this._grid.autosizeColumns();\n          }\n        }\n\n        // keep last resized dimensions & resolve them to the Promise\n        this._lastDimensions = {\n          height: newHeight,\n          width: newWidth\n        };\n      } catch (e) {\n        this.destroy();\n      }\n    }\n\n    return this._lastDimensions;\n  }\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  Utils.extend(true, window, {\n    Slick: {\n      Plugins: {\n        Resizer: SlickResizer\n      }\n    }\n  });\n}\n\n", "import {\n  SlickEvent as SlickEvent_,\n  type SlickEventData,\n  SlickEventHandler as SlickEventHandler_,\n  Utils as Utils_\n} from '../slick.core.js';\nimport type {\n  Column,\n  FormatterResultWithHtml,\n  GridOption,\n  OnAfterRowDetailToggleArgs,\n  OnBeforeRowDetailToggleArgs,\n  OnRowBackToViewportRangeArgs,\n  OnRowDetailAsyncEndUpdateArgs,\n  OnRowDetailAsyncResponseArgs,\n  OnRowOutOfViewportRangeArgs,\n  RowDetailViewOption,\n  UsabilityOverrideFn\n} from '../models/index.js';\nimport type { SlickDataView } from '../slick.dataview.js';\nimport type { SlickGrid } from '../slick.grid.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst SlickEvent = IIFE_ONLY ? Slick.Event : SlickEvent_;\nconst SlickEventHandler = IIFE_ONLY ? Slick.EventHandler : SlickEventHandler_;\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\n/**\n * A plugin to add row detail panel\n * Original StackOverflow question & article making this possible (thanks to violet313)\n * https://stackoverflow.com/questions/10535164/can-slickgrids-row-height-be-dynamically-altered#29399927\n * http://violet313.org/slickgrids/#intro\n *\n * USAGE:\n * Add the slick.rowDetailView.(js|css) files and register the plugin with the grid.\n *\n * AVAILABLE ROW DETAIL OPTIONS:\n *    cssClass:               A CSS class to be added to the row detail\n *    expandedClass:          Extra classes to be added to the expanded Toggle\n *    expandableOverride:     callback method that user can override the default behavior of making every row an expandable row (the logic to show or not the expandable icon).\n *    collapsedClass:         Extra classes to be added to the collapse Toggle\n *    loadOnce:               Defaults to false, when set to True it will load the data once and then reuse it.\n *    preTemplate:            Template that will be used before the async process (typically used to show a spinner/loading)\n *    postTemplate:           Template that will be loaded once the async function finishes\n *    process:                Async server function call\n *    panelRows:              Row count to use for the template panel\n *    singleRowExpand:        Defaults to false, limit expanded row to 1 at a time.\n *    useRowClick:            Boolean flag, when True will open the row detail on a row click (from any column), default to False\n *    keyPrefix:              Defaults to '_', prefix used for all the plugin metadata added to the item object (meta e.g.: padding, collapsed, parent)\n *    collapseAllOnSort:      Defaults to true, which will collapse all row detail views when user calls a sort. Unless user implements a sort to deal with padding\n *    saveDetailViewOnScroll: Defaults to true, which will save the row detail view in a cache when it detects that it will become out of the viewport buffer\n *    useSimpleViewportCalc:  Defaults to false, which will use simplified calculation of out or back of viewport visibility\n *\n * AVAILABLE PUBLIC METHODS:\n *    init:                 initiliaze the plugin\n *    expandableOverride:   callback method that user can override the default behavior of making every row an expandable row (the logic to show or not the expandable icon).\n *    destroy:              destroy the plugin and it's events\n *    collapseAll:          collapse all opened row detail panel\n *    collapseDetailView:   collapse a row by passing the item object (row detail)\n *    expandDetailView:     expand a row by passing the item object (row detail)\n *    getColumnDefinition:  get the column definitions\n *    getExpandedRows:      get all the expanded rows\n *    getFilterItem:        takes in the item we are filtering and if it is an expanded row returns it's parents row to filter on\n *    getOptions:           get current plugin options\n *    resizeDetailView:     resize a row detail view, it will auto-calculate the number of rows it needs\n *    saveDetailView:       save a row detail view content by passing the row object\n *    setOptions:           set or change some of the plugin options\n *\n * THE PLUGIN EXPOSES THE FOLLOWING SLICK EVENTS:\n *    onAsyncResponse:  This event must be used with the \"notify\" by the end user once the Asynchronous Server call returns the item detail\n *      Event args:\n *        item:         Item detail returned from the async server call\n *        detailView:   An explicit view to use instead of template (Optional)\n *\n *    onAsyncEndUpdate: Fired when the async response finished\n *      Event args:\n *        grid:         Reference to the grid.\n *        item:         Item data context\n *\n *    onBeforeRowDetailToggle: Fired before the row detail gets toggled\n *      Event args:\n *        grid:         Reference to the grid.\n *        item:         Item data context\n *\n *    onAfterRowDetailToggle: Fired after the row detail gets toggled\n *      Event args:\n *        grid:         Reference to the grid.\n *        item:         Item data context\n *        expandedRows: Array of the Expanded Rows\n *\n *    onRowOutOfViewportRange: Fired after a row becomes out of viewport range (user can't see the row anymore)\n *      Event args:\n *        grid:         Reference to the grid.\n *        item:         Item data context\n *        rowId:        Id of the Row object (datacontext) in the Grid\n *        rowIndex:     Index of the Row in the Grid\n *        expandedRows: Array of the Expanded Rows\n *        rowIdsOutOfViewport: Array of the Out of viewport Range Rows\n *\n *    onRowBackToViewportRange: Fired after a row is back to viewport range (user can visually see the row detail)\n *      Event args:\n *        grid:         Reference to the grid.\n *        item:         Item data context\n *        rowId:        Id of the Row object (datacontext) in the Grid\n *        rowIndex:     Index of the Row in the Grid\n *        expandedRows: Array of the Expanded Rows\n *        rowIdsOutOfViewport: Array of the Out of viewport Range Rows\n */\nexport class SlickRowDetailView {\n  // --\n  // public API\n  pluginName = 'RowDetailView' as const;\n  onAsyncResponse = new SlickEvent<OnRowDetailAsyncResponseArgs>('onAsyncResponse');\n  onAsyncEndUpdate = new SlickEvent<OnRowDetailAsyncEndUpdateArgs>('onAsyncEndUpdate');\n  onAfterRowDetailToggle = new SlickEvent<OnAfterRowDetailToggleArgs>('onAfterRowDetailToggle');\n  onBeforeRowDetailToggle = new SlickEvent<OnBeforeRowDetailToggleArgs>('onBeforeRowDetailToggle');\n  onRowBackToViewportRange = new SlickEvent<OnRowBackToViewportRangeArgs>('onRowBackToViewportRange');\n  onRowOutOfViewportRange = new SlickEvent<OnRowOutOfViewportRangeArgs>('onRowOutOfViewportRange');\n\n  // --\n  // protected props\n  protected _grid!: SlickGrid;\n  protected _gridOptions!: GridOption;\n  protected _gridUid = '';\n  protected _dataView!: SlickDataView;\n  protected _dataViewIdProperty = 'id';\n  protected _expandableOverride: UsabilityOverrideFn | null = null;\n  protected _lastRange: { bottom: number; top: number; } | null = null;\n  protected _expandedRows: any[] = [];\n  protected _eventHandler: SlickEventHandler_;\n  protected _outsideRange = 5;\n  protected _visibleRenderedCellCount = 0;\n  protected _options: RowDetailViewOption;\n  protected _defaults = {\n    columnId: '_detail_selector',\n    cssClass: 'detailView-toggle',\n    expandedClass: undefined,\n    collapsedClass: undefined,\n    keyPrefix: '_',\n    loadOnce: false,\n    collapseAllOnSort: true,\n    reorderable: false,\n    saveDetailViewOnScroll: true,\n    singleRowExpand: false,\n    useSimpleViewportCalc: false,\n    alwaysRenderColumn: true,\n    toolTip: '',\n    width: 30,\n    maxRows: undefined\n  } as RowDetailViewOption;\n  protected _keyPrefix = this._defaults.keyPrefix;\n  protected _gridRowBuffer = 0;\n  protected _rowIdsOutOfViewport: Array<number | string> = [];\n\n  /** Constructor of the Row Detail View Plugin which accepts optional options */\n  constructor(options: RowDetailViewOption) {\n    this._options = Utils.extend(true, {}, this._defaults, options);\n    this._eventHandler = new SlickEventHandler();\n\n    // user could override the expandable icon logic from within the options or after instantiating the plugin\n    if (typeof this._options.expandableOverride === 'function') {\n      this.expandableOverride(this._options.expandableOverride);\n    }\n  }\n\n  /**\n   * Initialize the plugin, which requires user to pass the SlickGrid Grid object\n   * @param grid: SlickGrid Grid object\n   */\n  init(grid: SlickGrid) {\n    if (!grid) {\n      throw new Error('RowDetailView Plugin requires the Grid instance to be passed as argument to the \"init()\" method');\n    }\n    this._grid = grid;\n    this._gridUid = grid.getUID();\n    this._gridOptions = grid.getOptions() || {};\n    this._dataView = this._grid.getData<SlickDataView>();\n    this._keyPrefix = this._options?.keyPrefix ?? '_';\n    Utils.addSlickEventPubSubWhenDefined(grid.getPubSubService(), this);\n\n    // Update the minRowBuffer so that the view doesn't disappear when it's at top of screen + the original default 3\n    this._gridRowBuffer = this._gridOptions.minRowBuffer || 0;\n    this._gridOptions.minRowBuffer = this._options.panelRows + 3;\n\n    this._eventHandler\n      .subscribe(this._grid.onClick, this.handleClick.bind(this))\n      .subscribe(this._grid.onScroll, this.handleScroll.bind(this));\n\n    // Sort will, by default, Collapse all of the open items (unless user implements his own onSort which deals with open row and padding)\n    if (this._options.collapseAllOnSort) {\n      this._eventHandler.subscribe(this._grid.onSort, this.collapseAll.bind(this));\n      this._expandedRows = [];\n      this._rowIdsOutOfViewport = [];\n    }\n\n    this._eventHandler.subscribe(this._dataView.onRowCountChanged, () => {\n      this._grid.updateRowCount();\n      this._grid.render();\n    });\n\n    this._eventHandler.subscribe(this._dataView.onRowsChanged, (_e, a) => {\n      this._grid.invalidateRows(a.rows);\n      this._grid.render();\n    });\n\n    // subscribe to the onAsyncResponse so that the plugin knows when the user server side calls finished\n    this.subscribeToOnAsyncResponse();\n\n    // after data is set, let's get the DataView Id Property name used (defaults to \"id\")\n    this._eventHandler.subscribe(this._dataView.onSetItemsCalled, () => {\n      this._dataViewIdProperty = this._dataView?.getIdPropertyName() ?? 'id';\n    });\n\n    // if we use the alternative & simpler calculation of the out of viewport range\n    // we will need to know how many rows are rendered on the screen and we need to wait for grid to be rendered\n    // unfortunately there is no triggered event for knowing when grid is finished, so we use 250ms delay and it's typically more than enough\n    if (this._options.useSimpleViewportCalc) {\n      this._eventHandler.subscribe(this._grid.onRendered, (_e, args) => {\n        if (args?.endRow) {\n          this._visibleRenderedCellCount = args.endRow - args.startRow;\n        }\n      });\n    }\n  }\n\n  /** destroy the plugin and it's events */\n  destroy() {\n    this._eventHandler.unsubscribeAll();\n    this.onAsyncResponse.unsubscribe();\n    this.onAsyncEndUpdate.unsubscribe();\n    this.onAfterRowDetailToggle.unsubscribe();\n    this.onBeforeRowDetailToggle.unsubscribe();\n    this.onRowOutOfViewportRange.unsubscribe();\n    this.onRowBackToViewportRange.unsubscribe();\n  }\n\n  /** Get current plugin options */\n  getOptions() {\n    return this._options;\n  }\n\n  /** set or change some of the plugin options */\n  setOptions(options: Partial<RowDetailViewOption>) {\n    this._options = Utils.extend(true, {}, this._options, options);\n    if (this._options?.singleRowExpand) {\n      this.collapseAll();\n    }\n  }\n\n  /** Find a value in an array and return the index when (or -1 when not found) */\n  protected arrayFindIndex(sourceArray: any[], value: any) {\n    if (Array.isArray(sourceArray)) {\n      for (let i = 0; i < sourceArray.length; i++) {\n        if (sourceArray[i] === value) {\n          return i;\n        }\n      }\n    }\n    return -1;\n  }\n\n  /** Handle mouse click event */\n  protected handleClick(e: SlickEventData, args: { row: number; cell: number; }) {\n    const dataContext = this._grid.getDataItem(args.row);\n    if (!this.checkExpandableOverride(args.row, dataContext, this._grid)) {\n      return;\n    }\n\n    // clicking on a row select checkbox\n    if (this._options.useRowClick || this._grid.getColumns()[args.cell]['id'] === this._options.columnId && (e.target as HTMLDivElement).classList.contains(this._options.cssClass || '')) {\n      // if editing, try to commit\n      if (this._grid.getEditorLock().isActive() && !this._grid.getEditorLock().commitCurrentEdit()) {\n        e.preventDefault();\n        e.stopImmediatePropagation();\n        return;\n      }\n\n      // trigger an event before toggling\n      // user could cancel the Row Detail opening when event is returning false\n      if (this.onBeforeRowDetailToggle.notify({ grid: this._grid, item: dataContext }, e, this).getReturnValue() === false) {\n        return;\n      }\n\n      this.toggleRowSelection(args.row, dataContext);\n\n      // trigger an event after toggling\n      this.onAfterRowDetailToggle.notify({\n        grid: this._grid,\n        item: dataContext,\n        expandedRows: this._expandedRows,\n      }, e, this);\n\n      e.stopPropagation();\n      e.stopImmediatePropagation();\n    }\n  }\n\n  /** If we scroll save detail views that go out of cache range */\n  protected handleScroll() {\n    if (this._options.useSimpleViewportCalc) {\n      this.calculateOutOfRangeViewsSimplerVersion();\n    } else {\n      this.calculateOutOfRangeViews();\n    }\n  }\n\n  /** Calculate when expanded rows become out of view range */\n  protected calculateOutOfRangeViews() {\n    let scrollDir = '';\n    if (this._grid) {\n      const renderedRange = this._grid.getRenderedRange();\n      // Only check if we have expanded rows\n      if (this._expandedRows.length > 0) {\n        // Assume scroll direction is down by default.\n        scrollDir = 'DOWN';\n        if (this._lastRange) {\n          // Some scrolling isn't anything as the range is the same\n          if (this._lastRange.top === renderedRange.top && this._lastRange.bottom === renderedRange.bottom) {\n            return;\n          }\n\n          // If our new top is smaller we are scrolling up\n          if (this._lastRange.top > renderedRange.top ||\n            // Or we are at very top but our bottom is increasing\n            (this._lastRange.top === 0 && renderedRange.top === 0) && this._lastRange.bottom > renderedRange.bottom) {\n            scrollDir = 'UP';\n          }\n        }\n      }\n\n      this._expandedRows.forEach((row) => {\n        const rowIndex = this._dataView?.getRowById(row[this._dataViewIdProperty]) ?? 0;\n        const rowPadding = row[`${this._keyPrefix}sizePadding`];\n        const rowOutOfRange = this.arrayFindIndex(this._rowIdsOutOfViewport, row[this._dataViewIdProperty]) >= 0;\n\n        if (scrollDir === 'UP') {\n          // save the view when asked\n          if (this._options.saveDetailViewOnScroll) {\n            // If the bottom item within buffer range is an expanded row save it.\n            if (rowIndex >= renderedRange.bottom - this._gridRowBuffer) {\n              this.saveDetailView(row);\n            }\n          }\n\n          // If the row expanded area is within the buffer notify that it is back in range\n          if (rowOutOfRange && rowIndex - this._outsideRange < renderedRange.top && rowIndex >= renderedRange.top) {\n            this.notifyBackToViewportWhenDomExist(row, row[this._dataViewIdProperty]);\n          }\n\n          // if our first expanded row is about to go off the bottom\n          else if (!rowOutOfRange && (rowIndex + rowPadding) > renderedRange.bottom) {\n            this.notifyOutOfViewport(row, row[this._dataViewIdProperty]);\n          }\n        }\n        else if (scrollDir === 'DOWN') {\n          // save the view when asked\n          if (this._options.saveDetailViewOnScroll) {\n            // If the top item within buffer range is an expanded row save it.\n            if (rowIndex <= renderedRange.top + this._gridRowBuffer) {\n              this.saveDetailView(row);\n            }\n          }\n\n          // If row index is i higher than bottom with some added value (To ignore top rows off view) and is with view and was our of range\n          if (rowOutOfRange && (rowIndex + rowPadding + this._outsideRange) > renderedRange.bottom && rowIndex < rowIndex + rowPadding) {\n            this.notifyBackToViewportWhenDomExist(row, row[this._dataViewIdProperty]);\n          }\n          // if our row is outside top of and the buffering zone but not in the array of outOfVisable range notify it\n          else if (!rowOutOfRange && rowIndex < renderedRange.top) {\n            this.notifyOutOfViewport(row, row[this._dataViewIdProperty]);\n          }\n        }\n      });\n      this._lastRange = renderedRange;\n    }\n  }\n\n  /** This is an alternative & more simpler version of the Calculate when expanded rows become out of view range */\n  protected calculateOutOfRangeViewsSimplerVersion() {\n    if (this._grid) {\n      const renderedRange = this._grid.getRenderedRange();\n\n      this._expandedRows.forEach((row) => {\n        const rowIndex = this._dataView.getRowById(row[this._dataViewIdProperty]) ?? -1;\n        const isOutOfVisibility = this.checkIsRowOutOfViewportRange(rowIndex, renderedRange);\n        if (!isOutOfVisibility && this.arrayFindIndex(this._rowIdsOutOfViewport, row[this._dataViewIdProperty]) >= 0) {\n          this.notifyBackToViewportWhenDomExist(row, row[this._dataViewIdProperty]);\n        } else if (isOutOfVisibility) {\n          this.notifyOutOfViewport(row, row[this._dataViewIdProperty]);\n        }\n      });\n    }\n  }\n\n  /**\n   * Check if the row became out of visible range (when user can't see it anymore)\n   * @param rowIndex\n   * @param renderedRange from SlickGrid\n   */\n  protected checkIsRowOutOfViewportRange(rowIndex: number, renderedRange: any) {\n    if (Math.abs(renderedRange.bottom - this._gridRowBuffer - rowIndex) > this._visibleRenderedCellCount * 2) {\n      return true;\n    }\n    return false;\n  }\n\n  /** Send a notification, through \"onRowOutOfViewportRange\", that is out of the viewport range */\n  protected notifyOutOfViewport(item: any, rowId: number | string) {\n    const rowIndex = (item.rowIndex || this._dataView.getRowById(item[this._dataViewIdProperty])) as number;\n\n    this.onRowOutOfViewportRange.notify({\n      grid: this._grid,\n      item,\n      rowId,\n      rowIndex,\n      expandedRows: this._expandedRows,\n      rowIdsOutOfViewport: this.syncOutOfViewportArray(rowId, true)\n    }, null, this);\n  }\n\n  /** Send a notification, through \"onRowBackToViewportRange\", that a row came back into the viewport visible range */\n  protected notifyBackToViewportWhenDomExist(item: any, rowId: number | string) {\n    const rowIndex = (item.rowIndex || this._dataView.getRowById(item[this._dataViewIdProperty])) as number;\n\n    window.setTimeout(() => {\n      // make sure View Row DOM Element really exist before notifying that it's a row that is visible again\n      if (document.querySelector(`.${this._gridUid} .cellDetailView_${item[this._dataViewIdProperty]}`)) {\n        this.onRowBackToViewportRange.notify({\n          grid: this._grid,\n          item,\n          rowId,\n          rowIndex,\n          expandedRows: this._expandedRows,\n          rowIdsOutOfViewport: this.syncOutOfViewportArray(rowId, false)\n        }, null, this);\n      }\n    }, 100);\n  }\n\n  /**\n   * This function will sync the \"out of viewport\" array whenever necessary.\n   * The sync can add a detail row (when necessary, no need to add again if it already exist) or delete a row from the array.\n   * @param rowId: number\n   * @param isAdding: are we adding or removing a row?\n   */\n  protected syncOutOfViewportArray(rowId: number | string, isAdding: boolean) {\n    const arrayRowIndex = this.arrayFindIndex(this._rowIdsOutOfViewport, rowId);\n\n    if (isAdding && arrayRowIndex < 0) {\n      this._rowIdsOutOfViewport.push(rowId);\n    } else if (!isAdding && arrayRowIndex >= 0) {\n      this._rowIdsOutOfViewport.splice(arrayRowIndex, 1);\n    }\n    return this._rowIdsOutOfViewport;\n  }\n\n  // Toggle between showing or hiding a row\n  protected toggleRowSelection(rowNumber: number, dataContext: any) {\n    if (!this.checkExpandableOverride(rowNumber, dataContext, this._grid)) {\n      return;\n    }\n\n    this._dataView.beginUpdate();\n    this.handleAccordionShowHide(dataContext);\n    this._dataView.endUpdate();\n  }\n\n  /** Collapse all of the open detail rows */\n  collapseAll() {\n    this._dataView.beginUpdate();\n    for (let i = this._expandedRows.length - 1; i >= 0; i--) {\n      this.collapseDetailView(this._expandedRows[i], true);\n    }\n    this._dataView.endUpdate();\n  }\n\n  /** Collapse a detail row so that it is not longer open */\n  collapseDetailView(item: any, isMultipleCollapsing = false) {\n    if (!isMultipleCollapsing) {\n      this._dataView.beginUpdate();\n    }\n    // Save the details on the collapse assuming onetime loading\n    if (this._options.loadOnce) {\n      this.saveDetailView(item);\n    }\n\n    item[`${this._keyPrefix}collapsed`] = true;\n    for (let idx = 1; idx <= item[`${this._keyPrefix}sizePadding`]; idx++) {\n      this._dataView.deleteItem(item[this._dataViewIdProperty] + '.' + idx);\n    }\n    item[`${this._keyPrefix}sizePadding`] = 0;\n    this._dataView.updateItem(item[this._dataViewIdProperty], item);\n\n    // Remove the item from the expandedRows\n    this._expandedRows = this._expandedRows.filter((r) => {\n      return r[this._dataViewIdProperty] !== item[this._dataViewIdProperty];\n    });\n\n    if (!isMultipleCollapsing) {\n      this._dataView.endUpdate();\n    }\n  }\n\n  /** Expand a detail row by providing the dataview item that is to be expanded */\n  expandDetailView(item: any) {\n    if (this._options?.singleRowExpand) {\n      this.collapseAll();\n    }\n\n    item[`${this._keyPrefix}collapsed`] = false;\n    this._expandedRows.push(item);\n\n    // In the case something went wrong loading it the first time such a scroll of screen before loaded\n    if (!item[`${this._keyPrefix}detailContent`]) {\n      item[`${this._keyPrefix}detailViewLoaded`] = false;\n    }\n    // display pre-loading template\n    if (!item[`${this._keyPrefix}detailViewLoaded`] || this._options.loadOnce !== true) {\n      item[`${this._keyPrefix}detailContent`] = this._options?.preTemplate?.(item);\n    } else {\n      this.onAsyncResponse.notify({\n        item,\n        itemDetail: item,\n        detailView: item[`${this._keyPrefix}detailContent`],\n        grid: this._grid\n      }, undefined, this);\n      this.applyTemplateNewLineHeight(item);\n      this._dataView.updateItem(item[this._dataViewIdProperty], item);\n\n      return;\n    }\n\n    this.applyTemplateNewLineHeight(item);\n    this._dataView.updateItem(item[this._dataViewIdProperty], item);\n\n    // async server call\n    this._options.process(item);\n  }\n\n  /** Saves the current state of the detail view */\n  saveDetailView(item: any) {\n    const view = document.querySelector(`.${this._gridUid} .innerDetailView_${item[this._dataViewIdProperty]}`);\n    if (view) {\n      const html = view.innerHTML;\n      if (html !== undefined) {\n        item[`${this._keyPrefix}detailContent`] = html;\n      }\n    }\n  }\n\n  /**\n   * subscribe to the onAsyncResponse so that the plugin knows when the user server side calls finished\n   * the response has to be as \"args.item\" (or \"args.itemDetail\") with it's data back\n   */\n  protected subscribeToOnAsyncResponse() {\n    this.onAsyncResponse.subscribe((e, args) => {\n      if (!args || (!args.item && !args.itemDetail)) {\n        throw 'Slick.RowDetailView plugin requires the onAsyncResponse() to supply \"args.item\" property.';\n      }\n\n      // we accept item/itemDetail, just get the one which has data\n      const itemDetail = args.item || args.itemDetail;\n\n      // If we just want to load in a view directly we can use detailView property to do so\n      if (args.detailView) {\n        itemDetail[`${this._keyPrefix}detailContent`] = args.detailView;\n      } else {\n        itemDetail[`${this._keyPrefix}detailContent`] = this._options?.postTemplate?.(itemDetail);\n      }\n\n      itemDetail[`${this._keyPrefix}detailViewLoaded`] = true;\n      this._dataView.updateItem(itemDetail[this._dataViewIdProperty], itemDetail);\n\n      // trigger an event once the post template is finished loading\n      this.onAsyncEndUpdate.notify({\n        grid: this._grid,\n        item: itemDetail,\n        itemDetail\n      }, e, this);\n    });\n  }\n\n  /** When row is getting toggled, we will handle the action of collapsing/expanding */\n  protected handleAccordionShowHide(item: any) {\n    if (item) {\n      if (!item[`${this._keyPrefix}collapsed`]) {\n        this.collapseDetailView(item);\n      } else {\n        this.expandDetailView(item);\n      }\n    }\n  }\n\n  //////////////////////////////////////////////////////////////\n  //////////////////////////////////////////////////////////////\n\n  /** Get the Row Detail padding (which are the rows dedicated to the detail panel) */\n  protected getPaddingItem(parent: any, offset: any) {\n    const item: any = {};\n\n    // copy the parent's columns' field values so that padding rows can follow the parent's group and be filtered/sorted with it\n    this._grid.getColumns().forEach(({ field }) => {\n        item[field] = parent[field];\n    });\n\n    Object.keys(this._dataView).forEach(prop => {\n      item[prop] = null;\n    });\n    item[this._dataViewIdProperty] = parent[this._dataViewIdProperty] + '.' + offset;\n\n    // additional hidden padding metadata fields\n    item[`${this._keyPrefix}collapsed`] = true;\n    item[`${this._keyPrefix}isPadding`] = true;\n    item[`${this._keyPrefix}parent`] = parent;\n    item[`${this._keyPrefix}offset`] = offset;\n\n    return item;\n  };\n\n  /** Create the detail ctr node. this belongs to the dev & can be custom-styled as per */\n  protected applyTemplateNewLineHeight(item: any) {\n    // the height is calculated by the template row count (how many line of items does the template view have)\n    const rowCount = this._options.panelRows;\n\n    // calculate padding requirements based on detail-content..\n    // ie. worst-case: create an invisible dom node now & find it's height.\n    const lineHeight = 13; // we know cuz we wrote the custom css init ;)\n    item[`${this._keyPrefix}sizePadding`] = Math.ceil(((rowCount * 2) * lineHeight) / this._gridOptions.rowHeight!);\n    item[`${this._keyPrefix}height`] = (item[`${this._keyPrefix}sizePadding`] * this._gridOptions.rowHeight!);\n    const idxParent = this._dataView.getIdxById(item[this._dataViewIdProperty]) ?? 0;\n    for (let idx = 1; idx <= item[`${this._keyPrefix}sizePadding`]; idx++) {\n      this._dataView.insertItem(idxParent + idx, this.getPaddingItem(item, idx));\n    }\n  }\n\n  /** Get the Column Definition of the first column dedicated to toggling the Row Detail View */\n  getColumnDefinition() {\n    return {\n      id: this._options.columnId,\n      name: '',\n      reorderable: this._options.reorderable,\n      toolTip: this._options.toolTip,\n      field: 'sel',\n      width: this._options.width,\n      resizable: false,\n      sortable: false,\n      alwaysRenderColumn: this._options.alwaysRenderColumn,\n      cssClass: this._options.cssClass,\n      formatter: this.detailSelectionFormatter.bind(this)\n    };\n  }\n\n  /** Return the currently expanded rows */\n  getExpandedRows() {\n    return this._expandedRows;\n  }\n\n  /** The cell Formatter that shows the icon that will be used to toggle the Row Detail */\n  protected detailSelectionFormatter(row: number, _cell: number, _val: any, _column: Column, dataContext: any, grid: SlickGrid): FormatterResultWithHtml | HTMLElement | '' {\n    if (!this.checkExpandableOverride(row, dataContext, grid)) {\n      return '';\n    } else {\n      if (dataContext[`${this._keyPrefix}collapsed`] === undefined) {\n        dataContext[`${this._keyPrefix}collapsed`] = true;\n        dataContext[`${this._keyPrefix}sizePadding`] = 0;     //the required number of pading rows\n        dataContext[`${this._keyPrefix}height`] = 0;     //the actual height in pixels of the detail field\n        dataContext[`${this._keyPrefix}isPadding`] = false;\n        dataContext[`${this._keyPrefix}parent`] = undefined;\n        dataContext[`${this._keyPrefix}offset`] = 0;\n      }\n\n      if (dataContext[`${this._keyPrefix}isPadding`]) {\n        // render nothing\n      }\n      else if (dataContext[`${this._keyPrefix}collapsed`]) {\n        let collapsedClasses = this._options.cssClass + ' expand ';\n        if (this._options.collapsedClass) {\n          collapsedClasses += this._options.collapsedClass;\n        }\n        return Utils.createDomElement('div', { className: collapsedClasses });\n      }\n      else {\n        const rowHeight = this._gridOptions.rowHeight;\n        let outterHeight = dataContext[`${this._keyPrefix}sizePadding`] * this._gridOptions.rowHeight!;\n\n        if (this._options.maxRows !== undefined && dataContext[`${this._keyPrefix}sizePadding`] > this._options.maxRows) {\n          outterHeight = this._options.maxRows * rowHeight!;\n          dataContext[`${this._keyPrefix}sizePadding`] = this._options.maxRows;\n        }\n\n        // sneaky extra </div> inserted here-----------------v\n        let expandedClasses = this._options.cssClass + ' collapse ';\n        if (this._options.expandedClass) {\n          expandedClasses += this._options.expandedClass;\n        }\n\n        // create the Row Detail div container that will be inserted AFTER the `.slick-cell`\n        const cellDetailContainerElm = Utils.createDomElement('div', {\n          className: `dynamic-cell-detail cellDetailView_${dataContext[this._dataViewIdProperty]}`,\n          style: { height: `${outterHeight}px`, top: `${rowHeight}px` }\n        });\n        const innerContainerElm = Utils.createDomElement('div', { className: `detail-container detailViewContainer_${dataContext[this._dataViewIdProperty]}` });\n        const innerDetailViewElm = Utils.createDomElement('div', { className: `innerDetailView_${dataContext[this._dataViewIdProperty]}` });\n        innerDetailViewElm.innerHTML = this._grid.sanitizeHtmlString(dataContext[`${this._keyPrefix}detailContent`]);\n\n        innerContainerElm.appendChild(innerDetailViewElm);\n        cellDetailContainerElm.appendChild(innerContainerElm);\n\n        const result: FormatterResultWithHtml = {\n          html: Utils.createDomElement('div', { className: expandedClasses }),\n          insertElementAfterTarget: cellDetailContainerElm,\n        };\n\n        return result;\n      }\n    }\n    return '';\n  }\n\n  /** Resize the Row Detail View */\n  resizeDetailView(item: any) {\n    if (!item) {\n      return;\n    }\n\n    // Grad each of the DOM elements\n    const mainContainer = document.querySelector<HTMLDivElement>(`.${this._gridUid} .detailViewContainer_${item[this._dataViewIdProperty]}`);\n    const cellItem = document.querySelector<HTMLDivElement>(`.${this._gridUid} .cellDetailView_${item[this._dataViewIdProperty]}`);\n    const inner = document.querySelector<HTMLDivElement>(`.${this._gridUid} .innerDetailView_${item[this._dataViewIdProperty]}`);\n\n    if (!mainContainer || !cellItem || !inner) {\n      return;\n    }\n\n    for (let idx = 1; idx <= item[`${this._keyPrefix}sizePadding`]; idx++) {\n      this._dataView.deleteItem(`${item[this._dataViewIdProperty]}.${idx}`);\n    }\n\n    const rowHeight = this._gridOptions.rowHeight; // height of a row\n    const lineHeight = 13; // we know cuz we wrote the custom css innit ;)\n\n    // remove the height so we can calculate the height\n    mainContainer.style.minHeight = '';\n\n    // Get the scroll height for the main container so we know the actual size of the view\n    const itemHeight = mainContainer.scrollHeight;\n\n    // Now work out how many rows\n    const rowCount = Math.ceil(itemHeight / rowHeight!);\n\n    item[`${this._keyPrefix}sizePadding`] = Math.ceil(((rowCount * 2) * lineHeight) / rowHeight!);\n    item[`${this._keyPrefix}height`] = itemHeight;\n\n    let outterHeight = (item[`${this._keyPrefix}sizePadding`] * rowHeight!);\n    if (this._options.maxRows !== undefined && item[`${this._keyPrefix}sizePadding`] > this._options.maxRows) {\n      outterHeight = this._options.maxRows * rowHeight!;\n      item[`${this._keyPrefix}sizePadding`] = this._options.maxRows;\n    }\n\n    // If the padding is now more than the original minRowBuff we need to increase it\n    if (this._grid.getOptions().minRowBuffer! < item[`${this._keyPrefix}sizePadding`]) {\n      // Update the minRowBuffer so that the view doesn't disappear when it's at top of screen + the original default 3\n      this._grid.getOptions().minRowBuffer = item[`${this._keyPrefix}sizePadding`] + 3;\n    }\n\n    mainContainer.setAttribute('style', 'min-height: ' + item[`${this._keyPrefix}height`] + 'px');\n    if (cellItem) {\n      cellItem.setAttribute('style', 'height: ' + outterHeight + 'px; top:' + rowHeight + 'px');\n    }\n\n    const idxParent = this._dataView.getIdxById(item[this._dataViewIdProperty]) ?? 0;\n    for (let idx = 1; idx <= item[`${this._keyPrefix}sizePadding`]; idx++) {\n      this._dataView.insertItem(idxParent + idx, this.getPaddingItem(item, idx));\n    }\n\n    // Lastly save the updated state\n    this.saveDetailView(item);\n  }\n\n  /** Takes in the item we are filtering and if it is an expanded row returns it's parents row to filter on */\n  getFilterItem(item: any) {\n    if (item[`${this._keyPrefix}isPadding`] && item[`${this._keyPrefix}parent`]) {\n      item = item[`${this._keyPrefix}parent`];\n    }\n    return item;\n  }\n\n  protected checkExpandableOverride(row: number, dataContext: any, grid: SlickGrid) {\n    if (typeof this._expandableOverride === 'function') {\n      return this._expandableOverride(row, dataContext, grid);\n    }\n    return true;\n  }\n\n  /**\n   * Method that user can pass to override the default behavior or making every row an expandable row.\n   * In order word, user can choose which rows to be an available row detail (or not) by providing his own logic.\n   * @param overrideFn: override function callback\n   */\n  expandableOverride(overrideFn: UsabilityOverrideFn) {\n    this._expandableOverride = overrideFn;\n  }\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  Utils.extend(true, window, {\n    Slick: {\n      Plugins: {\n        RowDetailView: SlickRowDetailView\n      }\n    }\n  });\n}\n\n", "import { SlickEvent as SlickEvent_, type SlickEventData as SlickEventData_, SlickEventHandler as SlickEventHandler_, Utils as Utils_ } from '../slick.core.js';\nimport type { Column, DragRowMove, FormatterResultWithHtml, RowMoveManagerOption, UsabilityOverrideFn } from '../models/index.js';\nimport type { SlickGrid } from '../slick.grid.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst SlickEvent = IIFE_ONLY ? Slick.Event : SlickEvent_;\nconst SlickEventHandler = IIFE_ONLY ? Slick.EventHandler : SlickEventHandler_;\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\n/**\n * Row Move Manager options:\n *    containerCssClass:        A CSS class to be added to the cell container.\n *    cssClass:                 A CSS class to be added to the div of the cell formatter.\n *    columnId:                 Column definition id (defaults to \"_move\")\n *    cancelEditOnDrag:         Do we want to cancel any Editing while dragging a row (defaults to false)\n *    disableRowSelection:      Do we want to disable the row selection? (defaults to false)\n *    hideRowMoveShadow:        Do we want to hide the row move shadow clone? (defaults to true)\n *    rowMoveShadowMarginTop:   When row move shadow is shown, optional margin-top (defaults to 0)\n *    rowMoveShadowMarginLeft:  When row move shadow is shown, optional margin-left (defaults to 0)\n *    rowMoveShadowOpacity:     When row move shadow is shown, what is its opacity? (defaults to 0.95)\n *    rowMoveShadowScale:       When row move shadow is shown, what is its size scale? (default to 0.75)\n *    singleRowMove:            Do we want a single row move? Setting this to false means that it's a multple row move (defaults to false)\n *    width:                    Width of the column\n *    usabilityOverride:        Callback method that user can override the default behavior of the row being moveable or not\n *\n */\n\nexport class SlickRowMoveManager {\n  // --\n  // public API\n  pluginName = 'RowMoveManager' as const;\n  onBeforeMoveRows = new SlickEvent<{ grid: SlickGrid; rows: number[]; insertBefore: number; }>('onBeforeMoveRows');\n  onMoveRows = new SlickEvent<{ grid: SlickGrid; rows: number[]; insertBefore: number; }>('onMoveRows');\n\n  // --\n  // protected props\n  protected _grid!: SlickGrid;\n  protected _canvas!: HTMLElement;\n  protected _dragging = false;\n  protected _eventHandler: SlickEventHandler_;\n  protected _usabilityOverride?: UsabilityOverrideFn;\n  protected _options: RowMoveManagerOption;\n  protected _defaults: RowMoveManagerOption = {\n    columnId: '_move',\n    cssClass: undefined,\n    cancelEditOnDrag: false,\n    disableRowSelection: false,\n    hideRowMoveShadow: true,\n    reorderable: false,\n    rowMoveShadowMarginTop: 0,\n    rowMoveShadowMarginLeft: 0,\n    rowMoveShadowOpacity: 0.95,\n    rowMoveShadowScale: 0.75,\n    singleRowMove: false,\n    width: 40,\n  };\n\n  constructor(options: Partial<RowMoveManagerOption>) {\n    this._options = Utils.extend(true, {}, this._defaults, options);\n    this._eventHandler = new SlickEventHandler();\n  }\n\n\n  init(grid: SlickGrid) {\n    this._grid = grid;\n    this._canvas = this._grid.getCanvasNode();\n    Utils.addSlickEventPubSubWhenDefined(grid.getPubSubService(), this);\n\n    // user could override the expandable icon logic from within the options or after instantiating the plugin\n    if (typeof this._options?.usabilityOverride === 'function') {\n      this.usabilityOverride(this._options.usabilityOverride);\n    }\n\n    this._eventHandler\n      .subscribe(this._grid.onDragInit, this.handleDragInit.bind(this))\n      .subscribe(this._grid.onDragStart, this.handleDragStart.bind(this))\n      .subscribe(this._grid.onDrag, this.handleDrag.bind(this))\n      .subscribe(this._grid.onDragEnd, this.handleDragEnd.bind(this));\n  }\n\n  destroy() {\n    this._eventHandler.unsubscribeAll();\n  }\n\n  setOptions(newOptions: Partial<RowMoveManagerOption>) {\n    this._options = Utils.extend({}, this._options, newOptions);\n  }\n\n  protected handleDragInit(e: SlickEventData_) {\n    // prevent the grid from cancelling drag'n'drop by default\n    e.stopImmediatePropagation();\n  }\n\n  protected handleDragStart(e: SlickEventData_, dd: DragRowMove): boolean | void {\n    const cell = this._grid.getCellFromEvent(e);\n\n    if (!Utils.isDefined(cell)) { return; }\n\n    if (!this.checkUsabilityOverride(cell.row, this._grid.getDataItem(cell.row), this._grid)) {\n      return;\n    }\n\n    if (this._options.cancelEditOnDrag && this._grid.getEditorLock().isActive()) {\n      this._grid.getEditorLock().cancelCurrentEdit();\n    }\n\n    if (this._grid.getEditorLock().isActive() || !this.isHandlerColumn(cell.cell)) {\n      return false;\n    }\n\n    this._dragging = true;\n    e.stopImmediatePropagation();\n\n    // optionally create a shadow element of the row so that we can see all the time which row exactly we're dragging\n    if (!this._options.hideRowMoveShadow) {\n      const slickRowElm = this._grid.getCellNode(cell.row, cell.cell)?.closest<HTMLDivElement>('.slick-row');\n      if (slickRowElm) {\n        dd.clonedSlickRow = slickRowElm.cloneNode(true) as HTMLDivElement;\n        dd.clonedSlickRow.classList.add('slick-reorder-shadow-row');\n        dd.clonedSlickRow.style.display = 'none';\n        dd.clonedSlickRow.style.marginLeft = Number(this._options.rowMoveShadowMarginLeft || 0) + 'px';\n        dd.clonedSlickRow.style.marginTop = Number(this._options.rowMoveShadowMarginTop || 0) + 'px';\n        dd.clonedSlickRow.style.opacity = `${this._options.rowMoveShadowOpacity || 0.95}`;\n        dd.clonedSlickRow.style.transform = `scale(${this._options.rowMoveShadowScale || 0.75})`;\n        this._canvas.appendChild(dd.clonedSlickRow);\n      }\n    }\n\n    let selectedRows = this._options.singleRowMove ? [cell.row] : this._grid.getSelectedRows();\n    if (selectedRows.length === 0 || !selectedRows.some(selectedRow => selectedRow === cell.row)) {\n      selectedRows = [cell.row];\n      if (!this._options.disableRowSelection) {\n        this._grid.setSelectedRows(selectedRows);\n      }\n    }\n\n    const rowHeight = this._grid.getOptions().rowHeight;\n\n    dd.selectedRows = selectedRows;\n\n    dd.selectionProxy = document.createElement('div');\n    dd.selectionProxy.className = 'slick-reorder-proxy';\n    dd.selectionProxy.style.display = 'none';\n    dd.selectionProxy.style.position = 'absolute';\n    dd.selectionProxy.style.zIndex = '99999';\n    dd.selectionProxy.style.width = `${this._canvas.clientWidth}px`;\n    dd.selectionProxy.style.height = `${rowHeight! * selectedRows.length}px`;\n    this._canvas.appendChild(dd.selectionProxy);\n\n    dd.guide = document.createElement('div');\n    dd.guide.className = 'slick-reorder-guide';\n    dd.guide.style.position = 'absolute';\n    dd.guide.style.zIndex = '99999';\n    dd.guide.style.width = `${this._canvas.clientWidth}px`;\n    dd.guide.style.top = `-1000px`;\n    this._canvas.appendChild(dd.guide);\n\n    dd.insertBefore = -1;\n  }\n\n  protected handleDrag(evt: SlickEventData_, dd: DragRowMove): boolean | void {\n    if (!this._dragging) {\n      return;\n    }\n\n    evt.stopImmediatePropagation();\n    const e = evt.getNativeEvent<MouseEvent | TouchEvent>();\n\n    const targetEvent = (e as TouchEvent)?.touches?.[0] ?? e;\n    const top = targetEvent.pageY - (Utils.offset(this._canvas)?.top ?? 0);\n    dd.selectionProxy.style.top = `${top - 5}px`;\n    dd.selectionProxy.style.display = 'block';\n\n    // if the row move shadow is enabled, we'll also make it follow the mouse cursor\n    if (dd.clonedSlickRow) {\n      dd.clonedSlickRow.style.top = `${top - 6}px`;\n      dd.clonedSlickRow.style.display = 'block';\n    }\n\n    const insertBefore = Math.max(0, Math.min(Math.round(top / this._grid.getOptions().rowHeight!), this._grid.getDataLength()));\n    if (insertBefore !== dd.insertBefore) {\n      const eventData = {\n        grid: this._grid,\n        rows: dd.selectedRows,\n        insertBefore\n      };\n\n      if (this.onBeforeMoveRows.notify(eventData).getReturnValue() === false) {\n        dd.canMove = false;\n      } else {\n        dd.canMove = true;\n      }\n\n      // if there's a UsabilityOverride defined, we also need to verify that the condition is valid\n      if (this._usabilityOverride && dd.canMove) {\n        const insertBeforeDataContext = this._grid.getDataItem(insertBefore);\n        dd.canMove = this.checkUsabilityOverride(insertBefore, insertBeforeDataContext, this._grid);\n      }\n\n      // if the new target is possible we'll display the dark blue bar (representin the acceptability) at the target position\n      // else it won't show up (it will be off the screen)\n      if (!dd.canMove) {\n        dd.guide.style.top = '-1000px';\n      } else {\n        dd.guide.style.top = `${insertBefore * (this._grid.getOptions().rowHeight || 0)}px`;\n      }\n\n      dd.insertBefore = insertBefore;\n    }\n  }\n\n  protected handleDragEnd(e: SlickEventData_, dd: DragRowMove) {\n    if (!this._dragging) {\n      return;\n    }\n    this._dragging = false;\n    e.stopImmediatePropagation();\n\n    dd.guide?.remove();\n    dd.selectionProxy?.remove();\n    dd.clonedSlickRow?.remove();\n\n    if (dd.canMove) {\n      const eventData = {\n        grid: this._grid,\n        rows: dd.selectedRows,\n        insertBefore: dd.insertBefore\n      };\n      // TODO:  this._grid.remapCellCssClasses ?\n      this.onMoveRows.notify(eventData);\n    }\n  }\n\n  getColumnDefinition(): Column {\n    const columnId = String(this._options?.columnId ?? this._defaults.columnId);\n\n    return {\n      id: columnId,\n      name: '',\n      field: 'move',\n      behavior: 'selectAndMove',\n      reorderable: this._options.reorderable,\n      excludeFromColumnPicker: true,\n      excludeFromGridMenu: true,\n      excludeFromHeaderMenu: true,\n      resizable: false,\n      selectable: false,\n      width: this._options.width || 40,\n      formatter: this.moveIconFormatter.bind(this)\n    };\n  }\n\n  protected moveIconFormatter(row: number, _cell: number, _val: any, _column: Column, dataContext: any, grid: SlickGrid): FormatterResultWithHtml | string {\n    if (!this.checkUsabilityOverride(row, dataContext, grid)) {\n      return '';\n    } else {\n      const iconElm = document.createElement('div');\n      iconElm.className = this._options.cssClass || '';\n      return {\n        addClasses: `cell-reorder dnd ${this._options.containerCssClass || ''}`,\n        html: iconElm\n      };\n    }\n  }\n\n  protected checkUsabilityOverride(row: number, dataContext: any, grid: SlickGrid) {\n    if (typeof this._usabilityOverride === 'function') {\n      return this._usabilityOverride(row, dataContext, grid);\n    }\n    return true;\n  }\n\n  /**\n   * Method that user can pass to override the default behavior or making every row moveable.\n   * In order word, user can choose which rows to be an available as moveable (or not) by providing his own logic show/hide icon and usability.\n   * @param overrideFn: override function callback\n   */\n  usabilityOverride(overrideFn: UsabilityOverrideFn) {\n    this._usabilityOverride = overrideFn;\n  }\n\n  isHandlerColumn(columnIndex: number | string) {\n    return /move|selectAndMove/.test(this._grid.getColumns()[+columnIndex].behavior || '');\n  }\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  Utils.extend(true, window, {\n    Slick: {\n      RowMoveManager: SlickRowMoveManager\n    }\n  });\n}\n\n", "import {\n  keyCode as keyCode_,\n  SlickEvent as SlickEvent_,\n  SlickEventData as SlickEventData_,\n  SlickEventHandler as SlickEventHandler_,\n  SlickRange as SlickRange_,\n  Utils as Utils_\n} from '../slick.core.js';\nimport { Draggable as Draggable_ } from '../slick.interactions.js';\nimport { SlickCellRangeDecorator as SlickCellRangeDecorator_ } from './slick.cellrangedecorator.js';\nimport { SlickCellRangeSelector as SlickCellRangeSelector_ } from './slick.cellrangeselector.js';\nimport type { SlickCrossGridRowMoveManager as SlickCrossGridRowMoveManager_ } from './slick.crossgridrowmovemanager.js';\nimport type { SlickRowMoveManager as SlickRowMoveManager_ } from './slick.rowmovemanager.js';\nimport type { OnActiveCellChangedEventArgs, RowSelectionModelOption, SelectionModel } from '../models/index.js';\nimport type { SlickGrid } from '../slick.grid.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst Draggable = IIFE_ONLY ? Slick.Draggable : Draggable_;\nconst keyCode = IIFE_ONLY ? Slick.keyCode : keyCode_;\nconst SlickCellRangeDecorator = IIFE_ONLY ? Slick.CellRangeDecorator : SlickCellRangeDecorator_;\nconst SlickCellRangeSelector = IIFE_ONLY ? Slick.CellRangeSelector : SlickCellRangeSelector_;\nconst SlickEvent = IIFE_ONLY ? Slick.Event : SlickEvent_;\nconst SlickEventData = IIFE_ONLY ? Slick.EventData : SlickEventData_;\nconst SlickEventHandler = IIFE_ONLY ? Slick.EventHandler : SlickEventHandler_;\nconst SlickRange = IIFE_ONLY ? Slick.Range : SlickRange_;\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\nexport class SlickRowSelectionModel implements SelectionModel {\n  // --\n  // public API\n  pluginName = 'RowSelectionModel' as const;\n  onSelectedRangesChanged = new SlickEvent<SlickRange_[]>('onSelectedRangesChanged');\n  // _handler, _inHandler, _isRowMoveManagerHandler, _options, wrapHandler\n  // --\n  // protected props\n  protected _grid!: SlickGrid;\n  protected _ranges: SlickRange_[] = [];\n  protected _eventHandler = new SlickEventHandler();\n  protected _inHandler = false;\n  protected _selector?: SlickCellRangeSelector_;\n  protected _isRowMoveManagerHandler: any;\n  protected _options: RowSelectionModelOption;\n  protected _defaults: RowSelectionModelOption = {\n    selectActiveRow: true,\n    dragToSelect: false,\n    autoScrollWhenDrag: true,\n    cellRangeSelector: undefined\n  };\n\n  constructor(options?: Partial<RowSelectionModelOption>) {\n    this._options = Utils.extend(true, {}, this._defaults, options);\n  }\n\n  init(grid: SlickGrid) {\n    if (Draggable === undefined) {\n      throw new Error('Slick.Draggable is undefined, make sure to import \"slick.interactions.js\"');\n    }\n\n    this._selector = this._options.cellRangeSelector;\n    this._grid = grid;\n    Utils.addSlickEventPubSubWhenDefined(grid.getPubSubService(), this);\n\n    if (!this._selector && this._options.dragToSelect) {\n      if (!SlickCellRangeDecorator) {\n        throw new Error('Slick.CellRangeDecorator is required when option dragToSelect set to true');\n      }\n      this._selector = new SlickCellRangeSelector({\n        selectionCss: { border: 'none' } as CSSStyleDeclaration,\n        autoScroll: this._options.autoScrollWhenDrag\n      });\n    }\n\n    this._eventHandler.subscribe(this._grid.onActiveCellChanged, this.wrapHandler(this.handleActiveCellChange).bind(this));\n    this._eventHandler.subscribe(this._grid.onKeyDown, this.wrapHandler(this.handleKeyDown).bind(this));\n    this._eventHandler.subscribe(this._grid.onClick, this.wrapHandler(this.handleClick).bind(this));\n    if (this._selector) {\n      grid.registerPlugin(this._selector);\n      this._selector.onCellRangeSelecting.subscribe(this.handleCellRangeSelected.bind(this));\n      this._selector.onCellRangeSelected.subscribe(this.handleCellRangeSelected.bind(this));\n      this._selector.onBeforeCellRangeSelected.subscribe(this.handleBeforeCellRangeSelected.bind(this));\n    }\n  }\n\n  destroy() {\n    this._eventHandler.unsubscribeAll();\n    if (this._selector) {\n      this._selector.onCellRangeSelecting.unsubscribe(this.handleCellRangeSelected.bind(this));\n      this._selector.onCellRangeSelected.unsubscribe(this.handleCellRangeSelected.bind(this));\n      this._selector.onBeforeCellRangeSelected.unsubscribe(this.handleBeforeCellRangeSelected.bind(this));\n      this._grid.unregisterPlugin(this._selector);\n      if (this._selector.destroy) {\n        this._selector.destroy();\n      }\n    }\n  }\n\n  getOptions(): RowSelectionModelOption {\n    return this._options;\n  }\n\n  protected wrapHandler(handler: (...args: any) => void) {\n    return (...args: any) => {\n      if (!this._inHandler) {\n        this._inHandler = true;\n        handler.apply(this, args);\n        this._inHandler = false;\n      }\n    };\n  }\n\n  protected rangesToRows(ranges: SlickRange_[]): number[] {\n    const rows: number[] = [];\n    for (let i = 0; i < ranges.length; i++) {\n      for (let j = ranges[i].fromRow; j <= ranges[i].toRow; j++) {\n        rows.push(j);\n      }\n    }\n    return rows;\n  }\n\n  protected rowsToRanges(rows: number[]) {\n    const ranges: SlickRange_[] = [];\n    const lastCell = this._grid.getColumns().length - 1;\n    rows.forEach(row => ranges.push(new SlickRange(row, 0, row, lastCell)));\n    return ranges;\n  }\n\n  protected getRowsRange(from: number, to: number) {\n    let i;\n    const rows: number[] = [];\n    for (i = from; i <= to; i++) {\n      rows.push(i);\n    }\n    for (i = to; i < from; i++) {\n      rows.push(i);\n    }\n    return rows;\n  }\n\n  getSelectedRows() {\n    return this.rangesToRows(this._ranges);\n  }\n\n  setSelectedRows(rows: number[]) {\n    this.setSelectedRanges(this.rowsToRanges(rows), 'SlickRowSelectionModel.setSelectedRows');\n  }\n\n  setSelectedRanges(ranges: SlickRange_[], caller = 'SlickRowSelectionModel.setSelectedRanges', selectionMode?: string) {\n    // simple check for: empty selection didn't change, prevent firing onSelectedRangesChanged\n    if ((!this._ranges || this._ranges.length === 0) && (!ranges || ranges.length === 0)) {\n      return;\n    }\n    this._ranges = ranges;\n\n    // provide extra \"caller\" argument through SlickEventData event to avoid breaking the previous pubsub event structure\n    // that only accepts an array of selected range `SlickRange[]`, the SlickEventData args will be merged and used later by `onSelectedRowsChanged`\n    const eventData = new SlickEventData(new CustomEvent('click', { detail: { caller, selectionMode } }), this._ranges);\n    this.onSelectedRangesChanged.notify(this._ranges, eventData);\n  }\n\n  getSelectedRanges() {\n    return this._ranges;\n  }\n\n  refreshSelections() {\n    this.setSelectedRows(this.getSelectedRows());\n  }\n\n  protected handleActiveCellChange(_e: SlickEventData_, args: OnActiveCellChangedEventArgs) {\n    if (this._options.selectActiveRow && Utils.isDefined(args.row)) {\n      this.setSelectedRanges([new SlickRange(args.row, 0, args.row, this._grid.getColumns().length - 1)]);\n    }\n  }\n\n  protected handleKeyDown(e: KeyboardEvent) {\n    const activeRow = this._grid.getActiveCell();\n    if (this._grid.getOptions().multiSelect && activeRow\n      && e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey\n      && (e.which === keyCode.UP || e.which === keyCode.DOWN)) {\n      let selectedRows = this.getSelectedRows();\n      selectedRows.sort((x, y) => x - y);\n\n      if (!selectedRows.length) {\n        selectedRows = [activeRow.row];\n      }\n\n      let top = selectedRows[0];\n      let bottom = selectedRows[selectedRows.length - 1];\n      let active: number;\n\n      if (e.which === keyCode.DOWN) {\n        active = activeRow.row < bottom || top === bottom ? ++bottom : ++top;\n      } else {\n        active = activeRow.row < bottom ? --bottom : --top;\n      }\n\n      if (active >= 0 && active < this._grid.getDataLength()) {\n        this._grid.scrollRowIntoView(active);\n        const tempRanges = this.rowsToRanges(this.getRowsRange(top, bottom));\n        this.setSelectedRanges(tempRanges);\n      }\n\n      e.preventDefault();\n      e.stopPropagation();\n    }\n  }\n\n  protected handleClick(e: MouseEvent): boolean | void {\n    const cell = this._grid.getCellFromEvent(e);\n    if (!cell || !this._grid.canCellBeActive(cell.row, cell.cell)) {\n      return false;\n    }\n\n    if (!this._grid.getOptions().multiSelect || (\n      !e.ctrlKey && !e.shiftKey && !e.metaKey)) {\n      return false;\n    }\n\n    let selection = this.rangesToRows(this._ranges);\n    const idx = selection.indexOf(cell.row);\n\n    if (idx === -1 && (e.ctrlKey || e.metaKey)) {\n      selection.push(cell.row);\n      this._grid.setActiveCell(cell.row, cell.cell);\n    } else if (idx !== -1 && (e.ctrlKey || e.metaKey)) {\n      selection = selection.filter((o) => o !== cell.row);\n      this._grid.setActiveCell(cell.row, cell.cell);\n    } else if (selection.length && e.shiftKey) {\n      const last = selection.pop() as number;\n      const from = Math.min(cell.row, last);\n      const to = Math.max(cell.row, last);\n      selection = [];\n      for (let i = from; i <= to; i++) {\n        if (i !== last) {\n          selection.push(i);\n        }\n      }\n      selection.push(last);\n      this._grid.setActiveCell(cell.row, cell.cell);\n    }\n\n    const tempRanges = this.rowsToRanges(selection);\n    this.setSelectedRanges(tempRanges);\n    e.stopImmediatePropagation();\n\n    return true;\n  }\n\n  protected handleBeforeCellRangeSelected(e: SlickEventData_, cell: { row: number; cell: number; }): boolean | void {\n    if (!this._isRowMoveManagerHandler) {\n      const rowMoveManager = this._grid.getPluginByName<SlickRowMoveManager_>('RowMoveManager') || this._grid.getPluginByName<SlickCrossGridRowMoveManager_>('CrossGridRowMoveManager');\n      this._isRowMoveManagerHandler = rowMoveManager ? rowMoveManager.isHandlerColumn : Utils.noop;\n    }\n    if (this._grid.getEditorLock().isActive() || this._isRowMoveManagerHandler(cell.cell)) {\n      e.stopPropagation();\n      return false;\n    }\n    this._grid.setActiveCell(cell.row, cell.cell);\n  }\n\n  protected handleCellRangeSelected(_e: SlickEventData_, args: { range: SlickRange_; selectionMode: string; }): boolean | void {\n    if (!this._grid.getOptions().multiSelect || !this._options.selectActiveRow) {\n      return false;\n    }\n    this.setSelectedRanges([new SlickRange(args.range.fromRow, 0, args.range.toRow, this._grid.getColumns().length - 1)], undefined, args.selectionMode);\n  }\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  Utils.extend(true, window, {\n    Slick: {\n      RowSelectionModel: SlickRowSelectionModel\n    }\n  });\n}\n\n", "import { SlickEvent as SlickEvent_, Utils as Utils_ } from '../slick.core.js';\nimport type { Column, ColumnSort, SlickPlugin } from '../models/index.js';\nimport type { SlickGrid } from '../slick.grid.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst SlickEvent = IIFE_ONLY ? Slick.Event : SlickEvent_;\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\nexport interface SlickStateOption {\n  /** optional grid state clientId */\n  cid: string;\n\n  /** default columns when loadnig the grid */\n  defaultColumns: Column[];\n\n  /** local storage key prefix */\n  key_prefix: string;\n\n  /** should we scroll the grid into view? */\n  scrollRowIntoView: boolean;\n\n  /** local storage wrapper */\n  storage: LocalStorageWrapper;\n}\n\nexport interface CurrentState {\n  columns: Array<{ id: string | number; width: number | undefined; }>;\n  sortcols: ColumnSort[];\n  userData: any;\n  viewport: { top: number; bottom: number; leftPx: number; rightPx: number; };\n}\n\nclass LocalStorageWrapper {\n  protected localStorage = window.localStorage;\n\n  constructor() {\n    if (typeof localStorage === 'undefined') {\n      console.error('localStorage is not available. slickgrid statepersistor disabled.');\n    }\n  }\n\n  get<T = any>(key: string) {\n    return new Promise<T>((resolve, reject) => {\n      if (!localStorage) {\n        reject('missing localStorage');\n        return;\n      }\n      try {\n        const d = localStorage.getItem(key);\n        if (d) {\n          return resolve(JSON.parse(d) as T);\n        }\n        resolve({} as T);\n      } catch (exc) {\n        reject(exc);\n      }\n    });\n  }\n\n  set(key: string, obj: any) {\n    if (!localStorage) { return; }\n    if (typeof obj !== 'undefined') {\n      obj = JSON.stringify(obj);\n    }\n    localStorage.setItem(key, obj);\n  }\n};\n\nexport class SlickState implements SlickPlugin {\n  // --\n  // public API\n  pluginName = 'State' as const;\n  onStateChanged = new SlickEvent<CurrentState>('onStateChanged');\n\n  // --\n  // protected props\n  protected _grid!: SlickGrid;\n  protected _cid = '';\n  protected _store: LocalStorageWrapper;\n  protected _options: SlickStateOption;\n  protected _state?: CurrentState;\n  protected _userData = {\n    state: null,\n    current: null\n  };\n\n  constructor(options: Partial<SlickStateOption>) {\n    const defaults = {\n      key_prefix: 'slickgrid:',\n      storage: new LocalStorageWrapper(),\n      scrollRowIntoView: true\n    };\n    this._options = Utils.extend(true, {}, defaults, options);\n    this._store = this._options.storage;\n  }\n\n  init(grid: SlickGrid) {\n    this._grid = grid;\n    this._cid = grid.cid || this._options.cid;\n    Utils.addSlickEventPubSubWhenDefined(grid.getPubSubService(), this);\n\n    if (this._cid) {\n      this._grid.onColumnsResized.subscribe(this.save.bind(this));\n      this._grid.onColumnsReordered.subscribe(this.save.bind(this));\n      this._grid.onSort.subscribe(this.save.bind(this));\n    } else {\n      console.warn('grid has no client id. state persisting is disabled.');\n    }\n  }\n\n  destroy() {\n    this._grid.onSort.unsubscribe(this.save.bind(this));\n    this._grid.onColumnsReordered.unsubscribe(this.save.bind(this));\n    this._grid.onColumnsResized.unsubscribe(this.save.bind(this));\n    this.save();\n  }\n\n  save() {\n    if (this._cid && this._store) {\n      this._state = {\n        sortcols: this.getSortColumns(),\n        viewport: this._grid.getViewport(),\n        columns: this.getColumns(),\n        userData: null\n      };\n      this._state.userData = this._userData.current;\n      this.setUserDataFromState(this._state.userData);\n      this.onStateChanged.notify(this._state);\n\n      return this._store.set(this._options.key_prefix + this._cid, this._state);\n    }\n  }\n\n  restore() {\n    return new Promise((resolve, reject) => {\n      if (!this._cid) {\n        reject('missing client id');\n        return;\n      }\n      if (!this._store) {\n        reject('missing store');\n        return;\n      }\n\n      this._store.get<CurrentState>(this._options.key_prefix + this._cid)\n        .then((state) => {\n          if (state) {\n            if (state.sortcols) {\n              this._grid.setSortColumns(state.sortcols || []);\n            }\n            if (state.viewport && this._options.scrollRowIntoView) {\n              this._grid.scrollRowIntoView(state.viewport.top, true);\n            }\n            if (state.columns) {\n              const defaultColumns = this._options.defaultColumns;\n              if (defaultColumns) {\n                const defaultColumnsLookup: Record<number | string, Column> = {};\n                defaultColumns.forEach((colDef) => defaultColumnsLookup[colDef.id] = colDef);\n\n                const cols: Array<{ id: string | number; width: number | undefined; }> = [];\n                (state.columns || []).forEach((columnDef) => {\n                  if (defaultColumnsLookup[columnDef.id]) {\n                    cols.push(Utils.extend(true, {}, defaultColumnsLookup[columnDef.id], {\n                      width: columnDef.width,\n                      headerCssClass: (columnDef as Column).headerCssClass\n                    }));\n                  }\n                });\n\n                state.columns = cols;\n              }\n\n              this._grid.setColumns(state.columns as Column[]);\n            }\n            this.setUserDataFromState(state.userData);\n          }\n          resolve(state);\n        })\n        .catch((e) => {\n          reject(e);\n        });\n    });\n  }\n\n  /**\n   * allows users to add their own data to the grid state\n   * this function does not trigger the save() function, so the actual act of writing the state happens in save()\n   * therefore, it's necessary to call save() function after setting user-data\n   *\n   * @param data\n   * @return {State}\n   */\n  setUserData(data: any) {\n    this._userData.current = data;\n    return this;\n  }\n\n  /**\n   *\n   * @internal\n   * @param data\n   * @return {State}\n   */\n  setUserDataFromState(data: any) {\n    this._userData.state = data;\n    return this.setUserData(data);\n  }\n\n  /**\n   * returns current value of user-data\n   * @return {Object}\n   */\n  getUserData() {\n    return this._userData.current;\n  }\n\n  /**\n   * returns user-data found in saved state\n   *\n   * @return {Object}\n   */\n  getStateUserData() {\n    return this._userData.state;\n  }\n\n  /**\n   * Sets user-data to the value read from state\n   * @return {State}\n   */\n  resetUserData() {\n    this._userData.current = this._userData.state;\n    return this;\n  }\n\n  getColumns() {\n    return this._grid.getColumns().map((col) => ({\n      id: col.id,\n      width: col.width\n    }));\n  }\n\n  getSortColumns() {\n    return this._grid.getSortColumns();\n  }\n\n  reset() {\n    this._store.set(this._options.key_prefix + this._cid, {});\n    this.setUserDataFromState(null);\n  }\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  Utils.extend(true, window, {\n    Slick: {\n      State: SlickState\n    }\n  });\n}\n\n", "import type { Column, CompositeEditorOption, Editor, EditorArguments, HtmlElementPosition } from './models/index.js';\nimport { Utils as Utils_ } from './slick.core.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\n/**\n * A composite SlickGrid editor factory.\n * Generates an editor that is composed of multiple editors for given columns.\n * Individual editors are provided given containers instead of the original cell.\n * Validation will be performed on all editors individually and the results will be aggregated into one\n * validation result.\n *\n *\n * The returned editor will have its prototype set to CompositeEditor, so you can use the \"instanceof\" check.\n *\n * NOTE:  This doesn't work for detached editors since they will be created and positioned relative to the\n *        active cell and not the provided container.\n *\n * @namespace Slick\n * @class CompositeEditor\n * @constructor\n * @param columns {Array} Column definitions from which editors will be pulled.\n * @param containers {Array} Container HTMLElements in which editors will be placed.\n * @param options {Object} Options hash:\n *  validationFailedMsg     -   A generic failed validation message set on the aggregated validation resuls.\n *  validationMsgPrefix     -   Add an optional prefix to each validation message (only the ones shown in the modal form, not the ones in the \"errors\")\n *  modalType               -   Defaults to \"edit\", modal type can 1 of these 3: (create, edit, mass, mass-selection)\n *  hide                    -   A function to be called when the grid asks the editor to hide itself.\n *  show                    -   A function to be called when the grid asks the editor to show itself.\n *  position                -   A function to be called when the grid asks the editor to reposition itself.\n *  destroy                 -   A function to be called when the editor is destroyed.\n */\nexport function SlickCompositeEditor(columns: Column[], containers: Array<HTMLDivElement>, options: CompositeEditorOption) {\n  const defaultOptions = {\n    modalType: 'edit', // available type (create, edit, mass)\n    validationFailedMsg: 'Some of the fields have failed validation',\n    validationMsgPrefix: null,\n    show: null,\n    hide: null,\n    position: null,\n    destroy: null,\n    formValues: {},\n    editors: {}\n  };\n\n  const noop = function () { };\n\n  let firstInvalidEditor: Editor | null = null;\n\n  options = Utils.extend({}, defaultOptions, options);\n\n  function getContainerBox(i: number) {\n    const c = containers[i];\n    const offset = Utils.offset(c);\n    const w = Utils.width(c);\n    const h = Utils.height(c);\n\n    return {\n      top: (offset?.top ?? 0),\n      left: (offset?.left ?? 0),\n      bottom: (offset?.top ?? 0) + (h || 0),\n      right: (offset?.left ?? 0) + (w || 0),\n      width: w,\n      height: h,\n      visible: true\n    };\n  }\n\n  function editor(args: any[]) {\n    // @ts-ignore\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const context: any = this;\n    let editors: Array<Editor & { args: EditorArguments }> = [];\n\n    function init() {\n      let newArgs: any = {};\n      let idx = 0;\n      while (idx < columns.length) {\n        if (columns[idx].editor) {\n          const column = columns[idx];\n          newArgs = Utils.extend(false, {}, args);\n          newArgs.container = containers[idx];\n          newArgs.column = column;\n          newArgs.position = getContainerBox(idx);\n          newArgs.commitChanges = noop;\n          newArgs.cancelChanges = noop;\n          newArgs.compositeEditorOptions = options;\n          newArgs.formValues = {};\n\n          const currentEditor = new (column.editor as any)(newArgs) as Editor & { args: EditorArguments };\n          options.editors[column.id] = currentEditor; // add every Editor instance refs\n          editors.push(currentEditor);\n        }\n        idx++;\n      }\n\n      // focus on first input\n      window.setTimeout(() => {\n        if (Array.isArray(editors) && editors.length > 0 && typeof editors[0].focus === 'function') {\n          editors[0].focus();\n        }\n      }, 0);\n    }\n\n    context.destroy = () => {\n      let idx = 0;\n      while (idx < editors.length) {\n        editors[idx].destroy();\n        idx++;\n      }\n\n      options.destroy?.();\n      editors = [];\n    };\n\n\n    context.focus = () => {\n      // if validation has failed, set the focus to the first invalid editor\n      (firstInvalidEditor || editors[0]).focus();\n    };\n\n    context.isValueChanged = () => {\n      let idx = 0;\n      while (idx < editors.length) {\n        if (editors[idx].isValueChanged()) {\n          return true;\n        }\n        idx++;\n      }\n      return false;\n    };\n\n    context.serializeValue = () => {\n      const serializedValue: any[] = [];\n      let idx = 0;\n      while (idx < editors.length) {\n        serializedValue[idx] = editors[idx].serializeValue();\n        idx++;\n      }\n      return serializedValue;\n    };\n\n    context.applyValue = (item: any, state: any) => {\n      let idx = 0;\n      while (idx < editors.length) {\n        editors[idx].applyValue(item, state[idx]);\n        idx++;\n      }\n    };\n\n    context.loadValue = (item: any) => {\n      let idx = 0;\n\n      while (idx < editors.length) {\n        editors[idx].loadValue(item);\n        idx++;\n      }\n    };\n\n    context.validate = (target: HTMLElement | null) => {\n      let validationResults;\n      const errors: any[] = [];\n      let targetElm = target ? target : null;\n\n      firstInvalidEditor = null;\n\n      let idx = 0;\n      while (idx < editors.length) {\n        const columnDef = editors[idx].args?.column ?? {};\n        if (columnDef) {\n          let validationElm = document.querySelector(`.item-details-validation.editor-${columnDef.id}`);\n          let labelElm = document.querySelector(`.item-details-label.editor-${columnDef.id}`);\n          let editorElm = document.querySelector(`[data-editorid=${columnDef.id}]`);\n          const validationMsgPrefix = options?.validationMsgPrefix || '';\n\n          if (!targetElm || Utils.contains(editorElm as HTMLElement, targetElm)) {\n            validationResults = editors[idx].validate();\n\n            if (!validationResults.valid) {\n              firstInvalidEditor = editors[idx];\n              errors.push({\n                index: idx,\n                editor: editors[idx],\n                container: containers[idx],\n                msg: validationResults.msg\n              });\n\n              if (validationElm) {\n                validationElm.textContent = validationMsgPrefix + validationResults.msg;\n                labelElm?.classList.add('invalid');\n                editorElm?.classList.add('invalid');\n              }\n            } else if (validationElm) {\n              validationElm.textContent = '';\n              editorElm?.classList.remove('invalid');\n              labelElm?.classList.remove('invalid');\n            }\n          }\n          validationElm = null;\n          labelElm = null;\n          editorElm = null;\n        }\n        idx++;\n      }\n      targetElm = null;\n\n      if (errors.length) {\n        return {\n          valid: false,\n          msg: options.validationFailedMsg,\n          errors\n        };\n      }\n\n      return {\n        valid: true,\n        msg: ''\n      };\n    };\n\n    context.hide = () => {\n      let idx = 0;\n      while (idx < editors.length) {\n        editors[idx]?.hide?.();\n        idx++;\n      }\n      options?.hide?.();\n    };\n\n    context.show = () => {\n      let idx = 0;\n      while (idx < editors.length) {\n        editors[idx]?.show?.();\n        idx++;\n      }\n      options?.show?.();\n    };\n\n    context.position = (box: HtmlElementPosition) => {\n      options?.position?.(box);\n    };\n\n    init();\n  }\n\n  // so we can do \"editor instanceof Slick.CompositeEditor\n  // @ts-ignore\n  editor.prototype = this;\n  return editor;\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  Utils.extend(Slick, {\n    CompositeEditor: SlickCompositeEditor\n  });\n}\n", "import { type SlickEventData, SlickGroup as SlickGroup_, keyCode as keyCode_, Utils as Utils_ } from './slick.core.js';\nimport type { Column, GroupItemMetadataProviderOption, GroupingFormatterItem, ItemMetadata, SlickPlugin } from './models/index.js';\nimport type { SlickGrid } from './slick.grid.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst keyCode = IIFE_ONLY ? Slick.keyCode : keyCode_;\nconst SlickGroup = IIFE_ONLY ? Slick.Group : SlickGroup_;\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\n/**\n * Provides item metadata for group (Slick.Group) and totals (Slick.Totals) rows produced by the DataView.\n * This metadata overrides the default behavior and formatting of those rows so that they appear and function\n * correctly when processed by the grid.\n *\n * This class also acts as a grid plugin providing event handlers to expand & collapse groups.\n * If \"grid.registerPlugin(...)\" is not called, expand & collapse will not work.\n *\n * @class GroupItemMetadataProvider\n * @module Data\n * @namespace Slick.Data\n * @constructor\n * @param inputOptions\n */\nexport class SlickGroupItemMetadataProvider implements SlickPlugin {\n  pluginName = 'GroupItemMetadataProvider' as const;\n\n  protected _grid!: SlickGrid;\n  protected _options: GroupItemMetadataProviderOption;\n  protected _defaults: GroupItemMetadataProviderOption = {\n    checkboxSelect: false,\n    checkboxSelectCssClass: 'slick-group-select-checkbox',\n    checkboxSelectPlugin: null,\n    groupCssClass: 'slick-group',\n    groupTitleCssClass: 'slick-group-title',\n    totalsCssClass: 'slick-group-totals',\n    groupFocusable: true,\n    totalsFocusable: false,\n    toggleCssClass: 'slick-group-toggle',\n    toggleExpandedCssClass: 'expanded',\n    toggleCollapsedCssClass: 'collapsed',\n    enableExpandCollapse: true,\n    groupFormatter: this.defaultGroupCellFormatter.bind(this),\n    totalsFormatter: this.defaultTotalsCellFormatter.bind(this),\n    includeHeaderTotals: false\n  };\n\n  constructor(inputOptions?: GroupItemMetadataProviderOption) {\n    this._options = Utils.extend<GroupItemMetadataProviderOption>(true, {}, this._defaults, inputOptions);\n  }\n\n  /** Getter of SlickGrid DataView object */\n  protected get dataView(): any {\n    return this._grid?.getData?.() ?? {} as any;\n  }\n\n  getOptions() {\n    return this._options;\n  }\n\n  setOptions(inputOptions: GroupItemMetadataProviderOption) {\n    Utils.extend(true, this._options, inputOptions);\n  }\n\n  protected defaultGroupCellFormatter(_row: number, _cell: number, _value: any, _columnDef: Column, item: any) {\n    if (!this._options.enableExpandCollapse) {\n      return item.title;\n    }\n\n    const indentation = `${item.level * 15}px`;\n    const toggleClass = item.collapsed ? this._options.toggleCollapsedCssClass : this._options.toggleExpandedCssClass;\n\n    // use a DocumentFragment to avoid creating an extra div container\n    const containerElm = document.createDocumentFragment();\n\n    // 1. optional row checkbox span to select the entire group rows\n    if (this._options.checkboxSelect) {\n      containerElm.appendChild(Utils.createDomElement('span', { className: `${this._options.checkboxSelectCssClass} ${item.selectChecked ? 'checked' : 'unchecked'}` }));\n    }\n\n    // 2. group toggle span\n    containerElm.appendChild(Utils.createDomElement('span', {\n      className: `${this._options.toggleCssClass} ${toggleClass}`,\n      ariaExpanded: String(!item.collapsed),\n      style: { marginLeft: indentation }\n    }));\n\n    // 3. group title span\n    const groupTitleElm = Utils.createDomElement('span', { className: this._options.groupTitleCssClass || '' });\n    groupTitleElm.setAttribute('level', item.level);\n    (item.title instanceof HTMLElement)\n      ? groupTitleElm.appendChild(item.title)\n      : this._grid.applyHtmlCode(groupTitleElm, item.title ?? '');\n    containerElm.appendChild(groupTitleElm);\n\n    return containerElm;\n  }\n\n  protected defaultTotalsCellFormatter(_row: number, _cell: number, _value: any, columnDef: Column, item: any, grid: SlickGrid) {\n    return (columnDef?.groupTotalsFormatter?.(item, columnDef, grid)) ?? '';\n  }\n\n\n  init(grid: SlickGrid) {\n    this._grid = grid;\n    this._grid.onClick.subscribe(this.handleGridClick.bind(this));\n    this._grid.onKeyDown.subscribe(this.handleGridKeyDown.bind(this));\n  }\n\n  destroy() {\n    if (this._grid) {\n      this._grid.onClick.unsubscribe(this.handleGridClick.bind(this));\n      this._grid.onKeyDown.unsubscribe(this.handleGridKeyDown.bind(this));\n    }\n  }\n\n  protected handleGridClick(e: SlickEventData, args: { row: number; cell: number; grid: SlickGrid; }) {\n    const target = e.target as HTMLElement;\n    const item = this._grid.getDataItem(args.row);\n    if (item && item instanceof SlickGroup && target.classList.contains(this._options.toggleCssClass || '')) {\n      this.handleDataViewExpandOrCollapse(item);\n      e.stopImmediatePropagation();\n      e.preventDefault();\n    }\n    if (item && item instanceof SlickGroup && target.classList.contains(this._options.checkboxSelectCssClass || '')) {\n      item.selectChecked = !item.selectChecked;\n      target.classList.remove((item.selectChecked ? 'unchecked' : 'checked'));\n      target.classList.add((item.selectChecked ? 'checked' : 'unchecked'));\n      // get rowIndexes array\n      const rowIndexes = this.dataView.mapItemsToRows(item.rows);\n      if (item.selectChecked) {\n        this._options.checkboxSelectPlugin.selectRows(rowIndexes);\n      } else {\n        this._options.checkboxSelectPlugin.deSelectRows(rowIndexes);\n      }\n    }\n  }\n\n  // TODO:  add -/+ handling\n  protected handleGridKeyDown(e: SlickEventData) {\n    if (this._options.enableExpandCollapse && (e.which === keyCode.SPACE)) {\n      const activeCell = this._grid.getActiveCell();\n      if (activeCell) {\n        const item = this._grid.getDataItem(activeCell.row);\n        if (item && item instanceof SlickGroup) {\n          this.handleDataViewExpandOrCollapse(item);\n          e.stopImmediatePropagation();\n          e.preventDefault();\n        }\n      }\n    }\n  }\n\n  protected handleDataViewExpandOrCollapse(item: any) {\n    const range = this._grid.getRenderedRange();\n    this.dataView.setRefreshHints({\n      ignoreDiffsBefore: range.top,\n      ignoreDiffsAfter: range.bottom + 1\n    });\n\n    if (item.collapsed) {\n      this.dataView.expandGroup(item.groupingKey);\n    } else {\n      this.dataView.collapseGroup(item.groupingKey);\n    }\n  }\n\n  getGroupRowMetadata(item: GroupingFormatterItem, _row?: number, _cell?: number): ItemMetadata {\n    const groupLevel = item?.level;\n    return {\n      selectable: false,\n      focusable: this._options.groupFocusable,\n      cssClasses: `${this._options.groupCssClass} slick-group-level-${groupLevel}`,\n      formatter: (this._options.includeHeaderTotals && this._options.totalsFormatter) || undefined,\n      columns: {\n        0: {\n          colspan: this._options.includeHeaderTotals ? '1' : '*',\n          formatter: this._options.groupFormatter,\n          editor: null\n        }\n      }\n    };\n  }\n\n  getTotalsRowMetadata(item: { group: GroupingFormatterItem }, _row?: number, _cell?: number): ItemMetadata | null {\n    const groupLevel = item?.group?.level;\n    return {\n      selectable: false,\n      focusable: this._options.totalsFocusable,\n      cssClasses: `${this._options.totalsCssClass} slick-group-level-${groupLevel}`,\n      formatter: this._options.totalsFormatter,\n      editor: null\n    };\n  }\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  window.Slick.Data = window.Slick.Data || {};\n  window.Slick.Data.GroupItemMetadataProvider = SlickGroupItemMetadataProvider;\n}\n", "import type {\n  Aggregator,\n  AnyFunction,\n  CssStyleHash,\n  CustomDataView,\n  DataViewHints,\n  Grouping,\n  GroupingFormatterItem,\n  ItemMetadata,\n  ItemMetadataProvider,\n  OnGroupCollapsedEventArgs,\n  OnGroupExpandedEventArgs,\n  OnRowCountChangedEventArgs,\n  OnRowsChangedEventArgs,\n  OnRowsOrCountChangedEventArgs,\n  OnSelectedRowIdsChangedEventArgs,\n  OnSetItemsCalledEventArgs,\n  PagingInfo,\n  SlickGridModel,\n} from './models/index.js';\nimport {\n  type BasePubSub,\n  SlickEvent as SlickEvent_,\n  SlickEventData as SlickEventData_,\n  SlickGroup as SlickGroup_,\n  SlickGroupTotals as SlickGroupTotals_,\n  Utils as Utils_,\n  type SlickNonDataItem,\n} from './slick.core.js';\nimport { SlickGroupItemMetadataProvider as SlickGroupItemMetadataProvider_ } from './slick.groupitemmetadataprovider.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst SlickEvent = IIFE_ONLY ? Slick.Event : SlickEvent_;\nconst SlickEventData = IIFE_ONLY ? Slick.EventData : SlickEventData_;\nconst SlickGroup = IIFE_ONLY ? Slick.Group : SlickGroup_;\nconst SlickGroupTotals = IIFE_ONLY ? Slick.GroupTotals : SlickGroupTotals_;\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\nconst SlickGroupItemMetadataProvider = IIFE_ONLY ? Slick.Data?.GroupItemMetadataProvider ?? {} : SlickGroupItemMetadataProvider_;\n\nexport interface DataViewOption {\n  /** global override for all rows */\n  globalItemMetadataProvider: ItemMetadataProvider | null;\n\n  /** Optionally provide a GroupItemMetadataProvider in order to use Grouping/DraggableGrouping features */\n  groupItemMetadataProvider: SlickGroupItemMetadataProvider_ | null;\n\n  /** defaults to false, are we using inline filters? */\n  inlineFilters: boolean;\n\n  /**\n   * defaults to false, option to use CSP Safe approach,\n   * Note: it is an opt-in option because it is slightly slower (perf impact) when compared to the non-CSP safe approach.\n   */\n  useCSPSafeFilter: boolean;\n}\nexport type FilterFn<T> = (item: T, args: any) => boolean;\nexport type FilterCspFn<T> = (item: T[], args: any) => T[];\nexport type FilterWithCspCachingFn<T> = (item: T[], args: any, filterCache: any[]) => T[];\nexport type DataIdType = number | string;\nexport type SlickDataItem = SlickNonDataItem | SlickGroup_ | SlickGroupTotals_ | any;\nexport type GroupGetterFn = (val: any) => string | number;\n\n/**\n  * A simple Model implementation.\n  * Provides a filtered view of the underlying data.\n  * Relies on the data item having an \"id\" property uniquely identifying it.\n  */\nexport class SlickDataView<TData extends SlickDataItem = any> implements CustomDataView {\n  protected defaults: DataViewOption = {\n    globalItemMetadataProvider: null,\n    groupItemMetadataProvider: null,\n    inlineFilters: false,\n    useCSPSafeFilter: false,\n  };\n\n  // private\n  protected idProperty = 'id';          // property holding a unique row id\n  protected items: TData[] = [];            // data by index\n  protected rows: TData[] = [];             // data by row\n  protected idxById = new Map<DataIdType, number>();   // indexes by id\n  protected rowsById: { [id: DataIdType]: number } | undefined = undefined;       // rows by id; lazy-calculated\n  protected filter: FilterFn<TData> | null = null;         // filter function\n  protected filterCSPSafe: FilterFn<TData> | null = null;         // filter function\n  protected updated: ({ [id: DataIdType]: boolean }) | null = null;        // updated item ids\n  protected suspend = false;            // suspends the recalculation\n  protected isBulkSuspend = false;      // delays protectedious operations like the\n  // index update and delete to efficient\n  // versions at endUpdate\n  protected bulkDeleteIds = new Map<DataIdType, boolean>();\n  protected sortAsc: boolean | undefined = true;\n  protected fastSortField?: string | null | (() => string);\n  protected sortComparer!: ((a: TData, b: TData) => number);\n  protected refreshHints: DataViewHints = {};\n  protected prevRefreshHints: DataViewHints = {};\n  protected filterArgs: any;\n  protected filteredItems: TData[] = [];\n  protected compiledFilter?: FilterFn<TData> | null;\n  protected compiledFilterCSPSafe?: FilterCspFn<TData> | null;\n  protected compiledFilterWithCaching?: FilterFn<TData> | null;\n  protected compiledFilterWithCachingCSPSafe?: FilterWithCspCachingFn<TData> | null;\n  protected filterCache: any[] = [];\n  protected _grid?: SlickGridModel; // grid object will be defined only after using \"syncGridSelection()\" method\"\n\n  // grouping\n  protected groupingInfoDefaults: Grouping = {\n    getter: undefined,\n    formatter: undefined,\n    comparer: (a: { value: any; }, b: { value: any; }) => (a.value === b.value ? 0 : (a.value > b.value ? 1 : -1)),\n    predefinedValues: [],\n    aggregators: [],\n    aggregateEmpty: false,\n    aggregateCollapsed: false,\n    aggregateChildGroups: false,\n    collapsed: false,\n    displayTotalsRow: true,\n    lazyTotalsCalculation: false\n  };\n  protected groupingInfos: Array<Grouping & { aggregators: Aggregator[]; getterIsAFn?: boolean; compiledAccumulators: any[]; getter: GroupGetterFn | string }> = [];\n  protected groups: SlickGroup_[] = [];\n  protected toggledGroupsByLevel: any[] = [];\n  protected groupingDelimiter = ':|:';\n  protected selectedRowIds: DataIdType[] = [];\n  protected preSelectedRowIdsChangeFn?: (args?: any) => void;\n\n  protected pagesize = 0;\n  protected pagenum = 0;\n  protected totalRows = 0;\n  protected _options: DataViewOption;\n  protected _container?: HTMLElement;\n\n  // public events\n  onBeforePagingInfoChanged: SlickEvent_<PagingInfo>;\n  onGroupExpanded: SlickEvent_<OnGroupExpandedEventArgs>;\n  onGroupCollapsed: SlickEvent_<OnGroupCollapsedEventArgs>;\n  onPagingInfoChanged: SlickEvent_<PagingInfo>;\n  onRowCountChanged: SlickEvent_<OnRowCountChangedEventArgs>;\n  onRowsChanged: SlickEvent_<OnRowsChangedEventArgs>;\n  onRowsOrCountChanged: SlickEvent_<OnRowsOrCountChangedEventArgs>;\n  onSelectedRowIdsChanged: SlickEvent_<OnSelectedRowIdsChangedEventArgs>;\n  onSetItemsCalled: SlickEvent_<OnSetItemsCalledEventArgs>;\n\n  constructor(options?: Partial<DataViewOption>, protected externalPubSub?: BasePubSub) {\n    this.onBeforePagingInfoChanged = new SlickEvent<PagingInfo>('onBeforePagingInfoChanged', externalPubSub);\n    this.onGroupExpanded = new SlickEvent<OnGroupExpandedEventArgs>('onGroupExpanded', externalPubSub);\n    this.onGroupCollapsed = new SlickEvent<OnGroupCollapsedEventArgs>('onGroupCollapsed', externalPubSub);\n    this.onPagingInfoChanged = new SlickEvent<PagingInfo>('onPagingInfoChanged', externalPubSub);\n    this.onRowCountChanged = new SlickEvent<OnRowCountChangedEventArgs>('onRowCountChanged', externalPubSub);\n    this.onRowsChanged = new SlickEvent<OnRowsChangedEventArgs>('onRowsChanged', externalPubSub);\n    this.onRowsOrCountChanged = new SlickEvent<OnRowsOrCountChangedEventArgs>('onRowsOrCountChanged', externalPubSub);\n    this.onSelectedRowIdsChanged = new SlickEvent<OnSelectedRowIdsChangedEventArgs>('onSelectedRowIdsChanged', externalPubSub);\n    this.onSetItemsCalled = new SlickEvent<OnSetItemsCalledEventArgs>('onSetItemsCalled', externalPubSub);\n\n    this._options = Utils.extend(true, {}, this.defaults, options);\n  }\n\n  /**\n   * Begins a bached update of the items in the data view.\n   * including deletes and the related events are postponed to the endUpdate call.\n   * As certain operations are postponed during this update, some methods might not\n   * deliver fully consistent information.\n   * @param {Boolean} [bulkUpdate] - if set to true, most data view modifications\n   */\n  beginUpdate(bulkUpdate?: boolean) {\n    this.suspend = true;\n    this.isBulkSuspend = bulkUpdate === true;\n  }\n\n  endUpdate() {\n    const wasBulkSuspend = this.isBulkSuspend;\n    this.isBulkSuspend = false;\n    this.suspend = false;\n    if (wasBulkSuspend) {\n      this.processBulkDelete();\n      this.ensureIdUniqueness();\n    }\n    this.refresh();\n  }\n\n  destroy() {\n    this.items = [];\n    this.idxById = null as any;\n    this.rowsById = null as any;\n    this.filter = null as any;\n    this.filterCSPSafe = null as any;\n    this.updated = null as any;\n    this.sortComparer = null as any;\n    this.filterCache = [];\n    this.filteredItems = [];\n    this.compiledFilter = null;\n    this.compiledFilterCSPSafe = null;\n    this.compiledFilterWithCaching = null;\n    this.compiledFilterWithCachingCSPSafe = null;\n\n    if (this._grid && this._grid.onSelectedRowsChanged && this._grid.onCellCssStylesChanged) {\n      this._grid.onSelectedRowsChanged.unsubscribe();\n      this._grid.onCellCssStylesChanged.unsubscribe();\n    }\n    if (this.onRowsOrCountChanged) {\n      this.onRowsOrCountChanged.unsubscribe();\n    }\n  }\n\n  /** provide some refresh hints as to what to rows needs refresh */\n  setRefreshHints(hints: DataViewHints) {\n    this.refreshHints = hints;\n  }\n\n  /** get extra filter arguments of the filter method */\n  getFilterArgs() {\n    return this.filterArgs;\n  }\n\n  /** add extra filter arguments to the filter method */\n  setFilterArgs(args: any) {\n    this.filterArgs = args;\n  }\n\n  /**\n   * Processes all delete requests placed during bulk update\n   * by recomputing the items and idxById members.\n   */\n  protected processBulkDelete() {\n    if (!this.idxById) { return; }\n\n    // the bulk update is processed by\n    // recomputing the whole items array and the index lookup in one go.\n    // this is done by placing the not-deleted items\n    // from left to right into the array and shrink the array the the new\n    // size afterwards.\n    // see https://github.com/6pac/SlickGrid/issues/571 for further details.\n\n    let id: DataIdType, item, newIdx = 0;\n    for (let i = 0, l = this.items.length; i < l; i++) {\n      item = this.items[i];\n      id = item[this.idProperty as keyof TData] as DataIdType;\n      if (id === undefined) {\n        throw new Error(`[SlickGrid DataView] Each data element must implement a unique 'id' property`);\n      }\n\n      // if items have been marked as deleted we skip them for the new final items array\n      // and we remove them from the lookup table.\n      if (this.bulkDeleteIds.has(id)) {\n        this.idxById.delete(id);\n      } else {\n        // for items which are not deleted, we add them to the\n        // next free position in the array and register the index in the lookup.\n        this.items[newIdx] = item;\n        this.idxById.set(id, newIdx);\n        ++newIdx;\n      }\n    }\n\n    // here we shrink down the full item array to the ones actually\n    // inserted in the cleanup loop above.\n    this.items.length = newIdx;\n    // and finally cleanup the deleted ids to start cleanly on the next update.\n    this.bulkDeleteIds = new Map();\n  }\n\n  protected updateIdxById(startingIndex?: number) {\n    if (this.isBulkSuspend || !this.idxById) { // during bulk update we do not reorganize\n      return;\n    }\n    startingIndex = startingIndex || 0;\n    let id: DataIdType;\n    for (let i = startingIndex, l = this.items.length; i < l; i++) {\n      id = this.items[i][this.idProperty as keyof TData] as DataIdType;\n      if (id === undefined) {\n        throw new Error(`[SlickGrid DataView] Each data element must implement a unique 'id' property`);\n      }\n      this.idxById.set(id, i);\n    }\n  }\n\n  protected ensureIdUniqueness() {\n    if (this.isBulkSuspend || !this.idxById) { // during bulk update we do not reorganize\n      return;\n    }\n    let id: DataIdType;\n    for (let i = 0, l = this.items.length; i < l; i++) {\n      id = this.items[i][this.idProperty as keyof TData] as DataIdType;\n      if (id === undefined || this.idxById.get(id) !== i) {\n        throw new Error(`[SlickGrid DataView] Each data element must implement a unique 'id' property`);\n      }\n    }\n  }\n\n  /** Get all DataView Items */\n  getItems() {\n    return this.items;\n  }\n\n  /** Get the DataView Id property name to use (defaults to \"Id\" but could be customized to something else when instantiating the DataView) */\n  getIdPropertyName() {\n    return this.idProperty;\n  }\n\n  /**\n   * Set the Items with a new Dataset and optionally pass a different Id property name\n   * @param {Array<*>} data - array of data\n   * @param {String} [objectIdProperty] - optional id property to use as primary id\n   */\n  setItems(data: TData[], objectIdProperty?: string) {\n    if (objectIdProperty !== undefined) {\n      this.idProperty = objectIdProperty;\n    }\n    this.items = this.filteredItems = data;\n    this.onSetItemsCalled.notify({ idProperty: this.idProperty, itemCount: this.items.length }, null, this);\n    this.idxById = new Map();\n    this.updateIdxById();\n    this.ensureIdUniqueness();\n    this.refresh();\n  }\n\n  /** Set Paging Options */\n  setPagingOptions(args: Partial<PagingInfo>) {\n    if (this.onBeforePagingInfoChanged.notify(this.getPagingInfo(), null, this).getReturnValue() !== false) {\n      if (Utils.isDefined(args.pageSize)) {\n        this.pagesize = args.pageSize;\n        this.pagenum = this.pagesize ? Math.min(this.pagenum, Math.max(0, Math.ceil(this.totalRows / this.pagesize) - 1)) : 0;\n      }\n\n      if (Utils.isDefined(args.pageNum)) {\n        this.pagenum = Math.min(args.pageNum, Math.max(0, Math.ceil(this.totalRows / this.pagesize) - 1));\n      }\n\n      this.onPagingInfoChanged.notify(this.getPagingInfo(), null, this);\n\n      this.refresh();\n    }\n  }\n\n  /** Get Paging Options */\n  getPagingInfo(): PagingInfo {\n    const totalPages = this.pagesize ? Math.max(1, Math.ceil(this.totalRows / this.pagesize)) : 1;\n    return { pageSize: this.pagesize, pageNum: this.pagenum, totalRows: this.totalRows, totalPages, dataView: this as SlickDataView };\n  }\n\n  /** Sort Method to use by the DataView */\n  sort(comparer: (a: TData, b: TData) => number, ascending?: boolean) {\n    this.sortAsc = ascending;\n    this.sortComparer = comparer;\n    this.fastSortField = null;\n    if (ascending === false) {\n      this.items.reverse();\n    }\n    this.items.sort(comparer);\n    if (ascending === false) {\n      this.items.reverse();\n    }\n    this.idxById = new Map();\n    this.updateIdxById();\n    this.refresh();\n  }\n\n  /**\n   * @deprecated, to be more removed in next major since IE is no longer supported and this is no longer useful.\n   * Provides a workaround for the extremely slow sorting in IE.\n   * Does a [lexicographic] sort on a give column by temporarily overriding Object.prototype.toString\n   * to return the value of that field and then doing a native Array.sort().\n   */\n  fastSort(field: string | (() => string), ascending?: boolean) {\n    this.sortAsc = ascending;\n    this.fastSortField = field;\n    this.sortComparer = null as any;\n    const oldToString = Object.prototype.toString;\n    Object.prototype.toString = (typeof field === 'function') ? field : function () {\n      // @ts-ignore\n      return this[field];\n    };\n    // an extra reversal for descending sort keeps the sort stable\n    // (assuming a stable native sort implementation, which isn't true in some cases)\n    if (ascending === false) {\n      this.items.reverse();\n    }\n    this.items.sort();\n    Object.prototype.toString = oldToString;\n    if (ascending === false) {\n      this.items.reverse();\n    }\n    this.idxById = new Map();\n    this.updateIdxById();\n    this.refresh();\n  }\n\n  /** Re-Sort the dataset */\n  reSort() {\n    if (this.sortComparer) {\n      this.sort(this.sortComparer, this.sortAsc);\n    } else if (this.fastSortField) {\n      this.fastSort(this.fastSortField, this.sortAsc);\n    }\n  }\n\n  /** Get only the DataView filtered items */\n  getFilteredItems<T extends TData>() {\n    return this.filteredItems as T[];\n  }\n\n  /** Get the array length (count) of only the DataView filtered items */\n  getFilteredItemCount() {\n    return this.filteredItems.length;\n  }\n\n  /** Get current Filter used by the DataView */\n  getFilter() {\n    return this._options.useCSPSafeFilter ? this.filterCSPSafe : this.filter;\n  }\n\n  /**\n   * Set a Filter that will be used by the DataView\n   * @param {Function} fn - filter callback function\n   */\n  setFilter(filterFn: FilterFn<TData>) {\n    this.filterCSPSafe = filterFn;\n    this.filter = filterFn;\n    if (this._options.inlineFilters) {\n      this.compiledFilterCSPSafe = this.compileFilterCSPSafe;\n      this.compiledFilterWithCachingCSPSafe = this.compileFilterWithCachingCSPSafe;\n      this.compiledFilter = this.compileFilter(this._options.useCSPSafeFilter);\n      this.compiledFilterWithCaching = this.compileFilterWithCaching(this._options.useCSPSafeFilter);\n    }\n    this.refresh();\n  }\n\n  /** Get current Grouping info */\n  getGrouping(): Grouping[] {\n    return this.groupingInfos;\n  }\n\n  /** Set some Grouping */\n  setGrouping(groupingInfo: Grouping | Grouping[]) {\n    if (!this._options.groupItemMetadataProvider) {\n      this._options.groupItemMetadataProvider = new SlickGroupItemMetadataProvider();\n    }\n\n    this.groups = [];\n    this.toggledGroupsByLevel = [];\n    groupingInfo = groupingInfo || [];\n    this.groupingInfos = ((groupingInfo instanceof Array) ? groupingInfo : [groupingInfo]) as any;\n\n    for (let i = 0; i < this.groupingInfos.length; i++) {\n      const gi = this.groupingInfos[i] = Utils.extend(true, {}, this.groupingInfoDefaults, this.groupingInfos[i]);\n      gi.getterIsAFn = typeof gi.getter === 'function';\n\n      // pre-compile accumulator loops\n      gi.compiledAccumulators = [];\n      let idx = gi.aggregators.length;\n      while (idx--) {\n        gi.compiledAccumulators[idx] = this.compileAccumulatorLoopCSPSafe(gi.aggregators[idx]);\n      }\n\n      this.toggledGroupsByLevel[i] = {};\n    }\n\n    this.refresh();\n  }\n\n  /** Get an item in the DataView by its row index */\n  getItemByIdx<T extends TData>(i: number) {\n    return this.items[i] as T;\n  }\n\n  /** Get row index in the DataView by its Id */\n  getIdxById(id: DataIdType) {\n    return this.idxById?.get(id);\n  }\n\n  protected ensureRowsByIdCache() {\n    if (!this.rowsById) {\n      this.rowsById = {};\n      for (let i = 0, l = this.rows.length; i < l; i++) {\n        this.rowsById[this.rows[i][this.idProperty as keyof TData] as DataIdType] = i;\n      }\n    }\n  }\n\n  /** Get row number in the grid by its item object */\n  getRowByItem(item: TData) {\n    this.ensureRowsByIdCache();\n    return this.rowsById?.[item[this.idProperty as keyof TData] as DataIdType];\n  }\n\n  /** Get row number in the grid by its Id */\n  getRowById(id: DataIdType) {\n    this.ensureRowsByIdCache();\n    return this.rowsById?.[id];\n  }\n\n  /** Get an item in the DataView by its Id */\n  getItemById<T extends TData>(id: DataIdType) {\n    return this.items[(this.idxById.get(id) as number)] as T;\n  }\n\n  /** From the items array provided, return the mapped rows */\n  mapItemsToRows(itemArray: TData[]) {\n    const rows: number[] = [];\n    this.ensureRowsByIdCache();\n    for (let i = 0, l = itemArray.length; i < l; i++) {\n      const row = this.rowsById?.[itemArray[i][this.idProperty as keyof TData] as DataIdType];\n      if (Utils.isDefined(row)) {\n        rows[rows.length] = row as number;\n      }\n    }\n    return rows;\n  }\n\n  /** From the Ids array provided, return the mapped rows */\n  mapIdsToRows(idArray: DataIdType[]) {\n    const rows: number[] = [];\n    this.ensureRowsByIdCache();\n    for (let i = 0, l = idArray.length; i < l; i++) {\n      const row = this.rowsById?.[idArray[i]];\n      if (Utils.isDefined(row)) {\n        rows[rows.length] = row as number;\n      }\n    }\n    return rows;\n  }\n\n  /** From the rows array provided, return the mapped Ids */\n  mapRowsToIds(rowArray: number[]) {\n    const ids: DataIdType[] = [];\n    for (let i = 0, l = rowArray.length; i < l; i++) {\n      if (rowArray[i] < this.rows.length) {\n        const rowItem = this.rows[rowArray[i]];\n        ids[ids.length] = rowItem![this.idProperty as keyof TData] as DataIdType;\n      }\n    }\n    return ids;\n  }\n\n  /**\n   * Performs the update operations of a single item by id without\n   * triggering any events or refresh operations.\n   * @param id The new id of the item.\n   * @param item The item which should be the new value for the given id.\n   */\n  updateSingleItem(id: DataIdType, item: TData) {\n    if (!this.idxById) { return; }\n\n    // see also https://github.com/mleibman/SlickGrid/issues/1082\n    if (!this.idxById.has(id)) {\n      throw new Error('[SlickGrid DataView] Invalid id');\n    }\n\n    // What if the specified item also has an updated idProperty?\n    // Then we'll have to update the index as well, and possibly the `updated` cache too.\n    if (id !== item[this.idProperty as keyof TData]) {\n      // make sure the new id is unique:\n      const newId = item[this.idProperty as keyof TData] as DataIdType;\n      if (!Utils.isDefined(newId)) {\n        throw new Error('[SlickGrid DataView] Cannot update item to associate with a null id');\n      }\n      if (this.idxById.has(newId)) {\n        throw new Error('[SlickGrid DataView] Cannot update item to associate with a non-unique id');\n      }\n      this.idxById.set(newId, this.idxById.get(id) as number);\n      this.idxById.delete(id);\n\n      // Also update the `updated` hashtable/markercache? Yes, `recalc()` inside `refresh()` needs that one!\n      if (this.updated?.[id]) {\n        delete this.updated[id];\n      }\n\n      // Also update the row indexes? no need since the `refresh()`, further down, blows away the `rowsById[]` cache!\n\n      id = newId;\n    }\n    this.items[this.idxById.get(id) as number] = item;\n\n    // Also update the rows? no need since the `refresh()`, further down, blows away the `rows[]` cache and recalculates it via `recalc()`!\n\n    if (!this.updated) {\n      this.updated = {};\n    }\n    this.updated[id] = true;\n  }\n\n  /**\n   * Updates a single item in the data view given the id and new value.\n   * @param id The new id of the item.\n   * @param item The item which should be the new value for the given id.\n   */\n  updateItem<T extends TData>(id: DataIdType, item: T) {\n    this.updateSingleItem(id, item);\n    this.refresh();\n  }\n\n  /**\n   * Updates multiple items in the data view given the new ids and new values.\n   * @param id {Array} The array of new ids which is in the same order as the items.\n   * @param newItems {Array} The new items that should be set in the data view for the given ids.\n   */\n  updateItems<T extends TData>(ids: DataIdType[], newItems: T[]) {\n    if (ids.length !== newItems.length) {\n      throw new Error('[SlickGrid DataView] Mismatch on the length of ids and items provided to update');\n    }\n    for (let i = 0, l = newItems.length; i < l; i++) {\n      this.updateSingleItem(ids[i], newItems[i]);\n    }\n    this.refresh();\n  }\n\n  /**\n   * Inserts a single item into the data view at the given position.\n   * @param insertBefore {Number} The 0-based index before which the item should be inserted.\n   * @param item The item to insert.\n   */\n  insertItem(insertBefore: number, item: TData) {\n    this.items.splice(insertBefore, 0, item);\n    this.updateIdxById(insertBefore);\n    this.refresh();\n  }\n\n  /**\n   * Inserts multiple items into the data view at the given position.\n   * @param insertBefore {Number} The 0-based index before which the items should be inserted.\n   * @param newItems {Array}  The items to insert.\n   */\n  insertItems(insertBefore: number, newItems: TData[]) {\n    // @ts-ignore\n    Array.prototype.splice.apply(this.items, [insertBefore, 0].concat(newItems));\n    this.updateIdxById(insertBefore);\n    this.refresh();\n  }\n\n  /**\n   * Adds a single item at the end of the data view.\n   * @param item The item to add at the end.\n   */\n  addItem(item: TData) {\n    this.items.push(item);\n    this.updateIdxById(this.items.length - 1);\n    this.refresh();\n  }\n\n  /**\n   * Adds multiple items at the end of the data view.\n   * @param {Array} newItems The items to add at the end.\n   */\n  addItems(newItems: TData[]) {\n    this.items = this.items.concat(newItems);\n    this.updateIdxById(this.items.length - newItems.length);\n    this.refresh();\n  }\n\n  /**\n   * Deletes a single item identified by the given id from the data view.\n   * @param {String|Number} id The id identifying the object to delete.\n   */\n  deleteItem(id: DataIdType) {\n    if (!this.idxById) { return; }\n    if (this.isBulkSuspend) {\n      this.bulkDeleteIds.set(id, true);\n    } else {\n      const idx = this.idxById.get(id);\n      if (idx === undefined) {\n        throw new Error('[SlickGrid DataView] Invalid id');\n      }\n      this.idxById.delete(id);\n      this.items.splice(idx, 1);\n      this.updateIdxById(idx);\n      this.refresh();\n    }\n  }\n\n  /**\n   * Deletes multiple item identified by the given ids from the data view.\n   * @param {Array} ids The ids of the items to delete.\n   */\n  deleteItems(ids: DataIdType[]) {\n    if (ids.length === 0 || !this.idxById) {\n      return;\n    }\n\n    if (this.isBulkSuspend) {\n      for (let i = 0, l = ids.length; i < l; i++) {\n        const id = ids[i];\n        const idx = this.idxById.get(id);\n        if (idx === undefined) {\n          throw new Error('[SlickGrid DataView] Invalid id');\n        }\n        this.bulkDeleteIds.set(id, true);\n      }\n    } else {\n      // collect all indexes\n      const indexesToDelete: number[] = [];\n      for (let i = 0, l = ids.length; i < l; i++) {\n        const id = ids[i];\n        const idx = this.idxById.get(id);\n        if (idx === undefined) {\n          throw new Error('[SlickGrid DataView] Invalid id');\n        }\n        this.idxById.delete(id);\n        indexesToDelete.push(idx);\n      }\n\n      // Remove from back to front\n      indexesToDelete.sort();\n      for (let i = indexesToDelete.length - 1; i >= 0; --i) {\n        this.items.splice(indexesToDelete[i], 1);\n      }\n\n      // update lookup from front to back\n      this.updateIdxById(indexesToDelete[0]);\n      this.refresh();\n    }\n  }\n\n  /** Add an item in a sorted dataset (a Sort function must be defined) */\n  sortedAddItem(item: TData) {\n    if (!this.sortComparer) {\n      throw new Error('[SlickGrid DataView] sortedAddItem() requires a sort comparer, use sort()');\n    }\n    this.insertItem(this.sortedIndex(item), item);\n  }\n\n  /** Update an item in a sorted dataset (a Sort function must be defined) */\n  sortedUpdateItem(id: string | number, item: TData) {\n    if (!this.idxById) { return; }\n    if (!this.idxById.has(id) || id !== item[this.idProperty as keyof TData]) {\n      throw new Error('[SlickGrid DataView] Invalid or non-matching id ' + this.idxById.get(id));\n    }\n    if (!this.sortComparer) {\n      throw new Error('[SlickGrid DataView] sortedUpdateItem() requires a sort comparer, use sort()');\n    }\n    const oldItem = this.getItemById(id);\n    if (this.sortComparer(oldItem, item) !== 0) {\n      // item affects sorting -> must use sorted add\n      this.deleteItem(id);\n      this.sortedAddItem(item);\n    } else { // update does not affect sorting -> regular update works fine\n      this.updateItem(id, item);\n    }\n  }\n\n  protected sortedIndex(searchItem: TData) {\n    let low = 0;\n    let high = this.items.length;\n\n    while (low < high) {\n      const mid = low + high >>> 1;\n      if (this.sortComparer(this.items[mid], searchItem) === -1) {\n        low = mid + 1;\n      } else {\n        high = mid;\n      }\n    }\n    return low;\n  }\n\n  /** Get item count, that is the full dataset lenght of the DataView */\n  getItemCount() {\n    return this.items.length;\n  }\n\n  /** Get row count (rows displayed in current page) */\n  getLength() {\n    return this.rows.length;\n  }\n\n  /** Retrieve an item from the DataView at specific index */\n  getItem<T extends TData>(i: number) {\n    const item = this.rows[i] as T;\n\n    // if this is a group row, make sure totals are calculated and update the title\n    if ((item as SlickGroup_)?.__group && (item as SlickGroup_).totals && !(item as SlickGroup_).totals?.initialized) {\n      const gi = this.groupingInfos[(item as SlickGroup_).level];\n      if (!gi.displayTotalsRow) {\n        this.calculateTotals((item as SlickGroup_).totals);\n        (item as SlickGroup_).title = gi.formatter ? gi.formatter((item as SlickGroup_)) : (item as SlickGroup_).value;\n      }\n    }\n    // if this is a totals row, make sure it's calculated\n    else if ((item as SlickGroupTotals_)?.__groupTotals && !(item as SlickGroupTotals_).initialized) {\n      this.calculateTotals(item as SlickGroupTotals_);\n    }\n\n    return item;\n  }\n\n  getItemMetadata(row: number): ItemMetadata | null {\n    const item = this.rows[row];\n    if (item === undefined) {\n      return null;\n    }\n\n    // global override for all regular rows\n    if (this._options.globalItemMetadataProvider?.getRowMetadata) {\n      return this._options.globalItemMetadataProvider.getRowMetadata(item, row);\n    }\n\n    // overrides for grouping rows\n    if ((item as SlickGroup_).__group && this._options.groupItemMetadataProvider?.getGroupRowMetadata) {\n      return this._options.groupItemMetadataProvider.getGroupRowMetadata(item as GroupingFormatterItem, row);\n    }\n\n    // overrides for totals rows\n    if ((item as SlickGroupTotals_).__groupTotals && this._options.groupItemMetadataProvider?.getTotalsRowMetadata) {\n      return this._options.groupItemMetadataProvider.getTotalsRowMetadata(item as { group: GroupingFormatterItem }, row);\n    }\n\n    return null;\n  }\n\n  protected expandCollapseAllGroups(level?: number, collapse?: boolean) {\n    if (!Utils.isDefined(level)) {\n      for (let i = 0; i < this.groupingInfos.length; i++) {\n        this.toggledGroupsByLevel[i] = {};\n        this.groupingInfos[i].collapsed = collapse;\n\n        if (collapse === true) {\n          this.onGroupCollapsed.notify({ level: i, groupingKey: null });\n        } else {\n          this.onGroupExpanded.notify({ level: i, groupingKey: null });\n        }\n      }\n    } else {\n      this.toggledGroupsByLevel[level] = {};\n      this.groupingInfos[level].collapsed = collapse;\n\n      if (collapse === true) {\n        this.onGroupCollapsed.notify({ level, groupingKey: null });\n      } else {\n        this.onGroupExpanded.notify({ level, groupingKey: null });\n      }\n    }\n    this.refresh();\n  }\n\n  /**\n   * @param {Number} [level] Optional level to collapse.  If not specified, applies to all levels.\n   */\n  collapseAllGroups(level?: number) {\n    this.expandCollapseAllGroups(level, true);\n  }\n\n  /**\n   * @param {Number} [level] Optional level to expand.  If not specified, applies to all levels.\n   */\n  expandAllGroups(level?: number) {\n    this.expandCollapseAllGroups(level, false);\n  }\n\n  expandCollapseGroup(level: number, groupingKey: string, collapse?: boolean) {\n    // @ts-ignore\n    this.toggledGroupsByLevel[level][groupingKey] = this.groupingInfos[level].collapsed ^ collapse;\n    this.refresh();\n  }\n\n  /**\n   * @param varArgs Either a Slick.Group's \"groupingKey\" property, or a\n   *     variable argument list of grouping values denoting a unique path to the row.  For\n   *     example, calling collapseGroup('high', '10%') will collapse the '10%' subgroup of\n   *     the 'high' group.\n   */\n  collapseGroup(...args: any) {\n    const calledArgs = Array.prototype.slice.call(args);\n    const arg0 = calledArgs[0];\n    let groupingKey: string;\n    let level: number;\n\n    if (args.length === 1 && arg0.indexOf(this.groupingDelimiter) !== -1) {\n      groupingKey = arg0;\n      level = arg0.split(this.groupingDelimiter).length - 1;\n    } else {\n      groupingKey = args.join(this.groupingDelimiter);\n      level = args.length - 1;\n    }\n\n    this.expandCollapseGroup(level, groupingKey, true);\n    this.onGroupCollapsed.notify({ level, groupingKey });\n  }\n\n  /**\n   * @param varArgs Either a Slick.Group's \"groupingKey\" property, or a\n   *     variable argument list of grouping values denoting a unique path to the row.  For\n   *     example, calling expandGroup('high', '10%') will expand the '10%' subgroup of\n   *     the 'high' group.\n   */\n  expandGroup(...args: any) {\n    const calledArgs = Array.prototype.slice.call(args);\n    const arg0 = calledArgs[0];\n    let groupingKey: string;\n    let level: number;\n\n    if (args.length === 1 && arg0.indexOf(this.groupingDelimiter) !== -1) {\n      level = arg0.split(this.groupingDelimiter).length - 1;\n      groupingKey = arg0;\n    } else {\n      level = args.length - 1;\n      groupingKey = args.join(this.groupingDelimiter);\n    }\n\n    this.expandCollapseGroup(level, groupingKey, false);\n    this.onGroupExpanded.notify({ level, groupingKey });\n  }\n\n  getGroups() {\n    return this.groups;\n  }\n\n  protected extractGroups(rows: any[], parentGroup?: SlickGroup_) {\n    let group: SlickGroup_;\n    let val: any;\n    const groups: SlickGroup_[] = [];\n    const groupsByVal: any = {};\n    let r;\n    const level = parentGroup ? parentGroup.level + 1 : 0;\n    const gi = this.groupingInfos[level];\n\n    for (let i = 0, l = gi.predefinedValues?.length ?? 0; i < l; i++) {\n      val = gi.predefinedValues?.[i];\n      group = groupsByVal[val];\n      if (!group) {\n        group = new SlickGroup();\n        group.value = val;\n        group.level = level;\n        group.groupingKey = (parentGroup ? parentGroup.groupingKey + this.groupingDelimiter : '') + val;\n        groups[groups.length] = group;\n        groupsByVal[val] = group;\n      }\n    }\n\n    for (let i = 0, l = rows.length; i < l; i++) {\n      r = rows[i];\n      val = gi.getterIsAFn ? (gi.getter as GroupGetterFn)(r) : r[gi.getter as keyof TData];\n      group = groupsByVal[val];\n      if (!group) {\n        group = new SlickGroup();\n        group.value = val;\n        group.level = level;\n        group.groupingKey = (parentGroup ? parentGroup.groupingKey + this.groupingDelimiter : '') + val;\n        groups[groups.length] = group;\n        groupsByVal[val] = group;\n      }\n\n      group.rows[group.count++] = r;\n    }\n\n    if (level < this.groupingInfos.length - 1) {\n      for (let i = 0; i < groups.length; i++) {\n        group = groups[i];\n        group.groups = this.extractGroups(group.rows, group);\n      }\n    }\n\n    if (groups.length) {\n      this.addTotals(groups, level);\n    }\n\n    groups.sort(this.groupingInfos[level].comparer);\n\n    return groups;\n  }\n\n  /** claculate Group Totals */\n  protected calculateTotals(totals: SlickGroupTotals_) {\n    const group = totals.group;\n    const gi = this.groupingInfos[group.level ?? 0];\n    const isLeafLevel = (group.level === this.groupingInfos.length);\n    let agg: Aggregator;\n    let idx = gi.aggregators.length;\n\n    if (!isLeafLevel && gi.aggregateChildGroups) {\n      // make sure all the subgroups are calculated\n      let i = group.groups?.length ?? 0;\n      while (i--) {\n        if (!group.groups[i].totals.initialized) {\n          this.calculateTotals(group.groups[i].totals);\n        }\n      }\n    }\n\n    while (idx--) {\n      agg = gi.aggregators[idx];\n      agg.init();\n      if (!isLeafLevel && gi.aggregateChildGroups) {\n        gi.compiledAccumulators[idx].call(agg, group.groups);\n      } else {\n        gi.compiledAccumulators[idx].call(agg, group.rows);\n      }\n      agg.storeResult(totals);\n    }\n    totals.initialized = true;\n  }\n\n  protected addGroupTotals(group: SlickGroup_) {\n    const gi = this.groupingInfos[group.level];\n    const totals = new SlickGroupTotals();\n    totals.group = group;\n    group.totals = totals;\n    if (!gi.lazyTotalsCalculation) {\n      this.calculateTotals(totals);\n    }\n  }\n\n  protected addTotals(groups: SlickGroup_[], level?: number) {\n    level = level || 0;\n    const gi = this.groupingInfos[level];\n    const groupCollapsed = gi.collapsed;\n    const toggledGroups = this.toggledGroupsByLevel[level];\n    let idx = groups.length, g;\n    while (idx--) {\n      g = groups[idx];\n\n      if (g.collapsed && !gi.aggregateCollapsed) {\n        continue;\n      }\n\n      // Do a depth-first aggregation so that parent group aggregators can access subgroup totals.\n      if (g.groups) {\n        this.addTotals(g.groups, level + 1);\n      }\n\n      if (gi.aggregators?.length && (\n        gi.aggregateEmpty || g.rows.length || g.groups?.length)) {\n        this.addGroupTotals(g);\n      }\n\n      g.collapsed = (groupCollapsed as any) ^ toggledGroups[g.groupingKey];\n      g.title = gi.formatter ? gi.formatter(g) : g.value;\n    }\n  }\n\n  protected flattenGroupedRows(groups: SlickGroup_[], level?: number) {\n    level = level || 0;\n    const gi = this.groupingInfos[level];\n    const groupedRows: any[] = [];\n    let rows: any[];\n    let gl = 0;\n    let g;\n    for (let i = 0, l = groups.length; i < l; i++) {\n      g = groups[i];\n      groupedRows[gl++] = g;\n\n      if (!g.collapsed) {\n        rows = g.groups ? this.flattenGroupedRows(g.groups, level + 1) : g.rows;\n        for (let j = 0, jj = rows.length; j < jj; j++) {\n          groupedRows[gl++] = rows[j];\n        }\n      }\n\n      if (g.totals && gi.displayTotalsRow && (!g.collapsed || gi.aggregateCollapsed)) {\n        groupedRows[gl++] = g.totals;\n      }\n    }\n    return groupedRows;\n  }\n\n  protected compileAccumulatorLoopCSPSafe(aggregator: Aggregator) {\n    if (aggregator.accumulate) {\n      return function (items: any[]) {\n        let result;\n        for (let i = 0; i < items.length; i++) {\n          const item = items[i];\n          result = aggregator.accumulate!.call(aggregator, item);\n        }\n        return result;\n      };\n    } else {\n      return function noAccumulator() { };\n    }\n  }\n\n  protected compileFilterCSPSafe(items: TData[], args: any): TData[] {\n    if (typeof this.filterCSPSafe !== 'function') {\n      return [];\n    }\n    const _retval: TData[] = [];\n    const _il = items.length;\n\n    for (let _i = 0; _i < _il; _i++) {\n      if (this.filterCSPSafe(items[_i], args)) {\n        _retval.push(items[_i]);\n      }\n    }\n\n    return _retval;\n  }\n\n  protected compileFilter(stopRunningIfCSPSafeIsActive = false): FilterFn<TData> | null {\n    if (stopRunningIfCSPSafeIsActive) {\n      return null as any;\n    }\n    const filterInfo = Utils.getFunctionDetails(this.filter as FilterFn<TData>);\n\n    const filterPath1 = '{ continue _coreloop; }$1';\n    const filterPath2 = '{ _retval[_idx++] = $item$; continue _coreloop; }$1';\n    // make some allowances for minification - there's only so far we can go with RegEx\n    const filterBody = filterInfo.body\n      .replace(/return false\\s*([;}]|\\}|$)/gi, filterPath1)\n      .replace(/return!1([;}]|\\}|$)/gi, filterPath1)\n      .replace(/return true\\s*([;}]|\\}|$)/gi, filterPath2)\n      .replace(/return!0([;}]|\\}|$)/gi, filterPath2)\n      .replace(/return ([^;}]+?)\\s*([;}]|$)/gi,\n        '{ if ($1) { _retval[_idx++] = $item$; }; continue _coreloop; }$2');\n\n    // This preserves the function template code after JS compression,\n    // so that replace() commands still work as expected.\n    let tpl = [\n      // 'function(_items, _args) { ',\n      'var _retval = [], _idx = 0; ',\n      'var $item$, $args$ = _args; ',\n      '_coreloop: ',\n      'for (var _i = 0, _il = _items.length; _i < _il; _i++) { ',\n      '$item$ = _items[_i]; ',\n      '$filter$; ',\n      '} ',\n      'return _retval; '\n      // '}'\n    ].join('');\n    tpl = tpl.replace(/\\$filter\\$/gi, filterBody);\n    tpl = tpl.replace(/\\$item\\$/gi, filterInfo.params[0]);\n    tpl = tpl.replace(/\\$args\\$/gi, filterInfo.params[1]);\n    const fn: any = new Function('_items,_args', tpl);\n    const fnName = 'compiledFilter';\n    fn.displayName = fnName;\n    fn.name = this.setFunctionName(fn, fnName);\n    return fn;\n  }\n\n  protected compileFilterWithCaching(stopRunningIfCSPSafeIsActive = false) {\n    if (stopRunningIfCSPSafeIsActive) {\n      return null as any;\n    }\n\n    const filterInfo = Utils.getFunctionDetails(this.filter as FilterFn<TData>);\n\n    const filterPath1 = '{ continue _coreloop; }$1';\n    const filterPath2 = '{ _cache[_i] = true;_retval[_idx++] = $item$; continue _coreloop; }$1';\n    // make some allowances for minification - there's only so far we can go with RegEx\n    const filterBody = filterInfo.body\n      .replace(/return false\\s*([;}]|\\}|$)/gi, filterPath1)\n      .replace(/return!1([;}]|\\}|$)/gi, filterPath1)\n      .replace(/return true\\s*([;}]|\\}|$)/gi, filterPath2)\n      .replace(/return!0([;}]|\\}|$)/gi, filterPath2)\n      .replace(/return ([^;}]+?)\\s*([;}]|$)/gi,\n        '{ if ((_cache[_i] = $1)) { _retval[_idx++] = $item$; }; continue _coreloop; }$2');\n\n    // This preserves the function template code after JS compression,\n    // so that replace() commands still work as expected.\n    let tpl = [\n      // 'function(_items, _args, _cache) { ',\n      'var _retval = [], _idx = 0; ',\n      'var $item$, $args$ = _args; ',\n      '_coreloop: ',\n      'for (var _i = 0, _il = _items.length; _i < _il; _i++) { ',\n      '$item$ = _items[_i]; ',\n      'if (_cache[_i]) { ',\n      '_retval[_idx++] = $item$; ',\n      'continue _coreloop; ',\n      '} ',\n      '$filter$; ',\n      '} ',\n      'return _retval; '\n      // '}'\n    ].join('');\n    tpl = tpl.replace(/\\$filter\\$/gi, filterBody);\n    tpl = tpl.replace(/\\$item\\$/gi, filterInfo.params[0]);\n    tpl = tpl.replace(/\\$args\\$/gi, filterInfo.params[1]);\n\n    const fn: any = new Function('_items,_args,_cache', tpl);\n    const fnName = 'compiledFilterWithCaching';\n    fn.displayName = fnName;\n    fn.name = this.setFunctionName(fn, fnName);\n    return fn;\n  }\n\n  protected compileFilterWithCachingCSPSafe(items: TData[], args: any, filterCache: any[]): TData[] {\n    if (typeof this.filterCSPSafe !== 'function') {\n      return [];\n    }\n\n    const retval: TData[] = [];\n    const il = items.length;\n\n    for (let _i = 0; _i < il; _i++) {\n      if (filterCache[_i] || this.filterCSPSafe(items[_i], args)) {\n        retval.push(items[_i]);\n      }\n    }\n\n    return retval;\n  }\n\n  /**\n   * In ES5 we could set the function name on the fly but in ES6 this is forbidden and we need to set it through differently\n   * We can use Object.defineProperty and set it the property to writable, see MDN for reference\n   * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty\n   * @param {*} fn\n   * @param {string} fnName\n   */\n  protected setFunctionName(fn: any, fnName: string) {\n    try {\n      Object.defineProperty(fn, 'name', { writable: true, value: fnName });\n    } catch (err) {\n      fn.name = fnName;\n    }\n  }\n\n  protected uncompiledFilter(items: TData[], args: any) {\n    const retval: any[] = [];\n    let idx = 0;\n\n    for (let i = 0, ii = items.length; i < ii; i++) {\n      if (this.filter?.(items[i], args)) {\n        retval[idx++] = items[i];\n      }\n    }\n\n    return retval;\n  }\n\n  protected uncompiledFilterWithCaching(items: TData[], args: any, cache: any) {\n    const retval: any[] = [];\n    let idx = 0,\n      item: TData;\n\n    for (let i = 0, ii = items.length; i < ii; i++) {\n      item = items[i];\n      if (cache[i]) {\n        retval[idx++] = item;\n      } else if (this.filter?.(item, args)) {\n        retval[idx++] = item;\n        cache[i] = true;\n      }\n    }\n\n    return retval;\n  }\n\n  protected getFilteredAndPagedItems(items: TData[]) {\n    if (this._options.useCSPSafeFilter ? this.filterCSPSafe : this.filter) {\n      let batchFilter: AnyFunction;\n      let batchFilterWithCaching: AnyFunction;\n      if (this._options.useCSPSafeFilter) {\n        batchFilter = (this._options.inlineFilters ? this.compiledFilterCSPSafe : this.uncompiledFilter) as AnyFunction;\n        batchFilterWithCaching = (this._options.inlineFilters ? this.compiledFilterWithCachingCSPSafe : this.uncompiledFilterWithCaching) as AnyFunction;\n      } else {\n        batchFilter = (this._options.inlineFilters ? this.compiledFilter : this.uncompiledFilter) as AnyFunction;\n        batchFilterWithCaching = (this._options.inlineFilters ? this.compiledFilterWithCaching : this.uncompiledFilterWithCaching) as AnyFunction;\n      }\n      if (this.refreshHints.isFilterNarrowing) {\n        this.filteredItems = batchFilter.call(this, this.filteredItems, this.filterArgs);\n      } else if (this.refreshHints.isFilterExpanding) {\n        this.filteredItems = batchFilterWithCaching.call(this, items, this.filterArgs, this.filterCache);\n      } else if (!this.refreshHints.isFilterUnchanged) {\n        this.filteredItems = batchFilter.call(this, items, this.filterArgs);\n      }\n    } else {\n      // special case:  if not filtering and not paging, the resulting\n      // rows collection needs to be a copy so that changes due to sort\n      // can be caught\n      this.filteredItems = this.pagesize ? items : items.concat();\n    }\n\n    // get the current page\n    let paged: TData[];\n    if (this.pagesize) {\n      if (this.filteredItems.length <= this.pagenum * this.pagesize) {\n        if (this.filteredItems.length === 0) {\n          this.pagenum = 0;\n        } else {\n          this.pagenum = Math.floor((this.filteredItems.length - 1) / this.pagesize);\n        }\n      }\n      paged = this.filteredItems.slice(this.pagesize * this.pagenum, this.pagesize * this.pagenum + this.pagesize);\n    } else {\n      paged = this.filteredItems;\n    }\n    return { totalRows: this.filteredItems.length, rows: paged };\n  }\n\n  protected getRowDiffs(rows: TData[], newRows: TData[]) {\n    let item: TData | SlickNonDataItem | SlickDataItem | SlickGroup_;\n    let r;\n    let eitherIsNonData;\n    const diff: number[] = [];\n    let from = 0;\n    let to = Math.max(newRows.length, rows.length);\n\n    if (this.refreshHints?.ignoreDiffsBefore) {\n      from = Math.max(0,\n        Math.min(newRows.length, this.refreshHints.ignoreDiffsBefore));\n    }\n\n    if (this.refreshHints?.ignoreDiffsAfter) {\n      to = Math.min(newRows.length,\n        Math.max(0, this.refreshHints.ignoreDiffsAfter));\n    }\n\n    for (let i = from, rl = rows.length; i < to; i++) {\n      if (i >= rl) {\n        diff[diff.length] = i;\n      } else {\n        item = newRows[i];\n        r = rows[i];\n\n        if (!item || (this.groupingInfos.length && (eitherIsNonData = ((item as SlickNonDataItem).__nonDataRow) || ((r as SlickNonDataItem).__nonDataRow)) &&\n          (item as SlickGroup_).__group !== (r as SlickGroup_).__group ||\n          (item as SlickGroup_).__group && !(item as SlickGroup_).equals(r as SlickGroup_))\n          || (eitherIsNonData &&\n            // no good way to compare totals since they are arbitrary DTOs\n            // deep object comparison is pretty expensive\n            // always considering them 'dirty' seems easier for the time being\n            ((item as SlickGroupTotals_).__groupTotals || (r as SlickGroupTotals_).__groupTotals))\n          || item[this.idProperty as keyof TData] !== r[this.idProperty as keyof TData]\n          || (this.updated?.[item[this.idProperty as keyof TData]])\n        ) {\n          diff[diff.length] = i;\n        }\n      }\n    }\n    return diff;\n  }\n\n  protected recalc(_items: TData[]) {\n    this.rowsById = undefined;\n\n    if (this.refreshHints.isFilterNarrowing !== this.prevRefreshHints.isFilterNarrowing ||\n      this.refreshHints.isFilterExpanding !== this.prevRefreshHints.isFilterExpanding) {\n      this.filterCache = [];\n    }\n\n    const filteredItems = this.getFilteredAndPagedItems(_items);\n    this.totalRows = filteredItems.totalRows;\n    let newRows: TData[] = filteredItems.rows;\n\n    this.groups = [];\n    if (this.groupingInfos.length) {\n      this.groups = this.extractGroups(newRows);\n      if (this.groups.length) {\n        newRows = this.flattenGroupedRows(this.groups);\n      }\n    }\n\n    const diff = this.getRowDiffs(this.rows, newRows as TData[]);\n\n    this.rows = newRows as TData[];\n\n    return diff;\n  }\n\n  refresh() {\n    if (this.suspend) {\n      return;\n    }\n\n    const previousPagingInfo = Utils.extend(true, {}, this.getPagingInfo());\n\n    const countBefore = this.rows.length;\n    const totalRowsBefore = this.totalRows;\n\n    let diff = this.recalc(this.items); // pass as direct refs to avoid closure perf hit\n\n    // if the current page is no longer valid, go to last page and recalc\n    // we suffer a performance penalty here, but the main loop (recalc) remains highly optimized\n    if (this.pagesize && this.totalRows < this.pagenum * this.pagesize) {\n      this.pagenum = Math.max(0, Math.ceil(this.totalRows / this.pagesize) - 1);\n      diff = this.recalc(this.items);\n    }\n\n    this.updated = null;\n    this.prevRefreshHints = this.refreshHints;\n    this.refreshHints = {};\n\n    if (totalRowsBefore !== this.totalRows) {\n      // use the previously saved paging info\n      if (this.onBeforePagingInfoChanged.notify(previousPagingInfo, null, this).getReturnValue() !== false) {\n        this.onPagingInfoChanged.notify(this.getPagingInfo(), null, this);\n      }\n    }\n    if (countBefore !== this.rows.length) {\n      this.onRowCountChanged.notify({ previous: countBefore, current: this.rows.length, itemCount: this.items.length, dataView: this, callingOnRowsChanged: (diff.length > 0) }, null, this);\n    }\n    if (diff.length > 0) {\n      this.onRowsChanged.notify({ rows: diff, itemCount: this.items.length, dataView: this, calledOnRowCountChanged: (countBefore !== this.rows.length) }, null, this);\n    }\n    if (countBefore !== this.rows.length || diff.length > 0) {\n      this.onRowsOrCountChanged.notify({\n        rowsDiff: diff, previousRowCount: countBefore, currentRowCount: this.rows.length, itemCount: this.items.length,\n        rowCountChanged: countBefore !== this.rows.length, rowsChanged: diff.length > 0, dataView: this\n      }, null, this);\n    }\n  }\n\n  /**\n   * Wires the grid and the DataView together to keep row selection tied to item ids.\n   * This is useful since, without it, the grid only knows about rows, so if the items\n   * move around, the same rows stay selected instead of the selection moving along\n   * with the items.\n   *\n   * NOTE:  This doesn't work with cell selection model.\n   *\n   * @param {SlickGrid} grid - The grid to sync selection with.\n   * @param {Boolean} preserveHidden - Whether to keep selected items that go out of the\n   *     view due to them getting filtered out.\n   * @param {Boolean} [preserveHiddenOnSelectionChange] - Whether to keep selected items\n   *     that are currently out of the view (see preserveHidden) as selected when selection\n   *     changes.\n   * @return {Event} An event that notifies when an internal list of selected row ids\n   *     changes.  This is useful since, in combination with the above two options, it allows\n   *     access to the full list selected row ids, and not just the ones visible to the grid.\n   * @method syncGridSelection\n   */\n  syncGridSelection(grid: SlickGridModel, preserveHidden: boolean, preserveHiddenOnSelectionChange?: boolean) {\n    this._grid = grid;\n    let inHandler: boolean;\n    this.selectedRowIds = this.mapRowsToIds(grid.getSelectedRows());\n\n    /** @param {Array} rowIds */\n    const setSelectedRowIds = (rowIds: DataIdType[] | false) => {\n      if (rowIds === false) {\n        this.selectedRowIds = [];\n      } else {\n        if (this.selectedRowIds!.sort().join(',') !== rowIds.sort().join(',')) {\n          this.selectedRowIds = rowIds;\n        }\n      }\n    };\n\n    const update = () => {\n      if ((this.selectedRowIds || []).length > 0 && !inHandler) {\n        inHandler = true;\n        const selectedRows = this.mapIdsToRows(this.selectedRowIds || []);\n        if (!preserveHidden) {\n          const selectedRowsChangedArgs = {\n            grid: this._grid,\n            ids: this.mapRowsToIds(selectedRows),\n            rows: selectedRows,\n            dataView: this\n          };\n          this.preSelectedRowIdsChangeFn!(selectedRowsChangedArgs);\n          this.onSelectedRowIdsChanged.notify(Object.assign(selectedRowsChangedArgs, {\n            selectedRowIds: this.selectedRowIds,\n            filteredIds: this.getAllSelectedFilteredIds() as DataIdType[],\n          }), new SlickEventData(), this);\n        }\n        grid.setSelectedRows(selectedRows);\n        inHandler = false;\n      }\n    };\n\n    grid.onSelectedRowsChanged.subscribe((_e: SlickEventData_, args: { rows: number[]; }) => {\n      if (!inHandler) {\n        const newSelectedRowIds = this.mapRowsToIds(args.rows);\n        const selectedRowsChangedArgs = {\n          grid: this._grid,\n          ids: newSelectedRowIds,\n          rows: args.rows,\n          added: true,\n          dataView: this\n        };\n        this.preSelectedRowIdsChangeFn!(selectedRowsChangedArgs);\n        this.onSelectedRowIdsChanged.notify(Object.assign(selectedRowsChangedArgs, {\n          selectedRowIds: this.selectedRowIds,\n          filteredIds: this.getAllSelectedFilteredIds() as DataIdType[],\n        }), new SlickEventData(), this);\n      }\n    });\n\n    this.preSelectedRowIdsChangeFn = (args: { ids: DataIdType[]; added?: boolean; }) => {\n      if (!inHandler) {\n        inHandler = true;\n        const overwrite = (typeof args.added === typeof undefined);\n\n        if (overwrite) {\n          setSelectedRowIds(args.ids);\n        } else {\n          let rowIds: DataIdType[];\n          if (args.added) {\n            if (preserveHiddenOnSelectionChange && grid.getOptions().multiSelect) {\n              // find the ones that are hidden\n              const hiddenSelectedRowIds = this.selectedRowIds?.filter((id) => this.getRowById(id) === undefined);\n              // add the newly selected ones\n              rowIds = hiddenSelectedRowIds!.concat(args.ids);\n            } else {\n              rowIds = args.ids;\n            }\n          } else {\n            if (preserveHiddenOnSelectionChange && grid.getOptions().multiSelect) {\n              // remove rows whose id is on the list\n              const argsIdsSet = new Set(args.ids);\n              rowIds = this.selectedRowIds?.filter((id) => !argsIdsSet.has(id));\n            } else {\n              rowIds = [];\n            }\n          }\n          setSelectedRowIds(rowIds);\n        }\n        inHandler = false;\n      }\n    };\n\n    this.onRowsOrCountChanged.subscribe(update.bind(this));\n\n    return this.onSelectedRowIdsChanged;\n  }\n\n  /**\n   * Get all selected IDs\n   * Note: when using Pagination it will also include hidden selections assuming `preserveHiddenOnSelectionChange` is set to true.\n   */\n  getAllSelectedIds() {\n    return this.selectedRowIds;\n  }\n\n  /**\n   * Get all selected filtered IDs (similar to \"getAllSelectedIds\" but only return filtered data)\n   * Note: when using Pagination it will also include hidden selections assuming `preserveHiddenOnSelectionChange` is set to true.\n   */\n  getAllSelectedFilteredIds() {\n    return this.getAllSelectedFilteredItems().map((item) => item[this.idProperty as keyof TData]);\n  }\n\n  /**\n   * Set current row selected IDs array (regardless of Pagination)\n   * NOTE: This will NOT change the selection in the grid, if you need to do that then you still need to call\n   * \"grid.setSelectedRows(rows)\"\n   * @param {Array} selectedIds - list of IDs which have been selected for this action\n   * @param {Object} options\n   *  - `isRowBeingAdded`: defaults to true, are the new selected IDs being added (or removed) as new row selections\n   *  - `shouldTriggerEvent`: defaults to true, should we trigger `onSelectedRowIdsChanged` event\n   *  - `applyRowSelectionToGrid`: defaults to true, should we apply the row selections to the grid in the UI\n   */\n  setSelectedIds(selectedIds: Array<number | string>, options?: Partial<{ isRowBeingAdded: boolean; shouldTriggerEvent: boolean; applyRowSelectionToGrid: boolean; }>) {\n    let isRowBeingAdded = options?.isRowBeingAdded;\n    const shouldTriggerEvent = options?.shouldTriggerEvent;\n    const applyRowSelectionToGrid = options?.applyRowSelectionToGrid;\n\n    if (isRowBeingAdded !== false) {\n      isRowBeingAdded = true;\n    }\n    const selectedRows = this.mapIdsToRows(selectedIds);\n    const selectedRowsChangedArgs = {\n      grid: this._grid,\n      ids: selectedIds,\n      rows: selectedRows,\n      added: isRowBeingAdded,\n      dataView: this\n    };\n    this.preSelectedRowIdsChangeFn?.(selectedRowsChangedArgs);\n\n    if (shouldTriggerEvent !== false) {\n      this.onSelectedRowIdsChanged.notify(Object.assign(selectedRowsChangedArgs, {\n        selectedRowIds: this.selectedRowIds,\n        filteredIds: this.getAllSelectedFilteredIds() as DataIdType[],\n      }), new SlickEventData(), this);\n    }\n\n    // should we also apply the row selection in to the grid (UI) as well?\n    if (applyRowSelectionToGrid !== false && this._grid) {\n      this._grid.setSelectedRows(selectedRows);\n    }\n  }\n\n  /**\n   * Get all selected dataContext items\n   * Note: when using Pagination it will also include hidden selections assuming `preserveHiddenOnSelectionChange` is set to true.\n   */\n  getAllSelectedItems<T extends TData>() {\n    const selectedData: TData[] = [];\n    const selectedIds = this.getAllSelectedIds();\n    selectedIds!.forEach((id) => {\n      selectedData.push(this.getItemById(id));\n    });\n    return selectedData as T[];\n  }\n\n  /**\n  * Get all selected filtered dataContext items (similar to \"getAllSelectedItems\" but only return filtered data)\n  * Note: when using Pagination it will also include hidden selections assuming `preserveHiddenOnSelectionChange` is set to true.\n  */\n  getAllSelectedFilteredItems<T extends TData>() {\n    if (!Array.isArray(this.selectedRowIds)) {\n      return [];\n    }\n\n    const selectedRowIdSet = new Set<DataIdType>(this.selectedRowIds);\n    const intersection = this.filteredItems.filter((a) => selectedRowIdSet.has(a[this.idProperty as keyof TData] as DataIdType));\n    return (intersection || []) as T[];\n  }\n\n  syncGridCellCssStyles(grid: SlickGridModel, key: string) {\n    let hashById: any;\n    let inHandler: boolean;\n\n    const storeCellCssStyles = (hash: CssStyleHash) => {\n      hashById = {};\n      if (typeof hash === 'object') {\n        Object.keys(hash).forEach(row => {\n          if (hash) {\n            const id = this.rows[row as any][this.idProperty as keyof TData];\n            hashById[id] = hash[row];\n          }\n        });\n      }\n    };\n\n    // since this method can be called after the cell styles have been set,\n    // get the existing ones right away\n    storeCellCssStyles(grid.getCellCssStyles(key));\n\n    const update = () => {\n      if (typeof hashById === 'object') {\n        inHandler = true;\n        this.ensureRowsByIdCache();\n        const newHash: CssStyleHash = {};\n        Object.keys(hashById).forEach(id => {\n          const row = this.rowsById?.[id];\n          if (Utils.isDefined(row)) {\n            newHash[row as number] = hashById[id];\n          }\n        });\n        grid.setCellCssStyles(key, newHash);\n        inHandler = false;\n      }\n    };\n\n    grid.onCellCssStylesChanged.subscribe((_e: SlickEventData_, args: any) => {\n      if (inHandler) { return; }\n      if (key !== args.key) { return; }\n      if (args.hash) {\n        storeCellCssStyles(args.hash);\n      } else {\n        grid.onCellCssStylesChanged.unsubscribe();\n        this.onRowsOrCountChanged.unsubscribe(update);\n      }\n    });\n\n    this.onRowsOrCountChanged.subscribe(update.bind(this));\n  }\n}\n\nexport class AvgAggregator<T = any> implements Aggregator {\n  private _nonNullCount = 0;\n  private _sum = 0;\n  private _field: number | string;\n  private _type = 'avg' as const;\n\n  constructor(field: number | string) {\n    this._field = field;\n  }\n\n  get field(): number | string {\n    return this._field;\n  }\n\n  get type(): string {\n    return this._type;\n  }\n\n  init(): void {\n    this._nonNullCount = 0;\n    this._sum = 0;\n  }\n\n  accumulate(item: T) {\n    const val: any = (item?.hasOwnProperty(this._field)) ? item[this._field as keyof T] : null;\n    if (val !== null && val !== '' && !isNaN(val)) {\n      this._nonNullCount++;\n      this._sum += parseFloat(val);\n    }\n  }\n\n  storeResult(groupTotals: SlickGroupTotals_ & { avg: Record<number | string, number>; }) {\n    if (!groupTotals || groupTotals[this._type] === undefined) {\n      (groupTotals as any)[this._type] = {};\n    }\n    if (this._nonNullCount !== 0) {\n      groupTotals[this._type][this._field] = this._sum / this._nonNullCount;\n    }\n  }\n}\n\nexport class MinAggregator<T = any> implements Aggregator {\n  private _min: number | null = null;\n  private _field: number | string;\n  private _type = 'min' as const;\n\n  constructor(field: number | string) {\n    this._field = field;\n  }\n\n  get field(): number | string {\n    return this._field;\n  }\n\n  get type(): string {\n    return this._type;\n  }\n\n  init() {\n    this._min = null;\n  }\n\n  accumulate(item: T) {\n    const val: any = (item?.hasOwnProperty(this._field)) ? item[this._field as keyof T] : null;\n    if (val !== null && val !== '' && !isNaN(val)) {\n      if (this._min === null || val < this._min) {\n        this._min = parseFloat(val);\n      }\n    }\n  }\n\n  storeResult(groupTotals: SlickGroupTotals_ & { min: Record<number | string, number | null>; }) {\n    if (!groupTotals || groupTotals[this._type] === undefined) {\n      groupTotals[this._type] = {};\n    }\n    groupTotals[this._type][this._field] = this._min;\n  }\n}\n\nexport class MaxAggregator<T = any> implements Aggregator {\n  private _max: number | null = null;\n  private _field: number | string;\n  private _type = 'max' as const;\n\n  constructor(field: number | string) {\n    this._field = field;\n  }\n\n  get field(): number | string {\n    return this._field;\n  }\n\n  get type(): string {\n    return this._type;\n  }\n\n  init(): void {\n    this._max = null;\n  }\n\n  accumulate(item: T) {\n    const val: any = (item?.hasOwnProperty(this._field)) ? item[this._field as keyof T] : null;\n    if (val !== null && val !== '' && !isNaN(val)) {\n      if (this._max === null || val > this._max) {\n        this._max = parseFloat(val);\n      }\n    }\n  }\n\n  storeResult(groupTotals: SlickGroupTotals_ & { max: Record<number | string, number | null>; }) {\n    if (!groupTotals || groupTotals[this._type] === undefined) {\n      groupTotals[this._type] = {};\n    }\n    groupTotals[this._type][this._field] = this._max;\n  }\n}\n\nexport class SumAggregator<T = any> implements Aggregator {\n  private _sum = 0;\n  private _field: number | string;\n  private _type = 'sum' as const;\n\n  constructor(field: number | string) {\n    this._field = field;\n  }\n\n  get field(): number | string {\n    return this._field;\n  }\n\n  get type(): string {\n    return this._type;\n  }\n\n  init() {\n    this._sum = 0;\n  }\n\n  accumulate(item: T) {\n    const val: any = (item?.hasOwnProperty(this._field)) ? item[this._field as keyof T] : null;\n    if (val !== null && val !== '' && !isNaN(val)) {\n      this._sum += parseFloat(val);\n    }\n  }\n\n  storeResult(groupTotals: SlickGroupTotals_ & { sum: Record<number | string, number>; }) {\n    if (!groupTotals || groupTotals[this._type] === undefined) {\n      groupTotals[this._type] = {};\n    }\n    groupTotals[this._type][this._field] = this._sum;\n  }\n}\n\nexport class CountAggregator implements Aggregator {\n  private _field: number | string;\n  private _type = 'count' as const;\n\n  constructor(field: number | string) {\n    this._field = field;\n  }\n\n  get field(): number | string {\n    return this._field;\n  }\n\n  get type(): string {\n    return this._type;\n  }\n\n  init(): void {\n  }\n\n  storeResult(groupTotals: SlickGroupTotals_ & { count: Record<number | string, number>; }) {\n    if (!groupTotals || groupTotals[this._type] === undefined) {\n      groupTotals[this._type] = {};\n    }\n    groupTotals[this._type][this._field] = groupTotals.group.rows.length;\n  }\n}\n\n// TODO:  add more built-in aggregators\n// TODO:  merge common aggregators in one to prevent needless iterating\n\nexport const Aggregators = {\n  Avg: AvgAggregator,\n  Min: MinAggregator,\n  Max: MaxAggregator,\n  Sum: SumAggregator,\n  Count: CountAggregator\n};\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  window.Slick.Data = window.Slick.Data || {};\n  window.Slick.Data.DataView = SlickDataView;\n  window.Slick.Data.Aggregators = Aggregators;\n}\n", "import type { Column, Editor, EditorArguments, EditorValidationResult, ElementPosition, GridOption, OnCompositeEditorChangeEventArgs } from './models/index.js';\nimport { keyCode as keyCode_, Utils as Utils_ } from './slick.core.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst keyCode = IIFE_ONLY ? Slick.keyCode : keyCode_;\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\n/***\n * Contains basic SlickGrid editors.\n * @module Editors\n * @namespace Slick\n */\n\nexport class TextEditor<TData = any, C extends Column<TData> = Column<TData>, O extends GridOption<C> = GridOption<C>> implements Editor {\n  protected input!: HTMLInputElement;\n  protected defaultValue?: number | string;\n  protected navOnLR?: boolean;\n\n  constructor(protected readonly args: EditorArguments<TData, C, O>) {\n    this.init();\n  }\n\n  init() {\n    this.navOnLR = this.args.grid.getOptions().editorCellNavOnLRKeys;\n    this.input = Utils.createDomElement('input', { type: 'text', className: 'editor-text' }, this.args.container);\n    this.input.addEventListener('keydown', (this.navOnLR ? handleKeydownLRNav : handleKeydownLRNoNav) as EventListener);\n    this.input.focus();\n    this.input.select();\n\n    // don't show Save/Cancel when it's a Composite Editor and also trigger a onCompositeEditorChange event when input changes\n    if (this.args.compositeEditorOptions) {\n      this.input.addEventListener('change', this.onChange.bind(this));\n    }\n  }\n\n  onChange() {\n    const activeCell = this.args.grid.getActiveCell();\n\n    // when valid, we'll also apply the new value to the dataContext item object\n    if (this.validate().valid) {\n      this.applyValue(this.args.item, this.serializeValue());\n    }\n    this.applyValue(this.args.compositeEditorOptions.formValues, this.serializeValue());\n    this.args.grid.onCompositeEditorChange.notify({\n      row: activeCell?.row ?? 0,\n      cell: activeCell?.cell ?? 0,\n      item: this.args.item,\n      column: this.args.column,\n      formValues: this.args.compositeEditorOptions.formValues,\n      grid: this.args.grid,\n      editors: this.args.compositeEditorOptions.editors\n    } as unknown as OnCompositeEditorChangeEventArgs);\n  }\n\n  destroy() {\n    this.input.removeEventListener('keydown', (this.navOnLR ? handleKeydownLRNav : handleKeydownLRNoNav) as EventListener);\n    this.input.removeEventListener('change', this.onChange.bind(this));\n    this.input.remove();\n  }\n\n  focus() {\n    this.input.focus();\n  }\n\n  getValue() {\n    return this.input.value;\n  }\n\n  setValue(val: string) {\n    this.input.value = val;\n  }\n\n  loadValue(item: any) {\n    this.defaultValue = item[this.args.column.field] || '';\n    this.input.value = String(this.defaultValue ?? '');\n    this.input.defaultValue = String(this.defaultValue ?? '');\n    this.input.select();\n  }\n\n  serializeValue() {\n    return this.input.value;\n  }\n\n  applyValue(item: any, state: any) {\n    item[this.args.column.field] = state;\n  }\n\n  isValueChanged() {\n    return (!(this.input.value === '' && !Utils.isDefined(this.defaultValue))) && (this.input.value !== this.defaultValue);\n  }\n\n  validate() {\n    if (this.args.column.validator) {\n      const validationResults = this.args.column.validator(this.input.value, this.args);\n      if (!validationResults.valid) {\n        return validationResults;\n      }\n    }\n\n    return {\n      valid: true,\n      msg: null\n    };\n  }\n}\n\nexport class IntegerEditor<TData = any, C extends Column<TData> = Column<TData>, O extends GridOption<C> = GridOption<C>> implements Editor {\n  protected input!: HTMLInputElement;\n  protected defaultValue?: string | number;\n  protected navOnLR?: boolean;\n\n  constructor(protected readonly args: EditorArguments<TData, C, O>) {\n    this.init();\n  }\n\n  init() {\n    this.navOnLR = this.args.grid.getOptions().editorCellNavOnLRKeys;\n    this.input = Utils.createDomElement('input', { type: 'text', className: 'editor-text' }, this.args.container);\n    this.input.addEventListener('keydown', (this.navOnLR ? handleKeydownLRNav : handleKeydownLRNoNav) as EventListener);\n    this.input.focus();\n    this.input.select();\n\n    // trigger onCompositeEditorChange event when input changes and it's a Composite Editor\n    if (this.args.compositeEditorOptions) {\n      this.input.addEventListener('change', this.onChange.bind(this));\n    }\n  }\n\n  onChange() {\n    const activeCell = this.args.grid.getActiveCell();\n\n    // when valid, we'll also apply the new value to the dataContext item object\n    if (this.validate().valid) {\n      this.applyValue(this.args.item, this.serializeValue());\n    }\n    this.applyValue(this.args.compositeEditorOptions.formValues, this.serializeValue());\n    this.args.grid.onCompositeEditorChange.notify({\n      row: activeCell?.row ?? 0,\n      cell: activeCell?.cell ?? 0,\n      item: this.args.item,\n      column: this.args.column,\n      formValues: this.args.compositeEditorOptions.formValues,\n      grid: this.args.grid,\n      editors: this.args.compositeEditorOptions.editors\n    } as unknown as OnCompositeEditorChangeEventArgs);\n  }\n\n  destroy() {\n    this.input.removeEventListener('keydown', (this.navOnLR ? handleKeydownLRNav : handleKeydownLRNoNav) as EventListener);\n    this.input.removeEventListener('change', this.onChange.bind(this));\n    this.input.remove();\n  }\n\n  focus() {\n    this.input.focus();\n  }\n\n  loadValue(item: any) {\n    this.defaultValue = item[this.args.column.field];\n    this.input.value = String(this.defaultValue ?? '');\n    this.input.defaultValue = String(this.defaultValue ?? '');\n    this.input.select();\n  }\n\n  serializeValue() {\n    return parseInt(this.input.value, 10) || 0;\n  }\n\n  applyValue(item: any, state: any) {\n    item[this.args.column.field] = state;\n  }\n\n  isValueChanged() {\n    return (!(this.input.value === '' && !Utils.isDefined(this.defaultValue))) && (this.input.value !== this.defaultValue);\n  }\n\n  validate() {\n    if (isNaN(this.input.value as unknown as number)) {\n      return {\n        valid: false,\n        msg: 'Please enter a valid integer'\n      };\n    }\n\n    if (this.args.column.validator) {\n      const validationResults = this.args.column.validator(this.input.value, this.args);\n      if (!validationResults.valid) {\n        return validationResults;\n      }\n    }\n\n    return {\n      valid: true,\n      msg: null\n    };\n  }\n}\n\nexport class FloatEditor<TData = any, C extends Column<TData> = Column<TData>, O extends GridOption<C> = GridOption<C>> implements Editor {\n  protected input!: HTMLInputElement;\n  protected defaultValue?: string | number;\n  protected navOnLR?: boolean;\n\n  /** Default number of decimal places to use with FloatEditor */\n  static DefaultDecimalPlaces?: number = undefined;\n\n  /** Should we allow empty value when using FloatEditor */\n  static AllowEmptyValue = false;\n\n  constructor(protected readonly args: EditorArguments<TData, C, O>) {\n    this.init();\n  }\n\n  init() {\n    this.navOnLR = this.args.grid.getOptions().editorCellNavOnLRKeys;\n    this.input = Utils.createDomElement('input', { type: 'text', className: 'editor-text' }, this.args.container);\n    this.input.addEventListener('keydown', (this.navOnLR ? handleKeydownLRNav : handleKeydownLRNoNav) as EventListener);\n    this.input.focus();\n    this.input.select();\n\n    // trigger onCompositeEditorChange event when input changes and it's a Composite Editor\n    if (this.args.compositeEditorOptions) {\n      this.input.addEventListener('change', this.onChange.bind(this));\n    }\n  };\n\n  onChange() {\n    const activeCell = this.args.grid.getActiveCell();\n\n    // when valid, we'll also apply the new value to the dataContext item object\n    if (this.validate().valid) {\n      this.applyValue(this.args.item, this.serializeValue());\n    }\n    this.applyValue(this.args.compositeEditorOptions.formValues, this.serializeValue());\n    this.args.grid.onCompositeEditorChange.notify({\n      row: activeCell?.row ?? 0,\n      cell: activeCell?.cell ?? 0,\n      item: this.args.item,\n      column: this.args.column,\n      formValues: this.args.compositeEditorOptions.formValues,\n      grid: this.args.grid,\n      editors: this.args.compositeEditorOptions.editors\n    } as unknown as OnCompositeEditorChangeEventArgs);\n  };\n\n  destroy() {\n    this.input.removeEventListener('keydown', (this.navOnLR ? handleKeydownLRNav : handleKeydownLRNoNav) as EventListener);\n    this.input.removeEventListener('change', this.onChange.bind(this));\n    this.input.remove();\n  };\n\n  focus() {\n    this.input.focus();\n  }\n\n  getDecimalPlaces() {\n    // returns the number of fixed decimal places or null\n    let rtn: number | undefined = this.args.column.editorFixedDecimalPlaces;\n    if (!Utils.isDefined(rtn)) {\n      rtn = FloatEditor.DefaultDecimalPlaces;\n    }\n    return (!rtn && rtn !== 0 ? null : rtn);\n  }\n\n  loadValue(item: any) {\n    this.defaultValue = item[this.args.column.field];\n\n    const decPlaces = this.getDecimalPlaces();\n    if (decPlaces !== null\n      && (this.defaultValue || this.defaultValue === 0)\n      && (this.defaultValue as number)?.toFixed) {\n      this.defaultValue = (this.defaultValue as number).toFixed(decPlaces);\n    }\n\n    this.input.value = String(this.defaultValue ?? '');\n    this.input.defaultValue = String(this.defaultValue ?? '');\n    this.input.select();\n  }\n\n  serializeValue() {\n    let rtn: number | undefined = parseFloat(this.input.value);\n    if (FloatEditor.AllowEmptyValue) {\n      if (!rtn && rtn !== 0) {\n        rtn = undefined;\n      }\n    } else {\n      rtn = rtn || 0;\n    }\n\n    const decPlaces = this.getDecimalPlaces();\n    if (decPlaces !== null\n      && (rtn || rtn === 0)\n      && rtn.toFixed) {\n      rtn = parseFloat(rtn.toFixed(decPlaces));\n    }\n\n    return rtn as number;\n  }\n\n  applyValue(item: any, state: number | string) {\n    item[this.args.column.field] = state;\n  }\n\n  isValueChanged() {\n    return (!(this.input.value === '' && !Utils.isDefined(this.defaultValue))) && (this.input.value !== this.defaultValue);\n  }\n\n  validate() {\n    if (isNaN(this.input.value as unknown as number)) {\n      return {\n        valid: false,\n        msg: 'Please enter a valid number'\n      };\n    }\n\n    if (this.args.column.validator) {\n      const validationResults = this.args.column.validator(this.input.value, this.args);\n      if (!validationResults.valid) {\n        return validationResults;\n      }\n    }\n\n    return {\n      valid: true,\n      msg: null\n    };\n  }\n}\n\nexport class FlatpickrEditor<TData = any, C extends Column<TData> = Column<TData>, O extends GridOption<C> = GridOption<C>> implements Editor {\n  protected input!: HTMLInputElement;\n  protected defaultValue?: string | number;\n  protected flatpickrInstance: any;\n\n  constructor(protected readonly args: EditorArguments<TData, C, O>) {\n    this.init();\n    if (typeof flatpickr === 'undefined') {\n      throw new Error('Flatpickr not loaded but required in SlickGrid.Editors, refer to Flatpickr documentation: https://flatpickr.js.org/getting-started/');\n    }\n  }\n\n  init() {\n    this.input = Utils.createDomElement('input', { type: 'text', className: 'editor-text' }, this.args.container);\n    this.input.focus();\n    this.input.select();\n    const editorOptions = this.args.column.params?.editorOptions; // i.e.: { id: 'start', params: { editorOptions: {altFormat: 'd/m/Y', dateFormat: 'd/m/Y'}} }\n    this.flatpickrInstance = flatpickr(this.input, {\n      closeOnSelect: true,\n      allowInput: true,\n      altInput: true,\n      altFormat: editorOptions?.altFormat ?? 'm/d/Y',\n      dateFormat: editorOptions?.dateFormat ?? 'm/d/Y',\n      onChange: () => {\n        // trigger onCompositeEditorChange event when input changes and it's a Composite Editor\n        if (this.args.compositeEditorOptions) {\n          const activeCell = this.args.grid.getActiveCell();\n\n          // when valid, we'll also apply the new value to the dataContext item object\n          if (this.validate().valid) {\n            this.applyValue(this.args.item, this.serializeValue());\n          }\n          this.applyValue(this.args.compositeEditorOptions.formValues, this.serializeValue());\n          this.args.grid.onCompositeEditorChange.notify({\n            row: activeCell?.row ?? 0,\n            cell: activeCell?.cell ?? 0,\n            item: this.args.item,\n            column: this.args.column,\n            formValues: this.args.compositeEditorOptions.formValues,\n            grid: this.args.grid,\n            editors: this.args.compositeEditorOptions.editors\n          } as unknown as OnCompositeEditorChangeEventArgs);\n        }\n      },\n    });\n\n    if (!this.args.compositeEditorOptions) {\n      window.setTimeout(() => {\n        this.show();\n        this.focus();\n      }, 50);\n    }\n\n    Utils.width(this.input, (Utils.width(this.input) as number) - (!this.args.compositeEditorOptions ? 18 : 28));\n  }\n\n  destroy() {\n    this.hide();\n    if (this.flatpickrInstance) {\n      this.flatpickrInstance.destroy();\n    }\n    this.input.remove();\n  }\n\n  show() {\n    if (!this.args.compositeEditorOptions && this.flatpickrInstance) {\n      this.flatpickrInstance.open();\n    }\n  }\n\n  hide() {\n    if (!this.args.compositeEditorOptions && this.flatpickrInstance) {\n      this.flatpickrInstance.close();\n    }\n  }\n\n  focus() {\n    this.input.focus();\n  }\n\n  loadValue(item: any) {\n    this.defaultValue = item[this.args.column.field];\n    this.input.value = String(this.defaultValue ?? '');\n    this.input.defaultValue = String(this.defaultValue ?? '');\n    this.input.select();\n    if (this.flatpickrInstance) {\n      this.flatpickrInstance.setDate(this.defaultValue);\n    }\n  }\n\n  serializeValue() {\n    return this.input.value;\n  }\n\n  applyValue(item: any, state: any) {\n    item[this.args.column.field] = state;\n  }\n\n  isValueChanged() {\n    return (!(this.input.value === '' && !Utils.isDefined(this.defaultValue))) && (this.input.value !== this.defaultValue);\n  }\n\n  validate() {\n    if (this.args.column.validator) {\n      const validationResults = this.args.column.validator(this.input.value, this.args);\n      if (!validationResults.valid) {\n        return validationResults;\n      }\n    }\n\n    return {\n      valid: true,\n      msg: null\n    };\n  }\n}\n\nexport class YesNoSelectEditor<TData = any, C extends Column<TData> = Column<TData>, O extends GridOption<C> = GridOption<C>> implements Editor {\n  protected select!: HTMLSelectElement;\n  protected defaultValue?: string | number;\n\n  constructor(protected readonly args: EditorArguments<TData, C, O>) {\n    this.init();\n  }\n\n  init() {\n    this.select = Utils.createDomElement('select', { tabIndex: 0, className: 'editor-yesno' }, this.args.container);\n    Utils.createDomElement('option', { value: 'yes', textContent: 'Yes' }, this.select);\n    Utils.createDomElement('option', { value: 'no', textContent: 'No' }, this.select);\n\n    this.select.focus();\n\n    // trigger onCompositeEditorChange event when input changes and it's a Composite Editor\n    if (this.args.compositeEditorOptions) {\n      this.select.addEventListener('change', this.onChange.bind(this));\n    }\n  }\n\n  onChange() {\n    const activeCell = this.args.grid.getActiveCell();\n\n    // when valid, we'll also apply the new value to the dataContext item object\n    if (this.validate().valid) {\n      this.applyValue(this.args.item, this.serializeValue());\n    }\n    this.applyValue(this.args.compositeEditorOptions.formValues, this.serializeValue());\n    this.args.grid.onCompositeEditorChange.notify({\n      row: activeCell?.row ?? 0,\n      cell: activeCell?.cell ?? 0,\n      item: this.args.item,\n      column: this.args.column,\n      formValues: this.args.compositeEditorOptions.formValues,\n      grid: this.args.grid,\n      editors: this.args.compositeEditorOptions.editors\n    } as unknown as OnCompositeEditorChangeEventArgs);\n  }\n\n  destroy() {\n    this.select.removeEventListener('change', this.onChange.bind(this));\n    this.select.remove();\n  }\n\n  focus() {\n    this.select.focus();\n  }\n\n  loadValue(item: any) {\n    this.select.value = ((this.defaultValue = item[this.args.column.field]) ? 'yes' : 'no');\n  }\n\n  serializeValue() {\n    return this.select.value === 'yes';\n  }\n\n  applyValue(item: any, state: any) {\n    item[this.args.column.field] = state;\n  }\n\n  isValueChanged() {\n    return this.select.value !== this.defaultValue;\n  }\n\n  validate() {\n    return {\n      valid: true,\n      msg: null\n    };\n  }\n}\n\nexport class CheckboxEditor<TData = any, C extends Column<TData> = Column<TData>, O extends GridOption<C> = GridOption<C>> implements Editor {\n  protected input!: HTMLInputElement;\n  protected defaultValue?: boolean;\n\n  constructor(protected readonly args: EditorArguments<TData, C, O>) {\n    this.init();\n  }\n\n  init() {\n    this.input = Utils.createDomElement('input', { className: 'editor-checkbox', type: 'checkbox', value: 'true' }, this.args.container);\n    this.input.focus();\n\n    // trigger onCompositeEditorChange event when input checkbox changes and it's a Composite Editor\n    if (this.args.compositeEditorOptions) {\n      this.input.addEventListener('change', this.onChange.bind(this));\n    }\n  };\n\n  onChange() {\n    const activeCell = this.args.grid.getActiveCell();\n\n    // when valid, we'll also apply the new value to the dataContext item object\n    if (this.validate().valid) {\n      this.applyValue(this.args.item, this.serializeValue());\n    }\n    this.applyValue(this.args.compositeEditorOptions.formValues, this.serializeValue());\n    this.args.grid.onCompositeEditorChange.notify({\n      row: activeCell?.row ?? 0,\n      cell: activeCell?.cell ?? 0,\n      item: this.args.item,\n      column: this.args.column,\n      formValues: this.args.compositeEditorOptions.formValues,\n      grid: this.args.grid,\n      editors: this.args.compositeEditorOptions.editors\n    } as unknown as OnCompositeEditorChangeEventArgs);\n  };\n\n  destroy() {\n    this.input.removeEventListener('change', this.onChange.bind(this));\n    this.input.remove();\n  };\n\n  focus() {\n    this.input.focus();\n  };\n\n  loadValue(item: any) {\n    this.defaultValue = !!(item[this.args.column.field]);\n    if (this.defaultValue) {\n      this.input.checked = true;\n    } else {\n      this.input.checked = false;\n    }\n  };\n\n  preClick() {\n    this.input.checked = !this.input.checked;\n  }\n\n  serializeValue() {\n    return this.input.checked;\n  };\n\n  applyValue(item: any, state: any) {\n    item[this.args.column.field] = state;\n  }\n\n  isValueChanged() {\n    return (this.serializeValue() !== this.defaultValue);\n  }\n\n  validate(): EditorValidationResult {\n    return {\n      valid: true,\n      msg: null\n    };\n  }\n}\n\nexport class PercentCompleteEditor<TData = any, C extends Column<TData> = Column<TData>, O extends GridOption<C> = GridOption<C>> implements Editor {\n  protected input!: HTMLInputElement;\n  protected defaultValue?: number;\n  protected picker!: HTMLDivElement;\n  protected slider!: HTMLInputElement | null;\n\n  constructor(protected readonly args: EditorArguments<TData, C, O>) {\n    this.init();\n  }\n\n  sliderInputHandler(e: MouseEvent & { target: HTMLButtonElement }) {\n    this.input.value = e.target.value;\n  }\n\n  sliderChangeHandler() {\n    // trigger onCompositeEditorChange event when slider stops and it's a Composite Editor\n    if (this.args.compositeEditorOptions) {\n      const activeCell = this.args.grid.getActiveCell();\n\n      // when valid, we'll also apply the new value to the dataContext item object\n      if (this.validate().valid) {\n        this.applyValue(this.args.item, this.serializeValue());\n      }\n      this.applyValue(this.args.compositeEditorOptions.formValues, this.serializeValue());\n      this.args.grid.onCompositeEditorChange.notify({\n        row: activeCell?.row ?? 0,\n        cell: activeCell?.cell ?? 0,\n        item: this.args.item,\n        column: this.args.column,\n        formValues: this.args.compositeEditorOptions.formValues,\n        grid: this.args.grid,\n        editors: this.args.compositeEditorOptions.editors\n      } as unknown as OnCompositeEditorChangeEventArgs);\n    }\n  }\n\n  init() {\n    this.input = Utils.createDomElement('input', { className: 'editor-percentcomplete', type: 'text' }, this.args.container);\n    Utils.width(this.input, this.args.container.clientWidth - 25);\n\n    this.picker = Utils.createDomElement('div', { className: 'editor-percentcomplete-picker' }, this.args.container);\n    Utils.createDomElement('span', { className: 'editor-percentcomplete-picker-icon' }, this.picker);\n    const containerHelper = Utils.createDomElement('div', { className: 'editor-percentcomplete-helper' }, this.picker);\n    const containerWrapper = Utils.createDomElement('div', { className: 'editor-percentcomplete-wrapper' }, containerHelper);\n    Utils.createDomElement('div', { className: 'editor-percentcomplete-slider' }, containerWrapper);\n    this.slider = Utils.createDomElement('input', { className: 'editor-percentcomplete-slider', type: 'range', value: String(this.defaultValue ?? '') }, containerWrapper);\n    const containerButtons = Utils.createDomElement('div', { className: 'editor-percentcomplete-buttons' }, containerWrapper);\n    Utils.createDomElement('button', { value: '0', className: 'slick-btn slick-btn-default', textContent: 'Not started' }, containerButtons);\n    containerButtons.appendChild(document.createElement('br'));\n    Utils.createDomElement('button', { value: '50', className: 'slick-btn slick-btn-default', textContent: 'In Progress' }, containerButtons);\n    containerButtons.appendChild(document.createElement('br'));\n    Utils.createDomElement('button', { value: '100', className: 'slick-btn slick-btn-default', textContent: 'Complete' }, containerButtons);\n\n    this.input.focus();\n    this.input.select();\n\n    this.slider.addEventListener('input', this.sliderInputHandler.bind(this) as EventListener);\n    this.slider.addEventListener('change', this.sliderChangeHandler.bind(this));\n\n    const buttons = this.picker.querySelectorAll('.editor-percentcomplete-buttons button');\n    [].forEach.call(buttons, (button: HTMLButtonElement) => {\n      button.addEventListener('click', this.onClick.bind(this) as EventListener);\n    });\n  };\n\n  onClick(e: MouseEvent & { target: HTMLButtonElement }) {\n    this.input.value = String(e.target.value ?? '');\n    this.slider!.value = String(e.target.value ?? '');\n  };\n\n  destroy() {\n    this.slider?.removeEventListener('input', this.sliderInputHandler.bind(this) as EventListener);\n    this.slider?.removeEventListener('change', this.sliderChangeHandler.bind(this));\n    this.picker.querySelectorAll('.editor-percentcomplete-buttons button')\n      .forEach(button => button.removeEventListener('click', this.onClick.bind(this) as EventListener));\n    this.input.remove();\n    this.picker.remove();\n  };\n\n  focus() {\n    this.input.focus();\n  };\n\n  loadValue(item: any) {\n    this.defaultValue = item[this.args.column.field];\n    this.slider!.value = String(this.defaultValue ?? '');\n    this.input.value = String(this.defaultValue);\n    this.input.select();\n  };\n\n  serializeValue() {\n    return parseInt(this.input.value, 10) || 0;\n  };\n\n  applyValue(item: any, state: any) {\n    item[this.args.column.field] = state;\n  };\n\n  isValueChanged() {\n    return (!(this.input.value === '' && !Utils.isDefined(this.defaultValue))) && ((parseInt(this.input.value as any, 10) || 0) !== this.defaultValue);\n  };\n\n  validate(): EditorValidationResult {\n    if (isNaN(parseInt(this.input.value, 10))) {\n      return {\n        valid: false,\n        msg: 'Please enter a valid positive number'\n      };\n    }\n\n    return {\n      valid: true,\n      msg: null\n    };\n  };\n}\n\n/*\n * An example of a 'detached' editor.\n * The UI is added onto document BODY and .position(), .show() and .hide() are implemented.\n * KeyDown events are also handled to provide handling for Tab, Shift-Tab, Esc and Ctrl-Enter.\n */\nexport class LongTextEditor<TData = any, C extends Column<TData> = Column<TData>, O extends GridOption<C> = GridOption<C>> implements Editor {\n  protected input!: HTMLTextAreaElement;\n  protected wrapper!: HTMLDivElement;\n  protected defaultValue?: string;\n  protected selectionStart = 0;\n\n  constructor(protected readonly args: EditorArguments<TData, C, O>) {\n    this.init();\n  }\n\n  init() {\n    const compositeEditorOptions = this.args.compositeEditorOptions;\n    this.args.grid.getOptions().editorCellNavOnLRKeys;\n    const container = compositeEditorOptions ? this.args.container : document.body;\n\n    this.wrapper = Utils.createDomElement('div', { className: 'slick-large-editor-text' }, container);\n    if (compositeEditorOptions) {\n      this.wrapper.style.position = 'relative';\n      Utils.setStyleSize(this.wrapper, 'padding', 0);\n      Utils.setStyleSize(this.wrapper, 'border', 0);\n    } else {\n      this.wrapper.style.position = 'absolute';\n    }\n\n    this.input = Utils.createDomElement('textarea', { rows: 5, style: { background: 'white', width: '250px', height: '80px', border: '0', outline: '0' } }, this.wrapper);\n\n    // trigger onCompositeEditorChange event when input changes and it's a Composite Editor\n    if (compositeEditorOptions) {\n      this.input.addEventListener('change', this.onChange.bind(this));\n    } else {\n      const btnContainer = Utils.createDomElement('div', { style: 'text-align:right' }, this.wrapper);\n      Utils.createDomElement('button', { id: 'save', className: 'slick-btn slick-btn-primary', textContent: 'Save' }, btnContainer);\n      Utils.createDomElement('button', { id: 'cancel', className: 'slick-btn slick-btn-default', textContent: 'Cancel' }, btnContainer);\n\n      this.wrapper.querySelector('#save')!.addEventListener('click', this.save.bind(this));\n      this.wrapper.querySelector('#cancel')!.addEventListener('click', this.cancel.bind(this));\n      this.input.addEventListener('keydown', this.handleKeyDown.bind(this) as EventListener);\n      this.position(this.args.position as ElementPosition);\n    }\n\n    this.input.focus();\n    this.input.select();\n  };\n\n  onChange() {\n    const activeCell = this.args.grid.getActiveCell();\n\n    // when valid, we'll also apply the new value to the dataContext item object\n    if (this.validate().valid) {\n      this.applyValue(this.args.item, this.serializeValue());\n    }\n    this.applyValue(this.args.compositeEditorOptions.formValues, this.serializeValue());\n    this.args.grid.onCompositeEditorChange.notify({\n      row: activeCell?.row ?? 0,\n      cell: activeCell?.cell ?? 0,\n      item: this.args.item,\n      column: this.args.column,\n      formValues: this.args.compositeEditorOptions.formValues,\n      grid: this.args.grid,\n      editors: this.args.compositeEditorOptions.editors\n    } as unknown as OnCompositeEditorChangeEventArgs);\n  };\n\n  handleKeyDown(e: KeyboardEvent & { target: HTMLInputElement }) {\n    if (e.which === keyCode.ENTER && e.ctrlKey) {\n      this.save();\n    } else if (e.which === keyCode.ESCAPE) {\n      e.preventDefault();\n      this.cancel();\n    } else if (e.which === keyCode.TAB && e.shiftKey) {\n      e.preventDefault();\n      this.args.grid.navigatePrev();\n    } else if (e.which === keyCode.TAB) {\n      e.preventDefault();\n      this.args.grid.navigateNext();\n    } else if (e.which === keyCode.LEFT || e.which === keyCode.RIGHT) {\n      if (this.args.grid.getOptions().editorCellNavOnLRKeys) {\n        const cursorPosition = this.selectionStart;\n        const textLength = e.target.value.length;\n        if (e.keyCode === keyCode.LEFT && cursorPosition === 0) {\n          this.args.grid.navigatePrev();\n        }\n        if (e.keyCode === keyCode.RIGHT && cursorPosition >= textLength - 1) {\n          this.args.grid.navigateNext();\n        }\n      }\n    }\n  };\n\n  save() {\n    const gridOptions = this.args.grid.getOptions() || {};\n    if (gridOptions.autoCommitEdit) {\n      this.args.grid.getEditorLock().commitCurrentEdit();\n    } else {\n      this.args.commitChanges();\n    }\n  };\n\n  cancel() {\n    this.input.value = String(this.defaultValue ?? '');\n    this.args.cancelChanges();\n  };\n\n  hide() {\n    Utils.hide(this.wrapper);\n  };\n\n  show() {\n    Utils.show(this.wrapper);\n  };\n\n  position(position: ElementPosition) {\n    Utils.setStyleSize(this.wrapper, 'top', (position.top || 0) - 5);\n    Utils.setStyleSize(this.wrapper, 'left', (position.left || 0) - 2);\n  };\n\n  destroy() {\n    if (this.args.compositeEditorOptions) {\n      this.input.removeEventListener('change', this.onChange.bind(this));\n    } else {\n      this.wrapper.querySelector('#save')!.removeEventListener('click', this.save.bind(this));\n      this.wrapper.querySelector('#cancel')!.removeEventListener('click', this.cancel.bind(this));\n      this.input.removeEventListener('keydown', this.handleKeyDown.bind(this) as EventListener);\n    }\n    this.wrapper.remove();\n  };\n\n  focus() {\n    this.input.focus();\n  };\n\n  loadValue(item: any) {\n    this.input.value = this.defaultValue = item[this.args.column.field];\n    this.input.select();\n  };\n\n  serializeValue() {\n    return this.input.value;\n  };\n\n  applyValue(item: any, state: any) {\n    item[this.args.column.field] = state;\n  };\n\n  isValueChanged() {\n    return (!(this.input.value === '' && !Utils.isDefined(this.defaultValue))) && (this.input.value !== this.defaultValue);\n  };\n\n  validate() {\n    if (this.args.column.validator) {\n      const validationResults = this.args.column.validator(this.input.value, this.args);\n      if (!validationResults.valid) {\n        return validationResults;\n      }\n    }\n\n    return {\n      valid: true,\n      msg: null\n    };\n  };\n}\n\n/*\n * Depending on the value of Grid option 'editorCellNavOnLRKeys', us\n * Navigate to the cell on the left if the cursor is at the beginning of the input string\n * and to the right cell if it's at the end. Otherwise, move the cursor within the text\n */\nfunction handleKeydownLRNav(e: KeyboardEvent & { target: HTMLInputElement; selectionStart: number; }) {\n  const cursorPosition = e.selectionStart;\n  const textLength = e.target.value.length;\n  if ((e.keyCode === keyCode.LEFT && cursorPosition > 0) ||\n    e.keyCode === keyCode.RIGHT && cursorPosition < textLength - 1) {\n    e.stopImmediatePropagation();\n  }\n}\n\nfunction handleKeydownLRNoNav(e: KeyboardEvent) {\n  if (e.keyCode === keyCode.LEFT || e.keyCode === keyCode.RIGHT) {\n    e.stopImmediatePropagation();\n  }\n}\n\nexport const Editors = {\n  Text: TextEditor,\n  Integer: IntegerEditor,\n  Float: FloatEditor,\n  Flatpickr: FlatpickrEditor,\n  YesNoSelect: YesNoSelectEditor,\n  Checkbox: CheckboxEditor,\n  PercentComplete: PercentCompleteEditor,\n  LongText: LongTextEditor\n};\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  Utils.extend(Slick, {\n    Editors\n  });\n}\n\n", "import type { Formatter } from './models/index.js';\nimport { Utils as Utils_ } from './slick.core.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\n/***\n * Contains basic SlickGrid formatters.\n *\n * NOTE:  These are merely examples.  You will most likely need to implement something more\n *        robust/extensible/localizable/etc. for your use!\n *\n * @module Formatters\n * @namespace Slick\n */\n\nexport const PercentCompleteFormatter: Formatter = (_row, _cell, value) => {\n  if (!Utils.isDefined(value) || value === '') {\n    return '-';\n  } else if (value < 50) {\n    return `<span style=\"color:red;font-weight:bold;\">${value}%</span>`;\n  } else {\n    return `<span style=\"color:green\">${value}%</span>`;\n  }\n};\n\nexport const PercentCompleteBarFormatter: Formatter = (_row, _cell, value) => {\n  if (!Utils.isDefined(value) || value === '') {\n    return '';\n  }\n\n  let color;\n\n  if (value < 30) {\n    color = 'red';\n  } else if (value < 70) {\n    color = 'silver';\n  } else {\n    color = 'green';\n  }\n\n  return `<span class=\"percent-complete-bar\" style=\"background:${color};width:${value}%\" title=\"${value}%\"></span>`;\n};\n\nexport const YesNoFormatter: Formatter = (_row, _cell, value) => {\n  return value ? 'Yes' : 'No';\n};\n\nexport const CheckboxFormatter: Formatter = (_row, _cell, value) => {\n  return `<span class=\"sgi sgi-checkbox-${value ? 'intermediate' : 'blank-outline'}\"></span>`;\n};\n\nexport const CheckmarkFormatter: Formatter = (_row, _cell, value) => {\n  return value ? `<span class=\"sgi sgi-check\"></span>` : '';\n};\n\nexport const Formatters = {\n  PercentComplete: PercentCompleteFormatter,\n  PercentCompleteBar: PercentCompleteBarFormatter,\n  YesNo: YesNoFormatter,\n  Checkmark: CheckmarkFormatter,\n  Checkbox: CheckboxFormatter\n};\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  Utils.extend(Slick, {\n    Formatters\n  });\n}\n\n", "// @ts-ignore\nimport type { SortableEvent, SortableInstance, SortableOptions } from 'sortablejs';\n\nimport type {\n  AutoSize,\n  CellPosition,\n  CellViewportRange,\n  Column,\n  ColumnMetadata,\n  ColumnSort,\n  CssStyleHash,\n  CSSStyleDeclarationWritable,\n  CustomDataView,\n  DOMEvent,\n  DragPosition,\n  DragRowMove,\n  Editor,\n  EditorArguments,\n  EditorConstructor,\n  EditController,\n  Formatter,\n  FormatterOverrideCallback,\n  FormatterResultObject,\n  FormatterResultWithHtml,\n  FormatterResultWithText,\n  GridOption as BaseGridOption,\n  InteractionBase,\n  ItemMetadata,\n  MenuCommandItemCallbackArgs,\n  MultiColumnSort,\n  OnActivateChangedOptionsEventArgs,\n  OnActiveCellChangedEventArgs,\n  OnAddNewRowEventArgs,\n  OnAfterSetColumnsEventArgs,\n  OnAutosizeColumnsEventArgs,\n  OnColumnsEventArgs,\n  OnBeforeAppendCellEventArgs,\n  OnBeforeCellEditorDestroyEventArgs,\n  OnBeforeColumnsResizeEventArgs,\n  OnBeforeEditCellEventArgs,\n  OnBeforeHeaderCellDestroyEventArgs,\n  OnBeforeHeaderRowCellDestroyEventArgs,\n  OnBeforeFooterRowCellDestroyEventArgs,\n  OnBeforeSetColumnsEventArgs,\n  OnCellChangeEventArgs,\n  OnCellCssStylesChangedEventArgs,\n  OnClickEventArgs,\n  OnColumnsDragEventArgs,\n  OnColumnsReorderedEventArgs,\n  OnColumnsResizedEventArgs,\n  OnColumnsResizeDblClickEventArgs,\n  OnCompositeEditorChangeEventArgs,\n  OnDblClickEventArgs,\n  OnFooterContextMenuEventArgs,\n  OnFooterRowCellRenderedEventArgs,\n  OnHeaderCellRenderedEventArgs,\n  OnFooterClickEventArgs,\n  OnHeaderClickEventArgs,\n  OnHeaderContextMenuEventArgs,\n  OnHeaderMouseEventArgs,\n  OnHeaderRowCellRenderedEventArgs,\n  OnKeyDownEventArgs,\n  OnPreHeaderContextMenuEventArgs,\n  OnPreHeaderClickEventArgs,\n  OnRenderedEventArgs,\n  OnSelectedRowsChangedEventArgs,\n  OnSetOptionsEventArgs,\n  OnScrollEventArgs,\n  OnValidationErrorEventArgs,\n  OnDragReplaceCellsEventArgs,\n  PagingInfo,\n  RowInfo,\n  SelectionModel,\n  SingleColumnSort,\n  SlickGridModel,\n  SlickPlugin,\n} from './models/index.js';\nimport {\n  type BasePubSub,\n  BindingEventService as BindingEventService_,\n  ColAutosizeMode as ColAutosizeMode_,\n  GlobalEditorLock as GlobalEditorLock_,\n  GridAutosizeColsMode as GridAutosizeColsMode_,\n  keyCode as keyCode_,\n  preClickClassName as preClickClassName_,\n  RowSelectionMode as RowSelectionMode_,\n  CellSelectionMode as CellSelectionMode_,\n  type SlickEditorLock,\n  SlickEvent as SlickEvent_,\n  SlickEventData as SlickEventData_,\n  SlickRange as SlickRange_,\n  Utils as Utils_,\n  SelectionUtils as SelectionUtils_,\n  ValueFilterMode as ValueFilterMode_,\n  WidthEvalMode as WidthEvalMode_,\n  DragExtendHandle as DragExtendHandle_,\n} from './slick.core.js';\nimport { Draggable as Draggable_, MouseWheel as MouseWheel_, Resizable as Resizable_ } from './slick.interactions.js';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst BindingEventService = IIFE_ONLY ? Slick.BindingEventService : BindingEventService_;\nconst ColAutosizeMode = IIFE_ONLY ? Slick.ColAutosizeMode : ColAutosizeMode_;\nconst SlickEvent = IIFE_ONLY ? Slick.Event : SlickEvent_;\nconst SlickEventData = IIFE_ONLY ? Slick.EventData : SlickEventData_;\nconst GlobalEditorLock = IIFE_ONLY ? Slick.GlobalEditorLock : GlobalEditorLock_;\nconst GridAutosizeColsMode = IIFE_ONLY ? Slick.GridAutosizeColsMode : GridAutosizeColsMode_;\nconst keyCode = IIFE_ONLY ? Slick.keyCode : keyCode_;\nconst preClickClassName = IIFE_ONLY ? Slick.preClickClassName : preClickClassName_;\nconst SlickRange = IIFE_ONLY ? Slick.Range : SlickRange_;\nconst RowSelectionMode = IIFE_ONLY ? Slick.RowSelectionMode : RowSelectionMode_;\nconst CellSelectionMode = IIFE_ONLY ? Slick.CellSelectionMode : CellSelectionMode_;\nconst ValueFilterMode = IIFE_ONLY ? Slick.ValueFilterMode : ValueFilterMode_;\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\nconst SelectionUtils = IIFE_ONLY ? Slick.SelectionUtils : SelectionUtils_;\nconst WidthEvalMode = IIFE_ONLY ? Slick.WidthEvalMode : WidthEvalMode_;\nconst Draggable = IIFE_ONLY ? Slick.Draggable : Draggable_;\nconst MouseWheel = IIFE_ONLY ? Slick.MouseWheel : MouseWheel_;\nconst Resizable = IIFE_ONLY ? Slick.Resizable : Resizable_;\nconst DragExtendHandle = IIFE_ONLY ? Slick.DragExtendHandle : DragExtendHandle_;\n\n/**\n * @license\n * (c) 2009-present Michael Leibman\n * michael{dot}leibman{at}gmail{dot}com\n * http://github.com/mleibman/slickgrid\n *\n * Distributed under MIT license.\n * All rights reserved.\n *\n * SlickGrid v5.18.3\n *\n * NOTES:\n *     Cell/row DOM manipulations are done directly bypassing JS DOM manipulation methods.\n *     This increases the speed dramatically, but can only be done safely because there are no event handlers\n *     or data associated with any cell/row DOM nodes.  Cell editors must make sure they implement .destroy()\n *     and do proper cleanup.\n */\n\n//////////////////////////////////////////////////////////////////////////////////////////////\n// SlickGrid class implementation (available as SlickGrid)\n\ninterface RowCaching {\n  rowNode: HTMLElement[] | null,\n  cellColSpans: Array<number | '*'>;\n  cellNodesByColumnIdx: HTMLElement[];\n  cellRenderQueue: any[];\n}\n\nexport class SlickGrid<TData = any, C extends Column<TData> = Column<TData>, O extends BaseGridOption<C> = BaseGridOption<C>> {\n  //////////////////////////////////////////////////////////////////////////////////////////////\n  // Public API\n  slickGridVersion = '5.18.3';\n\n  /** optional grid state clientId */\n  cid = '';\n\n  // Events\n  onActiveCellChanged: SlickEvent_<OnActiveCellChangedEventArgs>;\n  onActiveCellPositionChanged: SlickEvent_<{ grid: SlickGrid; }>;\n  onAddNewRow: SlickEvent_<OnAddNewRowEventArgs>;\n  onAfterSetColumns: SlickEvent_<OnAfterSetColumnsEventArgs>;\n  onAutosizeColumns: SlickEvent_<OnAutosizeColumnsEventArgs>;\n  onBeforeAppendCell: SlickEvent_<OnBeforeAppendCellEventArgs>;\n  onBeforeCellEditorDestroy: SlickEvent_<OnBeforeCellEditorDestroyEventArgs>;\n  onBeforeColumnsResize: SlickEvent_<OnBeforeColumnsResizeEventArgs>;\n  onBeforeDestroy: SlickEvent_<{ grid: SlickGrid; }>;\n  onBeforeEditCell: SlickEvent_<OnBeforeEditCellEventArgs>;\n  onBeforeFooterRowCellDestroy: SlickEvent_<OnBeforeFooterRowCellDestroyEventArgs>;\n  onBeforeHeaderCellDestroy: SlickEvent_<OnBeforeHeaderCellDestroyEventArgs>;\n  onBeforeHeaderRowCellDestroy: SlickEvent_<OnBeforeHeaderRowCellDestroyEventArgs>;\n  onBeforeRemoveCachedRow: SlickEvent_<{ row: number; grid: SlickGrid }>;\n  onBeforeSetColumns: SlickEvent_<OnBeforeSetColumnsEventArgs>;\n  onBeforeSort: SlickEvent_<SingleColumnSort | MultiColumnSort>;\n  onBeforeUpdateColumns: SlickEvent_<OnColumnsEventArgs>;\n  onAfterUpdateColumns: SlickEvent_<OnColumnsEventArgs>;\n  onCellChange: SlickEvent_<OnCellChangeEventArgs>;\n  onCellCssStylesChanged: SlickEvent_<OnCellCssStylesChangedEventArgs>;\n  onClick: SlickEvent_<OnClickEventArgs>;\n  onColumnsReordered: SlickEvent_<OnColumnsReorderedEventArgs>;\n  onColumnsDrag: SlickEvent_<OnColumnsDragEventArgs>;\n  onColumnsResized: SlickEvent_<OnColumnsResizedEventArgs>;\n  onColumnsResizeDblClick: SlickEvent_<OnColumnsResizeDblClickEventArgs>;\n  onCompositeEditorChange: SlickEvent_<OnCompositeEditorChangeEventArgs>;\n  onContextMenu: SlickEvent_<MenuCommandItemCallbackArgs>;\n  onDrag: SlickEvent_<DragRowMove>;\n  onDblClick: SlickEvent_<OnDblClickEventArgs>;\n  onDragInit: SlickEvent_<DragRowMove>;\n  onDragStart: SlickEvent_<DragRowMove>;\n  onDragEnd: SlickEvent_<DragRowMove>;\n  onFooterClick: SlickEvent_<OnFooterClickEventArgs>;\n  onFooterContextMenu: SlickEvent_<OnFooterContextMenuEventArgs>;\n  onFooterRowCellRendered: SlickEvent_<OnFooterRowCellRenderedEventArgs>;\n  onHeaderCellRendered: SlickEvent_<OnHeaderCellRenderedEventArgs>;\n  onHeaderClick: SlickEvent_<OnHeaderClickEventArgs>;\n  onHeaderContextMenu: SlickEvent_<OnHeaderContextMenuEventArgs>;\n  onHeaderMouseEnter: SlickEvent_<OnHeaderMouseEventArgs>;\n  onHeaderMouseLeave: SlickEvent_<OnHeaderMouseEventArgs>;\n  onHeaderRowCellRendered: SlickEvent_<OnHeaderRowCellRenderedEventArgs>;\n  onHeaderRowMouseEnter: SlickEvent_<OnHeaderMouseEventArgs>;\n  onHeaderRowMouseLeave: SlickEvent_<OnHeaderMouseEventArgs>;\n  onPreHeaderContextMenu: SlickEvent_<OnPreHeaderContextMenuEventArgs>;\n  onPreHeaderClick: SlickEvent_<OnPreHeaderClickEventArgs>;\n  onKeyDown: SlickEvent_<OnKeyDownEventArgs>;\n  onMouseEnter: SlickEvent_<OnHeaderMouseEventArgs>;\n  onMouseLeave: SlickEvent_<OnHeaderMouseEventArgs>;\n  onRendered: SlickEvent_<OnRenderedEventArgs>;\n  onScroll: SlickEvent_<OnScrollEventArgs>;\n  onSelectedRowsChanged: SlickEvent_<OnSelectedRowsChangedEventArgs>;\n  onSetOptions: SlickEvent_<OnSetOptionsEventArgs>;\n  onActivateChangedOptions: SlickEvent_<OnActivateChangedOptionsEventArgs>;\n  onSort: SlickEvent_<SingleColumnSort | MultiColumnSort>;\n  onValidationError: SlickEvent_<OnValidationErrorEventArgs>;\n  onViewportChanged: SlickEvent_<{ grid: SlickGrid; }>;\n  onDragReplaceCells: SlickEvent_<OnDragReplaceCellsEventArgs>;\n\n  // ---\n  // protected variables\n\n  // shared across all grids on the page\n  protected scrollbarDimensions?: { height: number; width: number; };\n  protected maxSupportedCssHeight!: number;  // browser's breaking point\n\n  protected canvas: HTMLCanvasElement | null = null;\n  protected canvas_context: CanvasRenderingContext2D | null = null;\n\n  // settings\n  protected _options!: O;\n  protected _defaults: BaseGridOption = {\n    invalidColumnFreezePickerCallback: (error) => alert(error),\n    invalidColumnFreezeWidthCallback: (error) => alert(error),\n    invalidColumnFreezeWidthMessage:\n      '[SlickGrid] You are trying to freeze/pin more columns than the grid can support. ' +\n      'Make sure to have less columns pinned (on the left) than the actual visible grid width.',\n    invalidColumnFreezePickerMessage:\n      '[SlickGrid] Action not allowed and aborted, you need to have at least one or more column on the right section of the column freeze/pining. ' +\n      'You could alternatively \"Unfreeze all the columns\" before trying again.',\n    alwaysShowVerticalScroll: false,\n    alwaysAllowHorizontalScroll: false,\n    explicitInitialization: false,\n    rowHeight: 25,\n    defaultColumnWidth: 80,\n    enableHtmlRendering: true,\n    enableAddRow: false,\n    leaveSpaceForNewRows: false,\n    editable: false,\n    autoEdit: true,\n    autoEditNewRow: true,\n    autoCommitEdit: false,\n    suppressActiveCellChangeOnEdit: false,\n    enableCellNavigation: true,\n    enableColumnReorder: true,\n    unorderableColumnCssClass: 'unorderable',\n    asyncEditorLoading: false,\n    asyncEditorLoadDelay: 100,\n    forceFitColumns: false,\n    enableAsyncPostRender: false,\n    asyncPostRenderDelay: 50,\n    enableAsyncPostRenderCleanup: false,\n    asyncPostRenderCleanupDelay: 40,\n    auto: false,\n    nonce: '',\n    editorLock: GlobalEditorLock,\n    showColumnHeader: true,\n    showHeaderRow: false,\n    headerRowHeight: 25,\n    createFooterRow: false,\n    showFooterRow: false,\n    footerRowHeight: 25,\n    createPreHeaderPanel: false,\n    createTopHeaderPanel: false,\n    showPreHeaderPanel: false,\n    showTopHeaderPanel: false,\n    preHeaderPanelHeight: 25,\n    showTopPanel: false,\n    topPanelHeight: 25,\n    preHeaderPanelWidth: 'auto', // mostly useful for Draggable Grouping dropzone to take full width\n    topHeaderPanelHeight: 25,\n    topHeaderPanelWidth: 'auto', // mostly useful for Draggable Grouping dropzone to take full width\n    formatterFactory: null,\n    editorFactory: null,\n    cellFlashingCssClass: 'flashing',\n    rowHighlightCssClass: 'highlight-animate',\n    rowHighlightDuration: 400,\n    selectedCellCssClass: 'selected',\n    multiSelect: true,\n    enableCellRowSpan: false,\n    enableTextSelectionOnCells: false,\n    dataItemColumnValueExtractor: null,\n    frozenBottom: false,\n    frozenColumn: -1,\n    frozenRow: -1,\n    frozenRightViewportMinWidth: 100,\n    throwWhenFrozenNotAllViewable: false,\n    fullWidthRows: false,\n    multiColumnSort: false,\n    numberedMultiColumnSort: false,\n    tristateMultiColumnSort: false,\n    sortColNumberInSeparateSpan: false,\n    defaultFormatter: this.defaultFormatter,\n    forceSyncScrolling: false,\n    addNewRowCssClass: 'new-row',\n    preserveCopiedSelectionOnPaste: false,\n    preventDragFromKeys: ['ctrlKey', 'metaKey'],\n    showCellSelection: true,\n    viewportClass: undefined,\n    minRowBuffer: 3,\n    emulatePagingWhenScrolling: true, // when scrolling off bottom of viewport, place new row at top of viewport\n    editorCellNavOnLRKeys: false,\n    enableMouseWheelScrollHandler: true,\n    doPaging: true,\n    autosizeColsMode: GridAutosizeColsMode.LegacyOff,\n    autosizeColPaddingPx: 4,\n    rowTopOffsetRenderType: 'top',\n    scrollRenderThrottling: 10,\n    autosizeTextAvgToMWidthRatio: 0.75,\n    viewportSwitchToScrollModeWidthPercent: undefined,\n    viewportMinWidthPx: undefined,\n    viewportMaxWidthPx: undefined,\n    suppressCssChangesOnHiddenInit: false,\n    ffMaxSupportedCssHeight: 6000000,\n    maxSupportedCssHeight: 1000000000,\n    maxPartialRowSpanRemap: 5000,\n    sanitizer: undefined,  // sanitize function, built in basic sanitizer is: Slick.RegexSanitizer(dirtyHtml)\n    logSanitizedHtml: false, // log to console when sanitised - recommend true for testing of dev and production\n    mixinDefaults: true,\n    shadowRoot: undefined\n  };\n\n  protected _columnDefaults = {\n    name: '',\n    headerCssClass: null,\n    defaultSortAsc: true,\n    focusable: true,\n    hidden: false,\n    minWidth: 30,\n    maxWidth: undefined,\n    rerenderOnResize: false,\n    reorderable: true,\n    resizable: true,\n    sortable: false,\n    selectable: true,\n  } as Partial<C>;\n\n  protected _columnAutosizeDefaults: AutoSize = {\n    ignoreHeaderText: false,\n    colValueArray: undefined,\n    allowAddlPercent: undefined,\n    formatterOverride: undefined,\n    autosizeMode: ColAutosizeMode.ContentIntelligent,\n    rowSelectionModeOnInit: undefined,\n    rowSelectionMode: RowSelectionMode.FirstNRows,\n    rowSelectionCount: 100,\n    valueFilterMode: ValueFilterMode.None,\n    widthEvalMode: WidthEvalMode.Auto,\n    sizeToRemaining: undefined,\n    widthPx: undefined,\n    contentSizePx: 0,\n    headerWidthPx: 0,\n    colDataTypeOf: undefined\n  };\n\n  protected _columnResizeTimer?: number;\n  protected _executionBlockTimer?: number;\n  protected _flashCellTimer?: number;\n  protected _highlightRowTimer?: number;\n\n  // scroller\n  protected th!: number;   // virtual height\n  protected h!: number;    // real scrollable height\n  protected ph!: number;   // page height\n  protected n!: number;    // number of pages\n  protected cj!: number;   // \"jumpiness\" coefficient\n\n  protected page = 0;       // current page\n  protected offset = 0;     // current page offset\n  protected vScrollDir = 1;\n  protected _bindingEventService = new BindingEventService();\n  protected initialized = false;\n  protected _container!: HTMLElement;\n  protected uid = `slickgrid_${Math.round(1000000 * Math.random())}`;\n  protected dragReplaceEl = new DragExtendHandle(this.uid);\n  protected _focusSink!: HTMLDivElement;\n  protected _focusSink2!: HTMLDivElement;\n  protected _groupHeaders: HTMLDivElement[] = [];\n  protected _headerScroller: HTMLDivElement[] = [];\n  protected _headers: HTMLDivElement[] = [];\n  protected _headerRows!: HTMLDivElement[];\n  protected _headerRowScroller!: HTMLDivElement[];\n  protected _headerRowSpacerL!: HTMLDivElement;\n  protected _headerRowSpacerR!: HTMLDivElement;\n  protected _footerRow!: HTMLDivElement[];\n  protected _footerRowScroller!: HTMLDivElement[];\n  protected _footerRowSpacerL!: HTMLDivElement;\n  protected _footerRowSpacerR!: HTMLDivElement;\n  protected _preHeaderPanel!: HTMLDivElement;\n  protected _preHeaderPanelScroller!: HTMLDivElement;\n  protected _preHeaderPanelSpacer!: HTMLDivElement;\n  protected _preHeaderPanelR!: HTMLDivElement;\n  protected _preHeaderPanelScrollerR!: HTMLDivElement;\n  protected _preHeaderPanelSpacerR!: HTMLDivElement;\n  protected _topHeaderPanel!: HTMLDivElement;\n  protected _topHeaderPanelScroller!: HTMLDivElement;\n  protected _topHeaderPanelSpacer!: HTMLDivElement;\n  protected _topPanelScrollers!: HTMLDivElement[];\n  protected _topPanels!: HTMLDivElement[];\n  protected _viewport!: HTMLDivElement[];\n  protected _canvas!: HTMLDivElement[];\n  protected _style?: HTMLStyleElement;\n  protected _boundAncestors: HTMLElement[] = [];\n  protected stylesheet?: { cssRules: Array<{ selectorText: string; }>; rules: Array<{ selectorText: string; }>; } | null;\n  protected columnCssRulesL?: Array<{ selectorText: string; }>;\n  protected columnCssRulesR?: Array<{ selectorText: string; }>;\n  protected viewportH = 0;\n  protected viewportW = 0;\n  protected canvasWidth = 0;\n  protected canvasWidthL = 0;\n  protected canvasWidthR = 0;\n  protected headersWidth = 0;\n  protected headersWidthL = 0;\n  protected headersWidthR = 0;\n  protected viewportHasHScroll = false;\n  protected viewportHasVScroll = false;\n  protected headerColumnWidthDiff = 0;\n  protected headerColumnHeightDiff = 0; // border+padding\n  protected cellWidthDiff = 0;\n  protected cellHeightDiff = 0;\n  protected absoluteColumnMinWidth!: number;\n  protected hasFrozenRows = false;\n  protected frozenRowsHeight = 0;\n  protected actualFrozenRow = -1;\n  protected _prevFrozenColumnIdx = -1;\n  /** flag to indicate if invalid frozen alert has been shown already or not? This is to avoid showing it more than once */\n  protected _invalidfrozenAlerted = false;\n  protected paneTopH = 0;\n  protected paneBottomH = 0;\n  protected viewportTopH = 0;\n  protected viewportBottomH = 0;\n  protected topPanelH = 0;\n  protected headerRowH = 0;\n  protected footerRowH = 0;\n\n  protected tabbingDirection = 1;\n  protected _activeCanvasNode!: HTMLDivElement;\n  protected _activeViewportNode!: HTMLDivElement;\n  protected activePosX!: number;\n  protected activePosY!: number;\n  protected activeRow!: number;\n  protected activeCell!: number;\n  protected selectionBottomRow!: number;\n  protected selectionRightCell!: number;\n  protected activeCellNode: HTMLDivElement | null = null;\n  protected currentEditor: Editor | null = null;\n  protected serializedEditorValue: any;\n  protected editController?: EditController;\n  protected _prevDataLength = 0;\n  protected _prevInvalidatedRowsCount = 0;\n  protected _rowSpanIsCached = false;\n  protected _colsWithRowSpanCache: { [colIdx: number]: Set<string> } = {};\n  protected rowsCache: Record<number, RowCaching> = {};\n  protected renderedRows = 0;\n  protected numVisibleRows = 0;\n  protected prevScrollTop = 0;\n  protected scrollHeight = 0;\n  protected scrollTop = 0;\n  protected lastRenderedScrollTop = 0;\n  protected lastRenderedScrollLeft = 0;\n  protected prevScrollLeft = 0;\n  protected scrollLeft = 0;\n\n  protected selectionModel?: SelectionModel;\n  protected selectedRows: number[] = [];\n  protected selectedRanges: SlickRange_[] = [];\n\n  protected plugins: SlickPlugin[] = [];\n  protected cellCssClasses: CssStyleHash = {};\n\n  protected columnsById: Record<string, number> = {};\n  protected sortColumns: ColumnSort[] = [];\n  protected columnPosLeft: number[] = [];\n  protected columnPosRight: number[] = [];\n\n  protected pagingActive = false;\n  protected pagingIsLastPage = false;\n\n  protected scrollThrottle!: { enqueue: () => void; dequeue: () => void; };\n\n  // async call handles\n  protected h_editorLoader?: number;\n  protected h_postrender?: number;\n  protected h_postrenderCleanup?: number;\n  protected postProcessedRows: any = {};\n  protected postProcessToRow: number = null as any;\n  protected postProcessFromRow: number = null as any;\n  protected postProcessedCleanupQueue: Array<{\n    actionType: string;\n    groupId: number;\n    node: HTMLElement | HTMLElement[];\n    columnIdx?: number;\n    rowIdx?: number;\n  }> = [];\n  protected postProcessgroupId = 0;\n\n  // perf counters\n  protected counter_rows_rendered = 0;\n  protected counter_rows_removed = 0;\n\n  protected _paneHeaderL!: HTMLDivElement;\n  protected _paneHeaderR!: HTMLDivElement;\n  protected _paneTopL!: HTMLDivElement;\n  protected _paneTopR!: HTMLDivElement;\n  protected _paneBottomL!: HTMLDivElement;\n  protected _paneBottomR!: HTMLDivElement;\n  protected _headerScrollerL!: HTMLDivElement;\n  protected _headerScrollerR!: HTMLDivElement;\n  protected _headerL!: HTMLDivElement;\n  protected _headerR!: HTMLDivElement;\n  protected _groupHeadersL!: HTMLDivElement;\n  protected _groupHeadersR!: HTMLDivElement;\n  protected _headerRowScrollerL!: HTMLDivElement;\n  protected _headerRowScrollerR!: HTMLDivElement;\n  protected _footerRowScrollerL!: HTMLDivElement;\n  protected _footerRowScrollerR!: HTMLDivElement;\n  protected _headerRowL!: HTMLDivElement;\n  protected _headerRowR!: HTMLDivElement;\n  protected _footerRowL!: HTMLDivElement;\n  protected _footerRowR!: HTMLDivElement;\n  protected _topPanelScrollerL!: HTMLDivElement;\n  protected _topPanelScrollerR!: HTMLDivElement;\n  protected _topPanelL!: HTMLDivElement;\n  protected _topPanelR!: HTMLDivElement;\n  protected _viewportTopL!: HTMLDivElement;\n  protected _viewportTopR!: HTMLDivElement;\n  protected _viewportBottomL!: HTMLDivElement;\n  protected _viewportBottomR!: HTMLDivElement;\n  protected _canvasTopL!: HTMLDivElement;\n  protected _canvasTopR!: HTMLDivElement;\n  protected _canvasBottomL!: HTMLDivElement;\n  protected _canvasBottomR!: HTMLDivElement;\n  protected _viewportScrollContainerX!: HTMLDivElement;\n  protected _viewportScrollContainerY!: HTMLDivElement;\n  protected _headerScrollContainer!: HTMLDivElement;\n  protected _headerRowScrollContainer!: HTMLDivElement;\n  protected _footerRowScrollContainer!: HTMLDivElement;\n\n  // store css attributes if display:none is active in container or parent\n  protected cssShow = { position: 'absolute', visibility: 'hidden', display: 'block' };\n  protected _hiddenParents: HTMLElement[] = [];\n  protected oldProps: Array<Partial<CSSStyleDeclaration>> = [];\n  protected enforceFrozenRowHeightRecalc = false;\n  protected columnResizeDragging = false;\n  protected slickDraggableInstance: InteractionBase | null = null;\n  protected slickMouseWheelInstances: Array<InteractionBase> = [];\n  protected slickResizableInstances: Array<InteractionBase> = [];\n  protected sortableSideLeftInstance?: SortableInstance;\n  protected sortableSideRightInstance?: SortableInstance;\n  protected logMessageCount = 0;\n  protected logMessageMaxCount = 30;\n  protected _pubSubService?: BasePubSub;\n\n  /**\n   * Creates a new instance of the grid.\n   * @class SlickGrid\n   * @constructor\n   * @param {Node} container - Container node to create the grid in.\n   * @param {Array|Object} data - An array of objects for databinding or an external DataView.\n   * @param {Array<C>} columns - An array of column definitions.\n   * @param {Object} [options] - Grid Options\n   * @param {Object} [externalPubSub] - optional External PubSub Service to use by SlickEvent\n   **/\n  constructor(protected readonly container: HTMLElement | string, protected data: CustomDataView<TData> | TData[], protected columns: C[], options: Partial<O>, protected readonly externalPubSub?: BasePubSub) {\n    this._container = typeof this.container === 'string'\n      ? document.querySelector(this.container) as HTMLDivElement\n      : this.container;\n\n    if (!this._container) {\n      throw new Error(`SlickGrid requires a valid container, ${this.container} does not exist in the DOM.`);\n    }\n\n    this._pubSubService = externalPubSub;\n    this.onActiveCellChanged = new SlickEvent<OnActiveCellChangedEventArgs>('onActiveCellChanged', externalPubSub);\n    this.onActiveCellPositionChanged = new SlickEvent<{ grid: SlickGrid; }>('onActiveCellPositionChanged', externalPubSub);\n    this.onAddNewRow = new SlickEvent<OnAddNewRowEventArgs>('onAddNewRow', externalPubSub);\n    this.onAfterSetColumns = new SlickEvent<OnAfterSetColumnsEventArgs>('onAfterSetColumns', externalPubSub);\n    this.onAutosizeColumns = new SlickEvent<OnAutosizeColumnsEventArgs>('onAutosizeColumns', externalPubSub);\n    this.onBeforeAppendCell = new SlickEvent<OnBeforeAppendCellEventArgs>('onBeforeAppendCell', externalPubSub);\n    this.onBeforeCellEditorDestroy = new SlickEvent<OnBeforeCellEditorDestroyEventArgs>('onBeforeCellEditorDestroy', externalPubSub);\n    this.onBeforeColumnsResize = new SlickEvent<OnBeforeColumnsResizeEventArgs>('onBeforeColumnsResize', externalPubSub);\n    this.onBeforeDestroy = new SlickEvent<{ grid: SlickGrid; }>('onBeforeDestroy', externalPubSub);\n    this.onBeforeEditCell = new SlickEvent<OnBeforeEditCellEventArgs>('onBeforeEditCell', externalPubSub);\n    this.onBeforeFooterRowCellDestroy = new SlickEvent<OnBeforeFooterRowCellDestroyEventArgs>('onBeforeFooterRowCellDestroy', externalPubSub);\n    this.onBeforeHeaderCellDestroy = new SlickEvent<OnBeforeHeaderCellDestroyEventArgs>('onBeforeHeaderCellDestroy', externalPubSub);\n    this.onBeforeHeaderRowCellDestroy = new SlickEvent<OnBeforeHeaderRowCellDestroyEventArgs>('onBeforeHeaderRowCellDestroy', externalPubSub);\n    this.onBeforeRemoveCachedRow = new SlickEvent<{ row: number; grid: SlickGrid }>('onRowRemovedFromCache', externalPubSub);\n    this.onBeforeSetColumns = new SlickEvent<OnBeforeSetColumnsEventArgs>('onBeforeSetColumns', externalPubSub);\n    this.onBeforeSort = new SlickEvent<SingleColumnSort | MultiColumnSort>('onBeforeSort', externalPubSub);\n    this.onBeforeUpdateColumns = new SlickEvent<OnColumnsEventArgs>('onBeforeUpdateColumns', externalPubSub);\n    this.onAfterUpdateColumns = new SlickEvent<OnColumnsEventArgs>('onBeforeUpdateColumns', externalPubSub);\n    this.onCellChange = new SlickEvent<OnCellChangeEventArgs>('onCellChange', externalPubSub);\n    this.onCellCssStylesChanged = new SlickEvent<OnCellCssStylesChangedEventArgs>('onCellCssStylesChanged', externalPubSub);\n    this.onClick = new SlickEvent<OnClickEventArgs>('onClick', externalPubSub);\n    this.onColumnsReordered = new SlickEvent<OnColumnsReorderedEventArgs>('onColumnsReordered', externalPubSub);\n    this.onColumnsDrag = new SlickEvent<OnColumnsDragEventArgs>('onColumnsDrag', externalPubSub);\n    this.onColumnsResized = new SlickEvent<OnColumnsResizedEventArgs>('onColumnsResized', externalPubSub);\n    this.onColumnsResizeDblClick = new SlickEvent<OnColumnsResizeDblClickEventArgs>('onColumnsResizeDblClick', externalPubSub);\n    this.onCompositeEditorChange = new SlickEvent<OnCompositeEditorChangeEventArgs>('onCompositeEditorChange', externalPubSub);\n    this.onContextMenu = new SlickEvent<MenuCommandItemCallbackArgs>('onContextMenu', externalPubSub);\n    this.onDrag = new SlickEvent<DragRowMove>('onDrag', externalPubSub);\n    this.onDblClick = new SlickEvent<OnDblClickEventArgs>('onDblClick', externalPubSub);\n    this.onDragInit = new SlickEvent<DragRowMove>('onDragInit', externalPubSub);\n    this.onDragStart = new SlickEvent<DragRowMove>('onDragStart', externalPubSub);\n    this.onDragEnd = new SlickEvent<DragRowMove>('onDragEnd', externalPubSub);\n    this.onFooterClick = new SlickEvent<OnFooterClickEventArgs>('onFooterClick', externalPubSub);\n    this.onFooterContextMenu = new SlickEvent<OnFooterContextMenuEventArgs>('onFooterContextMenu', externalPubSub);\n    this.onFooterRowCellRendered = new SlickEvent<OnFooterRowCellRenderedEventArgs>('onFooterRowCellRendered', externalPubSub);\n    this.onHeaderCellRendered = new SlickEvent<OnHeaderCellRenderedEventArgs>('onHeaderCellRendered', externalPubSub);\n    this.onHeaderClick = new SlickEvent<OnHeaderClickEventArgs>('onHeaderClick', externalPubSub);\n    this.onHeaderContextMenu = new SlickEvent<OnHeaderContextMenuEventArgs>('onHeaderContextMenu', externalPubSub);\n    this.onHeaderMouseEnter = new SlickEvent<OnHeaderMouseEventArgs>('onHeaderMouseEnter', externalPubSub);\n    this.onHeaderMouseLeave = new SlickEvent<OnHeaderMouseEventArgs>('onHeaderMouseLeave', externalPubSub);\n    this.onHeaderRowCellRendered = new SlickEvent<OnHeaderRowCellRenderedEventArgs>('onHeaderRowCellRendered', externalPubSub);\n    this.onHeaderRowMouseEnter = new SlickEvent<OnHeaderMouseEventArgs>('onHeaderRowMouseEnter', externalPubSub);\n    this.onHeaderRowMouseLeave = new SlickEvent<OnHeaderMouseEventArgs>('onHeaderRowMouseLeave', externalPubSub);\n    this.onPreHeaderClick = new SlickEvent<OnPreHeaderClickEventArgs>('onPreHeaderClick', externalPubSub);\n    this.onPreHeaderContextMenu = new SlickEvent<OnPreHeaderContextMenuEventArgs>('onPreHeaderContextMenu', externalPubSub);\n    this.onKeyDown = new SlickEvent<OnKeyDownEventArgs>('onKeyDown', externalPubSub);\n    this.onMouseEnter = new SlickEvent<OnHeaderMouseEventArgs>('onMouseEnter', externalPubSub);\n    this.onMouseLeave = new SlickEvent<OnHeaderMouseEventArgs>('onMouseLeave', externalPubSub);\n    this.onRendered = new SlickEvent<OnRenderedEventArgs>('onRendered', externalPubSub);\n    this.onScroll = new SlickEvent<OnScrollEventArgs>('onScroll', externalPubSub);\n    this.onSelectedRowsChanged = new SlickEvent<OnSelectedRowsChangedEventArgs>('onSelectedRowsChanged', externalPubSub);\n    this.onSetOptions = new SlickEvent<OnSetOptionsEventArgs>('onSetOptions', externalPubSub);\n    this.onActivateChangedOptions = new SlickEvent<OnActivateChangedOptionsEventArgs>('onActivateChangedOptions', externalPubSub);\n    this.onSort = new SlickEvent<SingleColumnSort | MultiColumnSort>('onSort', externalPubSub);\n    this.onValidationError = new SlickEvent<OnValidationErrorEventArgs>('onValidationError', externalPubSub);\n    this.onViewportChanged = new SlickEvent<{ grid: SlickGrid; }>('onViewportChanged', externalPubSub);\n    this.onDragReplaceCells = new SlickEvent<OnDragReplaceCellsEventArgs>('onDragReplaceCells', externalPubSub);\n\n    this.initialize(options);\n  }\n\n  //////////////////////////////////////////////////////////////////////////////////////////////\n  // Grid and Dom Initialisation\n  //////////////////////////////////////////////////////////////////////////////////////////////\n\n  /** Initializes the grid. */\n  init() {\n    this.finishInitialization();\n  }\n\n  /**\n   * Processes the provided grid options (mixing in default settings as needed),\n   * validates required modules (for example, ensuring Sortable.js is loaded if column reordering is enabled),\n   * and creates all necessary DOM elements for the grid (including header containers, viewports, canvases, panels, etc.).\n   * It also caches CSS if the container or its ancestors are hidden and calls finish.\n   *\n   * @param {Partial<O>} options - Partial grid options to be applied during initialization.\n   */\n  protected initialize(options: Partial<O>) {\n    // calculate these only once and share between grid instances\n    if (options?.mixinDefaults) {\n      // use provided options and then assign defaults\n      if (!this._options) { this._options = options as O; }\n      Utils.applyDefaults(this._options, this._defaults);\n    } else {\n      this._options = Utils.extend<O>(true, {}, this._defaults, options);\n    }\n    this.scrollThrottle = this.actionThrottle(this.render.bind(this), this._options.scrollRenderThrottling as number);\n    this.maxSupportedCssHeight = this.maxSupportedCssHeight || this.getMaxSupportedCssHeight();\n    this.validateAndEnforceOptions();\n    this._columnDefaults.width = this._options.defaultColumnWidth;\n    this._prevFrozenColumnIdx = this.getFrozenColumnIdx();\n\n    if (!this._options.suppressCssChangesOnHiddenInit) {\n      this.cacheCssForHiddenInit();\n    }\n\n    this.updateColumnProps();\n\n    // validate loaded JavaScript modules against requested options\n    if (this._options.enableColumnReorder && (!Sortable || !Sortable.create)) {\n      throw new Error('SlickGrid requires Sortable.js module to be loaded');\n    }\n\n    this.editController = {\n      commitCurrentEdit: this.commitCurrentEdit.bind(this),\n      cancelCurrentEdit: this.cancelCurrentEdit.bind(this),\n    };\n\n    Utils.emptyElement(this._container);\n    this._container.style.outline = String(0);\n    this._container.classList.add(this.uid);\n    this._container.classList.add('ui-widget');\n    this._container.setAttribute('role', 'grid');\n\n    const containerStyles = window.getComputedStyle(this._container);\n    if (!(/relative|absolute|fixed/).test(containerStyles.position)) {\n      this._container.style.position = 'relative';\n    }\n\n    this._focusSink = Utils.createDomElement('div', { tabIndex: 0, style: { position: 'fixed', width: '0px', height: '0px', top: '0px', left: '0px', outline: '0px' } }, this._container);\n\n    if (this._options.createTopHeaderPanel) {\n      this._topHeaderPanelScroller = Utils.createDomElement('div', { className: 'slick-topheader-panel slick-state-default', style: { overflow: 'hidden', position: 'relative' } }, this._container);\n      this._topHeaderPanelScroller.appendChild(document.createElement('div'));\n      this._topHeaderPanel = Utils.createDomElement('div', null, this._topHeaderPanelScroller);\n      this._topHeaderPanelSpacer = Utils.createDomElement('div', { style: { display: 'block', height: '1px', position: 'absolute', top: '0px', left: '0px' } }, this._topHeaderPanelScroller);\n\n      if (!this._options.showTopHeaderPanel) {\n        Utils.hide(this._topHeaderPanelScroller);\n      }\n    }\n\n    // Containers used for scrolling frozen columns and rows\n    this._paneHeaderL = Utils.createDomElement('div', { className: 'slick-pane slick-pane-header slick-pane-left', tabIndex: 0 }, this._container);\n    this._paneHeaderR = Utils.createDomElement('div', { className: 'slick-pane slick-pane-header slick-pane-right', tabIndex: 0 }, this._container);\n    this._paneTopL = Utils.createDomElement('div', { className: 'slick-pane slick-pane-top slick-pane-left', tabIndex: 0 }, this._container);\n    this._paneTopR = Utils.createDomElement('div', { className: 'slick-pane slick-pane-top slick-pane-right', tabIndex: 0 }, this._container);\n    this._paneBottomL = Utils.createDomElement('div', { className: 'slick-pane slick-pane-bottom slick-pane-left', tabIndex: 0 }, this._container);\n    this._paneBottomR = Utils.createDomElement('div', { className: 'slick-pane slick-pane-bottom slick-pane-right', tabIndex: 0 }, this._container);\n\n    if (this._options.createPreHeaderPanel) {\n      this._preHeaderPanelScroller = Utils.createDomElement('div', { className: 'slick-preheader-panel ui-state-default slick-state-default', style: { overflow: 'hidden', position: 'relative' } }, this._paneHeaderL);\n      this._preHeaderPanelScroller.appendChild(document.createElement('div'));\n      this._preHeaderPanel = Utils.createDomElement('div', null, this._preHeaderPanelScroller);\n      this._preHeaderPanelSpacer = Utils.createDomElement('div', { style: { display: 'block', height: '1px', position: 'absolute', top: '0px', left: '0px' } }, this._preHeaderPanelScroller);\n\n      this._preHeaderPanelScrollerR = Utils.createDomElement('div', { className: 'slick-preheader-panel ui-state-default slick-state-default', style: { overflow: 'hidden', position: 'relative' } }, this._paneHeaderR);\n      this._preHeaderPanelR = Utils.createDomElement('div', null, this._preHeaderPanelScrollerR);\n      this._preHeaderPanelSpacerR = Utils.createDomElement('div', { style: { display: 'block', height: '1px', position: 'absolute', top: '0px', left: '0px' } }, this._preHeaderPanelScrollerR);\n\n      if (!this._options.showPreHeaderPanel) {\n        Utils.hide(this._preHeaderPanelScroller);\n        Utils.hide(this._preHeaderPanelScrollerR);\n      }\n    }\n\n    // Append the header scroller containers\n    this._headerScrollerL = Utils.createDomElement('div', { className: 'slick-header ui-state-default slick-state-default slick-header-left' }, this._paneHeaderL);\n    this._headerScrollerR = Utils.createDomElement('div', { className: 'slick-header ui-state-default slick-state-default slick-header-right' }, this._paneHeaderR);\n\n    // Cache the header scroller containers\n    this._headerScroller.push(this._headerScrollerL);\n    this._headerScroller.push(this._headerScrollerR);\n\n    // Append the columnn containers to the headers\n    this._headerL = Utils.createDomElement('div', { className: 'slick-header-columns slick-header-columns-left', role: 'row', style: { left: '-1000px' } }, this._headerScrollerL);\n    this._headerR = Utils.createDomElement('div', { className: 'slick-header-columns slick-header-columns-right', role: 'row', style: { left: '-1000px' } }, this._headerScrollerR);\n\n    // Cache the header columns\n    this._headers = [this._headerL, this._headerR];\n\n    this._headerRowScrollerL = Utils.createDomElement('div', { className: 'slick-headerrow ui-state-default slick-state-default' }, this._paneTopL);\n    this._headerRowScrollerR = Utils.createDomElement('div', { className: 'slick-headerrow ui-state-default slick-state-default' }, this._paneTopR);\n\n    this._headerRowScroller = [this._headerRowScrollerL, this._headerRowScrollerR];\n\n    this._headerRowSpacerL = Utils.createDomElement('div', { style: { display: 'block', height: '1px', position: 'absolute', top: '0px', left: '0px' } }, this._headerRowScrollerL);\n    this._headerRowSpacerR = Utils.createDomElement('div', { style: { display: 'block', height: '1px', position: 'absolute', top: '0px', left: '0px' } }, this._headerRowScrollerR);\n\n    this._headerRowL = Utils.createDomElement('div', { className: 'slick-headerrow-columns slick-headerrow-columns-left' }, this._headerRowScrollerL);\n    this._headerRowR = Utils.createDomElement('div', { className: 'slick-headerrow-columns slick-headerrow-columns-right' }, this._headerRowScrollerR);\n\n    this._headerRows = [this._headerRowL, this._headerRowR];\n\n    // Append the top panel scroller\n    this._topPanelScrollerL = Utils.createDomElement('div', { className: 'slick-top-panel-scroller ui-state-default slick-state-default' }, this._paneTopL);\n    this._topPanelScrollerR = Utils.createDomElement('div', { className: 'slick-top-panel-scroller ui-state-default slick-state-default' }, this._paneTopR);\n\n    this._topPanelScrollers = [this._topPanelScrollerL, this._topPanelScrollerR];\n\n    // Append the top panel\n    this._topPanelL = Utils.createDomElement('div', { className: 'slick-top-panel', style: { width: '10000px' } }, this._topPanelScrollerL);\n    this._topPanelR = Utils.createDomElement('div', { className: 'slick-top-panel', style: { width: '10000px' } }, this._topPanelScrollerR);\n\n    this._topPanels = [this._topPanelL, this._topPanelR];\n\n    if (!this._options.showColumnHeader) {\n      this._headerScroller.forEach((el) => {\n        Utils.hide(el);\n      });\n    }\n\n    if (!this._options.showTopPanel) {\n      this._topPanelScrollers.forEach((scroller) => {\n        Utils.hide(scroller);\n      });\n    }\n\n    if (!this._options.showHeaderRow) {\n      this._headerRowScroller.forEach((scroller) => {\n        Utils.hide(scroller);\n      });\n    }\n\n    // Append the viewport containers\n    this._viewportTopL = Utils.createDomElement('div', { className: 'slick-viewport slick-viewport-top slick-viewport-left', tabIndex: 0 }, this._paneTopL);\n    this._viewportTopR = Utils.createDomElement('div', { className: 'slick-viewport slick-viewport-top slick-viewport-right', tabIndex: 0 }, this._paneTopR);\n    this._viewportBottomL = Utils.createDomElement('div', { className: 'slick-viewport slick-viewport-bottom slick-viewport-left', tabIndex: 0 }, this._paneBottomL);\n    this._viewportBottomR = Utils.createDomElement('div', { className: 'slick-viewport slick-viewport-bottom slick-viewport-right', tabIndex: 0 }, this._paneBottomR);\n\n    // Cache the viewports\n    this._viewport = [this._viewportTopL, this._viewportTopR, this._viewportBottomL, this._viewportBottomR];\n    if (this._options.viewportClass) {\n      this._viewport.forEach((view) => {\n        view.classList.add(...Utils.classNameToList((this._options.viewportClass)));\n      });\n    }\n\n    // Default the active viewport to the top left\n    this._activeViewportNode = this._viewportTopL;\n\n    // Append the canvas containers\n    this._canvasTopL = Utils.createDomElement('div', { className: 'grid-canvas grid-canvas-top grid-canvas-left', tabIndex: 0 }, this._viewportTopL);\n    this._canvasTopR = Utils.createDomElement('div', { className: 'grid-canvas grid-canvas-top grid-canvas-right', tabIndex: 0 }, this._viewportTopR);\n    this._canvasBottomL = Utils.createDomElement('div', { className: 'grid-canvas grid-canvas-bottom grid-canvas-left', tabIndex: 0 }, this._viewportBottomL);\n    this._canvasBottomR = Utils.createDomElement('div', { className: 'grid-canvas grid-canvas-bottom grid-canvas-right', tabIndex: 0 }, this._viewportBottomR);\n\n    // Cache the canvases\n    this._canvas = [this._canvasTopL, this._canvasTopR, this._canvasBottomL, this._canvasBottomR];\n\n    this.scrollbarDimensions = this.scrollbarDimensions || this.measureScrollbar();\n    const canvasWithScrollbarWidth = this.getCanvasWidth() + this.scrollbarDimensions.width;\n\n    // Default the active canvas to the top left\n    this._activeCanvasNode = this._canvasTopL;\n\n    // top-header\n    if (this._topHeaderPanelSpacer) {\n      Utils.width(this._topHeaderPanelSpacer, canvasWithScrollbarWidth);\n    }\n\n    // pre-header\n    if (this._preHeaderPanelSpacer) {\n      Utils.width(this._preHeaderPanelSpacer, canvasWithScrollbarWidth);\n    }\n\n    this._headers.forEach((el) => {\n      Utils.width(el, this.getHeadersWidth());\n    });\n\n    Utils.width(this._headerRowSpacerL, canvasWithScrollbarWidth);\n    Utils.width(this._headerRowSpacerR, canvasWithScrollbarWidth);\n\n    // footer Row\n    if (this._options.createFooterRow) {\n      this._footerRowScrollerR = Utils.createDomElement('div', { className: 'slick-footerrow ui-state-default slick-state-default' }, this._paneTopR);\n      this._footerRowScrollerL = Utils.createDomElement('div', { className: 'slick-footerrow ui-state-default slick-state-default' }, this._paneTopL);\n\n      this._footerRowScroller = [this._footerRowScrollerL, this._footerRowScrollerR];\n\n      this._footerRowSpacerL = Utils.createDomElement('div', { style: { display: 'block', height: '1px', position: 'absolute', top: '0px', left: '0px' } }, this._footerRowScrollerL);\n      Utils.width(this._footerRowSpacerL, canvasWithScrollbarWidth);\n      this._footerRowSpacerR = Utils.createDomElement('div', { style: { display: 'block', height: '1px', position: 'absolute', top: '0px', left: '0px' } }, this._footerRowScrollerR);\n      Utils.width(this._footerRowSpacerR, canvasWithScrollbarWidth);\n\n      this._footerRowL = Utils.createDomElement('div', { className: 'slick-footerrow-columns slick-footerrow-columns-left' }, this._footerRowScrollerL);\n      this._footerRowR = Utils.createDomElement('div', { className: 'slick-footerrow-columns slick-footerrow-columns-right' }, this._footerRowScrollerR);\n\n      this._footerRow = [this._footerRowL, this._footerRowR];\n\n      if (!this._options.showFooterRow) {\n        this._footerRowScroller.forEach((scroller) => {\n          Utils.hide(scroller);\n        });\n      }\n    }\n\n    this._focusSink2 = this._focusSink.cloneNode(true) as HTMLDivElement;\n    this._container.appendChild(this._focusSink2);\n\n    if (!this._options.explicitInitialization) {\n      this.finishInitialization();\n    }\n  }\n\n  /**\n   * Completes grid initialisation by calculating viewport dimensions, measuring cell padding and border differences,\n   * disabling text selection (except on editable inputs), setting frozen options and pane visibility,\n   * updating column caches, creating column headers and footers, setting up column sorting,\n   * creating CSS rules, binding ancestor scroll events, and binding various event handlers\n   * (e.g. for scrolling, mouse, keyboard, drag-and-drop).\n   * It also starts up any asynchronous post\u2013render processing if enabled.\n   */\n  protected finishInitialization() {\n    if (!this.initialized) {\n      this.initialized = true;\n\n      this.getViewportWidth();\n      this.getViewportHeight();\n\n      // header columns and cells may have different padding/border skewing width calculations (box-sizing, hello?)\n      // calculate the diff so we can set consistent sizes\n      this.measureCellPaddingAndBorder();\n\n      this.disableSelection(this._headers); // disable all text selection in header (including input and textarea)\n\n      if (!this._options.enableTextSelectionOnCells) {\n        // disable text selection in grid cells except in input and textarea elements\n        this._viewport.forEach((view) => {\n          this._bindingEventService.bind(view, 'selectstart', (event) => {\n            if (event.target instanceof HTMLInputElement || event.target instanceof HTMLTextAreaElement) {\n              return;\n            }\n            event.preventDefault();\n          });\n        });\n      }\n\n      this.setFrozenOptions();\n      this.setPaneFrozenClasses();\n      this.setPaneVisibility();\n      this.setScroller();\n      this.setOverflow();\n\n      this.updateColumnCaches();\n      this.createColumnHeaders();\n      this.createColumnFooter();\n      this.setupColumnSort();\n      this.createCssRules();\n      this.resizeCanvas();\n      this.bindAncestorScrollEvents();\n\n      this._bindingEventService.bind(this._container, 'resize', this.resizeCanvas.bind(this));\n      this._viewport.forEach((view) => {\n        this._bindingEventService.bind(view, 'scroll', this.handleScroll.bind(this));\n      });\n\n      if (this._options.enableMouseWheelScrollHandler) {\n        this._viewport.forEach((view) => {\n          this.slickMouseWheelInstances.push(MouseWheel({\n            element: view,\n            onMouseWheel: this.handleMouseWheel.bind(this)\n          }));\n        });\n      }\n\n      this._headerScroller.forEach((el) => {\n        this._bindingEventService.bind(el, 'contextmenu', this.handleHeaderContextMenu.bind(this) as EventListener);\n        this._bindingEventService.bind(el, 'click', this.handleHeaderClick.bind(this) as EventListener);\n      });\n\n      this._headerRowScroller.forEach((scroller) => {\n        this._bindingEventService.bind(scroller, 'scroll', this.handleHeaderRowScroll.bind(this) as EventListener);\n      });\n\n      if (this._options.createFooterRow) {\n        this._footerRow.forEach((footer) => {\n          this._bindingEventService.bind(footer, 'contextmenu', this.handleFooterContextMenu.bind(this) as EventListener);\n          this._bindingEventService.bind(footer, 'click', this.handleFooterClick.bind(this) as EventListener);\n        });\n\n        this._footerRowScroller.forEach((scroller) => {\n          this._bindingEventService.bind(scroller, 'scroll', this.handleFooterRowScroll.bind(this) as EventListener);\n        });\n      }\n\n      if (this._options.createTopHeaderPanel) {\n        this._bindingEventService.bind(this._topHeaderPanelScroller, 'scroll', this.handleTopHeaderPanelScroll.bind(this) as EventListener);\n      }\n\n      if (this._options.createPreHeaderPanel) {\n        this._bindingEventService.bind(this._preHeaderPanelScroller, 'scroll', this.handlePreHeaderPanelScroll.bind(this) as EventListener);\n        this._bindingEventService.bind(this._preHeaderPanelScroller, 'contextmenu', this.handlePreHeaderContextMenu.bind(this) as EventListener);\n        this._bindingEventService.bind(this._preHeaderPanelScrollerR, 'contextmenu', this.handlePreHeaderContextMenu.bind(this) as EventListener);\n        this._bindingEventService.bind(this._preHeaderPanelScroller, 'click', this.handlePreHeaderClick.bind(this) as EventListener);\n        this._bindingEventService.bind(this._preHeaderPanelScrollerR, 'click', this.handlePreHeaderClick.bind(this) as EventListener);\n      }\n\n      this._bindingEventService.bind(this._focusSink, 'keydown', this.handleKeyDown.bind(this) as EventListener);\n      this._bindingEventService.bind(this._focusSink2, 'keydown', this.handleKeyDown.bind(this) as EventListener);\n\n      this._canvas.forEach((element) => {\n        this._bindingEventService.bind(element, 'keydown', this.handleKeyDown.bind(this) as EventListener);\n        this._bindingEventService.bind(element, 'click', this.handleClick.bind(this) as EventListener);\n        this._bindingEventService.bind(element, 'dblclick', this.handleDblClick.bind(this) as EventListener);\n        this._bindingEventService.bind(element, 'contextmenu', this.handleContextMenu.bind(this) as EventListener);\n        this._bindingEventService.bind(element, 'mouseover', this.handleCellMouseOver.bind(this) as EventListener);\n        this._bindingEventService.bind(element, 'mouseout', this.handleCellMouseOut.bind(this) as EventListener);\n      });\n\n      if (Draggable) {\n        this.slickDraggableInstance = Draggable({\n          containerElement: this._container,\n          allowDragFrom: `div.slick-cell, div.${this.dragReplaceEl.cssClass}`,\n          dragFromClassDetectArr: [{ tag: 'dragReplaceHandle', id: this.dragReplaceEl.id }],\n          // the slick cell parent must always contain `.dnd` and/or `.cell-reorder` class to be identified as draggable\n          allowDragFromClosest: 'div.slick-cell.dnd, div.slick-cell.cell-reorder',\n          preventDragFromKeys: this._options.preventDragFromKeys,\n          onDragInit: this.handleDragInit.bind(this),\n          onDragStart: this.handleDragStart.bind(this),\n          onDrag: this.handleDrag.bind(this),\n          onDragEnd: this.handleDragEnd.bind(this)\n        });\n      }\n\n      if (!this._options.suppressCssChangesOnHiddenInit) {\n        this.restoreCssFromHiddenInit();\n      }\n    }\n  }\n\n  /**\n   * Finds all container ancestors/parents (including the grid container itself) that are hidden (i.e. have display:none)\n   * and temporarily applies visible CSS properties (absolute positioning, hidden visibility, block display)\n   * so that dimensions can be measured correctly.\n   * It stores the original CSS properties in an internal array for later restoration.\n   *\n   * Related to issue: https://github.com/6pac/SlickGrid/issues/568 */\n  cacheCssForHiddenInit() {\n    this._hiddenParents = Utils.parents(this._container, ':hidden') as HTMLElement[];\n    this.oldProps = [];\n    this._hiddenParents.forEach(el => {\n      const old: Partial<CSSStyleDeclaration> = {};\n      Object.keys(this.cssShow).forEach(name => {\n        if (this.cssShow) {\n          old[name as any] = el.style[name as 'position' | 'visibility' | 'display'];\n          el.style[name as any] = this.cssShow[name as 'position' | 'visibility' | 'display'];\n        }\n      });\n      this.oldProps.push(old);\n    });\n  }\n\n  /**\n   * Restores the original CSS properties for the container and its hidden\n   * ancestors that were modified by cacheCssForHiddenInit.\n   * This ensures that after initial measurements the DOM elements revert\n   * to their original style settings.\n   */\n  restoreCssFromHiddenInit() {\n    // finish handle display:none on container or container parents\n    // - put values back the way they were\n    let i = 0;\n    if (this._hiddenParents) {\n      this._hiddenParents.forEach(el => {\n        const old = this.oldProps[i++];\n        Object.keys(this.cssShow).forEach(name => {\n          if (this.cssShow) {\n            el.style[name as CSSStyleDeclarationWritable] = (old as any)[name];\n          }\n        });\n      });\n      this._hiddenParents = [];\n    }\n  }\n\n  /**\n   * Registers an external plugin to the grid\u2019s internal plugin list.\n   * Once added, it immediately initialises the plugin by calling its init()\n   * method with the grid instance.\n   * @param {T} plugin - The plugin instance to be registered.\n   */\n  registerPlugin<T extends SlickPlugin>(plugin: T) {\n    this.plugins.unshift(plugin);\n    plugin.init(this as unknown as SlickGridModel);\n  }\n\n  /**\n   * Unregister (destroy) an external Plugin.\n   * Searches for the specified plugin in the grid\u2019s plugin list.\n   * When found, it calls the plugin\u2019s destroy() method and removes the plugin from the list,\n   * thereby unregistering it from the grid.\n   * @param {T} plugin - The plugin instance to be registered.\n   */\n  unregisterPlugin(plugin: SlickPlugin) {\n    for (let i = this.plugins.length; i >= 0; i--) {\n      if (this.plugins[i] === plugin) {\n        this.plugins[i]?.destroy();\n        this.plugins.splice(i, 1);\n        break;\n      }\n    }\n  }\n\n  /**\n   * Destroy (dispose) of SlickGrid\n   *\n   * Unbinds all event handlers, cancels any active cell edits, triggers the onBeforeDestroy event,\n   * unregisters and destroys plugins, destroys sortable and other interaction instances,\n   * unbinds ancestor scroll events, removes CSS rules, unbinds events from all key DOM elements\n   * (canvas, viewports, header, footer, etc.), empties the grid container, removes the grid\u2019s uid class,\n   * and clears all timers. Optionally, if shouldDestroyAllElements is true,\n   * calls destroyAllElements to nullify all DOM references.\n   *\n   * @param {boolean} shouldDestroyAllElements - do we want to destroy (nullify) all DOM elements as well? This help in avoiding mem leaks\n   */\n  destroy(shouldDestroyAllElements?: boolean) {\n    this._bindingEventService.unbindAll();\n    this.slickDraggableInstance = this.destroyAllInstances(this.slickDraggableInstance) as null;\n    this.slickMouseWheelInstances = this.destroyAllInstances(this.slickMouseWheelInstances) as InteractionBase[];\n    this.slickResizableInstances = this.destroyAllInstances(this.slickResizableInstances) as InteractionBase[];\n    this.getEditorLock()?.cancelCurrentEdit();\n\n    this.trigger(this.onBeforeDestroy, {});\n\n    let i = this.plugins.length;\n    while (i--) {\n      this.unregisterPlugin(this.plugins[i]);\n    }\n\n    if (this._options.enableColumnReorder && typeof this.sortableSideLeftInstance?.destroy === 'function') {\n      this.sortableSideLeftInstance?.destroy();\n      this.sortableSideRightInstance?.destroy();\n    }\n\n    this.unbindAncestorScrollEvents();\n    this._bindingEventService.unbindByEventName(this._container, 'resize');\n    this.removeCssRules();\n\n    this._canvas.forEach((element) => {\n      this._bindingEventService.unbindByEventName(element, 'keydown');\n      this._bindingEventService.unbindByEventName(element, 'click');\n      this._bindingEventService.unbindByEventName(element, 'dblclick');\n      this._bindingEventService.unbindByEventName(element, 'contextmenu');\n      this._bindingEventService.unbindByEventName(element, 'mouseover');\n      this._bindingEventService.unbindByEventName(element, 'mouseout');\n    });\n    this._viewport.forEach((view) => {\n      this._bindingEventService.unbindByEventName(view, 'scroll');\n    });\n\n    this._headerScroller.forEach((el) => {\n      this._bindingEventService.unbindByEventName(el, 'contextmenu');\n      this._bindingEventService.unbindByEventName(el, 'click');\n    });\n\n    this._headerRowScroller.forEach((scroller) => {\n      this._bindingEventService.unbindByEventName(scroller, 'scroll');\n    });\n\n    if (this._footerRow) {\n      this._footerRow.forEach((footer) => {\n        this._bindingEventService.unbindByEventName(footer, 'contextmenu');\n        this._bindingEventService.unbindByEventName(footer, 'click');\n      });\n    }\n\n    if (this._footerRowScroller) {\n      this._footerRowScroller.forEach((scroller) => {\n        this._bindingEventService.unbindByEventName(scroller, 'scroll');\n      });\n    }\n\n    if (this._preHeaderPanelScroller) {\n      this._bindingEventService.unbindByEventName(this._preHeaderPanelScroller, 'scroll');\n    }\n\n    if (this._topHeaderPanelScroller) {\n      this._bindingEventService.unbindByEventName(this._topHeaderPanelScroller, 'scroll');\n    }\n\n    this._bindingEventService.unbindByEventName(this._focusSink, 'keydown');\n    this._bindingEventService.unbindByEventName(this._focusSink2, 'keydown');\n\n    const resizeHandles = this._container.querySelectorAll('.slick-resizable-handle');\n    [].forEach.call(resizeHandles, (handle) => {\n      this._bindingEventService.unbindByEventName(handle, 'dblclick');\n    });\n\n    const headerColumns = this._container.querySelectorAll('.slick-header-column');\n    [].forEach.call(headerColumns, (column) => {\n      this._bindingEventService.unbindByEventName(column, 'mouseenter');\n      this._bindingEventService.unbindByEventName(column, 'mouseleave');\n\n      this._bindingEventService.unbindByEventName(column, 'mouseenter');\n      this._bindingEventService.unbindByEventName(column, 'mouseleave');\n    });\n\n    Utils.emptyElement(this._container);\n    this._container.classList.remove(this.uid);\n    this.clearAllTimers();\n\n    if (shouldDestroyAllElements) {\n      this.destroyAllElements();\n    }\n  }\n\n  /**\n   * Call destroy method, when exists, on all the instance(s) it found\n   *\n   * Given either a single instance or an array of instances (e.g. draggable, mousewheel, resizable),\n   * pops each one and calls its destroy method if available, then resets the input to an empty array\n   * (or null for a single instance). Returns the reset value.\n   *\n   * @params  instances - can be a single instance or a an array of instances\n   */\n  protected destroyAllInstances(inputInstances: null | InteractionBase | Array<InteractionBase>) {\n    if (inputInstances) {\n      const instances = Array.isArray(inputInstances) ? inputInstances : [inputInstances];\n      let instance: InteractionBase | undefined;\n      while (Utils.isDefined(instance = instances.pop())) {\n        if (instance && typeof instance.destroy === 'function') {\n          instance.destroy();\n        }\n      }\n    }\n    // reset instance(s)\n    inputInstances = (Array.isArray(inputInstances) ? [] : null);\n    return inputInstances;\n  }\n\n  /**\n   * Sets all internal references to DOM elements\n   * (e.g. canvas containers, headers, viewports, focus sinks, etc.)\n   * to null so that they can be garbage collected.\n   */\n  protected destroyAllElements() {\n    this._activeCanvasNode = null as any;\n    this._activeViewportNode = null as any;\n    this._boundAncestors = null as any;\n    this._canvas = null as any;\n    this._canvasTopL = null as any;\n    this._canvasTopR = null as any;\n    this._canvasBottomL = null as any;\n    this._canvasBottomR = null as any;\n    this._container = null as any;\n    this._focusSink = null as any;\n    this._focusSink2 = null as any;\n    this._groupHeaders = null as any;\n    this._groupHeadersL = null as any;\n    this._groupHeadersR = null as any;\n    this._headerL = null as any;\n    this._headerR = null as any;\n    this._headers = null as any;\n    this._headerRows = null as any;\n    this._headerRowL = null as any;\n    this._headerRowR = null as any;\n    this._headerRowSpacerL = null as any;\n    this._headerRowSpacerR = null as any;\n    this._headerRowScrollContainer = null as any;\n    this._headerRowScroller = null as any;\n    this._headerRowScrollerL = null as any;\n    this._headerRowScrollerR = null as any;\n    this._headerScrollContainer = null as any;\n    this._headerScroller = null as any;\n    this._headerScrollerL = null as any;\n    this._headerScrollerR = null as any;\n    this._hiddenParents = null as any;\n    this._footerRow = null as any;\n    this._footerRowL = null as any;\n    this._footerRowR = null as any;\n    this._footerRowSpacerL = null as any;\n    this._footerRowSpacerR = null as any;\n    this._footerRowScroller = null as any;\n    this._footerRowScrollerL = null as any;\n    this._footerRowScrollerR = null as any;\n    this._footerRowScrollContainer = null as any;\n    this._preHeaderPanel = null as any;\n    this._preHeaderPanelR = null as any;\n    this._preHeaderPanelScroller = null as any;\n    this._preHeaderPanelScrollerR = null as any;\n    this._preHeaderPanelSpacer = null as any;\n    this._preHeaderPanelSpacerR = null as any;\n    this._topPanels = null as any;\n    this._topPanelScrollers = null as any;\n    this._style = null as any;\n    this._topPanelScrollerL = null as any;\n    this._topPanelScrollerR = null as any;\n    this._topPanelL = null as any;\n    this._topPanelR = null as any;\n    this._paneHeaderL = null as any;\n    this._paneHeaderR = null as any;\n    this._paneTopL = null as any;\n    this._paneTopR = null as any;\n    this._paneBottomL = null as any;\n    this._paneBottomR = null as any;\n    this._viewport = null as any;\n    this._viewportTopL = null as any;\n    this._viewportTopR = null as any;\n    this._viewportBottomL = null as any;\n    this._viewportBottomR = null as any;\n    this._viewportScrollContainerX = null as any;\n    this._viewportScrollContainerY = null as any;\n  }\n\n  /** Returns an object containing all of the Grid options set on the grid. See a list of Grid Options here. */\n  getOptions(): O {\n    return this._options;\n  }\n\n  /**\n   * Get the Column ID of the currently frozen column or `null` when not frozen\n   * @returns {String|Number|null} Frozen Column ID\n   */\n  getFrozenColumnId(): string | number | null {\n    const frozenColIndex = this.getFrozenColumnIdx();\n    if (frozenColIndex >= 0 && this.columns[frozenColIndex]) {\n      return this.columns[frozenColIndex].id;\n    }\n    return null;\n  }\n\n  protected getFrozenColumnIdx(): number {\n    return this._options.frozenColumn ?? -1;\n  }\n\n  /**\n   * Extends grid options with a given hash. If an there is an active edit, the grid will attempt to commit the changes and only continue if the attempt succeeds.\n   * @param {Object} options - an object with configuration options.\n   * @param {Boolean} [suppressRender] - do we want to supress the grid re-rendering? (defaults to false)\n   * @param {Boolean} [suppressColumnSet] - do we want to supress the columns set, via \"setColumns()\" method? (defaults to false)\n   * @param {Boolean} [suppressSetOverflow] - do we want to suppress the call to `setOverflow`\n   */\n  setOptions(newOptions: Partial<O>, suppressRender?: boolean, suppressColumnSet?: boolean, suppressSetOverflow?: boolean): void {\n    this.prepareForOptionsChange();\n\n    if (this._options.enableAddRow !== newOptions.enableAddRow) {\n      this.invalidateRow(this.getDataLength());\n    }\n\n    // before applying column freeze, we need our viewports to be scrolled back to left to avoid misaligned column headers\n    if (newOptions.frozenColumn !== undefined && newOptions.frozenColumn >= 0) {\n      this._prevFrozenColumnIdx = this.getFrozenColumnIdx(); // keep ref of previous frozen column for later usage\n\n      // make sure the freeze is also valid without breaking the UI (e.g. we can't freeze columns on left canvas wider than visible canvas width in the browser)\n      if (!suppressColumnSet) {\n        this._invalidfrozenAlerted = false; // reset frozen alert\n      }\n      if (this.validateColumnFreezeWidth(newOptions.frozenColumn)) {\n        this.getViewports().forEach((vp) => (vp.scrollLeft = 0));\n        this.handleScroll(); // trigger scroll to realign column headers as well\n      } else {\n        newOptions.frozenColumn = this._prevFrozenColumnIdx < newOptions.frozenColumn ? this._prevFrozenColumnIdx : -1;\n      }\n    }\n\n    const originalOptions = Utils.extend(true, {}, this._options);\n    this._options = Utils.extend(this._options, newOptions);\n    this.trigger(this.onSetOptions, { optionsBefore: originalOptions, optionsAfter: this._options });\n\n    this.internal_setOptions(suppressRender, suppressColumnSet, suppressSetOverflow);\n  }\n\n  /**\n   * If option.mixinDefaults is true then external code maintains a reference to the options object. In this case there is no need\n   * to call setOptions() - changes can be made directly to the object. However setOptions() also performs some recalibration of the\n   * grid in reaction to changed options. activateChangedOptions call the same recalibration routines as setOptions() would have.\n   * @param {Boolean} [suppressRender] - do we want to supress the grid re-rendering? (defaults to false)\n   * @param {Boolean} [suppressColumnSet] - do we want to supress the columns set, via \"setColumns()\" method? (defaults to false)\n   * @param {Boolean} [suppressSetOverflow] - do we want to suppress the call to `setOverflow`\n   */\n  activateChangedOptions(suppressRender?: boolean, suppressColumnSet?: boolean, suppressSetOverflow?: boolean): void {\n    this.prepareForOptionsChange();\n    this.invalidateRow(this.getDataLength());\n\n    this.trigger(this.onActivateChangedOptions, { options: this._options });\n\n    this.internal_setOptions(suppressRender, suppressColumnSet, suppressSetOverflow);\n  }\n\n  /**\n   * Attempts to commit any active cell edit via the editor lock; if successful, calls makeActiveCellNormal to exit edit mode.\n   *\n   * @returns {void} - Does not return a value.\n   */\n  protected prepareForOptionsChange() {\n    if (!this.getEditorLock().commitCurrentEdit()) {\n      return;\n    }\n\n    this.makeActiveCellNormal();\n  }\n\n  /**\n   * Depending on new options, sets column header visibility, validates options, sets frozen options,\n   * forces viewport height recalculation if needed, updates viewport overflow, re-renders the grid (unless suppressed),\n   * sets the scroller elements, and reinitialises mouse wheel scrolling as needed.\n   *\n   * @param {boolean} [suppressRender] - If `true`, prevents the grid from re-rendering.\n   * @param {boolean} [suppressColumnSet] - If `true`, prevents the columns from being reset.\n   * @param {boolean} [suppressSetOverflow] - If `true`, prevents updating the viewport overflow setting.\n   */\n  protected internal_setOptions(suppressRender?: boolean, suppressColumnSet?: boolean, suppressSetOverflow?: boolean): void {\n    if (this._options.showColumnHeader !== undefined) {\n      this.setColumnHeaderVisibility(this._options.showColumnHeader);\n    }\n    this.validateAndEnforceOptions();\n    this.setFrozenOptions();\n\n    // when user changed frozen row option, we need to force a recalculation of each viewport heights\n    if (this._options.frozenBottom !== undefined) {\n      this.enforceFrozenRowHeightRecalc = true;\n    }\n\n    this._viewport.forEach((view) => {\n      view.style.overflowY = this._options.autoHeight ? 'hidden' : 'auto';\n    });\n    if (!suppressRender) {\n      this.render();\n    }\n\n    this.setScroller();\n    if (!suppressSetOverflow) {\n      this.setOverflow();\n    }\n\n    if (!suppressColumnSet) {\n      this.setColumns(this.columns);\n    }\n\n    if (this._options.enableMouseWheelScrollHandler && this._viewport && (!this.slickMouseWheelInstances || this.slickMouseWheelInstances.length === 0)) {\n      this._viewport.forEach((view) => {\n        this.slickMouseWheelInstances.push(MouseWheel({\n          element: view,\n          onMouseWheel: this.handleMouseWheel.bind(this)\n        }));\n      });\n    } else if (this._options.enableMouseWheelScrollHandler === false) {\n      this.destroyAllInstances(this.slickMouseWheelInstances); // remove scroll handler when option is disable\n    }\n  }\n\n  /**\n   *\n   * Ensures consistency in option setting, by thastIF autoHeight IS enabled, leaveSpaceForNewRows is set to FALSE.\n   * And, if forceFitColumns is True, then autosizeColsMode is set to LegacyForceFit.\n   */\n  validateAndEnforceOptions(): void {\n    if (this._options.autoHeight) {\n      this._options.leaveSpaceForNewRows = false;\n    }\n    if (this._options.forceFitColumns) {\n      this._options.autosizeColsMode = GridAutosizeColsMode.LegacyForceFit;\n    }\n    // make sure the freeze is also valid without breaking the UI (e.g. we can't left freeze columns wider than visible left canvas width)\n    if (!this.validateColumnFreezeWidth(this._options.frozenColumn)) {\n      this._options.frozenColumn = this._prevFrozenColumnIdx < this._options.frozenColumn! ? this._prevFrozenColumnIdx : -1;\n    }\n  }\n\n  /**\n   * Unregisters a current selection model and registers a new one. See the definition of SelectionModel for more information.\n   * @param {Object} selectionModel A SelectionModel.\n   */\n  setSelectionModel(model: SelectionModel) {\n    if (this.selectionModel) {\n      this.selectionModel.onSelectedRangesChanged.unsubscribe(this.handleSelectedRangesChanged.bind(this));\n      this.selectionModel.destroy?.();\n    }\n\n    this.selectionModel = model;\n    if (this.selectionModel) {\n      this.selectionModel.init(this as unknown as SlickGridModel);\n      this.selectionModel.onSelectedRangesChanged.subscribe(this.handleSelectedRangesChanged.bind(this));\n    }\n  }\n\n  /** Returns the current SelectionModel. See here for more information about SelectionModels. */\n  getSelectionModel() {\n    return this.selectionModel;\n  }\n\n  /** add/remove frozen class to left headers/footer when defined */\n  protected setPaneFrozenClasses(): void {\n    const classAction = this.hasFrozenColumns() ? 'add' : 'remove';\n    for (const elm of [this._paneHeaderL, this._paneTopL, this._paneBottomL]) {\n      elm.classList[classAction]('frozen');\n    }\n  }\n\n  //////////////////////////////////////////////////////////////////////\n  // End Grid and DOM Initialisation\n  //////////////////////////////////////////////////////////////////////\n\n\n  //////////////////////////////////////////////////////////////////////\n  // Column Management, Headers and Footers\n  //////////////////////////////////////////////////////////////////////\n\n  // Returns a boolean indicating whether the grid is configured with frozen columns.\n  protected hasFrozenColumns() {\n    return this._options.frozenColumn! > -1;\n  }\n\n  /**\n   * Updates an existing column definition and a corresponding header DOM element with the new title and tooltip.\n   * @param {Number|String} columnId Column id.\n   * @param {string | HTMLElement | DocumentFragment} [title] New column name.\n   * @param {String} [toolTip] New column tooltip.\n   */\n  updateColumnHeader(columnId: number | string, title?: string | HTMLElement | DocumentFragment, toolTip?: string) {\n    if (this.initialized) {\n      const idx = this.getColumnIndex(columnId);\n      if (!Utils.isDefined(idx)) {\n        return;\n      }\n\n      const columnDef = this.columns[idx];\n      const header: HTMLElement | undefined = this.getColumnByIndex(idx);\n      if (header) {\n        if (title !== undefined) {\n          this.columns[idx].name = title;\n        }\n        if (toolTip !== undefined) {\n          this.columns[idx].toolTip = toolTip;\n        }\n\n        this.trigger(this.onBeforeHeaderCellDestroy, {\n          node: header,\n          column: columnDef,\n          grid: this\n        });\n\n        header.setAttribute('title', toolTip || '');\n        if (title !== undefined) {\n          this.applyHtmlCode(header.children[0] as HTMLElement, title);\n        }\n\n        this.trigger(this.onHeaderCellRendered, {\n          node: header,\n          column: columnDef,\n          grid: this\n        });\n      }\n    }\n  }\n\n  /**\n   * Get the Header DOM element\n   * @param {C} columnDef - column definition\n   */\n  getHeader(columnDef: C) {\n    if (!columnDef) {\n      return this.hasFrozenColumns() ? this._headers : this._headerL;\n    }\n    const idx = this.getColumnIndex(columnDef.id);\n    return this.hasFrozenColumns() ? ((idx <= this._options.frozenColumn!) ? this._headerL : this._headerR) : this._headerL;\n  }\n\n  /**\n   * Get a specific Header Column DOM element by its column Id or index\n   * @param {Number|String} columnIdOrIdx - column Id or index\n   */\n  getHeaderColumn(columnIdOrIdx: number | string) {\n    const idx = (typeof columnIdOrIdx === 'number' ? columnIdOrIdx : this.getColumnIndex(columnIdOrIdx));\n    const targetHeader = this.hasFrozenColumns() ? ((idx <= this._options.frozenColumn!) ? this._headerL : this._headerR) : this._headerL;\n    const targetIndex = this.hasFrozenColumns() ? ((idx <= this._options.frozenColumn!) ? idx : idx - this._options.frozenColumn! - 1) : idx;\n\n    return targetHeader.children[targetIndex] as HTMLDivElement;\n  }\n\n  /** Get the Header Row DOM element */\n  getHeaderRow() {\n    return this.hasFrozenColumns() ? this._headerRows : this._headerRows[0];\n  }\n\n  /** Get the Footer DOM element */\n  getFooterRow() {\n    return this.hasFrozenColumns() ? this._footerRow : this._footerRow[0];\n  }\n\n  /**\n   * Get Header Row Column DOM element by its column Id or index\n   * @param {Number|String} columnIdOrIdx - column Id or index\n   */\n  getHeaderRowColumn(columnIdOrIdx: number | string) {\n    let idx = (typeof columnIdOrIdx === 'number' ? columnIdOrIdx : this.getColumnIndex(columnIdOrIdx));\n    let headerRowTarget: HTMLDivElement;\n\n    if (this.hasFrozenColumns()) {\n      if (idx <= this._options.frozenColumn!) {\n        headerRowTarget = this._headerRowL;\n      } else {\n        headerRowTarget = this._headerRowR;\n        idx -= this._options.frozenColumn! + 1;\n      }\n    } else {\n      headerRowTarget = this._headerRowL;\n    }\n\n    return headerRowTarget.children[idx] as HTMLDivElement;\n  }\n\n  /**\n   * Get the Footer Row Column DOM element by its column Id or index\n   * @param {Number|String} columnIdOrIdx - column Id or index\n   */\n  getFooterRowColumn(columnIdOrIdx: number | string) {\n    let idx = (typeof columnIdOrIdx === 'number' ? columnIdOrIdx : this.getColumnIndex(columnIdOrIdx));\n    let footerRowTarget: HTMLDivElement;\n\n    if (this.hasFrozenColumns()) {\n      if (idx <= this._options.frozenColumn!) {\n        footerRowTarget = this._footerRowL;\n      } else {\n        footerRowTarget = this._footerRowR;\n\n        idx -= this._options.frozenColumn! + 1;\n      }\n    } else {\n      footerRowTarget = this._footerRowL;\n    }\n\n    return footerRowTarget.children[idx] as HTMLDivElement;\n  }\n\n  /**\n   * If footer rows are enabled, clears existing footer cells then iterates over all columns.\n   * For each visible column, it creates a footer cell element (adding \u201Cfrozen\u201D classes if needed),\n   * stores the column definition in the element\u2019s storage, and triggers the onFooterRowCellRendered event.\n   */\n  protected createColumnFooter() {\n    if (this._options.createFooterRow) {\n      this._footerRow.forEach((footer) => {\n        const columnElements = footer.querySelectorAll('.slick-footerrow-column');\n        columnElements.forEach((column) => {\n          const columnDef = Utils.storage.get(column, 'column');\n          this.trigger(this.onBeforeFooterRowCellDestroy, {\n            node: column,\n            column: columnDef,\n            grid: this\n          });\n        });\n      });\n\n      Utils.emptyElement(this._footerRowL);\n      Utils.emptyElement(this._footerRowR);\n\n      for (let i = 0; i < this.columns.length; i++) {\n        const m = this.columns[i];\n        if (!m || m.hidden) { continue; }\n\n        const footerRowCell = Utils.createDomElement('div', { className: `ui-state-default slick-state-default slick-footerrow-column l${i} r${i}` }, this.hasFrozenColumns() && (i > this._options.frozenColumn!) ? this._footerRowR : this._footerRowL);\n        const className = this.hasFrozenColumns() && i <= this._options.frozenColumn! ? 'frozen' : null;\n        if (className) {\n          footerRowCell.classList.add(className);\n        }\n\n        Utils.storage.put(footerRowCell, 'column', m);\n\n        this.trigger(this.onFooterRowCellRendered, {\n          node: footerRowCell,\n          column: m,\n          grid: this\n        });\n      }\n    }\n  }\n\n  /**\n   * For each header container, binds a click event that\u2014\n   *    if the clicked header is sortable and no column resizing is in progress\u2014\n   *      --> toggles the sort direction (or adds/removes the column in a multi\u2013column sort),\n   *      --> triggers onBeforeSort\n   *      --> and if not cancelled, updates the sort columns and triggers onSort.\n   */\n  protected setupColumnSort() {\n    this._headers.forEach((header) => {\n      this._bindingEventService.bind(header, 'click', (e: any) => {\n        if (this.columnResizeDragging) {\n          return;\n        }\n\n        if (e.target.classList.contains('slick-resizable-handle')) {\n          return;\n        }\n\n        const coll = e.target.closest('.slick-header-column');\n        if (!coll) {\n          return;\n        }\n\n        const column = Utils.storage.get(coll, 'column');\n        if (column.sortable) {\n          if (!this.getEditorLock()?.commitCurrentEdit()) {\n            return;\n          }\n\n          const previousSortColumns = this.sortColumns.slice();\n          let sortColumn: ColumnSort | null = null;\n          let i = 0;\n          for (; i < this.sortColumns.length; i++) {\n            if (this.sortColumns[i].columnId === column.id) {\n              sortColumn = this.sortColumns[i];\n              sortColumn.sortAsc = !sortColumn.sortAsc;\n              break;\n            }\n          }\n          const hadSortCol = !!sortColumn;\n\n          if (this._options.tristateMultiColumnSort) {\n            if (!sortColumn) {\n              sortColumn = { columnId: column.id, sortAsc: column.defaultSortAsc, sortCol: column };\n            }\n            if (hadSortCol && sortColumn.sortAsc) {\n              // three state: remove sort rather than go back to ASC\n              this.sortColumns.splice(i, 1);\n              sortColumn = null;\n            }\n            if (!this._options.multiColumnSort) {\n              this.sortColumns = [];\n            }\n            if (sortColumn && (!hadSortCol || !this._options.multiColumnSort)) {\n              this.sortColumns.push(sortColumn);\n            }\n          } else {\n            // legacy behaviour\n            if (e.metaKey && this._options.multiColumnSort) {\n              if (sortColumn) {\n                this.sortColumns.splice(i, 1);\n              }\n            } else {\n              if ((!e.shiftKey && !e.metaKey) || !this._options.multiColumnSort) {\n                this.sortColumns = [];\n              }\n\n              if (!sortColumn) {\n                sortColumn = { columnId: column.id, sortAsc: column.defaultSortAsc, sortCol: column };\n                this.sortColumns.push(sortColumn);\n              } else if (this.sortColumns.length === 0) {\n                this.sortColumns.push(sortColumn);\n              }\n            }\n          }\n\n          let onSortArgs;\n          if (!this._options.multiColumnSort) {\n            onSortArgs = {\n              multiColumnSort: false,\n              previousSortColumns,\n              columnId: (this.sortColumns.length > 0 ? column.id : null),\n              sortCol: (this.sortColumns.length > 0 ? column : null),\n              sortAsc: (this.sortColumns.length > 0 ? this.sortColumns[0].sortAsc : true)\n            };\n          } else {\n            onSortArgs = {\n              multiColumnSort: true,\n              previousSortColumns,\n              sortCols: this.sortColumns.map((col) => {\n                const tempCol = this.columns[this.getColumnIndex(col.columnId)];\n                return !tempCol || tempCol.hidden ? null : { columnId: tempCol.id, sortCol: tempCol, sortAsc: col.sortAsc };\n              }).filter((el) => el)\n            };\n          }\n\n          if (this.trigger(this.onBeforeSort, onSortArgs, e).getReturnValue() !== false) {\n            this.setSortColumns(this.sortColumns);\n            this.trigger(this.onSort, onSortArgs, e);\n          }\n        }\n      });\n    });\n  }\n\n  /**\n   * Clears any existing header cells and header row cells, recalculates header widths,\n   * then iterates over each visible column to create header cell elements\n   * (and header row cells if enabled) with appropriate content, CSS classes, event bindings,\n   * and sort indicator elements. Also triggers before\u2013destroy and rendered events as needed.\n   */\n  protected createColumnHeaders() {\n    this._headers.forEach((header) => {\n      const columnElements = header.querySelectorAll('.slick-header-column');\n      columnElements.forEach((column) => {\n        const columnDef = Utils.storage.get(column, 'column');\n        if (columnDef) {\n          this.trigger(this.onBeforeHeaderCellDestroy, {\n            node: column,\n            column: columnDef,\n            grid: this\n          });\n        }\n      });\n    });\n\n    Utils.emptyElement(this._headerL);\n    Utils.emptyElement(this._headerR);\n\n    this.getHeadersWidth();\n\n    Utils.width(this._headerL, this.headersWidthL);\n    Utils.width(this._headerR, this.headersWidthR);\n\n    this._headerRows.forEach((row) => {\n      const columnElements = row.querySelectorAll('.slick-headerrow-column');\n      columnElements.forEach((column) => {\n        const columnDef = Utils.storage.get(column, 'column');\n        if (columnDef) {\n          this.trigger(this.onBeforeHeaderRowCellDestroy, {\n            node: this,\n            column: columnDef,\n            grid: this\n          });\n        }\n      });\n    });\n\n    Utils.emptyElement(this._headerRowL);\n    Utils.emptyElement(this._headerRowR);\n\n    if (this._options.createFooterRow) {\n      const footerRowLColumnElements = this._footerRowL.querySelectorAll('.slick-footerrow-column');\n      footerRowLColumnElements.forEach((column) => {\n        const columnDef = Utils.storage.get(column, 'column');\n        if (columnDef) {\n          this.trigger(this.onBeforeFooterRowCellDestroy, {\n            node: this,\n            column: columnDef,\n            grid: this\n          });\n        }\n      });\n      Utils.emptyElement(this._footerRowL);\n\n      if (this.hasFrozenColumns()) {\n        const footerRowRColumnElements = this._footerRowR.querySelectorAll('.slick-footerrow-column');\n        footerRowRColumnElements.forEach((column) => {\n          const columnDef = Utils.storage.get(column, 'column');\n          if (columnDef) {\n            this.trigger(this.onBeforeFooterRowCellDestroy, {\n              node: this,\n              column: columnDef,\n              grid: this\n            });\n          }\n        });\n        Utils.emptyElement(this._footerRowR);\n      }\n    }\n\n    for (let i = 0; i < this.columns.length; i++) {\n      const m: C = this.columns[i];\n      if (m.hidden) { continue; }\n\n      const headerTarget = this.hasFrozenColumns() ? ((i <= this._options.frozenColumn!) ? this._headerL : this._headerR) : this._headerL;\n      const headerRowTarget = this.hasFrozenColumns() ? ((i <= this._options.frozenColumn!) ? this._headerRowL : this._headerRowR) : this._headerRowL;\n\n      const header = Utils.createDomElement('div', { id: `${this.uid + m.id}`, dataset: { id: String(m.id) }, role: 'columnheader', className: 'ui-state-default slick-state-default slick-header-column' }, headerTarget);\n      if (m.toolTip) {\n        header.title = m.toolTip;\n      }\n      if (!m.reorderable) {\n        header.classList.add(this._options.unorderableColumnCssClass!);\n      }\n      const colNameElm = Utils.createDomElement('span', { className: 'slick-column-name' }, header);\n      this.applyHtmlCode(colNameElm, m.name as string);\n\n      Utils.width(header, m.width! - this.headerColumnWidthDiff);\n\n      let classname = m.headerCssClass || null;\n      if (classname) {\n        header.classList.add(...Utils.classNameToList(classname));\n      }\n      classname = this.hasFrozenColumns() && i <= this._options.frozenColumn! ? 'frozen' : null;\n      if (classname) {\n        header.classList.add(classname);\n      }\n\n      this._bindingEventService.bind(header, 'mouseenter', this.handleHeaderMouseEnter.bind(this) as EventListener);\n      this._bindingEventService.bind(header, 'mouseleave', this.handleHeaderMouseLeave.bind(this) as EventListener);\n\n      Utils.storage.put(header, 'column', m);\n\n      if (this._options.enableColumnReorder || m.sortable) {\n        this._bindingEventService.bind(header, 'mouseenter', this.handleHeaderMouseHoverOn.bind(this) as EventListener);\n        this._bindingEventService.bind(header, 'mouseleave', this.handleHeaderMouseHoverOff.bind(this) as EventListener);\n      }\n\n      if (m.hasOwnProperty('headerCellAttrs') && m.headerCellAttrs instanceof Object) {\n        Object.keys(m.headerCellAttrs).forEach(key => {\n          if (m.headerCellAttrs.hasOwnProperty(key)) {\n            header.setAttribute(key, m.headerCellAttrs[key]);\n          }\n        });\n      }\n\n      if (m.sortable) {\n        header.classList.add('slick-header-sortable');\n        Utils.createDomElement('div', { className: `slick-sort-indicator ${this._options.numberedMultiColumnSort && !this._options.sortColNumberInSeparateSpan ? ' slick-sort-indicator-numbered' : ''}` }, header);\n        if (this._options.numberedMultiColumnSort && this._options.sortColNumberInSeparateSpan) {\n          Utils.createDomElement('div', { className: 'slick-sort-indicator-numbered' }, header);\n        }\n      }\n\n      this.trigger(this.onHeaderCellRendered, {\n        node: header,\n        column: m,\n        grid: this\n      });\n\n      if (this._options.showHeaderRow) {\n        const headerRowCell = Utils.createDomElement('div', { className: `ui-state-default slick-state-default slick-headerrow-column l${i} r${i}` }, headerRowTarget);\n        const frozenClasses = this.hasFrozenColumns() && i <= this._options.frozenColumn! ? 'frozen' : null;\n        if (frozenClasses) {\n          headerRowCell.classList.add(frozenClasses);\n        }\n\n        this._bindingEventService.bind(headerRowCell, 'mouseenter', this.handleHeaderRowMouseEnter.bind(this) as EventListener);\n        this._bindingEventService.bind(headerRowCell, 'mouseleave', this.handleHeaderRowMouseLeave.bind(this) as EventListener);\n\n        Utils.storage.put(headerRowCell, 'column', m);\n\n        this.trigger(this.onHeaderRowCellRendered, {\n          node: headerRowCell,\n          column: m,\n          grid: this\n        });\n      }\n      if (this._options.createFooterRow && this._options.showFooterRow) {\n        const footerRowTarget = this.hasFrozenColumns() ? ((i <= this._options.frozenColumn!) ? this._footerRow[0] : this._footerRow[1]) : this._footerRow[0];\n        const footerRowCell = Utils.createDomElement('div', { className: `ui-state-default slick-state-default slick-footerrow-column l${i} r${i}` }, footerRowTarget);\n        Utils.storage.put(footerRowCell, 'column', m);\n\n        this.trigger(this.onFooterRowCellRendered, {\n          node: footerRowCell,\n          column: m,\n          grid: this\n        });\n      }\n    }\n\n    this.setSortColumns(this.sortColumns);\n    this.setupColumnResize();\n    if (this._options.enableColumnReorder) {\n      if (typeof this._options.enableColumnReorder === 'function') {\n        this._options.enableColumnReorder(this as unknown as SlickGridModel, this._headers, this.headerColumnWidthDiff, this.setColumns as any, this.setupColumnResize, this.columns, this.getColumnIndex, this.uid, this.trigger);\n      } else {\n        this.setupColumnReorder();\n      }\n    }\n  }\n\n  /**\n   * Destroys any existing sortable instances and creates new ones on the left and right header\n   * containers using the Sortable library. Configures options including animation,\n   * drag handle selectors, auto-scroll, and callbacks (onStart, onEnd) that\n   * update the column order, set columns, trigger onColumnsReordered, and reapply column resizing.\n   */\n  protected setupColumnReorder() {\n    this.sortableSideLeftInstance?.destroy();\n    this.sortableSideRightInstance?.destroy();\n\n    let columnScrollTimer: any = null;\n\n    const scrollColumnsRight = () => this._viewportScrollContainerX.scrollLeft = this._viewportScrollContainerX.scrollLeft + 10;\n    const scrollColumnsLeft = () => this._viewportScrollContainerX.scrollLeft = this._viewportScrollContainerX.scrollLeft - 10;\n    let prevColumnIds: Array<string | number> = [];\n\n    let canDragScroll = false;\n    const sortableOptions = {\n      animation: 50,\n      direction: 'horizontal',\n      chosenClass: 'slick-header-column-active',\n      ghostClass: 'slick-sortable-placeholder',\n      draggable: '.slick-header-column',\n      dragoverBubble: false,\n      preventOnFilter: false, // allow column to be resized even when they are not orderable\n      revertClone: true,\n      scroll: !this.hasFrozenColumns(), // enable auto-scroll\n      // lock unorderable columns by using a combo of filter + onMove\n      filter: `.${this._options.unorderableColumnCssClass}`,\n      onMove: (event: MouseEvent & { related: HTMLElement; }) => {\n        return !event.related.classList.contains(this._options.unorderableColumnCssClass as string);\n      },\n      onStart: (e: SortableEvent) => {\n        e.item.classList.add('slick-header-column-active');\n        canDragScroll = !this.hasFrozenColumns() || Utils.offset(e.item)!.left > Utils.offset(this._viewportScrollContainerX)!.left;\n\n        if (canDragScroll && e.originalEvent.pageX > this._container.clientWidth) {\n          if (!(columnScrollTimer)) {\n            columnScrollTimer = window.setInterval(scrollColumnsRight, 100);\n          }\n        } else if (canDragScroll && e.originalEvent.pageX < Utils.offset(this._viewportScrollContainerX)!.left) {\n          if (!(columnScrollTimer)) {\n            columnScrollTimer = window.setInterval(scrollColumnsLeft, 100);\n          }\n        } else {\n          window.clearInterval(columnScrollTimer);\n          columnScrollTimer = null;\n        }\n        prevColumnIds = this.columns.map((c) => c.id);\n      },\n      onEnd: (e: SortableEvent) => {\n        e.item.classList.remove('slick-header-column-active');\n        clearInterval(columnScrollTimer);\n        const prevScrollLeft = this.scrollLeft;\n\n        if (!this.getEditorLock()?.commitCurrentEdit()) {\n          return;\n        }\n\n        let reorderedIds = this.sortableSideLeftInstance?.toArray() ?? [];\n        reorderedIds = reorderedIds.concat(this.sortableSideRightInstance?.toArray() ?? []);\n\n        const reorderedColumns: C[] = [];\n        for (let i = 0; i < reorderedIds.length; i++) {\n          reorderedColumns.push(this.columns[this.getColumnIndex(reorderedIds[i])]);\n        }\n\n        e.stopPropagation();\n        if (!this.arrayEquals(prevColumnIds, reorderedIds)) {\n          this.setColumns(reorderedColumns);\n          // reapply previous scroll position since it might move back to x=0 after calling `setColumns()` (especially when `frozenColumn` is set)\n          this.scrollToX(prevScrollLeft);\n          this.trigger(this.onColumnsReordered, { impactedColumns: this.columns, previousColumnOrder: prevColumnIds });\n          this.setupColumnResize();\n        }\n        if (this.activeCellNode) {\n          this.setFocus(); // refocus on active cell\n        }\n      },\n    } as SortableOptions;\n\n    this.sortableSideLeftInstance = Sortable.create(this._headerL, sortableOptions);\n    this.sortableSideRightInstance = Sortable.create(this._headerR, sortableOptions);\n  }\n\n  /**\n   * Returns a concatenated array containing the children (header column elements) from both the left and right header containers.\n   * @returns {HTMLElement[]} - An array of header column elements.\n   */\n  protected getHeaderChildren() {\n    const a = Array.from(this._headers[0].children);\n    const b = Array.from(this._headers[1].children);\n    return a.concat(b) as HTMLElement[];\n  }\n\n  /**\n   * When a resizable handle is double\u2013clicked, extracts the column identifier from the parent element\u2019s id\n   * (by removing the grid uid) and triggers the onColumnsResizeDblClick event with that identifier.\n   * @param {MouseEvent & { target: HTMLDivElement }} evt - The double-click event on the resizable handle.\n   */\n  protected handleResizeableDoubleClick(evt: MouseEvent & { target: HTMLDivElement; }) {\n    const triggeredByColumn = evt.target.parentElement!.id.replace(this.uid, '');\n    this.trigger(this.onColumnsResizeDblClick, { triggeredByColumn });\n  }\n\n  /**\n   * Ensures the Resizable module is available and then iterates over header children to remove\n   * any existing resizable handles. Determines which columns are resizable (tracking the first\n   * and last resizable columns) and for each eligible column, creates a resizable handle,\n   * binds a double\u2013click event, and creates a Resizable instance with callbacks for onResizeStart,\n   * onResize, and onResizeEnd. These callbacks manage column width adjustments (including force\u2013fit\n   * and frozen column considerations), update header and canvas widths, trigger related events,\n   * and re\u2013render the grid as needed.\n   * @returns {void}\n   */\n  protected setupColumnResize() {\n    if (typeof Resizable === 'undefined') {\n      throw new Error(`Slick.Resizable is undefined, make sure to import \"slick.interactions.js\"`);\n    }\n\n    let j: number;\n    let k: number;\n    let c: C;\n    let pageX: number;\n    let minPageX: number;\n    let maxPageX: number;\n    let firstResizable: number | undefined;\n    let lastResizable = -1;\n    let frozenLeftColMaxWidth = 0;\n\n    const children: HTMLElement[] = this.getHeaderChildren();\n    const vc = this.getVisibleColumns();\n    for (let i = 0; i < children.length; i++) {\n      const child = children[i];\n      const handles = child.querySelectorAll('.slick-resizable-handle');\n      handles.forEach((handle) => handle.remove());\n\n      if (i >= vc.length || !vc[i]) {\n        continue;\n      }\n\n      if (vc[i].resizable) {\n        if (firstResizable === undefined) {\n          firstResizable = i;\n        }\n        lastResizable = i;\n      }\n    }\n\n    if (firstResizable === undefined) {\n      return;\n    }\n\n    for (let i = 0; i < children.length; i++) {\n      const colElm = children[i];\n\n      if (i >= vc.length || !vc[i]) {\n        continue;\n      }\n      if (i < firstResizable || (this._options.forceFitColumns && i >= lastResizable)) {\n        continue;\n      }\n\n      const resizeableHandle = Utils.createDomElement('div', { className: 'slick-resizable-handle', role: 'separator', ariaOrientation: 'horizontal' }, colElm);\n      this._bindingEventService.bind(resizeableHandle, 'dblclick', this.handleResizeableDoubleClick.bind(this) as EventListener);\n\n      this.slickResizableInstances.push(\n        Resizable({\n          resizeableElement: colElm as HTMLElement,\n          resizeableHandleElement: resizeableHandle,\n          onResizeStart: (e, resizeElms): boolean | void => {\n            const targetEvent = (e as TouchEvent).touches ? (e as TouchEvent).changedTouches[0] : e;\n            if (!this.getEditorLock()?.commitCurrentEdit()) {\n              return false;\n            }\n            pageX = (targetEvent as MouseEvent).pageX;\n            frozenLeftColMaxWidth = 0;\n            resizeElms.resizeableElement.classList.add('slick-header-column-active');\n            let shrinkLeewayOnRight: number | null = null;\n            let stretchLeewayOnRight: number | null = null;\n            // lock each column's width option to current width\n            for (let pw = 0; pw < children.length; pw++) {\n              if (pw >= vc.length || !vc[pw]) {\n                continue;\n              }\n              vc[pw].previousWidth = children[pw].offsetWidth;\n            }\n            if (this._options.forceFitColumns) {\n              shrinkLeewayOnRight = 0;\n              stretchLeewayOnRight = 0;\n              // colums on right affect maxPageX/minPageX\n              for (j = i + 1; j < vc.length; j++) {\n                c = vc[j];\n                if (c?.resizable) {\n                  if (stretchLeewayOnRight !== null) {\n                    if (c.maxWidth) {\n                      stretchLeewayOnRight += c.maxWidth - (c.previousWidth || 0);\n                    } else {\n                      stretchLeewayOnRight = null;\n                    }\n                  }\n                  shrinkLeewayOnRight += (c.previousWidth || 0) - Math.max(c.minWidth || 0, this.absoluteColumnMinWidth);\n                }\n              }\n            }\n            let shrinkLeewayOnLeft = 0;\n            let stretchLeewayOnLeft: number | null = 0;\n            for (j = 0; j <= i; j++) {\n              // columns on left only affect minPageX\n              c = vc[j];\n              if (c?.resizable) {\n                if (stretchLeewayOnLeft !== null) {\n                  if (c.maxWidth) {\n                    stretchLeewayOnLeft += c.maxWidth - (c.previousWidth || 0);\n                  } else {\n                    stretchLeewayOnLeft = null;\n                  }\n                }\n                shrinkLeewayOnLeft += (c.previousWidth || 0) - Math.max(c.minWidth || 0, this.absoluteColumnMinWidth);\n              }\n            }\n            if (shrinkLeewayOnRight === null) {\n              shrinkLeewayOnRight = 100000;\n            }\n            if (shrinkLeewayOnLeft === null) {\n              shrinkLeewayOnLeft = 100000;\n            }\n            if (stretchLeewayOnRight === null) {\n              stretchLeewayOnRight = 100000;\n            }\n            if (stretchLeewayOnLeft === null) {\n              stretchLeewayOnLeft = 100000;\n            }\n            maxPageX = pageX + Math.min(shrinkLeewayOnRight, stretchLeewayOnLeft);\n            minPageX = pageX - Math.min(shrinkLeewayOnLeft, stretchLeewayOnRight);\n          },\n          onResize: (e, resizeElms) => {\n            const targetEvent = (e as TouchEvent).touches ? (e as TouchEvent).changedTouches[0] : e;\n            this.columnResizeDragging = true;\n            let actualMinWidth;\n            const d = Math.min(maxPageX, Math.max(minPageX, (targetEvent as MouseEvent).pageX)) - pageX;\n            let x;\n            let newCanvasWidthL = 0;\n            let newCanvasWidthR = 0;\n            const viewportWidth = this.getViewportInnerWidth();\n\n            if (d < 0) { // shrink column\n              x = d;\n\n              for (j = i; j >= 0; j--) {\n                c = vc[j];\n                if (c?.resizable && !c.hidden) {\n                  actualMinWidth = Math.max(c.minWidth || 0, this.absoluteColumnMinWidth);\n                  if (x && (c.previousWidth || 0) + x < actualMinWidth) {\n                    x += (c.previousWidth || 0) - actualMinWidth;\n                    c.width = actualMinWidth;\n                  } else {\n                    c.width = (c.previousWidth || 0) + x;\n                    x = 0;\n                  }\n                }\n              }\n\n              for (k = 0; k <= i; k++) {\n                c = vc[k];\n                if (!c || c.hidden) { continue; }\n\n                if (this.hasFrozenColumns() && (k > this._options.frozenColumn!)) {\n                  newCanvasWidthR += c.width || 0;\n                } else {\n                  newCanvasWidthL += c.width || 0;\n                }\n              }\n\n              if (this._options.forceFitColumns) {\n                x = -d;\n                for (j = i + 1; j < vc.length; j++) {\n                  c = vc[j];\n                  if (!c || c.hidden) { continue; }\n                  if (c.resizable) {\n                    if (x && c.maxWidth && (c.maxWidth - (c.previousWidth || 0) < x)) {\n                      x -= c.maxWidth - (c.previousWidth || 0);\n                      c.width = c.maxWidth;\n                    } else {\n                      c.width = (c.previousWidth || 0) + x;\n                      x = 0;\n                    }\n\n                    if (this.hasFrozenColumns() && (j > this._options.frozenColumn!)) {\n                      newCanvasWidthR += c.width || 0;\n                    } else {\n                      newCanvasWidthL += c.width || 0;\n                    }\n                  }\n                }\n              } else {\n                for (j = i + 1; j < vc.length; j++) {\n                  c = vc[j];\n                  if (!c || c.hidden) { continue; }\n\n                  if (this.hasFrozenColumns() && (j > this._options.frozenColumn!)) {\n                    newCanvasWidthR += c.width || 0;\n                  } else {\n                    newCanvasWidthL += c.width || 0;\n                  }\n                }\n              }\n\n              if (this._options.forceFitColumns) {\n                x = -d;\n                for (j = i + 1; j < vc.length; j++) {\n                  c = vc[j];\n                  if (!c || c.hidden) { continue; }\n                  if (c.resizable) {\n                    if (x && c.maxWidth && (c.maxWidth - (c.previousWidth || 0) < x)) {\n                      x -= c.maxWidth - (c.previousWidth || 0);\n                      c.width = c.maxWidth;\n                    } else {\n                      c.width = (c.previousWidth || 0) + x;\n                      x = 0;\n                    }\n                  }\n                }\n              }\n            } else { // stretch column\n              x = d;\n\n              newCanvasWidthL = 0;\n              newCanvasWidthR = 0;\n\n              for (j = i; j >= 0; j--) {\n                c = vc[j];\n                if (!c || c.hidden) { continue; }\n                if (c.resizable) {\n                  if (x && c.maxWidth && (c.maxWidth - (c.previousWidth || 0) < x)) {\n                    x -= c.maxWidth - (c.previousWidth || 0);\n                    c.width = c.maxWidth;\n                  } else {\n                    const newWidth = (c.previousWidth || 0) + x;\n                    const resizedCanvasWidthL = this.canvasWidthL + x;\n\n                    if (this.hasFrozenColumns() && (j <= this._options.frozenColumn!)) {\n                      // if we're on the left frozen side, we need to make sure that our left section width never goes over the total viewport width\n                      if (newWidth > frozenLeftColMaxWidth && resizedCanvasWidthL < (viewportWidth - this._options.frozenRightViewportMinWidth!)) {\n                        frozenLeftColMaxWidth = newWidth; // keep max column width ref, if we go over the limit this number will stop increasing\n                      }\n                      c.width = ((resizedCanvasWidthL + this._options.frozenRightViewportMinWidth!) > viewportWidth) ? frozenLeftColMaxWidth : newWidth;\n                    } else {\n                      c.width = newWidth;\n                    }\n                    x = 0;\n                  }\n                }\n              }\n\n              for (k = 0; k <= i; k++) {\n                c = vc[k];\n                if (!c || c.hidden) { continue; }\n\n                if (this.hasFrozenColumns() && (k > this._options.frozenColumn!)) {\n                  newCanvasWidthR += c.width || 0;\n                } else {\n                  newCanvasWidthL += c.width || 0;\n                }\n              }\n\n              if (this._options.forceFitColumns) {\n                x = -d;\n                for (j = i + 1; j < vc.length; j++) {\n                  c = vc[j];\n                  if (!c || c.hidden) { continue; }\n                  if (c.resizable) {\n                    actualMinWidth = Math.max(c.minWidth || 0, this.absoluteColumnMinWidth);\n                    if (x && (c.previousWidth || 0) + x < actualMinWidth) {\n                      x += (c.previousWidth || 0) - actualMinWidth;\n                      c.width = actualMinWidth;\n                    } else {\n                      c.width = (c.previousWidth || 0) + x;\n                      x = 0;\n                    }\n\n                    if (this.hasFrozenColumns() && (j > this._options.frozenColumn!)) {\n                      newCanvasWidthR += c.width || 0;\n                    } else {\n                      newCanvasWidthL += c.width || 0;\n                    }\n                  }\n                }\n              } else {\n                for (j = i + 1; j < vc.length; j++) {\n                  c = vc[j];\n                  if (!c || c.hidden) { continue; }\n\n                  if (this.hasFrozenColumns() && (j > this._options.frozenColumn!)) {\n                    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n                    newCanvasWidthR += c.width || 0;\n                  } else {\n                    newCanvasWidthL += c.width || 0;\n                  }\n                }\n              }\n            }\n\n            if (this.hasFrozenColumns() && newCanvasWidthL !== this.canvasWidthL) {\n              Utils.width(this._headerL, newCanvasWidthL + 1000);\n              Utils.setStyleSize(this._paneHeaderR, 'left', newCanvasWidthL);\n            }\n\n            this.applyColumnHeaderWidths();\n            if (this._options.syncColumnCellResize) {\n              this.applyColumnWidths();\n            }\n            this.trigger(this.onColumnsDrag, {\n              triggeredByColumn: resizeElms.resizeableElement,\n              resizeHandle: resizeElms.resizeableHandleElement\n            });\n          },\n          onResizeEnd: (_e, resizeElms) => {\n            resizeElms.resizeableElement.classList.remove('slick-header-column-active');\n\n            const triggeredByColumn = resizeElms.resizeableElement.id.replace(this.uid, '');\n            if (this.trigger(this.onBeforeColumnsResize, { triggeredByColumn }).getReturnValue() === true) {\n              this.applyColumnHeaderWidths();\n            }\n            let newWidth;\n            for (j = 0; j < vc.length; j++) {\n              c = vc[j];\n              if (!c || c.hidden) { continue; }\n              newWidth = children[j].offsetWidth;\n\n              if (c.previousWidth !== newWidth && c.rerenderOnResize) {\n                this.invalidateAllRows();\n              }\n            }\n            this.updateCanvasWidth(true);\n            this.render();\n            this.trigger(this.onColumnsResized, { triggeredByColumn });\n            window.clearTimeout(this._columnResizeTimer);\n            this._columnResizeTimer = window.setTimeout(() => { this.columnResizeDragging = false; }, 300);\n          }\n        })\n      );\n    }\n  }\n\n  /**\n   * Validates and sets the frozenColumn option (ensuring it is within valid bounds, or setting it to \u20131)\n   * and, if a frozenRow is specified (greater than \u20131), sets the grid\u2019s frozen\u2013row flags,\n   * computes the frozenRowsHeight (based on rowHeight), and determines the actual frozen row index\n   * depending on whether frozenBottom is enabled.\n   */\n  protected setFrozenOptions() {\n    this._options.frozenColumn = (this._options.frozenColumn! >= 0 && this._options.frozenColumn! < this.columns.length)\n      ? parseInt(this._options.frozenColumn as unknown as string, 10)\n      : -1;\n\n    if (this._options.frozenRow! > -1) {\n      this.hasFrozenRows = true;\n      this.frozenRowsHeight = (this._options.frozenRow!) * this._options.rowHeight!;\n      const dataLength = this.getDataLength();\n      this.actualFrozenRow = (this._options.frozenBottom)\n        ? (dataLength - this._options.frozenRow!)\n        : this._options.frozenRow!;\n    } else {\n      this.hasFrozenRows = false;\n    }\n  }\n\n  //////////////////////////////////////////////////////////////////////////////////////////////\n  // Column Management - Autosizing\n  //////////////////////////////////////////////////////////////////////////////////////////////\n\n  /**\n   * Proportionally resize a specific column by its name, index or Id\n   *\n   * Resizes based on its content, but determines the column definition from the provided identifier or index.\n   * Then, obtains a grid canvas and calls getColAutosizeWidth to compute and update the column\u2019s width.\n   */\n  autosizeColumn(columnOrIndexOrId: number | string, isInit?: boolean) {\n    let colDef: C | null = null;\n    let colIndex = -1;\n    if (typeof columnOrIndexOrId === 'number') {\n      colDef = this.columns[columnOrIndexOrId];\n      colIndex = columnOrIndexOrId;\n    } else if (typeof columnOrIndexOrId === 'string') {\n      for (let i = 0; i < this.columns.length; i++) {\n        if (this.columns[i].id === columnOrIndexOrId) { colDef = this.columns[i]; colIndex = i; }\n      }\n    }\n    if (!colDef) {\n      return;\n    }\n    const gridCanvas = this.getCanvasNode(0, 0) as HTMLElement;\n    this.getColAutosizeWidth(colDef, colIndex, gridCanvas, isInit || false, colIndex);\n  }\n\n  /**\n   * Returns true if the column should be treated as locked (i.e. not resized) based on autosize settings.\n   * The decision is based on whether header text is not ignored, sizeToRemaining is false,\n   * content size equals header width, and the current width is less than 100 pixels.\n   *\n   * @param {AutoSize} [autoSize={}] - The autosize configuration for the column.\n   * @returns {boolean} - Returns `true` if the column should be treated as locked, otherwise `false`.\n   */\n  protected treatAsLocked(autoSize: AutoSize = {}): boolean {\n    // treat as locked (don't resize) if small and header is the widest part\n    return !autoSize.ignoreHeaderText\n      && !autoSize.sizeToRemaining\n      && (autoSize.contentSizePx === autoSize.headerWidthPx)\n      && ((autoSize.widthPx ?? 0) < 100);\n  }\n\n  /** Proportionately resizes all columns to fill available horizontal space.\n   * This does not take the cell contents into consideration.\n   *\n   * It does this by temporarily caching CSS for hidden containers, calling the internal autosizing logic\n   * (internalAutosizeColumns) with the autosize mode and initialisation flag,\n   * then restores the original CSS.\n   */\n  autosizeColumns(autosizeMode?: string, isInit?: boolean) {\n    const checkHiddenParents = !(this._hiddenParents?.length);\n    if (checkHiddenParents) {\n      this.cacheCssForHiddenInit();\n    }\n    this.internalAutosizeColumns(autosizeMode, isInit);\n    if (checkHiddenParents) {\n      this.restoreCssFromHiddenInit();\n    }\n  }\n\n  /**\n   * Implements the main autosizing algorithm. Depending on the autosize mode,\n   * it may call legacyAutosizeColumns (for legacy force\u2013fit modes), or proceed\n   * to compute column widths based on available viewport width. It iterates over columns\n   * to accumulate total widths, locked widths, and then adjusts widths proportionally.\n   * Finally, it calls reRenderColumns to update the grid.\n   *\n   * @param {string} [autosizeMode] - The autosize mode. If undefined, defaults to `autosizeColsMode` from options.\n   * @param {boolean} [isInit] - If `true`, applies initial settings for autosizing.\n   */\n  protected internalAutosizeColumns(autosizeMode?: string, isInit?: boolean) {\n    // LogColWidths();\n    autosizeMode = autosizeMode || this._options.autosizeColsMode;\n    if (autosizeMode === GridAutosizeColsMode.LegacyForceFit || autosizeMode === GridAutosizeColsMode.LegacyOff) {\n      this.legacyAutosizeColumns();\n      return;\n    }\n\n    if (autosizeMode === GridAutosizeColsMode.None) {\n      return;\n    }\n\n    // test for brower canvas support, canvas_context!=null if supported\n    this.canvas = document.createElement('canvas');\n    if (this.canvas?.getContext) { this.canvas_context = this.canvas.getContext('2d'); }\n\n    // pass in the grid canvas\n    const gridCanvas = this.getCanvasNode(0, 0) as HTMLElement;\n    const viewportWidth = this.getViewportInnerWidth();\n\n    // iterate columns to get autosizes\n    let i: number;\n    let c: C;\n    let colWidth: number;\n    let reRender = false;\n    let totalWidth = 0;\n    let totalWidthLessSTR = 0;\n    let strColsMinWidth = 0;\n    let totalMinWidth = 0;\n    let totalLockedColWidth = 0;\n    for (i = 0; i < this.columns.length; i++) {\n      c = this.columns[i];\n      this.getColAutosizeWidth(c, i, gridCanvas, isInit || false, i);\n      totalLockedColWidth += (c.autoSize?.autosizeMode === ColAutosizeMode.Locked ? (c.width || 0) : (this.treatAsLocked(c.autoSize) ? c.autoSize?.widthPx || 0 : 0));\n      totalMinWidth += (c.autoSize?.autosizeMode === ColAutosizeMode.Locked ? (c.width || 0) : (this.treatAsLocked(c.autoSize) ? c.autoSize?.widthPx || 0 : c.minWidth || 0));\n      totalWidth += (c.autoSize?.widthPx || 0);\n      totalWidthLessSTR += (c.autoSize?.sizeToRemaining ? 0 : c.autoSize?.widthPx || 0);\n      strColsMinWidth += (c.autoSize?.sizeToRemaining ? c.minWidth || 0 : 0);\n    }\n    const strColTotalGuideWidth = totalWidth - totalWidthLessSTR;\n\n    if (autosizeMode === GridAutosizeColsMode.FitViewportToCols) {\n      // - if viewport with is outside MinViewportWidthPx and MaxViewportWidthPx, then the viewport is set to\n      //   MinViewportWidthPx or MaxViewportWidthPx and the FitColsToViewport algorithm is used\n      // - viewport is resized to fit columns\n      let setWidth = totalWidth + (this.scrollbarDimensions?.width ?? 0);\n      autosizeMode = GridAutosizeColsMode.IgnoreViewport;\n\n      if (this._options.viewportMaxWidthPx && setWidth > this._options.viewportMaxWidthPx) {\n        setWidth = this._options.viewportMaxWidthPx;\n        autosizeMode = GridAutosizeColsMode.FitColsToViewport;\n      } else if (this._options.viewportMinWidthPx && setWidth < this._options.viewportMinWidthPx) {\n        setWidth = this._options.viewportMinWidthPx;\n        autosizeMode = GridAutosizeColsMode.FitColsToViewport;\n      } else {\n        // falling back to IgnoreViewport will size the columns as-is, with render checking\n        // for (i = 0; i < columns.length; i++) { columns[i].width = columns[i].autoSize.widthPx; }\n      }\n      Utils.width(this._container, setWidth);\n    }\n\n    if (autosizeMode === GridAutosizeColsMode.FitColsToViewport) {\n      if (strColTotalGuideWidth > 0 && totalWidthLessSTR < viewportWidth - strColsMinWidth) {\n        // if addl space remains in the viewport and there are SizeToRemaining cols, just the SizeToRemaining cols expand proportionally to fill viewport\n        for (i = 0; i < this.columns.length; i++) {\n          c = this.columns[i];\n          if (!c || c.hidden) { continue; }\n\n          const totalSTRViewportWidth = viewportWidth - totalWidthLessSTR;\n          if (c.autoSize?.sizeToRemaining) {\n            colWidth = totalSTRViewportWidth * (c.autoSize?.widthPx || 0) / strColTotalGuideWidth;\n          } else {\n            colWidth = (c.autoSize?.widthPx || 0);\n          }\n          if (c.rerenderOnResize && (c.width || 0) !== colWidth) {\n            reRender = true;\n          }\n          c.width = colWidth;\n        }\n      } else if ((this._options.viewportSwitchToScrollModeWidthPercent && totalWidthLessSTR + strColsMinWidth > viewportWidth * this._options.viewportSwitchToScrollModeWidthPercent / 100)\n        || (totalMinWidth > viewportWidth)) {\n        // if the total columns width is wider than the viewport by switchToScrollModeWidthPercent, switch to IgnoreViewport mode\n        autosizeMode = GridAutosizeColsMode.IgnoreViewport;\n      } else {\n        // otherwise (ie. no SizeToRemaining cols or viewport smaller than columns) all cols other than 'Locked' scale in proportion to fill viewport\n        // and SizeToRemaining get minWidth\n        let unallocatedColWidth = totalWidthLessSTR - totalLockedColWidth;\n        let unallocatedViewportWidth = viewportWidth - totalLockedColWidth - strColsMinWidth;\n        for (i = 0; i < this.columns.length; i++) {\n          c = this.columns[i];\n          if (!c || c.hidden) { continue; }\n\n          colWidth = c.width || 0;\n          if (c.autoSize?.autosizeMode !== ColAutosizeMode.Locked && !this.treatAsLocked(c.autoSize)) {\n            if (c.autoSize?.sizeToRemaining) {\n              colWidth = c.minWidth || 0;\n            } else {\n              // size width proportionally to free space (we know we have enough room due to the earlier calculations)\n              colWidth = unallocatedViewportWidth / unallocatedColWidth * (c.autoSize?.widthPx || 0) - 1;\n              if (colWidth < (c.minWidth || 0)) {\n                colWidth = c.minWidth || 0;\n              }\n\n              // remove the just allocated widths from the allocation pool\n              unallocatedColWidth -= (c.autoSize?.widthPx || 0);\n              unallocatedViewportWidth -= colWidth;\n            }\n          }\n          if (this.treatAsLocked(c.autoSize)) {\n            colWidth = (c.autoSize?.widthPx || 0);\n            if (colWidth < (c.minWidth || 0)) {\n              colWidth = c.minWidth || 0;\n            }\n          }\n          if (c.rerenderOnResize && c.width !== colWidth) {\n            reRender = true;\n          }\n          c.width = colWidth;\n        }\n      }\n    }\n\n    if (autosizeMode === GridAutosizeColsMode.IgnoreViewport) {\n      // just size columns as-is\n      for (i = 0; i < this.columns.length; i++) {\n        if (!this.columns[i] || this.columns[i].hidden) { continue; }\n\n        colWidth = this.columns[i].autoSize?.widthPx || 0;\n        if (this.columns[i].rerenderOnResize && this.columns[i].width !== colWidth) {\n          reRender = true;\n        }\n        this.columns[i].width = colWidth;\n      }\n    }\n\n    this.reRenderColumns(reRender);\n  }\n\n  /**\n   * Calculates the ideal autosize width for a given column. First, it sets the default width from the column definition.\n   * If the autosize mode is not Locked or Guide, then for ContentIntelligent mode it determines the column\u2019s data type\n   * (handling booleans, numbers, strings, dates, moments) and adjusts autosize settings accordingly.\n   * It then calls getColContentSize to compute the width needed by the content, applies an additional\n   * percentage multiplier and padding, clamps to min/max widths, and if in ContentExpandOnly mode ensures\n   * the width is at least the default width. The computed width is stored in autoSize.widthPx.\n   *\n   * @param {C} columnDef - The column definition containing autosize settings and constraints.\n   * @param {number} colIndex - The index of the column within the grid.\n   * @param {HTMLElement} gridCanvas - The grid's canvas element where temporary elements will be created.\n   * @param {boolean} isInit - If `true`, applies initial settings for row selection mode.\n   * @param {number} colArrayIndex - The index of the column in the column array (used for multi-column adjustments).\n   */\n  protected getColAutosizeWidth(columnDef: C, colIndex: number, gridCanvas: HTMLElement, isInit: boolean, colArrayIndex: number) {\n    const autoSize = columnDef.autoSize as AutoSize;\n\n    // set to width as default\n    autoSize.widthPx = columnDef.width;\n    if (autoSize.autosizeMode === ColAutosizeMode.Locked\n      || autoSize.autosizeMode === ColAutosizeMode.Guide) {\n      return;\n    }\n\n    const dl = this.getDataLength(); // getDataItem();\n    const isoDateRegExp = new RegExp(/\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z/);\n\n    // ContentIntelligent takes settings from column data type\n    if (autoSize.autosizeMode === ColAutosizeMode.ContentIntelligent) {\n      // default to column colDataTypeOf (can be used if initially there are no data rows)\n      let colDataTypeOf = autoSize.colDataTypeOf;\n      let colDataItem: any;\n      if (dl > 0) {\n        const tempRow = this.getDataItem(0);\n        if (tempRow) {\n          colDataItem = tempRow[columnDef.field as keyof TData];\n\n          // check for dates in hiding\n          if (isoDateRegExp.test(colDataItem)) { colDataItem = Date.parse(colDataItem); }\n\n          colDataTypeOf = typeof colDataItem;\n          if (colDataTypeOf === 'object') {\n            if (colDataItem instanceof Date) { colDataTypeOf = 'date'; }\n            if (typeof moment !== 'undefined' && colDataItem instanceof moment) { colDataTypeOf = 'moment'; }\n          }\n        }\n      }\n      if (colDataTypeOf === 'boolean') {\n        autoSize.colValueArray = [true, false];\n      }\n      if (colDataTypeOf === 'number') {\n        autoSize.valueFilterMode = ValueFilterMode.GetGreatestAndSub;\n        autoSize.rowSelectionMode = RowSelectionMode.AllRows;\n      }\n      if (colDataTypeOf === 'string') {\n        autoSize.valueFilterMode = ValueFilterMode.GetLongestText;\n        autoSize.rowSelectionMode = RowSelectionMode.AllRows;\n        autoSize.allowAddlPercent = 5;\n      }\n      if (colDataTypeOf === 'date') {\n        autoSize.colValueArray = [new Date(2009, 8, 30, 12, 20, 20)]; // Sep 30th 2009, 12:20:20 AM\n      }\n      if (colDataTypeOf === 'moment' && typeof moment !== 'undefined') {\n        autoSize.colValueArray = [moment([2009, 8, 30, 12, 20, 20])]; // Sep 30th 2009, 12:20:20 AM\n      }\n    }\n\n    // at this point, the autosizeMode is effectively 'Content', so proceed to get size\n    let colWidth = autoSize.contentSizePx = this.getColContentSize(columnDef, colIndex, gridCanvas, isInit, colArrayIndex);\n\n    if (colWidth === 0) {\n      colWidth = autoSize.widthPx || 0;\n    }\n\n    const addlPercentMultiplier = (autoSize.allowAddlPercent ? (1 + autoSize.allowAddlPercent / 100) : 1);\n    colWidth = colWidth * addlPercentMultiplier + (this._options.autosizeColPaddingPx || 0);\n    if (columnDef.minWidth && colWidth < columnDef.minWidth) { colWidth = columnDef.minWidth; }\n    if (columnDef.maxWidth && colWidth > columnDef.maxWidth) { colWidth = columnDef.maxWidth; }\n\n    if (autoSize.autosizeMode === ColAutosizeMode.ContentExpandOnly || ((columnDef?.editor as any)?.ControlFillsColumn)) {\n      // only use content width if it's wider than the default column width (this is used for dropdowns and other fixed width controls)\n      if (colWidth < (columnDef.width || 0)) {\n        colWidth = columnDef.width || 0;\n      }\n    }\n    autoSize.widthPx = colWidth;\n  }\n\n  /**\n   * Determines the width needed to render a column\u2019s content. It first measures the header width (if not ignored)\n   * and uses it as a baseline. If an explicit colValueArray is provided, it measures that; otherwise, it creates\n   * a RowInfo object to select a range of rows based on the rowSelectionMode. Depending on the valueFilterMode\n   * (e.g. DeDuplicate, GetGreatestAndSub, GetLongestTextAndSub, GetLongestText), it adjusts the values to measure.\n   * It then calls getColWidth (using either canvas text measurement or DOM measurement) and returns the maximum\n   * of the header width and computed content width (adjusted by a ratio, if applicable).\n   *\n   * @param {C} columnDef - The column definition containing formatting and auto-sizing options.\n   * @param {number} colIndex - The index of the column within the grid.\n   * @param {HTMLElement} gridCanvas - The grid's canvas element where temporary elements will be created.\n   * @param {boolean} isInit - If `true`, applies initial row selection mode settings.\n   * @param {number} colArrayIndex - The index of the column in the column array (used for multi-column adjustments).\n   * @returns {number} - The computed optimal column width in pixels.\n   */\n  protected getColContentSize(columnDef: C, colIndex: number, gridCanvas: HTMLElement, isInit: boolean, colArrayIndex: number) {\n    const autoSize = columnDef.autoSize as AutoSize;\n    let widthAdjustRatio = 1;\n\n    // at this point, the autosizeMode is effectively 'Content', so proceed to get size\n\n    // get header width, if we are taking notice of it\n    let i: number;\n    let tempVal: any;\n    let maxLen = 0;\n    let maxColWidth = 0;\n    autoSize.headerWidthPx = 0;\n    if (!autoSize.ignoreHeaderText) {\n      autoSize.headerWidthPx = this.getColHeaderWidth(columnDef);\n    }\n    if (autoSize.headerWidthPx === 0) {\n      autoSize.headerWidthPx = (columnDef.width ? columnDef.width\n        : (columnDef.maxWidth ? columnDef.maxWidth\n          : (columnDef.minWidth ? columnDef.minWidth : 20)\n        )\n      );\n    }\n\n    if (autoSize.colValueArray) {\n      // if an array of values are specified, just pass them in instead of data\n      maxColWidth = this.getColWidth(columnDef, gridCanvas, autoSize.colValueArray as any);\n      return Math.max(autoSize.headerWidthPx, maxColWidth);\n    }\n\n    // select rows to evaluate using rowSelectionMode and rowSelectionCount\n    const rowInfo = {} as RowInfo;\n    rowInfo.colIndex = colIndex;\n    rowInfo.rowCount = this.getDataLength();\n    rowInfo.startIndex = 0;\n    rowInfo.endIndex = rowInfo.rowCount - 1;\n    rowInfo.valueArr = null;\n    rowInfo.getRowVal = (j: number) => this.getDataItem(j)[columnDef.field as keyof TData];\n\n    const rowSelectionMode = (isInit ? autoSize.rowSelectionModeOnInit : undefined) || autoSize.rowSelectionMode;\n\n    if (rowSelectionMode === RowSelectionMode.FirstRow) { rowInfo.endIndex = 0; }\n    if (rowSelectionMode === RowSelectionMode.LastRow) { rowInfo.endIndex = rowInfo.startIndex = rowInfo.rowCount - 1; }\n    if (rowSelectionMode === RowSelectionMode.FirstNRows) { rowInfo.endIndex = Math.min(autoSize.rowSelectionCount || 0, rowInfo.rowCount) - 1; }\n\n    // now use valueFilterMode to further filter selected rows\n    if (autoSize.valueFilterMode === ValueFilterMode.DeDuplicate) {\n      const rowsDict: any = {};\n      for (i = rowInfo.startIndex; i <= rowInfo.endIndex; i++) {\n        rowsDict[rowInfo.getRowVal(i)] = true;\n      }\n      if (Object.keys) {\n        rowInfo.valueArr = Object.keys(rowsDict);\n      } else {\n        rowInfo.valueArr = [];\n        for (const v in rowsDict) {\n          if (rowsDict) {\n            rowInfo.valueArr.push(v);\n          }\n        }\n      }\n      rowInfo.startIndex = 0;\n      rowInfo.endIndex = rowInfo.length - 1;\n    }\n\n    if (autoSize.valueFilterMode === ValueFilterMode.GetGreatestAndSub) {\n      // get greatest abs value in data\n      let maxVal;\n      let maxAbsVal = 0;\n      for (i = rowInfo.startIndex; i <= rowInfo.endIndex; i++) {\n        tempVal = rowInfo.getRowVal(i);\n        if (Math.abs(tempVal) > maxAbsVal) {\n          maxVal = tempVal; maxAbsVal = Math.abs(tempVal);\n        }\n      }\n      // now substitute a '9' for all characters (to get widest width) and convert back to a number\n      maxVal = '' + maxVal;\n      maxVal = Array(maxVal.length + 1).join('9');\n      maxVal = +maxVal;\n\n      rowInfo.valueArr = [maxVal];\n      rowInfo.startIndex = rowInfo.endIndex = 0;\n    }\n\n    if (autoSize.valueFilterMode === ValueFilterMode.GetLongestTextAndSub) {\n      // get greatest abs value in data\n      for (i = rowInfo.startIndex; i <= rowInfo.endIndex; i++) {\n        tempVal = rowInfo.getRowVal(i);\n        if ((tempVal || '').length > maxLen) { maxLen = tempVal.length; }\n      }\n      // now substitute a 'm' for all characters\n      tempVal = Array(maxLen + 1).join('m');\n      widthAdjustRatio = this._options.autosizeTextAvgToMWidthRatio || 0;\n\n      rowInfo.maxLen = maxLen;\n      rowInfo.valueArr = [tempVal];\n      rowInfo.startIndex = rowInfo.endIndex = 0;\n    }\n\n    if (autoSize.valueFilterMode === ValueFilterMode.GetLongestText) {\n      // get greatest abs value in data\n      maxLen = 0; let maxIndex = 0;\n      for (i = rowInfo.startIndex; i <= rowInfo.endIndex; i++) {\n        tempVal = rowInfo.getRowVal(i);\n        if ((tempVal || '').length > maxLen) { maxLen = tempVal.length; maxIndex = i; }\n      }\n      // now substitute a 'c' for all characters\n      tempVal = rowInfo.getRowVal(maxIndex);\n      rowInfo.maxLen = maxLen;\n      rowInfo.valueArr = [tempVal];\n      rowInfo.startIndex = rowInfo.endIndex = 0;\n    }\n\n    // !!! HACK !!!!\n    if (rowInfo.maxLen && rowInfo.maxLen > 30 && colArrayIndex > 1) { autoSize.sizeToRemaining = true; }\n    maxColWidth = this.getColWidth(columnDef, gridCanvas, rowInfo) * widthAdjustRatio;\n    return Math.max(autoSize.headerWidthPx, maxColWidth);\n  }\n\n  /**\n   * Creates a temporary row and cell element (with absolute positioning, hidden visibility, and nowrap) and iterates\n   * over the selected rows (as defined in a RowInfo object or provided value array) to render the cell content using\n   * the column formatter. If in text-only mode and canvas measurement is enabled, uses canvas.measureText;\n   * otherwise, uses DOM offsetWidth after applying the formatter result to the cell.\n   * Returns the maximum measured width.\n   *\n   * @param {C} columnDef - The column definition containing formatting and auto-sizing options.\n   * @param {HTMLElement} gridCanvas - The grid's canvas element where the temporary row will be added.\n   * @param {RowInfo} rowInfo - Object containing row start/end indices and values for width evaluation.\n   * @returns {number} - The computed optimal column width in pixels.\n   */\n  protected getColWidth(columnDef: C, gridCanvas: HTMLElement, rowInfo: RowInfo) {\n    const rowEl = Utils.createDomElement('div', { className: 'slick-row ui-widget-content' }, gridCanvas);\n    const cellEl = Utils.createDomElement('div', { className: 'slick-cell' }, rowEl);\n\n    cellEl.style.position = 'absolute';\n    cellEl.style.visibility = 'hidden';\n    cellEl.style.textOverflow = 'initial';\n    cellEl.style.whiteSpace = 'nowrap';\n\n    let i: number;\n    let len: number;\n    let max = 0;\n    let maxText = '';\n    let formatterResult: string | FormatterResultWithHtml | FormatterResultWithText | HTMLElement | DocumentFragment;\n    let val: any;\n\n    // get mode - if text only display, use canvas otherwise html element\n    let useCanvas = (columnDef.autoSize!.widthEvalMode === WidthEvalMode.TextOnly);\n\n    if (columnDef.autoSize?.widthEvalMode === WidthEvalMode.Auto) {\n      const noFormatter = !columnDef.formatterOverride && !columnDef.formatter;\n      const formatterIsText = ((columnDef?.formatterOverride as { ReturnsTextOnly: boolean })?.ReturnsTextOnly)\n        || (!columnDef.formatterOverride && (columnDef.formatter as any)?.ReturnsTextOnly);\n      useCanvas = noFormatter || formatterIsText;\n    }\n\n    // use canvas - very fast, but text-only\n    if (this.canvas_context && useCanvas) {\n      const style = getComputedStyle(cellEl);\n      this.canvas_context.font = style.fontSize + ' ' + style.fontFamily;\n      for (i = rowInfo.startIndex; i <= rowInfo.endIndex; i++) {\n        // row is either an array or values or a single value\n        val = (rowInfo.valueArr ? rowInfo.valueArr[i] : rowInfo.getRowVal(i));\n        if (columnDef.formatterOverride) {\n          // use formatterOverride as first preference\n          formatterResult = (columnDef.formatterOverride as FormatterOverrideCallback)(i, rowInfo.colIndex, val, columnDef, this.getDataItem(i), this as unknown as SlickGridModel);\n        } else if (columnDef.formatter) {\n          // otherwise, use formatter\n          formatterResult = columnDef.formatter(i, rowInfo.colIndex, val, columnDef, this.getDataItem(i), this as unknown as SlickGridModel);\n        } else {\n          // otherwise, use plain text\n          formatterResult = '' + val;\n        }\n        len = formatterResult ? this.canvas_context.measureText(formatterResult as string).width : 0;\n        if (len > max) {\n          max = len;\n          maxText = formatterResult as string;\n        }\n      }\n\n      cellEl.textContent = maxText;\n      len = cellEl.offsetWidth;\n\n      rowEl.remove();\n      return len;\n    }\n\n    for (i = rowInfo.startIndex; i <= rowInfo.endIndex; i++) {\n      val = (rowInfo.valueArr ? rowInfo.valueArr[i] : rowInfo.getRowVal(i));\n      if (columnDef.formatterOverride) {\n        // use formatterOverride as first preference\n        formatterResult = (columnDef.formatterOverride as FormatterOverrideCallback)(i, rowInfo.colIndex, val, columnDef, this.getDataItem(i), this as unknown as SlickGridModel);\n      } else if (columnDef.formatter) {\n        // otherwise, use formatter\n        formatterResult = columnDef.formatter(i, rowInfo.colIndex, val, columnDef, this.getDataItem(i), this as unknown as SlickGridModel);\n      } else {\n        // otherwise, use plain text\n        formatterResult = '' + val;\n      }\n      this.applyFormatResultToCellNode(formatterResult, cellEl);\n      len = cellEl.offsetWidth;\n      if (len > max) { max = len; }\n    }\n\n    rowEl.remove();\n    return max;\n  }\n\n  /**\n   * Determines the width of a column header by first attempting to find the header element using an ID composed of the\n   * grid\u2019s uid and the column\u2019s id. If found, clones the element, makes it absolutely positioned and hidden,\n   * inserts it into the DOM, measures its offsetWidth, and then removes it. If the header element does not exist yet,\n   * creates a temporary header element with the column\u2019s name and measures its width before removing it.\n   * Returns the computed header width.\n   *\n   * @param {C} columnDef - The column definition containing the header information.\n   * @returns {number} - The computed width of the column header in pixels.\n   */\n  protected getColHeaderWidth(columnDef: C) {\n    let width = 0;\n    // if (columnDef && (!columnDef.resizable || columnDef._autoCalcWidth === true)) { return; }\n    const headerColElId = this.getUID() + columnDef.id;\n    let headerColEl = document.getElementById(headerColElId) as HTMLElement;\n    const dummyHeaderColElId = `${headerColElId}_`;\n    const clone = headerColEl.cloneNode(true) as HTMLElement;\n    if (headerColEl) {\n      // headers have been created, use clone technique\n      clone.id = dummyHeaderColElId;\n      clone.style.cssText = 'position: absolute; visibility: hidden;right: auto;text-overflow: initial;white-space: nowrap;';\n      headerColEl.parentNode!.insertBefore(clone, headerColEl);\n      width = clone.offsetWidth;\n      clone.parentNode!.removeChild(clone);\n    } else {\n      // headers have not yet been created, create a new node\n      const header = this.getHeader(columnDef) as HTMLElement;\n      headerColEl = Utils.createDomElement('div', { id: dummyHeaderColElId, className: 'ui-state-default slick-state-default slick-header-column' }, header);\n      const colNameElm = Utils.createDomElement('span', { className: 'slick-column-name' }, headerColEl);\n      this.applyHtmlCode(colNameElm, columnDef.name!);\n      clone.style.cssText = 'position: absolute; visibility: hidden;right: auto;text-overflow: initial;white-space: nowrap;';\n      if (columnDef.headerCssClass) {\n        headerColEl.classList.add(...Utils.classNameToList(columnDef.headerCssClass));\n      }\n      width = headerColEl.offsetWidth;\n      header.removeChild(headerColEl);\n    }\n    return width;\n  }\n\n  /**\n   * Iterates over all columns to collect current widths (skipping hidden ones), calculates total width\n   * and available shrink leeway, then enters a \u201Cshrink\u201D loop if the total width exceeds the available\n   * viewport width and a \u201Cgrow\u201D loop if below. Finally, it applies the computed widths to the columns\n   * and calls reRenderColumns (with a flag if any width changed) to update the grid.\n   */\n  protected legacyAutosizeColumns() {\n    let i;\n    let c: C | undefined;\n    let shrinkLeeway = 0;\n    let total = 0;\n    let prevTotal = 0;\n    const widths: number[] = [];\n    const availWidth = this.getViewportInnerWidth();\n\n    for (i = 0; i < this.columns.length; i++) {\n      c = this.columns[i];\n      if (!c || c.hidden) {\n        widths.push(0);\n        continue;\n      }\n      widths.push(c.width || 0);\n      total += c.width || 0;\n      if (c.resizable) {\n        shrinkLeeway += (c.width || 0) - Math.max((c.minWidth || 0), this.absoluteColumnMinWidth);\n      }\n    }\n\n    // shrink\n    prevTotal = total;\n    while (total > availWidth && shrinkLeeway) {\n      const shrinkProportion = (total - availWidth) / shrinkLeeway;\n      for (i = 0; i < this.columns.length && total > availWidth; i++) {\n        c = this.columns[i];\n        if (!c || c.hidden) { continue; }\n        const width = widths[i];\n        if (!c.resizable || width <= c.minWidth! || width <= this.absoluteColumnMinWidth) {\n          continue;\n        }\n        const absMinWidth = Math.max(c.minWidth!, this.absoluteColumnMinWidth);\n        let shrinkSize = Math.floor(shrinkProportion * (width - absMinWidth)) || 1;\n        shrinkSize = Math.min(shrinkSize, width - absMinWidth);\n        total -= shrinkSize;\n        shrinkLeeway -= shrinkSize;\n        widths[i] -= shrinkSize;\n      }\n      if (prevTotal <= total) {  // avoid infinite loop\n        break;\n      }\n      prevTotal = total;\n    }\n\n    // grow\n    prevTotal = total;\n    while (total < availWidth) {\n      const growProportion = availWidth / total;\n      for (i = 0; i < this.columns.length && total < availWidth; i++) {\n        c = this.columns[i];\n        if (!c || c.hidden) { continue; }\n        const currentWidth = widths[i];\n        let growSize;\n\n        if (!c.resizable || c.maxWidth! <= currentWidth) {\n          growSize = 0;\n        } else {\n          growSize = Math.min(Math.floor(growProportion * currentWidth) - currentWidth, (c.maxWidth! - currentWidth) || 1000000) || 1;\n        }\n        total += growSize;\n        widths[i] += (total <= availWidth ? growSize : 0);\n      }\n      if (prevTotal >= total) {  // avoid infinite loop\n        break;\n      }\n      prevTotal = total;\n    }\n\n    let reRender = false;\n    for (i = 0; i < this.columns.length; i++) {\n      c = this.columns[i];\n      if (!c || c.hidden) { continue; }\n\n      if (this.columns[i].rerenderOnResize && this.columns[i].width !== widths[i]) {\n        reRender = true;\n      }\n      this.columns[i].width = widths[i];\n    }\n\n    this.reRenderColumns(reRender);\n  }\n\n  /**\n   * Apply Columns Widths in the UI and optionally invalidate & re-render the columns when specified\n   * @param {Boolean} shouldReRender - should we invalidate and re-render the grid?\n   */\n  reRenderColumns(reRender?: boolean) {\n    this.applyColumnHeaderWidths();\n    this.updateCanvasWidth(true);\n\n    this.trigger(this.onAutosizeColumns, { columns: this.columns });\n\n    if (reRender) {\n      this.invalidateAllRows();\n      this.render();\n    }\n  }\n\n  /**\n   * Returns an array of column definitions filtered to exclude any that are marked as hidden.\n   *\n   * @returns\n   */\n  getVisibleColumns() {\n    return this.columns.filter(c => !c.hidden);\n  }\n\n  /**\n   * Returns the index of a column with a given id. Since columns can be reordered by the user, this can be used to get the column definition independent of the order:\n   * @param {String | Number} id A column id.\n   */\n  getColumnIndex(id: number | string): number {\n    return this.columnsById[id];\n  }\n\n  /**\n   * Iterates over the header elements (from both left and right headers) and updates each header\u2019s width based on the\n   * corresponding visible column\u2019s width minus a computed adjustment (headerColumnWidthDiff).\n   * Finally, it updates the internal column caches.\n   *\n   * @returns\n   */\n  protected applyColumnHeaderWidths() {\n    if (!this.initialized) {\n      return;\n    }\n\n    let columnIndex = 0;\n    const vc = this.getVisibleColumns();\n    this._headers.forEach((header) => {\n      for (let i = 0; i < header.children.length; i++, columnIndex++) {\n        const h = header.children[i] as HTMLElement;\n        const col = vc[columnIndex] || {};\n        const width = (col.width || 0) - this.headerColumnWidthDiff;\n        if (Utils.width(h) !== width) {\n          Utils.width(h, width);\n        }\n      }\n    });\n\n    this.updateColumnCaches();\n  }\n\n  /**\n   * Iterates over all columns (skipping hidden ones) and, for each, retrieves the associated CSS rules\n   * (using getColumnCssRules). It then sets the left and right CSS properties so that the columns align\n   * correctly within the grid canvas. It also updates the cumulative offset for non\u2013frozen columns.\n   */\n  protected applyColumnWidths() {\n    let x = 0;\n    let w = 0;\n    let rule: any;\n    for (let i = 0; i < this.columns.length; i++) {\n      if (!this.columns[i]?.hidden) {\n        w = this.columns[i].width || 0;\n\n        rule = this.getColumnCssRules(i);\n        rule.left.style.left = `${x}px`;\n        rule.right.style.right = (((this._options.frozenColumn !== -1 && i > this._options.frozenColumn!) ? this.canvasWidthR : this.canvasWidthL) - x - w) + 'px';\n\n        // If this column is frozen, reset the css left value since the\n        // column starts in a new viewport.\n        if (this._options.frozenColumn !== i) {\n          x += this.columns[i].width!;\n        }\n      }\n      if (this._options.frozenColumn === i) {\n        x = 0;\n      }\n    }\n  }\n\n  /**\n   * A convenience method that creates a sort configuration for one column (with the given sort direction)\n   * and calls setSortColumns with it. Accepts a columnId string and an ascending boolean.\n   * Applies a sort glyph in either ascending or descending form to the header of the column.\n   * Note that this does not actually sort the column. It only adds the sort glyph to the header.\n   *\n   * @param {String | Number} columnId\n   * @param {Boolean} ascending\n   */\n  setSortColumn(columnId: number | string, ascending: boolean) {\n    this.setSortColumns([{ columnId, sortAsc: ascending }]);\n  }\n\n  /**\n   * Get column by index - iterates over header containers and returns the header column\n   * element corresponding to the given index.\n   *\n   * @param {Number} id - column index\n   * @returns\n   */\n  getColumnByIndex(id: number) {\n    let result: HTMLElement | undefined;\n    this._headers.every((header) => {\n      const length = header.children.length;\n      if (id < length) {\n        result = header.children[id] as HTMLElement;\n        return false;\n      }\n      id -= length;\n      return true;\n    });\n\n    return result;\n  }\n\n  /**\n   * Accepts an array of objects in the form [ { columnId: [string], sortAsc: [boolean] }, ... ] to\n   * define the grid's sort order. When called, this will apply a sort glyph in either ascending\n   * or descending form to the header of each column specified in the array.\n   * Note that this does not actually sort the column. It only adds the sort glyph to the header.\n   *\n   * @param {ColumnSort[]} cols - column sort\n   */\n  setSortColumns(cols: ColumnSort[]) {\n    this.sortColumns = cols;\n\n    const numberCols = this._options.numberedMultiColumnSort && this.sortColumns.length > 1;\n    this._headers.forEach((header) => {\n      let indicators = header.querySelectorAll('.slick-header-column-sorted');\n      indicators.forEach((indicator) => {\n        indicator.classList.remove('slick-header-column-sorted');\n      });\n\n      indicators = header.querySelectorAll('.slick-sort-indicator');\n      indicators.forEach((indicator) => {\n        indicator.classList.remove('slick-sort-indicator-asc');\n        indicator.classList.remove('slick-sort-indicator-desc');\n      });\n      indicators = header.querySelectorAll('.slick-sort-indicator-numbered');\n      indicators.forEach((el) => {\n        el.textContent = '';\n      });\n    });\n\n    let i = 1;\n    this.sortColumns.forEach((col) => {\n      if (!Utils.isDefined(col.sortAsc)) {\n        col.sortAsc = true;\n      }\n\n      const columnIndex = this.getColumnIndex(col.columnId);\n      if (Utils.isDefined(columnIndex)) {\n        const column = this.getColumnByIndex(columnIndex);\n        if (column) {\n          column.classList.add('slick-header-column-sorted');\n          let indicator = column.querySelector('.slick-sort-indicator');\n          indicator?.classList.add(col.sortAsc ? 'slick-sort-indicator-asc' : 'slick-sort-indicator-desc');\n\n          if (numberCols) {\n            indicator = column.querySelector('.slick-sort-indicator-numbered');\n            if (indicator) {\n              indicator.textContent = String(i);\n            }\n          }\n        }\n      }\n      i++;\n    });\n  }\n\n  /** Returns the current array of column definitions. */\n  getColumns() {\n    return this.columns;\n  }\n\n  /** Get sorted columns representing the current sorting state of the grid **/\n  getSortColumns(): ColumnSort[] {\n    return this.sortColumns;\n  }\n\n  /**\n   * Iterates over all columns to compute and store their left and right boundaries\n   * (based on cumulative widths). Resets the offset when a frozen column is encountered.\n   */\n  protected updateColumnCaches() {\n    // Pre-calculate cell boundaries.\n    this.columnPosLeft = [];\n    this.columnPosRight = [];\n    let x = 0;\n    for (let i = 0, ii = this.columns.length; i < ii; i++) {\n      if (!this.columns[i] || this.columns[i].hidden) { continue; }\n\n      this.columnPosLeft[i] = x;\n      this.columnPosRight[i] = x + (this.columns[i].width || 0);\n\n      if (this._options.frozenColumn === i) {\n        x = 0;\n      } else {\n        x += this.columns[i].width || 0;\n      }\n    }\n  }\n\n  /**\n   * Iterates over each column to (a) save its original width as widthRequest,\n   * (b) apply default properties (using mixinDefaults if set) to both the column\n   * and its autoSize property, (c) update the columnsById mapping, and (d) adjust\n   * the width if it is less than minWidth or greater than maxWidth.\n   */\n  protected updateColumnProps() {\n    this.columnsById = {};\n    for (let i = 0; i < this.columns.length; i++) {\n      let m: C = this.columns[i];\n      if (m.width) {\n        m.widthRequest = m.width;\n      }\n\n      if (this._options.mixinDefaults) {\n        Utils.applyDefaults(m, this._columnDefaults);\n        if (!m.autoSize) { m.autoSize = {}; }\n        Utils.applyDefaults(m.autoSize, this._columnAutosizeDefaults);\n      } else {\n        m = this.columns[i] = Utils.extend({}, this._columnDefaults, m);\n        m.autoSize = Utils.extend({}, this._columnAutosizeDefaults, m.autoSize);\n      }\n\n      this.columnsById[m.id] = i;\n      if (m.minWidth && ((m.width || 0) < m.minWidth)) {\n        m.width = m.minWidth;\n      }\n      if (m.maxWidth && ((m.width || 0) > m.maxWidth)) {\n        m.width = m.maxWidth;\n      }\n    }\n  }\n\n  /**\n   * Sets grid columns. Column headers will be recreated and all rendered rows will be removed.\n   * To rerender the grid (if necessary), call render().\n   * @param {Column[]} columnDefinitions An array of column definitions.\n   */\n  setColumns(columnDefinitions: C[]) {\n    this.trigger(this.onBeforeSetColumns, { previousColumns: this.columns, newColumns: columnDefinitions, grid: this });\n    this.columns = columnDefinitions;\n    this.updateColumns();\n    this.trigger(this.onAfterSetColumns, { newColumns: columnDefinitions, grid: this });\n  }\n\n  /** Update columns for when a hidden property has changed but the column list itself has not changed. */\n  updateColumns() {\n    this.trigger(this.onBeforeUpdateColumns, { columns: this.columns, grid: this });\n    this.updateColumnsInternal();\n    this.trigger(this.onAfterUpdateColumns, { columns: this.columns, grid: this });\n  }\n\n  /**\n   * Triggers onBeforeUpdateColumns and calls updateColumnsInternal to update column properties,\n   * caches, header/footer elements, CSS rules, canvas dimensions, and selections without changing the column array.\n   */\n  protected updateColumnsInternal() {\n    this.updateColumnProps();\n    this.updateColumnCaches();\n\n    if (this.initialized) {\n      this.setPaneFrozenClasses();\n      this.setPaneVisibility();\n      this.setOverflow();\n\n      this.invalidateAllRows();\n      this.createColumnHeaders();\n      this.createColumnFooter();\n      this.removeCssRules();\n      this.createCssRules();\n      this.resizeCanvas();\n      this.updateCanvasWidth();\n      this.applyColumnHeaderWidths();\n      this.applyColumnWidths();\n      this.handleScroll();\n      this.getSelectionModel()?.refreshSelections();\n    }\n  }\n\n  /////////////////////////////////////////////////////////////////////\n  /// End Column Management\n  /////////////////////////////////////////////////////////////////////\n\n  /////////////////////////////////////////////////////////////////////\n  /// Data Management and Editing\n  /////////////////////////////////////////////////////////////////////\n\n  /** Get Editor lock */\n  getEditorLock() {\n    return this._options.editorLock as SlickEditorLock;\n  }\n\n  /** Get Editor Controller */\n  getEditController() {\n    return this.editController;\n  }\n\n  /**\n   * Sets a new source for databinding and removes all rendered rows. Note that this doesn't render the new rows - you can follow it with a call to render() to do that.\n   * @param {CustomDataView|Array<*>} newData New databinding source using a regular JavaScript array.. or a custom object exposing getItem(index) and getLength() functions.\n   * @param {Number} [scrollToTop] If true, the grid will reset the vertical scroll position to the top of the grid.\n   */\n  setData(newData: CustomDataView<TData> | TData[], scrollToTop?: boolean) {\n    this.data = newData;\n    this.invalidateAllRows();\n    this.updateRowCount();\n    if (scrollToTop) {\n      this.scrollTo(0);\n    }\n  }\n\n  /** Returns an array of every data object, unless you're using DataView in which case it returns a DataView object. */\n  getData<U extends CustomDataView<TData> | U[]>(): U {\n    return this.data as U;\n  }\n\n  /** Returns the size of the databinding source. */\n  getDataLength() {\n    if ((this.data as CustomDataView<TData>).getLength) {\n      return (this.data as CustomDataView<TData>).getLength();\n    } else {\n      return (this.data as TData[])?.length ?? 0;\n    }\n  }\n\n  /**\n   * Returns the number of data items plus an extra row if enableAddRow is true and paging conditions allow.\n   *\n   * @returns\n   */\n  protected getDataLengthIncludingAddNew() {\n    return this.getDataLength() + (!this._options.enableAddRow ? 0\n      : (!this.pagingActive || this.pagingIsLastPage ? 1 : 0)\n    );\n  }\n\n  /**\n   * Returns the databinding item at a given position.\n   * @param {Number} index Item row index.\n   */\n  getDataItem(i: number): TData {\n    if ((this.data as CustomDataView).getItem) {\n      return (this.data as CustomDataView<TData>).getItem(i) as TData;\n    } else {\n      return (this.data as TData[])[i] as TData;\n    }\n  }\n\n  /**  Are we using a DataView? */\n  hasDataView() {\n    return !Array.isArray(this.data);\n  }\n\n  /**\n   * Returns item metadata by a row index when it exists\n   * @param {Number} row\n   * @returns {ItemMetadata | null}\n   */\n  getItemMetadaWhenExists(row: number): ItemMetadata | null {\n    return 'getItemMetadata' in this.data ? (this.data as CustomDataView<TData>).getItemMetadata(row) : null;\n  }\n\n  /**\n   * Determines the proper formatter for a given cell by checking row metadata for column overrides,\n   * then falling back to the column\u2019s formatter, a formatter from the formatterFactory, or the default formatter.\n   *\n   * @param {number} row - The row index of the cell.\n   * @param {C} column - The column definition containing formatting options.\n   * @returns {Formatter} - The resolved formatter function for the specified cell.\n   */\n  protected getFormatter(row: number, column: C): Formatter {\n    const rowMetadata = (this.data as CustomDataView<TData>)?.getItemMetadata?.(row);\n\n    // look up by id, then index\n    const columnOverrides = rowMetadata?.columns &&\n      (rowMetadata.columns[column.id] || rowMetadata.columns[this.getColumnIndex(column.id)]);\n\n    return ((columnOverrides?.formatter) ||\n      (rowMetadata?.formatter) ||\n      column.formatter ||\n      (this._options.formatterFactory?.getFormatter(column)) ||\n      this._options.defaultFormatter) as Formatter;\n  }\n\n  /**\n   * Retrieves the editor (or editor constructor) for the specified cell by first checking for an override\n   * in row metadata and then falling back to the column\u2019s editor or an editor from the editorFactory.\n   *\n   * @param {number} row - The row index of the cell.\n   * @param {number} cell - The column index of the cell.\n   * @returns {Editor | EditorConstructor | null | undefined} - The editor instance or constructor if available, otherwise `null` or `undefined`.\n   */\n  protected getEditor(row: number, cell: number): Editor | EditorConstructor | null | undefined {\n    const column = this.columns[cell];\n    const rowMetadata = this.getItemMetadaWhenExists(row);\n    const columnMetadata = rowMetadata?.columns;\n\n    if (columnMetadata?.[column.id]?.editor !== undefined) {\n      return columnMetadata[column.id].editor;\n    }\n    if (columnMetadata?.[cell]?.editor !== undefined) {\n      return columnMetadata[cell].editor;\n    }\n\n    return (column.editor || (this._options?.editorFactory?.getEditor(column)));\n  }\n\n  /**\n   * Returns the value for the specified column from a given data item. If a dataItemColumnValueExtractor\n   * is provided in options, it is used; otherwise, the property named by the column\u2019s field is returned.\n   *\n   * @param {TData} item - The data item containing the requested value.\n   * @param {C} columnDef - The column definition containing the field key.\n   * @returns {*} - The extracted value from the data item based on the column definition.\n   */\n  protected getDataItemValueForColumn(item: TData, columnDef: C) {\n    if (this._options.dataItemColumnValueExtractor) {\n      return this._options.dataItemColumnValueExtractor(item, columnDef) as TData;\n    }\n    return item[columnDef.field as keyof TData];\n  }\n\n  //////////////////////////////////////////////////////////////////////////////////////////////\n  // Data Management and Editing - Cell Switchers\n  ////////////////////////////////////////////////////////////////////\n\n  /** Resets active cell by making cell normal and other internal reset. */\n  resetActiveCell() {\n    this.setActiveCellInternal(null, false);\n  }\n\n  /** Clear active cell by making cell normal & removing \"active\" CSS class. */\n  unsetActiveCell() {\n    if (Utils.isDefined(this.activeCellNode)) {\n      this.makeActiveCellNormal();\n      this.activeCellNode.classList.remove('active');\n      this.rowsCache[this.activeRow]?.rowNode?.forEach((node) => node.classList.remove('active'));\n    }\n  }\n\n  /** @alias `setFocus` */\n  focus() {\n    this.setFocus();\n  }\n\n  // Sets focus to one of the hidden focus sink elements based on the current tabbing direction.\n  protected setFocus() {\n    if (this.tabbingDirection === -1) {\n      this._focusSink.focus();\n    } else {\n      this._focusSink2.focus();\n    }\n  }\n\n  /**\n   * Clears any previously active cell (removing \u201Cactive\u201D CSS classes), sets the new active cell,\n   * calculates its position, and updates active row and cell indices.\n   * If conditions are met (grid is editable and `opt_editMode` is `true`),\n   * it initiates editing on the cell (with an asynchronous delay if configured).\n   * Finally, it triggers `onActiveCellChanged` unless suppressed.\n   *\n   * @param {HTMLDivElement | null} newCell - The new active cell element, or `null` to deactivate the current cell.\n   * @param {boolean | null} [opt_editMode] - If `true`, enables edit mode for the active cell.\n   *                                          If `null` or `undefined`, it follows `autoEditNewRow` and `autoEdit` settings.\n   * @param {boolean | null} [preClickModeOn] - If `true`, indicates that the cell was activated by a pre-click action.\n   * @param {boolean} [suppressActiveCellChangedEvent] - If `true`, prevents triggering `onActiveCellChanged` event.\n   * @param {Event | SlickEvent_} [e] - The event that triggered the cell activation (if applicable).\n   */\n  protected setActiveCellInternal(newCell: HTMLDivElement | null, opt_editMode?: boolean | null, preClickModeOn?: boolean | null, suppressActiveCellChangedEvent?: boolean, e?: Event | SlickEvent_) {\n    // make current active cell as normal cell & remove \"active\" CSS classes\n    this.unsetActiveCell();\n\n    // let activeCellChanged = (this.activeCellNode !== newCell);\n    this.activeCellNode = newCell;\n\n    if (Utils.isDefined(this.activeCellNode)) {\n      const activeCellOffset = Utils.offset(this.activeCellNode);\n      let rowOffset = Math.floor(Utils.offset(Utils.parents(this.activeCellNode, '.grid-canvas')[0] as HTMLElement)!.top);\n      const isBottom = Utils.parents(this.activeCellNode, '.grid-canvas-bottom').length;\n\n      if (this.hasFrozenRows && isBottom) {\n        rowOffset -= (this._options.frozenBottom)\n          ? Utils.height(this._canvasTopL) as number\n          : this.frozenRowsHeight;\n      }\n\n      const cell = this.getCellFromPoint(activeCellOffset!.left, Math.ceil(activeCellOffset!.top) - rowOffset);\n      this.activeRow = cell.row;\n      this.activePosY = cell.row;\n      this.activeCell = this.activePosX = this.getCellFromNode(this.activeCellNode);\n\n      if (!Utils.isDefined(opt_editMode) && this._options.autoEditNewRow) {\n        opt_editMode = (this.activeRow === this.getDataLength()) || this._options.autoEdit;\n      }\n\n      if (this._options.showCellSelection) {\n        // make sure to never activate more than 1 cell at a time\n        document.querySelectorAll('.slick-cell.active').forEach((node) => node.classList.remove('active'));\n        this.activeCellNode.classList.add('active');\n        this.rowsCache[this.activeRow]?.rowNode?.forEach((node) => node.classList.add('active'));\n      }\n\n      if (opt_editMode && this.isCellEditable(this.activeRow, this.activeCell)) {\n        if (this._options.asyncEditorLoading) {\n          window.clearTimeout(this.h_editorLoader);\n          this.h_editorLoader = window.setTimeout(() => {\n            this.makeActiveCellEditable(undefined, preClickModeOn, e);\n          }, this._options.asyncEditorLoadDelay);\n        } else {\n          this.makeActiveCellEditable(undefined, preClickModeOn, e);\n        }\n      }\n    } else {\n      this.activeRow = this.activeCell = null as any;\n    }\n\n    // this optimisation causes trouble - MLeibman #329\n    // if (activeCellChanged) {\n    if (!suppressActiveCellChangedEvent) {\n      this.trigger<OnActiveCellChangedEventArgs | null>(this.onActiveCellChanged, this.getActiveCell() as OnActiveCellChangedEventArgs);\n    }\n    // }\n  }\n\n  /** Check if cell is editable and check if grid is also editable */\n  protected isCellEditable(row: number, cell: number): boolean {\n    return !!(this._options.editable && this.isCellPotentiallyEditable(row, cell));\n  }\n\n  /**\n   * Checks whether data for the row is loaded, whether the cell is in an \u201CAdd New\u201D row\n   * (and the column disallows insert triggering), and whether an editor exists and the cell is not hidden.\n   * Returns true if the cell is editable.\n   *\n   * @param {number} row - The row index of the cell.\n   * @param {number} cell - The cell index (column index) within the row.\n   * @returns {boolean} - Returns `true` if the cell is editable, otherwise `false`.\n   */\n  protected isCellPotentiallyEditable(row: number, cell: number) {\n    const dataLength = this.getDataLength();\n    // is the data for this row loaded?\n    if (row < dataLength && !this.getDataItem(row)) {\n      return false;\n    }\n\n    // are we in the Add New row? Can we create new from this cell?\n    if (this.columns[cell].cannotTriggerInsert && row >= dataLength) {\n      return false;\n    }\n\n    // does this cell have an editor?\n    if (!this.columns[cell] || this.columns[cell].hidden || !this.getEditor(row, cell)) {\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Make the cell normal again (for example after destroying cell editor),\n   * we can also optionally refocus on the current active cell (again possibly after closing cell editor)\n   *\n   * If an editor is active, triggers onBeforeCellEditorDestroy and calls the editor\u2019s destroy method.\n   * It then removes \u201Ceditable\u201D and \u201Cinvalid\u201D CSS classes from the active cell, re\u2013applies the formatter\n   * to restore the cell\u2019s original content, invalidates any post\u2013processing results,\n   * and deactivates the editor lock. Optionally, it can also re\u2013focus the grid.\n   * In IE, it clears any text selection to ensure focus is properly reset.\n   *\n   * @param {Boolean} [refocusActiveCell]\n   */\n  protected makeActiveCellNormal(refocusActiveCell = false) {\n    if (!this.currentEditor) {\n      return;\n    }\n    this.trigger(this.onBeforeCellEditorDestroy, { editor: this.currentEditor });\n    this.currentEditor.destroy();\n    this.currentEditor = null;\n\n    if (this.activeCellNode) {\n      const d = this.getDataItem(this.activeRow);\n      this.activeCellNode.classList.remove('editable');\n      this.activeCellNode.classList.remove('invalid');\n      if (d) {\n        const column = this.columns[this.activeCell];\n        const formatter = this.getFormatter(this.activeRow, column);\n        const formatterResult = formatter(this.activeRow, this.activeCell, this.getDataItemValueForColumn(d, column), column, d, this as unknown as SlickGridModel);\n        this.applyFormatResultToCellNode(formatterResult, this.activeCellNode);\n        this.invalidatePostProcessingResults(this.activeRow);\n      }\n      if (refocusActiveCell) {\n        this.setFocus();\n      }\n    }\n\n    // if there previously was text selected on a page (such as selected text in the edit cell just removed),\n    // IE can't set focus to anything else correctly\n    if (navigator.userAgent.toLowerCase().match(/msie/)) {\n      this.clearTextSelection();\n    }\n\n    this.getEditorLock()?.deactivate(this.editController as EditController);\n  }\n\n  /**\n   * A public method that starts editing on the active cell by calling\n   * makeActiveCellEditable with the provided editor, pre\u2013click flag, and event.\n   */\n  editActiveCell(editor?: EditorConstructor, preClickModeOn?: boolean | null, e?: Event) {\n    this.makeActiveCellEditable(editor, preClickModeOn, e);\n  }\n\n  /**\n   * Makes the currently active cell editable by initializing an editor instance.\n   *\n   * @param {EditorConstructor} [editor] - An optional custom editor constructor to use for editing.\n   * @param {boolean | null} [preClickModeOn] - Indicates if pre-click mode is enabled.\n   * @param {Event | SlickEvent_} [e] - The event that triggered editing.\n   *\n   * @throws {Error} If called when the grid is not editable.\n   */\n  protected makeActiveCellEditable(editor?: EditorConstructor, preClickModeOn?: boolean | null, e?: Event | SlickEvent_) {\n    if (!this.activeCellNode) {\n      return;\n    }\n    if (!this._options.editable) {\n      throw new Error('SlickGrid makeActiveCellEditable : should never get called when this._options.editable is false');\n    }\n\n    // cancel pending async call if there is one\n    window.clearTimeout(this.h_editorLoader);\n\n    if (!this.isCellPotentiallyEditable(this.activeRow, this.activeCell)) {\n      return;\n    }\n\n    const columnDef = this.columns[this.activeCell];\n    const item = this.getDataItem(this.activeRow);\n\n    if (this.trigger(this.onBeforeEditCell, { row: this.activeRow, cell: this.activeCell, item, column: columnDef, target: 'grid' }).getReturnValue() === false) {\n      this.setFocus();\n      return;\n    }\n\n    this.getEditorLock()?.activate(this.editController as EditController);\n    this.activeCellNode.classList.add('editable');\n\n    const useEditor = editor || this.getEditor(this.activeRow, this.activeCell);\n    // editor was null and columnMetadata and editorFactory returned null or undefined\n    // the editor must be constructable. Also makes sure that useEditor is of type EditorConstructor\n    if (!useEditor || typeof useEditor !== 'function') {\n      return;\n    }\n\n    // don't clear the cell if a custom editor is passed through\n    if (!editor && !useEditor.suppressClearOnEdit) {\n      Utils.emptyElement(this.activeCellNode);\n    }\n\n    let metadata = this.getItemMetadaWhenExists(this.activeRow);\n    metadata = metadata?.columns as any;\n    const columnMetaData = metadata && (metadata[columnDef.id as keyof ItemMetadata] || (metadata as any)[this.activeCell]);\n\n\n    const editorArgs: EditorArguments<TData, C, O> = {\n      grid: this,\n      gridPosition: this.absBox(this._container),\n      position: this.absBox(this.activeCellNode),\n      container: this.activeCellNode,\n      column: columnDef,\n      columnMetaData,\n      item: item || {},\n      event: e as Event,\n      commitChanges: this.commitEditAndSetFocus.bind(this),\n      cancelChanges: this.cancelEditAndSetFocus.bind(this)\n    };\n\n    this.currentEditor = new useEditor(editorArgs);\n\n    if (item && this.currentEditor) {\n      this.currentEditor.loadValue(item);\n      if (preClickModeOn && this.currentEditor?.preClick) {\n        this.currentEditor.preClick();\n      }\n    }\n\n    this.serializedEditorValue = this.currentEditor?.serializeValue();\n\n    if (this.currentEditor?.position) {\n      this.handleActiveCellPositionChange();\n    }\n  }\n\n  /**\n   * Commits the current edit and sets focus back to the grid.\n   * If the commit fails due to validation, the focus remains in the editor.\n   */\n  protected commitEditAndSetFocus() {\n    // if the commit fails, it would do so due to a validation error\n    // if so, do not steal the focus from the editor\n    if (this.getEditorLock()?.commitCurrentEdit()) {\n      this.setFocus();\n      if (this._options.autoEdit && !this._options.autoCommitEdit) {\n        this.navigateDown();\n      }\n    }\n  }\n\n  /**\n   * Cancels the current edit and restores focus to the grid.\n   */\n  protected cancelEditAndSetFocus() {\n    if (this.getEditorLock()?.cancelCurrentEdit()) {\n      this.setFocus();\n    }\n  }\n\n  // IEditor implementation for the editor lock\n\n  /**\n   * Commits the current edit, validating and applying changes if necessary.\n   * If validation fails, an error is triggered and focus remains in the editor.\n   *\n   * @returns {boolean} Whether the edit was successfully committed.\n   */\n  protected commitCurrentEdit() {\n    const self = this as SlickGrid<TData, C, O>;\n    const item = self.getDataItem(self.activeRow);\n    const column = self.columns[self.activeCell];\n\n    if (self.currentEditor) {\n      if (self.currentEditor.isValueChanged()) {\n        const validationResults = self.currentEditor.validate(\n          undefined, {\n          rowIndex: self.activeRow,\n          cellIndex: self.activeCell\n        }\n        );\n\n        if (validationResults.valid) {\n          const row = self.activeRow;\n          const cell = self.activeCell;\n          const editor = self.currentEditor;\n          const serializedValue = self.currentEditor.serializeValue();\n          const prevSerializedValue = self.serializedEditorValue;\n\n          if (self.activeRow < self.getDataLength()) {\n            const editCommand = {\n              row,\n              cell,\n              editor,\n              serializedValue,\n              prevSerializedValue,\n              execute: () => {\n                editor.applyValue(item, serializedValue);\n                self.updateRow(row);\n                self.trigger(self.onCellChange, { command: 'execute', row, cell, item, column });\n              },\n              undo: () => {\n                editor.applyValue(item, prevSerializedValue);\n                self.updateRow(row);\n                self.trigger(self.onCellChange, { command: 'undo', row, cell, item, column, });\n              }\n            };\n\n            if (self._options.editCommandHandler) {\n              self.makeActiveCellNormal(true);\n              self._options.editCommandHandler(item, column, editCommand);\n            } else {\n              editCommand.execute();\n              self.makeActiveCellNormal(true);\n            }\n\n          } else {\n            const newItem = {};\n            self.currentEditor.applyValue(newItem, self.currentEditor.serializeValue());\n            self.makeActiveCellNormal(true);\n            self.trigger(self.onAddNewRow, { item: newItem, column });\n          }\n\n          // check whether the lock has been re-acquired by event handlers\n          return !self.getEditorLock()?.isActive();\n        } else {\n          // Re-add the CSS class to trigger transitions, if any.\n          if (self.activeCellNode) {\n            self.activeCellNode.classList.remove('invalid');\n            Utils.width(self.activeCellNode);// force layout\n            self.activeCellNode.classList.add('invalid');\n          }\n\n          self.trigger(self.onValidationError, {\n            editor: self.currentEditor,\n            cellNode: self.activeCellNode,\n            validationResults,\n            row: self.activeRow,\n            cell: self.activeCell,\n            column\n          });\n\n          self.currentEditor.focus();\n          return false;\n        }\n      }\n\n      self.makeActiveCellNormal(true);\n    }\n    return true;\n  }\n\n  /**\n   * Cancels the current edit and restores the cell to normal mode.\n   *\n   * @returns {boolean} Always returns true.\n   */\n  protected cancelCurrentEdit() {\n    this.makeActiveCellNormal();\n    return true;\n  }\n\n  /** Returns an array of row indices corresponding to the currently selected rows. */\n  getSelectedRows() {\n    if (!this.selectionModel) {\n      throw new Error('SlickGrid Selection model is not set');\n    }\n    return this.selectedRows.slice(0);\n  }\n\n  /**\n   * Accepts an array of row indices and applies the current selectedCellCssClass to the cells in the row, respecting whether cells have been flagged as selectable.\n   * @param {Array<number>} rowsArray - an array of row numbers.\n   * @param {String} [caller] - an optional string to identify who called the method\n   */\n  setSelectedRows(rows: number[], caller?: string) {\n    if (!this.selectionModel) {\n      throw new Error('SlickGrid Selection model is not set');\n    }\n    if (this && this.getEditorLock && !this.getEditorLock()?.isActive()) {\n      this.selectionModel.setSelectedRanges(this.rowsToRanges(rows), caller || 'SlickGrid.setSelectedRows');\n    }\n  }\n\n  ///////////////////////////////////////////////////////////////////////////\n  // Event Handling and Interactivity\n  /////////////////////////////////////////////////////////////////////////\n\n  /**\n   * A generic helper that creates (or uses) a SlickEventData from the provided event,\n   * attaches the grid instance to the event arguments, and calls notify on the given event.\n   * Returns the result of the notification.\n   *\n   * @param {SlickEvent_} evt - The Slick event instance to trigger.\n   * @param {ArgType} [args] - Optional arguments to pass with the event.\n   * @param {Event | SlickEventData_} [e] - The original event object or SlickEventData.\n   * @returns {*} - The result of the event notification.\n   */\n  protected trigger<ArgType = any>(evt: SlickEvent_, args?: ArgType, e?: Event | SlickEventData_) {\n    const event: SlickEventData_ = (e || new SlickEventData(e, args)) as SlickEventData_;\n    const eventArgs = (args || {}) as ArgType & { grid: SlickGrid<TData, C, O>; };\n    eventArgs.grid = this;\n    return evt.notify(eventArgs, event, this);\n  }\n\n  /**\n   * Handles the mouseout event for a cell.\n   * Triggers the `onMouseLeave` event.\n   *\n   * @param {MouseEvent & { target: HTMLElement }} e - The mouse event.\n   */\n  protected handleCellMouseOut(e: MouseEvent & { target: HTMLElement; }) {\n    this.trigger(this.onMouseLeave, {}, e);\n  }\n\n  /**\n   * Handles mouse hover over a header cell.\n   * Adds CSS classes to indicate a hover state.\n   *\n   * @param {Event | SlickEventData_} e - The mouse event.\n   */\n  protected handleHeaderMouseHoverOn(e: Event | SlickEventData_) {\n    (e as any)?.target.classList.add('ui-state-hover', 'slick-state-hover');\n  }\n\n  /**\n   * Handles mouse hover off a header cell.\n   * Removes CSS classes indicating a hover state.\n   *\n   * @param {Event | SlickEventData_} e - The mouse event.\n   */\n  protected handleHeaderMouseHoverOff(e: Event | SlickEventData_) {\n    (e as any)?.target.classList.remove('ui-state-hover', 'slick-state-hover');\n  }\n\n  /**\n   * Called when the grid\u2019s selection model reports a change. It builds a new selection\n   * (and CSS hash for selected cells) from the provided ranges, applies the new cell CSS styles,\n   * and if the selection has changed from the previous state, triggers the onSelectedRowsChanged\n   * event with details about added and removed selections.\n   *\n  * @param {SlickEventData_} e - The Slick event data for selection changes.\n  * @param {SlickRange_[]} ranges - The list of selected row and cell ranges.\n   */\n  protected handleSelectedRangesChanged(e: SlickEventData_, ranges: SlickRange_[]) {\n    const ne = e.getNativeEvent<CustomEvent>();\n    const selectionMode = ne?.detail?.selectionMode ?? '';\n    let addDragHandle = !!ne?.detail?.addDragHandle;\n    const selectionType = this.getSelectionModel()?.getOptions()?.selectionType;\n    addDragHandle = selectionType === 'cell' || selectionType === 'mixed';\n\n    // drag and replace functionality\n    const prevSelectedRanges = this.selectedRanges.slice(0);\n    this.selectedRanges = ranges;\n\n    if (selectionMode === CellSelectionMode.Replace\n      && prevSelectedRanges && prevSelectedRanges.length === 1\n      && this.selectedRanges && this.selectedRanges.length === 1) {\n      const prevSelectedRange = prevSelectedRanges[0];\n      const selectedRange = this.selectedRanges[0];\n\n      // check range has expanded\n      if (SelectionUtils.copyRangeIsLarger(prevSelectedRange, selectedRange)) {\n        this.trigger(this.onDragReplaceCells, { prevSelectedRange, selectedRange });\n        this.invalidate();\n      }\n    }\n\n    const previousSelectedRows = this.selectedRows.slice(0); // shallow copy previously selected rows for later comparison\n\n    this.selectionBottomRow = -1;\n    this.selectionRightCell = -1;\n    this.dragReplaceEl.removeEl();\n\n    this.selectedRows = [];\n    const hash: CssStyleHash = {};\n    for (let i = 0; i < ranges.length; i++) {\n      for (let j = ranges[i].fromRow; j <= ranges[i].toRow; j++) {\n        if (!hash[j]) {  // prevent duplicates\n          this.selectedRows.push(j);\n          hash[j] = {};\n        }\n        for (let k = ranges[i].fromCell; k <= ranges[i].toCell; k++) {\n          if (this.canCellBeSelected(j, k)) {\n            hash[j][this.columns[k].id] = this._options.selectedCellCssClass;\n          }\n        }\n      }\n      if (this.selectionBottomRow < ranges[i].toRow) { this.selectionBottomRow = ranges[i].toRow; }\n      if (this.selectionRightCell < ranges[i].toCell) { this.selectionRightCell = ranges[i].toCell; }\n    }\n\n    this.setCellCssStyles(this._options.selectedCellCssClass || '', hash);\n\n    if (this.selectionBottomRow >= 0 && this.selectionRightCell >= 0 && addDragHandle) {\n      const lowerRightCell = this.getCellNode(this.selectionBottomRow, this.selectionRightCell)\n      this.dragReplaceEl.createEl(lowerRightCell);\n    }\n\n    // check if the selected rows have changed (index order isn't important, so we'll sort them both before comparing them)\n    if (!this.arrayEquals(previousSelectedRows.sort(), this.selectedRows.sort())) {\n      const caller = ne?.detail?.caller ?? 'click';\n      // Use Set for faster performance\n      const selectedRowsSet = new Set(this.getSelectedRows());\n      const previousSelectedRowsSet = new Set(previousSelectedRows);\n\n      const newSelectedAdditions = Array.from(selectedRowsSet).filter(i => !previousSelectedRowsSet.has(i));\n      const newSelectedDeletions = Array.from(previousSelectedRowsSet).filter(i => !selectedRowsSet.has(i));\n\n      this.trigger(this.onSelectedRowsChanged, {\n        rows: this.getSelectedRows(),\n        previousSelectedRows,\n        caller,\n        changedSelectedRows: newSelectedAdditions,\n        changedUnselectedRows: newSelectedDeletions\n      }, e);\n    }\n  }\n\n  /**\n   * Processes a mouse wheel event by adjusting the vertical scroll (scrollTop) based on deltaY (scaled by rowHeight)\n   * and horizontal scroll (scrollLeft) based on deltaX. It then calls the internal scroll handler with the \u201Cmousewheel\u201D\n   * type and, if any scrolling occurred, prevents the default action.\n   *\n   * @param {MouseEvent} e - The mouse event.\n   * @param {number} _delta - Unused delta value.\n   * @param {number} deltaX - The horizontal scroll delta.\n   * @param {number} deltaY - The vertical scroll delta.\n   */\n  protected handleMouseWheel(e: MouseEvent, _delta: number, deltaX: number, deltaY: number) {\n    this.scrollHeight = this._viewportScrollContainerY.scrollHeight;\n    if (e.shiftKey) {\n      this.scrollLeft = this._viewportScrollContainerX.scrollLeft + (deltaX * 10);\n    } else {\n      this.scrollTop = Math.max(0, this._viewportScrollContainerY.scrollTop - (deltaY * this._options.rowHeight!));\n      this.scrollLeft = this._viewportScrollContainerX.scrollLeft + (deltaX * 10);\n    }\n    const handled = this._handleScroll('mousewheel');\n    if (handled) {\n      e.stopPropagation();\n    }\n  }\n\n  /**\n   * Called when a drag is initiated. It retrieves the cell from the event; if the cell does not exist or is not selectable,\n   * it returns false. Otherwise, it triggers the onDragInit event and returns the event\u2019s return value if\n   * propagation is stopped, else returns false to cancel the drag.\n   *\n   * @param {DragEvent} e - The drag event.\n   * @param {DragPosition} dd - The drag position data.\n   * @returns {boolean} - Whether the drag is valid or should be cancelled.\n   */\n  protected handleDragInit(e: DragEvent, dd: DragPosition) {\n    const cell = this.getCellFromEvent(e);\n    if (!cell || !this.cellExists(cell.row, cell.cell)) {\n      return false;\n    }\n\n    const retval = this.trigger(this.onDragInit, dd, e);\n    if (retval.isImmediatePropagationStopped()) {\n      return retval.getReturnValue();\n    }\n\n    // if nobody claims to be handling drag'n'drop by stopping immediate propagation,\n    // cancel out of it\n    return false;\n  }\n\n  /**\n   * Similar to handleDragInit, this method retrieves the cell from the event\n   * and triggers the `onDragStart` event. If the event propagation is stopped,\n   * it returns the specified value; otherwise, it returns false.\n   *\n   * @param {DragEvent} e - The drag event that initiated the action.\n   * @param {DragPosition} dd - The current drag position.\n   * @returns {boolean} - The result of the event trigger or false if propagation was not stopped.\n   */\n  protected handleDragStart(e: DragEvent, dd: DragPosition) {\n    const cell = this.getCellFromEvent(e);\n    if (!cell || !this.cellExists(cell.row, cell.cell)) {\n      return false;\n    }\n\n    if (this.currentEditor && !this.getEditorLock().commitCurrentEdit()) {\n      return false;\n    }\n\n    const retval = this.trigger(this.onDragStart, dd, e);\n    if (retval.isImmediatePropagationStopped()) {\n      return retval.getReturnValue();\n    }\n\n    return false;\n  }\n\n  // Triggers the onDrag event with the current drag position and event, and returns the event\u2019s return value.\n  protected handleDrag(e: DragEvent, dd: DragPosition) {\n    return this.trigger(this.onDrag, dd, e).getReturnValue();\n  }\n\n  // Called when a drag operation completes; it triggers the onDragEnd event with the current drag position and event.\n  protected handleDragEnd(e: DragEvent, dd: DragPosition) {\n    this.trigger(this.onDragEnd, dd, e);\n  }\n\n  /**\n   * Handles keydown events for grid navigation and editing.\n   * It triggers the `onKeyDown` event and, based on the key pressed (such as HOME, END, arrow keys, PAGE_UP/DOWN, TAB, ENTER, ESC),\n   * calls the appropriate navigation or editing method. If the key event is handled,\n   * it stops propagation and prevents the default browser behaviour.\n   *\n   * @param {KeyboardEvent & { originalEvent: Event; }} e - The keydown event, with the original event attached.\n   */\n  protected handleKeyDown(e: KeyboardEvent & { originalEvent: Event; }) {\n    const retval = this.trigger(this.onKeyDown, { row: this.activeRow, cell: this.activeCell }, e);\n    let handled: boolean | undefined | void = retval.isImmediatePropagationStopped();\n\n    if (!handled) {\n      if (!e.shiftKey && !e.altKey) {\n        if (this._options.editable && this.currentEditor?.keyCaptureList) {\n          if (this.currentEditor.keyCaptureList.indexOf(e.which) > -1) {\n            return;\n          }\n        }\n        if (e.ctrlKey && e.key === 'Home') {\n          this.navigateTopStart();\n        } else if (e.ctrlKey && e.key === 'End') {\n          this.navigateBottomEnd();\n        } else if (e.ctrlKey && e.key === 'ArrowUp') {\n          this.navigateTop();\n        } else if (e.ctrlKey && e.key === 'ArrowDown') {\n          this.navigateBottom();\n        } else if ((e.ctrlKey && e.key === 'ArrowLeft') || (!e.ctrlKey && e.key === 'Home')) {\n          this.navigateRowStart();\n        } else if ((e.ctrlKey && e.key === 'ArrowRight') || (!e.ctrlKey && e.key === 'End')) {\n          this.navigateRowEnd();\n        }\n      }\n    }\n    if (!handled) {\n      if (!e.shiftKey && !e.altKey && !e.ctrlKey) {\n        // editor may specify an array of keys to bubble\n        if (this._options.editable && this.currentEditor?.keyCaptureList) {\n          if (this.currentEditor.keyCaptureList.indexOf(e.which) > -1) {\n            return;\n          }\n        }\n        if (e.which === keyCode.ESCAPE) {\n          if (!this.getEditorLock()?.isActive()) {\n            return; // no editing mode to cancel, allow bubbling and default processing (exit without cancelling the event)\n          }\n          this.cancelEditAndSetFocus();\n        } else if (e.which === keyCode.PAGE_DOWN) {\n          this.navigatePageDown();\n          handled = true;\n        } else if (e.which === keyCode.PAGE_UP) {\n          this.navigatePageUp();\n          handled = true;\n        } else if (e.which === keyCode.LEFT) {\n          handled = this.navigateLeft();\n        } else if (e.which === keyCode.RIGHT) {\n          handled = this.navigateRight();\n        } else if (e.which === keyCode.UP) {\n          handled = this.navigateUp();\n        } else if (e.which === keyCode.DOWN) {\n          handled = this.navigateDown();\n        } else if (e.which === keyCode.TAB) {\n          handled = this.navigateNext();\n        } else if (e.which === keyCode.ENTER) {\n          if (this._options.editable) {\n            if (this.currentEditor) {\n              // adding new row\n              if (this.activeRow === this.getDataLength()) {\n                this.navigateDown();\n              } else {\n                this.commitEditAndSetFocus();\n              }\n            } else {\n              if (this.getEditorLock()?.commitCurrentEdit()) {\n                this.makeActiveCellEditable(undefined, undefined, e);\n              }\n            }\n          }\n          handled = true;\n        }\n      } else if (e.which === keyCode.TAB && e.shiftKey && !e.ctrlKey && !e.altKey) {\n        handled = this.navigatePrev();\n      }\n    }\n\n    const cell = this.getActiveCell();\n    const isChar = /^[\\p{L}\\p{N}\\p{P}\\p{S}\\s]$/u.test(e.key); // make sure it's a character being typed\n    if (!handled && this._options.autoEditByKeypress && cell && isChar && this.isCellEditable(cell.row, cell.cell) && !this.currentEditor) {\n      this.makeActiveCellEditable(undefined, false, e);\n    }\n\n    if (handled) {\n      // the event has been handled so don't let parent element (bubbling/propagation) or browser (default) handle it\n      e.stopPropagation();\n      e.preventDefault();\n      try {\n        (e as any).originalEvent.keyCode = 0; // prevent default behaviour for special keys in IE browsers (F3, F5, etc.)\n      }\n      // ignore exceptions - setting the original event's keycode throws access denied exception for \"Ctrl\"\n      // (hitting control key only, nothing else), \"Shift\" (maybe others)\n      // eslint-disable-next-line no-empty\n      catch (error) { }\n    }\n  }\n\n  /**\n   * Handles a click event on the grid. It logs the event (for debugging), ensures focus is restored if necessary,\n   * triggers the onClick event, and if the clicked cell is selectable and not already active, scrolls it into view\n   * and activates it.\n   *\n   * @param {DOMEvent<HTMLDivElement> | SlickEventData_} evt - The click event, either a native DOM event or a Slick event.\n   */\n  protected handleClick(evt: DOMEvent<HTMLDivElement> | SlickEventData_) {\n    const e = evt instanceof SlickEventData ? evt.getNativeEvent() : evt;\n\n    if (!this.currentEditor) {\n      // if this click resulted in some cell child node getting focus,\n      // don't steal it back - keyboard events will still bubble up\n      // IE9+ seems to default DIVs to tabIndex=0 instead of -1, so check for cell clicks directly.\n      if ((e as DOMEvent<HTMLDivElement>).target !== document.activeElement || (e as DOMEvent<HTMLDivElement>).target.classList.contains('slick-cell')) {\n        const selection = this.getTextSelection(); // store text-selection and restore it after\n        this.setFocus();\n        this.setTextSelection(selection as Range);\n      }\n    }\n\n    const cell = this.getCellFromEvent(e);\n    if (!cell || (this.currentEditor !== null && this.activeRow === cell.row && this.activeCell === cell.cell)) {\n      return;\n    }\n\n    evt = this.trigger(this.onClick, { row: cell.row, cell: cell.cell }, evt || e);\n    if ((evt as any).isImmediatePropagationStopped()) {\n      return;\n    }\n\n    // this optimisation causes trouble - MLeibman #329\n    // if ((activeCell !== cell.cell || activeRow !== cell.row) && canCellBeActive(cell.row, cell.cell)) {\n    if (this.canCellBeActive(cell.row, cell.cell)) {\n      if (!this.getEditorLock()?.isActive() || this.getEditorLock()?.commitCurrentEdit()) {\n        this.scrollRowIntoView(cell.row, false);\n\n        const preClickModeOn = !!(e as DOMEvent<HTMLDivElement>).target?.classList?.contains(preClickClassName);\n        const column = this.columns[cell.cell];\n        const suppressActiveCellChangedEvent = !!(this._options.editable && column?.editor && this._options.suppressActiveCellChangeOnEdit);\n        this.setActiveCellInternal(this.getCellNode(cell.row, cell.cell), null, preClickModeOn, suppressActiveCellChangedEvent, (e as DOMEvent<HTMLDivElement>));\n      }\n    }\n  }\n\n  /**\n   * Retrieves the cell DOM element from the event target.\n   * If the cell exists and is not currently being edited, triggers the onContextMenu event.\n   */\n  protected handleContextMenu(e: Event & { target: HTMLElement; }) {\n    const cell = e.target.closest('.slick-cell');\n    if (!cell) {\n      return;\n    }\n\n    // are we editing this cell?\n    if (this.activeCellNode === cell && this.currentEditor !== null) {\n      return;\n    }\n\n    this.trigger(this.onContextMenu, {}, e);\n  }\n\n  /**\n   * Retrieves the cell from the event and triggers the onDblClick event.\n   * If the event is not prevented and the grid is editable,\n   * it initiates cell editing by calling gotoCell with edit mode enabled.\n   */\n  protected handleDblClick(e: MouseEvent) {\n    const cell = this.getCellFromEvent(e);\n    if (!cell || (this.currentEditor !== null && this.activeRow === cell.row && this.activeCell === cell.cell)) {\n      return;\n    }\n\n    this.trigger(this.onDblClick, { row: cell.row, cell: cell.cell }, e);\n    if (e.defaultPrevented) {\n      return;\n    }\n\n    if (this._options.editable) {\n      this.gotoCell(cell.row, cell.cell, true, e);\n    }\n  }\n\n  /**\n   * When the mouse enters a header column element, retrieves the column definition from the element\u2019s\n   * stored data and triggers the onHeaderMouseEnter event with the column and grid reference.\n   */\n  protected handleHeaderMouseEnter(e: MouseEvent & { target: HTMLElement; }) {\n    const c = Utils.storage.get(e.target.closest('.slick-header-column'), 'column');\n    if (!c) {\n      return;\n    }\n    this.trigger(this.onHeaderMouseEnter, {\n      column: c,\n      grid: this\n    }, e);\n  }\n\n  /**\n   * Similar to handleHeaderMouseEnter, but triggers the onHeaderMouseLeave event\n   * when the mouse leaves a header column element.\n   */\n  protected handleHeaderMouseLeave(e: MouseEvent & { target: HTMLElement; }) {\n    const c = Utils.storage.get(e.target.closest('.slick-header-column'), 'column');\n    if (!c) {\n      return;\n    }\n    this.trigger(this.onHeaderMouseLeave, {\n      column: c,\n      grid: this\n    }, e);\n  }\n\n  /**\n   * Retrieves the column from the header row cell element and triggers the onHeaderRowMouseEnter event.\n   */\n  protected handleHeaderRowMouseEnter(e: MouseEvent & { target: HTMLElement; }) {\n    const c = Utils.storage.get(e.target.closest('.slick-headerrow-column'), 'column');\n    if (!c) {\n      return;\n    }\n    this.trigger(this.onHeaderRowMouseEnter, {\n      column: c,\n      grid: this\n    }, e);\n  }\n\n  /**\n   * Retrieves the column from the header row cell element and triggers the onHeaderRowMouseLeave event.\n   */\n  protected handleHeaderRowMouseLeave(e: MouseEvent & { target: HTMLElement; }) {\n    const c = Utils.storage.get(e.target.closest('.slick-headerrow-column'), 'column');\n    if (!c) {\n      return;\n    }\n    this.trigger(this.onHeaderRowMouseLeave, {\n      column: c,\n      grid: this\n    }, e);\n  }\n\n  /**\n   * Retrieves the header column element and its associated column definition,\n   * then triggers the onHeaderContextMenu event with the column data.\n   */\n  protected handleHeaderContextMenu(e: MouseEvent & { target: HTMLElement; }) {\n    const header = e.target.closest('.slick-header-column');\n    const column = header && Utils.storage.get(header, 'column');\n    this.trigger(this.onHeaderContextMenu, { column }, e);\n  }\n\n  /**\n   * If not in the middle of a column resize, retrieves the header column element and its column definition, then triggers the onHeaderClick event.\n   */\n  protected handleHeaderClick(e: MouseEvent & { target: HTMLElement; }) {\n    if (!this.columnResizeDragging) {\n      const header = e.target.closest('.slick-header-column');\n      const column = header && Utils.storage.get(header, 'column');\n      if (column) {\n        this.trigger(this.onHeaderClick, { column }, e);\n      }\n    }\n  }\n\n  /**\n   * Triggers the onPreHeaderContextMenu event with the event target (typically the pre\u2013header panel).\n   */\n  protected handlePreHeaderContextMenu(e: MouseEvent & { target: HTMLElement; }) {\n    this.trigger(this.onPreHeaderContextMenu, { node: e.target }, e);\n  }\n\n  /**\n   * If not resizing columns, triggers the onPreHeaderClick event with the event target.\n   */\n  protected handlePreHeaderClick(e: MouseEvent & { target: HTMLElement; }) {\n    if (!this.columnResizeDragging) {\n      this.trigger(this.onPreHeaderClick, { node: e.target }, e);\n    }\n  }\n\n  /**\n   * Retrieves the footer cell element and its column definition, then triggers the onFooterContextMenu event.\n   */\n  protected handleFooterContextMenu(e: MouseEvent & { target: HTMLElement; }) {\n    const footer = e.target.closest('.slick-footerrow-column');\n    const column = footer && Utils.storage.get(footer, 'column');\n    this.trigger(this.onFooterContextMenu, { column }, e);\n  }\n\n  /**\n   * Retrieves the footer cell element and its column definition, then triggers the onFooterClick event.\n   */\n  protected handleFooterClick(e: MouseEvent & { target: HTMLElement; }) {\n    const footer = e.target.closest('.slick-footerrow-column');\n    const column = footer && Utils.storage.get(footer, 'column');\n    this.trigger(this.onFooterClick, { column }, e);\n  }\n\n  /**\n   * Triggers the onMouseEnter event when the mouse pointer enters a cell element.\n   */\n  protected handleCellMouseOver(e: MouseEvent & { target: HTMLElement; }) {\n    this.trigger(this.onMouseEnter, {}, e);\n  }\n\n  /**\n   * Handles the change in the position of the active cell.\n   * Triggers the `onActiveCellPositionChanged` event and adjusts the editor visibility and positioning.\n   */\n  protected handleActiveCellPositionChange() {\n    if (!this.activeCellNode) {\n      return;\n    }\n\n    this.trigger(this.onActiveCellPositionChanged, {});\n\n    if (this.currentEditor) {\n      const cellBox = this.getActiveCellPosition();\n      if (this.currentEditor.show && this.currentEditor.hide) {\n        if (!cellBox.visible) {\n          this.currentEditor.hide();\n        } else {\n          this.currentEditor.show();\n        }\n      }\n\n      if (this.currentEditor.position) {\n        this.currentEditor.position(cellBox);\n      }\n    }\n  }\n\n  /**\n   * limits the frequency at which the provided action is executed.\n   * call enqueue to execute the action - it will execute either immediately or, if it was executed less than minPeriod_ms in the past, as soon as minPeriod_ms has expired.\n   * call dequeue to cancel any pending action.\n   */\n  protected actionThrottle(action: () => void, minPeriod_ms: number) {\n    let blocked = false;\n    let queued = false;\n\n    const enqueue = () => {\n      if (!blocked) {\n        blockAndExecute();\n      } else {\n        queued = true;\n      }\n    };\n\n    const dequeue = () => {\n      queued = false;\n    };\n\n    const blockAndExecute = () => {\n      blocked = true;\n      window.clearTimeout(this._executionBlockTimer);\n      this._executionBlockTimer = window.setTimeout(unblock, minPeriod_ms);\n      action.call(this);\n    };\n\n    const unblock = () => {\n      if (queued) {\n        dequeue();\n        blockAndExecute();\n      } else {\n        blocked = false;\n      }\n    };\n\n    return {\n      enqueue: enqueue.bind(this),\n      dequeue: dequeue.bind(this)\n    };\n  }\n\n  /**\n   * Returns a hash containing row and cell indexes from a standard W3C event.\n   * @param {*} event A standard W3C event.\n   */\n  getCellFromEvent(evt: Event | SlickEventData_) {\n    const e = evt instanceof SlickEventData ? evt.getNativeEvent() : evt;\n    const targetEvent: any = (e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e;\n\n    const cellNode = (e as Event & { target: HTMLElement }).target.closest('.slick-cell');\n    if (!cellNode) {\n      return null;\n    }\n\n    let row = this.getRowFromNode(cellNode.parentNode as HTMLElement);\n\n    if (this.hasFrozenRows) {\n      let rowOffset = 0;\n      const c = Utils.offset(Utils.parents(cellNode, '.grid-canvas')[0] as HTMLElement);\n      const isBottom = Utils.parents(cellNode, '.grid-canvas-bottom').length;\n\n      if (isBottom) {\n        rowOffset = (this._options.frozenBottom) ? Utils.height(this._canvasTopL) as number : this.frozenRowsHeight;\n      }\n\n      row = this.getCellFromPoint(targetEvent.clientX - c!.left, targetEvent.clientY - c!.top + rowOffset + document.documentElement.scrollTop).row;\n    }\n\n    const cell = this.getCellFromNode(cellNode as HTMLElement);\n\n    if (!Utils.isDefined(row) || !Utils.isDefined(cell)) {\n      return null;\n    }\n    return { row, cell };\n  }\n\n  /////////////////////////////////////////////////////////////////////\n  // End Event Management and Interactivity\n  ///////////////////////////////////////////////////////////////////\n\n  //////////////////////////////////////////////////////////////////////\n  // Rendering and Layout Management\n  ///////////////////////////////////////////////////////////////////\n\n  /**\n   * Apply HTML code by 3 different ways depending on what is provided as input and what options are enabled.\n   * 1. value is an HTMLElement or DocumentFragment, then first empty the target and simply append the HTML to the target element.\n   * 2. value is string and `enableHtmlRendering` is enabled, then use `target.innerHTML = value;`\n   * 3. value is string and `enableHtmlRendering` is disabled, then use `target.textContent = value;`\n   * @param {HTMLElement} target  - target element to apply to\n   * @param {string | HTMLElement | DocumentFragment} val - input value can be either a string or an HTMLElement\n   * @param {{ emptyTarget?: boolean; skipEmptyReassignment?: boolean; }} [options]  -\n   *   `emptyTarget`, defaults to true, will empty the target.\n   *   `skipEmptyReassignment`, defaults to true, when enabled it will not try to reapply an empty value when the target is already empty\n   */\n  applyHtmlCode(target: HTMLElement, val: string | HTMLElement | DocumentFragment, options?: { emptyTarget?: boolean; skipEmptyReassignment?: boolean; }) {\n    if (target) {\n      if (val instanceof HTMLElement || val instanceof DocumentFragment) {\n        // first empty target and then append new HTML element\n        const emptyTarget = options?.emptyTarget !== false;\n        if (emptyTarget) {\n          Utils.emptyElement(target);\n        }\n        target.appendChild(val);\n      } else {\n        // when it's already empty and we try to reassign empty, it's probably ok to skip the assignment\n        const skipEmptyReassignment = options?.skipEmptyReassignment !== false;\n        if (skipEmptyReassignment && !Utils.isDefined(val) && !target.innerHTML) {\n          return;\n        }\n\n        let sanitizedText = val;\n        if (typeof sanitizedText === 'number' || typeof sanitizedText === 'boolean') {\n          target.textContent = sanitizedText;\n        } else {\n          sanitizedText = this.sanitizeHtmlString(val as string);\n\n          // apply HTML when enableHtmlRendering is enabled but make sure we do have a value (without a value, it will simply use `textContent` to clear text content)\n          if (this._options.enableHtmlRendering && sanitizedText) {\n            target.innerHTML = sanitizedText;\n          } else {\n            target.textContent = sanitizedText;\n          }\n        }\n      }\n    }\n  }\n\n  /** Get Grid Canvas Node DOM Element */\n  getCanvasNode(columnIdOrIdx?: number | string, rowIndex?: number) {\n    return this._getContainerElement(this.getCanvases(), columnIdOrIdx, rowIndex) as HTMLDivElement;\n  }\n\n  /** Get the canvas DOM element */\n  getActiveCanvasNode(e?: Event | SlickEventData_) {\n    if (e === undefined) {\n      return this._activeCanvasNode;\n    }\n\n    if (e instanceof SlickEventData) {\n      e = e.getNativeEvent<Event>();\n    }\n\n    this._activeCanvasNode = (e as any)?.target.closest('.grid-canvas');\n    return this._activeCanvasNode;\n  }\n\n  /** Get the canvas DOM element */\n  getCanvases() {\n    return this._canvas;\n  }\n\n  /** Get the Viewport DOM node element */\n  getViewportNode(columnIdOrIdx?: number | string, rowIndex?: number) {\n    return this._getContainerElement(this.getViewports(), columnIdOrIdx, rowIndex);\n  }\n\n  /** Get all the Viewport node elements */\n  getViewports() {\n    return this._viewport;\n  }\n\n  /**\n   * Calls setActiveViewportNode (using the provided event) to set the active viewport,\n   * then returns the active viewport DOM element.\n   *\n   * @param e\n   * @returns\n   */\n  getActiveViewportNode(e: Event | SlickEventData_) {\n    this.setActiveViewportNode(e);\n\n    return this._activeViewportNode;\n  }\n\n  /**\n   * Sets an active viewport node\n   *\n   * @param {number | string} [columnIdOrIdx] - The column identifier or index.\n   * @param {number} [rowIndex] - The row index.\n   * @returns {HTMLElement} The corresponding viewport element.\n   */\n  setActiveViewportNode(e: Event | SlickEventData_) {\n    if (e instanceof SlickEventData) {\n      e = e.getNativeEvent<Event>();\n    }\n    this._activeViewportNode = (e as any)?.target.closest('.slick-viewport');\n    return this._activeViewportNode;\n  }\n\n  /** Get the headers width in pixel\n   *\n   * Iterates over all columns to accumulate the widths for the left and right header sections,\n   * adds scrollbar width if needed, and adjusts for frozen columns.\n   * Returns the computed overall header width in pixels.\n  */\n  getHeadersWidth() {\n    this.headersWidth = this.headersWidthL = this.headersWidthR = 0;\n    const includeScrollbar = !this._options.autoHeight;\n\n    let i = 0;\n    const ii = this.columns.length;\n    for (i = 0; i < ii; i++) {\n      if (!this.columns[i] || this.columns[i].hidden) { continue; }\n\n      const width = this.columns[i].width;\n\n      if ((this._options.frozenColumn!) > -1 && (i > this._options.frozenColumn!)) {\n        this.headersWidthR += width || 0;\n      } else {\n        this.headersWidthL += width || 0;\n      }\n    }\n\n    if (includeScrollbar) {\n      if ((this._options.frozenColumn!) > -1 && (i > this._options.frozenColumn!)) {\n        this.headersWidthR += this.scrollbarDimensions?.width ?? 0;\n      } else {\n        this.headersWidthL += this.scrollbarDimensions?.width ?? 0;\n      }\n    }\n\n    if (this.hasFrozenColumns()) {\n      this.headersWidthL = this.headersWidthL + 1000;\n\n      this.headersWidthR = Math.max(this.headersWidthR, this.viewportW) + this.headersWidthL;\n      this.headersWidthR += this.scrollbarDimensions?.width ?? 0;\n    } else {\n      this.headersWidthL += this.scrollbarDimensions?.width ?? 0;\n      this.headersWidthL = Math.max(this.headersWidthL, this.viewportW) + 1000;\n    }\n\n    this.headersWidth = this.headersWidthL + this.headersWidthR;\n    return Math.max(this.headersWidth, this.viewportW) + 1000;\n  }\n\n  /** Get the grid canvas width\n   *\n   * Computes the available width (considering vertical scrollbar if present),\n   * then iterates over the columns (left vs. right based on frozen columns) to sum their widths.\n   * If full\u2013width rows are enabled, extra width is added. Returns the total calculated width.\n  */\n  getCanvasWidth(): number {\n    const availableWidth = this.getViewportInnerWidth();\n    let i = this.columns.length;\n\n    this.canvasWidthL = this.canvasWidthR = 0;\n\n    while (i--) {\n      if (!this.columns[i] || this.columns[i].hidden) { continue; }\n\n      if (this.hasFrozenColumns() && (i > this._options.frozenColumn!)) {\n        this.canvasWidthR += this.columns[i].width || 0;\n      } else {\n        this.canvasWidthL += this.columns[i].width || 0;\n      }\n    }\n    let totalRowWidth = this.canvasWidthL + this.canvasWidthR;\n    if (this._options.fullWidthRows) {\n      const extraWidth = Math.max(totalRowWidth, availableWidth) - totalRowWidth;\n      if (extraWidth > 0) {\n        totalRowWidth += extraWidth;\n        if (this.hasFrozenColumns()) {\n          this.canvasWidthR += extraWidth;\n        } else {\n          this.canvasWidthL += extraWidth;\n        }\n      }\n    }\n    return totalRowWidth;\n  }\n\n  /**\n   * Validate that the column freeze is allowed in the browser by making sure that the frozen column is not exceeding the available and visible left canvas width.\n   * Note that it will only validate when `invalidColumnFreezeWidthCallback` or `throwWhenFrozenNotAllViewable` grid option is enabled.\n   * @param {Number} frozenColumn the column index to freeze at\n   * @param {Boolean} [forceAlert] tri-state flag to alert when frozen column is invalid\n   *  - if `undefined` it will do the condition check and never alert more than once\n   *  - if `true` it will do the condition check and always alert even if it was called before\n   *  - if `false` it will do the condition check but always skip the alert\n   */\n  validateColumnFreezeWidth(frozenColumn = -1, forceAlert?: boolean): boolean {\n    if (frozenColumn >= 0) {\n      let canvasWidthL = 0;\n      this.columns.forEach((col, i) => {\n        if (!col.hidden && i <= frozenColumn) {\n          const { minWidth = 0, maxWidth = 0, width = this._options.defaultColumnWidth! } = col;\n          let fwidth = width < minWidth ? minWidth : width;\n          if (maxWidth > 0 && fwidth > maxWidth) {\n            fwidth = maxWidth;\n          }\n          canvasWidthL += fwidth;\n        }\n      });\n\n      const cWidth = Utils.width(this._container) || 0;\n      if (cWidth > 0 && canvasWidthL > cWidth && !this._options.skipFreezeColumnValidation) {\n        if ((forceAlert !== false && !this._invalidfrozenAlerted) || forceAlert === true) {\n          if (this._options.invalidColumnFreezeWidthCallback || this._options.throwWhenFrozenNotAllViewable) {\n            if (this._options.throwWhenFrozenNotAllViewable) {\n              throw new Error(this._options.invalidColumnFreezeWidthMessage);\n            }\n            this._options.invalidColumnFreezeWidthCallback?.(this._options.invalidColumnFreezeWidthMessage!);\n            this._invalidfrozenAlerted = true;\n          }\n        }\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * From a new set of columns, different than current grid columns, we'll recalculate the `frozenColumn` index position by comparing its column `id`\n   * and recalculating the `frozenColumn` index to find out if it is different from a new set of columns.\n   * @param {Column[]} newColumns - new columns to calculate frozen index from\n   * @param {String|Number} [columnId] - optional column id to calculate from (otherwise it will find the current frozen column id)\n   * @param {Boolean} [applyIndexChange] - whether to apply index changes to the frozen column\n   * @returns {number} - the recalculated frozen column index\n   */\n  calculateFrozenColumnIndexById(newColumns: C[], columnId?: string | number | null, applyIndexChange = false): number {\n    const frozenColumnIdx = this.getFrozenColumnIdx();\n    columnId ??= frozenColumnIdx >= 0 ? this.columns[frozenColumnIdx as any]?.id : undefined;\n    if (columnId !== undefined) {\n      const newFrozenColumnIdx = newColumns.findIndex((col) => col.id === columnId);\n      if (newFrozenColumnIdx >= 0 && newFrozenColumnIdx !== frozenColumnIdx) {\n        if (applyIndexChange) {\n          this.setOptions({ frozenColumn: newFrozenColumnIdx } as Partial<O>);\n        }\n        return newFrozenColumnIdx;\n      }\n    }\n    return frozenColumnIdx;\n  }\n\n  /**\n   * Validate that there is at least 1, or more, column to the right of the frozen column otherwise show an error (we do this check before calling `setColumns()`).\n   * Note that it will only validate when `invalidColumnFreezePickerCallback` grid option is enabled.\n   * @param {Column[]} newColumns the new columns that will later be provided to `setColumns()`\n   * @param {Boolean} [forceAlert] tri-state flag to alert when frozen column is invalid\n   *  - if `undefined` it will do the condition check and never alert more than once\n   *  - if `true` it will do the condition check and always alert even if it was called before\n   *  - if `false` it will do the condition check but always skip the alert\n   */\n  validateSetColumnFreeze(newColumns: C[], forceAlert?: boolean): boolean {\n    const frozenColumnIdx = this.calculateFrozenColumnIndexById(newColumns);\n    if (frozenColumnIdx >= 0 && frozenColumnIdx > newColumns.length - 2 && !this._options.skipFreezeColumnValidation) {\n      if ((forceAlert !== false && !this._invalidfrozenAlerted) || forceAlert === true) {\n        this._options.invalidColumnFreezePickerCallback?.(this._options.invalidColumnFreezePickerMessage!);\n        this._invalidfrozenAlerted = true;\n      }\n      return false;\n    }\n    return true;\n  }\n\n  /**\n   * Recalculates the canvas width by calling getCanvasWidth and then adjusts widths of header containers,\n   * canvases, panels, and viewports. If widths have changed (or forced), it applies the new column widths\n   * by calling applyColumnWidths.\n   *\n   * @param {boolean} [forceColumnWidthsUpdate] - Whether to force an update of column widths.\n   */\n  protected updateCanvasWidth(forceColumnWidthsUpdate?: boolean) {\n    const oldCanvasWidth = this.canvasWidth;\n    const oldCanvasWidthL = this.canvasWidthL;\n    const oldCanvasWidthR = this.canvasWidthR;\n    this.canvasWidth = this.getCanvasWidth();\n\n    if (this._options.createTopHeaderPanel) {\n      Utils.width(this._topHeaderPanel, this._options.topHeaderPanelWidth ?? this.canvasWidth);\n    }\n\n    const widthChanged = this.canvasWidth !== oldCanvasWidth || this.canvasWidthL !== oldCanvasWidthL || this.canvasWidthR !== oldCanvasWidthR;\n\n    if (widthChanged || this.hasFrozenColumns() || this.hasFrozenRows) {\n      Utils.width(this._canvasTopL, this.canvasWidthL);\n\n      this.getHeadersWidth();\n\n      Utils.width(this._headerL, this.headersWidthL);\n      Utils.width(this._headerR, this.headersWidthR);\n\n      if (this.hasFrozenColumns()) {\n        Utils.width(this._canvasTopR, this.canvasWidthR);\n\n        Utils.width(this._paneHeaderL, this.canvasWidthL);\n        Utils.setStyleSize(this._paneHeaderR, 'left', this.canvasWidthL);\n        Utils.setStyleSize(this._paneHeaderR, 'width', this.viewportW - this.canvasWidthL);\n\n        Utils.width(this._paneTopL, this.canvasWidthL);\n        Utils.setStyleSize(this._paneTopR, 'left', this.canvasWidthL);\n        Utils.width(this._paneTopR, this.viewportW - this.canvasWidthL);\n\n        Utils.width(this._headerRowScrollerL, this.canvasWidthL);\n        Utils.width(this._headerRowScrollerR, this.viewportW - this.canvasWidthL);\n\n        Utils.width(this._headerRowL, this.canvasWidthL);\n        Utils.width(this._headerRowR, this.canvasWidthR);\n\n        if (this._options.createFooterRow) {\n          Utils.width(this._footerRowScrollerL, this.canvasWidthL);\n          Utils.width(this._footerRowScrollerR, this.viewportW - this.canvasWidthL);\n\n          Utils.width(this._footerRowL, this.canvasWidthL);\n          Utils.width(this._footerRowR, this.canvasWidthR);\n        }\n        if (this._options.createPreHeaderPanel) {\n          Utils.width(this._preHeaderPanel, this._options.preHeaderPanelWidth ?? this.canvasWidth);\n        }\n        Utils.width(this._viewportTopL, this.canvasWidthL);\n        Utils.width(this._viewportTopR, this.viewportW - this.canvasWidthL);\n\n        if (this.hasFrozenRows) {\n          Utils.width(this._paneBottomL, this.canvasWidthL);\n          Utils.setStyleSize(this._paneBottomR, 'left', this.canvasWidthL);\n\n          Utils.width(this._viewportBottomL, this.canvasWidthL);\n          Utils.width(this._viewportBottomR, this.viewportW - this.canvasWidthL);\n\n          Utils.width(this._canvasBottomL, this.canvasWidthL);\n          Utils.width(this._canvasBottomR, this.canvasWidthR);\n        }\n      } else {\n        Utils.width(this._paneHeaderL, '100%');\n        Utils.width(this._paneTopL, '100%');\n        Utils.width(this._headerRowScrollerL, '100%');\n        Utils.width(this._headerRowL, this.canvasWidth);\n\n        if (this._options.createFooterRow) {\n          Utils.width(this._footerRowScrollerL, '100%');\n          Utils.width(this._footerRowL, this.canvasWidth);\n        }\n\n        if (this._options.createPreHeaderPanel) {\n          Utils.width(this._preHeaderPanel, this._options.preHeaderPanelWidth ?? this.canvasWidth);\n        }\n        Utils.width(this._viewportTopL, '100%');\n\n        if (this.hasFrozenRows) {\n          Utils.width(this._viewportBottomL, '100%');\n          Utils.width(this._canvasBottomL, this.canvasWidthL);\n        }\n      }\n    }\n\n    this.viewportHasHScroll = (this.canvasWidth >= this.viewportW - (this.scrollbarDimensions?.width ?? 0));\n\n    Utils.width(this._headerRowSpacerL, this.canvasWidth + (this.viewportHasVScroll ? (this.scrollbarDimensions?.width ?? 0) : 0));\n    Utils.width(this._headerRowSpacerR, this.canvasWidth + (this.viewportHasVScroll ? (this.scrollbarDimensions?.width ?? 0) : 0));\n\n    if (this._options.createFooterRow) {\n      Utils.width(this._footerRowSpacerL, this.canvasWidth + (this.viewportHasVScroll ? (this.scrollbarDimensions?.width ?? 0) : 0));\n      Utils.width(this._footerRowSpacerR, this.canvasWidth + (this.viewportHasVScroll ? (this.scrollbarDimensions?.width ?? 0) : 0));\n    }\n\n    if (widthChanged || forceColumnWidthsUpdate) {\n      this.applyColumnWidths();\n    }\n  }\n\n  /** @alias `getPreHeaderPanelLeft` */\n  getPreHeaderPanel() {\n    return this._preHeaderPanel;\n  }\n\n  /** Get the Pre-Header Panel Left DOM node element */\n  getPreHeaderPanelLeft() {\n    return this._preHeaderPanel;\n  }\n\n  /** Get the Pre-Header Panel Right DOM node element */\n  getPreHeaderPanelRight() {\n    return this._preHeaderPanelR;\n  }\n\n  /** Get the Top-Header Panel DOM node element */\n  getTopHeaderPanel() {\n    return this._topHeaderPanel;\n  }\n\n  /**\n   * Based on whether frozen columns (and/or rows) are enabled, shows or hides the right\u2013side header\n   * and top panes as well as the bottom panes. If no frozen columns exist, hides right\u2013side panes;\n   * otherwise, conditionally shows or hides the bottom panes depending on whether frozen rows exist.\n   */\n  protected setPaneVisibility() {\n    if (this.hasFrozenColumns()) {\n      Utils.show(this._paneHeaderR);\n      Utils.show(this._paneTopR);\n\n      if (this.hasFrozenRows) {\n        Utils.show(this._paneBottomL);\n        Utils.show(this._paneBottomR);\n      } else {\n        Utils.hide(this._paneBottomR);\n        Utils.hide(this._paneBottomL);\n      }\n    } else {\n      Utils.hide(this._paneHeaderR);\n      Utils.hide(this._paneTopR);\n      Utils.hide(this._paneBottomR);\n\n      if (this.hasFrozenRows) {\n        Utils.show(this._paneBottomL);\n      } else {\n        Utils.hide(this._paneBottomR);\n        Utils.hide(this._paneBottomL);\n      }\n    }\n  }\n\n  /**\n   * Sets the CSS overflowX and overflowY styles for all four viewport elements\n   * (top\u2013left, top\u2013right, bottom\u2013left, bottom\u2013right) based on the grid\u2019s frozen columns/rows status\n   * and options such as alwaysAllowHorizontalScroll and alwaysShowVerticalScroll.\n   * If a viewportClass is specified in options, the class is added to each viewport.\n   */\n  protected setOverflow() {\n    this._viewportTopL.style.overflowX = (this.hasFrozenColumns()) ? (this.hasFrozenRows && !this._options.alwaysAllowHorizontalScroll ? 'hidden' : 'scroll') : (this.hasFrozenRows && !this._options.alwaysAllowHorizontalScroll ? 'hidden' : 'auto');\n    this._viewportTopL.style.overflowY = (!this.hasFrozenColumns() && this._options.alwaysShowVerticalScroll) ? 'scroll' : ((this.hasFrozenColumns()) ? (this.hasFrozenRows ? 'hidden' : 'hidden') : (this.hasFrozenRows ? 'scroll' : 'auto'));\n\n    this._viewportTopR.style.overflowX = (this.hasFrozenColumns()) ? (this.hasFrozenRows && !this._options.alwaysAllowHorizontalScroll ? 'hidden' : 'scroll') : (this.hasFrozenRows && !this._options.alwaysAllowHorizontalScroll ? 'hidden' : 'auto');\n    this._viewportTopR.style.overflowY = this._options.alwaysShowVerticalScroll ? 'scroll' : ((this.hasFrozenColumns()) ? (this.hasFrozenRows ? 'scroll' : 'auto') : (this.hasFrozenRows ? 'scroll' : 'auto'));\n\n    this._viewportBottomL.style.overflowX = (this.hasFrozenColumns()) ? (this.hasFrozenRows && !this._options.alwaysAllowHorizontalScroll ? 'scroll' : 'auto') : (this.hasFrozenRows && !this._options.alwaysAllowHorizontalScroll ? 'auto' : 'auto');\n    this._viewportBottomL.style.overflowY = (!this.hasFrozenColumns() && this._options.alwaysShowVerticalScroll) ? 'scroll' : ((this.hasFrozenColumns()) ? (this.hasFrozenRows ? 'hidden' : 'hidden') : (this.hasFrozenRows ? 'scroll' : 'auto'));\n\n    this._viewportBottomR.style.overflowX = (this.hasFrozenColumns()) ? (this.hasFrozenRows && !this._options.alwaysAllowHorizontalScroll ? 'scroll' : 'auto') : (this.hasFrozenRows && !this._options.alwaysAllowHorizontalScroll ? 'auto' : 'auto');\n    this._viewportBottomR.style.overflowY = this._options.alwaysShowVerticalScroll ? 'scroll' : ((this.hasFrozenColumns()) ? (this.hasFrozenRows ? 'auto' : 'auto') : (this.hasFrozenRows ? 'auto' : 'auto'));\n\n    if (this._options.viewportClass) {\n      const viewportClassList = Utils.classNameToList(this._options.viewportClass);\n      this._viewportTopL.classList.add(...viewportClassList);\n      this._viewportTopR.classList.add(...viewportClassList);\n      this._viewportBottomL.classList.add(...viewportClassList);\n      this._viewportBottomR.classList.add(...viewportClassList);\n    }\n  }\n\n  /**\n   * Creates a <style> element (using a provided nonce if available) and appends it to the shadowRoot (or document head).\n   * Inserts rules that set heights for panels, header rows, footer rows, and cells based on grid options.\n   * It also loops through each column (if not hidden) to add empty rules for left and right column classes.\n   * If the stylesheet cannot be accessed via the modern API, it falls back to createCssRulesAlternative.\n   */\n  protected createCssRules() {\n    this._style = document.createElement('style');\n    this._style.nonce = this._options.nonce || '';\n    (this._options.shadowRoot || document.head).appendChild(this._style);\n\n    const rowHeight = (this._options.rowHeight! - this.cellHeightDiff);\n    const rules = [\n      `.${this.uid} .slick-group-header-column { left: 1000px; }`,\n      `.${this.uid} .slick-header-column { left: 1000px; }`,\n      `.${this.uid} .slick-top-panel { height: ${this._options.topPanelHeight}px; }`,\n      `.${this.uid} .slick-preheader-panel { height: ${this._options.preHeaderPanelHeight}px; }`,\n      `.${this.uid} .slick-topheader-panel { height: ${this._options.topHeaderPanelHeight}px; }`,\n      `.${this.uid} .slick-headerrow-columns { height: ${this._options.headerRowHeight}px; }`,\n      `.${this.uid} .slick-footerrow-columns { height: ${this._options.footerRowHeight}px; }`,\n      `.${this.uid} .slick-cell { height: ${rowHeight}px; }`,\n      `.${this.uid} .slick-row { height: ${this._options.rowHeight}px; }`,\n    ];\n\n    const sheet = this._style.sheet;\n    if (sheet) {\n      rules.forEach(rule => {\n        sheet.insertRule(rule);\n      });\n\n      for (let i = 0; i < this.columns.length; i++) {\n        if (!this.columns[i] || this.columns[i].hidden) { continue; }\n\n        sheet.insertRule(`.${this.uid} .l${i} { }`);\n        sheet.insertRule(`.${this.uid} .r${i} { }`);\n      }\n    } else {\n      // fallback in case the 1st approach doesn't work, let's use our previous way of creating the css rules which is what works in Salesforce :(\n      this.createCssRulesAlternative(rules);\n    }\n  }\n\n  /** Create CSS rules via template in case the first approach with createElement('style') doesn't work.\n   *\n   * In cases where the standard method of inserting CSS rules fails (as may occur in some environments),\n   * this function creates a <style> element using a template, appends it to the document, and then adds\n   * the provided CSS rules as a concatenated text node.\n   * Also appends rules for each visible column for left and right classes.\n   */\n  protected createCssRulesAlternative(rules: string[]) {\n    const template = document.createElement('template');\n    template.innerHTML = '<style type=\"text/css\" rel=\"stylesheet\" />';\n    this._style = template.content.firstChild as HTMLStyleElement;\n    (this._options.shadowRoot || document.head).appendChild(this._style);\n\n    for (let i = 0; i < this.columns.length; i++) {\n      if (!this.columns[i] || this.columns[i].hidden) { continue; }\n\n      rules.push(`.${this.uid} .l${i} { }`);\n      rules.push(`.${this.uid} .r${i} { }`);\n    }\n\n    if ((this._style as any).styleSheet) { // IE\n      (this._style as any).styleSheet.cssText = rules.join(' ');\n    } else {\n      this._style.appendChild(document.createTextNode(rules.join(' ')));\n    }\n  }\n\n  /**\n   * Finds and caches the CSS rules from the grid\u2019s dynamically created stylesheet\n   * that correspond to a column\u2019s left (\".lX\") and right (\".rX\") classes.\n   * Returns an object containing the left and right rule objects for the specified column index.\n   * If the stylesheet has not been located yet, it iterates through available styleSheets to find it.\n   *\n   * @param idx\n   * @returns\n   */\n  protected getColumnCssRules(idx: number) {\n    let i: number;\n    if (!this.stylesheet) {\n      const sheets: any = (this._options.shadowRoot || document).styleSheets;\n\n      if (this._options.devMode && typeof this._options.devMode?.ownerNodeIndex === 'number' && this._options.devMode.ownerNodeIndex >= 0) {\n        sheets[this._options.devMode.ownerNodeIndex].ownerNode = this._style;\n      }\n\n      for (i = 0; i < sheets.length; i++) {\n        if ((sheets[i].ownerNode || sheets[i].owningElement) === this._style) {\n          this.stylesheet = sheets[i];\n          break;\n        }\n      }\n\n      if (!this.stylesheet) {\n        throw new Error('SlickGrid Cannot find stylesheet.');\n      }\n\n      // find and cache column CSS rules\n      this.columnCssRulesL = [];\n      this.columnCssRulesR = [];\n      const cssRules = (this.stylesheet.cssRules || this.stylesheet.rules);\n      let matches;\n      let columnIdx;\n      for (i = 0; i < cssRules.length; i++) {\n        const selector = cssRules[i].selectorText;\n        if (matches = /\\.l\\d+/.exec(selector)) {\n          columnIdx = parseInt(matches[0].substr(2, matches[0].length - 2), 10);\n          this.columnCssRulesL[columnIdx] = cssRules[i];\n        } else if (matches = /\\.r\\d+/.exec(selector)) {\n          columnIdx = parseInt(matches[0].substr(2, matches[0].length - 2), 10);\n          this.columnCssRulesR[columnIdx] = cssRules[i];\n        }\n      }\n    }\n\n    return {\n      left: this.columnCssRulesL![idx],\n      right: this.columnCssRulesR![idx]\n    };\n  }\n\n  /**\n   * Removes the dynamically created <style> element (if it exists) from the DOM and\n   * clears the cached stylesheet reference.\n   */\n  protected removeCssRules() {\n    this._style?.remove();\n    this.stylesheet = null;\n  }\n\n  /** Get Top Panel DOM element */\n  getTopPanel() {\n    return this._topPanels[0];\n  }\n\n  /** Get Top Panels (left/right) DOM element */\n  getTopPanels() {\n    return this._topPanels;\n  }\n\n  /**\n   * Based on the provided option (e.g. showTopPanel, showHeaderRow, etc.) and the target container(s),\n   * sets the grid option to the desired visibility. It then either slides down/up the container\n   * (if animation is enabled) or shows/hides it immediately, followed by a canvas resize.\n   * @param {'showTopPanel' | 'showHeaderRow' | 'showColumnHeader' | 'showFooterRow' | 'showPreHeaderPanel' | 'showTopHeaderPanel'} option - The grid option to modify.\n   * @param {HTMLElement | HTMLElement[]} container - The panel element(s) to show or hide.\n   * @param {boolean} [visible] - Whether the panel should be visible.\n   * @param {boolean} [animate] - Whether to animate the visibility change.\n   */\n  protected togglePanelVisibility(option: 'showTopPanel' | 'showHeaderRow' | 'showColumnHeader' | 'showFooterRow' | 'showPreHeaderPanel' | 'showTopHeaderPanel', container: HTMLElement | HTMLElement[], visible?: boolean, animate?: boolean) {\n    const animated = (animate === false) ? false : true;\n\n    if (this._options[option] !== visible) {\n      this._options[option] = visible as boolean;\n      if (visible) {\n        if (animated) {\n          Utils.slideDown(container, this.resizeCanvas.bind(this));\n          return;\n        }\n        Utils.show(container);\n        this.resizeCanvas();\n      } else {\n        if (animated) {\n          Utils.slideUp(container, this.resizeCanvas.bind(this));\n          return;\n        }\n        Utils.hide(container);\n        this.resizeCanvas();\n      }\n    }\n  }\n\n  /**\n   * Set the Top Panel Visibility and optionally enable/disable animation (enabled by default)\n   * @param {Boolean} [visible] - optionally set if top panel is visible or not\n   * @param {Boolean} [animate] - optionally enable an animation while toggling the panel\n   */\n  setTopPanelVisibility(visible?: boolean, animate?: boolean) {\n    this.togglePanelVisibility('showTopPanel', this._topPanelScrollers, visible, animate);\n  }\n\n  /**\n   * Set the Header Row Visibility and optionally enable/disable animation (enabled by default)\n   * @param {Boolean} [visible] - optionally set if header row panel is visible or not\n   * @param {Boolean} [animate] - optionally enable an animation while toggling the panel\n   */\n  setHeaderRowVisibility(visible?: boolean, animate?: boolean) {\n    this.togglePanelVisibility('showHeaderRow', this._headerRowScroller, visible, animate);\n  }\n\n  /**\n   * Set the Column Header Visibility and optionally enable/disable animation (enabled by default)\n   * @param {Boolean} [visible] - optionally set if column header is visible or not\n   * @param {Boolean} [animate] - optionally enable an animation while toggling the panel\n   */\n  setColumnHeaderVisibility(visible?: boolean, animate?: boolean) {\n    this.togglePanelVisibility('showColumnHeader', this._headerScroller, visible, animate);\n  }\n\n  /**\n   * Set the Footer Visibility and optionally enable/disable animation (enabled by default)\n   * @param {Boolean} [visible] - optionally set if footer row panel is visible or not\n   * @param {Boolean} [animate] - optionally enable an animation while toggling the panel\n   */\n  setFooterRowVisibility(visible?: boolean, animate?: boolean) {\n    this.togglePanelVisibility('showFooterRow', this._footerRowScroller, visible, animate);\n  }\n\n  /**\n   * Set the Pre-Header Visibility and optionally enable/disable animation (enabled by default)\n   * @param {Boolean} [visible] - optionally set if pre-header panel is visible or not\n   * @param {Boolean} [animate] - optionally enable an animation while toggling the panel\n   */\n  setPreHeaderPanelVisibility(visible?: boolean, animate?: boolean) {\n    this.togglePanelVisibility('showPreHeaderPanel', [this._preHeaderPanelScroller, this._preHeaderPanelScrollerR], visible, animate);\n  }\n\n  /**\n   * Set the Top-Header Visibility\n   * @param {Boolean} [visible] - optionally set if top-header panel is visible or not\n   */\n  setTopHeaderPanelVisibility(visible?: boolean) {\n    this.togglePanelVisibility('showTopHeaderPanel', this._topHeaderPanelScroller, visible);\n  }\n\n  /**\n   * Retrieves the height of a row.\n   *\n   * @returns {number} The row height defined in the grid options.\n   */\n  protected getRowHeight() {\n    return this._options.rowHeight!;\n  }\n\n  /**\n   * Returns the top pixel position for a given row, based on the row height and current vertical offset.\n   *\n   * @param {number} row - The row index.\n   * @returns {number} The pixel position of the top of the row.\n   */\n  protected getRowTop(row: number) {\n    return Math.round(this._options.rowHeight! * row - this.offset);\n  }\n\n  /**\n   * Returns the bottom pixel position for a given row, based on the row height and current vertical offset.\n   *\n   * @param {number} row - The row index.\n   * @returns {number} The pixel position of the bottom of the row.\n   */\n  protected getRowBottom(row: number) {\n    return this.getRowTop(row) + this._options.rowHeight!;\n  }\n\n  /**\n   * Computes the row index corresponding to a given vertical pixel position (taking the current offset into account).\n   *\n   * @param {number} y - The vertical position in pixels.\n   * @returns {number} The calculated row index.\n   */\n  protected getRowFromPosition(y: number) {\n    return Math.floor((y + this.offset) / this._options.rowHeight!);\n  }\n\n  /**\n   * Creates a row container element with CSS classes (e.g. active, odd/even, frozen, loading) based on the row\u2019s state\n   * and metadata. It positions the row using getRowTop (adjusting for frozen rows), clones the row for frozen-column\n   * support if needed, and iterates over each column to call appendCellHtml\n   * for each cell that is within the visible viewport range.\n   *\n   * @param {HTMLElement[]} divArrayL - The array to store left-side row elements.\n   * @param {HTMLElement[]} divArrayR - The array to store right-side row elements (for frozen columns).\n   * @param {number} row - The row index to be rendered.\n   * @param {CellViewportRange} range - The visible viewport range for rendering cells.\n   * @param {number} dataLength - The total data length to determine if the row is loading.\n   */\n  protected appendRowHtml(divArrayL: HTMLElement[], divArrayR: HTMLElement[], row: number, range: CellViewportRange, dataLength: number) {\n    const d = this.getDataItem(row);\n    const dataLoading = row < dataLength && !d;\n    let rowCss = 'slick-row' +\n      (this.hasFrozenRows && row <= this._options.frozenRow! ? ' frozen' : '') +\n      (dataLoading ? ' loading' : '') +\n      (row === this.activeRow && this._options.showCellSelection ? ' active' : '') +\n      (row % 2 === 1 ? ' odd' : ' even');\n\n    if (!d) {\n      rowCss += ` ${this._options.addNewRowCssClass}`;\n    }\n\n    const metadata = this.getItemMetadaWhenExists(row);\n    if (metadata?.cssClasses) {\n      rowCss += ` ${metadata.cssClasses}`;\n    }\n\n    const rowDiv = Utils.createDomElement('div', {\n      className: `ui-widget-content ${rowCss}`,\n      role: 'row',\n      dataset: { row: `${row}` },\n    });\n    const frozenRowOffset = this.getFrozenRowOffset(row);\n    const topOffset = this.getRowTop(row) - frozenRowOffset;\n    if (this._options.rowTopOffsetRenderType === 'transform') {\n      rowDiv.style.transform = `translateY(${topOffset}px)`;\n    } else {\n      rowDiv.style.top = `${topOffset}px`; // default to `top: {offset}px`\n    }\n\n    let rowDivR: HTMLElement | undefined;\n    divArrayL.push(rowDiv);\n    if (this.hasFrozenColumns()) {\n      // it has to be a deep copy otherwise we will have issues with pass by reference in js since\n      // attempting to add the same element to 2 different arrays will just move 1 item to the other array\n      rowDivR = rowDiv.cloneNode(true) as HTMLElement;\n      divArrayR.push(rowDivR);\n    }\n\n    const columnCount = this.columns.length;\n    let columnData: ColumnMetadata | null;\n    let colspan: number | string;\n    let rowspan: number;\n    let m: C;\n    let isRenderCell = true;\n\n    for (let i = 0, ii = columnCount; i < ii; i++) {\n      isRenderCell = true;\n      m = this.columns[i];\n      if (!m || m.hidden) { continue; }\n\n      colspan = 1;\n      rowspan = 1;\n      columnData = null;\n      if (metadata?.columns) {\n        columnData = metadata.columns[m.id] || metadata.columns[i];\n        colspan = columnData?.colspan || 1;\n        rowspan = columnData?.rowspan || 1;\n        if (colspan === '*') {\n          colspan = ii - i;\n        }\n        if (rowspan > dataLength - row) {\n          rowspan = dataLength - row;\n        }\n      }\n\n      if (!this._options.enableCellRowSpan && rowspan > 1) {\n        console.warn('[SlickGrid] Cell \"rowspan\" is an opt-in grid option because of its small perf hit, you must enable it via the \"enableCellRowSpan\" grid option.');\n      }\n\n      const ncolspan = colspan as number; // at this point colspan is for sure a number\n\n      // don't render child cell of a rowspan cell\n      const prs = this.getParentRowSpanByCell(row, i);\n      if (prs) {\n        continue;\n      }\n\n      // Do not render cells outside of the viewport.\n      if (this.columnPosRight[Math.min(ii - 1, i + ncolspan - 1)] > range.leftPx) {\n        if (!m.alwaysRenderColumn && this.columnPosLeft[i] > range.rightPx) {\n          isRenderCell = false; // render as false but keep looping to correctly save cellspan pointers\n        }\n\n        // All columns to the right are outside the range, so no need to render them\n        if (isRenderCell) {\n          const targetedRowDiv = (this.hasFrozenColumns() && (i > this._options.frozenColumn!) ? rowDivR! : rowDiv);\n          this.appendCellHtml(targetedRowDiv, row, i, ncolspan, rowspan, columnData, d);\n        }\n      } else if (m.alwaysRenderColumn || (this.hasFrozenColumns() && i <= this._options.frozenColumn!)) {\n        this.appendCellHtml(rowDiv, row, i, ncolspan, rowspan, columnData, d);\n      }\n\n      if (ncolspan > 1) {\n        i += (ncolspan - 1);\n      }\n    }\n  }\n\n  /**\n   * Creates a cell element with appropriate CSS classes (including frozen and active classes) and retrieves its value\n   * via the formatter. It applies additional CSS classes from event return values and formatter results,\n   * sets tooltips if provided, and inserts any additional DOM elements if required. It then appends the cell element\n   * to the row container and updates the row\u2019s cellRenderQueue and cellColSpans in the rowsCache.\n   *\n   * @param {HTMLElement} divRow - The row container element to append the cell to.\n   * @param {number} row - The row index where the cell belongs.\n   * @param {number} cell - The column index of the cell.\n   * @param {number} colspan - The column span value for the cell.\n   * @param {number} rowspan - The row span value for the cell.\n   * @param {ColumnMetadata | null} columnMetadata - The metadata associated with the column, if available.\n   * @param {TData} item - The data item corresponding to the row.\n   */\n  protected appendCellHtml(divRow: HTMLElement, row: number, cell: number, colspan: number, rowspan: number, columnMetadata: ColumnMetadata | null, item: TData) {\n    // divRow: the html element to append items too\n    // row, cell: row and column index\n    // colspan: HTML colspan\n    // item: grid data for row\n\n    const m = this.columns[cell];\n    let cellCss = `slick-cell l${cell} r${Math.min(this.columns.length - 1, cell + colspan - 1)}`\n      + (m.cssClass ? ` ${m.cssClass}` : '')\n      + (rowspan > 1 ? ' rowspan' : '')\n      + (columnMetadata?.cssClass ? ` ${columnMetadata.cssClass}` : '');\n\n    if (this.hasFrozenColumns() && cell <= this._options.frozenColumn!) {\n      cellCss += ' frozen';\n    }\n\n    if (row === this.activeRow && cell === this.activeCell && this._options.showCellSelection) {\n      cellCss += ' active';\n    }\n\n    // TODO: merge them together in the setter\n    Object.keys(this.cellCssClasses).forEach(key => {\n      if (this.cellCssClasses[key][row]?.[m.id]) {\n        cellCss += ` ${this.cellCssClasses[key][row][m.id]}`;\n      }\n    });\n\n    let value: any = null;\n    let formatterResult: FormatterResultWithHtml | FormatterResultWithText | HTMLElement | DocumentFragment | string = '';\n    if (item) {\n      value = this.getDataItemValueForColumn(item, m);\n      formatterResult = this.getFormatter(row, m)(row, cell, value, m, item, this as unknown as SlickGridModel);\n      if (formatterResult === null || formatterResult === undefined) {\n        formatterResult = '';\n      }\n    }\n\n    // get addl css class names from object type formatter return and from string type return of onBeforeAppendCell\n    // we will only use the event result as CSS classes when it is a string type (undefined event always return a true boolean which is not a valid css class)\n    const evt = this.trigger(this.onBeforeAppendCell, { row, cell, value, dataContext: item });\n    const appendCellResult = evt.getReturnValue();\n    let addlCssClasses = typeof appendCellResult === 'string' ? appendCellResult : '';\n    if ((formatterResult as FormatterResultObject)?.addClasses) {\n      addlCssClasses += Utils.classNameToList((addlCssClasses ? ' ' : '') + (formatterResult as FormatterResultObject).addClasses).join(' ');\n    }\n\n    const toolTipText = (formatterResult as FormatterResultObject)?.toolTip ? `${(formatterResult as FormatterResultObject).toolTip}` : '';\n    const cellDiv = Utils.createDomElement('div', {\n      className: Utils.classNameToList(`${cellCss} ${addlCssClasses || ''}`).join(' '),\n      role: 'gridcell',\n      tabIndex: -1\n    });\n    cellDiv.setAttribute('aria-describedby', this.uid + m.id);\n    if (toolTipText) {\n      cellDiv.setAttribute('title', toolTipText);\n    }\n\n    // update cell rowspan height when spanning more than 1 row\n    const cellHeight = this.getCellHeight(row, rowspan);\n    if (rowspan > 1 && cellHeight !== (this._options.rowHeight! - this.cellHeightDiff)) {\n      cellDiv.style.height = `${cellHeight || 0}px`;\n    }\n\n    if (m.hasOwnProperty('cellAttrs') && m.cellAttrs instanceof Object) {\n      Object.keys(m.cellAttrs).forEach(key => {\n        if (m.cellAttrs.hasOwnProperty(key)) {\n          cellDiv.setAttribute(key, m.cellAttrs[key]);\n        }\n      });\n    }\n\n    // if there is a corresponding row (if not, this is the Add New row or this data hasn't been loaded yet)\n    if (item) {\n      const cellResult = (Object.prototype.toString.call(formatterResult) !== '[object Object]' ? formatterResult : (formatterResult as FormatterResultWithHtml).html || (formatterResult as FormatterResultWithText).text);\n      this.applyHtmlCode(cellDiv, cellResult as string | HTMLElement);\n\n      // add drag-to-replace handle\n      const selectionType = this.getSelectionModel()?.getOptions()?.selectionType;\n      const addDragHandle = selectionType === 'cell' || selectionType === 'mixed';\n      if (row === this.selectionBottomRow && cell === this.selectionRightCell && this._options.showCellSelection && addDragHandle) {\n        this.dragReplaceEl.createEl(cellDiv);\n      }\n    }\n    divRow.appendChild(cellDiv);\n\n    // Formatter can optional add an \"insertElementAfterTarget\" option but it must be inserted only after the `.slick-row` div exists\n    if ((formatterResult as FormatterResultObject).insertElementAfterTarget) {\n      Utils.insertAfterElement(cellDiv, (formatterResult as FormatterResultObject).insertElementAfterTarget as HTMLElement);\n    }\n\n    this.rowsCache[row].cellRenderQueue.push(cell);\n    this.rowsCache[row].cellColSpans[cell] = colspan;\n  }\n\n  /**\n   * Iterates over keys in the rowsCache and, for each row that is not the active row and falls\n   * outside the provided visible range (and is not a frozen row), calls removeRowFromCache to remove\n   * its DOM elements. If asynchronous post\u2013render cleanup is enabled, it triggers that process afterward.\n   *\n   * @param {{ bottom: number; top: number; }} rangeToKeep - The range of rows to keep.\n   */\n  protected cleanupRows(rangeToKeep: { bottom: number; top: number; }) {\n    // when using rowspan, we might have mandatory rows that cannot be cleaned up\n    // that is basically the starting row that holds the rowspan, that row cannot be cleaned up because it would break the UI\n    const mandatoryRows = new Set<number>();\n    if (this._options.enableCellRowSpan) {\n      for (let i = rangeToKeep.top, ln = rangeToKeep.bottom; i <= ln; i++) {\n        const parentRowSpan = this.getRowSpanIntersect(i);\n        if (parentRowSpan !== null) {\n          mandatoryRows.add(parentRowSpan); // add to Set which will take care of duplicate rows\n        }\n      }\n    }\n\n    Object.keys(this.rowsCache).forEach(rowId => {\n      if (this.rowsCache) {\n        let i = +rowId;\n        let removeFrozenRow = true;\n\n        if (this.hasFrozenRows\n          && ((this._options.frozenBottom && (i as unknown as number) >= this.actualFrozenRow) // Frozen bottom rows\n            || (!this._options.frozenBottom && (i as unknown as number) <= this.actualFrozenRow) // Frozen top rows\n          )\n        ) {\n          removeFrozenRow = false;\n        }\n\n        if (((i = parseInt(rowId, 10)) !== this.activeRow)\n          && (i < rangeToKeep.top || i > rangeToKeep.bottom)\n          && (removeFrozenRow)\n          && !mandatoryRows.has(i)\n        ) {\n          this.removeRowFromCache(i);\n        }\n      }\n    });\n    if (this._options.enableAsyncPostRenderCleanup) {\n      this.startPostProcessingCleanup();\n    }\n  }\n\n  /** Invalidate all grid rows and re-render the visible grid rows */\n  invalidate() {\n    this.updateRowCount();\n    this.invalidateAllRows();\n    this.render();\n  }\n\n  /** Invalidate all grid rows */\n  invalidateAllRows() {\n    if (this.currentEditor) {\n      this.makeActiveCellNormal();\n    }\n\n    if (typeof this.rowsCache === 'object') {\n      Object.keys(this.rowsCache).forEach(row => {\n        if (this.rowsCache) {\n          this.removeRowFromCache(+row);\n        }\n      });\n    }\n\n    if (this._options.enableAsyncPostRenderCleanup) {\n      this.startPostProcessingCleanup();\n    }\n  }\n\n  /**\n   * Invalidate a specific set of row numbers\n   * @param {Number[]} rows\n   */\n  invalidateRows(rows: number[]) {\n    if (!rows || !rows.length) {\n      return;\n    }\n\n    let row;\n    this.vScrollDir = 0;\n    const rl = rows.length;\n\n    // use Set to avoid duplicates\n    const invalidatedRows = new Set<number>();\n    const requiredRemapRows = new Set<number>();\n\n    // only do a partial rowspan remapping when the number of rows is limited and the rows aren't the full dataset\n    // otherwise a full rowspan remap of the cache is much quicker and cheaper to perform\n    const isRowSpanFullRemap = (\n      rows.length > this._options.maxPartialRowSpanRemap! ||\n      rows.length === this.getDataLength() ||\n      this._prevInvalidatedRowsCount + rows.length === this.getDataLength()\n    );\n\n    for (let i = 0; i < rl; i++) {\n      row = rows[i];\n      if (this.currentEditor && this.activeRow === row) {\n        this.makeActiveCellNormal();\n      }\n      if (this.rowsCache[row]) {\n        this.removeRowFromCache(row);\n      }\n\n      // add any rows that have rowspan intersects if it's not already in the list\n      if (this._options.enableCellRowSpan && !isRowSpanFullRemap) {\n        invalidatedRows.add(row);\n        const parentRowSpan = this.getRowSpanIntersect(row);\n        if (parentRowSpan !== null) {\n          invalidatedRows.add(parentRowSpan);\n        }\n      }\n    }\n\n    // when a partial rowspan remapping is necessary\n    if (this._options.enableCellRowSpan && !isRowSpanFullRemap) {\n      for (const ir of Array.from(invalidatedRows)) {\n        const colIdxs = this.getRowSpanColumnIntersects(ir);\n        for (const cidx of colIdxs) {\n          const prs = this.getParentRowSpanByCell(ir, cidx);\n          if (prs && this._colsWithRowSpanCache[cidx]) {\n            this._colsWithRowSpanCache[cidx].delete(prs.range);\n            requiredRemapRows.add(prs.range.split(':').map(Number)[0]);\n          }\n        }\n      }\n\n      // now that we know all the rows that need remapping, let's start remapping\n      for (const row of Array.from(requiredRemapRows)) {\n        this.remapRowSpanMetadataByRow(row);\n      }\n    }\n\n    if (this._options.enableAsyncPostRenderCleanup) {\n      this.startPostProcessingCleanup();\n    }\n    this._prevInvalidatedRowsCount = rows.length;\n  }\n\n  /**\n   * Invalidate a specific row number\n   * @param {Number} row\n   */\n  invalidateRow(row: number) {\n    if (row >= 0) {\n      const rows = [row];\n      if (this._options.enableCellRowSpan) {\n        const intersectedRow = this.getRowSpanIntersect(row);\n        if (intersectedRow !== null) {\n          rows.push(intersectedRow);\n        }\n      }\n      this.invalidateRows(rows);\n    }\n  }\n\n  /**\n   * Given a row index, retrieves the corresponding cache entry. If asynchronous post\u2013render cleanup is enabled\n   * and post\u2013processed results exist, queues cleanup actions; otherwise, removes the row nodes from the DOM.\n   * It then deletes the row\u2019s entry from rowsCache and postProcessedRows, decrements the rendered row count,\n   * and increments a removal counter.\n   *\n   * @param {number} row - The index of the row to remove.\n   */\n  protected removeRowFromCache(row: number): void {\n    const cacheEntry = this.rowsCache[row];\n    if (cacheEntry?.rowNode) {\n      this.trigger(this.onBeforeRemoveCachedRow, { row });\n      if (this._options.enableAsyncPostRenderCleanup && this.postProcessedRows[row]) {\n        this.queuePostProcessedRowForCleanup(cacheEntry, this.postProcessedRows[row], row);\n      } else {\n        cacheEntry.rowNode?.forEach((node: HTMLElement) => node.parentElement?.removeChild(node));\n      }\n      delete this.rowsCache[row];\n      delete this.postProcessedRows[row];\n      this.renderedRows--;\n      this.counter_rows_removed++;\n    }\n  }\n\n  /**\n   * Update a specific cell by its row and column index\n   * @param {Number} row - grid row number\n   * @param {Number} cell - grid cell column number\n   */\n  updateCell(row: number, cell: number) {\n    const cellNode = this.getCellNode(row, cell);\n    if (!cellNode) {\n      return;\n    }\n\n    const m = this.columns[cell];\n    const d = this.getDataItem(row);\n    if (this.currentEditor && this.activeRow === row && this.activeCell === cell) {\n      this.currentEditor.loadValue(d);\n    } else {\n      // if the cell has other coordinates because of row/cell span, update that cell (which will invalidate this cellNode)\n      // const spans = this.getSpans(row, cell);\n      // if (spans[0] !== row || spans[1] !== cell) {\n      //   this.updateCell(spans[0], spans[1]);\n      //   return;\n      // }\n      const formatterResult = d ? this.getFormatter(row, m)(row, cell, this.getDataItemValueForColumn(d, m), m, d, this as unknown as SlickGridModel) : '';\n      this.applyFormatResultToCellNode(formatterResult, cellNode);\n      this.invalidatePostProcessingResults(row);\n    }\n  }\n\n  /**\n   * Update a specific row by its row index\n   * @param {Number} row - grid row number\n   */\n  updateRow(row: number) {\n    const cacheEntry = this.rowsCache[row];\n    if (!cacheEntry) {\n      return;\n    }\n\n    this.ensureCellNodesInRowsCache(row);\n\n    let formatterResult;\n    const d = this.getDataItem(row);\n\n    Object.keys(cacheEntry.cellNodesByColumnIdx).forEach(colIdx => {\n      if (!cacheEntry.cellNodesByColumnIdx.hasOwnProperty(colIdx)) {\n        return;\n      }\n\n      const columnIdx = +colIdx;\n      const m = this.columns[columnIdx];\n      const node = cacheEntry.cellNodesByColumnIdx[columnIdx];\n\n      if (row === this.activeRow && columnIdx === this.activeCell && this.currentEditor) {\n        this.currentEditor.loadValue(d);\n      } else if (d) {\n        formatterResult = this.getFormatter(row, m)(row, columnIdx, this.getDataItemValueForColumn(d, m), m, d, this as unknown as SlickGridModel);\n        this.applyFormatResultToCellNode(formatterResult, node as HTMLDivElement);\n      } else {\n        Utils.emptyElement(node);\n      }\n    });\n\n    this.invalidatePostProcessingResults(row);\n  }\n\n  /**\n   * Get the number of rows displayed in the viewport\n   * Note that the row count is an approximation because it is a calculated value using this formula (viewport / rowHeight = rowCount),\n   * the viewport must also be displayed for this calculation to work.\n   * @return {Number} rowCount\n   */\n  getViewportRowCount() {\n    const vh = this.getViewportHeight();\n    const scrollbarHeight = this.getScrollbarDimensions()?.height ?? 0;\n    return Math.floor((vh - scrollbarHeight) / this._options.rowHeight!);\n  }\n\n  /**\n   * Calculates the vertical height available for displaying grid rows. In auto\u2013height mode it sums panel heights\n   * (header, footer, top panel) plus the total row height; otherwise, it subtracts header, footer, pre\u2013header,\n   * top\u2013header heights and container paddings from the container\u2019s computed height. It also computes and stores\n   * the number of visible rows.\n   */\n  getViewportHeight() {\n    if (!this._options.autoHeight || this._options.frozenColumn !== -1) {\n      this.topPanelH = (this._options.showTopPanel) ? this._options.topPanelHeight! + this.getVBoxDelta(this._topPanelScrollers[0]) : 0;\n      this.headerRowH = (this._options.showHeaderRow) ? this._options.headerRowHeight! + this.getVBoxDelta(this._headerRowScroller[0]) : 0;\n      this.footerRowH = (this._options.showFooterRow) ? this._options.footerRowHeight! + this.getVBoxDelta(this._footerRowScroller[0]) : 0;\n    }\n\n    if (this._options.autoHeight) {\n      let fullHeight = this._paneHeaderL.offsetHeight;\n      fullHeight += (this._options.showPreHeaderPanel) ? this._options.preHeaderPanelHeight! + this.getVBoxDelta(this._preHeaderPanelScroller) : 0;\n      fullHeight += (this._options.showHeaderRow) ? this._options.headerRowHeight! + this.getVBoxDelta(this._headerRowScroller[0]) : 0;\n      fullHeight += (this._options.showFooterRow) ? this._options.footerRowHeight! + this.getVBoxDelta(this._footerRowScroller[0]) : 0;\n      fullHeight += (this.getCanvasWidth() > this.viewportW) ? (this.scrollbarDimensions?.height ?? 0) : 0;\n\n      this.viewportH = this._options.rowHeight!\n        * this.getDataLengthIncludingAddNew()\n        + ((this._options.frozenColumn === -1) ? fullHeight : 0);\n    } else {\n      const style = getComputedStyle(this._container);\n      const containerBoxH = style.boxSizing !== 'content-box' ? this.getVBoxDelta(this._container) : 0;\n      const topHeaderH = (this._options.createTopHeaderPanel && this._options.showTopHeaderPanel) ? this._options.topHeaderPanelHeight! + this.getVBoxDelta(this._topHeaderPanelScroller) : 0;\n      const preHeaderH = (this._options.createPreHeaderPanel && this._options.showPreHeaderPanel) ? this._options.preHeaderPanelHeight! + this.getVBoxDelta(this._preHeaderPanelScroller) : 0;\n      const columnNamesH = (this._options.showColumnHeader) ? Utils.toFloat(Utils.height(this._headerScroller[0]) as number) : 0;\n      this.viewportH = Utils.toFloat(style.height)\n        - Utils.toFloat(style.paddingTop)\n        - Utils.toFloat(style.paddingBottom)\n        - this.topPanelH\n        - topHeaderH\n        - preHeaderH\n        - this.headerRowH\n        - columnNamesH\n        - this.footerRowH\n        - containerBoxH\n    }\n\n    this.numVisibleRows = Math.ceil(this.viewportH / this._options.rowHeight!);\n    return this.viewportH;\n  }\n\n  /** returns the available viewport inner width, that is the viewport width minus the scrollbar when shown */\n  protected getViewportInnerWidth(): number {\n    return this.viewportHasVScroll ? this.viewportW - (this.scrollbarDimensions?.width || 0) : this.viewportW;\n  }\n\n  /**\n   * Returns the width of the grid\u2019s viewport by measuring the inner width of the grid container (using a utility function).\n   * It falls back to a devMode\u2013specified width if necessary.\n   */\n  getViewportWidth() {\n    this.viewportW = parseFloat(Utils.innerSize(this._container, 'width') as unknown as string) || (this._options.devMode && this._options.devMode.containerClientWidth) || 0;\n    return this.viewportW;\n  }\n\n  /** Execute a Resize of the Grid Canvas.\n   *\n   * Recalculates the grid\u2019s canvas, pane, and viewport dimensions based on the current container size,\n   * frozen rows/columns settings, and auto\u2013height configuration. It then applies these dimensions to various DOM elements\n   * (panes, viewports, canvases) and updates the scrollbar dimensions.\n   * Finally, it updates the row count, handles scrolling, and forces a re\u2013render.\n   */\n  resizeCanvas() {\n    if (!this.initialized) { return; }\n    this.paneTopH = 0;\n    this.paneBottomH = 0;\n    this.viewportTopH = 0;\n    this.viewportBottomH = 0;\n\n    this.getViewportWidth();\n    this.getViewportHeight();\n\n    // Account for Frozen Rows\n    if (this.hasFrozenRows) {\n      if (this._options.frozenBottom) {\n        this.paneTopH = this.viewportH - this.frozenRowsHeight - (this.scrollbarDimensions?.height ?? 0);\n        this.paneBottomH = this.frozenRowsHeight + (this.scrollbarDimensions?.height ?? 0);\n      } else {\n        this.paneTopH = this.frozenRowsHeight;\n        this.paneBottomH = this.viewportH - this.frozenRowsHeight;\n      }\n    } else {\n      this.paneTopH = this.viewportH;\n    }\n\n    // The top pane includes the top panel and the header row\n    this.paneTopH += this.topPanelH + this.headerRowH + this.footerRowH;\n\n    if (this.hasFrozenColumns() && this._options.autoHeight) {\n      this.paneTopH += (this.scrollbarDimensions?.height ?? 0);\n    }\n\n    // The top viewport does not contain the top panel or header row\n    this.viewportTopH = this.paneTopH - this.topPanelH - this.headerRowH - this.footerRowH;\n\n    if (this._options.autoHeight) {\n      if (this.hasFrozenColumns()) {\n        let fullHeight = this.paneTopH + this._headerScrollerL.offsetHeight;\n        fullHeight += this.getVBoxDelta(this._container);\n        if (this._options.showPreHeaderPanel) {\n          fullHeight += this._options.preHeaderPanelHeight!;\n        }\n        Utils.height(this._container, fullHeight);\n      }\n\n      this._paneTopL.style.position = 'relative';\n    }\n\n    let topHeightOffset = Utils.height(this._paneHeaderL);\n    if (topHeightOffset) {\n      topHeightOffset += (this._options.showTopHeaderPanel ? this._options.topHeaderPanelHeight! : 0);\n    } else {\n      topHeightOffset = (this._options.showHeaderRow ? this._options.headerRowHeight! : 0) + (this._options.showPreHeaderPanel ? this._options.preHeaderPanelHeight! : 0);\n    }\n    Utils.setStyleSize(this._paneTopL, 'top', topHeightOffset || topHeightOffset);\n    Utils.height(this._paneTopL, this.paneTopH);\n\n    const paneBottomTop = this._paneTopL.offsetTop + this.paneTopH;\n\n    if (!this._options.autoHeight) {\n      Utils.height(this._viewportTopL, this.viewportTopH);\n    }\n\n    if (this.hasFrozenColumns()) {\n      let topHeightOffset = Utils.height(this._paneHeaderL);\n      if (topHeightOffset) {\n        topHeightOffset += (this._options.showTopHeaderPanel ? this._options.topHeaderPanelHeight! : 0);\n      }\n      Utils.setStyleSize(this._paneTopR, 'top', topHeightOffset as number);\n      Utils.height(this._paneTopR, this.paneTopH);\n      Utils.height(this._viewportTopR, this.viewportTopH);\n\n      if (this.hasFrozenRows) {\n        Utils.setStyleSize(this._paneBottomL, 'top', paneBottomTop);\n        Utils.height(this._paneBottomL, this.paneBottomH);\n        Utils.setStyleSize(this._paneBottomR, 'top', paneBottomTop);\n        Utils.height(this._paneBottomR, this.paneBottomH);\n        Utils.height(this._viewportBottomR, this.paneBottomH);\n      }\n    } else {\n      if (this.hasFrozenRows) {\n        Utils.width(this._paneBottomL, '100%');\n        Utils.height(this._paneBottomL, this.paneBottomH);\n        Utils.setStyleSize(this._paneBottomL, 'top', paneBottomTop);\n      }\n    }\n\n    if (this.hasFrozenRows) {\n      Utils.height(this._viewportBottomL, this.paneBottomH);\n\n      if (this._options.frozenBottom) {\n        Utils.height(this._canvasBottomL, this.frozenRowsHeight);\n\n        if (this.hasFrozenColumns()) {\n          Utils.height(this._canvasBottomR, this.frozenRowsHeight);\n        }\n      } else {\n        Utils.height(this._canvasTopL, this.frozenRowsHeight);\n\n        if (this.hasFrozenColumns()) {\n          Utils.height(this._canvasTopR, this.frozenRowsHeight);\n        }\n      }\n    } else {\n      Utils.height(this._viewportTopR, this.viewportTopH);\n    }\n\n    if (!this.scrollbarDimensions || !this.scrollbarDimensions.width) {\n      this.scrollbarDimensions = this.measureScrollbar();\n    }\n\n    if (this._options.autosizeColsMode === GridAutosizeColsMode.LegacyForceFit) {\n      this.autosizeColumns();\n    }\n\n    this.updateRowCount();\n    this.handleScroll();\n    // Since the width has changed, force the render() to reevaluate virtually rendered cells.\n    this.lastRenderedScrollLeft = -1;\n    this.render();\n  }\n\n  /** Update the dataset row count */\n  updateRowCount() {\n    if (!this.initialized) { return; }\n\n    const dataLength = this.getDataLength();\n\n    // remap all rowspan cache when necessary\n    if (dataLength > 0 && dataLength !== this._prevDataLength) {\n      this._rowSpanIsCached = false; // will force a full remap\n    }\n    if (this._options.enableCellRowSpan && !this._rowSpanIsCached) {\n      this.remapAllColumnsRowSpan();\n    }\n\n    this._prevDataLength = dataLength;\n    const dataLengthIncludingAddNew = this.getDataLengthIncludingAddNew();\n    let numberOfRows = 0;\n    let oldH = ((this.hasFrozenRows && !this._options.frozenBottom) ? Utils.height(this._canvasBottomL) : Utils.height(this._canvasTopL)) as number;\n\n    if (this.hasFrozenRows) {\n      numberOfRows = this.getDataLength() - this._options.frozenRow!;\n    } else {\n      numberOfRows = dataLengthIncludingAddNew + (this._options.leaveSpaceForNewRows ? this.numVisibleRows - 1 : 0);\n    }\n\n    const tempViewportH = Utils.height(this._viewportScrollContainerY) as number;\n    const oldViewportHasVScroll = this.viewportHasVScroll;\n    // with autoHeight, we do not need to accommodate the vertical scroll bar\n    this.viewportHasVScroll = this._options.alwaysShowVerticalScroll || !this._options.autoHeight && (numberOfRows * this._options.rowHeight! > tempViewportH);\n\n    this.makeActiveCellNormal();\n\n    // remove the rows that are now outside of the data range\n    // this helps avoid redundant calls to .removeRow() when the size of the data decreased by thousands of rows\n    const r1 = dataLength - 1;\n    if (typeof this.rowsCache === 'object') {\n      Object.keys(this.rowsCache).forEach(row => {\n        const cachedRow = +row;\n        if (cachedRow > r1) {\n          this.removeRowFromCache(cachedRow);\n        }\n      });\n    }\n\n    if (this._options.enableAsyncPostRenderCleanup) {\n      this.startPostProcessingCleanup();\n    }\n\n    if (this.activeCellNode && this.activeRow > r1) {\n      this.resetActiveCell();\n    }\n\n    oldH = this.h;\n    if (this._options.autoHeight) {\n      this.h = this._options.rowHeight! * numberOfRows;\n    } else {\n      this.th = Math.max(this._options.rowHeight! * numberOfRows, tempViewportH - (this.scrollbarDimensions?.height ?? 0));\n      if (this.th < this.maxSupportedCssHeight) {\n        // just one page\n        this.h = this.ph = this.th;\n        this.n = 1;\n        this.cj = 0;\n      } else {\n        // break into pages\n        this.h = this.maxSupportedCssHeight;\n        this.ph = this.h / 100;\n        this.n = Math.floor(this.th / this.ph);\n        this.cj = (this.th - this.h) / (this.n - 1);\n      }\n    }\n\n    if (this.h !== oldH || this.enforceFrozenRowHeightRecalc) {\n      if (this.hasFrozenRows && !this._options.frozenBottom) {\n        Utils.height(this._canvasBottomL, this.h);\n\n        if (this.hasFrozenColumns()) {\n          Utils.height(this._canvasBottomR, this.h);\n        }\n      } else {\n        Utils.height(this._canvasTopL, this.h);\n        Utils.height(this._canvasTopR, this.h);\n      }\n\n      this.scrollTop = this._viewportScrollContainerY.scrollTop;\n      this.scrollHeight = this._viewportScrollContainerY.scrollHeight;\n      this.enforceFrozenRowHeightRecalc = false; // reset enforce flag\n    }\n\n    const oldScrollTopInRange = (this.scrollTop + this.offset <= this.th - tempViewportH);\n\n    if (this.th === 0 || this.scrollTop === 0) {\n      this.page = this.offset = 0;\n    } else if (oldScrollTopInRange) {\n      // maintain virtual position\n      this.scrollTo(this.scrollTop + this.offset);\n    } else {\n      // scroll to bottom\n      this.scrollTo(this.th - tempViewportH + (this.scrollbarDimensions?.height ?? 0));\n    }\n\n    if (this.h !== oldH && this._options.autoHeight) {\n      this.resizeCanvas();\n    }\n\n    if (this._options.autosizeColsMode === GridAutosizeColsMode.LegacyForceFit && oldViewportHasVScroll !== this.viewportHasVScroll) {\n      this.autosizeColumns();\n    }\n    this.updateCanvasWidth(false);\n  }\n\n  /** @alias `getVisibleRange` */\n  getViewport(viewportTop?: number, viewportLeft?: number) {\n    return this.getVisibleRange(viewportTop, viewportLeft);\n  }\n\n  /**\n   * Returns an object with the top and bottom row indices that are visible in the viewport, as well\n   * as the left and right pixel boundaries.\n   * It uses the current (or provided) scroll positions and viewport dimensions.\n   *\n   * @param {number} [viewportTop] - The top scroll position.\n   * @param {number} [viewportLeft] - The left scroll position.\n   * @returns {{ top: number; bottom: number; leftPx: number; rightPx: number }} The visible range.\n   */\n  getVisibleRange(viewportTop?: number, viewportLeft?: number) {\n    viewportTop ??= this.scrollTop;\n    viewportLeft ??= this.scrollLeft;\n\n    return {\n      top: this.getRowFromPosition(viewportTop),\n      bottom: this.getRowFromPosition(viewportTop + this.viewportH) + 1,\n      leftPx: viewportLeft,\n      rightPx: viewportLeft + this.viewportW\n    };\n  }\n\n  /**\n   * Computes the range of rows (and horizontal pixel boundaries) that should be rendered,\n   * including an additional buffer (based on row height and a minimum buffer) determined by\n   * the current vertical scroll direction.\n   * This range is used to decide which rows and cells to render.\n   *\n   * @param {number} [viewportTop] - The top scroll position.\n   * @param {number} [viewportLeft] - The left scroll position.\n   * @returns {{ top: number; bottom: number; leftPx: number; rightPx: number }} The rendered range.\n   */\n  getRenderedRange(viewportTop?: number, viewportLeft?: number) {\n    const range = this.getVisibleRange(viewportTop, viewportLeft);\n    const buffer = Math.round(this.viewportH / this._options.rowHeight!);\n    const minBuffer = this._options.minRowBuffer as number;\n\n    if (this.vScrollDir === -1) {\n      range.top -= buffer;\n      range.bottom += minBuffer;\n    } else if (this.vScrollDir === 1) {\n      range.top -= minBuffer;\n      range.bottom += buffer;\n    } else {\n      range.top -= minBuffer;\n      range.bottom += minBuffer;\n    }\n\n    range.top = Math.max(0, range.top);\n    range.bottom = Math.min(this.getDataLengthIncludingAddNew() - 1, range.bottom);\n\n    range.leftPx -= this.viewportW;\n    range.rightPx += this.viewportW;\n\n    range.leftPx = Math.max(0, range.leftPx);\n    range.rightPx = Math.min(this.canvasWidth, range.rightPx);\n\n    return range;\n  }\n\n  /**\n   * Returns the rows cache that are currently rendered in the DOM,\n   * the cache includes certain properties like the row div element, cell rendered queue and the row colspan when defined.\n   */\n  getRowCache(): Record<number, RowCaching> {\n    return this.rowsCache;\n  }\n\n  /**\n   * Ensures that the row\u2019s cache entry contains all cell DOM nodes by transferring nodes\n   * from the cellRenderQueue into the cellNodesByColumnIdx array. This is used to guarantee\n   * that each cell is indexed properly for later updates.\n   *\n   * @param {number} row - The row index to ensure cell nodes exist for.\n   */\n  protected ensureCellNodesInRowsCache(row: number) {\n    const cacheEntry = this.rowsCache[row];\n    if (cacheEntry?.cellRenderQueue.length && cacheEntry.rowNode?.length) {\n      const rowNode = cacheEntry.rowNode as HTMLElement[];\n      let children = Array.from(rowNode[0].children) as HTMLElement[];\n      if (rowNode.length > 1) {\n        children = children.concat(Array.from(rowNode[1].children) as HTMLElement[]);\n      }\n\n      let i = children.length - 1;\n      while (cacheEntry.cellRenderQueue.length) {\n        const columnIdx = cacheEntry.cellRenderQueue.pop();\n        (cacheEntry.cellNodesByColumnIdx as HTMLElement[])[columnIdx] = children[i--];\n      }\n    }\n  }\n\n  /**\n   * For the specified row and a given horizontal visible range, iterates over the cached cell nodes and\n   * removes those cells that fall completely outside the visible range (except for frozen or always\u2013rendered cells).\n   * Cells are either removed immediately or queued for asynchronous cleanup if enabled.\n   * @param {CellViewportRange} range - The visible cell viewport range.\n   * @param {number} row - The row index to clean up.\n   */\n  protected cleanUpCells(range: CellViewportRange, row: number) {\n    // Ignore frozen rows\n    if (this.hasFrozenRows\n      && ((this._options.frozenBottom && row > this.actualFrozenRow) // Frozen bottom rows\n        || (row <= this.actualFrozenRow)                     // Frozen top rows\n      )\n    ) {\n      return;\n    }\n\n    let totalCellsRemoved = 0;\n    const cacheEntry = this.rowsCache[row];\n\n    // Remove cells outside the range.\n    const cellsToRemove: number[] = [];\n    Object.keys(cacheEntry.cellNodesByColumnIdx).forEach(cellNodeIdx => {\n      // I really hate it when people mess with Array.prototype.\n      if (!cacheEntry.cellNodesByColumnIdx.hasOwnProperty(cellNodeIdx)) {\n        return;\n      }\n\n      // This is a string, so it needs to be cast back to a number.\n      const i = +cellNodeIdx;\n\n      // Ignore frozen columns\n      if (i <= this._options.frozenColumn!) {\n        return;\n      }\n\n      // Ignore alwaysRenderedColumns\n      if (Array.isArray(this.columns) && this.columns[i]?.alwaysRenderColumn) {\n        return;\n      }\n\n      const colspan = cacheEntry.cellColSpans[i];\n      if (this.columnPosLeft[i] > range.rightPx ||\n        this.columnPosRight[Math.min(this.columns.length - 1, (i || 0) + (colspan as number) - 1)] < range.leftPx) {\n        if (!(row === this.activeRow && Number(i) === this.activeCell)) {\n          cellsToRemove.push((i as unknown as number));\n        }\n      }\n    });\n\n    let cellToRemove;\n    let cellNode;\n    while (Utils.isDefined(cellToRemove = cellsToRemove.pop())) {\n      cellNode = cacheEntry.cellNodesByColumnIdx[cellToRemove];\n\n      if (this._options.enableAsyncPostRenderCleanup && this.postProcessedRows[row]?.[cellToRemove]) {\n        this.queuePostProcessedCellForCleanup(cellNode, cellToRemove, row);\n      } else {\n        cellNode.parentElement?.removeChild(cellNode);\n      }\n\n      delete cacheEntry.cellColSpans[cellToRemove];\n      delete cacheEntry.cellNodesByColumnIdx[cellToRemove];\n      if (this.postProcessedRows[row]) {\n        delete this.postProcessedRows[row][cellToRemove];\n      }\n      // eslint-disable-next-line @typescript-eslint/no-unused-vars\n      totalCellsRemoved++;\n    }\n  }\n\n  /**\n   * Iterates over each row in the provided rendered range. For each row, ensures cell nodes exist,\n   * calls cleanUpCells to remove outdated cells, and then renders any missing cells (by calling appendCellHtml)\n   * for columns that are now within the viewport. Finally, processes the row\u2019s cellRenderQueue to attach rendered\n   * cells to the correct row containers (handling frozen columns), and reselects the active cell if needed.\n   */\n  protected cleanUpAndRenderCells(range: CellViewportRange) {\n    let cacheEntry;\n    const divRow: HTMLElement = document.createElement('div');\n    const processedRows: number[] = [];\n    let cellsAdded: number;\n    let totalCellsAdded = 0;\n    let colspan: number | string;\n    let columnData: ColumnMetadata | null;\n    const columnCount = this.columns.length;\n\n    for (let row = range.top as number, btm = range.bottom as number; row <= btm; row++) {\n      cacheEntry = this.rowsCache[row];\n      if (!cacheEntry) {\n        continue;\n      }\n\n      // cellRenderQueue populated in renderRows() needs to be cleared first\n      this.ensureCellNodesInRowsCache(row);\n\n      if (!this._options.enableCellRowSpan || this.getRowSpanIntersect(row) === null) {\n        this.cleanUpCells(range, row);\n      }\n\n      // Render missing cells.\n      cellsAdded = 0;\n\n      let metadata = this.getItemMetadaWhenExists(row);\n      metadata = metadata?.columns as ItemMetadata;\n\n      const d = this.getDataItem(row);\n\n      // TODO: shorten this loop (index? heuristics? binary search?)\n      for (let i = 0, ii = columnCount; i < ii; i++) {\n        if (!this.columns[i] || this.columns[i].hidden) { continue; }\n\n        // Cells to the right are outside the range.\n        if (this.columnPosLeft[i] > range.rightPx) {\n          break;\n        }\n\n        // Already rendered.\n        if (Utils.isDefined(colspan = cacheEntry.cellColSpans[i] as number)) {\n          i += (colspan > 1 ? colspan - 1 : 0);\n          continue;\n        }\n\n        colspan = 1;\n        columnData = null;\n        if (metadata) {\n          columnData = metadata[this.columns[i].id as keyof ItemMetadata] || (metadata as any)[i];\n          colspan = columnData?.colspan ?? 1;\n          if (colspan === '*') {\n            colspan = ii - i;\n          }\n        }\n\n        const ncolspan = colspan as number; // at this point colspan is for sure a number\n\n        // don't render child cell of a rowspan cell\n        const prs = this.getParentRowSpanByCell(row, i);\n        if (prs) {\n          continue;\n        }\n\n        if (this.columnPosRight[Math.min(ii - 1, i + ncolspan - 1)] > range.leftPx) {\n          const rowspan = this.getRowspan(row, i);\n          this.appendCellHtml(divRow, row, i, ncolspan, rowspan, columnData, d);\n          cellsAdded++;\n        }\n\n        i += (ncolspan > 1 ? ncolspan - 1 : 0);\n      }\n\n      if (cellsAdded) {\n        // eslint-disable-next-line @typescript-eslint/no-unused-vars\n        totalCellsAdded += cellsAdded;\n        processedRows.push(row);\n      }\n    }\n    if (!divRow.children.length) {\n      return;\n    }\n\n    let processedRow: number | null | undefined;\n    let node: HTMLElement;\n    while (Utils.isDefined(processedRow = processedRows.pop())) {\n      cacheEntry = this.rowsCache[processedRow];\n      let columnIdx;\n      while (Utils.isDefined(columnIdx = cacheEntry.cellRenderQueue.pop())) {\n        node = divRow.lastChild as HTMLElement;\n\n        //no idea why node would be null here but apparently it is..\n        if (!node) {\n          continue;\n        }\n        if (this.hasFrozenColumns() && (columnIdx > this._options.frozenColumn!)) {\n          cacheEntry.rowNode![1].appendChild(node);\n        } else {\n          cacheEntry.rowNode![0].appendChild(node);\n        }\n        cacheEntry.cellNodesByColumnIdx![columnIdx] = node;\n      }\n    }\n  }\n\n  /**\n   * Iterates over the row indices in the given rendered range and, for each row not yet in the cache,\n   * creates a new cache entry and calls appendRowHtml to build the row\u2019s cell content. Once built,\n   * the row is appended to the appropriate canvas element (top or bottom, left or right depending on frozen settings).\n   * If the active cell is rendered, it reselects it.\n   *\n   * @param {{ top: number; bottom: number; leftPx: number; rightPx: number; }} range - The range of rows to render.\n   */\n  protected renderRows(range: { top: number; bottom: number; leftPx: number; rightPx: number; }) {\n    const divArrayL: HTMLElement[] = [];\n    const divArrayR: HTMLElement[] = [];\n    const rows: number[] = [];\n    let needToReselectCell = false;\n    const dataLength = this.getDataLength();\n    const mustRenderRows = new Set<number>();\n    const renderingRows = new Set<number>();\n\n    for (let i = range.top as number, ii = range.bottom as number; i <= ii; i++) {\n      if (this.rowsCache[i] || (this.hasFrozenRows && this._options.frozenBottom && i === this.getDataLength())) {\n        continue;\n      }\n      this.renderedRows++;\n      rows.push(i);\n      renderingRows.add(i);\n\n      // Create an entry right away so that appendRowHtml() can start populating it.\n      this.rowsCache[i] = this.createEmptyCachingRow();\n\n      // add any rows that have rowspan intersects if it's not already in the list\n      if (this._options.enableCellRowSpan) {\n        const parentRowSpan = this.getRowSpanIntersect(i);\n        if (parentRowSpan !== null) {\n          renderingRows.add(parentRowSpan); // add to Set which will take care of duplicate rows\n        }\n      }\n\n      this.appendRowHtml(divArrayL, divArrayR, i, range, dataLength);\n      mustRenderRows.add(i);\n      if (this.activeCellNode && this.activeRow === i) {\n        needToReselectCell = true;\n      }\n      this.counter_rows_rendered++;\n    }\n\n    // check if there's any col/row span intersecting and if so add them to the renderingRows\n    const mandatorySpanRows = this.setDifference(renderingRows, mustRenderRows);\n    if (mandatorySpanRows.size > 0) {\n      mandatorySpanRows.forEach(r => {\n        this.removeRowFromCache(r); // remove any previous element to avoid duplicates in DOM\n        rows.push(r);\n        this.rowsCache[r] = this.createEmptyCachingRow();\n        this.appendRowHtml(divArrayL, divArrayR, r, range, dataLength);\n      });\n    }\n\n    if (rows.length) {\n      const x = document.createElement('div');\n      const xRight = document.createElement('div');\n\n      divArrayL.forEach(elm => x.appendChild(elm as HTMLElement));\n      divArrayR.forEach(elm => xRight.appendChild(elm as HTMLElement));\n\n      for (let i = 0, ii = rows.length; i < ii; i++) {\n        if ((this.hasFrozenRows) && (rows[i] >= this.actualFrozenRow)) {\n          if (this.hasFrozenColumns()) {\n            if (this.rowsCache?.hasOwnProperty(rows[i]) && x.firstChild && xRight.firstChild) {\n              this.rowsCache[rows[i]].rowNode = [x.firstChild as HTMLElement, xRight.firstChild as HTMLElement];\n              this._canvasBottomL.appendChild(x.firstChild as ChildNode);\n              this._canvasBottomR.appendChild(xRight.firstChild as ChildNode);\n            }\n          } else {\n            if (this.rowsCache?.hasOwnProperty(rows[i]) && x.firstChild) {\n              this.rowsCache[rows[i]].rowNode = [x.firstChild as HTMLElement];\n              this._canvasBottomL.appendChild(x.firstChild as ChildNode);\n            }\n          }\n        } else if (this.hasFrozenColumns()) {\n          if (this.rowsCache?.hasOwnProperty(rows[i]) && x.firstChild && xRight.firstChild) {\n            this.rowsCache[rows[i]].rowNode = [x.firstChild as HTMLElement, xRight.firstChild as HTMLElement];\n            this._canvasTopL.appendChild(x.firstChild as ChildNode);\n            this._canvasTopR.appendChild(xRight.firstChild as ChildNode);\n          }\n        } else {\n          if (this.rowsCache?.hasOwnProperty(rows[i]) && x.firstChild) {\n            this.rowsCache[rows[i]].rowNode = [x.firstChild as HTMLElement];\n            this._canvasTopL.appendChild(x.firstChild as ChildNode);\n          }\n        }\n      }\n\n      if (needToReselectCell) {\n        this.activeCellNode = this.getCellNode(this.activeRow, this.activeCell);\n      }\n    }\n  }\n\n  /**\n   * Iterates over each row in the rowsCache and updates the top position of the row\u2019s DOM element\n   * using the getRowTop calculation. Depending on the grid option, it either uses CSS transform\n   * or sets the top property directly.\n   */\n  protected updateRowPositions() {\n    for (const row in this.rowsCache) {\n      if (this.rowsCache) {\n        const rowNumber = row ? parseInt(row, 10) : 0;\n        const rowNode = this.rowsCache[rowNumber].rowNode![0];\n        if (this._options.rowTopOffsetRenderType === 'transform') {\n          rowNode.style.transform = `translateY(${this.getRowTop(rowNumber)}px)`;\n        } else {\n          rowNode.style.top = `${this.getRowTop(rowNumber)}px`; // default to `top: {offset}px`\n        }\n      }\n    }\n  }\n\n  /**\n   * (re)Render the grid\n   *\n   * Main rendering method that first dequeues any pending scroll throttling, then obtains the visible and rendered ranges.\n   * It removes rows no longer visible, calls cleanUpAndRenderCells and renderRows to render missing cells and new rows,\n   * and, if frozen rows are present, renders them separately. It then sets post\u2013processing boundaries, starts post\u2013processing,\n   * updates scroll positions, and triggers the onRendered event.\n   */\n  render() {\n    if (!this.initialized) { return; }\n\n    this.scrollThrottle.dequeue();\n\n    const visible = this.getVisibleRange();\n    const rendered = this.getRenderedRange();\n\n    // remove rows no longer in the viewport\n    this.cleanupRows(rendered);\n\n    // add new rows & missing cells in existing rows\n    if (this.lastRenderedScrollLeft !== this.scrollLeft) {\n      if (this.hasFrozenRows) {\n        const renderedFrozenRows = Utils.extend(true, {}, rendered);\n\n        if (this._options.frozenBottom) {\n          renderedFrozenRows.top = this.actualFrozenRow;\n          renderedFrozenRows.bottom = this.getDataLength();\n        } else {\n          renderedFrozenRows.top = 0;\n          renderedFrozenRows.bottom = this._options.frozenRow;\n        }\n        this.cleanUpAndRenderCells(renderedFrozenRows);\n      }\n      this.cleanUpAndRenderCells(rendered);\n    }\n\n    // render missing rows\n    this.renderRows(rendered);\n\n    // Render frozen rows\n    if (this.hasFrozenRows) {\n      if (this._options.frozenBottom) {\n        this.renderRows({\n          top: this.actualFrozenRow, bottom: this.getDataLength() - 1, leftPx: rendered.leftPx, rightPx: rendered.rightPx\n        });\n      } else {\n        this.renderRows({\n          top: 0, bottom: this._options.frozenRow! - 1, leftPx: rendered.leftPx, rightPx: rendered.rightPx\n        });\n      }\n    }\n\n    this.postProcessFromRow = visible.top;\n    this.postProcessToRow = Math.min(this.getDataLengthIncludingAddNew() - 1, visible.bottom);\n    this.startPostProcessing();\n\n    this.lastRenderedScrollTop = this.scrollTop;\n    this.lastRenderedScrollLeft = this.scrollLeft;\n    this.trigger(this.onRendered, { startRow: visible.top, endRow: visible.bottom, grid: this });\n  }\n\n  /**\n   * Get frozen (pinned) row offset\n   *\n   * Returns the vertical pixel offset to apply for frozen rows.\n   * Depending on whether frozen rows are pinned at the bottom or top and based on grid height,\n   * it returns either a fixed frozen rows height or a calculated offset.\n   *\n   * @param {Number} row - grid row number\n   */\n  getFrozenRowOffset(row: number) {\n    // let offset = ( hasFrozenRows ) ? ( this._options.frozenBottom ) ? ( row >= actualFrozenRow ) ? ( h < viewportTopH ) ? ( actualFrozenRow * this._options.rowHeight ) : h : 0 : ( row >= actualFrozenRow ) ? frozenRowsHeight : 0 : 0; // WTF?\n    let offset = 0;\n    if (this.hasFrozenRows) {\n      if (this._options.frozenBottom) {\n        if (row >= this.actualFrozenRow) {\n          if (this.h < this.viewportTopH) {\n            offset = (this.actualFrozenRow * this._options.rowHeight!);\n          } else {\n            offset = this.h;\n          }\n        } else {\n          offset = 0;\n        }\n      }\n      else {\n        if (row >= this.actualFrozenRow) {\n          offset = this.frozenRowsHeight;\n        } else {\n          offset = 0;\n        }\n      }\n    } else {\n      offset = 0;\n    }\n\n    return offset;\n  }\n\n  ////////////////////////////////////////////////////////\n  // End Rendering and Layout Management\n  //////////////////////////////////////////////////////\n\n  ////////////////////////////////////////////////////////\n  // Scrolling and Virtualisation\n  /////////////////////////////////////////////////////\n\n  // TODO:  this is static.  need to handle page mutation.\n  /**\n   * Traverses up from a specific canvas element and binds a scroll event handler\n   * (to update active cell positions) on each ancestor element that is scrollable.\n   * Also stores these ancestors for later unbinding.\n   */\n  protected bindAncestorScrollEvents() {\n    let elem: HTMLElement | null = (this.hasFrozenRows && !this._options.frozenBottom) ? this._canvasBottomL : this._canvasTopL;\n    while ((elem = elem!.parentNode as HTMLElement) !== document.body && elem) {\n      // bind to scroll containers only\n      if (elem === this._viewportTopL || elem.scrollWidth !== elem.clientWidth || elem.scrollHeight !== elem.clientHeight) {\n        this._boundAncestors.push(elem);\n        this._bindingEventService.bind(elem, 'scroll', this.handleActiveCellPositionChange.bind(this));\n      }\n    }\n  }\n\n  /**\n   * Iterates through the stored ancestor elements (in _boundAncestors)\n   * and unbinds any scroll events previously attached, then clears the stored array.\n   */\n  protected unbindAncestorScrollEvents() {\n    this._boundAncestors.forEach((ancestor) => {\n      this._bindingEventService.unbindByEventName(ancestor, 'scroll');\n    });\n    this._boundAncestors = [];\n  }\n\n  /**\n   * Chooses which viewport container(s) will serve as the scroll container for horizontal and vertical scrolling.\n   * The selection depends on whether the grid has frozen columns and/or frozen rows and whether frozenBottom is set.\n   */\n  protected setScroller() {\n    if (this.hasFrozenColumns()) {\n      this._headerScrollContainer = this._headerScrollerR;\n      this._headerRowScrollContainer = this._headerRowScrollerR;\n      this._footerRowScrollContainer = this._footerRowScrollerR;\n\n      if (this.hasFrozenRows) {\n        if (this._options.frozenBottom) {\n          this._viewportScrollContainerX = this._viewportBottomR;\n          this._viewportScrollContainerY = this._viewportTopR;\n        } else {\n          this._viewportScrollContainerX = this._viewportScrollContainerY = this._viewportBottomR;\n        }\n      } else {\n        this._viewportScrollContainerX = this._viewportScrollContainerY = this._viewportTopR;\n      }\n    } else {\n      this._headerScrollContainer = this._headerScrollerL;\n      this._headerRowScrollContainer = this._headerRowScrollerL;\n      this._footerRowScrollContainer = this._footerRowScrollerL;\n\n      if (this.hasFrozenRows) {\n        if (this._options.frozenBottom) {\n          this._viewportScrollContainerX = this._viewportBottomL;\n          this._viewportScrollContainerY = this._viewportTopL;\n        } else {\n          this._viewportScrollContainerX = this._viewportScrollContainerY = this._viewportBottomL;\n        }\n      } else {\n        this._viewportScrollContainerX = this._viewportScrollContainerY = this._viewportTopL;\n      }\n    }\n  }\n\n  /**\n   * Scroll to a Y position in the grid (clamped to valid bounds)\n   *\n   * Updates internal offsets, recalculates the visible range, cleans up rows outside the viewport,\n   * updates row positions, and triggers the onViewportChanged event.\n   *\n   * @param {Number} y\n   */\n  scrollTo(y: number) {\n    y = Math.max(y, 0);\n    y = Math.min(y, (this.th || 0) - (Utils.height(this._viewportScrollContainerY) as number) + ((this.viewportHasHScroll || this.hasFrozenColumns()) ? (this.scrollbarDimensions?.height ?? 0) : 0));\n\n    const oldOffset = this.offset;\n    this.offset = Math.round(this.page * (this.cj || 0));\n    this.page = Math.min((this.n || 0) - 1, Math.floor(y / (this.ph || 0)));\n    const newScrollTop = (y - this.offset) as number;\n\n    if (this.offset !== oldOffset) {\n      const range = this.getVisibleRange(newScrollTop);\n      this.cleanupRows(range);\n      this.updateRowPositions();\n    }\n\n    if (this.prevScrollTop !== newScrollTop) {\n      this.vScrollDir = (this.prevScrollTop + oldOffset < newScrollTop + this.offset) ? 1 : -1;\n      this.lastRenderedScrollTop = (this.scrollTop = this.prevScrollTop = newScrollTop);\n\n      if (this.hasFrozenColumns()) {\n        this._viewportTopL.scrollTop = newScrollTop;\n      }\n\n      if (this.hasFrozenRows) {\n        this._viewportBottomL.scrollTop = this._viewportBottomR.scrollTop = newScrollTop;\n      }\n\n      if (this._viewportScrollContainerY) {\n        this._viewportScrollContainerY.scrollTop = newScrollTop;\n      }\n\n      this.trigger(this.onViewportChanged, {});\n    }\n  }\n\n  // When the header row scroller is scrolled, ensures that the viewport\u2019s horizontal scroll position is updated to match it.\n  protected handleHeaderRowScroll() {\n    const scrollLeft = this._headerRowScrollContainer.scrollLeft;\n    if (scrollLeft !== this._viewportScrollContainerX.scrollLeft) {\n      this._viewportScrollContainerX.scrollLeft = scrollLeft;\n    }\n  }\n\n  // When the footer row scroller is scrolled, updates the viewport\u2019s horizontal scroll position to match it.\n  protected handleFooterRowScroll() {\n    const scrollLeft = this._footerRowScrollContainer.scrollLeft;\n    if (scrollLeft !== this._viewportScrollContainerX.scrollLeft) {\n      this._viewportScrollContainerX.scrollLeft = scrollLeft;\n    }\n  }\n\n  /** Invokes handleElementScroll for the pre\u2013header panel scroller to synchronize its\n   * horizontal scroll position with the main viewport.\n   */\n  protected handlePreHeaderPanelScroll() {\n    this.handleElementScroll(this._preHeaderPanelScroller);\n  }\n\n  /**\n   * Invokes handleElementScroll for the top\u2013header panel scroller to synchronize its horizontal\n   * scroll position with the main viewport.\n   */\n  protected handleTopHeaderPanelScroll() {\n    this.handleElementScroll(this._topHeaderPanelScroller);\n  }\n\n  /**\n   * Given a DOM element, checks its scrollLeft value and, if it differs from the viewport scroll\n   * container\u2019s scrollLeft, updates the latter to match.\n   *\n   * @param {HTMLElement} element - The element whose scroll position needs to be synced.\n   */\n  protected handleElementScroll(element: HTMLElement) {\n    const scrollLeft = element.scrollLeft;\n    if (scrollLeft !== this._viewportScrollContainerX.scrollLeft) {\n      this._viewportScrollContainerX.scrollLeft = scrollLeft;\n    }\n  }\n\n  /**\n   * Called when the grid\u2019s main scroll container scrolls. Updates internal scroll properties (scrollHeight,\n   * scrollTop, scrollLeft) from the container, then calls _handleScroll (with an argument\n   * indicating whether the event came from a system event or a mousewheel).\n   * Returns the result of _handleScroll.\n   *\n   * @param {Event} [e] - The scroll event.\n   * @returns {boolean} The result of `_handleScroll`.\n   */\n  protected handleScroll(e?: Event) {\n    this.scrollHeight = this._viewportScrollContainerY.scrollHeight;\n    this.scrollTop = this._viewportScrollContainerY.scrollTop;\n    this.scrollLeft = this._viewportScrollContainerX.scrollLeft;\n    return this._handleScroll(e ? 'scroll' : 'system');\n  }\n\n  /**\n   * Handles the detailed processing of a scroll event. It calculates maximum allowed scroll distances,\n   * clamps the current scrollTop/scrollLeft to valid bounds, computes vertical and horizontal scroll distances,\n   * and if significant horizontal scroll occurred, synchronizes various elements (header, panels, etc.)\n   * to the new scrollLeft. For vertical scroll (if autoHeight is off), updates the virtual scrolling page,\n   * offset, and may invalidate all rows. Finally, if scroll distances exceed thresholds, either calls render\n   * immediately or enqueues rendering via a throttle; triggers onViewportChanged and onScroll events with\n   * detailed parameters (including the cell at the top\u2013left).\n   *\n   * Returns true if any scroll movement occurred, else false.\n   *\n   * @param {'mousewheel' | 'scroll' | 'system'} [eventType='system'] - The type of scroll event.\n   * @returns {boolean} True if any scroll movement occurred, otherwise false.\n   */\n  protected _handleScroll(eventType: 'mousewheel' | 'scroll' | 'system' = 'system') {\n    let maxScrollDistanceY = this._viewportScrollContainerY.scrollHeight - this._viewportScrollContainerY.clientHeight;\n    let maxScrollDistanceX = this._viewportScrollContainerY.scrollWidth - this._viewportScrollContainerY.clientWidth;\n\n    // Protect against erroneous clientHeight/Width greater than scrollHeight/Width.\n    // Sometimes seen in Chrome.\n    maxScrollDistanceY = Math.max(0, maxScrollDistanceY);\n    maxScrollDistanceX = Math.max(0, maxScrollDistanceX);\n\n    // Ceiling the max scroll values\n    if (this.scrollTop > maxScrollDistanceY) {\n      this.scrollTop = maxScrollDistanceY;\n      this.scrollHeight = maxScrollDistanceY;\n    }\n    if (this.scrollLeft > maxScrollDistanceX) {\n      this.scrollLeft = maxScrollDistanceX;\n    }\n\n    const vScrollDist = Math.abs(this.scrollTop - this.prevScrollTop);\n    const hScrollDist = Math.abs(this.scrollLeft - this.prevScrollLeft);\n\n    if (hScrollDist) {\n      this.prevScrollLeft = this.scrollLeft;\n\n      // adjust scroll position of all div containers when scrolling the grid\n      this.scrollToX(this.scrollLeft);\n    }\n\n    // autoheight suppresses vertical scrolling, but editors can create a div larger than\n    // the row vertical size, which can lead to a vertical scroll bar appearing temporarily\n    // while the editor is displayed. this is not part of the grid scrolling, so we should ignore it\n    if (vScrollDist && !this._options.autoHeight) {\n      this.vScrollDir = this.prevScrollTop < this.scrollTop ? 1 : -1;\n      this.prevScrollTop = this.scrollTop;\n\n      if (eventType === 'mousewheel') {\n        this._viewportScrollContainerY.scrollTop = this.scrollTop;\n      }\n\n      if (this.hasFrozenColumns()) {\n        if (this.hasFrozenRows && !this._options.frozenBottom) {\n          this._viewportBottomL.scrollTop = this.scrollTop;\n        } else {\n          this._viewportTopL.scrollTop = this.scrollTop;\n        }\n      }\n\n      // switch virtual pages if needed\n      if (vScrollDist < this.viewportH) {\n        this.scrollTo(this.scrollTop + this.offset);\n      } else {\n        const oldOffset = this.offset;\n        if (this.h === this.viewportH) {\n          this.page = 0;\n        } else {\n          this.page = Math.min(this.n - 1, Math.floor(this.scrollTop * ((this.th - this.viewportH) / (this.h - this.viewportH)) * (1 / this.ph)));\n        }\n        this.offset = Math.round(this.page * this.cj);\n        if (oldOffset !== this.offset) {\n          this.invalidateAllRows();\n        }\n      }\n    }\n\n    if (hScrollDist || vScrollDist) {\n      const dx = Math.abs(this.lastRenderedScrollLeft - this.scrollLeft);\n      const dy = Math.abs(this.lastRenderedScrollTop - this.scrollTop);\n      if (dx > 20 || dy > 20) {\n        // if rendering is forced or scrolling is small enough to be \"easy\", just render\n        if (this._options.forceSyncScrolling || (dy < this.viewportH && dx < this.viewportW)) {\n          this.render();\n        } else {\n          // otherwise, perform \"difficult\" renders at a capped frequency\n          this.scrollThrottle.enqueue();\n        }\n\n        this.trigger(this.onViewportChanged, {});\n      }\n    }\n\n    this.trigger(this.onScroll, {\n      triggeredBy: eventType,\n      scrollHeight: this.scrollHeight,\n      scrollLeft: this.scrollLeft,\n      scrollTop: this.scrollTop,\n    });\n\n    if (hScrollDist || vScrollDist) { return true; }\n    return false;\n  }\n\n  /** Scroll to a specific cell and make it into the view\n   *\n   * First calls scrollRowIntoView for the row. If the cell is not in a frozen column,\n   * calculates the cell\u2019s colspan and then calls internalScrollColumnIntoView with the\n   * cell\u2019s left and right boundaries.\n   */\n  scrollCellIntoView(row: number, cell: number, doPaging?: boolean) {\n    this.scrollRowIntoView(row, doPaging);\n\n    if (cell <= this._options.frozenColumn!) {\n      return;\n    }\n\n    const colspan = this.getColspan(row, cell);\n    this.internalScrollColumnIntoView(this.columnPosLeft[cell], this.columnPosRight[cell + (colspan > 1 ? colspan - 1 : 0)]);\n  }\n\n  /**\n   * Checks if the given left/right pixel boundaries are outside the current\n   * horizontal scroll position of the viewport container.\n   * If so, adjusts scrollLeft appropriately and triggers a re\u2013render.\n   *\n   * @param left\n   * @param right\n   */\n  protected internalScrollColumnIntoView(left: number, right: number) {\n    const scrollRight = this.scrollLeft + (Utils.width(this._viewportScrollContainerX) as number) - (this.viewportHasVScroll ? (this.scrollbarDimensions?.width ?? 0) : 0);\n\n    if (left < this.scrollLeft) {\n      this._viewportScrollContainerX.scrollLeft = left;\n      this.handleScroll();\n      this.render();\n    } else if (right > scrollRight) {\n      this._viewportScrollContainerX.scrollLeft = Math.min(left, right - this._viewportScrollContainerX.clientWidth);\n      this.handleScroll();\n      this.render();\n    }\n  }\n\n  /**\n   * Scroll to a specific column and show it into the viewport\n   * @param {Number} cell - cell column number\n   */\n  scrollColumnIntoView(cell: number) {\n    this.internalScrollColumnIntoView(this.columnPosLeft[cell], this.columnPosRight[cell]);\n  }\n\n  /**\n   * Update paging information status from the View\n   * @param {PagingInfo} pagingInfo\n   */\n  updatePagingStatusFromView(pagingInfo: Pick<PagingInfo, 'pageSize' | 'pageNum' | 'totalPages'>) {\n    this.pagingActive = (pagingInfo.pageSize !== 0);\n    this.pagingIsLastPage = (pagingInfo.pageNum === pagingInfo.totalPages - 1);\n  }\n\n  /**\n   * from a row number, return any column indexes that intersected with the grid row including the cell\n   * @param {Number} row - grid row index\n   */\n  getRowSpanColumnIntersects(row: number): number[] {\n    return this.getRowSpanIntersection<number[]>(row, 'columns');\n  }\n\n  /**\n   * from a row number, verify if the rowspan is intersecting and return it when found,\n   * otherwise return `null` when nothing is found or when the rowspan feature is disabled.\n   * @param {Number} row - grid row index\n   */\n  getRowSpanIntersect(row: number): number | null {\n    return this.getRowSpanIntersection<number | null>(row);\n  }\n\n  /**\n   * Determines the intersection of a given row with row span metadata.\n   * Depending on the `outputType` parameter, it returns either the intersecting columns\n   * or the start row of the span.\n   *\n   * @template R - The return type, either an array of column indices or a single row index.\n   * @param {number} row - The row index to check for intersections.\n   * @param {'columns' | 'start'} [outputType] - Determines the output type:\n   *   - `'columns'`: Returns an array of column indices that intersect with the row span.\n   *   - `'start'`: Returns the starting row index of the intersecting row span.\n   * @returns {R} The intersection result based on the specified output type.\n   */\n  protected getRowSpanIntersection<R>(row: number, outputType?: 'columns' | 'start'): R {\n    const columnIntersects: number[] = [];\n    let rowStartIntersect = null;\n\n    for (let col = 0, cln = this.columns.length; col < cln; col++) {\n      const rmeta = this._colsWithRowSpanCache[col];\n      if (rmeta) {\n        for (const range of Array.from(rmeta)) {\n          const [start, end] = range.split(':').map(Number);\n          if (row >= start && row <= end) {\n            if (outputType === 'columns') {\n              columnIntersects.push(col);\n            } else {\n              rowStartIntersect = start;\n              break;\n            }\n          }\n        }\n      }\n    }\n    return (outputType === 'columns' ? columnIntersects : rowStartIntersect) as R;\n  }\n\n  /**\n   * Returns the parent rowspan details when child cell are spanned from a rowspan or `null` when it's not spanned.\n   * By default it will exclude the parent cell that holds the rowspan, and return `null`, that initiated the rowspan unless the 3rd argument is disabled.\n   * The exclusion is helpful to find out when we're dealing with a child cell of a rowspan\n   * @param {Number} row - grid row index\n   * @param {Number} cell - grid cell/column index\n   * @param {Boolean} [excludeParentRow] - should we exclude the parent who initiated the rowspan in the search (defaults to true)?\n   */\n  getParentRowSpanByCell(row: number, cell: number, excludeParentRow = true): { start: number; end: number; range: string; } | null {\n    let spanDetail = null;\n    const rowspanRange = this._colsWithRowSpanCache[cell] || new Set<string>();\n\n    for (const range of Array.from(rowspanRange)) {\n      const [start, end] = range.split(':').map(Number);\n      const startCondition = excludeParentRow ? row > start : row >= start;\n      if (startCondition && row <= end) {\n        spanDetail = { start, end, range };\n        break;\n      }\n    }\n\n    return spanDetail;\n  }\n\n  /**\n   * Remap all the rowspan metadata by looping through all dataset rows and keep a cache of rowspan by column indexes\n   * For example:\n   *  1- if 2nd row of the 1st column has a metadata.rowspan of 3 then the cache will be: `{ 0: '1:4' }`\n   *  2- if 2nd row if the 1st column has a metadata.rowspan of 3 AND a colspan of 2 then the cache will be: `{ 0: '1:4', 1: '1:4' }`\n   */\n  remapAllColumnsRowSpan() {\n    const ln = this.getDataLength();\n    if (ln > 0) {\n      this._colsWithRowSpanCache = {};\n      for (let row = 0; row < ln; row++) {\n        this.remapRowSpanMetadataByRow(row);\n      }\n\n      this._rowSpanIsCached = true;\n    }\n  }\n\n  /**\n   * Remaps row span metadata for a given row by iterating through its column metadata.\n   * Calls `remapRowSpanMetadata` for each column to update row span information.\n   *\n   * @param {number} row - The row index for which to remap row span metadata.\n   */\n  protected remapRowSpanMetadataByRow(row: number) {\n    const colMeta = this.getItemMetadaWhenExists(row);\n    if (colMeta?.columns) {\n      Object.keys(colMeta.columns).forEach(col => {\n        const colIdx = +col;\n        const columnMeta = colMeta.columns![colIdx];\n        const colspan = +(columnMeta?.colspan || 1);\n        const rowspan = +(columnMeta?.rowspan || 1);\n        this.remapRowSpanMetadata(row, colIdx, colspan, rowspan);\n      });\n    }\n  }\n\n  /**\n   * Updates the row span metadata for a given row and cell.\n   * If a cell spans multiple rows, it records the span in `_colsWithRowSpanCache`.\n   *\n   * @param {number} row - The row index.\n   * @param {number} cell - The column index.\n   * @param {number} colspan - The number of columns the cell spans.\n   * @param {number} rowspan - The number of rows the cell spans.\n   */\n  protected remapRowSpanMetadata(row: number, cell: number, colspan: number, rowspan: number) {\n    if (rowspan > 1) {\n      const rspan = `${row}:${row + rowspan - 1}`;\n      this._colsWithRowSpanCache[cell] ??= new Set();\n      this._colsWithRowSpanCache[cell].add(rspan);\n      if (colspan > 1) {\n        for (let i = 1; i < colspan; i++) {\n          this._colsWithRowSpanCache[cell + i] ??= new Set();\n          this._colsWithRowSpanCache[cell + i].add(rspan);\n        }\n      }\n    }\n  }\n\n  /**\n   * Creates an empty row caching object to store metadata about rendered row elements.\n   * Used to optimize cell rendering and access within the grid.\n   */\n  protected createEmptyCachingRow(): RowCaching {\n    return {\n      rowNode: null,\n\n      // ColSpans of rendered cells (by column idx).\n      // Can also be used for checking whether a cell has been rendered.\n      cellColSpans: [],\n\n      // Cell nodes (by column idx).  Lazy-populated by ensureCellNodesInRowsCache().\n      cellNodesByColumnIdx: [],\n\n      // Column indices of cell nodes that have been rendered, but not yet indexed in\n      // cellNodesByColumnIdx.  These are in the same order as cell nodes added at the\n      // end of the row.\n      cellRenderQueue: [],\n    };\n  }\n\n  /**\n   * Scroll to a specific row and make it into the view\n   * @param {Number} row - grid row number\n   * @param {Boolean} doPaging - scroll when pagination is enabled\n   */\n  scrollRowIntoView(row: number, doPaging?: boolean) {\n    if (!this.hasFrozenRows ||\n      (!this._options.frozenBottom && row > this.actualFrozenRow - 1) ||\n      (this._options.frozenBottom && row < this.actualFrozenRow - 1)) {\n\n      const viewportScrollH = Utils.height(this._viewportScrollContainerY) as number;\n\n      // if frozen row on top\n      // subtract number of frozen row\n      const rowNumber = (this.hasFrozenRows && !this._options.frozenBottom ? row - this._options.frozenRow! : row);\n\n      const rowAtTop = rowNumber * this._options.rowHeight!;\n      const rowAtBottom = (rowNumber + 1) * this._options.rowHeight!\n        - viewportScrollH\n        + (this.viewportHasHScroll ? (this.scrollbarDimensions?.height ?? 0) : 0);\n\n      // need to page down?\n      if ((rowNumber + 1) * this._options.rowHeight! > this.scrollTop + viewportScrollH + this.offset) {\n        this.scrollTo(doPaging ? rowAtTop : rowAtBottom);\n        this.render();\n      }\n      // or page up?\n      else if (rowNumber * this._options.rowHeight! < this.scrollTop + this.offset) {\n        this.scrollTo(doPaging ? rowAtBottom : rowAtTop);\n        this.render();\n      }\n    }\n  }\n\n  /**\n   * Scroll to the top row and make it into the view\n   * @param {Number} row - grid row number\n   */\n  scrollRowToTop(row: number) {\n    this.scrollTo(row * this._options.rowHeight!);\n    this.render();\n  }\n\n  /**\n   * Scrolls the grid by a full page in the specified direction.\n   * Adjusts the scroll position and re-renders the grid accordingly.\n   * If cell navigation is enabled, it also updates the active cell position.\n   *\n   *  * @param {number} dir - The direction to scroll:\n   *   - `1` for scrolling down\n   *   - `-1` for scrolling up\n   *    Acts as a multiplier on numVisibleRows\n   */\n  protected scrollPage(dir: number) {\n    const deltaRows = dir * this.numVisibleRows;\n    /// First fully visible row crosses the line with\n    /// y === bottomOfTopmostFullyVisibleRow\n    const bottomOfTopmostFullyVisibleRow = this.scrollTop + this._options.rowHeight! - 1;\n    this.scrollTo((this.getRowFromPosition(bottomOfTopmostFullyVisibleRow) + deltaRows) * this._options.rowHeight!);\n    this.render();\n\n    if (this._options.enableCellNavigation && Utils.isDefined(this.activeRow)) {\n      let row = this.activeRow + deltaRows;\n      const dataLengthIncludingAddNew = this.getDataLengthIncludingAddNew();\n      if (row >= dataLengthIncludingAddNew) {\n        row = dataLengthIncludingAddNew - 1;\n      }\n      if (row < 0) {\n        row = 0;\n      }\n\n      // use the gotoDown/Up but cancel its row move to activate same row\n      // (i.e.: gotoDown(row - 1) will go to same row if it can be activated or next one down).\n      // We do this in order to find the next cell that can be activated which can be much further away (i.e. rowspan)\n      const pos = dir === 1\n        ? this.gotoDown(row - 1 || 0, this.activeCell, this.activePosY, this.activePosX)\n        : this.gotoUp(row + 1, this.activeCell, this.activePosY, this.activePosX)\n      this.navigateToPos(pos);\n    }\n  }\n\n  /** Navigate (scroll) by a page down */\n  navigatePageDown() {\n    this.scrollPage(1);\n  }\n\n  /** Navigate (scroll) by a page up */\n  navigatePageUp() {\n    this.scrollPage(-1);\n  }\n\n  /** Navigate to the top of the grid */\n  navigateTop() {\n    this.unsetActiveCell();\n    this.navigateToRow(0);\n  }\n\n  /** Navigate to the bottom of the grid */\n  navigateBottom() {\n    const row = this.getDataLength() - 1;\n    let tmpRow = this.getParentRowSpanByCell(row, this.activeCell)?.start ?? row;\n\n    do {\n      if (this._options.enableCellRowSpan) {\n        this.setActiveRow(tmpRow);\n      }\n      const isValidMode = this.navigateToRow(tmpRow);\n      if ((isValidMode && this.activeCell === this.activePosX) || !Utils.isDefined(this.activeCell)) {\n        break;\n      }\n    } while (--tmpRow > 0);\n  }\n\n  /**\n   * Navigates to a specified row, ensuring it is visible and selecting an active cell if applicable.\n   * Adjusts the scroll position and updates the active cell based on cell navigation rules.\n   *\n   * @param {number} row - The row index to navigate to.\n   * @returns {boolean} Whether the navigation was successful.\n   */\n  navigateToRow(row: number) {\n    const num_rows = this.getDataLength();\n    if (!num_rows) { return false; }\n\n    if (row < 0) {\n      row = 0;\n    } else if (row >= num_rows) {\n      row = num_rows - 1;\n    }\n\n    this.scrollCellIntoView(row, 0, true);\n    let isValidMove = !Utils.isDefined(this.activeCell) || !Utils.isDefined(this.activeRow);\n\n    if (this._options.enableCellNavigation && Utils.isDefined(this.activeRow)) {\n      let cell = 0;\n      let prevCell: number | null = null;\n      const prevActivePosX = this.activePosX;\n      while (cell <= this.activePosX) {\n        if (this.canCellBeActive(row, cell)) {\n          prevCell = cell;\n          if (!Utils.isDefined(this.activeCell) || cell === this.activeCell) {\n            isValidMove = true;\n          }\n        }\n        cell += this.getColspan(row, cell);\n      }\n\n      if (prevCell !== null) {\n        this.setActiveCellInternal(this.getCellNode(row, prevCell));\n        this.activePosX = prevActivePosX;\n      } else {\n        this.resetActiveCell();\n      }\n    }\n    return isValidMove;\n  }\n\n  /**\n   * Retrieves the colspan for a specified cell in a row, determining how many columns it spans.\n   * Uses column metadata to derive the correct colspan value.\n   *\n   * @param {number} row - The row index.\n   * @param {number} cell - The column index.\n   * @returns {number} The number of columns the cell spans.\n   */\n  protected getColspan(row: number, cell: number): number {\n    const metadata = this.getItemMetadaWhenExists(row);\n    if (!metadata || !metadata.columns) {\n      return 1;\n    }\n\n    if (cell >= this.columns.length) {\n      cell = this.columns.length - 1;\n    }\n    const columnData = metadata.columns[this.columns[cell].id] || metadata.columns[cell];\n    let colspan = columnData?.colspan;\n    if (colspan === '*') {\n      colspan = this.columns.length - cell;\n    } else {\n      colspan = colspan || 1;\n    }\n\n    return colspan as number;\n  }\n\n\n\n\n  /////////////////////////////////////////////////////////\n  // End Scrolling and Virtualisation\n  ///////////////////////////////////////////////////////\n\n\n  /////////////////////////////////////////////////////////\n  // Cell and Row Post-Processing and CSS Styling\n  ///////////////////////////////////////////////////////\n\n  /**\n   * Increments an internal group id and, for each column in the provided postProcessedRow object,\n   * queues a cleanup action (action type 'C') for that cell. It also queues a cleanup action for the\n   * entire row (action type 'R') and removes all row nodes from the DOM.\n   *\n   * @param {RowCaching} cacheEntry - The cache entry for the row.\n   * @param {any} postProcessedRow - The object containing post-processed row data.\n   * @param {number} rowIdx - The index of the row being processed.\n   */\n  protected queuePostProcessedRowForCleanup(cacheEntry: RowCaching, postProcessedRow: any, rowIdx: number) {\n    this.postProcessgroupId++;\n\n    // store and detach node for later async cleanup\n    if (typeof postProcessedRow === 'object') {\n      Object.keys(postProcessedRow).forEach(columnIdx => {\n        if (postProcessedRow.hasOwnProperty(columnIdx)) {\n          this.postProcessedCleanupQueue.push({\n            actionType: 'C',\n            groupId: this.postProcessgroupId,\n            node: cacheEntry.cellNodesByColumnIdx[+columnIdx],\n            columnIdx: +columnIdx,\n            rowIdx\n          });\n        }\n      });\n    }\n\n    if (!cacheEntry.rowNode) {\n      cacheEntry.rowNode = [];\n    }\n    this.postProcessedCleanupQueue.push({\n      actionType: 'R',\n      groupId: this.postProcessgroupId,\n      node: cacheEntry.rowNode as HTMLElement[]\n    });\n    cacheEntry.rowNode?.forEach((node) => node.remove());\n  }\n\n  /**\n   * Queues a cleanup action (action type 'C') for the provided cell DOM element and\n   * immediately removes the cell element from the DOM.\n   *\n   * @param {HTMLElement} cellnode - The DOM element representing the cell.\n   * @param {number} columnIdx - The column index of the cell.\n   * @param {number} rowIdx - The row index of the cell.\n   */\n  protected queuePostProcessedCellForCleanup(cellnode: HTMLElement, columnIdx: number, rowIdx: number) {\n    this.postProcessedCleanupQueue.push({\n      actionType: 'C',\n      groupId: this.postProcessgroupId,\n      node: cellnode,\n      columnIdx,\n      rowIdx\n    });\n    cellnode.remove();\n  }\n\n  /** Apply a Formatter Result to a Cell DOM Node\n   *\n   * If the formatter result is not an object, it is applied directly as HTML/text;\n   * otherwise, it extracts the content (from a property such as \u201Chtml\u201D or \u201Ctext\u201D) and applies it.\n   * Additionally, it conditionally removes or adds CSS classes and sets a tooltip on the cell.\n   */\n  applyFormatResultToCellNode(formatterResult: FormatterResultWithHtml | FormatterResultWithText | string | HTMLElement | DocumentFragment, cellNode: HTMLDivElement, suppressRemove?: boolean) {\n    if (formatterResult === null || formatterResult === undefined) { formatterResult = ''; }\n    if (Object.prototype.toString.call(formatterResult) !== '[object Object]') {\n      this.applyHtmlCode(cellNode, formatterResult as string | HTMLElement);\n      return;\n    }\n\n    const formatterVal: HTMLElement | string = (formatterResult as FormatterResultWithHtml).html || (formatterResult as FormatterResultWithText).text;\n    this.applyHtmlCode(cellNode, formatterVal);\n\n    if ((formatterResult as FormatterResultObject).removeClasses && !suppressRemove) {\n      cellNode.classList.remove(...Utils.classNameToList((formatterResult as FormatterResultObject).removeClasses));\n    }\n    if ((formatterResult as FormatterResultObject).addClasses) {\n      cellNode.classList.add(...Utils.classNameToList((formatterResult as FormatterResultObject).addClasses));\n    }\n    if ((formatterResult as FormatterResultObject).toolTip) {\n      cellNode.setAttribute('title', (formatterResult as FormatterResultObject).toolTip!);\n    }\n  }\n\n  /**\n   * If asynchronous post\u2013rendering is enabled, clears any existing post\u2013render timer and sets a new timeout\n   * to call asyncPostProcessRows after the configured delay.\n   *\n   * @returns {void}\n   */\n  protected startPostProcessing() {\n    if (!this._options.enableAsyncPostRender) {\n      return;\n    }\n    window.clearTimeout(this.h_postrender);\n    this.h_postrender = window.setTimeout(this.asyncPostProcessRows.bind(this), this._options.asyncPostRenderDelay);\n  }\n\n  /**\n   * If asynchronous post\u2013render cleanup is enabled, clears any existing cleanup timer and\n   * sets a new timeout to call asyncPostProcessCleanupRows after the configured delay.\n   *\n   * @returns {void}\n   */\n  protected startPostProcessingCleanup() {\n    if (!this._options.enableAsyncPostRenderCleanup) {\n      return;\n    }\n    window.clearTimeout(this.h_postrenderCleanup);\n    this.h_postrenderCleanup = window.setTimeout(this.asyncPostProcessCleanupRows.bind(this), this._options.asyncPostRenderCleanupDelay);\n  }\n\n  /**\n   * For the specified row, if post\u2013processed results exist, sets each column\u2019s status to \u201CC\u201D (indicating cleanup is needed),\n   * adjusts the postProcessFromRow and postProcessToRow boundaries, and starts the post\u2013processing timer.\n   *\n   * @param {number} row - The index of the row to invalidate.\n   */\n  protected invalidatePostProcessingResults(row: number) {\n    // change status of columns to be re-rendered\n    if (typeof this.postProcessedRows[row] === 'object') {\n      Object.keys(this.postProcessedRows[row]).forEach(columnIdx => {\n        if (this.postProcessedRows[row].hasOwnProperty(columnIdx)) {\n          this.postProcessedRows[row][columnIdx] = 'C';\n        }\n      });\n    }\n    this.postProcessFromRow = Math.min(this.postProcessFromRow as number, row);\n    this.postProcessToRow = Math.max(this.postProcessToRow as number, row);\n    this.startPostProcessing();\n  }\n\n  /**\n   * Iterates over the range of rows defined by postProcessFromRow and postProcessToRow\n   * (direction determined by vScrollDir). For each row found in the cache,\n   * it ensures cell nodes exist, then for each cell that has an async post\u2013render function\n   * and is not yet rendered (status not \u201CR\u201D), it calls the asyncPostRender callback\n   * (passing a flag if cleanup is needed). Finally, it schedules another asynchronous\n   * processing cycle using a timeout with the configured delay.\n   *\n   * @returns {void}\n   */\n  protected asyncPostProcessRows() {\n    const dataLength = this.getDataLength();\n    while (this.postProcessFromRow <= this.postProcessToRow) {\n      const row = (this.vScrollDir >= 0) ? this.postProcessFromRow++ : this.postProcessToRow--;\n      const cacheEntry = this.rowsCache[row];\n      if (!cacheEntry || row >= dataLength) {\n        continue;\n      }\n\n      if (!this.postProcessedRows[row]) {\n        this.postProcessedRows[row] = {};\n      }\n\n      this.ensureCellNodesInRowsCache(row);\n      Object.keys(cacheEntry.cellNodesByColumnIdx).forEach(colIdx => {\n        if (cacheEntry.cellNodesByColumnIdx.hasOwnProperty(colIdx)) {\n          const columnIdx = +colIdx;\n          const m = this.columns[columnIdx];\n          const processedStatus = this.postProcessedRows[row][columnIdx]; // C=cleanup and re-render, R=rendered\n          if (m.asyncPostRender && processedStatus !== 'R') {\n            const node = cacheEntry.cellNodesByColumnIdx[columnIdx];\n            if (node) {\n              m.asyncPostRender(node, row, this.getDataItem(row), m, (processedStatus === 'C'));\n            }\n            this.postProcessedRows[row][columnIdx] = 'R';\n          }\n        }\n      });\n\n      this.h_postrender = window.setTimeout(this.asyncPostProcessRows.bind(this), this._options.asyncPostRenderDelay);\n      return;\n    }\n  }\n\n  /**\n   * Checks if there are cleanup queue entries; if so, it retrieves the group id from the first entry and processes\n   * (removes) all entries in the queue with that group id. For each entry, if the action type is \u201CR\u201D,\n   * it removes all nodes in the array; if \u201CC\u201D, it calls the asyncPostRenderCleanup callback on the\n   * corresponding column. It then schedules another cleanup cycle using the configured delay.\n   */\n  protected asyncPostProcessCleanupRows() {\n    if (this.postProcessedCleanupQueue.length > 0) {\n      const groupId = this.postProcessedCleanupQueue[0].groupId;\n\n      // loop through all queue members with this groupID\n      while (this.postProcessedCleanupQueue.length > 0 && this.postProcessedCleanupQueue[0].groupId === groupId) {\n        const entry = this.postProcessedCleanupQueue.shift();\n        if (entry?.actionType === 'R') {\n          (entry.node as HTMLElement[]).forEach((node) => {\n            node.remove();\n          });\n        }\n        if (entry?.actionType === 'C') {\n          const column = this.columns[entry.columnIdx as number];\n          if (column.asyncPostRenderCleanup && entry.node) {\n            // cleanup must also remove element\n            column.asyncPostRenderCleanup(entry.node as HTMLDivElement, entry.rowIdx as number, column);\n          }\n        }\n      }\n\n      // call this function again after the specified delay\n      this.h_postrenderCleanup = window.setTimeout(this.asyncPostProcessCleanupRows.bind(this), this._options.asyncPostRenderCleanupDelay);\n    }\n  }\n\n  /**\n   * Iterates over every row in the rows cache. For each row, if there is a removed hash (previous CSS classes)\n   * and/or an added hash (new CSS classes), then for each column key it retrieves the cell node and removes any\n   * CSS class from the removed hash (if not re\u2013added) and adds CSS classes from the added hash.\n   * This synchronises the cell CSS overlays with the provided hash changes.\n   *\n   * @param {CssStyleHash | null} [addedHash] - A hash of CSS styles to be added.\n   * @param {CssStyleHash | null} [removedHash] - A hash of CSS styles to be removed.\n   */\n  protected updateCellCssStylesOnRenderedRows(addedHash?: CssStyleHash | null, removedHash?: CssStyleHash | null) {\n    let node: HTMLElement | null;\n    let addedRowHash: any;\n    let removedRowHash: any;\n    if (typeof this.rowsCache === 'object') {\n      Object.keys(this.rowsCache).forEach(row => {\n        if (this.rowsCache) {\n          removedRowHash = removedHash?.[row];\n          addedRowHash = addedHash?.[row];\n\n          if (removedRowHash) {\n            Object.keys(removedRowHash).forEach(columnId => {\n              if (!addedRowHash || removedRowHash[columnId] !== addedRowHash[columnId]) {\n                node = this.getCellNode(+row, this.getColumnIndex(columnId));\n                if (node) {\n                  node.classList.remove(removedRowHash[columnId]);\n                }\n              }\n            });\n          }\n\n          if (addedRowHash) {\n            Object.keys(addedRowHash).forEach(columnId => {\n              if (!removedRowHash || removedRowHash[columnId] !== addedRowHash[columnId]) {\n                node = this.getCellNode(+row, this.getColumnIndex(columnId));\n                if (node) {\n                  node.classList.add(addedRowHash[columnId]);\n                }\n              }\n            });\n          }\n        }\n      });\n    }\n  }\n\n  /**\n   * Adds an \"overlay\" of CSS classes to cell DOM elements. SlickGrid can have many such overlays associated with different keys and they are frequently used by plugins. For example, SlickGrid uses this method internally to decorate selected cells with selectedCellCssClass (see options).\n   * @param {String} key A unique key you can use in calls to setCellCssStyles and removeCellCssStyles. If a hash with that key has already been set, an exception will be thrown.\n   * @param {CssStyleHash} hash A hash of additional cell CSS classes keyed by row number and then by column id. Multiple CSS classes can be specified and separated by space.\n   * @example\n   * `{\n   * \t 0: { number_column: SlickEvent; title_column: SlickEvent;\t},\n   * \t 4: { percent_column: SlickEvent; }\n   * }`\n   */\n  addCellCssStyles(key: string, hash: CssStyleHash) {\n    if (this.cellCssClasses[key]) {\n      throw new Error(`SlickGrid addCellCssStyles: cell CSS hash with key \"${key}\" already exists.`);\n    }\n\n    this.cellCssClasses[key] = hash;\n    this.updateCellCssStylesOnRenderedRows(hash, null);\n    this.trigger(this.onCellCssStylesChanged, { key, hash, grid: this });\n  }\n\n  /**\n   * Removes an \"overlay\" of CSS classes from cell DOM elements. See setCellCssStyles for more.\n   * @param {String} key A string key.\n   */\n  removeCellCssStyles(key: string) {\n    if (!this.cellCssClasses[key]) {\n      return;\n    }\n\n    this.updateCellCssStylesOnRenderedRows(null, this.cellCssClasses[key]);\n    delete this.cellCssClasses[key];\n    this.trigger(this.onCellCssStylesChanged, { key, hash: null, grid: this });\n  }\n\n  /**\n   * Sets CSS classes to specific grid cells by calling removeCellCssStyles(key) followed by addCellCssStyles(key, hash). key is name for this set of styles so you can reference it later - to modify it or remove it, for example. hash is a per-row-index, per-column-name nested hash of CSS classes to apply.\n   * Suppose you have a grid with columns:\n   * [\"login\", \"name\", \"birthday\", \"age\", \"likes_icecream\", \"favorite_cake\"]\n   * ...and you'd like to highlight the \"birthday\" and \"age\" columns for people whose birthday is today, in this case, rows at index 0 and 9. (The first and tenth row in the grid).\n   * @param {String} key A string key. Will overwrite any data already associated with this key.\n   * @param {Object} hash A hash of additional cell CSS classes keyed by row number and then by column id. Multiple CSS classes can be specified and separated by space.\n   */\n  setCellCssStyles(key: string, hash: CssStyleHash) {\n    const prevHash = this.cellCssClasses[key];\n\n    this.cellCssClasses[key] = hash;\n    this.updateCellCssStylesOnRenderedRows(hash, prevHash);\n    this.trigger(this.onCellCssStylesChanged, { key, hash, grid: this });\n  }\n\n  /**\n   * Accepts a key name, returns the group of CSS styles defined under that name. See setCellCssStyles for more info.\n   * @param {String} key A string.\n   */\n  getCellCssStyles(key: string): CssStyleHash {\n    return this.cellCssClasses[key];\n  }\n\n  /**\n   * Flashes the cell twice by toggling the CSS class 4 times.\n   * @param {Number} row A row index.\n   * @param {Number} cell A column index.\n   * @param {Number} [speed] (optional) - The milliseconds delay between the toggling calls. Defaults to 250 ms.\n   */\n  flashCell(row: number, cell: number, speed = 250) {\n    const toggleCellClass = (cellNode: HTMLElement, times: number) => {\n      if (times < 1) {\n        return;\n      }\n\n      window.clearTimeout(this._flashCellTimer);\n      this._flashCellTimer = window.setTimeout(() => {\n        if (times % 2 === 0) {\n          cellNode.classList.add(this._options.cellFlashingCssClass || '');\n        } else {\n          cellNode.classList.remove(this._options.cellFlashingCssClass || '');\n        }\n        toggleCellClass(cellNode, times - 1);\n      }, speed);\n    };\n\n    if (this.rowsCache[row]) {\n      const cellNode = this.getCellNode(row, cell);\n      if (cellNode) {\n        toggleCellClass(cellNode, 5);\n      }\n    }\n  }\n\n  /**\n   * Highlight a row for a certain duration (ms) of time.\n   * @param {Number} row - grid row number\n   * @param {Number} [duration] - duration (ms), defaults to 400ms\n   */\n  highlightRow(row: number, duration?: number) {\n    const rowCache = this.rowsCache[row];\n    duration ||= this._options.rowHighlightDuration;\n\n    if (Array.isArray(rowCache?.rowNode) && this._options.rowHighlightCssClass) {\n      rowCache.rowNode.forEach(node => node.classList.add(...Utils.classNameToList(this._options.rowHighlightCssClass)));\n      window.clearTimeout(this._highlightRowTimer);\n      this._highlightRowTimer = window.setTimeout(() => {\n        rowCache.rowNode?.forEach(node => node.classList.remove(...Utils.classNameToList(this._options.rowHighlightCssClass)));\n      }, duration);\n    }\n  }\n\n  ////////////////////////////////////////////////////////////////////////\n  // End Post-processing and CSS\n  ////////////////////////////////////////////////////////////////////////\n\n\n  ////////////////////////////////////////////////////////////////////////\n  // Shared Utilities and Accessors\n  ////////////////////////////////////////////////////////////////////////\n\n  /**\n   * Helper method that selects the proper container element from a provided array based on the column\n   * identifier/index and row index. It calculates whether the target should be from the \u201Cbottom\u201D or\n   * \u201Cright\u201D side based on frozen rows/columns.\n   *\n   * @param {HTMLElement[]} targetContainers - The array of possible container elements.\n   * @param {number | string} [columnIdOrIdx] - The column identifier or index.\n   * @param {number} [rowIndex] - The row index.\n   * @returns {HTMLElement | undefined} The selected container element or undefined if not found.\n   */\n  protected _getContainerElement(targetContainers: HTMLElement[], columnIdOrIdx?: number | string, rowIndex?: number) {\n    if (!targetContainers) { return; }\n    if (!columnIdOrIdx) { columnIdOrIdx = 0; }\n    if (!rowIndex) { rowIndex = 0; }\n\n    const idx = (typeof columnIdOrIdx === 'number' ? columnIdOrIdx : this.getColumnIndex(columnIdOrIdx));\n\n    const isBottomSide = this.hasFrozenRows && rowIndex >= this.actualFrozenRow + (this._options.frozenBottom ? 0 : 1);\n    const isRightSide = this.hasFrozenColumns() && idx > this._options.frozenColumn!;\n\n    return targetContainers[(isBottomSide ? 2 : 0) + (isRightSide ? 1 : 0)];\n  }\n\n  /**\n   * Dynamically creates temporary DOM elements to measure the difference between offsetWidth/Height\n   * and clientWidth/Height, thereby computing the scrollbar width and height. After measuring, it\n   * removes the temporary elements and returns the dimensions.\n   *\n   * @returns {{ width: number; height: number }} The computed scrollbar dimensions.\n   */\n  protected measureScrollbar() {\n    let className = '';\n    this._viewport.forEach(v => className += v.className);\n    const outerdiv = Utils.createDomElement('div', { className, style: { position: 'absolute', top: '-10000px', left: '-10000px', overflow: 'auto', width: '100px', height: '100px' } }, document.body);\n    const innerdiv = Utils.createDomElement('div', { style: { width: '200px', height: '200px', overflow: 'auto' } }, outerdiv);\n    const dim = {\n      width: outerdiv.offsetWidth - outerdiv.clientWidth,\n      height: outerdiv.offsetHeight - outerdiv.clientHeight\n    };\n    innerdiv.remove();\n    outerdiv.remove();\n    return dim;\n  }\n\n  /**\n   * Dynamically doubles a test height on a temporary element until the element no longer accepts the height\n   * (or exceeds a browser-specific maximum). Returns the highest supported CSS height in pixels.\n   *\n   * @returns {number} The highest supported CSS height in pixels.\n   */\n  protected getMaxSupportedCssHeight() {\n    let supportedHeight = 1000000;\n    // FF reports the height back but still renders blank after ~6M px\n    // let testUpTo = navigator.userAgent.toLowerCase().match(/firefox/) ? 6000000 : 1000000000;\n    const testUpTo = navigator.userAgent.toLowerCase().match(/firefox/) ? this._options.ffMaxSupportedCssHeight : this._options.maxSupportedCssHeight;\n    const div = Utils.createDomElement('div', { style: { display: 'hidden' } }, document.body);\n\n    while (true) {\n      const test = supportedHeight * 2;\n      Utils.height(div, test);\n      const height = Utils.height(div);\n\n      if (test > testUpTo! || height !== test) {\n        break;\n      } else {\n        supportedHeight = test;\n      }\n    }\n\n    div.remove();\n    return supportedHeight;\n  }\n\n  /** Get grid unique identifier */\n  getUID() {\n    return this.uid;\n  }\n\n  /** Get Header Column Width Difference in pixel */\n  getHeaderColumnWidthDiff() {\n    return this.headerColumnWidthDiff;\n  }\n\n  /** Get scrollbar dimensions */\n  getScrollbarDimensions() {\n    return this.scrollbarDimensions;\n  }\n\n  /**\n   * Returns an object with width and height of scrollbars currently displayed in the viewport (zero if not visible).\n   */\n  getDisplayedScrollbarDimensions() {\n    return {\n      width: this.viewportHasVScroll ? (this.scrollbarDimensions?.width ?? 0) : 0,\n      height: this.viewportHasHScroll ? (this.scrollbarDimensions?.height ?? 0) : 0\n    };\n  }\n\n  /** Get the absolute column minimum width */\n  getAbsoluteColumnMinWidth(): number {\n    return this.absoluteColumnMinWidth;\n  }\n\n  /**\n   * Calculates the vertical box sizes (the sum of top/bottom borders and paddings)\n   * for a given element by reading its computed style.\n   * @param el\n   * @returns number\n   */\n  protected getVBoxDelta(el: HTMLElement): number {\n    const p = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom'];\n    const styles = getComputedStyle(el);\n    let delta = 0;\n    p.forEach((val) => (delta += Utils.toFloat(styles[val as any])));\n    return delta;\n  }\n\n  /**\n   * Creates temporary elements in the header and a grid cell to calculate the extra width\n   * and height added by borders and padding (when box-sizing is not \u201Cborder-box\u201D).\n   * Sets internal properties (headerColumnWidthDiff, headerColumnHeightDiff, cellWidthDiff, cellHeightDiff)\n   * and computes the absoluteColumnMinWidth as the maximum of the header and cell width differences.\n   *\n   */\n  protected measureCellPaddingAndBorder() {\n    const h = ['borderLeftWidth', 'borderRightWidth', 'paddingLeft', 'paddingRight'];\n    const v = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom'];\n    const header = this._headers[0];\n\n    this.headerColumnWidthDiff = this.headerColumnHeightDiff = 0;\n    this.cellWidthDiff = this.cellHeightDiff = 0;\n\n    let el = Utils.createDomElement('div', { className: 'ui-state-default slick-state-default slick-header-column', style: { visibility: 'hidden' }, textContent: '-' }, header);\n    let style = getComputedStyle(el);\n    if (style.boxSizing !== 'border-box') {\n      h.forEach((val) => this.headerColumnWidthDiff += Utils.toFloat(style[val as any]));\n      v.forEach((val) => this.headerColumnHeightDiff += Utils.toFloat(style[val as any]));\n    }\n    el.remove();\n\n    const r = Utils.createDomElement('div', { className: 'slick-row' }, this._canvas[0]);\n    el = Utils.createDomElement('div', { className: 'slick-cell', id: '', style: { visibility: 'hidden' }, textContent: '-' }, r);\n    style = getComputedStyle(el);\n    if (style.boxSizing !== 'border-box') {\n      h.forEach((val) => this.cellWidthDiff += Utils.toFloat(style[val as any]));\n      v.forEach((val) => this.cellHeightDiff += Utils.toFloat(style[val as any]));\n    }\n    r.remove();\n\n    this.absoluteColumnMinWidth = Math.max(this.headerColumnWidthDiff, this.cellWidthDiff);\n  }\n\n  /** Clear all highlight timers that might have been left opened */\n  protected clearAllTimers() {\n    window.clearTimeout(this._columnResizeTimer);\n    window.clearTimeout(this._executionBlockTimer);\n    window.clearTimeout(this._flashCellTimer);\n    window.clearTimeout(this._highlightRowTimer);\n    window.clearTimeout(this.h_editorLoader);\n  }\n\n  /** Logs a string to the console listing each column\u2019s width (or \u201CH\u201D if hidden) for debugging purposes. */\n  protected LogColWidths() {\n    let s = 'Col Widths:';\n    for (let i = 0; i < this.columns.length; i++) { s += ' ' + (this.columns[i].hidden ? 'H' : this.columns[i].width); }\n    console.log(s);\n  }\n\n  // compare 2 primitive type arrays, do not use to compare object arrays)\n  arrayEquals<T extends boolean | string | number>(arr1: Array<T>, arr2: Array<T>): boolean {\n    return Array.isArray(arr1) && Array.isArray(arr2) && arr2.toString() === arr1.toString();\n  }\n\n  /**\n   * Scroll to an X coordinate position in the grid\n   * @param {Number} x\n   */\n  scrollToX(x: number): void {\n    this._viewportScrollContainerX.scrollLeft = x;\n    this._headerScrollContainer.scrollLeft = x;\n    this._topPanelScrollers[0].scrollLeft = x;\n    if (this._options.createFooterRow) {\n      this._footerRowScrollContainer.scrollLeft = x;\n    }\n    if (this._options.createPreHeaderPanel) {\n      if (this.hasFrozenColumns()) {\n        this._preHeaderPanelScrollerR.scrollLeft = x;\n      } else {\n        this._preHeaderPanelScroller.scrollLeft = x;\n      }\n    }\n    if (this._options.createTopHeaderPanel) {\n      this._topHeaderPanelScroller.scrollLeft = x;\n    }\n\n    if (this.hasFrozenColumns()) {\n      if (this.hasFrozenRows) {\n        this._viewportTopR.scrollLeft = x;\n      }\n      this._headerRowScrollerR.scrollLeft = x; // right header row scrolling with frozen grid\n    } else {\n      if (this.hasFrozenRows) {\n        this._viewportTopL.scrollLeft = x;\n      }\n      this._headerRowScrollerL.scrollLeft = x; // left header row scrolling with regular grid\n    }\n  }\n\n  /**\n   * Converts a value to a string and escapes HTML characters (&, <, >). Returns an empty string if the value is not defined.\n   */\n  protected defaultFormatter(_row: number, _cell: number, value: any) {\n    if (!Utils.isDefined(value)) {\n      return '';\n    } else {\n      return (value + '').replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n    }\n  }\n\n  /** Returns false if the specified row or cell index is out of bounds or if the column is hidden; otherwise returns true. */\n  protected cellExists(row: number, cell: number) {\n    return !(row < 0 || row >= this.getDataLength() || cell < 0 || cell >= this.columns.length);\n  }\n\n  /** Reads the CSS class (of the form \u201Cl<number>\u201D) from the given cell DOM node to extract and return the column index. Throws an error if not found. */\n  protected getCellFromNode(cellNode: HTMLElement) {\n    // read column number from .l<columnNumber> CSS class\n    const cls = /l\\d+/.exec(cellNode.className);\n    if (!cls) {\n      throw new Error(`SlickGrid getCellFromNode: cannot get cell - ${cellNode.className}`);\n    }\n    return parseInt(cls[0].substr(1, cls[0].length - 1), 10);\n  }\n\n  /** Iterates through the rows cache to find which row\u2019s DOM element matches the given node and returns its row index; returns null if not found. */\n  protected getRowFromNode(rowNode: HTMLElement): number | null {\n    for (const row in this.rowsCache) {\n      if (this.rowsCache) {\n        for (const i in this.rowsCache[row].rowNode) {\n          if (this.rowsCache[row].rowNode?.[+i] === rowNode) {\n            return (row ? parseInt(row, 10) : 0);\n          }\n        }\n      }\n    }\n    return null;\n  }\n\n  /** Clears the current text selection using IE\u2019s document.selection.empty (if available) or window.getSelection to remove all ranges. */\n  protected clearTextSelection() {\n    if ((document as any).selection?.empty) {\n      try {\n        // IE fails here if selected element is not in dom\n        (document as any).selection.empty();\n        // eslint-disable-next-line no-empty\n      } catch (e) { }\n    } else if (window.getSelection) {\n      const sel = window.getSelection();\n      if (sel?.removeAllRanges) {\n        sel.removeAllRanges();\n      }\n    }\n  }\n\n  /**\n   * For each provided element in target, sets the \u201Cunselectable\u201D attribute, disables Mozilla\u2019s user selection style,\n   * and binds a \u201Cselectstart\u201D event that always returns false, thus disabling text selection.\n   *\n   * @param target\n   */\n  protected disableSelection(target: HTMLElement[]) {\n    target.forEach((el) => {\n      el.setAttribute('unselectable', 'on');\n      (el.style as any).mozUserSelect = 'none';\n      this._bindingEventService.bind(el, 'selectstart', () => false);\n    });\n  }\n\n  /** Get the displayed scrollbar dimensions */\n  getPubSubService(): BasePubSub | undefined {\n    return this._pubSubService;\n  }\n\n  /**\n   * Returns row and cell indexes by providing x,y coordinates.\n   * Coordinates are relative to the top left corner of the grid beginning with the first row (not including the column headers).\n   * @param x An x coordinate.\n   * @param y A y coordinate.\n   */\n  getCellFromPoint(x: number, y: number) {\n    let row = this.getRowFromPosition(y);\n    let cell = 0;\n\n    let w = 0;\n    for (let i = 0; i < this.columns.length && w <= x; i++) {\n      if (!this.columns[i]) {\n        continue;\n      }\n      w += this.columns[i].width as number;\n      cell++;\n    }\n    cell -= 1;\n\n    // we'll return -1 when coordinate falls outside the grid canvas\n    if (row < -1) {\n      row = -1;\n    }\n\n    return { row, cell };\n  }\n\n  /** Get a Plugin (addon) by its name */\n  getPluginByName<P extends SlickPlugin | undefined = undefined>(name: string) {\n    for (let i = this.plugins.length - 1; i >= 0; i--) {\n      if (this.plugins[i]?.pluginName === name) {\n        return this.plugins[i] as P;\n      }\n    }\n    return undefined;\n  }\n\n  /** Get Grid Canvas Node DOM Element */\n  getContainerNode() {\n    return this._container;\n  }\n\n  /**\n   * Computes the height of a cell, taking into account row span if applicable.\n   *\n   * @param {number} row - The row index of the cell.\n   * @param {number} rowspan - The number of rows the cell spans.\n   * @returns {number} The computed cell height in pixels.\n   */\n  getCellHeight(row: number, rowspan: number) {\n    let cellHeight = this._options.rowHeight || 0;\n    if (rowspan > 1) {\n      const rowSpanBottomIdx = row + rowspan - 1;\n      cellHeight = this.getRowBottom(rowSpanBottomIdx) - this.getRowTop(row);\n    } else {\n      const rowHeight = this.getRowHeight();\n      if (rowHeight !== cellHeight - this.cellHeightDiff) {\n        cellHeight = rowHeight;\n      }\n    }\n    cellHeight -= this.cellHeightDiff;\n    return Math.ceil(cellHeight);\n  }\n\n  /**\n   * Computes the difference between two sets, returning elements that exist in `a` but not in `b`.\n   * This serves as a polyfill for `Set.prototype.difference()` introduced in ES2024.\n   *\n   * @param {Set<number>} a - The base set from which elements will be removed.\n   * @param {Set<number>} b - The set containing elements to be excluded from `a`.\n   * @returns {Set<number>} A new set containing elements present in `a` but not in `b`.\n   */\n  protected setDifference(a: Set<number>, b: Set<number>): Set<number> {\n    return new Set(Array.from(a).filter((item) => !b.has(item)));\n  }\n\n  /**\n   * Returns an object representing information about a cell's position. All coordinates are absolute and take into consideration the visibility and scrolling position of all ancestors.\n   * @param {Number} row - A row number.\n   * @param {Number} cell - A column number.\n   */\n  getCellNodeBox(row: number, cell: number) {\n    if (!this.cellExists(row, cell)) {\n      return null;\n    }\n\n    const frozenRowOffset = this.getFrozenRowOffset(row);\n\n    const y1 = this.getRowTop(row) - frozenRowOffset;\n    const y2 = y1 + this._options.rowHeight! - 1;\n    let x1 = 0;\n    for (let i = 0; i < cell; i++) {\n      if (!this.columns[i] || this.columns[i].hidden) { continue; }\n\n      x1 += (this.columns[i].width || 0);\n\n      if (this._options.frozenColumn === i) {\n        x1 = 0;\n      }\n    }\n    const x2 = x1 + (this.columns[cell]?.width || 0);\n\n    return {\n      top: y1,\n      left: x1,\n      bottom: y2,\n      right: x2,\n    };\n  }\n\n  /**\n   * Computes the absolute position of an element relative to the document,\n   * taking into account offsets, scrolling, and visibility within scrollable containers.\n   *\n   * @param {HTMLElement} elem - The element to compute the absolute position for.\n   * @returns {Object} An object containing:\n   *   - `top`: The top position relative to the document.\n   *   - `left`: The left position relative to the document.\n   *   - `bottom`: The bottom position relative to the document.\n   *   - `right`: The right position relative to the document.\n   *   - `width`: The width of the element.\n   *   - `height`: The height of the element.\n   *   - `visible`: A boolean indicating whether the element is visible within its scrollable container.\n   *     This accounts for both vertical (`overflowY`) and horizontal (`overflowX`) visibility.\n   */\n  protected absBox(elem: HTMLElement) {\n    const box = {\n      top: elem.offsetTop,\n      left: elem.offsetLeft,\n      bottom: 0,\n      right: 0,\n      width: elem.offsetWidth,\n      height: elem.offsetWidth,\n      visible: true\n    };\n    box.bottom = box.top + box.height;\n    box.right = box.left + box.width;\n\n    // walk up the tree\n    let offsetParent = elem.offsetParent;\n    while ((elem = elem.parentNode as HTMLElement) !== document.body) {\n      if (!elem || !elem.parentNode) {\n        break;\n      }\n\n      const styles = getComputedStyle(elem);\n      if (box.visible && elem.scrollHeight !== elem.offsetHeight && styles['overflowY'] !== 'visible') {\n        box.visible = box.bottom > elem.scrollTop && box.top < elem.scrollTop + elem.clientHeight;\n      }\n\n      if (box.visible && elem.scrollWidth !== elem.offsetWidth && styles['overflowX'] !== 'visible') {\n        box.visible = box.right > elem.scrollLeft && box.left < elem.scrollLeft + elem.clientWidth;\n      }\n\n      box.left -= elem.scrollLeft;\n      box.top -= elem.scrollTop;\n\n      if (elem === offsetParent) {\n        box.left += elem.offsetLeft;\n        box.top += elem.offsetTop;\n        offsetParent = elem.offsetParent;\n      }\n\n      box.bottom = box.top + box.height;\n      box.right = box.left + box.width;\n    }\n\n    return box;\n  }\n\n  /** Returns an object representing information about the active cell's position. All coordinates are absolute and take into consideration the visibility and scrolling position of all ancestors. */\n  getActiveCellPosition() {\n    return this.absBox(this.activeCellNode as HTMLElement);\n  }\n\n  /** Get the Grid Position */\n  getGridPosition() {\n    return this.absBox(this._container);\n  }\n\n  /** Returns the active cell editor. If there is no actively edited cell, null is returned.   */\n  getCellEditor() {\n    return this.currentEditor;\n  }\n\n  /**\n   * Returns an object representing the coordinates of the currently active cell:\n   * @example\t`{ row: activeRow, cell: activeCell }`\n   */\n  getActiveCell() {\n    if (!this.activeCellNode) {\n      return null;\n    }\n    return { row: this.activeRow, cell: this.activeCell };\n  }\n\n  /** Returns the DOM element containing the currently active cell. If no cell is active, null is returned. */\n  getActiveCellNode() {\n    return this.activeCellNode;\n  }\n\n  // This get/set methods are used for keeping text-selection. These don't consider IE because they don't loose text-selection.\n  // Fix for firefox selection. See https://github.com/mleibman/SlickGrid/pull/746/files\n  protected getTextSelection() {\n    let textSelection: Range | null = null;\n    if (window.getSelection) {\n      const selection = window.getSelection();\n      if ((selection?.rangeCount ?? 0) > 0) {\n        textSelection = selection!.getRangeAt(0);\n      }\n    }\n    return textSelection;\n  }\n\n  /**\n   * Sets the text selection to the specified range within the document.\n   * Clears any existing selections before applying the new range.\n   *\n   * @param {Range} selection - The text range to be selected.\n   */\n  protected setTextSelection(selection: Range) {\n    if (window.getSelection && selection) {\n      const target = window.getSelection();\n      if (target) {\n        target.removeAllRanges();\n        target.addRange(selection);\n      }\n    }\n  }\n\n  /** html sanitizer to avoid scripting attack */\n  sanitizeHtmlString(dirtyHtml: string, suppressLogging?: boolean) {\n    if (!this._options.sanitizer || typeof dirtyHtml !== 'string') {\n      return dirtyHtml;\n    }\n\n    const cleanHtml = this._options.sanitizer(dirtyHtml);\n\n    if (!suppressLogging && this._options.logSanitizedHtml && this.logMessageCount <= this.logMessageMaxCount && cleanHtml !== dirtyHtml) {\n      console.log(`sanitizer altered html: ${dirtyHtml} --> ${cleanHtml}`);\n      if (this.logMessageCount === this.logMessageMaxCount) {\n        console.log(`sanitizer: silencing messages after first ${this.logMessageMaxCount}`);\n      }\n      this.logMessageCount++;\n    }\n    return cleanHtml;\n  }\n\n  ///////////////////////////////////////////////////////////////\n  // End Shared Utilities and Accessors\n  ///////////////////////////////////////////////////////////////\n\n\n  ///////////////////////////////////////////////////////////////\n  // Navigation Helpers\n  ///////////////////////////////////////////////////////////////\n\n  /**\n   * Retrieves the rowspan value for a specific cell in a row.\n   *\n   * @param {number} row - The row index.\n   * @param {number} cell - The column index.\n   * @returns {number} The number of rows the cell spans.\n   */\n  protected getRowspan(row: number, cell: number) {\n    let rowspan = 1;\n    const metadata = this.getItemMetadaWhenExists(row);\n    if (metadata?.columns) {\n      Object.keys(metadata.columns).forEach(col => {\n        const colIdx = Number(col);\n        if (colIdx === cell) {\n          const columnMeta = metadata.columns![colIdx];\n          rowspan = Number(columnMeta?.rowspan || 1);\n        }\n      });\n    }\n    return rowspan;\n  }\n\n  /**\n   * Finds the nearest focusable row in the specified direction.\n   *\n   * @param {number} row - The current row index.\n   * @param {number} cell - The column index.\n   * @param {'up' | 'down'} dir - The direction to search for a focusable row.\n   * @returns {number} The index of the focusable row.\n   */\n  protected findFocusableRow(row: number, cell: number, dir: 'up' | 'down') {\n    let r = row;\n    const rowRange = this._colsWithRowSpanCache[cell] || new Set<string>();\n    let found = false;\n\n    Array.from(rowRange).forEach((rrange) => {\n      const [start, end] = rrange.split(':').map(Number);\n      if (!found && row >= start && row <= end) {\n        r = dir === 'up' ? start : end;\n        if (this.canCellBeActive(r, cell)) {\n          found = true;\n        }\n      }\n    });\n    if (r < 0) {\n      r = 0;\n    }\n\n    return r;\n  }\n\n  /**\n   * Finds the first focusable cell in a given row.\n   *\n   * @param {number} row - The row index.\n   * @returns {{ cell: number; row: number; }} The first focusable cell and its row.\n   */\n  protected findFirstFocusableCell(row: number): { cell: number; row: number; } {\n    let cell = 0;\n    let focusableRow = row;\n    let ff = -1;\n\n    while (cell < this.columns.length) {\n      const prs = this.getParentRowSpanByCell(row, cell);\n      focusableRow = (prs !== null && prs.start !== row) ? prs.start : row;\n      if (this.canCellBeActive(focusableRow, cell)) {\n        ff = cell;\n        break;\n      }\n      cell += this.getColspan(focusableRow, cell);\n    }\n    return { cell: ff, row: focusableRow };\n  }\n\n  /**\n   * Finds the last focusable cell in a given row.\n   *\n   * @param {number} row - The row index.\n   * @returns {{ cell: number; row: number; }} The last focusable cell and its row.\n   */\n  protected findLastFocusableCell(row: number): { cell: number; row: number; } {\n    let cell = 0;\n    let focusableRow = row;\n    let lf = -1;\n\n    while (cell < this.columns.length) {\n      const prs = this.getParentRowSpanByCell(row, cell);\n      focusableRow = (prs !== null && prs.start !== row) ? prs.start : row;\n      if (this.canCellBeActive(focusableRow, cell)) {\n        lf = cell;\n      }\n      cell += this.getColspan(focusableRow, cell);\n    }\n\n    return { cell: lf, row: focusableRow };\n  }\n\n  /**\n   * Converts an array of row indices into a range format.\n   *\n   * @param {number[]} rows - The row indices.\n   * @returns {SlickRange_[]} An array of ranges covering the specified rows.\n   */\n  protected rowsToRanges(rows: number[]) {\n    const ranges: SlickRange_[] = [];\n    const lastCell = this.columns.length - 1;\n    for (let i = 0; i < rows.length; i++) {\n      ranges.push(new SlickRange(rows[i], 0, rows[i], lastCell));\n    }\n    return ranges;\n  }\n\n  /**\n   * From any row/cell indexes that might have colspan/rowspan, find its starting indexes\n   * For example, if we start at 0,0 and we have colspan/rowspan of 4 for both and our indexes is row:2,cell:3\n   * then our starting row/cell is 0,0. If a cell has no spanning at all then row/cell output is same as input\n   *\n   * @param {number} row - The row index.\n   * @param {number} cell - The column index.\n   * @returns {{ cell: number; row: number; }} The starting cell position.\n   */\n  findSpanStartingCell(row: number, cell: number) {\n    const prs = this.getParentRowSpanByCell(row, cell);\n    const focusableRow = (prs !== null && prs.start !== row) ? prs.start : row;\n    let fc = 0;\n    let prevCell = 0;\n\n    while (fc < this.columns.length) {\n      fc += this.getColspan(focusableRow, fc);\n      if (fc > cell) {\n        fc = prevCell;\n        return { cell: fc, row: focusableRow };\n      }\n      prevCell = fc;\n    }\n\n    return { cell: fc, row: focusableRow };\n  }\n\n  /**\n   * Moves the focus to the right within the grid.\n   *\n   * @param {number} _row - The row index.\n   * @param {number} cell - The column index.\n   * @param {number} posY - The current vertical position.\n   * @param {number} [_posX] - The current horizontal position.\n   * @returns {CellPosition | null} The new cell position, or null if not found.\n   */\n  protected gotoRight(_row: number, cell: number, posY: number, _posX?: number) {\n    if (cell >= this.columns.length) {\n      return null;\n    }\n    let fc = cell + 1;\n    let fr = posY;\n\n    do {\n      const sc = this.findSpanStartingCell(posY, fc);\n      fr = sc.row;\n      fc = sc.cell;\n      if (this.canCellBeActive(fr, fc) && fc > cell) {\n        break;\n      }\n      fc += this.getColspan(fr, sc.cell);\n    } while (fc < this.columns.length);\n\n    if (fc < this.columns.length) {\n      return {\n        row: fr,\n        cell: fc,\n        posX: fc,\n        posY,\n      };\n    }\n    return null;\n  }\n\n  /**\n   * Moves the focus to the left within the grid.\n   *\n   * @param {number} row - The row index.\n   * @param {number} cell - The column index.\n   * @param {number} posY - The current vertical position.\n   * @param {number} [_posX] - The current horizontal position.\n   * @returns {CellPosition | null} The new cell position, or null if not found.\n   */\n  protected gotoLeft(row: number, cell: number, posY: number, _posX?: number) {\n    if (cell <= 0) {\n      return null;\n    }\n\n    const ff = this.findFirstFocusableCell(row);\n    if (ff.cell === null || ff.cell >= cell) {\n      return null;\n    }\n\n    let pos: CellPosition | null;\n    let prev = {\n      row,\n      cell: ff.cell,\n      posX: ff.cell,\n      posY,\n    };\n\n    while (true) {\n      pos = this.gotoRight(prev.row, prev.cell, prev.posY, prev.posX);\n      if (!pos) {\n        return null;\n      }\n      if (pos.cell >= cell) {\n        // when right cell is within a rowspan, we need to use original row (posY)\n        const nextRow = this.findFocusableRow(posY, prev.cell, 'up');\n        if (nextRow !== prev.row) {\n          prev.row = nextRow;\n        }\n        return prev;\n      }\n      prev = pos;\n    }\n  }\n\n  /**\n   * Moves the focus downward within the grid.\n   *\n   * @param {number} row - The row index.\n   * @param {number} cell - The column index.\n   * @param {number} _posY - The current vertical position.\n   * @param {number} posX - The current horizontal position.\n   * @returns {CellPosition | null} The new cell position, or null if not found.\n   */\n  protected gotoDown(row: number, cell: number, _posY: number, posX: number) {\n    let prevCell;\n    const ub = this.getDataLengthIncludingAddNew();\n    do {\n      row += this.getRowspan(row, posX);\n      prevCell = cell = 0;\n      while (cell <= posX) {\n        prevCell = cell;\n        cell += this.getColspan(row, cell);\n      }\n    }\n    while (row <= ub && !this.canCellBeActive(row, prevCell));\n\n    if (row <= ub) {\n      return {\n        row,\n        cell: prevCell,\n        posX,\n        posY: row,\n      };\n    }\n    return null;\n  }\n\n  /**\n   * Moves the focus upward within the grid.\n   *\n   * @param {number} row - The row index.\n   * @param {number} cell - The column index.\n   * @param {number} _posY - The current vertical position.\n   * @param {number} posX - The current horizontal position.\n   * @returns {CellPosition | null} The new cell position, or null if not found.\n   */\n  protected gotoUp(row: number, cell: number, _posY: number, posX: number) {\n    let prevCell;\n    if (row <= 0) {\n      return null;\n    }\n    do {\n      row = this.findFocusableRow(row - 1, posX, 'up');\n      prevCell = cell = 0;\n      while (cell <= posX) {\n        prevCell = cell;\n        cell += this.getColspan(row, cell);\n      }\n    }\n    while (row >= 0 && !this.canCellBeActive(row, prevCell));\n\n    if (cell <= this.columns.length) {\n      return {\n        row,\n        cell: prevCell,\n        posX,\n        posY: row,\n      };\n    }\n    return null;\n  }\n\n  /**\n   * Moves the focus to the next cell in the grid.\n   *\n   * @param {number} row - The row index.\n   * @param {number} cell - The column index.\n   * @param {number} posY - The current vertical position.\n   * @param {number} posX - The current horizontal position.\n   * @returns {CellPosition | null} The new cell position, or null if not found.\n   */\n  protected gotoNext(row: number, cell: number, posY: number, posX: number) {\n    if (!Utils.isDefined(row) && !Utils.isDefined(cell)) {\n      row = cell = posY = posX = 0;\n      if (this.canCellBeActive(row, cell)) {\n        return {\n          row,\n          cell,\n          posX: cell,\n          posY,\n        };\n      }\n    }\n\n    let pos = this.gotoRight(row, cell, posY, posX);\n    if (!pos) {\n      let ff;\n      while (!pos && ++posY < this.getDataLength() + (this._options.enableAddRow ? 1 : 0)) {\n        ff = this.findFirstFocusableCell(posY);\n        if (ff.cell !== null) {\n          row = this.getParentRowSpanByCell(posY, ff.cell)?.start ?? posY;\n          pos = {\n            row,\n            cell: ff.cell,\n            posX: ff.cell,\n            posY,\n          };\n        }\n      }\n    }\n    return pos;\n  }\n\n  /**\n   * Moves the focus to the previous cell in the grid.\n   *\n   * @param {number} row - The row index.\n   * @param {number} cell - The column index.\n   * @param {number} posY - The current vertical position.\n   * @param {number} posX - The current horizontal position.\n   * @returns {CellPosition | null} The new cell position, or null if not found.\n   */\n  protected gotoPrev(row: number, cell: number, posY: number, posX: number) {\n    if (!Utils.isDefined(row) && !Utils.isDefined(cell)) {\n      row = posY = this.getDataLengthIncludingAddNew() - 1;\n      cell = posX = this.columns.length - 1;\n      if (this.canCellBeActive(row, cell)) {\n        return {\n          row,\n          cell,\n          posX: cell,\n          posY,\n        };\n      }\n    }\n\n    let pos = this.gotoLeft(row, cell, posY, posX);\n    if (!pos) {\n      let lf;\n      while (!pos && --posY >= 0) {\n        lf = this.findLastFocusableCell(posY);\n        if (lf.cell > -1) {\n          row = this.getParentRowSpanByCell(posY, lf.cell)?.start ?? posY;\n          pos = {\n            row,\n            cell: lf.cell,\n            posX: lf.cell,\n            posY,\n          };\n        }\n      }\n    }\n    return pos;\n  }\n\n  /**\n   * Moves the focus to the first focusable cell in a row.\n   *\n   * @param {number} row - The row index.\n   * @param {number} _cell - The column index (ignored).\n   * @param {number} _posY - The current vertical position (ignored).\n   * @param {number} _posX - The current horizontal position (ignored).\n   * @returns {CellPosition | null} The new cell position, or null if not found.\n   */\n  protected gotoRowStart(row: number, _cell: number, _posY: number, _posX: number) {\n    const ff = this.findFirstFocusableCell(row);\n    if (ff.cell === null) { return null; }\n\n    return {\n      row: ff.row,\n      cell: ff.cell,\n      posX: ff.cell,\n      posY: row,\n    };\n  }\n\n  /**\n   * Moves the focus to the last focusable cell in a row.\n   *\n   * @param {number} row - The row index.\n   * @param {number} _cell - The column index (ignored).\n   * @param {number} _posY - The current vertical position (ignored).\n   * @param {number} _posX - The current horizontal position (ignored).\n   * @returns {CellPosition | null} The new cell position, or null if not found.\n   */\n  protected gotoRowEnd(row: number, _cell: number, _posY: number, _posX: number) {\n    const lf = this.findLastFocusableCell(row);\n    if (lf.cell === -1) { return null; }\n\n    return {\n      row: lf.row,\n      cell: lf.cell,\n      posX: lf.cell,\n      posY: row\n    };\n  }\n\n  /** Switches the active cell one cell right skipping unselectable cells. Unline navigateNext, navigateRight stops at the last cell of the row. Returns a boolean saying whether it was able to complete or not. */\n  navigateRight() {\n    return this.navigate('right');\n  }\n\n  /** Switches the active cell one cell left skipping unselectable cells. Unline navigatePrev, navigateLeft stops at the first cell of the row. Returns a boolean saying whether it was able to complete or not. */\n  navigateLeft() {\n    return this.navigate('left');\n  }\n\n  /** Switches the active cell one row down skipping unselectable cells. Returns a boolean saying whether it was able to complete or not. */\n  navigateDown() {\n    return this.navigate('down');\n  }\n\n  /** Switches the active cell one row up skipping unselectable cells. Returns a boolean saying whether it was able to complete or not. */\n  navigateUp() {\n    return this.navigate('up');\n  }\n\n  /** Tabs over active cell to the next selectable cell. Returns a boolean saying whether it was able to complete or not. */\n  navigateNext() {\n    return this.navigate('next');\n  }\n\n  /** Tabs over active cell to the previous selectable cell. Returns a boolean saying whether it was able to complete or not. */\n  navigatePrev() {\n    return this.navigate('prev');\n  }\n\n  /** Navigate to the start row in the grid */\n  navigateRowStart() {\n    return this.navigate('home');\n  }\n\n  /** Navigate to the end row in the grid */\n  navigateRowEnd() {\n    return this.navigate('end');\n  }\n\n  /** Navigate to coordinate 0,0 (top left home) */\n  navigateTopStart(): boolean | undefined {\n    this.navigateToRow(0);\n    return this.navigate('home');\n  }\n\n  /** Navigate to bottom row end (bottom right end) */\n  navigateBottomEnd(): boolean | undefined {\n    this.navigateBottom();\n    return this.navigate('end');\n  }\n\n  /**\n   * @param {string} dir Navigation direction.\n   * @return {boolean} Whether navigation resulted in a change of active cell.\n   */\n  protected navigate(dir: 'up' | 'down' | 'left' | 'right' | 'prev' | 'next' | 'home' | 'end') {\n    if (!this._options.enableCellNavigation) {\n      return false;\n    }\n\n    if (!this.activeCellNode && dir !== 'prev' && dir !== 'next') {\n      return false;\n    }\n\n    if (!this.getEditorLock()?.commitCurrentEdit()) {\n      return true;\n    }\n    this.setFocus();\n    this.unsetActiveCell();\n\n    const tabbingDirections = {\n      'up': -1,\n      'down': 1,\n      'left': -1,\n      'right': 1,\n      'prev': -1,\n      'next': 1,\n      'home': -1,\n      'end': 1\n    };\n    this.tabbingDirection = tabbingDirections[dir];\n\n    const stepFunctions = {\n      'up': this.gotoUp,\n      'down': this.gotoDown,\n      'left': this.gotoLeft,\n      'right': this.gotoRight,\n      'prev': this.gotoPrev,\n      'next': this.gotoNext,\n      'home': this.gotoRowStart,\n      'end': this.gotoRowEnd\n    };\n    const stepFn = stepFunctions[dir];\n    const pos = stepFn.call(this, this.activeRow, this.activeCell, this.activePosY, this.activePosX);\n    return this.navigateToPos(pos);\n  }\n\n  /**\n   * Navigates to a specified cell position within the grid.\n   * Ensures the cell is visible, sets it as active, and updates position tracking.\n   *\n   * @param {CellPosition | null} pos - The target cell position.\n   * @returns {boolean} Whether navigation was successful.\n   */\n  protected navigateToPos(pos: CellPosition | null) {\n    if (pos) {\n      if (this.hasFrozenRows && this._options.frozenBottom && pos.row === this.getDataLength()) {\n        return;\n      }\n\n      const isAddNewRow = (pos.row === this.getDataLength());\n\n      if ((!this._options.frozenBottom && pos.row >= this.actualFrozenRow)\n        || (this._options.frozenBottom && pos.row < this.actualFrozenRow)\n      ) {\n        this.scrollCellIntoView(pos.row, pos.cell, !isAddNewRow && this._options.emulatePagingWhenScrolling);\n      }\n      this.setActiveCellInternal(this.getCellNode(pos.row, pos.cell));\n      this.activePosX = pos.posX;\n      this.activePosY = pos.posY;\n      return true;\n    } else {\n      this.setActiveCellInternal(this.getCellNode(this.activeRow, this.activeCell));\n      return false;\n    }\n  }\n\n  /**\n   * Returns a DOM element containing a cell at a given row and cell.\n   * @param row A row index.\n   * @param cell A column index.\n   * @returns {HTMLDivElement | null} The cell's DOM element, or null if not found.\n   */\n  getCellNode(row: number, cell: number): HTMLDivElement | null {\n    if (this.rowsCache[row]) {\n      this.ensureCellNodesInRowsCache(row);\n      try {\n        if (this.rowsCache[row].cellNodesByColumnIdx.length > cell) {\n          return this.rowsCache[row].cellNodesByColumnIdx[cell] as HTMLDivElement | null;\n        }\n        else {\n          return null;\n        }\n      } catch (e) {\n        return this.rowsCache[row].cellNodesByColumnIdx[cell] as HTMLDivElement | null;\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Sets an active cell.\n   * @param {number} row - A row index.\n   * @param {number} cell - A column index.\n   * @param {boolean} [optionEditMode] Option Edit Mode is Auto-Edit?\n   * @param {boolean} [preClickModeOn] Pre-Click Mode is Enabled?\n   * @param {boolean} [suppressActiveCellChangedEvent] Are we suppressing Active Cell Changed Event (defaults to false)\n   */\n  setActiveCell(row: number, cell: number, opt_editMode?: boolean, preClickModeOn?: boolean, suppressActiveCellChangedEvent?: boolean) {\n    if (!this.initialized) { return; }\n    if (row > this.getDataLength() || row < 0 || cell >= this.columns.length || cell < 0) {\n      return;\n    }\n\n    if (!this._options.enableCellNavigation) {\n      return;\n    }\n\n    this.scrollCellIntoView(row, cell, false);\n    this.setActiveCellInternal(this.getCellNode(row, cell), opt_editMode, preClickModeOn, suppressActiveCellChangedEvent);\n  }\n\n  /**\n   * Sets an active cell.\n   * @param {number} row - A row index.\n   * @param {number} cell - A column index.\n   * @param {boolean} [suppressScrollIntoView] - optionally suppress the ScrollIntoView that happens by default (defaults to false)\n   */\n  setActiveRow(row: number, cell?: number, suppressScrollIntoView?: boolean) {\n    if (!this.initialized) { return; }\n    if (row > this.getDataLength() || row < 0 || (cell ?? 0) >= this.columns.length || (cell ?? 0) < 0) {\n      return;\n    }\n\n    this.activeRow = row;\n    if (!suppressScrollIntoView) {\n      this.scrollCellIntoView(row, cell || 0, false);\n    }\n  }\n\n  /**\n   * Returns true if you can click on a given cell and make it the active focus.\n   * @param {number} row A row index.\n   * @param {number} col A column index.\n   */\n  canCellBeActive(row: number, cell: number) {\n    if (!this._options.enableCellNavigation || row >= this.getDataLengthIncludingAddNew() ||\n      row < 0 || cell >= this.columns.length || cell < 0) {\n      return false;\n    }\n\n    if (!this.columns[cell] || this.columns[cell].hidden) {\n      return false;\n    }\n\n    // cell not found in rows that are spanned (rowspan of 1 or more) are invalid\n    // i.e.: if the 5th cell has rowspan that reaches the end of the grid, then the last cell that can be active is 5 (anything above 5 on same column is invalid)\n    const spanRow = this.getParentRowSpanByCell(row, cell)?.start ?? row;\n    if (spanRow !== row) {\n      return false;\n    }\n\n    const rowMetadata = this.getItemMetadaWhenExists(row);\n    if (rowMetadata?.focusable !== undefined) {\n      return !!rowMetadata.focusable;\n    }\n\n    const columnMetadata = rowMetadata?.columns;\n    if (columnMetadata?.[this.columns[cell].id]?.focusable !== undefined) {\n      return !!columnMetadata[this.columns[cell].id].focusable;\n    }\n    if (columnMetadata?.[cell]?.focusable !== undefined) {\n      return !!columnMetadata[cell].focusable;\n    }\n\n    return !!(this.columns[cell].focusable);\n  }\n\n  /**\n   * Returns true if selecting the row causes this particular cell to have the selectedCellCssClass applied to it. A cell can be selected if it exists and if it isn't on an empty / \"Add New\" row and if it is not marked as \"unselectable\" in the column definition.\n   * @param {number} row A row index.\n   * @param {number} col A column index.\n   */\n  canCellBeSelected(row: number, cell: number) {\n    if (row >= this.getDataLength() || row < 0 || cell >= this.columns.length || cell < 0) {\n      return false;\n    }\n\n    if (!this.columns[cell] || this.columns[cell].hidden) {\n      return false;\n    }\n\n    const rowMetadata = this.getItemMetadaWhenExists(row);\n    if (rowMetadata?.selectable !== undefined) {\n      return !!rowMetadata.selectable;\n    }\n\n    const columnMetadata = rowMetadata?.columns && (rowMetadata.columns[this.columns[cell].id] || rowMetadata.columns[cell]);\n    if (columnMetadata?.selectable !== undefined) {\n      return !!columnMetadata.selectable;\n    }\n\n    return !!this.columns[cell].selectable;\n  }\n\n  /**\n   * Accepts a row integer and a cell integer, scrolling the view to the row where row is its row index, and cell is its cell index. Optionally accepts a forceEdit boolean which, if true, will attempt to initiate the edit dialogue for the field in the specified cell.\n   * Unlike setActiveCell, this scrolls the row into the viewport and sets the keyboard focus.\n   * @param {Number} row A row index.\n   * @param {Number} cell A column index.\n   * @param {Boolean} [forceEdit] If true, will attempt to initiate the edit dialogue for the field in the specified cell.\n   */\n  gotoCell(row: number, cell: number, forceEdit?: boolean, e?: Event | SlickEvent_) {\n    if (!this.initialized) { return; }\n    if (!this.canCellBeActive(row, cell)) {\n      return;\n    }\n\n    if (!this.getEditorLock()?.commitCurrentEdit()) {\n      return;\n    }\n\n    this.scrollCellIntoView(row, cell, false);\n\n    const newCell = this.getCellNode(row, cell);\n\n    // if selecting the 'add new' row, start editing right away\n    const column = this.columns[cell];\n    const suppressActiveCellChangedEvent = !!(this._options.editable && column?.editor && this._options.suppressActiveCellChangeOnEdit);\n    this.setActiveCellInternal(newCell, (forceEdit || (row === this.getDataLength()) || this._options.autoEdit), null, suppressActiveCellChangedEvent, e);\n\n    // if no editor was created, set the focus back on the grid\n    if (!this.currentEditor) {\n      this.setFocus();\n    }\n  }\n  /////////////////////////////////////////////////////////////////////////////////\n  // End Shared Utilities and Navigation Helpers\n  ///////////////////////////////////////////////////////////////////////////////\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  Utils.extend(Slick, {\n    Grid: SlickGrid,\n  });\n}\n", "import { SlickEvent as SlickEvent_} from './slick.core.js';\n\n/***\n * A sample AJAX data store implementation.\n * Right now, it's hooked up to load Hackernews stories, but can\n * easily be extended to support any JSONP-compatible backend that accepts paging parameters.\n */\n\nconst SlickEvent = IIFE_ONLY ? Slick.Event : SlickEvent_;\n\nexport class SlickRemoteModelYahoo {\n  // protected\n  protected PAGESIZE = 10;\n  protected data: any = { length: 0 };\n  protected h_request?: number;\n  protected req: any = null; // ajax request\n\n  // events\n  protected onDataLoading = new SlickEvent('onDataLoading');\n  protected onDataLoaded = new SlickEvent('onDataLoaded');\n\n  constructor() {\n    if (!(window.$ || window.jQuery) || !window.$.jsonp) {\n      throw new Error('SlickRemoteModel requires both jQuery and jQuery jsonp library to be loaded.');\n    }\n    this.init();\n  }\n\n  init() { }\n\n  isDataLoaded(from: number, to: number) {\n    for (let i = from; i <= to; i++) {\n      if (this.data[i] === undefined || this.data[i] === null) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  clear() {\n    for (const key in this.data) {\n      delete this.data[key];\n    }\n    this.data.length = 0;\n  }\n\n  ensureData(from: number, to: number) {\n    if (this.req) {\n      this.req.abort();\n      for (let i = this.req.fromPage; i <= this.req.toPage; i++) {\n        this.data[i * this.PAGESIZE] = undefined;\n      }\n    }\n\n    if (from < 0) {\n      from = 0;\n    }\n\n    if (this.data.length > 0) {\n      to = Math.min(to, this.data.length - 1);\n    }\n\n    let fromPage = Math.floor(from / this.PAGESIZE);\n    let toPage = Math.floor(to / this.PAGESIZE);\n\n    while (this.data[fromPage * this.PAGESIZE] !== undefined && fromPage < toPage) {\n      fromPage++;\n    }\n    while (this.data[toPage * this.PAGESIZE] !== undefined && fromPage < toPage) {\n      toPage--;\n    }\n    if (fromPage > toPage || ((fromPage === toPage) && this.data[fromPage * this.PAGESIZE] !== undefined)) {\n      // TODO:  look-ahead\n      this.onDataLoaded.notify({ from, to });\n      return;\n    }\n\n    const recStart = (fromPage * this.PAGESIZE);\n    const recCount = (((toPage - fromPage) * this.PAGESIZE) + this.PAGESIZE);\n\n    const url = 'https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20rss'\n      + '(' + recStart + '%2C' + recCount + ')'\n      + '%20where%20url%3D%22http%3A%2F%2Frss.news.yahoo.com%2Frss%2Ftopstories%22'\n      + '&format=json';\n\n    if (this.h_request) {\n      window.clearTimeout(this.h_request);\n    }\n\n    this.h_request = window.setTimeout(() => {\n      for (let i = fromPage; i <= toPage; i++) {\n        this.data[i * this.PAGESIZE] = null; // null indicates a 'requested but not available yet'\n      }\n      this.onDataLoading.notify({ from, to });\n\n      this.req = window.$.jsonp({\n        url,\n        callbackParameter: 'callback',\n        cache: true,\n        success: (json: any) => {\n          this.onSuccess(json, recStart);\n        },\n        error: () => {\n          this.onError(fromPage, toPage);\n        }\n      });\n\n      this.req.fromPage = fromPage;\n      this.req.toPage = toPage;\n    }, 50);\n  }\n\n\n  onError(fromPage: number, toPage: number) {\n    alert('error loading pages ' + fromPage + ' to ' + toPage);\n  }\n\n  // SAMPLE DATA\n  //    {\n  //      \"query\": {\n  //        \"count\": 40,\n  //        \"created\": \"2015-03-03T00:34:00Z\",\n  //        \"lang\": \"en-US\",\n  //        \"results\": {\n  //          \"item\": [\n  //            {\n  //              \"title\": \"Netanyahu assails Iran deal, touts US-Israel ties\",\n  //              \"description\": \"<p><a href=\\\"http://news.yahoo.com/netanyahu-us-officials-face-off-iran-133539021--politics.html\\\"><img src=\\\"http://l2.yimg.com/bt/api/res/1.2/4eoBxbJStrbGAKbmBYOJfg--/YXBwaWQ9eW5ld3M7Zmk9ZmlsbDtoPTg2O3E9NzU7dz0xMzA-/http://media.zenfs.com/en_us/News/ap_webfeeds/2f3a20c2d46d9f096f0f6a706700d430.jpg\\\" width=\\\"130\\\" height=\\\"86\\\" alt=\\\"Israeli Prime Minister Benjamin Netanyahu addresses the 2015 American Israel Public Affairs Committee (AIPAC) Policy Conference in Washington, Monday, March 2, 2015. (AP Photo/Cliff Owen)\\\" align=\\\"left\\\" title=\\\"Israeli Prime Minister Benjamin Netanyahu addresses the 2015 American Israel Public Affairs Committee (AIPAC) Policy Conference in Washington, Monday, March 2, 2015. (AP Photo/Cliff Owen)\\\" border=\\\"0\\\" /></a>WASHINGTON (AP) \u2014 Seeking to lower tensions, Benjamin Netanyahu and U.S. officials cast their dispute over Iran as a family squabble on Monday, even as the Israeli leader claimed President Barack Obama did not \u2014 and could not \u2014 fully understand his nation&#039;s vital security concerns.</p><br clear=\\\"all\\\"/>\",\n  //              \"link\": \"http://news.yahoo.com/netanyahu-us-officials-face-off-iran-133539021--politics.html\",\n  //              \"pubDate\": \"Mon, 02 Mar 2015 19:17:36 -0500\",\n  //              \"source\": {\n  //                \"url\": \"http://www.ap.org/\",\n  //                \"content\": \"Associated Press\"\n  //              },\n  //              \"guid\": {\n  //                \"isPermaLink\": \"false\",\n  //                \"content\": \"netanyahu-us-officials-face-off-iran-133539021--politics\"\n  //              },\n  //              \"content\": {\n  //                \"height\": \"86\",\n  //                \"type\": \"image/jpeg\",\n  //                \"url\": \"http://l2.yimg.com/bt/api/res/1.2/4eoBxbJStrbGAKbmBYOJfg--/YXBwaWQ9eW5ld3M7Zmk9ZmlsbDtoPTg2O3E9NzU7dz0xMzA-/http://media.zenfs.com/en_us/News/ap_webfeeds/2f3a20c2d46d9f096f0f6a706700d430.jpg\",\n  //                \"width\": \"130\"\n  //              },\n  //              \"text\": {\n  //                \"type\": \"html\",\n  //                \"content\": \"<p><a href=\\\"http://news.yahoo.com/netanyahu-us-officials-face-off-iran-133539021--politics.html\\\"><img src=\\\"http://l2.yimg.com/bt/api/res/1.2/4eoBxbJStrbGAKbmBYOJfg--/YXBwaWQ9eW5ld3M7Zmk9ZmlsbDtoPTg2O3E9NzU7dz0xMzA-/http://media.zenfs.com/en_us/News/ap_webfeeds/2f3a20c2d46d9f096f0f6a706700d430.jpg\\\" width=\\\"130\\\" height=\\\"86\\\" alt=\\\"Israeli Prime Minister Benjamin Netanyahu addresses the 2015 American Israel Public Affairs Committee (AIPAC) Policy Conference in Washington, Monday, March 2, 2015. (AP Photo/Cliff Owen)\\\" align=\\\"left\\\" title=\\\"Israeli Prime Minister Benjamin Netanyahu addresses the 2015 American Israel Public Affairs Committee (AIPAC) Policy Conference in Washington, Monday, March 2, 2015. (AP Photo/Cliff Owen)\\\" border=\\\"0\\\" /></a>WASHINGTON (AP) \u2014 Seeking to lower tensions, Benjamin Netanyahu and U.S. officials cast their dispute over Iran as a family squabble on Monday, even as the Israeli leader claimed President Barack Obama did not \u2014 and could not \u2014 fully understand his nation&#039;s vital security concerns.</p><br clear=\\\"all\\\"/>\"\n  //              },\n  //              \"credit\": {\n  //                \"role\": \"publishing company\"\n  //              }\n  //            },\n  //            {... },\n  //            {... },\n  //          ]\n  //        }\n  //      }\n  //    }\n\n  onSuccess(json: any, recStart: number) {\n    let recEnd = recStart;\n    if (json.query.count > 0) {\n      const results = json.query.results.item;\n      recEnd = recStart + results.length;\n      this.data.length = 100;// Math.min(parseInt(results.length),1000); // limitation of the API\n\n      for (let i = 0; i < results.length; i++) {\n        const item = results[i];\n\n        item.pubDate = new Date(item.pubDate);\n\n        this.data[recStart + i] = { index: recStart + i };\n        this.data[recStart + i].pubDate = item.pubDate;\n        this.data[recStart + i].title = item.title;\n        this.data[recStart + i].url = item.link;\n        this.data[recStart + i].text = item.description;\n      }\n    }\n    this.req = null;\n\n    this.onDataLoaded.notify({ from: recStart, to: recEnd });\n  }\n\n\n  reloadData(from: number, to: number) {\n    for (let i = from; i <= to; i++) {\n      delete this.data[i];\n    }\n    this.ensureData(from, to);\n  }\n\n\n  // return {\n  //   // properties\n  //   \"data\": data,\n\n  //   // methods\n  //   \"clear\": clear,\n  //   \"isDataLoaded\": isDataLoaded,\n  //   \"ensureData\": ensureData,\n  //   \"reloadData\": reloadData,\n\n  //   // events\n  //   \"onDataLoading\": onDataLoading,\n  //   \"onDataLoaded\": onDataLoaded\n  // };\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  window.Slick.Data = window.Slick.Data || {};\n  window.Slick.Data.RemoteModelYahoo = SlickRemoteModelYahoo;\n}", "import type { ColumnSort } from './models/index.js';\nimport { SlickEvent as SlickEvent_} from './slick.core.js';\n\n/***\n * A sample AJAX data store implementation.\n * Right now, it's hooked up to load search results from Octopart, but can\n * easily be extended to support any JSONP-compatible backend that accepts paging parameters.\n */\n\nconst SlickEvent = IIFE_ONLY ? Slick.Event : SlickEvent_;\n\nexport class SlickRemoteModel {\n  // private\n  protected PAGESIZE = 50;\n  protected data: any = { length: 0 };\n  protected searchstr = '';\n  protected sortcol: ColumnSort | null = null;\n  protected sortdir = 1;\n  protected h_request?: number;\n  protected req: any = null; // ajax request\n\n  // events\n  onDataLoading = new SlickEvent('onDataLoading');\n  onDataLoaded = new SlickEvent('onDataLoaded');\n\n  constructor() {\n    if (!(window.$ || window.jQuery) || !window.$.jsonp) {\n      throw new Error('SlickRemoteModel requires both jQuery and jQuery jsonp library to be loaded.');\n    }\n    this.init();\n  }\n\n  init() { }\n\n  isDataLoaded(from: number, to: number) {\n    for (let i = from; i <= to; i++) {\n      if (this.data[i] === undefined || this.data[i] === null) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  clear() {\n    for (const key in this.data) {\n      delete this.data[key];\n    }\n    this.data.length = 0;\n  }\n\n  ensureData(from: number, to: number) {\n    if (this.req) {\n      this.req.abort();\n      for (let i = this.req.fromPage; i <= this.req.toPage; i++) {\n        this.data[i * this.PAGESIZE] = undefined;\n      }\n    }\n\n    if (from < 0) {\n      from = 0;\n    }\n\n    if (this.data.length > 0) {\n      to = Math.min(to, this.data.length - 1);\n    }\n\n    let fromPage = Math.floor(from / this.PAGESIZE);\n    let toPage = Math.floor(to / this.PAGESIZE);\n\n    while (this.data[fromPage * this.PAGESIZE] !== undefined && fromPage < toPage) {\n      fromPage++;\n    }\n\n    while (this.data[toPage * this.PAGESIZE] !== undefined && fromPage < toPage) {\n      toPage--;\n    }\n\n    if (fromPage > toPage || ((fromPage === toPage) && this.data[fromPage * this.PAGESIZE] !== undefined)) {\n      // TODO:  look-ahead\n      this.onDataLoaded.notify({ from, to });\n      return;\n    }\n\n    let url = 'http://octopart.com/api/v3/parts/search?apikey=[MY_API_KEY]&include[]=short_description&show[]=uid&show[]=manufacturer&show[]=mpn&show[]=brand&show[]=octopart_url&show[]=short_description&q=' + this.searchstr + '&start=' + (fromPage * this.PAGESIZE) + '&limit=' + (((toPage - fromPage) * this.PAGESIZE) + this.PAGESIZE);\n\n    if (this.sortcol !== null) {\n      url += ('&sortby=' + this.sortcol + ((this.sortdir > 0) ? '+asc' : '+desc'));\n    }\n\n    if (this.h_request) {\n      window.clearTimeout(this.h_request);\n    }\n\n    this.h_request = window.setTimeout(() => {\n      for (let i = fromPage; i <= toPage; i++) {\n        this.data[i * this.PAGESIZE] = null; // null indicates a 'requested but not available yet'\n      }\n      this.onDataLoading.notify({ from, to });\n\n      this.req = window.$.jsonp({\n        url,\n        callbackParameter: 'callback',\n        cache: true,\n        success: this.onSuccess,\n        error: () => this.onError(fromPage, toPage)\n      });\n      this.req.fromPage = fromPage;\n      this.req.toPage = toPage;\n    }, 50);\n  }\n\n  protected onError(fromPage: number | string, toPage: number | string) {\n    alert('error loading pages ' + fromPage + ' to ' + toPage);\n  }\n\n  protected onSuccess(resp: any) {\n    const from = resp.request.start, to = from + resp.results.length;\n    this.data.length = Math.min(parseInt(resp.hits), 1000); // limitation of the API\n\n    for (let i = 0; i < resp.results.length; i++) {\n      const item = resp.results[i].item;\n      this.data[from + i] = item;\n      this.data[from + i].index = from + i;\n    }\n\n    this.req = null;\n    this.onDataLoaded.notify({ from, to });\n  }\n\n  reloadData(from: number, to: number) {\n    for (let i = from; i <= to; i++) {\n      delete this.data[i];\n    }\n    this.ensureData(from, to);\n  }\n\n\n  setSort(column: ColumnSort, dir: number) {\n    this.sortcol = column;\n    this.sortdir = dir;\n    this.clear();\n  }\n\n  setSearch(str: string) {\n    this.searchstr = str;\n    this.clear();\n  }\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n  window.Slick.Data = window.Slick.Data || {};\n  window.Slick.Data.RemoteModel = SlickRemoteModel;\n}\n"],
  "mappings": "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",
  "names": ["event", "BindingEventService", "SlickEvent", "Utils", "event", "BindingEventService", "SlickEvent", "Utils", "event", "BindingEventService", "SlickEvent", "Utils", "BindingEventService", "SlickGlobalEditorLock", "Utils", "SortDirectionNumber", "Utils", "event", "keyCode", "SlickEvent", "Utils", "SlickEvent", "SlickRange", "Utils", "event", "BindingEventService", "SlickEvent", "SlickEventData", "EventHandler", "Utils", "Utils", "Utils", "event", "SlickEvent", "SlickEventHandler", "SlickRange", "Draggable", "SlickCellRangeDecorator", "Utils", "SelectionUtils", "CellSelectionMode", "SlickEvent", "SlickEventData", "SlickRange", "SlickCellRangeSelector", "Utils", "BindingEventService", "SlickEventHandler", "Utils", "BindingEventService", "SlickEvent", "SlickEventData", "EventHandler", "Utils", "SlickEvent", "SlickEventHandler", "Utils", "SlickEventHandler", "Utils", "BindingEventService", "SlickEvent", "SlickEventHandler", "Utils", "event", "BindingEventService", "SlickEvent", "EventHandler", "Utils", "BindingEventService", "SlickEvent", "SlickEventHandler", "Utils", "event", "item", "Draggable", "keyCode", "SlickEvent", "SlickEventData", "SlickEventHandler", "SlickRange", "SlickCellRangeDecorator", "SlickCellRangeSelector", "Utils", "BindingEventService", "SlickEvent", "Utils", "event", "SlickEvent", "SlickEventHandler", "Utils", "SlickEvent", "SlickEventHandler", "Utils", "Draggable", "keyCode", "SlickCellRangeDecorator", "SlickCellRangeSelector", "SlickEvent", "SlickEventData", "SlickEventHandler", "SlickRange", "Utils", "SlickEvent", "Utils", "Utils", "keyCode", "SlickGroup", "Utils", "SlickEvent", "SlickEventData", "SlickGroup", "SlickGroupTotals", "Utils", "SlickGroupItemMetadataProvider", "keyCode", "Utils", "Utils", "BindingEventService", "ColAutosizeMode", "SlickEvent", "SlickEventData", "GlobalEditorLock", "GridAutosizeColsMode", "keyCode", "preClickClassName", "SlickRange", "RowSelectionMode", "CellSelectionMode", "ValueFilterMode", "Utils", "SelectionUtils", "WidthEvalMode", "Draggable", "MouseWheel", "Resizable", "DragExtendHandle", "event", "row", "topHeightOffset", "SlickEvent", "SlickEvent"]
}
