@openui5/sap.ui.table 1.132.1 → 1.134.0

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.
Files changed (104) hide show
  1. package/.reuse/dep5 +2 -9
  2. package/LICENSES/LicenseRef-Unicode-3.0.txt +39 -0
  3. package/THIRDPARTY.txt +45 -78
  4. package/package.json +3 -3
  5. package/src/sap/ui/table/.library +1 -1
  6. package/src/sap/ui/table/AnalyticalColumn.js +18 -13
  7. package/src/sap/ui/table/AnalyticalColumnMenu.js +1 -1
  8. package/src/sap/ui/table/AnalyticalTable.js +7 -3
  9. package/src/sap/ui/table/Column.js +1 -1
  10. package/src/sap/ui/table/ColumnMenu.js +1 -1
  11. package/src/sap/ui/table/CreationRow.js +1 -1
  12. package/src/sap/ui/table/CreationRowRenderer.js +2 -2
  13. package/src/sap/ui/table/Row.js +1 -1
  14. package/src/sap/ui/table/RowAction.js +1 -1
  15. package/src/sap/ui/table/RowActionItem.js +1 -1
  16. package/src/sap/ui/table/RowSettings.js +6 -6
  17. package/src/sap/ui/table/Table.js +22 -8
  18. package/src/sap/ui/table/TablePersoController.js +1 -1
  19. package/src/sap/ui/table/TableRenderer.js +48 -49
  20. package/src/sap/ui/table/TreeTable.js +7 -3
  21. package/src/sap/ui/table/extensions/Accessibility.js +535 -375
  22. package/src/sap/ui/table/extensions/AccessibilityRender.js +1 -9
  23. package/src/sap/ui/table/extensions/DragAndDrop.js +1 -1
  24. package/src/sap/ui/table/extensions/ExtensionBase.js +1 -1
  25. package/src/sap/ui/table/extensions/Keyboard.js +2 -4
  26. package/src/sap/ui/table/extensions/KeyboardDelegate.js +9 -46
  27. package/src/sap/ui/table/extensions/Pointer.js +1 -1
  28. package/src/sap/ui/table/extensions/Scrolling.js +1 -1
  29. package/src/sap/ui/table/extensions/ScrollingIOS.js +1 -1
  30. package/src/sap/ui/table/extensions/Synchronization.js +1 -1
  31. package/src/sap/ui/table/library.js +11 -11
  32. package/src/sap/ui/table/menus/AnalyticalTableContextMenu.js +1 -1
  33. package/src/sap/ui/table/menus/ColumnHeaderMenuAdapter.js +1 -1
  34. package/src/sap/ui/table/menus/ContextMenu.js +1 -1
  35. package/src/sap/ui/table/menus/MobileColumnHeaderMenuAdapter.js +54 -44
  36. package/src/sap/ui/table/messagebundle.properties +10 -14
  37. package/src/sap/ui/table/messagebundle_ar.properties +6 -9
  38. package/src/sap/ui/table/messagebundle_bg.properties +6 -9
  39. package/src/sap/ui/table/messagebundle_ca.properties +6 -9
  40. package/src/sap/ui/table/messagebundle_cnr.properties +6 -9
  41. package/src/sap/ui/table/messagebundle_cs.properties +6 -9
  42. package/src/sap/ui/table/messagebundle_cy.properties +6 -9
  43. package/src/sap/ui/table/messagebundle_da.properties +6 -9
  44. package/src/sap/ui/table/messagebundle_de.properties +4 -7
  45. package/src/sap/ui/table/messagebundle_el.properties +5 -8
  46. package/src/sap/ui/table/messagebundle_en.properties +6 -9
  47. package/src/sap/ui/table/messagebundle_en_GB.properties +4 -7
  48. package/src/sap/ui/table/messagebundle_en_US_saprigi.properties +6 -9
  49. package/src/sap/ui/table/messagebundle_es.properties +6 -9
  50. package/src/sap/ui/table/messagebundle_es_MX.properties +5 -8
  51. package/src/sap/ui/table/messagebundle_et.properties +6 -9
  52. package/src/sap/ui/table/messagebundle_fi.properties +6 -9
  53. package/src/sap/ui/table/messagebundle_fr.properties +6 -9
  54. package/src/sap/ui/table/messagebundle_fr_CA.properties +6 -9
  55. package/src/sap/ui/table/messagebundle_hi.properties +6 -9
  56. package/src/sap/ui/table/messagebundle_hr.properties +6 -9
  57. package/src/sap/ui/table/messagebundle_hu.properties +6 -9
  58. package/src/sap/ui/table/messagebundle_id.properties +6 -9
  59. package/src/sap/ui/table/messagebundle_it.properties +6 -9
  60. package/src/sap/ui/table/messagebundle_iw.properties +6 -9
  61. package/src/sap/ui/table/messagebundle_ja.properties +5 -8
  62. package/src/sap/ui/table/messagebundle_kk.properties +10 -13
  63. package/src/sap/ui/table/messagebundle_ko.properties +5 -8
  64. package/src/sap/ui/table/messagebundle_lt.properties +4 -7
  65. package/src/sap/ui/table/messagebundle_lv.properties +5 -8
  66. package/src/sap/ui/table/messagebundle_mk.properties +6 -9
  67. package/src/sap/ui/table/messagebundle_ms.properties +5 -8
  68. package/src/sap/ui/table/messagebundle_nl.properties +6 -9
  69. package/src/sap/ui/table/messagebundle_no.properties +6 -9
  70. package/src/sap/ui/table/messagebundle_pl.properties +6 -9
  71. package/src/sap/ui/table/messagebundle_pt.properties +6 -9
  72. package/src/sap/ui/table/messagebundle_pt_PT.properties +4 -7
  73. package/src/sap/ui/table/messagebundle_ro.properties +6 -9
  74. package/src/sap/ui/table/messagebundle_ru.properties +6 -9
  75. package/src/sap/ui/table/messagebundle_sh.properties +6 -9
  76. package/src/sap/ui/table/messagebundle_sk.properties +6 -9
  77. package/src/sap/ui/table/messagebundle_sl.properties +6 -9
  78. package/src/sap/ui/table/messagebundle_sr.properties +6 -9
  79. package/src/sap/ui/table/messagebundle_sv.properties +6 -9
  80. package/src/sap/ui/table/messagebundle_th.properties +6 -9
  81. package/src/sap/ui/table/messagebundle_tr.properties +6 -9
  82. package/src/sap/ui/table/messagebundle_uk.properties +4 -7
  83. package/src/sap/ui/table/messagebundle_vi.properties +6 -9
  84. package/src/sap/ui/table/messagebundle_zh_CN.properties +4 -7
  85. package/src/sap/ui/table/messagebundle_zh_TW.properties +6 -9
  86. package/src/sap/ui/table/plugins/BindingSelection.js +1 -1
  87. package/src/sap/ui/table/plugins/MultiSelectionPlugin.js +2 -2
  88. package/src/sap/ui/table/plugins/PluginBase.js +1 -1
  89. package/src/sap/ui/table/plugins/SelectionModelSelection.js +3 -1
  90. package/src/sap/ui/table/plugins/SelectionPlugin.js +1 -1
  91. package/src/sap/ui/table/plugins/V4Aggregation.js +1 -1
  92. package/src/sap/ui/table/rowmodes/Auto.js +1 -1
  93. package/src/sap/ui/table/rowmodes/Fixed.js +1 -1
  94. package/src/sap/ui/table/rowmodes/Interactive.js +19 -12
  95. package/src/sap/ui/table/rowmodes/RowMode.js +1 -1
  96. package/src/sap/ui/table/rowmodes/Variable.js +1 -1
  97. package/src/sap/ui/table/utils/TableUtils.js +15 -4
  98. package/src/sap/ui/table/utils/_BindingUtils.js +1 -1
  99. package/src/sap/ui/table/utils/_ColumnUtils.js +1 -1
  100. package/src/sap/ui/table/utils/_GroupingUtils.js +1 -1
  101. package/src/sap/ui/table/utils/_HookUtils.js +1 -1
  102. package/src/sap/ui/table/utils/_MenuUtils.js +1 -1
  103. package/LICENSES/LicenseRef-tzdata-PublicDomain.txt +0 -5
  104. package/LICENSES/Unicode-DFS-2015.txt +0 -51
@@ -127,6 +127,24 @@ sap.ui.define([
127
127
 
128
128
  };
129
129
 
130
+ const addAriaForOverlayOrNoData = function(oTable, mAttributes, bOverlay, bNoData) {
131
+ const bHidden = bOverlay && oTable.getShowOverlay() || bNoData && TableUtils.isNoDataVisible(oTable);
132
+ if (bHidden) {
133
+ mAttributes["aria-hidden"] = "true";
134
+ }
135
+
136
+ let sMarker = "";
137
+ if (bOverlay) {
138
+ sMarker = "overlay";
139
+ }
140
+ if (bNoData) {
141
+ sMarker = bOverlay ? sMarker.concat(",", "nodata") : "nodata";
142
+ }
143
+ if (sMarker) {
144
+ mAttributes["data-sap-ui-table-acc-covered"] = sMarker;
145
+ }
146
+ };
147
+
130
148
  /*
131
149
  * Provides utility functions used by this extension
132
150
  */
@@ -136,8 +154,8 @@ sap.ui.define([
136
154
  * Returns the index of the column (in the array of visible columns (see Table._getVisibleColumns())) of the current focused cell
137
155
  * In case the focused cell is a row action the given index equals the length of the visible columns.
138
156
  * This function must not be used if the focus is on a row header.
139
- * @param {sap.ui.table.extensions.Accessibility} oExtension The accessibility extension.
140
- * @returns {int}
157
+ * @param {sap.ui.table.extensions.Accessibility} oExtension The accessibility extension
158
+ * @returns {int} The column index of the focused cell
141
159
  */
142
160
  getColumnIndexOfFocusedCell: function(oExtension) {
143
161
  const oTable = oExtension.getTable();
@@ -262,7 +280,8 @@ sap.ui.define([
262
280
  * Gets the aria-relevant numbers of columns and rows in the table, taking into account virtualization and internal columns like the row
263
281
  * action column.
264
282
  *
265
- * @returns {{columnCount: int, rowCount: int}}
283
+ * @param {sap.ui.table.Table} oTable The table instance
284
+ * @returns {{columnCount: int, rowCount: int}} The grid size
266
285
  */
267
286
  getGridSize: function(oTable) {
268
287
  const bHasRowHeader = TableUtils.hasRowHeader(oTable);
@@ -279,17 +298,19 @@ sap.ui.define([
279
298
  /**
280
299
  * Gets the aria-relevant index of a row, taking into account virtualization and the number of header rows.
281
300
  *
282
- * @returns {int}
301
+ * @param {sap.ui.table.Row} oRow The row instance
302
+ * @returns {int} The row index
283
303
  */
284
304
  getRowIndex: function(oRow) {
285
305
  return oRow.getIndex() + 1 + TableUtils.getHeaderRowCount(oRow.getTable());
286
306
  },
287
307
 
288
308
  /**
289
- * Determines the current row and column and updates the hidden description texts of the table accordingly.
290
- * @param {sap.ui.table.extensions.Accessibility} oExtension The accessibility extension.
309
+ * Determines whether the user navigates to the table initially, changes to another row or column.
310
+ * @param {sap.ui.table.extensions.Accessibility} oExtension The accessibility extension
311
+ * @returns {{rowChange: boolean, colChange: boolean, initial: boolean}} An object containing information about the change
291
312
  */
292
- updateRowColCount: function(oExtension) {
313
+ getRowColChange: function(oExtension) {
293
314
  const oTable = oExtension.getTable();
294
315
  const oIN = oTable._getItemNavigation();
295
316
  let bIsRowChanged = false;
@@ -302,14 +323,11 @@ sap.ui.define([
302
323
  const iColumnNumber = ExtensionHelper.getColumnIndexOfFocusedCell(oExtension) + 1 + (bHasRowHeader ? 1 : 0);
303
324
  const oRow = oTable.getRows()[TableUtils.getRowIndexOfFocusedCell(oTable)];
304
325
  const iRowNumber = oRow ? ExtensionHelper.getRowIndex(oRow) : 0;
305
- const mGridSize = ExtensionHelper.getGridSize(oTable);
306
326
 
307
- bIsRowChanged = oExtension._iLastRowNumber !== iRowNumber || (oExtension._iLastRowNumber === iRowNumber && oExtension._iLastColumnNumber === iColumnNumber);
327
+ bIsRowChanged = oExtension._iLastRowNumber !== iRowNumber ||
328
+ (oExtension._iLastRowNumber === iRowNumber && oExtension._iLastColumnNumber === iColumnNumber);
308
329
  bIsColChanged = oExtension._iLastColumnNumber !== iColumnNumber;
309
330
  bIsInitial = oExtension._iLastRowNumber == null && oExtension._iLastColumnNumber == null;
310
- oTable.$("rownumberofrows").text(bIsRowChanged && iRowNumber > 0 ? TableUtils.getResourceText("TBL_ROW_ROWCOUNT", [iRowNumber, mGridSize.rowCount]) : ".");
311
- oTable.$("colnumberofcols").text(bIsColChanged ? TableUtils.getResourceText("TBL_COL_COLCOUNT", [iColumnNumber, mGridSize.columnCount]) : ".");
312
- oTable.$("ariacount").text(bIsInitial ? TableUtils.getResourceText("TBL_DATA_ROWS_COLS", [mGridSize.rowCount, mGridSize.columnCount]) : ".");
313
331
 
314
332
  oExtension._iLastRowNumber = iRowNumber;
315
333
  oExtension._iLastColumnNumber = iColumnNumber;
@@ -350,45 +368,36 @@ sap.ui.define([
350
368
  /*
351
369
  * Updates the row / column counters, adapts the labels and descriptions of the given cell and stores the the
352
370
  * given defaults before the modification.
353
- * @see ExtensionHelper.updateRowColCount
371
+ * @see ExtensionHelper.getRowColChange
354
372
  * @see ExtensionHelper.storeDefaultsBeforeCellModifications
355
373
  */
356
374
  performCellModifications: function(oExtension, $Cell, aDefaultLabels, aDefaultDescriptions, aLabels, aDescriptions, sText, fAdapt) {
357
375
  ExtensionHelper.storeDefaultsBeforeCellModifications(oExtension, $Cell, aDefaultLabels, aDefaultDescriptions);
358
- const oCountChangeInfo = ExtensionHelper.updateRowColCount(oExtension);
376
+ const oChangeInfo = ExtensionHelper.getRowColChange(oExtension);
359
377
  const oTable = oExtension.getTable();
378
+ const sTableId = oTable.getId();
360
379
  oTable.$("cellacc").text(sText || "."); //set the custom text to the prepared hidden element
361
380
 
362
381
  if (fAdapt) { //Allow to adapt the labels / descriptions based on the changed row / column count
363
- fAdapt(aLabels, aDescriptions, oCountChangeInfo.rowChange, oCountChangeInfo.colChange, oCountChangeInfo.initial);
364
- }
365
-
366
- let sLabel = "";
367
- if (oCountChangeInfo.initial) {
368
- sLabel = oTable.getId() + "-ariacount";
369
- if (oTable.getSelectionMode() !== SelectionMode.None) {
370
- sLabel = sLabel + " " + oTable.getId() + "-ariaselection";
371
- }
382
+ fAdapt(aLabels, aDescriptions, oChangeInfo.rowChange, oChangeInfo.colChange, oChangeInfo.initial);
372
383
  }
373
384
 
374
- if (aLabels && aLabels.length) {
375
- sLabel = sLabel + " " + aLabels.join(" ");
376
- }
377
-
378
- if (oCountChangeInfo.initial || oCountChangeInfo.rowChange) {
385
+ if (oChangeInfo.initial || oChangeInfo.rowChange) {
379
386
  if (TableUtils.hasRowNavigationIndicators(oTable)) {
380
387
  const oCellInfo = TableUtils.getCellInfo($Cell);
381
388
  if (oCellInfo.type !== TableUtils.CELLTYPE.COLUMNHEADER && oCellInfo.type !== TableUtils.CELLTYPE.COLUMNROWHEADER) {
382
389
  const oRowSettings = oTable.getRows()[oCellInfo.rowIndex].getAggregation("_settings");
383
390
  if (oRowSettings.getNavigated()) {
384
- sLabel = sLabel + " " + oTable.getId() + "-rownavigatedtext";
391
+ aLabels.push(sTableId + "-rownavigatedtext");
385
392
  }
386
393
  }
387
394
  }
388
395
  }
389
396
 
397
+ const sLabel = aLabels && aLabels.length ? aLabels.join(" ") : null;
398
+
390
399
  $Cell.attr({
391
- "aria-labelledby": sLabel ? sLabel : null,
400
+ "aria-labelledby": sLabel,
392
401
  "aria-describedby": aDescriptions && aDescriptions.length ? aDescriptions.join(" ") : null
393
402
  });
394
403
  },
@@ -397,7 +406,7 @@ sap.ui.define([
397
406
  * Modifies the labels and descriptions of a data cell.
398
407
  * @see ExtensionHelper.performCellModifications
399
408
  */
400
- modifyAccOfDATACELL: function(oCellInfo) {
409
+ modifyAccOfDataCell: function(oCellInfo) {
401
410
  const oTable = this.getTable();
402
411
  const sTableId = oTable.getId();
403
412
  const oIN = oTable._getItemNavigation();
@@ -415,13 +424,13 @@ sap.ui.define([
415
424
  const sRowId = oRow.getId();
416
425
  const bHidden = ExtensionHelper.isHiddenCell($Cell, oTableInstances.cell);
417
426
  const bIsTreeColumnCell = ExtensionHelper.isTreeColumnCell(this, $Cell);
418
- const aDefaultLabels = ExtensionHelper.getAriaAttributesFor(this, AccExtension.ELEMENTTYPES.DATACELL, {
427
+ const aDefaultLabels = ExtensionHelper.getAriaAttributesForDataCell(this, {
419
428
  index: iCol,
420
429
  column: oTableInstances.column,
421
430
  fixed: TableUtils.isFixedColumn(oTable, iCol)
422
431
  })["aria-labelledby"] || [];
423
432
  const aDescriptions = [];
424
- let aLabels = [sTableId + "-rownumberofrows", sTableId + "-colnumberofcols"];
433
+ let aLabels = [];
425
434
  const bIsGroupHeader = oRow.isGroupHeader();
426
435
  const bIsSummary = oRow.isSummary();
427
436
 
@@ -442,28 +451,27 @@ sap.ui.define([
442
451
  if (!bHidden) {
443
452
  oInfo = ACCInfoHelper.getAccInfoOfControl(oTableInstances.cell);
444
453
  aLabels.push(oInfo ? (sTableId + "-cellacc") : oTableInstances.cell.getId());
454
+ }
445
455
 
446
- // Possible later extension for aria-labelledby and aria-describedby support
447
- // if (oInfo && oInfo.labelled) { aLabels.push(oInfo.labelled); }
448
- // if (oInfo && oInfo.described) { aDescriptions.push(oInfo.described); }
449
-
456
+ let sText = "";
457
+ if (oInfo) {
458
+ sText = oInfo.description;
450
459
  if (TableUtils.getInteractiveElements($Cell) !== null) {
451
- aLabels.push(sTableId + "-toggleedit");
460
+ sText = TableUtils.getResourceText("TBL_CELL_INCLUDES", [sText]);
452
461
  }
453
462
  }
454
463
 
455
- let sText = oInfo ? oInfo.description : ".";
456
464
  if (bIsTreeColumnCell && !bHidden) {
457
- const oAttributes = ExtensionHelper.getAriaAttributesFor(this, AccExtension.ELEMENTTYPES.TREEICON, {row: oTableInstances.row});
465
+ const oAttributes = ExtensionHelper.getAriaAttributesForTreeIcon(this, {row: oTableInstances.row});
458
466
  if (oAttributes && oAttributes["aria-label"]) {
459
- sText = oAttributes["aria-label"] + " " + sText;
467
+ sText = oAttributes["aria-label"].concat(" ", sText);
460
468
  }
461
469
  }
462
470
 
463
471
  ExtensionHelper.performCellModifications(this, $Cell, aDefaultLabels, null, aLabels, aDescriptions, sText,
464
472
  function(aLabels, aDescriptions, bRowChange, bColChange) {
465
473
  if (bIsGroupHeader && bRowChange) {
466
- aLabels.splice(3, 0, sRowId + "-groupHeader");
474
+ aLabels.splice(1, 0, sRowId + "-groupHeader");
467
475
  }
468
476
  const bContainsTreeIcon = $Cell.find(".sapUiTableTreeIcon").not(".sapUiTableTreeIconLeaf").length === 1;
469
477
 
@@ -480,14 +488,14 @@ sap.ui.define([
480
488
  * Modifies the labels and descriptions of a row header cell.
481
489
  * @see ExtensionHelper.performCellModifications
482
490
  */
483
- modifyAccOfROWHEADER: function(oCellInfo) {
491
+ modifyAccOfRowHeader: function(oCellInfo) {
484
492
  const oTable = this.getTable();
485
493
  const sTableId = oTable.getId();
486
494
  const $Cell = jQuery(oCellInfo.cell);
487
495
  const oRow = oTable.getRows()[oCellInfo.rowIndex];
488
496
  const sRowId = oRow.getId();
489
- const aDefaultLabels = ExtensionHelper.getAriaAttributesFor(this, AccExtension.ELEMENTTYPES.ROWHEADER)["aria-labelledby"] || [];
490
- const aLabels = aDefaultLabels.concat([sTableId + "-rownumberofrows", sTableId + "-colnumberofcols"]);
497
+ const aDefaultLabels = ExtensionHelper.getAriaAttributesForRowHeader(this)["aria-labelledby"] || [];
498
+ const aLabels = [].concat(aDefaultLabels);
491
499
 
492
500
  if (!oRow.isSummary() && !oRow.isGroupHeader() && !oRow.isContentHidden()) {
493
501
  aLabels.push(sRowId + "-rowselecttext");
@@ -516,18 +524,18 @@ sap.ui.define([
516
524
  * Modifies the labels and descriptions of a column header cell.
517
525
  * @see ExtensionHelper.performCellModifications
518
526
  */
519
- modifyAccOfCOLUMNHEADER: function(oCellInfo) {
527
+ modifyAccOfColumnHeader: function(oCellInfo) {
520
528
  const oTable = this.getTable();
521
529
  const $Cell = jQuery(oCellInfo.cell);
522
530
  const oColumn = Element.getElementById($Cell.attr("data-sap-ui-colid"));
523
531
  const oColumnLabel = TableUtils.Column.getHeaderLabel(oColumn);
524
- const mAttributes = ExtensionHelper.getAriaAttributesFor(this, AccExtension.ELEMENTTYPES.COLUMNHEADER, {
532
+ const mAttributes = ExtensionHelper.getAriaAttributesForColumnHeader(this, {
525
533
  headerId: $Cell.attr("id"),
526
534
  column: oColumn,
527
535
  index: $Cell.attr("data-sap-ui-colindex")
528
536
  });
529
537
  const sText = ExtensionHelper.getColumnTooltip(oColumn);
530
- const aLabels = [oTable.getId() + "-colnumberofcols"].concat(mAttributes["aria-labelledby"]);
538
+ const aLabels = mAttributes["aria-labelledby"] || [];
531
539
  const iSpan = oCellInfo.columnSpan;
532
540
 
533
541
  if (oColumnLabel?.getRequired?.()) {
@@ -548,6 +556,10 @@ sap.ui.define([
548
556
  aLabels.push(oTable.getId() + "-ariacolfiltered");
549
557
  }
550
558
 
559
+ if (aLabels.length > 0) {
560
+ aLabels.unshift($Cell.attr("id") + "-inner");
561
+ }
562
+
551
563
  ExtensionHelper.performCellModifications(this, $Cell, mAttributes["aria-labelledby"], mAttributes["aria-describedby"],
552
564
  aLabels, mAttributes["aria-describedby"], sText
553
565
  );
@@ -557,17 +569,17 @@ sap.ui.define([
557
569
  * Modifies the labels and descriptions of the column row header.
558
570
  * @see ExtensionHelper.performCellModifications
559
571
  */
560
- modifyAccOfCOLUMNROWHEADER: function(oCellInfo) {
572
+ modifyAccOfColumnRowHeader: function(oCellInfo) {
561
573
  const oTable = this.getTable();
562
574
  const $Cell = jQuery(oCellInfo.cell);
563
575
  const bEnabled = $Cell.hasClass("sapUiTableSelAllVisible");
564
576
 
565
- const mAttributes = ExtensionHelper.getAriaAttributesFor(
566
- this, AccExtension.ELEMENTTYPES.COLUMNROWHEADER,
577
+ const mAttributes = ExtensionHelper.getAriaAttributesForColumnRowHeader(
578
+ this,
567
579
  {enabled: bEnabled, checked: bEnabled && !oTable.$().hasClass("sapUiTableSelAll")}
568
580
  );
569
- const aLabels = [oTable.getId() + "-colnumberofcols"].concat(mAttributes["aria-labelledby"]);
570
- ExtensionHelper.performCellModifications(this, $Cell, mAttributes["aria-labelledby"], mAttributes["aria-describedby"],
581
+ const aLabels = mAttributes["aria-labelledby"] || [];
582
+ ExtensionHelper.performCellModifications(this, $Cell, [], mAttributes["aria-describedby"],
571
583
  aLabels, mAttributes["aria-describedby"], null
572
584
  );
573
585
  },
@@ -576,15 +588,15 @@ sap.ui.define([
576
588
  * Modifies the labels and descriptions of a row action cell.
577
589
  * @see ExtensionHelper.performCellModifications
578
590
  */
579
- modifyAccOfROWACTION: function(oCellInfo) {
591
+ modifyAccOfRowAction: function(oCellInfo) {
580
592
  const oTable = this.getTable();
581
593
  const sTableId = oTable.getId();
582
594
  const $Cell = jQuery(oCellInfo.cell);
583
595
  const oRow = oTable.getRows()[oCellInfo.rowIndex];
584
596
  const sRowId = oRow.getId();
585
597
  const bHidden = ExtensionHelper.isHiddenCell($Cell);
586
- const aDefaultLabels = ExtensionHelper.getAriaAttributesFor(this, AccExtension.ELEMENTTYPES.ROWACTION)["aria-labelledby"] || [];
587
- const aLabels = [sTableId + "-rownumberofrows", sTableId + "-colnumberofcols"].concat(aDefaultLabels);
598
+ const aDefaultLabels = ExtensionHelper.getAriaAttributesForRowAction(this)["aria-labelledby"] || [];
599
+ const aLabels = [].concat(aDefaultLabels);
588
600
  const aDescriptions = [];
589
601
  const bIsGroupHeader = oRow.isGroupHeader();
590
602
 
@@ -611,9 +623,6 @@ sap.ui.define([
611
623
  if (oInfo) {
612
624
  aLabels.push(sTableId + "-cellacc");
613
625
  sText = oInfo.description;
614
- if (TableUtils.getInteractiveElements($Cell) !== null) {
615
- aDescriptions.push(sTableId + "-toggleedit");
616
- }
617
626
  }
618
627
  }
619
628
  }
@@ -629,336 +638,506 @@ sap.ui.define([
629
638
  },
630
639
 
631
640
  /**
632
- * Returns the default aria attributes for the given element type with the given settings.
633
- * @see sap.ui.table.extensions.Accessibility.ELEMENTTYPES
634
- * @param {sap.ui.table.extensions.Accessibility} oExtension The accessibility extension.
635
- * @param {string} sType
636
- * @param {object} [mParams]
641
+ * Returns the aria attributes for the tr element that contains the column row header cell.
642
+ * @returns {object} An object containing the aria attributes
637
643
  */
638
- getAriaAttributesFor: function(oExtension, sType, mParams) {
639
- let mAttributes = {};
640
- const oTable = oExtension.getTable();
641
- const sTableId = oTable.getId();
644
+ getAriaAttributesForColumnRowHeaderRow: function() {
645
+ return {
646
+ "role": "row",
647
+ "aria-hidden": "true"
648
+ };
649
+ },
642
650
 
643
- function addAriaForOverlayOrNoData(oTable, mAttr, bOverlay, bNoData) {
644
- let sMarker = "";
645
- if (bOverlay && bNoData) {
646
- sMarker = "overlay,nodata";
647
- } else if (bOverlay && !bNoData) {
648
- sMarker = "overlay";
649
- } else if (!bOverlay && bNoData) {
650
- sMarker = "nodata";
651
- }
651
+ /**
652
+ * Returns the aria attributes for the column row header cell.
653
+ * @returns {object} An object containing the aria attributes
654
+ */
655
+ getAriaAttributesForColumnRowHeaderCell: function() {
656
+ return {"role": "columnheader"};
657
+ },
652
658
 
653
- let bHidden = false;
654
- if (bOverlay && oTable.getShowOverlay() || bNoData && TableUtils.isNoDataVisible(oTable)) {
655
- bHidden = true;
656
- }
659
+ /**
660
+ * Returns the aria attributes for the column row header content (select all checkbox/deselect all icon).
661
+ *
662
+ * @param {sap.ui.table.extensions.Accessibility} oExtension The accessibility extension
663
+ * @param {{enabled: boolean, checked: boolean}} mParams Whether the select all checkbox is enabled and checked
664
+ * @returns {object} An object containing the aria attributes
665
+ */
666
+ getAriaAttributesForColumnRowHeader: function(oExtension, mParams) {
667
+ const mAttributes = {};
668
+ const oTable = oExtension.getTable();
657
669
 
658
- if (bHidden) {
659
- mAttributes["aria-hidden"] = "true";
660
- }
661
- if (sMarker) {
662
- mAttributes["data-sap-ui-table-acc-covered"] = sMarker;
663
- }
670
+ const mRenderConfig = oTable._getSelectionPlugin().getRenderConfig();
671
+
672
+ if (oTable.getSelectionMode() !== SelectionMode.None) {
673
+ mAttributes["aria-label"] = TableUtils.getResourceText("TBL_TABLE_SELECTION_COLUMNHEADER");
664
674
  }
665
675
 
666
- switch (sType) {
667
- case AccExtension.ELEMENTTYPES.COLUMNROWHEADER: {
668
- const mRenderConfig = oTable._getSelectionPlugin().getRenderConfig();
669
-
670
- if (mRenderConfig.headerSelector.visible) {
671
- if (mRenderConfig.headerSelector.type === "toggle") {
672
- mAttributes["role"] = ["checkbox"];
673
- if (mParams && mParams.enabled) {
674
- mAttributes["aria-checked"] = mParams.checked ? "true" : "false";
675
- }
676
- } else if (mRenderConfig.headerSelector.type === "custom") {
677
- mAttributes["role"] = ["button"];
678
- if (!mParams || !mParams.enabled) {
679
- mAttributes["aria-disabled"] = "true";
680
- }
681
- }
676
+ if (mRenderConfig.headerSelector.visible) {
677
+ if (mRenderConfig.headerSelector.type === "toggle") {
678
+ mAttributes["role"] = ["checkbox"];
679
+ if (mParams && mParams.enabled) {
680
+ mAttributes["aria-checked"] = mParams.checked ? "true" : "false";
681
+ }
682
+ } else if (mRenderConfig.headerSelector.type === "custom") {
683
+ mAttributes["role"] = ["button"];
684
+ if (!mParams || !mParams.enabled) {
685
+ mAttributes["aria-disabled"] = "true";
682
686
  }
683
- break;
684
687
  }
688
+ }
689
+ return mAttributes;
690
+ },
685
691
 
686
- case AccExtension.ELEMENTTYPES.ROWHEADER:
687
- mAttributes["role"] = "gridcell";
688
- mAttributes["aria-colindex"] = 1;
689
- if (TableUtils.hasRowHeader(oTable) && oTable.getSelectionMode() === SelectionMode.None) {
690
- mAttributes["aria-labelledby"] = [sTableId + "-rowselecthdr"];
691
- }
692
- break;
693
-
694
- case AccExtension.ELEMENTTYPES.ROWACTION:
695
- mAttributes["role"] = "gridcell";
696
- mAttributes["aria-colindex"] = TableUtils.getVisibleColumnCount(oTable) + 1 + (TableUtils.hasRowHeader(oTable) ? 1 : 0);
697
- mAttributes["aria-labelledby"] = [sTableId + "-rowacthdr"];
698
- break;
699
-
700
- case AccExtension.ELEMENTTYPES.COLUMNHEADER: {
701
- const oColumn = mParams && mParams.column;
702
- const bHasColSpan = mParams && mParams.colspan;
703
-
704
- mAttributes["role"] = "columnheader";
705
- mAttributes["aria-colindex"] = mParams.index + 1 + (TableUtils.hasRowHeader(oTable) ? 1 : 0);
706
- let aLabels = [];
707
-
708
- if (mParams && mParams.headerId) {
709
- const aHeaders = ExtensionHelper.getRelevantColumnHeaders(oTable, oColumn);
710
- const iIdx = aHeaders.indexOf(mParams.headerId);
711
- aLabels = iIdx > 0 ? aHeaders.slice(0, iIdx + 1) : [mParams.headerId];
712
- }
713
- for (let i = 0; i < aLabels.length; i++) {
714
- aLabels[i] = aLabels[i] + "-inner";
715
- }
716
- mAttributes["aria-labelledby"] = aLabels;
692
+ /**
693
+ * Returns the aria attributes for a row addon (header, actions).
694
+ * @returns {object} An object containing the aria attributes
695
+ */
696
+ getAriaAttributesForRowAddon: function() {
697
+ return {
698
+ "role": "row",
699
+ "aria-hidden": "true"
700
+ };
701
+ },
717
702
 
718
- if (mParams && (mParams.index < oTable.getComputedFixedColumnCount())) {
719
- mAttributes["aria-labelledby"].push(sTableId + "-ariafixedcolumn");
720
- }
703
+ /**
704
+ * Returns the aria attributes for a row header cell.
705
+ *
706
+ * @param {sap.ui.table.extensions.Accessibility} oExtension The accessibility extension
707
+ * @returns {object} An object containing the aria attributes
708
+ */
709
+ getAriaAttributesForRowHeader: function(oExtension) {
710
+ const mAttributes = {};
711
+ const oTable = oExtension.getTable();
712
+ const sTableId = oTable.getId();
721
713
 
722
- if (!bHasColSpan && oColumn) {
723
- mAttributes["aria-sort"] = oColumn.getSortOrder().toLowerCase();
724
- /** @deprecated As of version 1.120 */
725
- if (!oColumn.getSorted()) {
726
- mAttributes["aria-sort"] = "none";
727
- }
728
- }
714
+ mAttributes["role"] = "gridcell";
715
+ mAttributes["aria-colindex"] = 1;
716
+ if (TableUtils.hasRowHeader(oTable) && oTable.getSelectionMode() === SelectionMode.None) {
717
+ mAttributes["aria-labelledby"] = [sTableId + "-rowselecthdr"];
718
+ }
719
+ return mAttributes;
720
+ },
729
721
 
730
- if (!bHasColSpan && oColumn) {
731
- const oColumnHeaderMenu = oColumn.getHeaderMenuInstance();
732
- if (oColumnHeaderMenu) {
733
- const sPopupType = oColumnHeaderMenu.getAriaHasPopupType();
734
- if (sPopupType !== "None") {
735
- mAttributes["aria-haspopup"] = sPopupType.toLowerCase();
736
- }
737
- }
738
- /**
739
- * @deprecated As of Version 1.117
740
- */
741
- if (!oColumnHeaderMenu && oColumn._menuHasItems()) {
742
- mAttributes["aria-haspopup"] = "menu";
743
- }
744
- }
745
- break;
746
- }
722
+ /**
723
+ * Returns the aria attributes for a row action cell.
724
+ *
725
+ * @param {sap.ui.table.extensions.Accessibility} oExtension The accessibility extension
726
+ * @returns {object} An object containing the aria attributes
727
+ */
728
+ getAriaAttributesForRowAction: function(oExtension) {
729
+ const mAttributes = {};
730
+ const oTable = oExtension.getTable();
731
+ const sTableId = oTable.getId();
747
732
 
748
- case AccExtension.ELEMENTTYPES.DATACELL: {
749
- mAttributes["role"] = "gridcell";
750
- mAttributes["aria-colindex"] = mParams.index + 1 + (TableUtils.hasRowHeader(oTable) ? 1 : 0);
733
+ mAttributes["role"] = "gridcell";
734
+ mAttributes["aria-colindex"] = TableUtils.getVisibleColumnCount(oTable) + 1 + (TableUtils.hasRowHeader(oTable) ? 1 : 0);
735
+ mAttributes["aria-labelledby"] = [sTableId + "-rowacthdr"];
751
736
 
752
- if (mParams.column) {
753
- const aLabels = ExtensionHelper.getRelevantColumnHeaders(oTable, mParams.column);
737
+ return mAttributes;
738
+ },
754
739
 
755
- for (let i = 0; i < aLabels.length; i++) {
756
- aLabels[i] = aLabels[i] + "-inner";
757
- }
740
+ /**
741
+ * Returns the aria attributes for a column header.
742
+ *
743
+ * @param {sap.ui.table.extensions.Accessibility} oExtension The accessibility extension
744
+ * @param {{column: sap.ui.table.Column, headerId: string, index: int, colspan: boolean}} mParams An object containing the instance of the
745
+ * column, the id of the header cell, the index of the column and whether the column has span
746
+ * @returns {object} An object containing the aria attributes
747
+ */
748
+ getAriaAttributesForColumnHeader: function(oExtension, mParams) {
749
+ const mAttributes = {};
750
+ const oTable = oExtension.getTable();
751
+ const sTableId = oTable.getId();
758
752
 
759
- if (mParams && mParams.fixed) {
760
- aLabels.push(sTableId + "-ariafixedcolumn");
761
- }
753
+ const oColumn = mParams && mParams.column;
754
+ const bHasColSpan = mParams && mParams.colspan;
755
+
756
+ mAttributes["role"] = "columnheader";
757
+ mAttributes["aria-colindex"] = mParams.index + 1 + (TableUtils.hasRowHeader(oTable) ? 1 : 0);
758
+
759
+ if (mParams && (mParams.index < oTable.getComputedFixedColumnCount())) {
760
+ mAttributes["aria-labelledby"] = [sTableId + "-ariafixedcolumn"];
761
+ }
762
762
 
763
- mAttributes["aria-labelledby"] = aLabels;
763
+ if (!bHasColSpan && oColumn) {
764
+ mAttributes["aria-sort"] = oColumn.getSortOrder().toLowerCase();
765
+ /** @deprecated As of version 1.120 */
766
+ if (!oColumn.getSorted()) {
767
+ mAttributes["aria-sort"] = "none";
768
+ }
769
+ const oColumnHeaderMenu = oColumn.getHeaderMenuInstance();
770
+ if (oColumnHeaderMenu) {
771
+ const sPopupType = oColumnHeaderMenu.getAriaHasPopupType();
772
+ if (sPopupType !== "None") {
773
+ mAttributes["aria-haspopup"] = sPopupType.toLowerCase();
764
774
  }
765
- break;
766
775
  }
776
+ /**
777
+ * @deprecated As of Version 1.117
778
+ */
779
+ if (!oColumnHeaderMenu && oColumn._menuHasItems()) {
780
+ mAttributes["aria-haspopup"] = "menu";
781
+ }
782
+ }
783
+ return mAttributes;
784
+ },
767
785
 
768
- case AccExtension.ELEMENTTYPES.ROOT: //The tables root dom element
769
- break;
786
+ /**
787
+ * Returns the aria attributes for a data cell.
788
+ *
789
+ * @param {sap.ui.table.extensions.Accessibility} oExtension The accessibility extension
790
+ * @param {{index: int, column: sap.ui.table.Column, row: sap.ui.table.Row, fixed: boolean, rowSelected: boolean}} mParams An object
791
+ * containing the index of the row, the instance of the column, the instance of the row, whether the column is fixed and whether the row is
792
+ * selected
793
+ * @returns {object} An object containing the aria attributes
794
+ */
795
+ getAriaAttributesForDataCell: function(oExtension, mParams) {
796
+ const mAttributes = {};
797
+ const oTable = oExtension.getTable();
798
+ const sTableId = oTable.getId();
770
799
 
771
- case AccExtension.ELEMENTTYPES.TABLE: //The "real" table element(s)
772
- mAttributes["role"] = "presentation";
773
- addAriaForOverlayOrNoData(oTable, mAttributes, true, true);
774
- break;
800
+ mAttributes["role"] = "gridcell";
801
+ mAttributes["aria-colindex"] = mParams.index + 1 + (TableUtils.hasRowHeader(oTable) ? 1 : 0);
775
802
 
776
- case AccExtension.ELEMENTTYPES.CONTAINER: //The table container
777
- break;
803
+ if (mParams.column && mParams.fixed) {
804
+ mAttributes["aria-labelledby"] = [sTableId + "-ariafixedcolumn"];
805
+ }
806
+ return mAttributes;
807
+ },
778
808
 
779
- case AccExtension.ELEMENTTYPES.CONTENT: { //The content area of the table which contains all the table elements, rowheaders, columnheaders, etc
780
- mAttributes["role"] = TableUtils.Grouping.isInGroupMode(oTable) || TableUtils.Grouping.isInTreeMode(oTable) ? "treegrid" : "grid";
809
+ /**
810
+ * Returns the aria attributes for the table element that wraps the content.
811
+ *
812
+ * @param {sap.ui.table.extensions.Accessibility} oExtension The accessibility extension
813
+ * @returns {object} An object containing the aria attributes
814
+ */
815
+ getAriaAttributesForTable: function(oExtension) {
816
+ const mAttributes = {"role": "presentation"};
817
+ const oTable = oExtension.getTable();
781
818
 
782
- mAttributes["aria-labelledby"] = [].concat(oTable.getAriaLabelledBy());
783
- if (oTable.getTitle()) {
784
- mAttributes["aria-labelledby"].push(oTable.getTitle().getId());
785
- }
819
+ addAriaForOverlayOrNoData(oTable, mAttributes, true, true);
820
+ return mAttributes;
821
+ },
786
822
 
787
- if (oTable.getSelectionMode() === SelectionMode.MultiToggle) {
788
- mAttributes["aria-multiselectable"] = "true";
789
- }
823
+ /**
824
+ * Returns the aria attributes for the container that wraps the data cells.
825
+ *
826
+ * @param {sap.ui.table.extensions.Accessibility} oExtension The accessibility extension
827
+ * @returns {object} An object containing the aria attributes
828
+ */
829
+ getAriaAttributesForContent: function(oExtension) {
830
+ const mAttributes = {};
831
+ const oTable = oExtension.getTable();
832
+ const sTableId = oTable.getId();
790
833
 
791
- const mRowCounts = oTable._getRowCounts();
792
- const bHasFixedColumns = TableUtils.hasFixedColumns(oTable);
793
- const bHasFixedTopRows = mRowCounts.fixedTop > 0;
794
- const bHasFixedBottomRows = mRowCounts.fixedBottom > 0;
795
- const bHasRowHeader = TableUtils.hasRowHeader(oTable);
796
- const bHasRowActions = TableUtils.hasRowActions(oTable);
797
- const mGridSize = ExtensionHelper.getGridSize(oTable);
798
-
799
- mAttributes["aria-owns"] = [sTableId + "-table"];
800
- if (bHasFixedColumns) {
801
- mAttributes["aria-owns"].push(sTableId + "-table-fixed");
802
- }
803
- if (bHasFixedTopRows) {
804
- mAttributes["aria-owns"].push(sTableId + "-table-fixrow");
805
- if (bHasFixedColumns) {
806
- mAttributes["aria-owns"].push(sTableId + "-table-fixed-fixrow");
807
- }
808
- }
809
- if (bHasFixedBottomRows) {
810
- mAttributes["aria-owns"].push(sTableId + "-table-fixrow-bottom");
811
- if (bHasFixedColumns) {
812
- mAttributes["aria-owns"].push(sTableId + "-table-fixed-fixrow-bottom");
813
- }
814
- }
815
- if (bHasRowHeader) {
816
- mAttributes["aria-owns"].push(sTableId + "-sapUiTableRowHdrScr");
817
- }
818
- if (bHasRowActions) {
819
- mAttributes["aria-owns"].push(sTableId + "-sapUiTableRowActionScr");
820
- }
834
+ mAttributes["role"] = TableUtils.Grouping.isInGroupMode(oTable) || TableUtils.Grouping.isInTreeMode(oTable) ? "treegrid" : "grid";
835
+ mAttributes["aria-describedby"] = [sTableId + "-ariaselection"];
836
+ mAttributes["aria-labelledby"] = oTable.getAriaLabelledBy() || [];
837
+ if (oTable.getTitle()) {
838
+ mAttributes["aria-labelledby"].push(oTable.getTitle().getId());
839
+ }
840
+
841
+ if (oTable.getSelectionMode() === SelectionMode.MultiToggle) {
842
+ mAttributes["aria-multiselectable"] = "true";
843
+ }
821
844
 
822
- mAttributes["aria-rowcount"] = mGridSize.rowCount;
823
- mAttributes["aria-colcount"] = mGridSize.columnCount;
845
+ const mRowCounts = oTable._getRowCounts();
846
+ const bHasFixedColumns = TableUtils.hasFixedColumns(oTable);
847
+ const bHasFixedTopRows = mRowCounts.fixedTop > 0;
848
+ const bHasFixedBottomRows = mRowCounts.fixedBottom > 0;
849
+ const bHasRowHeader = TableUtils.hasRowHeader(oTable);
850
+ const bHasRowActions = TableUtils.hasRowActions(oTable);
851
+ const mGridSize = ExtensionHelper.getGridSize(oTable);
824
852
 
825
- if (oTable.isA("sap.ui.table.AnalyticalTable")) {
826
- mAttributes["aria-roledescription"] = TableUtils.getResourceText("TBL_ANALYTICAL_TABLE_ROLE_DESCRIPTION");
827
- }
828
- break;
853
+ mAttributes["aria-owns"] = [sTableId + "-sapUiTableColHdrCnt", sTableId + "-table"];
854
+ if (bHasFixedColumns) {
855
+ mAttributes["aria-owns"].push(sTableId + "-table-fixed");
856
+ }
857
+ if (bHasFixedTopRows) {
858
+ mAttributes["aria-owns"].push(sTableId + "-table-fixrow");
859
+ if (bHasFixedColumns) {
860
+ mAttributes["aria-owns"].push(sTableId + "-table-fixed-fixrow");
861
+ }
862
+ }
863
+ if (bHasFixedBottomRows) {
864
+ mAttributes["aria-owns"].push(sTableId + "-table-fixrow-bottom");
865
+ if (bHasFixedColumns) {
866
+ mAttributes["aria-owns"].push(sTableId + "-table-fixed-fixrow-bottom");
829
867
  }
868
+ }
869
+ if (bHasRowHeader) {
870
+ mAttributes["aria-owns"].push(sTableId + "-sapUiTableRowHdrScr");
871
+ }
872
+ if (bHasRowActions) {
873
+ mAttributes["aria-owns"].push(sTableId + "-sapUiTableRowActionScr");
874
+ }
830
875
 
831
- case AccExtension.ELEMENTTYPES.TABLEHEADER: //The table header area
832
- mAttributes["role"] = "heading";
833
- mAttributes["aria-level"] = "2"; // Level is mandatory for headings with ARIA 1.1 and the default is 2
834
- addAriaForOverlayOrNoData(oTable, mAttributes, true, false);
835
- break;
836
-
837
- case AccExtension.ELEMENTTYPES.COLUMNHEADER_TBL: //Table of column headers
838
- mAttributes["role"] = "presentation";
839
- break;
840
-
841
- case AccExtension.ELEMENTTYPES.COLUMNHEADER_ROW: //The area which contains the column headers
842
- mAttributes["role"] = "row";
843
- addAriaForOverlayOrNoData(oTable, mAttributes, true, false);
844
- break;
845
-
846
- case AccExtension.ELEMENTTYPES.CREATIONROW_TBL: // Table of the creation row
847
- mAttributes["role"] = "presentation";
848
- break;
849
-
850
- case AccExtension.ELEMENTTYPES.CREATIONROW: // Root of the creation row
851
- mAttributes["role"] = "form";
852
- mAttributes["aria-labelledby"] = mParams.creationRow.getId() + "-label";
853
- addAriaForOverlayOrNoData(oTable, mAttributes, true, false);
854
- break;
855
-
856
- case AccExtension.ELEMENTTYPES.ROWHEADER_COL: //The area which contains the row headers
857
- addAriaForOverlayOrNoData(oTable, mAttributes, true, true);
858
- break;
859
-
860
- case AccExtension.ELEMENTTYPES.TH: //The "technical" column headers
861
- mAttributes["role"] = "presentation";
862
- mAttributes["scope"] = "col";
863
- mAttributes["aria-hidden"] = "true";
864
- break;
865
-
866
- case AccExtension.ELEMENTTYPES.TR: //The rows
867
- mAttributes["role"] = "row";
868
- if (mParams.rowNavigated) {
869
- mAttributes["aria-current"] = true;
870
- }
876
+ mAttributes["aria-rowcount"] = mGridSize.rowCount;
877
+ mAttributes["aria-colcount"] = mGridSize.columnCount;
871
878
 
872
- if (!mParams.fixedCol) {
873
- mAttributes["aria-owns"] = [];
874
- if (TableUtils.hasRowHeader(oTable)) {
875
- mAttributes["aria-owns"].push(sTableId + "-rowsel" + mParams.index);
876
- }
877
- if (TableUtils.hasFixedColumns(oTable)) {
878
- for (let j = 0; j < oTable.getComputedFixedColumnCount(); j++) {
879
- mAttributes["aria-owns"].push(sTableId + "-rows-row" + mParams.index + "-col" + j);
880
- }
881
- }
882
- if (TableUtils.hasRowActions(oTable)) {
883
- mAttributes["aria-owns"].push(sTableId + "-rowact" + mParams.index);
884
- }
885
- }
886
- break;
887
-
888
- case AccExtension.ELEMENTTYPES.TREEICON: //The expand/collapse icon in the TreeTable
889
- if (TableUtils.Grouping.isInTreeMode(oTable)) {
890
- mAttributes = {
891
- "aria-label": "",
892
- "title": "",
893
- "role": ""
894
- };
895
- if (oTable.getBinding()) {
896
- if (mParams && mParams.row) {
897
- if (mParams.row.isExpandable()) {
898
- const sText = TableUtils.getResourceText("TBL_COLLAPSE_EXPAND");
899
- mAttributes["title"] = sText;
900
-
901
- mAttributes["aria-expanded"] = "" + (!!mParams.row.isExpanded());
902
- mAttributes["aria-hidden"] = "false";
903
- mAttributes["role"] = "button";
904
- } else {
905
- mAttributes["aria-label"] = TableUtils.getResourceText("TBL_LEAF");
906
- mAttributes["aria-hidden"] = "true";
907
- }
908
- }
909
- }
910
- }
911
- break;
879
+ if (oTable.isA("sap.ui.table.AnalyticalTable")) {
880
+ mAttributes["aria-roledescription"] = TableUtils.getResourceText("TBL_ANALYTICAL_TABLE_ROLE_DESCRIPTION");
881
+ }
882
+ return mAttributes;
883
+ },
912
884
 
913
- case AccExtension.ELEMENTTYPES.NODATA: { //The no data container
914
- const vNoContentMessage = TableUtils.getNoContentMessage(oTable);
915
- const aLabels = [];
885
+ /**
886
+ * Returns the aria attributes for the table header.
887
+ *
888
+ * @param {sap.ui.table.extensions.Accessibility} oExtension The accessibility extension
889
+ * @returns {object} An object containing the aria attributes
890
+ */
891
+ getAriaAttributesForTableHeader: function(oExtension) {
892
+ const mAttributes = {
893
+ "role": "heading",
894
+ "aria-level": "2" // Level is mandatory for headings with ARIA 1.1 and the default is 2
895
+ };
896
+ const oTable = oExtension.getTable();
916
897
 
917
- mAttributes["role"] = "gridcell";
898
+ addAriaForOverlayOrNoData(oTable, mAttributes, true, false);
899
+ return mAttributes;
900
+ },
901
+
902
+ /**
903
+ * Returns the aria attributes for the row that contains the column headers.
904
+ *
905
+ * @param {sap.ui.table.extensions.Accessibility} oExtension The accessibility extension
906
+ * @returns {object} An object containing the aria attributes
907
+ */
908
+ getAriaAttributesForColumnHeaderRow: function(oExtension) {
909
+ const mAttributes = {"role": "row"};
910
+ const oTable = oExtension.getTable();
911
+ const sTableId = oTable.getId();
912
+
913
+ mAttributes["aria-rowindex"] = ["1"];
914
+ mAttributes["aria-owns"] = [];
915
+ if (TableUtils.hasRowHeader(oTable)) {
916
+ mAttributes["aria-owns"].push(sTableId + "-rowcolhdr");
917
+ }
918
+
919
+ for (let j = 0; j < TableUtils.getVisibleColumnCount(oTable); j++) {
920
+ mAttributes["aria-owns"].push(oTable._getVisibleColumns()[j].getId());
921
+ }
922
+
923
+ if (TableUtils.hasRowActions(oTable)) {
924
+ mAttributes["aria-owns"].push(sTableId + "-rowacthdr");
925
+ }
926
+
927
+ addAriaForOverlayOrNoData(oTable, mAttributes, true, false);
928
+ return mAttributes;
929
+ },
930
+
931
+ /**
932
+ * Returns the aria attributes for the creation row.
933
+ *
934
+ * @param {sap.ui.table.extensions.Accessibility} oExtension The accessibility extension
935
+ * @param {{creationRow: sap.ui.table.CreationRow}} mParams An object containing the instance of the creation row
936
+ * @returns {object} An object containing the aria attributes
937
+ */
938
+ getAriaAttributesForCreationRow: function(oExtension, mParams) {
939
+ const mAttributes = {};
940
+ const oTable = oExtension.getTable();
941
+ mAttributes["role"] = "form";
942
+ mAttributes["aria-labelledby"] = mParams.creationRow.getId() + "-label";
943
+ addAriaForOverlayOrNoData(oTable, mAttributes, true, false);
944
+ return mAttributes;
945
+ },
946
+
947
+ /**
948
+ * Returns the aria attributes for the container element that contains the row headers.
949
+ *
950
+ * @param {sap.ui.table.extensions.Accessibility} oExtension The accessibility extension
951
+ * @returns {object} An object containing the aria attributes
952
+ */
953
+ getAriaAttributesForRowHeaderCol: function(oExtension) {
954
+ const mAttributes = {};
955
+ const oTable = oExtension.getTable();
956
+ addAriaForOverlayOrNoData(oTable, mAttributes, true, true);
957
+ return mAttributes;
958
+ },
959
+
960
+ /**
961
+ * Returns the aria attributes for a column header.
962
+ *
963
+ * @returns {object} An object containing the aria attributes
964
+ */
965
+ getAriaAttributesForTh: function() {
966
+ return {
967
+ "role": "presentation",
968
+ "scope": "col",
969
+ "aria-hidden": "true"
970
+ };
971
+ },
972
+
973
+ /**
974
+ * Returns the aria attributes for the scrollable part of a row.
975
+ *
976
+ * @param {sap.ui.table.extensions.Accessibility} oExtension The accessibility extension
977
+ * @param {{index: int, fixedCol: boolean, rowNavigated: boolean}} mParams An object containing the index of the row, whether the row is fixed
978
+ * and whether the row is navigated
979
+ * @returns {object} An object containing the aria attributes
980
+ */
981
+ getAriaAttributesForTr: function(oExtension, mParams) {
982
+ const mAttributes = {};
983
+ const oTable = oExtension.getTable();
984
+ const sTableId = oTable.getId();
985
+
986
+ mAttributes["role"] = "row";
987
+ if (mParams.rowNavigated) {
988
+ mAttributes["aria-current"] = true;
989
+ }
990
+
991
+ mAttributes["aria-owns"] = [];
992
+ if (TableUtils.hasRowHeader(oTable)) {
993
+ mAttributes["aria-owns"].push(sTableId + "-rowsel" + mParams.index);
994
+ }
918
995
 
919
- if (TableUtils.isA(vNoContentMessage, "sap.ui.core.Control")) {
920
- if (vNoContentMessage.getAccessibilityReferences instanceof Function) {
921
- const oAccRef = vNoContentMessage.getAccessibilityReferences();
922
- aLabels.push(oAccRef.title);
923
- aLabels.push(oAccRef.description);
996
+ for (let j = 0; j < TableUtils.getVisibleColumnCount(oTable); j++) {
997
+ mAttributes["aria-owns"].push(sTableId + "-rows-row" + mParams.index + "-col" + j);
998
+ }
999
+
1000
+ if (TableUtils.hasRowActions(oTable)) {
1001
+ mAttributes["aria-owns"].push(sTableId + "-rowact" + mParams.index);
1002
+ }
1003
+
1004
+ return mAttributes;
1005
+ },
1006
+
1007
+ /**
1008
+ * Returns the aria attributes for a tree icon (expand/collapse).
1009
+ *
1010
+ * @param {sap.ui.table.extensions.Accessibility} oExtension The accessibility extension
1011
+ * @param {{oRow: sap.ui.table.Row}} mParams An object containing the instance of the row
1012
+ * @returns {object} An object containing the aria attributes
1013
+ */
1014
+ getAriaAttributesForTreeIcon: function(oExtension, mParams) {
1015
+ let mAttributes = {};
1016
+ const oTable = oExtension.getTable();
1017
+
1018
+ if (TableUtils.Grouping.isInTreeMode(oTable)) {
1019
+ mAttributes = {
1020
+ "aria-label": "",
1021
+ "title": "",
1022
+ "role": ""
1023
+ };
1024
+ if (oTable.getBinding()) {
1025
+ if (mParams && mParams.row) {
1026
+ if (mParams.row.isExpandable()) {
1027
+ const sText = TableUtils.getResourceText("TBL_COLLAPSE_EXPAND");
1028
+ mAttributes["title"] = sText;
1029
+
1030
+ mAttributes["aria-expanded"] = "" + (!!mParams.row.isExpanded());
1031
+ mAttributes["aria-hidden"] = "false";
1032
+ mAttributes["role"] = "button";
924
1033
  } else {
925
- aLabels.push(vNoContentMessage.getId());
1034
+ mAttributes["aria-label"] = TableUtils.getResourceText("TBL_LEAF");
1035
+ mAttributes["aria-hidden"] = "true";
926
1036
  }
927
- } else {
928
- aLabels.push(sTableId + "-noDataMsg");
929
1037
  }
930
-
931
- mAttributes["aria-labelledby"] = aLabels;
932
- addAriaForOverlayOrNoData(oTable, mAttributes, true, false);
933
- break;
934
1038
  }
1039
+ }
1040
+ return mAttributes;
1041
+ },
935
1042
 
936
- case AccExtension.ELEMENTTYPES.OVERLAY: //The overlay container
937
- mAttributes["role"] = "region";
938
- mAttributes["aria-labelledby"] = [].concat(oTable.getAriaLabelledBy());
939
- if (oTable.getTitle()) {
940
- mAttributes["aria-labelledby"].push(oTable.getTitle().getId());
941
- }
942
- mAttributes["aria-labelledby"].push(sTableId + "-ariainvalid");
943
- break;
1043
+ /**
1044
+ * Returns the aria attributes for the no data container.
1045
+ *
1046
+ * @param {sap.ui.table.extensions.Accessibility} oExtension The accessibility extension
1047
+ * @returns {object} An object containing the aria attributes
1048
+ */
1049
+ getAriaAttributesForNoData: function(oExtension) {
1050
+ const mAttributes = {};
1051
+ const oTable = oExtension.getTable();
1052
+ const sTableId = oTable.getId();
944
1053
 
945
- case AccExtension.ELEMENTTYPES.TABLEFOOTER: //The table footer area
946
- case AccExtension.ELEMENTTYPES.TABLESUBHEADER: //The table toolbar and extension areas
947
- addAriaForOverlayOrNoData(oTable, mAttributes, true, false);
948
- break;
1054
+ const vNoContentMessage = TableUtils.getNoContentMessage(oTable);
1055
+ const aLabels = [];
949
1056
 
950
- case AccExtension.ELEMENTTYPES.ROWACTIONHEADER: // The header of the row action column
951
- mAttributes["aria-hidden"] = "true";
952
- break;
1057
+ mAttributes["role"] = "gridcell";
953
1058
 
954
- case "PRESENTATION":
955
- mAttributes["role"] = "presentation";
956
- break;
1059
+ if (TableUtils.isA(vNoContentMessage, "sap.ui.core.Control")) {
1060
+ if (vNoContentMessage.getAccessibilityReferences instanceof Function) {
1061
+ const oAccRef = vNoContentMessage.getAccessibilityReferences();
1062
+ aLabels.push(oAccRef.title);
1063
+ aLabels.push(oAccRef.description);
1064
+ } else {
1065
+ aLabels.push(vNoContentMessage.getId());
1066
+ }
1067
+ } else {
1068
+ aLabels.push(sTableId + "-noDataMsg");
957
1069
  }
958
1070
 
1071
+ mAttributes["aria-labelledby"] = aLabels;
1072
+ addAriaForOverlayOrNoData(oTable, mAttributes, true, false);
959
1073
  return mAttributes;
960
- }
1074
+ },
1075
+
1076
+ /**
1077
+ * Returns the aria attributes for the overlay.
1078
+ *
1079
+ * @param {sap.ui.table.extensions.Accessibility} oExtension The accessibility extension
1080
+ * @returns {object} An object containing the aria attributes
1081
+ */
1082
+ getAriaAttributesForOverlay: function(oExtension) {
1083
+ const mAttributes = {};
1084
+ const oTable = oExtension.getTable();
1085
+ const sTableId = oTable.getId();
1086
+
1087
+ mAttributes["role"] = "region";
1088
+ mAttributes["aria-labelledby"] = [].concat(oTable.getAriaLabelledBy());
1089
+ if (oTable.getTitle()) {
1090
+ mAttributes["aria-labelledby"].push(oTable.getTitle().getId());
1091
+ }
1092
+ mAttributes["aria-labelledby"].push(sTableId + "-ariainvalid");
1093
+ return mAttributes;
1094
+ },
1095
+
1096
+ /**
1097
+ * Returns the aria attributes for the table footer.
1098
+ *
1099
+ * @param {sap.ui.table.extensions.Accessibility} oExtension The accessibility extension
1100
+ * @returns {object} An object containing the aria attributes
1101
+ */
1102
+ getAriaAttributesForTableFooter: function(oExtension) {
1103
+ const mAttributes = {};
1104
+ const oTable = oExtension.getTable();
1105
+
1106
+ addAriaForOverlayOrNoData(oTable, mAttributes, true, false);
1107
+ return mAttributes;
1108
+ },
1109
+
1110
+ /**
1111
+ * Returns the aria attributes for a sub header.
1112
+ *
1113
+ * @param {sap.ui.table.extensions.Accessibility} oExtension The accessibility extension
1114
+ * @returns {object} An object containing the aria attributes
1115
+ */
1116
+ getAriaAttributesForTableSubHeader: function(oExtension) {
1117
+ const mAttributes = {};
1118
+ const oTable = oExtension.getTable();
1119
+
1120
+ addAriaForOverlayOrNoData(oTable, mAttributes, true, false);
1121
+ return mAttributes;
1122
+ },
1123
+
1124
+ /**
1125
+ * Returns the aria attributes for the header of the row actions column.
1126
+ *
1127
+ * @returns {object} An object containing the aria attributes
1128
+ */
1129
+ getAriaAttributesForRowActionHeader: function() {
1130
+ return {"aria-hidden": "true"};
1131
+ },
961
1132
 
1133
+ /**
1134
+ * Returns the aria attributes for a presentational element that needs to be hidden for screen readers.
1135
+ *
1136
+ * @returns {object} An object containing the aria attributes
1137
+ */
1138
+ getAriaAttributesForPresentation: function() {
1139
+ return {"role": "presentation"};
1140
+ }
962
1141
  };
963
1142
 
964
1143
  /**
@@ -969,7 +1148,7 @@ sap.ui.define([
969
1148
  * @class Extension for sap.ui.table.Table which handles ACC related things.
970
1149
  * @extends sap.ui.table.extensions.ExtensionBase
971
1150
  * @author SAP SE
972
- * @version 1.132.1
1151
+ * @version 1.134.0
973
1152
  * @constructor
974
1153
  * @private
975
1154
  * @alias sap.ui.table.extensions.Accessibility
@@ -1039,7 +1218,7 @@ sap.ui.define([
1039
1218
  * @protected
1040
1219
  */
1041
1220
  getAriaAttributesFor: function(sType, mParams) {
1042
- return ExtensionHelper.getAriaAttributesFor(this, sType, mParams);
1221
+ return ExtensionHelper["getAriaAttributesFor" + sType](this, mParams);
1043
1222
  },
1044
1223
 
1045
1224
  /**
@@ -1068,7 +1247,7 @@ sap.ui.define([
1068
1247
  */
1069
1248
  onfocusout: function(oEvent) {
1070
1249
  const oTable = this.getTable();
1071
- if (!oTable) {
1250
+ if (!oTable || oEvent.target.classList.contains("sapUiTableCtrlBefore")) {
1072
1251
  return;
1073
1252
  }
1074
1253
 
@@ -1088,37 +1267,16 @@ sap.ui.define([
1088
1267
  /**
1089
1268
  * Known element types (DOM areas) in the table.
1090
1269
  *
1091
- * @type {{DATACELL: string, COLUMNHEADER: string, ROWHEADER: string, ROWACTION: string, COLUMNROWHEADER: string, ROOT: string, CONTENT: string,
1092
- * TABLE: string, TABLEHEADER: string, TABLEFOOTER: string, TABLESUBHEADER: string, COLUMNHEADER_TBL: string, COLUMNHEADER_ROW: string,
1093
- * CREATIONROW_TBL: string, ROWHEADER_COL: string, TH: string, TR: string, TREEICON: string, ROWACTIONHEADER: string,
1094
- * NODATA: string, OVERLAY: string}|*}
1270
+ * @type {{DATACELL: string, COLUMNHEADER: string, ROWHEADER: string, ROWACTION: string, COLUMNROWHEADER: string}|*}
1095
1271
  * @see sap.ui.table.extensions.AccessibilityRender.writeAriaAttributesFor
1096
1272
  * @public
1097
1273
  */
1098
1274
  AccExtension.ELEMENTTYPES = {
1099
- DATACELL: "DATACELL", // Standard data cell (standard, group or sum)
1100
- COLUMNHEADER: "COLUMNHEADER", // Column header
1101
- ROWHEADER: "ROWHEADER", // Row header (standard, group or sum)
1102
- ROWACTION: "ROWACTION", // Row action (standard, group or sum)
1103
- COLUMNROWHEADER: "COLUMNROWHEADER", // Select all row selector (top left cell)
1104
- ROOT: "ROOT", // The tables root dom element
1105
- CONTAINER: "CONTAINER", // The table container
1106
- CONTENT: "CONTENT", // The content area of the table which contains all the table elements, rowheaders, columnheaders, etc
1107
- TABLE: "TABLE", // The "real" table element(s)
1108
- TABLEHEADER: "TABLEHEADER", // TODO: Delete in UI5 2
1109
- TABLEFOOTER: "TABLEFOOTER", // The table footer area
1110
- TABLESUBHEADER: "TABLESUBHEADER", // The table toolbar and extension areas
1111
- COLUMNHEADER_TBL: "COLUMNHEADER_TABLE", // The table with the column headers
1112
- COLUMNHEADER_ROW: "COLUMNHEADER_ROW", // The table row with the column headers
1113
- CREATIONROW_TBL: "CREATIONROW_TABLE", // The table with the creation row
1114
- CREATIONROW: "CREATIONROW", // The root of the creation row
1115
- ROWHEADER_COL: "ROWHEADER_COL", // The area which contains the row headers
1116
- TH: "TH", // The "technical" column headers
1117
- TR: "TR", // The rows
1118
- TREEICON: "TREEICON", // The expand/collapse icon in the TreeTable
1119
- ROWACTIONHEADER: "ROWACTIONHEADER", // The header of the row action column
1120
- NODATA: "NODATA", // The no data container
1121
- OVERLAY: "OVERLAY" // The overlay container
1275
+ DATACELL: "DataCell", // Standard data cell (standard, group or sum)
1276
+ COLUMNHEADER: "ColumnHeader", // Column header
1277
+ ROWHEADER: "RowHeader", // Row header (standard, group or sum)
1278
+ ROWACTION: "RowAction", // Row action (standard, group or sum)
1279
+ COLUMNROWHEADER: "ColumnRowHeader" // Select all row selector content
1122
1280
  };
1123
1281
 
1124
1282
  /**
@@ -1239,7 +1397,9 @@ sap.ui.define([
1239
1397
  const bIsSelected = oTable._getSelectionPlugin().isSelected(oRow);
1240
1398
 
1241
1399
  if ($Ref.row) {
1242
- $Ref.row.not($Ref.rowHeaderPart).not($Ref.rowActionPart).add($Ref.row.children(".sapUiTableCell")).attr("aria-selected", bIsSelected ? "true" : "false");
1400
+ $Ref.row.not($Ref.rowHeaderPart).not($Ref.rowActionPart).add(
1401
+ $Ref.row.children(".sapUiTableCell")
1402
+ ).attr("aria-selected", bIsSelected ? "true" : "false");
1243
1403
  }
1244
1404
 
1245
1405
  sTextKeyboard = bIsSelected ? mKeyboardTexts.rowDeselect : mKeyboardTexts.rowSelect;
@@ -1270,7 +1430,7 @@ sap.ui.define([
1270
1430
  });
1271
1431
 
1272
1432
  if ($TreeIcon) {
1273
- $TreeIcon.attr(ExtensionHelper.getAriaAttributesFor(this, AccExtension.ELEMENTTYPES.TREEICON, {row: oRow}));
1433
+ $TreeIcon.attr(ExtensionHelper.getAriaAttributesForTreeIcon(this, {row: oRow}));
1274
1434
  }
1275
1435
  };
1276
1436