@danielgindi/dgtable.js 2.0.5 → 2.0.7

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@danielgindi/dgtable.js",
3
3
  "description": "High-performance table View for vanilla JS",
4
- "version": "2.0.5",
4
+ "version": "2.0.7",
5
5
  "main": "dist/lib.cjs.min.js",
6
6
  "module": "dist/lib.es6.min.js",
7
7
  "broswer": "dist/lib.umd.min.js",
package/src/index.js CHANGED
@@ -36,6 +36,7 @@ const HoverOutEventSymbol = Symbol('hover_out');
36
36
  const RowClickEventSymbol = Symbol('row_click');
37
37
  const PreviewCellSymbol = Symbol('preview_cell');
38
38
  const OriginalCellSymbol = Symbol('cell');
39
+ const RelatedTouch = Symbol('related_touch');
39
40
 
40
41
  function webkitRenderBugfix(el) {
41
42
  // BUGFIX: WebKit has a bug where it does not relayout, and this affects us because scrollbars
@@ -104,7 +105,7 @@ class DGTable {
104
105
  this.el.classList.add(options.className || 'dgtable-wrapper');
105
106
  }
106
107
 
107
- p.eventsSink.add(this.el, 'dragend.colresize', this._onEndDragColumnHeader.bind(this));
108
+ p.eventsSink.add(this.el, 'dragend.colresize', this._onDragEndColumnHeader.bind(this));
108
109
 
109
110
  /**
110
111
  * @private
@@ -2553,7 +2554,7 @@ class DGTable {
2553
2554
  /**previousElementSibling
2554
2555
  * Reverse-calculate the column to resize from mouse position
2555
2556
  * @private
2556
- * @param {MouseEvent} event mouse event
2557
+ * @param {MouseEvent|TouchEvent} event mouse event
2557
2558
  * @returns {string|null} name of the column which the mouse is over, or null if the mouse is not in resize position
2558
2559
  */
2559
2560
  _getColumnByResizePosition(event) {
@@ -2572,7 +2573,8 @@ class DGTable {
2572
2573
 
2573
2574
  let firstCol = !previousElementSibling;
2574
2575
 
2575
- let mouseX = (event.pageX || event.clientX) - getElementOffset(headerCell).left;
2576
+ const positionHost = event[RelatedTouch] ?? event.changedTouches?.[0] ?? event;
2577
+ let mouseX = (positionHost.pageX || positionHost.clientX) - getElementOffset(headerCell).left;
2576
2578
 
2577
2579
  if (rtl) {
2578
2580
  if (!firstCol && getElementWidth(headerCell, true, true, true) - mouseX <= o.resizeAreaWidth / 2) {
@@ -2616,24 +2618,8 @@ class DGTable {
2616
2618
  clearTimeout(tapAndHoldTimeout);
2617
2619
  };
2618
2620
 
2619
- let fakeMouseEvent = (name, ...args) => {
2620
- const dict = {};
2621
- for (const k of event)
2622
- dict[k] = event[k];
2623
-
2624
- for (const obj of args) {
2625
- for (const key of ['target', 'clientX', 'clientY', 'offsetX', 'offsetY', 'screenX', 'screenY', 'pageX', 'pageY', 'which']) {
2626
- if (obj[key] != null)
2627
- dict[key] = obj[key];
2628
- }
2629
- }
2630
-
2631
- return new MouseEvent(name, event);
2632
- };
2633
-
2634
- cellEl.dispatchEvent(
2635
- fakeMouseEvent('mousedown', event.changedTouches[0], { button: 0, target: event.target }),
2636
- );
2621
+ event[RelatedTouch] = event.changedTouches[0];
2622
+ this._onMouseDownColumnHeader(event);
2637
2623
 
2638
2624
  tapAndHoldTimeout = setTimeout(() => {
2639
2625
  unbind();
@@ -2654,16 +2640,13 @@ class DGTable {
2654
2640
 
2655
2641
  if (distanceTravelled < distanceTreshold) {
2656
2642
  this.cancelColumnResize();
2657
-
2658
- cellEl.dispatchEvent(
2659
- fakeMouseEvent('mouseup', event.changedTouches[0], { button: 2, target: event.target }),
2660
- );
2643
+ this._triggerColumnHeaderContextMenu(event);
2661
2644
  }
2662
2645
 
2663
2646
  }, 500);
2664
2647
 
2665
2648
  p.eventsSink
2666
- .add(cellEl, 'touchend.colheader', (event) => {
2649
+ .add(cellEl, 'touchend.colheader', (/**TouchEvent*/event) => {
2667
2650
  let touch = find(event.changedTouches, (touch) => touch.identifier === p.currentTouchId);
2668
2651
  if (!touch) return;
2669
2652
 
@@ -2677,18 +2660,13 @@ class DGTable {
2677
2660
  let distanceTravelled = Math.sqrt(Math.pow(Math.abs(currentPos.x - startPos.x), 2) + Math.pow(Math.abs(currentPos.y - startPos.y), 2));
2678
2661
 
2679
2662
  if (distanceTravelled < distanceTreshold || p.resizer) {
2680
- cellEl.dispatchEvent(
2681
- fakeMouseEvent('mouseup', touch, { 0: 2, target: event.target }),
2682
- );
2683
-
2684
- cellEl.dispatchEvent(
2685
- fakeMouseEvent('click', touch, { button: 0, target: event.target }),
2686
- );
2663
+ event[RelatedTouch] = touch;
2664
+ this._onSortOnColumnHeaderEvent(event);
2687
2665
  }
2688
2666
 
2689
2667
  })
2690
2668
  .add(cellEl, 'touchcancel.colheader', unbind)
2691
- .add(cellEl, 'touchmove.colheader', (event) => {
2669
+ .add(cellEl, 'touchmove.colheader', (/**TouchEvent*/event) => {
2692
2670
  let touch = find(event.changedTouches, (touch) => touch.identifier === p.currentTouchId);
2693
2671
  if (!touch) return;
2694
2672
 
@@ -2698,18 +2676,18 @@ class DGTable {
2698
2676
  if (p.resizer) {
2699
2677
  event.preventDefault();
2700
2678
 
2701
- cellEl.dispatchEvent(
2702
- fakeMouseEvent('mousemove', touch, { target: event.target }),
2703
- );
2679
+ event[RelatedTouch] = touch;
2680
+ this._onMouseMoveColumnHeader(event);
2704
2681
  }
2705
2682
  });
2706
2683
  }
2707
2684
 
2708
2685
  /**
2709
- * @param {MouseEvent} event
2686
+ * @param {MouseEvent|TouchEvent} event
2710
2687
  */
2711
2688
  _onMouseDownColumnHeader(event) {
2712
- if (event.button !== 0) return this; // Only treat left-clicks
2689
+ if (event.type === 'mousedown' && event.button !== 0)
2690
+ return;
2713
2691
 
2714
2692
  let o = this._o,
2715
2693
  p = this._p,
@@ -2776,48 +2754,61 @@ class DGTable {
2776
2754
 
2777
2755
  p.eventsSink
2778
2756
  .add(document, 'mousemove.colresize', this._onMouseMoveResizeArea.bind(this))
2779
- .add(document, 'mouseup.colresize', this._onEndDragColumnHeader.bind(this));
2757
+ .add(document, 'touchmove.colresize', this._onMouseMoveResizeArea.bind(this))
2758
+ .add(document, 'mouseup.colresize', this._onResizerPointerUpColumnHeader.bind(this))
2759
+ .add(document, 'touchend.colresize', this._onResizerPointerUpColumnHeader.bind(this));
2780
2760
 
2781
2761
  event.preventDefault();
2782
2762
  }
2783
2763
  }
2784
2764
 
2785
2765
  /**
2786
- * @param {MouseEvent} event event
2766
+ * @param {MouseEvent|TouchEvent} event event
2787
2767
  */
2788
2768
  _onMouseMoveColumnHeader(event) {
2789
- let o = this._o,
2769
+ const o = this._o,
2790
2770
  p = this._p;
2791
2771
 
2792
- if (o.resizableColumns) {
2793
- let col = this._getColumnByResizePosition(event);
2794
- let headerCell = event.target.closest(`div.${o.tableClassName}-header-cell,div.${o.cellPreviewClassName}`);
2795
- if (!col || !p.columns.get(col).resizable) {
2796
- headerCell.style.cursor = '';
2797
- } else {
2798
- headerCell.style.cursor = 'e-resize';
2799
- }
2772
+ if (!o.resizableColumns)
2773
+ return;
2774
+
2775
+ let col = this._getColumnByResizePosition(event);
2776
+ let headerCell = event.target.closest(`div.${o.tableClassName}-header-cell,div.${o.cellPreviewClassName}`);
2777
+ if (!col || !p.columns.get(col).resizable) {
2778
+ headerCell.style.cursor = '';
2779
+ } else {
2780
+ headerCell.style.cursor = 'e-resize';
2800
2781
  }
2801
2782
  }
2802
2783
 
2803
2784
  /**
2804
- * @param {MouseEvent} event
2785
+ * @param {MouseEvent|TouchEvent} event
2805
2786
  */
2806
2787
  _onMouseUpColumnHeader(event) {
2807
- if (event.button === 2) {
2808
- let o = this._o;
2809
- let headerCell = event.target.closest(`div.${o.tableClassName}-header-cell,div.${o.cellPreviewClassName}`);
2810
- let bounds = getElementOffset(headerCell);
2811
- bounds['width'] = getElementWidth(headerCell, true, true, true);
2812
- bounds['height'] = getElementHeight(headerCell, true, true, true);
2813
- this.emit('headercontextmenu', {
2814
- columnName: headerCell['columnName'],
2815
- pageX: event.pageX,
2816
- pageY: event.pageY,
2817
- bounds: bounds,
2818
- });
2819
- }
2820
- return this;
2788
+ if (event.button !== 2)
2789
+ return;
2790
+
2791
+ this._triggerColumnHeaderContextMenu(event);
2792
+ }
2793
+
2794
+ /**
2795
+ * @param {MouseEvent|TouchEvent} event
2796
+ */
2797
+ _triggerColumnHeaderContextMenu(event) {
2798
+ const o = this._o;
2799
+
2800
+ const positionHost = event[RelatedTouch] ?? event.changedTouches?.[0] ?? event;
2801
+
2802
+ let headerCell = event.target.closest(`div.${o.tableClassName}-header-cell,div.${o.cellPreviewClassName}`);
2803
+ let bounds = getElementOffset(headerCell);
2804
+ bounds['width'] = getElementWidth(headerCell, true, true, true);
2805
+ bounds['height'] = getElementHeight(headerCell, true, true, true);
2806
+ this.emit('headercontextmenu', {
2807
+ columnName: headerCell['columnName'],
2808
+ pageX: positionHost.pageX,
2809
+ pageY: positionHost.pageY,
2810
+ bounds: bounds,
2811
+ });
2821
2812
  }
2822
2813
 
2823
2814
  /**
@@ -2832,41 +2823,43 @@ class DGTable {
2832
2823
 
2833
2824
  /**
2834
2825
  * @private
2835
- * @param {MouseEvent} event event
2826
+ * @param {MouseEvent|TouchEvent} event event
2836
2827
  */
2837
- _onClickColumnHeader(event) {
2828
+ _onSortOnColumnHeaderEvent(event) {
2838
2829
  if (isInputElementEvent(event))
2839
2830
  return;
2840
2831
 
2841
- if (!this._getColumnByResizePosition(event)) {
2842
- let o = this._o,
2843
- p = this._p;
2832
+ if (this._getColumnByResizePosition(event))
2833
+ return;
2844
2834
 
2845
- let headerCell = event.target.closest(`div.${o.tableClassName}-header-cell,div.${o.cellPreviewClassName}`);
2846
- if (o.sortableColumns) {
2847
- let column = p.columns.get(headerCell['columnName']);
2848
- let currentSort = p.rows.sortColumn;
2849
- if (column && column.sortable) {
2850
- let shouldAdd = true;
2835
+ const o = this._o,
2836
+ p = this._p;
2837
+
2838
+ let headerCell = event.target.closest(`div.${o.tableClassName}-header-cell,div.${o.cellPreviewClassName}`);
2839
+ if (!o.sortableColumns)
2840
+ return;
2851
2841
 
2852
- let lastSort = currentSort.length ? currentSort[currentSort.length - 1] : null;
2842
+ let column = p.columns.get(headerCell['columnName']);
2843
+ let currentSort = p.rows.sortColumn;
2844
+ if (column && column.sortable) {
2845
+ let shouldAdd = true;
2853
2846
 
2854
- if (lastSort && lastSort.column === column.name) {
2855
- if (!lastSort.descending || !o.allowCancelSort) {
2856
- lastSort.descending = !lastSort.descending;
2857
- } else {
2858
- shouldAdd = false;
2859
- currentSort.splice(currentSort.length - 1, 1);
2860
- }
2861
- }
2847
+ let lastSort = currentSort.length ? currentSort[currentSort.length - 1] : null;
2862
2848
 
2863
- if (shouldAdd) {
2864
- this.sort(column.name, undefined, true).render();
2865
- } else {
2866
- this.sort(); // just refresh current situation
2867
- }
2849
+ if (lastSort && lastSort.column === column.name) {
2850
+ if (!lastSort.descending || !o.allowCancelSort) {
2851
+ lastSort.descending = !lastSort.descending;
2852
+ } else {
2853
+ shouldAdd = false;
2854
+ currentSort.splice(currentSort.length - 1, 1);
2868
2855
  }
2869
2856
  }
2857
+
2858
+ if (shouldAdd) {
2859
+ this.sort(column.name, undefined, true).render();
2860
+ } else {
2861
+ this.sort(); // just refresh current situation
2862
+ }
2870
2863
  }
2871
2864
  }
2872
2865
 
@@ -2897,7 +2890,7 @@ class DGTable {
2897
2890
 
2898
2891
  /**
2899
2892
  * @private
2900
- * @param {MouseEvent} event event
2893
+ * @param {MouseEvent|TouchEvent} event event
2901
2894
  */
2902
2895
  _onMouseMoveResizeArea(event) {
2903
2896
 
@@ -2920,7 +2913,8 @@ class DGTable {
2920
2913
 
2921
2914
  let isBoxing = selectedHeaderCellStyle.boxSizing === 'border-box';
2922
2915
 
2923
- let actualX = event.pageX - posRelative.left;
2916
+ const positionHost = event[RelatedTouch] ?? event.changedTouches?.[0] ?? event;
2917
+ let actualX = positionHost.pageX - posRelative.left;
2924
2918
  let minX = posCol.left;
2925
2919
 
2926
2920
  minX -= Math.ceil(resizerWidth / 2);
@@ -2957,125 +2951,136 @@ class DGTable {
2957
2951
  * @private
2958
2952
  * @param {DragEvent} event event
2959
2953
  */
2960
- _onEndDragColumnHeader(event) {
2954
+ _onDragEndColumnHeader(event) {
2955
+ let p = this._p;
2956
+
2957
+ if (!p.resizer) {
2958
+ event.target.style.opacity = null;
2959
+ }
2960
+ }
2961
2961
 
2962
+ /**
2963
+ * @private
2964
+ * @param {MouseEvent|TouchEvent} event event
2965
+ */
2966
+ _onResizerPointerUpColumnHeader(event) {
2962
2967
  let o = this._o,
2963
2968
  p = this._p;
2964
2969
 
2965
- if (!p.resizer) {
2966
- event.target.style.opacity = null;
2967
- } else {
2968
- p.eventsSink.remove(document, '.colresize');
2970
+ if (!p.resizer)
2971
+ return;
2969
2972
 
2970
- let column = p.columns.get(p.resizer['columnName']);
2971
- let rtl = this._isTableRtl();
2973
+ p.eventsSink.remove(document, '.colresize');
2972
2974
 
2973
- let selectedHeaderCell = column.element,
2974
- selectedHeaderCellInner = selectedHeaderCell.firstChild,
2975
- commonAncestor = p.resizer.parentNode;
2975
+ let column = p.columns.get(p.resizer['columnName']);
2976
+ let rtl = this._isTableRtl();
2976
2977
 
2977
- const commonAncestorStyle = getComputedStyle(commonAncestor);
2978
- const selectedHeaderCellStyle = getComputedStyle(selectedHeaderCell);
2978
+ let selectedHeaderCell = column.element,
2979
+ selectedHeaderCellInner = selectedHeaderCell.firstChild,
2980
+ commonAncestor = p.resizer.parentNode;
2979
2981
 
2980
- let posCol = getElementOffset(selectedHeaderCell),
2981
- posRelative = getElementOffset(commonAncestor);
2982
- posRelative.left += parseFloat(commonAncestorStyle.borderLeftWidth) || 0;
2983
- posCol.left -= posRelative.left;
2984
- let resizerWidth = getElementWidth(p.resizer, true, true, true);
2982
+ const commonAncestorStyle = getComputedStyle(commonAncestor);
2983
+ const selectedHeaderCellStyle = getComputedStyle(selectedHeaderCell);
2985
2984
 
2986
- let isBoxing = selectedHeaderCellStyle.boxSizing === 'border-box';
2985
+ let posCol = getElementOffset(selectedHeaderCell),
2986
+ posRelative = getElementOffset(commonAncestor);
2987
+ posRelative.left += parseFloat(commonAncestorStyle.borderLeftWidth) || 0;
2988
+ posCol.left -= posRelative.left;
2989
+ let resizerWidth = getElementWidth(p.resizer, true, true, true);
2987
2990
 
2988
- let actualX = event.pageX - posRelative.left;
2989
- let baseX = posCol.left, minX = posCol.left;
2990
- let width = 0;
2991
+ let isBoxing = selectedHeaderCellStyle.boxSizing === 'border-box';
2991
2992
 
2992
- baseX -= Math.ceil(resizerWidth / 2);
2993
+ const positionHost = event[RelatedTouch] ?? event.changedTouches?.[0] ?? event;
2994
+ let actualX = positionHost.pageX - posRelative.left;
2995
+ let baseX = posCol.left, minX = posCol.left;
2996
+ let width = 0;
2993
2997
 
2994
- if (rtl) {
2995
- if (!isBoxing) {
2996
- actualX += this._horizontalPadding(selectedHeaderCell);
2997
- const innerComputedStyle = getComputedStyle(selectedHeaderCellInner || selectedHeaderCell);
2998
- actualX += parseFloat(innerComputedStyle.borderLeftWidth) || 0;
2999
- actualX += parseFloat(innerComputedStyle.borderRightWidth) || 0;
3000
- actualX += column.arrowProposedWidth || 0; // Sort-arrow width
3001
- }
2998
+ baseX -= Math.ceil(resizerWidth / 2);
3002
2999
 
3003
- baseX += getElementWidth(selectedHeaderCell, true, true, true);
3000
+ if (rtl) {
3001
+ if (!isBoxing) {
3002
+ actualX += this._horizontalPadding(selectedHeaderCell);
3003
+ const innerComputedStyle = getComputedStyle(selectedHeaderCellInner || selectedHeaderCell);
3004
+ actualX += parseFloat(innerComputedStyle.borderLeftWidth) || 0;
3005
+ actualX += parseFloat(innerComputedStyle.borderRightWidth) || 0;
3006
+ actualX += column.arrowProposedWidth || 0; // Sort-arrow width
3007
+ }
3004
3008
 
3005
- minX = baseX - (column.ignoreMin ? 0 : this._o.minColumnWidth);
3006
- if (actualX > minX) {
3007
- actualX = minX;
3008
- }
3009
+ baseX += getElementWidth(selectedHeaderCell, true, true, true);
3009
3010
 
3010
- width = baseX - actualX;
3011
- } else {
3012
- if (!isBoxing) {
3013
- actualX -= this._horizontalPadding(selectedHeaderCell);
3014
- const innerComputedStyle = getComputedStyle(selectedHeaderCellInner || selectedHeaderCell);
3015
- actualX -= parseFloat(innerComputedStyle.borderLeftWidth) || 0;
3016
- actualX -= parseFloat(innerComputedStyle.borderRightWidth) || 0;
3017
- actualX -= column.arrowProposedWidth || 0; // Sort-arrow width
3018
- }
3011
+ minX = baseX - (column.ignoreMin ? 0 : this._o.minColumnWidth);
3012
+ if (actualX > minX) {
3013
+ actualX = minX;
3014
+ }
3019
3015
 
3020
- minX = baseX + (column.ignoreMin ? 0 : this._o.minColumnWidth);
3021
- if (actualX < minX) {
3022
- actualX = minX;
3023
- }
3016
+ width = baseX - actualX;
3017
+ } else {
3018
+ if (!isBoxing) {
3019
+ actualX -= this._horizontalPadding(selectedHeaderCell);
3020
+ const innerComputedStyle = getComputedStyle(selectedHeaderCellInner || selectedHeaderCell);
3021
+ actualX -= parseFloat(innerComputedStyle.borderLeftWidth) || 0;
3022
+ actualX -= parseFloat(innerComputedStyle.borderRightWidth) || 0;
3023
+ actualX -= column.arrowProposedWidth || 0; // Sort-arrow width
3024
+ }
3024
3025
 
3025
- width = actualX - baseX;
3026
+ minX = baseX + (column.ignoreMin ? 0 : this._o.minColumnWidth);
3027
+ if (actualX < minX) {
3028
+ actualX = minX;
3026
3029
  }
3027
3030
 
3028
- p.resizer.remove();
3029
- p.resizer = null;
3031
+ width = actualX - baseX;
3032
+ }
3030
3033
 
3031
- let sizeToSet = width;
3034
+ p.resizer.remove();
3035
+ p.resizer = null;
3032
3036
 
3033
- if (column.widthMode === ColumnWidthMode.RELATIVE) {
3034
- let sizeLeft = this._calculateWidthAvailableForColumns();
3035
- //sizeLeft -= p.table.offsetWidth - p.table.clientWidth;
3037
+ let sizeToSet = width;
3036
3038
 
3037
- let totalRelativePercentage = 0;
3038
- let relatives = 0;
3039
+ if (column.widthMode === ColumnWidthMode.RELATIVE) {
3040
+ let sizeLeft = this._calculateWidthAvailableForColumns();
3041
+ //sizeLeft -= p.table.offsetWidth - p.table.clientWidth;
3039
3042
 
3040
- for (let i = 0; i < p.visibleColumns.length; i++) {
3041
- let col = p.visibleColumns[i];
3042
- if (col.name === column.name) continue;
3043
+ let totalRelativePercentage = 0;
3044
+ let relatives = 0;
3043
3045
 
3044
- if (col.widthMode === ColumnWidthMode.RELATIVE) {
3045
- totalRelativePercentage += col.width;
3046
- relatives++;
3047
- } else {
3048
- sizeLeft -= col.actualWidth;
3049
- }
3046
+ for (let i = 0; i < p.visibleColumns.length; i++) {
3047
+ let col = p.visibleColumns[i];
3048
+ if (col.name === column.name) continue;
3049
+
3050
+ if (col.widthMode === ColumnWidthMode.RELATIVE) {
3051
+ totalRelativePercentage += col.width;
3052
+ relatives++;
3053
+ } else {
3054
+ sizeLeft -= col.actualWidth;
3050
3055
  }
3056
+ }
3051
3057
 
3052
- sizeLeft = Math.max(1, sizeLeft);
3053
- if (sizeLeft === 1)
3054
- sizeLeft = p.table.clientWidth;
3055
- sizeToSet = width / sizeLeft;
3058
+ sizeLeft = Math.max(1, sizeLeft);
3059
+ if (sizeLeft === 1)
3060
+ sizeLeft = p.table.clientWidth;
3061
+ sizeToSet = width / sizeLeft;
3056
3062
 
3057
- if (relatives > 0) {
3058
- // When there's more than one relative overall,
3059
- // we can do relative enlarging/shrinking.
3060
- // Otherwise, we can end up having a 0 width.
3063
+ if (relatives > 0) {
3064
+ // When there's more than one relative overall,
3065
+ // we can do relative enlarging/shrinking.
3066
+ // Otherwise, we can end up having a 0 width.
3061
3067
 
3062
- let unNormalizedSizeToSet = sizeToSet / ((1 - sizeToSet) / totalRelativePercentage);
3068
+ let unNormalizedSizeToSet = sizeToSet / ((1 - sizeToSet) / totalRelativePercentage);
3063
3069
 
3064
- totalRelativePercentage += sizeToSet;
3070
+ totalRelativePercentage += sizeToSet;
3065
3071
 
3066
- // Account for relative widths scaling later
3067
- if ((totalRelativePercentage < 1 && o.relativeWidthGrowsToFillWidth) ||
3068
- (totalRelativePercentage > 1 && o.relativeWidthShrinksToFillWidth)) {
3069
- sizeToSet = unNormalizedSizeToSet;
3070
- }
3072
+ // Account for relative widths scaling later
3073
+ if ((totalRelativePercentage < 1 && o.relativeWidthGrowsToFillWidth) ||
3074
+ (totalRelativePercentage > 1 && o.relativeWidthShrinksToFillWidth)) {
3075
+ sizeToSet = unNormalizedSizeToSet;
3071
3076
  }
3072
-
3073
- sizeToSet *= 100;
3074
- sizeToSet += '%';
3075
3077
  }
3076
3078
 
3077
- this.setColumnWidth(column.name, sizeToSet);
3079
+ sizeToSet *= 100;
3080
+ sizeToSet += '%';
3078
3081
  }
3082
+
3083
+ this.setColumnWidth(column.name, sizeToSet);
3079
3084
  }
3080
3085
 
3081
3086
  /**
@@ -3304,7 +3309,7 @@ class DGTable {
3304
3309
  columnEl.addEventListener('mouseleave', this._onMouseLeaveColumnHeader.bind(this));
3305
3310
  columnEl.addEventListener('touchstart', this._onTouchStartColumnHeader.bind(this));
3306
3311
  columnEl.addEventListener('dragstart', this._onStartDragColumnHeader.bind(this));
3307
- columnEl.addEventListener('click', this._onClickColumnHeader.bind(this));
3312
+ columnEl.addEventListener('click', this._onSortOnColumnHeaderEvent.bind(this));
3308
3313
  columnEl.addEventListener('contextmenu', event => { event.preventDefault(); });
3309
3314
  inner.addEventListener('dragenter', this._onDragEnterColumnHeader.bind(this));
3310
3315
  inner.addEventListener('dragover', this._onDragOverColumnHeader.bind(this));