@revolist/revogrid 4.6.0-next.1 → 4.6.0-next.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -502,6 +502,8 @@ const OverlaySelection = /*@__PURE__*/ proxyCustomElement(class OverlaySelection
502
502
  this.internalRangeDataApply = createEvent(this, "internalRangeDataApply", 7);
503
503
  this.rangeClipboardCopy = createEvent(this, "rangeClipboardCopy", 7);
504
504
  this.rangeClipboardPaste = createEvent(this, "rangeClipboardPaste", 7);
505
+ this.beforeKeyDown = createEvent(this, "beforekeydown", 7);
506
+ this.beforeKeyUp = createEvent(this, "beforekeyup", 7);
505
507
  this.beforeCellSave = createEvent(this, "before-cell-save", 7);
506
508
  this.keyboardService = null;
507
509
  this.autoFillService = null;
@@ -545,12 +547,17 @@ const OverlaySelection = /*@__PURE__*/ proxyCustomElement(class OverlaySelection
545
547
  /** Get keyboard down from element */
546
548
  onKeyUp(e) {
547
549
  var _a;
550
+ const proxy = this.beforeKeyUp.emit(e);
551
+ if (e.defaultPrevented || proxy.defaultPrevented) {
552
+ return;
553
+ }
548
554
  (_a = this.keyboardService) === null || _a === void 0 ? void 0 : _a.keyUp(e);
549
555
  }
550
556
  /** Get keyboard down from element */
551
557
  onKeyDown(e) {
552
558
  var _a;
553
- if (e.defaultPrevented) {
559
+ const proxy = this.beforeKeyDown.emit(e);
560
+ if (e.defaultPrevented || proxy.defaultPrevented) {
554
561
  return;
555
562
  }
556
563
  (_a = this.keyboardService) === null || _a === void 0 ? void 0 : _a.keyDown(e, this.range);
@@ -1 +1 @@
1
- {"file":"revogr-overlay-selection2.js","mappings":"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","names":["debounce"],"sources":["src/utils/events.ts","src/store/selection/selection.store.service.ts","src/components/overlay/editors/edit.utils.ts","src/components/overlay/keyboard.service.ts","src/components/overlay/autofill.service.tsx","src/components/overlay/clipboard.service.tsx","src/components/overlay/revogr-overlay-style.scss?tag=revogr-overlay-selection","src/components/overlay/revogr-overlay-selection.tsx"],"sourcesContent":["function isTouch(e: MouseEvent | TouchEvent): e is TouchEvent {\n return !!(e as TouchEvent).touches;\n}\n\nexport function verifyTouchTarget(touchEvent?: Touch, focusClass?: string) {\n if (focusClass && touchEvent) {\n if (!(touchEvent.target instanceof Element && touchEvent.target.classList.contains(focusClass))) { \n return false;\n }\n }\n return true;\n}\n\n\nexport function getFromEvent(\n e: MouseEvent | TouchEvent,\n prop: keyof Pick<Touch, 'clientX' | 'clientY' | 'screenX' | 'screenY'>,\n focusClass?: string // for touch events\n): number | null {\n if (isTouch(e)) {\n if (e.touches.length > 0) {\n const touchEvent = e.touches[0];\n if (!verifyTouchTarget(touchEvent, focusClass)) {\n return null;\n }\n return (touchEvent[prop] as number) || 0;\n }\n return null;\n }\n return e[prop] || 0;\n}\n","import { Edition, Observable, Selection } from '../../interfaces';\nimport { getRange } from './selection.helpers';\nimport Cell = Selection.Cell;\nimport Range = Selection.RangeArea;\n\ninterface Config {\n changeRange(range: Range): boolean;\n focus(focus: Cell, end: Cell): boolean;\n}\n\nexport default class SelectionStoreService {\n constructor(public store: Observable<Selection.SelectionStoreState>, private config: Config) {\n this.store = store;\n }\n\n get edited(): Edition.EditCellStore | null {\n return this.store.get('edit');\n }\n\n get focused(): Cell | null {\n return this.store.get('focus');\n }\n\n get ranged(): Range | null {\n return this.store.get('range');\n }\n\n changeRange(range: Range) {\n return this.config.changeRange(range);\n }\n\n focus(cell?: Cell, isMulti = false) {\n if (!cell) {\n return false;\n }\n let end: Cell = cell;\n\n // range edit\n if (isMulti) {\n let start: Cell | null = this.store.get('focus');\n if (start) {\n return this.config.changeRange(getRange(start, end));\n }\n }\n\n // single focus\n return this.config.focus(cell, end);\n }\n}\n","import { EDIT_INPUT_WR } from '../../../utils/consts';\n\n// is edit input\nexport function isEditInput(el?: HTMLElement) {\n return !!el?.closest(`.${EDIT_INPUT_WR}`);\n}\n","import { Observable, Selection } from '../../interfaces';\nimport { getRange } from '../../store/selection/selection.helpers';\nimport SelectionStoreService from '../../store/selection/selection.store.service';\nimport { codesLetter } from '../../utils/keyCodes';\nimport { isClear, isCtrlKey, isEnterKey, isLetterKey } from '../../utils/keyCodes.utils';\nimport { timeout } from '../../utils';\nimport { EventData, getCoordinate, isAfterLast, isBeforeFirst } from './selection.utils';\nimport { RESIZE_INTERVAL } from '../../utils/consts';\n\ntype Config = {\n selectionStoreService: SelectionStoreService;\n selectionStore: Observable<Selection.SelectionStoreState>;\n\n applyEdit(val?: any): void;\n cancelEdit(): void;\n clearCell(): void;\n focusNext(focus: Selection.Cell, next: Partial<Selection.Cell>): boolean;\n getData(): any;\n internalPaste(): void;\n range(range: Selection.RangeArea): boolean;\n selectAll(): void;\n};\n\nconst DIRECTION_CODES: string[] = [\n codesLetter.TAB,\n codesLetter.ARROW_UP,\n codesLetter.ARROW_DOWN,\n codesLetter.ARROW_LEFT,\n codesLetter.ARROW_RIGHT,\n];\nexport class KeyboardService {\n private ctrlDown = false;\n\n constructor(private sv: Config) {}\n\n async keyDown(e: KeyboardEvent, canRange: boolean) {\n if (isCtrlKey(e.keyCode, navigator.platform)) {\n this.ctrlDown = true;\n }\n\n\n // IF EDIT MODE\n if (this.sv.selectionStoreService.edited) {\n switch (e.code) {\n case codesLetter.ESCAPE:\n this.sv.cancelEdit();\n break;\n }\n return;\n }\n\n // IF NOT EDIT MODE\n\n // pressed clear key\n if (this.sv.selectionStoreService.ranged && isClear(e.code)) {\n this.sv.clearCell();\n return;\n }\n\n // below works with focus only\n if (!this.sv.selectionStoreService.focused) {\n return;\n }\n\n // tab key means same as arrow right\n if (codesLetter.TAB === e.code) {\n this.keyChangeSelection(e, canRange);\n return;\n }\n\n // pressed enter\n if (isEnterKey(e.code)) {\n this.sv.applyEdit();\n return;\n }\n\n // copy operation\n if (this.isCopy(e)) {\n return;\n }\n\n // cut operation\n if (this.isCut(e)) {\n return;\n }\n\n // paste operation\n if (this.isPaste(e)) {\n this.sv.internalPaste();\n return;\n }\n\n // select all\n if (this.isAll(e)) {\n if (canRange) {\n this.selectAll(e);\n }\n return;\n }\n\n // pressed letter key\n if (isLetterKey(e.keyCode)) {\n this.sv.applyEdit(e.key);\n return;\n }\n\n // pressed arrow, change selection position\n if (await this.keyChangeSelection(e, canRange)) {\n return;\n }\n }\n\n private selectAll(e: KeyboardEvent) {\n const range = this.sv.selectionStore.get('range');\n const focus = this.sv.selectionStore.get('focus');\n // if no range or focus - do nothing\n if (!range || !focus) {\n return;\n }\n e.preventDefault();\n this.sv.selectAll();\n }\n\n async keyChangeSelection(e: KeyboardEvent, canRange: boolean) {\n const data = this.changeDirectionKey(e, canRange);\n if (!data) {\n return false;\n }\n\n // this interval needed for several cases\n // grid could be resized before next click\n // at this case to avoid screen jump we use this interval\n await timeout(RESIZE_INTERVAL + 30);\n\n const range = this.sv.selectionStore.get('range');\n const focus = this.sv.selectionStore.get('focus');\n return this.keyPositionChange(data.changes, range, focus, data.isMulti);\n }\n\n keyPositionChange(\n changes: Partial<Selection.Cell>,\n range?: Selection.RangeArea,\n focus?: Selection.Cell,\n isMulti = false\n ) {\n if (!range || !focus) {\n return false;\n }\n const data = getCoordinate(range, focus, changes, isMulti);\n if (!data) {\n return false;\n }\n if (isMulti) {\n const eData: EventData = this.sv.getData();\n if (isAfterLast(data.end, eData) || isBeforeFirst(data.start)) {\n return false;\n }\n const range = getRange(data.start, data.end);\n return this.sv.range(range);\n }\n return this.sv.focusNext(data.start, changes);\n }\n\n keyUp(e: KeyboardEvent): void {\n if (isCtrlKey(e.keyCode, navigator.platform)) {\n this.ctrlDown = false;\n }\n }\n isCut(e: KeyboardEvent): boolean {\n return this.ctrlDown && e.code == codesLetter.X;\n }\n isCopy(e: KeyboardEvent): boolean {\n return this.ctrlDown && e.code == codesLetter.C;\n }\n isPaste(e: KeyboardEvent): boolean {\n return this.ctrlDown && e.code == codesLetter.V;\n }\n isAll(e: KeyboardEvent): boolean {\n return this.ctrlDown && e.code == codesLetter.A;\n }\n /** Monitor key direction changes */\n changeDirectionKey(e: KeyboardEvent, canRange: boolean): { changes: Partial<Selection.Cell>; isMulti?: boolean } | void {\n const isMulti = canRange && e.shiftKey;\n if (DIRECTION_CODES.includes(e.code)) {\n e.preventDefault();\n }\n switch (e.code) {\n case codesLetter.ARROW_UP:\n return { changes: { y: -1 }, isMulti };\n case codesLetter.ARROW_DOWN:\n return { changes: { y: 1 }, isMulti };\n case codesLetter.ARROW_LEFT:\n return { changes: { x: -1 }, isMulti };\n case codesLetter.TAB:\n case codesLetter.ARROW_RIGHT:\n return { changes: { x: 1 }, isMulti };\n }\n }\n}\n","import debounce from 'lodash/debounce';\nimport { DebouncedFunc } from 'lodash';\n\nimport { h } from '@stencil/core';\nimport { CELL_HANDLER_CLASS, MOBILE_CLASS } from '../../utils/consts';\nimport { Observable, Selection, RevoGrid, Edition } from '../../interfaces';\nimport { EventData, getCell, getCurrentCell, isAfterLast } from './selection.utils';\nimport { getRange } from '../../store/selection/selection.helpers';\nimport SelectionStoreService from '../../store/selection/selection.store.service';\nimport ColumnService from '../data/columnService';\nimport { DataSourceState, getSourceItem } from '../../store/dataSource/data.store';\nimport { getFromEvent } from '../../utils/events';\n\ntype Config = {\n selectionStoreService: SelectionStoreService;\n dimensionRow: Observable<RevoGrid.DimensionSettingsState>;\n dimensionCol: Observable<RevoGrid.DimensionSettingsState>;\n columnService: ColumnService;\n dataStore: Observable<DataSourceState<RevoGrid.DataType, RevoGrid.DimensionRows>>;\n\n setTempRange(e: Selection.TempRange | null): Event;\n selectionChanged(e: Selection.ChangedRange): Event;\n rangeCopy(e: Selection.ChangedRange): Event;\n rangeDataApply(e: Edition.BeforeRangeSaveDataDetails): CustomEvent;\n setRange(e: Selection.RangeArea): boolean;\n clearRangeDataApply(e: {\n range: Selection.RangeArea\n }): CustomEvent<{\n range: Selection.RangeArea\n }>;\n\n getData(): any;\n};\n\nenum AutoFillType {\n selection = 'Selection',\n autoFill = 'AutoFill',\n}\n\nexport class AutoFillService {\n private autoFillType: AutoFillType | null = null;\n private autoFillInitial: Selection.Cell | null = null;\n private autoFillStart: Selection.Cell | null = null;\n private autoFillLast: Selection.Cell | null = null;\n\n private onMouseMoveAutofill: DebouncedFunc<(e: MouseEvent | TouchEvent, data: EventData) => void>;\n\n constructor(private sv: Config) {}\n\n /**\n * Render autofill box\n * @param range\n * @param selectionFocus\n */\n renderAutofill(range: Selection.RangeArea, selectionFocus: Selection.Cell) {\n let handlerStyle;\n if (range) {\n handlerStyle = getCell(range, this.sv.dimensionRow.state, this.sv.dimensionCol.state);\n } else {\n handlerStyle = getCell(\n {\n ...selectionFocus,\n x1: selectionFocus.x,\n y1: selectionFocus.y,\n },\n this.sv.dimensionRow.state,\n this.sv.dimensionCol.state,\n );\n }\n return (\n <div\n class={{\n [CELL_HANDLER_CLASS]: true,\n [MOBILE_CLASS]: true,\n }}\n style={{ left: `${handlerStyle.right}px`, top: `${handlerStyle.bottom}px` }}\n onMouseDown={(e: MouseEvent) => this.autoFillHandler(e)}\n onTouchStart={(e: TouchEvent) => this.autoFillHandler(e)}\n />\n );\n }\n\n private autoFillHandler(e: MouseEvent | TouchEvent, type = AutoFillType.autoFill) {\n let target: Element | null = null;\n if (e.target instanceof Element) {\n target = e.target;\n }\n if (!target) {\n return;\n }\n this.selectionStart(target, this.sv.getData(), type);\n e.preventDefault();\n }\n\n get isAutoFill() {\n return !!this.autoFillType;\n }\n\n /** Process mouse move events */\n selectionMouseMove(e: MouseEvent | TouchEvent) {\n // initiate mouse move debounce if not present\n if (!this.onMouseMoveAutofill) {\n this.onMouseMoveAutofill = debounce((e: MouseEvent | TouchEvent, data: EventData) => this.doAutofillMouseMove(e, data), 5);\n }\n if (this.isAutoFill) {\n this.onMouseMoveAutofill(e, this.sv.getData());\n }\n }\n\n private getFocus() {\n let focus = this.sv.selectionStoreService.focused;\n const range = this.sv.selectionStoreService.ranged;\n // there was an issue that it was taking last cell from range but focus was out\n if (!focus && range) {\n focus = { x: range.x, y: range.y };\n }\n return focus || null;\n }\n\n /**\n * Autofill logic:\n * on mouse move apply based on previous direction (if present)\n */\n private doAutofillMouseMove(event: MouseEvent | TouchEvent, data: EventData) {\n // if no initial - not started\n if (!this.autoFillInitial) {\n return;\n }\n const x = getFromEvent(event, 'clientX', MOBILE_CLASS);\n const y = getFromEvent(event, 'clientY', MOBILE_CLASS);\n // skip touch\n if (x === null || y === null) {\n return;\n }\n const current = getCurrentCell({ x, y }, data);\n\n // first time or direction equal to start(same as first time)\n if (!this.autoFillLast) {\n if (!this.autoFillLast) {\n this.autoFillLast = this.autoFillStart;\n }\n }\n\n // check if not the latest, if latest - do nothing\n if (isAfterLast(current, data)) {\n return;\n }\n this.autoFillLast = current;\n\n const isSame = current.x === this.autoFillInitial.x && current.y === this.autoFillInitial.y;\n // if same as initial - clear\n if (isSame) {\n this.sv.setTempRange(null);\n } else {\n this.sv.setTempRange({\n area: getRange(this.autoFillInitial, this.autoFillLast),\n type: this.autoFillType,\n });\n }\n }\n\n /**\n * Range selection started\n * Mode @param type:\n * Can be triggered from MouseDown selection on element\n * Or can be triggered on corner square drag\n */\n selectionStart(target: Element, data: EventData, type = AutoFillType.selection) {\n /** Get cell by autofill element */\n const { top, left } = target.getBoundingClientRect();\n this.autoFillInitial = this.getFocus();\n this.autoFillType = type;\n this.autoFillStart = getCurrentCell({ x: left, y: top }, data);\n }\n\n /**\n * Clear current range selection\n * on mouse up and mouse leave events\n */ \n clearAutoFillSelection() {\n // Apply autofill values on mouse up if present\n if (this.autoFillInitial) {\n // Get latest\n this.autoFillInitial = this.getFocus();\n\n // Apply range data if present\n if (this.autoFillType === AutoFillType.autoFill) {\n const range = getRange(this.autoFillInitial, this.autoFillLast);\n if (range) {\n const {\n defaultPrevented: stopApply,\n detail: { range: newRange }\n } = this.sv.clearRangeDataApply({\n range,\n });\n if (!stopApply) {\n this.applyRangeWithData(newRange);\n } else {\n // if prevented - clear temp range\n this.sv.setTempRange(null);\n }\n }\n } else {\n this.applyRangeOnly(this.autoFillInitial, this.autoFillLast);\n }\n }\n\n this.autoFillType = null;\n this.autoFillInitial = null;\n this.autoFillLast = null;\n this.autoFillStart = null;\n }\n\n /** Trigger range apply events and handle responses */\n onRangeApply(data: RevoGrid.DataLookup, range: Selection.RangeArea): void {\n const models: RevoGrid.DataLookup = {};\n for (let rowIndex in data) {\n models[rowIndex] = getSourceItem(this.sv.dataStore, parseInt(rowIndex, 10));\n }\n const {\n defaultPrevented: stopRange,\n detail,\n } = this.sv.rangeDataApply({\n data,\n models,\n type: this.sv.dataStore.get('type'),\n });\n if (!stopRange) {\n this.sv.columnService.applyRangeData(detail.data);\n }\n this.sv.setRange(range);\n }\n\n /** Apply range and copy data during range application */\n private applyRangeWithData(newRange: Selection.RangeArea) {\n const oldRange = this.sv.selectionStoreService.ranged;\n const rangeData: Selection.ChangedRange = {\n type: this.sv.dataStore.get('type'),\n newData: {},\n mapping: {},\n newRange,\n oldRange,\n };\n const { mapping, changed } = this.sv.columnService.getRangeData(rangeData, this.sv.columnService.columns);\n rangeData.newData = changed;\n rangeData.mapping = mapping;\n let e = this.sv.selectionChanged(rangeData);\n\n // if default prevented - clear range\n if (e.defaultPrevented) {\n this.sv.setTempRange(null);\n return;\n }\n\n e = this.sv.rangeCopy(rangeData);\n if (e.defaultPrevented) {\n this.sv.setRange(newRange);\n return;\n }\n this.onRangeApply(rangeData.newData, newRange);\n }\n\n /**\n * Update range selection only,\n * no data change (mouse selection)\n */\n private applyRangeOnly(start?: Selection.Cell, end?: Selection.Cell) {\n // no changes to apply\n if (!start || !end) {\n return;\n }\n\n const newRange = getRange(start, end);\n this.sv.setRange(newRange);\n }\n}\n","import { h } from '@stencil/core';\nimport SelectionStoreService from '../../store/selection/selection.store.service';\nimport { Observable, RevoGrid, Selection } from '../../interfaces';\nimport { getRange } from '../../store/selection/selection.helpers';\nimport ColumnService from '../data/columnService';\nimport { DataSourceState } from '../../store/dataSource/data.store';\n\ntype Config = {\n selectionStoreService: SelectionStoreService;\n columnService: ColumnService;\n dataStore: Observable<DataSourceState<RevoGrid.DataType, RevoGrid.DimensionRows>>;\n rangeApply(data: RevoGrid.DataLookup, range: Selection.RangeArea): void;\n rangeCopy(range: Selection.RangeArea): any;\n rangeClear(): void;\n beforeCopy(range: Selection.RangeArea): CustomEvent;\n beforePaste(data: RevoGrid.DataLookup, range: Selection.RangeArea): CustomEvent;\n};\n\nexport class ClipboardService {\n private clipboard: HTMLRevogrClipboardElement;\n constructor(private sv: Config) {}\n\n renderClipboard(readonly = false) {\n return <revogr-clipboard\n readonly={readonly}\n onCopyRegion={e => this.onCopy(e.detail)}\n onClearRegion={() => this.sv.rangeClear()}\n ref={e => (this.clipboard = e)}\n onPasteRegion={e => this.onPaste(e.detail)} />;\n }\n private getRegion() {\n const focus = this.sv.selectionStoreService.focused;\n let range = this.sv.selectionStoreService.ranged;\n if (!range) {\n range = getRange(focus, focus);\n }\n return range;\n }\n private onCopy(e: DataTransfer) {\n const range = this.getRegion();\n const canCopyEvent = this.sv.beforeCopy(range);\n if (canCopyEvent.defaultPrevented) {\n return false;\n }\n const data = this.sv.rangeCopy(range);\n this.clipboard.doCopy(e, data);\n return true;\n }\n\n private onPaste(data: string[][]) {\n const focus = this.sv.selectionStoreService.focused;\n const isEditing = this.sv.selectionStoreService.edited !== null;\n if (!focus || isEditing) {\n return;\n }\n let { changed, range } = this.sv.columnService.getTransformedDataToApply(focus, data);\n const { defaultPrevented: canPaste } = this.sv.beforePaste(changed, range);\n if (canPaste) {\n return;\n }\n this.sv.rangeApply(changed, range);\n }\n}\n","@mixin autofill-handle($handler-size: 14px, $icon-size: 10px) {\n .autofill-handle {\n position: absolute;\n width: $handler-size;\n height: $handler-size;\n margin-left: -$handler-size + 1;\n margin-top: -$handler-size + 1;\n z-index: 10;\n cursor: crosshair;\n\n &::before {\n content: '';\n position: absolute;\n right: 0;\n bottom: 0;\n width: $icon-size;\n height: $icon-size;\n background: $selection-border;\n border: 1px solid white;\n box-sizing: border-box;\n }\n }\n}\n\nrevogr-overlay-selection {\n display: block;\n position: relative;\n width: 100%;\n\n\n @include autofill-handle;\n\n &.mobile {\n @include autofill-handle(30px, 12px);\n }\n\n .selection-border-range {\n position: absolute;\n pointer-events: none;\n z-index: 9;\n\n .range-handlers {\n height: 100%;\n background-color: transparent;\n width: calc(50% + (50% / 2));\n max-width: 50px;\n min-width: 20px;\n left: 50%;\n transform: translateX(-50%);\n position: absolute;\n\n $btn-size: 20px;\n $handler-w: 15px;\n $handler-h: 5px;\n \n > span {\n pointer-events: auto;\n height: $btn-size;\n width: $btn-size;\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n\n\n &:before, &:after {\n position: absolute;\n border-radius: 5px;\n width: $handler-w;\n height: $handler-h;\n left: 50%;\n transform: translateX(-50%);\n background-color: rgba(black, 20%);\n }\n &:first-child {\n top: -($handler-h + 2px);\n &:before{\n content: '';\n top: 0;\n }\n }\n &:last-child {\n bottom: -($handler-h + 2px);\n &:after{\n content: '';\n bottom: 0;\n }\n }\n }\n }\n @include selection();\n }\n\n revogr-edit {\n z-index: 10;\n }\n}\n","import { Component, Event, EventEmitter, h, Host, Listen, Prop, VNode, Element, Watch } from '@stencil/core';\n\nimport { AllDimensionType, ApplyFocusEvent, FocusRenderEvent, Edition, Observable, RevoGrid, Selection, DragStartEvent } from '../../interfaces';\nimport ColumnService from '../data/columnService';\nimport SelectionStoreService from '../../store/selection/selection.store.service';\nimport { codesLetter } from '../../utils/keyCodes';\nimport { MOBILE_CLASS, SELECTION_BORDER_CLASS } from '../../utils/consts';\nimport { DataSourceState } from '../../store/dataSource/data.store';\nimport { isRangeSingleCell } from '../../store/selection/selection.helpers';\nimport { getCurrentCell, getElStyle } from './selection.utils';\nimport { isEditInput } from './editors/edit.utils';\nimport { KeyboardService } from './keyboard.service';\nimport { AutoFillService } from './autofill.service';\nimport { ClipboardService } from './clipboard.service';\nimport { getFromEvent, verifyTouchTarget } from '../../utils/events';\n\n@Component({\n tag: 'revogr-overlay-selection',\n styleUrl: 'revogr-overlay-style.scss',\n})\nexport class OverlaySelection {\n\n @Element() element: HTMLElement;\n\n // --------------------------------------------------------------------------\n //\n // Properties\n //\n // --------------------------------------------------------------------------\n\n /**\n * If readonly mode enables\n */\n @Prop() readonly: boolean;\n /**\n * Range selection mode\n */\n @Prop() range: boolean;\n /**\n * Enable revogr-order-editor component (read more in revogr-order-editor component)\n * Allows D&D\n */\n @Prop() canDrag: boolean;\n\n /**\n * Enable revogr-clipboard component (read more in revogr-clipboard component)\n * Allows copy/paste\n */\n @Prop() useClipboard: boolean;\n\n // --------------------------------------------------------------------------\n //\n // Dynamic stores\n //\n // --------------------------------------------------------------------------\n @Prop() selectionStore: Observable<Selection.SelectionStoreState>;\n @Prop() dimensionRow: Observable<RevoGrid.DimensionSettingsState>;\n @Prop() dimensionCol: Observable<RevoGrid.DimensionSettingsState>;\n\n // --------------------------------------------------------------------------\n //\n // Static stores, not expected to change during component lifetime\n //\n // --------------------------------------------------------------------------\n\n /**\n * Row data store\n */\n @Prop() dataStore: Observable<DataSourceState<RevoGrid.DataType, RevoGrid.DimensionRows>>;\n\n /**\n * Column data store\n */\n @Prop() colData: Observable<DataSourceState<RevoGrid.ColumnRegular, RevoGrid.DimensionCols>>;\n /**\n * Last cell position\n */\n @Prop() lastCell: Selection.Cell;\n /**\n * Custom editors register\n */\n @Prop() editors: Edition.Editors;\n /**\n * If true applys changes when cell closes if not Escape\n */\n @Prop() applyChangesOnClose: boolean = false;\n /**\n * Additional data to pass to renderer\n */\n @Prop() additionalData: any;\n\n /**\n * Is mobile view mode\n */\n @Prop() isMobileDevice: boolean;\n\n // --------------------------------------------------------------------------\n //\n // Events\n //\n // --------------------------------------------------------------------------\n\n /**\n * Before clipboard copy happened\n */\n @Event({ cancelable: true }) internalCopy: EventEmitter;\n /**\n * Before paste happened\n */\n @Event({ cancelable: true }) internalPaste: EventEmitter;\n\n @Event({ cancelable: true }) internalCellEdit: EventEmitter<Edition.BeforeSaveDataDetails>;\n @Event({ cancelable: true }) beforeFocusCell: EventEmitter<Edition.BeforeSaveDataDetails>;\n\n /**\n * Set edit cell\n */\n @Event() setEdit: EventEmitter<Edition.BeforeEdit>;\n @Event({ eventName: 'before-apply-range' }) beforeApplyRange: EventEmitter<FocusRenderEvent>;\n /**\n * Before range selection applied\n */\n @Event({ eventName: 'before-set-range' }) beforeSetRange: EventEmitter;\n @Event({ eventName: 'before-edit-render' }) beforeEditRender: EventEmitter<FocusRenderEvent>;\n @Event() setRange: EventEmitter<Selection.RangeArea & { type: RevoGrid.MultiDimensionType }>;\n @Event({ eventName: 'selectall' }) selectAll: EventEmitter;\n /**\n * Used for editors support when close requested\n */\n @Event() cancelEdit: EventEmitter;\n @Event() setTempRange: EventEmitter<Selection.TempRange | null>;\n\n @Event() applyFocus: EventEmitter<FocusRenderEvent>;\n @Event() focusCell: EventEmitter<ApplyFocusEvent>;\n /** Range data apply */\n @Event() beforeRangeDataApply: EventEmitter<FocusRenderEvent>;\n /** Selection range changed */\n @Event({ cancelable: true }) internalSelectionChanged: EventEmitter<Selection.ChangedRange>;\n /** Selection range changed */\n @Event({ cancelable: true, bubbles: true }) beforeRangeCopyApply: EventEmitter<Selection.ChangedRange>;\n\n /** Range data apply */\n @Event({ cancelable: true }) internalRangeDataApply: EventEmitter<Edition.BeforeRangeSaveDataDetails>;\n /** Range copy */\n @Event({ cancelable: true }) rangeClipboardCopy: EventEmitter;\n @Event({ cancelable: true }) rangeClipboardPaste: EventEmitter;\n\n protected columnService: ColumnService;\n\n protected selectionStoreService: SelectionStoreService;\n private keyboardService: KeyboardService | null = null;\n private autoFillService: AutoFillService | null = null;\n private clipboardService: ClipboardService | null = null;\n private orderEditor: HTMLRevogrOrderEditorElement;\n private revogrEdit: HTMLRevogrEditElement | null = null;\n /**\n * Runs before cell save\n * Can be used to override or cancel original save\n */\n @Event({ eventName: 'before-cell-save', cancelable: true }) beforeCellSave: EventEmitter;\n // --------------------------------------------------------------------------\n //\n // Listeners\n //\n // --------------------------------------------------------------------------\n @Listen('touchmove', { target: 'document' })\n @Listen('mousemove', { target: 'document' })\n onMouseMove(e: MouseEvent | TouchEvent) {\n if (this.selectionStoreService.focused) {\n this.autoFillService.selectionMouseMove(e);\n }\n }\n\n\n /** Action finished inside of the document */\n /** Pointer left document, clear any active operation */\n @Listen('touchend', { target: 'document' })\n @Listen('mouseup', { target: 'document' })\n @Listen('mouseleave', { target: 'document' })\n onMouseUp() {\n this.autoFillService.clearAutoFillSelection();\n }\n\n /** Row drag started */\n @Listen('dragStartCell') onCellDrag(e: CustomEvent<DragStartEvent>) {\n this.orderEditor?.dragStart(e.detail);\n }\n\n /** Get keyboard down from element */\n @Listen('keyup', { target: 'document' }) onKeyUp(e: KeyboardEvent) {\n this.keyboardService?.keyUp(e);\n }\n\n /** Get keyboard down from element */\n @Listen('keydown', { target: 'document' }) onKeyDown(e: KeyboardEvent) {\n if (e.defaultPrevented) {\n return;\n }\n this.keyboardService?.keyDown(e, this.range);\n }\n\n // selection & keyboard\n @Watch('selectionStore') selectionServiceSet(s: Observable<Selection.SelectionStoreState>) {\n this.selectionStoreService = new SelectionStoreService(s, {\n changeRange: range => this.triggerRangeEvent(range),\n focus: (focus, end) => this.doFocus(focus, end),\n });\n\n this.keyboardService = new KeyboardService({\n selectionStoreService: this.selectionStoreService,\n selectionStore: s,\n range: r => this.selectionStoreService.changeRange(r),\n focusNext: (f, next) => this.doFocus(f, f, next),\n applyEdit: val => {\n if (this.readonly) {\n return;\n }\n this.doEdit(val);\n },\n cancelEdit: async () => {\n await this.revogrEdit.cancel();\n this.closeEdit();\n },\n clearCell: () => !this.readonly && this.clearCell(),\n internalPaste: () => !this.readonly && this.internalPaste.emit(),\n getData: () => this.getData(),\n selectAll: () => this.selectAll.emit(),\n });\n this.createAutoFillService();\n this.createClipboardService();\n }\n // autofill\n @Watch('dimensionRow')\n @Watch('dimensionCol')\n createAutoFillService() {\n this.autoFillService = new AutoFillService({\n selectionStoreService: this.selectionStoreService,\n dimensionRow: this.dimensionRow,\n dimensionCol: this.dimensionCol,\n columnService: this.columnService,\n dataStore: this.dataStore,\n\n clearRangeDataApply: e =>\n this.beforeRangeDataApply.emit({\n ...e,\n ...this.types,\n }),\n setTempRange: e => this.setTempRange.emit(e),\n selectionChanged: e => this.internalSelectionChanged.emit(e),\n rangeCopy: e => this.beforeRangeCopyApply.emit(e),\n rangeDataApply: e => this.internalRangeDataApply.emit(e),\n\n setRange: e => this.triggerRangeEvent(e),\n getData: () => this.getData(),\n });\n }\n\n // columns\n @Watch('dataStore')\n @Watch('colData')\n columnServiceSet() {\n this.columnService?.destroy();\n this.columnService = new ColumnService(this.dataStore, this.colData);\n this.createAutoFillService();\n this.createClipboardService();\n }\n\n // clipboard\n createClipboardService() {\n this.clipboardService = new ClipboardService({\n selectionStoreService: this.selectionStoreService,\n columnService: this.columnService,\n dataStore: this.dataStore,\n rangeApply: (d, r) => this.autoFillService.onRangeApply(d, r),\n rangeCopy: range => {\n if (!range) {\n return undefined;\n }\n const { data, mapping } = this.columnService.copyRangeArray(range, this.dataStore);\n const event = this.rangeClipboardCopy.emit({\n range,\n data,\n mapping,\n ...this.types,\n });\n if (event.defaultPrevented) {\n return undefined;\n }\n return event.detail.data;\n },\n rangeClear: () => !this.readonly && this.clearCell(),\n beforeCopy: range => this.internalCopy.emit(range),\n beforePaste: (data, range) => {\n return this.rangeClipboardPaste.emit({\n data,\n range,\n ...this.types,\n });\n },\n });\n }\n\n connectedCallback() {\n this.columnServiceSet();\n this.selectionServiceSet(this.selectionStore);\n }\n\n disconnectedCallback() {\n this.columnService?.destroy();\n }\n\n private renderRange(range: Selection.RangeArea) {\n const style = getElStyle(range, this.dimensionRow.state, this.dimensionCol.state);\n return [\n <div class={SELECTION_BORDER_CLASS} style={style}>\n {this.isMobileDevice && <div class=\"range-handlers\"><span class={MOBILE_CLASS}></span><span class={MOBILE_CLASS}></span></div>}\n </div>\n ];\n }\n\n private renderEditCell() {\n // if can edit\n const editCell = this.selectionStore.get('edit');\n if (this.readonly || !editCell) {\n return null;\n }\n const val = editCell.val || this.columnService.getCellData(editCell.y, editCell.x);\n const editable = {\n ...editCell,\n ...this.columnService.getSaveData(editCell.y, editCell.x, val),\n };\n const renderEvent = this.beforeEditRender.emit({\n range: {\n ...editCell,\n x1: editCell.x,\n y1: editCell.y,\n },\n ...this.types,\n });\n if (renderEvent.defaultPrevented) {\n return null;\n }\n\n const {\n detail: { range },\n } = renderEvent;\n const style = getElStyle(range, this.dimensionRow.state, this.dimensionCol.state);\n return (\n <revogr-edit\n ref={el => {\n this.revogrEdit = el;\n }}\n onCellEdit={e => {\n const saveEv = this.beforeCellSave.emit(e.detail);\n if (!saveEv.defaultPrevented) {\n this.cellEdit(saveEv.detail);\n }\n\n // if not clear navigate to next cell after edit\n if (!saveEv.detail.preventFocus) {\n this.focusNext();\n }\n }}\n onCloseEdit={e => this.closeEdit(e)}\n editCell={editable}\n saveOnClose={this.applyChangesOnClose}\n column={this.columnService.columns[editCell.x]}\n editor={this.columnService.getCellEditor(editCell.y, editCell.x, this.editors)}\n additionalData={this.additionalData}\n style={style}\n />\n );\n }\n\n render() {\n const els: VNode[] = [];\n const editCell = this.renderEditCell();\n if (editCell) {\n els.push(editCell);\n } else {\n const range = this.selectionStoreService.ranged;\n const selectionFocus = this.selectionStoreService.focused;\n if ((range || selectionFocus) && this.useClipboard) {\n els.push(this.clipboardService.renderClipboard(this.readonly));\n }\n\n if (range) {\n els.push(...this.renderRange(range));\n }\n if (selectionFocus && !this.readonly && this.range) {\n els.push(this.autoFillService.renderAutofill(range, selectionFocus));\n }\n if (this.canDrag) {\n els.push(\n <revogr-order-editor\n ref={e => (this.orderEditor = e)}\n dataStore={this.dataStore}\n dimensionRow={this.dimensionRow}\n dimensionCol={this.dimensionCol}\n parent={this.element}\n onInternalRowDragStart={e => this.onRowDragStart(e)}\n />,\n );\n }\n }\n return (\n <Host\n class={{ mobile: this.isMobileDevice }}\n // run edit on dblclick\n onDblClick={(e: MouseEvent) => {\n // if dblclick prevented outside edit will not start\n if (!e.defaultPrevented) {\n this.doEdit();\n }\n }}\n onMouseDown={(e: MouseEvent) => this.onElementMouseDown(e)}\n onTouchStart={(e: TouchEvent) => this.onElementMouseDown(e, true)}>\n {els}\n <slot name=\"data\" />\n </Host>\n );\n }\n\n private doFocus(focus: Selection.Cell, end: Selection.Cell, next?: Partial<Selection.Cell>) {\n const { defaultPrevented } = this.beforeFocusCell.emit(this.columnService.getSaveData(focus.y, focus.x));\n if (defaultPrevented) {\n return false;\n }\n const evData = {\n range: {\n ...focus,\n x1: end.x,\n y1: end.y,\n },\n next,\n ...this.types,\n };\n const applyEvent = this.applyFocus.emit(evData);\n if (applyEvent.defaultPrevented) {\n return false;\n }\n const { range } = applyEvent.detail;\n return !this.focusCell.emit({\n focus: {\n x: range.x,\n y: range.y,\n },\n end: {\n x: range.x1,\n y: range.y1,\n },\n ...applyEvent.detail,\n }).defaultPrevented;\n }\n\n private triggerRangeEvent(range: Selection.RangeArea) {\n const type = this.types.rowType;\n const applyEvent = this.beforeApplyRange.emit({\n range: { ...range },\n ...this.types,\n });\n if (applyEvent.defaultPrevented) {\n return false;\n }\n const data = this.columnService.getRangeTransformedToProps(applyEvent.detail.range, this.dataStore);\n let e = this.beforeSetRange.emit(data);\n e = this.setRange.emit({ ...applyEvent.detail.range, type });\n if (e.defaultPrevented) {\n return false;\n }\n return !e.defaultPrevented;\n }\n\n protected onElementMouseDown(e: MouseEvent | TouchEvent, touch = false) {\n // Ignore focus if clicked input\n if (isEditInput(e.target as HTMLElement | undefined)) {\n return;\n }\n const data = this.getData();\n if (e.defaultPrevented) {\n return;\n }\n const x = getFromEvent(e, 'clientX');\n const y = getFromEvent(e, 'clientY');\n // skip touch\n if (x === null || y === null) {\n return;\n }\n // Regular cell click\n const focusCell = getCurrentCell({ x, y }, data);\n this.selectionStoreService.focus(focusCell, this.range && e.shiftKey);\n\n // Initiate autofill selection\n if (this.range) {\n this.autoFillService.selectionStart(e.target as HTMLElement, data);\n if (!touch) {\n e.preventDefault();\n } else if (verifyTouchTarget((e as TouchEvent).touches[0], MOBILE_CLASS)) {\n e.preventDefault();\n }\n }\n }\n\n /** \n * Start cell editing\n */\n protected doEdit(val = '') {\n if (this.canEdit()) {\n const editCell = this.selectionStore.get('focus');\n const data = this.columnService.getSaveData(editCell.y, editCell.x);\n this.setEdit?.emit({\n ...data,\n val,\n });\n }\n }\n\n /**\n * Close editor event triggered\n * @param details - if requires focus next\n */\n private closeEdit(e?: CustomEvent<boolean>) {\n this.cancelEdit.emit();\n if (e?.detail) {\n this.focusNext();\n }\n }\n\n /** Edit finished, close cell and save */\n protected cellEdit(e: Edition.SaveDataDetails) {\n const dataToSave = this.columnService.getSaveData(e.rgRow, e.rgCol, e.val);\n this.internalCellEdit.emit(dataToSave);\n }\n\n private async focusNext() {\n const canFocus = await this.keyboardService.keyChangeSelection(\n new KeyboardEvent('keydown', {\n code: codesLetter.ARROW_DOWN,\n }),\n this.range,\n );\n if (!canFocus) {\n this.closeEdit();\n }\n }\n\n protected clearCell() {\n if (this.selectionStoreService.ranged && !isRangeSingleCell(this.selectionStoreService.ranged)) {\n const data = this.columnService.getRangeStaticData(this.selectionStoreService.ranged, '');\n this.autoFillService.onRangeApply(data, this.selectionStoreService.ranged);\n } else if (this.canEdit()) {\n const focused = this.selectionStoreService.focused;\n const cell = this.columnService.getSaveData(focused.y, focused.x);\n this.cellEdit({\n rgRow: focused.y,\n rgCol: focused.x,\n val: '',\n type: cell.type,\n prop: cell.prop,\n });\n }\n }\n\n private onRowDragStart({ detail }: CustomEvent<{ cell: Selection.Cell; text: string }>) {\n detail.text = this.columnService.getCellData(detail.cell.y, detail.cell.x);\n }\n\n /** Check if edit possible */\n protected canEdit() {\n if (this.readonly) {\n return false;\n }\n const editCell = this.selectionStoreService.focused;\n return editCell && !this.columnService?.isReadOnly(editCell.y, editCell.x);\n }\n\n get types(): AllDimensionType {\n return {\n rowType: this.dataStore.get('type'),\n colType: this.columnService.type,\n };\n }\n\n /** Collect data from element */\n protected getData() {\n return {\n el: this.element,\n rows: this.dimensionRow.state,\n cols: this.dimensionCol.state,\n lastCell: this.lastCell,\n };\n }\n}\n"],"version":3}
1
+ {"file":"revogr-overlay-selection2.js","mappings":"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","names":["debounce"],"sources":["src/utils/events.ts","src/store/selection/selection.store.service.ts","src/components/overlay/editors/edit.utils.ts","src/components/overlay/keyboard.service.ts","src/components/overlay/autofill.service.tsx","src/components/overlay/clipboard.service.tsx","src/components/overlay/revogr-overlay-style.scss?tag=revogr-overlay-selection","src/components/overlay/revogr-overlay-selection.tsx"],"sourcesContent":["function isTouch(e: MouseEvent | TouchEvent): e is TouchEvent {\n return !!(e as TouchEvent).touches;\n}\n\nexport function verifyTouchTarget(touchEvent?: Touch, focusClass?: string) {\n if (focusClass && touchEvent) {\n if (!(touchEvent.target instanceof Element && touchEvent.target.classList.contains(focusClass))) { \n return false;\n }\n }\n return true;\n}\n\n\nexport function getFromEvent(\n e: MouseEvent | TouchEvent,\n prop: keyof Pick<Touch, 'clientX' | 'clientY' | 'screenX' | 'screenY'>,\n focusClass?: string // for touch events\n): number | null {\n if (isTouch(e)) {\n if (e.touches.length > 0) {\n const touchEvent = e.touches[0];\n if (!verifyTouchTarget(touchEvent, focusClass)) {\n return null;\n }\n return (touchEvent[prop] as number) || 0;\n }\n return null;\n }\n return e[prop] || 0;\n}\n","import { Edition, Observable, Selection } from '../../interfaces';\nimport { getRange } from './selection.helpers';\nimport Cell = Selection.Cell;\nimport Range = Selection.RangeArea;\n\ninterface Config {\n changeRange(range: Range): boolean;\n focus(focus: Cell, end: Cell): boolean;\n}\n\nexport default class SelectionStoreService {\n constructor(public store: Observable<Selection.SelectionStoreState>, private config: Config) {\n this.store = store;\n }\n\n get edited(): Edition.EditCellStore | null {\n return this.store.get('edit');\n }\n\n get focused(): Cell | null {\n return this.store.get('focus');\n }\n\n get ranged(): Range | null {\n return this.store.get('range');\n }\n\n changeRange(range: Range) {\n return this.config.changeRange(range);\n }\n\n focus(cell?: Cell, isMulti = false) {\n if (!cell) {\n return false;\n }\n let end: Cell = cell;\n\n // range edit\n if (isMulti) {\n let start: Cell | null = this.store.get('focus');\n if (start) {\n return this.config.changeRange(getRange(start, end));\n }\n }\n\n // single focus\n return this.config.focus(cell, end);\n }\n}\n","import { EDIT_INPUT_WR } from '../../../utils/consts';\n\n// is edit input\nexport function isEditInput(el?: HTMLElement) {\n return !!el?.closest(`.${EDIT_INPUT_WR}`);\n}\n","import { Observable, Selection } from '../../interfaces';\nimport { getRange } from '../../store/selection/selection.helpers';\nimport SelectionStoreService from '../../store/selection/selection.store.service';\nimport { codesLetter } from '../../utils/keyCodes';\nimport { isClear, isCtrlKey, isEnterKey, isLetterKey } from '../../utils/keyCodes.utils';\nimport { timeout } from '../../utils';\nimport { EventData, getCoordinate, isAfterLast, isBeforeFirst } from './selection.utils';\nimport { RESIZE_INTERVAL } from '../../utils/consts';\n\ntype Config = {\n selectionStoreService: SelectionStoreService;\n selectionStore: Observable<Selection.SelectionStoreState>;\n\n applyEdit(val?: any): void;\n cancelEdit(): void;\n clearCell(): void;\n focusNext(focus: Selection.Cell, next: Partial<Selection.Cell>): boolean;\n getData(): any;\n internalPaste(): void;\n range(range: Selection.RangeArea): boolean;\n selectAll(): void;\n};\n\nconst DIRECTION_CODES: string[] = [\n codesLetter.TAB,\n codesLetter.ARROW_UP,\n codesLetter.ARROW_DOWN,\n codesLetter.ARROW_LEFT,\n codesLetter.ARROW_RIGHT,\n];\nexport class KeyboardService {\n private ctrlDown = false;\n\n constructor(private sv: Config) {}\n\n async keyDown(e: KeyboardEvent, canRange: boolean) {\n if (isCtrlKey(e.keyCode, navigator.platform)) {\n this.ctrlDown = true;\n }\n\n\n // IF EDIT MODE\n if (this.sv.selectionStoreService.edited) {\n switch (e.code) {\n case codesLetter.ESCAPE:\n this.sv.cancelEdit();\n break;\n }\n return;\n }\n\n // IF NOT EDIT MODE\n\n // pressed clear key\n if (this.sv.selectionStoreService.ranged && isClear(e.code)) {\n this.sv.clearCell();\n return;\n }\n\n // below works with focus only\n if (!this.sv.selectionStoreService.focused) {\n return;\n }\n\n // tab key means same as arrow right\n if (codesLetter.TAB === e.code) {\n this.keyChangeSelection(e, canRange);\n return;\n }\n\n // pressed enter\n if (isEnterKey(e.code)) {\n this.sv.applyEdit();\n return;\n }\n\n // copy operation\n if (this.isCopy(e)) {\n return;\n }\n\n // cut operation\n if (this.isCut(e)) {\n return;\n }\n\n // paste operation\n if (this.isPaste(e)) {\n this.sv.internalPaste();\n return;\n }\n\n // select all\n if (this.isAll(e)) {\n if (canRange) {\n this.selectAll(e);\n }\n return;\n }\n\n // pressed letter key\n if (isLetterKey(e.keyCode)) {\n this.sv.applyEdit(e.key);\n return;\n }\n\n // pressed arrow, change selection position\n if (await this.keyChangeSelection(e, canRange)) {\n return;\n }\n }\n\n private selectAll(e: KeyboardEvent) {\n const range = this.sv.selectionStore.get('range');\n const focus = this.sv.selectionStore.get('focus');\n // if no range or focus - do nothing\n if (!range || !focus) {\n return;\n }\n e.preventDefault();\n this.sv.selectAll();\n }\n\n async keyChangeSelection(e: KeyboardEvent, canRange: boolean) {\n const data = this.changeDirectionKey(e, canRange);\n if (!data) {\n return false;\n }\n\n // this interval needed for several cases\n // grid could be resized before next click\n // at this case to avoid screen jump we use this interval\n await timeout(RESIZE_INTERVAL + 30);\n\n const range = this.sv.selectionStore.get('range');\n const focus = this.sv.selectionStore.get('focus');\n return this.keyPositionChange(data.changes, range, focus, data.isMulti);\n }\n\n keyPositionChange(\n changes: Partial<Selection.Cell>,\n range?: Selection.RangeArea,\n focus?: Selection.Cell,\n isMulti = false\n ) {\n if (!range || !focus) {\n return false;\n }\n const data = getCoordinate(range, focus, changes, isMulti);\n if (!data) {\n return false;\n }\n if (isMulti) {\n const eData: EventData = this.sv.getData();\n if (isAfterLast(data.end, eData) || isBeforeFirst(data.start)) {\n return false;\n }\n const range = getRange(data.start, data.end);\n return this.sv.range(range);\n }\n return this.sv.focusNext(data.start, changes);\n }\n\n keyUp(e: KeyboardEvent): void {\n if (isCtrlKey(e.keyCode, navigator.platform)) {\n this.ctrlDown = false;\n }\n }\n isCut(e: KeyboardEvent): boolean {\n return this.ctrlDown && e.code == codesLetter.X;\n }\n isCopy(e: KeyboardEvent): boolean {\n return this.ctrlDown && e.code == codesLetter.C;\n }\n isPaste(e: KeyboardEvent): boolean {\n return this.ctrlDown && e.code == codesLetter.V;\n }\n isAll(e: KeyboardEvent): boolean {\n return this.ctrlDown && e.code == codesLetter.A;\n }\n /** Monitor key direction changes */\n changeDirectionKey(e: KeyboardEvent, canRange: boolean): { changes: Partial<Selection.Cell>; isMulti?: boolean } | void {\n const isMulti = canRange && e.shiftKey;\n if (DIRECTION_CODES.includes(e.code)) {\n e.preventDefault();\n }\n switch (e.code) {\n case codesLetter.ARROW_UP:\n return { changes: { y: -1 }, isMulti };\n case codesLetter.ARROW_DOWN:\n return { changes: { y: 1 }, isMulti };\n case codesLetter.ARROW_LEFT:\n return { changes: { x: -1 }, isMulti };\n case codesLetter.TAB:\n case codesLetter.ARROW_RIGHT:\n return { changes: { x: 1 }, isMulti };\n }\n }\n}\n","import debounce from 'lodash/debounce';\nimport { DebouncedFunc } from 'lodash';\n\nimport { h } from '@stencil/core';\nimport { CELL_HANDLER_CLASS, MOBILE_CLASS } from '../../utils/consts';\nimport { Observable, Selection, RevoGrid, Edition } from '../../interfaces';\nimport { EventData, getCell, getCurrentCell, isAfterLast } from './selection.utils';\nimport { getRange } from '../../store/selection/selection.helpers';\nimport SelectionStoreService from '../../store/selection/selection.store.service';\nimport ColumnService from '../data/columnService';\nimport { DataSourceState, getSourceItem } from '../../store/dataSource/data.store';\nimport { getFromEvent } from '../../utils/events';\n\ntype Config = {\n selectionStoreService: SelectionStoreService;\n dimensionRow: Observable<RevoGrid.DimensionSettingsState>;\n dimensionCol: Observable<RevoGrid.DimensionSettingsState>;\n columnService: ColumnService;\n dataStore: Observable<DataSourceState<RevoGrid.DataType, RevoGrid.DimensionRows>>;\n\n setTempRange(e: Selection.TempRange | null): Event;\n selectionChanged(e: Selection.ChangedRange): Event;\n rangeCopy(e: Selection.ChangedRange): Event;\n rangeDataApply(e: Edition.BeforeRangeSaveDataDetails): CustomEvent;\n setRange(e: Selection.RangeArea): boolean;\n clearRangeDataApply(e: {\n range: Selection.RangeArea\n }): CustomEvent<{\n range: Selection.RangeArea\n }>;\n\n getData(): any;\n};\n\nenum AutoFillType {\n selection = 'Selection',\n autoFill = 'AutoFill',\n}\n\nexport class AutoFillService {\n private autoFillType: AutoFillType | null = null;\n private autoFillInitial: Selection.Cell | null = null;\n private autoFillStart: Selection.Cell | null = null;\n private autoFillLast: Selection.Cell | null = null;\n\n private onMouseMoveAutofill: DebouncedFunc<(e: MouseEvent | TouchEvent, data: EventData) => void>;\n\n constructor(private sv: Config) {}\n\n /**\n * Render autofill box\n * @param range\n * @param selectionFocus\n */\n renderAutofill(range: Selection.RangeArea, selectionFocus: Selection.Cell) {\n let handlerStyle;\n if (range) {\n handlerStyle = getCell(range, this.sv.dimensionRow.state, this.sv.dimensionCol.state);\n } else {\n handlerStyle = getCell(\n {\n ...selectionFocus,\n x1: selectionFocus.x,\n y1: selectionFocus.y,\n },\n this.sv.dimensionRow.state,\n this.sv.dimensionCol.state,\n );\n }\n return (\n <div\n class={{\n [CELL_HANDLER_CLASS]: true,\n [MOBILE_CLASS]: true,\n }}\n style={{ left: `${handlerStyle.right}px`, top: `${handlerStyle.bottom}px` }}\n onMouseDown={(e: MouseEvent) => this.autoFillHandler(e)}\n onTouchStart={(e: TouchEvent) => this.autoFillHandler(e)}\n />\n );\n }\n\n private autoFillHandler(e: MouseEvent | TouchEvent, type = AutoFillType.autoFill) {\n let target: Element | null = null;\n if (e.target instanceof Element) {\n target = e.target;\n }\n if (!target) {\n return;\n }\n this.selectionStart(target, this.sv.getData(), type);\n e.preventDefault();\n }\n\n get isAutoFill() {\n return !!this.autoFillType;\n }\n\n /** Process mouse move events */\n selectionMouseMove(e: MouseEvent | TouchEvent) {\n // initiate mouse move debounce if not present\n if (!this.onMouseMoveAutofill) {\n this.onMouseMoveAutofill = debounce((e: MouseEvent | TouchEvent, data: EventData) => this.doAutofillMouseMove(e, data), 5);\n }\n if (this.isAutoFill) {\n this.onMouseMoveAutofill(e, this.sv.getData());\n }\n }\n\n private getFocus() {\n let focus = this.sv.selectionStoreService.focused;\n const range = this.sv.selectionStoreService.ranged;\n // there was an issue that it was taking last cell from range but focus was out\n if (!focus && range) {\n focus = { x: range.x, y: range.y };\n }\n return focus || null;\n }\n\n /**\n * Autofill logic:\n * on mouse move apply based on previous direction (if present)\n */\n private doAutofillMouseMove(event: MouseEvent | TouchEvent, data: EventData) {\n // if no initial - not started\n if (!this.autoFillInitial) {\n return;\n }\n const x = getFromEvent(event, 'clientX', MOBILE_CLASS);\n const y = getFromEvent(event, 'clientY', MOBILE_CLASS);\n // skip touch\n if (x === null || y === null) {\n return;\n }\n const current = getCurrentCell({ x, y }, data);\n\n // first time or direction equal to start(same as first time)\n if (!this.autoFillLast) {\n if (!this.autoFillLast) {\n this.autoFillLast = this.autoFillStart;\n }\n }\n\n // check if not the latest, if latest - do nothing\n if (isAfterLast(current, data)) {\n return;\n }\n this.autoFillLast = current;\n\n const isSame = current.x === this.autoFillInitial.x && current.y === this.autoFillInitial.y;\n // if same as initial - clear\n if (isSame) {\n this.sv.setTempRange(null);\n } else {\n this.sv.setTempRange({\n area: getRange(this.autoFillInitial, this.autoFillLast),\n type: this.autoFillType,\n });\n }\n }\n\n /**\n * Range selection started\n * Mode @param type:\n * Can be triggered from MouseDown selection on element\n * Or can be triggered on corner square drag\n */\n selectionStart(target: Element, data: EventData, type = AutoFillType.selection) {\n /** Get cell by autofill element */\n const { top, left } = target.getBoundingClientRect();\n this.autoFillInitial = this.getFocus();\n this.autoFillType = type;\n this.autoFillStart = getCurrentCell({ x: left, y: top }, data);\n }\n\n /**\n * Clear current range selection\n * on mouse up and mouse leave events\n */ \n clearAutoFillSelection() {\n // Apply autofill values on mouse up if present\n if (this.autoFillInitial) {\n // Get latest\n this.autoFillInitial = this.getFocus();\n\n // Apply range data if present\n if (this.autoFillType === AutoFillType.autoFill) {\n const range = getRange(this.autoFillInitial, this.autoFillLast);\n if (range) {\n const {\n defaultPrevented: stopApply,\n detail: { range: newRange }\n } = this.sv.clearRangeDataApply({\n range,\n });\n if (!stopApply) {\n this.applyRangeWithData(newRange);\n } else {\n // if prevented - clear temp range\n this.sv.setTempRange(null);\n }\n }\n } else {\n this.applyRangeOnly(this.autoFillInitial, this.autoFillLast);\n }\n }\n\n this.autoFillType = null;\n this.autoFillInitial = null;\n this.autoFillLast = null;\n this.autoFillStart = null;\n }\n\n /** Trigger range apply events and handle responses */\n onRangeApply(data: RevoGrid.DataLookup, range: Selection.RangeArea): void {\n const models: RevoGrid.DataLookup = {};\n for (let rowIndex in data) {\n models[rowIndex] = getSourceItem(this.sv.dataStore, parseInt(rowIndex, 10));\n }\n const {\n defaultPrevented: stopRange,\n detail,\n } = this.sv.rangeDataApply({\n data,\n models,\n type: this.sv.dataStore.get('type'),\n });\n if (!stopRange) {\n this.sv.columnService.applyRangeData(detail.data);\n }\n this.sv.setRange(range);\n }\n\n /** Apply range and copy data during range application */\n private applyRangeWithData(newRange: Selection.RangeArea) {\n const oldRange = this.sv.selectionStoreService.ranged;\n const rangeData: Selection.ChangedRange = {\n type: this.sv.dataStore.get('type'),\n newData: {},\n mapping: {},\n newRange,\n oldRange,\n };\n const { mapping, changed } = this.sv.columnService.getRangeData(rangeData, this.sv.columnService.columns);\n rangeData.newData = changed;\n rangeData.mapping = mapping;\n let e = this.sv.selectionChanged(rangeData);\n\n // if default prevented - clear range\n if (e.defaultPrevented) {\n this.sv.setTempRange(null);\n return;\n }\n\n e = this.sv.rangeCopy(rangeData);\n if (e.defaultPrevented) {\n this.sv.setRange(newRange);\n return;\n }\n this.onRangeApply(rangeData.newData, newRange);\n }\n\n /**\n * Update range selection only,\n * no data change (mouse selection)\n */\n private applyRangeOnly(start?: Selection.Cell, end?: Selection.Cell) {\n // no changes to apply\n if (!start || !end) {\n return;\n }\n\n const newRange = getRange(start, end);\n this.sv.setRange(newRange);\n }\n}\n","import { h } from '@stencil/core';\nimport SelectionStoreService from '../../store/selection/selection.store.service';\nimport { Observable, RevoGrid, Selection } from '../../interfaces';\nimport { getRange } from '../../store/selection/selection.helpers';\nimport ColumnService from '../data/columnService';\nimport { DataSourceState } from '../../store/dataSource/data.store';\n\ntype Config = {\n selectionStoreService: SelectionStoreService;\n columnService: ColumnService;\n dataStore: Observable<DataSourceState<RevoGrid.DataType, RevoGrid.DimensionRows>>;\n rangeApply(data: RevoGrid.DataLookup, range: Selection.RangeArea): void;\n rangeCopy(range: Selection.RangeArea): any;\n rangeClear(): void;\n beforeCopy(range: Selection.RangeArea): CustomEvent;\n beforePaste(data: RevoGrid.DataLookup, range: Selection.RangeArea): CustomEvent;\n};\n\nexport class ClipboardService {\n private clipboard: HTMLRevogrClipboardElement;\n constructor(private sv: Config) {}\n\n renderClipboard(readonly = false) {\n return <revogr-clipboard\n readonly={readonly}\n onCopyRegion={e => this.onCopy(e.detail)}\n onClearRegion={() => this.sv.rangeClear()}\n ref={e => (this.clipboard = e)}\n onPasteRegion={e => this.onPaste(e.detail)} />;\n }\n private getRegion() {\n const focus = this.sv.selectionStoreService.focused;\n let range = this.sv.selectionStoreService.ranged;\n if (!range) {\n range = getRange(focus, focus);\n }\n return range;\n }\n private onCopy(e: DataTransfer) {\n const range = this.getRegion();\n const canCopyEvent = this.sv.beforeCopy(range);\n if (canCopyEvent.defaultPrevented) {\n return false;\n }\n const data = this.sv.rangeCopy(range);\n this.clipboard.doCopy(e, data);\n return true;\n }\n\n private onPaste(data: string[][]) {\n const focus = this.sv.selectionStoreService.focused;\n const isEditing = this.sv.selectionStoreService.edited !== null;\n if (!focus || isEditing) {\n return;\n }\n let { changed, range } = this.sv.columnService.getTransformedDataToApply(focus, data);\n const { defaultPrevented: canPaste } = this.sv.beforePaste(changed, range);\n if (canPaste) {\n return;\n }\n this.sv.rangeApply(changed, range);\n }\n}\n","@mixin autofill-handle($handler-size: 14px, $icon-size: 10px) {\n .autofill-handle {\n position: absolute;\n width: $handler-size;\n height: $handler-size;\n margin-left: -$handler-size + 1;\n margin-top: -$handler-size + 1;\n z-index: 10;\n cursor: crosshair;\n\n &::before {\n content: '';\n position: absolute;\n right: 0;\n bottom: 0;\n width: $icon-size;\n height: $icon-size;\n background: $selection-border;\n border: 1px solid white;\n box-sizing: border-box;\n }\n }\n}\n\nrevogr-overlay-selection {\n display: block;\n position: relative;\n width: 100%;\n\n\n @include autofill-handle;\n\n &.mobile {\n @include autofill-handle(30px, 12px);\n }\n\n .selection-border-range {\n position: absolute;\n pointer-events: none;\n z-index: 9;\n\n .range-handlers {\n height: 100%;\n background-color: transparent;\n width: calc(50% + (50% / 2));\n max-width: 50px;\n min-width: 20px;\n left: 50%;\n transform: translateX(-50%);\n position: absolute;\n\n $btn-size: 20px;\n $handler-w: 15px;\n $handler-h: 5px;\n \n > span {\n pointer-events: auto;\n height: $btn-size;\n width: $btn-size;\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n\n\n &:before, &:after {\n position: absolute;\n border-radius: 5px;\n width: $handler-w;\n height: $handler-h;\n left: 50%;\n transform: translateX(-50%);\n background-color: rgba(black, 20%);\n }\n &:first-child {\n top: -($handler-h + 2px);\n &:before{\n content: '';\n top: 0;\n }\n }\n &:last-child {\n bottom: -($handler-h + 2px);\n &:after{\n content: '';\n bottom: 0;\n }\n }\n }\n }\n @include selection();\n }\n\n revogr-edit {\n z-index: 10;\n }\n}\n","import { Component, Event, EventEmitter, h, Host, Listen, Prop, VNode, Element, Watch } from '@stencil/core';\n\nimport { AllDimensionType, ApplyFocusEvent, FocusRenderEvent, Edition, Observable, RevoGrid, Selection, DragStartEvent } from '../../interfaces';\nimport ColumnService from '../data/columnService';\nimport SelectionStoreService from '../../store/selection/selection.store.service';\nimport { codesLetter } from '../../utils/keyCodes';\nimport { MOBILE_CLASS, SELECTION_BORDER_CLASS } from '../../utils/consts';\nimport { DataSourceState } from '../../store/dataSource/data.store';\nimport { isRangeSingleCell } from '../../store/selection/selection.helpers';\nimport { getCurrentCell, getElStyle } from './selection.utils';\nimport { isEditInput } from './editors/edit.utils';\nimport { KeyboardService } from './keyboard.service';\nimport { AutoFillService } from './autofill.service';\nimport { ClipboardService } from './clipboard.service';\nimport { getFromEvent, verifyTouchTarget } from '../../utils/events';\n\n@Component({\n tag: 'revogr-overlay-selection',\n styleUrl: 'revogr-overlay-style.scss',\n})\nexport class OverlaySelection {\n\n @Element() element: HTMLElement;\n\n // --------------------------------------------------------------------------\n //\n // Properties\n //\n // --------------------------------------------------------------------------\n\n /**\n * If readonly mode enables\n */\n @Prop() readonly: boolean;\n /**\n * Range selection mode\n */\n @Prop() range: boolean;\n /**\n * Enable revogr-order-editor component (read more in revogr-order-editor component)\n * Allows D&D\n */\n @Prop() canDrag: boolean;\n\n /**\n * Enable revogr-clipboard component (read more in revogr-clipboard component)\n * Allows copy/paste\n */\n @Prop() useClipboard: boolean;\n\n // --------------------------------------------------------------------------\n //\n // Dynamic stores\n //\n // --------------------------------------------------------------------------\n @Prop() selectionStore: Observable<Selection.SelectionStoreState>;\n @Prop() dimensionRow: Observable<RevoGrid.DimensionSettingsState>;\n @Prop() dimensionCol: Observable<RevoGrid.DimensionSettingsState>;\n\n // --------------------------------------------------------------------------\n //\n // Static stores, not expected to change during component lifetime\n //\n // --------------------------------------------------------------------------\n\n /**\n * Row data store\n */\n @Prop() dataStore: Observable<DataSourceState<RevoGrid.DataType, RevoGrid.DimensionRows>>;\n\n /**\n * Column data store\n */\n @Prop() colData: Observable<DataSourceState<RevoGrid.ColumnRegular, RevoGrid.DimensionCols>>;\n /**\n * Last cell position\n */\n @Prop() lastCell: Selection.Cell;\n /**\n * Custom editors register\n */\n @Prop() editors: Edition.Editors;\n /**\n * If true applys changes when cell closes if not Escape\n */\n @Prop() applyChangesOnClose: boolean = false;\n /**\n * Additional data to pass to renderer\n */\n @Prop() additionalData: any;\n\n /**\n * Is mobile view mode\n */\n @Prop() isMobileDevice: boolean;\n\n // --------------------------------------------------------------------------\n //\n // Events\n //\n // --------------------------------------------------------------------------\n\n /**\n * Before clipboard copy happened\n */\n @Event({ cancelable: true }) internalCopy: EventEmitter;\n /**\n * Before paste happened\n */\n @Event({ cancelable: true }) internalPaste: EventEmitter;\n\n @Event({ cancelable: true }) internalCellEdit: EventEmitter<Edition.BeforeSaveDataDetails>;\n @Event({ cancelable: true }) beforeFocusCell: EventEmitter<Edition.BeforeSaveDataDetails>;\n\n /**\n * Set edit cell\n */\n @Event() setEdit: EventEmitter<Edition.BeforeEdit>;\n @Event({ eventName: 'before-apply-range' }) beforeApplyRange: EventEmitter<FocusRenderEvent>;\n /**\n * Before range selection applied\n */\n @Event({ eventName: 'before-set-range' }) beforeSetRange: EventEmitter;\n @Event({ eventName: 'before-edit-render' }) beforeEditRender: EventEmitter<FocusRenderEvent>;\n @Event() setRange: EventEmitter<Selection.RangeArea & { type: RevoGrid.MultiDimensionType }>;\n @Event({ eventName: 'selectall' }) selectAll: EventEmitter;\n /**\n * Used for editors support when close requested\n */\n @Event() cancelEdit: EventEmitter;\n @Event() setTempRange: EventEmitter<Selection.TempRange | null>;\n\n @Event() applyFocus: EventEmitter<FocusRenderEvent>;\n @Event() focusCell: EventEmitter<ApplyFocusEvent>;\n /** Range data apply */\n @Event() beforeRangeDataApply: EventEmitter<FocusRenderEvent>;\n /** Selection range changed */\n @Event({ cancelable: true }) internalSelectionChanged: EventEmitter<Selection.ChangedRange>;\n /** Selection range changed */\n @Event({ cancelable: true, bubbles: true }) beforeRangeCopyApply: EventEmitter<Selection.ChangedRange>;\n\n /** Range data apply */\n @Event({ cancelable: true }) internalRangeDataApply: EventEmitter<Edition.BeforeRangeSaveDataDetails>;\n /** Range copy */\n @Event({ cancelable: true }) rangeClipboardCopy: EventEmitter;\n @Event({ cancelable: true }) rangeClipboardPaste: EventEmitter;\n\n /**\n * Before key up event proxy, used to prevent key up trigger.\n * If you have some custom behaviour event, use this event to check if it wasn't processed by internal logic.\n * Call preventDefault()\n */\n @Event({ eventName: 'beforekeydown' }) beforeKeyDown: EventEmitter<KeyboardEvent>;\n /**\n * Before key down event proxy, used to prevent key down trigger.\n * If you have some custom behaviour event, use this event to check if it wasn't processed by internal logic.\n * Call preventDefault()\n */\n @Event({ eventName: 'beforekeyup' }) beforeKeyUp: EventEmitter<KeyboardEvent>;\n\n protected columnService: ColumnService;\n\n protected selectionStoreService: SelectionStoreService;\n private keyboardService: KeyboardService | null = null;\n private autoFillService: AutoFillService | null = null;\n private clipboardService: ClipboardService | null = null;\n private orderEditor: HTMLRevogrOrderEditorElement;\n private revogrEdit: HTMLRevogrEditElement | null = null;\n /**\n * Runs before cell save\n * Can be used to override or cancel original save\n */\n @Event({ eventName: 'before-cell-save', cancelable: true }) beforeCellSave: EventEmitter;\n // --------------------------------------------------------------------------\n //\n // Listeners\n //\n // --------------------------------------------------------------------------\n @Listen('touchmove', { target: 'document' })\n @Listen('mousemove', { target: 'document' })\n onMouseMove(e: MouseEvent | TouchEvent) {\n if (this.selectionStoreService.focused) {\n this.autoFillService.selectionMouseMove(e);\n }\n }\n\n\n /** Action finished inside of the document */\n /** Pointer left document, clear any active operation */\n @Listen('touchend', { target: 'document' })\n @Listen('mouseup', { target: 'document' })\n @Listen('mouseleave', { target: 'document' })\n onMouseUp() {\n this.autoFillService.clearAutoFillSelection();\n }\n\n /** Row drag started */\n @Listen('dragStartCell') onCellDrag(e: CustomEvent<DragStartEvent>) {\n this.orderEditor?.dragStart(e.detail);\n }\n\n /** Get keyboard down from element */\n @Listen('keyup', { target: 'document' }) onKeyUp(e: KeyboardEvent) {\n const proxy = this.beforeKeyUp.emit(e);\n if (e.defaultPrevented || proxy.defaultPrevented) {\n return;\n }\n this.keyboardService?.keyUp(e);\n }\n\n /** Get keyboard down from element */\n @Listen('keydown', { target: 'document' }) onKeyDown(e: KeyboardEvent) {\n const proxy = this.beforeKeyDown.emit(e);\n if (e.defaultPrevented || proxy.defaultPrevented) {\n return;\n }\n this.keyboardService?.keyDown(e, this.range);\n }\n\n // selection & keyboard\n @Watch('selectionStore') selectionServiceSet(s: Observable<Selection.SelectionStoreState>) {\n this.selectionStoreService = new SelectionStoreService(s, {\n changeRange: range => this.triggerRangeEvent(range),\n focus: (focus, end) => this.doFocus(focus, end),\n });\n\n this.keyboardService = new KeyboardService({\n selectionStoreService: this.selectionStoreService,\n selectionStore: s,\n range: r => this.selectionStoreService.changeRange(r),\n focusNext: (f, next) => this.doFocus(f, f, next),\n applyEdit: val => {\n if (this.readonly) {\n return;\n }\n this.doEdit(val);\n },\n cancelEdit: async () => {\n await this.revogrEdit.cancel();\n this.closeEdit();\n },\n clearCell: () => !this.readonly && this.clearCell(),\n internalPaste: () => !this.readonly && this.internalPaste.emit(),\n getData: () => this.getData(),\n selectAll: () => this.selectAll.emit(),\n });\n this.createAutoFillService();\n this.createClipboardService();\n }\n // autofill\n @Watch('dimensionRow')\n @Watch('dimensionCol')\n createAutoFillService() {\n this.autoFillService = new AutoFillService({\n selectionStoreService: this.selectionStoreService,\n dimensionRow: this.dimensionRow,\n dimensionCol: this.dimensionCol,\n columnService: this.columnService,\n dataStore: this.dataStore,\n\n clearRangeDataApply: e =>\n this.beforeRangeDataApply.emit({\n ...e,\n ...this.types,\n }),\n setTempRange: e => this.setTempRange.emit(e),\n selectionChanged: e => this.internalSelectionChanged.emit(e),\n rangeCopy: e => this.beforeRangeCopyApply.emit(e),\n rangeDataApply: e => this.internalRangeDataApply.emit(e),\n\n setRange: e => this.triggerRangeEvent(e),\n getData: () => this.getData(),\n });\n }\n\n // columns\n @Watch('dataStore')\n @Watch('colData')\n columnServiceSet() {\n this.columnService?.destroy();\n this.columnService = new ColumnService(this.dataStore, this.colData);\n this.createAutoFillService();\n this.createClipboardService();\n }\n\n // clipboard\n createClipboardService() {\n this.clipboardService = new ClipboardService({\n selectionStoreService: this.selectionStoreService,\n columnService: this.columnService,\n dataStore: this.dataStore,\n rangeApply: (d, r) => this.autoFillService.onRangeApply(d, r),\n rangeCopy: range => {\n if (!range) {\n return undefined;\n }\n const { data, mapping } = this.columnService.copyRangeArray(range, this.dataStore);\n const event = this.rangeClipboardCopy.emit({\n range,\n data,\n mapping,\n ...this.types,\n });\n if (event.defaultPrevented) {\n return undefined;\n }\n return event.detail.data;\n },\n rangeClear: () => !this.readonly && this.clearCell(),\n beforeCopy: range => this.internalCopy.emit(range),\n beforePaste: (data, range) => {\n return this.rangeClipboardPaste.emit({\n data,\n range,\n ...this.types,\n });\n },\n });\n }\n\n connectedCallback() {\n this.columnServiceSet();\n this.selectionServiceSet(this.selectionStore);\n }\n\n disconnectedCallback() {\n this.columnService?.destroy();\n }\n\n private renderRange(range: Selection.RangeArea) {\n const style = getElStyle(range, this.dimensionRow.state, this.dimensionCol.state);\n return [\n <div class={SELECTION_BORDER_CLASS} style={style}>\n {this.isMobileDevice && <div class=\"range-handlers\"><span class={MOBILE_CLASS}></span><span class={MOBILE_CLASS}></span></div>}\n </div>\n ];\n }\n\n private renderEditCell() {\n // if can edit\n const editCell = this.selectionStore.get('edit');\n if (this.readonly || !editCell) {\n return null;\n }\n const val = editCell.val || this.columnService.getCellData(editCell.y, editCell.x);\n const editable = {\n ...editCell,\n ...this.columnService.getSaveData(editCell.y, editCell.x, val),\n };\n const renderEvent = this.beforeEditRender.emit({\n range: {\n ...editCell,\n x1: editCell.x,\n y1: editCell.y,\n },\n ...this.types,\n });\n if (renderEvent.defaultPrevented) {\n return null;\n }\n\n const {\n detail: { range },\n } = renderEvent;\n const style = getElStyle(range, this.dimensionRow.state, this.dimensionCol.state);\n return (\n <revogr-edit\n ref={el => {\n this.revogrEdit = el;\n }}\n onCellEdit={e => {\n const saveEv = this.beforeCellSave.emit(e.detail);\n if (!saveEv.defaultPrevented) {\n this.cellEdit(saveEv.detail);\n }\n\n // if not clear navigate to next cell after edit\n if (!saveEv.detail.preventFocus) {\n this.focusNext();\n }\n }}\n onCloseEdit={e => this.closeEdit(e)}\n editCell={editable}\n saveOnClose={this.applyChangesOnClose}\n column={this.columnService.columns[editCell.x]}\n editor={this.columnService.getCellEditor(editCell.y, editCell.x, this.editors)}\n additionalData={this.additionalData}\n style={style}\n />\n );\n }\n\n render() {\n const els: VNode[] = [];\n const editCell = this.renderEditCell();\n if (editCell) {\n els.push(editCell);\n } else {\n const range = this.selectionStoreService.ranged;\n const selectionFocus = this.selectionStoreService.focused;\n if ((range || selectionFocus) && this.useClipboard) {\n els.push(this.clipboardService.renderClipboard(this.readonly));\n }\n\n if (range) {\n els.push(...this.renderRange(range));\n }\n if (selectionFocus && !this.readonly && this.range) {\n els.push(this.autoFillService.renderAutofill(range, selectionFocus));\n }\n if (this.canDrag) {\n els.push(\n <revogr-order-editor\n ref={e => (this.orderEditor = e)}\n dataStore={this.dataStore}\n dimensionRow={this.dimensionRow}\n dimensionCol={this.dimensionCol}\n parent={this.element}\n onInternalRowDragStart={e => this.onRowDragStart(e)}\n />,\n );\n }\n }\n return (\n <Host\n class={{ mobile: this.isMobileDevice }}\n // run edit on dblclick\n onDblClick={(e: MouseEvent) => {\n // if dblclick prevented outside edit will not start\n if (!e.defaultPrevented) {\n this.doEdit();\n }\n }}\n onMouseDown={(e: MouseEvent) => this.onElementMouseDown(e)}\n onTouchStart={(e: TouchEvent) => this.onElementMouseDown(e, true)}>\n {els}\n <slot name=\"data\" />\n </Host>\n );\n }\n\n private doFocus(focus: Selection.Cell, end: Selection.Cell, next?: Partial<Selection.Cell>) {\n const { defaultPrevented } = this.beforeFocusCell.emit(this.columnService.getSaveData(focus.y, focus.x));\n if (defaultPrevented) {\n return false;\n }\n const evData = {\n range: {\n ...focus,\n x1: end.x,\n y1: end.y,\n },\n next,\n ...this.types,\n };\n const applyEvent = this.applyFocus.emit(evData);\n if (applyEvent.defaultPrevented) {\n return false;\n }\n const { range } = applyEvent.detail;\n return !this.focusCell.emit({\n focus: {\n x: range.x,\n y: range.y,\n },\n end: {\n x: range.x1,\n y: range.y1,\n },\n ...applyEvent.detail,\n }).defaultPrevented;\n }\n\n private triggerRangeEvent(range: Selection.RangeArea) {\n const type = this.types.rowType;\n const applyEvent = this.beforeApplyRange.emit({\n range: { ...range },\n ...this.types,\n });\n if (applyEvent.defaultPrevented) {\n return false;\n }\n const data = this.columnService.getRangeTransformedToProps(applyEvent.detail.range, this.dataStore);\n let e = this.beforeSetRange.emit(data);\n e = this.setRange.emit({ ...applyEvent.detail.range, type });\n if (e.defaultPrevented) {\n return false;\n }\n return !e.defaultPrevented;\n }\n\n protected onElementMouseDown(e: MouseEvent | TouchEvent, touch = false) {\n // Ignore focus if clicked input\n if (isEditInput(e.target as HTMLElement | undefined)) {\n return;\n }\n const data = this.getData();\n if (e.defaultPrevented) {\n return;\n }\n const x = getFromEvent(e, 'clientX');\n const y = getFromEvent(e, 'clientY');\n // skip touch\n if (x === null || y === null) {\n return;\n }\n // Regular cell click\n const focusCell = getCurrentCell({ x, y }, data);\n this.selectionStoreService.focus(focusCell, this.range && e.shiftKey);\n\n // Initiate autofill selection\n if (this.range) {\n this.autoFillService.selectionStart(e.target as HTMLElement, data);\n if (!touch) {\n e.preventDefault();\n } else if (verifyTouchTarget((e as TouchEvent).touches[0], MOBILE_CLASS)) {\n e.preventDefault();\n }\n }\n }\n\n /** \n * Start cell editing\n */\n protected doEdit(val = '') {\n if (this.canEdit()) {\n const editCell = this.selectionStore.get('focus');\n const data = this.columnService.getSaveData(editCell.y, editCell.x);\n this.setEdit?.emit({\n ...data,\n val,\n });\n }\n }\n\n /**\n * Close editor event triggered\n * @param details - if requires focus next\n */\n private closeEdit(e?: CustomEvent<boolean>) {\n this.cancelEdit.emit();\n if (e?.detail) {\n this.focusNext();\n }\n }\n\n /** Edit finished, close cell and save */\n protected cellEdit(e: Edition.SaveDataDetails) {\n const dataToSave = this.columnService.getSaveData(e.rgRow, e.rgCol, e.val);\n this.internalCellEdit.emit(dataToSave);\n }\n\n private async focusNext() {\n const canFocus = await this.keyboardService.keyChangeSelection(\n new KeyboardEvent('keydown', {\n code: codesLetter.ARROW_DOWN,\n }),\n this.range,\n );\n if (!canFocus) {\n this.closeEdit();\n }\n }\n\n protected clearCell() {\n if (this.selectionStoreService.ranged && !isRangeSingleCell(this.selectionStoreService.ranged)) {\n const data = this.columnService.getRangeStaticData(this.selectionStoreService.ranged, '');\n this.autoFillService.onRangeApply(data, this.selectionStoreService.ranged);\n } else if (this.canEdit()) {\n const focused = this.selectionStoreService.focused;\n const cell = this.columnService.getSaveData(focused.y, focused.x);\n this.cellEdit({\n rgRow: focused.y,\n rgCol: focused.x,\n val: '',\n type: cell.type,\n prop: cell.prop,\n });\n }\n }\n\n private onRowDragStart({ detail }: CustomEvent<{ cell: Selection.Cell; text: string }>) {\n detail.text = this.columnService.getCellData(detail.cell.y, detail.cell.x);\n }\n\n /** Check if edit possible */\n protected canEdit() {\n if (this.readonly) {\n return false;\n }\n const editCell = this.selectionStoreService.focused;\n return editCell && !this.columnService?.isReadOnly(editCell.y, editCell.x);\n }\n\n get types(): AllDimensionType {\n return {\n rowType: this.dataStore.get('type'),\n colType: this.columnService.type,\n };\n }\n\n /** Collect data from element */\n protected getData() {\n return {\n el: this.element,\n rows: this.dimensionRow.state,\n cols: this.dimensionCol.state,\n lastCell: this.lastCell,\n };\n }\n}\n"],"version":3}
@@ -645,6 +645,8 @@ const OverlaySelection = class {
645
645
  this.internalRangeDataApply = index$1.createEvent(this, "internalRangeDataApply", 7);
646
646
  this.rangeClipboardCopy = index$1.createEvent(this, "rangeClipboardCopy", 7);
647
647
  this.rangeClipboardPaste = index$1.createEvent(this, "rangeClipboardPaste", 7);
648
+ this.beforeKeyDown = index$1.createEvent(this, "beforekeydown", 7);
649
+ this.beforeKeyUp = index$1.createEvent(this, "beforekeyup", 7);
648
650
  this.beforeCellSave = index$1.createEvent(this, "before-cell-save", 7);
649
651
  this.keyboardService = null;
650
652
  this.autoFillService = null;
@@ -688,12 +690,17 @@ const OverlaySelection = class {
688
690
  /** Get keyboard down from element */
689
691
  onKeyUp(e) {
690
692
  var _a;
693
+ const proxy = this.beforeKeyUp.emit(e);
694
+ if (e.defaultPrevented || proxy.defaultPrevented) {
695
+ return;
696
+ }
691
697
  (_a = this.keyboardService) === null || _a === void 0 ? void 0 : _a.keyUp(e);
692
698
  }
693
699
  /** Get keyboard down from element */
694
700
  onKeyDown(e) {
695
701
  var _a;
696
- if (e.defaultPrevented) {
702
+ const proxy = this.beforeKeyDown.emit(e);
703
+ if (e.defaultPrevented || proxy.defaultPrevented) {
697
704
  return;
698
705
  }
699
706
  (_a = this.keyboardService) === null || _a === void 0 ? void 0 : _a.keyDown(e, this.range);