UNPKG

apex4x

Version:

The Comprehensive ARIA Development Suite

1,251 lines (1,139 loc) 75.3 kB
/*@license ARIA Grid Module 2.0 for Apex 4X Author: Bryan Garaventa (https://www.linkedin.com/in/bgaraventa) Home: WhatSock.com : Download: https://github.com/whatsock/apex License: MIT (https://opensource.org/licenses/MIT) */ (function () { var baseId = "grid" + $A.genId(), gridInc = 1; if (!("Grid" in $A)) $A.extend({ Grid: function (container) { var that = this, container = typeof container === "string" ? $A.get(container) : container, isArray = function (v) { return ( v && typeof v === "object" && typeof v.length === "number" && typeof v.splice === "function" && !v.propertyIsEnumerable("length") ); }, config = { gridClass: "data-grid", gridReadOnlyClass: "data-grid-readonly", cellReadOnlyClass: "data-grid-cell-readonly", gridEditableClass: "data-grid-editable", gridSelectableClass: "data-grid-selectable", gridRowClass: "data-grid-row", gridCellClass: "data-grid-cell", gridCellToggleClass: "data-grid-cell-toggle", gridCellTogglePressedClass: "data-grid-cell-toggle-pressed", gridCellLinkClass: "data-grid-cell-link", gridRowFocusedClass: "data-grid-row-focused", gridCellFocusedClass: "data-grid-cell-focused", editFieldClass: "data-grid-cell-link-edit", edit: false, colHeaders: { map: [], }, rowHeaders: { enabled: false, id: null, }, page: { row: { max: 0, collectionMap: [], collection: {}, toggleButtonRole: "Toggle Button", toggleButtonState: "Pressed", disabledText: "Disabled", editLinkAction: "Editable", build: function (rowObject) { gridInc++; var bid = baseId + "tr" + gridInc; rowObject.rowNodeId = bid; rowObject.rowNode = $A.create( "tr", { role: "row", id: bid, }, null, config.gridRowClass, ); for (id in rowObject.cells) { gridInc++; var cid = baseId + "td" + gridInc; rowObject.cells[id].id = id; rowObject.cells[id].cellNodeId = cid; rowObject.cells[id].data = {}; rowObject.cells[id].cellNode = $A.create( "td", { id: cid, }, null, config.gridCellClass, ); config.page.row.bindCell( rowObject.cells[id], rowObject.cells[id].cellNode, rowObject, rowObject.rowNode, ); rowObject.cells[id].cellNodeA = $A.create( "strong", { id: cid + "a", }, null, rowObject.cells[id].type == "toggle" ? config.gridCellToggleClass : config.gridCellLinkClass, ); rowObject.cells[id].cellNodeS1 = $A.create("span"); rowObject.cells[id].cellNodeS2 = $A.create( "span", null, $A.sraCSS, ); rowObject.cells[id].cellNodeS3 = $A.create( "span", null, $A.sraCSS, ); rowObject.cells[id].cellNode.appendChild( rowObject.cells[id].cellNodeA, ); rowObject.cells[id].cellNodeA.appendChild( rowObject.cells[id].cellNodeS1, ); rowObject.cells[id].cellNodeA.appendChild( rowObject.cells[id].cellNodeS2, ); rowObject.cells[id].cellNodeA.appendChild( rowObject.cells[id].cellNodeS3, ); rowObject.cells[id].rowObject = rowObject; $A.data(rowObject.cells[id].cellNode, "celldata", { rowId: rowObject.id, rowNodeId: rowObject.rowNodeId, cellId: id, cellNodeId: rowObject.cells[id].cellNodeId, }); } $A.data(rowObject.rowNode, "rowdata", { rowId: rowObject.id, rowNodeId: rowObject.rowNodeId, }); }, trackPos: { row: 0, col: 0, }, resetPos: function (cellNode) { var d = $A.data(cellNode, "celldata"); config.page.row.trackPos.row = $A.inArray(d.rowId, config.page.rendered) || 0; for (var i = 0; i < config.colHeaders.map.length; i++) { if (d.cellId == config.colHeaders.map[i].id) { config.page.row.trackPos.col = i; break; } } return d; }, dblClickTitle: "Click to activate", editFieldTitle: "Press Enter to save, or Escape to cancel.", cellOffset: function (cellObject) { return $A.offset(cellObject.cellNodeA); }, bindCell: function (cellObject, cellNode, rowObject, rowNode) { var trigger = function () { cellNode = cellObject.cellNode; rowObject = cellObject.rowObject; rowNode = cellObject.rowObject.rowNode; if (config.edit && !cellObject.readonly) { if (cellObject.type == "toggle") { config.page.row.changed( cellNode, cellObject, cellObject.value ? false : true, ); } else { if (config.page.row.editFieldActive) clearEdit(); config.page.row.editFieldActive = cellObject; $A.on(config.page.row.editField, { "keydown.gridcontrol": function (ev) { var k = ev.which || ev.keyCode; if (k == 13 || k == 27 || k == 9) { ev.preventDefault(); ev.stopPropagation(); if (k == 13) config.page.row.changed( cellNode, config.page.row.editFieldActive, this.value, ); clearEdit(true); } }, "blur.gridcontrol": function (ev) { ev.preventDefault(); }, }); config.page.row.editField.value = cellObject.value; $A.setAttr(config.page.row.editField, { title: config.page.row.editFieldTitle, }); $A.loop( document.body.children, function (i, o) { $A.setAttr(o, "aria-hidden", "true"); }, "array", ); document.body.appendChild( config.page.row.editFieldDiv, ); $A.css( config.page.row.editFieldDiv, config.page.row.cellOffset(cellObject), ); config.page.row.editField.focus(); if ( config.page.row.editLoad && typeof config.page.row.editLoad === "function" ) config.page.row.editLoad.apply( config.page.row.editField, [config.page.row.editField, cellObject], ); } } else if (config.page.row.selectEnabled) { var wasSelected = rowObject.selected; if (!config.page.row.multiSelect) config.page.row.unselectAll(); if (!wasSelected || config.page.row.multiSelect) config.page.row.select(cellObject); if (!config.page.row.ariaSelect) $A.announce(cellObject.cellNode); } }, nav = function (k, ev) { cellNode = cellObject.cellNode; rowObject = cellObject.rowObject; rowNode = cellObject.rowObject.rowNode; // PageUp 33 // PageDown 34 // End 35 // Home 36 // Left 37 // Up 38 // Right 39 // Down 40 if (k == 33) { if (pressed.alt) config.page.first(cellObject, rowObject); else config.page.prev(cellObject, rowObject); } else if (k == 34) { if (pressed.alt) config.page.last(cellObject, rowObject); else config.page.next(cellObject, rowObject); } else if (k >= 35 && k <= 40) { var move = false, rowMax = config.page.rendered.length - 1, colMax = config.colHeaders.map.length - 1; if ( k == 35 && pressed.ctrl && config.page.current < config.page.total ) { config.page.last(cellObject, rowObject, true); return; } else if ( k == 35 && pressed.ctrl && config.page.current == config.page.total ) { config.page.row.trackPos.row = rowMax; move = true; } else if ( k == 35 && config.page.row.trackPos.col < colMax ) { config.page.row.trackPos.col = colMax; move = true; } else if ( k == 36 && pressed.ctrl && config.page.current > 1 ) { config.page.first(cellObject, rowObject); return; } else if ( k == 36 && pressed.ctrl && config.page.current == 1 ) { config.page.row.trackPos.row = 0; move = true; } else if ( k == 36 && config.page.row.trackPos.col > 0 ) { config.page.row.trackPos.col = 0; move = true; } else if ( k == 37 && config.page.row.trackPos.col > 0 ) { config.page.row.trackPos.col -= 1; move = true; } else if ( k == 38 && config.page.row.trackPos.row > 0 && pressed.alt ) { config.page.row.trackPos.row = 0; move = true; } else if ( k == 38 && config.page.row.trackPos.row > 0 ) { config.page.row.trackPos.row -= 1; move = true; } else if ( k == 38 && config.page.row.trackPos.row == 0 ) { config.page.prev(cellObject, rowObject, true); return; } else if ( k == 39 && config.page.row.trackPos.col < colMax ) { config.page.row.trackPos.col += 1; move = true; } else if ( k == 40 && config.page.row.trackPos.row < rowMax && pressed.alt ) { config.page.row.trackPos.row = rowMax; move = true; } else if ( k == 40 && config.page.row.trackPos.row < rowMax ) { config.page.row.trackPos.row += 1; move = true; } else if ( k == 40 && config.page.row.trackPos.row >= rowMax ) { config.page.next(cellObject, rowObject); return; } if (move) { config.page.row.move({ rowId: config.page.rendered[ config.page.row.trackPos.row ], cellId: config.colHeaders.map[ config.page.row.trackPos.col ].id, }); } } }; var pressed = { ctrl: false, alt: false, }; $A.on(cellNode, { "click.gridcontrol": function (ev) { var t = ev.srcElement || ev.target; if (t != this || this != config.page.row.focusedCell) config.page.row.move(config.page.row.resetPos(this)); if ( "ontouchstart" in window || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0 ) { cellObject = getCellObject(this); trigger(); } ev.preventDefault(); }, "dblclick.gridcontrol": function (ev) { if (useDblClick) { if (this != config.page.row.focusedCell) config.page.row.move(config.page.row.resetPos(this)); if ( !( "ontouchstart" in window || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0 ) ) { cellObject = getCellObject(this); trigger(); } ev.stopPropagation(); ev.preventDefault(); } }, "mouseup.gridcontrol": function (ev) { if (!useDblClick) { if (!ev.which && ev.button && ev.button & 1) ev.which = 1; if (ev.which === 1) { if (this != config.page.row.focusedCell) config.page.row.move( config.page.row.resetPos(this), ); if ( !( "ontouchstart" in window || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0 ) ) { cellObject = getCellObject(this); trigger(); } ev.stopPropagation(); ev.preventDefault(); } } }, "keydown.gridcontrol": function (ev) { var k = ev.which || ev.keyCode; pressed.ctrl = ev.ctrlKey; pressed.alt = ev.altKey; if ( (k >= 33 && k <= 40) || k == 13 || k == 32 || k == 46 || k == 65 ) { cellObject = getCellObject(this); if (k == 13 || k == 32) { if (k == 32 && pressed.ctrl) { var str = ""; for ( var i = 0; i < config.colHeaders.map.length; i++ ) { var o = config.colHeaders.map[i]; str += $A.getText( cellObject.rowObject.cells[o.id].cellNode, ) + ", "; } $A.announce(str); } else trigger(); } else if (k >= 33 && k <= 40) nav(k, ev); else if (k == 46 && config.page.row.deleteRow.enabled) { config.page.row.deleteRow.callback(); config.page.row.move(); } else if ( k == 65 && pressed.ctrl && config.page.row.selectEnabled ) { config.page.row.selectAll(); $A.announce(config.page.row.selectState); } ev.stopPropagation(); ev.preventDefault(); } }, "keyup.gridcontrol": function (ev) { pressed.ctrl = false; pressed.alt = false; }, "focus.gridcontrol": function (ev) { cellObject = getCellObject(this); $A.addClass(this, config.gridCellFocusedClass); $A.addClass( cellObject.rowObject.rowNode, config.gridRowFocusedClass, ); if (this != config.page.row.focusedCell) config.page.row.move( config.page.row.resetPos(this), true, ); }, "blur.gridcontrol": function (ev) { $A.query( "tr." + config.gridRowFocusedClass + ", td." + config.gridCellFocusedClass, config.dc.container, function (i, o) { $A.remClass( o, config.gridRowFocusedClass + " " + config.gridCellFocusedClass, ); }, ); }, }); }, clean: function (rowObject, keepData) { $A.remAttr(rowObject.rowNode, [ "title", "aria-selected", "aria-rowindex", ]); $A.remClass( rowObject.rowNode, config.gridRowFocusedClass + " " + config.page.row.selectClass, ); if (!keepData) $A.removeData(rowObject.rowNode, "rowdata"); for (var n in rowObject.cells) { $A.remAttr(rowObject.cells[n].cellNode, [ "aria-activedescendant", "aria-labelledby", "aria-describedby", "tabindex", "aria-colindex", "aria-selected", "aria-readonly", ]); $A.remClass( rowObject.cells[n].cellNode, config.cellReadOnlyClass + " " + config.gridCellFocusedClass + " " + (rowObject.cells[n].toggleClass || config.gridCellTogglePressedClass), ); $A.remAttr(rowObject.cells[n].cellNodeA, [ "title", "role", "aria-pressed", "aria-disabled", ]); rowObject.cells[n].cellNodeS1.innerHTML = ""; rowObject.cells[n].cellNodeS2.innerHTML = ""; rowObject.cells[n].cellNodeS3.innerHTML = ""; if (!keepData) $A.removeData(rowObject.cells[n].cellNode, "celldata"); } }, changed: function (cellNode, cellObject, val) { var ret = config.page.row.changed.cb && typeof config.page.row.changed.cb === "function" ? config.page.row.changed.cb.apply(cellNode, [ cellObject, val, cellObject.rowObject, that, ]) : true; if (typeof ret !== "boolean") ret = true; if (ret) { config.page.row.update( cellObject.rowObject.id, cellObject.id, val, ); } }, selectEnabled: false, selectState: "Selected", selectClass: "selected", multiSelect: false, preserveSelect: false, ariaSelect: true, selected: [], select: function (cellObject, sv) { var newVal = sv || (cellObject.rowObject.selected ? false : true), ret = config.page.row.select.cb && typeof config.page.row.select.cb === "function" ? config.page.row.select.cb.apply( cellObject.rowObject.rowNode, [ cellObject.rowObject, newVal, config.page.row.selected, that, ], ) : true; if (typeof ret !== "boolean") ret = true; if (ret) { cellObject.rowObject.selected = newVal; var found = false; for ( var i = config.page.row.selected.length - 1; i >= 0; i-- ) { if ( config.page.row.selected[i] === cellObject.rowObject.id && !cellObject.rowObject.selected ) config.page.row.selected.splice(i, 1); else if ( config.page.row.selected[i] === cellObject.rowObject.id && cellObject.rowObject.selected ) found = true; } if (!found && cellObject.rowObject.selected) config.page.row.selected.push(cellObject.rowObject.id); var isR = $A.inArray( cellObject.rowObject.id, config.page.rendered, ) !== -1; if (isR) { var altTxt = ""; if (cellObject.rowObject.selected) { $A.addClass( cellObject.rowObject.rowNode, config.page.row.selectClass, ); altTxt = config.page.row.selectState ? config.page.row.selectState + ". " : ""; } else { $A.remClass( cellObject.rowObject.rowNode, config.page.row.selectClass, ); } altTxt += config.page.row.dblClickTitle; $A.setAttr(cellObject.rowObject.rowNode, "title", altTxt); if (config.page.row.ariaSelect) $A.setAttr( cellObject.rowObject.rowNode, "aria-selected", cellObject.rowObject.selected ? "true" : "false", ); for (var i = 0; i < config.colHeaders.map.length; i++) { if (config.page.row.ariaSelect) $A.setAttr( cellObject.rowObject.cells[ config.colHeaders.map[i].id ].cellNode, "aria-selected", cellObject.rowObject.selected ? "true" : "false", ); else cellObject.rowObject.cells[ config.colHeaders.map[i].id ].cellNodeS3.innerHTML = cellObject.rowObject.selected ? "<span>&nbsp;" + formatStr(config.page.row.selectState) + "</span>" : ""; } } } }, unselectAll: function () { for ( var i = config.page.row.selected.length - 1; i >= 0; i-- ) { var rowId = config.page.row.selected[i]; config.page.row.select( config.page.row.collection[rowId].cells[ config.colHeaders.map[0].id ], false, ); config.page.row.selected.splice(i, 1); } }, selectAll: function () { if ( config.page.row.selectEnabled && config.page.row.multiSelect ) { if (!config.page.row.preserveSelect) config.page.row.unselectAll(); for (var i = 0; i < config.page.rendered.length; i++) { config.page.row.select( config.page.row.collection[config.page.rendered[i]] .cells[config.colHeaders.map[0].id], true, ); } } }, deleteRow: { enabled: false, callback: function (ids) { var rt = config.page.row.deleteRow.callback.runBefore && typeof config.page.row.deleteRow.callback.runBefore === "function" ? config.page.row.deleteRow.callback.runBefore.apply( that, [ ids && ids.length ? ids : config.page.row.selected, ], ) : true; if (typeof rt !== "boolean") rt = true; if (!rt) return false; var deleted = []; if (ids && ids.length) { config.page.row.unselectAll(); for (var i = 0; i < ids.length; i++) { if ( config.page.row.collection[ids[i]] && config.page.row.collection[ids[i]].cells ) config.page.row.selected.push(ids[i]); } } var si = config.page.row.selected.length; for ( var i = config.page.row.selected.length - 1; i >= 0; i-- ) { var rowObject = config.page.row.collection[ config.page.row.selected[i] ], pos = $A.inArray( rowObject.id, config.page.row.collectionMap, ); if (pos !== -1) { var ret = config.page.row.deleteRow.callback.cb && typeof config.page.row.deleteRow.callback.cb === "function" ? config.page.row.deleteRow.callback.cb.apply( rowObject.rowNode, [rowObject, that], ) : true; if (typeof ret !== "boolean") ret = true; if (ret) { deleted.push(rowObject.id); config.page.row.clean(rowObject); for (var n in rowObject.cells) { $A.remove(rowObject.cells[n].cellNode); } $A.remove(rowObject.rowNode); var isR = $A.inArray( rowObject.id, config.page.rendered, ); if (isR !== -1) config.page.rendered.splice(isR, 1); config.page.row.selected.splice(i, 1); config.page.row.collectionMap.splice(pos, 1); delete config.page.row.collection[rowObject.id]; } } } if (si != config.page.row.selected.length) { config.page.row.trackPos.row = 0; config.page.sync(); config.page.open(config.page.current); if ( config.page.row.deleteRow.callback.runAfter && typeof config.page.row.deleteRow.callback.runAfter === "function" ) config.page.row.deleteRow.callback.runAfter.apply( that, [deleted], ); return true; } return false; }, }, update: function (rowId, cellId, val, silent) { if ( !config.page.row.collection[rowId] || !config.page.row.collection[rowId].cells[cellId] ) return; var cellObject = config.page.row.collection[rowId].cells[cellId], type = cellObject.type; config.page.row.collection[rowId].cells[cellId].value = type == "toggle" ? (val ? true : false) : val; var inA = $A.inArray(rowId, config.page.rendered); if (inA !== -1) { if (type == "toggle") { var accText = "&nbsp;" + formatStr(config.page.row.toggleButtonRole); if (val) { $A.setAttr(cellObject.cellNodeA, { "aria-describedby": $A.getAttr( cellObject.cellNode, "aria-describedby", ), role: "button", "aria-pressed": "true", }); $A.addClass( cellObject.cellNodeA, cellObject.toggleClass || config.gridCellTogglePressedClass, ); accText += "&nbsp;" + formatStr(config.page.row.toggleButtonState); } else { $A.setAttr(cellObject.cellNodeA, { "aria-describedby": $A.getAttr( cellObject.cellNode, "aria-describedby", ), role: "button", "aria-pressed": "false", }); $A.remClass( cellObject.cellNodeA, cellObject.toggleClass || config.gridCellTogglePressedClass, ); } if ( cellObject.readonly || config.page.row.selectEnabled || !config.edit ) // accText += '&nbsp;' + formatStr(config.page.row.disabledText); $A.setAttr( cellObject.cellNodeA, "aria-disabled", "true", ); // cellObject.cellNodeS2.innerHTML = '<span>' + accText + '</span>'; } else { cellObject.cellNodeS1.innerHTML = "<span>" + formatStr(val) + "</span>"; } if (!silent) $A.announce(cellObject.cellNodeA); } }, focusedCell: null, move: function (o, s) { if (!o && config.page.row.focusedCell) { setTimeout(function () { config.page.row.focusedCell.focus(); }, 1); return; } var oldCell = config.page.row.focusedCell, newCell = config.page.row.collection[o.rowId].cells[o.cellId] .cellNode; if (oldCell && oldCell != newCell) $A.setAttr(oldCell, "tabindex", "-1"); config.page.row.focusedCell = newCell; config.page.row.resetPos(newCell); $A.setAttr(newCell, "tabindex", "0"); if (!s) newCell.focus(); if ( config.page.row.move.cb && typeof config.page.row.move.cb === "function" ) config.page.row.move.cb.apply(newCell, [ newCell, oldCell, config.dc, that, ]); }, }, pageRole: "Page", current: 1, total: 1, sync: function (n) { var prevC = config.page.current, prevT = config.page.total; if ( !config.page.row.max || !config.page.row.collectionMap.length ) { config.page.current = config.page.total = 1; } else { var rMax = config.page.row.max, tRows = config.page.row.collectionMap.length; if (rMax >= tRows) config.page.current = config.page.total = 1; else { var p = Math.ceil(tRows / rMax); config.page.total = p; if (config.page.current > p) config.page.current = p; } } var r = []; if (n) { if (n > config.page.row.total) n = config.page.row.total; var g = (n - 1) * config.page.row.max, l = g + config.page.row.max; config.page.current = n; if (!config.page.row.max) l = config.page.row.collectionMap.length; for (var u = g; u < l; u++) { var rowId = config.page.row.collectionMap[u]; if (!(isNaN(rowId) && !rowId)) { config.page.row.collection[rowId].rowIndex = u + 1; r.push(rowId); } } } if ( prevC != config.page.current || prevT != config.page.total ) { if ( config.page.indexChanged && typeof config.page.indexChanged === "function" ) config.page.indexChanged.apply(that, [ config.page.current, config.page.total, that, ]); } if (n) return r; }, on: { open: null, close: null, change: null, add: null, rem: null, }, open: function (n, reOpen) { if (config.page.row.editFieldActive) clearEdit(true, true); if (isNaN(n) || n < 1) n = 1; if (reOpen && config.dc.loaded) config.page.close(); var isLoaded = config.dc.loaded; if (!isLoaded) config.dc.render(); config.page.render(config.page.sync(n)); if ( !isLoaded && config.page.on.open && typeof config.page.on.open === "function" ) config.page.on.open.apply(container, [ container, config.dc, that, ]); }, close: function () { if (config.page.row.editFieldActive) clearEdit(true, true); if ( config.page.on.close && typeof config.page.on.close === "function" ) config.page.on.close.apply(container, [ container, config.dc, that, ]); config.page.row.unselectAll(); config.page.removeRendered(); config.dc.remove(); }, rendered: [], removeRendered: function () { if (!config.page.row.preserveSelect) config.page.row.unselectAll(); for (var i = 0; i < config.page.rendered.length; i++) { var id = config.page.rendered[i], rowObject = config.page.row.collection[id]; config.page.row.clean(rowObject, true); if ( config.page.on.rem && typeof config.page.on.rem === "function" ) config.page.on.rem.apply(rowObject.rowNode, [ rowObject, config.dc, that, ]); for (var n in rowObject.cells) { if (rowObject.cells[n].cellNode.parentNode) rowObject.cells[n].cellNode.parentNode.removeChild( rowObject.cells[n].cellNode, ); } rowObject.rowNode.parentNode.removeChild(rowObject.rowNode); } config.page.rendered = []; }, render: function (ids) { if (config.page.row.editFieldActive) clearEdit(true, true); if (config.page.row.selectEnabled && config.edit) config.edit = false; if (!config.dc.loaded) return; if (config.page.rendered.length) config.page.removeRendered(); config.page.rendered = ids; var initPos = {}, aoIds = []; for (var h = 0; h < ids.length; h++) { gridInc++; var tr = config.page.row.collection[ids[h]].rowNode, colIndex = 1, selected = config.page.row.collection[ids[h]].selected, altTxt = selected ? config.page.row.selectState + ". " : ""; $A.addClass(tr, config.gridRowClass); aoIds.push(config.page.row.collection[ids[h]].rowNodeId); if (config.page.row.selectEnabled) { $A.setAttr(tr, { title: altTxt + config.page.row.dblClickTitle, }); if (config.page.row.ariaSelect) $A.setAttr(tr, { "aria-selected": selected ? "true" : "false", }); if (selected) { $A.addClass(tr, config.page.row.selectClass); } } $A.setAttr( tr, "aria-rowindex", config.page.row.collection[ids[h]].rowIndex, ); var aoIds2 = []; for (var i = 0; i < config.colHeaders.map.length; i++) { gridInc++; var o = config.colHeaders.map[i], cellObject = config.page.row.collection[ids[h]].cells[o.id]; $A.addClass(cellObject.cellNode, config.gridCellClass); aoIds2.push(cellObject.cellNodeId); if (o.colClass) $A.addClass(cellObject.cellNode, o.colClass); $A.setAttr(cellObject.cellNode, { role: "gridcell", "aria-colindex": colIndex, "aria-labelledby": cellObject.cellNodeId + "a", "aria-describedby": config.rowHeaders.enabled && config.rowHeaders.id && config.rowHeaders.id != cellObject.id && cellObject.rowObject.cells[config.rowHeaders.id] ? cellObject.rowObject.cells[config.rowHeaders.id] .cellNodeId + " " + o.thId : o.thId, tabindex: "-1", }); if ( cellObject.type == "toggle" || (config.edit && !cellObject.readonly) ) $A.setAttr(cellObject.cellNode, { "aria-activedescendant": cellObject.cellNodeId + "a", }); if ( config.rowHeaders.enabled && config.rowHeaders.id && config.rowHeaders.id == cellObject.id ) $A.setAttr(cellObject.cellNode, { role: "rowheader", scope: "row", }); if (config.page.row.selectEnabled) { if ( cellObject.type == "toggle" && (config.page.row.toggleButtonRole || config.page.row.toggleButtonState) ) { var altTxt = cellObject.value ? config.page.row.toggleButtonRole + " " + config.page.row.toggleButtonState : config.page.row.toggleButtonRole; $A.setAttr(cellObject.cellNodeA, "title", altTxt); } if (config.page.row.ariaSelect) $A.setAttr( cellObject.cellNode, "aria-selected", selected ? "true" : "false", ); else if (selected) cellObject.cellNodeS3.innerHTML = selected ? "<span>&nbsp;" + formatStr(config.page.row.selectState) + "</span>" : ""; } else if (config.edit && !cellObject.readonly) { var altTxt = ""; if ( cellObject.type == "toggle" && (config.page.row.toggleButtonRole || config.page.row.toggleButtonState) ) { altTxt = cellObject.value ? config.page.row.toggleButtonRole + " " + config.page.row.toggleButtonState : config.page.row.toggleButtonRole; altTxt += ". "; } else if (config.page.row.editLinkAction) { altTxt = config.page.row.editLinkAction + ". "; } $A.setAttr( cellObject.cellNodeA, "title", altTxt + config.page.row.dblClickTitle, ); } else if ( cellObject.type == "toggle" && (config.page.row.toggleButtonRole || config.page.row.toggleButtonState) ) { var altTxt = cellObject.value ? config.page.row.toggleButtonRole + " " + config.page.row.toggleButtonState : config.page.row.toggleButtonRole; $A.setAttr(cellObject.cellNodeA, "title", altTxt); } if ( h === config.page.row.trackPos.row && i === config.page.row.trackPos.col ) initPos = { rowId: ids[h],