@revolist/revogrid 4.8.11 → 4.8.13
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/base.plugin-75fc9e81.js.map +1 -1
- package/dist/cjs/index.cjs.js +1 -0
- package/dist/cjs/index.cjs.js.map +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/revo-grid.cjs.entry.js +12 -5
- 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-attribution_6.cjs.entry.js.map +1 -1
- package/dist/cjs/revogr-clipboard_3.cjs.entry.js +1 -1
- package/dist/cjs/revogr-clipboard_3.cjs.entry.js.map +1 -1
- package/dist/cjs/revogr-data_4.cjs.entry.js +3 -3
- package/dist/cjs/revogr-data_4.cjs.entry.js.map +1 -1
- package/dist/cjs/revogr-filter-panel.cjs.entry.js +1 -1
- package/dist/cjs/revogr-filter-panel.cjs.entry.js.map +1 -1
- package/dist/collection/components/data/revogr-data-style.css +7 -1
- package/dist/collection/components/editors/revogr-edit-style.css +1 -0
- package/dist/collection/components/header/revogr-header-style.css +1 -0
- package/dist/collection/components/overlay/revogr-overlay-style.css +1 -0
- package/dist/collection/components/revoGrid/revo-grid-style.css +1 -24
- package/dist/collection/components/revoGrid/revo-grid.js +46 -3
- package/dist/collection/components/revoGrid/revo-grid.js.map +1 -1
- package/dist/collection/components/scroll/revogr-viewport-scroll-style.css +1 -0
- package/dist/collection/components/scrollable/revogr-scroll-style.css +1 -0
- package/dist/collection/components/selectionFocus/revogr-focus-style.css +1 -0
- package/dist/collection/components/selectionTempRange/revogr-temp-range-style.css +1 -0
- package/dist/collection/index.js +1 -0
- package/dist/collection/index.js.map +1 -1
- package/dist/collection/plugins/base.plugin.js.map +1 -1
- package/dist/collection/plugins/filter/filter.style.css +1 -0
- package/dist/collection/serve/controller.js +1 -0
- package/dist/collection/serve/data.js +7 -7
- package/dist/esm/{base.plugin-e6e2bac2.js → base.plugin-30463006.js} +2 -2
- package/dist/esm/{base.plugin-e6e2bac2.js.map → base.plugin-30463006.js.map} +1 -1
- package/dist/esm/{column.service-6aab6fac.js → column.service-521eb0d5.js} +3 -3
- package/dist/esm/{column.service-6aab6fac.js.map → column.service-521eb0d5.js.map} +1 -1
- package/dist/esm/{dimension.helpers-c0c2888f.js → dimension.helpers-7c71178f.js} +2 -2
- package/dist/esm/{dimension.helpers-c0c2888f.js.map → dimension.helpers-7c71178f.js.map} +1 -1
- package/dist/esm/{header-cell-renderer-b8663a21.js → header-cell-renderer-f65d0383.js} +2 -2
- package/dist/esm/{header-cell-renderer-b8663a21.js.map → header-cell-renderer-f65d0383.js.map} +1 -1
- package/dist/esm/index.js +4 -4
- package/dist/esm/{key.utils-c4a27968.js → key.utils-d4fdcf5b.js} +2 -2
- package/dist/esm/{key.utils-c4a27968.js.map → key.utils-d4fdcf5b.js.map} +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/revo-grid.entry.js +18 -11
- 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 +9 -9
- package/dist/esm/revogr-attribution_6.entry.js.map +1 -1
- package/dist/esm/revogr-clipboard_3.entry.js +3 -3
- package/dist/esm/revogr-clipboard_3.entry.js.map +1 -1
- package/dist/esm/revogr-data_4.entry.js +7 -7
- package/dist/esm/revogr-data_4.entry.js.map +1 -1
- package/dist/esm/revogr-filter-panel.entry.js +1 -1
- package/dist/esm/revogr-filter-panel.entry.js.map +1 -1
- package/dist/esm/{selection.helpers-dbf69cc1.js → selection.helpers-74cbfb89.js} +2 -2
- package/dist/esm/{selection.helpers-dbf69cc1.js.map → selection.helpers-74cbfb89.js.map} +1 -1
- package/dist/esm/{viewport.store-2dc172be.js → viewport.store-122731a5.js} +2 -2
- package/dist/esm/{viewport.store-2dc172be.js.map → viewport.store-122731a5.js.map} +1 -1
- package/dist/revo-grid/{base.plugin-e6e2bac2.js → base.plugin-30463006.js} +2 -2
- package/dist/revo-grid/{base.plugin-e6e2bac2.js.map → base.plugin-30463006.js.map} +1 -1
- package/dist/revo-grid/{column.service-6aab6fac.js → column.service-521eb0d5.js} +2 -2
- package/dist/revo-grid/{dimension.helpers-c0c2888f.js → dimension.helpers-7c71178f.js} +2 -2
- package/dist/revo-grid/{header-cell-renderer-b8663a21.js → header-cell-renderer-f65d0383.js} +2 -2
- package/dist/revo-grid/index.esm.js +1 -1
- package/dist/revo-grid/{key.utils-c4a27968.js → key.utils-d4fdcf5b.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-attribution_6.entry.js.map +1 -1
- package/dist/revo-grid/revogr-clipboard_3.entry.js +1 -1
- package/dist/revo-grid/revogr-clipboard_3.entry.js.map +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/{selection.helpers-dbf69cc1.js → selection.helpers-74cbfb89.js} +2 -2
- package/dist/revo-grid/{viewport.store-2dc172be.js → viewport.store-122731a5.js} +2 -2
- package/dist/types/components/revoGrid/revo-grid.d.ts +9 -0
- package/dist/types/components.d.ts +10 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/plugins/base.plugin.d.ts +1 -1
- package/hydrate/index.js +21 -14
- package/hydrate/index.mjs +21 -14
- package/package.json +2 -2
- package/standalone/column.service.js +1 -1
- package/standalone/data.store.js +1 -1
- package/standalone/index.js +1 -1
- package/standalone/revo-grid.js +15 -7
- package/standalone/revo-grid.js.map +1 -1
- package/standalone/revogr-data2.js +1 -1
- package/standalone/revogr-data2.js.map +1 -1
- package/standalone/revogr-edit2.js +1 -1
- package/standalone/revogr-edit2.js.map +1 -1
- package/standalone/revogr-filter-panel.js +1 -1
- package/standalone/revogr-filter-panel.js.map +1 -1
- package/standalone/revogr-focus2.js +1 -1
- package/standalone/revogr-focus2.js.map +1 -1
- package/standalone/revogr-header2.js +1 -1
- package/standalone/revogr-header2.js.map +1 -1
- package/standalone/revogr-overlay-selection2.js +1 -1
- package/standalone/revogr-overlay-selection2.js.map +1 -1
- package/standalone/revogr-row-headers2.js +1 -1
- package/standalone/revogr-scroll-virtual2.js +1 -1
- package/standalone/revogr-scroll-virtual2.js.map +1 -1
- package/standalone/revogr-temp-range2.js +1 -1
- package/standalone/revogr-temp-range2.js.map +1 -1
- package/standalone/revogr-viewport-scroll2.js +1 -1
- package/standalone/revogr-viewport-scroll2.js.map +1 -1
- /package/dist/revo-grid/{column.service-6aab6fac.js.map → column.service-521eb0d5.js.map} +0 -0
- /package/dist/revo-grid/{dimension.helpers-c0c2888f.js.map → dimension.helpers-7c71178f.js.map} +0 -0
- /package/dist/revo-grid/{header-cell-renderer-b8663a21.js.map → header-cell-renderer-f65d0383.js.map} +0 -0
- /package/dist/revo-grid/{key.utils-c4a27968.js.map → key.utils-d4fdcf5b.js.map} +0 -0
- /package/dist/revo-grid/{selection.helpers-dbf69cc1.js.map → selection.helpers-74cbfb89.js.map} +0 -0
- /package/dist/revo-grid/{viewport.store-2dc172be.js.map → viewport.store-122731a5.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","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) {\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}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 class=\"revo-button green save\" onClick={() => this.onSave()}>\n {capts.save}\n </button>\n }\n <button class=\"revo-button light reset\" onClick={() => this.onReset()}>\n {capts.reset}\n </button>\n <button class=\"revo-button light cancel\" 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 this.changes.type = defaultType;\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","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","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) {\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}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 class=\"revo-button green save\" onClick={() => this.onSave()}>\n {capts.save}\n </button>\n }\n <button class=\"revo-button light reset\" onClick={() => this.onReset()}>\n {capts.reset}\n </button>\n <button class=\"revo-button light cancel\" 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 this.changes.type = defaultType;\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,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* Built by Revolist OU ❤️
|
|
3
3
|
*/
|
|
4
|
-
import{
|
|
5
|
-
//# sourceMappingURL=selection.helpers-
|
|
4
|
+
import{l as t,k as e}from"./dimension.helpers-7c71178f.js";import"./toNumber-8de324a7.js";import"./index-e661aeb5.js";function i(){return{range:null,tempRange:null,tempRangeType:null,focus:null,edit:null,lastCell:null,nextFocus:null}}class s{constructor(){this.unsubscribe=[];this.store=t(i());this.store.on("set",((t,e)=>{if(t==="tempRange"&&!e){this.store.set("tempRangeType",null)}}))}onChange(t,e){this.unsubscribe.push(this.store.onChange(t,e))}clearFocus(){e(this.store,{focus:null,range:null,edit:null,tempRange:null})}setFocus(t,i){if(!i){e(this.store,{focus:t})}else{e(this.store,{focus:t,range:u(t,i),edit:null,tempRange:null})}}setNextFocus(t){e(this.store,{nextFocus:t})}setTempArea(t){e(this.store,{tempRange:t===null||t===void 0?void 0:t.area,tempRangeType:t===null||t===void 0?void 0:t.type,edit:null})}clearTemp(){e(this.store,{tempRange:null})}setRangeArea(t){e(this.store,{range:t,edit:null,tempRange:null})}setRange(t,e){this.setRangeArea(u(t,e))}setLastCell(t){e(this.store,{lastCell:t})}setEdit(t){const i=this.store.get("focus");if(i&&typeof t==="string"){e(this.store,{edit:{x:i.x,y:i.y,val:t}});return}e(this.store,{edit:null})}dispose(){this.unsubscribe.forEach((t=>t()));this.store.dispose()}}const n=-1;class l{constructor(){this.dirty=false;this.stores={};this.columnStores={};this.rowStores={};this.storesByType={};this.storesXToType={};this.storesYToType={};this.sections=[]}get focusedStore(){var t;for(let e in this.stores){for(let i in this.stores[e]){const s=(t=this.stores[e][i])===null||t===void 0?void 0:t.store.get("focus");if(s){return{entity:this.stores[e][i],cell:s,position:{x:parseInt(i,10),y:parseInt(e,10)}}}}}return null}get edit(){var t;return(t=this.focusedStore)===null||t===void 0?void 0:t.entity.store.get("edit")}get focused(){var t;return(t=this.focusedStore)===null||t===void 0?void 0:t.entity.store.get("focus")}get selectedRange(){var t;return(t=this.focusedStore)===null||t===void 0?void 0:t.entity.store.get("range")}registerSection(t){if(!t){this.sections.length=0;this.dirty=true;return}if(this.sections.indexOf(t)===-1){this.sections.push(t)}}beforeUpdate(){if(this.dirty){for(let t in this.stores){for(let e in this.stores[t]){this.stores[t][e].dispose()}}this.dirty=false}}registerColumn(t,e){if(r(t)){return new s}if(this.columnStores[t]){return this.columnStores[t]}this.columnStores[t]=new s;this.storesByType[e]=t;this.storesXToType[t]=e;return this.columnStores[t]}registerRow(t,e){if(r(t)){return new s}if(this.rowStores[t]){return this.rowStores[t]}this.rowStores[t]=new s;this.storesByType[e]=t;this.storesYToType[t]=e;return this.rowStores[t]}register({x:t,y:e}){var i,n;if(r(t)||r(e)){return new s}if(!this.stores[e]){this.stores[e]={}}if(this.stores[e][t]){return this.stores[e][t]}this.stores[e][t]=new s;(i=this.stores[e][t])===null||i===void 0?void 0:i.onChange("range",(i=>{this.columnStores[t].setRangeArea(i);this.rowStores[e].setRangeArea(i)}));(n=this.stores[e][t])===null||n===void 0?void 0:n.store.on("dispose",(()=>this.destroy(t,e)));return this.stores[e][t]}destroy(t,e){var i,s;(i=this.columnStores[t])===null||i===void 0?void 0:i.dispose();(s=this.rowStores[e])===null||s===void 0?void 0:s.dispose();delete this.rowStores[e];delete this.columnStores[t];if(this.storesXToType[t]){const e=this.storesXToType[t];delete this.storesXToType[t];delete this.storesByType[e]}if(this.storesYToType[e]){const t=this.storesYToType[e];delete this.storesYToType[e];delete this.storesByType[t]}if(this.stores[e]){delete this.stores[e][t]}if(!Object.keys(this.stores[e]||{}).length){delete this.stores[e]}}setEditByCell(t,e){this.focusByCell(t,e,e);this.setEdit("")}beforeNextFocusCell(t){var e;if(!this.focusedStore){return}const i=this.getNextStore(t,this.focusedStore.position,this.focusedStore.entity.store.get("lastCell"));(e=i.store)===null||e===void 0?void 0:e.setNextFocus(Object.assign(Object.assign({},t),i.item))}focusByCell(t,e,i){const s=this.stores[t.y][t.x];this.focus(s,{focus:e,end:i})}focus(t,{focus:e,end:i}){const s=this.getCurrentStorePointer(t);if(!s){return null}const n=t.store.get("lastCell");const l=this.getNextStore(e,s,n);if(l===null||l===void 0?void 0:l.store){const t=Object.assign(Object.assign({},e),l.item);this.focus(l.store,{focus:t,end:t});return null}e=h(e,n);i=h(i,n);t.setFocus(e,i);return e}getCurrentStorePointer(t){let e;for(let i in this.stores){for(let s in this.stores[i]){const n=this.stores[i][s];if(n!==t){n.clearFocus()}else{e={x:parseInt(s,10),y:parseInt(i,10)}}}}return e}getNextStore(t,e,i){const s=o(t,i);let n=null;if(s){for(let t in s){let i=t;let l;switch(i){case"x":l=this.getXStores(e.y);break;case"y":l=this.getYStores(e.x);l=this.getYStores(e.x);break}if(s[i]>=0){n=l[++e[i]]}else{n=l[--e[i]];const t=n===null||n===void 0?void 0:n.store.get("lastCell");if(t){s[i]=t[i]+s[i]}}}}return{store:n,item:s}}clearAll(){var t;for(let e in this.stores){for(let i in this.stores[e]){(t=this.stores[e][i])===null||t===void 0?void 0:t.clearFocus()}}}setEdit(t){if(!this.focusedStore){return}this.focusedStore.entity.setEdit(t)}selectAll(){for(let t in this.stores){for(let e in this.stores[t]){const i=this.stores[t][e];if(!i){continue}const s=i.store.get("lastCell");i.setRange({x:0,y:0},{x:s.x-1,y:s.y-1})}}}getXStores(t){return this.stores[t]}getYStores(t){const e={};for(let i in this.stores){e[i]=this.stores[i][t]}return e}}function r(t){return t===n}function o(t,e){const i={};let s=["x","y"];for(let e of s){if(t[e]<0){i[e]=t[e];return i}}for(let n of s){if(t[n]>=e[n]){i[n]=t[n]-e[n];return i}}return null}function h(t,e){const i=Object.assign({},t);let s=["x","y"];for(let e of s){if(t[e]<0){i[e]=0}}for(let n of s){if(t[n]>=e[n]){i[n]=e[n]-1}}return i}function u(t,e){return t&&e?{x:Math.min(t.x,e.x),y:Math.min(t.y,e.y),x1:Math.max(t.x,e.x),y1:Math.max(t.y,e.y)}:null}function f(t){return t.x===t.x1&&t.y===t.y1}export{n as E,s as S,f as a,l as b,h as c,u as g,r as i,o as n};
|
|
5
|
+
//# sourceMappingURL=selection.helpers-74cbfb89.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* Built by Revolist OU ❤️
|
|
3
3
|
*/
|
|
4
|
-
import{i as t,
|
|
5
|
-
//# sourceMappingURL=viewport.store-
|
|
4
|
+
import{i as t,l as e,k as s}from"./dimension.helpers-7c71178f.js";function i(e,s,i,f,u){const l=t(u,e);const m=h(s);let d;if(m){let t=l.itemIndex-(m.itemIndex||0);if(t){d=a(Math.abs(t),Object.assign(Object.assign({positiveDirection:t>-1},u),s))}}const z=n(f,u.realSize,l);if(d){const t=o(l,i,z,d,u);if(t.length){r(d.items,t,d)}}if(!d){const t=c({firstItemStart:l.start,firstItemIndex:l.itemIndex,origSize:u.originItemSize,maxSize:z,maxCount:i,sizes:u.sizes});d={items:t,start:0,end:t.length-1}}return d}function n(t,e,s){return Math.min(t+(s.end-s.start),e)}function r(t,e,s){t.splice(s.end+1,0,...e);if(s.start>=s.end&&!(s.start===s.end&&s.start===0)){s.start+=e.length}s.end+=e.length}function o(t,e,s,i,n){const r=m(i);const o=c({sizes:n.sizes,firstItemStart:r.end,firstItemIndex:r.itemIndex+1,origSize:n.originItemSize,maxSize:s-(r.end-t.start),maxCount:e});return o}function c(t,e=0){const s=[];let i=t.firstItemIndex;let n=e;while(n<=t.maxSize&&i<t.maxCount){const e=f(i,t.sizes,t.origSize);s.push({start:t.firstItemStart+n,end:t.firstItemStart+n+e,itemIndex:i,size:e});n+=e;i++}return s}function a(t,e){const s=[...e.items];const i=s.length;let n={start:e.start,end:e.end};if(t>i){return null}if(e.positiveDirection){let r=m(e);let o=n.start;const c=o+t;for(;o<c;o++){const t=r.itemIndex+1;const c=f(t,e.sizes,e.originItemSize);if(r.end+c>e.realSize){break}let a=o%i;if(!s[a]){throw new Error("incorrect index")}s[a]=r={start:r.end,end:r.end+c,itemIndex:t,size:c};n.start++;n.end=a}}else{let r=h(e);const o=n.end;for(let c=0;c<t;c++){const t=r.itemIndex-1;const a=f(t,e.sizes,e.originItemSize);let u=o-c;u=(u<0?i+u:u)%i;if(!s[u]){throw new Error("incorrect index")}s[u]=r={start:r.start-a,end:r.start,itemIndex:t,size:a};n.start=u;n.end--}}const r={start:(n.start<0?i+n.start:n.start)%i,end:(n.end<0?i+n.end:n.end)%i};return Object.assign({items:s},r)}function f(t,e,s=0){if(e&&e[t]){return e[t]}return s}function u(t,e,s,i){if(!s||!i){return false}return t>=s.start&&t<=s.end||t>s.end&&i.end===e}function l(t,e,s,i){if(!s){return false}return e+t>(i===null||i===void 0?void 0:i.end)}function h(t){return t.items[t.start]}function m(t){return t.items[t.end]}function d(t,e,s,i){const n=[...t];const r=n.length;let o=i;let c=0;let a=e;if(!r){return[]}while(c<r){const t=n[a];t.start=o;t.size=s;t.end=t.start+s;o=t.end;a++;c++;if(a===r){a=0}}return n}function z(){return{items:[],start:0,end:0,virtualSize:0,realCount:0}}class b{get lastCoordinate(){return this.lastKnownScroll}set lastCoordinate(t){this.lastKnownScroll=t}constructor(t){this.type=t;this.lastKnownScroll=0;this.store=e(z());this.store.onChange("realCount",(()=>this.clearItems()));this.store.onChange("virtualSize",(()=>this.clearItems()))}setViewPortCoordinate(t,e){const s=this.store.get("virtualSize");if(!s){return}const n=1;const c=e.originItemSize*n;const a=c*2;const f=s+a;let d=0;if(e.realSize>s){d=e.realSize-s-c}let z=t;if(z<0){z=0}else if(z>d){z=d}this.lastCoordinate=z;z-=c;z=z<0?0:z<d?z:d;const b=this.getItems();const x=[...b.items];const I=h(b);const S=m(b);let j={};if(!u(z,e.realSize,I,S)){j=Object.assign(Object.assign({},j),i(z,b,this.store.get("realCount"),f,e));this.setViewport(Object.assign({},j))}else if(l(z,f,I,S)){const t=o(I,this.store.get("realCount"),f+z-I.start,b,{sizes:e.sizes,originItemSize:e.originItemSize});if(t.length){const e={start:this.store.get("start"),end:this.store.get("end")};r(x,t,e);j=Object.assign(Object.assign(Object.assign({},j),{items:[...x]}),e);this.setViewport(Object.assign({},j))}}}setViewPortDimensionSizes(t,e){let s=[...this.store.get("items")];const i=s.length;if(!i){return}let n=0;let r=0;let o=this.store.get("start");if(e){const t=this.getItems();const i=h(t);s=d(s,o,e,i.start)}while(r<i){const e=s[o];if(n){e.start+=n;e.end+=n}const c=t[e.itemIndex];if(c){const t=c-e.size;n+=t;e.size=c;e.end=e.start+c}o++;r++;if(o===i){o=0}}this.setViewport({items:[...s]})}setOriginalSizes(t){const e=this.store.get("items");const i=e.length;if(!i){return}s(this.store,{items:d(e,this.store.get("start"),t,this.lastCoordinate)})}getItems(){return{items:this.store.get("items"),start:this.store.get("start"),end:this.store.get("end")}}setViewport(t){s(this.store,t)}clearItems(){this.store.set("items",[])}}export{b as V,o as a,c as b,l as c,h as d,m as e,i as g,u as i,a as r,d as s,r as u};
|
|
5
|
+
//# sourceMappingURL=viewport.store-122731a5.js.map
|
|
@@ -399,6 +399,14 @@ export declare class RevoGridComponent {
|
|
|
399
399
|
* Emmited after the grid is initialized. Connected to the DOM.
|
|
400
400
|
*/
|
|
401
401
|
aftergridinit: EventEmitter;
|
|
402
|
+
/**
|
|
403
|
+
* Emmited after the additional data is changed
|
|
404
|
+
*/
|
|
405
|
+
additionaldatachanged: EventEmitter<any>;
|
|
406
|
+
/**
|
|
407
|
+
* Emmited after the theme is changed
|
|
408
|
+
*/
|
|
409
|
+
afterthemechanged: EventEmitter<Theme>;
|
|
402
410
|
/**
|
|
403
411
|
* Refreshes data viewport.
|
|
404
412
|
* Can be specific part as rgRow or pinned rgRow or 'all' by default.
|
|
@@ -560,6 +568,7 @@ export declare class RevoGridComponent {
|
|
|
560
568
|
* Register external VNodes
|
|
561
569
|
*/
|
|
562
570
|
registerOutsideVNodes(elements?: VNode[]): void;
|
|
571
|
+
additionalDataChanged(data: any): void;
|
|
563
572
|
private setPlugins;
|
|
564
573
|
private removePlugins;
|
|
565
574
|
connectedCallback(): void;
|
|
@@ -807,6 +807,8 @@ declare global {
|
|
|
807
807
|
"rowheaderschanged": any;
|
|
808
808
|
"beforegridrender": any;
|
|
809
809
|
"aftergridinit": any;
|
|
810
|
+
"additionaldatachanged": any;
|
|
811
|
+
"afterthemechanged": Theme;
|
|
810
812
|
}
|
|
811
813
|
/**
|
|
812
814
|
* Revogrid - High-performance, customizable grid library for managing large datasets.
|
|
@@ -1253,6 +1255,10 @@ declare namespace LocalJSX {
|
|
|
1253
1255
|
* Prevent rendering until job is done. Can be used for initial rendering performance improvement. When several plugins require initial rendering this will prevent double initial rendering.
|
|
1254
1256
|
*/
|
|
1255
1257
|
"jobsBeforeRender"?: Promise<any>[];
|
|
1258
|
+
/**
|
|
1259
|
+
* Emmited after the additional data is changed
|
|
1260
|
+
*/
|
|
1261
|
+
"onAdditionaldatachanged"?: (event: RevoGridCustomEvent<any>) => void;
|
|
1256
1262
|
/**
|
|
1257
1263
|
* Emitted after each source update, whether from the pinned or main viewport. Useful for tracking all changes originating from sources in both the pinned and main viewports.
|
|
1258
1264
|
*/
|
|
@@ -1295,6 +1301,10 @@ declare namespace LocalJSX {
|
|
|
1295
1301
|
type: DimensionRows;
|
|
1296
1302
|
source: DataType[];
|
|
1297
1303
|
}>) => void;
|
|
1304
|
+
/**
|
|
1305
|
+
* Emmited after the theme is changed
|
|
1306
|
+
*/
|
|
1307
|
+
"onAfterthemechanged"?: (event: RevoGridCustomEvent<Theme>) => void;
|
|
1298
1308
|
/**
|
|
1299
1309
|
* Emitted after trimmed values have been applied. Useful for notifying when trimming of values has taken place.
|
|
1300
1310
|
*/
|
package/dist/types/index.d.ts
CHANGED
|
@@ -36,7 +36,7 @@ export declare class BasePlugin implements PluginBaseComponent {
|
|
|
36
36
|
* Emit event from revo-grid component
|
|
37
37
|
* Event can be cancelled by calling event.preventDefault() in callback
|
|
38
38
|
*/
|
|
39
|
-
emit(eventName: string, detail?:
|
|
39
|
+
emit<T = any>(eventName: string, detail?: T): CustomEvent<T>;
|
|
40
40
|
/**
|
|
41
41
|
* Clear all subscriptions
|
|
42
42
|
*/
|