@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
package/hydrate/index.mjs CHANGED
@@ -6856,7 +6856,7 @@ class Clipboard {
6856
6856
  }
6857
6857
  getData(e) {
6858
6858
  return (e.clipboardData ||
6859
- (window === null || window === void 0 ? void 0 : window.clipboardData));
6859
+ (globalThis === null || globalThis === void 0 ? void 0 : globalThis.clipboardData));
6860
6860
  }
6861
6861
  static get cmpMeta() { return {
6862
6862
  "$flags$": 0,
@@ -7364,24 +7364,18 @@ const FilterButton = ({ column }) => {
7364
7364
  [FILTER_BUTTON_ACTIVE]: column && !!column[FILTER_PROP],
7365
7365
  } }, hAsync("svg", { class: "filter-img", viewBox: "0 0 64 64" }, hAsync("g", { stroke: "none", "stroke-width": "1", fill: "none", "fill-rule": "evenodd" }, hAsync("path", { d: "M43,48 L43,56 L21,56 L21,48 L43,48 Z M53,28 L53,36 L12,36 L12,28 L53,28 Z M64,8 L64,16 L0,16 L0,8 L64,8 Z", fill: "currentColor" }))))));
7366
7366
  };
7367
- const TrashButton = () => {
7368
- return (hAsync("div", { class: { [TRASH_BUTTON]: true } }, hAsync("svg", { class: "trash-img", viewBox: "0 0 24 24" }, hAsync("path", { fill: "currentColor", d: "M9,3V4H4V6H5V19A2,2 0 0,0 7,21H17A2,2 0 0,0 19,19V6H20V4H15V3H9M7,6H17V19H7V6M9,8V17H11V8H9M13,8V17H15V8H13Z" }))));
7367
+ const TrashButton = ({ ariaLabel, onClick }) => {
7368
+ return (hAsync("button", { type: "button", class: { [TRASH_BUTTON]: true }, "aria-label": ariaLabel, onClick: onClick }, hAsync("svg", { class: "trash-img", viewBox: "0 0 24 24" }, hAsync("path", { fill: "currentColor", d: "M9,3V4H4V6H5V19A2,2 0 0,0 7,21H17A2,2 0 0,0 19,19V6H20V4H15V3H9M7,6H17V19H7V6M9,8V17H11V8H9M13,8V17H15V8H13Z" }))));
7369
7369
  };
7370
- const AndOrButton = ({ text }) => {
7371
- return hAsync("button", { class: { [AND_OR_BUTTON]: true, 'light revo-button': true } }, text);
7370
+ const AndOrButton = ({ text, onClick }) => {
7371
+ return hAsync("button", { type: "button", class: { [AND_OR_BUTTON]: true, 'light revo-button': true }, onClick: onClick }, text);
7372
7372
  };
7373
- const ReorderButton = ({ dragging, dragOver, onDragStart, onDragEnd, onDragOver, onDragLeave, onDrop, }) => {
7374
- const applyClass = (el) => {
7375
- if (!el) {
7376
- return;
7377
- }
7378
- el.className = [
7379
- REORDER_BUTTON,
7380
- dragging ? 'filter-row-dragging' : '',
7381
- dragOver ? 'filter-row-drag-over' : '',
7382
- ].filter(Boolean).join(' ');
7383
- };
7384
- return (hAsync("button", { type: "button", ref: applyClass, draggable: true, title: "Reorder filter", "aria-label": "reorder filter", onDragStart: onDragStart, onDragEnd: onDragEnd, onDragOver: onDragOver, onDragLeave: onDragLeave, onDrop: onDrop }, "::"));
7373
+ const ReorderButton = ({ ariaLabel, dragging, dragOver, onDragStart, onDragEnd, onDragOver, onDragLeave, onDrop, onKeyDown, }) => {
7374
+ return (hAsync("button", { type: "button", class: {
7375
+ [REORDER_BUTTON]: true,
7376
+ 'filter-row-dragging': !!dragging,
7377
+ 'filter-row-drag-over': !!dragOver,
7378
+ }, draggable: true, title: ariaLabel, "aria-label": ariaLabel, onDragStart: onDragStart, onDragEnd: onDragEnd, onDragOver: onDragOver, onDragLeave: onDragLeave, onDrop: onDrop, onKeyDown: onKeyDown }, "::"));
7385
7379
  };
7386
7380
  function isFilterBtn(e) {
7387
7381
  if (e.classList.contains(FILTER_BUTTON_CLASS)) {
@@ -7451,12 +7445,13 @@ function moveFilterItem(items, sourceId, targetId) {
7451
7445
  return true;
7452
7446
  }
7453
7447
 
7454
- 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}`;
7448
+ 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}`;
7455
7449
 
7456
7450
  const defaultType = 'none';
7457
7451
  const FILTER_LIST_CLASS = 'multi-filter-list';
7458
7452
  const FILTER_LIST_CLASS_ACTION = 'multi-filter-list-action';
7459
7453
  const FILTER_ID = 'add-filter';
7454
+ const VIEWPORT_PADDING = 8;
7460
7455
  /**
7461
7456
  * Filter panel for editing filters
7462
7457
  */
@@ -7479,6 +7474,9 @@ class FilterPanel {
7479
7474
  placeholder: 'Enter value...',
7480
7475
  and: 'and',
7481
7476
  or: 'or',
7477
+ filterCondition: 'Filter condition',
7478
+ removeFilter: 'Remove filter',
7479
+ reorderFilter: 'Reorder filter',
7482
7480
  };
7483
7481
  this.isFilterIdSet = false;
7484
7482
  this.filterId = 0;
@@ -7553,36 +7551,75 @@ class FilterPanel {
7553
7551
  return '';
7554
7552
  const propFilters = (_b = this.filterItems[prop]) !== null && _b !== void 0 ? _b : [];
7555
7553
  const visibleFilterCount = propFilters.filter(filter => !filter.hidden).length;
7556
- const capts = Object.assign(this.filterCaptionsInternal, this.filterCaptions);
7557
- return (hAsync("div", { key: this.filterId }, propFilters.map((filter, index) => {
7554
+ const capts = Object.assign(Object.assign({}, this.filterCaptionsInternal), this.filterCaptions);
7555
+ return (hAsync("div", { key: this.filterId }, hAsync("ul", { class: "multi-filter-list-container" }, propFilters.map((filter, index) => {
7558
7556
  let andOrButton;
7559
7557
  if (filter.hidden) {
7560
7558
  return;
7561
7559
  }
7562
7560
  // hide toggle button if there is only one filter and the last one
7563
7561
  if (index !== this.filterItems[prop].length - 1) {
7564
- andOrButton = (hAsync("div", { onClick: () => this.toggleFilterAndOr(filter.id) }, hAsync(AndOrButton, { text: filter.relation === 'and' ? capts.and : capts.or })));
7562
+ andOrButton = (hAsync(AndOrButton, { text: filter.relation === 'and' ? capts.and : capts.or, onClick: () => this.toggleFilterAndOr(filter.id) }));
7565
7563
  }
7566
7564
  const extra = this.renderExtra(prop, index);
7567
- return (hAsync("div", { key: filter.id, class: FILTER_LIST_CLASS }, hAsync("div", { ref: el => el === null || el === void 0 ? void 0 : el.classList.add('multi-filter-list-row') }, visibleFilterCount > 1 ? (hAsync(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) })) : '', hAsync("div", { class: { 'select-input': true } }, hAsync("select", { class: "select-css select-filter", onChange: e => this.onFilterTypeChange(e, prop, index) }, this.renderSelectOptions(this.filterItems[prop][index].type, true)), extra ? hAsync("div", { class: "filter-extra" }, extra) : ''), hAsync("div", { class: FILTER_LIST_CLASS_ACTION }, andOrButton, hAsync("div", { onClick: () => this.onRemoveFilter(filter.id) }, hAsync(TrashButton, null))))));
7568
- }), propFilters.filter(f => !f.hidden).length > 0 ? hAsync("div", { class: "add-filter-divider" }) : ''));
7565
+ const isDragging = this.draggedFilterId === filter.id;
7566
+ const isDragOver = this.dragOverFilterId === filter.id && !isDragging;
7567
+ const canReorder = visibleFilterCount > 1;
7568
+ return (hAsync("li", { key: filter.id, class: FILTER_LIST_CLASS, "aria-label": `${capts.filterCondition} ${index + 1}` }, hAsync("div", { class: {
7569
+ 'multi-filter-list-row': true,
7570
+ 'filter-row-drop-active': this.draggedFilterId !== undefined && !isDragging,
7571
+ 'filter-row-dragging': isDragging,
7572
+ 'filter-row-drag-over': isDragOver,
7573
+ } }, canReorder ? (hAsync("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 ? (hAsync(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) })) : '', hAsync("div", { class: { 'select-input': true } }, hAsync("select", { class: "select-css select-filter", onChange: e => this.onFilterTypeChange(e, prop, index) }, this.renderSelectOptions(this.filterItems[prop][index].type, true)), extra ? hAsync("div", { class: "filter-extra" }, extra) : ''), hAsync("div", { class: FILTER_LIST_CLASS_ACTION }, andOrButton, hAsync(TrashButton, { ariaLabel: capts.removeFilter, onClick: () => this.onRemoveFilter(filter.id) })))));
7574
+ })), propFilters.filter(f => !f.hidden).length > 0 ? hAsync("div", { class: "add-filter-divider" }) : ''));
7569
7575
  }
7570
- autoCorrect(el) {
7571
- var _a, _b;
7572
- if (!el) {
7576
+ componentDidRender() {
7577
+ this.syncDialog();
7578
+ }
7579
+ syncDialog() {
7580
+ if (!this.dialog) {
7573
7581
  return;
7574
7582
  }
7575
- const revoGrid = el.closest('revo-grid');
7576
- if (!revoGrid) {
7583
+ if (!this.changes) {
7584
+ if (this.dialog.open) {
7585
+ this.dialog.close();
7586
+ }
7577
7587
  return;
7578
7588
  }
7579
- const pos = el.getBoundingClientRect();
7580
- const gridPos = revoGrid.getBoundingClientRect();
7581
- const maxLeft = gridPos.right - pos.width;
7582
- if (pos.left > maxLeft && el.offsetLeft) {
7583
- el.style.left = `${maxLeft - ((_b = (_a = el.parentElement) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect().left) !== null && _b !== void 0 ? _b : 0)}px`;
7589
+ if (!this.dialog.open) {
7590
+ this.dialog.show();
7591
+ }
7592
+ if (this.changes.autoCorrect !== false) {
7593
+ this.autoCorrect(this.dialog);
7594
+ requestAnimationFrame(() => this.autoCorrect(this.dialog));
7584
7595
  }
7585
7596
  }
7597
+ autoCorrect(el) {
7598
+ var _a;
7599
+ if (!el || !this.changes) {
7600
+ return;
7601
+ }
7602
+ el.style.maxHeight = '';
7603
+ el.style.left = `${this.changes.x}px`;
7604
+ el.style.top = `${this.changes.y}px`;
7605
+ const pos = el.getBoundingClientRect();
7606
+ const anchorTop = (_a = this.changes.anchorY) !== null && _a !== void 0 ? _a : this.changes.y;
7607
+ const anchorBottom = this.changes.y;
7608
+ const spaceAbove = Math.max(0, anchorTop - VIEWPORT_PADDING);
7609
+ const spaceBelow = Math.max(0, window.innerHeight - anchorBottom - VIEWPORT_PADDING);
7610
+ const openAbove = pos.height > spaceBelow && spaceAbove > spaceBelow;
7611
+ const availableHeight = Math.max(VIEWPORT_PADDING, openAbove ? spaceAbove : spaceBelow);
7612
+ el.style.maxHeight = `${availableHeight}px`;
7613
+ const adjustedPos = el.getBoundingClientRect();
7614
+ const maxLeft = Math.max(VIEWPORT_PADDING, window.innerWidth - adjustedPos.width - VIEWPORT_PADDING);
7615
+ const maxTop = Math.max(VIEWPORT_PADDING, window.innerHeight - adjustedPos.height - VIEWPORT_PADDING);
7616
+ const left = Math.min(Math.max(VIEWPORT_PADDING, this.changes.x), maxLeft);
7617
+ const top = openAbove
7618
+ ? Math.min(Math.max(VIEWPORT_PADDING, anchorTop - adjustedPos.height), maxTop)
7619
+ : Math.min(Math.max(VIEWPORT_PADDING, anchorBottom), maxTop);
7620
+ el.style.left = `${left}px`;
7621
+ el.style.top = `${top}px`;
7622
+ }
7586
7623
  onFilterTypeChange(e, prop, index) {
7587
7624
  if (!(e.target instanceof HTMLSelectElement)) {
7588
7625
  return;
@@ -7716,6 +7753,37 @@ class FilterPanel {
7716
7753
  this.draggedFilterId = undefined;
7717
7754
  this.dragOverFilterId = undefined;
7718
7755
  }
7756
+ onFilterReorderKeyDown(e, prop, sourceId) {
7757
+ let direction = 0;
7758
+ if (e.key === 'ArrowUp') {
7759
+ direction = -1;
7760
+ }
7761
+ else if (e.key === 'ArrowDown') {
7762
+ direction = 1;
7763
+ }
7764
+ else {
7765
+ return;
7766
+ }
7767
+ const items = this.filterItems[prop];
7768
+ if (!items) {
7769
+ return;
7770
+ }
7771
+ const visibleItems = items.filter(item => !item.hidden);
7772
+ const sourceIndex = visibleItems.findIndex(item => item.id === sourceId);
7773
+ if (sourceIndex === -1) {
7774
+ return;
7775
+ }
7776
+ e.preventDefault();
7777
+ e.stopPropagation();
7778
+ const target = visibleItems[sourceIndex + direction];
7779
+ if (!target || !moveFilterItem(items, sourceId, target.id)) {
7780
+ return;
7781
+ }
7782
+ this.filterId++;
7783
+ if (!this.disableDynamicFiltering) {
7784
+ this.debouncedApplyFilter();
7785
+ }
7786
+ }
7719
7787
  toggleFilterAndOr(id) {
7720
7788
  var _a;
7721
7789
  this.assertChanges();
@@ -7754,7 +7822,7 @@ class FilterPanel {
7754
7822
  });
7755
7823
  });
7756
7824
  if (!isDefaultTypeRemoved) {
7757
- const capts = Object.assign(this.filterCaptionsInternal, this.filterCaptions);
7825
+ const capts = Object.assign(Object.assign({}, this.filterCaptionsInternal), this.filterCaptions);
7758
7826
  options.push(hAsync("option", { selected: this.currentFilterType === defaultType, value: defaultType }, prop && this.filterItems[prop] && this.filterItems[prop].length > 0
7759
7827
  ? capts.add
7760
7828
  : this.filterNames[defaultType]));
@@ -7787,7 +7855,7 @@ class FilterPanel {
7787
7855
  select.focus();
7788
7856
  }
7789
7857
  };
7790
- const capts = Object.assign(this.filterCaptionsInternal, this.filterCaptions);
7858
+ const capts = Object.assign(Object.assign({}, this.filterCaptionsInternal), this.filterCaptions);
7791
7859
  const extra = this.filterEntities[currentFilter[index].type].extra;
7792
7860
  if (typeof extra === 'function') {
7793
7861
  return extra(hAsync, {
@@ -7824,30 +7892,34 @@ class FilterPanel {
7824
7892
  } }));
7825
7893
  }
7826
7894
  render() {
7827
- var _a, _b, _c, _d, _e;
7828
- if (!this.changes) {
7829
- return hAsync(Host, { style: { display: 'none' } });
7830
- }
7895
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
7831
7896
  const style = {
7832
- display: 'block',
7833
- left: `${this.changes.x}px`,
7834
- top: `${this.changes.y}px`,
7897
+ left: `${(_b = (_a = this.changes) === null || _a === void 0 ? void 0 : _a.x) !== null && _b !== void 0 ? _b : 0}px`,
7898
+ top: `${(_d = (_c = this.changes) === null || _c === void 0 ? void 0 : _c.y) !== null && _d !== void 0 ? _d : 0}px`,
7835
7899
  };
7836
- const capts = Object.assign(this.filterCaptionsInternal, this.filterCaptions);
7837
- return (hAsync(Host, { style: style, ref: el => {
7838
- var _a;
7839
- ((_a = this.changes) === null || _a === void 0 ? void 0 : _a.autoCorrect) !== false && this.autoCorrect(el);
7840
- } }, hAsync("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 && ([
7841
- hAsync("label", null, capts.title),
7842
- hAsync("div", { class: "filter-holder" }, this.getFilterItemsList()),
7843
- hAsync("div", { class: "add-filter" }, hAsync("select", { id: FILTER_ID, class: "select-css", onChange: e => this.onAddNewFilter(e) }, this.renderSelectOptions(this.currentFilterType)))
7844
- ]), hAsync("slot", null), ((_e = (_d = this.changes).extraBottomContent) === null || _e === void 0 ? void 0 : _e.call(_d, this.changes)) || '', hAsync("div", { class: "filter-actions" }, this.disableDynamicFiltering && [
7845
- hAsync("button", { id: "revo-button-save", "aria-label": "save", class: "revo-button green", onClick: () => this.onSave() }, capts.save),
7846
- hAsync("button", { id: "revo-button-ok", "aria-label": "ok", class: "revo-button green", onClick: () => this.onCancel() }, capts.cancel),
7847
- ], !this.disableDynamicFiltering && [
7848
- hAsync("button", { id: "revo-button-ok", "aria-label": "ok", class: "revo-button green", onClick: () => this.onCancel() }, capts.ok),
7849
- hAsync("button", { id: "revo-button-reset", "aria-label": "reset", class: "revo-button outline", onClick: () => this.onReset() }, capts.reset),
7850
- ]), hAsync("slot", { slot: "footer" })));
7900
+ const capts = Object.assign(Object.assign({}, this.filterCaptionsInternal), this.filterCaptions);
7901
+ return (hAsync(Host, { key: '4e969f8b7033363c885c94b1f7770917786669f2' }, hAsync("dialog", { key: '79b2713724684fa99f56621fe43645a0b0ad54bf', class: "filter-panel-dialog", style: style, ref: el => (this.dialog = el), onCancel: e => {
7902
+ e.preventDefault();
7903
+ this.onCancel();
7904
+ } }, this.changes && [
7905
+ hAsync("slot", { key: "header-slot", slot: "header" }),
7906
+ ((_f = (_e = this.changes).extraContent) === null || _f === void 0 ? void 0 : _f.call(_e, this.changes)) || '',
7907
+ ((_g = this.changes) === null || _g === void 0 ? void 0 : _g.hideDefaultFilters) !== true && [
7908
+ hAsync("label", { key: "filter-title" }, capts.title),
7909
+ hAsync("div", { key: "filter-holder", class: "filter-holder" }, this.getFilterItemsList()),
7910
+ hAsync("div", { key: "add-filter", class: "add-filter" }, hAsync("select", { key: 'fc894bdfae1ff35d5c49adc7646dd3182b7bd49e', id: FILTER_ID, class: "select-css", onChange: e => this.onAddNewFilter(e) }, this.renderSelectOptions(this.currentFilterType))),
7911
+ ],
7912
+ hAsync("slot", { key: "default-slot" }),
7913
+ ((_j = (_h = this.changes).extraBottomContent) === null || _j === void 0 ? void 0 : _j.call(_h, this.changes)) || '',
7914
+ hAsync("div", { key: "filter-actions", class: "filter-actions" }, this.disableDynamicFiltering && [
7915
+ hAsync("button", { key: "save", id: "revo-button-save", "aria-label": "save", class: "revo-button green", onClick: () => this.onSave() }, capts.save),
7916
+ hAsync("button", { key: "cancel", id: "revo-button-ok", "aria-label": "ok", class: "revo-button green", onClick: () => this.onCancel() }, capts.cancel),
7917
+ ], !this.disableDynamicFiltering && [
7918
+ hAsync("button", { key: "ok", id: "revo-button-ok", "aria-label": "ok", class: "revo-button green", onClick: () => this.onCancel() }, capts.ok),
7919
+ hAsync("button", { key: "reset", id: "revo-button-reset", "aria-label": "reset", class: "revo-button outline", onClick: () => this.onReset() }, capts.reset),
7920
+ ]),
7921
+ hAsync("slot", { key: "footer-slot", slot: "footer" }),
7922
+ ])));
7851
7923
  }
7852
7924
  get element() { return getElement(this); }
7853
7925
  static get style() { return filterStyleCss(); }
@@ -15882,7 +15954,8 @@ class FilterPlugin extends BasePlugin {
15882
15954
  async headerclick(e) {
15883
15955
  var _a, _b;
15884
15956
  const el = (_a = e.detail.originalEvent) === null || _a === void 0 ? void 0 : _a.target;
15885
- if (!isFilterBtn(el)) {
15957
+ const filterButton = isFilterBtn(el);
15958
+ if (!filterButton) {
15886
15959
  return;
15887
15960
  }
15888
15961
  e.preventDefault();
@@ -15896,9 +15969,8 @@ class FilterPlugin extends BasePlugin {
15896
15969
  return;
15897
15970
  }
15898
15971
  // filter button clicked, open filter dialog
15899
- const gridPos = this.revogrid.getBoundingClientRect();
15900
- const buttonPos = el.getBoundingClientRect();
15901
- const data = Object.assign(Object.assign(Object.assign({}, e.detail), this.filterCollection[prop]), { x: buttonPos.x - gridPos.x, y: buttonPos.y - gridPos.y + buttonPos.height, autoCorrect: true, filterTypes: this.getColumnFilter(e.detail.filter), filterItems: this.multiFilterItems, extraContent: this.extraHyperContent, extraBottomContent: this.extraBottomHyperContent });
15972
+ const buttonPos = (filterButton instanceof HTMLElement ? filterButton : el).getBoundingClientRect();
15973
+ const data = Object.assign(Object.assign(Object.assign({}, e.detail), this.filterCollection[prop]), { x: buttonPos.x, y: buttonPos.y + buttonPos.height, anchorY: buttonPos.y, autoCorrect: true, filterTypes: this.getColumnFilter(e.detail.filter), filterItems: this.multiFilterItems, extraContent: this.extraHyperContent, extraBottomContent: this.extraBottomHyperContent });
15902
15974
  (_b = this.beforeshow) === null || _b === void 0 ? void 0 : _b.call(this, data);
15903
15975
  this.pop.show(data);
15904
15976
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@revolist/revogrid",
3
- "version": "4.23.13",
3
+ "version": "4.23.15",
4
4
  "type": "module",
5
5
  "description": "Virtual reactive data grid spreadsheet component - RevoGrid.",
6
6
  "license": "MIT",
@@ -1,4 +1,4 @@
1
1
  /*!
2
2
  * Built by Revolist OU ❤️
3
3
  */
4
- import{h as r}from"@stencil/core/internal/client";const t="rv-filter",o="active",a="hasFilter",e="and-or-button",n="trash-button",l="reorder-button",s=({column:e})=>r("span",null,r("button",{class:{[t]:!0,[o]:e&&!!e[a]}},r("svg",{class:"filter-img",viewBox:"0 0 64 64"},r("g",{stroke:"none","stroke-width":"1",fill:"none","fill-rule":"evenodd"},r("path",{d:"M43,48 L43,56 L21,56 L21,48 L43,48 Z M53,28 L53,36 L12,36 L12,28 L53,28 Z M64,8 L64,16 L0,16 L0,8 L64,8 Z",fill:"currentColor"}))))),i=()=>r("div",{class:{[n]:!0}},r("svg",{class:"trash-img",viewBox:"0 0 24 24"},r("path",{fill:"currentColor",d:"M9,3V4H4V6H5V19A2,2 0 0,0 7,21H17A2,2 0 0,0 19,19V6H20V4H15V3H9M7,6H17V19H7V6M9,8V17H11V8H9M13,8V17H15V8H13Z"}))),g=({text:t})=>r("button",{class:{[e]:!0,"light revo-button":!0}},t),d=({dragging:t,dragOver:o,onDragStart:a,onDragEnd:e,onDragOver:n,onDragLeave:s,onDrop:i})=>r("button",{type:"button",ref:r=>{r&&(r.className=[l,t?"filter-row-dragging":"",o?"filter-row-drag-over":""].filter(Boolean).join(" "))},draggable:!0,title:"Reorder filter","aria-label":"reorder filter",onDragStart:a,onDragEnd:e,onDragOver:n,onDragLeave:s,onDrop:i},"::");function u(r){return!!r.classList.contains(t)||(null==r?void 0:r.closest(`.${t}`))}export{e as A,t as F,l as R,n as T,o as a,a as b,s as c,i as d,g as e,d as f,u as i}
4
+ import{h as a}from"@stencil/core/internal/client";const t="rv-filter",o="active",r="hasFilter",n="and-or-button",e="trash-button",l="reorder-button",i=({column:n})=>a("span",null,a("button",{class:{[t]:!0,[o]:n&&!!n[r]}},a("svg",{class:"filter-img",viewBox:"0 0 64 64"},a("g",{stroke:"none","stroke-width":"1",fill:"none","fill-rule":"evenodd"},a("path",{d:"M43,48 L43,56 L21,56 L21,48 L43,48 Z M53,28 L53,36 L12,36 L12,28 L53,28 Z M64,8 L64,16 L0,16 L0,8 L64,8 Z",fill:"currentColor"}))))),s=({ariaLabel:t,onClick:o})=>a("button",{type:"button",class:{[e]:!0},"aria-label":t,onClick:o},a("svg",{class:"trash-img",viewBox:"0 0 24 24"},a("path",{fill:"currentColor",d:"M9,3V4H4V6H5V19A2,2 0 0,0 7,21H17A2,2 0 0,0 19,19V6H20V4H15V3H9M7,6H17V19H7V6M9,8V17H11V8H9M13,8V17H15V8H13Z"}))),g=({text:t,onClick:o})=>a("button",{type:"button",class:{[n]:!0,"light revo-button":!0},onClick:o},t),c=({ariaLabel:t,dragging:o,dragOver:r,onDragStart:n,onDragEnd:e,onDragOver:i,onDragLeave:s,onDrop:g,onKeyDown:c})=>a("button",{type:"button",class:{[l]:!0,"filter-row-dragging":!!o,"filter-row-drag-over":!!r},draggable:!0,title:t,"aria-label":t,onDragStart:n,onDragEnd:e,onDragOver:i,onDragLeave:s,onDrop:g,onKeyDown:c},"::");function u(a){return!!a.classList.contains(t)||(null==a?void 0:a.closest(`.${t}`))}export{n as A,t as F,l as R,e as T,o as a,r as b,i as c,s as d,g as e,c as f,u as i}