UNPKG

@platform/ui.datagrid

Version:

Isolated tabular DataGrid.

139 lines (138 loc) 4.27 kB
import { coord, R, defaultValue, util, Schema } from '../../common'; export class Cell { constructor(args) { this._ = { table: undefined, td: undefined, }; this._.table = args.table; this.ns = args.ns; this.row = args.row; this.column = args.column; } static create(args) { return new Cell(args); } static createFromKey(args) { const { table, ns, cellKey } = args; const { row, column } = coord.cell.fromKey(cellKey); return new Cell({ table, ns, row, column }); } static toKey(args) { return coord.cell.toKey(args.column, args.row); } static fromKey(cellKey) { return coord.cell.fromKey(cellKey); } static toPosition(ref) { return typeof ref === 'string' ? Cell.fromKey(ref) : ref; } static toRangePositions(args) { const range = coord.range.fromKey(args.range); const start = range.left; const end = range.right; if (range.type === 'COLUMN') { start.row = 0; end.row = args.totalRows - 1; } if (range.type === 'ROW') { start.column = 0; end.column = args.totalColumns - 1; } return { start, end }; } static changeEvent(args) { const { cell, from, to } = args; const value = { from, to }; let isChanged; const payload = { cell, value, get isChanged() { return isChanged === undefined ? (isChanged = !R.equals(value.from, value.to)) : isChanged; }, isCancelled: false, isModified: false, cancel() { payload.isCancelled = true; }, modify(change) { value.to = change; payload.isModified = true; }, }; return payload; } get isDisposed() { return this._.table.isDestroyed; } get key() { const row = this.row; const column = this.column; return Cell.toKey({ column, row }); } get td() { this._.td = this._.td || this._.table.getCell(this.row, this.column); return this._.td; } get size() { const width = this.width; const height = this.height; return { width, height }; } get width() { return this.td.offsetWidth; } get height() { return this.td.offsetHeight; } get data() { const data = this._.table.getDataAtCell(this.row, this.column) || {}; if (typeof data === 'object') { const value = data.value; const props = data.props || {}; const error = data.error; return { value, props, error }; } else { return {}; } } get siblings() { const table = this._.table; const cell = this; const { ns, row, column } = cell; return { get left() { const column = cell.column - 1; return column < 0 ? undefined : Cell.create({ table, ns, row, column }); }, get right() { const column = cell.column + 1; return column > table.countCols() - 1 ? undefined : Cell.create({ table, ns, row, column }); }, get top() { const row = cell.row - 1; return row < 0 ? undefined : Cell.create({ table, ns, row, column }); }, get bottom() { const row = cell.row + 1; return row < 0 ? undefined : Cell.create({ table, ns, row, column }); }, }; } get rowspan() { return defaultValue(Cell.props(this.data.props).merge.rowspan, 1); } get colspan() { return defaultValue(Cell.props(this.data.props).merge.colspan, 1); } toString() { Schema.uri.create.cell(this.ns, this.key); } } Cell.isEmpty = util.cell.value.isEmptyCell; Cell.isEmptyProps = util.cell.value.isEmptyCellProps; Cell.isEmptyValue = util.cell.value.isEmptyCellValue; Cell.diff = util.cell.value.cellDiff; Cell.props = util.toGridCellProps;