@@ -15,6 +15,7 @@ const log = Log.module('IrisGridTableModel');
1515
1616const SET_VIEWPORT_THROTTLE = 150 ;
1717const APPLY_VIEWPORT_THROTTLE = 0 ;
18+ const EMPTY_ARRAY = Object . freeze ( [ ] ) ;
1819
1920/**
2021 * Model for a grid showing an iris data table
@@ -544,16 +545,24 @@ class IrisGridTableModel extends IrisGridModel {
544545 return this . getMemoizedColumnMap ( this . table . columns ) ;
545546 }
546547
548+ getMemoizedKeyColumnSet = memoize (
549+ inputTableKeys => new Set ( inputTableKeys ?? EMPTY_ARRAY )
550+ ) ;
551+
552+ get keyColumnSet ( ) {
553+ return this . getMemoizedKeyColumnSet ( this . inputTable ?. keys ) ;
554+ }
555+
547556 getMemoizedFrontColumns = memoize (
548- layoutHintsFrontColumns => layoutHintsFrontColumns ?? [ ]
557+ layoutHintsFrontColumns => layoutHintsFrontColumns ?? EMPTY_ARRAY
549558 ) ;
550559
551560 get frontColumns ( ) {
552561 return this . getMemoizedFrontColumns ( this . layoutHints ?. frontColumns ) ;
553562 }
554563
555564 getMemoizedBackColumns = memoize (
556- layoutHintsBackColumns => layoutHintsBackColumns ?? [ ]
565+ layoutHintsBackColumns => layoutHintsBackColumns ?? EMPTY_ARRAY
557566 ) ;
558567
559568 get backColumns ( ) {
@@ -562,7 +571,7 @@ class IrisGridTableModel extends IrisGridModel {
562571
563572 getMemoizedFrozenColumns = memoize (
564573 ( layoutHintsFrozenColumns , userFrozenColumns ) =>
565- userFrozenColumns ?? layoutHintsFrozenColumns ?? [ ]
574+ userFrozenColumns ?? layoutHintsFrozenColumns ?? EMPTY_ARRAY
566575 ) ;
567576
568577 get frozenColumns ( ) {
@@ -581,7 +590,7 @@ class IrisGridTableModel extends IrisGridModel {
581590 }
582591
583592 get groupedColumns ( ) {
584- return [ ] ;
593+ return EMPTY_ARRAY ;
585594 }
586595
587596 get description ( ) {
@@ -654,7 +663,7 @@ class IrisGridTableModel extends IrisGridModel {
654663 */
655664 pendingRow ( y ) {
656665 const pendingRow = y - this . floatingTopRowCount - this . table . size ;
657- if ( pendingRow >= 0 && pendingRow < this . pendingNewRowCount ) {
666+ if ( pendingRow >= 0 ) {
658667 return pendingRow ;
659668 }
660669
@@ -1252,26 +1261,48 @@ class IrisGridTableModel extends IrisGridModel {
12521261 }
12531262
12541263 isKeyColumn ( x ) {
1255- return x < ( this . inputTable ?. keyColumns . length ?? 0 ) ;
1264+ return this . keyColumnSet . has ( this . columns [ x ] . name ) ;
12561265 }
12571266
12581267 isRowMovable ( ) {
12591268 return false ;
12601269 }
12611270
12621271 isEditableRange ( range ) {
1263- return (
1264- this . inputTable != null &&
1265- GridRange . isBounded ( range ) &&
1266- ( ( this . isPendingRow ( range . startRow ) && this . isPendingRow ( range . endRow ) ) ||
1267- ( range . startColumn >= this . inputTable . keyColumns . length &&
1268- range . endColumn >= this . inputTable . keyColumns . length ) ) &&
1269- range . startRow >= this . floatingTopRowCount &&
1270- range . startRow <
1271- this . floatingTopRowCount + this . table . size + this . pendingRowCount &&
1272- range . endRow <
1273- this . floatingTopRowCount + this . table . size + this . pendingRowCount
1274- ) ;
1272+ // Make sure we have an input table and a valid range
1273+ if (
1274+ this . inputTable == null ||
1275+ range . startRow == null ||
1276+ range . endRow == null
1277+ ) {
1278+ return false ;
1279+ }
1280+
1281+ // Check that the edit is in the editable range
1282+ // If an input table has keyed columns, the non-key columns are always editable
1283+ // If an input table does not have key columns, it is append only and existing rows cannot be editable
1284+ // Pending rows are always editable
1285+ const isPendingRange =
1286+ this . isPendingRow ( range . startRow ) && this . isPendingRow ( range . endRow ) ;
1287+
1288+ let isKeyColumnInRange = false ;
1289+
1290+ // Check if any of the columns in grid range are key columns
1291+ const bound = range . endColumn ?? this . table . size ;
1292+ for ( let column = range . startColumn ; column <= bound ; column += 1 ) {
1293+ if ( this . isKeyColumn ( column ) ) {
1294+ isKeyColumnInRange = true ;
1295+ break ;
1296+ }
1297+ }
1298+
1299+ if (
1300+ ! ( isPendingRange || ( this . keyColumnSet . size !== 0 && ! isKeyColumnInRange ) )
1301+ ) {
1302+ return false ;
1303+ }
1304+
1305+ return true ;
12751306 }
12761307
12771308 isDeletableRange ( range ) {
0 commit comments