lsp-grid 1.0.13 → 1.0.14

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.
@@ -1 +1 @@
1
- {"version":3,"file":"revogr-attribution.revogr-extra.revogr-focus.revogr-overlay-selection.revogr-row-headers.revogr-scroll-virtual.revogr-temp-range.entry.cjs.js","sources":["src/components/attribution/revogr-attribution.tsx","src/components/extra/revogr-extra.tsx","src/components/overlay/selection.utils.ts","src/components/selectionFocus/revogr-focus-style.scss?tag=revogr-focus","src/components/selectionFocus/revogr-focus.tsx","src/components/overlay/keyboard.service.ts","src/components/overlay/autofill.service.tsx","src/components/overlay/revogr-overlay-style.scss?tag=revogr-overlay-selection","src/components/overlay/revogr-overlay-selection.tsx","src/components/rowHeaders/row-header-render.tsx","src/components/rowHeaders/revogr-row-headers.tsx","src/components/scrollable/autohide-scroll.plugin.ts","src/components/scrollable/revogr-scroll-style.scss?tag=revogr-scroll-virtual","src/components/scrollable/revogr-scroll-virtual.tsx","src/components/selectionTempRange/revogr-temp-range-style.scss?tag=revogr-temp-range","src/components/selectionTempRange/revogr-temp-range.tsx"],"sourcesContent":["import { Component, Host, h } from '@stencil/core';\r\n/**\r\n * If you’re thinking about removing the attribution, we’d like to share a few thoughts first:\r\n * If you’re using RevoGrid in your organization and it’s helping you make money, we depend on your support to keep improving and maintaining RevoGrid under an MIT License.\r\n * Before you remove the attribution, please consider how you can support RevoGrid to help keep it running smoothly.\r\n * Using RevoGrid for a personal project? Awesome! Feel free to remove the attribution. We appreciate your support.\r\n */\r\n/**\r\n * @internal\r\n */\r\n@Component({\r\n tag: 'revogr-attribution',\r\n})\r\nexport class Attribution {\r\n render() {\r\n return (\r\n <Host>\r\n <a\r\n href=\"https://rv-grid.com/guide/attribution\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n title=\"Made with ❤️ by Revolist OU Team\"\r\n class=\"value\"\r\n >\r\n RevoGrid\r\n </a>\r\n </Host>\r\n );\r\n }\r\n}\r\n","import { h, Component, Method, Prop, State, VNode } from '@stencil/core';\r\nimport type { ExtraNodeFuncConfig } from '@type';\r\n\r\n/**\r\n * Contains extra elements for stencil components.\r\n * Performs rendering and updates for external components.\r\n * \r\n * @example\r\n * In Plugins if you want to add extra elements to grid and use stenciljs vnodes reactivity:\r\n * function paginationPanel(this: PaginationPlugin, config: { refresh: () => void }) {\r\n * // use `config.refresh()` for component to re-render\r\n * return h('div')\r\n * }\r\n * \r\n * revogrid.registerVNode = [\r\n * ...existingNodes,\r\n * paginationPanel.bind(this)\r\n * ];\r\n\r\n\r\n/**\r\n * @internal\r\n */\r\n@Component({\r\n tag: 'revogr-extra',\r\n})\r\nexport class RevoGridExtra {\r\n /**\r\n * Nodes to render\r\n */\r\n @Prop() nodes: (\r\n | VNode\r\n | ((c: ExtraNodeFuncConfig) => VNode)\r\n )[] = [];\r\n /**\r\n * Force component to re-render\r\n */\r\n @State() update = 1;\r\n\r\n /**\r\n * Refreshes the extra component. Useful if you want to manually\r\n * force the component to re-render.\r\n */\r\n @Method() async refresh() {\r\n this.update *= -1;\r\n }\r\n\r\n render() {\r\n return this.nodes?.map(node => {\r\n // Check if node is a function or a stencil component\r\n // If function wrap it in a stencil component with the refresh function\r\n if (typeof node === 'function') {\r\n const config: Partial<ExtraNodeFuncConfig> = {};\r\n const getNodes = () => [node({ refresh: () => config.refresh?.() })];\r\n\r\n return (\r\n <revogr-extra\r\n nodes={getNodes()}\r\n ref={(el?: HTMLRevogrExtraElement) => {\r\n if (el) {\r\n // Update exclusively for current node\r\n config.refresh = () => {\r\n el.nodes = getNodes();\r\n };\r\n }\r\n }}\r\n />\r\n );\r\n }\r\n return node;\r\n });\r\n }\r\n}\r\n","import {\r\n DimensionIndexInput,\r\n DSourceState,\r\n getItemByIndex,\r\n getItemByPosition,\r\n getSourceItem,\r\n} from '@store';\r\nimport type {\r\n DimensionSettingsState,\r\n Cell,\r\n RangeArea,\r\n RangeAreaCss,\r\n DataLookup,\r\n DimensionRows,\r\n DataType,\r\n EditCellStore,\r\n} from '@type';\r\nimport { getPropertyFromEvent } from '../../utils/events';\r\nimport { Observable } from '../../utils';\r\n\r\nexport type EventData = {\r\n el: HTMLElement;\r\n rows: DimensionSettingsState;\r\n cols: DimensionSettingsState;\r\n lastCell: Cell;\r\n focus: Cell | null;\r\n range: RangeArea | null;\r\n edit: EditCellStore | null;\r\n};\r\n\r\nexport function collectModelsOfRange(\r\n data: DataLookup,\r\n store: Observable<DSourceState<DataType, DimensionRows>>,\r\n) {\r\n const models: Partial<DataLookup> = {};\r\n for (let i in data) {\r\n const rowIndex = parseInt(i, 10);\r\n models[rowIndex] = getSourceItem(store, rowIndex);\r\n }\r\n\r\n return models;\r\n}\r\n\r\nexport function getFocusCellBasedOnEvent(\r\n e: MouseEvent | TouchEvent,\r\n data: EventData,\r\n): Cell | null {\r\n // If event default is prevented, return\r\n if (e.defaultPrevented) {\r\n return null;\r\n }\r\n\r\n // Get coordinates from event object\r\n const x = getPropertyFromEvent(e, 'clientX');\r\n const y = getPropertyFromEvent(e, 'clientY');\r\n\r\n // If coordinates are not available, return\r\n if (x === null || y === null) {\r\n return null;\r\n }\r\n\r\n // Get current cell based on coordinates and data\r\n const focusCell = getCurrentCell({ x, y }, data);\r\n // If current cell is not available, return\r\n if (isAfterLast(focusCell, data.lastCell)) {\r\n return null;\r\n }\r\n\r\n return focusCell;\r\n}\r\n\r\n/**\r\n * Calculate cell based on x, y position\r\n */\r\nexport function getCurrentCell(\r\n { x, y }: Cell,\r\n { el, rows, cols }: Pick<EventData, 'el' | 'rows' | 'cols'>,\r\n): Cell {\r\n // Get the bounding rectangle of the element\r\n const { top, left, height, width } = el.getBoundingClientRect();\r\n\r\n // Calculate the cell position relative to the element\r\n let cellY = y - top;\r\n let cellX = x - left;\r\n\r\n // Limit the cell position to the element height\r\n if (cellY >= height) {\r\n cellY = height - 1;\r\n }\r\n\r\n // Limit the cell position to the element width\r\n if (cellX >= width) {\r\n cellX = width - 1;\r\n }\r\n\r\n // Get the row and column items based on the cell position\r\n const rgRow = getItemByPosition(rows, cellY);\r\n const rgCol = getItemByPosition(cols, cellX);\r\n\r\n // Set the row and column index to 0 if they are before the first item\r\n if (rgCol.itemIndex < 0) {\r\n rgCol.itemIndex = 0;\r\n }\r\n\r\n if (rgRow.itemIndex < 0) {\r\n rgRow.itemIndex = 0;\r\n }\r\n\r\n return { x: rgCol.itemIndex, y: rgRow.itemIndex };\r\n}\r\n\r\nexport function getCoordinate(\r\n range: RangeArea,\r\n focus: Cell,\r\n changes: Partial<Cell>,\r\n isMulti = false,\r\n) {\r\n const updateCoordinate = (c: keyof Cell, pos = 0) => {\r\n const start = { x: range.x, y: range.y };\r\n const end = isMulti ? { x: range.x1, y: range.y1 } : start;\r\n const point = end[c] > focus[c] ? end : start;\r\n point[c] += pos;\r\n return { start, end };\r\n };\r\n\r\n if (changes.x) {\r\n return updateCoordinate('x', changes['x']);\r\n }\r\n if (changes.y) {\r\n return updateCoordinate('y', changes['y']);\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Check if the x coordinate of the cell position is after or equal to the x coordinate of the last cell position\r\n * or if the y coordinate of the cell position is after or equal to the y coordinate of the last cell position\r\n */\r\nexport function isAfterLast({ x, y }: Cell, lastCell: Cell) {\r\n return x >= lastCell.x || y >= lastCell.y;\r\n}\r\n\r\n/** check if out of range */\r\nexport function isBeforeFirst({ x, y }: Cell) {\r\n return x < 0 || y < 0;\r\n}\r\n\r\n/** Compare cells, only 1 coordinate difference is possible */\r\n// export function getDirectionCoordinate(initial: Cell, last: Cell): Partial<Cell> | null {\r\n// const c: (keyof Cell)[] = ['x', 'y'];\r\n// for (let k of c) {\r\n// if (initial[k] !== last[k]) {\r\n// return { [k]: 1 };\r\n// }\r\n// }\r\n// return null;\r\n// }\r\n\r\n// export function getLargestAxis(initial: Cell, last: Cell): Partial<Cell> | null {\r\n// const cell: Partial<Cell> = {};\r\n// const c: (keyof Cell)[] = ['x', 'y'];\r\n// for (let k of c) {\r\n// cell[k] = Math.abs(initial[k] - last[k]);\r\n// }\r\n// if (cell.x > cell.y) {\r\n// return { x: 1 };\r\n// }\r\n// if (cell.y > cell.x) {\r\n// return { y: 1 };\r\n// }\r\n// return null;\r\n// }\r\n\r\nexport function styleByCellProps(styles: { [key: string]: number }): RangeAreaCss {\r\n return {\r\n left: `${styles.left}px`,\r\n top: `${styles.top}px`,\r\n width: `${styles.width}px`,\r\n height: `${styles.height}px`,\r\n };\r\n}\r\n\r\nexport function getCell(\r\n { x, y, x1, y1 }: RangeArea,\r\n dimensionRow: Pick<\r\n DimensionIndexInput,\r\n 'indexToItem' | 'indexes' | 'originItemSize'\r\n >,\r\n dimensionCol: Pick<\r\n DimensionIndexInput,\r\n 'indexToItem' | 'indexes' | 'originItemSize'\r\n >,\r\n) {\r\n const top = getItemByIndex(dimensionRow, y).start;\r\n const left = getItemByIndex(dimensionCol, x).start;\r\n const bottom = getItemByIndex(dimensionRow, y1).end;\r\n const right = getItemByIndex(dimensionCol, x1).end;\r\n\r\n return {\r\n left,\r\n right,\r\n top,\r\n bottom,\r\n width: right - left,\r\n height: bottom - top,\r\n };\r\n}\r\n","@use '../../global/_mixins.scss' as *;\r\n\r\nrevogr-focus.focused-cell {\r\n @include selection(1px);\r\n\r\n position: absolute;\r\n pointer-events: none;\r\n z-index: 9;\r\n display: block !important;\r\n}\r\n","import {\r\n Component,\r\n Prop,\r\n h,\r\n Host,\r\n Event,\r\n Element,\r\n EventEmitter,\r\n} from '@stencil/core';\r\nimport { FOCUS_CLASS } from '../../utils/consts';\r\nimport { getCell, styleByCellProps } from '../overlay/selection.utils';\r\nimport { DSourceState, getSourceItem } from '@store';\r\nimport type {\r\n Cell,\r\n SelectionStoreState,\r\n ColumnRegular,\r\n DataType,\r\n DimensionSettingsState,\r\n FocusRenderEvent,\r\n FocusTemplateFunc,\r\n DimensionCols,\r\n DimensionRows,\r\n FocusAfterRenderEvent,\r\n} from '@type';\r\nimport type { Observable } from '../../utils';\r\n\r\n/**\r\n * Focus component. Shows focus layer around the cell that is currently in focus.\r\n * @slot focus-${view.type}-${data.type}. @example focus-rgCol-rgRow\r\n */\r\n@Component({\r\n tag: 'revogr-focus',\r\n styleUrl: 'revogr-focus-style.scss',\r\n})\r\nexport class RevogrFocus {\r\n /**\r\n * Column type\r\n */\r\n @Prop() colType!: DimensionCols;\r\n /**\r\n * Row type\r\n */\r\n @Prop() rowType!: DimensionRows;\r\n\r\n /** Dynamic stores */\r\n /** Selection, range, focus for selection */\r\n @Prop() selectionStore!: Observable<SelectionStoreState>;\r\n /** Dimension settings Y */\r\n @Prop() dimensionRow!: Observable<DimensionSettingsState>;\r\n /** Dimension settings X */\r\n @Prop() dimensionCol!: Observable<DimensionSettingsState>;\r\n /**\r\n * Data rows source\r\n */\r\n @Prop() dataStore!: Observable<DSourceState<DataType, DimensionRows>>;\r\n /**\r\n * Column source\r\n */\r\n @Prop() colData!: Observable<DSourceState<ColumnRegular, DimensionCols>>;\r\n\r\n /**\r\n * Focus template custom function. Can be used to render custom focus layer.\r\n */\r\n @Prop() focusTemplate: FocusTemplateFunc | null = null;\r\n\r\n /**\r\n * Before focus render event.\r\n * Can be prevented by event.preventDefault().\r\n * If preventDefault used slot will be rendered.\r\n */\r\n @Event({ eventName: 'beforefocusrender' })\r\n beforeFocusRender: EventEmitter<FocusRenderEvent>;\r\n\r\n /**\r\n * Before focus changed verify if it's in view and scroll viewport into this view\r\n * Can be prevented by event.preventDefault()\r\n */\r\n @Event({ eventName: 'beforescrollintoview' })\r\n beforeScrollIntoView: EventEmitter<{ el: HTMLElement }>;\r\n /**\r\n * Used to setup properties after focus was rendered\r\n */\r\n @Event({ eventName: 'afterfocus' })\r\n afterFocus: EventEmitter<FocusAfterRenderEvent>;\r\n\r\n @Element() el: HTMLElement;\r\n private activeFocus: Cell | null = null;\r\n\r\n componentDidRender() {\r\n const currentFocus = this.selectionStore.get('focus');\r\n if (\r\n this.activeFocus?.x === currentFocus?.x &&\r\n this.activeFocus?.y === currentFocus?.y\r\n ) {\r\n return;\r\n }\r\n this.activeFocus = currentFocus;\r\n if (currentFocus && this.el) {\r\n const beforeScrollIn = this.beforeScrollIntoView.emit({ el: this.el });\r\n if (!beforeScrollIn.defaultPrevented) {\r\n this.el.scrollIntoView({\r\n block: 'nearest',\r\n inline: 'nearest',\r\n });\r\n }\r\n const model = getSourceItem(this.dataStore, currentFocus.y);\r\n const column = getSourceItem(this.colData, currentFocus.x);\r\n this.afterFocus.emit({\r\n model,\r\n column,\r\n rowType: this.rowType,\r\n colType: this.colType,\r\n rowIndex: currentFocus.y,\r\n colIndex: currentFocus.x,\r\n });\r\n }\r\n }\r\n\r\n render() {\r\n const editCell = this.selectionStore.get('edit');\r\n if (editCell) {\r\n return;\r\n }\r\n const focusCell = this.selectionStore.get('focus');\r\n if (!focusCell) {\r\n return;\r\n }\r\n const event = this.beforeFocusRender.emit({\r\n range: {\r\n ...focusCell,\r\n x1: focusCell.x,\r\n y1: focusCell.y,\r\n },\r\n rowType: this.rowType,\r\n colType: this.colType,\r\n rowDimension: { ...this.dimensionRow.state },\r\n colDimension: { ...this.dimensionCol.state },\r\n });\r\n if (event.defaultPrevented) {\r\n return <slot />;\r\n }\r\n const { detail } = event;\r\n\r\n const cell = getCell(\r\n detail.range,\r\n event.detail.rowDimension,\r\n event.detail.colDimension,\r\n );\r\n const styles = styleByCellProps(cell);\r\n const extra = this.focusTemplate?.(h, detail);\r\n const props = {\r\n class: { [FOCUS_CLASS]: true },\r\n style: styles,\r\n };\r\n return (\r\n <Host {...props}>\r\n <slot />\r\n {extra}\r\n </Host>\r\n );\r\n }\r\n}\r\n","import { getRange } from '@store';\r\nimport {\r\n codesLetter,\r\n isAll,\r\n isClear,\r\n isCopy,\r\n isCut,\r\n isEnterKeyValue,\r\n isPaste,\r\n isTab,\r\n timeout,\r\n RESIZE_INTERVAL,\r\n type Observable,\r\n isBack,\r\n} from '../../utils';\r\nimport {\r\n EventData,\r\n getCoordinate,\r\n isAfterLast,\r\n isBeforeFirst,\r\n} from './selection.utils';\r\nimport { Cell, Nullable, RangeArea, SelectionStoreState } from '@type';\r\n\r\ntype Config = {\r\n selectionStore: Observable<SelectionStoreState>;\r\n\r\n // Apply changes from edit.\r\n change(val?: any): void;\r\n // Cancels edit. Escape changes.\r\n cancel(): void;\r\n\r\n clearCell(): void;\r\n focus(\r\n focus: Cell,\r\n changes: Partial<Cell>,\r\n focusNextViewport?: number,\r\n ): boolean;\r\n\r\n getData(): any;\r\n internalPaste(): void;\r\n range(range: RangeArea | null): boolean;\r\n selectAll(): void;\r\n\r\n rollback(): void;\r\n};\r\n\r\nconst DIRECTION_CODES: string[] = [\r\n codesLetter.TAB,\r\n codesLetter.ARROW_UP,\r\n codesLetter.ARROW_DOWN,\r\n codesLetter.ARROW_LEFT,\r\n codesLetter.ARROW_RIGHT,\r\n];\r\nexport class KeyboardService {\r\n constructor(private sv: Config) {}\r\n\r\n async keyDown(\r\n e: KeyboardEvent,\r\n canRange: boolean,\r\n isEditMode: boolean,\r\n { range, focus }: Nullable<Pick<EventData, 'range' | 'focus'>>,\r\n ) {\r\n // IF EDIT MODE\r\n if (isEditMode) {\r\n switch (e.code) {\r\n case codesLetter.ESCAPE:\r\n this.sv.cancel();\r\n break;\r\n case codesLetter.TAB:\r\n this.keyChangeSelection(e, canRange);\r\n break;\r\n }\r\n return;\r\n }\r\n\r\n // IF NOT EDIT MODE\r\n\r\n // pressed clear key\r\n if (range && isClear(e.code)) {\r\n this.sv.clearCell();\r\n return;\r\n }\r\n\r\n // below works with focus only\r\n if (!focus) {\r\n return;\r\n }\r\n\r\n // tab key means same as arrow right\r\n if (isTab(e.code)) {\r\n this.keyChangeSelection(e, canRange);\r\n return;\r\n }\r\n\r\n // pressed enter\r\n if (isEnterKeyValue(e.key)) {\r\n this.sv.change();\r\n return;\r\n }\r\n\r\n // copy operation\r\n if (isCopy(e)) {\r\n return;\r\n }\r\n\r\n // cut operation\r\n if (isCut(e)) {\r\n return;\r\n }\r\n\r\n // paste operation\r\n if (isPaste(e)) {\r\n this.sv.internalPaste();\r\n return;\r\n }\r\n\r\n if (isBack(e)) {\r\n // rollback\r\n e.preventDefault();\r\n this.sv.rollback();\r\n return;\r\n }\r\n\r\n // select all\r\n if (isAll(e)) {\r\n e.preventDefault();\r\n // if (canRange) {\r\n // this.selectAll(e);\r\n // }\r\n return;\r\n }\r\n\r\n // pressed letter key\r\n if (e.key.length === 1) {\r\n this.sv.change(e.key);\r\n return;\r\n }\r\n\r\n // pressed arrow, change selection position\r\n if (await this.keyChangeSelection(e, canRange)) {\r\n return;\r\n }\r\n }\r\n\r\n // private selectAll(e: KeyboardEvent) {\r\n // const range = this.sv.selectionStore.get('range');\r\n // const focus = this.sv.selectionStore.get('focus');\r\n // // if no range or focus - do nothing\r\n // if (!range || !focus) {\r\n // return;\r\n // }\r\n // e.preventDefault();\r\n // this.sv.selectAll();\r\n // }\r\n\r\n async keyChangeSelection(e: KeyboardEvent, canRange: boolean) {\r\n const data = this.changeDirectionKey(e, canRange);\r\n if (!data) {\r\n return false;\r\n }\r\n\r\n // this interval needed for several cases\r\n // grid could be resized before next click\r\n // at this case to avoid screen jump we use this interval\r\n await timeout(RESIZE_INTERVAL + 30);\r\n\r\n const range = this.sv.selectionStore.get('range');\r\n const focus = this.sv.selectionStore.get('focus');\r\n return this.keyPositionChange(data.changes, range, focus, data.isMulti);\r\n }\r\n\r\n keyPositionChange(\r\n changes: Partial<Cell>,\r\n range: RangeArea | null,\r\n focus: Cell | null,\r\n isMulti = false,\r\n ) {\r\n if (!range || !focus) {\r\n return false;\r\n }\r\n const data = getCoordinate(range, focus, changes, isMulti);\r\n if (!data) {\r\n return false;\r\n }\r\n const eData: EventData = this.sv.getData();\r\n if (isMulti) {\r\n if (isAfterLast(data.end, eData.lastCell) || isBeforeFirst(data.start)) {\r\n return false;\r\n }\r\n const range = getRange(data.start, data.end);\r\n return this.sv.range(range);\r\n }\r\n return this.sv.focus(\r\n data.start,\r\n changes,\r\n isAfterLast(data.start, eData.lastCell)\r\n ? 1\r\n : isBeforeFirst(data.start)\r\n ? -1\r\n : 0,\r\n );\r\n }\r\n\r\n /** Monitor key direction changes */\r\n changeDirectionKey(\r\n e: KeyboardEvent,\r\n canRange: boolean,\r\n ): { changes: Partial<Cell>; isMulti?: boolean } | void {\r\n const isMulti = canRange && e.shiftKey;\r\n if (DIRECTION_CODES.includes(e.code)) {\r\n e.preventDefault();\r\n }\r\n\r\n if (e.shiftKey) {\r\n switch (e.code) {\r\n case codesLetter.TAB:\r\n return { changes: { x: -1 }, isMulti: false };\r\n }\r\n }\r\n\r\n switch (e.code) {\r\n case codesLetter.ARROW_UP:\r\n return { changes: { y: -1 }, isMulti };\r\n case codesLetter.ARROW_DOWN:\r\n return { changes: { y: 1 }, isMulti };\r\n case codesLetter.ARROW_LEFT:\r\n return { changes: { x: -1 }, isMulti };\r\n case codesLetter.TAB:\r\n case codesLetter.ARROW_RIGHT:\r\n return { changes: { x: 1 }, isMulti };\r\n }\r\n }\r\n}\r\n","import debounce from 'lodash/debounce';\r\nimport { DebouncedFunc } from 'lodash';\r\n\r\nimport { h } from '@stencil/core';\r\nimport {\r\n CELL_HANDLER_CLASS,\r\n MOBILE_CLASS,\r\n DIRECTION_LOCK_DISTANCE,\r\n} from '../../utils/consts';\r\nimport {\r\n collectModelsOfRange,\r\n EventData,\r\n getCell,\r\n getCurrentCell,\r\n isAfterLast,\r\n} from './selection.utils';\r\nimport { DSourceState, getRange } from '@store';\r\nimport ColumnService from '../data/column.service';\r\nimport { getPropertyFromEvent } from '../../utils/events';\r\nimport {\r\n DataLookup,\r\n DataType,\r\n DimensionSettingsState,\r\n TempRange,\r\n ChangedRange,\r\n BeforeRangeSaveDataDetails,\r\n RangeArea,\r\n Cell,\r\n DimensionRows,\r\n Nullable,\r\n} from '@type';\r\nimport { Observable } from '../../utils';\r\n\r\ntype Config = {\r\n dimensionRow: Observable<DimensionSettingsState>;\r\n dimensionCol: Observable<DimensionSettingsState>;\r\n columnService: ColumnService;\r\n dataStore: Observable<DSourceState<DataType, DimensionRows>>;\r\n\r\n setTempRange(e: Nullable<TempRange> | null): Event | null;\r\n selectionChanged(e: ChangedRange): Event;\r\n rangeCopy(e: ChangedRange): Event;\r\n rangeDataApply(e: BeforeRangeSaveDataDetails): CustomEvent;\r\n setRange(e: RangeArea | null): boolean;\r\n clearRangeDataApply(e: { range: RangeArea }): CustomEvent<{\r\n range: RangeArea;\r\n }>;\r\n\r\n getData(): any;\r\n};\r\n\r\nconst enum AutoFillType {\r\n selection = 'Selection',\r\n autoFill = 'AutoFill',\r\n}\r\n\r\nexport class AutoFillService {\r\n private autoFillType: AutoFillType | null = null;\r\n private autoFillInitial: Cell | null = null;\r\n private autoFillStart: Cell | null = null;\r\n private autoFillLast: Cell | null = null;\r\n private autoFillStartRange: RangeArea | null = null;\r\n private autoFillDirection: 'horizontal' | 'vertical' | null = null;\r\n\r\n private onMouseMoveAutofill: DebouncedFunc<\r\n (e: MouseEvent | TouchEvent, data: EventData) => void\r\n >;\r\n\r\n constructor(private sv: Config) {}\r\n\r\n /**\r\n * Render autofill box\r\n * @param range\r\n * @param selectionFocus\r\n */\r\n renderAutofill(\r\n range: RangeArea | null,\r\n selectionFocus: Cell,\r\n isMobile = false,\r\n ) {\r\n let handlerStyle;\r\n if (range) {\r\n handlerStyle = getCell(\r\n range,\r\n this.sv.dimensionRow.state,\r\n this.sv.dimensionCol.state,\r\n );\r\n } else {\r\n handlerStyle = getCell(\r\n {\r\n ...selectionFocus,\r\n x1: selectionFocus.x,\r\n y1: selectionFocus.y,\r\n },\r\n this.sv.dimensionRow.state,\r\n this.sv.dimensionCol.state,\r\n );\r\n }\r\n return (\r\n <div\r\n class={{\r\n [CELL_HANDLER_CLASS]: true,\r\n [MOBILE_CLASS]: isMobile,\r\n }}\r\n style={{\r\n left: `${handlerStyle.right}px`,\r\n top: `${handlerStyle.bottom}px`,\r\n }}\r\n onMouseDown={(e: MouseEvent) => this.autoFillHandler(e)}\r\n onTouchStart={(e: TouchEvent) => this.autoFillHandler(e)}\r\n />\r\n );\r\n }\r\n\r\n private autoFillHandler(\r\n e: MouseEvent | TouchEvent,\r\n type = AutoFillType.autoFill,\r\n ) {\r\n let target: Element | null = null;\r\n if (e.target instanceof Element) {\r\n target = e.target;\r\n }\r\n if (!target) {\r\n return;\r\n }\r\n this.selectionStart(target, this.sv.getData(), type);\r\n e.preventDefault();\r\n }\r\n\r\n get isAutoFill() {\r\n return !!this.autoFillType;\r\n }\r\n\r\n /**\r\n * Process mouse move events\r\n */\r\n selectionMouseMove(e: MouseEvent | TouchEvent) {\r\n // initiate mouse move debounce if not present\r\n if (!this.onMouseMoveAutofill) {\r\n this.onMouseMoveAutofill = debounce(\r\n (e: MouseEvent | TouchEvent, data: EventData) =>\r\n this.doAutofillMouseMove(e, data),\r\n 5,\r\n );\r\n }\r\n if (this.isAutoFill) {\r\n this.onMouseMoveAutofill(e, this.sv.getData());\r\n }\r\n }\r\n\r\n private getFocus(focus: Cell | null, range: RangeArea | null) {\r\n // there was an issue that it was taking last cell from range but focus was out\r\n if (!focus && range) {\r\n focus = { x: range.x, y: range.y };\r\n }\r\n return focus || null;\r\n }\r\n\r\n /**\r\n * Autofill logic:\r\n * on mouse move apply based on previous direction (if present)\r\n */\r\n private doAutofillMouseMove(event: MouseEvent | TouchEvent, data: EventData) {\r\n // if no initial - not started\r\n if (!this.autoFillInitial || !this.autoFillStartRange) {\r\n return;\r\n }\r\n\r\n const clientX = getPropertyFromEvent(event, 'clientX', MOBILE_CLASS);\r\n const clientY = getPropertyFromEvent(event, 'clientY', MOBILE_CLASS);\r\n // skip touch\r\n if (clientX === null || clientY === null) {\r\n return;\r\n }\r\n const current = getCurrentCell({ x: clientX, y: clientY }, data);\r\n\r\n // first time or direction equal to start(same as first time)\r\n if (!this.autoFillLast) {\r\n if (!this.autoFillLast) {\r\n this.autoFillLast = this.autoFillStart;\r\n }\r\n }\r\n\r\n // check if not the latest, if latest - do nothing\r\n if (isAfterLast(current, data.lastCell)) {\r\n return;\r\n }\r\n\r\n const { x, y, x1, y1 } = this.autoFillStartRange;\r\n\r\n // correct direction in autofill mode\r\n if (this.autoFillType === AutoFillType.autoFill) {\r\n const { dx, dy } = this.computeAutoFillOverflow(\r\n this.autoFillStartRange,\r\n current,\r\n );\r\n\r\n this.resolveAutoFillDirection(dx, dy);\r\n\r\n let lockedCurrent = { ...current };\r\n\r\n if (this.autoFillDirection === 'horizontal') {\r\n lockedCurrent.y = Math.max(y, y1);\r\n } else if (this.autoFillDirection === 'vertical') {\r\n lockedCurrent.x = Math.max(x, x1);\r\n }\r\n\r\n this.autoFillLast = lockedCurrent;\r\n } else {\r\n this.autoFillLast = current;\r\n }\r\n\r\n const isSame =\r\n current.x === this.autoFillInitial.x &&\r\n current.y === this.autoFillInitial.y;\r\n const isInside =\r\n current.x <= x1 && current.x >= x && current.y <= y1 && current.y >= y;\r\n\r\n // if same as initial or inside of initial selection - clear\r\n if (isSame || isInside) {\r\n this.sv.setTempRange(null);\r\n this.autoFillDirection = null;\r\n return;\r\n }\r\n\r\n let area: RangeArea | null = null;\r\n\r\n // check offsets if autofill mode\r\n if (this.autoFillType === AutoFillType.autoFill) {\r\n const initial = this.defineAutoFillInitial(\r\n this.autoFillStartRange,\r\n current,\r\n );\r\n area = getRange(initial, this.autoFillLast);\r\n } else {\r\n area = getRange(this.autoFillInitial, this.autoFillLast);\r\n }\r\n\r\n this.sv.setTempRange({\r\n area,\r\n type: this.autoFillType,\r\n });\r\n }\r\n\r\n /**\r\n * Range selection started\r\n * Mode @param type:\r\n * Can be triggered from MouseDown selection on element\r\n * Or can be triggered on corner square drag\r\n */\r\n selectionStart(\r\n target: Element,\r\n data: EventData,\r\n type = AutoFillType.selection,\r\n ) {\r\n /** Get cell by autofill element */\r\n const { top, left } = target.getBoundingClientRect();\r\n this.autoFillInitial = this.getFocus(data.focus, data.range);\r\n this.autoFillType = type;\r\n this.autoFillStartRange = data.range;\r\n this.autoFillStart = getCurrentCell({ x: left, y: top }, data);\r\n }\r\n\r\n /**\r\n * Clear current range selection on mouse up and mouse leave events\r\n */\r\n clearAutoFillSelection(focus: Cell | null, oldRange: RangeArea | null) {\r\n // If autofill was active, apply autofill values\r\n if (this.autoFillInitial) {\r\n // Fetch latest focus\r\n this.autoFillInitial = this.getFocus(focus, oldRange);\r\n\r\n // Apply range data if autofill mode is active\r\n if (\r\n this.autoFillType === AutoFillType.autoFill &&\r\n this.autoFillStartRange &&\r\n this.autoFillLast\r\n ) {\r\n const { x, x1, y, y1 } = this.autoFillStartRange;\r\n const xCoord = this.autoFillLast.x < x ? x1 : x;\r\n const yCoord = this.autoFillLast.y < y ? y1 : y;\r\n const range = getRange({ x: xCoord, y: yCoord }, this.autoFillLast);\r\n\r\n // If range is present, apply data\r\n if (range) {\r\n const {\r\n defaultPrevented: stopApply,\r\n detail: { range: newRange },\r\n } = this.sv.clearRangeDataApply({\r\n range,\r\n });\r\n\r\n // If data apply was not prevented, apply new range\r\n if (!stopApply && oldRange) {\r\n this.applyRangeWithData(newRange, oldRange);\r\n } else {\r\n // If data apply was prevented, clear temporary range\r\n this.sv.setTempRange(null);\r\n }\r\n }\r\n } else {\r\n // If not autofill mode, apply range only\r\n this.applyRangeOnly(this.autoFillInitial, this.autoFillLast);\r\n }\r\n }\r\n\r\n // Reset autofill state\r\n this.resetAutoFillState();\r\n }\r\n\r\n /**\r\n * Reset autofill state\r\n */\r\n private resetAutoFillState() {\r\n this.autoFillType = null;\r\n this.autoFillInitial = null;\r\n this.autoFillLast = null;\r\n this.autoFillStart = null;\r\n this.autoFillDirection = null;\r\n this.autoFillStartRange = null;\r\n }\r\n\r\n /**\r\n * Trigger range apply events and handle responses\r\n */\r\n onRangeApply(\r\n newData: DataLookup,\r\n newRange: RangeArea | null,\r\n oldRange: RangeArea | null,\r\n copy: boolean = false,\r\n clear: boolean = false,\r\n ) {\r\n this.sv.rangeDataApply({\r\n data: newData,\r\n models: collectModelsOfRange(newData, this.sv.dataStore),\r\n type: this.sv.dataStore.get('type'),\r\n oldRange,\r\n newRange,\r\n previousModels: null,\r\n copy,\r\n clearByKeyboard: clear,\r\n });\r\n\r\n this.sv.setRange(newRange);\r\n }\r\n\r\n /** Apply range and copy data during range application */\r\n private applyRangeWithData(newRange: RangeArea, rangeToCopy: RangeArea) {\r\n const rangeData: ChangedRange = {\r\n type: this.sv.dataStore.get('type'),\r\n colType: this.sv.columnService.type,\r\n newData: {},\r\n mapping: {},\r\n newRange,\r\n oldRange: rangeToCopy,\r\n };\r\n const { mapping, changed } = this.sv.columnService.getRangeData(\r\n rangeData,\r\n this.sv.columnService.columns,\r\n );\r\n rangeData.newData = changed;\r\n rangeData.mapping = mapping;\r\n let e = this.sv.selectionChanged(rangeData);\r\n\r\n // if default prevented - clear range\r\n if (e.defaultPrevented) {\r\n this.sv.setTempRange(null);\r\n return;\r\n }\r\n\r\n e = this.sv.rangeCopy(rangeData);\r\n if (e.defaultPrevented) {\r\n this.sv.setRange(newRange);\r\n return;\r\n }\r\n this.onRangeApply(rangeData.newData, newRange, rangeToCopy);\r\n }\r\n\r\n /**\r\n * Update range selection only,\r\n * no data change (mouse selection)\r\n */\r\n private applyRangeOnly(start?: Cell | null, end?: Cell | null) {\r\n // no changes to apply\r\n if (!start || !end) {\r\n return;\r\n }\r\n\r\n const newRange = getRange(start, end);\r\n this.sv.setRange(newRange);\r\n }\r\n\r\n /**\r\n * Compute autofill overflow (dx & dy) relative to initial selection by current mouse position.\r\n */\r\n private computeAutoFillOverflow(range: RangeArea, cell: Cell) {\r\n const dx = Math.max(range.x - cell.x, 0, cell.x - range.x1);\r\n const dy = Math.max(range.y - cell.y, 0, cell.y - range.y1);\r\n return { dx, dy };\r\n }\r\n\r\n /**\r\n * Define autofill initial position\r\n */\r\n private defineAutoFillInitial(range: RangeArea, cell: Cell): Cell {\r\n const { x, y, x1, y1 } = range;\r\n const needUpOffset =\r\n y !== y1 && cell.y < y && this.autoFillDirection === 'vertical';\r\n const needLeftOffset =\r\n x !== x1 && cell.x < x && this.autoFillDirection === 'horizontal';\r\n\r\n return {\r\n x: needLeftOffset ? x1 : x,\r\n y: needUpOffset ? y1 : y,\r\n };\r\n }\r\n\r\n /**\r\n * Resolve autofill direction by current mouse position\r\n */\r\n private resolveAutoFillDirection(dx: number, dy: number) {\r\n if (!this.autoFillDirection) {\r\n this.autoFillDirection = dx > dy ? 'horizontal' : 'vertical';\r\n return;\r\n }\r\n\r\n const isYAxisOverflow = dx < DIRECTION_LOCK_DISTANCE && dy > dx + 1;\r\n const isXAxisOverflow = dy < DIRECTION_LOCK_DISTANCE && dx > dy + 1;\r\n\r\n const isXAxisEnd = dx === 0 && dy !== 0;\r\n const isYAxisEnd = dy === 0 && dx !== 0;\r\n\r\n if (\r\n this.autoFillDirection === 'horizontal' &&\r\n (isYAxisOverflow || isXAxisEnd)\r\n ) {\r\n this.autoFillDirection = 'vertical';\r\n return;\r\n }\r\n\r\n if (\r\n this.autoFillDirection === 'vertical' &&\r\n (isXAxisOverflow || isYAxisEnd)\r\n ) {\r\n this.autoFillDirection = 'horizontal';\r\n }\r\n }\r\n}\r\n","@use '../../global/_mixins.scss' as *;\r\n@use '../../global/_colors.scss' as *;\r\n\r\n@mixin autofill-handle($handler-size: 14px, $icon-size: 10px) {\r\n .autofill-handle {\r\n position: absolute;\r\n width: $handler-size;\r\n height: $handler-size;\r\n margin-left: -$handler-size + 1;\r\n margin-top: -$handler-size + 1;\r\n z-index: 10;\r\n cursor: crosshair;\r\n\r\n &::before {\r\n content: '';\r\n position: absolute;\r\n right: 0;\r\n bottom: 0;\r\n width: $icon-size;\r\n height: $icon-size;\r\n background: $selection-border;\r\n border: 1px solid white;\r\n box-sizing: border-box;\r\n }\r\n }\r\n}\r\n\r\nrevogr-overlay-selection {\r\n display: block;\r\n position: relative;\r\n width: 100%;\r\n\r\n\r\n @include autofill-handle;\r\n\r\n &.mobile {\r\n @include autofill-handle(30px, 12px);\r\n }\r\n\r\n .selection-border-range {\r\n position: absolute;\r\n pointer-events: none;\r\n z-index: 9;\r\n\r\n .range-handlers {\r\n height: 100%;\r\n background-color: transparent;\r\n width: calc(50% + (50% / 2));\r\n max-width: 50px;\r\n min-width: 20px;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n position: absolute;\r\n\r\n $btn-size: 20px;\r\n $handler-w: 15px;\r\n $handler-h: 5px;\r\n \r\n > span {\r\n pointer-events: auto;\r\n height: $btn-size;\r\n width: $btn-size;\r\n position: absolute;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n\r\n\r\n &:before, &:after {\r\n position: absolute;\r\n border-radius: 5px;\r\n width: $handler-w;\r\n height: $handler-h;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n background-color: rgba(black, 20%);\r\n }\r\n &:first-child {\r\n top: -($handler-h + 2px);\r\n &:before{\r\n content: '';\r\n top: 0;\r\n }\r\n }\r\n &:last-child {\r\n bottom: -($handler-h + 2px);\r\n &:after{\r\n content: '';\r\n bottom: 0;\r\n }\r\n }\r\n }\r\n }\r\n @include selection();\r\n }\r\n\r\n revogr-edit {\r\n z-index: 10;\r\n }\r\n}\r\n","import {\r\n Component,\r\n Event,\r\n EventEmitter,\r\n h,\r\n Host,\r\n Listen,\r\n Prop,\r\n type VNode,\r\n Element,\r\n Watch,\r\n} from '@stencil/core';\r\nimport ColumnService, { getCellEditor } from '../data/column.service';\r\nimport { codesLetter } from '../../utils/key.codes';\r\nimport { MOBILE_CLASS, SELECTION_BORDER_CLASS } from '../../utils/consts';\r\nimport { type DSourceState, getRange, isRangeSingleCell } from '@store';\r\nimport {\r\n collectModelsOfRange,\r\n EventData,\r\n getCell,\r\n getFocusCellBasedOnEvent,\r\n styleByCellProps,\r\n} from './selection.utils';\r\nimport { isEditInput } from '../editors/edit.utils';\r\nimport { KeyboardService } from './keyboard.service';\r\nimport { AutoFillService } from './autofill.service';\r\nimport { verifyTouchTarget } from '../../utils/events';\r\nimport { checkIsRightClick, getCellData, type Observable } from '../../utils';\r\n\r\nimport type {\r\n SelectionStoreState,\r\n DimensionSettingsState,\r\n DataType,\r\n DimensionRows,\r\n ColumnRegular,\r\n DimensionCols,\r\n DragStartEvent,\r\n Cell,\r\n MultiDimensionType,\r\n Nullable,\r\n RangeClipboardCopyEventProps,\r\n RangeClipboardPasteEvent,\r\n FocusRenderEvent,\r\n ApplyFocusEvent,\r\n AllDimensionType,\r\n DataFormat,\r\n Editors,\r\n BeforeSaveDataDetails,\r\n BeforeEdit,\r\n RangeArea,\r\n TempRange,\r\n ChangedRange,\r\n BeforeRangeSaveDataDetails,\r\n SaveDataDetails,\r\n EditCellStore,\r\n} from '@type';\r\n\r\n/**\r\n * Component for overlaying the grid with the selection.\r\n */\r\n@Component({\r\n tag: 'revogr-overlay-selection',\r\n styleUrl: 'revogr-overlay-style.scss',\r\n})\r\nexport class OverlaySelection {\r\n // #region Properties\r\n /**\r\n * Readonly mode.\r\n */\r\n @Prop() readonly: boolean;\r\n /**\r\n * Range selection allowed.\r\n */\r\n @Prop() range: boolean;\r\n /**\r\n * Enable revogr-order-editor component (read more in revogr-order-editor component).\r\n * Allows D&D.\r\n */\r\n @Prop() canDrag: boolean;\r\n\r\n /**\r\n * Enable revogr-clipboard component (read more in revogr-clipboard component).\r\n * Allows copy/paste.\r\n */\r\n @Prop() useClipboard: boolean;\r\n\r\n /** Stores */\r\n /** Selection, range, focus. */\r\n @Prop() selectionStore!: Observable<SelectionStoreState>;\r\n /** Dimension settings Y. */\r\n @Prop() dimensionRow: Observable<DimensionSettingsState>;\r\n /** Dimension settings X. */\r\n @Prop() dimensionCol!: Observable<DimensionSettingsState>;\r\n\r\n // --------------------------------------------------------------------------\r\n //\r\n // Static stores, not expected to change during component lifetime\r\n //\r\n // --------------------------------------------------------------------------\r\n\r\n /**\r\n * Row data store.\r\n */\r\n @Prop() dataStore!: Observable<DSourceState<DataType, DimensionRows>>;\r\n\r\n /**\r\n * Column data store.\r\n */\r\n @Prop() colData!: Observable<DSourceState<ColumnRegular, DimensionCols>>;\r\n /**\r\n * Last real coordinates positions + 1.\r\n */\r\n @Prop() lastCell: Cell;\r\n /**\r\n * Custom editors register.\r\n */\r\n @Prop() editors: Editors;\r\n /**\r\n * If true applys changes when cell closes if not Escape.\r\n */\r\n @Prop() applyChangesOnClose = false;\r\n /**\r\n * Additional data to pass to renderer.\r\n */\r\n @Prop() additionalData: any;\r\n\r\n /**\r\n * Is mobile view mode.\r\n */\r\n @Prop() isMobileDevice: boolean;\r\n\r\n // #endregion\r\n\r\n // #region Events\r\n /**\r\n * Before clipboard copy happened. Validate data before copy.\r\n * To prevent the default behavior of editing data and use your own implementation, call `e.preventDefault()`.\r\n */\r\n @Event({ eventName: 'beforecopyregion', cancelable: true })\r\n beforeCopyRegion: EventEmitter;\r\n /**\r\n * Before region paste happened.\r\n */\r\n @Event({ eventName: 'beforepasteregion', cancelable: true })\r\n beforeRegionPaste: EventEmitter;\r\n\r\n /**\r\n * Cell edit apply to the data source.\r\n * Triggers datasource edit on the root level.\r\n */\r\n @Event({ eventName: 'celleditapply', cancelable: true })\r\n cellEditApply: EventEmitter<BeforeSaveDataDetails>;\r\n\r\n /**\r\n * Before cell focus.\r\n */\r\n @Event({ eventName: 'beforecellfocusinit', cancelable: true })\r\n beforeFocusCell: EventEmitter<BeforeSaveDataDetails>;\r\n\r\n /**\r\n * Fired when change of viewport happens.\r\n * Usually when we switch between pinned regions.\r\n */\r\n @Event({ eventName: 'beforenextvpfocus', cancelable: true })\r\n beforeNextViewportFocus: EventEmitter<Cell>;\r\n\r\n /**\r\n * Set edit cell.\r\n */\r\n @Event({ eventName: 'setedit' }) setEdit: EventEmitter<BeforeEdit>;\r\n\r\n /**\r\n * Before range applied.\r\n * First step in triggerRangeEvent.\r\n */\r\n @Event({ eventName: 'beforeapplyrange' })\r\n beforeApplyRange: EventEmitter<FocusRenderEvent>;\r\n /**\r\n * Before range selection applied.\r\n * Second step in triggerRangeEvent.\r\n */\r\n @Event({ eventName: 'beforesetrange' }) beforeSetRange: EventEmitter;\r\n\r\n /**\r\n * Set range.\r\n * Third step in triggerRangeEvent.\r\n */\r\n @Event({ eventName: 'setrange' }) setRange: EventEmitter<\r\n RangeArea & { type: MultiDimensionType }\r\n >;\r\n\r\n /**\r\n * Before editor render.\r\n */\r\n @Event({ eventName: 'beforeeditrender' })\r\n beforeEditRender: EventEmitter<FocusRenderEvent>;\r\n\r\n /** Select all cells from keyboard. */\r\n @Event({ eventName: 'selectall' }) selectAll: EventEmitter;\r\n /**\r\n * Cancel edit. Used for editors support when editor close requested.\r\n */\r\n @Event({ eventName: 'canceledit' }) cancelEdit: EventEmitter;\r\n /** Back action from keyboard */\r\n @Event({ eventName: 'rollback' }) rollback: EventEmitter;\r\n\r\n /**\r\n * Set temp range area during autofill.\r\n */\r\n @Event({ eventName: 'settemprange' })\r\n setTempRange: EventEmitter<Nullable<TempRange> | null>;\r\n\r\n /**\r\n * Before set temp range area during autofill.\r\n */\r\n @Event({ eventName: 'beforesettemprange' })\r\n beforeSetTempRange: EventEmitter<\r\n { tempRange: Nullable<TempRange> | null } & EventData & AllDimensionType\r\n >;\r\n\r\n /**\r\n * Before cell get focused.\r\n * To prevent the default behavior of applying the edit data, you can call `e.preventDefault()`.\r\n */\r\n @Event({ eventName: 'applyfocus' })\r\n applyFocus: EventEmitter<FocusRenderEvent>;\r\n\r\n /**\r\n * Cell get focused.\r\n * To prevent the default behavior of applying the edit data, you can call `e.preventDefault()`.\r\n */\r\n @Event({ eventName: 'focuscell' }) focusCell: EventEmitter<\r\n ApplyFocusEvent & FocusRenderEvent\r\n >;\r\n /** Range data apply. */\r\n @Event({ eventName: 'beforerangedataapply' })\r\n beforeRangeDataApply: EventEmitter<FocusRenderEvent>;\r\n /** Autofill data in range. First step in applyRangeWithData */\r\n @Event({ eventName: 'selectionchangeinit', cancelable: true })\r\n selectionChange: EventEmitter<ChangedRange>;\r\n /** Before range copy. */\r\n @Event({ eventName: 'beforerangecopyapply', cancelable: true, bubbles: true })\r\n beforeRangeCopyApply: EventEmitter<ChangedRange>;\r\n\r\n /** Range data apply.\r\n * Triggers datasource edit on the root level.\r\n */\r\n @Event({ eventName: 'rangeeditapply', cancelable: true })\r\n rangeEditApply: EventEmitter<BeforeRangeSaveDataDetails>;\r\n /** Range copy. */\r\n @Event({ eventName: 'clipboardrangecopy', cancelable: true })\r\n /**\r\n * Range copy event.\r\n * This event is triggered when data is ready to be copied to the clipboard.\r\n * If you want to prevent the default behavior of copying data, you can call `e.preventDefault()`.\r\n * If you want to modify the data that will be copied to the clipboard, modify the `data` property of the event object.\r\n */\r\n rangeClipboardCopy: EventEmitter<RangeClipboardCopyEventProps>;\r\n\r\n /**\r\n * Range paste event.\r\n */\r\n @Event({ eventName: 'clipboardrangepaste', cancelable: true })\r\n rangeClipboardPaste: EventEmitter<RangeClipboardPasteEvent>;\r\n\r\n /**\r\n * Before key up event proxy, used to prevent key up trigger.\r\n * If you have some custom behaviour event, use this event to check if it wasn't processed by internal logic.\r\n * Call preventDefault().\r\n */\r\n @Event({ eventName: 'beforekeydown' })\r\n beforeKeyDown: EventEmitter<{ original: KeyboardEvent } & EventData>;\r\n /**\r\n * Before key down event proxy, used to prevent key down trigger.\r\n * If you have some custom behaviour event, use this event to check if it wasn't processed by internal logic.\r\n * Call preventDefault().\r\n */\r\n @Event({ eventName: 'beforekeyup' }) beforeKeyUp: EventEmitter<\r\n { original: KeyboardEvent } & EventData\r\n >;\r\n /**\r\n * Runs before cell save.\r\n * Can be used to override or cancel original save.\r\n */\r\n @Event({ eventName: 'beforecellsave', cancelable: true })\r\n beforeCellSave: EventEmitter;\r\n\r\n /**\r\n * Runs when edit finished save started, first in chain event\r\n */\r\n @Event({ eventName: 'celledit' }) cellEditDone: EventEmitter<SaveDataDetails>;\r\n\r\n // #endregion\r\n\r\n // #region Private Properties\r\n @Element() element: HTMLElement;\r\n private clipboard?: HTMLRevogrClipboardElement;\r\n\r\n protected columnService: ColumnService;\r\n private keyboardService: KeyboardService | null = null;\r\n private autoFillService: AutoFillService | null = null;\r\n private orderEditor?: HTMLRevogrOrderEditorElement;\r\n private revogrEdit?: HTMLRevogrEditElement;\r\n private unsubscribeSelectionStore: { (): void }[] = [];\r\n // #endregion\r\n\r\n // #region Listeners\r\n @Listen('touchmove', { target: 'document' })\r\n @Listen('mousemove', { target: 'document' })\r\n onMouseMove(e: MouseEvent | TouchEvent) {\r\n if (this.selectionStore.get('focus')) {\r\n this.autoFillService?.selectionMouseMove(e);\r\n }\r\n }\r\n\r\n /**\r\n * Action finished inside the document.\r\n * Pointer left document, clear any active operation.\r\n */\r\n @Listen('touchend', { target: 'document' })\r\n @Listen('mouseup', { target: 'document' })\r\n @Listen('mouseleave', { target: 'document' })\r\n onMouseUp() {\r\n // Clear autofill selection\r\n // when pointer left document,\r\n // clear any active operation.\r\n this.autoFillService?.clearAutoFillSelection(\r\n this.selectionStore.get('focus'),\r\n this.selectionStore.get('range'),\r\n );\r\n }\r\n\r\n /**\r\n * Row drag started.\r\n * This event is fired when drag action started on cell.\r\n */\r\n @Listen('dragstartcell') onCellDrag(e: CustomEvent<DragStartEvent>) {\r\n // Invoke drag start on order editor.\r\n this.orderEditor?.dragStart(e.detail);\r\n }\r\n\r\n /**\r\n * Get keyboard down from element.\r\n * This event is fired when keyboard key is released.\r\n */\r\n @Listen('keyup', { target: 'document' }) onKeyUp(e: KeyboardEvent) {\r\n // Emit before key up event.\r\n this.beforeKeyUp.emit({ original: e, ...this.getData() });\r\n }\r\n\r\n /**\r\n * Get keyboard down from element.\r\n * This event is fired when keyboard key is pressed.\r\n */\r\n @Listen('keydown', { target: 'document' }) onKeyDown(e: KeyboardEvent) {\r\n // Emit before key down event and check if default prevention is set.\r\n const proxy = this.beforeKeyDown.emit({ original: e, ...this.getData() });\r\n if (e.defaultPrevented || proxy.defaultPrevented) {\r\n return;\r\n }\r\n\r\n // Invoke key down on keyboard service.\r\n this.keyboardService?.keyDown(\r\n e,\r\n this.range,\r\n !!this.selectionStore.get('edit'),\r\n {\r\n focus: this.selectionStore.get('focus'),\r\n range: this.selectionStore.get('range'),\r\n },\r\n );\r\n }\r\n // #endregion\r\n\r\n /**\r\n * Selection & Keyboard\r\n */\r\n @Watch('selectionStore') selectionServiceSet(\r\n selectionStore: Observable<SelectionStoreState>,\r\n ) {\r\n // clear subscriptions\r\n this.unsubscribeSelectionStore.forEach(v => v());\r\n this.unsubscribeSelectionStore.length = 0;\r\n this.unsubscribeSelectionStore.push(\r\n selectionStore.onChange('nextFocus', v => v && this.doFocus(v, v)),\r\n );\r\n\r\n this.keyboardService = new KeyboardService({\r\n selectionStore,\r\n range: r => !!r && this.triggerRangeEvent(r),\r\n focus: (f, changes, focusNextViewport) => {\r\n if (focusNextViewport) {\r\n this.beforeNextViewportFocus.emit(f);\r\n return false;\r\n } else {\r\n return this.doFocus(f, f, changes);\r\n }\r\n },\r\n change: val => {\r\n if (this.readonly) {\r\n return;\r\n }\r\n this.doEdit(val);\r\n },\r\n cancel: async () => {\r\n await this.revogrEdit?.cancelChanges();\r\n this.closeEdit();\r\n },\r\n clearCell: () => !this.readonly && this.clearCell(),\r\n internalPaste: () => !this.readonly && this.beforeRegionPaste.emit(),\r\n getData: () => this.getData(),\r\n selectAll: () => this.selectAll.emit(),\r\n rollback: () => this.rollback.emit(),\r\n });\r\n this.createAutoFillService();\r\n }\r\n /** Autofill */\r\n @Watch('dimensionRow')\r\n @Watch('dimensionCol')\r\n createAutoFillService() {\r\n this.autoFillService = new AutoFillService({\r\n dimensionRow: this.dimensionRow,\r\n dimensionCol: this.dimensionCol,\r\n columnService: this.columnService,\r\n dataStore: this.dataStore,\r\n\r\n clearRangeDataApply: e =>\r\n this.beforeRangeDataApply.emit({\r\n ...e,\r\n ...this.types,\r\n rowDimension: { ...this.dimensionRow.state },\r\n colDimension: { ...this.dimensionCol.state },\r\n }),\r\n setTempRange: e => {\r\n const tempRangeEvent = this.beforeSetTempRange.emit({\r\n tempRange: e,\r\n ...this.getData(),\r\n ...this.types,\r\n });\r\n if (tempRangeEvent.defaultPrevented) {\r\n return null;\r\n }\r\n return this.setTempRange.emit(tempRangeEvent.detail.tempRange);\r\n },\r\n selectionChanged: e => this.selectionChange.emit(e),\r\n\r\n rangeCopy: e => this.beforeRangeCopyApply.emit(e),\r\n rangeDataApply: e => this.rangeEditApply.emit(e),\r\n\r\n setRange: e => !!e && this.triggerRangeEvent(e),\r\n getData: () => this.getData(),\r\n });\r\n }\r\n\r\n /** Columns */\r\n @Watch('dataStore')\r\n @Watch('colData')\r\n columnServiceSet() {\r\n this.columnService?.destroy();\r\n this.columnService = new ColumnService(this.dataStore, this.colData);\r\n this.createAutoFillService();\r\n }\r\n\r\n connectedCallback() {\r\n this.columnServiceSet();\r\n this.selectionServiceSet(this.selectionStore);\r\n }\r\n\r\n disconnectedCallback() {\r\n // clear subscriptions\r\n this.unsubscribeSelectionStore.forEach(v => v());\r\n this.unsubscribeSelectionStore.length = 0;\r\n this.columnService?.destroy();\r\n }\r\n\r\n async componentWillRender() {\r\n const editCell = this.selectionStore.get('edit');\r\n if (!editCell) {\r\n await this.revogrEdit?.beforeDisconnect?.();\r\n }\r\n }\r\n\r\n private renderRange(range: RangeArea) {\r\n const cell = getCell(\r\n range,\r\n this.dimensionRow.state,\r\n this.dimensionCol.state,\r\n );\r\n const styles = styleByCellProps(cell);\r\n return [\r\n <div class={SELECTION_BORDER_CLASS} style={styles}>\r\n {this.isMobileDevice && (\r\n <div class=\"range-handlers\">\r\n <span class={MOBILE_CLASS}></span>\r\n <span class={MOBILE_CLASS}></span>\r\n </div>\r\n )}\r\n </div>,\r\n ];\r\n }\r\n\r\n private renderEditor() {\r\n // Check if edit access\r\n const editCell = this.selectionStore.get('edit');\r\n // Readonly or Editor closed\r\n if (this.readonly || !editCell) {\r\n return null;\r\n }\r\n const enteredOrModelValue =\r\n editCell.val ||\r\n getCellData(\r\n this.columnService.rowDataModel(editCell.y, editCell.x).value,\r\n );\r\n const editable = {\r\n ...editCell,\r\n ...this.columnService.getSaveData(\r\n editCell.y,\r\n editCell.x,\r\n enteredOrModelValue,\r\n ),\r\n };\r\n const renderEvent = this.beforeEditRender.emit({\r\n range: {\r\n ...editCell,\r\n x1: editCell.x,\r\n y1: editCell.y,\r\n },\r\n ...this.types,\r\n rowDimension: { ...this.dimensionRow.state },\r\n colDimension: { ...this.dimensionCol.state },\r\n });\r\n\r\n // Render prevented\r\n if (renderEvent.defaultPrevented) {\r\n return null;\r\n }\r\n\r\n const cell = getCell(\r\n renderEvent.detail.range,\r\n renderEvent.detail.rowDimension,\r\n renderEvent.detail.colDimension,\r\n );\r\n const styles = styleByCellProps(cell);\r\n return (\r\n <revogr-edit\r\n style={styles}\r\n ref={el => (this.revogrEdit = el)}\r\n additionalData={this.additionalData}\r\n editCell={editable}\r\n saveOnClose={this.applyChangesOnClose}\r\n onCelleditinit={e => {\r\n this.cellEditDone.emit(e.detail);\r\n }}\r\n column={this.columnService.rowDataModel(editCell.y, editCell.x)}\r\n editor={getCellEditor(\r\n this.columnService.columns[editCell.x],\r\n this.editors,\r\n )}\r\n />\r\n );\r\n }\r\n\r\n private onEditCell(e: CustomEvent<SaveDataDetails>) {\r\n if (e.defaultPrevented) {\r\n return;\r\n }\r\n const saveEv = this.beforeCellSave.emit(e.detail);\r\n if (!saveEv.defaultPrevented) {\r\n this.cellEdit(saveEv.detail);\r\n }\r\n\r\n // if not clear navigate to next cell after edit\r\n if (!saveEv.detail.preventFocus) {\r\n this.focusNext();\r\n }\r\n }\r\n\r\n render() {\r\n const nodes: VNode[] = [];\r\n const editCell = this.renderEditor();\r\n\r\n // Editor\r\n if (editCell) {\r\n nodes.push(editCell);\r\n } else {\r\n const range = this.selectionStore.get('range');\r\n const focus = this.selectionStore.get('focus');\r\n\r\n // Clipboard\r\n if ((range || focus) && this.useClipboard) {\r\n nodes.push(\r\n <revogr-clipboard\r\n readonly={this.readonly}\r\n onCopyregion={e => this.onCopy(e.detail)}\r\n onClearregion={() => !this.readonly && this.clearCell()}\r\n ref={e => (this.clipboard = e)}\r\n onPasteregion={e => this.onPaste(e.detail)}\r\n />,\r\n );\r\n }\r\n\r\n // Range\r\n if (range) {\r\n nodes.push(...this.renderRange(range));\r\n }\r\n // Autofill\r\n if (focus && !this.readonly && this.range) {\r\n nodes.push(\r\n this.autoFillService?.renderAutofill(\r\n range,\r\n focus,\r\n this.isMobileDevice,\r\n ),\r\n );\r\n }\r\n\r\n // Order\r\n if (this.canDrag) {\r\n nodes.push(\r\n <revogr-order-editor\r\n ref={e => (this.orderEditor = e)}\r\n dataStore={this.dataStore}\r\n dimensionRow={this.dimensionRow}\r\n dimensionCol={this.dimensionCol}\r\n parent={this.element}\r\n rowType={this.types.rowType}\r\n onRowdragstartinit={e => this.rowDragStart(e)}\r\n />,\r\n );\r\n }\r\n }\r\n return (\r\n <Host\r\n class={{ mobile: this.isMobileDevice }}\r\n onDblClick={(e: MouseEvent) => this.onElementDblClick(e)}\r\n onMouseDown={(e: MouseEvent) => this.onElementMouseDown(e)}\r\n onTouchStart={(e: TouchEvent) => this.onElementMouseDown(e, true)}\r\n onCloseedit={(e: CustomEvent<boolean | undefined>) => this.closeEdit(e)}\r\n // it's done to be able to throw events from different levels, not just from editor\r\n onCelledit={(e: CustomEvent<SaveDataDetails>) => this.onEditCell(e)}\r\n >\r\n {nodes}\r\n <slot name=\"data\" />\r\n </Host>\r\n );\r\n }\r\n\r\n /**\r\n * Executes the focus operation on the specified range of cells.\r\n */\r\n private doFocus(focus: Cell, end: Cell, changes?: Partial<Cell>) {\r\n // 1. Trigger beforeFocus event\r\n const { defaultPrevented } = this.beforeFocusCell.emit(\r\n this.columnService.getSaveData(focus.y, focus.x),\r\n );\r\n if (defaultPrevented) {\r\n return false;\r\n }\r\n const evData: FocusRenderEvent = {\r\n range: {\r\n ...focus,\r\n x1: end.x,\r\n y1: end.y,\r\n },\r\n next: changes,\r\n ...this.types,\r\n rowDimension: { ...this.dimensionRow.state },\r\n colDimension: { ...this.dimensionCol.state },\r\n };\r\n\r\n // 2. Trigger apply focus event\r\n const applyEvent = this.applyFocus.emit(evData);\r\n if (applyEvent.defaultPrevented) {\r\n return false;\r\n }\r\n const { range } = applyEvent.detail;\r\n\r\n // 3. Trigger focus event\r\n return !this.focusCell.emit({\r\n focus: {\r\n x: range.x,\r\n y: range.y,\r\n },\r\n end: {\r\n x: range.x1,\r\n y: range.y1,\r\n },\r\n ...applyEvent.detail,\r\n }).defaultPrevented;\r\n }\r\n\r\n private triggerRangeEvent(range: RangeArea) {\r\n const type = this.types.rowType;\r\n // 1. Apply range\r\n const applyEvent = this.beforeApplyRange.emit({\r\n range: { ...range },\r\n ...this.types,\r\n rowDimension: { ...this.dimensionRow.state },\r\n colDimension: { ...this.dimensionCol.state },\r\n });\r\n if (applyEvent.defaultPrevented) {\r\n return false;\r\n }\r\n const data = this.columnService.getRangeTransformedToProps(\r\n applyEvent.detail.range,\r\n this.dataStore,\r\n );\r\n // 2. Before set range\r\n let e = this.beforeSetRange.emit(data);\r\n if (e.defaultPrevented) {\r\n return false;\r\n }\r\n // 3. Set range\r\n e = this.setRange.emit({ ...applyEvent.detail.range, type });\r\n if (e.defaultPrevented) {\r\n return false;\r\n }\r\n return !e.defaultPrevented;\r\n }\r\n\r\n /**\r\n * Open Editor on DblClick\r\n */\r\n private onElementDblClick(e: MouseEvent) {\r\n // DblClick prevented outside - Editor will not open\r\n if (e.defaultPrevented) {\r\n return;\r\n }\r\n\r\n // Get data from the component\r\n const data = this.getData();\r\n const focusCell = getFocusCellBasedOnEvent(e, data);\r\n if (!focusCell) {\r\n return;\r\n }\r\n this.doEdit();\r\n }\r\n\r\n /**\r\n * Handle mouse down event on Host element\r\n */\r\n private onElementMouseDown(e: MouseEvent | TouchEvent, touch = false) {\r\n // Get the target element from the event object\r\n const targetElement = e.target as HTMLElement | undefined;\r\n // Ignore focus if clicked input\r\n if (isEditInput(targetElement) || e.defaultPrevented) {\r\n return;\r\n }\r\n\r\n // Get data from the component\r\n const data = this.getData();\r\n const focusCell = getFocusCellBasedOnEvent(e, data);\r\n if (!focusCell) {\r\n return;\r\n }\r\n\r\n // Check if right click on selected range - do nothing\r\n const isRightClick = checkIsRightClick(e as MouseEvent);\r\n const selectedRange = this.selectionStore.get('range');\r\n let isClickOnSelectedRange: boolean = false;\r\n\r\n if (isRightClick && selectedRange) {\r\n const { x, x1, y, y1 } = selectedRange;\r\n const evt = e.target as HTMLElement;\r\n\r\n if (\r\n (x !== x1 || y !== y1) &&\r\n evt.dataset['rgcol'] &&\r\n evt.dataset['rgrow']\r\n ) {\r\n const maxXCoord = Math.max(x, x1);\r\n const minXCoord = Math.min(x, x1);\r\n const maxYCoord = Math.max(y, y1);\r\n const minYCoord = Math.min(y, y1);\r\n\r\n isClickOnSelectedRange =\r\n +evt.dataset['rgcol'] >= minXCoord &&\r\n +evt.dataset['rgcol'] <= maxXCoord &&\r\n +evt.dataset['rgrow'] >= minYCoord &&\r\n +evt.dataset['rgrow'] <= maxYCoord;\r\n }\r\n }\r\n\r\n // Set focus on the current cell\r\n this.focus(focusCell, this.range && e.shiftKey, isClickOnSelectedRange);\r\n\r\n // Initiate autofill selection\r\n if (this.range && !isClickOnSelectedRange) {\r\n targetElement &&\r\n this.autoFillService?.selectionStart(targetElement, this.getData());\r\n\r\n // Prevent default behavior for mouse events,\r\n // but only if target element is not a mobile input\r\n if (!touch) {\r\n // e.preventDefault();\r\n } else if (\r\n verifyTouchTarget((e as TouchEvent).touches[0], MOBILE_CLASS)\r\n ) {\r\n // Prevent default behavior for touch events\r\n // if target element is a mobile input\r\n e.preventDefault();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Start cell editing\r\n */\r\n protected doEdit(val = '') {\r\n if (this.canEdit()) {\r\n const focus = this.selectionStore.get('focus');\r\n if (!focus) {\r\n return;\r\n }\r\n const data = this.columnService.getSaveData(focus.y, focus.x);\r\n this.setEdit?.emit({\r\n ...data,\r\n val,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Close editor event triggered\r\n * @param details - if it requires focus next\r\n */\r\n private async closeEdit(e?: CustomEvent<boolean | undefined>) {\r\n this.cancelEdit.emit();\r\n if (e?.detail) {\r\n await this.focusNext();\r\n }\r\n }\r\n\r\n /**\r\n * Edit finished.\r\n * Close Editor and save.\r\n */\r\n protected cellEdit(e: SaveDataDetails) {\r\n const dataToSave = this.columnService.getSaveData(e.rgRow, e.rgCol, e.val);\r\n this.cellEditApply.emit(dataToSave);\r\n }\r\n\r\n private getRegion() {\r\n const focus = this.selectionStore.get('focus');\r\n let range = this.selectionStore.get('range');\r\n if (!range) {\r\n range = getRange(focus, focus);\r\n }\r\n return range;\r\n }\r\n private onCopy(e: DataTransfer) {\r\n const range = this.getRegion();\r\n const canCopyEvent = this.beforeCopyRegion.emit(range);\r\n if (canCopyEvent.defaultPrevented) {\r\n return false;\r\n }\r\n let rangeData: DataFormat[][] | undefined;\r\n\r\n if (range) {\r\n const { data, mapping } = this.columnService.copyRangeArray(\r\n range,\r\n this.dataStore,\r\n );\r\n const event = this.rangeClipboardCopy.emit({\r\n range,\r\n data,\r\n mapping,\r\n ...this.types,\r\n });\r\n if (!event.defaultPrevented) {\r\n rangeData = event.detail.data;\r\n }\r\n }\r\n\r\n this.clipboard?.doCopy(e, rangeData);\r\n return true;\r\n }\r\n\r\n private onPaste(data: string[][]) {\r\n const focus = this.selectionStore.get('focus');\r\n const isEditing = this.selectionStore.get('edit') !== null;\r\n if (!focus || isEditing) {\r\n return;\r\n }\r\n let { changed, range } = this.columnService.getTransformedDataToApply(\r\n focus,\r\n data,\r\n );\r\n const { defaultPrevented: canPaste } = this.rangeClipboardPaste.emit({\r\n data: changed,\r\n models: collectModelsOfRange(changed, this.dataStore),\r\n range,\r\n ...this.types,\r\n });\r\n\r\n if (canPaste) {\r\n return;\r\n }\r\n this.autoFillService?.onRangeApply(changed, range, range, true);\r\n }\r\n\r\n private async focusNext() {\r\n const canFocus = await this.keyboardService?.keyChangeSelection(\r\n new KeyboardEvent('keydown', {\r\n code: codesLetter.ARROW_DOWN,\r\n }),\r\n this.range,\r\n );\r\n if (!canFocus) {\r\n this.closeEdit();\r\n }\r\n }\r\n\r\n protected clearCell() {\r\n const range = this.selectionStore.get('range');\r\n if (range && !isRangeSingleCell(range)) {\r\n const data = this.columnService.getRangeStaticData(range, '');\r\n this.autoFillService?.onRangeApply(data, range, range, false, true);\r\n } else if (this.canEdit()) {\r\n const focused = this.selectionStore.get('focus');\r\n if (!focused) {\r\n return;\r\n }\r\n const cell = this.columnService.getSaveData(focused.y, focused.x);\r\n this.cellEdit({\r\n rgRow: focused.y,\r\n rgCol: focused.x,\r\n val: '',\r\n type: cell.type,\r\n prop: cell.prop,\r\n });\r\n }\r\n }\r\n\r\n private rowDragStart({ detail }: CustomEvent<{ cell: Cell; text: string }>) {\r\n detail.text = getCellData(\r\n this.columnService.rowDataModel(detail.cell.y, detail.cell.x).value,\r\n );\r\n }\r\n\r\n /**\r\n * Verify if edit allowed.\r\n */\r\n protected canEdit() {\r\n if (this.readonly) {\r\n return false;\r\n }\r\n const focus = this.selectionStore.get('focus');\r\n return focus && !this.columnService?.isReadOnly(focus.y, focus.x);\r\n }\r\n\r\n get edited(): EditCellStore | null {\r\n return this.selectionStore.get('edit');\r\n }\r\n\r\n /**\r\n * Sets the focus on a cell and optionally edits a range.\r\n */\r\n focus(cell?: Cell, isRangeEdit = false, isPrevent = false) {\r\n if (!cell || isPrevent) return false;\r\n\r\n const end = cell;\r\n const start = this.selectionStore.get('focus');\r\n\r\n if (isRangeEdit && start) {\r\n const range = getRange(start, end);\r\n if (range) {\r\n return this.triggerRangeEvent(range);\r\n }\r\n }\r\n\r\n return this.doFocus(cell, end);\r\n }\r\n\r\n get types(): AllDimensionType {\r\n return {\r\n rowType: this.dataStore.get('type'),\r\n colType: this.columnService.type,\r\n };\r\n }\r\n\r\n /**\r\n * Collect data\r\n */\r\n protected getData(): EventData {\r\n return {\r\n el: this.element,\r\n rows: this.dimensionRow.state,\r\n cols: this.dimensionCol.state,\r\n lastCell: this.lastCell,\r\n focus: this.selectionStore.get('focus'),\r\n range: this.selectionStore.get('range'),\r\n edit: this.selectionStore.get('edit'),\r\n };\r\n }\r\n}\r\n","import type { VNode } from '@stencil/core';\r\nimport type { HyperFunc } from '@type';\r\n\r\ntype HeaderRender = {\r\n (start: number): (h: HyperFunc<VNode>, e: { rowIndex: number }) => number;\r\n};\r\nexport const RowHeaderRender: HeaderRender = s => (__, { rowIndex: i }) => s + i;\r\n","import { h, Host, Component, Prop, Event, EventEmitter } from '@stencil/core';\r\nimport type { JSXBase } from '@stencil/core/internal';\r\n\r\nimport { ViewportStore, DataStore } from '@store';\r\nimport type {\r\n RowHeaders,\r\n ViewPortScrollEvent,\r\n DataType,\r\n ColumnRegular,\r\n ViewportData,\r\n ElementScroll,\r\n DimensionRows,\r\n DimensionCols,\r\n} from '@type';\r\n\r\nimport { ROW_HEADER_TYPE } from '../../utils/consts';\r\nimport { RowHeaderRender } from './row-header-render';\r\nimport { calculateRowHeaderSize } from '../../utils/row-header-utils';\r\nimport { HEADER_SLOT } from '../revoGrid/viewport.helpers';\r\nimport { type JSX } from '../../components';\r\n\r\n/**\r\n * Row headers component\r\n * Visible on the left side of the table\r\n */\r\n\r\n@Component({ tag: 'revogr-row-headers' })\r\nexport class RevogrRowHeaders {\r\n // #region Properties\r\n /**\r\n * Header height to setup row headers\r\n */\r\n @Prop() height: number;\r\n\r\n /**\r\n * Viewport data\r\n */\r\n @Prop() dataPorts: ViewportData[];\r\n /**\r\n * Header props\r\n */\r\n @Prop() headerProp: Record<string, any>;\r\n\r\n /**\r\n * Row class\r\n */\r\n @Prop() rowClass: string;\r\n\r\n /**\r\n * Enable resize\r\n */\r\n @Prop() resize: boolean;\r\n /**\r\n * Row header column\r\n */\r\n @Prop() rowHeaderColumn: RowHeaders;\r\n /**\r\n * Additional data to pass to renderer\r\n */\r\n @Prop() additionalData: any;\r\n /**\r\n * Prevent rendering until job is done.\r\n * Can be used for initial rendering performance improvement.\r\n * When several plugins require initial rendering this will prevent double initial rendering.\r\n */\r\n @Prop() jobsBeforeRender: Promise<any>[] = [];\r\n // #endregion\r\n\r\n /**\r\n * Scroll viewport\r\n */\r\n @Event({ eventName: 'scrollview', bubbles: false })\r\n scrollViewport: EventEmitter<ViewPortScrollEvent>;\r\n /**\r\n * Register element to scroll\r\n */\r\n @Event({ eventName: 'ref', bubbles: false })\r\n elementToScroll: EventEmitter<ElementScroll>;\r\n\r\n render() {\r\n const dataViews: HTMLElement[] = [];\r\n const viewport = new ViewportStore('colPinStart');\r\n\r\n /** render viewports rows */\r\n let totalLength = 1 + (this.rowHeaderColumn?.offset || 0);\r\n // todo: this part could be optimized to avoid to often re-render dataPorts can be cached\r\n for (let data of this.dataPorts) {\r\n const itemCount = data.dataStore.get('items').length;\r\n\r\n // initiate row data\r\n const dataStore = new DataStore<DataType, DimensionRows>(data.type, {\r\n ...data.dataStore.state,\r\n });\r\n\r\n // initiate column data\r\n const colData = new DataStore<ColumnRegular, DimensionCols>(\r\n 'colPinStart',\r\n );\r\n const column: ColumnRegular = {\r\n cellTemplate: RowHeaderRender(totalLength),\r\n ...this.rowHeaderColumn,\r\n };\r\n colData.updateData([column]);\r\n dataViews.push(\r\n <revogr-data\r\n {...data}\r\n colType=\"rowHeaders\"\r\n jobsBeforeRender={this.jobsBeforeRender}\r\n rowClass={this.rowClass}\r\n dataStore={dataStore.store}\r\n colData={colData.store}\r\n viewportCol={viewport.store}\r\n readonly={true}\r\n range={false}\r\n />,\r\n );\r\n totalLength += itemCount;\r\n }\r\n\r\n const colSize = calculateRowHeaderSize(totalLength, this.rowHeaderColumn);\r\n viewport.setViewport({\r\n realCount: 1,\r\n virtualSize: 0,\r\n items: [\r\n {\r\n size: colSize,\r\n start: 0,\r\n end: colSize,\r\n itemIndex: 0,\r\n },\r\n ],\r\n });\r\n\r\n const viewportScroll: JSX.RevogrViewportScroll &\r\n JSXBase.HTMLAttributes<HTMLRevogrViewportScrollElement> = {\r\n contentHeight: this.height,\r\n contentWidth: 0,\r\n style: { minWidth: `${colSize}px` },\r\n colType: 'rowHeaders',\r\n ref: el => this.elementToScroll.emit(el),\r\n onScrollviewport: (e: CustomEvent) => this.scrollViewport.emit(e.detail),\r\n };\r\n const viewportHeader: JSX.RevogrHeader & { slot: string } = {\r\n ...this.headerProp,\r\n // groups not present on row headers\r\n groups: [],\r\n colData:\r\n typeof this.rowHeaderColumn === 'object' ? [this.rowHeaderColumn] : [],\r\n viewportCol: viewport.store,\r\n canResize: false,\r\n type: ROW_HEADER_TYPE,\r\n // parent,\r\n slot: HEADER_SLOT,\r\n };\r\n return (\r\n <Host class={{ [ROW_HEADER_TYPE]: true }} key={ROW_HEADER_TYPE}>\r\n <revogr-viewport-scroll {...viewportScroll} row-header={true}>\r\n <revogr-header {...viewportHeader} />\r\n {dataViews}\r\n </revogr-viewport-scroll>\r\n </Host>\r\n );\r\n }\r\n}\r\n","\r\n\r\n/**\r\n * Autohide scroll for MacOS when scroll is visible only for 1 sec\r\n */\r\nexport class AutohideScrollPlugin {\r\n private autohideScrollTimeout = 0;\r\n constructor(private element: HTMLElement) {\r\n }\r\n\r\n /**\r\n * When scroll size updates set it up for autohide\r\n */\r\n setScrollSize(s: number) {\r\n if (!s) {\r\n this.element.setAttribute('autohide', 'true');\r\n } else {\r\n this.element.removeAttribute('autohide');\r\n }\r\n }\r\n\r\n /**\r\n * On each scroll check if it's time to show\r\n */\r\n checkScroll({\r\n scrollSize,\r\n contentSize,\r\n virtualSize,\r\n }: {\r\n scrollSize: number;\r\n contentSize: number;\r\n virtualSize: number;\r\n }) {\r\n const hasScroll = contentSize > virtualSize;\r\n const isHidden = !scrollSize && hasScroll;\r\n if (isHidden) {\r\n this.element.setAttribute('visible', 'true');\r\n this.autohideScrollTimeout = this.show(\r\n this.element,\r\n this.autohideScrollTimeout,\r\n );\r\n }\r\n }\r\n\r\n private show(element?: HTMLElement, timeout?: number): number {\r\n clearTimeout(timeout);\r\n return Number(\r\n setTimeout(() => {\r\n element?.removeAttribute('visible');\r\n }, 1000),\r\n );\r\n }\r\n clear() {\r\n clearTimeout(this.autohideScrollTimeout);\r\n }\r\n}\r\n","revogr-scroll-virtual {\r\n $min-size: 20px;\r\n\r\n // show scroll only for 1 sec\r\n &[autohide] {\r\n position: absolute;\r\n z-index: 100 !important;\r\n\r\n &.vertical {\r\n top: 0;\r\n right: 0;\r\n\r\n &[visible] {\r\n min-width: $min-size !important;\r\n }\r\n }\r\n\r\n &.horizontal {\r\n bottom: 0;\r\n left: 0;\r\n\r\n &[visible] {\r\n min-height: $min-size !important;\r\n }\r\n }\r\n }\r\n\r\n &.vertical {\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n height: 100%;\r\n\r\n > div {\r\n width: 1px;\r\n }\r\n }\r\n\r\n &.horizontal {\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n width: 100%;\r\n\r\n > div {\r\n height: 1px;\r\n }\r\n }\r\n}\r\n","import {\r\n Component,\r\n Element as StencilElement,\r\n Event,\r\n EventEmitter,\r\n h,\r\n Host,\r\n Method,\r\n Prop,\r\n} from '@stencil/core';\r\nimport LocalScrollService, {\r\n getContentSize,\r\n} from '../../services/local.scroll.service';\r\nimport type {\r\n DimensionType,\r\n ViewPortScrollEvent,\r\n} from '@type';\r\nimport { AutohideScrollPlugin } from './autohide-scroll.plugin';\r\nimport { LocalScrollTimer } from '../../services/local.scroll.timer';\r\nimport { getScrollbarSize } from '../../utils';\r\n\r\n/**\r\n * Virtual scroll component\r\n */\r\n@Component({\r\n tag: 'revogr-scroll-virtual',\r\n styleUrl: 'revogr-scroll-style.scss',\r\n})\r\nexport class RevogrScrollVirtual {\r\n /**\r\n * Scroll dimension (`X` - `rgCol` or `Y` - `rgRow`)\r\n */\r\n @Prop() dimension: DimensionType = 'rgRow';\r\n\r\n /**\r\n * Dimensions\r\n */\r\n @Prop() realSize!: number;\r\n\r\n /**\r\n * Virtual size\r\n */\r\n @Prop() virtualSize!: number;\r\n\r\n /**\r\n * Client size\r\n */\r\n @Prop() clientSize!: number;\r\n\r\n /**\r\n * Scroll event\r\n */\r\n @Event({ eventName: 'scrollvirtual' })\r\n scrollVirtual: EventEmitter<ViewPortScrollEvent>;\r\n\r\n @StencilElement() element: HTMLElement;\r\n private autohideScrollPlugin: AutohideScrollPlugin;\r\n private scrollSize = 0;\r\n private localScrollService: LocalScrollService;\r\n private localScrollTimer: LocalScrollTimer;\r\n\r\n @Method()\r\n async setScroll(e: ViewPortScrollEvent): Promise<void> {\r\n if (this.dimension !== e.dimension) {\r\n return;\r\n }\r\n this.localScrollTimer.latestScrollUpdate(e.dimension);\r\n this.localScrollService?.setScroll(e);\r\n if (e.coordinate) {\r\n this.autohideScrollPlugin.checkScroll({\r\n scrollSize: this.scrollSize,\r\n contentSize: this.realSize,\r\n virtualSize: this.virtualSize,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Update if `delta` exists in case we don't know current position or if it's external change\r\n */\r\n @Method()\r\n async changeScroll(e: ViewPortScrollEvent): Promise<ViewPortScrollEvent> {\r\n if (e.delta) {\r\n switch (e.dimension) {\r\n case 'rgCol':\r\n e.coordinate = this.element.scrollLeft + e.delta;\r\n break;\r\n case 'rgRow':\r\n e.coordinate = this.element.scrollTop + e.delta;\r\n break;\r\n }\r\n this.setScroll(e);\r\n }\r\n return e;\r\n }\r\n\r\n connectedCallback() {\r\n this.autohideScrollPlugin = new AutohideScrollPlugin(this.element);\r\n this.localScrollTimer = new LocalScrollTimer(\r\n 'ontouchstart' in document.documentElement ? 0 : 10,\r\n );\r\n this.localScrollService = new LocalScrollService({\r\n runScroll: e => this.scrollVirtual.emit(e),\r\n applyScroll: e => {\r\n this.localScrollTimer.setCoordinate(e);\r\n const type = e.dimension === 'rgRow' ? 'scrollTop' : 'scrollLeft';\r\n // this will trigger on scroll event\r\n this.element[type] = e.coordinate;\r\n },\r\n });\r\n }\r\n\r\n disconnectedCallback() {\r\n this.autohideScrollPlugin.clear();\r\n }\r\n\r\n componentWillLoad() {\r\n this.scrollSize = getScrollbarSize(document);\r\n }\r\n\r\n componentDidRender() {\r\n let scrollSize = 0;\r\n if (this.dimension === 'rgRow') {\r\n scrollSize = this.element.scrollHeight > this.element.clientHeight ? this.scrollSize : 0;\r\n this.element.style.minWidth = `${scrollSize}px`;\r\n } else {\r\n scrollSize = this.element.scrollWidth > this.element.clientWidth ? this.scrollSize : 0;\r\n this.element.style.minHeight = `${scrollSize}px`;\r\n }\r\n this.autohideScrollPlugin.setScrollSize(scrollSize);\r\n this.localScrollService.setParams(\r\n {\r\n contentSize: this.realSize,\r\n clientSize: this.dimension === 'rgRow' ? this.element.clientHeight : this.element.clientWidth,\r\n virtualSize: this.clientSize,\r\n },\r\n this.dimension,\r\n );\r\n }\r\n\r\n onScroll(e: MouseEvent) {\r\n if (!(e.target instanceof Element)) {\r\n return;\r\n }\r\n const target = e.target;\r\n let type: 'scrollLeft' | 'scrollTop' = 'scrollLeft';\r\n if (this.dimension === 'rgRow') {\r\n type = 'scrollTop';\r\n }\r\n\r\n const setScroll = () => {\r\n this.localScrollService?.scroll(target[type] || 0, this.dimension);\r\n };\r\n // apply after throttling\r\n if (this.localScrollTimer.isReady(this.dimension, target[type])) {\r\n setScroll();\r\n } else {\r\n this.localScrollTimer.throttleLastScrollUpdate(this.dimension, target[type] || 0, () => setScroll());\r\n }\r\n }\r\n\r\n render() {\r\n const size = getContentSize(\r\n this.realSize,\r\n this.dimension === 'rgRow' ? this.element.clientHeight : this.element.clientWidth,\r\n this.clientSize, // content viewport size\r\n );\r\n return (\r\n <Host onScroll={(e: MouseEvent) => this.onScroll(e)}>\r\n <div\r\n style={{\r\n [this.dimension === 'rgRow' ? 'height' : 'width']: `${size}px`,\r\n }}\r\n />\r\n </Host>\r\n );\r\n }\r\n}\r\n",".temp-bg-range {\r\n display: block !important;\r\n position: absolute;\r\n pointer-events: none;\r\n z-index: 9;\r\n border: 1px solid rgb(255, 94, 0);\r\n box-sizing: border-box;\r\n\r\n &.Selection {\r\n border: 1px dashed gray;\r\n }\r\n\r\n > div {\r\n width: 1px;\r\n height: 1px;\r\n position: absolute;\r\n\r\n &.top {\r\n top: -1px;\r\n }\r\n\r\n &.bottom {\r\n bottom: -1px;\r\n }\r\n\r\n &.left {\r\n left: -1px;\r\n }\r\n\r\n &.right {\r\n right: -1px;\r\n }\r\n }\r\n}\r\n","import { Component, Prop, h, Host } from '@stencil/core';\r\nimport throttle from 'lodash/throttle';\r\nimport { TMP_SELECTION_BG_CLASS } from '../../utils/consts';\r\nimport { getCell, styleByCellProps } from '../overlay/selection.utils';\r\nimport { DimensionSettingsState, SelectionStoreState, RangeArea } from '@type';\r\nimport type { Observable } from '../../utils';\r\n\r\n/**\r\n * Temporary range selection component. Shows temporary range selection.\r\n */\r\n@Component({\r\n tag: 'revogr-temp-range',\r\n styleUrl: 'revogr-temp-range-style.scss',\r\n})\r\nexport class RevogrFocus {\r\n /**\r\n * Dynamic stores\r\n */\r\n\r\n /**\r\n * Selection store, shows current selection and focus\r\n */\r\n @Prop() selectionStore: Observable<SelectionStoreState>;\r\n\r\n /**\r\n * Dimension row store\r\n */\r\n @Prop() dimensionRow: Observable<DimensionSettingsState>;\r\n /**\r\n * Dimension column store\r\n */\r\n @Prop() dimensionCol: Observable<DimensionSettingsState>;\r\n\r\n el?: HTMLElement;\r\n private readonly onChange = throttle((e: HTMLElement) => this.doChange(e), 300);\r\n\r\n private doChange(e: HTMLElement) {\r\n e?.scrollIntoView({\r\n block: 'nearest',\r\n inline: 'nearest',\r\n });\r\n }\r\n\r\n componentDidRender() {\r\n if (this.el) {\r\n this.onChange(this.el);\r\n }\r\n }\r\n\r\n render() {\r\n const data = this.selectionStore.get('tempRange');\r\n const type = this.selectionStore.get('tempRangeType');\r\n if (!data) {\r\n return;\r\n }\r\n let directionY = 'bottom';\r\n let derectionX = 'right';\r\n const range = this.getRange();\r\n if (!range) {\r\n return;\r\n }\r\n if (data.y < range.y) {\r\n directionY = 'top';\r\n }\r\n if (data.x < range.x) {\r\n derectionX = 'left';\r\n }\r\n const directionClass = `${derectionX} ${directionY}`;\r\n const cell = getCell(data,\r\n this.dimensionRow.state,\r\n this.dimensionCol.state\r\n );\r\n const styles = styleByCellProps(cell);\r\n const props = {\r\n class: {\r\n [TMP_SELECTION_BG_CLASS]: true,\r\n [type || '']: true,\r\n },\r\n style: styles,\r\n hidden: false\r\n };\r\n return (\r\n <Host {...props}>\r\n <div class={directionClass} ref={(e) => (this.el = e)} />\r\n </Host>\r\n );\r\n }\r\n\r\n private getRange(): RangeArea | null {\r\n const range = this.selectionStore.get('range');\r\n if (range) {\r\n return range;\r\n }\r\n const focus = this.selectionStore.get('focus');\r\n if (!focus) {\r\n return null;\r\n }\r\n return {\r\n ...focus,\r\n x1: focus.x,\r\n y1: focus.y,\r\n };\r\n }\r\n}\r\n"],"names":["h","Host","getSourceItem","getPropertyFromEvent","getItemByPosition","getItemByIndex","RevogrFocus","FOCUS_CLASS","codesLetter","isClear","isTab","isEnterKeyValue","isCopy","isCut","isPaste","isBack","isAll","timeout","RESIZE_INTERVAL","getRange","CELL_HANDLER_CLASS","MOBILE_CLASS","debounce","DIRECTION_LOCK_DISTANCE","ColumnService","SELECTION_BORDER_CLASS","getCellData","getCellEditor","isEditInput","checkIsRightClick","verifyTouchTarget","isRangeSingleCell","ViewportStore","DataStore","calculateRowHeaderSize","ROW_HEADER_TYPE","HEADER_SLOT","LocalScrollTimer","LocalScrollService","getScrollbarSize","getContentSize","throttle","TMP_SELECTION_BG_CLASS"],"mappings":"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"}
1
+ {"version":3,"file":"revogr-attribution.revogr-extra.revogr-focus.revogr-overlay-selection.revogr-row-headers.revogr-scroll-virtual.revogr-temp-range.entry.cjs.js","sources":["src/components/attribution/revogr-attribution.tsx","src/components/extra/revogr-extra.tsx","src/components/overlay/selection.utils.ts","src/components/selectionFocus/revogr-focus-style.scss?tag=revogr-focus","src/components/selectionFocus/revogr-focus.tsx","src/components/overlay/keyboard.service.ts","src/components/overlay/autofill.service.tsx","src/components/overlay/revogr-overlay-style.scss?tag=revogr-overlay-selection","src/components/overlay/revogr-overlay-selection.tsx","src/components/rowHeaders/row-header-render.tsx","src/components/rowHeaders/revogr-row-headers.tsx","src/components/scrollable/autohide-scroll.plugin.ts","src/components/scrollable/revogr-scroll-style.scss?tag=revogr-scroll-virtual","src/components/scrollable/revogr-scroll-virtual.tsx","src/components/selectionTempRange/revogr-temp-range-style.scss?tag=revogr-temp-range","src/components/selectionTempRange/revogr-temp-range.tsx"],"sourcesContent":["import { Component, Host, h } from '@stencil/core';\r\n/**\r\n * If you’re thinking about removing the attribution, we’d like to share a few thoughts first:\r\n * If you’re using RevoGrid in your organization and it’s helping you make money, we depend on your support to keep improving and maintaining RevoGrid under an MIT License.\r\n * Before you remove the attribution, please consider how you can support RevoGrid to help keep it running smoothly.\r\n * Using RevoGrid for a personal project? Awesome! Feel free to remove the attribution. We appreciate your support.\r\n */\r\n/**\r\n * @internal\r\n */\r\n@Component({\r\n tag: 'revogr-attribution',\r\n})\r\nexport class Attribution {\r\n render() {\r\n return (\r\n <Host>\r\n <a\r\n href=\"https://rv-grid.com/guide/attribution\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n title=\"Made with ❤️ by Revolist OU Team\"\r\n class=\"value\"\r\n >\r\n RevoGrid\r\n </a>\r\n </Host>\r\n );\r\n }\r\n}\r\n","import { h, Component, Method, Prop, State, VNode } from '@stencil/core';\r\nimport type { ExtraNodeFuncConfig } from '@type';\r\n\r\n/**\r\n * Contains extra elements for stencil components.\r\n * Performs rendering and updates for external components.\r\n * \r\n * @example\r\n * In Plugins if you want to add extra elements to grid and use stenciljs vnodes reactivity:\r\n * function paginationPanel(this: PaginationPlugin, config: { refresh: () => void }) {\r\n * // use `config.refresh()` for component to re-render\r\n * return h('div')\r\n * }\r\n * \r\n * revogrid.registerVNode = [\r\n * ...existingNodes,\r\n * paginationPanel.bind(this)\r\n * ];\r\n\r\n\r\n/**\r\n * @internal\r\n */\r\n@Component({\r\n tag: 'revogr-extra',\r\n})\r\nexport class RevoGridExtra {\r\n /**\r\n * Nodes to render\r\n */\r\n @Prop() nodes: (\r\n | VNode\r\n | ((c: ExtraNodeFuncConfig) => VNode)\r\n )[] = [];\r\n /**\r\n * Force component to re-render\r\n */\r\n @State() update = 1;\r\n\r\n /**\r\n * Refreshes the extra component. Useful if you want to manually\r\n * force the component to re-render.\r\n */\r\n @Method() async refresh() {\r\n this.update *= -1;\r\n }\r\n\r\n render() {\r\n return this.nodes?.map(node => {\r\n // Check if node is a function or a stencil component\r\n // If function wrap it in a stencil component with the refresh function\r\n if (typeof node === 'function') {\r\n const config: Partial<ExtraNodeFuncConfig> = {};\r\n const getNodes = () => [node({ refresh: () => config.refresh?.() })];\r\n\r\n return (\r\n <revogr-extra\r\n nodes={getNodes()}\r\n ref={(el?: HTMLRevogrExtraElement) => {\r\n if (el) {\r\n // Update exclusively for current node\r\n config.refresh = () => {\r\n el.nodes = getNodes();\r\n };\r\n }\r\n }}\r\n />\r\n );\r\n }\r\n return node;\r\n });\r\n }\r\n}\r\n","import {\r\n DimensionIndexInput,\r\n DSourceState,\r\n getItemByIndex,\r\n getItemByPosition,\r\n getSourceItem,\r\n} from '@store';\r\nimport type {\r\n DimensionSettingsState,\r\n Cell,\r\n RangeArea,\r\n RangeAreaCss,\r\n DataLookup,\r\n DimensionRows,\r\n DataType,\r\n EditCellStore,\r\n} from '@type';\r\nimport { getPropertyFromEvent } from '../../utils/events';\r\nimport { Observable } from '../../utils';\r\n\r\nexport type EventData = {\r\n el: HTMLElement;\r\n rows: DimensionSettingsState;\r\n cols: DimensionSettingsState;\r\n lastCell: Cell;\r\n focus: Cell | null;\r\n range: RangeArea | null;\r\n edit: EditCellStore | null;\r\n};\r\n\r\nexport function collectModelsOfRange(\r\n data: DataLookup,\r\n store: Observable<DSourceState<DataType, DimensionRows>>,\r\n) {\r\n const models: Partial<DataLookup> = {};\r\n for (let i in data) {\r\n const rowIndex = parseInt(i, 10);\r\n models[rowIndex] = getSourceItem(store, rowIndex);\r\n }\r\n\r\n return models;\r\n}\r\n\r\nexport function getFocusCellBasedOnEvent(\r\n e: MouseEvent | TouchEvent,\r\n data: EventData,\r\n): Cell | null {\r\n // If event default is prevented, return\r\n if (e.defaultPrevented) {\r\n return null;\r\n }\r\n\r\n // Get coordinates from event object\r\n const x = getPropertyFromEvent(e, 'clientX');\r\n const y = getPropertyFromEvent(e, 'clientY');\r\n\r\n // If coordinates are not available, return\r\n if (x === null || y === null) {\r\n return null;\r\n }\r\n\r\n // Get current cell based on coordinates and data\r\n const focusCell = getCurrentCell({ x, y }, data);\r\n // If current cell is not available, return\r\n if (isAfterLast(focusCell, data.lastCell)) {\r\n return null;\r\n }\r\n\r\n return focusCell;\r\n}\r\n\r\n/**\r\n * Calculate cell based on x, y position\r\n */\r\nexport function getCurrentCell(\r\n { x, y }: Cell,\r\n { el, rows, cols }: Pick<EventData, 'el' | 'rows' | 'cols'>,\r\n): Cell {\r\n // Get the bounding rectangle of the element\r\n const { top, left, height, width } = el.getBoundingClientRect();\r\n\r\n // Calculate the cell position relative to the element\r\n let cellY = y - top;\r\n let cellX = x - left;\r\n\r\n // Limit the cell position to the element height\r\n if (cellY >= height) {\r\n cellY = height - 1;\r\n }\r\n\r\n // Limit the cell position to the element width\r\n if (cellX >= width) {\r\n cellX = width - 1;\r\n }\r\n\r\n // Get the row and column items based on the cell position\r\n const rgRow = getItemByPosition(rows, cellY);\r\n const rgCol = getItemByPosition(cols, cellX);\r\n\r\n // Set the row and column index to 0 if they are before the first item\r\n if (rgCol.itemIndex < 0) {\r\n rgCol.itemIndex = 0;\r\n }\r\n\r\n if (rgRow.itemIndex < 0) {\r\n rgRow.itemIndex = 0;\r\n }\r\n\r\n return { x: rgCol.itemIndex, y: rgRow.itemIndex };\r\n}\r\n\r\nexport function getCoordinate(\r\n range: RangeArea,\r\n focus: Cell,\r\n changes: Partial<Cell>,\r\n isMulti = false,\r\n) {\r\n const updateCoordinate = (c: keyof Cell, pos = 0) => {\r\n const start = { x: range.x, y: range.y };\r\n const end = isMulti ? { x: range.x1, y: range.y1 } : start;\r\n const point = end[c] > focus[c] ? end : start;\r\n point[c] += pos;\r\n return { start, end };\r\n };\r\n\r\n if (changes.x) {\r\n return updateCoordinate('x', changes['x']);\r\n }\r\n if (changes.y) {\r\n return updateCoordinate('y', changes['y']);\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Check if the x coordinate of the cell position is after or equal to the x coordinate of the last cell position\r\n * or if the y coordinate of the cell position is after or equal to the y coordinate of the last cell position\r\n */\r\nexport function isAfterLast({ x, y }: Cell, lastCell: Cell) {\r\n return x >= lastCell.x || y >= lastCell.y;\r\n}\r\n\r\n/** check if out of range */\r\nexport function isBeforeFirst({ x, y }: Cell) {\r\n return x < 0 || y < 0;\r\n}\r\n\r\n/** Compare cells, only 1 coordinate difference is possible */\r\n// export function getDirectionCoordinate(initial: Cell, last: Cell): Partial<Cell> | null {\r\n// const c: (keyof Cell)[] = ['x', 'y'];\r\n// for (let k of c) {\r\n// if (initial[k] !== last[k]) {\r\n// return { [k]: 1 };\r\n// }\r\n// }\r\n// return null;\r\n// }\r\n\r\n// export function getLargestAxis(initial: Cell, last: Cell): Partial<Cell> | null {\r\n// const cell: Partial<Cell> = {};\r\n// const c: (keyof Cell)[] = ['x', 'y'];\r\n// for (let k of c) {\r\n// cell[k] = Math.abs(initial[k] - last[k]);\r\n// }\r\n// if (cell.x > cell.y) {\r\n// return { x: 1 };\r\n// }\r\n// if (cell.y > cell.x) {\r\n// return { y: 1 };\r\n// }\r\n// return null;\r\n// }\r\n\r\nexport function styleByCellProps(styles: { [key: string]: number }): RangeAreaCss {\r\n return {\r\n left: `${styles.left}px`,\r\n top: `${styles.top}px`,\r\n width: `${styles.width}px`,\r\n height: `${styles.height}px`,\r\n };\r\n}\r\n\r\nexport function getCell(\r\n { x, y, x1, y1 }: RangeArea,\r\n dimensionRow: Pick<\r\n DimensionIndexInput,\r\n 'indexToItem' | 'indexes' | 'originItemSize'\r\n >,\r\n dimensionCol: Pick<\r\n DimensionIndexInput,\r\n 'indexToItem' | 'indexes' | 'originItemSize'\r\n >,\r\n) {\r\n const top = getItemByIndex(dimensionRow, y).start;\r\n const left = getItemByIndex(dimensionCol, x).start;\r\n const bottom = getItemByIndex(dimensionRow, y1).end;\r\n const right = getItemByIndex(dimensionCol, x1).end;\r\n\r\n return {\r\n left,\r\n right,\r\n top,\r\n bottom,\r\n width: right - left,\r\n height: bottom - top,\r\n };\r\n}\r\n","@use '../../global/_mixins.scss' as *;\r\n\r\nrevogr-focus.focused-cell {\r\n @include selection(1px);\r\n\r\n position: absolute;\r\n pointer-events: none;\r\n z-index: 9;\r\n display: block !important;\r\n}\r\n","import {\r\n Component,\r\n Prop,\r\n h,\r\n Host,\r\n Event,\r\n Element,\r\n EventEmitter,\r\n} from '@stencil/core';\r\nimport { FOCUS_CLASS } from '../../utils/consts';\r\nimport { getCell, styleByCellProps } from '../overlay/selection.utils';\r\nimport { DSourceState, getSourceItem } from '@store';\r\nimport type {\r\n Cell,\r\n SelectionStoreState,\r\n ColumnRegular,\r\n DataType,\r\n DimensionSettingsState,\r\n FocusRenderEvent,\r\n FocusTemplateFunc,\r\n DimensionCols,\r\n DimensionRows,\r\n FocusAfterRenderEvent,\r\n} from '@type';\r\nimport type { Observable } from '../../utils';\r\n\r\n/**\r\n * Focus component. Shows focus layer around the cell that is currently in focus.\r\n * @slot focus-${view.type}-${data.type}. @example focus-rgCol-rgRow\r\n */\r\n@Component({\r\n tag: 'revogr-focus',\r\n styleUrl: 'revogr-focus-style.scss',\r\n})\r\nexport class RevogrFocus {\r\n /**\r\n * Column type\r\n */\r\n @Prop() colType!: DimensionCols;\r\n /**\r\n * Row type\r\n */\r\n @Prop() rowType!: DimensionRows;\r\n\r\n /** Dynamic stores */\r\n /** Selection, range, focus for selection */\r\n @Prop() selectionStore!: Observable<SelectionStoreState>;\r\n /** Dimension settings Y */\r\n @Prop() dimensionRow!: Observable<DimensionSettingsState>;\r\n /** Dimension settings X */\r\n @Prop() dimensionCol!: Observable<DimensionSettingsState>;\r\n /**\r\n * Data rows source\r\n */\r\n @Prop() dataStore!: Observable<DSourceState<DataType, DimensionRows>>;\r\n /**\r\n * Column source\r\n */\r\n @Prop() colData!: Observable<DSourceState<ColumnRegular, DimensionCols>>;\r\n\r\n /**\r\n * Focus template custom function. Can be used to render custom focus layer.\r\n */\r\n @Prop() focusTemplate: FocusTemplateFunc | null = null;\r\n\r\n /**\r\n * Before focus render event.\r\n * Can be prevented by event.preventDefault().\r\n * If preventDefault used slot will be rendered.\r\n */\r\n @Event({ eventName: 'beforefocusrender' })\r\n beforeFocusRender: EventEmitter<FocusRenderEvent>;\r\n\r\n /**\r\n * Before focus changed verify if it's in view and scroll viewport into this view\r\n * Can be prevented by event.preventDefault()\r\n */\r\n @Event({ eventName: 'beforescrollintoview' })\r\n beforeScrollIntoView: EventEmitter<{ el: HTMLElement }>;\r\n /**\r\n * Used to setup properties after focus was rendered\r\n */\r\n @Event({ eventName: 'afterfocus' })\r\n afterFocus: EventEmitter<FocusAfterRenderEvent>;\r\n\r\n @Element() el: HTMLElement;\r\n private activeFocus: Cell | null = null;\r\n\r\n componentDidRender() {\r\n const currentFocus = this.selectionStore.get('focus');\r\n if (\r\n this.activeFocus?.x === currentFocus?.x &&\r\n this.activeFocus?.y === currentFocus?.y\r\n ) {\r\n return;\r\n }\r\n this.activeFocus = currentFocus;\r\n if (currentFocus && this.el) {\r\n const beforeScrollIn = this.beforeScrollIntoView.emit({ el: this.el });\r\n if (!beforeScrollIn.defaultPrevented) {\r\n this.el.scrollIntoView({\r\n block: 'nearest',\r\n inline: 'nearest',\r\n });\r\n }\r\n const model = getSourceItem(this.dataStore, currentFocus.y);\r\n const column = getSourceItem(this.colData, currentFocus.x);\r\n this.afterFocus.emit({\r\n model,\r\n column,\r\n rowType: this.rowType,\r\n colType: this.colType,\r\n rowIndex: currentFocus.y,\r\n colIndex: currentFocus.x,\r\n });\r\n }\r\n }\r\n\r\n render() {\r\n const editCell = this.selectionStore.get('edit');\r\n if (editCell) {\r\n return;\r\n }\r\n const focusCell = this.selectionStore.get('focus');\r\n if (!focusCell) {\r\n return;\r\n }\r\n const event = this.beforeFocusRender.emit({\r\n range: {\r\n ...focusCell,\r\n x1: focusCell.x,\r\n y1: focusCell.y,\r\n },\r\n rowType: this.rowType,\r\n colType: this.colType,\r\n rowDimension: { ...this.dimensionRow.state },\r\n colDimension: { ...this.dimensionCol.state },\r\n });\r\n if (event.defaultPrevented) {\r\n return <slot />;\r\n }\r\n const { detail } = event;\r\n\r\n const cell = getCell(\r\n detail.range,\r\n event.detail.rowDimension,\r\n event.detail.colDimension,\r\n );\r\n const styles = styleByCellProps(cell);\r\n const extra = this.focusTemplate?.(h, detail);\r\n const props = {\r\n class: { [FOCUS_CLASS]: true },\r\n style: styles,\r\n };\r\n return (\r\n <Host {...props}>\r\n <slot />\r\n {extra}\r\n </Host>\r\n );\r\n }\r\n}\r\n","import { getRange } from '@store';\r\nimport {\r\n codesLetter,\r\n isAll,\r\n isClear,\r\n isCopy,\r\n isCut,\r\n isEnterKeyValue,\r\n isPaste,\r\n isTab,\r\n timeout,\r\n RESIZE_INTERVAL,\r\n type Observable,\r\n isBack,\r\n} from '../../utils';\r\nimport {\r\n EventData,\r\n getCoordinate,\r\n isAfterLast,\r\n isBeforeFirst,\r\n} from './selection.utils';\r\nimport { Cell, Nullable, RangeArea, SelectionStoreState } from '@type';\r\n\r\ntype Config = {\r\n selectionStore: Observable<SelectionStoreState>;\r\n\r\n // Apply changes from edit.\r\n change(val?: any): void;\r\n // Cancels edit. Escape changes.\r\n cancel(): void;\r\n\r\n clearCell(): void;\r\n focus(\r\n focus: Cell,\r\n changes: Partial<Cell>,\r\n focusNextViewport?: number,\r\n ): boolean;\r\n\r\n getData(): any;\r\n internalPaste(): void;\r\n range(range: RangeArea | null): boolean;\r\n selectAll(): void;\r\n\r\n rollback(): void;\r\n};\r\n\r\nconst DIRECTION_CODES: string[] = [\r\n codesLetter.TAB,\r\n codesLetter.ARROW_UP,\r\n codesLetter.ARROW_DOWN,\r\n codesLetter.ARROW_LEFT,\r\n codesLetter.ARROW_RIGHT,\r\n];\r\nexport class KeyboardService {\r\n constructor(private sv: Config) {}\r\n\r\n async keyDown(\r\n e: KeyboardEvent,\r\n canRange: boolean,\r\n isEditMode: boolean,\r\n { range, focus }: Nullable<Pick<EventData, 'range' | 'focus'>>,\r\n ) {\r\n // IF EDIT MODE\r\n if (isEditMode) {\r\n switch (e.code) {\r\n case codesLetter.ESCAPE:\r\n this.sv.cancel();\r\n break;\r\n case codesLetter.TAB:\r\n this.keyChangeSelection(e, canRange);\r\n break;\r\n }\r\n return;\r\n }\r\n\r\n // IF NOT EDIT MODE\r\n\r\n // pressed clear key\r\n if (range && isClear(e.code)) {\r\n this.sv.clearCell();\r\n return;\r\n }\r\n\r\n // below works with focus only\r\n if (!focus) {\r\n return;\r\n }\r\n\r\n // tab key means same as arrow right\r\n if (isTab(e.code)) {\r\n this.keyChangeSelection(e, canRange);\r\n return;\r\n }\r\n\r\n // pressed enter\r\n if (isEnterKeyValue(e.key)) {\r\n this.sv.change();\r\n return;\r\n }\r\n\r\n // copy operation\r\n if (isCopy(e)) {\r\n return;\r\n }\r\n\r\n // cut operation\r\n if (isCut(e)) {\r\n return;\r\n }\r\n\r\n // paste operation\r\n if (isPaste(e)) {\r\n this.sv.internalPaste();\r\n return;\r\n }\r\n\r\n if (isBack(e)) {\r\n // rollback\r\n e.preventDefault();\r\n this.sv.rollback();\r\n return;\r\n }\r\n\r\n // select all\r\n if (isAll(e)) {\r\n e.preventDefault();\r\n // if (canRange) {\r\n // this.selectAll(e);\r\n // }\r\n return;\r\n }\r\n\r\n // pressed letter key\r\n if (e.key.length === 1) {\r\n this.sv.change(e.key);\r\n return;\r\n }\r\n\r\n // pressed arrow, change selection position\r\n if (await this.keyChangeSelection(e, canRange)) {\r\n return;\r\n }\r\n }\r\n\r\n // private selectAll(e: KeyboardEvent) {\r\n // const range = this.sv.selectionStore.get('range');\r\n // const focus = this.sv.selectionStore.get('focus');\r\n // // if no range or focus - do nothing\r\n // if (!range || !focus) {\r\n // return;\r\n // }\r\n // e.preventDefault();\r\n // this.sv.selectAll();\r\n // }\r\n\r\n async keyChangeSelection(e: KeyboardEvent, canRange: boolean) {\r\n const data = this.changeDirectionKey(e, canRange);\r\n if (!data) {\r\n return false;\r\n }\r\n\r\n // this interval needed for several cases\r\n // grid could be resized before next click\r\n // at this case to avoid screen jump we use this interval\r\n await timeout(RESIZE_INTERVAL + 30);\r\n\r\n const range = this.sv.selectionStore.get('range');\r\n const focus = this.sv.selectionStore.get('focus');\r\n return this.keyPositionChange(data.changes, range, focus, data.isMulti);\r\n }\r\n\r\n keyPositionChange(\r\n changes: Partial<Cell>,\r\n range: RangeArea | null,\r\n focus: Cell | null,\r\n isMulti = false,\r\n ) {\r\n if (!range || !focus) {\r\n return false;\r\n }\r\n const data = getCoordinate(range, focus, changes, isMulti);\r\n if (!data) {\r\n return false;\r\n }\r\n const eData: EventData = this.sv.getData();\r\n if (isMulti) {\r\n if (isAfterLast(data.end, eData.lastCell) || isBeforeFirst(data.start)) {\r\n return false;\r\n }\r\n const range = getRange(data.start, data.end);\r\n return this.sv.range(range);\r\n }\r\n return this.sv.focus(\r\n data.start,\r\n changes,\r\n isAfterLast(data.start, eData.lastCell)\r\n ? 1\r\n : isBeforeFirst(data.start)\r\n ? -1\r\n : 0,\r\n );\r\n }\r\n\r\n /** Monitor key direction changes */\r\n changeDirectionKey(\r\n e: KeyboardEvent,\r\n canRange: boolean,\r\n ): { changes: Partial<Cell>; isMulti?: boolean } | void {\r\n const isMulti = canRange && e.shiftKey;\r\n if (DIRECTION_CODES.includes(e.code)) {\r\n e.preventDefault();\r\n }\r\n\r\n if (e.shiftKey) {\r\n switch (e.code) {\r\n case codesLetter.TAB:\r\n return { changes: { x: -1 }, isMulti: false };\r\n }\r\n }\r\n\r\n switch (e.code) {\r\n case codesLetter.ARROW_UP:\r\n return { changes: { y: -1 }, isMulti };\r\n case codesLetter.ARROW_DOWN:\r\n return { changes: { y: 1 }, isMulti };\r\n case codesLetter.ARROW_LEFT:\r\n return { changes: { x: -1 }, isMulti };\r\n case codesLetter.TAB:\r\n case codesLetter.ARROW_RIGHT:\r\n return { changes: { x: 1 }, isMulti };\r\n }\r\n }\r\n}\r\n","import debounce from 'lodash/debounce';\r\nimport { DebouncedFunc } from 'lodash';\r\n\r\nimport { h } from '@stencil/core';\r\nimport {\r\n CELL_HANDLER_CLASS,\r\n MOBILE_CLASS,\r\n DIRECTION_LOCK_DISTANCE,\r\n} from '../../utils/consts';\r\nimport {\r\n collectModelsOfRange,\r\n EventData,\r\n getCell,\r\n getCurrentCell,\r\n isAfterLast,\r\n} from './selection.utils';\r\nimport { DSourceState, getRange } from '@store';\r\nimport ColumnService from '../data/column.service';\r\nimport { getPropertyFromEvent } from '../../utils/events';\r\nimport {\r\n DataLookup,\r\n DataType,\r\n DimensionSettingsState,\r\n TempRange,\r\n ChangedRange,\r\n BeforeRangeSaveDataDetails,\r\n RangeArea,\r\n Cell,\r\n DimensionRows,\r\n Nullable,\r\n AllDimensionType,\r\n} from '@type';\r\nimport { Observable } from '../../utils';\r\n\r\ntype Config = {\r\n dimensionRow: Observable<DimensionSettingsState>;\r\n dimensionCol: Observable<DimensionSettingsState>;\r\n columnService: ColumnService;\r\n dataStore: Observable<DSourceState<DataType, DimensionRows>>;\r\n\r\n setTempRange(e: Nullable<TempRange> | null): Event | null;\r\n selectionChanged(e: ChangedRange): Event;\r\n rangeCopy(e: ChangedRange): Event;\r\n rangeDataApply(e: BeforeRangeSaveDataDetails): CustomEvent;\r\n setRange(e: RangeArea | null): boolean;\r\n clearRangeDataApply(e: { range: RangeArea }): CustomEvent<{\r\n range: RangeArea;\r\n }>;\r\n\r\n getData(): any;\r\n};\r\n\r\nconst enum AutoFillType {\r\n selection = 'Selection',\r\n autoFill = 'AutoFill',\r\n}\r\n\r\nexport class AutoFillService {\r\n private autoFillType: AutoFillType | null = null;\r\n private autoFillInitial: Cell | null = null;\r\n private autoFillStart: Cell | null = null;\r\n private autoFillLast: Cell | null = null;\r\n private autoFillStartRange: RangeArea | null = null;\r\n private autoFillDirection: 'horizontal' | 'vertical' | null = null;\r\n\r\n private onMouseMoveAutofill: DebouncedFunc<\r\n (e: MouseEvent | TouchEvent, data: EventData) => void\r\n >;\r\n\r\n constructor(private sv: Config) {}\r\n\r\n /**\r\n * Render autofill box\r\n * @param range\r\n * @param selectionFocus\r\n */\r\n renderAutofill(\r\n range: RangeArea | null,\r\n selectionFocus: Cell,\r\n isMobile = false,\r\n ) {\r\n let handlerStyle;\r\n if (range) {\r\n handlerStyle = getCell(\r\n range,\r\n this.sv.dimensionRow.state,\r\n this.sv.dimensionCol.state,\r\n );\r\n } else {\r\n handlerStyle = getCell(\r\n {\r\n ...selectionFocus,\r\n x1: selectionFocus.x,\r\n y1: selectionFocus.y,\r\n },\r\n this.sv.dimensionRow.state,\r\n this.sv.dimensionCol.state,\r\n );\r\n }\r\n return (\r\n <div\r\n class={{\r\n [CELL_HANDLER_CLASS]: true,\r\n [MOBILE_CLASS]: isMobile,\r\n }}\r\n style={{\r\n left: `${handlerStyle.right}px`,\r\n top: `${handlerStyle.bottom}px`,\r\n }}\r\n onMouseDown={(e: MouseEvent) => this.autoFillHandler(e)}\r\n onTouchStart={(e: TouchEvent) => this.autoFillHandler(e)}\r\n />\r\n );\r\n }\r\n\r\n private autoFillHandler(\r\n e: MouseEvent | TouchEvent,\r\n type = AutoFillType.autoFill,\r\n ) {\r\n let target: Element | null = null;\r\n if (e.target instanceof Element) {\r\n target = e.target;\r\n }\r\n if (!target) {\r\n return;\r\n }\r\n this.selectionStart(target, this.sv.getData(), type);\r\n e.preventDefault();\r\n }\r\n\r\n get isAutoFill() {\r\n return !!this.autoFillType;\r\n }\r\n\r\n /**\r\n * Process mouse move events\r\n */\r\n selectionMouseMove(e: MouseEvent | TouchEvent) {\r\n // initiate mouse move debounce if not present\r\n if (!this.onMouseMoveAutofill) {\r\n this.onMouseMoveAutofill = debounce(\r\n (e: MouseEvent | TouchEvent, data: EventData) =>\r\n this.doAutofillMouseMove(e, data),\r\n 5,\r\n );\r\n }\r\n if (this.isAutoFill) {\r\n this.onMouseMoveAutofill(e, this.sv.getData());\r\n }\r\n }\r\n\r\n private getFocus(focus: Cell | null, range: RangeArea | null) {\r\n // there was an issue that it was taking last cell from range but focus was out\r\n if (!focus && range) {\r\n focus = { x: range.x, y: range.y };\r\n }\r\n return focus || null;\r\n }\r\n\r\n /**\r\n * Autofill logic:\r\n * on mouse move apply based on previous direction (if present)\r\n */\r\n private doAutofillMouseMove(event: MouseEvent | TouchEvent, data: EventData) {\r\n // if no initial - not started\r\n if (!this.autoFillInitial || !this.autoFillStartRange) {\r\n return;\r\n }\r\n\r\n const clientX = getPropertyFromEvent(event, 'clientX', MOBILE_CLASS);\r\n const clientY = getPropertyFromEvent(event, 'clientY', MOBILE_CLASS);\r\n // skip touch\r\n if (clientX === null || clientY === null) {\r\n return;\r\n }\r\n const current = getCurrentCell({ x: clientX, y: clientY }, data);\r\n\r\n // first time or direction equal to start(same as first time)\r\n if (!this.autoFillLast) {\r\n if (!this.autoFillLast) {\r\n this.autoFillLast = this.autoFillStart;\r\n }\r\n }\r\n\r\n // check if not the latest, if latest - do nothing\r\n if (isAfterLast(current, data.lastCell)) {\r\n return;\r\n }\r\n\r\n const { x, y, x1, y1 } = this.autoFillStartRange;\r\n\r\n // correct direction in autofill mode\r\n if (this.autoFillType === AutoFillType.autoFill) {\r\n const { dx, dy } = this.computeAutoFillOverflow(\r\n this.autoFillStartRange,\r\n current,\r\n );\r\n\r\n this.resolveAutoFillDirection(dx, dy);\r\n\r\n let lockedCurrent = { ...current };\r\n\r\n if (this.autoFillDirection === 'horizontal') {\r\n lockedCurrent.y = Math.max(y, y1);\r\n } else if (this.autoFillDirection === 'vertical') {\r\n lockedCurrent.x = Math.max(x, x1);\r\n }\r\n\r\n this.autoFillLast = lockedCurrent;\r\n } else {\r\n this.autoFillLast = current;\r\n }\r\n\r\n const isSame =\r\n current.x === this.autoFillInitial.x &&\r\n current.y === this.autoFillInitial.y;\r\n const isInside =\r\n current.x <= x1 && current.x >= x && current.y <= y1 && current.y >= y;\r\n\r\n // if same as initial or inside of initial selection - clear\r\n if (isSame || isInside) {\r\n this.sv.setTempRange(null);\r\n this.autoFillDirection = null;\r\n return;\r\n }\r\n\r\n let area: RangeArea | null = null;\r\n\r\n // check offsets if autofill mode\r\n if (this.autoFillType === AutoFillType.autoFill) {\r\n const initial = this.defineAutoFillInitial(\r\n this.autoFillStartRange,\r\n current,\r\n );\r\n area = getRange(initial, this.autoFillLast);\r\n } else {\r\n area = getRange(this.autoFillInitial, this.autoFillLast);\r\n }\r\n\r\n this.sv.setTempRange({\r\n area,\r\n type: this.autoFillType,\r\n });\r\n }\r\n\r\n /**\r\n * Range selection started\r\n * Mode @param type:\r\n * Can be triggered from MouseDown selection on element\r\n * Or can be triggered on corner square drag\r\n */\r\n selectionStart(\r\n target: Element,\r\n data: EventData,\r\n type = AutoFillType.selection,\r\n ) {\r\n /** Get cell by autofill element */\r\n const { top, left } = target.getBoundingClientRect();\r\n this.autoFillInitial = this.getFocus(data.focus, data.range);\r\n this.autoFillType = type;\r\n this.autoFillStartRange = data.range;\r\n this.autoFillStart = getCurrentCell({ x: left, y: top }, data);\r\n }\r\n\r\n /**\r\n * Clear current range selection on mouse up and mouse leave events\r\n */\r\n clearAutoFillSelection(focus: Cell | null, oldRange: RangeArea | null) {\r\n // If autofill was active, apply autofill values\r\n if (this.autoFillInitial) {\r\n // Fetch latest focus\r\n this.autoFillInitial = this.getFocus(focus, oldRange);\r\n\r\n // Apply range data if autofill mode is active\r\n if (\r\n this.autoFillType === AutoFillType.autoFill &&\r\n this.autoFillStartRange &&\r\n this.autoFillLast\r\n ) {\r\n const { x, x1, y, y1 } = this.autoFillStartRange;\r\n const xCoord = this.autoFillLast.x < x ? x1 : x;\r\n const yCoord = this.autoFillLast.y < y ? y1 : y;\r\n const range = getRange({ x: xCoord, y: yCoord }, this.autoFillLast);\r\n\r\n // If range is present, apply data\r\n if (range) {\r\n const {\r\n defaultPrevented: stopApply,\r\n detail: { range: newRange },\r\n } = this.sv.clearRangeDataApply({\r\n range,\r\n });\r\n\r\n // If data apply was not prevented, apply new range\r\n if (!stopApply && oldRange) {\r\n this.applyRangeWithData(newRange, oldRange);\r\n } else {\r\n // If data apply was prevented, clear temporary range\r\n this.sv.setTempRange(null);\r\n }\r\n }\r\n } else {\r\n // If not autofill mode, apply range only\r\n this.applyRangeOnly(this.autoFillInitial, this.autoFillLast);\r\n }\r\n }\r\n\r\n // Reset autofill state\r\n this.resetAutoFillState();\r\n }\r\n\r\n /**\r\n * Reset autofill state\r\n */\r\n private resetAutoFillState() {\r\n this.autoFillType = null;\r\n this.autoFillInitial = null;\r\n this.autoFillLast = null;\r\n this.autoFillStart = null;\r\n this.autoFillDirection = null;\r\n this.autoFillStartRange = null;\r\n }\r\n\r\n /**\r\n * Trigger range apply events and handle responses\r\n */\r\n onRangeApply(\r\n newData: DataLookup,\r\n newRange: (RangeArea & Partial<AllDimensionType>) | null,\r\n oldRange: (RangeArea & Partial<AllDimensionType>) | null,\r\n copy: boolean = false,\r\n clear: boolean = false,\r\n ) {\r\n this.sv.rangeDataApply({\r\n data: newData,\r\n models: collectModelsOfRange(newData, this.sv.dataStore),\r\n type: this.sv.dataStore.get('type'),\r\n oldRange,\r\n newRange,\r\n previousModels: null,\r\n copy,\r\n clearByKeyboard: clear,\r\n });\r\n\r\n this.sv.setRange(newRange);\r\n }\r\n\r\n /** Apply range and copy data during range application */\r\n private applyRangeWithData(newRange: RangeArea, rangeToCopy: RangeArea) {\r\n const rangeData: ChangedRange = {\r\n type: this.sv.dataStore.get('type'),\r\n colType: this.sv.columnService.type,\r\n newData: {},\r\n mapping: {},\r\n newRange,\r\n oldRange: rangeToCopy,\r\n };\r\n const { mapping, changed } = this.sv.columnService.getRangeData(\r\n rangeData,\r\n this.sv.columnService.columns,\r\n );\r\n rangeData.newData = changed;\r\n rangeData.mapping = mapping;\r\n let e = this.sv.selectionChanged(rangeData);\r\n\r\n // if default prevented - clear range\r\n if (e.defaultPrevented) {\r\n this.sv.setTempRange(null);\r\n return;\r\n }\r\n\r\n e = this.sv.rangeCopy(rangeData);\r\n if (e.defaultPrevented) {\r\n this.sv.setRange(newRange);\r\n return;\r\n }\r\n this.onRangeApply(\r\n rangeData.newData,\r\n { ...newRange, colType: rangeData.colType, rowType: rangeData.type },\r\n { ...rangeToCopy, colType: rangeData.colType, rowType: rangeData.type },\r\n );\r\n }\r\n\r\n /**\r\n * Update range selection only,\r\n * no data change (mouse selection)\r\n */\r\n private applyRangeOnly(start?: Cell | null, end?: Cell | null) {\r\n // no changes to apply\r\n if (!start || !end) {\r\n return;\r\n }\r\n\r\n const newRange = getRange(start, end);\r\n this.sv.setRange(newRange);\r\n }\r\n\r\n /**\r\n * Compute autofill overflow (dx & dy) relative to initial selection by current mouse position.\r\n */\r\n private computeAutoFillOverflow(range: RangeArea, cell: Cell) {\r\n const dx = Math.max(range.x - cell.x, 0, cell.x - range.x1);\r\n const dy = Math.max(range.y - cell.y, 0, cell.y - range.y1);\r\n return { dx, dy };\r\n }\r\n\r\n /**\r\n * Define autofill initial position\r\n */\r\n private defineAutoFillInitial(range: RangeArea, cell: Cell): Cell {\r\n const { x, y, x1, y1 } = range;\r\n const needUpOffset =\r\n y !== y1 && cell.y < y && this.autoFillDirection === 'vertical';\r\n const needLeftOffset =\r\n x !== x1 && cell.x < x && this.autoFillDirection === 'horizontal';\r\n\r\n return {\r\n x: needLeftOffset ? x1 : x,\r\n y: needUpOffset ? y1 : y,\r\n };\r\n }\r\n\r\n /**\r\n * Resolve autofill direction by current mouse position\r\n */\r\n private resolveAutoFillDirection(dx: number, dy: number) {\r\n if (!this.autoFillDirection) {\r\n this.autoFillDirection = dx > dy ? 'horizontal' : 'vertical';\r\n return;\r\n }\r\n\r\n const isYAxisOverflow = dx < DIRECTION_LOCK_DISTANCE && dy > dx + 1;\r\n const isXAxisOverflow = dy < DIRECTION_LOCK_DISTANCE && dx > dy + 1;\r\n\r\n const isXAxisEnd = dx === 0 && dy !== 0;\r\n const isYAxisEnd = dy === 0 && dx !== 0;\r\n\r\n if (\r\n this.autoFillDirection === 'horizontal' &&\r\n (isYAxisOverflow || isXAxisEnd)\r\n ) {\r\n this.autoFillDirection = 'vertical';\r\n return;\r\n }\r\n\r\n if (\r\n this.autoFillDirection === 'vertical' &&\r\n (isXAxisOverflow || isYAxisEnd)\r\n ) {\r\n this.autoFillDirection = 'horizontal';\r\n }\r\n }\r\n}\r\n","@use '../../global/_mixins.scss' as *;\r\n@use '../../global/_colors.scss' as *;\r\n\r\n@mixin autofill-handle($handler-size: 14px, $icon-size: 10px) {\r\n .autofill-handle {\r\n position: absolute;\r\n width: $handler-size;\r\n height: $handler-size;\r\n margin-left: -$handler-size + 1;\r\n margin-top: -$handler-size + 1;\r\n z-index: 10;\r\n cursor: crosshair;\r\n\r\n &::before {\r\n content: '';\r\n position: absolute;\r\n right: 0;\r\n bottom: 0;\r\n width: $icon-size;\r\n height: $icon-size;\r\n background: $selection-border;\r\n border: 1px solid white;\r\n box-sizing: border-box;\r\n }\r\n }\r\n}\r\n\r\nrevogr-overlay-selection {\r\n display: block;\r\n position: relative;\r\n width: 100%;\r\n\r\n\r\n @include autofill-handle;\r\n\r\n &.mobile {\r\n @include autofill-handle(30px, 12px);\r\n }\r\n\r\n .selection-border-range {\r\n position: absolute;\r\n pointer-events: none;\r\n z-index: 9;\r\n\r\n .range-handlers {\r\n height: 100%;\r\n background-color: transparent;\r\n width: calc(50% + (50% / 2));\r\n max-width: 50px;\r\n min-width: 20px;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n position: absolute;\r\n\r\n $btn-size: 20px;\r\n $handler-w: 15px;\r\n $handler-h: 5px;\r\n \r\n > span {\r\n pointer-events: auto;\r\n height: $btn-size;\r\n width: $btn-size;\r\n position: absolute;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n\r\n\r\n &:before, &:after {\r\n position: absolute;\r\n border-radius: 5px;\r\n width: $handler-w;\r\n height: $handler-h;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n background-color: rgba(black, 20%);\r\n }\r\n &:first-child {\r\n top: -($handler-h + 2px);\r\n &:before{\r\n content: '';\r\n top: 0;\r\n }\r\n }\r\n &:last-child {\r\n bottom: -($handler-h + 2px);\r\n &:after{\r\n content: '';\r\n bottom: 0;\r\n }\r\n }\r\n }\r\n }\r\n @include selection();\r\n }\r\n\r\n revogr-edit {\r\n z-index: 10;\r\n }\r\n}\r\n","import {\r\n Component,\r\n Event,\r\n EventEmitter,\r\n h,\r\n Host,\r\n Listen,\r\n Prop,\r\n type VNode,\r\n Element,\r\n Watch,\r\n} from '@stencil/core';\r\nimport ColumnService, { getCellEditor } from '../data/column.service';\r\nimport { codesLetter } from '../../utils/key.codes';\r\nimport { MOBILE_CLASS, SELECTION_BORDER_CLASS } from '../../utils/consts';\r\nimport { type DSourceState, getRange, isRangeSingleCell } from '@store';\r\nimport {\r\n collectModelsOfRange,\r\n EventData,\r\n getCell,\r\n getFocusCellBasedOnEvent,\r\n styleByCellProps,\r\n} from './selection.utils';\r\nimport { isEditInput } from '../editors/edit.utils';\r\nimport { KeyboardService } from './keyboard.service';\r\nimport { AutoFillService } from './autofill.service';\r\nimport { verifyTouchTarget } from '../../utils/events';\r\nimport { checkIsRightClick, getCellData, type Observable } from '../../utils';\r\n\r\nimport type {\r\n SelectionStoreState,\r\n DimensionSettingsState,\r\n DataType,\r\n DimensionRows,\r\n ColumnRegular,\r\n DimensionCols,\r\n DragStartEvent,\r\n Cell,\r\n MultiDimensionType,\r\n Nullable,\r\n RangeClipboardCopyEventProps,\r\n RangeClipboardPasteEvent,\r\n FocusRenderEvent,\r\n ApplyFocusEvent,\r\n AllDimensionType,\r\n DataFormat,\r\n Editors,\r\n BeforeSaveDataDetails,\r\n BeforeEdit,\r\n RangeArea,\r\n TempRange,\r\n ChangedRange,\r\n BeforeRangeSaveDataDetails,\r\n SaveDataDetails,\r\n EditCellStore,\r\n} from '@type';\r\n\r\n/**\r\n * Component for overlaying the grid with the selection.\r\n */\r\n@Component({\r\n tag: 'revogr-overlay-selection',\r\n styleUrl: 'revogr-overlay-style.scss',\r\n})\r\nexport class OverlaySelection {\r\n // #region Properties\r\n /**\r\n * Readonly mode.\r\n */\r\n @Prop() readonly: boolean;\r\n /**\r\n * Range selection allowed.\r\n */\r\n @Prop() range: boolean;\r\n /**\r\n * Enable revogr-order-editor component (read more in revogr-order-editor component).\r\n * Allows D&D.\r\n */\r\n @Prop() canDrag: boolean;\r\n\r\n /**\r\n * Enable revogr-clipboard component (read more in revogr-clipboard component).\r\n * Allows copy/paste.\r\n */\r\n @Prop() useClipboard: boolean;\r\n\r\n /** Stores */\r\n /** Selection, range, focus. */\r\n @Prop() selectionStore!: Observable<SelectionStoreState>;\r\n /** Dimension settings Y. */\r\n @Prop() dimensionRow: Observable<DimensionSettingsState>;\r\n /** Dimension settings X. */\r\n @Prop() dimensionCol!: Observable<DimensionSettingsState>;\r\n\r\n // --------------------------------------------------------------------------\r\n //\r\n // Static stores, not expected to change during component lifetime\r\n //\r\n // --------------------------------------------------------------------------\r\n\r\n /**\r\n * Row data store.\r\n */\r\n @Prop() dataStore!: Observable<DSourceState<DataType, DimensionRows>>;\r\n\r\n /**\r\n * Column data store.\r\n */\r\n @Prop() colData!: Observable<DSourceState<ColumnRegular, DimensionCols>>;\r\n /**\r\n * Last real coordinates positions + 1.\r\n */\r\n @Prop() lastCell: Cell;\r\n /**\r\n * Custom editors register.\r\n */\r\n @Prop() editors: Editors;\r\n /**\r\n * If true applys changes when cell closes if not Escape.\r\n */\r\n @Prop() applyChangesOnClose = false;\r\n /**\r\n * Additional data to pass to renderer.\r\n */\r\n @Prop() additionalData: any;\r\n\r\n /**\r\n * Is mobile view mode.\r\n */\r\n @Prop() isMobileDevice: boolean;\r\n\r\n // #endregion\r\n\r\n // #region Events\r\n /**\r\n * Before clipboard copy happened. Validate data before copy.\r\n * To prevent the default behavior of editing data and use your own implementation, call `e.preventDefault()`.\r\n */\r\n @Event({ eventName: 'beforecopyregion', cancelable: true })\r\n beforeCopyRegion: EventEmitter;\r\n /**\r\n * Before region paste happened.\r\n */\r\n @Event({ eventName: 'beforepasteregion', cancelable: true })\r\n beforeRegionPaste: EventEmitter;\r\n\r\n /**\r\n * Cell edit apply to the data source.\r\n * Triggers datasource edit on the root level.\r\n */\r\n @Event({ eventName: 'celleditapply', cancelable: true })\r\n cellEditApply: EventEmitter<BeforeSaveDataDetails>;\r\n\r\n /**\r\n * Before cell focus.\r\n */\r\n @Event({ eventName: 'beforecellfocusinit', cancelable: true })\r\n beforeFocusCell: EventEmitter<BeforeSaveDataDetails>;\r\n\r\n /**\r\n * Fired when change of viewport happens.\r\n * Usually when we switch between pinned regions.\r\n */\r\n @Event({ eventName: 'beforenextvpfocus', cancelable: true })\r\n beforeNextViewportFocus: EventEmitter<Cell>;\r\n\r\n /**\r\n * Set edit cell.\r\n */\r\n @Event({ eventName: 'setedit' }) setEdit: EventEmitter<BeforeEdit>;\r\n\r\n /**\r\n * Before range applied.\r\n * First step in triggerRangeEvent.\r\n */\r\n @Event({ eventName: 'beforeapplyrange' })\r\n beforeApplyRange: EventEmitter<FocusRenderEvent>;\r\n /**\r\n * Before range selection applied.\r\n * Second step in triggerRangeEvent.\r\n */\r\n @Event({ eventName: 'beforesetrange' }) beforeSetRange: EventEmitter;\r\n\r\n /**\r\n * Set range.\r\n * Third step in triggerRangeEvent.\r\n */\r\n @Event({ eventName: 'setrange' }) setRange: EventEmitter<\r\n RangeArea & { type: MultiDimensionType }\r\n >;\r\n\r\n /**\r\n * Before editor render.\r\n */\r\n @Event({ eventName: 'beforeeditrender' })\r\n beforeEditRender: EventEmitter<FocusRenderEvent>;\r\n\r\n /** Select all cells from keyboard. */\r\n @Event({ eventName: 'selectall' }) selectAll: EventEmitter;\r\n /**\r\n * Cancel edit. Used for editors support when editor close requested.\r\n */\r\n @Event({ eventName: 'canceledit' }) cancelEdit: EventEmitter;\r\n /** Back action from keyboard */\r\n @Event({ eventName: 'rollback' }) rollback: EventEmitter;\r\n\r\n /**\r\n * Set temp range area during autofill.\r\n */\r\n @Event({ eventName: 'settemprange' })\r\n setTempRange: EventEmitter<Nullable<TempRange> | null>;\r\n\r\n /**\r\n * Before set temp range area during autofill.\r\n */\r\n @Event({ eventName: 'beforesettemprange' })\r\n beforeSetTempRange: EventEmitter<\r\n { tempRange: Nullable<TempRange> | null } & EventData & AllDimensionType\r\n >;\r\n\r\n /**\r\n * Before cell get focused.\r\n * To prevent the default behavior of applying the edit data, you can call `e.preventDefault()`.\r\n */\r\n @Event({ eventName: 'applyfocus' })\r\n applyFocus: EventEmitter<FocusRenderEvent>;\r\n\r\n /**\r\n * Cell get focused.\r\n * To prevent the default behavior of applying the edit data, you can call `e.preventDefault()`.\r\n */\r\n @Event({ eventName: 'focuscell' }) focusCell: EventEmitter<\r\n ApplyFocusEvent & FocusRenderEvent\r\n >;\r\n /** Range data apply. */\r\n @Event({ eventName: 'beforerangedataapply' })\r\n beforeRangeDataApply: EventEmitter<FocusRenderEvent>;\r\n /** Autofill data in range. First step in applyRangeWithData */\r\n @Event({ eventName: 'selectionchangeinit', cancelable: true })\r\n selectionChange: EventEmitter<ChangedRange>;\r\n /** Before range copy. */\r\n @Event({ eventName: 'beforerangecopyapply', cancelable: true, bubbles: true })\r\n beforeRangeCopyApply: EventEmitter<ChangedRange>;\r\n\r\n /** Range data apply.\r\n * Triggers datasource edit on the root level.\r\n */\r\n @Event({ eventName: 'rangeeditapply', cancelable: true })\r\n rangeEditApply: EventEmitter<BeforeRangeSaveDataDetails>;\r\n /** Range copy. */\r\n @Event({ eventName: 'clipboardrangecopy', cancelable: true })\r\n /**\r\n * Range copy event.\r\n * This event is triggered when data is ready to be copied to the clipboard.\r\n * If you want to prevent the default behavior of copying data, you can call `e.preventDefault()`.\r\n * If you want to modify the data that will be copied to the clipboard, modify the `data` property of the event object.\r\n */\r\n rangeClipboardCopy: EventEmitter<RangeClipboardCopyEventProps>;\r\n\r\n /**\r\n * Range paste event.\r\n */\r\n @Event({ eventName: 'clipboardrangepaste', cancelable: true })\r\n rangeClipboardPaste: EventEmitter<RangeClipboardPasteEvent>;\r\n\r\n /**\r\n * Before key up event proxy, used to prevent key up trigger.\r\n * If you have some custom behaviour event, use this event to check if it wasn't processed by internal logic.\r\n * Call preventDefault().\r\n */\r\n @Event({ eventName: 'beforekeydown' })\r\n beforeKeyDown: EventEmitter<{ original: KeyboardEvent } & EventData>;\r\n /**\r\n * Before key down event proxy, used to prevent key down trigger.\r\n * If you have some custom behaviour event, use this event to check if it wasn't processed by internal logic.\r\n * Call preventDefault().\r\n */\r\n @Event({ eventName: 'beforekeyup' }) beforeKeyUp: EventEmitter<\r\n { original: KeyboardEvent } & EventData\r\n >;\r\n /**\r\n * Runs before cell save.\r\n * Can be used to override or cancel original save.\r\n */\r\n @Event({ eventName: 'beforecellsave', cancelable: true })\r\n beforeCellSave: EventEmitter;\r\n\r\n /**\r\n * Runs when edit finished save started, first in chain event\r\n */\r\n @Event({ eventName: 'celledit' }) cellEditDone: EventEmitter<SaveDataDetails>;\r\n\r\n // #endregion\r\n\r\n // #region Private Properties\r\n @Element() element: HTMLElement;\r\n private clipboard?: HTMLRevogrClipboardElement;\r\n\r\n protected columnService: ColumnService;\r\n private keyboardService: KeyboardService | null = null;\r\n private autoFillService: AutoFillService | null = null;\r\n private orderEditor?: HTMLRevogrOrderEditorElement;\r\n private revogrEdit?: HTMLRevogrEditElement;\r\n private unsubscribeSelectionStore: { (): void }[] = [];\r\n // #endregion\r\n\r\n // #region Listeners\r\n @Listen('touchmove', { target: 'document' })\r\n @Listen('mousemove', { target: 'document' })\r\n onMouseMove(e: MouseEvent | TouchEvent) {\r\n if (this.selectionStore.get('focus')) {\r\n this.autoFillService?.selectionMouseMove(e);\r\n }\r\n }\r\n\r\n /**\r\n * Action finished inside the document.\r\n * Pointer left document, clear any active operation.\r\n */\r\n @Listen('touchend', { target: 'document' })\r\n @Listen('mouseup', { target: 'document' })\r\n @Listen('mouseleave', { target: 'document' })\r\n onMouseUp() {\r\n // Clear autofill selection\r\n // when pointer left document,\r\n // clear any active operation.\r\n this.autoFillService?.clearAutoFillSelection(\r\n this.selectionStore.get('focus'),\r\n this.selectionStore.get('range'),\r\n );\r\n }\r\n\r\n /**\r\n * Row drag started.\r\n * This event is fired when drag action started on cell.\r\n */\r\n @Listen('dragstartcell') onCellDrag(e: CustomEvent<DragStartEvent>) {\r\n // Invoke drag start on order editor.\r\n this.orderEditor?.dragStart(e.detail);\r\n }\r\n\r\n /**\r\n * Get keyboard down from element.\r\n * This event is fired when keyboard key is released.\r\n */\r\n @Listen('keyup', { target: 'document' }) onKeyUp(e: KeyboardEvent) {\r\n // Emit before key up event.\r\n this.beforeKeyUp.emit({ original: e, ...this.getData() });\r\n }\r\n\r\n /**\r\n * Get keyboard down from element.\r\n * This event is fired when keyboard key is pressed.\r\n */\r\n @Listen('keydown', { target: 'document' }) onKeyDown(e: KeyboardEvent) {\r\n // Emit before key down event and check if default prevention is set.\r\n const proxy = this.beforeKeyDown.emit({ original: e, ...this.getData() });\r\n if (e.defaultPrevented || proxy.defaultPrevented) {\r\n return;\r\n }\r\n\r\n // Invoke key down on keyboard service.\r\n this.keyboardService?.keyDown(\r\n e,\r\n this.range,\r\n !!this.selectionStore.get('edit'),\r\n {\r\n focus: this.selectionStore.get('focus'),\r\n range: this.selectionStore.get('range'),\r\n },\r\n );\r\n }\r\n // #endregion\r\n\r\n /**\r\n * Selection & Keyboard\r\n */\r\n @Watch('selectionStore') selectionServiceSet(\r\n selectionStore: Observable<SelectionStoreState>,\r\n ) {\r\n // clear subscriptions\r\n this.unsubscribeSelectionStore.forEach(v => v());\r\n this.unsubscribeSelectionStore.length = 0;\r\n this.unsubscribeSelectionStore.push(\r\n selectionStore.onChange('nextFocus', v => v && this.doFocus(v, v)),\r\n );\r\n\r\n this.keyboardService = new KeyboardService({\r\n selectionStore,\r\n range: r => !!r && this.triggerRangeEvent(r),\r\n focus: (f, changes, focusNextViewport) => {\r\n if (focusNextViewport) {\r\n this.beforeNextViewportFocus.emit(f);\r\n return false;\r\n } else {\r\n return this.doFocus(f, f, changes);\r\n }\r\n },\r\n change: val => {\r\n if (this.readonly) {\r\n return;\r\n }\r\n this.doEdit(val);\r\n },\r\n cancel: async () => {\r\n await this.revogrEdit?.cancelChanges();\r\n this.closeEdit();\r\n },\r\n clearCell: () => !this.readonly && this.clearCell(),\r\n internalPaste: () => !this.readonly && this.beforeRegionPaste.emit(),\r\n getData: () => this.getData(),\r\n selectAll: () => this.selectAll.emit(),\r\n rollback: () => this.rollback.emit(),\r\n });\r\n this.createAutoFillService();\r\n }\r\n /** Autofill */\r\n @Watch('dimensionRow')\r\n @Watch('dimensionCol')\r\n createAutoFillService() {\r\n this.autoFillService = new AutoFillService({\r\n dimensionRow: this.dimensionRow,\r\n dimensionCol: this.dimensionCol,\r\n columnService: this.columnService,\r\n dataStore: this.dataStore,\r\n\r\n clearRangeDataApply: e =>\r\n this.beforeRangeDataApply.emit({\r\n ...e,\r\n ...this.types,\r\n rowDimension: { ...this.dimensionRow.state },\r\n colDimension: { ...this.dimensionCol.state },\r\n }),\r\n setTempRange: e => {\r\n const tempRangeEvent = this.beforeSetTempRange.emit({\r\n tempRange: e,\r\n ...this.getData(),\r\n ...this.types,\r\n });\r\n if (tempRangeEvent.defaultPrevented) {\r\n return null;\r\n }\r\n return this.setTempRange.emit(tempRangeEvent.detail.tempRange);\r\n },\r\n selectionChanged: e => this.selectionChange.emit(e),\r\n\r\n rangeCopy: e => this.beforeRangeCopyApply.emit(e),\r\n rangeDataApply: e => this.rangeEditApply.emit(e),\r\n\r\n setRange: e => !!e && this.triggerRangeEvent(e),\r\n getData: () => this.getData(),\r\n });\r\n }\r\n\r\n /** Columns */\r\n @Watch('dataStore')\r\n @Watch('colData')\r\n columnServiceSet() {\r\n this.columnService?.destroy();\r\n this.columnService = new ColumnService(this.dataStore, this.colData);\r\n this.createAutoFillService();\r\n }\r\n\r\n connectedCallback() {\r\n this.columnServiceSet();\r\n this.selectionServiceSet(this.selectionStore);\r\n }\r\n\r\n disconnectedCallback() {\r\n // clear subscriptions\r\n this.unsubscribeSelectionStore.forEach(v => v());\r\n this.unsubscribeSelectionStore.length = 0;\r\n this.columnService?.destroy();\r\n }\r\n\r\n async componentWillRender() {\r\n const editCell = this.selectionStore.get('edit');\r\n if (!editCell) {\r\n await this.revogrEdit?.beforeDisconnect?.();\r\n }\r\n }\r\n\r\n private renderRange(range: RangeArea) {\r\n const cell = getCell(\r\n range,\r\n this.dimensionRow.state,\r\n this.dimensionCol.state,\r\n );\r\n const styles = styleByCellProps(cell);\r\n return [\r\n <div class={SELECTION_BORDER_CLASS} style={styles}>\r\n {this.isMobileDevice && (\r\n <div class=\"range-handlers\">\r\n <span class={MOBILE_CLASS}></span>\r\n <span class={MOBILE_CLASS}></span>\r\n </div>\r\n )}\r\n </div>,\r\n ];\r\n }\r\n\r\n private renderEditor() {\r\n // Check if edit access\r\n const editCell = this.selectionStore.get('edit');\r\n // Readonly or Editor closed\r\n if (this.readonly || !editCell) {\r\n return null;\r\n }\r\n const enteredOrModelValue =\r\n editCell.val ||\r\n getCellData(\r\n this.columnService.rowDataModel(editCell.y, editCell.x).value,\r\n );\r\n const editable = {\r\n ...editCell,\r\n ...this.columnService.getSaveData(\r\n editCell.y,\r\n editCell.x,\r\n enteredOrModelValue,\r\n ),\r\n };\r\n const renderEvent = this.beforeEditRender.emit({\r\n range: {\r\n ...editCell,\r\n x1: editCell.x,\r\n y1: editCell.y,\r\n },\r\n ...this.types,\r\n rowDimension: { ...this.dimensionRow.state },\r\n colDimension: { ...this.dimensionCol.state },\r\n });\r\n\r\n // Render prevented\r\n if (renderEvent.defaultPrevented) {\r\n return null;\r\n }\r\n\r\n const cell = getCell(\r\n renderEvent.detail.range,\r\n renderEvent.detail.rowDimension,\r\n renderEvent.detail.colDimension,\r\n );\r\n const styles = styleByCellProps(cell);\r\n return (\r\n <revogr-edit\r\n style={styles}\r\n ref={el => (this.revogrEdit = el)}\r\n additionalData={this.additionalData}\r\n editCell={editable}\r\n saveOnClose={this.applyChangesOnClose}\r\n onCelleditinit={e => {\r\n this.cellEditDone.emit(e.detail);\r\n }}\r\n column={this.columnService.rowDataModel(editCell.y, editCell.x)}\r\n editor={getCellEditor(\r\n this.columnService.columns[editCell.x],\r\n this.editors,\r\n )}\r\n />\r\n );\r\n }\r\n\r\n private onEditCell(e: CustomEvent<SaveDataDetails>) {\r\n if (e.defaultPrevented) {\r\n return;\r\n }\r\n const saveEv = this.beforeCellSave.emit(e.detail);\r\n if (!saveEv.defaultPrevented) {\r\n this.cellEdit(saveEv.detail);\r\n }\r\n\r\n // if not clear navigate to next cell after edit\r\n if (!saveEv.detail.preventFocus) {\r\n this.focusNext();\r\n }\r\n }\r\n\r\n render() {\r\n const nodes: VNode[] = [];\r\n const editCell = this.renderEditor();\r\n\r\n // Editor\r\n if (editCell) {\r\n nodes.push(editCell);\r\n } else {\r\n const range = this.selectionStore.get('range');\r\n const focus = this.selectionStore.get('focus');\r\n\r\n // Clipboard\r\n if ((range || focus) && this.useClipboard) {\r\n nodes.push(\r\n <revogr-clipboard\r\n readonly={this.readonly}\r\n onCopyregion={e => this.onCopy(e.detail)}\r\n onClearregion={() => !this.readonly && this.clearCell()}\r\n ref={e => (this.clipboard = e)}\r\n onPasteregion={e => this.onPaste(e.detail)}\r\n />,\r\n );\r\n }\r\n\r\n // Range\r\n if (range) {\r\n nodes.push(...this.renderRange(range));\r\n }\r\n // Autofill\r\n if (focus && !this.readonly && this.range) {\r\n nodes.push(\r\n this.autoFillService?.renderAutofill(\r\n range,\r\n focus,\r\n this.isMobileDevice,\r\n ),\r\n );\r\n }\r\n\r\n // Order\r\n if (this.canDrag) {\r\n nodes.push(\r\n <revogr-order-editor\r\n ref={e => (this.orderEditor = e)}\r\n dataStore={this.dataStore}\r\n dimensionRow={this.dimensionRow}\r\n dimensionCol={this.dimensionCol}\r\n parent={this.element}\r\n rowType={this.types.rowType}\r\n onRowdragstartinit={e => this.rowDragStart(e)}\r\n />,\r\n );\r\n }\r\n }\r\n return (\r\n <Host\r\n class={{ mobile: this.isMobileDevice }}\r\n onDblClick={(e: MouseEvent) => this.onElementDblClick(e)}\r\n onMouseDown={(e: MouseEvent) => this.onElementMouseDown(e)}\r\n onTouchStart={(e: TouchEvent) => this.onElementMouseDown(e, true)}\r\n onCloseedit={(e: CustomEvent<boolean | undefined>) => this.closeEdit(e)}\r\n // it's done to be able to throw events from different levels, not just from editor\r\n onCelledit={(e: CustomEvent<SaveDataDetails>) => this.onEditCell(e)}\r\n >\r\n {nodes}\r\n <slot name=\"data\" />\r\n </Host>\r\n );\r\n }\r\n\r\n /**\r\n * Executes the focus operation on the specified range of cells.\r\n */\r\n private doFocus(focus: Cell, end: Cell, changes?: Partial<Cell>) {\r\n // 1. Trigger beforeFocus event\r\n const { defaultPrevented } = this.beforeFocusCell.emit(\r\n this.columnService.getSaveData(focus.y, focus.x),\r\n );\r\n if (defaultPrevented) {\r\n return false;\r\n }\r\n const evData: FocusRenderEvent = {\r\n range: {\r\n ...focus,\r\n x1: end.x,\r\n y1: end.y,\r\n },\r\n next: changes,\r\n ...this.types,\r\n rowDimension: { ...this.dimensionRow.state },\r\n colDimension: { ...this.dimensionCol.state },\r\n };\r\n\r\n // 2. Trigger apply focus event\r\n const applyEvent = this.applyFocus.emit(evData);\r\n if (applyEvent.defaultPrevented) {\r\n return false;\r\n }\r\n const { range } = applyEvent.detail;\r\n\r\n // 3. Trigger focus event\r\n return !this.focusCell.emit({\r\n focus: {\r\n x: range.x,\r\n y: range.y,\r\n },\r\n end: {\r\n x: range.x1,\r\n y: range.y1,\r\n },\r\n ...applyEvent.detail,\r\n }).defaultPrevented;\r\n }\r\n\r\n private triggerRangeEvent(range: RangeArea) {\r\n const type = this.types.rowType;\r\n // 1. Apply range\r\n const applyEvent = this.beforeApplyRange.emit({\r\n range: { ...range },\r\n ...this.types,\r\n rowDimension: { ...this.dimensionRow.state },\r\n colDimension: { ...this.dimensionCol.state },\r\n });\r\n if (applyEvent.defaultPrevented) {\r\n return false;\r\n }\r\n const data = this.columnService.getRangeTransformedToProps(\r\n applyEvent.detail.range,\r\n this.dataStore,\r\n );\r\n // 2. Before set range\r\n let e = this.beforeSetRange.emit(data);\r\n if (e.defaultPrevented) {\r\n return false;\r\n }\r\n // 3. Set range\r\n e = this.setRange.emit({ ...applyEvent.detail.range, type });\r\n if (e.defaultPrevented) {\r\n return false;\r\n }\r\n return !e.defaultPrevented;\r\n }\r\n\r\n /**\r\n * Open Editor on DblClick\r\n */\r\n private onElementDblClick(e: MouseEvent) {\r\n // DblClick prevented outside - Editor will not open\r\n if (e.defaultPrevented) {\r\n return;\r\n }\r\n\r\n // Get data from the component\r\n const data = this.getData();\r\n const focusCell = getFocusCellBasedOnEvent(e, data);\r\n if (!focusCell) {\r\n return;\r\n }\r\n this.doEdit();\r\n }\r\n\r\n /**\r\n * Handle mouse down event on Host element\r\n */\r\n private onElementMouseDown(e: MouseEvent | TouchEvent, touch = false) {\r\n // Get the target element from the event object\r\n const targetElement = e.target as HTMLElement | undefined;\r\n // Ignore focus if clicked input\r\n if (isEditInput(targetElement) || e.defaultPrevented) {\r\n return;\r\n }\r\n\r\n // Get data from the component\r\n const data = this.getData();\r\n const focusCell = getFocusCellBasedOnEvent(e, data);\r\n if (!focusCell) {\r\n return;\r\n }\r\n\r\n // Check if right click on selected range - do nothing\r\n const isRightClick = checkIsRightClick(e as MouseEvent);\r\n const selectedRange = this.selectionStore.get('range');\r\n let isClickOnSelectedRange: boolean = false;\r\n\r\n if (isRightClick && selectedRange) {\r\n const { x, x1, y, y1 } = selectedRange;\r\n const evt = e.target as HTMLElement;\r\n\r\n if (\r\n (x !== x1 || y !== y1) &&\r\n evt.dataset['rgcol'] &&\r\n evt.dataset['rgrow']\r\n ) {\r\n const maxXCoord = Math.max(x, x1);\r\n const minXCoord = Math.min(x, x1);\r\n const maxYCoord = Math.max(y, y1);\r\n const minYCoord = Math.min(y, y1);\r\n\r\n isClickOnSelectedRange =\r\n +evt.dataset['rgcol'] >= minXCoord &&\r\n +evt.dataset['rgcol'] <= maxXCoord &&\r\n +evt.dataset['rgrow'] >= minYCoord &&\r\n +evt.dataset['rgrow'] <= maxYCoord;\r\n }\r\n }\r\n\r\n // Set focus on the current cell\r\n this.focus(focusCell, this.range && e.shiftKey, isClickOnSelectedRange);\r\n\r\n // Initiate autofill selection\r\n if (this.range && !isClickOnSelectedRange) {\r\n targetElement &&\r\n this.autoFillService?.selectionStart(targetElement, this.getData());\r\n\r\n // Prevent default behavior for mouse events,\r\n // but only if target element is not a mobile input\r\n if (!touch) {\r\n // e.preventDefault();\r\n } else if (\r\n verifyTouchTarget((e as TouchEvent).touches[0], MOBILE_CLASS)\r\n ) {\r\n // Prevent default behavior for touch events\r\n // if target element is a mobile input\r\n e.preventDefault();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Start cell editing\r\n */\r\n protected doEdit(val = '') {\r\n if (this.canEdit()) {\r\n const focus = this.selectionStore.get('focus');\r\n if (!focus) {\r\n return;\r\n }\r\n const data = this.columnService.getSaveData(focus.y, focus.x);\r\n this.setEdit?.emit({\r\n ...data,\r\n val,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Close editor event triggered\r\n * @param details - if it requires focus next\r\n */\r\n private async closeEdit(e?: CustomEvent<boolean | undefined>) {\r\n this.cancelEdit.emit();\r\n if (e?.detail) {\r\n await this.focusNext();\r\n }\r\n }\r\n\r\n /**\r\n * Edit finished.\r\n * Close Editor and save.\r\n */\r\n protected cellEdit(e: SaveDataDetails) {\r\n const dataToSave = this.columnService.getSaveData(e.rgRow, e.rgCol, e.val);\r\n this.cellEditApply.emit(dataToSave);\r\n }\r\n\r\n private getRegion() {\r\n const focus = this.selectionStore.get('focus');\r\n let range = this.selectionStore.get('range');\r\n if (!range) {\r\n range = getRange(focus, focus);\r\n }\r\n return range;\r\n }\r\n private onCopy(e: DataTransfer) {\r\n const range = this.getRegion();\r\n const canCopyEvent = this.beforeCopyRegion.emit(range);\r\n if (canCopyEvent.defaultPrevented) {\r\n return false;\r\n }\r\n let rangeData: DataFormat[][] | undefined;\r\n\r\n if (range) {\r\n const { data, mapping } = this.columnService.copyRangeArray(\r\n range,\r\n this.dataStore,\r\n );\r\n const event = this.rangeClipboardCopy.emit({\r\n range,\r\n data,\r\n mapping,\r\n ...this.types,\r\n });\r\n if (!event.defaultPrevented) {\r\n rangeData = event.detail.data;\r\n }\r\n }\r\n\r\n this.clipboard?.doCopy(e, rangeData);\r\n return true;\r\n }\r\n\r\n private onPaste(data: string[][]) {\r\n const focus = this.selectionStore.get('focus');\r\n const isEditing = this.selectionStore.get('edit') !== null;\r\n if (!focus || isEditing) {\r\n return;\r\n }\r\n let { changed, range } = this.columnService.getTransformedDataToApply(\r\n focus,\r\n data,\r\n );\r\n const { defaultPrevented: canPaste } = this.rangeClipboardPaste.emit({\r\n data: changed,\r\n models: collectModelsOfRange(changed, this.dataStore),\r\n range,\r\n ...this.types,\r\n });\r\n\r\n this.columnService.type;\r\n\r\n if (canPaste) {\r\n return;\r\n }\r\n\r\n const rangeWithDimensions = range\r\n ? {\r\n ...range,\r\n colType: this.columnService.type,\r\n rowType: this.dataStore.get('type'),\r\n }\r\n : null;\r\n\r\n this.autoFillService?.onRangeApply(\r\n changed,\r\n rangeWithDimensions,\r\n rangeWithDimensions,\r\n true,\r\n );\r\n }\r\n\r\n private async focusNext() {\r\n const canFocus = await this.keyboardService?.keyChangeSelection(\r\n new KeyboardEvent('keydown', {\r\n code: codesLetter.ARROW_DOWN,\r\n }),\r\n this.range,\r\n );\r\n if (!canFocus) {\r\n this.closeEdit();\r\n }\r\n }\r\n\r\n protected clearCell() {\r\n const range = this.selectionStore.get('range');\r\n if (range && !isRangeSingleCell(range)) {\r\n const data = this.columnService.getRangeStaticData(range, '');\r\n\r\n const rangeWithDimensions = range\r\n ? {\r\n ...range,\r\n colType: this.columnService.type,\r\n rowType: this.dataStore.get('type'),\r\n }\r\n : null;\r\n\r\n this.autoFillService?.onRangeApply(\r\n data,\r\n rangeWithDimensions,\r\n rangeWithDimensions,\r\n false,\r\n true,\r\n );\r\n } else if (this.canEdit()) {\r\n const focused = this.selectionStore.get('focus');\r\n if (!focused) {\r\n return;\r\n }\r\n const cell = this.columnService.getSaveData(focused.y, focused.x);\r\n this.cellEdit({\r\n rgRow: focused.y,\r\n rgCol: focused.x,\r\n val: '',\r\n type: cell.type,\r\n prop: cell.prop,\r\n });\r\n }\r\n }\r\n\r\n private rowDragStart({ detail }: CustomEvent<{ cell: Cell; text: string }>) {\r\n detail.text = getCellData(\r\n this.columnService.rowDataModel(detail.cell.y, detail.cell.x).value,\r\n );\r\n }\r\n\r\n /**\r\n * Verify if edit allowed.\r\n */\r\n protected canEdit() {\r\n if (this.readonly) {\r\n return false;\r\n }\r\n const focus = this.selectionStore.get('focus');\r\n return focus && !this.columnService?.isReadOnly(focus.y, focus.x);\r\n }\r\n\r\n get edited(): EditCellStore | null {\r\n return this.selectionStore.get('edit');\r\n }\r\n\r\n /**\r\n * Sets the focus on a cell and optionally edits a range.\r\n */\r\n focus(cell?: Cell, isRangeEdit = false, isPrevent = false) {\r\n if (!cell || isPrevent) return false;\r\n\r\n const end = cell;\r\n const start = this.selectionStore.get('focus');\r\n\r\n if (isRangeEdit && start) {\r\n const range = getRange(start, end);\r\n if (range) {\r\n return this.triggerRangeEvent(range);\r\n }\r\n }\r\n\r\n return this.doFocus(cell, end);\r\n }\r\n\r\n get types(): AllDimensionType {\r\n return {\r\n rowType: this.dataStore.get('type'),\r\n colType: this.columnService.type,\r\n };\r\n }\r\n\r\n /**\r\n * Collect data\r\n */\r\n protected getData(): EventData {\r\n return {\r\n el: this.element,\r\n rows: this.dimensionRow.state,\r\n cols: this.dimensionCol.state,\r\n lastCell: this.lastCell,\r\n focus: this.selectionStore.get('focus'),\r\n range: this.selectionStore.get('range'),\r\n edit: this.selectionStore.get('edit'),\r\n };\r\n }\r\n}\r\n","import type { VNode } from '@stencil/core';\r\nimport type { HyperFunc } from '@type';\r\n\r\ntype HeaderRender = {\r\n (start: number): (h: HyperFunc<VNode>, e: { rowIndex: number }) => number;\r\n};\r\nexport const RowHeaderRender: HeaderRender = s => (__, { rowIndex: i }) => s + i;\r\n","import { h, Host, Component, Prop, Event, EventEmitter } from '@stencil/core';\r\nimport type { JSXBase } from '@stencil/core/internal';\r\n\r\nimport { ViewportStore, DataStore } from '@store';\r\nimport type {\r\n RowHeaders,\r\n ViewPortScrollEvent,\r\n DataType,\r\n ColumnRegular,\r\n ViewportData,\r\n ElementScroll,\r\n DimensionRows,\r\n DimensionCols,\r\n} from '@type';\r\n\r\nimport { ROW_HEADER_TYPE } from '../../utils/consts';\r\nimport { RowHeaderRender } from './row-header-render';\r\nimport { calculateRowHeaderSize } from '../../utils/row-header-utils';\r\nimport { HEADER_SLOT } from '../revoGrid/viewport.helpers';\r\nimport { type JSX } from '../../components';\r\n\r\n/**\r\n * Row headers component\r\n * Visible on the left side of the table\r\n */\r\n\r\n@Component({ tag: 'revogr-row-headers' })\r\nexport class RevogrRowHeaders {\r\n // #region Properties\r\n /**\r\n * Header height to setup row headers\r\n */\r\n @Prop() height: number;\r\n\r\n /**\r\n * Viewport data\r\n */\r\n @Prop() dataPorts: ViewportData[];\r\n /**\r\n * Header props\r\n */\r\n @Prop() headerProp: Record<string, any>;\r\n\r\n /**\r\n * Row class\r\n */\r\n @Prop() rowClass: string;\r\n\r\n /**\r\n * Enable resize\r\n */\r\n @Prop() resize: boolean;\r\n /**\r\n * Row header column\r\n */\r\n @Prop() rowHeaderColumn: RowHeaders;\r\n /**\r\n * Additional data to pass to renderer\r\n */\r\n @Prop() additionalData: any;\r\n /**\r\n * Prevent rendering until job is done.\r\n * Can be used for initial rendering performance improvement.\r\n * When several plugins require initial rendering this will prevent double initial rendering.\r\n */\r\n @Prop() jobsBeforeRender: Promise<any>[] = [];\r\n // #endregion\r\n\r\n /**\r\n * Scroll viewport\r\n */\r\n @Event({ eventName: 'scrollview', bubbles: false })\r\n scrollViewport: EventEmitter<ViewPortScrollEvent>;\r\n /**\r\n * Register element to scroll\r\n */\r\n @Event({ eventName: 'ref', bubbles: false })\r\n elementToScroll: EventEmitter<ElementScroll>;\r\n\r\n render() {\r\n const dataViews: HTMLElement[] = [];\r\n const viewport = new ViewportStore('colPinStart');\r\n\r\n /** render viewports rows */\r\n let totalLength = 1 + (this.rowHeaderColumn?.offset || 0);\r\n // todo: this part could be optimized to avoid to often re-render dataPorts can be cached\r\n for (let data of this.dataPorts) {\r\n const itemCount = data.dataStore.get('items').length;\r\n\r\n // initiate row data\r\n const dataStore = new DataStore<DataType, DimensionRows>(data.type, {\r\n ...data.dataStore.state,\r\n });\r\n\r\n // initiate column data\r\n const colData = new DataStore<ColumnRegular, DimensionCols>(\r\n 'colPinStart',\r\n );\r\n const column: ColumnRegular = {\r\n cellTemplate: RowHeaderRender(totalLength),\r\n ...this.rowHeaderColumn,\r\n };\r\n colData.updateData([column]);\r\n dataViews.push(\r\n <revogr-data\r\n {...data}\r\n colType=\"rowHeaders\"\r\n jobsBeforeRender={this.jobsBeforeRender}\r\n rowClass={this.rowClass}\r\n dataStore={dataStore.store}\r\n colData={colData.store}\r\n viewportCol={viewport.store}\r\n readonly={true}\r\n range={false}\r\n />,\r\n );\r\n totalLength += itemCount;\r\n }\r\n\r\n const colSize = calculateRowHeaderSize(totalLength, this.rowHeaderColumn);\r\n viewport.setViewport({\r\n realCount: 1,\r\n virtualSize: 0,\r\n items: [\r\n {\r\n size: colSize,\r\n start: 0,\r\n end: colSize,\r\n itemIndex: 0,\r\n },\r\n ],\r\n });\r\n\r\n const viewportScroll: JSX.RevogrViewportScroll &\r\n JSXBase.HTMLAttributes<HTMLRevogrViewportScrollElement> = {\r\n contentHeight: this.height,\r\n contentWidth: 0,\r\n style: { minWidth: `${colSize}px` },\r\n colType: 'rowHeaders',\r\n ref: el => this.elementToScroll.emit(el),\r\n onScrollviewport: (e: CustomEvent) => this.scrollViewport.emit(e.detail),\r\n };\r\n const viewportHeader: JSX.RevogrHeader & { slot: string } = {\r\n ...this.headerProp,\r\n // groups not present on row headers\r\n groups: [],\r\n colData:\r\n typeof this.rowHeaderColumn === 'object' ? [this.rowHeaderColumn] : [],\r\n viewportCol: viewport.store,\r\n canResize: false,\r\n type: ROW_HEADER_TYPE,\r\n // parent,\r\n slot: HEADER_SLOT,\r\n };\r\n return (\r\n <Host class={{ [ROW_HEADER_TYPE]: true }} key={ROW_HEADER_TYPE}>\r\n <revogr-viewport-scroll {...viewportScroll} row-header={true}>\r\n <revogr-header {...viewportHeader} />\r\n {dataViews}\r\n </revogr-viewport-scroll>\r\n </Host>\r\n );\r\n }\r\n}\r\n","\r\n\r\n/**\r\n * Autohide scroll for MacOS when scroll is visible only for 1 sec\r\n */\r\nexport class AutohideScrollPlugin {\r\n private autohideScrollTimeout = 0;\r\n constructor(private element: HTMLElement) {\r\n }\r\n\r\n /**\r\n * When scroll size updates set it up for autohide\r\n */\r\n setScrollSize(s: number) {\r\n if (!s) {\r\n this.element.setAttribute('autohide', 'true');\r\n } else {\r\n this.element.removeAttribute('autohide');\r\n }\r\n }\r\n\r\n /**\r\n * On each scroll check if it's time to show\r\n */\r\n checkScroll({\r\n scrollSize,\r\n contentSize,\r\n virtualSize,\r\n }: {\r\n scrollSize: number;\r\n contentSize: number;\r\n virtualSize: number;\r\n }) {\r\n const hasScroll = contentSize > virtualSize;\r\n const isHidden = !scrollSize && hasScroll;\r\n if (isHidden) {\r\n this.element.setAttribute('visible', 'true');\r\n this.autohideScrollTimeout = this.show(\r\n this.element,\r\n this.autohideScrollTimeout,\r\n );\r\n }\r\n }\r\n\r\n private show(element?: HTMLElement, timeout?: number): number {\r\n clearTimeout(timeout);\r\n return Number(\r\n setTimeout(() => {\r\n element?.removeAttribute('visible');\r\n }, 1000),\r\n );\r\n }\r\n clear() {\r\n clearTimeout(this.autohideScrollTimeout);\r\n }\r\n}\r\n","revogr-scroll-virtual {\r\n $min-size: 20px;\r\n\r\n // show scroll only for 1 sec\r\n &[autohide] {\r\n position: absolute;\r\n z-index: 100 !important;\r\n\r\n &.vertical {\r\n top: 0;\r\n right: 0;\r\n\r\n &[visible] {\r\n min-width: $min-size !important;\r\n }\r\n }\r\n\r\n &.horizontal {\r\n bottom: 0;\r\n left: 0;\r\n\r\n &[visible] {\r\n min-height: $min-size !important;\r\n }\r\n }\r\n }\r\n\r\n &.vertical {\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n height: 100%;\r\n\r\n > div {\r\n width: 1px;\r\n }\r\n }\r\n\r\n &.horizontal {\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n width: 100%;\r\n\r\n > div {\r\n height: 1px;\r\n }\r\n }\r\n}\r\n","import {\r\n Component,\r\n Element as StencilElement,\r\n Event,\r\n EventEmitter,\r\n h,\r\n Host,\r\n Method,\r\n Prop,\r\n} from '@stencil/core';\r\nimport LocalScrollService, {\r\n getContentSize,\r\n} from '../../services/local.scroll.service';\r\nimport type {\r\n DimensionType,\r\n ViewPortScrollEvent,\r\n} from '@type';\r\nimport { AutohideScrollPlugin } from './autohide-scroll.plugin';\r\nimport { LocalScrollTimer } from '../../services/local.scroll.timer';\r\nimport { getScrollbarSize } from '../../utils';\r\n\r\n/**\r\n * Virtual scroll component\r\n */\r\n@Component({\r\n tag: 'revogr-scroll-virtual',\r\n styleUrl: 'revogr-scroll-style.scss',\r\n})\r\nexport class RevogrScrollVirtual {\r\n /**\r\n * Scroll dimension (`X` - `rgCol` or `Y` - `rgRow`)\r\n */\r\n @Prop() dimension: DimensionType = 'rgRow';\r\n\r\n /**\r\n * Dimensions\r\n */\r\n @Prop() realSize!: number;\r\n\r\n /**\r\n * Virtual size\r\n */\r\n @Prop() virtualSize!: number;\r\n\r\n /**\r\n * Client size\r\n */\r\n @Prop() clientSize!: number;\r\n\r\n /**\r\n * Scroll event\r\n */\r\n @Event({ eventName: 'scrollvirtual' })\r\n scrollVirtual: EventEmitter<ViewPortScrollEvent>;\r\n\r\n @StencilElement() element: HTMLElement;\r\n private autohideScrollPlugin: AutohideScrollPlugin;\r\n private scrollSize = 0;\r\n private localScrollService: LocalScrollService;\r\n private localScrollTimer: LocalScrollTimer;\r\n\r\n @Method()\r\n async setScroll(e: ViewPortScrollEvent): Promise<void> {\r\n if (this.dimension !== e.dimension) {\r\n return;\r\n }\r\n this.localScrollTimer.latestScrollUpdate(e.dimension);\r\n this.localScrollService?.setScroll(e);\r\n if (e.coordinate) {\r\n this.autohideScrollPlugin.checkScroll({\r\n scrollSize: this.scrollSize,\r\n contentSize: this.realSize,\r\n virtualSize: this.virtualSize,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Update if `delta` exists in case we don't know current position or if it's external change\r\n */\r\n @Method()\r\n async changeScroll(e: ViewPortScrollEvent): Promise<ViewPortScrollEvent> {\r\n if (e.delta) {\r\n switch (e.dimension) {\r\n case 'rgCol':\r\n e.coordinate = this.element.scrollLeft + e.delta;\r\n break;\r\n case 'rgRow':\r\n e.coordinate = this.element.scrollTop + e.delta;\r\n break;\r\n }\r\n this.setScroll(e);\r\n }\r\n return e;\r\n }\r\n\r\n connectedCallback() {\r\n this.autohideScrollPlugin = new AutohideScrollPlugin(this.element);\r\n this.localScrollTimer = new LocalScrollTimer(\r\n 'ontouchstart' in document.documentElement ? 0 : 10,\r\n );\r\n this.localScrollService = new LocalScrollService({\r\n runScroll: e => this.scrollVirtual.emit(e),\r\n applyScroll: e => {\r\n this.localScrollTimer.setCoordinate(e);\r\n const type = e.dimension === 'rgRow' ? 'scrollTop' : 'scrollLeft';\r\n // this will trigger on scroll event\r\n this.element[type] = e.coordinate;\r\n },\r\n });\r\n }\r\n\r\n disconnectedCallback() {\r\n this.autohideScrollPlugin.clear();\r\n }\r\n\r\n componentWillLoad() {\r\n this.scrollSize = getScrollbarSize(document);\r\n }\r\n\r\n componentDidRender() {\r\n let scrollSize = 0;\r\n if (this.dimension === 'rgRow') {\r\n scrollSize = this.element.scrollHeight > this.element.clientHeight ? this.scrollSize : 0;\r\n this.element.style.minWidth = `${scrollSize}px`;\r\n } else {\r\n scrollSize = this.element.scrollWidth > this.element.clientWidth ? this.scrollSize : 0;\r\n this.element.style.minHeight = `${scrollSize}px`;\r\n }\r\n this.autohideScrollPlugin.setScrollSize(scrollSize);\r\n this.localScrollService.setParams(\r\n {\r\n contentSize: this.realSize,\r\n clientSize: this.dimension === 'rgRow' ? this.element.clientHeight : this.element.clientWidth,\r\n virtualSize: this.clientSize,\r\n },\r\n this.dimension,\r\n );\r\n }\r\n\r\n onScroll(e: MouseEvent) {\r\n if (!(e.target instanceof Element)) {\r\n return;\r\n }\r\n const target = e.target;\r\n let type: 'scrollLeft' | 'scrollTop' = 'scrollLeft';\r\n if (this.dimension === 'rgRow') {\r\n type = 'scrollTop';\r\n }\r\n\r\n const setScroll = () => {\r\n this.localScrollService?.scroll(target[type] || 0, this.dimension);\r\n };\r\n // apply after throttling\r\n if (this.localScrollTimer.isReady(this.dimension, target[type])) {\r\n setScroll();\r\n } else {\r\n this.localScrollTimer.throttleLastScrollUpdate(this.dimension, target[type] || 0, () => setScroll());\r\n }\r\n }\r\n\r\n render() {\r\n const size = getContentSize(\r\n this.realSize,\r\n this.dimension === 'rgRow' ? this.element.clientHeight : this.element.clientWidth,\r\n this.clientSize, // content viewport size\r\n );\r\n return (\r\n <Host onScroll={(e: MouseEvent) => this.onScroll(e)}>\r\n <div\r\n style={{\r\n [this.dimension === 'rgRow' ? 'height' : 'width']: `${size}px`,\r\n }}\r\n />\r\n </Host>\r\n );\r\n }\r\n}\r\n",".temp-bg-range {\r\n display: block !important;\r\n position: absolute;\r\n pointer-events: none;\r\n z-index: 9;\r\n border: 1px solid rgb(255, 94, 0);\r\n box-sizing: border-box;\r\n\r\n &.Selection {\r\n border: 1px dashed gray;\r\n }\r\n\r\n > div {\r\n width: 1px;\r\n height: 1px;\r\n position: absolute;\r\n\r\n &.top {\r\n top: -1px;\r\n }\r\n\r\n &.bottom {\r\n bottom: -1px;\r\n }\r\n\r\n &.left {\r\n left: -1px;\r\n }\r\n\r\n &.right {\r\n right: -1px;\r\n }\r\n }\r\n}\r\n","import { Component, Prop, h, Host } from '@stencil/core';\r\nimport throttle from 'lodash/throttle';\r\nimport { TMP_SELECTION_BG_CLASS } from '../../utils/consts';\r\nimport { getCell, styleByCellProps } from '../overlay/selection.utils';\r\nimport { DimensionSettingsState, SelectionStoreState, RangeArea } from '@type';\r\nimport type { Observable } from '../../utils';\r\n\r\n/**\r\n * Temporary range selection component. Shows temporary range selection.\r\n */\r\n@Component({\r\n tag: 'revogr-temp-range',\r\n styleUrl: 'revogr-temp-range-style.scss',\r\n})\r\nexport class RevogrFocus {\r\n /**\r\n * Dynamic stores\r\n */\r\n\r\n /**\r\n * Selection store, shows current selection and focus\r\n */\r\n @Prop() selectionStore: Observable<SelectionStoreState>;\r\n\r\n /**\r\n * Dimension row store\r\n */\r\n @Prop() dimensionRow: Observable<DimensionSettingsState>;\r\n /**\r\n * Dimension column store\r\n */\r\n @Prop() dimensionCol: Observable<DimensionSettingsState>;\r\n\r\n el?: HTMLElement;\r\n private readonly onChange = throttle((e: HTMLElement) => this.doChange(e), 300);\r\n\r\n private doChange(e: HTMLElement) {\r\n e?.scrollIntoView({\r\n block: 'nearest',\r\n inline: 'nearest',\r\n });\r\n }\r\n\r\n componentDidRender() {\r\n if (this.el) {\r\n this.onChange(this.el);\r\n }\r\n }\r\n\r\n render() {\r\n const data = this.selectionStore.get('tempRange');\r\n const type = this.selectionStore.get('tempRangeType');\r\n if (!data) {\r\n return;\r\n }\r\n let directionY = 'bottom';\r\n let derectionX = 'right';\r\n const range = this.getRange();\r\n if (!range) {\r\n return;\r\n }\r\n if (data.y < range.y) {\r\n directionY = 'top';\r\n }\r\n if (data.x < range.x) {\r\n derectionX = 'left';\r\n }\r\n const directionClass = `${derectionX} ${directionY}`;\r\n const cell = getCell(data,\r\n this.dimensionRow.state,\r\n this.dimensionCol.state\r\n );\r\n const styles = styleByCellProps(cell);\r\n const props = {\r\n class: {\r\n [TMP_SELECTION_BG_CLASS]: true,\r\n [type || '']: true,\r\n },\r\n style: styles,\r\n hidden: false\r\n };\r\n return (\r\n <Host {...props}>\r\n <div class={directionClass} ref={(e) => (this.el = e)} />\r\n </Host>\r\n );\r\n }\r\n\r\n private getRange(): RangeArea | null {\r\n const range = this.selectionStore.get('range');\r\n if (range) {\r\n return range;\r\n }\r\n const focus = this.selectionStore.get('focus');\r\n if (!focus) {\r\n return null;\r\n }\r\n return {\r\n ...focus,\r\n x1: focus.x,\r\n y1: focus.y,\r\n };\r\n }\r\n}\r\n"],"names":["h","Host","getSourceItem","getPropertyFromEvent","getItemByPosition","getItemByIndex","RevogrFocus","FOCUS_CLASS","codesLetter","isClear","isTab","isEnterKeyValue","isCopy","isCut","isPaste","isBack","isAll","timeout","RESIZE_INTERVAL","getRange","CELL_HANDLER_CLASS","MOBILE_CLASS","debounce","DIRECTION_LOCK_DISTANCE","ColumnService","SELECTION_BORDER_CLASS","getCellData","getCellEditor","isEditInput","checkIsRightClick","verifyTouchTarget","isRangeSingleCell","ViewportStore","DataStore","calculateRowHeaderSize","ROW_HEADER_TYPE","HEADER_SLOT","LocalScrollTimer","LocalScrollService","getScrollbarSize","getContentSize","throttle","TMP_SELECTION_BG_CLASS"],"mappings":"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"}