@alaarab/ogrid-angular 2.0.4 → 2.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,7 +4,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { Component, input, output, effect, viewChild, DestroyRef, inject } from '@angular/core';
7
+ import { Component, input, output, viewChild, DestroyRef, inject } from '@angular/core';
8
8
  import { CommonModule } from '@angular/common';
9
9
  import { GRID_CONTEXT_MENU_ITEMS, formatShortcut } from '@alaarab/ogrid-core';
10
10
  let GridContextMenuComponent = class GridContextMenuComponent {
@@ -35,11 +35,9 @@ let GridContextMenuComponent = class GridContextMenuComponent {
35
35
  if (e.key === 'Escape')
36
36
  this.close.emit();
37
37
  };
38
- effect(() => {
39
- // Re-register listeners when component renders
40
- document.addEventListener('mousedown', this.clickOutsideHandler, true);
41
- document.addEventListener('keydown', this.keyDownHandler, true);
42
- });
38
+ // Register listeners once on init (no signal dependencies needed)
39
+ document.addEventListener('mousedown', this.clickOutsideHandler, true);
40
+ document.addEventListener('keydown', this.keyDownHandler, true);
43
41
  this.destroyRef.onDestroy(() => {
44
42
  document.removeEventListener('mousedown', this.clickOutsideHandler, true);
45
43
  document.removeEventListener('keydown', this.keyDownHandler, true);
@@ -108,9 +108,14 @@ let DataGridStateService = class DataGridStateService {
108
108
  const order = p.columnOrder;
109
109
  if (!order?.length)
110
110
  return filtered;
111
+ // Build index map for O(1) lookup instead of repeated O(n) indexOf
112
+ const orderMap = new Map();
113
+ for (let i = 0; i < order.length; i++) {
114
+ orderMap.set(order[i], i);
115
+ }
111
116
  return [...filtered].sort((a, b) => {
112
- const ia = order.indexOf(a.columnId);
113
- const ib = order.indexOf(b.columnId);
117
+ const ia = orderMap.get(a.columnId) ?? -1;
118
+ const ib = orderMap.get(b.columnId) ?? -1;
114
119
  if (ia === -1 && ib === -1)
115
120
  return 0;
116
121
  if (ia === -1)
@@ -241,14 +246,20 @@ let DataGridStateService = class DataGridStateService {
241
246
  this.resizeObserver.observe(el);
242
247
  measure();
243
248
  });
244
- // Cleanup on destroy
249
+ // Cleanup on destroy — null out refs to prevent accidental reuse after teardown
245
250
  this.destroyRef.onDestroy(() => {
246
- if (this.rafId)
251
+ if (this.rafId) {
247
252
  cancelAnimationFrame(this.rafId);
248
- if (this.autoScrollInterval)
253
+ this.rafId = 0;
254
+ }
255
+ if (this.autoScrollInterval) {
249
256
  clearInterval(this.autoScrollInterval);
250
- if (this.resizeObserver)
257
+ this.autoScrollInterval = null;
258
+ }
259
+ if (this.resizeObserver) {
251
260
  this.resizeObserver.disconnect();
261
+ this.resizeObserver = null;
262
+ }
252
263
  });
253
264
  // Clean up column sizing overrides for removed columns
254
265
  effect(() => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alaarab/ogrid-angular",
3
- "version": "2.0.4",
3
+ "version": "2.0.5",
4
4
  "description": "OGrid Angular – Angular services, signals, and headless components for OGrid data grids.",
5
5
  "main": "dist/esm/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -22,7 +22,7 @@
22
22
  "files": ["dist", "README.md", "LICENSE"],
23
23
  "engines": { "node": ">=18" },
24
24
  "dependencies": {
25
- "@alaarab/ogrid-core": "2.0.4"
25
+ "@alaarab/ogrid-core": "2.0.5"
26
26
  },
27
27
  "peerDependencies": {
28
28
  "@angular/core": "^21.0.0",