devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
557 lines (553 loc) • 21.9 kB
JavaScript
/**
* DevExtreme (cjs/__internal/grids/pivot_grid/area_item/m_area_item.js)
* Version: 24.2.6
* Build date: Mon Mar 17 2025
*
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getRealElementWidth = exports.default = exports.AreaItem = void 0;
var _class = _interopRequireDefault(require("../../../../core/class"));
var _dom_adapter = _interopRequireDefault(require("../../../../core/dom_adapter"));
var _element = require("../../../../core/element");
var _renderer = _interopRequireDefault(require("../../../../core/renderer"));
var _extend = require("../../../../core/utils/extend");
var _position = require("../../../../core/utils/position");
var _size = require("../../../../core/utils/size");
var _style = require("../../../../core/utils/style");
var _type = require("../../../../core/utils/type");
var _scroll = require("../../../core/utils/scroll");
function _interopRequireDefault(e) {
return e && e.__esModule ? e : {
default: e
}
}
function _extends() {
return _extends = Object.assign ? Object.assign.bind() : function(n) {
for (var e = 1; e < arguments.length; e++) {
var t = arguments[e];
for (var r in t) {
({}).hasOwnProperty.call(t, r) && (n[r] = t[r])
}
}
return n
}, _extends.apply(null, arguments)
}
const PIVOTGRID_EXPAND_CLASS = "dx-expand";
const getRealElementWidth = function(element) {
let width = 0;
const {
offsetWidth: offsetWidth
} = element;
if (element.getBoundingClientRect) {
const clientRect = (0, _position.getBoundingRect)(element);
width = clientRect.width;
if (!width) {
width = clientRect.right - clientRect.left
}
if (width <= offsetWidth - 1) {
width = offsetWidth
}
}
return width > 0 ? width : offsetWidth
};
exports.getRealElementWidth = getRealElementWidth;
function getFakeTableOffset(scrollPos, elementOffset, tableSize, viewPortSize) {
let offset = 0;
let halfTableCount = 0;
const halfTableSize = tableSize / 2;
if (scrollPos + viewPortSize - (elementOffset + tableSize) > 1) {
if (scrollPos >= elementOffset + tableSize + halfTableSize) {
halfTableCount = parseInt((scrollPos - (elementOffset + tableSize)) / halfTableSize, 10)
}
offset = elementOffset + tableSize + halfTableSize * halfTableCount
} else if (scrollPos < elementOffset) {
if (scrollPos <= elementOffset - halfTableSize) {
halfTableCount = parseInt((scrollPos - (elementOffset - halfTableSize)) / halfTableSize, 10)
}
offset = elementOffset - (tableSize - halfTableSize * halfTableCount)
} else {
offset = elementOffset
}
return offset
}
const AreaItem = exports.AreaItem = _class.default.inherit({
ctor(component) {
this.component = component
},
option() {
return this.component.option.apply(this.component, arguments)
},
_getRowElement(index) {
const that = this;
if (that._tableElement && that._tableElement.length > 0) {
return that._tableElement[0].rows[index]
}
return null
},
_createGroupElement: () => (0, _renderer.default)("<div>"),
_createTableElement: () => (0, _renderer.default)("<table>"),
_getCellText(cell, encodeHtml) {
let cellText = cell.isWhiteSpace ? " " : cell.text || " ";
if (encodeHtml && (-1 !== cellText.indexOf("<") || -1 !== cellText.indexOf(">"))) {
cellText = (0, _renderer.default)("<div>").text(cellText).html()
}
return cellText
},
_getRowClassNames() {},
_applyCustomStyles(options) {
if (options.cell.width) {
options.cssArray.push(`min-width:${options.cell.width}px`)
}
if (options.cell.sorted) {
options.classArray.push("dx-pivotgrid-sorted")
}
},
_getMainElementMarkup: () => _dom_adapter.default.createElement("tbody"),
_getCloseMainElementMarkup: () => "</tbody>",
_renderTableContent(tableElement, data) {
const that = this;
const rowsCount = data.length;
let row;
let cell;
let i;
let j;
let cellText;
const rtlEnabled = that.option("rtlEnabled");
const encodeHtml = that.option("encodeHtml");
let rowClassNames;
tableElement.data("area", that._getAreaName());
tableElement.data("data", data);
tableElement.css("width", "");
const tbody = this._getMainElementMarkup();
for (i = 0; i < rowsCount; i += 1) {
row = data[i];
rowClassNames = [];
const tr = _dom_adapter.default.createElement("tr");
for (j = 0; j < row.length; j += 1) {
cell = row[j];
this._getRowClassNames(i, cell, rowClassNames);
const td = _dom_adapter.default.createElement("td");
if (cell) {
cell.rowspan && td.setAttribute("rowspan", cell.rowspan || 1);
cell.colspan && td.setAttribute("colspan", cell.colspan || 1);
const styleOptions = {
cellElement: undefined,
cell: cell,
cellsCount: row.length,
cellIndex: j,
rowElement: undefined,
rowIndex: i,
rowsCount: rowsCount,
rtlEnabled: rtlEnabled,
classArray: [],
cssArray: []
};
that._applyCustomStyles(styleOptions);
if (styleOptions.cssArray.length) {
(0, _style.setStyle)(td, styleOptions.cssArray.join(";"))
}
if (styleOptions.classArray.length) {
td.setAttribute("class", styleOptions.classArray.join(" "))
}
if ((0, _type.isDefined)(cell.expanded)) {
const div = _dom_adapter.default.createElement("div");
div.classList.add("dx-expand-icon-container");
const span = _dom_adapter.default.createElement("span");
span.classList.add("dx-expand");
div.appendChild(span);
td.appendChild(div)
}
cellText = this._getCellText(cell, encodeHtml)
} else {
cellText = ""
}
const span = _dom_adapter.default.createElement("span");
if ((0, _type.isDefined)(cell.wordWrapEnabled)) {
span.style.whiteSpace = cell.wordWrapEnabled ? "normal" : "nowrap"
}
span.innerHTML = cellText;
td.appendChild(span);
if (cell.sorted) {
const span = _dom_adapter.default.createElement("span");
span.classList.add("dx-icon-sorted");
td.appendChild(span)
}
tr.appendChild(td)
}
if (rowClassNames.length) {
tr.setAttribute("class", rowClassNames.join(" "))
}
tbody.appendChild(tr)
}
tableElement.append(tbody);
this._triggerOnCellPrepared(tableElement, data)
},
_triggerOnCellPrepared(tableElement, data) {
const that = this;
const rowElements = tableElement.find("tr");
const areaName = that._getAreaName();
const onCellPrepared = that.option("onCellPrepared");
const hasEvent = that.component._eventsStrategy.hasEvent("cellPrepared");
let rowElement;
let $cellElement;
let onCellPreparedArgs;
const defaultActionArgs = this.component._defaultActionArgs();
let row;
let cell;
let rowIndex;
let columnIndex;
if (onCellPrepared || hasEvent) {
for (rowIndex = 0; rowIndex < data.length; rowIndex += 1) {
row = data[rowIndex];
rowElement = rowElements.eq(rowIndex);
for (columnIndex = 0; columnIndex < row.length; columnIndex += 1) {
cell = row[columnIndex];
$cellElement = rowElement.children().eq(columnIndex);
onCellPreparedArgs = {
area: areaName,
rowIndex: rowIndex,
columnIndex: columnIndex,
cellElement: (0, _element.getPublicElement)($cellElement),
cell: cell
};
if (hasEvent) {
that.component._trigger("onCellPrepared", onCellPreparedArgs)
} else {
onCellPrepared((0, _extend.extend)(onCellPreparedArgs, defaultActionArgs))
}
}
}
}
},
_getRowHeight(index) {
const row = this._getRowElement(index);
let height = 0;
const {
offsetHeight: offsetHeight
} = row;
if (row && row.lastChild) {
if (row.getBoundingClientRect) {
const clientRect = (0, _position.getBoundingRect)(row);
height = clientRect.height;
if (height <= offsetHeight - 1) {
height = offsetHeight
}
}
return height > 0 ? height : offsetHeight
}
return 0
},
_setRowHeight(index, value) {
const row = this._getRowElement(index);
if (row) {
row.style.height = `${value}px`
}
},
getRowsLength() {
const that = this;
if (that._tableElement && that._tableElement.length > 0) {
return that._tableElement[0].rows.length
}
return 0
},
getRowsHeight() {
const that = this;
const result = [];
const rowsLength = that.getRowsLength();
for (let i = 0; i < rowsLength; i += 1) {
result.push(that._getRowHeight(i))
}
return result
},
setRowsHeight(values) {
const that = this;
let totalHeight = 0;
const valuesLength = values.length;
for (let i = 0; i < valuesLength; i += 1) {
totalHeight += values[i];
that._setRowHeight(i, values[i])
}
this._tableHeight = totalHeight;
this._tableElement[0].style.height = `${totalHeight}px`
},
getColumnsWidth() {
const rowsLength = this.getRowsLength();
let rowIndex;
let row;
let i;
let columnIndex;
const processedCells = [];
const result = [];
const fillCells = function(cells, rowIndex, columnIndex, rowSpan, colSpan) {
let rowOffset;
let columnOffset;
for (rowOffset = 0; rowOffset < rowSpan; rowOffset += 1) {
for (columnOffset = 0; columnOffset < colSpan; columnOffset += 1) {
cells[rowIndex + rowOffset] = cells[rowIndex + rowOffset] || [];
cells[rowIndex + rowOffset][columnIndex + columnOffset] = true
}
}
};
if (rowsLength) {
for (rowIndex = 0; rowIndex < rowsLength; rowIndex += 1) {
processedCells[rowIndex] = processedCells[rowIndex] || [];
row = this._getRowElement(rowIndex);
for (i = 0; i < row.cells.length; i += 1) {
for (columnIndex = 0; processedCells[rowIndex][columnIndex]; columnIndex += 1) {}
fillCells(processedCells, rowIndex, columnIndex, row.cells[i].rowSpan, row.cells[i].colSpan);
if (1 === row.cells[i].colSpan) {
result[columnIndex] = result[columnIndex] || getRealElementWidth(row.cells[i])
}
}
}
}
return result
},
setColumnsWidth(values) {
let i;
const tableElement = this._tableElement[0];
this._colgroupElement.html("");
const columnsCount = this.getColumnsCount();
const columnWidth = [];
for (i = 0; i < columnsCount; i += 1) {
columnWidth.push(values[i] || 0)
}
for (i = columnsCount; i < values.length && values; i += 1) {
columnWidth[columnsCount - 1] += values[i]
}
for (i = 0; i < columnsCount; i += 1) {
const col = _dom_adapter.default.createElement("col");
col.style.width = `${columnWidth[i]}px`;
this._colgroupElement.append(col)
}
this._tableWidth = columnWidth.reduce(((sum, width) => sum + width), 0);
tableElement.style.width = `${this._tableWidth}px`;
tableElement.style.tableLayout = "fixed"
},
resetColumnsWidth() {
(0, _size.setWidth)(this._colgroupElement.find("col"), "auto");
this._tableElement.css({
width: "",
tableLayout: ""
})
},
setGroupWidth(value) {
this._getScrollable().option("width", value)
},
setGroupHeight(value) {
this._getScrollable().option("height", value)
},
getGroupHeight() {
return this._getGroupElementSize("height")
},
getGroupWidth() {
return this._getGroupElementSize("width")
},
_getGroupElementSize(dimension) {
const size = this.groupElement()[0].style[dimension];
if (size.indexOf("px") > 0) {
return parseFloat(size)
}
return null
},
groupElement() {
return this._groupElement
},
tableElement() {
return this._tableElement
},
element() {
return this._rootElement
},
headElement() {
return this._tableElement.find("thead")
},
_setTableCss(styles) {
if (this.option("rtlEnabled")) {
styles.right = styles.left;
delete styles.left
}
this.tableElement().css(styles)
},
setVirtualContentParams(params) {
this._virtualContent.css({
width: params.width,
height: params.height
});
const scrollable = this._getScrollable();
if (null !== scrollable && void 0 !== scrollable && scrollable.isRenovated()) {
this._getScrollable().option("classes", "dx-virtual-mode")
} else {
this.groupElement().addClass("dx-virtual-mode")
}
},
disableVirtualMode() {
const scrollable = this._getScrollable();
if (null !== scrollable && void 0 !== scrollable && scrollable.isRenovated()) {
this._getScrollable().option("classes", "")
} else {
this.groupElement().removeClass("dx-virtual-mode")
}
},
_renderVirtualContent() {
const that = this;
if (!that._virtualContent && "virtual" === that.option("scrolling.mode")) {
that._virtualContent = (0, _renderer.default)("<div>").addClass("dx-virtual-content").insertBefore(that._tableElement)
}
},
reset() {
const tableElement = this._tableElement[0];
this._fakeTable && this._fakeTable.detach();
this._fakeTable = null;
this.disableVirtualMode();
this.setGroupWidth("100%");
this.setGroupHeight("auto");
this.resetColumnsWidth();
if (tableElement) {
for (let i = 0; i < tableElement.rows.length; i += 1) {
tableElement.rows[i].style.height = ""
}
tableElement.style.height = "";
tableElement.style.width = "100%"
}
},
_updateFakeTableVisibility() {
const that = this;
const tableElement = that.tableElement()[0];
const horizontalOffsetName = that.option("rtlEnabled") ? "right" : "left";
const fakeTableElement = that._fakeTable[0];
if (tableElement.style.top === fakeTableElement.style.top && fakeTableElement.style[horizontalOffsetName] === tableElement.style[horizontalOffsetName]) {
that._fakeTable.addClass("dx-hidden")
} else {
that._fakeTable.removeClass("dx-hidden")
}
},
_moveFakeTableHorizontally(scrollPos) {
const that = this;
const rtlEnabled = that.option("rtlEnabled");
const offsetStyleName = rtlEnabled ? "right" : "left";
const tableElementOffset = parseFloat(that.tableElement()[0].style[offsetStyleName]);
const offset = getFakeTableOffset(scrollPos, tableElementOffset, that._tableWidth, that.getGroupWidth());
if (parseFloat(that._fakeTable[0].style[offsetStyleName]) !== offset) {
that._fakeTable[0].style[offsetStyleName] = `${offset}px`
}
},
_moveFakeTableTop(scrollPos) {
const that = this;
const tableElementOffsetTop = parseFloat(that.tableElement()[0].style.top);
const offsetTop = getFakeTableOffset(scrollPos, tableElementOffsetTop, that._tableHeight, that.getGroupHeight());
if (parseFloat(that._fakeTable[0].style.top) !== offsetTop) {
that._fakeTable[0].style.top = `${offsetTop}px`
}
},
_moveFakeTable() {
this._updateFakeTableVisibility()
},
_createFakeTable() {
const that = this;
if (!that._fakeTable) {
that._fakeTable = that.tableElement().clone().addClass("dx-pivot-grid-fake-table").appendTo(that._virtualContent)
}
},
render(rootElement, data) {
const that = this;
if (that._tableElement) {
try {
that._tableElement[0].innerHTML = ""
} catch (e) {
that._tableElement.empty()
}
that._tableElement.removeAttr("style")
} else {
that._groupElement = that._createGroupElement();
that._tableElement = that._createTableElement();
that._tableElement.appendTo(that._groupElement);
that._groupElement.appendTo(rootElement);
that._rootElement = rootElement
}
that._colgroupElement = (0, _renderer.default)("<colgroup>").appendTo(that._tableElement);
that._renderTableContent(that._tableElement, data);
that._renderVirtualContent()
},
_getScrollable() {
return this.groupElement().data("dxScrollable")
},
_getMemoizeScrollTo() {
this._memoizeScrollTo = this._memoizeScrollTo ?? (0, _scroll.getMemoizeScrollTo)((() => this._getScrollable()));
return this._memoizeScrollTo
},
_getMaxLeftOffset(scrollable) {
const containerElement = (0, _renderer.default)(scrollable.container()).get(0);
return containerElement.scrollWidth - containerElement.clientWidth
},
on(eventName, handler) {
const that = this;
const scrollable = that._getScrollable();
if (scrollable) {
scrollable.on(eventName, (e => {
if (that.option("rtlEnabled") && (0, _type.isDefined)(e.scrollOffset.left)) {
e.scrollOffset.left = that._getMaxLeftOffset(scrollable) - e.scrollOffset.left
}
handler(e)
}))
}
return this
},
off(eventName) {
const scrollable = this._getScrollable();
if (scrollable) {
scrollable.off(eventName)
}
return this
},
scrollTo(pos) {
let force = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : false;
const scrollable = this._getScrollable();
if (!scrollable) {
return
}
const rtlEnabled = this.option("rtlEnabled");
const areaName = this._getAreaName();
const scrollablePos = _extends({}, pos, {
left: rtlEnabled && ("column" === areaName || "data" === areaName) ? this._getMaxLeftOffset(scrollable) - pos.left : pos.left
});
const memoizeScrollTo = this._getMemoizeScrollTo();
memoizeScrollTo(scrollablePos, force);
if (this._virtualContent) {
this._createFakeTable();
this._moveFakeTable(pos)
}
},
updateScrollable() {
const scrollable = this._getScrollable();
if (scrollable) {
return scrollable.update()
}
return
},
getColumnsCount() {
let columnCount = 0;
const row = this._getRowElement(0);
let cells;
if (row) {
cells = row.cells;
for (let i = 0, len = cells.length; i < len; ++i) {
columnCount += cells[i].colSpan
}
}
return columnCount
},
getData() {
const tableElement = this._tableElement;
return tableElement ? tableElement.data("data") : []
}
});
var _default = exports.default = {
AreaItem: AreaItem,
getRealElementWidth: getRealElementWidth
};