@revolist/revogrid 4.9.1 → 4.9.2

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 (56) hide show
  1. package/dist/cjs/revogr-attribution_6.cjs.entry.js +14 -8
  2. package/dist/cjs/revogr-attribution_6.cjs.entry.js.map +1 -1
  3. package/dist/cjs/revogr-clipboard_3.cjs.entry.js +5 -2
  4. package/dist/cjs/revogr-clipboard_3.cjs.entry.js.map +1 -1
  5. package/dist/collection/components/clipboard/revogr-clipboard.js +66 -87
  6. package/dist/collection/components/clipboard/revogr-clipboard.js.map +1 -1
  7. package/dist/collection/components/overlay/autofill.service.js +6 -8
  8. package/dist/collection/components/overlay/autofill.service.js.map +1 -1
  9. package/dist/collection/components/overlay/revogr-overlay-selection.js +22 -10
  10. package/dist/collection/components/overlay/revogr-overlay-selection.js.map +1 -1
  11. package/dist/collection/components/overlay/selection.utils.js +9 -1
  12. package/dist/collection/components/overlay/selection.utils.js.map +1 -1
  13. package/dist/collection/types/interfaces.js.map +1 -1
  14. package/dist/esm/revogr-attribution_6.entry.js +15 -9
  15. package/dist/esm/revogr-attribution_6.entry.js.map +1 -1
  16. package/dist/esm/revogr-clipboard_3.entry.js +5 -2
  17. package/dist/esm/revogr-clipboard_3.entry.js.map +1 -1
  18. package/dist/revo-grid/revogr-attribution_6.entry.js +1 -1
  19. package/dist/revo-grid/revogr-attribution_6.entry.js.map +1 -1
  20. package/dist/revo-grid/revogr-clipboard_3.entry.js.map +1 -1
  21. package/dist/types/components/clipboard/revogr-clipboard.d.ts +32 -24
  22. package/dist/types/components/overlay/autofill.service.d.ts +3 -1
  23. package/dist/types/components/overlay/revogr-overlay-selection.d.ts +12 -3
  24. package/dist/types/components/overlay/selection.utils.d.ts +4 -1
  25. package/dist/types/components.d.ts +67 -42
  26. package/dist/types/types/interfaces.d.ts +15 -1
  27. package/hydrate/index.js +19 -10
  28. package/hydrate/index.mjs +19 -10
  29. package/package.json +1 -1
  30. package/standalone/column.service.js +1 -2
  31. package/standalone/column.service.js.map +1 -1
  32. package/standalone/data.store.js +2950 -3
  33. package/standalone/data.store.js.map +1 -1
  34. package/standalone/debounce.js +1 -1
  35. package/standalone/dimension.helpers.js +2 -2
  36. package/standalone/revo-grid.js +1 -2
  37. package/standalone/revo-grid.js.map +1 -1
  38. package/standalone/revogr-clipboard2.js +5 -2
  39. package/standalone/revogr-clipboard2.js.map +1 -1
  40. package/standalone/revogr-data2.js +0 -1
  41. package/standalone/revogr-data2.js.map +1 -1
  42. package/standalone/revogr-focus2.js +0 -1
  43. package/standalone/revogr-focus2.js.map +1 -1
  44. package/standalone/revogr-header2.js +1 -2
  45. package/standalone/revogr-header2.js.map +1 -1
  46. package/standalone/revogr-order-editor2.js +0 -1
  47. package/standalone/revogr-order-editor2.js.map +1 -1
  48. package/standalone/revogr-overlay-selection2.js +8 -11
  49. package/standalone/revogr-overlay-selection2.js.map +1 -1
  50. package/standalone/revogr-row-headers2.js +0 -1
  51. package/standalone/revogr-row-headers2.js.map +1 -1
  52. package/standalone/selection.utils.js +10 -2
  53. package/standalone/selection.utils.js.map +1 -1
  54. package/standalone/toNumber.js +1 -1
  55. package/standalone/_baseIteratee.js +0 -2956
  56. package/standalone/_baseIteratee.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"names":["Clipboard","onPaste","e","this","readonly","clipboardData","getData","isHTML","types","indexOf","data","dataText","beforePaste","emit","raw","event","defaultPrevented","parsedData","detail","table","htmlParse","textParse","beforePasteApply","parsed","pasteRegion","afterPasteApply","preventDefault","copyStarted","beforeCopy","copyRegion","undefined","cutStarted","beforeCut","clearRegion","doCopy","beforeCopyApply","parserCopy","setData","map","rgRow","join","result","rows","split","y","push","fragment","document","createRange","createContextualFragment","querySelector","Array","from","cells","cell","innerText","window","TextEditor","constructor","column","saveCallback","element","editCell","componentDidRender","editInput","timeout","_a","focus","onKeyDown","isEnter","isEnterKeyValue","key","isKeyTab","isTab","target","isComposing","beforeDisconnect","getValue","blur","value","render","h","_additionalData","type","enterKeyHint","_b","val","ref","el","revogrEditStyleCss","RevogrEditStyle0","RevoEdit","currentEditor","preventSaveOnClose","cancelChanges","call","onAutoSave","_c","beforeAutoSave","canSave","onSave","preventFocus","cellEdit","rgCol","x","prop","componentWillRender","editor","isEditorCtrConstructible","focusNext","closeEdit","firstElementChild","disconnectedCallback","saveOnClose","Host","class","EDIT_INPUT_WR","additionalData","RowOrderService","config","currentCell","previousRow","endOrder","newRow","getCell","positionChanged","clear","startOrder","move","getRow","itemIndex","top","getBoundingClientRect","topRelative","getItemByPosition","absolutePosition","start","end","cols","left","leftRelative","OrderEditor","events","rowMoveFunc","debounce","rowOrderService","rowDrag","dragStart","originalEvent","length","clearOrder","pos","dragStartEvent","rowDragStart","text","DRAGG_TEXT","moveMove","mouseUp","mouseLeave","name","listener","addEventListener","forEach","v","removeEventListener","rowDragEnd","rowMouseMove","connectedCallback","f","t","onPositionChanged","to","dropEvent","rowDropped","items","dataStore","get","toMove","splice","setItems","parent","dimensionRow","state","dimensionCol"],"sources":["src/components/clipboard/revogr-clipboard.tsx","src/components/editors/text-editor.tsx","src/components/editors/revogr-edit-style.scss?tag=revogr-edit","src/components/editors/revogr-edit.tsx","src/components/order/order-row.service.ts","src/components/order/revogr-order-editor.tsx"],"sourcesContent":["import { Component, Listen, Method, Event, EventEmitter, Prop } from '@stencil/core';\nimport { DataFormat } from '@type';\n/**\n * This Clipboard provides functionality for handling clipboard events in a web application.\n */\n@Component({ tag: 'revogr-clipboard' })\nexport class Clipboard {\n /**\n * If readonly mode - disabled Paste event\n */\n @Prop() readonly: boolean;\n\n /**\n * Paste 1. Fired before paste applied to the grid\n * @property {string} raw - raw data from clipboard\n * @property {ClipboardEvent} event - original event\n * @property {boolean} defaultPrevented - if true, paste will be canceled\n */\n @Event({ eventName: 'beforepaste' }) beforePaste: EventEmitter;\n\n /**\n * Paste 2. Fired before paste applied to the grid and after data parsed\n * @property {string} raw - raw data from clipboard\n * @property {string[][]} parsed - parsed data\n */\n @Event({ eventName: 'beforepasteapply' }) beforePasteApply: EventEmitter;\n\n /**\n * Paste 3. Internal method. When data region is ready pass it to the top.\n * @property {string[][]} data - data to paste\n * @property {boolean} defaultPrevented - if true, paste will be canceled\n */\n @Event({ eventName: 'pasteregion', bubbles: false }) pasteRegion: EventEmitter<string[][]>;\n\n\n /**\n * Paste 4. Fired after paste applied to the grid\n * @property {string} raw - raw data from clipboard\n * @property {string[][]} parsed - parsed data\n * @property {ClipboardEvent} event - original event\n * @property {boolean} defaultPrevented - if true, paste will be canceled\n */\n @Event({ eventName: 'afterpasteapply' }) afterPasteApply: EventEmitter;\n\n /**\n * Cut 1. Fired before cut triggered\n * @property {ClipboardEvent} event - original event\n * @property {boolean} defaultPrevented - if true, cut will be canceled\n */\n @Event({ eventName: 'beforecut' }) beforeCut: EventEmitter;\n\n /**\n * Cut 2. Clears region when cut is done\n */\n @Event({ eventName: 'clearregion' }) clearRegion: EventEmitter<DataTransfer>;\n\n /**\n * Copy 1. Fired before copy triggered\n * @property {ClipboardEvent} event - original event\n * @property {boolean} defaultPrevented - if true, copy will be canceled\n */\n @Event({ eventName: 'beforecopy' }) beforeCopy: EventEmitter;\n\n /**\n * Copy Method 1. Fired before copy applied to the clipboard from outside.\n * @property {DataTransfer} event - original event\n * @property {string} data - data to copy\n * @property {boolean} defaultPrevented - if true, copy will be canceled\n */\n @Event({ eventName: 'beforecopyapply' }) beforeCopyApply: EventEmitter;\n\n /**\n * Copy 2. Fired when region copied\n * @property {DataTransfer} data - data to copy\n * @property {boolean} defaultPrevented - if true, copy will be canceled\n */\n @Event({ eventName: 'copyregion', bubbles: false }) copyRegion: EventEmitter<DataTransfer>;\n\n @Listen('paste', { target: 'document' }) onPaste(e: ClipboardEvent) {\n // if readonly do nothing\n if (this.readonly) {\n return;\n }\n const clipboardData = this.getData(e);\n const isHTML = (clipboardData?.types.indexOf('text/html') || -1) > -1;\n const data = isHTML ? clipboardData?.getData('text/html') : clipboardData?.getData('text');\n const dataText = clipboardData?.getData('text');\n\n const beforePaste = this.beforePaste.emit({\n raw: data,\n dataText,\n isHTML,\n event: e,\n });\n\n if (beforePaste.defaultPrevented) {\n return;\n }\n\n let parsedData: string[][];\n // if html, then search for table if no table fallback to regular text parsing\n if (beforePaste.detail.isHTML) {\n const table = this.htmlParse(beforePaste.detail.raw);\n // fallback to text if not possible to parse as html\n parsedData = table || this.textParse(dataText || '');\n } else {\n parsedData = this.textParse(beforePaste.detail.raw);\n }\n const beforePasteApply = this.beforePasteApply.emit({\n raw: data,\n parsed: parsedData,\n event: e,\n });\n if (beforePasteApply.defaultPrevented) {\n return;\n }\n this.pasteRegion.emit(beforePasteApply.detail.parsed);\n // post paste action\n const afterPasteApply = this.afterPasteApply.emit({\n raw: data,\n parsed: parsedData,\n event: e,\n });\n // keep default behavior if needed\n if (afterPasteApply.defaultPrevented) {\n return;\n }\n e.preventDefault();\n }\n\n /**\n * Listen to copy event and emit copy region event\n */\n @Listen('copy', { target: 'document' }) copyStarted(e: ClipboardEvent) {\n const beforeCopy = this.beforeCopy.emit({\n event: e,\n });\n if (beforeCopy.defaultPrevented) {\n return;\n }\n const data = this.getData(beforeCopy.detail.event);\n this.copyRegion.emit(data || undefined);\n e.preventDefault();\n }\n\n /**\n * Listen to copy event and emit copy region event\n */\n @Listen('cut', { target: 'document' }) cutStarted(e: ClipboardEvent) {\n const beforeCut = this.beforeCut.emit({\n event: e,\n });\n if (beforeCut.defaultPrevented) {\n return;\n }\n const data = this.getData(beforeCut.detail.event);\n this.copyStarted(e);\n\n // if readonly do nothing\n if (this.readonly) {\n return;\n }\n\n this.clearRegion.emit(data || undefined);\n e.preventDefault();\n }\n\n @Method() async doCopy(e: DataTransfer, data?: DataFormat[][]) {\n const beforeCopyApply = this.beforeCopyApply.emit({\n event: e,\n data,\n });\n if (beforeCopyApply.defaultPrevented) {\n return;\n }\n const parsed = data ? this.parserCopy(data) : '';\n e.setData('text/plain', parsed);\n }\n\n parserCopy(data: DataFormat[][]) {\n return data.map(rgRow => rgRow.join('\\t')).join('\\n');\n }\n\n private textParse(data: string) {\n const result: string[][] = [];\n const rows = data.split(/\\r\\n|\\n|\\r/);\n for (let y in rows) {\n result.push(rows[y].split('\\t'));\n }\n return result;\n }\n\n private htmlParse(data: string) {\n const result: string[][] = [];\n const fragment = document.createRange().createContextualFragment(data);\n const table = fragment.querySelector('table');\n if (!table) {\n return null;\n }\n for (const rgRow of Array.from(table.rows)) {\n result.push(Array.from(rgRow.cells).map(cell => cell.innerText));\n }\n return result;\n }\n\n private getData(e: ClipboardEvent) {\n return e.clipboardData || (window as unknown as { clipboardData: DataTransfer | null })?.clipboardData;\n }\n}\n","import { VNode, h as createElement } from '@stencil/core';\nimport { isEnterKeyValue, isTab } from '../../utils/key.utils';\nimport { timeout } from '../../utils';\nimport { ColumnRegular } from '@type';\nimport { EditCell, EditorBase, SaveData } from '@type';\n\n/**\n * Represents a cell editor in a grid.\n *\n * It's a good place to start with your own editor.\n * It manages the editing of cells by handling events, saving data, rendering the editor UI, and managing the lifecycle of the editor instance.\n */\n\n/**\n * Callback triggered on cell editor save\n * Closes editor when called\n * @param preventFocus - if true editor will not be closed and next cell will not be focused\n */\nexport type SaveCallback = (value: SaveData, preventFocus: boolean) => void;\n\nexport class TextEditor implements EditorBase {\n private editInput!: HTMLInputElement;\n\n public element: Element | null = null;\n public editCell?: EditCell = undefined;\n\n constructor(\n public column: ColumnRegular,\n private saveCallback?: SaveCallback,\n ) {}\n\n /**\n * Callback triggered on cell editor render\n */\n async componentDidRender(): Promise<void> {\n if (this.editInput) {\n await timeout();\n this.editInput?.focus();\n }\n }\n\n private onKeyDown(e: KeyboardEvent) {\n const isEnter = isEnterKeyValue(e.key);\n const isKeyTab = isTab(e.key);\n\n if (\n (isKeyTab || isEnter) &&\n e.target &&\n this.saveCallback &&\n !e.isComposing\n ) {\n // blur is needed to avoid autoscroll\n this.beforeDisconnect();\n // request callback which will close cell after all\n this.saveCallback(this.getValue(), isKeyTab);\n }\n }\n\n /**\n * IMPORTANT: Prevent scroll glitches when editor is closed and focus is on current input element.\n */\n beforeDisconnect() {\n this.editInput.blur();\n }\n\n /**\n * Get value from input\n */\n getValue() {\n return this.editInput?.value;\n }\n\n /**\n * Render method for Editor plugin.\n * Renders input element with passed data from cell.\n *\n * @required @method\n * @param {Function} h - h function from stencil render.\n * @param {Object} _additionalData - additional data from plugin.\n * @returns {VNode} - input element.\n */\n render(h: typeof createElement, _additionalData: any): VNode | VNode[] {\n return h('input', {\n type: 'text',\n enterKeyHint: 'enter',\n // set input value from cell data\n value: this.editCell?.val ?? '',\n // save input element as ref for further usage\n ref: (el: HTMLInputElement | null) => {\n this.editInput = el;\n },\n // listen to keydown event on input element\n onKeyDown: (e: KeyboardEvent) => this.onKeyDown(e),\n });\n }\n}\n","revogr-edit {\n display: block;\n position: absolute;\n background-color: #fff;\n\n input {\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n }\n\n revo-dropdown {\n height: 100%;\n\n &.shrink {\n fieldset legend > span {\n display: none;\n }\n }\n }\n}\n","import {\n Component,\n Event,\n EventEmitter,\n Prop,\n h,\n Element,\n Host,\n Method,\n} from '@stencil/core';\nimport { EDIT_INPUT_WR } from '../../utils/consts';\nimport { TextEditor } from './text-editor';\nimport { ColumnDataSchemaModel } from '@type';\nimport {\n EditCell,\n EditorCtr,\n SaveDataDetails,\n EditorBase,\n SaveData,\n} from '@type';\n\nimport { isEditorCtrConstructible } from './edit.utils';\n\n/**\n * Represents a cell editor in a grid.\n * It manages the editing of cells by handling events, saving data, rendering the editor UI,\n * and managing the lifecycle of the editor instance.\n */\n@Component({\n tag: 'revogr-edit',\n styleUrl: 'revogr-edit-style.scss',\n})\nexport class RevoEdit {\n /**\n * Cell to edit data.\n */\n @Prop() editCell: EditCell;\n\n /**\n * Column data for editor.\n */\n @Prop() column: ColumnDataSchemaModel | null;\n /**\n * Custom editors register\n */\n @Prop() editor: EditorCtr | null;\n\n /**\n * Save on editor close. Defines if data should be saved on editor close.\n */\n @Prop() saveOnClose = false;\n /**\n * Additional data to pass to renderer\n */\n @Prop() additionalData: any;\n\n /**\n * Cell edit event\n */\n @Event({ eventName: 'celledit' }) cellEdit: EventEmitter<SaveDataDetails>;\n\n /**\n * Close editor event\n * pass true if requires focus next\n */\n @Event({ eventName: 'closeedit' }) closeEdit: EventEmitter<\n boolean | undefined\n >;\n\n /** Edit session editor */\n @Element() element: HTMLElement;\n private currentEditor: EditorBase | null = null;\n private preventSaveOnClose = false;\n\n /**\n * Cancel pending changes flag. Editor will be closed without autosave.\n */\n @Method() async cancelChanges() {\n this.preventSaveOnClose = true;\n }\n\n /**\n * Before editor got disconnected.\n * Can be triggered multiple times before actual disconnect.\n */\n @Method() async beforeDisconnect() {\n this.currentEditor?.beforeDisconnect?.();\n }\n\n onAutoSave() {\n this.preventSaveOnClose = true;\n const val = this.currentEditor?.getValue?.();\n // For Editor plugin internal usage.\n // When you want to prevent save and use custom save of your own.\n if (this.currentEditor?.beforeAutoSave) {\n const canSave = this.currentEditor.beforeAutoSave(val);\n if (canSave === false) {\n return;\n }\n }\n this.onSave(val, true);\n }\n\n /**\n * Callback triggered when cell editor saved.\n * Closes editor when called.\n * @param preventFocus - if true, editor will not be closed & next cell will not be focused.\n */\n onSave(val: SaveData, preventFocus?: boolean) {\n this.preventSaveOnClose = true;\n if (this.editCell) {\n this.cellEdit.emit({\n rgCol: this.editCell.x,\n rgRow: this.editCell.y,\n type: this.editCell.type,\n prop: this.editCell.prop,\n val,\n preventFocus,\n });\n }\n }\n\n componentWillRender() {\n // Active editor present\n if (this.currentEditor) {\n return;\n }\n this.preventSaveOnClose = false;\n\n // Custom editor usage.\n // Start with TextEditor (editors/text.tsx) for Custom editor.\n // It can be class or function\n if (this.editor) {\n // if editor is constructible\n if (isEditorCtrConstructible(this.editor)) {\n this.currentEditor = new this.editor(\n this.column,\n // save callback\n (e, preventFocus) => {\n this.onSave(e, preventFocus);\n },\n // cancel callback\n focusNext => {\n this.preventSaveOnClose = true;\n this.closeEdit.emit(focusNext);\n },\n );\n // if editor is function\n } else {\n this.currentEditor = this.editor(\n this.column,\n // save callback\n (e, preventFocus) => {\n this.onSave(e, preventFocus);\n },\n // cancel callback\n focusNext => {\n this.preventSaveOnClose = true;\n this.closeEdit.emit(focusNext);\n },\n );\n }\n return;\n }\n // Default text editor usage\n this.currentEditor = new TextEditor(this.column, (e, preventFocus) =>\n this.onSave(e, preventFocus),\n );\n }\n\n componentDidRender() {\n if (!this.currentEditor) {\n return;\n }\n this.currentEditor.element = this.element.firstElementChild;\n this.currentEditor.componentDidRender?.();\n }\n\n disconnectedCallback() {\n if (this.saveOnClose) {\n // Can not be cancelled by `preventSaveOnClose` prop.\n // Editor requires `getValue` to be able to save.\n if (!this.preventSaveOnClose) {\n this.onAutoSave();\n }\n }\n\n this.preventSaveOnClose = false;\n if (!this.currentEditor) {\n return;\n }\n\n this.currentEditor.disconnectedCallback?.();\n this.currentEditor.element = null;\n this.currentEditor = null;\n }\n\n render() {\n if (this.currentEditor) {\n this.currentEditor.editCell = this.editCell;\n return (\n <Host class={EDIT_INPUT_WR}>\n {this.currentEditor.render(h, this.additionalData)}\n </Host>\n );\n }\n return '';\n }\n}\n","import { getItemByPosition } from '@store';\nimport { DimensionSettingsState, PositionItem, Cell } from '@type';\n\ntype EventData = { el: HTMLElement; rows: DimensionSettingsState; cols: DimensionSettingsState };\ninterface Config {\n positionChanged(from: number, to: number): void;\n}\n\nexport default class RowOrderService {\n private currentCell: Cell | null = null;\n private previousRow: number | null = null;\n\n constructor(private config: Config) {}\n\n /** Drag finished, calculate and apply changes */\n endOrder(e: MouseEvent, data: EventData) {\n if (this.currentCell === null) {\n return;\n }\n const newRow = this.getCell(e, data);\n\n // if position changed\n if (newRow.y !== this.currentCell.y) {\n // rgRow dragged out table\n if (newRow.y < 0) {\n newRow.y = 0;\n }\n // rgRow dragged to the top\n else if (newRow.y < this.currentCell.y) {\n newRow.y++;\n }\n this.config.positionChanged(this.currentCell.y, newRow.y);\n }\n this.clear();\n }\n\n /** Drag started, reserve initial cell for farther use */\n startOrder(e: MouseEvent, data: EventData): Cell {\n this.currentCell = this.getCell(e, data);\n return this.currentCell;\n }\n\n move(y: number, data: EventData): PositionItem | null {\n const rgRow = this.getRow(y, data);\n // if rgRow same as previous or below range (-1 = 0) do nothing\n if (this.previousRow === rgRow.itemIndex || rgRow.itemIndex < -1) {\n return null;\n }\n this.previousRow = rgRow.itemIndex;\n return rgRow;\n }\n\n /** Drag stopped, probably cursor outside of document area */\n clear() {\n this.currentCell = null;\n this.previousRow = null;\n }\n\n /** Calculate cell based on x, y position */\n getRow(y: number, { el, rows }: EventData): PositionItem {\n const { top } = el.getBoundingClientRect();\n const topRelative = y - top;\n const rgRow = getItemByPosition(rows, topRelative);\n const absolutePosition = {\n itemIndex: rgRow.itemIndex,\n start: rgRow.start + top,\n end: rgRow.end + top,\n };\n return absolutePosition;\n }\n\n /** Calculate cell based on x, y position */\n getCell({ x, y }: Cell, { el, rows, cols }: EventData): Cell {\n const { top, left } = el.getBoundingClientRect();\n const topRelative = y - top;\n const leftRelative = x - left;\n const rgRow = getItemByPosition(rows, topRelative);\n const rgCol = getItemByPosition(cols, leftRelative);\n return { x: rgCol.itemIndex, y: rgRow.itemIndex };\n }\n}\n","import { Component, Method, Event, EventEmitter, Prop } from '@stencil/core';\nimport debounce from 'lodash/debounce';\n\nimport { DSourceState, setItems } from '@store';\nimport { DRAGG_TEXT } from '../../utils/consts';\nimport RowOrderService from './order-row.service';\nimport {\n DimensionRows,\n DataType,\n DimensionSettingsState,\n DragStartEvent,\n PositionItem,\n Cell,\n} from '@type';\nimport { Observable } from '../../utils/store.utils';\n\n/**\n * Component for handling row order editor.\n */\n@Component({ tag: 'revogr-order-editor' })\nexport class OrderEditor {\n // #region Properties\n /** Parent element */\n @Prop() parent: HTMLElement;\n /** Dimension settings Y */\n @Prop() dimensionRow: Observable<DimensionSettingsState>;\n /** Dimension settings X */\n @Prop() dimensionCol: Observable<DimensionSettingsState>;\n\n /** Static stores, not expected to change during component lifetime */\n @Prop() dataStore: Observable<DSourceState<DataType, DimensionRows>>;\n // #endregion\n\n // #region Events\n /** Row drag started */\n @Event({ eventName: 'rowdragstartinit', cancelable: true })\n rowDragStart: EventEmitter<{\n cell: Cell;\n text: string;\n pos: PositionItem;\n event: MouseEvent;\n }>;\n\n /** Row drag ended started */\n @Event({ eventName: 'rowdragendinit' })\n rowDragEnd: EventEmitter;\n\n /** Row move started */\n @Event({ eventName: 'rowdragmoveinit', cancelable: true })\n rowDrag: EventEmitter<PositionItem>;\n\n /** Row mouse move started */\n @Event({ eventName: 'rowdragmousemove', cancelable: true })\n rowMouseMove: EventEmitter<Cell>;\n\n /** Row dragged, new range ready to be applied */\n @Event({ eventName: 'rowdropinit', cancelable: true })\n rowDropped: EventEmitter<{\n from: number;\n to: number;\n }>;\n // #endregion\n\n // #region Private\n private rowOrderService: RowOrderService;\n private events: {\n name: keyof DocumentEventMap;\n listener: (e: MouseEvent) => void;\n }[] = [];\n private rowMoveFunc = debounce((y: number) => {\n const rgRow = this.rowOrderService.move(y, this.getData());\n if (rgRow !== null) {\n this.rowDrag.emit(rgRow);\n }\n }, 5);\n // #endregion\n\n // #region Methods\n @Method() async dragStart(e: DragStartEvent) {\n e.originalEvent.preventDefault();\n\n // extra check if previous ended\n if (this.events.length) {\n this.clearOrder();\n }\n\n const data = this.getData();\n const cell = this.rowOrderService.startOrder(e.originalEvent, data);\n const pos = this.rowOrderService.getRow(e.originalEvent.y, data);\n const dragStartEvent = this.rowDragStart.emit({\n cell,\n text: DRAGG_TEXT,\n pos,\n event: e.originalEvent,\n });\n if (dragStartEvent.defaultPrevented) {\n return;\n }\n\n const moveMove = (e: MouseEvent) => this.move(e);\n const mouseUp = (e: MouseEvent) => this.endOrder(e);\n const mouseLeave = () => this.clearOrder();\n\n this.events.push(\n {\n name: 'mousemove',\n listener: moveMove,\n },\n {\n name: 'mouseup',\n listener: mouseUp,\n },\n {\n name: 'mouseleave',\n listener: mouseLeave,\n },\n );\n document.addEventListener('mousemove', moveMove);\n // Action finished inside of the document\n document.addEventListener('mouseup', mouseUp);\n document.addEventListener('mouseleave', mouseLeave);\n }\n\n @Method() async endOrder(e: MouseEvent) {\n this.rowOrderService.endOrder(e, this.getData());\n this.clearOrder();\n }\n\n @Method() async clearOrder() {\n this.rowOrderService.clear();\n this.events.forEach(v => document.removeEventListener(v.name, v.listener));\n this.events.length = 0;\n this.rowDragEnd.emit();\n }\n // #endregion\n\n move({ x, y }: { x: number; y: number }) {\n this.rowMouseMove.emit({ x, y });\n this.rowMoveFunc(y);\n }\n\n connectedCallback() {\n this.rowOrderService = new RowOrderService({\n positionChanged: (f, t) => this.onPositionChanged(f, t),\n });\n }\n\n private onPositionChanged(from: number, to: number) {\n const dropEvent = this.rowDropped.emit({ from, to });\n if (dropEvent.defaultPrevented) {\n return;\n }\n const items = [...this.dataStore.get('items')];\n const toMove = items.splice(from, 1);\n items.splice(to, 0, ...toMove);\n setItems(this.dataStore, items);\n }\n\n private getData() {\n return {\n el: this.parent,\n rows: this.dimensionRow.state,\n cols: this.dimensionCol.state,\n };\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Clipboard","onPaste","e","this","readonly","clipboardData","getData","isHTML","types","indexOf","data","dataText","beforePaste","emit","raw","event","defaultPrevented","parsedData","detail","table","htmlParse","textParse","beforePasteApply","parsed","pasteRegion","afterPasteApply","preventDefault","copyStarted","beforeCopy","copyRegion","undefined","cutStarted","beforeCut","clearRegion","doCopy","beforeCopyApply","parserCopy","setData","map","rgRow","join","result","rows","split","y","push","fragment","document","createRange","createContextualFragment","querySelector","Array","from","cells","cell","innerText","window","TextEditor","constructor","column","saveCallback","element","editCell","componentDidRender","editInput","timeout","_a","focus","onKeyDown","isEnter","isEnterKeyValue","key","isKeyTab","isTab","target","isComposing","beforeDisconnect","getValue","blur","value","render","h","_additionalData","type","enterKeyHint","_b","val","ref","el","revogrEditStyleCss","RevogrEditStyle0","RevoEdit","currentEditor","preventSaveOnClose","cancelChanges","call","onAutoSave","_c","beforeAutoSave","canSave","onSave","preventFocus","cellEdit","rgCol","x","prop","componentWillRender","editor","isEditorCtrConstructible","focusNext","closeEdit","firstElementChild","disconnectedCallback","saveOnClose","Host","class","EDIT_INPUT_WR","additionalData","RowOrderService","config","currentCell","previousRow","endOrder","newRow","getCell","positionChanged","clear","startOrder","move","getRow","itemIndex","top","getBoundingClientRect","topRelative","getItemByPosition","absolutePosition","start","end","cols","left","leftRelative","OrderEditor","events","rowMoveFunc","debounce","rowOrderService","rowDrag","dragStart","originalEvent","length","clearOrder","pos","dragStartEvent","rowDragStart","text","DRAGG_TEXT","moveMove","mouseUp","mouseLeave","name","listener","addEventListener","forEach","v","removeEventListener","rowDragEnd","rowMouseMove","connectedCallback","f","t","onPositionChanged","to","dropEvent","rowDropped","items","dataStore","get","toMove","splice","setItems","parent","dimensionRow","state","dimensionCol"],"sources":["src/components/clipboard/revogr-clipboard.tsx","src/components/editors/text-editor.tsx","src/components/editors/revogr-edit-style.scss?tag=revogr-edit","src/components/editors/revogr-edit.tsx","src/components/order/order-row.service.ts","src/components/order/revogr-order-editor.tsx"],"sourcesContent":["import {\n Component,\n Listen,\n Method,\n Event,\n EventEmitter,\n Prop,\n} from '@stencil/core';\nimport { DataFormat } from '@type';\n/**\n * This Clipboard provides functionality for handling clipboard events in a web application.\n */\n@Component({ tag: 'revogr-clipboard' })\nexport class Clipboard {\n /**\n * If readonly mode - disabled Paste event\n */\n @Prop() readonly: boolean;\n\n /**\n * Paste 1. Fired before paste applied to the grid\n * defaultPrevented - if true, paste will be canceled\n */\n @Event({ eventName: 'beforepaste' }) beforePaste: EventEmitter<{\n raw: string;\n isHTML: boolean;\n event: ClipboardEvent;\n dataText: string;\n }>;\n\n /**\n * Paste 2. Fired before paste applied to the grid and after data parsed\n */\n @Event({ eventName: 'beforepasteapply' })\n beforePasteApply: EventEmitter<{\n raw: string;\n parsed: string[][];\n event: ClipboardEvent;\n }>;\n\n /**\n * Paste 3. Internal method. When data region is ready pass it to the top.\n * @property {string[][]} data - data to paste\n * @property {boolean} defaultPrevented - if true, paste will be canceled\n */\n @Event({ eventName: 'pasteregion', bubbles: false })\n pasteRegion: EventEmitter<string[][]>;\n\n /**\n * Paste 4. Fired after paste applied to the grid\n * defaultPrevented - if true, paste will be canceled\n */\n @Event({ eventName: 'afterpasteapply' }) afterPasteApply: EventEmitter<{\n raw: string;\n parsed: string[][];\n event: ClipboardEvent;\n }>;\n\n /**\n * Cut 1. Fired before cut triggered\n * defaultPrevented - if true, cut will be canceled\n */\n @Event({ eventName: 'beforecut' }) beforeCut: EventEmitter<{\n event: ClipboardEvent;\n }>;\n\n /**\n * Cut 2. Clears region when cut is done\n */\n @Event({ eventName: 'clearregion' }) clearRegion: EventEmitter<DataTransfer>;\n\n /**\n * Copy 1. Fired before copy triggered\n * defaultPrevented - if true, copy will be canceled\n */\n @Event({ eventName: 'beforecopy' }) beforeCopy: EventEmitter<{\n event: ClipboardEvent;\n }>;\n\n /**\n * Copy Method 1. Fired before copy applied to the clipboard from outside.\n * defaultPrevented - if true, copy will be canceled\n */\n @Event({ eventName: 'beforecopyapply' }) beforeCopyApply: EventEmitter<{\n event: DataTransfer;\n data?: string[][];\n }>;\n\n /**\n * Copy 2. Fired when region copied\n * defaultPrevented - if true, copy will be canceled\n */\n @Event({ eventName: 'copyregion', bubbles: false })\n copyRegion: EventEmitter<DataTransfer>;\n\n @Listen('paste', { target: 'document' }) onPaste(e: ClipboardEvent) {\n // if readonly do nothing\n if (this.readonly) {\n return;\n }\n const clipboardData = this.getData(e);\n const isHTML = (clipboardData?.types.indexOf('text/html') || -1) > -1;\n const data = isHTML\n ? clipboardData?.getData('text/html')\n : clipboardData?.getData('text');\n const dataText = clipboardData?.getData('text');\n\n const beforePaste = this.beforePaste.emit({\n raw: data,\n dataText,\n isHTML,\n event: e,\n });\n\n if (beforePaste.defaultPrevented) {\n return;\n }\n\n let parsedData: string[][];\n // if html, then search for table if no table fallback to regular text parsing\n if (beforePaste.detail.isHTML) {\n const table = this.htmlParse(beforePaste.detail.raw);\n // fallback to text if not possible to parse as html\n parsedData = table || this.textParse(dataText || '');\n } else {\n parsedData = this.textParse(beforePaste.detail.raw);\n }\n const beforePasteApply = this.beforePasteApply.emit({\n raw: data,\n parsed: parsedData,\n event: e,\n });\n if (beforePasteApply.defaultPrevented) {\n return;\n }\n this.pasteRegion.emit(beforePasteApply.detail.parsed);\n // post paste action\n const afterPasteApply = this.afterPasteApply.emit({\n raw: data,\n parsed: parsedData,\n event: e,\n });\n // keep default behavior if needed\n if (afterPasteApply.defaultPrevented) {\n return;\n }\n e.preventDefault();\n }\n\n /**\n * Listen to copy event and emit copy region event\n */\n @Listen('copy', { target: 'document' }) copyStarted(e: ClipboardEvent) {\n const beforeCopy = this.beforeCopy.emit({\n event: e,\n });\n if (beforeCopy.defaultPrevented) {\n return;\n }\n const data = this.getData(beforeCopy.detail.event);\n this.copyRegion.emit(data || undefined);\n e.preventDefault();\n }\n\n /**\n * Listen to copy event and emit copy region event\n */\n @Listen('cut', { target: 'document' }) cutStarted(e: ClipboardEvent) {\n const beforeCut = this.beforeCut.emit({\n event: e,\n });\n if (beforeCut.defaultPrevented) {\n return;\n }\n const data = this.getData(beforeCut.detail.event);\n this.copyStarted(e);\n\n // if readonly do nothing\n if (this.readonly) {\n return;\n }\n\n this.clearRegion.emit(data || undefined);\n e.preventDefault();\n }\n\n @Method() async doCopy(e: DataTransfer, data?: DataFormat[][]) {\n const beforeCopyApply = this.beforeCopyApply.emit({\n event: e,\n data,\n });\n if (beforeCopyApply.defaultPrevented) {\n return;\n }\n const parsed = data ? this.parserCopy(data) : '';\n e.setData('text/plain', parsed);\n }\n\n parserCopy(data: DataFormat[][]) {\n return data.map(rgRow => rgRow.join('\\t')).join('\\n');\n }\n\n private textParse(data: string) {\n const result: string[][] = [];\n const rows = data.split(/\\r\\n|\\n|\\r/);\n for (let y in rows) {\n result.push(rows[y].split('\\t'));\n }\n return result;\n }\n\n private htmlParse(data: string) {\n const result: string[][] = [];\n const fragment = document.createRange().createContextualFragment(data);\n const table = fragment.querySelector('table');\n if (!table) {\n return null;\n }\n for (const rgRow of Array.from(table.rows)) {\n result.push(Array.from(rgRow.cells).map(cell => cell.innerText));\n }\n return result;\n }\n\n private getData(e: ClipboardEvent) {\n return (\n e.clipboardData ||\n (window as unknown as { clipboardData: DataTransfer | null })\n ?.clipboardData\n );\n }\n}\n","import { VNode, h as createElement } from '@stencil/core';\nimport { isEnterKeyValue, isTab } from '../../utils/key.utils';\nimport { timeout } from '../../utils';\nimport { ColumnRegular } from '@type';\nimport { EditCell, EditorBase, SaveData } from '@type';\n\n/**\n * Represents a cell editor in a grid.\n *\n * It's a good place to start with your own editor.\n * It manages the editing of cells by handling events, saving data, rendering the editor UI, and managing the lifecycle of the editor instance.\n */\n\n/**\n * Callback triggered on cell editor save\n * Closes editor when called\n * @param preventFocus - if true editor will not be closed and next cell will not be focused\n */\nexport type SaveCallback = (value: SaveData, preventFocus: boolean) => void;\n\nexport class TextEditor implements EditorBase {\n private editInput!: HTMLInputElement;\n\n public element: Element | null = null;\n public editCell?: EditCell = undefined;\n\n constructor(\n public column: ColumnRegular,\n private saveCallback?: SaveCallback,\n ) {}\n\n /**\n * Callback triggered on cell editor render\n */\n async componentDidRender(): Promise<void> {\n if (this.editInput) {\n await timeout();\n this.editInput?.focus();\n }\n }\n\n private onKeyDown(e: KeyboardEvent) {\n const isEnter = isEnterKeyValue(e.key);\n const isKeyTab = isTab(e.key);\n\n if (\n (isKeyTab || isEnter) &&\n e.target &&\n this.saveCallback &&\n !e.isComposing\n ) {\n // blur is needed to avoid autoscroll\n this.beforeDisconnect();\n // request callback which will close cell after all\n this.saveCallback(this.getValue(), isKeyTab);\n }\n }\n\n /**\n * IMPORTANT: Prevent scroll glitches when editor is closed and focus is on current input element.\n */\n beforeDisconnect() {\n this.editInput.blur();\n }\n\n /**\n * Get value from input\n */\n getValue() {\n return this.editInput?.value;\n }\n\n /**\n * Render method for Editor plugin.\n * Renders input element with passed data from cell.\n *\n * @required @method\n * @param {Function} h - h function from stencil render.\n * @param {Object} _additionalData - additional data from plugin.\n * @returns {VNode} - input element.\n */\n render(h: typeof createElement, _additionalData: any): VNode | VNode[] {\n return h('input', {\n type: 'text',\n enterKeyHint: 'enter',\n // set input value from cell data\n value: this.editCell?.val ?? '',\n // save input element as ref for further usage\n ref: (el: HTMLInputElement | null) => {\n this.editInput = el;\n },\n // listen to keydown event on input element\n onKeyDown: (e: KeyboardEvent) => this.onKeyDown(e),\n });\n }\n}\n","revogr-edit {\n display: block;\n position: absolute;\n background-color: #fff;\n\n input {\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n }\n\n revo-dropdown {\n height: 100%;\n\n &.shrink {\n fieldset legend > span {\n display: none;\n }\n }\n }\n}\n","import {\n Component,\n Event,\n EventEmitter,\n Prop,\n h,\n Element,\n Host,\n Method,\n} from '@stencil/core';\nimport { EDIT_INPUT_WR } from '../../utils/consts';\nimport { TextEditor } from './text-editor';\nimport { ColumnDataSchemaModel } from '@type';\nimport {\n EditCell,\n EditorCtr,\n SaveDataDetails,\n EditorBase,\n SaveData,\n} from '@type';\n\nimport { isEditorCtrConstructible } from './edit.utils';\n\n/**\n * Represents a cell editor in a grid.\n * It manages the editing of cells by handling events, saving data, rendering the editor UI,\n * and managing the lifecycle of the editor instance.\n */\n@Component({\n tag: 'revogr-edit',\n styleUrl: 'revogr-edit-style.scss',\n})\nexport class RevoEdit {\n /**\n * Cell to edit data.\n */\n @Prop() editCell: EditCell;\n\n /**\n * Column data for editor.\n */\n @Prop() column: ColumnDataSchemaModel | null;\n /**\n * Custom editors register\n */\n @Prop() editor: EditorCtr | null;\n\n /**\n * Save on editor close. Defines if data should be saved on editor close.\n */\n @Prop() saveOnClose = false;\n /**\n * Additional data to pass to renderer\n */\n @Prop() additionalData: any;\n\n /**\n * Cell edit event\n */\n @Event({ eventName: 'celledit' }) cellEdit: EventEmitter<SaveDataDetails>;\n\n /**\n * Close editor event\n * pass true if requires focus next\n */\n @Event({ eventName: 'closeedit' }) closeEdit: EventEmitter<\n boolean | undefined\n >;\n\n /** Edit session editor */\n @Element() element: HTMLElement;\n private currentEditor: EditorBase | null = null;\n private preventSaveOnClose = false;\n\n /**\n * Cancel pending changes flag. Editor will be closed without autosave.\n */\n @Method() async cancelChanges() {\n this.preventSaveOnClose = true;\n }\n\n /**\n * Before editor got disconnected.\n * Can be triggered multiple times before actual disconnect.\n */\n @Method() async beforeDisconnect() {\n this.currentEditor?.beforeDisconnect?.();\n }\n\n onAutoSave() {\n this.preventSaveOnClose = true;\n const val = this.currentEditor?.getValue?.();\n // For Editor plugin internal usage.\n // When you want to prevent save and use custom save of your own.\n if (this.currentEditor?.beforeAutoSave) {\n const canSave = this.currentEditor.beforeAutoSave(val);\n if (canSave === false) {\n return;\n }\n }\n this.onSave(val, true);\n }\n\n /**\n * Callback triggered when cell editor saved.\n * Closes editor when called.\n * @param preventFocus - if true, editor will not be closed & next cell will not be focused.\n */\n onSave(val: SaveData, preventFocus?: boolean) {\n this.preventSaveOnClose = true;\n if (this.editCell) {\n this.cellEdit.emit({\n rgCol: this.editCell.x,\n rgRow: this.editCell.y,\n type: this.editCell.type,\n prop: this.editCell.prop,\n val,\n preventFocus,\n });\n }\n }\n\n componentWillRender() {\n // Active editor present\n if (this.currentEditor) {\n return;\n }\n this.preventSaveOnClose = false;\n\n // Custom editor usage.\n // Start with TextEditor (editors/text.tsx) for Custom editor.\n // It can be class or function\n if (this.editor) {\n // if editor is constructible\n if (isEditorCtrConstructible(this.editor)) {\n this.currentEditor = new this.editor(\n this.column,\n // save callback\n (e, preventFocus) => {\n this.onSave(e, preventFocus);\n },\n // cancel callback\n focusNext => {\n this.preventSaveOnClose = true;\n this.closeEdit.emit(focusNext);\n },\n );\n // if editor is function\n } else {\n this.currentEditor = this.editor(\n this.column,\n // save callback\n (e, preventFocus) => {\n this.onSave(e, preventFocus);\n },\n // cancel callback\n focusNext => {\n this.preventSaveOnClose = true;\n this.closeEdit.emit(focusNext);\n },\n );\n }\n return;\n }\n // Default text editor usage\n this.currentEditor = new TextEditor(this.column, (e, preventFocus) =>\n this.onSave(e, preventFocus),\n );\n }\n\n componentDidRender() {\n if (!this.currentEditor) {\n return;\n }\n this.currentEditor.element = this.element.firstElementChild;\n this.currentEditor.componentDidRender?.();\n }\n\n disconnectedCallback() {\n if (this.saveOnClose) {\n // Can not be cancelled by `preventSaveOnClose` prop.\n // Editor requires `getValue` to be able to save.\n if (!this.preventSaveOnClose) {\n this.onAutoSave();\n }\n }\n\n this.preventSaveOnClose = false;\n if (!this.currentEditor) {\n return;\n }\n\n this.currentEditor.disconnectedCallback?.();\n this.currentEditor.element = null;\n this.currentEditor = null;\n }\n\n render() {\n if (this.currentEditor) {\n this.currentEditor.editCell = this.editCell;\n return (\n <Host class={EDIT_INPUT_WR}>\n {this.currentEditor.render(h, this.additionalData)}\n </Host>\n );\n }\n return '';\n }\n}\n","import { getItemByPosition } from '@store';\nimport { DimensionSettingsState, PositionItem, Cell } from '@type';\n\ntype EventData = { el: HTMLElement; rows: DimensionSettingsState; cols: DimensionSettingsState };\ninterface Config {\n positionChanged(from: number, to: number): void;\n}\n\nexport default class RowOrderService {\n private currentCell: Cell | null = null;\n private previousRow: number | null = null;\n\n constructor(private config: Config) {}\n\n /** Drag finished, calculate and apply changes */\n endOrder(e: MouseEvent, data: EventData) {\n if (this.currentCell === null) {\n return;\n }\n const newRow = this.getCell(e, data);\n\n // if position changed\n if (newRow.y !== this.currentCell.y) {\n // rgRow dragged out table\n if (newRow.y < 0) {\n newRow.y = 0;\n }\n // rgRow dragged to the top\n else if (newRow.y < this.currentCell.y) {\n newRow.y++;\n }\n this.config.positionChanged(this.currentCell.y, newRow.y);\n }\n this.clear();\n }\n\n /** Drag started, reserve initial cell for farther use */\n startOrder(e: MouseEvent, data: EventData): Cell {\n this.currentCell = this.getCell(e, data);\n return this.currentCell;\n }\n\n move(y: number, data: EventData): PositionItem | null {\n const rgRow = this.getRow(y, data);\n // if rgRow same as previous or below range (-1 = 0) do nothing\n if (this.previousRow === rgRow.itemIndex || rgRow.itemIndex < -1) {\n return null;\n }\n this.previousRow = rgRow.itemIndex;\n return rgRow;\n }\n\n /** Drag stopped, probably cursor outside of document area */\n clear() {\n this.currentCell = null;\n this.previousRow = null;\n }\n\n /** Calculate cell based on x, y position */\n getRow(y: number, { el, rows }: EventData): PositionItem {\n const { top } = el.getBoundingClientRect();\n const topRelative = y - top;\n const rgRow = getItemByPosition(rows, topRelative);\n const absolutePosition = {\n itemIndex: rgRow.itemIndex,\n start: rgRow.start + top,\n end: rgRow.end + top,\n };\n return absolutePosition;\n }\n\n /** Calculate cell based on x, y position */\n getCell({ x, y }: Cell, { el, rows, cols }: EventData): Cell {\n const { top, left } = el.getBoundingClientRect();\n const topRelative = y - top;\n const leftRelative = x - left;\n const rgRow = getItemByPosition(rows, topRelative);\n const rgCol = getItemByPosition(cols, leftRelative);\n return { x: rgCol.itemIndex, y: rgRow.itemIndex };\n }\n}\n","import { Component, Method, Event, EventEmitter, Prop } from '@stencil/core';\nimport debounce from 'lodash/debounce';\n\nimport { DSourceState, setItems } from '@store';\nimport { DRAGG_TEXT } from '../../utils/consts';\nimport RowOrderService from './order-row.service';\nimport {\n DimensionRows,\n DataType,\n DimensionSettingsState,\n DragStartEvent,\n PositionItem,\n Cell,\n} from '@type';\nimport { Observable } from '../../utils/store.utils';\n\n/**\n * Component for handling row order editor.\n */\n@Component({ tag: 'revogr-order-editor' })\nexport class OrderEditor {\n // #region Properties\n /** Parent element */\n @Prop() parent: HTMLElement;\n /** Dimension settings Y */\n @Prop() dimensionRow: Observable<DimensionSettingsState>;\n /** Dimension settings X */\n @Prop() dimensionCol: Observable<DimensionSettingsState>;\n\n /** Static stores, not expected to change during component lifetime */\n @Prop() dataStore: Observable<DSourceState<DataType, DimensionRows>>;\n // #endregion\n\n // #region Events\n /** Row drag started */\n @Event({ eventName: 'rowdragstartinit', cancelable: true })\n rowDragStart: EventEmitter<{\n cell: Cell;\n text: string;\n pos: PositionItem;\n event: MouseEvent;\n }>;\n\n /** Row drag ended started */\n @Event({ eventName: 'rowdragendinit' })\n rowDragEnd: EventEmitter;\n\n /** Row move started */\n @Event({ eventName: 'rowdragmoveinit', cancelable: true })\n rowDrag: EventEmitter<PositionItem>;\n\n /** Row mouse move started */\n @Event({ eventName: 'rowdragmousemove', cancelable: true })\n rowMouseMove: EventEmitter<Cell>;\n\n /** Row dragged, new range ready to be applied */\n @Event({ eventName: 'rowdropinit', cancelable: true })\n rowDropped: EventEmitter<{\n from: number;\n to: number;\n }>;\n // #endregion\n\n // #region Private\n private rowOrderService: RowOrderService;\n private events: {\n name: keyof DocumentEventMap;\n listener: (e: MouseEvent) => void;\n }[] = [];\n private rowMoveFunc = debounce((y: number) => {\n const rgRow = this.rowOrderService.move(y, this.getData());\n if (rgRow !== null) {\n this.rowDrag.emit(rgRow);\n }\n }, 5);\n // #endregion\n\n // #region Methods\n @Method() async dragStart(e: DragStartEvent) {\n e.originalEvent.preventDefault();\n\n // extra check if previous ended\n if (this.events.length) {\n this.clearOrder();\n }\n\n const data = this.getData();\n const cell = this.rowOrderService.startOrder(e.originalEvent, data);\n const pos = this.rowOrderService.getRow(e.originalEvent.y, data);\n const dragStartEvent = this.rowDragStart.emit({\n cell,\n text: DRAGG_TEXT,\n pos,\n event: e.originalEvent,\n });\n if (dragStartEvent.defaultPrevented) {\n return;\n }\n\n const moveMove = (e: MouseEvent) => this.move(e);\n const mouseUp = (e: MouseEvent) => this.endOrder(e);\n const mouseLeave = () => this.clearOrder();\n\n this.events.push(\n {\n name: 'mousemove',\n listener: moveMove,\n },\n {\n name: 'mouseup',\n listener: mouseUp,\n },\n {\n name: 'mouseleave',\n listener: mouseLeave,\n },\n );\n document.addEventListener('mousemove', moveMove);\n // Action finished inside of the document\n document.addEventListener('mouseup', mouseUp);\n document.addEventListener('mouseleave', mouseLeave);\n }\n\n @Method() async endOrder(e: MouseEvent) {\n this.rowOrderService.endOrder(e, this.getData());\n this.clearOrder();\n }\n\n @Method() async clearOrder() {\n this.rowOrderService.clear();\n this.events.forEach(v => document.removeEventListener(v.name, v.listener));\n this.events.length = 0;\n this.rowDragEnd.emit();\n }\n // #endregion\n\n move({ x, y }: { x: number; y: number }) {\n this.rowMouseMove.emit({ x, y });\n this.rowMoveFunc(y);\n }\n\n connectedCallback() {\n this.rowOrderService = new RowOrderService({\n positionChanged: (f, t) => this.onPositionChanged(f, t),\n });\n }\n\n private onPositionChanged(from: number, to: number) {\n const dropEvent = this.rowDropped.emit({ from, to });\n if (dropEvent.defaultPrevented) {\n return;\n }\n const items = [...this.dataStore.get('items')];\n const toMove = items.splice(from, 1);\n items.splice(to, 0, ...toMove);\n setItems(this.dataStore, items);\n }\n\n private getData() {\n return {\n el: this.parent,\n rows: this.dimensionRow.state,\n cols: this.dimensionCol.state,\n };\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -10,17 +10,22 @@ export declare class Clipboard {
10
10
  readonly: boolean;
11
11
  /**
12
12
  * Paste 1. Fired before paste applied to the grid
13
- * @property {string} raw - raw data from clipboard
14
- * @property {ClipboardEvent} event - original event
15
- * @property {boolean} defaultPrevented - if true, paste will be canceled
13
+ * defaultPrevented - if true, paste will be canceled
16
14
  */
17
- beforePaste: EventEmitter;
15
+ beforePaste: EventEmitter<{
16
+ raw: string;
17
+ isHTML: boolean;
18
+ event: ClipboardEvent;
19
+ dataText: string;
20
+ }>;
18
21
  /**
19
22
  * Paste 2. Fired before paste applied to the grid and after data parsed
20
- * @property {string} raw - raw data from clipboard
21
- * @property {string[][]} parsed - parsed data
22
23
  */
23
- beforePasteApply: EventEmitter;
24
+ beforePasteApply: EventEmitter<{
25
+ raw: string;
26
+ parsed: string[][];
27
+ event: ClipboardEvent;
28
+ }>;
24
29
  /**
25
30
  * Paste 3. Internal method. When data region is ready pass it to the top.
26
31
  * @property {string[][]} data - data to paste
@@ -29,39 +34,42 @@ export declare class Clipboard {
29
34
  pasteRegion: EventEmitter<string[][]>;
30
35
  /**
31
36
  * Paste 4. Fired after paste applied to the grid
32
- * @property {string} raw - raw data from clipboard
33
- * @property {string[][]} parsed - parsed data
34
- * @property {ClipboardEvent} event - original event
35
- * @property {boolean} defaultPrevented - if true, paste will be canceled
37
+ * defaultPrevented - if true, paste will be canceled
36
38
  */
37
- afterPasteApply: EventEmitter;
39
+ afterPasteApply: EventEmitter<{
40
+ raw: string;
41
+ parsed: string[][];
42
+ event: ClipboardEvent;
43
+ }>;
38
44
  /**
39
45
  * Cut 1. Fired before cut triggered
40
- * @property {ClipboardEvent} event - original event
41
- * @property {boolean} defaultPrevented - if true, cut will be canceled
46
+ * defaultPrevented - if true, cut will be canceled
42
47
  */
43
- beforeCut: EventEmitter;
48
+ beforeCut: EventEmitter<{
49
+ event: ClipboardEvent;
50
+ }>;
44
51
  /**
45
52
  * Cut 2. Clears region when cut is done
46
53
  */
47
54
  clearRegion: EventEmitter<DataTransfer>;
48
55
  /**
49
56
  * Copy 1. Fired before copy triggered
50
- * @property {ClipboardEvent} event - original event
51
- * @property {boolean} defaultPrevented - if true, copy will be canceled
57
+ * defaultPrevented - if true, copy will be canceled
52
58
  */
53
- beforeCopy: EventEmitter;
59
+ beforeCopy: EventEmitter<{
60
+ event: ClipboardEvent;
61
+ }>;
54
62
  /**
55
63
  * Copy Method 1. Fired before copy applied to the clipboard from outside.
56
- * @property {DataTransfer} event - original event
57
- * @property {string} data - data to copy
58
- * @property {boolean} defaultPrevented - if true, copy will be canceled
64
+ * defaultPrevented - if true, copy will be canceled
59
65
  */
60
- beforeCopyApply: EventEmitter;
66
+ beforeCopyApply: EventEmitter<{
67
+ event: DataTransfer;
68
+ data?: string[][];
69
+ }>;
61
70
  /**
62
71
  * Copy 2. Fired when region copied
63
- * @property {DataTransfer} data - data to copy
64
- * @property {boolean} defaultPrevented - if true, copy will be canceled
72
+ * defaultPrevented - if true, copy will be canceled
65
73
  */
66
74
  copyRegion: EventEmitter<DataTransfer>;
67
75
  onPaste(e: ClipboardEvent): void;
@@ -65,7 +65,9 @@ export declare class AutoFillService {
65
65
  * Reset autofill state
66
66
  */
67
67
  private resetAutoFillState;
68
- /** Trigger range apply events and handle responses */
68
+ /**
69
+ * Trigger range apply events and handle responses
70
+ */
69
71
  onRangeApply(data: DataLookup, range: RangeArea): void;
70
72
  /** Apply range and copy data during range application */
71
73
  private applyRangeWithData;
@@ -3,7 +3,7 @@ import ColumnService from '../data/column.service';
3
3
  import { DSourceState } from "../../store/index";
4
4
  import { EventData } from './selection.utils';
5
5
  import { Observable, SelectionStoreState, DimensionSettingsState, DataType, DimensionRows, ColumnRegular, DimensionCols, Cell, DragStartEvent } from '../../components';
6
- import { EditCellStore, MultiDimensionType } from "../../types/index";
6
+ import { EditCellStore, MultiDimensionType, RangeClipboardCopyEventProps, RangeClipboardPasteEvent } from "../../types/index";
7
7
  import { FocusRenderEvent, ApplyFocusEvent, AllDimensionType } from "../../types/index";
8
8
  import { Editors, BeforeSaveDataDetails, BeforeEdit, RangeArea, TempRange, ChangedRange, BeforeRangeSaveDataDetails, SaveDataDetails } from "../../types/index";
9
9
  /**
@@ -139,8 +139,17 @@ export declare class OverlaySelection {
139
139
  */
140
140
  rangeEditApply: EventEmitter<BeforeRangeSaveDataDetails>;
141
141
  /** Range copy. */
142
- rangeClipboardCopy: EventEmitter;
143
- rangeClipboardPaste: EventEmitter;
142
+ /**
143
+ * Range copy event.
144
+ * This event is triggered when data is ready to be copied to the clipboard.
145
+ * If you want to prevent the default behavior of copying data, you can call `e.preventDefault()`.
146
+ * If you want to modify the data that will be copied to the clipboard, modify the `data` property of the event object.
147
+ */
148
+ rangeClipboardCopy: EventEmitter<RangeClipboardCopyEventProps>;
149
+ /**
150
+ * Range paste event.
151
+ */
152
+ rangeClipboardPaste: EventEmitter<RangeClipboardPasteEvent>;
144
153
  /**
145
154
  * Before key up event proxy, used to prevent key up trigger.
146
155
  * If you have some custom behaviour event, use this event to check if it wasn't processed by internal logic.
@@ -1,4 +1,6 @@
1
- import { DimensionSettingsState, Cell, RangeArea, RangeAreaCss } from "../../types/index";
1
+ import { DSourceState } from "../../store/index";
2
+ import { DimensionSettingsState, Cell, RangeArea, RangeAreaCss, DataLookup, DimensionRows, DataType } from "../../types/index";
3
+ import { Observable } from '../../utils/store.utils';
2
4
  export type EventData = {
3
5
  el: HTMLElement;
4
6
  rows: DimensionSettingsState;
@@ -7,6 +9,7 @@ export type EventData = {
7
9
  focus: Cell;
8
10
  range: RangeArea;
9
11
  };
12
+ export declare function collectModelsOfRange(data: DataLookup, store: Observable<DSourceState<DataType, DimensionRows>>): DataLookup;
10
13
  export declare function getFocusCellBasedOnEvent(e: MouseEvent | TouchEvent, data: EventData): Cell | null;
11
14
  /**
12
15
  * Calculate cell based on x, y position
@@ -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 { AfterEditEvent, AllDimensionType, ApplyFocusEvent, BeforeCellRenderEvent, BeforeEdit, BeforeRangeSaveDataDetails, BeforeRowRenderEvent, BeforeSaveDataDetails, Cell, ChangedRange, ColumnDataSchemaModel, ColumnGrouping, ColumnProp, ColumnRegular, ColumnType, DataFormat, DataType, DimensionCols, DimensionRows, DimensionSettingsState, DimensionType, DimensionTypeCol, DragStartEvent, EditCell, EditorCtr, Editors, ElementScroll, FocusRenderEvent, FocusTemplateFunc, InitialHeaderClick, MultiDimensionType, PluginBaseComponent, PositionItem, RangeArea, RowDefinition, RowHeaders, SaveDataDetails, SelectionStoreState, TempRange, Theme, ViewportData, ViewPortResizeEvent, ViewPortScrollEvent, ViewportState, ViewSettingSizeProp } from "./types/index";
8
+ import { AfterEditEvent, AllDimensionType, ApplyFocusEvent, BeforeCellRenderEvent, BeforeEdit, BeforeRangeSaveDataDetails, BeforeRowRenderEvent, BeforeSaveDataDetails, Cell, ChangedRange, ColumnDataSchemaModel, ColumnGrouping, ColumnProp, ColumnRegular, ColumnType, DataFormat, DataType, DimensionCols, DimensionRows, DimensionSettingsState, DimensionType, DimensionTypeCol, DragStartEvent, EditCell, EditorCtr, Editors, ElementScroll, FocusRenderEvent, FocusTemplateFunc, InitialHeaderClick, MultiDimensionType, PluginBaseComponent, PositionItem, RangeArea, RangeClipboardCopyEventProps, RangeClipboardPasteEvent, RowDefinition, 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, FilterCollection } from "./plugins/filter/filter.plugin";
@@ -20,7 +20,7 @@ import { MultiFilterItem, ShowData } from "./plugins/filter/filter.panel";
20
20
  import { LogicFunction } from "./plugins/filter/filter.types";
21
21
  import { ResizeProps } from "./components/header/resizable.directive";
22
22
  import { Cell as Cell1, ColumnRegular as ColumnRegular1, DataType as DataType1, DimensionCols as DimensionCols1, DimensionRows as DimensionRows1, DimensionSettingsState as DimensionSettingsState1, Observable as Observable1, SelectionStoreState as SelectionStoreState1 } from "./components";
23
- export { AfterEditEvent, AllDimensionType, ApplyFocusEvent, BeforeCellRenderEvent, BeforeEdit, BeforeRangeSaveDataDetails, BeforeRowRenderEvent, BeforeSaveDataDetails, Cell, ChangedRange, ColumnDataSchemaModel, ColumnGrouping, ColumnProp, ColumnRegular, ColumnType, DataFormat, DataType, DimensionCols, DimensionRows, DimensionSettingsState, DimensionType, DimensionTypeCol, DragStartEvent, EditCell, EditorCtr, Editors, ElementScroll, FocusRenderEvent, FocusTemplateFunc, InitialHeaderClick, MultiDimensionType, PluginBaseComponent, PositionItem, RangeArea, RowDefinition, RowHeaders, SaveDataDetails, SelectionStoreState, TempRange, Theme, ViewportData, ViewPortResizeEvent, ViewPortScrollEvent, ViewportState, ViewSettingSizeProp } from "./types/index";
23
+ export { AfterEditEvent, AllDimensionType, ApplyFocusEvent, BeforeCellRenderEvent, BeforeEdit, BeforeRangeSaveDataDetails, BeforeRowRenderEvent, BeforeSaveDataDetails, Cell, ChangedRange, ColumnDataSchemaModel, ColumnGrouping, ColumnProp, ColumnRegular, ColumnType, DataFormat, DataType, DimensionCols, DimensionRows, DimensionSettingsState, DimensionType, DimensionTypeCol, DragStartEvent, EditCell, EditorCtr, Editors, ElementScroll, FocusRenderEvent, FocusTemplateFunc, InitialHeaderClick, MultiDimensionType, PluginBaseComponent, PositionItem, RangeArea, RangeClipboardCopyEventProps, RangeClipboardPasteEvent, RowDefinition, RowHeaders, SaveDataDetails, SelectionStoreState, TempRange, Theme, ViewportData, ViewPortResizeEvent, ViewPortScrollEvent, ViewportState, ViewSettingSizeProp } from "./types/index";
24
24
  export { GridPlugin } from "./plugins/base.plugin";
25
25
  export { AutoSizeColumnConfig } from "./plugins/column.auto-size.plugin";
26
26
  export { ColumnFilterConfig, FilterCaptions, FilterCollection } from "./plugins/filter/filter.plugin";
@@ -845,14 +845,34 @@ declare global {
845
845
  new (): HTMLRevogrAttributionElement;
846
846
  };
847
847
  interface HTMLRevogrClipboardElementEventMap {
848
- "beforepaste": any;
849
- "beforepasteapply": any;
848
+ "beforepaste": {
849
+ raw: string;
850
+ isHTML: boolean;
851
+ event: ClipboardEvent;
852
+ dataText: string;
853
+ };
854
+ "beforepasteapply": {
855
+ raw: string;
856
+ parsed: string[][];
857
+ event: ClipboardEvent;
858
+ };
850
859
  "pasteregion": string[][];
851
- "afterpasteapply": any;
852
- "beforecut": any;
860
+ "afterpasteapply": {
861
+ raw: string;
862
+ parsed: string[][];
863
+ event: ClipboardEvent;
864
+ };
865
+ "beforecut": {
866
+ event: ClipboardEvent;
867
+ };
853
868
  "clearregion": DataTransfer;
854
- "beforecopy": any;
855
- "beforecopyapply": any;
869
+ "beforecopy": {
870
+ event: ClipboardEvent;
871
+ };
872
+ "beforecopyapply": {
873
+ event: DataTransfer;
874
+ data?: string[][];
875
+ };
856
876
  "copyregion": DataTransfer;
857
877
  }
858
878
  /**
@@ -1034,8 +1054,8 @@ declare global {
1034
1054
  "selectionchangeinit": ChangedRange;
1035
1055
  "beforerangecopyapply": ChangedRange;
1036
1056
  "rangeeditapply": BeforeRangeSaveDataDetails;
1037
- "clipboardrangecopy": any;
1038
- "clipboardrangepaste": any;
1057
+ "clipboardrangecopy": RangeClipboardCopyEventProps;
1058
+ "clipboardrangepaste": RangeClipboardPasteEvent;
1039
1059
  "beforekeydown": KeyboardEvent;
1040
1060
  "beforekeyup": KeyboardEvent;
1041
1061
  "beforecellsave": any;
@@ -1511,53 +1531,55 @@ declare namespace LocalJSX {
1511
1531
  */
1512
1532
  interface RevogrClipboard {
1513
1533
  /**
1514
- * Paste 4. Fired after paste applied to the grid
1515
- * @property {string} raw - raw data from clipboard
1516
- * @property {string[][]} parsed - parsed data
1517
- * @property {ClipboardEvent} event - original event
1518
- * @property {boolean} defaultPrevented - if true, paste will be canceled
1534
+ * Paste 4. Fired after paste applied to the grid defaultPrevented - if true, paste will be canceled
1519
1535
  */
1520
- "onAfterpasteapply"?: (event: RevogrClipboardCustomEvent<any>) => void;
1536
+ "onAfterpasteapply"?: (event: RevogrClipboardCustomEvent<{
1537
+ raw: string;
1538
+ parsed: string[][];
1539
+ event: ClipboardEvent;
1540
+ }>) => void;
1521
1541
  /**
1522
- * Copy 1. Fired before copy triggered
1523
- * @property {ClipboardEvent} event - original event
1524
- * @property {boolean} defaultPrevented - if true, copy will be canceled
1542
+ * Copy 1. Fired before copy triggered defaultPrevented - if true, copy will be canceled
1525
1543
  */
1526
- "onBeforecopy"?: (event: RevogrClipboardCustomEvent<any>) => void;
1544
+ "onBeforecopy"?: (event: RevogrClipboardCustomEvent<{
1545
+ event: ClipboardEvent;
1546
+ }>) => void;
1527
1547
  /**
1528
- * Copy Method 1. Fired before copy applied to the clipboard from outside.
1529
- * @property {DataTransfer} event - original event
1530
- * @property {string} data - data to copy
1531
- * @property {boolean} defaultPrevented - if true, copy will be canceled
1548
+ * Copy Method 1. Fired before copy applied to the clipboard from outside. defaultPrevented - if true, copy will be canceled
1532
1549
  */
1533
- "onBeforecopyapply"?: (event: RevogrClipboardCustomEvent<any>) => void;
1550
+ "onBeforecopyapply"?: (event: RevogrClipboardCustomEvent<{
1551
+ event: DataTransfer;
1552
+ data?: string[][];
1553
+ }>) => void;
1534
1554
  /**
1535
- * Cut 1. Fired before cut triggered
1536
- * @property {ClipboardEvent} event - original event
1537
- * @property {boolean} defaultPrevented - if true, cut will be canceled
1555
+ * Cut 1. Fired before cut triggered defaultPrevented - if true, cut will be canceled
1538
1556
  */
1539
- "onBeforecut"?: (event: RevogrClipboardCustomEvent<any>) => void;
1557
+ "onBeforecut"?: (event: RevogrClipboardCustomEvent<{
1558
+ event: ClipboardEvent;
1559
+ }>) => void;
1540
1560
  /**
1541
- * Paste 1. Fired before paste applied to the grid
1542
- * @property {string} raw - raw data from clipboard
1543
- * @property {ClipboardEvent} event - original event
1544
- * @property {boolean} defaultPrevented - if true, paste will be canceled
1561
+ * Paste 1. Fired before paste applied to the grid defaultPrevented - if true, paste will be canceled
1545
1562
  */
1546
- "onBeforepaste"?: (event: RevogrClipboardCustomEvent<any>) => void;
1563
+ "onBeforepaste"?: (event: RevogrClipboardCustomEvent<{
1564
+ raw: string;
1565
+ isHTML: boolean;
1566
+ event: ClipboardEvent;
1567
+ dataText: string;
1568
+ }>) => void;
1547
1569
  /**
1548
1570
  * Paste 2. Fired before paste applied to the grid and after data parsed
1549
- * @property {string} raw - raw data from clipboard
1550
- * @property {string[][]} parsed - parsed data
1551
1571
  */
1552
- "onBeforepasteapply"?: (event: RevogrClipboardCustomEvent<any>) => void;
1572
+ "onBeforepasteapply"?: (event: RevogrClipboardCustomEvent<{
1573
+ raw: string;
1574
+ parsed: string[][];
1575
+ event: ClipboardEvent;
1576
+ }>) => void;
1553
1577
  /**
1554
1578
  * Cut 2. Clears region when cut is done
1555
1579
  */
1556
1580
  "onClearregion"?: (event: RevogrClipboardCustomEvent<DataTransfer>) => void;
1557
1581
  /**
1558
- * Copy 2. Fired when region copied
1559
- * @property {DataTransfer} data - data to copy
1560
- * @property {boolean} defaultPrevented - if true, copy will be canceled
1582
+ * Copy 2. Fired when region copied defaultPrevented - if true, copy will be canceled
1561
1583
  */
1562
1584
  "onCopyregion"?: (event: RevogrClipboardCustomEvent<DataTransfer>) => void;
1563
1585
  /**
@@ -1964,8 +1986,11 @@ declare namespace LocalJSX {
1964
1986
  /**
1965
1987
  * Range copy.
1966
1988
  */
1967
- "onClipboardrangecopy"?: (event: RevogrOverlaySelectionCustomEvent<any>) => void;
1968
- "onClipboardrangepaste"?: (event: RevogrOverlaySelectionCustomEvent<any>) => void;
1989
+ "onClipboardrangecopy"?: (event: RevogrOverlaySelectionCustomEvent<RangeClipboardCopyEventProps>) => void;
1990
+ /**
1991
+ * Range paste event.
1992
+ */
1993
+ "onClipboardrangepaste"?: (event: RevogrOverlaySelectionCustomEvent<RangeClipboardPasteEvent>) => void;
1969
1994
  /**
1970
1995
  * Cell get focused. To prevent the default behavior of applying the edit data, you can call `e.preventDefault()`.
1971
1996
  */
@@ -1,6 +1,6 @@
1
1
  import type { VNode } from '../stencil-public-runtime';
2
2
  import { DimensionCols, DimensionRows, DimensionColPin, DimensionType, MultiDimensionType } from './dimension';
3
- import { Cell, EditorCtr, FocusedCells, RangeArea, SelectionStoreState } from './selection';
3
+ import { Cell, EditorCtr, FocusedCells, OldNewRangeMapping, RangeArea, SelectionStoreState } from './selection';
4
4
  import type { Observable } from '../utils/store.utils';
5
5
  /**
6
6
  * Advanced column data schema model.
@@ -668,3 +668,17 @@ export type ScrollCoordinateEvent = {
668
668
  */
669
669
  coordinate: number;
670
670
  };
671
+ /** Range paste. */
672
+ export type RangeClipboardPasteEvent = {
673
+ data: DataLookup;
674
+ models: {
675
+ [rowIndex: number]: DataType;
676
+ };
677
+ range: RangeArea;
678
+ } & AllDimensionType;
679
+ /** Range copy. */
680
+ export type RangeClipboardCopyEventProps = {
681
+ data: DataFormat[][];
682
+ range: RangeArea;
683
+ mapping: OldNewRangeMapping;
684
+ } & AllDimensionType;
package/hydrate/index.js CHANGED
@@ -2311,7 +2311,9 @@ class Clipboard {
2311
2311
  }
2312
2312
  const clipboardData = this.getData(e);
2313
2313
  const isHTML = ((clipboardData === null || clipboardData === void 0 ? void 0 : clipboardData.types.indexOf('text/html')) || -1) > -1;
2314
- const data = isHTML ? clipboardData === null || clipboardData === void 0 ? void 0 : clipboardData.getData('text/html') : clipboardData === null || clipboardData === void 0 ? void 0 : clipboardData.getData('text');
2314
+ const data = isHTML
2315
+ ? clipboardData === null || clipboardData === void 0 ? void 0 : clipboardData.getData('text/html')
2316
+ : clipboardData === null || clipboardData === void 0 ? void 0 : clipboardData.getData('text');
2315
2317
  const dataText = clipboardData === null || clipboardData === void 0 ? void 0 : clipboardData.getData('text');
2316
2318
  const beforePaste = this.beforePaste.emit({
2317
2319
  raw: data,
@@ -2421,7 +2423,8 @@ class Clipboard {
2421
2423
  return result;
2422
2424
  }
2423
2425
  getData(e) {
2424
- return e.clipboardData || (window === null || window === void 0 ? void 0 : window.clipboardData);
2426
+ return (e.clipboardData ||
2427
+ (window === null || window === void 0 ? void 0 : window.clipboardData));
2425
2428
  }
2426
2429
  static get cmpMeta() { return {
2427
2430
  "$flags$": 0,
@@ -9240,6 +9243,14 @@ function getPropertyFromEvent(e, prop, focusClass // for touch events
9240
9243
  return e[prop] || 0;
9241
9244
  }
9242
9245
 
9246
+ function collectModelsOfRange(data, store) {
9247
+ const models = {};
9248
+ for (let i in data) {
9249
+ const rowIndex = parseInt(i, 10);
9250
+ models[rowIndex] = getSourceItem(store, rowIndex);
9251
+ }
9252
+ return models;
9253
+ }
9243
9254
  function getFocusCellBasedOnEvent(e, data) {
9244
9255
  // If event default is prevented, return
9245
9256
  if (e.defaultPrevented) {
@@ -9767,15 +9778,13 @@ class AutoFillService {
9767
9778
  this.autoFillLast = null;
9768
9779
  this.autoFillStart = null;
9769
9780
  }
9770
- /** Trigger range apply events and handle responses */
9781
+ /**
9782
+ * Trigger range apply events and handle responses
9783
+ */
9771
9784
  onRangeApply(data, range) {
9772
- const models = {};
9773
- for (let rowIndex in data) {
9774
- models[rowIndex] = getSourceItem(this.sv.dataStore, parseInt(rowIndex, 10));
9775
- }
9776
9785
  this.sv.rangeDataApply({
9777
9786
  data,
9778
- models,
9787
+ models: collectModelsOfRange(data, this.sv.dataStore),
9779
9788
  type: this.sv.dataStore.get('type'),
9780
9789
  });
9781
9790
  this.sv.setRange(range);
@@ -10061,7 +10070,7 @@ class OverlaySelection {
10061
10070
  nodes.push(hAsync("revogr-order-editor", { ref: e => (this.orderEditor = e), dataStore: this.dataStore, dimensionRow: this.dimensionRow, dimensionCol: this.dimensionCol, parent: this.element, onRowdragstartinit: e => this.rowDragStart(e) }));
10062
10071
  }
10063
10072
  }
10064
- return (hAsync(Host, { key: '81dee4cfcce410cefb2bd9ff2661261472fc3a75', class: { mobile: this.isMobileDevice }, onDblClick: (e) => this.onElementDblClick(e), onMouseDown: (e) => this.onElementMouseDown(e), onTouchStart: (e) => this.onElementMouseDown(e, true) }, nodes, hAsync("slot", { key: '6ac75c388ae3fbc5539a27c3acd58178dd53d1af', name: "data" })));
10073
+ return (hAsync(Host, { key: '98f6ca4606540478588614eaf7ee69a5eaf48b99', class: { mobile: this.isMobileDevice }, onDblClick: (e) => this.onElementDblClick(e), onMouseDown: (e) => this.onElementMouseDown(e), onTouchStart: (e) => this.onElementMouseDown(e, true) }, nodes, hAsync("slot", { key: '65d69b6562e14e1cf99c3780ac2ba3fa3e37e801', name: "data" })));
10065
10074
  }
10066
10075
  /**
10067
10076
  * Executes the focus operation on the specified range of cells.
@@ -10208,7 +10217,7 @@ class OverlaySelection {
10208
10217
  return;
10209
10218
  }
10210
10219
  let { changed, range } = this.columnService.getTransformedDataToApply(focus, data);
10211
- const { defaultPrevented: canPaste } = this.rangeClipboardPaste.emit(Object.assign({ data: changed, range }, this.types));
10220
+ const { defaultPrevented: canPaste } = this.rangeClipboardPaste.emit(Object.assign({ data: changed, models: collectModelsOfRange(changed, this.dataStore), range }, this.types));
10212
10221
  if (canPaste) {
10213
10222
  return;
10214
10223
  }