cx 24.4.3 → 24.4.5

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.
package/dist/util.js CHANGED
@@ -244,6 +244,12 @@ var formatFactory = {
244
244
  };
245
245
  }
246
246
  },
247
+ zeroPad: function zeroPad(part0, length) {
248
+ return function (value) {
249
+ var s = String(value);
250
+ return s.padStart(length, "0");
251
+ };
252
+ },
247
253
  };
248
254
  formatFactory.s = formatFactory.str = formatFactory.string;
249
255
  formatFactory.f = formatFactory.fixed;
@@ -253,6 +259,7 @@ formatFactory.ps = formatFactory.percentageSign;
253
259
  formatFactory.d = formatFactory.date;
254
260
  formatFactory.t = formatFactory.time;
255
261
  formatFactory.dt = formatFactory.datetime;
262
+ formatFactory.zeropad = formatFactory.zeroPad;
256
263
  function buildFormatter(format) {
257
264
  var formatter = defaultFormatter,
258
265
  nullText = "";
package/dist/widgets.js CHANGED
@@ -14951,6 +14951,7 @@ var GridCell = /*#__PURE__*/ (function (_PureContainer) {
14951
14951
  rowSpan: undefined,
14952
14952
  editable: undefined,
14953
14953
  fixed: undefined,
14954
+ mergeCells: undefined,
14954
14955
  },
14955
14956
  ]),
14956
14957
  );
@@ -14975,6 +14976,7 @@ var GridCell = /*#__PURE__*/ (function (_PureContainer) {
14975
14976
  editable: data.editable,
14976
14977
  }),
14977
14978
  (_this$CSS$state["aligned-" + this.align] = this.align),
14979
+ (_this$CSS$state.mergable = data.merged),
14978
14980
  _this$CSS$state),
14979
14981
  ),
14980
14982
  );
@@ -15002,6 +15004,7 @@ var GridCell = /*#__PURE__*/ (function (_PureContainer) {
15002
15004
  GridCell.prototype.pad = true;
15003
15005
  GridCell.prototype.styled = true;
15004
15006
  GridCell.prototype.fixed = false;
15007
+ GridCell.prototype.merged = false;
15005
15008
 
15006
15009
  var GridRowLine = /*#__PURE__*/ (function (_Container) {
15007
15010
  function GridRowLine() {
@@ -15107,7 +15110,9 @@ var GridRowComponent = /*#__PURE__*/ (function (_VDOM$Component) {
15107
15110
  className = _this$props.className,
15108
15111
  dragSource = _this$props.dragSource,
15109
15112
  instance = _this$props.instance,
15110
- record = _this$props.record;
15113
+ record = _this$props.record,
15114
+ useTrTag = _this$props.useTrTag,
15115
+ children = _this$props.children;
15111
15116
  var data = instance.data,
15112
15117
  widget = instance.widget;
15113
15118
  var CSS = widget.CSS;
@@ -15120,23 +15125,26 @@ var GridRowComponent = /*#__PURE__*/ (function (_VDOM$Component) {
15120
15125
  leave = this.onMouseLeave;
15121
15126
  }
15122
15127
  if (widget.onRowClick) keyDown = this.onKeyDown;
15123
- return /*#__PURE__*/ jsx("tbody", {
15124
- className: CSS.expand(data.classNames, className, this.state && this.state.hover && CSS.state("hover")),
15125
- style: data.style,
15126
- onClick: this.onClick,
15127
- onDoubleClick: this.onDoubleClick,
15128
- onTouchStart: this.onMouseDown,
15129
- onMouseDown: this.onMouseDown,
15130
- onTouchMove: move,
15131
- onMouseMove: move,
15132
- onMouseLeave: leave,
15133
- onTouchEnd: up,
15134
- onMouseUp: up,
15135
- onKeyDown: keyDown,
15136
- onContextMenu: this.onRowContextMenu,
15137
- "data-record-key": record.key,
15138
- children: this.props.children,
15139
- });
15128
+ return VDOM.createElement(
15129
+ useTrTag ? "tr" : "tbody",
15130
+ {
15131
+ className: CSS.expand(data.classNames, className, this.state && this.state.hover && CSS.state("hover")),
15132
+ style: data.style,
15133
+ onClick: this.onClick,
15134
+ onDoubleClick: this.onDoubleClick,
15135
+ onTouchStart: this.onMouseDown,
15136
+ onMouseDown: this.onMouseDown,
15137
+ onTouchMove: move,
15138
+ onMouseMove: move,
15139
+ onMouseLeave: leave,
15140
+ onTouchEnd: up,
15141
+ onMouseUp: up,
15142
+ onKeyDown: keyDown,
15143
+ onContextMenu: this.onRowContextMenu,
15144
+ "data-record-key": record.key,
15145
+ },
15146
+ children,
15147
+ );
15140
15148
  };
15141
15149
  _proto2.onMouseDown = function onMouseDown(e) {
15142
15150
  var _this$props2 = this.props,
@@ -15408,6 +15416,8 @@ var Grid = /*#__PURE__*/ (function (_Container) {
15408
15416
  };
15409
15417
  row.hasSortableColumns = false;
15410
15418
  row.hasResizableColumns = false;
15419
+ row.hasMergedCells = false;
15420
+ row.mergedColumns = [];
15411
15421
  var aggregates = {};
15412
15422
  var showFooter = false;
15413
15423
  var lines = [];
@@ -15424,8 +15434,20 @@ var Grid = /*#__PURE__*/ (function (_Container) {
15424
15434
  items: GridColumnHeaderLine.create(lines),
15425
15435
  });
15426
15436
  row.header.items.forEach(function (line) {
15427
- line.items.forEach(function (c) {
15437
+ line.items.forEach(function (c, index) {
15428
15438
  if (c.sortable) row.hasSortableColumns = true;
15439
+ if (c.mergeCells) {
15440
+ if (row.header.items.length > 1)
15441
+ Console.warn("Merged columns are only supported in grids in which rows have only one line of cells.");
15442
+ else {
15443
+ row.hasMergedCells = true;
15444
+ row.mergedColumns.push({
15445
+ uniqueColumnId: c.uniqueColumnId,
15446
+ index: index,
15447
+ mode: c.mergeCells,
15448
+ });
15449
+ }
15450
+ }
15429
15451
  if (
15430
15452
  c.resizable ||
15431
15453
  (c.header && c.header.resizable) ||
@@ -15863,13 +15885,14 @@ var Grid = /*#__PURE__*/ (function (_Container) {
15863
15885
  var headerRows = [];
15864
15886
  if (!header) return null;
15865
15887
  var skip = {};
15866
- header.children.forEach(function (line, lineIndex) {
15888
+ var lineIndex = 0;
15889
+ header.children.forEach(function (line) {
15867
15890
  var empty = [true, true, true];
15868
15891
  var result = [[], [], []];
15869
15892
  line.children.forEach(function (hdinst, colIndex) {
15870
15893
  var hdwidget = hdinst.widget;
15871
15894
  var _loop = function _loop(l) {
15872
- var colKey = lineIndex + "-" + colIndex + "-" + l;
15895
+ var colKey = lineIndex + l + "-" + colIndex;
15873
15896
  if (skip[colKey]) return 0; // continue
15874
15897
  if (Boolean(hdinst.data.fixed) != fixedColumns) return 0; // continue
15875
15898
  var header = hdinst.components["header" + (l + 1)];
@@ -15926,8 +15949,7 @@ var Grid = /*#__PURE__*/ (function (_Container) {
15926
15949
  colSpan = header.data.colSpan;
15927
15950
  rowSpan = header.data.rowSpan;
15928
15951
  for (var r = 0; r < header.data.rowSpan; r++)
15929
- for (var c = 0; c < header.data.colSpan; c++)
15930
- skip[lineIndex + "-" + (colIndex + c) + "-" + (l + r)] = true;
15952
+ for (var c = 0; c < header.data.colSpan; c++) skip[lineIndex + l + r + "-" + (colIndex + c)] = true;
15931
15953
  }
15932
15954
  if ((hdwidget.resizable || header.data.resizable) && header.data.colSpan < 2) {
15933
15955
  resizer = _this3.renderResizer(instance, hdinst, header, colIndex);
@@ -15995,6 +16017,7 @@ var Grid = /*#__PURE__*/ (function (_Container) {
15995
16017
  result = result.filter(function (_, i) {
15996
16018
  return !empty[i];
15997
16019
  });
16020
+ lineIndex += result.length;
15998
16021
  if (result[0]) {
15999
16022
  if (fixed && !fixedColumns) {
16000
16023
  result[0].push(
@@ -16345,9 +16368,7 @@ var Grid = /*#__PURE__*/ (function (_Container) {
16345
16368
  var record, g;
16346
16369
  for (var i = 0; i < records.length; i++) {
16347
16370
  record = records[i];
16348
- if (record.type == "data") {
16349
- record.vdom = record.row.render(context, record.key);
16350
- }
16371
+ if (record.type == "data") record.vdom = record.row.render(context, record.key);
16351
16372
  if (record.type == "group-header") {
16352
16373
  record.vdom = [];
16353
16374
  record.fixedVdom = [];
@@ -16607,7 +16628,8 @@ var GridComponent = /*#__PURE__*/ (function (_VDOM$Component) {
16607
16628
  var widget = instance.widget,
16608
16629
  isRecordSelectable = instance.isRecordSelectable,
16609
16630
  visibleColumns = instance.visibleColumns,
16610
- isRecordDraggable = instance.isRecordDraggable;
16631
+ isRecordDraggable = instance.isRecordDraggable,
16632
+ row = instance.row;
16611
16633
  var CSS = widget.CSS,
16612
16634
  baseClass = widget.baseClass;
16613
16635
  var dragSource = data.dragSource;
@@ -16621,6 +16643,7 @@ var GridComponent = /*#__PURE__*/ (function (_VDOM$Component) {
16621
16643
  var _instance$state = instance.state,
16622
16644
  colWidth = _instance$state.colWidth,
16623
16645
  dimensionsVersion = _instance$state.dimensionsVersion;
16646
+ var hasMergedCells = row.hasMergedCells;
16624
16647
  return function (record, index, standalone, fixed) {
16625
16648
  var store = record.store,
16626
16649
  key = record.key,
@@ -16645,6 +16668,7 @@ var GridComponent = /*#__PURE__*/ (function (_VDOM$Component) {
16645
16668
  mod["draggable"] = draggable;
16646
16669
  mod["non-draggable"] = !draggable;
16647
16670
  var wrap = function wrap(children) {
16671
+ var skipCells = {};
16648
16672
  return /*#__PURE__*/ jsx(
16649
16673
  GridRowComponent,
16650
16674
  {
@@ -16665,48 +16689,68 @@ var GridComponent = /*#__PURE__*/ (function (_VDOM$Component) {
16665
16689
  shouldUpdate: row.shouldUpdate,
16666
16690
  dimensionsVersion: dimensionsVersion,
16667
16691
  fixed: fixed,
16692
+ useTrTag: hasMergedCells,
16668
16693
  children: children.content.map(function (_ref, line) {
16669
16694
  var key = _ref.key,
16670
16695
  data = _ref.data,
16671
16696
  content = _ref.content;
16697
+ var cells = content.map(function (_ref2, cellIndex) {
16698
+ var key = _ref2.key,
16699
+ data = _ref2.data,
16700
+ content = _ref2.content,
16701
+ uniqueColumnId = _ref2.uniqueColumnId,
16702
+ merged = _ref2.merged,
16703
+ mergeRowSpan = _ref2.mergeRowSpan;
16704
+ if (Boolean(data.fixed) !== fixed) return null;
16705
+ if (merged) return null;
16706
+ var cellected = index == cursor && cellIndex == cursorCellIndex && widget.cellEditable && line == 0;
16707
+ var className = cellected ? CSS.expand(data.classNames, CSS.state("cellected")) : data.classNames;
16708
+ if (cellected && cellEdit) {
16709
+ var column = visibleColumns[cursorCellIndex];
16710
+ if (column && column.editor && data.editable)
16711
+ return _this6.renderCellEditor(key, CSS, baseClass, row, column);
16712
+ }
16713
+ var width = colWidth[uniqueColumnId];
16714
+ var style = data.style;
16715
+ if (width) {
16716
+ style = _extends({}, style, {
16717
+ maxWidth: width + "px",
16718
+ });
16719
+ }
16720
+ if (skipCells[line + "-" + cellIndex]) return null;
16721
+ if (data.colSpan > 1 || data.rowSpan > 1) {
16722
+ for (var r = line; r < line + ((_data$rowSpan = data.rowSpan) != null ? _data$rowSpan : 1); r++) {
16723
+ var _data$rowSpan;
16724
+ for (
16725
+ var c = cellIndex;
16726
+ c < cellIndex + ((_data$colSpan = data.colSpan) != null ? _data$colSpan : 1);
16727
+ c++
16728
+ ) {
16729
+ var _data$colSpan;
16730
+ skipCells[r + "-" + c] = true;
16731
+ }
16732
+ }
16733
+ }
16734
+ if (cellWrap) content = cellWrap(content);
16735
+ return /*#__PURE__*/ jsx(
16736
+ "td",
16737
+ {
16738
+ className: className,
16739
+ style: style,
16740
+ colSpan: data.colSpan,
16741
+ rowSpan: mergeRowSpan != null ? mergeRowSpan : data.rowSpan,
16742
+ children: content,
16743
+ },
16744
+ key,
16745
+ );
16746
+ });
16747
+ if (hasMergedCells) return cells;
16672
16748
  return /*#__PURE__*/ jsx(
16673
16749
  "tr",
16674
16750
  {
16675
16751
  className: data.classNames,
16676
16752
  style: data.style,
16677
- children: content.map(function (_ref2, cellIndex) {
16678
- var key = _ref2.key,
16679
- data = _ref2.data,
16680
- content = _ref2.content,
16681
- uniqueColumnId = _ref2.uniqueColumnId;
16682
- if (Boolean(data.fixed) !== fixed) return null;
16683
- var cellected = index == cursor && cellIndex == cursorCellIndex && widget.cellEditable && line == 0;
16684
- var className = cellected ? CSS.expand(data.classNames, CSS.state("cellected")) : data.classNames;
16685
- if (cellected && cellEdit) {
16686
- var column = visibleColumns[cursorCellIndex];
16687
- if (column && column.editor && data.editable)
16688
- return _this6.renderCellEditor(key, CSS, baseClass, row, column);
16689
- }
16690
- var width = colWidth[uniqueColumnId];
16691
- var style = data.style;
16692
- if (width) {
16693
- style = _extends({}, style, {
16694
- maxWidth: width + "px",
16695
- });
16696
- }
16697
- if (cellWrap) content = cellWrap(content);
16698
- return /*#__PURE__*/ jsx(
16699
- "td",
16700
- {
16701
- className: className,
16702
- style: style,
16703
- colSpan: data.colSpan,
16704
- rowSpan: data.rowSpan,
16705
- children: content,
16706
- },
16707
- key,
16708
- );
16709
- }),
16753
+ children: cells,
16710
16754
  },
16711
16755
  key,
16712
16756
  );
@@ -16890,10 +16934,58 @@ var GridComponent = /*#__PURE__*/ (function (_VDOM$Component) {
16890
16934
  });
16891
16935
  instance.recordInstanceCache.sweep();
16892
16936
  } else {
16937
+ var row = instance.row;
16938
+ var hasMergedCells = row.hasMergedCells,
16939
+ mergedColumns = row.mergedColumns;
16940
+ if (hasMergedCells) {
16941
+ // merge adjacent cells with the same value in columns that are marked as merged
16942
+ var rowSpan = {};
16943
+ var getCellRenderInfo = function getCellRenderInfo(vdom, cellIndex) {
16944
+ var _vdom$content$;
16945
+ return (_vdom$content$ = vdom.content[0]) == null ? void 0 : _vdom$content$.content[cellIndex];
16946
+ };
16947
+ for (var index = instance.records.length - 1; index >= 0; index--) {
16948
+ var _row = instance.records[index];
16949
+ var prevRow = instance.records[index - 1];
16950
+ if (_row.type == "data") {
16951
+ var stopMerge = false;
16952
+ for (var mi = 0; mi < mergedColumns.length; mi++) {
16953
+ var mergedCol = mergedColumns[mi];
16954
+ var cellInfo = getCellRenderInfo(_row.vdom, mergedCol.index);
16955
+ cellInfo.merged = false;
16956
+ delete cellInfo.mergeRowSpan;
16957
+ if ((prevRow == null ? void 0 : prevRow.type) == "data") {
16958
+ var shouldMerge = false;
16959
+ switch (mergedCol.mode) {
16960
+ case "always":
16961
+ shouldMerge = true;
16962
+ break;
16963
+ case "same-value":
16964
+ var prevCellInfo = getCellRenderInfo(prevRow.vdom, mergedCol.index);
16965
+ shouldMerge = !stopMerge && cellInfo.data.value === prevCellInfo.data.value;
16966
+ break;
16967
+ }
16968
+ if (shouldMerge) {
16969
+ var _rowSpan$mergedCol$un;
16970
+ cellInfo.merged = true;
16971
+ rowSpan[mergedCol.uniqueColumnId] =
16972
+ ((_rowSpan$mergedCol$un = rowSpan[mergedCol.uniqueColumnId]) != null ? _rowSpan$mergedCol$un : 1) +
16973
+ 1;
16974
+ } else {
16975
+ if (mergedCol.mode == "same-value") stopMerge = true;
16976
+ }
16977
+ }
16978
+ if (!cellInfo.merged && rowSpan[mergedCol.uniqueColumnId] > 1) {
16979
+ cellInfo.mergeRowSpan = rowSpan[mergedCol.uniqueColumnId];
16980
+ rowSpan[mergedCol.uniqueColumnId] = 1;
16981
+ }
16982
+ }
16983
+ } else rowSpan = {};
16984
+ }
16985
+ }
16893
16986
  instance.records.forEach(function (record, i) {
16894
- if (record.type == "data") {
16895
- addRow(record, i);
16896
- } else {
16987
+ if (record.type == "data") addRow(record, i, false);
16988
+ else {
16897
16989
  children.push(record.vdom);
16898
16990
  if (hasFixedColumns) fixedChildren.push(record.fixedVdom);
16899
16991
  }
@@ -16934,19 +17026,20 @@ var GridComponent = /*#__PURE__*/ (function (_VDOM$Component) {
16934
17026
  ? void 0
16935
17027
  : _item$props2.type;
16936
17028
  };
16937
- var index = 0;
16938
- while (index < children.length && !isDataRecord(children[index])) index++;
17029
+ var _index = 0;
17030
+ while (_index < children.length && !isDataRecord(children[_index])) _index++;
16939
17031
  var count = 0;
16940
- while (index < children.length && count < this.state.dropInsertionIndex) {
16941
- if (isDataRecord(children[index])) count++;
16942
- index++;
17032
+ while (_index < children.length && count < this.state.dropInsertionIndex) {
17033
+ if (isDataRecord(children[_index])) count++;
17034
+ _index++;
16943
17035
  }
16944
- var savedIndexPos = index;
16945
- if (!this.state.dropNextToTheRowAbove) while (index < children.length && !isDataRecord(children[index])) index++;
17036
+ var savedIndexPos = _index;
17037
+ if (!this.state.dropNextToTheRowAbove)
17038
+ while (_index < children.length && !isDataRecord(children[_index])) _index++;
16946
17039
 
16947
17040
  // do not allow insertion after the last group footer
16948
- if (savedIndexPos < index && index == children.length) index = savedIndexPos;
16949
- children.splice(index, 0, dragInsertionRow);
17041
+ if (savedIndexPos < _index && _index == children.length) _index = savedIndexPos;
17042
+ children.splice(_index, 0, dragInsertionRow);
16950
17043
  }
16951
17044
  var content = [],
16952
17045
  fixedColumnsContent = [];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cx",
3
- "version": "24.4.3",
3
+ "version": "24.4.5",
4
4
  "description": "Advanced JavaScript UI framework for admin and dashboard applications with ready to use grid, form and chart components.",
5
5
  "main": "index.js",
6
6
  "jsnext:main": "src/index.js",