@revolist/revogrid 4.8.19 → 4.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/dist/cjs/{column.service-ad5ffa3c.js → column.service-6f691f50.js} +2 -2
  2. package/dist/cjs/{column.service-ad5ffa3c.js.map → column.service-6f691f50.js.map} +1 -1
  3. package/dist/cjs/{header-cell-renderer-d92249e4.js → header-cell-renderer-81a22b00.js} +2 -2
  4. package/dist/cjs/{header-cell-renderer-d92249e4.js.map → header-cell-renderer-81a22b00.js.map} +1 -1
  5. package/dist/cjs/{index-a9f1b728.js → index-2410bbd9.js} +1 -3
  6. package/dist/cjs/index-2410bbd9.js.map +1 -0
  7. package/dist/cjs/{key.utils-e6c8a895.js → key.utils-1e48ab8f.js} +2 -2
  8. package/dist/cjs/{key.utils-e6c8a895.js.map → key.utils-1e48ab8f.js.map} +1 -1
  9. package/dist/cjs/loader.cjs.js +1 -1
  10. package/dist/cjs/revo-grid.cjs.entry.js +15 -19
  11. package/dist/cjs/revo-grid.cjs.entry.js.map +1 -1
  12. package/dist/cjs/revo-grid.cjs.js +1 -1
  13. package/dist/cjs/revogr-attribution_6.cjs.entry.js +4 -4
  14. package/dist/cjs/revogr-clipboard_3.cjs.entry.js +2 -2
  15. package/dist/cjs/revogr-data_4.cjs.entry.js +21 -8
  16. package/dist/cjs/revogr-data_4.cjs.entry.js.map +1 -1
  17. package/dist/cjs/revogr-filter-panel.cjs.entry.js +14 -17
  18. package/dist/cjs/revogr-filter-panel.cjs.entry.js.map +1 -1
  19. package/dist/cjs/{throttle-46478b04.js → throttle-bcc4740d.js} +2 -2
  20. package/dist/cjs/{throttle-46478b04.js.map → throttle-bcc4740d.js.map} +1 -1
  21. package/dist/collection/collection-manifest.json +1 -1
  22. package/dist/collection/components/header/header-renderer.js +18 -5
  23. package/dist/collection/components/header/header-renderer.js.map +1 -1
  24. package/dist/collection/components/header/revogr-header.js +2 -2
  25. package/dist/collection/components/revoGrid/revo-grid.js +10 -15
  26. package/dist/collection/components/revoGrid/revo-grid.js.map +1 -1
  27. package/dist/collection/plugins/filter/{filter.pop.js → filter.panel.js} +23 -43
  28. package/dist/collection/plugins/filter/filter.panel.js.map +1 -0
  29. package/dist/collection/plugins/filter/filter.plugin.js +2 -2
  30. package/dist/collection/plugins/filter/filter.plugin.js.map +1 -1
  31. package/dist/collection/types/interfaces.js.map +1 -1
  32. package/dist/collection/types/viewport.interfaces.js.map +1 -1
  33. package/dist/collection/utils/consts.js +0 -1
  34. package/dist/collection/utils/consts.js.map +1 -1
  35. package/dist/esm/{column.service-dce8aabc.js → column.service-0e41057a.js} +2 -2
  36. package/dist/esm/{column.service-dce8aabc.js.map → column.service-0e41057a.js.map} +1 -1
  37. package/dist/esm/{header-cell-renderer-171a011c.js → header-cell-renderer-6d8ac25d.js} +2 -2
  38. package/dist/esm/{header-cell-renderer-171a011c.js.map → header-cell-renderer-6d8ac25d.js.map} +1 -1
  39. package/dist/esm/{index-5a722722.js → index-4e881436.js} +2 -3
  40. package/dist/esm/index-4e881436.js.map +1 -0
  41. package/dist/esm/{key.utils-f82409ff.js → key.utils-425c987d.js} +2 -2
  42. package/dist/esm/{key.utils-f82409ff.js.map → key.utils-425c987d.js.map} +1 -1
  43. package/dist/esm/loader.js +1 -1
  44. package/dist/esm/revo-grid.entry.js +15 -19
  45. package/dist/esm/revo-grid.entry.js.map +1 -1
  46. package/dist/esm/revo-grid.js +1 -1
  47. package/dist/esm/revogr-attribution_6.entry.js +4 -4
  48. package/dist/esm/revogr-clipboard_3.entry.js +2 -2
  49. package/dist/esm/revogr-data_4.entry.js +21 -8
  50. package/dist/esm/revogr-data_4.entry.js.map +1 -1
  51. package/dist/esm/revogr-filter-panel.entry.js +15 -18
  52. package/dist/esm/revogr-filter-panel.entry.js.map +1 -1
  53. package/dist/esm/{throttle-eeca0062.js → throttle-1b1dd9d2.js} +2 -2
  54. package/dist/esm/{throttle-eeca0062.js.map → throttle-1b1dd9d2.js.map} +1 -1
  55. package/dist/revo-grid/{column.service-dce8aabc.js → column.service-0e41057a.js} +2 -2
  56. package/dist/revo-grid/{header-cell-renderer-171a011c.js → header-cell-renderer-6d8ac25d.js} +2 -2
  57. package/dist/revo-grid/index-4e881436.js +5 -0
  58. package/dist/revo-grid/index-4e881436.js.map +1 -0
  59. package/dist/revo-grid/{key.utils-f82409ff.js → key.utils-425c987d.js} +2 -2
  60. package/dist/revo-grid/revo-grid.entry.js +1 -1
  61. package/dist/revo-grid/revo-grid.entry.js.map +1 -1
  62. package/dist/revo-grid/revo-grid.esm.js +1 -1
  63. package/dist/revo-grid/revo-grid.esm.js.map +1 -1
  64. package/dist/revo-grid/revogr-attribution_6.entry.js +1 -1
  65. package/dist/revo-grid/revogr-clipboard_3.entry.js +1 -1
  66. package/dist/revo-grid/revogr-data_4.entry.js +1 -1
  67. package/dist/revo-grid/revogr-data_4.entry.js.map +1 -1
  68. package/dist/revo-grid/revogr-filter-panel.entry.js +1 -1
  69. package/dist/revo-grid/revogr-filter-panel.entry.js.map +1 -1
  70. package/dist/revo-grid/{throttle-eeca0062.js → throttle-1b1dd9d2.js} +2 -2
  71. package/dist/types/components/revoGrid/revo-grid.d.ts +0 -1
  72. package/dist/types/components.d.ts +2 -4
  73. package/dist/types/plugins/filter/{filter.pop.d.ts → filter.panel.d.ts} +1 -2
  74. package/dist/types/plugins/filter/filter.plugin.d.ts +2 -2
  75. package/dist/types/types/interfaces.d.ts +1 -0
  76. package/dist/types/types/viewport.interfaces.d.ts +0 -2
  77. package/dist/types/utils/consts.d.ts +0 -1
  78. package/hydrate/index.js +44 -40
  79. package/hydrate/index.mjs +44 -40
  80. package/package.json +1 -1
  81. package/readme.md +2 -0
  82. package/standalone/consts.js +1 -2
  83. package/standalone/consts.js.map +1 -1
  84. package/standalone/index.d.ts +1 -1
  85. package/standalone/revo-grid.js +13 -17
  86. package/standalone/revo-grid.js.map +1 -1
  87. package/standalone/revogr-filter-panel.js +14 -18
  88. package/standalone/revogr-filter-panel.js.map +1 -1
  89. package/standalone/revogr-header2.js +17 -4
  90. package/standalone/revogr-header2.js.map +1 -1
  91. package/dist/cjs/index-a9f1b728.js.map +0 -1
  92. package/dist/collection/plugins/filter/filter.pop.js.map +0 -1
  93. package/dist/esm/index-5a722722.js.map +0 -1
  94. package/dist/revo-grid/index-5a722722.js +0 -5
  95. package/dist/revo-grid/index-5a722722.js.map +0 -1
  96. /package/dist/revo-grid/{column.service-dce8aabc.js.map → column.service-0e41057a.js.map} +0 -0
  97. /package/dist/revo-grid/{header-cell-renderer-171a011c.js.map → header-cell-renderer-6d8ac25d.js.map} +0 -0
  98. /package/dist/revo-grid/{key.utils-f82409ff.js.map → key.utils-425c987d.js.map} +0 -0
  99. /package/dist/revo-grid/{throttle-eeca0062.js.map → throttle-1b1dd9d2.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"names":["closest","Element","prototype","matches","msMatchesSelector","webkitMatchesSelector","s","el","this","call","parentElement","parentNode","nodeType","filterStyleCss","RevogrFilterPanelStyle0","defaultType","FILTER_LIST_CLASS","FILTER_LIST_CLASS_ACTION","FilterPanel","filterCaptionsInternal","title","save","reset","cancel","add","placeholder","and","or","debouncedApplyFilter","debounce","filterChange","emit","filterItems","onMouseDown","e","changes","defaultPrevented","target","isOutside","isFilterBtn","undefined","show","newEntity","type","getChanges","componentWillRender","isFilterIdSet","Object","keys","prop","filterId","length","renderSelectOptions","isDefaultTypeRemoved","options","_a","capts","assign","filterCaptions","push","h","selected","currentFilterType","value","filterNames","gIndex","filterTypes","map","k","disabled","renderExtra","index","currentFilter","filterEntities","extra","id","onInput","onUserInput","bind","onKeyDown","getFilterItemsList","propFilters","key","d","andOrButton","onClick","toggleFilterAndOr","AndOrButton","text","relation","class","onChange","onFilterTypeChange","onRemoveFilter","TrashButton","autoCorrect","pos","getBoundingClientRect","maxLeft","window","innerWidth","width","left","offsetLeft","style","_b","render","Host","display","x","top","y","ref","onAddNewFilter","disableDynamicFiltering","onSave","onReset","onCancel","setTimeout","input","document","getElementById","focus","addNewFilterToProp","select","currentFilterId","event","toLowerCase","stopPropagation","assertChanges","items","findIndex","splice","Error","classList","contains","uuid"],"sources":["src/utils/closest.polifill.ts","src/plugins/filter/filter.style.scss?tag=revogr-filter-panel","src/plugins/filter/filter.pop.tsx"],"sourcesContent":["(function closest() {\n if (!Element.prototype.matches) {\n Element.prototype.matches =\n ((Element.prototype as unknown) as { msMatchesSelector: (selectors: string) => boolean }).msMatchesSelector || Element.prototype.webkitMatchesSelector;\n }\n\n if (!Element.prototype.closest) {\n Element.prototype.closest = function (s: string) {\n let el: HTMLElement | Element | (Node & ParentNode) = this;\n\n do {\n if (Element.prototype.matches.call(el, s)) {\n return el;\n }\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n };\n }\n})();\n","revogr-filter-panel {\n position: absolute;\n display: block;\n top: 0;\n left: 0;\n z-index: 100;\n\n opacity: 1;\n transform: none;\n background-color: #fff;\n transform-origin: 62px 0px;\n box-shadow: 0 5px 18px -2px rgba(black, 20%);\n padding: 10px;\n border-radius: 4px;\n\n min-width: 220px;\n text-align: left;\n\n .filter-holder > div {\n display: flex;\n flex-direction: column;\n }\n\n label {\n font-size: 13px;\n display: block;\n padding: 8px 0;\n }\n\n select {\n width: 100%;\n }\n\n input[type='text'] {\n border: 0;\n min-height: 34px;\n margin: 5px 0;\n background: #f3f3f3;\n border-radius: 5px;\n padding: 0 10px;\n box-sizing: border-box;\n width: 100%;\n }\n\n button {\n margin-top: 10px;\n margin-right: 5px;\n }\n\n .filter-actions {\n text-align: right;\n margin-right: -5px;\n }\n}\n\n.rgHeaderCell {\n &:hover .rv-filter {\n transition:\n opacity 267ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,\n transform 178ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;\n }\n &:hover .rv-filter,\n .rv-filter.active {\n opacity: 1;\n }\n\n .rv-filter {\n $btn-size: 24px;\n height: $btn-size;\n width: $btn-size;\n background: none;\n border: 0;\n opacity: 0;\n visibility: visible;\n cursor: pointer;\n border-radius: 4px;\n\n &.active {\n color: #10224a;\n }\n\n .filter-img {\n $img-size: 11px;\n color: gray;\n width: $img-size;\n }\n }\n}\n\n.select-css {\n $gradient: 'data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23007CB2%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E';\n $linearGradient: linear-gradient(to bottom, #ffffff 0%, #ffffff 100%);\n $borderColor: #f1f1f1;\n\n display: block;\n font-family: sans-serif;\n font-weight: 600;\n color: #444;\n line-height: 1.3;\n padding: 0.6em 1.4em 0.5em 0.8em;\n width: 100%;\n max-width: 100%; /* useful when width is set to anything other than 100% */\n box-sizing: border-box;\n margin: 0;\n border: 1px solid $borderColor;\n box-shadow: transparent;\n border-radius: 0.5em;\n appearance: none;\n background-color: #fff;\n background-image: url($gradient), $linearGradient;\n background-repeat: no-repeat, repeat;\n /* arrow icon position (1em from the right, 50% vertical) , then gradient position*/\n background-position:\n right 0.7em top 50%,\n 0 0;\n /* icon size, then gradient */\n background-size:\n 0.65em auto,\n 100%;\n\n /* Hide arrow icon in IE browsers */\n &::-ms-expand {\n display: none;\n }\n /* Hover style */\n &:hover {\n border-color: rgb(197, 197, 197);\n }\n /* Focus style */\n &:focus {\n border-color: $borderColor;\n box-shadow: 0 0 1px 3px rgba(59, 153, 252, 0.7);\n box-shadow: 0 0 0 3px -moz-mac-focusring;\n color: #222;\n outline: none;\n }\n\n /* Set options to normal weight */\n option {\n font-weight: normal;\n }\n\n /* Disabled styles */\n &:disabled,\n &[aria-disabled='true'] {\n color: gray;\n background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22graytext%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E'),\n linear-gradient(to bottom, #ffffff 0%, #ffffff 100%);\n }\n\n &:disabled:hover,\n &[aria-disabled='true'] {\n border-color: $borderColor;\n }\n}\n\n.multi-filter-list {\n margin-top: 5px;\n margin-bottom: 5px;\n\n div {\n white-space: nowrap;\n }\n\n .multi-filter-list-action {\n display: flex;\n\n justify-content: space-between;\n align-items: center;\n }\n\n .and-or-button {\n margin: 0 0 0 10px;\n min-width: 58px;\n cursor: pointer;\n }\n .trash-button {\n $btn-remove-size: 22px;\n margin: 0 0 -2px 6px;\n cursor: pointer;\n\n width: $btn-remove-size;\n height: 100%;\n font-size: 16px;\n\n .trash-img {\n width: 1em;\n }\n }\n}\n\n.add-filter-divider {\n display: block;\n margin: 0 -10px 10px -10px;\n\n border-bottom: 1px solid #d9d9d9;\n height: 10px;\n}\n\n.select-input {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n","import { Component, Event, EventEmitter, h, Host, Listen, Method, Prop, State, VNode } from '@stencil/core';\nimport { FilterType } from './filter.service';\nimport { AndOrButton, isFilterBtn, TrashButton } from './filter.button';\nimport '../../utils/closest.polifill';\nimport { LogicFunction } from './filter.types';\nimport { FilterCaptions } from './filter.plugin';\nimport debounce from 'lodash/debounce';\nimport { ColumnProp } from '@type';\n\nexport type FilterItem = {\n // column id\n prop?: ColumnProp;\n // filter type definition\n type?: FilterType;\n // value for additional filtering, text value or some id\n value?: any;\n};\n\nexport type FilterData = {\n id: number;\n type: FilterType;\n value?: any;\n relation: 'and' | 'or';\n};\n\nexport type MultiFilterItem = {\n [prop: string]: FilterData[];\n};\n\nexport type ShowData = {\n x: number;\n y: number;\n /**\n * Auto correct position if it is out of document bounds\n */\n autoCorrect?: boolean;\n} & FilterItem;\n\nconst defaultType: FilterType = 'none';\n\nconst FILTER_LIST_CLASS = 'multi-filter-list';\nconst FILTER_LIST_CLASS_ACTION = 'multi-filter-list-action';\n\n/**\n * Filter panel for editing filters\n */\n/**\n * @internal\n */\n@Component({\n tag: 'revogr-filter-panel',\n styleUrl: 'filter.style.scss',\n})\nexport class FilterPanel {\n private filterCaptionsInternal: FilterCaptions = {\n title: 'Filter by',\n save: 'Save',\n // drops the filter\n reset: 'Cancel',\n cancel: 'Close',\n add: 'Add more condition...',\n placeholder: 'Enter value...',\n and: 'and',\n or: 'or',\n };\n @State() isFilterIdSet = false;\n @State() filterId = 0;\n @State() currentFilterId = -1;\n @State() currentFilterType: FilterType = defaultType;\n @State() changes: ShowData | undefined;\n @Prop({ mutable: true, reflect: true }) uuid: string;\n @Prop() filterItems: MultiFilterItem = {};\n @Prop() filterTypes: Record<string, string[]> = {};\n @Prop() filterNames: Record<string, string> = {};\n @Prop() filterEntities: Record<string, LogicFunction> = {};\n @Prop() filterCaptions: FilterCaptions | undefined;\n @Prop() disableDynamicFiltering = false;\n @Event() filterChange: EventEmitter<MultiFilterItem>;\n @Listen('mousedown', { target: 'document' }) onMouseDown(e: MouseEvent) {\n if (this.changes && !e.defaultPrevented) {\n const el = e.target as HTMLElement;\n if (this.isOutside(el) && !isFilterBtn(el)) {\n this.changes = undefined;\n }\n }\n }\n @Method() async show(newEntity?: ShowData) {\n this.changes = newEntity;\n if (this.changes) {\n this.changes.type = this.changes.type || defaultType;\n }\n }\n\n @Method() async getChanges() {\n return this.changes;\n }\n\n componentWillRender() {\n if (!this.isFilterIdSet) {\n this.isFilterIdSet = true;\n const filterItems = Object.keys(this.filterItems);\n for (const prop of filterItems) {\n // we set the proper filterId so there won't be any conflict when removing filters\n this.filterId += this.filterItems[prop].length;\n }\n }\n }\n\n renderSelectOptions(type: FilterType, isDefaultTypeRemoved = false) {\n const options: VNode[] = [];\n const prop = this.changes?.prop;\n\n if (!isDefaultTypeRemoved) {\n const capts = Object.assign(this.filterCaptionsInternal, this.filterCaptions);\n\n options.push(\n <option selected={this.currentFilterType === defaultType} value={defaultType}>\n {prop && this.filterItems[prop] && this.filterItems[prop].length > 0 ? capts.add : this.filterNames[defaultType]}\n </option>,\n );\n }\n\n for (let gIndex in this.filterTypes) {\n options.push(\n ...this.filterTypes[gIndex].map(k => (\n <option value={k} selected={type === k}>\n {this.filterNames[k]}\n </option>\n )),\n );\n options.push(<option disabled></option>);\n }\n return options;\n }\n\n renderExtra(prop: ColumnProp, index: number) {\n const currentFilter = this.filterItems[prop];\n\n if (!currentFilter) return '';\n\n if (this.filterEntities[currentFilter[index].type].extra !== 'input') return '';\n\n const capts = Object.assign(this.filterCaptionsInternal, this.filterCaptions);\n\n return (\n <input\n id={`filter-input-${currentFilter[index].id}`}\n placeholder={capts.placeholder}\n type=\"text\"\n value={currentFilter[index].value}\n onInput={this.onUserInput.bind(this, index, prop)}\n onKeyDown={e => this.onKeyDown(e)}\n />\n );\n }\n\n getFilterItemsList() {\n const prop = this.changes?.prop;\n if (!(prop || prop === 0)) return '';\n\n const propFilters = this.filterItems[prop] || [];\n const capts = Object.assign(this.filterCaptionsInternal, this.filterCaptions);\n return (\n <div key={this.filterId}>\n {propFilters.map((d, index) => {\n let andOrButton;\n\n // hide toggle button if there is only one filter and the last one\n if (index !== this.filterItems[prop].length - 1) {\n andOrButton = (\n <div onClick={() => this.toggleFilterAndOr(d.id)}>\n <AndOrButton text={d.relation === 'and' ? capts.and : capts.or} />\n </div>\n );\n }\n\n return (\n <div key={d.id} class={FILTER_LIST_CLASS}>\n <div class={{ 'select-input': true }}>\n <select class=\"select-css select-filter\" onChange={e => this.onFilterTypeChange(e, prop, index)}>\n {this.renderSelectOptions(this.filterItems[prop][index].type, true)}\n </select>\n <div class={FILTER_LIST_CLASS_ACTION}>{andOrButton}</div>\n <div onClick={() => this.onRemoveFilter(d.id)}>\n <TrashButton />\n </div>\n </div>\n <div>{this.renderExtra(prop, index)}</div>\n </div>\n );\n })}\n\n {propFilters.length > 0 ? <div class=\"add-filter-divider\"/> : ''}\n </div>\n );\n }\n\n private autoCorrect(el?: HTMLElement | null) {\n if (!el) {\n return;\n }\n const pos = el.getBoundingClientRect();\n const maxLeft = window.innerWidth - pos.width;\n\n if (pos.left > maxLeft && el.offsetLeft) {\n el.style.left = `${maxLeft - (el.parentElement?.getBoundingClientRect().left ?? 0)}px`;\n }\n }\n \n render() {\n if (!this.changes) {\n return <Host style={{ display: 'none' }}></Host>;\n }\n const style = {\n display: 'block',\n left: `${this.changes.x}px`,\n top: `${this.changes.y}px`,\n };\n\n const capts = Object.assign(this.filterCaptionsInternal, this.filterCaptions);\n\n return (\n <Host style={style} ref={(el) => { this.changes?.autoCorrect && this.autoCorrect(el) }}>\n <label>{capts.title}</label>\n <div class=\"filter-holder\">{this.getFilterItemsList()}</div>\n\n <div class=\"add-filter\">\n <select id=\"add-filter\" class=\"select-css\" onChange={e => this.onAddNewFilter(e)}>\n {this.renderSelectOptions(this.currentFilterType)}\n </select>\n </div>\n <div class=\"filter-actions\">\n {this.disableDynamicFiltering &&\n <button id=\"revo-button-save\" aria-label=\"save\" class=\"revo-button green\" onClick={() => this.onSave()}>\n {capts.save}\n </button>\n }\n <button id=\"revo-button-reset\" aria-label=\"reset\" class=\"revo-button light\" onClick={() => this.onReset()}>\n {capts.reset}\n </button>\n <button id=\"revo-button-cancel\" aria-label=\"cancel\" class=\"revo-button light\" onClick={() => this.onCancel()}>\n {capts.cancel}\n </button>\n </div>\n </Host>\n );\n }\n\n private onFilterTypeChange(e: Event, prop: ColumnProp, index: number) {\n const el = e.target as HTMLSelectElement;\n this.filterItems[prop][index].type = el.value as FilterType;\n\n // this re-renders the input to know if we need extra input\n this.filterId++;\n\n // adding setTimeout will wait for the next tick DOM update then focus on input\n setTimeout(() => {\n const input = document.getElementById('filter-input-' + this.filterItems[prop][index].id) as HTMLInputElement;\n if (input) input.focus();\n }, 0);\n\n if (!this.disableDynamicFiltering) this.debouncedApplyFilter();\n }\n\n private debouncedApplyFilter = debounce(() => {\n this.filterChange.emit(this.filterItems);\n }, 400);\n\n private onAddNewFilter(e: Event) {\n const el = e.target as HTMLSelectElement;\n this.currentFilterType = el.value as FilterType;\n this.addNewFilterToProp();\n\n // reset value after adding new filter\n const select = document.getElementById('add-filter') as HTMLSelectElement;\n if (select) {\n select.value = defaultType;\n this.currentFilterType = defaultType;\n }\n\n if (!this.disableDynamicFiltering) this.debouncedApplyFilter();\n }\n\n private addNewFilterToProp() {\n const prop = this.changes?.prop;\n if (!(prop || prop === 0)) return;\n\n if (!this.filterItems[prop]) {\n this.filterItems[prop] = [];\n }\n\n if (this.currentFilterType === 'none') return;\n\n this.filterId++;\n this.currentFilterId = this.filterId;\n\n this.filterItems[prop].push({\n id: this.currentFilterId,\n type: this.currentFilterType,\n value: '',\n relation: 'and',\n });\n\n // adding setTimeout will wait for the next tick DOM update then focus on input\n setTimeout(() => {\n const input = document.getElementById('filter-input-' + this.currentFilterId) as HTMLInputElement;\n if (input) input.focus();\n }, 0);\n }\n\n private onUserInput(index: number, prop: ColumnProp, event: Event) {\n // update the value of the filter item\n this.filterItems[prop][index].value = (event.target as HTMLInputElement).value;\n\n if (!this.disableDynamicFiltering) this.debouncedApplyFilter();\n }\n\n private onKeyDown(e: KeyboardEvent) {\n if (e.key.toLowerCase() === 'enter') {\n const select = document.getElementById('add-filter') as HTMLSelectElement;\n if (select) {\n select.value = defaultType;\n this.currentFilterType = defaultType;\n this.addNewFilterToProp();\n select.focus();\n }\n return;\n }\n // keep event local, don't escalate farther to dom\n e.stopPropagation();\n }\n\n private onSave() {\n this.filterChange.emit(this.filterItems);\n }\n\n private onCancel() {\n this.changes = undefined;\n }\n\n private onReset() {\n this.assertChanges();\n\n delete this.filterItems[this.changes?.prop ?? ''];\n\n // this updates the DOM which is used by getFilterItemsList() key\n this.filterId++;\n\n this.filterChange.emit(this.filterItems);\n }\n\n private onRemoveFilter(id: number) {\n this.assertChanges();\n\n // this is for reactivity issues for getFilterItemsList()\n this.filterId++;\n\n const prop = this.changes?.prop;\n\n const items = this.filterItems[prop ?? ''];\n if (!items) return;\n\n const index = items.findIndex(d => d.id === id);\n if (index === -1) return;\n items.splice(index, 1);\n\n // let's remove the prop if no more filters so the filter icon will be removed\n if (items.length === 0) delete this.filterItems[prop ?? ''];\n\n if (!this.disableDynamicFiltering) this.debouncedApplyFilter();\n }\n\n private toggleFilterAndOr(id: number) {\n this.assertChanges();\n\n // this is for reactivity issues for getFilterItemsList()\n this.filterId++;\n\n const prop = this.changes?.prop;\n\n const items = this.filterItems[prop ?? ''];\n if (!items) return;\n\n const index = items.findIndex(d => d.id === id);\n if (index === -1) return;\n\n items[index].relation = items[index].relation === 'and' ? 'or' : 'and';\n if (!this.disableDynamicFiltering) this.debouncedApplyFilter();\n }\n\n private assertChanges() {\n if (!this.changes) {\n throw new Error('Changes required per edit');\n }\n }\n\n private isOutside(e: HTMLElement | null) {\n const select = document.getElementById('add-filter') as HTMLSelectElement;\n if (select) select.value = defaultType;\n\n this.currentFilterType = defaultType;\n if (this.changes) {\n this.changes.type = defaultType;\n }\n this.currentFilterId = -1;\n if (e?.classList.contains(`[uuid=\"${this.uuid}\"]`)) {\n return false;\n }\n return !e?.closest(`[uuid=\"${this.uuid}\"]`);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["closest","Element","prototype","matches","msMatchesSelector","webkitMatchesSelector","s","el","this","call","parentElement","parentNode","nodeType","filterStyleCss","RevogrFilterPanelStyle0","defaultType","FILTER_LIST_CLASS","FILTER_LIST_CLASS_ACTION","FilterPanel","filterCaptionsInternal","title","save","reset","cancel","add","placeholder","and","or","debouncedApplyFilter","debounce","filterChange","emit","filterItems","onMouseDown","e","changes","defaultPrevented","target","select","document","getElementById","value","currentFilterType","type","currentFilterId","path","composedPath","isOutside","includes","element","isFilterBtn","undefined","show","newEntity","getChanges","componentWillRender","isFilterIdSet","Object","keys","prop","filterId","length","renderSelectOptions","isDefaultTypeRemoved","options","_a","capts","assign","filterCaptions","push","h","selected","filterNames","gIndex","filterTypes","map","k","disabled","renderExtra","index","currentFilter","filterEntities","extra","id","onInput","onUserInput","bind","onKeyDown","getFilterItemsList","propFilters","key","d","andOrButton","onClick","toggleFilterAndOr","AndOrButton","text","relation","class","onChange","onFilterTypeChange","onRemoveFilter","TrashButton","autoCorrect","pos","getBoundingClientRect","maxLeft","window","innerWidth","width","left","offsetLeft","style","_b","render","Host","display","x","top","y","ref","onAddNewFilter","disableDynamicFiltering","onSave","onReset","onCancel","setTimeout","input","focus","addNewFilterToProp","event","toLowerCase","stopPropagation","assertChanges","items","findIndex","splice","Error"],"sources":["src/utils/closest.polifill.ts","src/plugins/filter/filter.style.scss?tag=revogr-filter-panel","src/plugins/filter/filter.panel.tsx"],"sourcesContent":["(function closest() {\n if (!Element.prototype.matches) {\n Element.prototype.matches =\n ((Element.prototype as unknown) as { msMatchesSelector: (selectors: string) => boolean }).msMatchesSelector || Element.prototype.webkitMatchesSelector;\n }\n\n if (!Element.prototype.closest) {\n Element.prototype.closest = function (s: string) {\n let el: HTMLElement | Element | (Node & ParentNode) = this;\n\n do {\n if (Element.prototype.matches.call(el, s)) {\n return el;\n }\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n };\n }\n})();\n","revogr-filter-panel {\n position: absolute;\n display: block;\n top: 0;\n left: 0;\n z-index: 100;\n\n opacity: 1;\n transform: none;\n background-color: #fff;\n transform-origin: 62px 0px;\n box-shadow: 0 5px 18px -2px rgba(black, 20%);\n padding: 10px;\n border-radius: 4px;\n\n min-width: 220px;\n text-align: left;\n\n .filter-holder > div {\n display: flex;\n flex-direction: column;\n }\n\n label {\n font-size: 13px;\n display: block;\n padding: 8px 0;\n }\n\n select {\n width: 100%;\n }\n\n input[type='text'] {\n border: 0;\n min-height: 34px;\n margin: 5px 0;\n background: #f3f3f3;\n border-radius: 5px;\n padding: 0 10px;\n box-sizing: border-box;\n width: 100%;\n }\n\n button {\n margin-top: 10px;\n margin-right: 5px;\n }\n\n .filter-actions {\n text-align: right;\n margin-right: -5px;\n }\n}\n\n.rgHeaderCell {\n &:hover .rv-filter {\n transition:\n opacity 267ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,\n transform 178ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;\n }\n &:hover .rv-filter,\n .rv-filter.active {\n opacity: 1;\n }\n\n .rv-filter {\n $btn-size: 24px;\n height: $btn-size;\n width: $btn-size;\n background: none;\n border: 0;\n opacity: 0;\n visibility: visible;\n cursor: pointer;\n border-radius: 4px;\n\n &.active {\n color: #10224a;\n }\n\n .filter-img {\n $img-size: 11px;\n color: gray;\n width: $img-size;\n }\n }\n}\n\n.select-css {\n $gradient: 'data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23007CB2%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E';\n $linearGradient: linear-gradient(to bottom, #ffffff 0%, #ffffff 100%);\n $borderColor: #f1f1f1;\n\n display: block;\n font-family: sans-serif;\n font-weight: 600;\n color: #444;\n line-height: 1.3;\n padding: 0.6em 1.4em 0.5em 0.8em;\n width: 100%;\n max-width: 100%; /* useful when width is set to anything other than 100% */\n box-sizing: border-box;\n margin: 0;\n border: 1px solid $borderColor;\n box-shadow: transparent;\n border-radius: 0.5em;\n appearance: none;\n background-color: #fff;\n background-image: url($gradient), $linearGradient;\n background-repeat: no-repeat, repeat;\n /* arrow icon position (1em from the right, 50% vertical) , then gradient position*/\n background-position:\n right 0.7em top 50%,\n 0 0;\n /* icon size, then gradient */\n background-size:\n 0.65em auto,\n 100%;\n\n /* Hide arrow icon in IE browsers */\n &::-ms-expand {\n display: none;\n }\n /* Hover style */\n &:hover {\n border-color: rgb(197, 197, 197);\n }\n /* Focus style */\n &:focus {\n border-color: $borderColor;\n box-shadow: 0 0 1px 3px rgba(59, 153, 252, 0.7);\n box-shadow: 0 0 0 3px -moz-mac-focusring;\n color: #222;\n outline: none;\n }\n\n /* Set options to normal weight */\n option {\n font-weight: normal;\n }\n\n /* Disabled styles */\n &:disabled,\n &[aria-disabled='true'] {\n color: gray;\n background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22graytext%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E'),\n linear-gradient(to bottom, #ffffff 0%, #ffffff 100%);\n }\n\n &:disabled:hover,\n &[aria-disabled='true'] {\n border-color: $borderColor;\n }\n}\n\n.multi-filter-list {\n margin-top: 5px;\n margin-bottom: 5px;\n\n div {\n white-space: nowrap;\n }\n\n .multi-filter-list-action {\n display: flex;\n\n justify-content: space-between;\n align-items: center;\n }\n\n .and-or-button {\n margin: 0 0 0 10px;\n min-width: 58px;\n cursor: pointer;\n }\n .trash-button {\n $btn-remove-size: 22px;\n margin: 0 0 -2px 6px;\n cursor: pointer;\n\n width: $btn-remove-size;\n height: 100%;\n font-size: 16px;\n\n .trash-img {\n width: 1em;\n }\n }\n}\n\n.add-filter-divider {\n display: block;\n margin: 0 -10px 10px -10px;\n\n border-bottom: 1px solid #d9d9d9;\n height: 10px;\n}\n\n.select-input {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n","import { Component, Event, EventEmitter, h, Host, Listen, Method, Prop, State, VNode, Element } from '@stencil/core';\nimport { FilterType } from './filter.service';\nimport { AndOrButton, isFilterBtn, TrashButton } from './filter.button';\nimport '../../utils/closest.polifill';\nimport { LogicFunction } from './filter.types';\nimport { FilterCaptions } from './filter.plugin';\nimport debounce from 'lodash/debounce';\nimport { ColumnProp } from '@type';\n\nexport type FilterItem = {\n // column id\n prop?: ColumnProp;\n // filter type definition\n type?: FilterType;\n // value for additional filtering, text value or some id\n value?: any;\n};\n\nexport type FilterData = {\n id: number;\n type: FilterType;\n value?: any;\n relation: 'and' | 'or';\n};\n\nexport type MultiFilterItem = {\n [prop: string]: FilterData[];\n};\n\nexport type ShowData = {\n x: number;\n y: number;\n /**\n * Auto correct position if it is out of document bounds\n */\n autoCorrect?: boolean;\n} & FilterItem;\n\nconst defaultType: FilterType = 'none';\n\nconst FILTER_LIST_CLASS = 'multi-filter-list';\nconst FILTER_LIST_CLASS_ACTION = 'multi-filter-list-action';\n\n/**\n * Filter panel for editing filters\n */\n/**\n * @internal\n */\n@Component({\n tag: 'revogr-filter-panel',\n styleUrl: 'filter.style.scss',\n})\nexport class FilterPanel {\n private filterCaptionsInternal: FilterCaptions = {\n title: 'Filter by',\n save: 'Save',\n // drops the filter\n reset: 'Clear changes',\n cancel: 'Close',\n add: 'Add more condition...',\n placeholder: 'Enter value...',\n and: 'and',\n or: 'or',\n };\n\n @Element() element!: HTMLElement;\n @State() isFilterIdSet = false;\n @State() filterId = 0;\n @State() currentFilterId = -1;\n @State() currentFilterType: FilterType = defaultType;\n @State() changes: ShowData | undefined;\n @Prop() filterItems: MultiFilterItem = {};\n @Prop() filterTypes: Record<string, string[]> = {};\n @Prop() filterNames: Record<string, string> = {};\n @Prop() filterEntities: Record<string, LogicFunction> = {};\n @Prop() filterCaptions: FilterCaptions | undefined;\n @Prop() disableDynamicFiltering = false;\n @Event() filterChange: EventEmitter<MultiFilterItem>;\n @Listen('mousedown', { target: 'document' }) onMouseDown(e: MouseEvent) {\n if (this.changes && !e.defaultPrevented) {\n const el = e.target as HTMLElement;\n\n const select = document.getElementById('add-filter') as HTMLSelectElement;\n if (select) {\n select.value = defaultType;\n }\n this.currentFilterType = defaultType;\n if (this.changes) {\n this.changes.type = defaultType;\n }\n this.currentFilterId = -1;\n\n const path = e.composedPath();\n const isOutside = !path.includes(this.element);\n\n if (isOutside && !isFilterBtn(el)) {\n this.changes = undefined;\n }\n }\n }\n\n @Method() async show(newEntity?: ShowData) {\n this.changes = newEntity;\n if (this.changes) {\n this.changes.type = this.changes.type || defaultType;\n }\n }\n\n @Method() async getChanges() {\n return this.changes;\n }\n\n componentWillRender() {\n if (!this.isFilterIdSet) {\n this.isFilterIdSet = true;\n const filterItems = Object.keys(this.filterItems);\n for (const prop of filterItems) {\n // we set the proper filterId so there won't be any conflict when removing filters\n this.filterId += this.filterItems[prop].length;\n }\n }\n }\n\n renderSelectOptions(type: FilterType, isDefaultTypeRemoved = false) {\n const options: VNode[] = [];\n const prop = this.changes?.prop;\n\n if (!isDefaultTypeRemoved) {\n const capts = Object.assign(this.filterCaptionsInternal, this.filterCaptions);\n\n options.push(\n <option selected={this.currentFilterType === defaultType} value={defaultType}>\n {prop && this.filterItems[prop] && this.filterItems[prop].length > 0 ? capts.add : this.filterNames[defaultType]}\n </option>,\n );\n }\n\n for (let gIndex in this.filterTypes) {\n options.push(\n ...this.filterTypes[gIndex].map(k => (\n <option value={k} selected={type === k}>\n {this.filterNames[k]}\n </option>\n )),\n );\n options.push(<option disabled></option>);\n }\n return options;\n }\n\n renderExtra(prop: ColumnProp, index: number) {\n const currentFilter = this.filterItems[prop];\n\n if (!currentFilter) return '';\n\n if (this.filterEntities[currentFilter[index].type].extra !== 'input') return '';\n\n const capts = Object.assign(this.filterCaptionsInternal, this.filterCaptions);\n\n return (\n <input\n id={`filter-input-${currentFilter[index].id}`}\n placeholder={capts.placeholder}\n type=\"text\"\n value={currentFilter[index].value}\n onInput={this.onUserInput.bind(this, index, prop)}\n onKeyDown={e => this.onKeyDown(e)}\n />\n );\n }\n\n getFilterItemsList() {\n const prop = this.changes?.prop;\n if (!(prop || prop === 0)) return '';\n\n const propFilters = this.filterItems[prop] || [];\n const capts = Object.assign(this.filterCaptionsInternal, this.filterCaptions);\n return (\n <div key={this.filterId}>\n {propFilters.map((d, index) => {\n let andOrButton;\n\n // hide toggle button if there is only one filter and the last one\n if (index !== this.filterItems[prop].length - 1) {\n andOrButton = (\n <div onClick={() => this.toggleFilterAndOr(d.id)}>\n <AndOrButton text={d.relation === 'and' ? capts.and : capts.or} />\n </div>\n );\n }\n\n return (\n <div key={d.id} class={FILTER_LIST_CLASS}>\n <div class={{ 'select-input': true }}>\n <select class=\"select-css select-filter\" onChange={e => this.onFilterTypeChange(e, prop, index)}>\n {this.renderSelectOptions(this.filterItems[prop][index].type, true)}\n </select>\n <div class={FILTER_LIST_CLASS_ACTION}>{andOrButton}</div>\n <div onClick={() => this.onRemoveFilter(d.id)}>\n <TrashButton />\n </div>\n </div>\n <div>{this.renderExtra(prop, index)}</div>\n </div>\n );\n })}\n\n {propFilters.length > 0 ? <div class=\"add-filter-divider\"/> : ''}\n </div>\n );\n }\n\n private autoCorrect(el?: HTMLElement | null) {\n if (!el) {\n return;\n }\n const pos = el.getBoundingClientRect();\n const maxLeft = window.innerWidth - pos.width;\n\n if (pos.left > maxLeft && el.offsetLeft) {\n el.style.left = `${maxLeft - (el.parentElement?.getBoundingClientRect().left ?? 0)}px`;\n }\n }\n \n render() {\n if (!this.changes) {\n return <Host style={{ display: 'none' }}></Host>;\n }\n const style = {\n display: 'block',\n left: `${this.changes.x}px`,\n top: `${this.changes.y}px`,\n };\n\n const capts = Object.assign(this.filterCaptionsInternal, this.filterCaptions);\n\n return (\n <Host style={style} ref={(el) => { this.changes?.autoCorrect && this.autoCorrect(el) }}>\n <label>{capts.title}</label>\n <div class=\"filter-holder\">{this.getFilterItemsList()}</div>\n\n <div class=\"add-filter\">\n <select id=\"add-filter\" class=\"select-css\" onChange={e => this.onAddNewFilter(e)}>\n {this.renderSelectOptions(this.currentFilterType)}\n </select>\n </div>\n <div class=\"filter-actions\">\n {this.disableDynamicFiltering &&\n <button id=\"revo-button-save\" aria-label=\"save\" class=\"revo-button green\" onClick={() => this.onSave()}>\n {capts.save}\n </button>\n }\n <button id=\"revo-button-reset\" aria-label=\"reset\" class=\"revo-button light\" onClick={() => this.onReset()}>\n {capts.reset}\n </button>\n <button id=\"revo-button-cancel\" aria-label=\"cancel\" class=\"revo-button light\" onClick={() => this.onCancel()}>\n {capts.cancel}\n </button>\n </div>\n </Host>\n );\n }\n\n private onFilterTypeChange(e: Event, prop: ColumnProp, index: number) {\n const el = e.target as HTMLSelectElement;\n this.filterItems[prop][index].type = el.value as FilterType;\n\n // this re-renders the input to know if we need extra input\n this.filterId++;\n\n // adding setTimeout will wait for the next tick DOM update then focus on input\n setTimeout(() => {\n const input = document.getElementById('filter-input-' + this.filterItems[prop][index].id) as HTMLInputElement;\n if (input) input.focus();\n }, 0);\n\n if (!this.disableDynamicFiltering) this.debouncedApplyFilter();\n }\n\n private debouncedApplyFilter = debounce(() => {\n this.filterChange.emit(this.filterItems);\n }, 400);\n\n private onAddNewFilter(e: Event) {\n const el = e.target as HTMLSelectElement;\n this.currentFilterType = el.value as FilterType;\n this.addNewFilterToProp();\n\n // reset value after adding new filter\n const select = document.getElementById('add-filter') as HTMLSelectElement;\n if (select) {\n select.value = defaultType;\n this.currentFilterType = defaultType;\n }\n\n if (!this.disableDynamicFiltering) this.debouncedApplyFilter();\n }\n\n private addNewFilterToProp() {\n const prop = this.changes?.prop;\n if (!(prop || prop === 0)) return;\n\n if (!this.filterItems[prop]) {\n this.filterItems[prop] = [];\n }\n\n if (this.currentFilterType === 'none') return;\n\n this.filterId++;\n this.currentFilterId = this.filterId;\n\n this.filterItems[prop].push({\n id: this.currentFilterId,\n type: this.currentFilterType,\n value: '',\n relation: 'and',\n });\n\n // adding setTimeout will wait for the next tick DOM update then focus on input\n setTimeout(() => {\n const input = document.getElementById('filter-input-' + this.currentFilterId) as HTMLInputElement;\n if (input) input.focus();\n }, 0);\n }\n\n private onUserInput(index: number, prop: ColumnProp, event: Event) {\n // update the value of the filter item\n this.filterItems[prop][index].value = (event.target as HTMLInputElement).value;\n\n if (!this.disableDynamicFiltering) this.debouncedApplyFilter();\n }\n\n private onKeyDown(e: KeyboardEvent) {\n if (e.key.toLowerCase() === 'enter') {\n const select = document.getElementById('add-filter') as HTMLSelectElement;\n if (select) {\n select.value = defaultType;\n this.currentFilterType = defaultType;\n this.addNewFilterToProp();\n select.focus();\n }\n return;\n }\n // keep event local, don't escalate farther to dom\n e.stopPropagation();\n }\n\n private onSave() {\n this.filterChange.emit(this.filterItems);\n }\n\n private onCancel() {\n this.changes = undefined;\n }\n\n private onReset() {\n this.assertChanges();\n\n delete this.filterItems[this.changes?.prop ?? ''];\n\n // this updates the DOM which is used by getFilterItemsList() key\n this.filterId++;\n\n this.filterChange.emit(this.filterItems);\n }\n\n private onRemoveFilter(id: number) {\n this.assertChanges();\n\n // this is for reactivity issues for getFilterItemsList()\n this.filterId++;\n\n const prop = this.changes?.prop;\n\n const items = this.filterItems[prop ?? ''];\n if (!items) return;\n\n const index = items.findIndex(d => d.id === id);\n if (index === -1) return;\n items.splice(index, 1);\n\n // let's remove the prop if no more filters so the filter icon will be removed\n if (items.length === 0) delete this.filterItems[prop ?? ''];\n\n if (!this.disableDynamicFiltering) this.debouncedApplyFilter();\n }\n\n private toggleFilterAndOr(id: number) {\n this.assertChanges();\n\n // this is for reactivity issues for getFilterItemsList()\n this.filterId++;\n\n const prop = this.changes?.prop;\n\n const items = this.filterItems[prop ?? ''];\n if (!items) return;\n\n const index = items.findIndex(d => d.id === id);\n if (index === -1) return;\n\n items[index].relation = items[index].relation === 'and' ? 'or' : 'and';\n if (!this.disableDynamicFiltering) this.debouncedApplyFilter();\n }\n\n private assertChanges() {\n if (!this.changes) {\n throw new Error('Changes required per edit');\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,5 +1,5 @@
1
1
  /*!
2
2
  * Built by Revolist OU ❤️
3
3
  */
4
- import{s as t}from"./index-5a722722.js";import{d as i}from"./debounce-7781346d.js";import{i as r}from"./toNumber-8de324a7.js";const s={contentSize:0,clientSize:0,virtualSize:0,maxSize:0};const e=-1;function n(t,i,r=0){return t+(r?i-r:0)}class o{constructor(t){this.cfg=t;this.preventArtificialScroll={rgRow:null,rgCol:null};this.previousScroll={rgRow:e,rgCol:e};this.params={rgRow:Object.assign({},s),rgCol:Object.assign({},s)}}setParams(t,i){const r=n(t.contentSize,t.clientSize,t.virtualSize);this.params[i]=Object.assign(Object.assign({},t),{maxSize:r-t.clientSize,virtualContentSize:r})}async setScroll(t){this.cancelScroll(t.dimension);const i=new Promise(((i,r)=>{if(this.cfg.skipAnimationFrame){return i()}const s=window.requestAnimationFrame((()=>{i()}));this.preventArtificialScroll[t.dimension]=r.bind(null,s)}));try{await i;const r=this.getParams(t.dimension);t.coordinate=Math.ceil(t.coordinate);this.previousScroll[t.dimension]=this.wrapCoordinate(t.coordinate,r);this.preventArtificialScroll[t.dimension]=null;this.cfg.applyScroll(Object.assign(Object.assign({},t),{coordinate:r.virtualSize?this.convert(t.coordinate,r,false):t.coordinate}))}catch(t){window.cancelAnimationFrame(t)}}scroll(t,i,r=false,s,n=false){this.cancelScroll(i);if(!r&&this.previousScroll[i]===t){this.previousScroll[i]=e;return}const o=this.getParams(i);this.cfg.runScroll({dimension:i,coordinate:o.virtualSize?this.convert(t,o):t,delta:s,outside:n})}getParams(t){return this.params[t]}wrapCoordinate(t,i){if(t<0){return e}if(t>i.maxSize){return i.maxSize}return t}cancelScroll(t){var i,r;(r=(i=this.preventArtificialScroll)[t])===null||r===void 0?void 0:r.call(i);this.preventArtificialScroll[t]=null}convert(i,r,s=true){const e=r.clientSize;const n=[0,r.virtualContentSize-e];const o=[0,r.contentSize-r.virtualSize];if(s){return t(i,n,o)}return t(i,o,n)}}class a{constructor(t=10){this.scrollThrottling=t;this.mouseWheelScrollTimestamp={rgCol:0,rgRow:0};this.lastKnownScrollCoordinate={rgCol:0,rgRow:0}}setCoordinate(t){this.lastKnownScrollCoordinate[t.dimension]=t.coordinate}latestScrollUpdate(t){this.mouseWheelScrollTimestamp[t]=(new Date).getTime()}isReady(t,i){const r=(new Date).getTime()-this.mouseWheelScrollTimestamp[t];return r>this.scrollThrottling&&i!==this.lastKnownScrollCoordinate[t]}}var c=i,l=r;var h="Expected a function";function u(t,i,r){var s=true,e=true;if(typeof t!="function"){throw new TypeError(h)}if(l(r)){s="leading"in r?!!r.leading:s;e="trailing"in r?!!r.trailing:e}return c(t,i,{leading:s,maxWait:i,trailing:e})}var d=u;export{a as L,o as a,n as g,d as t};
5
- //# sourceMappingURL=throttle-eeca0062.js.map
4
+ import{s as t}from"./index-4e881436.js";import{d as i}from"./debounce-7781346d.js";import{i as r}from"./toNumber-8de324a7.js";const s={contentSize:0,clientSize:0,virtualSize:0,maxSize:0};const e=-1;function n(t,i,r=0){return t+(r?i-r:0)}class o{constructor(t){this.cfg=t;this.preventArtificialScroll={rgRow:null,rgCol:null};this.previousScroll={rgRow:e,rgCol:e};this.params={rgRow:Object.assign({},s),rgCol:Object.assign({},s)}}setParams(t,i){const r=n(t.contentSize,t.clientSize,t.virtualSize);this.params[i]=Object.assign(Object.assign({},t),{maxSize:r-t.clientSize,virtualContentSize:r})}async setScroll(t){this.cancelScroll(t.dimension);const i=new Promise(((i,r)=>{if(this.cfg.skipAnimationFrame){return i()}const s=window.requestAnimationFrame((()=>{i()}));this.preventArtificialScroll[t.dimension]=r.bind(null,s)}));try{await i;const r=this.getParams(t.dimension);t.coordinate=Math.ceil(t.coordinate);this.previousScroll[t.dimension]=this.wrapCoordinate(t.coordinate,r);this.preventArtificialScroll[t.dimension]=null;this.cfg.applyScroll(Object.assign(Object.assign({},t),{coordinate:r.virtualSize?this.convert(t.coordinate,r,false):t.coordinate}))}catch(t){window.cancelAnimationFrame(t)}}scroll(t,i,r=false,s,n=false){this.cancelScroll(i);if(!r&&this.previousScroll[i]===t){this.previousScroll[i]=e;return}const o=this.getParams(i);this.cfg.runScroll({dimension:i,coordinate:o.virtualSize?this.convert(t,o):t,delta:s,outside:n})}getParams(t){return this.params[t]}wrapCoordinate(t,i){if(t<0){return e}if(t>i.maxSize){return i.maxSize}return t}cancelScroll(t){var i,r;(r=(i=this.preventArtificialScroll)[t])===null||r===void 0?void 0:r.call(i);this.preventArtificialScroll[t]=null}convert(i,r,s=true){const e=r.clientSize;const n=[0,r.virtualContentSize-e];const o=[0,r.contentSize-r.virtualSize];if(s){return t(i,n,o)}return t(i,o,n)}}class a{constructor(t=10){this.scrollThrottling=t;this.mouseWheelScrollTimestamp={rgCol:0,rgRow:0};this.lastKnownScrollCoordinate={rgCol:0,rgRow:0}}setCoordinate(t){this.lastKnownScrollCoordinate[t.dimension]=t.coordinate}latestScrollUpdate(t){this.mouseWheelScrollTimestamp[t]=(new Date).getTime()}isReady(t,i){const r=(new Date).getTime()-this.mouseWheelScrollTimestamp[t];return r>this.scrollThrottling&&i!==this.lastKnownScrollCoordinate[t]}}var c=i,l=r;var h="Expected a function";function u(t,i,r){var s=true,e=true;if(typeof t!="function"){throw new TypeError(h)}if(l(r)){s="leading"in r?!!r.leading:s;e="trailing"in r?!!r.trailing:e}return c(t,i,{leading:s,maxWait:i,trailing:e})}var d=u;export{a as L,o as a,n as g,d as t};
5
+ //# sourceMappingURL=throttle-1b1dd9d2.js.map
@@ -530,7 +530,6 @@ export declare class RevoGridComponent {
530
530
  onCellFocus(e: CustomEvent<BeforeSaveDataDetails>): void;
531
531
  element: HTMLRevoGridElement;
532
532
  private extraElements;
533
- uuid: string | null;
534
533
  columnProvider: ColumnDataProvider;
535
534
  dataProvider: DataProvider;
536
535
  dimensionProvider: DimensionProvider;
@@ -16,7 +16,7 @@ import { ColumnCollection } from "./services/column.data.provider";
16
16
  import { DataInput } from "./plugins/export/types";
17
17
  import { Observable } from "./utils/store.utils";
18
18
  import { DSourceState, Groups } from "./store/index";
19
- import { MultiFilterItem, ShowData } from "./plugins/filter/filter.pop";
19
+ import { MultiFilterItem, ShowData } from "./plugins/filter/filter.panel";
20
20
  import { LogicFunction } from "./plugins/filter/filter.types";
21
21
  import { ResizeProps } from "./components/header/resizable.directive";
22
22
  import { Cell as Cell1, ColumnRegular as ColumnRegular1, DataType as DataType1, DimensionCols as DimensionCols1, DimensionRows as DimensionRows1, DimensionSettingsState as DimensionSettingsState1, Observable as Observable1, SelectionStoreState as SelectionStoreState1 } from "./components";
@@ -31,7 +31,7 @@ export { ColumnCollection } from "./services/column.data.provider";
31
31
  export { DataInput } from "./plugins/export/types";
32
32
  export { Observable } from "./utils/store.utils";
33
33
  export { DSourceState, Groups } from "./store/index";
34
- export { MultiFilterItem, ShowData } from "./plugins/filter/filter.pop";
34
+ export { MultiFilterItem, ShowData } from "./plugins/filter/filter.panel";
35
35
  export { LogicFunction } from "./plugins/filter/filter.types";
36
36
  export { ResizeProps } from "./components/header/resizable.directive";
37
37
  export { 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";
@@ -399,7 +399,6 @@ export namespace Components {
399
399
  "filterTypes": Record<string, string[]>;
400
400
  "getChanges": () => Promise<ShowData>;
401
401
  "show": (newEntity?: ShowData) => Promise<void>;
402
- "uuid": string;
403
402
  }
404
403
  /**
405
404
  * Focus component. Shows focus layer around the cell that is currently in focus.
@@ -1689,7 +1688,6 @@ declare namespace LocalJSX {
1689
1688
  "filterNames"?: Record<string, string>;
1690
1689
  "filterTypes"?: Record<string, string[]>;
1691
1690
  "onFilterChange"?: (event: RevogrFilterPanelCustomEvent<MultiFilterItem>) => void;
1692
- "uuid"?: string;
1693
1691
  }
1694
1692
  /**
1695
1693
  * Focus component. Shows focus layer around the cell that is currently in focus.
@@ -34,12 +34,12 @@ export type ShowData = {
34
34
  */
35
35
  export declare class FilterPanel {
36
36
  private filterCaptionsInternal;
37
+ element: HTMLElement;
37
38
  isFilterIdSet: boolean;
38
39
  filterId: number;
39
40
  currentFilterId: number;
40
41
  currentFilterType: FilterType;
41
42
  changes: ShowData | undefined;
42
- uuid: string;
43
43
  filterItems: MultiFilterItem;
44
44
  filterTypes: Record<string, string[]>;
45
45
  filterNames: Record<string, string>;
@@ -68,5 +68,4 @@ export declare class FilterPanel {
68
68
  private onRemoveFilter;
69
69
  private toggleFilterAndOr;
70
70
  private assertChanges;
71
- private isOutside;
72
71
  }
@@ -1,5 +1,5 @@
1
1
  import { BasePlugin } from '../base.plugin';
2
- import { MultiFilterItem } from './filter.pop';
2
+ import { MultiFilterItem } from './filter.panel';
3
3
  import { FilterType } from './filter.service';
4
4
  import { LogicFunction } from './filter.types';
5
5
  import { ColumnProp, ColumnRegular, DataType } from "../../types/index";
@@ -64,7 +64,7 @@ export declare class FilterPlugin extends BasePlugin {
64
64
  possibleFilterNames: Record<string, string>;
65
65
  possibleFilterEntities: Record<string, LogicFunction>;
66
66
  filterProp: string;
67
- constructor(revogrid: HTMLRevoGridElement, providers: PluginProviders, uiid: string, config?: ColumnFilterConfig);
67
+ constructor(revogrid: HTMLRevoGridElement, providers: PluginProviders, config?: ColumnFilterConfig);
68
68
  initConfig(config: ColumnFilterConfig): void;
69
69
  headerclick(e: HeaderEvent): Promise<void>;
70
70
  getColumnFilter(type?: boolean | string | string[]): Record<string, string[]>;
@@ -417,6 +417,7 @@ export type InitialHeaderClick = {
417
417
  * The column that was clicked.
418
418
  */
419
419
  column: ColumnRegular;
420
+ providers: Providers<DimensionCols | 'rowHeaders'>;
420
421
  };
421
422
  /**
422
423
  * `Range` is an object that represents a range of values.
@@ -28,8 +28,6 @@ export type ViewportData = {
28
28
  segmentSelectionStore: Observable<SelectionStoreState>;
29
29
  /** Slot to put data */
30
30
  slot: SlotType;
31
- /** Current grid uniq Id */
32
- uuid: string;
33
31
  style?: {
34
32
  [key: string]: string;
35
33
  };
@@ -2,7 +2,6 @@ export declare const MIN_COL_SIZE = 30;
2
2
  export declare const RESIZE_INTERVAL = 40;
3
3
  export declare const DATA_COL = "data-rgCol";
4
4
  export declare const DATA_ROW = "data-rgRow";
5
- export declare const UUID = "grid-uuid";
6
5
  export declare const DISABLED_CLASS = "disabled";
7
6
  export declare const CELL_CLASS = "rgCell";
8
7
  export declare const ROW_HEADER_TYPE = "rowHeaders";
package/hydrate/index.js CHANGED
@@ -3046,7 +3046,7 @@ class FilterPanel {
3046
3046
  title: 'Filter by',
3047
3047
  save: 'Save',
3048
3048
  // drops the filter
3049
- reset: 'Cancel',
3049
+ reset: 'Clear changes',
3050
3050
  cancel: 'Close',
3051
3051
  add: 'Add more condition...',
3052
3052
  placeholder: 'Enter value...',
@@ -3061,7 +3061,6 @@ class FilterPanel {
3061
3061
  this.currentFilterId = -1;
3062
3062
  this.currentFilterType = defaultType;
3063
3063
  this.changes = undefined;
3064
- this.uuid = undefined;
3065
3064
  this.filterItems = {};
3066
3065
  this.filterTypes = {};
3067
3066
  this.filterNames = {};
@@ -3072,7 +3071,18 @@ class FilterPanel {
3072
3071
  onMouseDown(e) {
3073
3072
  if (this.changes && !e.defaultPrevented) {
3074
3073
  const el = e.target;
3075
- if (this.isOutside(el) && !isFilterBtn(el)) {
3074
+ const select = document.getElementById('add-filter');
3075
+ if (select) {
3076
+ select.value = defaultType;
3077
+ }
3078
+ this.currentFilterType = defaultType;
3079
+ if (this.changes) {
3080
+ this.changes.type = defaultType;
3081
+ }
3082
+ this.currentFilterId = -1;
3083
+ const path = e.composedPath();
3084
+ const isOutside = !path.includes(this.element);
3085
+ if (isOutside && !isFilterBtn(el)) {
3076
3086
  this.changes = undefined;
3077
3087
  }
3078
3088
  }
@@ -3285,26 +3295,12 @@ class FilterPanel {
3285
3295
  throw new Error('Changes required per edit');
3286
3296
  }
3287
3297
  }
3288
- isOutside(e) {
3289
- const select = document.getElementById('add-filter');
3290
- if (select)
3291
- select.value = defaultType;
3292
- this.currentFilterType = defaultType;
3293
- if (this.changes) {
3294
- this.changes.type = defaultType;
3295
- }
3296
- this.currentFilterId = -1;
3297
- if (e === null || e === void 0 ? void 0 : e.classList.contains(`[uuid="${this.uuid}"]`)) {
3298
- return false;
3299
- }
3300
- return !(e === null || e === void 0 ? void 0 : e.closest(`[uuid="${this.uuid}"]`));
3301
- }
3298
+ get element() { return getElement(this); }
3302
3299
  static get style() { return RevogrFilterPanelStyle0; }
3303
3300
  static get cmpMeta() { return {
3304
3301
  "$flags$": 0,
3305
3302
  "$tagName$": "revogr-filter-panel",
3306
3303
  "$members$": {
3307
- "uuid": [1537],
3308
3304
  "filterItems": [16],
3309
3305
  "filterTypes": [16],
3310
3306
  "filterNames": [16],
@@ -3321,7 +3317,7 @@ class FilterPanel {
3321
3317
  },
3322
3318
  "$listeners$": [[5, "mousedown", "onMouseDown"]],
3323
3319
  "$lazyBundleId$": "-",
3324
- "$attrsToReflect$": [["uuid", "uuid"]]
3320
+ "$attrsToReflect$": []
3325
3321
  }; }
3326
3322
  }
3327
3323
 
@@ -8426,7 +8422,6 @@ const MIN_COL_SIZE = 30;
8426
8422
  const RESIZE_INTERVAL = 40;
8427
8423
  const DATA_COL = 'data-rgCol';
8428
8424
  const DATA_ROW = 'data-rgRow';
8429
- const UUID = 'grid-uuid';
8430
8425
  const DISABLED_CLASS = 'disabled';
8431
8426
  const CELL_CLASS = 'rgCell';
8432
8427
  const ROW_HEADER_TYPE = 'rowHeaders';
@@ -11667,7 +11662,7 @@ const filterTypes = {
11667
11662
  const FILTER_TRIMMED_TYPE = 'filter';
11668
11663
  const FILTER_CONFIG_CHANGED_EVENT = 'filterconfigchanged';
11669
11664
  class FilterPlugin extends BasePlugin {
11670
- constructor(revogrid, providers, uiid, config) {
11665
+ constructor(revogrid, providers, config) {
11671
11666
  var _a;
11672
11667
  super(revogrid, providers);
11673
11668
  this.revogrid = revogrid;
@@ -11716,7 +11711,7 @@ class FilterPlugin extends BasePlugin {
11716
11711
  const existingNodes = this.revogrid.registerVNode.filter((n) => n.$tag$ !== 'revogr-filter-panel');
11717
11712
  this.revogrid.registerVNode = [
11718
11713
  ...existingNodes,
11719
- hAsync("revogr-filter-panel", { uuid: `filter-${uiid}`, filterItems: this.multiFilterItems, filterNames: this.possibleFilterNames, filterEntities: this.possibleFilterEntities, filterCaptions: (_a = config === null || config === void 0 ? void 0 : config.localization) === null || _a === void 0 ? void 0 : _a.captions, onFilterChange: e => this.onFilterChange(e.detail), disableDynamicFiltering: config === null || config === void 0 ? void 0 : config.disableDynamicFiltering, ref: e => (this.pop = e) }),
11714
+ hAsync("revogr-filter-panel", { filterItems: this.multiFilterItems, filterNames: this.possibleFilterNames, filterEntities: this.possibleFilterEntities, filterCaptions: (_a = config === null || config === void 0 ? void 0 : config.localization) === null || _a === void 0 ? void 0 : _a.captions, onFilterChange: e => this.onFilterChange(e.detail), disableDynamicFiltering: config === null || config === void 0 ? void 0 : config.disableDynamicFiltering, ref: e => (this.pop = e) }),
11720
11715
  ];
11721
11716
  }
11722
11717
  initConfig(config) {
@@ -14212,8 +14207,6 @@ class RevoGridComponent {
14212
14207
  // #region Listeners outside scope
14213
14208
  this.clickTrackForFocusClear = null;
14214
14209
  this.extraElements = [];
14215
- // UUID required to support multiple grids in one page and avoid collision
14216
- this.uuid = null;
14217
14210
  this.viewport = null;
14218
14211
  this.isInited = false;
14219
14212
  /**
@@ -14460,19 +14453,19 @@ class RevoGridComponent {
14460
14453
  if (event.defaultPrevented) {
14461
14454
  return;
14462
14455
  }
14463
- const target = event.target;
14464
14456
  const pos = screenX + screenY;
14465
14457
  // detect if mousemove then do nothing
14466
14458
  if (Math.abs(this.clickTrackForFocusClear - pos) > 10) {
14467
14459
  return;
14468
14460
  }
14469
- // check if action finished inside of the document
14470
- // clear data which is outside of grid
14461
+ // Check if action finished inside of the document
14471
14462
  // if event prevented or it is current table don't clear focus
14472
- if (target === null || target === void 0 ? void 0 : target.closest(`[${UUID}="${this.uuid}"]`)) {
14473
- return;
14463
+ const path = event.composedPath();
14464
+ if (!path.includes(this.element) &&
14465
+ !path.includes(this.element.shadowRoot)) {
14466
+ // Perform actions if the click is outside the component
14467
+ this.clearFocus();
14474
14468
  }
14475
- this.clearFocus();
14476
14469
  }
14477
14470
  // #endregion
14478
14471
  // #region Listeners
@@ -14756,7 +14749,7 @@ class RevoGridComponent {
14756
14749
  }
14757
14750
  // register filter plugin
14758
14751
  if (this.filter) {
14759
- this.internalPlugins.push(new FilterPlugin(this.element, pluginData, this.uuid, typeof this.filter === 'object' ? this.filter : undefined));
14752
+ this.internalPlugins.push(new FilterPlugin(this.element, pluginData, typeof this.filter === 'object' ? this.filter : undefined));
14760
14753
  }
14761
14754
  // register export plugin
14762
14755
  if (this.exporting) {
@@ -14803,8 +14796,6 @@ class RevoGridComponent {
14803
14796
  this.selectionStoreConnector = new SelectionStoreConnector();
14804
14797
  this.dataProvider = new DataProvider(this.dimensionProvider);
14805
14798
  // #endregion
14806
- // generate uuid for this grid
14807
- this.uuid = `rv--${Math.random().toString(36).slice(2, 6)}-${Date.now()}`;
14808
14799
  this.registerOutsideVNodes(this.registerVNode);
14809
14800
  // init plugins
14810
14801
  this.setPlugins();
@@ -14875,7 +14866,7 @@ class RevoGridComponent {
14875
14866
  const headerProperties = Object.assign(Object.assign({}, view.headerProp), { type: view.type, additionalData: this.additionalData, viewportCol: view.viewportCol, selectionStore: view.columnSelectionStore, canResize: this.resize, readonly: this.readonly, columnFilter: !!this.filter });
14876
14867
  // Column headers
14877
14868
  const dataViews = [
14878
- hAsync("revogr-header", Object.assign({ key: '83382de99ec784ec1b049ccd6fe4bdcc332cabed' }, headerProperties, { slot: HEADER_SLOT })),
14869
+ hAsync("revogr-header", Object.assign({ key: 'ff8eefd6db3baf494c015a2ea573160d27739aa9' }, headerProperties, { slot: HEADER_SLOT })),
14879
14870
  ];
14880
14871
  // Render viewport data (vertical sections)
14881
14872
  view.dataPorts.forEach(data => {
@@ -14897,11 +14888,11 @@ class RevoGridComponent {
14897
14888
  const typeCol = 'rgCol';
14898
14889
  const viewports = this.viewportProvider.stores;
14899
14890
  const dimensions = this.dimensionProvider.stores;
14900
- return (hAsync(Host, { key: 'd0d2bbed64b64c9b6ca791a53f3a3c8ef3c4005e', [`${UUID}`]: this.uuid }, this.hideAttribution ? null : (hAsync("revogr-attribution", { class: "attribution" })), hAsync("div", { key: 'bb8dd42f87d5bd0b7077de213512d05ceb8b6fca', class: "main-viewport", onClick: (e) => {
14891
+ return (hAsync(Host, { key: '21bbe81595f20f7bcb271f28c9c86feef472efec' }, this.hideAttribution ? null : (hAsync("revogr-attribution", { class: "attribution" })), hAsync("div", { key: '7a3092cd02305a0dfaa3b3d3160164001f0ed08b', class: "main-viewport", onClick: (e) => {
14901
14892
  if (e.currentTarget === e.target) {
14902
14893
  this.viewport.clearEdit();
14903
14894
  }
14904
- } }, hAsync("div", { key: 'd8e40dd546ba1448b0e337c4f52a5bfc2ad0cacd', class: "viewports" }, hAsync("slot", { key: '2081bc7165ac469f4ff43be97519a3a1b960e105', name: "viewport" }), viewportSections, hAsync("revogr-scroll-virtual", { key: '4ba3abc9197c7f5062166b5fff21eef258ee49df', class: "vertical", dimension: typeRow, viewportStore: viewports[typeRow].store, dimensionStore: dimensions[typeRow].store, ref: el => this.scrollingService.registerElement(el, 'rowScroll'), onScrollvirtual: e => this.scrollingService.proxyScroll(e.detail) }), hAsync(OrderRenderer, { key: '3c52006a7d1c846baeac3892d6804b56f47aebbd', ref: e => (this.orderService = e) }))), hAsync("revogr-scroll-virtual", { key: 'e0ff22ae142089d9d4a66e074a03e41463fe4f01', class: "horizontal", dimension: typeCol, viewportStore: viewports[typeCol].store, dimensionStore: dimensions[typeCol].store, ref: el => this.scrollingService.registerElement(el, 'colScroll'), onScrollvirtual: e => this.scrollingService.proxyScroll(e.detail) }), this.extraElements));
14895
+ } }, hAsync("div", { key: 'ae1dfccbb72cc2a9f7fa370889746c702d106045', class: "viewports" }, hAsync("slot", { key: '0725b46d877fbb63fb513845cc1c7b86d0f856b8', name: "viewport" }), viewportSections, hAsync("revogr-scroll-virtual", { key: 'd41771f6ff459f1f6747ce496c8165b1dab44963', class: "vertical", dimension: typeRow, viewportStore: viewports[typeRow].store, dimensionStore: dimensions[typeRow].store, ref: el => this.scrollingService.registerElement(el, 'rowScroll'), onScrollvirtual: e => this.scrollingService.proxyScroll(e.detail) }), hAsync(OrderRenderer, { key: '2914421478450c9b198e0aade898ed342e4d7f6a', ref: e => (this.orderService = e) }))), hAsync("revogr-scroll-virtual", { key: 'bc1812c5ce54cda01e81cc06e28c69dc8e36fdf3', class: "horizontal", dimension: typeCol, viewportStore: viewports[typeCol].store, dimensionStore: dimensions[typeCol].store, ref: el => this.scrollingService.registerElement(el, 'colScroll'), onScrollvirtual: e => this.scrollingService.proxyScroll(e.detail) }), this.extraElements));
14905
14896
  }
14906
14897
  disconnectedCallback() {
14907
14898
  // Remove all plugins, to avoid memory leaks and unexpected behaviour when the component is removed
@@ -15744,16 +15735,29 @@ const HeaderRenderer = (p) => {
15744
15735
  maxWidth: (_d = p.data) === null || _d === void 0 ? void 0 : _d.maxSize,
15745
15736
  active: p.active || ['r'],
15746
15737
  class: cellClass,
15747
- style: { width: `${p.column.size}px`, transform: `translateX(${p.column.start}px)` },
15738
+ style: {
15739
+ width: `${p.column.size}px`,
15740
+ transform: `translateX(${p.column.start}px)`,
15741
+ },
15748
15742
  onResize: p.onResize,
15749
15743
  onDoubleClick(originalEvent) {
15750
- p.onDoubleClick({ column: p.data, index: p.column.itemIndex, originalEvent });
15744
+ p.onDoubleClick({
15745
+ column: p.data,
15746
+ index: p.column.itemIndex,
15747
+ originalEvent,
15748
+ providers: p.data.providers,
15749
+ });
15751
15750
  },
15752
15751
  onClick(originalEvent) {
15753
15752
  if (originalEvent.defaultPrevented || !p.onClick) {
15754
15753
  return;
15755
15754
  }
15756
- p.onClick({ column: p.data, index: p.column.itemIndex, originalEvent });
15755
+ p.onClick({
15756
+ column: p.data,
15757
+ index: p.column.itemIndex,
15758
+ originalEvent,
15759
+ providers: p.data.providers,
15760
+ });
15757
15761
  },
15758
15762
  };
15759
15763
  if (p.range) {
@@ -15765,7 +15769,7 @@ const HeaderRenderer = (p) => {
15765
15769
  }
15766
15770
  return (hAsync(HeaderCellRenderer, { data: p.data, props: dataProps, additionalData: p.additionalData },
15767
15771
  hAsync(SortingSign, { column: p.data }),
15768
- p.canFilter && ((_e = p.data) === null || _e === void 0 ? void 0 : _e.filter) !== false ? hAsync(FilterButton, { column: p.data }) : ''));
15772
+ p.canFilter && ((_e = p.data) === null || _e === void 0 ? void 0 : _e.filter) !== false ? (hAsync(FilterButton, { column: p.data })) : ('')));
15769
15773
  };
15770
15774
 
15771
15775
  const GroupHeaderRenderer = (p) => {