@revolist/revogrid 4.0.7 → 4.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/revogr-attribution_6.cjs.entry.js +3 -3
- package/dist/cjs/revogr-attribution_6.cjs.entry.js.map +1 -1
- package/dist/cjs/revogr-clipboard_3.cjs.entry.js.map +1 -1
- package/dist/collection/components/editors/revogr-edit.js +5 -5
- package/dist/collection/components/editors/revogr-edit.js.map +1 -1
- package/dist/collection/components/overlay/revogr-overlay-selection.js +3 -3
- package/dist/collection/components/overlay/revogr-overlay-selection.js.map +1 -1
- package/dist/collection/types/selection.js.map +1 -1
- package/dist/esm/revogr-attribution_6.entry.js +3 -3
- package/dist/esm/revogr-attribution_6.entry.js.map +1 -1
- package/dist/esm/revogr-clipboard_3.entry.js.map +1 -1
- package/dist/revo-grid/revogr-attribution_6.entry.js +1 -1
- package/dist/revo-grid/revogr-attribution_6.entry.js.map +1 -1
- package/dist/revo-grid/revogr-clipboard_3.entry.js.map +1 -1
- package/dist/types/components/editors/revogr-edit.d.ts +2 -2
- package/dist/types/components.d.ts +4 -4
- package/dist/types/types/selection.d.ts +11 -7
- package/hydrate/index.js +3 -3
- package/package.json +6 -2
- package/standalone/revogr-edit2.js.map +1 -1
- package/standalone/revogr-overlay-selection2.js +3 -3
- package/standalone/revogr-overlay-selection2.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Clipboard","onPaste","e","this","readonly","clipboardData","getData","isHTML","types","indexOf","data","dataText","beforePaste","emit","raw","event","defaultPrevented","parsedData","detail","table","htmlParse","textParse","beforePasteApply","parsed","pasteRegion","afterPasteApply","preventDefault","copyStarted","beforeCopy","copyRegion","cutStarted","beforeCut","clearRegion","doCopy","beforeCopyApply","parserCopy","setData","map","rgRow","join","result","rows","split","y","push","fragment","document","createRange","createContextualFragment","querySelector","Array","from","cells","cell","innerText","window","TextEditor","constructor","column","saveCallback","element","editCell","componentDidRender","editInput","timeout","_a","focus","onKeyDown","isEnter","isEnterKey","code","isKeyTab","isTab","target","isComposing","beforeDisconnect","getValue","blur","value","render","h","_additionalData","type","val","ref","el","revogrEditStyleCss","RevogrEditStyle0","RevoEdit","currentEditor","preventSaveOnClose","cancelChanges","_b","call","onAutoSave","beforeAutoSave","canSave","onSave","preventFocus","cellEdit","rgCol","x","prop","componentWillRender","editor","focusNext","closeEdit","firstElementChild","disconnectedCallback","saveOnClose","Host","class","EDIT_INPUT_WR","additionalData","RowOrderService","config","currentCell","previousRow","endOrder","newRow","getCell","positionChanged","clear","startOrder","move","getRow","itemIndex","top","getBoundingClientRect","topRelative","getItemByPosition","absolutePosition","start","end","cols","left","leftRelative","OrderEditor","events","rowMoveFunc","debounce","rowOrderService","rowDrag","dragStart","originalEvent","length","clearOrder","pos","dragStartEvent","rowDragStart","text","DRAGG_TEXT","moveMove","mouseUp","mouseLeave","name","listener","addEventListener","forEach","v","removeEventListener","rowDragEnd","rowMouseMove","connectedCallback","f","t","onPositionChanged","to","dropEvent","rowDropped","items","dataStore","get","toMove","splice","setItems","parent","dimensionRow","state","dimensionCol"],"sources":["src/components/clipboard/revogr-clipboard.tsx","src/components/editors/text-editor.tsx","src/components/editors/revogr-edit-style.scss?tag=revogr-edit","src/components/editors/revogr-edit.tsx","src/components/order/order-row.service.ts","src/components/order/revogr-order-editor.tsx"],"sourcesContent":["import { Component, Listen, Method, Event, EventEmitter, Prop } from '@stencil/core';\nimport { DataFormat } from '../../types/interfaces';\n/**\n * This Clipboard provides functionality for handling clipboard events in a web application.\n */\n@Component({ tag: 'revogr-clipboard' })\nexport class Clipboard {\n /**\n * If readonly mode - disabled Paste event\n */\n @Prop() readonly: boolean;\n\n /**\n * Paste 1. Fired before paste applied to the grid\n * @property {string} raw - raw data from clipboard\n * @property {ClipboardEvent} event - original event\n * @property {boolean} defaultPrevented - if true, paste will be canceled\n */\n @Event({ eventName: 'beforepaste' }) beforePaste: EventEmitter;\n\n /**\n * Paste 2. Fired before paste applied to the grid and after data parsed\n * @property {string} raw - raw data from clipboard\n * @property {string[][]} parsed - parsed data\n */\n @Event({ eventName: 'beforepasteapply' }) beforePasteApply: EventEmitter;\n\n /**\n * Paste 3. Internal method. When data region is ready pass it to the top.\n * @property {string[][]} data - data to paste\n * @property {boolean} defaultPrevented - if true, paste will be canceled\n */\n @Event({ eventName: 'pasteregion', bubbles: false }) pasteRegion: EventEmitter<string[][]>;\n\n\n /**\n * Paste 4. Fired after paste applied to the grid\n * @property {string} raw - raw data from clipboard\n * @property {string[][]} parsed - parsed data\n * @property {ClipboardEvent} event - original event\n * @property {boolean} defaultPrevented - if true, paste will be canceled\n */\n @Event({ eventName: 'afterpasteapply' }) afterPasteApply: EventEmitter;\n\n /**\n * Cut 1. Fired before cut triggered\n * @property {ClipboardEvent} event - original event\n * @property {boolean} defaultPrevented - if true, cut will be canceled\n */\n @Event({ eventName: 'beforecut' }) beforeCut: EventEmitter;\n\n /**\n * Cut 2. Clears region when cut is done\n */\n @Event({ eventName: 'clearregion' }) clearRegion: EventEmitter<DataTransfer>;\n\n /**\n * Copy 1. Fired before copy triggered\n * @property {ClipboardEvent} event - original event\n * @property {boolean} defaultPrevented - if true, copy will be canceled\n */\n @Event({ eventName: 'beforecopy' }) beforeCopy: EventEmitter;\n\n /**\n * Copy Method 1. Fired before copy applied to the clipboard from outside.\n * @property {DataTransfer} event - original event\n * @property {string} data - data to copy\n * @property {boolean} defaultPrevented - if true, copy will be canceled\n */\n @Event({ eventName: 'beforecopyapply' }) beforeCopyApply: EventEmitter;\n\n /**\n * Copy 2. Fired when region copied\n * @property {DataTransfer} data - data to copy\n * @property {boolean} defaultPrevented - if true, copy will be canceled\n */\n @Event({ eventName: 'copyregion', bubbles: false }) copyRegion: EventEmitter<DataTransfer>;\n\n @Listen('paste', { target: 'document' }) onPaste(e: ClipboardEvent) {\n // if readonly do nothing\n if (this.readonly) {\n return;\n }\n const clipboardData = this.getData(e);\n const isHTML = clipboardData.types.indexOf('text/html') > -1;\n const data = isHTML ? clipboardData.getData('text/html') : clipboardData.getData('text');\n const dataText = clipboardData.getData('text');\n\n const beforePaste = this.beforePaste.emit({\n raw: data,\n dataText,\n isHTML,\n event: e,\n });\n\n if (beforePaste.defaultPrevented) {\n return;\n }\n\n let parsedData: string[][];\n // if html, then search for table if no table fallback to regular text parsing\n if (beforePaste.detail.isHTML) {\n const table = this.htmlParse(beforePaste.detail.raw);\n parsedData = table || this.textParse(dataText);\n } else {\n parsedData = this.textParse(beforePaste.detail.raw);\n }\n const beforePasteApply = this.beforePasteApply.emit({\n raw: data,\n parsed: parsedData,\n event: e,\n });\n if (beforePasteApply.defaultPrevented) {\n return;\n }\n this.pasteRegion.emit(beforePasteApply.detail.parsed);\n // post paste action\n const afterPasteApply = this.afterPasteApply.emit({\n raw: data,\n parsed: parsedData,\n event: e,\n });\n // keep default behavior if needed\n if (afterPasteApply.defaultPrevented) {\n return;\n }\n e.preventDefault();\n }\n\n /**\n * Listen to copy event and emit copy region event\n */\n @Listen('copy', { target: 'document' }) copyStarted(e: ClipboardEvent) {\n const beforeCopy = this.beforeCopy.emit({\n event: e,\n });\n if (beforeCopy.defaultPrevented) {\n return;\n }\n const data = this.getData(beforeCopy.detail.event);\n this.copyRegion.emit(data);\n e.preventDefault();\n }\n\n /**\n * Listen to copy event and emit copy region event\n */\n @Listen('cut', { target: 'document' }) cutStarted(e: ClipboardEvent) {\n const beforeCut = this.beforeCut.emit({\n event: e,\n });\n if (beforeCut.defaultPrevented) {\n return;\n }\n const data = this.getData(beforeCut.detail.event);\n this.copyStarted(e);\n\n // if readonly do nothing\n if (this.readonly) {\n return;\n }\n\n this.clearRegion.emit(data);\n e.preventDefault();\n }\n\n @Method() async doCopy(e: DataTransfer, data?: DataFormat[][]) {\n const beforeCopyApply = this.beforeCopyApply.emit({\n event: e,\n data,\n });\n if (beforeCopyApply.defaultPrevented) {\n return;\n }\n const parsed = data ? this.parserCopy(data) : '';\n e.setData('text/plain', parsed);\n }\n\n parserCopy(data: DataFormat[][]) {\n return data.map(rgRow => rgRow.join('\\t')).join('\\n');\n }\n\n private textParse(data: string) {\n const result: string[][] = [];\n const rows = data.split(/\\r\\n|\\n|\\r/);\n for (let y in rows) {\n result.push(rows[y].split('\\t'));\n }\n return result;\n }\n\n private htmlParse(data: string) {\n const result: string[][] = [];\n const fragment = document.createRange().createContextualFragment(data);\n const table = fragment.querySelector('table');\n if (!table) {\n return null;\n }\n for (const rgRow of Array.from(table.rows)) {\n result.push(Array.from(rgRow.cells).map(cell => cell.innerText));\n }\n return result;\n }\n\n private getData(e: ClipboardEvent) {\n return e.clipboardData || (window as unknown as { clipboardData: DataTransfer | null })?.clipboardData;\n }\n}\n","import { h as createElement } from '@stencil/core';\nimport { isEnterKey, isTab } from '../../utils/key.utils';\nimport { timeout } from '../../utils';\nimport { ColumnRegular } from '../../types/interfaces';\nimport { EditCell, EditorBase, SaveData } from '../../types/selection';\n\n/**\n * Represents a cell editor in a grid.\n *\n * It's a good place to start with your own editor.\n * It manages the editing of cells by handling events, saving data, rendering the editor UI, and managing the lifecycle of the editor instance.\n */\n\n/**\n * Callback triggered on cell editor save\n * Closes editor when called\n * @param preventFocus - if true editor will not be closed and next cell will not be focused\n */\nexport type SaveCallback = (value: SaveData, preventFocus: boolean) => void;\n\nexport class TextEditor implements EditorBase {\n private editInput!: HTMLInputElement;\n\n public element: Element | null = null;\n public editCell: EditCell | null = null;\n\n constructor(\n public column: ColumnRegular,\n private saveCallback?: SaveCallback,\n ) {}\n\n /**\n * Callback triggered on cell editor render\n */\n async componentDidRender(): Promise<void> {\n if (this.editInput) {\n await timeout();\n this.editInput?.focus();\n }\n }\n\n private onKeyDown(e: KeyboardEvent) {\n const isEnter = isEnterKey(e.code);\n const isKeyTab = isTab(e.code);\n\n if (\n (isKeyTab || isEnter) &&\n e.target &&\n this.saveCallback &&\n !e.isComposing\n ) {\n // blur is needed to avoid autoscroll\n this.beforeDisconnect();\n // request callback which will close cell after all\n this.saveCallback(this.getValue(), isKeyTab);\n }\n }\n\n /**\n * IMPORTANT: Prevent scroll glitches when editor is closed and focus is on current input element.\n */\n beforeDisconnect() {\n this.editInput.blur();\n }\n\n /**\n * Get value from input\n */\n getValue() {\n return this.editInput?.value;\n }\n\n /**\n * Render method for Editor plugin.\n * Renders input element with passed data from cell.\n *\n * @required @method\n * @param {Function} h - h function from stencil render.\n * @param {Object} _additionalData - additional data from plugin.\n * @returns {VNode} - input element.\n */\n render(h: typeof createElement, _additionalData: any) {\n return h('input', {\n type: 'text',\n // set input value from cell data\n value: this.editCell?.val || '',\n // save input element as ref for further usage\n ref: (el: HTMLInputElement | null) => {\n this.editInput = el;\n },\n // listen to keydown event on input element\n onKeyDown: (e: KeyboardEvent) => this.onKeyDown(e),\n });\n }\n}\n","revogr-edit {\n display: block;\n position: absolute;\n background-color: #fff;\n\n input {\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n }\n\n revo-dropdown {\n height: 100%;\n\n &.shrink {\n fieldset legend > span {\n display: none;\n }\n }\n }\n}\n","import {\n Component,\n Event,\n EventEmitter,\n Prop,\n h,\n Element,\n Host,\n Method,\n} from '@stencil/core';\nimport { EDIT_INPUT_WR } from '../../utils/consts';\nimport { TextEditor } from './text-editor';\nimport { ColumnRegular } from '../../types/interfaces';\nimport {\n EditCell,\n EditorCtr,\n SaveDataDetails,\n EditorBase,\n SaveData,\n} from '../../types/selection';\n\n/**\n * Represents a cell editor in a grid.\n * It manages the editing of cells by handling events, saving data, rendering the editor UI,\n * and managing the lifecycle of the editor instance.\n */\n@Component({\n tag: 'revogr-edit',\n styleUrl: 'revogr-edit-style.scss',\n})\nexport class RevoEdit {\n /**\n * Cell to edit data.\n */\n @Prop() editCell: EditCell;\n\n /**\n * Column data for editor.\n */\n @Prop() column: ColumnRegular | null;\n /**\n * Custom editors register\n */\n @Prop() editor: EditorCtr | null;\n\n /**\n * Save on editor close. Defines if data should be saved on editor close.\n */\n @Prop() saveOnClose = false;\n /**\n * Additional data to pass to renderer\n */\n @Prop() additionalData: any;\n\n /**\n * Cell edit event\n */\n @Event({ eventName: 'celledit' }) cellEdit: EventEmitter<SaveDataDetails>;\n\n /**\n * Close editor event\n * pass true if requires focus next\n */\n @Event({ eventName: 'closeedit' }) closeEdit: EventEmitter<\n boolean | undefined\n >;\n\n /** Edit session editor */\n @Element() element: HTMLElement;\n private currentEditor: EditorBase | null = null;\n private preventSaveOnClose = false;\n\n /**\n * Cancel pending changes flag. Editor will be closed without autosave.\n */\n @Method() async cancelChanges() {\n this.preventSaveOnClose = true;\n }\n\n /**\n * Before editor got disconnected.\n * Can be triggered multiple times before actual disconnect.\n */\n @Method() async beforeDisconnect() {\n this.currentEditor?.beforeDisconnect?.();\n }\n\n onAutoSave() {\n this.preventSaveOnClose = true;\n const val = this.currentEditor.getValue?.();\n // For Editor plugin internal usage.\n // When you want to prevent save and use custom save of your own.\n if (this.currentEditor.beforeAutoSave) {\n const canSave = this.currentEditor.beforeAutoSave(val);\n if (canSave === false) {\n return;\n }\n }\n this.onSave(val, true);\n }\n\n /**\n * Callback triggered when cell editor saved.\n * Closes editor when called.\n * @param preventFocus - if true, editor will not be closed & next cell will not be focused.\n */\n onSave(val: SaveData, preventFocus?: boolean) {\n this.preventSaveOnClose = true;\n if (this.editCell) {\n this.cellEdit.emit({\n rgCol: this.editCell.x,\n rgRow: this.editCell.y,\n type: this.editCell.type,\n prop: this.editCell.prop,\n val,\n preventFocus,\n });\n }\n }\n\n componentWillRender() {\n // Active editor present\n if (this.currentEditor) {\n return;\n }\n this.preventSaveOnClose = false;\n\n // Custom editor usage.\n // Start with TextEditor (editors/text.tsx) for Custom editor.\n if (this.editor) {\n this.currentEditor = new this.editor(\n this.column,\n // save callback\n (e, preventFocus) => {\n this.onSave(e, preventFocus);\n },\n // cancel callback\n focusNext => {\n this.preventSaveOnClose = true;\n this.closeEdit.emit(focusNext);\n },\n );\n return;\n }\n // Default text editor usage\n this.currentEditor = new TextEditor(this.column, (e, preventFocus) =>\n this.onSave(e, preventFocus),\n );\n }\n\n componentDidRender() {\n if (!this.currentEditor) {\n return;\n }\n this.currentEditor.element = this.element.firstElementChild;\n this.currentEditor.componentDidRender?.();\n }\n\n disconnectedCallback() {\n if (this.saveOnClose) {\n // Can not be cancelled by `preventSaveOnClose` prop.\n // Editor requires `getValue` to be able to save.\n if (!this.preventSaveOnClose) {\n this.onAutoSave();\n }\n }\n\n this.preventSaveOnClose = false;\n if (!this.currentEditor) {\n return;\n }\n\n this.currentEditor.disconnectedCallback?.();\n this.currentEditor.element = null;\n this.currentEditor = null;\n }\n\n render() {\n if (this.currentEditor) {\n this.currentEditor.editCell = this.editCell;\n return (\n <Host class={EDIT_INPUT_WR}>\n {this.currentEditor.render(h, this.additionalData)}\n </Host>\n );\n }\n return '';\n }\n}\n","import { getItemByPosition } from '../../store/dimension/dimension.helpers';\nimport { DimensionSettingsState, PositionItem } from '../..';\nimport { Cell } from '../..';\n\ntype EventData = { el: HTMLElement; rows: DimensionSettingsState; cols: DimensionSettingsState };\ninterface Config {\n positionChanged(from: number, to: number): void;\n}\n\nexport default class RowOrderService {\n private currentCell: Cell | null = null;\n private previousRow: number | null = null;\n\n constructor(private config: Config) {}\n\n /** Drag finished, calculate and apply changes */\n endOrder(e: MouseEvent, data: EventData) {\n if (this.currentCell === null) {\n return;\n }\n const newRow = this.getCell(e, data);\n\n // if position changed\n if (newRow.y !== this.currentCell.y) {\n // rgRow dragged out table\n if (newRow.y < 0) {\n newRow.y = 0;\n }\n // rgRow dragged to the top\n else if (newRow.y < this.currentCell.y) {\n newRow.y++;\n }\n this.config.positionChanged(this.currentCell.y, newRow.y);\n }\n this.clear();\n }\n\n /** Drag started, reserve initial cell for farther use */\n startOrder(e: MouseEvent, data: EventData): Cell {\n this.currentCell = this.getCell(e, data);\n return this.currentCell;\n }\n\n move(y: number, data: EventData): PositionItem | null {\n const rgRow = this.getRow(y, data);\n // if rgRow same as previous or below range (-1 = 0) do nothing\n if (this.previousRow === rgRow.itemIndex || rgRow.itemIndex < -1) {\n return null;\n }\n this.previousRow = rgRow.itemIndex;\n return rgRow;\n }\n\n /** Drag stopped, probably cursor outside of document area */\n clear() {\n this.currentCell = null;\n this.previousRow = null;\n }\n\n /** Calculate cell based on x, y position */\n getRow(y: number, { el, rows }: EventData): PositionItem {\n const { top } = el.getBoundingClientRect();\n const topRelative = y - top;\n const rgRow = getItemByPosition(rows, topRelative);\n const absolutePosition = {\n itemIndex: rgRow.itemIndex,\n start: rgRow.start + top,\n end: rgRow.end + top,\n };\n return absolutePosition;\n }\n\n /** Calculate cell based on x, y position */\n getCell({ x, y }: Cell, { el, rows, cols }: EventData): Cell {\n const { top, left } = el.getBoundingClientRect();\n const topRelative = y - top;\n const leftRelative = x - left;\n const rgRow = getItemByPosition(rows, topRelative);\n const rgCol = getItemByPosition(cols, leftRelative);\n return { x: rgCol.itemIndex, y: rgRow.itemIndex };\n }\n}\n","import {\n Component,\n Method,\n Event,\n EventEmitter,\n Prop,\n} from '@stencil/core';\nimport debounce from 'lodash/debounce';\n\nimport { DSourceState, setItems } from '../../store/dataSource/data.store';\nimport { DRAGG_TEXT } from '../../utils/consts';\nimport RowOrderService from './order-row.service';\nimport { DimensionRows } from '../../types/dimension';\nimport {\n DataType,\n DimensionSettingsState,\n DragStartEvent,\n Observable,\n PositionItem,\n} from '../../types/interfaces';\nimport { Cell } from '../../types/selection';\n\n@Component({ tag: 'revogr-order-editor' })\nexport class OrderEditor {\n // #region Properties\n /** Parent element */\n @Prop() parent: HTMLElement;\n /** Dimension settings Y */\n @Prop() dimensionRow: Observable<DimensionSettingsState>;\n /** Dimension settings X */\n @Prop() dimensionCol: Observable<DimensionSettingsState>;\n\n /** Static stores, not expected to change during component lifetime */\n @Prop() dataStore: Observable<DSourceState<DataType, DimensionRows>>;\n // #endregion\n\n // #region Events\n /** Row drag started */\n @Event({ eventName: 'rowdragstartinit', cancelable: true })\n rowDragStart: EventEmitter<{\n cell: Cell;\n text: string;\n pos: PositionItem;\n event: MouseEvent;\n }>;\n\n /** Row drag ended started */\n @Event({ eventName: 'rowdragendinit' })\n rowDragEnd: EventEmitter;\n\n /** Row move started */\n @Event({ eventName: 'rowdragmoveinit', cancelable: true }) rowDrag: EventEmitter<PositionItem>;\n\n /** Row mouse move started */\n @Event({ eventName: 'rowdragmousemove', cancelable: true })rowMouseMove: EventEmitter<Cell>;\n\n /** Row dragged, new range ready to be applied */\n @Event({ eventName: 'rowdropinit', cancelable: true }) rowDropped: EventEmitter<{\n from: number;\n to: number;\n }>;\n // #endregion\n\n // #region Private\n private rowOrderService: RowOrderService;\n private events: { name: keyof DocumentEventMap; listener: (e: MouseEvent) => void; }[] = [];\n private rowMoveFunc = debounce((y: number) => {\n const rgRow = this.rowOrderService.move(y, this.getData());\n if (rgRow !== null) {\n this.rowDrag.emit(rgRow);\n }\n }, 5);\n // #endregion\n\n // #region Methods\n @Method() async dragStart(e: DragStartEvent) {\n e.originalEvent.preventDefault();\n\n // extra check if previous ended\n if (this.events.length) {\n this.clearOrder();\n }\n\n const data = this.getData();\n const cell = this.rowOrderService.startOrder(e.originalEvent, data);\n const pos = this.rowOrderService.getRow(e.originalEvent.y, data);\n const dragStartEvent = this.rowDragStart.emit({\n cell,\n text: DRAGG_TEXT,\n pos,\n event: e.originalEvent,\n });\n if (dragStartEvent.defaultPrevented) {\n return;\n }\n\n const moveMove = (e: MouseEvent) => this.move(e);\n const mouseUp = (e: MouseEvent) => this.endOrder(e);\n const mouseLeave = () => this.clearOrder();\n\n this.events.push({\n name: 'mousemove',\n listener: moveMove,\n }, {\n name: 'mouseup',\n listener: mouseUp,\n }, {\n name: 'mouseleave',\n listener: mouseLeave,\n });\n document.addEventListener('mousemove', moveMove);\n // Action finished inside of the document\n document.addEventListener('mouseup', mouseUp);\n document.addEventListener('mouseleave', mouseLeave);\n }\n\n @Method() async endOrder(e: MouseEvent) {\n this.rowOrderService.endOrder(e, this.getData());\n this.clearOrder();\n }\n\n @Method() async clearOrder() {\n this.rowOrderService.clear();\n this.events.forEach(v => document.removeEventListener(v.name, v.listener));\n this.events.length = 0;\n this.rowDragEnd.emit();\n }\n // #endregion\n\n move({ x, y }: { x: number; y: number }) {\n this.rowMouseMove.emit({ x, y });\n this.rowMoveFunc(y);\n }\n\n connectedCallback() {\n this.rowOrderService = new RowOrderService({\n positionChanged: (f, t) => this.onPositionChanged(f, t),\n });\n }\n\n private onPositionChanged(from: number, to: number) {\n const dropEvent = this.rowDropped.emit({ from, to });\n if (dropEvent.defaultPrevented) {\n return;\n }\n const items = [...this.dataStore.get('items')];\n const toMove = items.splice(from, 1);\n items.splice(to, 0, ...toMove);\n setItems(this.dataStore, items);\n }\n\n private getData() {\n return {\n el: this.parent,\n rows: this.dimensionRow.state,\n cols: this.dimensionCol.state,\n };\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["Clipboard","onPaste","e","this","readonly","clipboardData","getData","isHTML","types","indexOf","data","dataText","beforePaste","emit","raw","event","defaultPrevented","parsedData","detail","table","htmlParse","textParse","beforePasteApply","parsed","pasteRegion","afterPasteApply","preventDefault","copyStarted","beforeCopy","copyRegion","cutStarted","beforeCut","clearRegion","doCopy","beforeCopyApply","parserCopy","setData","map","rgRow","join","result","rows","split","y","push","fragment","document","createRange","createContextualFragment","querySelector","Array","from","cells","cell","innerText","window","TextEditor","constructor","column","saveCallback","element","editCell","componentDidRender","editInput","timeout","_a","focus","onKeyDown","isEnter","isEnterKey","code","isKeyTab","isTab","target","isComposing","beforeDisconnect","getValue","blur","value","render","h","_additionalData","type","val","ref","el","revogrEditStyleCss","RevogrEditStyle0","RevoEdit","currentEditor","preventSaveOnClose","cancelChanges","_b","call","onAutoSave","beforeAutoSave","canSave","onSave","preventFocus","cellEdit","rgCol","x","prop","componentWillRender","editor","focusNext","closeEdit","firstElementChild","disconnectedCallback","saveOnClose","Host","class","EDIT_INPUT_WR","additionalData","RowOrderService","config","currentCell","previousRow","endOrder","newRow","getCell","positionChanged","clear","startOrder","move","getRow","itemIndex","top","getBoundingClientRect","topRelative","getItemByPosition","absolutePosition","start","end","cols","left","leftRelative","OrderEditor","events","rowMoveFunc","debounce","rowOrderService","rowDrag","dragStart","originalEvent","length","clearOrder","pos","dragStartEvent","rowDragStart","text","DRAGG_TEXT","moveMove","mouseUp","mouseLeave","name","listener","addEventListener","forEach","v","removeEventListener","rowDragEnd","rowMouseMove","connectedCallback","f","t","onPositionChanged","to","dropEvent","rowDropped","items","dataStore","get","toMove","splice","setItems","parent","dimensionRow","state","dimensionCol"],"sources":["src/components/clipboard/revogr-clipboard.tsx","src/components/editors/text-editor.tsx","src/components/editors/revogr-edit-style.scss?tag=revogr-edit","src/components/editors/revogr-edit.tsx","src/components/order/order-row.service.ts","src/components/order/revogr-order-editor.tsx"],"sourcesContent":["import { Component, Listen, Method, Event, EventEmitter, Prop } from '@stencil/core';\nimport { DataFormat } from '../../types/interfaces';\n/**\n * This Clipboard provides functionality for handling clipboard events in a web application.\n */\n@Component({ tag: 'revogr-clipboard' })\nexport class Clipboard {\n /**\n * If readonly mode - disabled Paste event\n */\n @Prop() readonly: boolean;\n\n /**\n * Paste 1. Fired before paste applied to the grid\n * @property {string} raw - raw data from clipboard\n * @property {ClipboardEvent} event - original event\n * @property {boolean} defaultPrevented - if true, paste will be canceled\n */\n @Event({ eventName: 'beforepaste' }) beforePaste: EventEmitter;\n\n /**\n * Paste 2. Fired before paste applied to the grid and after data parsed\n * @property {string} raw - raw data from clipboard\n * @property {string[][]} parsed - parsed data\n */\n @Event({ eventName: 'beforepasteapply' }) beforePasteApply: EventEmitter;\n\n /**\n * Paste 3. Internal method. When data region is ready pass it to the top.\n * @property {string[][]} data - data to paste\n * @property {boolean} defaultPrevented - if true, paste will be canceled\n */\n @Event({ eventName: 'pasteregion', bubbles: false }) pasteRegion: EventEmitter<string[][]>;\n\n\n /**\n * Paste 4. Fired after paste applied to the grid\n * @property {string} raw - raw data from clipboard\n * @property {string[][]} parsed - parsed data\n * @property {ClipboardEvent} event - original event\n * @property {boolean} defaultPrevented - if true, paste will be canceled\n */\n @Event({ eventName: 'afterpasteapply' }) afterPasteApply: EventEmitter;\n\n /**\n * Cut 1. Fired before cut triggered\n * @property {ClipboardEvent} event - original event\n * @property {boolean} defaultPrevented - if true, cut will be canceled\n */\n @Event({ eventName: 'beforecut' }) beforeCut: EventEmitter;\n\n /**\n * Cut 2. Clears region when cut is done\n */\n @Event({ eventName: 'clearregion' }) clearRegion: EventEmitter<DataTransfer>;\n\n /**\n * Copy 1. Fired before copy triggered\n * @property {ClipboardEvent} event - original event\n * @property {boolean} defaultPrevented - if true, copy will be canceled\n */\n @Event({ eventName: 'beforecopy' }) beforeCopy: EventEmitter;\n\n /**\n * Copy Method 1. Fired before copy applied to the clipboard from outside.\n * @property {DataTransfer} event - original event\n * @property {string} data - data to copy\n * @property {boolean} defaultPrevented - if true, copy will be canceled\n */\n @Event({ eventName: 'beforecopyapply' }) beforeCopyApply: EventEmitter;\n\n /**\n * Copy 2. Fired when region copied\n * @property {DataTransfer} data - data to copy\n * @property {boolean} defaultPrevented - if true, copy will be canceled\n */\n @Event({ eventName: 'copyregion', bubbles: false }) copyRegion: EventEmitter<DataTransfer>;\n\n @Listen('paste', { target: 'document' }) onPaste(e: ClipboardEvent) {\n // if readonly do nothing\n if (this.readonly) {\n return;\n }\n const clipboardData = this.getData(e);\n const isHTML = clipboardData.types.indexOf('text/html') > -1;\n const data = isHTML ? clipboardData.getData('text/html') : clipboardData.getData('text');\n const dataText = clipboardData.getData('text');\n\n const beforePaste = this.beforePaste.emit({\n raw: data,\n dataText,\n isHTML,\n event: e,\n });\n\n if (beforePaste.defaultPrevented) {\n return;\n }\n\n let parsedData: string[][];\n // if html, then search for table if no table fallback to regular text parsing\n if (beforePaste.detail.isHTML) {\n const table = this.htmlParse(beforePaste.detail.raw);\n parsedData = table || this.textParse(dataText);\n } else {\n parsedData = this.textParse(beforePaste.detail.raw);\n }\n const beforePasteApply = this.beforePasteApply.emit({\n raw: data,\n parsed: parsedData,\n event: e,\n });\n if (beforePasteApply.defaultPrevented) {\n return;\n }\n this.pasteRegion.emit(beforePasteApply.detail.parsed);\n // post paste action\n const afterPasteApply = this.afterPasteApply.emit({\n raw: data,\n parsed: parsedData,\n event: e,\n });\n // keep default behavior if needed\n if (afterPasteApply.defaultPrevented) {\n return;\n }\n e.preventDefault();\n }\n\n /**\n * Listen to copy event and emit copy region event\n */\n @Listen('copy', { target: 'document' }) copyStarted(e: ClipboardEvent) {\n const beforeCopy = this.beforeCopy.emit({\n event: e,\n });\n if (beforeCopy.defaultPrevented) {\n return;\n }\n const data = this.getData(beforeCopy.detail.event);\n this.copyRegion.emit(data);\n e.preventDefault();\n }\n\n /**\n * Listen to copy event and emit copy region event\n */\n @Listen('cut', { target: 'document' }) cutStarted(e: ClipboardEvent) {\n const beforeCut = this.beforeCut.emit({\n event: e,\n });\n if (beforeCut.defaultPrevented) {\n return;\n }\n const data = this.getData(beforeCut.detail.event);\n this.copyStarted(e);\n\n // if readonly do nothing\n if (this.readonly) {\n return;\n }\n\n this.clearRegion.emit(data);\n e.preventDefault();\n }\n\n @Method() async doCopy(e: DataTransfer, data?: DataFormat[][]) {\n const beforeCopyApply = this.beforeCopyApply.emit({\n event: e,\n data,\n });\n if (beforeCopyApply.defaultPrevented) {\n return;\n }\n const parsed = data ? this.parserCopy(data) : '';\n e.setData('text/plain', parsed);\n }\n\n parserCopy(data: DataFormat[][]) {\n return data.map(rgRow => rgRow.join('\\t')).join('\\n');\n }\n\n private textParse(data: string) {\n const result: string[][] = [];\n const rows = data.split(/\\r\\n|\\n|\\r/);\n for (let y in rows) {\n result.push(rows[y].split('\\t'));\n }\n return result;\n }\n\n private htmlParse(data: string) {\n const result: string[][] = [];\n const fragment = document.createRange().createContextualFragment(data);\n const table = fragment.querySelector('table');\n if (!table) {\n return null;\n }\n for (const rgRow of Array.from(table.rows)) {\n result.push(Array.from(rgRow.cells).map(cell => cell.innerText));\n }\n return result;\n }\n\n private getData(e: ClipboardEvent) {\n return e.clipboardData || (window as unknown as { clipboardData: DataTransfer | null })?.clipboardData;\n }\n}\n","import { h as createElement } from '@stencil/core';\nimport { isEnterKey, isTab } from '../../utils/key.utils';\nimport { timeout } from '../../utils';\nimport { ColumnRegular } from '../../types/interfaces';\nimport { EditCell, EditorBase, SaveData } from '../../types/selection';\n\n/**\n * Represents a cell editor in a grid.\n *\n * It's a good place to start with your own editor.\n * It manages the editing of cells by handling events, saving data, rendering the editor UI, and managing the lifecycle of the editor instance.\n */\n\n/**\n * Callback triggered on cell editor save\n * Closes editor when called\n * @param preventFocus - if true editor will not be closed and next cell will not be focused\n */\nexport type SaveCallback = (value: SaveData, preventFocus: boolean) => void;\n\nexport class TextEditor implements EditorBase {\n private editInput!: HTMLInputElement;\n\n public element: Element | null = null;\n public editCell: EditCell | null = null;\n\n constructor(\n public column: ColumnRegular,\n private saveCallback?: SaveCallback,\n ) {}\n\n /**\n * Callback triggered on cell editor render\n */\n async componentDidRender(): Promise<void> {\n if (this.editInput) {\n await timeout();\n this.editInput?.focus();\n }\n }\n\n private onKeyDown(e: KeyboardEvent) {\n const isEnter = isEnterKey(e.code);\n const isKeyTab = isTab(e.code);\n\n if (\n (isKeyTab || isEnter) &&\n e.target &&\n this.saveCallback &&\n !e.isComposing\n ) {\n // blur is needed to avoid autoscroll\n this.beforeDisconnect();\n // request callback which will close cell after all\n this.saveCallback(this.getValue(), isKeyTab);\n }\n }\n\n /**\n * IMPORTANT: Prevent scroll glitches when editor is closed and focus is on current input element.\n */\n beforeDisconnect() {\n this.editInput.blur();\n }\n\n /**\n * Get value from input\n */\n getValue() {\n return this.editInput?.value;\n }\n\n /**\n * Render method for Editor plugin.\n * Renders input element with passed data from cell.\n *\n * @required @method\n * @param {Function} h - h function from stencil render.\n * @param {Object} _additionalData - additional data from plugin.\n * @returns {VNode} - input element.\n */\n render(h: typeof createElement, _additionalData: any) {\n return h('input', {\n type: 'text',\n // set input value from cell data\n value: this.editCell?.val || '',\n // save input element as ref for further usage\n ref: (el: HTMLInputElement | null) => {\n this.editInput = el;\n },\n // listen to keydown event on input element\n onKeyDown: (e: KeyboardEvent) => this.onKeyDown(e),\n });\n }\n}\n","revogr-edit {\n display: block;\n position: absolute;\n background-color: #fff;\n\n input {\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n }\n\n revo-dropdown {\n height: 100%;\n\n &.shrink {\n fieldset legend > span {\n display: none;\n }\n }\n }\n}\n","import {\n Component,\n Event,\n EventEmitter,\n Prop,\n h,\n Element,\n Host,\n Method,\n} from '@stencil/core';\nimport { EDIT_INPUT_WR } from '../../utils/consts';\nimport { TextEditor } from './text-editor';\nimport { ColumnDataSchemaModel } from '../../types/interfaces';\nimport {\n EditCell,\n EditorCtr,\n SaveDataDetails,\n EditorBase,\n SaveData,\n} from '../../types/selection';\n\n/**\n * Represents a cell editor in a grid.\n * It manages the editing of cells by handling events, saving data, rendering the editor UI,\n * and managing the lifecycle of the editor instance.\n */\n@Component({\n tag: 'revogr-edit',\n styleUrl: 'revogr-edit-style.scss',\n})\nexport class RevoEdit {\n /**\n * Cell to edit data.\n */\n @Prop() editCell: EditCell;\n\n /**\n * Column data for editor.\n */\n @Prop() column: ColumnDataSchemaModel | null;\n /**\n * Custom editors register\n */\n @Prop() editor: EditorCtr | null;\n\n /**\n * Save on editor close. Defines if data should be saved on editor close.\n */\n @Prop() saveOnClose = false;\n /**\n * Additional data to pass to renderer\n */\n @Prop() additionalData: any;\n\n /**\n * Cell edit event\n */\n @Event({ eventName: 'celledit' }) cellEdit: EventEmitter<SaveDataDetails>;\n\n /**\n * Close editor event\n * pass true if requires focus next\n */\n @Event({ eventName: 'closeedit' }) closeEdit: EventEmitter<\n boolean | undefined\n >;\n\n /** Edit session editor */\n @Element() element: HTMLElement;\n private currentEditor: EditorBase | null = null;\n private preventSaveOnClose = false;\n\n /**\n * Cancel pending changes flag. Editor will be closed without autosave.\n */\n @Method() async cancelChanges() {\n this.preventSaveOnClose = true;\n }\n\n /**\n * Before editor got disconnected.\n * Can be triggered multiple times before actual disconnect.\n */\n @Method() async beforeDisconnect() {\n this.currentEditor?.beforeDisconnect?.();\n }\n\n onAutoSave() {\n this.preventSaveOnClose = true;\n const val = this.currentEditor.getValue?.();\n // For Editor plugin internal usage.\n // When you want to prevent save and use custom save of your own.\n if (this.currentEditor.beforeAutoSave) {\n const canSave = this.currentEditor.beforeAutoSave(val);\n if (canSave === false) {\n return;\n }\n }\n this.onSave(val, true);\n }\n\n /**\n * Callback triggered when cell editor saved.\n * Closes editor when called.\n * @param preventFocus - if true, editor will not be closed & next cell will not be focused.\n */\n onSave(val: SaveData, preventFocus?: boolean) {\n this.preventSaveOnClose = true;\n if (this.editCell) {\n this.cellEdit.emit({\n rgCol: this.editCell.x,\n rgRow: this.editCell.y,\n type: this.editCell.type,\n prop: this.editCell.prop,\n val,\n preventFocus,\n });\n }\n }\n\n componentWillRender() {\n // Active editor present\n if (this.currentEditor) {\n return;\n }\n this.preventSaveOnClose = false;\n\n // Custom editor usage.\n // Start with TextEditor (editors/text.tsx) for Custom editor.\n if (this.editor) {\n this.currentEditor = new this.editor(\n this.column,\n // save callback\n (e, preventFocus) => {\n this.onSave(e, preventFocus);\n },\n // cancel callback\n focusNext => {\n this.preventSaveOnClose = true;\n this.closeEdit.emit(focusNext);\n },\n );\n return;\n }\n // Default text editor usage\n this.currentEditor = new TextEditor(this.column, (e, preventFocus) =>\n this.onSave(e, preventFocus),\n );\n }\n\n componentDidRender() {\n if (!this.currentEditor) {\n return;\n }\n this.currentEditor.element = this.element.firstElementChild;\n this.currentEditor.componentDidRender?.();\n }\n\n disconnectedCallback() {\n if (this.saveOnClose) {\n // Can not be cancelled by `preventSaveOnClose` prop.\n // Editor requires `getValue` to be able to save.\n if (!this.preventSaveOnClose) {\n this.onAutoSave();\n }\n }\n\n this.preventSaveOnClose = false;\n if (!this.currentEditor) {\n return;\n }\n\n this.currentEditor.disconnectedCallback?.();\n this.currentEditor.element = null;\n this.currentEditor = null;\n }\n\n render() {\n if (this.currentEditor) {\n this.currentEditor.editCell = this.editCell;\n return (\n <Host class={EDIT_INPUT_WR}>\n {this.currentEditor.render(h, this.additionalData)}\n </Host>\n );\n }\n return '';\n }\n}\n","import { getItemByPosition } from '../../store/dimension/dimension.helpers';\nimport { DimensionSettingsState, PositionItem } from '../..';\nimport { Cell } from '../..';\n\ntype EventData = { el: HTMLElement; rows: DimensionSettingsState; cols: DimensionSettingsState };\ninterface Config {\n positionChanged(from: number, to: number): void;\n}\n\nexport default class RowOrderService {\n private currentCell: Cell | null = null;\n private previousRow: number | null = null;\n\n constructor(private config: Config) {}\n\n /** Drag finished, calculate and apply changes */\n endOrder(e: MouseEvent, data: EventData) {\n if (this.currentCell === null) {\n return;\n }\n const newRow = this.getCell(e, data);\n\n // if position changed\n if (newRow.y !== this.currentCell.y) {\n // rgRow dragged out table\n if (newRow.y < 0) {\n newRow.y = 0;\n }\n // rgRow dragged to the top\n else if (newRow.y < this.currentCell.y) {\n newRow.y++;\n }\n this.config.positionChanged(this.currentCell.y, newRow.y);\n }\n this.clear();\n }\n\n /** Drag started, reserve initial cell for farther use */\n startOrder(e: MouseEvent, data: EventData): Cell {\n this.currentCell = this.getCell(e, data);\n return this.currentCell;\n }\n\n move(y: number, data: EventData): PositionItem | null {\n const rgRow = this.getRow(y, data);\n // if rgRow same as previous or below range (-1 = 0) do nothing\n if (this.previousRow === rgRow.itemIndex || rgRow.itemIndex < -1) {\n return null;\n }\n this.previousRow = rgRow.itemIndex;\n return rgRow;\n }\n\n /** Drag stopped, probably cursor outside of document area */\n clear() {\n this.currentCell = null;\n this.previousRow = null;\n }\n\n /** Calculate cell based on x, y position */\n getRow(y: number, { el, rows }: EventData): PositionItem {\n const { top } = el.getBoundingClientRect();\n const topRelative = y - top;\n const rgRow = getItemByPosition(rows, topRelative);\n const absolutePosition = {\n itemIndex: rgRow.itemIndex,\n start: rgRow.start + top,\n end: rgRow.end + top,\n };\n return absolutePosition;\n }\n\n /** Calculate cell based on x, y position */\n getCell({ x, y }: Cell, { el, rows, cols }: EventData): Cell {\n const { top, left } = el.getBoundingClientRect();\n const topRelative = y - top;\n const leftRelative = x - left;\n const rgRow = getItemByPosition(rows, topRelative);\n const rgCol = getItemByPosition(cols, leftRelative);\n return { x: rgCol.itemIndex, y: rgRow.itemIndex };\n }\n}\n","import {\n Component,\n Method,\n Event,\n EventEmitter,\n Prop,\n} from '@stencil/core';\nimport debounce from 'lodash/debounce';\n\nimport { DSourceState, setItems } from '../../store/dataSource/data.store';\nimport { DRAGG_TEXT } from '../../utils/consts';\nimport RowOrderService from './order-row.service';\nimport { DimensionRows } from '../../types/dimension';\nimport {\n DataType,\n DimensionSettingsState,\n DragStartEvent,\n Observable,\n PositionItem,\n} from '../../types/interfaces';\nimport { Cell } from '../../types/selection';\n\n@Component({ tag: 'revogr-order-editor' })\nexport class OrderEditor {\n // #region Properties\n /** Parent element */\n @Prop() parent: HTMLElement;\n /** Dimension settings Y */\n @Prop() dimensionRow: Observable<DimensionSettingsState>;\n /** Dimension settings X */\n @Prop() dimensionCol: Observable<DimensionSettingsState>;\n\n /** Static stores, not expected to change during component lifetime */\n @Prop() dataStore: Observable<DSourceState<DataType, DimensionRows>>;\n // #endregion\n\n // #region Events\n /** Row drag started */\n @Event({ eventName: 'rowdragstartinit', cancelable: true })\n rowDragStart: EventEmitter<{\n cell: Cell;\n text: string;\n pos: PositionItem;\n event: MouseEvent;\n }>;\n\n /** Row drag ended started */\n @Event({ eventName: 'rowdragendinit' })\n rowDragEnd: EventEmitter;\n\n /** Row move started */\n @Event({ eventName: 'rowdragmoveinit', cancelable: true }) rowDrag: EventEmitter<PositionItem>;\n\n /** Row mouse move started */\n @Event({ eventName: 'rowdragmousemove', cancelable: true })rowMouseMove: EventEmitter<Cell>;\n\n /** Row dragged, new range ready to be applied */\n @Event({ eventName: 'rowdropinit', cancelable: true }) rowDropped: EventEmitter<{\n from: number;\n to: number;\n }>;\n // #endregion\n\n // #region Private\n private rowOrderService: RowOrderService;\n private events: { name: keyof DocumentEventMap; listener: (e: MouseEvent) => void; }[] = [];\n private rowMoveFunc = debounce((y: number) => {\n const rgRow = this.rowOrderService.move(y, this.getData());\n if (rgRow !== null) {\n this.rowDrag.emit(rgRow);\n }\n }, 5);\n // #endregion\n\n // #region Methods\n @Method() async dragStart(e: DragStartEvent) {\n e.originalEvent.preventDefault();\n\n // extra check if previous ended\n if (this.events.length) {\n this.clearOrder();\n }\n\n const data = this.getData();\n const cell = this.rowOrderService.startOrder(e.originalEvent, data);\n const pos = this.rowOrderService.getRow(e.originalEvent.y, data);\n const dragStartEvent = this.rowDragStart.emit({\n cell,\n text: DRAGG_TEXT,\n pos,\n event: e.originalEvent,\n });\n if (dragStartEvent.defaultPrevented) {\n return;\n }\n\n const moveMove = (e: MouseEvent) => this.move(e);\n const mouseUp = (e: MouseEvent) => this.endOrder(e);\n const mouseLeave = () => this.clearOrder();\n\n this.events.push({\n name: 'mousemove',\n listener: moveMove,\n }, {\n name: 'mouseup',\n listener: mouseUp,\n }, {\n name: 'mouseleave',\n listener: mouseLeave,\n });\n document.addEventListener('mousemove', moveMove);\n // Action finished inside of the document\n document.addEventListener('mouseup', mouseUp);\n document.addEventListener('mouseleave', mouseLeave);\n }\n\n @Method() async endOrder(e: MouseEvent) {\n this.rowOrderService.endOrder(e, this.getData());\n this.clearOrder();\n }\n\n @Method() async clearOrder() {\n this.rowOrderService.clear();\n this.events.forEach(v => document.removeEventListener(v.name, v.listener));\n this.events.length = 0;\n this.rowDragEnd.emit();\n }\n // #endregion\n\n move({ x, y }: { x: number; y: number }) {\n this.rowMouseMove.emit({ x, y });\n this.rowMoveFunc(y);\n }\n\n connectedCallback() {\n this.rowOrderService = new RowOrderService({\n positionChanged: (f, t) => this.onPositionChanged(f, t),\n });\n }\n\n private onPositionChanged(from: number, to: number) {\n const dropEvent = this.rowDropped.emit({ from, to });\n if (dropEvent.defaultPrevented) {\n return;\n }\n const items = [...this.dataStore.get('items')];\n const toMove = items.splice(from, 1);\n items.splice(to, 0, ...toMove);\n setItems(this.dataStore, items);\n }\n\n private getData() {\n return {\n el: this.parent,\n rows: this.dimensionRow.state,\n cols: this.dimensionCol.state,\n };\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EventEmitter } from '../../stencil-public-runtime';
|
|
2
|
-
import {
|
|
2
|
+
import { ColumnDataSchemaModel } from '../../types/interfaces';
|
|
3
3
|
import { EditCell, EditorCtr, SaveDataDetails, SaveData } from '../../types/selection';
|
|
4
4
|
/**
|
|
5
5
|
* Represents a cell editor in a grid.
|
|
@@ -14,7 +14,7 @@ export declare class RevoEdit {
|
|
|
14
14
|
/**
|
|
15
15
|
* Column data for editor.
|
|
16
16
|
*/
|
|
17
|
-
column:
|
|
17
|
+
column: ColumnDataSchemaModel | null;
|
|
18
18
|
/**
|
|
19
19
|
* Custom editors register
|
|
20
20
|
*/
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* It contains typing information for all components that exist in this project.
|
|
6
6
|
*/
|
|
7
7
|
import { HTMLStencilElement, JSXBase } from "./stencil-public-runtime";
|
|
8
|
-
import { AllDimensionType, ApplyFocusEvent, BeforeCellRenderEvent, BeforeRowRenderEvent, ColumnGrouping, ColumnProp, ColumnRegular, ColumnType, DataFormat, DataType, DimensionSettingsState, DragStartEvent, FocusRenderEvent, FocusTemplateFunc, InitialHeaderClick, Observable, PositionItem, RowDefinition, RowHeaders, ViewPortResizeEvent, ViewPortScrollEvent, ViewportState, ViewSettingSizeProp } from "./types/interfaces";
|
|
8
|
+
import { AllDimensionType, ApplyFocusEvent, BeforeCellRenderEvent, BeforeRowRenderEvent, ColumnDataSchemaModel, ColumnGrouping, ColumnProp, ColumnRegular, ColumnType, DataFormat, DataType, DimensionSettingsState, DragStartEvent, FocusRenderEvent, FocusTemplateFunc, InitialHeaderClick, Observable, PositionItem, RowDefinition, RowHeaders, ViewPortResizeEvent, ViewPortScrollEvent, ViewportState, ViewSettingSizeProp } from "./types/interfaces";
|
|
9
9
|
import { AfterEditEvent, BeforeEdit, BeforeRangeSaveDataDetails, BeforeSaveDataDetails, Cell, ChangedRange, EditCell, EditorCtr, Editors, RangeArea, SaveDataDetails, SelectionStoreState, TempRange } from "./types/selection";
|
|
10
10
|
import { PluginBaseComponent, PluginExternalConstructor } from "./types/plugin";
|
|
11
11
|
import { Theme } from "./types/theme";
|
|
@@ -23,7 +23,7 @@ import { LogicFunction } from "./plugins/filter/filter.types";
|
|
|
23
23
|
import { ResizeProps } from "./services/resizable.directive";
|
|
24
24
|
import { Cell as Cell1, ColumnRegular as ColumnRegular1, DataType as DataType1, DimensionCols as DimensionCols1, DimensionRows as DimensionRows1, DimensionSettingsState as DimensionSettingsState1, Observable as Observable1, SelectionStoreState as SelectionStoreState1 } from "./components";
|
|
25
25
|
import { ElementScroll, ViewportData } from "./types/viewport.interfaces";
|
|
26
|
-
export { AllDimensionType, ApplyFocusEvent, BeforeCellRenderEvent, BeforeRowRenderEvent, ColumnGrouping, ColumnProp, ColumnRegular, ColumnType, DataFormat, DataType, DimensionSettingsState, DragStartEvent, FocusRenderEvent, FocusTemplateFunc, InitialHeaderClick, Observable, PositionItem, RowDefinition, RowHeaders, ViewPortResizeEvent, ViewPortScrollEvent, ViewportState, ViewSettingSizeProp } from "./types/interfaces";
|
|
26
|
+
export { AllDimensionType, ApplyFocusEvent, BeforeCellRenderEvent, BeforeRowRenderEvent, ColumnDataSchemaModel, ColumnGrouping, ColumnProp, ColumnRegular, ColumnType, DataFormat, DataType, DimensionSettingsState, DragStartEvent, FocusRenderEvent, FocusTemplateFunc, InitialHeaderClick, Observable, PositionItem, RowDefinition, RowHeaders, ViewPortResizeEvent, ViewPortScrollEvent, ViewportState, ViewSettingSizeProp } from "./types/interfaces";
|
|
27
27
|
export { AfterEditEvent, BeforeEdit, BeforeRangeSaveDataDetails, BeforeSaveDataDetails, Cell, ChangedRange, EditCell, EditorCtr, Editors, RangeArea, SaveDataDetails, SelectionStoreState, TempRange } from "./types/selection";
|
|
28
28
|
export { PluginBaseComponent, PluginExternalConstructor } from "./types/plugin";
|
|
29
29
|
export { Theme } from "./types/theme";
|
|
@@ -382,7 +382,7 @@ export namespace Components {
|
|
|
382
382
|
/**
|
|
383
383
|
* Column data for editor.
|
|
384
384
|
*/
|
|
385
|
-
"column":
|
|
385
|
+
"column": ColumnDataSchemaModel | null;
|
|
386
386
|
/**
|
|
387
387
|
* Cell to edit data.
|
|
388
388
|
*/
|
|
@@ -1642,7 +1642,7 @@ declare namespace LocalJSX {
|
|
|
1642
1642
|
/**
|
|
1643
1643
|
* Column data for editor.
|
|
1644
1644
|
*/
|
|
1645
|
-
"column"?:
|
|
1645
|
+
"column"?: ColumnDataSchemaModel | null;
|
|
1646
1646
|
/**
|
|
1647
1647
|
* Cell to edit data.
|
|
1648
1648
|
*/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { VNode } from '../stencil-public-runtime';
|
|
2
2
|
import { DimensionRows, DimensionCols } from './dimension';
|
|
3
|
-
import { ColumnProp, DataType, DataLookup,
|
|
3
|
+
import { ColumnProp, DataType, DataLookup, HyperFunc, ColumnDataSchemaModel } from './interfaces';
|
|
4
4
|
export type RowIndex = number;
|
|
5
5
|
export type ColIndex = number;
|
|
6
6
|
export type SelectionStoreState = {
|
|
@@ -88,15 +88,19 @@ export type EditCell = EditCellStore & BeforeSaveDataDetails;
|
|
|
88
88
|
export type Editors = {
|
|
89
89
|
[name: string]: EditorCtr;
|
|
90
90
|
};
|
|
91
|
-
export
|
|
92
|
-
|
|
91
|
+
export type EditorCtr = EditorCtrCallable & EditorCtrConstructible;
|
|
92
|
+
export interface EditorCtrCallable {
|
|
93
|
+
(column: ColumnDataSchemaModel, save: (value: SaveData, preventFocus?: boolean) => void, close: (focusNext?: boolean) => void): EditorBase;
|
|
94
|
+
}
|
|
95
|
+
export interface EditorCtrConstructible {
|
|
96
|
+
new (column: ColumnDataSchemaModel, save: (value: SaveData, preventFocus?: boolean) => void, close: (focusNext?: boolean) => void): EditorBase;
|
|
93
97
|
}
|
|
94
98
|
export interface EditorBase {
|
|
95
99
|
element?: Element | null;
|
|
96
100
|
editCell?: EditCell;
|
|
97
101
|
/**
|
|
98
102
|
* Autosave usage when you want to return value for models.
|
|
99
|
-
|
|
103
|
+
*/
|
|
100
104
|
getValue?(): any;
|
|
101
105
|
/**
|
|
102
106
|
* For Editor plugin internal usage.
|
|
@@ -105,9 +109,9 @@ export interface EditorBase {
|
|
|
105
109
|
beforeAutoSave?(val?: any): boolean;
|
|
106
110
|
beforeUpdate?(): void;
|
|
107
111
|
/**
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
112
|
+
* Before editor got disconnected.
|
|
113
|
+
* Can be triggered multiple times before actual disconnect.
|
|
114
|
+
*/
|
|
111
115
|
beforeDisconnect?(): void;
|
|
112
116
|
componentDidRender?(): void;
|
|
113
117
|
disconnectedCallback?(): void;
|
package/hydrate/index.js
CHANGED
|
@@ -9349,7 +9349,7 @@ class OverlaySelection {
|
|
|
9349
9349
|
return null;
|
|
9350
9350
|
}
|
|
9351
9351
|
const style = getElStyle(renderEvent.detail.range, this.dimensionRow.state, this.dimensionCol.state);
|
|
9352
|
-
return (hAsync("revogr-edit", { style: style, ref: el => (this.revogrEdit = el), additionalData: this.additionalData, editCell: editable, saveOnClose: this.applyChangesOnClose, column: this.columnService.
|
|
9352
|
+
return (hAsync("revogr-edit", { style: style, ref: el => (this.revogrEdit = el), additionalData: this.additionalData, editCell: editable, saveOnClose: this.applyChangesOnClose, column: this.columnService.rowDataModel(editCell.y, editCell.x), editor: this.columnService.getCellEditor(editCell.y, editCell.x, this.editors), onCloseedit: e => this.closeEdit(e), onCelledit: e => {
|
|
9353
9353
|
const saveEv = this.beforeCellSave.emit(e.detail);
|
|
9354
9354
|
if (!saveEv.defaultPrevented) {
|
|
9355
9355
|
this.cellEdit(saveEv.detail);
|
|
@@ -9387,14 +9387,14 @@ class OverlaySelection {
|
|
|
9387
9387
|
nodes.push(hAsync("revogr-order-editor", { ref: e => (this.orderEditor = e), dataStore: this.dataStore, dimensionRow: this.dimensionRow, dimensionCol: this.dimensionCol, parent: this.element, onRowdragstartinit: e => this.rowDragStart(e) }));
|
|
9388
9388
|
}
|
|
9389
9389
|
}
|
|
9390
|
-
return (hAsync(Host, { key: '
|
|
9390
|
+
return (hAsync(Host, { key: 'd20fcf63958e3d491f4fd881a4a5dd242cfdd9ac', class: { mobile: this.isMobileDevice },
|
|
9391
9391
|
// Open Editor on DblClick
|
|
9392
9392
|
onDblClick: (e) => {
|
|
9393
9393
|
// DblClick prevented outside - Editor will not open
|
|
9394
9394
|
if (!e.defaultPrevented) {
|
|
9395
9395
|
this.doEdit();
|
|
9396
9396
|
}
|
|
9397
|
-
}, onMouseDown: (e) => this.onElementMouseDown(e), onTouchStart: (e) => this.onElementMouseDown(e, true) }, nodes, hAsync("slot", { key: '
|
|
9397
|
+
}, onMouseDown: (e) => this.onElementMouseDown(e), onTouchStart: (e) => this.onElementMouseDown(e, true) }, nodes, hAsync("slot", { key: '89b9bec7824739ea11fadeecbf3908ac74e85c96', name: "data" })));
|
|
9398
9398
|
}
|
|
9399
9399
|
doFocus(focus, end, next) {
|
|
9400
9400
|
const { defaultPrevented } = this.beforeFocusCell.emit(this.columnService.getSaveData(focus.y, focus.x));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@revolist/revogrid",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.9",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Virtual reactive data grid spreadsheet component - RevoGrid.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -86,9 +86,13 @@
|
|
|
86
86
|
"build": "npm run api:clear && stencil build --prod && rm -f loader/package.json && npm run api:update",
|
|
87
87
|
"api:clear": "rm -rf docs/guide/api",
|
|
88
88
|
"api:update": "./generate_api.sh",
|
|
89
|
+
|
|
89
90
|
"readme": "./readme/generate_readme.sh",
|
|
90
|
-
"
|
|
91
|
+
"package:update": "node ./scripts/package-version.mjs --version=4.0.9",
|
|
92
|
+
|
|
93
|
+
"test": "stencil test",
|
|
91
94
|
"serve": "stencil build --dev --watch --serve",
|
|
95
|
+
"publish": "npm run build && npm publish --public --tag pre-release && npm run package:update",
|
|
92
96
|
"deploy": "git submodule update && npm run build:demo"
|
|
93
97
|
},
|
|
94
98
|
"devDependencies": {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"revogr-edit2.js","mappings":"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","names":[],"sources":["src/utils/key.codes.ts","src/utils/platform.ts","src/utils/key.utils.ts","src/components/editors/text-editor.tsx","src/components/editors/revogr-edit-style.scss?tag=revogr-edit","src/components/editors/revogr-edit.tsx"],"sourcesContent":["enum codes {\n MOUSE_LEFT = 1,\n MOUSE_RIGHT = 3,\n MOUSE_MIDDLE = 2,\n BACKSPACE = 8,\n COMMA = 188,\n INSERT = 45,\n DELETE = 46,\n END = 35,\n ENTER = 13,\n ESCAPE = 27,\n CONTROL = 17,\n COMMAND_LEFT = 91,\n COMMAND_RIGHT = 93,\n COMMAND_FIREFOX = 224,\n ALT = 18,\n HOME = 36,\n PAGE_DOWN = 34,\n PAGE_UP = 33,\n PERIOD = 190,\n SPACE = 32,\n SHIFT = 16,\n CAPS_LOCK = 20,\n TAB = 9,\n ARROW_RIGHT = 39,\n ARROW_LEFT = 37,\n ARROW_UP = 38,\n ARROW_DOWN = 40,\n F1 = 112,\n F2 = 113,\n F3 = 114,\n F4 = 115,\n F5 = 116,\n F6 = 117,\n F7 = 118,\n F8 = 119,\n F9 = 120,\n F10 = 121,\n F11 = 122,\n F12 = 123,\n A = 65,\n C = 67,\n D = 68,\n F = 70,\n L = 76,\n O = 79,\n P = 80,\n S = 83,\n V = 86,\n X = 88,\n}\n\nenum codesLetter {\n ENTER = 'Enter',\n ENTER_NUM = 'NumpadEnter',\n A = 'KeyA',\n C = 'KeyC',\n X = 'KeyX',\n V = 'KeyV',\n ESCAPE = 'Escape',\n TAB = 'Tab',\n BACKSPACE = 'Backspace',\n DELETE = 'Delete',\n ARROW_RIGHT = 'ArrowRight',\n ARROW_LEFT = 'ArrowLeft',\n ARROW_UP = 'ArrowUp',\n ARROW_DOWN = 'ArrowDown',\n SHIFT = 'Shift',\n}\n\nexport default codes;\nexport { codesLetter };\n","enum osPlatform {\n mac = 'Mac',\n}\nexport default osPlatform;\n","import KeyCodesEnum, { codesLetter } from './key.codes';\nimport OsPlatform from './platform';\nimport includes from 'lodash/includes';\n\nexport function isLetterKey(code: number): boolean {\n return (\n code === 32 || // space\n (code >= 48 && code <= 57) ||\n (code >= 96 && code <= 111) ||\n (code >= 186 && code <= 192) ||\n (code >= 219 && code <= 222) ||\n code >= 226 ||\n (code >= 65 && code <= 90)\n ); // a-z\n}\n\nexport function isMetaKey(code: number): boolean {\n const keys: KeyCodesEnum[] = [\n KeyCodesEnum.ARROW_DOWN,\n KeyCodesEnum.ARROW_UP,\n KeyCodesEnum.ARROW_LEFT,\n KeyCodesEnum.ARROW_RIGHT,\n KeyCodesEnum.HOME,\n KeyCodesEnum.END,\n KeyCodesEnum.DELETE,\n KeyCodesEnum.BACKSPACE,\n KeyCodesEnum.F1,\n KeyCodesEnum.F2,\n KeyCodesEnum.F3,\n KeyCodesEnum.F4,\n KeyCodesEnum.F5,\n KeyCodesEnum.F6,\n KeyCodesEnum.F7,\n KeyCodesEnum.F8,\n KeyCodesEnum.F9,\n KeyCodesEnum.F10,\n KeyCodesEnum.F11,\n KeyCodesEnum.F12,\n KeyCodesEnum.TAB,\n KeyCodesEnum.PAGE_DOWN,\n KeyCodesEnum.PAGE_UP,\n KeyCodesEnum.ENTER,\n KeyCodesEnum.ESCAPE,\n KeyCodesEnum.SHIFT,\n KeyCodesEnum.CAPS_LOCK,\n KeyCodesEnum.ALT,\n ];\n\n return keys.indexOf(code) !== -1;\n}\n\n// navigator.platform\nexport function isCtrlKey(code: number, platform: string): boolean {\n if (platform.includes(OsPlatform.mac)) {\n return includes([KeyCodesEnum.COMMAND_LEFT, KeyCodesEnum.COMMAND_RIGHT, KeyCodesEnum.COMMAND_FIREFOX], code);\n }\n\n return KeyCodesEnum.CONTROL === code;\n}\n\nexport function isCtrlMetaKey(code: KeyCodesEnum): boolean {\n return includes([KeyCodesEnum.CONTROL, KeyCodesEnum.COMMAND_LEFT, KeyCodesEnum.COMMAND_RIGHT, KeyCodesEnum.COMMAND_FIREFOX], code);\n}\n\nexport function isClear(code: string): boolean {\n return codesLetter.BACKSPACE === code || codesLetter.DELETE === code;\n}\n\nexport function isTab(code: string): boolean {\n return codesLetter.TAB === code;\n}\n\nexport function isEnterKey(code: string): boolean {\n return code === codesLetter.ENTER || code === codesLetter.ENTER_NUM;\n}\n\nexport function isCut(event: KeyboardEvent): boolean {\n return (event.ctrlKey && event.code === 'KeyX') || // Ctrl + X on Windows\n (event.metaKey && event.code === 'KeyX'); // Cmd + X on Mac\n}\nexport function isCopy(event: KeyboardEvent): boolean {\n return (event.ctrlKey && event.code === 'KeyC') || // Ctrl + C on Windows\n (event.metaKey && event.code === 'KeyC'); // Cmd + C on Mac\n}\nexport function isPaste(event: KeyboardEvent): boolean {\n return (event.ctrlKey && event.code === 'KeyV') || // Ctrl + V on Windows\n (event.metaKey && event.code === 'KeyV'); // Cmd + V on Mac\n}\nexport function isAll(event: KeyboardEvent): boolean {\n return (event.ctrlKey && event.code === 'KeyA') || // Ctrl + A on Windows\n (event.metaKey && event.code === 'KeyA'); // Cmd + A on Mac\n}\n","import { h as createElement } from '@stencil/core';\nimport { isEnterKey, isTab } from '../../utils/key.utils';\nimport { timeout } from '../../utils';\nimport { ColumnRegular } from '../../types/interfaces';\nimport { EditCell, EditorBase, SaveData } from '../../types/selection';\n\n/**\n * Represents a cell editor in a grid.\n *\n * It's a good place to start with your own editor.\n * It manages the editing of cells by handling events, saving data, rendering the editor UI, and managing the lifecycle of the editor instance.\n */\n\n/**\n * Callback triggered on cell editor save\n * Closes editor when called\n * @param preventFocus - if true editor will not be closed and next cell will not be focused\n */\nexport type SaveCallback = (value: SaveData, preventFocus: boolean) => void;\n\nexport class TextEditor implements EditorBase {\n private editInput!: HTMLInputElement;\n\n public element: Element | null = null;\n public editCell: EditCell | null = null;\n\n constructor(\n public column: ColumnRegular,\n private saveCallback?: SaveCallback,\n ) {}\n\n /**\n * Callback triggered on cell editor render\n */\n async componentDidRender(): Promise<void> {\n if (this.editInput) {\n await timeout();\n this.editInput?.focus();\n }\n }\n\n private onKeyDown(e: KeyboardEvent) {\n const isEnter = isEnterKey(e.code);\n const isKeyTab = isTab(e.code);\n\n if (\n (isKeyTab || isEnter) &&\n e.target &&\n this.saveCallback &&\n !e.isComposing\n ) {\n // blur is needed to avoid autoscroll\n this.beforeDisconnect();\n // request callback which will close cell after all\n this.saveCallback(this.getValue(), isKeyTab);\n }\n }\n\n /**\n * IMPORTANT: Prevent scroll glitches when editor is closed and focus is on current input element.\n */\n beforeDisconnect() {\n this.editInput.blur();\n }\n\n /**\n * Get value from input\n */\n getValue() {\n return this.editInput?.value;\n }\n\n /**\n * Render method for Editor plugin.\n * Renders input element with passed data from cell.\n *\n * @required @method\n * @param {Function} h - h function from stencil render.\n * @param {Object} _additionalData - additional data from plugin.\n * @returns {VNode} - input element.\n */\n render(h: typeof createElement, _additionalData: any) {\n return h('input', {\n type: 'text',\n // set input value from cell data\n value: this.editCell?.val || '',\n // save input element as ref for further usage\n ref: (el: HTMLInputElement | null) => {\n this.editInput = el;\n },\n // listen to keydown event on input element\n onKeyDown: (e: KeyboardEvent) => this.onKeyDown(e),\n });\n }\n}\n","revogr-edit {\n display: block;\n position: absolute;\n background-color: #fff;\n\n input {\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n }\n\n revo-dropdown {\n height: 100%;\n\n &.shrink {\n fieldset legend > span {\n display: none;\n }\n }\n }\n}\n","import {\n Component,\n Event,\n EventEmitter,\n Prop,\n h,\n Element,\n Host,\n Method,\n} from '@stencil/core';\nimport { EDIT_INPUT_WR } from '../../utils/consts';\nimport { TextEditor } from './text-editor';\nimport { ColumnRegular } from '../../types/interfaces';\nimport {\n EditCell,\n EditorCtr,\n SaveDataDetails,\n EditorBase,\n SaveData,\n} from '../../types/selection';\n\n/**\n * Represents a cell editor in a grid.\n * It manages the editing of cells by handling events, saving data, rendering the editor UI,\n * and managing the lifecycle of the editor instance.\n */\n@Component({\n tag: 'revogr-edit',\n styleUrl: 'revogr-edit-style.scss',\n})\nexport class RevoEdit {\n /**\n * Cell to edit data.\n */\n @Prop() editCell: EditCell;\n\n /**\n * Column data for editor.\n */\n @Prop() column: ColumnRegular | null;\n /**\n * Custom editors register\n */\n @Prop() editor: EditorCtr | null;\n\n /**\n * Save on editor close. Defines if data should be saved on editor close.\n */\n @Prop() saveOnClose = false;\n /**\n * Additional data to pass to renderer\n */\n @Prop() additionalData: any;\n\n /**\n * Cell edit event\n */\n @Event({ eventName: 'celledit' }) cellEdit: EventEmitter<SaveDataDetails>;\n\n /**\n * Close editor event\n * pass true if requires focus next\n */\n @Event({ eventName: 'closeedit' }) closeEdit: EventEmitter<\n boolean | undefined\n >;\n\n /** Edit session editor */\n @Element() element: HTMLElement;\n private currentEditor: EditorBase | null = null;\n private preventSaveOnClose = false;\n\n /**\n * Cancel pending changes flag. Editor will be closed without autosave.\n */\n @Method() async cancelChanges() {\n this.preventSaveOnClose = true;\n }\n\n /**\n * Before editor got disconnected.\n * Can be triggered multiple times before actual disconnect.\n */\n @Method() async beforeDisconnect() {\n this.currentEditor?.beforeDisconnect?.();\n }\n\n onAutoSave() {\n this.preventSaveOnClose = true;\n const val = this.currentEditor.getValue?.();\n // For Editor plugin internal usage.\n // When you want to prevent save and use custom save of your own.\n if (this.currentEditor.beforeAutoSave) {\n const canSave = this.currentEditor.beforeAutoSave(val);\n if (canSave === false) {\n return;\n }\n }\n this.onSave(val, true);\n }\n\n /**\n * Callback triggered when cell editor saved.\n * Closes editor when called.\n * @param preventFocus - if true, editor will not be closed & next cell will not be focused.\n */\n onSave(val: SaveData, preventFocus?: boolean) {\n this.preventSaveOnClose = true;\n if (this.editCell) {\n this.cellEdit.emit({\n rgCol: this.editCell.x,\n rgRow: this.editCell.y,\n type: this.editCell.type,\n prop: this.editCell.prop,\n val,\n preventFocus,\n });\n }\n }\n\n componentWillRender() {\n // Active editor present\n if (this.currentEditor) {\n return;\n }\n this.preventSaveOnClose = false;\n\n // Custom editor usage.\n // Start with TextEditor (editors/text.tsx) for Custom editor.\n if (this.editor) {\n this.currentEditor = new this.editor(\n this.column,\n // save callback\n (e, preventFocus) => {\n this.onSave(e, preventFocus);\n },\n // cancel callback\n focusNext => {\n this.preventSaveOnClose = true;\n this.closeEdit.emit(focusNext);\n },\n );\n return;\n }\n // Default text editor usage\n this.currentEditor = new TextEditor(this.column, (e, preventFocus) =>\n this.onSave(e, preventFocus),\n );\n }\n\n componentDidRender() {\n if (!this.currentEditor) {\n return;\n }\n this.currentEditor.element = this.element.firstElementChild;\n this.currentEditor.componentDidRender?.();\n }\n\n disconnectedCallback() {\n if (this.saveOnClose) {\n // Can not be cancelled by `preventSaveOnClose` prop.\n // Editor requires `getValue` to be able to save.\n if (!this.preventSaveOnClose) {\n this.onAutoSave();\n }\n }\n\n this.preventSaveOnClose = false;\n if (!this.currentEditor) {\n return;\n }\n\n this.currentEditor.disconnectedCallback?.();\n this.currentEditor.element = null;\n this.currentEditor = null;\n }\n\n render() {\n if (this.currentEditor) {\n this.currentEditor.editCell = this.editCell;\n return (\n <Host class={EDIT_INPUT_WR}>\n {this.currentEditor.render(h, this.additionalData)}\n </Host>\n );\n }\n return '';\n }\n}\n"],"version":3}
|
|
1
|
+
{"file":"revogr-edit2.js","mappings":"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","names":[],"sources":["src/utils/key.codes.ts","src/utils/platform.ts","src/utils/key.utils.ts","src/components/editors/text-editor.tsx","src/components/editors/revogr-edit-style.scss?tag=revogr-edit","src/components/editors/revogr-edit.tsx"],"sourcesContent":["enum codes {\n MOUSE_LEFT = 1,\n MOUSE_RIGHT = 3,\n MOUSE_MIDDLE = 2,\n BACKSPACE = 8,\n COMMA = 188,\n INSERT = 45,\n DELETE = 46,\n END = 35,\n ENTER = 13,\n ESCAPE = 27,\n CONTROL = 17,\n COMMAND_LEFT = 91,\n COMMAND_RIGHT = 93,\n COMMAND_FIREFOX = 224,\n ALT = 18,\n HOME = 36,\n PAGE_DOWN = 34,\n PAGE_UP = 33,\n PERIOD = 190,\n SPACE = 32,\n SHIFT = 16,\n CAPS_LOCK = 20,\n TAB = 9,\n ARROW_RIGHT = 39,\n ARROW_LEFT = 37,\n ARROW_UP = 38,\n ARROW_DOWN = 40,\n F1 = 112,\n F2 = 113,\n F3 = 114,\n F4 = 115,\n F5 = 116,\n F6 = 117,\n F7 = 118,\n F8 = 119,\n F9 = 120,\n F10 = 121,\n F11 = 122,\n F12 = 123,\n A = 65,\n C = 67,\n D = 68,\n F = 70,\n L = 76,\n O = 79,\n P = 80,\n S = 83,\n V = 86,\n X = 88,\n}\n\nenum codesLetter {\n ENTER = 'Enter',\n ENTER_NUM = 'NumpadEnter',\n A = 'KeyA',\n C = 'KeyC',\n X = 'KeyX',\n V = 'KeyV',\n ESCAPE = 'Escape',\n TAB = 'Tab',\n BACKSPACE = 'Backspace',\n DELETE = 'Delete',\n ARROW_RIGHT = 'ArrowRight',\n ARROW_LEFT = 'ArrowLeft',\n ARROW_UP = 'ArrowUp',\n ARROW_DOWN = 'ArrowDown',\n SHIFT = 'Shift',\n}\n\nexport default codes;\nexport { codesLetter };\n","enum osPlatform {\n mac = 'Mac',\n}\nexport default osPlatform;\n","import KeyCodesEnum, { codesLetter } from './key.codes';\nimport OsPlatform from './platform';\nimport includes from 'lodash/includes';\n\nexport function isLetterKey(code: number): boolean {\n return (\n code === 32 || // space\n (code >= 48 && code <= 57) ||\n (code >= 96 && code <= 111) ||\n (code >= 186 && code <= 192) ||\n (code >= 219 && code <= 222) ||\n code >= 226 ||\n (code >= 65 && code <= 90)\n ); // a-z\n}\n\nexport function isMetaKey(code: number): boolean {\n const keys: KeyCodesEnum[] = [\n KeyCodesEnum.ARROW_DOWN,\n KeyCodesEnum.ARROW_UP,\n KeyCodesEnum.ARROW_LEFT,\n KeyCodesEnum.ARROW_RIGHT,\n KeyCodesEnum.HOME,\n KeyCodesEnum.END,\n KeyCodesEnum.DELETE,\n KeyCodesEnum.BACKSPACE,\n KeyCodesEnum.F1,\n KeyCodesEnum.F2,\n KeyCodesEnum.F3,\n KeyCodesEnum.F4,\n KeyCodesEnum.F5,\n KeyCodesEnum.F6,\n KeyCodesEnum.F7,\n KeyCodesEnum.F8,\n KeyCodesEnum.F9,\n KeyCodesEnum.F10,\n KeyCodesEnum.F11,\n KeyCodesEnum.F12,\n KeyCodesEnum.TAB,\n KeyCodesEnum.PAGE_DOWN,\n KeyCodesEnum.PAGE_UP,\n KeyCodesEnum.ENTER,\n KeyCodesEnum.ESCAPE,\n KeyCodesEnum.SHIFT,\n KeyCodesEnum.CAPS_LOCK,\n KeyCodesEnum.ALT,\n ];\n\n return keys.indexOf(code) !== -1;\n}\n\n// navigator.platform\nexport function isCtrlKey(code: number, platform: string): boolean {\n if (platform.includes(OsPlatform.mac)) {\n return includes([KeyCodesEnum.COMMAND_LEFT, KeyCodesEnum.COMMAND_RIGHT, KeyCodesEnum.COMMAND_FIREFOX], code);\n }\n\n return KeyCodesEnum.CONTROL === code;\n}\n\nexport function isCtrlMetaKey(code: KeyCodesEnum): boolean {\n return includes([KeyCodesEnum.CONTROL, KeyCodesEnum.COMMAND_LEFT, KeyCodesEnum.COMMAND_RIGHT, KeyCodesEnum.COMMAND_FIREFOX], code);\n}\n\nexport function isClear(code: string): boolean {\n return codesLetter.BACKSPACE === code || codesLetter.DELETE === code;\n}\n\nexport function isTab(code: string): boolean {\n return codesLetter.TAB === code;\n}\n\nexport function isEnterKey(code: string): boolean {\n return code === codesLetter.ENTER || code === codesLetter.ENTER_NUM;\n}\n\nexport function isCut(event: KeyboardEvent): boolean {\n return (event.ctrlKey && event.code === 'KeyX') || // Ctrl + X on Windows\n (event.metaKey && event.code === 'KeyX'); // Cmd + X on Mac\n}\nexport function isCopy(event: KeyboardEvent): boolean {\n return (event.ctrlKey && event.code === 'KeyC') || // Ctrl + C on Windows\n (event.metaKey && event.code === 'KeyC'); // Cmd + C on Mac\n}\nexport function isPaste(event: KeyboardEvent): boolean {\n return (event.ctrlKey && event.code === 'KeyV') || // Ctrl + V on Windows\n (event.metaKey && event.code === 'KeyV'); // Cmd + V on Mac\n}\nexport function isAll(event: KeyboardEvent): boolean {\n return (event.ctrlKey && event.code === 'KeyA') || // Ctrl + A on Windows\n (event.metaKey && event.code === 'KeyA'); // Cmd + A on Mac\n}\n","import { h as createElement } from '@stencil/core';\nimport { isEnterKey, isTab } from '../../utils/key.utils';\nimport { timeout } from '../../utils';\nimport { ColumnRegular } from '../../types/interfaces';\nimport { EditCell, EditorBase, SaveData } from '../../types/selection';\n\n/**\n * Represents a cell editor in a grid.\n *\n * It's a good place to start with your own editor.\n * It manages the editing of cells by handling events, saving data, rendering the editor UI, and managing the lifecycle of the editor instance.\n */\n\n/**\n * Callback triggered on cell editor save\n * Closes editor when called\n * @param preventFocus - if true editor will not be closed and next cell will not be focused\n */\nexport type SaveCallback = (value: SaveData, preventFocus: boolean) => void;\n\nexport class TextEditor implements EditorBase {\n private editInput!: HTMLInputElement;\n\n public element: Element | null = null;\n public editCell: EditCell | null = null;\n\n constructor(\n public column: ColumnRegular,\n private saveCallback?: SaveCallback,\n ) {}\n\n /**\n * Callback triggered on cell editor render\n */\n async componentDidRender(): Promise<void> {\n if (this.editInput) {\n await timeout();\n this.editInput?.focus();\n }\n }\n\n private onKeyDown(e: KeyboardEvent) {\n const isEnter = isEnterKey(e.code);\n const isKeyTab = isTab(e.code);\n\n if (\n (isKeyTab || isEnter) &&\n e.target &&\n this.saveCallback &&\n !e.isComposing\n ) {\n // blur is needed to avoid autoscroll\n this.beforeDisconnect();\n // request callback which will close cell after all\n this.saveCallback(this.getValue(), isKeyTab);\n }\n }\n\n /**\n * IMPORTANT: Prevent scroll glitches when editor is closed and focus is on current input element.\n */\n beforeDisconnect() {\n this.editInput.blur();\n }\n\n /**\n * Get value from input\n */\n getValue() {\n return this.editInput?.value;\n }\n\n /**\n * Render method for Editor plugin.\n * Renders input element with passed data from cell.\n *\n * @required @method\n * @param {Function} h - h function from stencil render.\n * @param {Object} _additionalData - additional data from plugin.\n * @returns {VNode} - input element.\n */\n render(h: typeof createElement, _additionalData: any) {\n return h('input', {\n type: 'text',\n // set input value from cell data\n value: this.editCell?.val || '',\n // save input element as ref for further usage\n ref: (el: HTMLInputElement | null) => {\n this.editInput = el;\n },\n // listen to keydown event on input element\n onKeyDown: (e: KeyboardEvent) => this.onKeyDown(e),\n });\n }\n}\n","revogr-edit {\n display: block;\n position: absolute;\n background-color: #fff;\n\n input {\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n }\n\n revo-dropdown {\n height: 100%;\n\n &.shrink {\n fieldset legend > span {\n display: none;\n }\n }\n }\n}\n","import {\n Component,\n Event,\n EventEmitter,\n Prop,\n h,\n Element,\n Host,\n Method,\n} from '@stencil/core';\nimport { EDIT_INPUT_WR } from '../../utils/consts';\nimport { TextEditor } from './text-editor';\nimport { ColumnDataSchemaModel } from '../../types/interfaces';\nimport {\n EditCell,\n EditorCtr,\n SaveDataDetails,\n EditorBase,\n SaveData,\n} from '../../types/selection';\n\n/**\n * Represents a cell editor in a grid.\n * It manages the editing of cells by handling events, saving data, rendering the editor UI,\n * and managing the lifecycle of the editor instance.\n */\n@Component({\n tag: 'revogr-edit',\n styleUrl: 'revogr-edit-style.scss',\n})\nexport class RevoEdit {\n /**\n * Cell to edit data.\n */\n @Prop() editCell: EditCell;\n\n /**\n * Column data for editor.\n */\n @Prop() column: ColumnDataSchemaModel | null;\n /**\n * Custom editors register\n */\n @Prop() editor: EditorCtr | null;\n\n /**\n * Save on editor close. Defines if data should be saved on editor close.\n */\n @Prop() saveOnClose = false;\n /**\n * Additional data to pass to renderer\n */\n @Prop() additionalData: any;\n\n /**\n * Cell edit event\n */\n @Event({ eventName: 'celledit' }) cellEdit: EventEmitter<SaveDataDetails>;\n\n /**\n * Close editor event\n * pass true if requires focus next\n */\n @Event({ eventName: 'closeedit' }) closeEdit: EventEmitter<\n boolean | undefined\n >;\n\n /** Edit session editor */\n @Element() element: HTMLElement;\n private currentEditor: EditorBase | null = null;\n private preventSaveOnClose = false;\n\n /**\n * Cancel pending changes flag. Editor will be closed without autosave.\n */\n @Method() async cancelChanges() {\n this.preventSaveOnClose = true;\n }\n\n /**\n * Before editor got disconnected.\n * Can be triggered multiple times before actual disconnect.\n */\n @Method() async beforeDisconnect() {\n this.currentEditor?.beforeDisconnect?.();\n }\n\n onAutoSave() {\n this.preventSaveOnClose = true;\n const val = this.currentEditor.getValue?.();\n // For Editor plugin internal usage.\n // When you want to prevent save and use custom save of your own.\n if (this.currentEditor.beforeAutoSave) {\n const canSave = this.currentEditor.beforeAutoSave(val);\n if (canSave === false) {\n return;\n }\n }\n this.onSave(val, true);\n }\n\n /**\n * Callback triggered when cell editor saved.\n * Closes editor when called.\n * @param preventFocus - if true, editor will not be closed & next cell will not be focused.\n */\n onSave(val: SaveData, preventFocus?: boolean) {\n this.preventSaveOnClose = true;\n if (this.editCell) {\n this.cellEdit.emit({\n rgCol: this.editCell.x,\n rgRow: this.editCell.y,\n type: this.editCell.type,\n prop: this.editCell.prop,\n val,\n preventFocus,\n });\n }\n }\n\n componentWillRender() {\n // Active editor present\n if (this.currentEditor) {\n return;\n }\n this.preventSaveOnClose = false;\n\n // Custom editor usage.\n // Start with TextEditor (editors/text.tsx) for Custom editor.\n if (this.editor) {\n this.currentEditor = new this.editor(\n this.column,\n // save callback\n (e, preventFocus) => {\n this.onSave(e, preventFocus);\n },\n // cancel callback\n focusNext => {\n this.preventSaveOnClose = true;\n this.closeEdit.emit(focusNext);\n },\n );\n return;\n }\n // Default text editor usage\n this.currentEditor = new TextEditor(this.column, (e, preventFocus) =>\n this.onSave(e, preventFocus),\n );\n }\n\n componentDidRender() {\n if (!this.currentEditor) {\n return;\n }\n this.currentEditor.element = this.element.firstElementChild;\n this.currentEditor.componentDidRender?.();\n }\n\n disconnectedCallback() {\n if (this.saveOnClose) {\n // Can not be cancelled by `preventSaveOnClose` prop.\n // Editor requires `getValue` to be able to save.\n if (!this.preventSaveOnClose) {\n this.onAutoSave();\n }\n }\n\n this.preventSaveOnClose = false;\n if (!this.currentEditor) {\n return;\n }\n\n this.currentEditor.disconnectedCallback?.();\n this.currentEditor.element = null;\n this.currentEditor = null;\n }\n\n render() {\n if (this.currentEditor) {\n this.currentEditor.editCell = this.editCell;\n return (\n <Host class={EDIT_INPUT_WR}>\n {this.currentEditor.render(h, this.additionalData)}\n </Host>\n );\n }\n return '';\n }\n}\n"],"version":3}
|
|
@@ -576,7 +576,7 @@ const OverlaySelection = /*@__PURE__*/ proxyCustomElement(class OverlaySelection
|
|
|
576
576
|
return null;
|
|
577
577
|
}
|
|
578
578
|
const style = getElStyle(renderEvent.detail.range, this.dimensionRow.state, this.dimensionCol.state);
|
|
579
|
-
return (h("revogr-edit", { style: style, ref: el => (this.revogrEdit = el), additionalData: this.additionalData, editCell: editable, saveOnClose: this.applyChangesOnClose, column: this.columnService.
|
|
579
|
+
return (h("revogr-edit", { style: style, ref: el => (this.revogrEdit = el), additionalData: this.additionalData, editCell: editable, saveOnClose: this.applyChangesOnClose, column: this.columnService.rowDataModel(editCell.y, editCell.x), editor: this.columnService.getCellEditor(editCell.y, editCell.x, this.editors), onCloseedit: e => this.closeEdit(e), onCelledit: e => {
|
|
580
580
|
const saveEv = this.beforeCellSave.emit(e.detail);
|
|
581
581
|
if (!saveEv.defaultPrevented) {
|
|
582
582
|
this.cellEdit(saveEv.detail);
|
|
@@ -614,14 +614,14 @@ const OverlaySelection = /*@__PURE__*/ proxyCustomElement(class OverlaySelection
|
|
|
614
614
|
nodes.push(h("revogr-order-editor", { ref: e => (this.orderEditor = e), dataStore: this.dataStore, dimensionRow: this.dimensionRow, dimensionCol: this.dimensionCol, parent: this.element, onRowdragstartinit: e => this.rowDragStart(e) }));
|
|
615
615
|
}
|
|
616
616
|
}
|
|
617
|
-
return (h(Host, { key: '
|
|
617
|
+
return (h(Host, { key: 'd20fcf63958e3d491f4fd881a4a5dd242cfdd9ac', class: { mobile: this.isMobileDevice },
|
|
618
618
|
// Open Editor on DblClick
|
|
619
619
|
onDblClick: (e) => {
|
|
620
620
|
// DblClick prevented outside - Editor will not open
|
|
621
621
|
if (!e.defaultPrevented) {
|
|
622
622
|
this.doEdit();
|
|
623
623
|
}
|
|
624
|
-
}, onMouseDown: (e) => this.onElementMouseDown(e), onTouchStart: (e) => this.onElementMouseDown(e, true) }, nodes, h("slot", { key: '
|
|
624
|
+
}, onMouseDown: (e) => this.onElementMouseDown(e), onTouchStart: (e) => this.onElementMouseDown(e, true) }, nodes, h("slot", { key: '89b9bec7824739ea11fadeecbf3908ac74e85c96', name: "data" })));
|
|
625
625
|
}
|
|
626
626
|
doFocus(focus, end, next) {
|
|
627
627
|
const { defaultPrevented } = this.beforeFocusCell.emit(this.columnService.getSaveData(focus.y, focus.x));
|