@@ -1408,6 +1408,173 @@ describe('willDelRow', () => {
14081408 } ) ;
14091409} ) ;
14101410
1411+ describe ( 'willDelTable' , ( ) => {
1412+ describe ( 'allow' , ( ) => {
1413+ test ( 'returning true allows delete' , ( ) => {
1414+ middleware . addWillDelTableCallback ( ( ) => true ) ;
1415+ store . setTable ( 't1' , { r1 : { c1 : 'a' } } ) ;
1416+ store . delTable ( 't1' ) ;
1417+ expect ( store . getTable ( 't1' ) ) . toEqual ( { } ) ;
1418+ expect ( store . getTables ( ) ) . toEqual ( { } ) ;
1419+ } ) ;
1420+ } ) ;
1421+
1422+ describe ( 'block' , ( ) => {
1423+ test ( 'returning false blocks delete' , ( ) => {
1424+ middleware . addWillDelTableCallback ( ( ) => false ) ;
1425+ store . setTable ( 't1' , { r1 : { c1 : 'a' } } ) ;
1426+ store . delTable ( 't1' ) ;
1427+ expect ( store . getTable ( 't1' ) ) . toEqual ( { r1 : { c1 : 'a' } } ) ;
1428+ } ) ;
1429+
1430+ test ( 'conditionally blocks' , ( ) => {
1431+ middleware . addWillDelTableCallback ( ( tableId ) => {
1432+ return tableId !== 'protected' ;
1433+ } ) ;
1434+ store . setTables ( {
1435+ t1 : { r1 : { c1 : 'a' } } ,
1436+ protected : { r1 : { c1 : 'b' } } ,
1437+ } ) ;
1438+ store . delTable ( 't1' ) ;
1439+ store . delTable ( 'protected' ) ;
1440+ expect ( store . getTable ( 't1' ) ) . toEqual ( { } ) ;
1441+ expect ( store . getTable ( 'protected' ) ) . toEqual ( { r1 : { c1 : 'b' } } ) ;
1442+ } ) ;
1443+ } ) ;
1444+
1445+ describe ( 'chaining' , ( ) => {
1446+ test ( 'all must return true to allow' , ( ) => {
1447+ middleware
1448+ . addWillDelTableCallback ( ( ) => true )
1449+ . addWillDelTableCallback ( ( ) => true ) ;
1450+ store . setTable ( 't1' , { r1 : { c1 : 'a' } } ) ;
1451+ store . delTable ( 't1' ) ;
1452+ expect ( store . getTables ( ) ) . toEqual ( { } ) ;
1453+ } ) ;
1454+
1455+ test ( 'any returning false blocks' , ( ) => {
1456+ middleware
1457+ . addWillDelTableCallback ( ( ) => true )
1458+ . addWillDelTableCallback ( ( ) => false ) ;
1459+ store . setTable ( 't1' , { r1 : { c1 : 'a' } } ) ;
1460+ store . delTable ( 't1' ) ;
1461+ expect ( store . getTable ( 't1' ) ) . toEqual ( { r1 : { c1 : 'a' } } ) ;
1462+ } ) ;
1463+
1464+ test ( 'first blocks, second never called' , ( ) => {
1465+ const secondCalled = vi . fn ( ) ;
1466+ middleware
1467+ . addWillDelTableCallback ( ( ) => false )
1468+ . addWillDelTableCallback ( ( ...args ) => {
1469+ secondCalled ( ...args ) ;
1470+ return true ;
1471+ } ) ;
1472+ store . setTable ( 't1' , { r1 : { c1 : 'a' } } ) ;
1473+ store . delTable ( 't1' ) ;
1474+ expect ( secondCalled ) . not . toHaveBeenCalled ( ) ;
1475+ expect ( store . getTable ( 't1' ) ) . toEqual ( { r1 : { c1 : 'a' } } ) ;
1476+ } ) ;
1477+ } ) ;
1478+
1479+ describe ( 'entry points' , ( ) => {
1480+ test ( 'called from delTable' , ( ) => {
1481+ const calls : string [ ] = [ ] ;
1482+ middleware . addWillDelTableCallback ( ( tableId ) => {
1483+ calls . push ( tableId ) ;
1484+ return true ;
1485+ } ) ;
1486+ store . setTable ( 't1' , { r1 : { c1 : 'a' } } ) ;
1487+ store . delTable ( 't1' ) ;
1488+ expect ( calls ) . toEqual ( [ 't1' ] ) ;
1489+ } ) ;
1490+
1491+ test ( 'called from delTables' , ( ) => {
1492+ const calls : string [ ] = [ ] ;
1493+ middleware . addWillDelTableCallback ( ( tableId ) => {
1494+ calls . push ( tableId ) ;
1495+ return true ;
1496+ } ) ;
1497+ store . setTables ( { t1 : { r1 : { c1 : 'a' } } , t2 : { r1 : { c1 : 'b' } } } ) ;
1498+ store . delTables ( ) ;
1499+ expect ( calls ) . toEqual ( [ 't1' , 't2' ] ) ;
1500+ } ) ;
1501+
1502+ test ( 'not called from delRow' , ( ) => {
1503+ const calls : string [ ] = [ ] ;
1504+ middleware . addWillDelTableCallback ( ( tableId ) => {
1505+ calls . push ( tableId ) ;
1506+ return true ;
1507+ } ) ;
1508+ store . setTable ( 't1' , { r1 : { c1 : 'a' } , r2 : { c1 : 'b' } } ) ;
1509+ store . delRow ( 't1' , 'r1' ) ;
1510+ expect ( calls ) . toEqual ( [ ] ) ;
1511+ expect ( store . getTable ( 't1' ) ) . toEqual ( { r2 : { c1 : 'b' } } ) ;
1512+ } ) ;
1513+
1514+ test ( 'block from delTables prevents table deletion' , ( ) => {
1515+ middleware . addWillDelTableCallback ( ( ) => false ) ;
1516+ store . setTables ( { t1 : { r1 : { c1 : 'a' } } , t2 : { r1 : { c1 : 'b' } } } ) ;
1517+ store . delTables ( ) ;
1518+ expect ( store . getTables ( ) ) . toEqual ( {
1519+ t1 : { r1 : { c1 : 'a' } } ,
1520+ t2 : { r1 : { c1 : 'b' } } ,
1521+ } ) ;
1522+ } ) ;
1523+
1524+ test ( 'called when setTables replaces existing tables' , ( ) => {
1525+ const delCalls : string [ ] = [ ] ;
1526+ middleware . addWillDelTableCallback ( ( tableId ) => {
1527+ delCalls . push ( tableId ) ;
1528+ return true ;
1529+ } ) ;
1530+ store . setTables ( { t1 : { r1 : { c1 : 'a' } } , t2 : { r1 : { c1 : 'b' } } } ) ;
1531+ delCalls . length = 0 ;
1532+ store . setTables ( { t1 : { r1 : { c1 : 'A' } } } ) ;
1533+ // t2 should be deleted
1534+ expect ( delCalls ) . toEqual ( [ 't2' ] ) ;
1535+ expect ( store . getTables ( ) ) . toEqual ( { t1 : { r1 : { c1 : 'A' } } } ) ;
1536+ } ) ;
1537+
1538+ test ( 'block prevents removal of old tables during setTables' , ( ) => {
1539+ middleware . addWillDelTableCallback ( ( ) => false ) ;
1540+ store . setTables ( { t1 : { r1 : { c1 : 'a' } } , t2 : { r1 : { c1 : 'b' } } } ) ;
1541+ store . setTables ( { t1 : { r1 : { c1 : 'A' } } } ) ;
1542+ // t2 should be preserved because delete was blocked
1543+ expect ( store . getTables ( ) ) . toEqual ( {
1544+ t1 : { r1 : { c1 : 'A' } } ,
1545+ t2 : { r1 : { c1 : 'b' } } ,
1546+ } ) ;
1547+ } ) ;
1548+ } ) ;
1549+
1550+ describe ( 'interaction with willDelRow' , ( ) => {
1551+ test ( 'willDelTable blocks before willDelRow is called' , ( ) => {
1552+ const rowCalls = vi . fn ( ) ;
1553+ middleware . addWillDelTableCallback ( ( ) => false ) ;
1554+ middleware . addWillDelRowCallback ( ( ...args ) => {
1555+ rowCalls ( ...args ) ;
1556+ return true ;
1557+ } ) ;
1558+ store . setTable ( 't1' , { r1 : { c1 : 'a' } } ) ;
1559+ store . delTable ( 't1' ) ;
1560+ expect ( rowCalls ) . not . toHaveBeenCalled ( ) ;
1561+ expect ( store . getTable ( 't1' ) ) . toEqual ( { r1 : { c1 : 'a' } } ) ;
1562+ } ) ;
1563+
1564+ test ( 'willDelTable allows, willDelRow still checked' , ( ) => {
1565+ const rowCalls : string [ ] = [ ] ;
1566+ middleware . addWillDelTableCallback ( ( ) => true ) ;
1567+ middleware . addWillDelRowCallback ( ( tableId , rowId ) => {
1568+ rowCalls . push ( `${ tableId } /${ rowId } ` ) ;
1569+ return true ;
1570+ } ) ;
1571+ store . setTable ( 't1' , { r1 : { c1 : 'a' } , r2 : { c1 : 'b' } } ) ;
1572+ store . delTable ( 't1' ) ;
1573+ expect ( rowCalls ) . toEqual ( [ 't1/r1' , 't1/r2' ] ) ;
1574+ } ) ;
1575+ } ) ;
1576+ } ) ;
1577+
14111578describe ( 'willDelValue' , ( ) => {
14121579 describe ( 'allow' , ( ) => {
14131580 test ( 'returning true allows delete' , ( ) => {
@@ -1825,6 +1992,11 @@ describe('fluent API', () => {
18251992 expect ( result ) . toBe ( middleware ) ;
18261993 } ) ;
18271994
1995+ test ( 'addWillDelTableCallback returns middleware' , ( ) => {
1996+ const result = middleware . addWillDelTableCallback ( ( ) => true ) ;
1997+ expect ( result ) . toBe ( middleware ) ;
1998+ } ) ;
1999+
18282000 test ( 'addWillDelValueCallback returns middleware' , ( ) => {
18292001 const result = middleware . addWillDelValueCallback ( ( ) => true ) ;
18302002 expect ( result ) . toBe ( middleware ) ;
@@ -1843,6 +2015,7 @@ describe('fluent API', () => {
18432015 . addWillSetValueCallback ( ( _valueId , value ) => value )
18442016 . addWillSetValuesCallback ( ( values ) => values )
18452017 . addWillDelCellCallback ( ( ) => true )
2018+ . addWillDelTableCallback ( ( ) => true )
18462019 . addWillDelRowCallback ( ( ) => true )
18472020 . addWillDelValueCallback ( ( ) => true )
18482021 . addWillDelValuesCallback ( ( ) => true ) ;
0 commit comments