@revolist/revogrid 4.23.7 → 4.23.9

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.
Files changed (53) hide show
  1. package/dist/cjs/{cell-renderer-Dcz022q7.js → cell-renderer-Dl9kKeKp.js} +1 -1
  2. package/dist/cjs/{column.drag.plugin-yUSx3qoN.js → column.drag.plugin-BRraLvz3.js} +34 -5
  3. package/dist/cjs/{column.service-C1Qvcf5l.js → column.service-BNWNiJW3.js} +62 -23
  4. package/dist/cjs/{header-cell-renderer-vVr4IWNV.js → header-cell-renderer-DyjOxArm.js} +1 -1
  5. package/dist/cjs/index.cjs.js +5 -4
  6. package/dist/cjs/revo-grid.cjs.entry.js +5 -5
  7. package/dist/cjs/revogr-attribution_7.cjs.entry.js +40 -4
  8. package/dist/cjs/revogr-data_4.cjs.entry.js +3 -3
  9. package/dist/cjs/revogr-filter-panel.cjs.entry.js +2 -2
  10. package/dist/collection/components/data/column.service.js +62 -23
  11. package/dist/collection/components/overlay/clipboard.utils.js +26 -0
  12. package/dist/collection/components/overlay/revogr-overlay-selection.js +27 -7
  13. package/dist/collection/components/revoGrid/revo-grid.js +14 -7
  14. package/dist/collection/plugins/filter/filter.panel.js +2 -2
  15. package/dist/collection/plugins/filter/filter.plugin.js +1 -1
  16. package/dist/collection/plugins/moveColumn/column.drag.plugin.js +30 -2
  17. package/dist/collection/serve/controller.js +1 -0
  18. package/dist/esm/{cell-renderer-BtN-NGCk.js → cell-renderer-CdF2Jm3B.js} +1 -1
  19. package/dist/esm/{column.drag.plugin-Cg2U-91C.js → column.drag.plugin-V9DDE3mU.js} +34 -6
  20. package/dist/esm/{column.service-CC_SD8W3.js → column.service-C6hByxPy.js} +62 -23
  21. package/dist/esm/{header-cell-renderer-B-LX2sgu.js → header-cell-renderer-BMmXRsd_.js} +1 -1
  22. package/dist/esm/index.js +5 -5
  23. package/dist/esm/revo-grid.entry.js +5 -5
  24. package/dist/esm/revogr-attribution_7.entry.js +40 -4
  25. package/dist/esm/revogr-data_4.entry.js +3 -3
  26. package/dist/esm/revogr-filter-panel.entry.js +2 -2
  27. package/dist/revo-grid/{cell-renderer-BtN-NGCk.js → cell-renderer-CdF2Jm3B.js} +1 -1
  28. package/dist/revo-grid/{column.drag.plugin-Cg2U-91C.js → column.drag.plugin-V9DDE3mU.js} +34 -6
  29. package/dist/revo-grid/{column.service-CC_SD8W3.js → column.service-C6hByxPy.js} +62 -23
  30. package/dist/revo-grid/{header-cell-renderer-B-LX2sgu.js → header-cell-renderer-BMmXRsd_.js} +1 -1
  31. package/dist/revo-grid/index.esm.js +5 -5
  32. package/dist/revo-grid/revo-grid.entry.js +5 -5
  33. package/dist/revo-grid/revogr-attribution_7.entry.js +40 -4
  34. package/dist/revo-grid/revogr-data_4.entry.js +3 -3
  35. package/dist/revo-grid/revogr-filter-panel.entry.js +2 -2
  36. package/dist/types/components/data/column.service.d.ts +10 -1
  37. package/dist/types/components/overlay/clipboard.utils.d.ts +3 -0
  38. package/dist/types/components/overlay/revogr-overlay-selection.d.ts +4 -3
  39. package/dist/types/components/revoGrid/revo-grid.d.ts +4 -4
  40. package/dist/types/components.d.ts +14 -14
  41. package/dist/types/plugins/filter/filter.plugin.d.ts +1 -0
  42. package/dist/types/plugins/filter/filter.types.d.ts +1 -0
  43. package/dist/types/plugins/moveColumn/column.drag.plugin.d.ts +4 -0
  44. package/dist/types/types/interfaces.d.ts +8 -0
  45. package/hydrate/index.js +136 -33
  46. package/hydrate/index.mjs +136 -33
  47. package/package.json +1 -1
  48. package/readme.md +20 -1
  49. package/standalone/column.service.js +1 -1
  50. package/standalone/index.js +1 -1
  51. package/standalone/revo-grid.js +1 -1
  52. package/standalone/revogr-filter-panel.js +1 -1
  53. package/standalone/revogr-overlay-selection2.js +1 -1
@@ -5,7 +5,7 @@
5
5
  * It contains typing information for all components that exist in this project.
6
6
  */
7
7
  import { HTMLStencilElement, JSXBase } from "./stencil-public-runtime";
8
- import { AdditionalData, AfterEditEvent, AllDimensionType, ApplyFocusEvent, BeforeCellRenderEvent, BeforeEdit, BeforeRangeSaveDataDetails, BeforeRowRenderEvent, BeforeSaveDataDetails, Cell, CellTemplateProp, ChangedRange, ColumnDataSchemaModel, ColumnGrouping, ColumnProp, ColumnRegular, ColumnType, DataFormat, DataType, DimensionCols, DimensionRows, DimensionSettingsState, DimensionType, DimensionTypeCol, DragStartEvent, EditCell, EditorCtr, Editors, ElementScroll, ExtraNodeFuncConfig, FocusAfterRenderEvent, FocusRenderEvent, FocusTemplateFunc, InitialHeaderClick, MultiDimensionType, Nullable, PluginBaseComponent, PluginProviders, PositionItem, ProvidersColumns, RangeArea, RangeClipboardCopyEventProps, RangeClipboardPasteEvent, RowDefinition, RowDragStartDetails, RowHeaders, SaveDataDetails, SelectionStoreState, TempRange, Theme, ViewportData, ViewPortResizeEvent, ViewPortScrollEvent, ViewportState, ViewSettingSizeProp } from "./types/index";
8
+ import { AdditionalData, AfterEditEvent, AllDimensionType, ApplyFocusEvent, BeforeCellRenderEvent, BeforeEdit, BeforeRangeSaveDataDetails, BeforeRowRenderEvent, BeforeSaveDataDetails, Cell, CellTemplateProp, ChangedRange, ClipboardConfig, ColumnDataSchemaModel, ColumnGrouping, ColumnProp, ColumnRegular, ColumnType, DataFormat, DataType, DimensionCols, DimensionRows, DimensionSettingsState, DimensionType, DimensionTypeCol, DragStartEvent, EditCell, EditorCtr, Editors, ElementScroll, ExtraNodeFuncConfig, FocusAfterRenderEvent, FocusRenderEvent, FocusTemplateFunc, InitialHeaderClick, MultiDimensionType, Nullable, PluginBaseComponent, PluginProviders, PositionItem, ProvidersColumns, RangeArea, RangeClipboardCopyEventProps, RangeClipboardPasteEvent, RowDefinition, RowDragStartDetails, RowHeaders, SaveDataDetails, SelectionStoreState, TempRange, Theme, ViewportData, ViewPortResizeEvent, ViewPortScrollEvent, ViewportState, ViewSettingSizeProp } from "./types/index";
9
9
  import { GridPlugin } from "./plugins/base.plugin";
10
10
  import { AutoSizeColumnConfig } from "./plugins/column.auto-size.plugin";
11
11
  import { ColumnFilterConfig, FilterCaptions, FilterCollectionItem, LogicFunction, MultiFilterItem, ShowData } from "./plugins/filter/filter.types";
@@ -21,7 +21,7 @@ import { ResizeProps } from "./components/header/resizable.directive";
21
21
  import { HeaderRenderProps } from "./components/header/header-renderer";
22
22
  import { HeaderGroupRendererProps } from "./components/header/header-group-renderer";
23
23
  import { EventData } from "./components/overlay/selection.utils";
24
- export { AdditionalData, AfterEditEvent, AllDimensionType, ApplyFocusEvent, BeforeCellRenderEvent, BeforeEdit, BeforeRangeSaveDataDetails, BeforeRowRenderEvent, BeforeSaveDataDetails, Cell, CellTemplateProp, ChangedRange, ColumnDataSchemaModel, ColumnGrouping, ColumnProp, ColumnRegular, ColumnType, DataFormat, DataType, DimensionCols, DimensionRows, DimensionSettingsState, DimensionType, DimensionTypeCol, DragStartEvent, EditCell, EditorCtr, Editors, ElementScroll, ExtraNodeFuncConfig, FocusAfterRenderEvent, FocusRenderEvent, FocusTemplateFunc, InitialHeaderClick, MultiDimensionType, Nullable, PluginBaseComponent, PluginProviders, PositionItem, ProvidersColumns, RangeArea, RangeClipboardCopyEventProps, RangeClipboardPasteEvent, RowDefinition, RowDragStartDetails, RowHeaders, SaveDataDetails, SelectionStoreState, TempRange, Theme, ViewportData, ViewPortResizeEvent, ViewPortScrollEvent, ViewportState, ViewSettingSizeProp } from "./types/index";
24
+ export { AdditionalData, AfterEditEvent, AllDimensionType, ApplyFocusEvent, BeforeCellRenderEvent, BeforeEdit, BeforeRangeSaveDataDetails, BeforeRowRenderEvent, BeforeSaveDataDetails, Cell, CellTemplateProp, ChangedRange, ClipboardConfig, ColumnDataSchemaModel, ColumnGrouping, ColumnProp, ColumnRegular, ColumnType, DataFormat, DataType, DimensionCols, DimensionRows, DimensionSettingsState, DimensionType, DimensionTypeCol, DragStartEvent, EditCell, EditorCtr, Editors, ElementScroll, ExtraNodeFuncConfig, FocusAfterRenderEvent, FocusRenderEvent, FocusTemplateFunc, InitialHeaderClick, MultiDimensionType, Nullable, PluginBaseComponent, PluginProviders, PositionItem, ProvidersColumns, RangeArea, RangeClipboardCopyEventProps, RangeClipboardPasteEvent, RowDefinition, RowDragStartDetails, RowHeaders, SaveDataDetails, SelectionStoreState, TempRange, Theme, ViewportData, ViewPortResizeEvent, ViewPortScrollEvent, ViewportState, ViewSettingSizeProp } from "./types/index";
25
25
  export { GridPlugin } from "./plugins/base.plugin";
26
26
  export { AutoSizeColumnConfig } from "./plugins/column.auto-size.plugin";
27
27
  export { ColumnFilterConfig, FilterCaptions, FilterCollectionItem, LogicFunction, MultiFilterItem, ShowData } from "./plugins/filter/filter.types";
@@ -225,7 +225,7 @@ export namespace Components {
225
225
  */
226
226
  "plugins": GridPlugin[];
227
227
  /**
228
- * When true, user can range selection.
228
+ * When true, user can select a cell range. Required for range-based clipboard fill.
229
229
  * @default false
230
230
  */
231
231
  "range": boolean;
@@ -344,10 +344,10 @@ export namespace Components {
344
344
  */
345
345
  "updateColumns": (cols: ColumnRegular[]) => Promise<void>;
346
346
  /**
347
- * When true enable clipboard.
347
+ * When true enable clipboard. Can be boolean or clipboard config.
348
348
  * @default true
349
349
  */
350
- "useClipboard": boolean;
350
+ "useClipboard": boolean | ClipboardConfig;
351
351
  }
352
352
  interface RevogrAttribution {
353
353
  }
@@ -685,9 +685,9 @@ export namespace Components {
685
685
  */
686
686
  "selectionStore": Observable<SelectionStoreState>;
687
687
  /**
688
- * Enable revogr-clipboard component (read more in revogr-clipboard component). Allows copy/paste.
688
+ * Enable revogr-clipboard component (read more in revogr-clipboard component). Allows copy/paste. Can be boolean or clipboard config.
689
689
  */
690
- "useClipboard": boolean;
690
+ "useClipboard": boolean | ClipboardConfig;
691
691
  }
692
692
  /**
693
693
  * Row headers component
@@ -1687,7 +1687,7 @@ declare namespace LocalJSX {
1687
1687
  */
1688
1688
  "plugins"?: GridPlugin[];
1689
1689
  /**
1690
- * When true, user can range selection.
1690
+ * When true, user can select a cell range. Required for range-based clipboard fill.
1691
1691
  * @default false
1692
1692
  */
1693
1693
  "range"?: boolean;
@@ -1758,10 +1758,10 @@ declare namespace LocalJSX {
1758
1758
  */
1759
1759
  "trimmedRows"?: Record<number, boolean>;
1760
1760
  /**
1761
- * When true enable clipboard.
1761
+ * When true enable clipboard. Can be boolean or clipboard config.
1762
1762
  * @default true
1763
1763
  */
1764
- "useClipboard"?: boolean;
1764
+ "useClipboard"?: boolean | ClipboardConfig;
1765
1765
  }
1766
1766
  interface RevogrAttribution {
1767
1767
  }
@@ -2343,9 +2343,9 @@ declare namespace LocalJSX {
2343
2343
  */
2344
2344
  "selectionStore": Observable<SelectionStoreState>;
2345
2345
  /**
2346
- * Enable revogr-clipboard component (read more in revogr-clipboard component). Allows copy/paste.
2346
+ * Enable revogr-clipboard component (read more in revogr-clipboard component). Allows copy/paste. Can be boolean or clipboard config.
2347
2347
  */
2348
- "useClipboard"?: boolean;
2348
+ "useClipboard"?: boolean | ClipboardConfig;
2349
2349
  }
2350
2350
  /**
2351
2351
  * Row headers component
@@ -2498,7 +2498,7 @@ declare namespace LocalJSX {
2498
2498
  "resize": boolean;
2499
2499
  "noHorizontalScrollTransfer": boolean;
2500
2500
  "canFocus": boolean;
2501
- "useClipboard": boolean;
2501
+ "useClipboard": boolean | ClipboardConfig;
2502
2502
  "applyOnClose": boolean;
2503
2503
  "theme": Theme;
2504
2504
  "rowClass": string;
@@ -2552,7 +2552,7 @@ declare namespace LocalJSX {
2552
2552
  "readonly": boolean;
2553
2553
  "range": boolean;
2554
2554
  "canDrag": boolean;
2555
- "useClipboard": boolean;
2555
+ "useClipboard": boolean | ClipboardConfig;
2556
2556
  "applyChangesOnClose": boolean;
2557
2557
  "additionalData": string;
2558
2558
  "isMobileDevice": boolean;
@@ -47,6 +47,7 @@ export declare class FilterPlugin extends BasePlugin {
47
47
  filterFunctionsIndexedByType: Record<string, LogicFunction>;
48
48
  filterProp: string;
49
49
  extraHyperContent?: (data: ShowData) => VNode | VNode[];
50
+ extraBottomHyperContent?: (data: ShowData) => VNode | VNode[];
50
51
  constructor(revogrid: HTMLRevoGridElement, providers: PluginProviders, config?: ColumnFilterConfig | undefined);
51
52
  beforeshow(_: ShowData): void;
52
53
  extraContent(): any;
@@ -126,4 +126,5 @@ export interface ShowData extends FilterItem, Omit<ColumnRegular, 'filter'> {
126
126
  filterItems?: MultiFilterItem;
127
127
  hideDefaultFilters?: boolean;
128
128
  extraContent?: (data: ShowData) => any;
129
+ extraBottomContent?: (data: ShowData) => any;
129
130
  }
@@ -53,8 +53,11 @@ declare global {
53
53
  }
54
54
  export declare class ColumnMovePlugin extends BasePlugin {
55
55
  protected moveFunc: import("lodash").DebouncedFunc<(e: MouseEvent) => void>;
56
+ protected preventHeaderClickAfterDrag: (event: Event) => void;
56
57
  protected staticDragData: StaticData | null;
57
58
  protected dragData: ColumnDragEventData | null;
59
+ protected columnDragMoved: boolean;
60
+ protected preventNextHeaderClick: boolean;
58
61
  readonly orderUi: ColumnOrderHandler;
59
62
  readonly localSubscriptions: LocalSubscriptions;
60
63
  constructor(revogrid: HTMLRevoGridElement, providers: PluginProviders);
@@ -73,4 +76,5 @@ export declare class ColumnMovePlugin extends BasePlugin {
73
76
  protected getDimension(type: MultiDimensionType): DimensionSettingsState;
74
77
  }
75
78
  export declare function getLeftRelative(absoluteX: number, gridPos: number, offset: number): number;
79
+ export declare function getColumnDragPosition(targetItem: PositionItem, startItem: PositionItem, renderOffset: number, scrollOffset: number): number;
76
80
  export {};
@@ -788,6 +788,14 @@ export interface RangeClipboardCopyEventProps<T = any> extends AllDimensionType
788
788
  range: RangeArea;
789
789
  mapping: OldNewRangeMapping;
790
790
  }
791
+ /** Clipboard behavior configuration. */
792
+ export interface ClipboardConfig {
793
+ /**
794
+ * When true, pasting a single clipboard cell fills the selected range.
795
+ * Requires range selection to be enabled on the grid.
796
+ */
797
+ rangeFill?: boolean;
798
+ }
791
799
  export interface AdditionalData {
792
800
  /**
793
801
  * Additional data for grid and plugins
package/hydrate/index.js CHANGED
@@ -7725,7 +7725,7 @@ class FilterPanel {
7725
7725
  } }));
7726
7726
  }
7727
7727
  render() {
7728
- var _a, _b, _c;
7728
+ var _a, _b, _c, _d, _e;
7729
7729
  if (!this.changes) {
7730
7730
  return hAsync(Host, { style: { display: 'none' } });
7731
7731
  }
@@ -7742,7 +7742,7 @@ class FilterPanel {
7742
7742
  hAsync("label", null, capts.title),
7743
7743
  hAsync("div", { class: "filter-holder" }, this.getFilterItemsList()),
7744
7744
  hAsync("div", { class: "add-filter" }, hAsync("select", { id: FILTER_ID, class: "select-css", onChange: e => this.onAddNewFilter(e) }, this.renderSelectOptions(this.currentFilterType)))
7745
- ]), hAsync("slot", null), hAsync("div", { class: "filter-actions" }, this.disableDynamicFiltering && [
7745
+ ]), hAsync("slot", null), ((_e = (_d = this.changes).extraBottomContent) === null || _e === void 0 ? void 0 : _e.call(_d, this.changes)) || '', hAsync("div", { class: "filter-actions" }, this.disableDynamicFiltering && [
7746
7746
  hAsync("button", { id: "revo-button-save", "aria-label": "save", class: "revo-button green", onClick: () => this.onSave() }, capts.save),
7747
7747
  hAsync("button", { id: "revo-button-ok", "aria-label": "ok", class: "revo-button green", onClick: () => this.onCancel() }, capts.cancel),
7748
7748
  ], !this.disableDynamicFiltering && [
@@ -13048,43 +13048,82 @@ class ColumnService {
13048
13048
  mapping,
13049
13049
  };
13050
13050
  }
13051
- getTransformedDataToApply(start, data) {
13051
+ getTransformedDataToApply({ start, data, targetRange, }) {
13052
13052
  const changed = {};
13053
13053
  const copyRowLength = data.length;
13054
+ if (!copyRowLength) {
13055
+ return {
13056
+ changed,
13057
+ range: null,
13058
+ };
13059
+ }
13054
13060
  const colLength = this.columns.length;
13055
13061
  const rowLength = this.dataStore.get('items').length;
13062
+ const bounds = this.getDataApplyBounds(start, targetRange, copyRowLength, rowLength, colLength);
13063
+ if (!bounds) {
13064
+ return {
13065
+ changed,
13066
+ range: null,
13067
+ };
13068
+ }
13069
+ const { startRow, startCol, endRow } = bounds;
13070
+ let maxCol = startCol - 1;
13071
+ let lastRow = startRow - 1;
13056
13072
  // rows
13057
- let rowIndex = start.y;
13058
- let maxCol = 0;
13059
- for (let i = 0; rowIndex < rowLength && i < copyRowLength; rowIndex++, i++) {
13073
+ for (let rowIndex = startRow, i = 0; rowIndex <= endRow; rowIndex++, i++) {
13060
13074
  // copy original data link
13061
13075
  const copyRow = data[i % copyRowLength];
13062
13076
  const copyColLength = (copyRow === null || copyRow === void 0 ? void 0 : copyRow.length) || 0;
13063
- // columns
13064
- let colIndex = start.x;
13065
- for (let j = 0; colIndex < colLength && j < copyColLength; colIndex++, j++) {
13066
- const p = this.columns[colIndex].prop;
13067
- const currentCol = j % colLength;
13068
- /** if can write */
13069
- if (!this.isReadOnly(rowIndex, colIndex)) {
13070
- /** to show before save */
13071
- if (!changed[rowIndex]) {
13072
- changed[rowIndex] = {};
13073
- }
13074
- changed[rowIndex][p] = copyRow[currentCol];
13075
- }
13077
+ if (!copyColLength) {
13078
+ continue;
13076
13079
  }
13077
- maxCol = Math.max(maxCol, colIndex - 1);
13080
+ maxCol = Math.max(maxCol, this.applyClipboardRow(changed, {
13081
+ bounds,
13082
+ copyColLength,
13083
+ copyRow,
13084
+ rowIndex,
13085
+ start,
13086
+ targetRange,
13087
+ }));
13088
+ lastRow = rowIndex;
13078
13089
  }
13079
- const range = getRange(start, {
13080
- y: rowIndex - 1,
13081
- x: maxCol,
13082
- });
13083
13090
  return {
13084
13091
  changed,
13085
- range,
13092
+ range: this.getAppliedRange(bounds, lastRow, maxCol),
13086
13093
  };
13087
13094
  }
13095
+ getDataApplyBounds(start, targetRange, copyRowLength, rowLength, colLength) {
13096
+ var _a, _b, _c;
13097
+ const startRow = (_a = targetRange === null || targetRange === void 0 ? void 0 : targetRange.y) !== null && _a !== void 0 ? _a : start.y;
13098
+ const startCol = (_b = targetRange === null || targetRange === void 0 ? void 0 : targetRange.x) !== null && _b !== void 0 ? _b : start.x;
13099
+ const endRow = Math.min(rowLength - 1, (_c = targetRange === null || targetRange === void 0 ? void 0 : targetRange.y1) !== null && _c !== void 0 ? _c : start.y + copyRowLength - 1);
13100
+ if (endRow < startRow || startCol >= colLength) {
13101
+ return null;
13102
+ }
13103
+ return { startRow, startCol, endRow, colLength };
13104
+ }
13105
+ applyClipboardRow(changed, { bounds, copyColLength, copyRow, rowIndex, start, targetRange, }) {
13106
+ var _a;
13107
+ const endCol = Math.min(bounds.colLength - 1, (_a = targetRange === null || targetRange === void 0 ? void 0 : targetRange.x1) !== null && _a !== void 0 ? _a : start.x + copyColLength - 1);
13108
+ for (let colIndex = bounds.startCol, j = 0; colIndex <= endCol; colIndex++, j++) {
13109
+ if (this.isReadOnly(rowIndex, colIndex)) {
13110
+ continue;
13111
+ }
13112
+ const prop = this.columns[colIndex].prop;
13113
+ changed[rowIndex] = changed[rowIndex] || {};
13114
+ changed[rowIndex][prop] = copyRow[j % copyColLength];
13115
+ }
13116
+ return endCol;
13117
+ }
13118
+ getAppliedRange({ startRow, startCol }, lastRow, maxCol) {
13119
+ if (lastRow < startRow || maxCol < startCol) {
13120
+ return null;
13121
+ }
13122
+ return getRange({ x: startCol, y: startRow }, {
13123
+ y: lastRow,
13124
+ x: maxCol,
13125
+ });
13126
+ }
13088
13127
  getRangeStaticData(d, value) {
13089
13128
  const changed = {};
13090
13129
  // rows
@@ -13751,6 +13790,30 @@ class AutoFillService {
13751
13790
  }
13752
13791
  }
13753
13792
 
13793
+ function getRangeFillClipboardData(data, useClipboard) {
13794
+ var _a;
13795
+ if (!isClipboardRangeFillEnabled(useClipboard)) {
13796
+ return null;
13797
+ }
13798
+ const normalized = trimTrailingEmptyClipboardRows(data);
13799
+ return normalized.length === 1 && ((_a = normalized[0]) === null || _a === void 0 ? void 0 : _a.length) === 1
13800
+ ? normalized
13801
+ : null;
13802
+ }
13803
+ function isClipboardRangeFillEnabled(useClipboard) {
13804
+ return (typeof useClipboard === 'object' && useClipboard.rangeFill === true);
13805
+ }
13806
+ function trimTrailingEmptyClipboardRows(data) {
13807
+ const rows = [...data];
13808
+ while (rows.length > 1 && isEmptyClipboardRow(rows[rows.length - 1])) {
13809
+ rows.pop();
13810
+ }
13811
+ return rows;
13812
+ }
13813
+ function isEmptyClipboardRow(row) {
13814
+ return !row || row.every(cell => cell === '');
13815
+ }
13816
+
13754
13817
  const revogrOverlayStyleCss = () => `revogr-overlay-selection{display:block;position:relative;width:100%}revogr-overlay-selection .autofill-handle{position:absolute;width:14px;height:14px;margin-left:-13px;margin-top:-13px;z-index:10;cursor:crosshair}revogr-overlay-selection .autofill-handle::before{content:"";position:absolute;right:0;bottom:0;width:10px;height:10px;background:#0d63e8;border:1px solid white;box-sizing:border-box}revogr-overlay-selection.mobile .autofill-handle{position:absolute;width:30px;height:30px;margin-left:-29px;margin-top:-29px;z-index:10;cursor:crosshair}revogr-overlay-selection.mobile .autofill-handle::before{content:"";position:absolute;right:0;bottom:0;width:12px;height:12px;background:#0d63e8;border:1px solid white;box-sizing:border-box}revogr-overlay-selection .selection-border-range{position:absolute;pointer-events:none;z-index:9;box-shadow:-1px 0 0 #0d63e8 inset, 1px 0 0 #0d63e8 inset, 0 -1px 0 #0d63e8 inset, 0 1px 0 #0d63e8 inset}revogr-overlay-selection .selection-border-range .range-handlers{height:100%;background-color:transparent;width:75%;max-width:50px;min-width:20px;left:50%;transform:translateX(-50%);position:absolute}revogr-overlay-selection .selection-border-range .range-handlers>span{pointer-events:auto;height:20px;width:20px;position:absolute;left:50%;transform:translateX(-50%)}revogr-overlay-selection .selection-border-range .range-handlers>span:before,revogr-overlay-selection .selection-border-range .range-handlers>span:after{position:absolute;border-radius:5px;width:15px;height:5px;left:50%;transform:translateX(-50%);background-color:rgba(0, 0, 0, 0.2)}revogr-overlay-selection .selection-border-range .range-handlers>span:first-child{top:-7px}revogr-overlay-selection .selection-border-range .range-handlers>span:first-child:before{content:"";top:0}revogr-overlay-selection .selection-border-range .range-handlers>span:last-child{bottom:-7px}revogr-overlay-selection .selection-border-range .range-handlers>span:last-child:after{content:"";bottom:0}revogr-overlay-selection revogr-edit{z-index:10}`;
13755
13818
 
13756
13819
  /**
@@ -14001,9 +14064,9 @@ class OverlaySelection {
14001
14064
  nodes.push(hAsync("revogr-order-editor", { ref: e => (this.orderEditor = e), dataStore: this.dataStore, dimensionRow: this.dimensionRow, dimensionCol: this.dimensionCol, parent: this.element, rowType: this.types.rowType, onRowdragstartinit: e => this.rowDragStart(e) }));
14002
14065
  }
14003
14066
  }
14004
- return (hAsync(Host, { key: 'd936e8452e84c7a25ecd6502e929f1a5af69467f', class: { mobile: this.isMobileDevice }, onDblClick: (e) => this.onElementDblClick(e), onMouseDown: (e) => this.onElementMouseDown(e), onTouchStart: (e) => this.onElementMouseDown(e, true), onCloseedit: (e) => this.closeEdit(e),
14067
+ return (hAsync(Host, { key: 'ff303c39d59e4ef217421fa11b9a80de07311b07', class: { mobile: this.isMobileDevice }, onDblClick: (e) => this.onElementDblClick(e), onMouseDown: (e) => this.onElementMouseDown(e), onTouchStart: (e) => this.onElementMouseDown(e, true), onCloseedit: (e) => this.closeEdit(e),
14005
14068
  // it's done to be able to throw events from different levels, not just from editor
14006
- onCelledit: (e) => this.onEditCell(e) }, nodes, hAsync("slot", { key: 'cd3525d404aa44fd8d06e7fc459777acb8a9d585', name: "data" })));
14069
+ onCelledit: (e) => this.onEditCell(e) }, nodes, hAsync("slot", { key: '3cbe4c3ad7d447f779e9e20f73eec2e3107275e0', name: "data" })));
14007
14070
  }
14008
14071
  /**
14009
14072
  * Executes the focus operation on the specified range of cells.
@@ -14168,13 +14231,25 @@ class OverlaySelection {
14168
14231
  if (!focus || isEditing) {
14169
14232
  return;
14170
14233
  }
14171
- let { changed, range } = this.columnService.getTransformedDataToApply(focus, data);
14234
+ const rangeFillData = getRangeFillClipboardData(data, this.useClipboard);
14235
+ const targetRange = rangeFillData
14236
+ ? this.getClipboardPasteTargetRange()
14237
+ : null;
14238
+ let { changed, range } = this.columnService.getTransformedDataToApply({
14239
+ start: focus,
14240
+ data: rangeFillData || data,
14241
+ targetRange,
14242
+ });
14172
14243
  const { defaultPrevented: canPaste } = this.rangeClipboardPaste.emit(Object.assign({ data: changed, models: collectModelsOfRange(changed, this.dataStore), range }, this.types));
14173
14244
  if (canPaste) {
14174
14245
  return;
14175
14246
  }
14176
14247
  (_a = this.autoFillService) === null || _a === void 0 ? void 0 : _a.onRangeApply(changed, range, range);
14177
14248
  }
14249
+ getClipboardPasteTargetRange() {
14250
+ const range = this.selectionStore.get('range');
14251
+ return range && !isRangeSingleCell(range) ? range : null;
14252
+ }
14178
14253
  async focusNext() {
14179
14254
  var _a;
14180
14255
  const canFocus = await ((_a = this.keyboardService) === null || _a === void 0 ? void 0 : _a.keyChangeSelection(new KeyboardEvent('keydown', {
@@ -15722,7 +15797,7 @@ class FilterPlugin extends BasePlugin {
15722
15797
  // filter button clicked, open filter dialog
15723
15798
  const gridPos = this.revogrid.getBoundingClientRect();
15724
15799
  const buttonPos = el.getBoundingClientRect();
15725
- const data = Object.assign(Object.assign(Object.assign({}, e.detail), this.filterCollection[prop]), { x: buttonPos.x - gridPos.x, y: buttonPos.y - gridPos.y + buttonPos.height, autoCorrect: true, filterTypes: this.getColumnFilter(e.detail.filter), filterItems: this.multiFilterItems, extraContent: this.extraHyperContent });
15800
+ const data = Object.assign(Object.assign(Object.assign({}, e.detail), this.filterCollection[prop]), { x: buttonPos.x - gridPos.x, y: buttonPos.y - gridPos.y + buttonPos.height, autoCorrect: true, filterTypes: this.getColumnFilter(e.detail.filter), filterItems: this.multiFilterItems, extraContent: this.extraHyperContent, extraBottomContent: this.extraBottomHyperContent });
15726
15801
  (_b = this.beforeshow) === null || _b === void 0 ? void 0 : _b.call(this, data);
15727
15802
  this.pop.show(data);
15728
15803
  }
@@ -18487,8 +18562,17 @@ class ColumnMovePlugin extends BasePlugin {
18487
18562
  constructor(revogrid, providers) {
18488
18563
  super(revogrid, providers);
18489
18564
  this.moveFunc = debounce$1((e) => this.doMove(e), 5);
18565
+ this.preventHeaderClickAfterDrag = (event) => {
18566
+ if (!this.preventNextHeaderClick) {
18567
+ return;
18568
+ }
18569
+ this.preventNextHeaderClick = false;
18570
+ event.preventDefault();
18571
+ };
18490
18572
  this.staticDragData = null;
18491
18573
  this.dragData = null;
18574
+ this.columnDragMoved = false;
18575
+ this.preventNextHeaderClick = false;
18492
18576
  this.localSubscriptions = {};
18493
18577
  this.orderUi = new ColumnOrderHandler();
18494
18578
  revogrid.appendChild(this.orderUi.render());
@@ -18507,11 +18591,13 @@ class ColumnMovePlugin extends BasePlugin {
18507
18591
  callback: (e) => this.move(e),
18508
18592
  };
18509
18593
  this.addEventListener(COLUMN_CLICK, ({ detail }) => this.dragStart(detail));
18594
+ this.revogrid.addEventListener('beforeheaderclick', this.preventHeaderClickAfterDrag, { capture: true });
18510
18595
  }
18511
18596
  dragStart({ event, data }) {
18512
18597
  if (event.defaultPrevented) {
18513
18598
  return;
18514
18599
  }
18600
+ this.preventNextHeaderClick = false;
18515
18601
  const { defaultPrevented } = dispatch(this.revogrid, COLUMN_DRAG_START_EVENT, data);
18516
18602
  // check if allowed to drag particulat column
18517
18603
  if (defaultPrevented) {
@@ -18533,7 +18619,8 @@ class ColumnMovePlugin extends BasePlugin {
18533
18619
  const cols = this.getDimension(data.pin || 'rgCol');
18534
18620
  const gridRect = this.revogrid.getBoundingClientRect();
18535
18621
  const elRect = dataEl.getBoundingClientRect();
18536
- const startItem = getItemByPosition(cols, getLeftRelative(event.x, gridRect.left, elRect.left - gridRect.left) + (cols.renderOffset || 0));
18622
+ const startItem = getItemByPosition(cols, getLeftRelative(event.x, gridRect.left, elRect.left - gridRect.left) +
18623
+ (cols.renderOffset || 0));
18537
18624
  this.staticDragData = {
18538
18625
  startPos: event.x,
18539
18626
  startItem,
@@ -18564,10 +18651,14 @@ class ColumnMovePlugin extends BasePlugin {
18564
18651
  if (rgCol.itemIndex >= this.staticDragData.cols.count) {
18565
18652
  return;
18566
18653
  }
18567
- this.orderUi.showHandler(rgCol.end - (this.staticDragData.cols.renderOffset || 0) + dragData.scrollOffset, dragData.gridRect.width);
18654
+ this.orderUi.showHandler(getColumnDragPosition(rgCol, this.staticDragData.startItem, this.staticDragData.cols.renderOffset || 0, dragData.scrollOffset), dragData.gridRect.width);
18568
18655
  }
18569
18656
  }
18570
18657
  move(e) {
18658
+ if (this.staticDragData &&
18659
+ Math.abs(this.staticDragData.startPos - e.x) > 10) {
18660
+ this.columnDragMoved = true;
18661
+ }
18571
18662
  dispatch(this.revogrid, COLUMN_DRAG_MOVE_EVENT, e);
18572
18663
  // then do move
18573
18664
  this.moveFunc(e);
@@ -18576,6 +18667,7 @@ class ColumnMovePlugin extends BasePlugin {
18576
18667
  this.clearOrder();
18577
18668
  }
18578
18669
  onMouseUp(e) {
18670
+ const suppressClick = this.columnDragMoved;
18579
18671
  // apply new positions
18580
18672
  if (this.dragData && this.staticDragData) {
18581
18673
  let relativePos = getLeftRelative(e.x, this.dragData.gridRect.left, this.dragData.scrollOffset);
@@ -18598,6 +18690,9 @@ class ColumnMovePlugin extends BasePlugin {
18598
18690
  }
18599
18691
  dispatch(this.revogrid, COLUMN_DRAG_END_EVENT, this.getData(this.staticDragData, newItems, source));
18600
18692
  }
18693
+ if (suppressClick) {
18694
+ this.preventNextHeaderClick = !!e.target.closest('revogr-header');
18695
+ }
18601
18696
  this.clearOrder();
18602
18697
  }
18603
18698
  clearLocalSubscriptions() {
@@ -18606,6 +18701,7 @@ class ColumnMovePlugin extends BasePlugin {
18606
18701
  clearOrder() {
18607
18702
  this.staticDragData = null;
18608
18703
  this.dragData = null;
18704
+ this.columnDragMoved = false;
18609
18705
  this.clearLocalSubscriptions();
18610
18706
  this.orderUi.stop(this.revogrid);
18611
18707
  }
@@ -18615,6 +18711,7 @@ class ColumnMovePlugin extends BasePlugin {
18615
18711
  clearSubscriptions() {
18616
18712
  super.clearSubscriptions();
18617
18713
  this.clearLocalSubscriptions();
18714
+ this.revogrid.removeEventListener('beforeheaderclick', this.preventHeaderClickAfterDrag, { capture: true });
18618
18715
  }
18619
18716
  getData({ gridEl, dataEl, pin }, order, source = []) {
18620
18717
  const gridRect = gridEl.getBoundingClientRect();
@@ -18636,6 +18733,12 @@ class ColumnMovePlugin extends BasePlugin {
18636
18733
  function getLeftRelative(absoluteX, gridPos, offset) {
18637
18734
  return absoluteX - gridPos - offset;
18638
18735
  }
18736
+ function getColumnDragPosition(targetItem, startItem, renderOffset, scrollOffset) {
18737
+ const insertionEdge = startItem.itemIndex > targetItem.itemIndex
18738
+ ? targetItem.start
18739
+ : targetItem.end;
18740
+ return insertionEdge - renderOffset + scrollOffset;
18741
+ }
18639
18742
 
18640
18743
  function isMobileDevice() {
18641
18744
  return /Mobi/i.test(navigator.userAgent) || /Android/i.test(navigator.userAgent) || navigator.maxTouchPoints > 0;
@@ -18985,7 +19088,7 @@ class RevoGridComponent {
18985
19088
  this.rowSize = 0;
18986
19089
  /** Indicates default column size. */
18987
19090
  this.colSize = 100;
18988
- /** When true, user can range selection. */
19091
+ /** When true, user can select a cell range. Required for range-based clipboard fill. */
18989
19092
  this.range = false;
18990
19093
  /** When true, grid in read only mode. */
18991
19094
  this.readonly = false;
@@ -18997,7 +19100,7 @@ class RevoGridComponent {
18997
19100
  this.noHorizontalScrollTransfer = false;
18998
19101
  /** When true cell focus appear. */
18999
19102
  this.canFocus = true;
19000
- /** When true enable clipboard. */
19103
+ /** When true enable clipboard. Can be boolean or clipboard config. */
19001
19104
  this.useClipboard = true;
19002
19105
  /**
19003
19106
  * Columns - defines an array of grid columns.