@ornery/ui-grid-vanilla 1.0.1 → 1.0.3

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.
package/dist/index.js CHANGED
@@ -667,7 +667,7 @@ function renderHeaderCell(el, column, sortEnabled, groupingEnabled, pinningEnabl
667
667
  isDragTarget,
668
668
  isDragging
669
669
  );
670
- return `<ui-grid-header-cell class="${className}"${isDraggable ? ' draggable="true"' : ""}${stickyStyle ? ` style="${escapeHtml(stickyStyle)}"` : ""} data-column="${escapeHtml(column.name)}" data-sort-active="${sortDirection !== import_ui_grid_core2.SORT_DIRECTIONS.none}" data-pinned="${isPinned}" data-pinned-left-last="${isPinnedLeftLast}" data-pinned-right-first="${isPinnedRightFirst}" data-pin-menu-open="${isPinMenuOpen}" data-drag-target="${isDragTarget}" data-dragging="${isDragging}" data-draggable="${isDraggable}" data-sticky-style="${escapeHtml(stickyStyle)}"><span class="header-label">${headerValue}</span><span class="header-actions">${sortEnabled ? `<button type="button" class="header-action" data-action="sort" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(sortLabel)}" ${canSort ? "" : "disabled"}>${el.icons.renderControlIcon(sortIconKey)}<span class="sr-only">${escapeHtml(sortLabel)}</span></button>` : ""}${groupingEnabled ? `<button type="button" class="chip-action${controller.isColumnGrouped(column) ? " chip-action-active" : ""}" data-action="group" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(groupingLabel)}" ${canGroup ? "" : "disabled"}>${el.icons.renderControlIcon("group")}<span class="sr-only">${escapeHtml(groupingLabel)}</span></button>` : ""}${canPin ? `<div class="pin-control${isPinMenuOpen ? " pin-control-open" : ""}"><button type="button" class="chip-action pin-trigger${isPinned ? " chip-action-active" : ""}" data-action="pin-trigger" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(pinLabel)}">${el.icons.renderControlIcon("pin")}<span class="sr-only">${escapeHtml(pinLabel)}</span></button><div class="pin-menu" role="menu" aria-label="${escapeHtml(pinLabel)}"><button type="button" class="pin-menu-action" data-action="pin-left" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(el.snapshot?.labels.pinLeft ?? "Pin left")}">${el.icons.renderIconWithClass("control-icon", "pinLeft")}<span class="sr-only">${escapeHtml(el.snapshot?.labels.pinLeft ?? "Pin left")}</span></button><button type="button" class="pin-menu-action" data-action="pin-right" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(el.snapshot?.labels.pinRight ?? "Pin right")}">${el.icons.renderIconWithClass("control-icon", "pinRight")}<span class="sr-only">${escapeHtml(el.snapshot?.labels.pinRight ?? "Pin right")}</span></button></div></div>` : ""}</span>${resizerHtml}</ui-grid-header-cell>`;
670
+ return `<ui-grid-header-cell class="${className}"${isDraggable ? ' draggable="true"' : ""}${stickyStyle ? ` style="${escapeHtml(stickyStyle)}"` : ""} data-column="${escapeHtml(column.name)}" data-sort-active="${sortDirection !== import_ui_grid_core2.SORT_DIRECTIONS.none}" data-pinned="${isPinned}" data-pinned-left-last="${isPinnedLeftLast}" data-pinned-right-first="${isPinnedRightFirst}" data-pin-menu-open="${isPinMenuOpen}" data-drag-target="${isDragTarget}" data-dragging="${isDragging}" data-draggable="${isDraggable}" data-sticky-style="${escapeHtml(stickyStyle)}"><span class="header-label">${headerValue}</span><span class="header-actions">${canSort ? `<button type="button" class="header-action" data-action="sort" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(sortLabel)}">${el.icons.renderControlIcon(sortIconKey)}<span class="sr-only">${escapeHtml(sortLabel)}</span></button>` : ""}${canGroup ? `<button type="button" class="chip-action${controller.isColumnGrouped(column) ? " chip-action-active" : ""}" data-action="group" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(groupingLabel)}">${el.icons.renderControlIcon("group")}<span class="sr-only">${escapeHtml(groupingLabel)}</span></button>` : ""}${canPin ? `<div class="pin-control${isPinMenuOpen ? " pin-control-open" : ""}"><button type="button" class="chip-action pin-trigger${isPinned ? " chip-action-active" : ""}" data-action="pin-trigger" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(pinLabel)}">${el.icons.renderControlIcon("pin")}<span class="sr-only">${escapeHtml(pinLabel)}</span></button><div class="pin-menu" role="menu" aria-label="${escapeHtml(pinLabel)}"><button type="button" class="pin-menu-action" data-action="pin-left" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(el.snapshot?.labels.pinLeft ?? "Pin left")}">${el.icons.renderIconWithClass("control-icon", "pinLeft")}<span class="sr-only">${escapeHtml(el.snapshot?.labels.pinLeft ?? "Pin left")}</span></button><button type="button" class="pin-menu-action" data-action="pin-right" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(el.snapshot?.labels.pinRight ?? "Pin right")}">${el.icons.renderIconWithClass("control-icon", "pinRight")}<span class="sr-only">${escapeHtml(el.snapshot?.labels.pinRight ?? "Pin right")}</span></button></div></div>` : ""}</span>${resizerHtml}</ui-grid-header-cell>`;
671
671
  }
672
672
  function renderFilterCell(el, column) {
673
673
  if (column.name === "selectionRowHeaderCol") {
@@ -2803,6 +2803,9 @@ var VanillaGridController = class {
2803
2803
  if (!gridRow || !column) {
2804
2804
  return;
2805
2805
  }
2806
+ if (!this.isCellEditable(gridRow, column)) {
2807
+ return;
2808
+ }
2806
2809
  (0, import_ui_grid_core5.beginGridCellEditCommand)(
2807
2810
  this.gridApi,
2808
2811
  {
package/dist/index.mjs CHANGED
@@ -648,7 +648,7 @@ function renderHeaderCell(el, column, sortEnabled, groupingEnabled, pinningEnabl
648
648
  isDragTarget,
649
649
  isDragging
650
650
  );
651
- return `<ui-grid-header-cell class="${className}"${isDraggable ? ' draggable="true"' : ""}${stickyStyle ? ` style="${escapeHtml(stickyStyle)}"` : ""} data-column="${escapeHtml(column.name)}" data-sort-active="${sortDirection !== SORT_DIRECTIONS.none}" data-pinned="${isPinned}" data-pinned-left-last="${isPinnedLeftLast}" data-pinned-right-first="${isPinnedRightFirst}" data-pin-menu-open="${isPinMenuOpen}" data-drag-target="${isDragTarget}" data-dragging="${isDragging}" data-draggable="${isDraggable}" data-sticky-style="${escapeHtml(stickyStyle)}"><span class="header-label">${headerValue}</span><span class="header-actions">${sortEnabled ? `<button type="button" class="header-action" data-action="sort" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(sortLabel)}" ${canSort ? "" : "disabled"}>${el.icons.renderControlIcon(sortIconKey)}<span class="sr-only">${escapeHtml(sortLabel)}</span></button>` : ""}${groupingEnabled ? `<button type="button" class="chip-action${controller.isColumnGrouped(column) ? " chip-action-active" : ""}" data-action="group" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(groupingLabel)}" ${canGroup ? "" : "disabled"}>${el.icons.renderControlIcon("group")}<span class="sr-only">${escapeHtml(groupingLabel)}</span></button>` : ""}${canPin ? `<div class="pin-control${isPinMenuOpen ? " pin-control-open" : ""}"><button type="button" class="chip-action pin-trigger${isPinned ? " chip-action-active" : ""}" data-action="pin-trigger" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(pinLabel)}">${el.icons.renderControlIcon("pin")}<span class="sr-only">${escapeHtml(pinLabel)}</span></button><div class="pin-menu" role="menu" aria-label="${escapeHtml(pinLabel)}"><button type="button" class="pin-menu-action" data-action="pin-left" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(el.snapshot?.labels.pinLeft ?? "Pin left")}">${el.icons.renderIconWithClass("control-icon", "pinLeft")}<span class="sr-only">${escapeHtml(el.snapshot?.labels.pinLeft ?? "Pin left")}</span></button><button type="button" class="pin-menu-action" data-action="pin-right" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(el.snapshot?.labels.pinRight ?? "Pin right")}">${el.icons.renderIconWithClass("control-icon", "pinRight")}<span class="sr-only">${escapeHtml(el.snapshot?.labels.pinRight ?? "Pin right")}</span></button></div></div>` : ""}</span>${resizerHtml}</ui-grid-header-cell>`;
651
+ return `<ui-grid-header-cell class="${className}"${isDraggable ? ' draggable="true"' : ""}${stickyStyle ? ` style="${escapeHtml(stickyStyle)}"` : ""} data-column="${escapeHtml(column.name)}" data-sort-active="${sortDirection !== SORT_DIRECTIONS.none}" data-pinned="${isPinned}" data-pinned-left-last="${isPinnedLeftLast}" data-pinned-right-first="${isPinnedRightFirst}" data-pin-menu-open="${isPinMenuOpen}" data-drag-target="${isDragTarget}" data-dragging="${isDragging}" data-draggable="${isDraggable}" data-sticky-style="${escapeHtml(stickyStyle)}"><span class="header-label">${headerValue}</span><span class="header-actions">${canSort ? `<button type="button" class="header-action" data-action="sort" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(sortLabel)}">${el.icons.renderControlIcon(sortIconKey)}<span class="sr-only">${escapeHtml(sortLabel)}</span></button>` : ""}${canGroup ? `<button type="button" class="chip-action${controller.isColumnGrouped(column) ? " chip-action-active" : ""}" data-action="group" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(groupingLabel)}">${el.icons.renderControlIcon("group")}<span class="sr-only">${escapeHtml(groupingLabel)}</span></button>` : ""}${canPin ? `<div class="pin-control${isPinMenuOpen ? " pin-control-open" : ""}"><button type="button" class="chip-action pin-trigger${isPinned ? " chip-action-active" : ""}" data-action="pin-trigger" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(pinLabel)}">${el.icons.renderControlIcon("pin")}<span class="sr-only">${escapeHtml(pinLabel)}</span></button><div class="pin-menu" role="menu" aria-label="${escapeHtml(pinLabel)}"><button type="button" class="pin-menu-action" data-action="pin-left" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(el.snapshot?.labels.pinLeft ?? "Pin left")}">${el.icons.renderIconWithClass("control-icon", "pinLeft")}<span class="sr-only">${escapeHtml(el.snapshot?.labels.pinLeft ?? "Pin left")}</span></button><button type="button" class="pin-menu-action" data-action="pin-right" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(el.snapshot?.labels.pinRight ?? "Pin right")}">${el.icons.renderIconWithClass("control-icon", "pinRight")}<span class="sr-only">${escapeHtml(el.snapshot?.labels.pinRight ?? "Pin right")}</span></button></div></div>` : ""}</span>${resizerHtml}</ui-grid-header-cell>`;
652
652
  }
653
653
  function renderFilterCell(el, column) {
654
654
  if (column.name === "selectionRowHeaderCol") {
@@ -2892,6 +2892,9 @@ var VanillaGridController = class {
2892
2892
  if (!gridRow || !column) {
2893
2893
  return;
2894
2894
  }
2895
+ if (!this.isCellEditable(gridRow, column)) {
2896
+ return;
2897
+ }
2895
2898
  beginGridCellEditCommand(
2896
2899
  this.gridApi,
2897
2900
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ornery/ui-grid-vanilla",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "Vanilla DOM wrapper for the Rust/WASM-backed @ornery/ui-grid-core custom element",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -16,7 +16,7 @@
16
16
  }
17
17
  },
18
18
  "dependencies": {
19
- "@ornery/ui-grid-core": "1.0.0"
19
+ "@ornery/ui-grid-core": "1.0.2"
20
20
  },
21
21
  "devDependencies": {
22
22
  "happy-dom": "^20.9.0",
@@ -951,6 +951,9 @@ export class VanillaGridController {
951
951
  if (!gridRow || !column) {
952
952
  return;
953
953
  }
954
+ if (!this.isCellEditable(gridRow, column)) {
955
+ return;
956
+ }
954
957
 
955
958
  beginGridCellEditCommand(
956
959
  this.gridApi,
@@ -37,6 +37,7 @@ function sampleOptions(): GridOptions {
37
37
  // Selection defaults to on in the old grid; nav tests assert against
38
38
  // the two declared columns, so we explicitly opt out here.
39
39
  enableRowSelection: false,
40
+ enableCellEdit: true,
40
41
  data: [
41
42
  { id: 'r1', name: 'Alpha', status: 'Active' },
42
43
  { id: 'r2', name: 'Beta', status: 'Pilot' },
@@ -428,12 +429,14 @@ describe('vanilla grid keyboard navigation', () => {
428
429
  editorInput.value = 'Alpha Prime';
429
430
  editorInput.dispatchEvent(new Event('input', { bubbles: true, composed: true }));
430
431
  pressKey(editorInput, 'Enter');
431
- await waitFor(() =>
432
- shadow.querySelector(
433
- '.body-cell[data-row="r2"][data-column="name"]',
432
+ // resumeEdit re-opens the editor on the next editable cell — focus
433
+ // lands on the editor input, not the cell shell.
434
+ const nextEditor = await waitFor(() =>
435
+ shadow.querySelector<HTMLInputElement>(
436
+ 'ui-grid-cell-editor[data-row="r2"][data-column="name"] input',
434
437
  ),
435
438
  );
436
- expect(shadow.activeElement).toBe(cellIn(shadow, 'r2', 'name'));
439
+ expect(shadow.activeElement).toBe(nextEditor);
437
440
  expect(cellIn(shadow, 'r1', 'name').textContent).toContain('Alpha Prime');
438
441
  });
439
442
 
@@ -458,7 +461,9 @@ describe('vanilla grid keyboard navigation', () => {
458
461
  // Pressing Tab dispatches keydown; the commit path removes the editor,
459
462
  // which fires blur synchronously. Both handlers call commitCellEdit.
460
463
  expect(() => pressKey(editorInput, 'Tab')).not.toThrow();
461
- await waitFor(() => (shadow.activeElement === cellIn(shadow, 'r1', 'status') ? {} : null));
464
+ await waitFor(() =>
465
+ shadow.querySelector('ui-grid-cell-editor[data-row="r1"][data-column="status"] input'),
466
+ );
462
467
  expect(cellIn(shadow, 'r1', 'name').textContent).toContain('edited');
463
468
  });
464
469
 
@@ -476,8 +481,13 @@ describe('vanilla grid keyboard navigation', () => {
476
481
  editorInput.value = 'Alpha2';
477
482
  editorInput.dispatchEvent(new Event('input', { bubbles: true, composed: true }));
478
483
  pressKey(editorInput, 'Tab');
479
- await waitFor(() => shadow.activeElement === cellIn(shadow, 'r1', 'status') ? {} : null);
480
- expect(shadow.activeElement).toBe(cellIn(shadow, 'r1', 'status'));
484
+ // resumeEdit lands on the next editable cell's editor input.
485
+ const nextEditor = await waitFor(() =>
486
+ shadow.querySelector<HTMLInputElement>(
487
+ 'ui-grid-cell-editor[data-row="r1"][data-column="status"] input',
488
+ ),
489
+ );
490
+ expect(shadow.activeElement).toBe(nextEditor);
481
491
  expect(cellIn(shadow, 'r1', 'name').textContent).toContain('Alpha2');
482
492
  });
483
493
 
package/src/render.ts CHANGED
@@ -128,7 +128,7 @@ export function renderHeaderCell(
128
128
  );
129
129
  // className/style/draggable are pre-computed here so the <ui-grid-header-cell>
130
130
  // upgrade is a no-op at parse time. `data-*` stay for event delegation.
131
- return `<ui-grid-header-cell class="${className}"${isDraggable ? ' draggable="true"' : ''}${stickyStyle ? ` style="${escapeHtml(stickyStyle)}"` : ''} data-column="${escapeHtml(column.name)}" data-sort-active="${sortDirection !== SORT_DIRECTIONS.none}" data-pinned="${isPinned}" data-pinned-left-last="${isPinnedLeftLast}" data-pinned-right-first="${isPinnedRightFirst}" data-pin-menu-open="${isPinMenuOpen}" data-drag-target="${isDragTarget}" data-dragging="${isDragging}" data-draggable="${isDraggable}" data-sticky-style="${escapeHtml(stickyStyle)}"><span class="header-label">${headerValue}</span><span class="header-actions">${sortEnabled ? `<button type="button" class="header-action" data-action="sort" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(sortLabel)}" ${canSort ? '' : 'disabled'}>${el.icons.renderControlIcon(sortIconKey)}<span class="sr-only">${escapeHtml(sortLabel)}</span></button>` : ''}${groupingEnabled ? `<button type="button" class="chip-action${controller.isColumnGrouped(column) ? ' chip-action-active' : ''}" data-action="group" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(groupingLabel)}" ${canGroup ? '' : 'disabled'}>${el.icons.renderControlIcon('group')}<span class="sr-only">${escapeHtml(groupingLabel)}</span></button>` : ''}${canPin ? `<div class="pin-control${isPinMenuOpen ? ' pin-control-open' : ''}"><button type="button" class="chip-action pin-trigger${isPinned ? ' chip-action-active' : ''}" data-action="pin-trigger" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(pinLabel)}">${el.icons.renderControlIcon('pin')}<span class="sr-only">${escapeHtml(pinLabel)}</span></button><div class="pin-menu" role="menu" aria-label="${escapeHtml(pinLabel)}"><button type="button" class="pin-menu-action" data-action="pin-left" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(el.snapshot?.labels.pinLeft ?? 'Pin left')}">${el.icons.renderIconWithClass('control-icon', 'pinLeft')}<span class="sr-only">${escapeHtml(el.snapshot?.labels.pinLeft ?? 'Pin left')}</span></button><button type="button" class="pin-menu-action" data-action="pin-right" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(el.snapshot?.labels.pinRight ?? 'Pin right')}">${el.icons.renderIconWithClass('control-icon', 'pinRight')}<span class="sr-only">${escapeHtml(el.snapshot?.labels.pinRight ?? 'Pin right')}</span></button></div></div>` : ''}</span>${resizerHtml}</ui-grid-header-cell>`;
131
+ return `<ui-grid-header-cell class="${className}"${isDraggable ? ' draggable="true"' : ''}${stickyStyle ? ` style="${escapeHtml(stickyStyle)}"` : ''} data-column="${escapeHtml(column.name)}" data-sort-active="${sortDirection !== SORT_DIRECTIONS.none}" data-pinned="${isPinned}" data-pinned-left-last="${isPinnedLeftLast}" data-pinned-right-first="${isPinnedRightFirst}" data-pin-menu-open="${isPinMenuOpen}" data-drag-target="${isDragTarget}" data-dragging="${isDragging}" data-draggable="${isDraggable}" data-sticky-style="${escapeHtml(stickyStyle)}"><span class="header-label">${headerValue}</span><span class="header-actions">${canSort ? `<button type="button" class="header-action" data-action="sort" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(sortLabel)}">${el.icons.renderControlIcon(sortIconKey)}<span class="sr-only">${escapeHtml(sortLabel)}</span></button>` : ''}${canGroup ? `<button type="button" class="chip-action${controller.isColumnGrouped(column) ? ' chip-action-active' : ''}" data-action="group" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(groupingLabel)}">${el.icons.renderControlIcon('group')}<span class="sr-only">${escapeHtml(groupingLabel)}</span></button>` : ''}${canPin ? `<div class="pin-control${isPinMenuOpen ? ' pin-control-open' : ''}"><button type="button" class="chip-action pin-trigger${isPinned ? ' chip-action-active' : ''}" data-action="pin-trigger" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(pinLabel)}">${el.icons.renderControlIcon('pin')}<span class="sr-only">${escapeHtml(pinLabel)}</span></button><div class="pin-menu" role="menu" aria-label="${escapeHtml(pinLabel)}"><button type="button" class="pin-menu-action" data-action="pin-left" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(el.snapshot?.labels.pinLeft ?? 'Pin left')}">${el.icons.renderIconWithClass('control-icon', 'pinLeft')}<span class="sr-only">${escapeHtml(el.snapshot?.labels.pinLeft ?? 'Pin left')}</span></button><button type="button" class="pin-menu-action" data-action="pin-right" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(el.snapshot?.labels.pinRight ?? 'Pin right')}">${el.icons.renderIconWithClass('control-icon', 'pinRight')}<span class="sr-only">${escapeHtml(el.snapshot?.labels.pinRight ?? 'Pin right')}</span></button></div></div>` : ''}</span>${resizerHtml}</ui-grid-header-cell>`;
132
132
  }
133
133
 
134
134
  /** Render the filter-row cell for one column. Selection column gets a bare
@@ -188,4 +188,36 @@ describe('vanilla grid row-edit', () => {
188
188
  api.rowEdit.setRowsClean([row]);
189
189
  expect(api.rowEdit.getDirtyRows().length).toBe(0);
190
190
  });
191
+
192
+ it('does not begin editing on a column with enableCellEdit: false even when the grid is globally enabled', async () => {
193
+ const options = baseOptions({
194
+ columnDefs: [
195
+ { name: 'name', displayName: 'Name' }, // inherits global enableCellEdit: true
196
+ { name: 'status', displayName: 'Status', enableCellEdit: false },
197
+ ],
198
+ });
199
+ const { grid } = await mountGrid(options);
200
+ const controller = (grid as unknown as { controller: {
201
+ beginCellEdit: (rowId: string, columnName: string) => void;
202
+ editingCell: { rowId: string; columnName: string } | null;
203
+ isCellEditable: (row: unknown, column: unknown) => boolean;
204
+ findRowByIdPublic: (rowId: string) => unknown;
205
+ getOptions: () => GridOptions;
206
+ } }).controller;
207
+
208
+ // Sanity: name column inherits global true, status column opts out.
209
+ const nameCol = options.columnDefs.find((c) => c.name === 'name')!;
210
+ const statusCol = options.columnDefs.find((c) => c.name === 'status')!;
211
+ const row = controller.findRowByIdPublic('r1');
212
+ expect(controller.isCellEditable(row, nameCol)).toBe(true);
213
+ expect(controller.isCellEditable(row, statusCol)).toBe(false);
214
+
215
+ // Attempting to begin an edit on the opt-out column is a no-op.
216
+ controller.beginCellEdit('r1', 'status');
217
+ expect(controller.editingCell).toBeNull();
218
+
219
+ // The editable column does open an edit session.
220
+ controller.beginCellEdit('r1', 'name');
221
+ expect(controller.editingCell).toEqual({ rowId: 'r1', columnName: 'name' });
222
+ });
191
223
  });