UNPKG

@antv/s2

Version:

effective spreadsheet render core lib

219 lines 8.98 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CornerCell = void 0; const lodash_1 = require("lodash"); const constant_1 = require("../common/constant"); const interface_1 = require("../common/interface"); const node_1 = require("../common/interface/node"); const engine_1 = require("../engine"); const cell_1 = require("../utils/cell/cell"); const header_cell_1 = require("../utils/cell/header-cell"); const g_renders_1 = require("../utils/g-renders"); const resize_1 = require("../utils/interaction/resize"); const is_mobile_1 = require("../utils/is-mobile"); const header_cell_2 = require("./header-cell"); class CornerCell extends header_cell_2.HeaderCell { get cellType() { return constant_1.CellType.CORNER_CELL; } isBolderText() { const { cornerType } = this.meta; return cornerType === node_1.CornerNodeType.Col; } getBorderPositions() { return [interface_1.CellBorderPosition.TOP, interface_1.CellBorderPosition.LEFT]; } initCell() { super.initCell(); this.resetTextAndConditionIconShapes(); this.drawBackgroundShape(); this.drawInteractiveBgShape(); this.drawInteractiveBorderShape(); this.drawTextShape(); this.drawTreeIcon(); this.drawActionAndConditionIcons(); this.drawBorders(); this.drawResizeArea(); this.update(); } afterDrawText() { } onTreeIconClick(isCollapsed) { const { device } = this.spreadsheet.options; if ((0, is_mobile_1.isMobile)(device)) { return; } this.emitCollapseEvent(isCollapsed); } emitCollapseEvent(isCollapsed) { this.spreadsheet.facet.resetScrollY(); this.spreadsheet.emit(constant_1.S2Event.ROW_CELL_ALL_COLLAPSED__PRIVATE, isCollapsed); } /** * 绘制折叠展开的 icon */ drawTreeIcon() { var _a; if (!this.showTreeIcon()) { return; } const { collapseFields = {} } = (_a = this.spreadsheet.options.style) === null || _a === void 0 ? void 0 : _a.rowCell; const { size = 0 } = this.getStyle().icon; const { fill } = this.getTextStyle(); const area = this.getBBoxByType(interface_1.CellClipBox.CONTENT_BOX); const rootRowNodes = this.spreadsheet.facet.getRowNodes(0); // 任意一级节点的 icon 展开/收起, 同步更新角头 icon 的状态 const isAllCollapsed = (0, lodash_1.values)(collapseFields).filter(Boolean).length === rootRowNodes.length || rootRowNodes.every((node) => node.isCollapsed); const isCollapsed = isAllCollapsed; this.treeIcon = (0, g_renders_1.renderTreeIcon)({ group: this, iconCfg: { x: area.x, y: this.getIconPosition().y, width: size, height: size, fill, }, isCollapsed, onClick: () => { this.onTreeIconClick(isCollapsed); }, }); // 移动端, 点击热区为整个单元格 const { device } = this.spreadsheet.options; if ((0, is_mobile_1.isMobile)(device)) { this.addMobileTouchListener(() => { this.emitCollapseEvent(isCollapsed); }); } } isLastRowCornerCell() { const { cornerType, field } = this.meta; const { rows } = this.spreadsheet.dataSet.fields; return (cornerType === node_1.CornerNodeType.Row && (this.spreadsheet.isHierarchyTreeType() || (0, lodash_1.last)(rows) === field)); } getResizeAreaEffect() { const { cornerType } = this.meta; if (cornerType === node_1.CornerNodeType.Series) { return constant_1.ResizeAreaEffect.Series; } return this.isLastRowCornerCell() && this.spreadsheet.isHierarchyTreeType() ? constant_1.ResizeAreaEffect.Tree : constant_1.ResizeAreaEffect.Field; } drawResizeArea() { if (!this.shouldDrawResizeAreaByType('cornerCellHorizontal', this)) { return; } const resizeStyle = this.getResizeAreaStyle(); const resizeArea = (0, resize_1.getOrCreateResizeAreaGroupById)(this.spreadsheet, constant_1.KEY_GROUP_CORNER_RESIZE_AREA); if (!resizeArea) { return; } const { position, scrollX = 0, scrollY = 0, width: headerWidth, height: headerHeight, } = this.getHeaderConfig(); const { x, y, width, height } = this.getBBoxByType(); const { cornerType } = this.meta; const resizeAreaBBox = { x: x + width - resizeStyle.size, y, width: resizeStyle.size, height, }; const resizeClipAreaBBox = { x: 0, y: 0, width: headerWidth, height: headerHeight, }; if (cornerType === node_1.CornerNodeType.Col || !(0, resize_1.shouldAddResizeArea)(resizeAreaBBox, resizeClipAreaBBox, { scrollX, scrollY, })) { return; } /* * 将相对坐标映射到全局坐标系中 * 最后一个维度需要撑满角头高度 */ const offsetX = position.x + x - scrollX; const offsetY = position.y + (this.isLastRowCornerCell() ? 0 : y); const attrs = (0, resize_1.getResizeAreaAttrs)({ theme: resizeStyle, type: constant_1.ResizeDirectionType.Horizontal, effect: this.getResizeAreaEffect(), offsetX, offsetY, width, height, meta: this.meta, cell: this, }); resizeArea.appendChild(new engine_1.CustomRect({ style: Object.assign(Object.assign({}, attrs.style), { x: offsetX + width - resizeStyle.size, y: offsetY, height: this.isLastRowCornerCell() ? headerHeight : height }), }, attrs.appendInfo)); } showTreeIcon() { // 批量折叠或者展开的 icon,渲染在行头对应的角头中 return (this.spreadsheet.isHierarchyTreeType() && this.meta.cornerType === node_1.CornerNodeType.Row); } getTreeIconWidth() { const { size, margin } = this.getStyle().icon; return this.spreadsheet.isHierarchyTreeType() ? size + margin.right : 0; } getMaxTextWidth() { const { width } = this.getBBoxByType(interface_1.CellClipBox.CONTENT_BOX); return (width - this.getTreeIconWidth() - this.getActionAndConditionIconWidth()); } getContentPosition({ contentWidth = this.getActualTextWidth(), } = {}) { const contentBox = this.getBBoxByType(interface_1.CellClipBox.CONTENT_BOX); const { x, y, height, width } = contentBox; const textStyle = this.getTextStyle(); const { textX, leftIconX, rightIconX } = (0, cell_1.getHorizontalTextIconPosition)({ bbox: { x: x + this.getTreeIconWidth(), y, width: width - this.getTreeIconWidth(), height, }, textAlign: textStyle.textAlign, textWidth: contentWidth, groupedIcons: this.groupedIcons, iconStyle: this.getIconStyle(), }); const textY = (0, cell_1.getVerticalTextPosition)(contentBox, textStyle.textBaseline); const { size = 0 } = this.getStyle().icon; const iconY = (0, cell_1.getVerticalIconPosition)(size, textY, textStyle.fontSize, textStyle.textBaseline); this.leftIconPosition = { x: leftIconX, y: iconY, }; this.rightIconPosition = { x: rightIconX, y: iconY, }; return { x: textX, y: textY, }; } getTextPosition() { return this.getContentPosition(); } // CornerCell 不需要使用 formatter 进行格式化 getFormattedFieldValue() { return (0, header_cell_1.formattedFieldValue)(this.meta, this.spreadsheet.dataSet.getFieldName(this.meta.field)); } getResizedTextMaxLines() { var _a, _b, _c, _d, _e; // 角头和列头高度一致 const { colCell } = this.spreadsheet.options.style; return ((_d = (_b = (_a = colCell === null || colCell === void 0 ? void 0 : colCell.maxLinesByField) === null || _a === void 0 ? void 0 : _a[this.meta.id]) !== null && _b !== void 0 ? _b : (_c = colCell === null || colCell === void 0 ? void 0 : colCell.maxLinesByField) === null || _c === void 0 ? void 0 : _c[this.meta.field]) !== null && _d !== void 0 ? _d : this.getMaxLinesByCustomHeight({ isCustomHeight: (_e = this.meta.extra) === null || _e === void 0 ? void 0 : _e.isCustomHeight, })); } } exports.CornerCell = CornerCell; //# sourceMappingURL=corner-cell.js.map