@revolist/revogrid 4.23.13 → 4.23.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/cjs/{column.drag.plugin-D_Dfhp4f.js → column.drag.plugin-ByDJ7Rk3.js} +5 -5
  2. package/dist/cjs/{filter.button-B9EzJrr1.js → filter.button-C4xpvyyE.js} +10 -16
  3. package/dist/cjs/index.cjs.js +2 -2
  4. package/dist/cjs/revo-grid.cjs.entry.js +2 -2
  5. package/dist/cjs/revogr-clipboard_3.cjs.entry.js +1 -1
  6. package/dist/cjs/revogr-data_4.cjs.entry.js +1 -1
  7. package/dist/cjs/revogr-filter-panel.cjs.entry.js +119 -41
  8. package/dist/collection/components/clipboard/revogr-clipboard.js +1 -1
  9. package/dist/collection/plugins/filter/filter.button.js +10 -16
  10. package/dist/collection/plugins/filter/filter.panel.js +117 -39
  11. package/dist/collection/plugins/filter/filter.plugin.js +4 -4
  12. package/dist/collection/plugins/filter/filter.style.css +65 -13
  13. package/dist/{revo-grid/column.drag.plugin-UNSHSmgo.js → esm/column.drag.plugin-BZacA8n_.js} +5 -5
  14. package/dist/{revo-grid/filter.button-BFwo1uvz.js → esm/filter.button-B-RBiF67.js} +10 -16
  15. package/dist/esm/index.js +3 -3
  16. package/dist/esm/revo-grid.entry.js +2 -2
  17. package/dist/esm/revogr-clipboard_3.entry.js +1 -1
  18. package/dist/esm/revogr-data_4.entry.js +1 -1
  19. package/dist/esm/revogr-filter-panel.entry.js +119 -41
  20. package/dist/{esm/column.drag.plugin-UNSHSmgo.js → revo-grid/column.drag.plugin-BZacA8n_.js} +5 -5
  21. package/dist/{esm/filter.button-BFwo1uvz.js → revo-grid/filter.button-B-RBiF67.js} +10 -16
  22. package/dist/revo-grid/index.esm.js +3 -3
  23. package/dist/revo-grid/revo-grid.entry.js +2 -2
  24. package/dist/revo-grid/revogr-clipboard_3.entry.js +1 -1
  25. package/dist/revo-grid/revogr-data_4.entry.js +1 -1
  26. package/dist/revo-grid/revogr-filter-panel.entry.js +119 -41
  27. package/dist/types/plugins/filter/filter.button.d.ts +13 -3
  28. package/dist/types/plugins/filter/filter.panel.d.ts +4 -0
  29. package/dist/types/plugins/filter/filter.types.d.ts +7 -0
  30. package/hydrate/index.js +133 -61
  31. package/hydrate/index.mjs +133 -61
  32. package/package.json +1 -1
  33. package/standalone/filter.button.js +1 -1
  34. package/standalone/revo-grid.js +1 -1
  35. package/standalone/revogr-clipboard2.js +1 -1
  36. package/standalone/revogr-filter-panel.js +1 -1
@@ -3,7 +3,7 @@
3
3
  */
4
4
  import { r as registerInstance, d as createEvent, h, e as Host, g as getElement } from './index-Chp_81rd.js';
5
5
  import { d as debounce } from './debounce-PCRWZliA.js';
6
- import { i as isFilterBtn, e as AndOrButton, f as ReorderButton, d as TrashButton } from './filter.button-BFwo1uvz.js';
6
+ import { i as isFilterBtn, e as AndOrButton, f as ReorderButton, d as TrashButton } from './filter.button-B-RBiF67.js';
7
7
 
8
8
  (function closest() {
9
9
  if (!Element.prototype.matches) {
@@ -66,12 +66,13 @@ function moveFilterItem(items, sourceId, targetId) {
66
66
  return true;
67
67
  }
68
68
 
69
- const filterStyleCss = () => `.revo-button{position:relative;overflow:hidden;color:#fff;background-color:#4545ff;height:32px;line-height:32px;padding:0 15px;outline:0;border:0;border-radius:7px;box-sizing:border-box;cursor:pointer}.revo-button.green{background-color:#009037}.revo-button.red{background-color:#E0662E}.revo-button:disabled,.revo-button[disabled]{cursor:not-allowed !important;filter:opacity(0.35) !important}.revo-button.outline{border:1px solid #dbdbdb;line-height:30px;background:none;color:#000;box-shadow:none}revo-grid[theme^=dark] .revo-button.outline{border:1px solid #404040;color:#d8d8d8}revogr-filter-panel{position:absolute;display:block;top:0;left:0;z-index:100;max-height:calc(100% - 80px);overflow:auto;opacity:1;transform:none;background-color:var(--revo-grid-filter-panel-bg, #fff);border:1px solid var(--revo-grid-filter-panel-border, #cecece);transform-origin:62px 0px;box-shadow:0 5px 18px -2px var(--revo-grid-filter-panel-shadow, rgba(0, 0, 0, 0.15));padding:10px;border-radius:8px;min-width:220px;text-align:left;animation:revogr-filter-panel-open 140ms cubic-bezier(0.2, 0, 0, 1)}revogr-filter-panel .filter-holder>div{display:flex;flex-direction:column}revogr-filter-panel label{font-size:13px;display:block;padding:8px 0}revogr-filter-panel select{width:100%}revogr-filter-panel input[type=text]{border:0;min-height:34px;margin:5px 0;background:var(--revo-grid-filter-panel-input-bg, #f3f3f3);border-radius:5px;padding:0 10px;box-sizing:border-box;width:100%}revogr-filter-panel .filter-actions{text-align:right;margin-right:-5px}revogr-filter-panel .filter-actions button{margin-top:10px;margin-right:5px}@keyframes revogr-filter-panel-open{from{opacity:0;transform:translateY(-4px) scale(0.98)}to{opacity:1;transform:none}}@media (prefers-reduced-motion: reduce){revogr-filter-panel{animation:none}}.rgHeaderCell:hover .rv-filter{transition:opacity 267ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, transform 178ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.rgHeaderCell:hover .rv-filter,.rgHeaderCell .rv-filter.active{opacity:1}.rgHeaderCell .rv-filter{height:24px;width:24px;background:none;border:0;opacity:0;visibility:visible;cursor:pointer;border-radius:4px}.rgHeaderCell .rv-filter.active{color:#10224a}.rgHeaderCell .rv-filter .filter-img{color:gray;width:11px}.select-css{display:block;font-family:sans-serif;line-height:1.3;padding:0.6em 1.4em 0.5em 0.8em;width:100%;max-width:100%;box-sizing:border-box;margin:0;border:1px solid var(--revo-grid-filter-panel-select-border, #d9d9d9);box-shadow:transparent;border-radius:0.5em;appearance:none;background-color:var(--revo-grid-filter-panel-input-bg, #f3f3f3);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%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");background-repeat:no-repeat, repeat;background-position:right 0.7em top 50%, 0 0;background-size:0.65em auto, 100%;}.select-css::-ms-expand{display:none}.select-css:hover{border-color:var(--revo-grid-filter-panel-select-border, #d9d9d9)}.select-css:focus{border-color:var(--revo-grid-filter-panel-select-border-hover, #d9d9d9);box-shadow:0 0 1px 3px rgba(59, 153, 252, 0.7);box-shadow:0 0 0 3px -moz-mac-focusring;outline:none}.select-css option{font-weight:normal}.select-css:disabled,.select-css[aria-disabled=true]{color:gray;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"), linear-gradient(to bottom, #ffffff 0%, #ffffff 100%)}.select-css:disabled:hover,.select-css[aria-disabled=true]{border-color:var(--revo-grid-filter-panel-select-border, #d9d9d9)}.multi-filter-list{margin-top:5px;margin-bottom:5px}.multi-filter-list div{white-space:nowrap}.multi-filter-list .multi-filter-list-row{display:flex;align-items:center;gap:6px}.multi-filter-list .multi-filter-list-action{display:flex;flex:0 0 auto;justify-content:flex-end;align-items:center}.multi-filter-list .and-or-button{margin:0 0 0 10px;min-width:58px;cursor:pointer}.multi-filter-list .trash-button{margin:0 0 -2px 6px;cursor:pointer;width:22px;height:100%;font-size:16px}.multi-filter-list .trash-button .trash-img{width:1em}.multi-filter-list .reorder-button{border:0;background:transparent;color:var(--revo-grid-filter-panel-reorder-color, #6b7280);cursor:grab;font-family:monospace;font-size:12px;letter-spacing:0;line-height:1;padding:6px 2px;transform:scaleX(0.8);width:16px}.multi-filter-list .reorder-button.filter-row-dragging{opacity:0.55}.multi-filter-list .reorder-button.filter-row-drag-over{color:var(--revo-grid-filter-panel-reorder-accent, #007cb2)}.multi-filter-list .reorder-button:active{cursor:grabbing}.add-filter-divider{display:block;margin:0 -10px 10px -10px;border-bottom:1px solid var(--revo-grid-filter-panel-divider, #d9d9d9);height:10px}.select-input{display:flex;align-items:center;flex:1 1 auto;gap:6px;min-width:0}.select-input .select-filter,.select-input .filter-extra{flex:1 1 0;min-width:0}.select-input .filter-extra{display:flex}.select-input .filter-extra>*{width:100%}.select-input input[type=text],.select-input input[type=date]{margin:0}`;
69
+ const filterStyleCss = () => `.revo-button{position:relative;overflow:hidden;color:#fff;background-color:#4545ff;height:32px;line-height:32px;padding:0 15px;outline:0;border:0;border-radius:7px;box-sizing:border-box;cursor:pointer}.revo-button.green{background-color:#009037}.revo-button.red{background-color:#E0662E}.revo-button:disabled,.revo-button[disabled]{cursor:not-allowed !important;filter:opacity(0.35) !important}.revo-button.outline{border:1px solid #dbdbdb;line-height:30px;background:none;color:#000;box-shadow:none}revo-grid[theme^=dark] .revo-button.outline{border:1px solid #404040;color:#d8d8d8}revogr-filter-panel{display:block}revogr-filter-panel .filter-panel-dialog{position:fixed;top:0;left:0;z-index:100;max-height:calc(100vh - 16px);overflow:auto;opacity:1;transform:none;background-color:var(--revo-grid-filter-panel-bg, #fff);border:1px solid var(--revo-grid-filter-panel-border, #cecece);transform-origin:62px 0px;box-shadow:0 5px 18px -2px var(--revo-grid-filter-panel-shadow, rgba(0, 0, 0, 0.15));box-sizing:border-box;padding:10px;border-radius:8px;margin:0;min-width:220px;text-align:left;animation:revogr-filter-panel-open 140ms cubic-bezier(0.2, 0, 0, 1)}revogr-filter-panel .filter-panel-dialog .filter-holder>div{display:flex;flex-direction:column}revogr-filter-panel .filter-panel-dialog label{font-size:13px;display:block;padding:8px 0}revogr-filter-panel .filter-panel-dialog select{width:100%}revogr-filter-panel .filter-panel-dialog input[type=text]{border:0;min-height:34px;margin:5px 0;background:var(--revo-grid-filter-panel-input-bg, #f3f3f3);border-radius:5px;padding:0 10px;box-sizing:border-box;width:100%}revogr-filter-panel .filter-panel-dialog .filter-actions{position:sticky;right:0;bottom:-10px;left:0;z-index:1;text-align:right;margin:10px -10px -10px;padding:0 5px 10px 10px;background:var(--revo-grid-filter-panel-bg, #fff);border-top:1px solid var(--revo-grid-filter-panel-divider, #d9d9d9)}revogr-filter-panel .filter-panel-dialog .filter-actions button{margin-top:10px;margin-right:5px}@keyframes revogr-filter-panel-open{from{opacity:0;transform:translateY(-4px) scale(0.98)}to{opacity:1;transform:none}}@media (prefers-reduced-motion: reduce){revogr-filter-panel .filter-panel-dialog{animation:none}}.rgHeaderCell:hover .rv-filter{transition:opacity 267ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, transform 178ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.rgHeaderCell:hover .rv-filter,.rgHeaderCell .rv-filter.active{opacity:1}.rgHeaderCell .rv-filter{height:24px;width:24px;background:none;border:0;opacity:0;visibility:visible;cursor:pointer;border-radius:4px}.rgHeaderCell .rv-filter.active{color:#10224a}.rgHeaderCell .rv-filter .filter-img{color:gray;width:11px}.select-css{display:block;font-family:sans-serif;line-height:1.3;padding:0.6em 1.4em 0.5em 0.8em;width:100%;max-width:100%;box-sizing:border-box;margin:0;border:1px solid var(--revo-grid-filter-panel-select-border, #d9d9d9);box-shadow:transparent;border-radius:0.5em;appearance:none;background-color:var(--revo-grid-filter-panel-input-bg, #f3f3f3);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%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");background-repeat:no-repeat, repeat;background-position:right 0.7em top 50%, 0 0;background-size:0.65em auto, 100%;}.select-css::-ms-expand{display:none}.select-css:hover{border-color:var(--revo-grid-filter-panel-select-border, #d9d9d9)}.select-css:focus{border-color:var(--revo-grid-filter-panel-select-border-hover, #d9d9d9);box-shadow:0 0 1px 3px rgba(59, 153, 252, 0.7);box-shadow:0 0 0 3px -moz-mac-focusring;outline:none}.select-css option{font-weight:normal}.select-css:disabled,.select-css[aria-disabled=true]{color:gray;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"), linear-gradient(to bottom, #ffffff 0%, #ffffff 100%)}.select-css:disabled:hover,.select-css[aria-disabled=true]{border-color:var(--revo-grid-filter-panel-select-border, #d9d9d9)}.multi-filter-list{margin-top:5px;margin-bottom:5px}.multi-filter-list div{white-space:nowrap}.multi-filter-list .multi-filter-list-row{display:flex;align-items:center;gap:6px;position:relative}.multi-filter-list .multi-filter-list-row.filter-row-dragging{opacity:0.65}.multi-filter-list .multi-filter-list-row.filter-row-drag-over::before{content:"";position:absolute;top:-4px;right:0;left:0;z-index:2;height:2px;background:var(--revo-grid-filter-panel-reorder-accent, #007cb2);border-radius:999px;box-shadow:0 0 0 2px var(--revo-grid-filter-panel-bg, #fff)}.multi-filter-list .multi-filter-list-row.filter-row-drop-active .filter-row-drop-target{pointer-events:auto}.multi-filter-list .filter-row-drop-target{position:absolute;inset:0;z-index:1;padding:0;pointer-events:none;background:transparent;border:0}.multi-filter-list .multi-filter-list-action{display:flex;align-self:stretch;flex:0 0 auto;justify-content:flex-end;align-items:center}.multi-filter-list .and-or-button{margin:0 0 0 10px;min-width:58px;cursor:pointer}.multi-filter-list .trash-button{margin:0 0 -2px 6px;padding:0;border:0;background:transparent;color:inherit;cursor:pointer;width:22px;height:100%;font-size:16px}.multi-filter-list .trash-button .trash-img{width:1em}.multi-filter-list .reorder-button{border:0;background:transparent;color:var(--revo-grid-filter-panel-reorder-color, #6b7280);cursor:grab;font-family:monospace;font-size:12px;letter-spacing:0;line-height:1;padding:6px 2px;transform:scaleX(0.8);width:16px}.multi-filter-list .reorder-button.filter-row-drag-over{color:var(--revo-grid-filter-panel-reorder-accent, #007cb2)}.multi-filter-list .reorder-button:active{cursor:grabbing}.multi-filter-list-container{padding:0;margin:0;list-style:none}.add-filter-divider{display:block;margin:0 -10px 10px -10px;border-bottom:1px solid var(--revo-grid-filter-panel-divider, #d9d9d9);height:10px}.select-input{display:flex;align-items:center;flex:1 1 auto;gap:6px;min-width:0}.select-input .select-filter,.select-input .filter-extra{flex:1 1 0;min-width:0}.select-input .select-filter{width:auto}.select-input .filter-extra{display:flex}.select-input .filter-extra>*{width:100%}.select-input input[type=text],.select-input input[type=date]{margin:0}`;
70
70
 
71
71
  const defaultType = 'none';
72
72
  const FILTER_LIST_CLASS = 'multi-filter-list';
73
73
  const FILTER_LIST_CLASS_ACTION = 'multi-filter-list-action';
74
74
  const FILTER_ID = 'add-filter';
75
+ const VIEWPORT_PADDING = 8;
75
76
  const FilterPanel = class {
76
77
  constructor(hostRef) {
77
78
  registerInstance(this, hostRef);
@@ -88,6 +89,9 @@ const FilterPanel = class {
88
89
  placeholder: 'Enter value...',
89
90
  and: 'and',
90
91
  or: 'or',
92
+ filterCondition: 'Filter condition',
93
+ removeFilter: 'Remove filter',
94
+ reorderFilter: 'Reorder filter',
91
95
  };
92
96
  this.isFilterIdSet = false;
93
97
  this.filterId = 0;
@@ -162,36 +166,75 @@ const FilterPanel = class {
162
166
  return '';
163
167
  const propFilters = (_b = this.filterItems[prop]) !== null && _b !== void 0 ? _b : [];
164
168
  const visibleFilterCount = propFilters.filter(filter => !filter.hidden).length;
165
- const capts = Object.assign(this.filterCaptionsInternal, this.filterCaptions);
166
- return (h("div", { key: this.filterId }, propFilters.map((filter, index) => {
169
+ const capts = Object.assign(Object.assign({}, this.filterCaptionsInternal), this.filterCaptions);
170
+ return (h("div", { key: this.filterId }, h("ul", { class: "multi-filter-list-container" }, propFilters.map((filter, index) => {
167
171
  let andOrButton;
168
172
  if (filter.hidden) {
169
173
  return;
170
174
  }
171
175
  // hide toggle button if there is only one filter and the last one
172
176
  if (index !== this.filterItems[prop].length - 1) {
173
- andOrButton = (h("div", { onClick: () => this.toggleFilterAndOr(filter.id) }, h(AndOrButton, { text: filter.relation === 'and' ? capts.and : capts.or })));
177
+ andOrButton = (h(AndOrButton, { text: filter.relation === 'and' ? capts.and : capts.or, onClick: () => this.toggleFilterAndOr(filter.id) }));
174
178
  }
175
179
  const extra = this.renderExtra(prop, index);
176
- return (h("div", { key: filter.id, class: FILTER_LIST_CLASS }, h("div", { ref: el => el === null || el === void 0 ? void 0 : el.classList.add('multi-filter-list-row') }, visibleFilterCount > 1 ? (h(ReorderButton, { dragging: this.draggedFilterId === filter.id, dragOver: this.dragOverFilterId === filter.id && this.draggedFilterId !== filter.id, onDragStart: e => this.onFilterDragStart(e, filter.id), onDragEnd: () => this.onFilterDragEnd(), onDragOver: e => this.onFilterDragOver(e, filter.id), onDragLeave: () => this.onFilterDragLeave(filter.id), onDrop: e => this.onFilterDrop(e, prop, filter.id) })) : '', h("div", { class: { 'select-input': true } }, h("select", { class: "select-css select-filter", onChange: e => this.onFilterTypeChange(e, prop, index) }, this.renderSelectOptions(this.filterItems[prop][index].type, true)), extra ? h("div", { class: "filter-extra" }, extra) : ''), h("div", { class: FILTER_LIST_CLASS_ACTION }, andOrButton, h("div", { onClick: () => this.onRemoveFilter(filter.id) }, h(TrashButton, null))))));
177
- }), propFilters.filter(f => !f.hidden).length > 0 ? h("div", { class: "add-filter-divider" }) : ''));
180
+ const isDragging = this.draggedFilterId === filter.id;
181
+ const isDragOver = this.dragOverFilterId === filter.id && !isDragging;
182
+ const canReorder = visibleFilterCount > 1;
183
+ return (h("li", { key: filter.id, class: FILTER_LIST_CLASS, "aria-label": `${capts.filterCondition} ${index + 1}` }, h("div", { class: {
184
+ 'multi-filter-list-row': true,
185
+ 'filter-row-drop-active': this.draggedFilterId !== undefined && !isDragging,
186
+ 'filter-row-dragging': isDragging,
187
+ 'filter-row-drag-over': isDragOver,
188
+ } }, canReorder ? (h("button", { type: "button", class: "filter-row-drop-target", tabIndex: -1, "aria-label": `${capts.filterCondition} ${index + 1}`, onDragOver: e => this.onFilterDragOver(e, filter.id), onDragLeave: () => this.onFilterDragLeave(filter.id), onDrop: e => this.onFilterDrop(e, prop, filter.id) })) : '', canReorder ? (h(ReorderButton, { ariaLabel: capts.reorderFilter, dragging: isDragging, dragOver: isDragOver, onDragStart: e => this.onFilterDragStart(e, filter.id), onDragEnd: () => this.onFilterDragEnd(), onKeyDown: e => this.onFilterReorderKeyDown(e, prop, filter.id) })) : '', h("div", { class: { 'select-input': true } }, h("select", { class: "select-css select-filter", onChange: e => this.onFilterTypeChange(e, prop, index) }, this.renderSelectOptions(this.filterItems[prop][index].type, true)), extra ? h("div", { class: "filter-extra" }, extra) : ''), h("div", { class: FILTER_LIST_CLASS_ACTION }, andOrButton, h(TrashButton, { ariaLabel: capts.removeFilter, onClick: () => this.onRemoveFilter(filter.id) })))));
189
+ })), propFilters.filter(f => !f.hidden).length > 0 ? h("div", { class: "add-filter-divider" }) : ''));
178
190
  }
179
- autoCorrect(el) {
180
- var _a, _b;
181
- if (!el) {
191
+ componentDidRender() {
192
+ this.syncDialog();
193
+ }
194
+ syncDialog() {
195
+ if (!this.dialog) {
182
196
  return;
183
197
  }
184
- const revoGrid = el.closest('revo-grid');
185
- if (!revoGrid) {
198
+ if (!this.changes) {
199
+ if (this.dialog.open) {
200
+ this.dialog.close();
201
+ }
186
202
  return;
187
203
  }
188
- const pos = el.getBoundingClientRect();
189
- const gridPos = revoGrid.getBoundingClientRect();
190
- const maxLeft = gridPos.right - pos.width;
191
- if (pos.left > maxLeft && el.offsetLeft) {
192
- el.style.left = `${maxLeft - ((_b = (_a = el.parentElement) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect().left) !== null && _b !== void 0 ? _b : 0)}px`;
204
+ if (!this.dialog.open) {
205
+ this.dialog.show();
206
+ }
207
+ if (this.changes.autoCorrect !== false) {
208
+ this.autoCorrect(this.dialog);
209
+ requestAnimationFrame(() => this.autoCorrect(this.dialog));
193
210
  }
194
211
  }
212
+ autoCorrect(el) {
213
+ var _a;
214
+ if (!el || !this.changes) {
215
+ return;
216
+ }
217
+ el.style.maxHeight = '';
218
+ el.style.left = `${this.changes.x}px`;
219
+ el.style.top = `${this.changes.y}px`;
220
+ const pos = el.getBoundingClientRect();
221
+ const anchorTop = (_a = this.changes.anchorY) !== null && _a !== void 0 ? _a : this.changes.y;
222
+ const anchorBottom = this.changes.y;
223
+ const spaceAbove = Math.max(0, anchorTop - VIEWPORT_PADDING);
224
+ const spaceBelow = Math.max(0, window.innerHeight - anchorBottom - VIEWPORT_PADDING);
225
+ const openAbove = pos.height > spaceBelow && spaceAbove > spaceBelow;
226
+ const availableHeight = Math.max(VIEWPORT_PADDING, openAbove ? spaceAbove : spaceBelow);
227
+ el.style.maxHeight = `${availableHeight}px`;
228
+ const adjustedPos = el.getBoundingClientRect();
229
+ const maxLeft = Math.max(VIEWPORT_PADDING, window.innerWidth - adjustedPos.width - VIEWPORT_PADDING);
230
+ const maxTop = Math.max(VIEWPORT_PADDING, window.innerHeight - adjustedPos.height - VIEWPORT_PADDING);
231
+ const left = Math.min(Math.max(VIEWPORT_PADDING, this.changes.x), maxLeft);
232
+ const top = openAbove
233
+ ? Math.min(Math.max(VIEWPORT_PADDING, anchorTop - adjustedPos.height), maxTop)
234
+ : Math.min(Math.max(VIEWPORT_PADDING, anchorBottom), maxTop);
235
+ el.style.left = `${left}px`;
236
+ el.style.top = `${top}px`;
237
+ }
195
238
  onFilterTypeChange(e, prop, index) {
196
239
  if (!(e.target instanceof HTMLSelectElement)) {
197
240
  return;
@@ -325,6 +368,37 @@ const FilterPanel = class {
325
368
  this.draggedFilterId = undefined;
326
369
  this.dragOverFilterId = undefined;
327
370
  }
371
+ onFilterReorderKeyDown(e, prop, sourceId) {
372
+ let direction = 0;
373
+ if (e.key === 'ArrowUp') {
374
+ direction = -1;
375
+ }
376
+ else if (e.key === 'ArrowDown') {
377
+ direction = 1;
378
+ }
379
+ else {
380
+ return;
381
+ }
382
+ const items = this.filterItems[prop];
383
+ if (!items) {
384
+ return;
385
+ }
386
+ const visibleItems = items.filter(item => !item.hidden);
387
+ const sourceIndex = visibleItems.findIndex(item => item.id === sourceId);
388
+ if (sourceIndex === -1) {
389
+ return;
390
+ }
391
+ e.preventDefault();
392
+ e.stopPropagation();
393
+ const target = visibleItems[sourceIndex + direction];
394
+ if (!target || !moveFilterItem(items, sourceId, target.id)) {
395
+ return;
396
+ }
397
+ this.filterId++;
398
+ if (!this.disableDynamicFiltering) {
399
+ this.debouncedApplyFilter();
400
+ }
401
+ }
328
402
  toggleFilterAndOr(id) {
329
403
  var _a;
330
404
  this.assertChanges();
@@ -363,7 +437,7 @@ const FilterPanel = class {
363
437
  });
364
438
  });
365
439
  if (!isDefaultTypeRemoved) {
366
- const capts = Object.assign(this.filterCaptionsInternal, this.filterCaptions);
440
+ const capts = Object.assign(Object.assign({}, this.filterCaptionsInternal), this.filterCaptions);
367
441
  options.push(h("option", { selected: this.currentFilterType === defaultType, value: defaultType }, prop && this.filterItems[prop] && this.filterItems[prop].length > 0
368
442
  ? capts.add
369
443
  : this.filterNames[defaultType]));
@@ -396,7 +470,7 @@ const FilterPanel = class {
396
470
  select.focus();
397
471
  }
398
472
  };
399
- const capts = Object.assign(this.filterCaptionsInternal, this.filterCaptions);
473
+ const capts = Object.assign(Object.assign({}, this.filterCaptionsInternal), this.filterCaptions);
400
474
  const extra = this.filterEntities[currentFilter[index].type].extra;
401
475
  if (typeof extra === 'function') {
402
476
  return extra(h, {
@@ -433,30 +507,34 @@ const FilterPanel = class {
433
507
  } }));
434
508
  }
435
509
  render() {
436
- var _a, _b, _c, _d, _e;
437
- if (!this.changes) {
438
- return h(Host, { style: { display: 'none' } });
439
- }
510
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
440
511
  const style = {
441
- display: 'block',
442
- left: `${this.changes.x}px`,
443
- top: `${this.changes.y}px`,
512
+ left: `${(_b = (_a = this.changes) === null || _a === void 0 ? void 0 : _a.x) !== null && _b !== void 0 ? _b : 0}px`,
513
+ top: `${(_d = (_c = this.changes) === null || _c === void 0 ? void 0 : _c.y) !== null && _d !== void 0 ? _d : 0}px`,
444
514
  };
445
- const capts = Object.assign(this.filterCaptionsInternal, this.filterCaptions);
446
- return (h(Host, { style: style, ref: el => {
447
- var _a;
448
- ((_a = this.changes) === null || _a === void 0 ? void 0 : _a.autoCorrect) !== false && this.autoCorrect(el);
449
- } }, h("slot", { slot: "header" }), ((_b = (_a = this.changes).extraContent) === null || _b === void 0 ? void 0 : _b.call(_a, this.changes)) || '', ((_c = this.changes) === null || _c === void 0 ? void 0 : _c.hideDefaultFilters) !== true && ([
450
- h("label", null, capts.title),
451
- h("div", { class: "filter-holder" }, this.getFilterItemsList()),
452
- h("div", { class: "add-filter" }, h("select", { id: FILTER_ID, class: "select-css", onChange: e => this.onAddNewFilter(e) }, this.renderSelectOptions(this.currentFilterType)))
453
- ]), h("slot", null), ((_e = (_d = this.changes).extraBottomContent) === null || _e === void 0 ? void 0 : _e.call(_d, this.changes)) || '', h("div", { class: "filter-actions" }, this.disableDynamicFiltering && [
454
- h("button", { id: "revo-button-save", "aria-label": "save", class: "revo-button green", onClick: () => this.onSave() }, capts.save),
455
- h("button", { id: "revo-button-ok", "aria-label": "ok", class: "revo-button green", onClick: () => this.onCancel() }, capts.cancel),
456
- ], !this.disableDynamicFiltering && [
457
- h("button", { id: "revo-button-ok", "aria-label": "ok", class: "revo-button green", onClick: () => this.onCancel() }, capts.ok),
458
- h("button", { id: "revo-button-reset", "aria-label": "reset", class: "revo-button outline", onClick: () => this.onReset() }, capts.reset),
459
- ]), h("slot", { slot: "footer" })));
515
+ const capts = Object.assign(Object.assign({}, this.filterCaptionsInternal), this.filterCaptions);
516
+ return (h(Host, { key: '4e969f8b7033363c885c94b1f7770917786669f2' }, h("dialog", { key: '79b2713724684fa99f56621fe43645a0b0ad54bf', class: "filter-panel-dialog", style: style, ref: el => (this.dialog = el), onCancel: e => {
517
+ e.preventDefault();
518
+ this.onCancel();
519
+ } }, this.changes && [
520
+ h("slot", { key: "header-slot", slot: "header" }),
521
+ ((_f = (_e = this.changes).extraContent) === null || _f === void 0 ? void 0 : _f.call(_e, this.changes)) || '',
522
+ ((_g = this.changes) === null || _g === void 0 ? void 0 : _g.hideDefaultFilters) !== true && [
523
+ h("label", { key: "filter-title" }, capts.title),
524
+ h("div", { key: "filter-holder", class: "filter-holder" }, this.getFilterItemsList()),
525
+ h("div", { key: "add-filter", class: "add-filter" }, h("select", { key: 'fc894bdfae1ff35d5c49adc7646dd3182b7bd49e', id: FILTER_ID, class: "select-css", onChange: e => this.onAddNewFilter(e) }, this.renderSelectOptions(this.currentFilterType))),
526
+ ],
527
+ h("slot", { key: "default-slot" }),
528
+ ((_j = (_h = this.changes).extraBottomContent) === null || _j === void 0 ? void 0 : _j.call(_h, this.changes)) || '',
529
+ h("div", { key: "filter-actions", class: "filter-actions" }, this.disableDynamicFiltering && [
530
+ h("button", { key: "save", id: "revo-button-save", "aria-label": "save", class: "revo-button green", onClick: () => this.onSave() }, capts.save),
531
+ h("button", { key: "cancel", id: "revo-button-ok", "aria-label": "ok", class: "revo-button green", onClick: () => this.onCancel() }, capts.cancel),
532
+ ], !this.disableDynamicFiltering && [
533
+ h("button", { key: "ok", id: "revo-button-ok", "aria-label": "ok", class: "revo-button green", onClick: () => this.onCancel() }, capts.ok),
534
+ h("button", { key: "reset", id: "revo-button-reset", "aria-label": "reset", class: "revo-button outline", onClick: () => this.onReset() }, capts.reset),
535
+ ]),
536
+ h("slot", { key: "footer-slot", slot: "footer" }),
537
+ ])));
460
538
  }
461
539
  get element() { return getElement(this); }
462
540
  };
@@ -9,9 +9,18 @@ type Props = {
9
9
  column: ColumnRegular;
10
10
  };
11
11
  export declare const FilterButton: ({ column }: Props) => any;
12
- export declare const TrashButton: () => any;
13
- export declare const AndOrButton: ({ text }: any) => any;
12
+ type TrashButtonProps = {
13
+ ariaLabel: string;
14
+ onClick?: (event: MouseEvent) => void;
15
+ };
16
+ export declare const TrashButton: ({ ariaLabel, onClick }: TrashButtonProps) => any;
17
+ type AndOrButtonProps = {
18
+ text: string;
19
+ onClick?: (event: MouseEvent) => void;
20
+ };
21
+ export declare const AndOrButton: ({ text, onClick }: AndOrButtonProps) => any;
14
22
  type ReorderButtonProps = {
23
+ ariaLabel: string;
15
24
  dragging?: boolean;
16
25
  dragOver?: boolean;
17
26
  onDragStart?: (event: DragEvent) => void;
@@ -19,7 +28,8 @@ type ReorderButtonProps = {
19
28
  onDragOver?: (event: DragEvent) => void;
20
29
  onDragLeave?: (event: DragEvent) => void;
21
30
  onDrop?: (event: DragEvent) => void;
31
+ onKeyDown?: (event: KeyboardEvent) => void;
22
32
  };
23
- export declare const ReorderButton: ({ dragging, dragOver, onDragStart, onDragEnd, onDragOver, onDragLeave, onDrop, }: ReorderButtonProps) => any;
33
+ export declare const ReorderButton: ({ ariaLabel, dragging, dragOver, onDragStart, onDragEnd, onDragOver, onDragLeave, onDrop, onKeyDown, }: ReorderButtonProps) => any;
24
34
  export declare function isFilterBtn(e: HTMLElement): true | Element | null;
25
35
  export {};
@@ -10,6 +10,7 @@ import { FilterType } from './filter.indexed';
10
10
  * @internal
11
11
  */
12
12
  export declare class FilterPanel {
13
+ private dialog?;
13
14
  private filterCaptionsInternal;
14
15
  element: HTMLElement;
15
16
  isFilterIdSet: boolean;
@@ -38,6 +39,8 @@ export declare class FilterPanel {
38
39
  getChanges(): Promise<ShowData | undefined>;
39
40
  componentWillRender(): void;
40
41
  getFilterItemsList(): any;
42
+ componentDidRender(): void;
43
+ private syncDialog;
41
44
  private autoCorrect;
42
45
  private onFilterTypeChange;
43
46
  private debouncedApplyFilter;
@@ -52,6 +55,7 @@ export declare class FilterPanel {
52
55
  private onFilterDragLeave;
53
56
  private onFilterDrop;
54
57
  private onFilterDragEnd;
58
+ private onFilterReorderKeyDown;
55
59
  private toggleFilterAndOr;
56
60
  private assertChanges;
57
61
  renderSelectOptions(type: FilterType, isDefaultTypeRemoved?: boolean): VNode[] | undefined;
@@ -41,6 +41,9 @@ export interface FilterCaptions {
41
41
  placeholder: string;
42
42
  and: string;
43
43
  or: string;
44
+ filterCondition: string;
45
+ removeFilter: string;
46
+ reorderFilter: string;
44
47
  }
45
48
  export interface FilterLocalization {
46
49
  captions: Partial<FilterCaptions>;
@@ -118,6 +121,10 @@ export interface MultiFilterItem {
118
121
  export interface ShowData extends FilterItem, Omit<ColumnRegular, 'filter'> {
119
122
  x: number;
120
123
  y: number;
124
+ /**
125
+ * Top viewport coordinate of the element the filter panel is anchored to.
126
+ */
127
+ anchorY?: number;
121
128
  /**
122
129
  * Auto correct position if it is out of document bounds
123
130
  */