@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.
- package/dist/cjs/{column.service-ad5ffa3c.js → column.service-6f691f50.js} +2 -2
- package/dist/cjs/{column.service-ad5ffa3c.js.map → column.service-6f691f50.js.map} +1 -1
- package/dist/cjs/{header-cell-renderer-d92249e4.js → header-cell-renderer-81a22b00.js} +2 -2
- package/dist/cjs/{header-cell-renderer-d92249e4.js.map → header-cell-renderer-81a22b00.js.map} +1 -1
- package/dist/cjs/{index-a9f1b728.js → index-2410bbd9.js} +1 -3
- package/dist/cjs/index-2410bbd9.js.map +1 -0
- package/dist/cjs/{key.utils-e6c8a895.js → key.utils-1e48ab8f.js} +2 -2
- package/dist/cjs/{key.utils-e6c8a895.js.map → key.utils-1e48ab8f.js.map} +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/revo-grid.cjs.entry.js +15 -19
- package/dist/cjs/revo-grid.cjs.entry.js.map +1 -1
- package/dist/cjs/revo-grid.cjs.js +1 -1
- package/dist/cjs/revogr-attribution_6.cjs.entry.js +4 -4
- package/dist/cjs/revogr-clipboard_3.cjs.entry.js +2 -2
- package/dist/cjs/revogr-data_4.cjs.entry.js +21 -8
- package/dist/cjs/revogr-data_4.cjs.entry.js.map +1 -1
- package/dist/cjs/revogr-filter-panel.cjs.entry.js +14 -17
- package/dist/cjs/revogr-filter-panel.cjs.entry.js.map +1 -1
- package/dist/cjs/{throttle-46478b04.js → throttle-bcc4740d.js} +2 -2
- package/dist/cjs/{throttle-46478b04.js.map → throttle-bcc4740d.js.map} +1 -1
- package/dist/collection/collection-manifest.json +1 -1
- package/dist/collection/components/header/header-renderer.js +18 -5
- package/dist/collection/components/header/header-renderer.js.map +1 -1
- package/dist/collection/components/header/revogr-header.js +2 -2
- package/dist/collection/components/revoGrid/revo-grid.js +10 -15
- package/dist/collection/components/revoGrid/revo-grid.js.map +1 -1
- package/dist/collection/plugins/filter/{filter.pop.js → filter.panel.js} +23 -43
- package/dist/collection/plugins/filter/filter.panel.js.map +1 -0
- package/dist/collection/plugins/filter/filter.plugin.js +2 -2
- package/dist/collection/plugins/filter/filter.plugin.js.map +1 -1
- package/dist/collection/types/interfaces.js.map +1 -1
- package/dist/collection/types/viewport.interfaces.js.map +1 -1
- package/dist/collection/utils/consts.js +0 -1
- package/dist/collection/utils/consts.js.map +1 -1
- package/dist/esm/{column.service-dce8aabc.js → column.service-0e41057a.js} +2 -2
- package/dist/esm/{column.service-dce8aabc.js.map → column.service-0e41057a.js.map} +1 -1
- package/dist/esm/{header-cell-renderer-171a011c.js → header-cell-renderer-6d8ac25d.js} +2 -2
- package/dist/esm/{header-cell-renderer-171a011c.js.map → header-cell-renderer-6d8ac25d.js.map} +1 -1
- package/dist/esm/{index-5a722722.js → index-4e881436.js} +2 -3
- package/dist/esm/index-4e881436.js.map +1 -0
- package/dist/esm/{key.utils-f82409ff.js → key.utils-425c987d.js} +2 -2
- package/dist/esm/{key.utils-f82409ff.js.map → key.utils-425c987d.js.map} +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/revo-grid.entry.js +15 -19
- package/dist/esm/revo-grid.entry.js.map +1 -1
- package/dist/esm/revo-grid.js +1 -1
- package/dist/esm/revogr-attribution_6.entry.js +4 -4
- package/dist/esm/revogr-clipboard_3.entry.js +2 -2
- package/dist/esm/revogr-data_4.entry.js +21 -8
- package/dist/esm/revogr-data_4.entry.js.map +1 -1
- package/dist/esm/revogr-filter-panel.entry.js +15 -18
- package/dist/esm/revogr-filter-panel.entry.js.map +1 -1
- package/dist/esm/{throttle-eeca0062.js → throttle-1b1dd9d2.js} +2 -2
- package/dist/esm/{throttle-eeca0062.js.map → throttle-1b1dd9d2.js.map} +1 -1
- package/dist/revo-grid/{column.service-dce8aabc.js → column.service-0e41057a.js} +2 -2
- package/dist/revo-grid/{header-cell-renderer-171a011c.js → header-cell-renderer-6d8ac25d.js} +2 -2
- package/dist/revo-grid/index-4e881436.js +5 -0
- package/dist/revo-grid/index-4e881436.js.map +1 -0
- package/dist/revo-grid/{key.utils-f82409ff.js → key.utils-425c987d.js} +2 -2
- package/dist/revo-grid/revo-grid.entry.js +1 -1
- package/dist/revo-grid/revo-grid.entry.js.map +1 -1
- package/dist/revo-grid/revo-grid.esm.js +1 -1
- package/dist/revo-grid/revo-grid.esm.js.map +1 -1
- package/dist/revo-grid/revogr-attribution_6.entry.js +1 -1
- package/dist/revo-grid/revogr-clipboard_3.entry.js +1 -1
- package/dist/revo-grid/revogr-data_4.entry.js +1 -1
- package/dist/revo-grid/revogr-data_4.entry.js.map +1 -1
- package/dist/revo-grid/revogr-filter-panel.entry.js +1 -1
- package/dist/revo-grid/revogr-filter-panel.entry.js.map +1 -1
- package/dist/revo-grid/{throttle-eeca0062.js → throttle-1b1dd9d2.js} +2 -2
- package/dist/types/components/revoGrid/revo-grid.d.ts +0 -1
- package/dist/types/components.d.ts +2 -4
- package/dist/types/plugins/filter/{filter.pop.d.ts → filter.panel.d.ts} +1 -2
- package/dist/types/plugins/filter/filter.plugin.d.ts +2 -2
- package/dist/types/types/interfaces.d.ts +1 -0
- package/dist/types/types/viewport.interfaces.d.ts +0 -2
- package/dist/types/utils/consts.d.ts +0 -1
- package/hydrate/index.js +44 -40
- package/hydrate/index.mjs +44 -40
- package/package.json +1 -1
- package/readme.md +2 -0
- package/standalone/consts.js +1 -2
- package/standalone/consts.js.map +1 -1
- package/standalone/index.d.ts +1 -1
- package/standalone/revo-grid.js +13 -17
- package/standalone/revo-grid.js.map +1 -1
- package/standalone/revogr-filter-panel.js +14 -18
- package/standalone/revogr-filter-panel.js.map +1 -1
- package/standalone/revogr-header2.js +17 -4
- package/standalone/revogr-header2.js.map +1 -1
- package/dist/cjs/index-a9f1b728.js.map +0 -1
- package/dist/collection/plugins/filter/filter.pop.js.map +0 -1
- package/dist/esm/index-5a722722.js.map +0 -1
- package/dist/revo-grid/index-5a722722.js +0 -5
- package/dist/revo-grid/index-5a722722.js.map +0 -1
- /package/dist/revo-grid/{column.service-dce8aabc.js.map → column.service-0e41057a.js.map} +0 -0
- /package/dist/revo-grid/{header-cell-renderer-171a011c.js.map → header-cell-renderer-6d8ac25d.js.map} +0 -0
- /package/dist/revo-grid/{key.utils-f82409ff.js.map → key.utils-425c987d.js.map} +0 -0
- /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-
|
|
5
|
-
//# sourceMappingURL=throttle-
|
|
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.
|
|
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.
|
|
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.
|
|
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,
|
|
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[]>;
|
|
@@ -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: '
|
|
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
|
-
|
|
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
|
-
|
|
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$": [
|
|
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,
|
|
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", {
|
|
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
|
-
//
|
|
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
|
-
|
|
14473
|
-
|
|
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,
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: {
|
|
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({
|
|
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({
|
|
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) => {
|