@dolusoft/vue3-datatable 1.8.37 → 1.8.40

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.
@@ -2469,7 +2469,7 @@ const _export_sfc = (sfc, props) => {
2469
2469
  }
2470
2470
  return target;
2471
2471
  };
2472
- const ButtonExpand = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["__scopeId", "data-v-da3bc8d5"]]);
2472
+ const ButtonExpand = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["__scopeId", "data-v-4d01a2fa"]]);
2473
2473
  const __default__$4 = {
2474
2474
  name: "ButtonRightPanel"
2475
2475
  };
@@ -2495,7 +2495,7 @@ const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
2495
2495
  };
2496
2496
  }
2497
2497
  });
2498
- const ButtonRightPanel = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["__scopeId", "data-v-b373d5f7"]]);
2498
+ const ButtonRightPanel = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["__scopeId", "data-v-d739c6bf"]]);
2499
2499
  const sides = ["top", "right", "bottom", "left"];
2500
2500
  const alignments = ["start", "end"];
2501
2501
  const placements = /* @__PURE__ */ sides.reduce((acc, side) => acc.concat(side, side + "-" + alignments[0], side + "-" + alignments[1]), []);
@@ -5365,10 +5365,10 @@ const _hoisted_17$1 = {
5365
5365
  key: 0,
5366
5366
  class: "bh-filter bh-relative"
5367
5367
  };
5368
- const _hoisted_18$1 = ["onUpdate:modelValue"];
5369
- const _hoisted_19$1 = ["onUpdate:modelValue"];
5370
- const _hoisted_20$1 = ["onUpdate:modelValue"];
5371
- const _hoisted_21$1 = ["onUpdate:modelValue"];
5368
+ const _hoisted_18$1 = ["onUpdate:modelValue", "onKeydown"];
5369
+ const _hoisted_19$1 = ["onUpdate:modelValue", "onKeydown"];
5370
+ const _hoisted_20$1 = ["onUpdate:modelValue", "onKeydown"];
5371
+ const _hoisted_21$1 = ["onUpdate:modelValue", "onKeydown"];
5372
5372
  const _hoisted_22$1 = /* @__PURE__ */ vue.createElementVNode("option", { value: void 0 }, "All", -1);
5373
5373
  const _hoisted_23$1 = /* @__PURE__ */ vue.createElementVNode("option", { value: true }, "True", -1);
5374
5374
  const _hoisted_24$1 = /* @__PURE__ */ vue.createElementVNode("option", { value: false }, "False", -1);
@@ -5381,10 +5381,10 @@ const _hoisted_26$1 = {
5381
5381
  key: 1,
5382
5382
  class: "bh-filter-input-wrapper"
5383
5383
  };
5384
- const _hoisted_27$1 = ["onUpdate:modelValue"];
5385
- const _hoisted_28$1 = ["onUpdate:modelValue"];
5386
- const _hoisted_29$1 = ["onUpdate:modelValue"];
5387
- const _hoisted_30$1 = ["onUpdate:modelValue"];
5384
+ const _hoisted_27$1 = ["onUpdate:modelValue", "onKeydown"];
5385
+ const _hoisted_28$1 = ["onUpdate:modelValue", "onKeydown"];
5386
+ const _hoisted_29$1 = ["onUpdate:modelValue", "onKeydown"];
5387
+ const _hoisted_30$1 = ["onUpdate:modelValue", "onKeydown"];
5388
5388
  const _hoisted_31$1 = /* @__PURE__ */ vue.createElementVNode("option", { value: void 0 }, "All", -1);
5389
5389
  const _hoisted_32$1 = /* @__PURE__ */ vue.createElementVNode("option", { value: true }, "True", -1);
5390
5390
  const _hoisted_33$1 = /* @__PURE__ */ vue.createElementVNode("option", { value: false }, "False", -1);
@@ -5423,7 +5423,7 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
5423
5423
  "filterDatetimeUpdate",
5424
5424
  "clearAllFilters"
5425
5425
  ],
5426
- setup(__props, { emit: __emit }) {
5426
+ setup(__props, { expose: __expose, emit: __emit }) {
5427
5427
  const selectedAll = vue.ref(null);
5428
5428
  const props = __props;
5429
5429
  const emit = __emit;
@@ -5436,6 +5436,8 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
5436
5436
  const filterInputs = vue.ref({});
5437
5437
  const columnConditions = vue.ref({});
5438
5438
  const watchedFields = vue.ref(/* @__PURE__ */ new Set());
5439
+ const debounceTimers = /* @__PURE__ */ new Map();
5440
+ const processChangeFunctions = /* @__PURE__ */ new Map();
5439
5441
  const columnsMap = vue.computed(() => {
5440
5442
  var _a;
5441
5443
  const map = /* @__PURE__ */ new Map();
@@ -5457,18 +5459,20 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
5457
5459
  filterInputs.value[col.field] = col.value || "";
5458
5460
  }
5459
5461
  watchedFields.value.add(col.field);
5460
- let debounceTimer = null;
5462
+ debounceTimers.set(col.field, null);
5461
5463
  vue.watch(
5462
5464
  () => filterInputs.value[col.field],
5463
5465
  (newValue) => {
5464
5466
  const column = columnsMap.value.get(col.field);
5465
5467
  if (!column) return;
5466
5468
  const isEmpty = newValue === "" || newValue === null || newValue === void 0;
5467
- if (debounceTimer) {
5468
- clearTimeout(debounceTimer);
5469
- debounceTimer = null;
5469
+ const existingTimer = debounceTimers.get(col.field);
5470
+ if (existingTimer) {
5471
+ clearTimeout(existingTimer);
5472
+ debounceTimers.set(col.field, null);
5470
5473
  }
5471
5474
  const processChange = () => {
5475
+ debounceTimers.set(col.field, null);
5472
5476
  if (column.type === "string" || column.type === "String") {
5473
5477
  column.value = isEmpty ? "" : typeof newValue === "string" ? newValue.trim() : newValue;
5474
5478
  } else {
@@ -5485,16 +5489,43 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
5485
5489
  }
5486
5490
  emit("filterChange");
5487
5491
  };
5492
+ processChangeFunctions.set(col.field, processChange);
5488
5493
  if (isEmpty) {
5489
5494
  processChange();
5490
5495
  } else {
5491
- debounceTimer = setTimeout(processChange, 300);
5496
+ debounceTimers.set(col.field, setTimeout(processChange, 100));
5492
5497
  }
5493
5498
  }
5494
5499
  );
5495
5500
  }
5496
5501
  });
5497
5502
  };
5503
+ const flushFilterDebounce = (field) => {
5504
+ const timer = debounceTimers.get(field);
5505
+ if (timer) {
5506
+ clearTimeout(timer);
5507
+ debounceTimers.set(field, null);
5508
+ const processChange = processChangeFunctions.get(field);
5509
+ if (processChange) {
5510
+ processChange();
5511
+ }
5512
+ }
5513
+ };
5514
+ const flushAllFilterDebounces = () => {
5515
+ debounceTimers.forEach((timer, field) => {
5516
+ if (timer) {
5517
+ clearTimeout(timer);
5518
+ debounceTimers.set(field, null);
5519
+ const processChange = processChangeFunctions.get(field);
5520
+ if (processChange) {
5521
+ processChange();
5522
+ }
5523
+ }
5524
+ });
5525
+ };
5526
+ const handleFilterEnter = (field) => {
5527
+ flushFilterDebounce(field);
5528
+ };
5498
5529
  const handleClearAllFilters = () => {
5499
5530
  var _a;
5500
5531
  Object.keys(filterInputs.value).forEach((key) => {
@@ -5634,6 +5665,10 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
5634
5665
  }
5635
5666
  emit("filterChange");
5636
5667
  };
5668
+ __expose({
5669
+ flushFilterDebounce,
5670
+ flushAllFilterDebounces
5671
+ });
5637
5672
  return (_ctx, _cache) => {
5638
5673
  const _component_VDropdown = vue.resolveComponent("VDropdown");
5639
5674
  return vue.openBlock(), vue.createElementBlock("tr", _hoisted_1$1, [
@@ -5665,7 +5700,10 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
5665
5700
  ])
5666
5701
  ]),
5667
5702
  props.all.columnFilter && !props.isFooter && clearButtonLocation.value === "checkbox" ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3$1, [
5668
- vue.createVNode(vue.unref(Vt), null, {
5703
+ vue.createVNode(vue.unref(Vt), {
5704
+ placement: "top",
5705
+ distance: 6
5706
+ }, {
5669
5707
  popper: vue.withCtx(() => [
5670
5708
  vue.createTextVNode("Clear all filters")
5671
5709
  ]),
@@ -5697,7 +5735,10 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
5697
5735
  })
5698
5736
  }, [
5699
5737
  props.all.columnFilter && !props.isFooter && clearButtonLocation.value === "rightpanel" ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_7$1, [
5700
- vue.createVNode(vue.unref(Vt), null, {
5738
+ vue.createVNode(vue.unref(Vt), {
5739
+ placement: "top",
5740
+ distance: 6
5741
+ }, {
5701
5742
  popper: vue.withCtx(() => [
5702
5743
  vue.createTextVNode("Clear all filters")
5703
5744
  ]),
@@ -5729,7 +5770,10 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
5729
5770
  expandall: props.all.expandall
5730
5771
  }, null, 8, ["expandedrows", "expandall"])) : vue.createCommentVNode("", true),
5731
5772
  props.all.columnFilter && !props.isFooter && clearButtonLocation.value === "subtable" ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_11$1, [
5732
- vue.createVNode(vue.unref(Vt), null, {
5773
+ vue.createVNode(vue.unref(Vt), {
5774
+ placement: "top",
5775
+ distance: 6
5776
+ }, {
5733
5777
  popper: vue.withCtx(() => [
5734
5778
  vue.createTextVNode("Clear all filters")
5735
5779
  ]),
@@ -5797,16 +5841,18 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
5797
5841
  key: 0,
5798
5842
  "onUpdate:modelValue": ($event) => filterInputs.value[col.field] = $event,
5799
5843
  type: "text",
5800
- class: "bh-form-control"
5801
- }, null, 8, _hoisted_18$1)), [
5844
+ class: "bh-form-control",
5845
+ onKeydown: vue.withKeys(($event) => handleFilterEnter(col.field), ["enter"])
5846
+ }, null, 40, _hoisted_18$1)), [
5802
5847
  [vue.vModelText, filterInputs.value[col.field]]
5803
5848
  ]) : vue.createCommentVNode("", true),
5804
5849
  col.type === "number" || col.type === "integer" || col.type === "Integer" ? vue.withDirectives((vue.openBlock(), vue.createElementBlock("input", {
5805
5850
  key: 1,
5806
5851
  "onUpdate:modelValue": ($event) => filterInputs.value[col.field] = $event,
5807
5852
  type: "number",
5808
- class: "bh-form-control"
5809
- }, null, 8, _hoisted_19$1)), [
5853
+ class: "bh-form-control",
5854
+ onKeydown: vue.withKeys(($event) => handleFilterEnter(col.field), ["enter"])
5855
+ }, null, 40, _hoisted_19$1)), [
5810
5856
  [
5811
5857
  vue.vModelText,
5812
5858
  filterInputs.value[col.field],
@@ -5821,13 +5867,15 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
5821
5867
  updateValue: (val) => {
5822
5868
  filterInputs.value[col.field] = val;
5823
5869
  emit("filterDatetimeUpdate", col.field, val);
5824
- }
5870
+ },
5871
+ onEnter: () => handleFilterEnter(col.field)
5825
5872
  }) : vue.withDirectives((vue.openBlock(), vue.createElementBlock("input", {
5826
5873
  key: 1,
5827
5874
  "onUpdate:modelValue": ($event) => filterInputs.value[col.field] = $event,
5828
5875
  type: "date",
5829
- class: "bh-form-control"
5830
- }, null, 8, _hoisted_20$1)), [
5876
+ class: "bh-form-control",
5877
+ onKeydown: vue.withKeys(($event) => handleFilterEnter(col.field), ["enter"])
5878
+ }, null, 40, _hoisted_20$1)), [
5831
5879
  [vue.vModelText, filterInputs.value[col.field]]
5832
5880
  ])
5833
5881
  ], 64)) : col.type === "bool" ? vue.withDirectives((vue.openBlock(), vue.createElementBlock("select", {
@@ -5835,8 +5883,9 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
5835
5883
  "onUpdate:modelValue": ($event) => filterInputs.value[col.field] = $event,
5836
5884
  class: "bh-form-control",
5837
5885
  onClick: _cache[1] || (_cache[1] = //@ts-ignore
5838
- (...args) => props.isOpenFilter && props.isOpenFilter(...args))
5839
- }, _hoisted_25$1, 8, _hoisted_21$1)), [
5886
+ (...args) => props.isOpenFilter && props.isOpenFilter(...args)),
5887
+ onKeydown: vue.withKeys(($event) => handleFilterEnter(col.field), ["enter"])
5888
+ }, _hoisted_25$1, 40, _hoisted_21$1)), [
5840
5889
  [vue.vModelSelect, filterInputs.value[col.field]]
5841
5890
  ]) : vue.createCommentVNode("", true)
5842
5891
  ], 64)) : vue.createCommentVNode("", true),
@@ -5853,8 +5902,9 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
5853
5902
  type: "text",
5854
5903
  class: vue.normalizeClass(["bh-form-control", {
5855
5904
  "bh-form-control--with-label": hasConditionSet(col) && props.all.useNewColumnFilter
5856
- }])
5857
- }, null, 10, _hoisted_27$1)), [
5905
+ }]),
5906
+ onKeydown: vue.withKeys(($event) => handleFilterEnter(col.field), ["enter"])
5907
+ }, null, 42, _hoisted_27$1)), [
5858
5908
  [vue.vModelText, filterInputs.value[col.field]]
5859
5909
  ]) : vue.createCommentVNode("", true),
5860
5910
  col.type === "number" || col.type === "integer" || col.type === "Integer" ? vue.withDirectives((vue.openBlock(), vue.createElementBlock("input", {
@@ -5863,8 +5913,9 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
5863
5913
  type: "number",
5864
5914
  class: vue.normalizeClass(["bh-form-control", {
5865
5915
  "bh-form-control--with-label": hasConditionSet(col) && props.all.useNewColumnFilter
5866
- }])
5867
- }, null, 10, _hoisted_28$1)), [
5916
+ }]),
5917
+ onKeydown: vue.withKeys(($event) => handleFilterEnter(col.field), ["enter"])
5918
+ }, null, 42, _hoisted_28$1)), [
5868
5919
  [
5869
5920
  vue.vModelText,
5870
5921
  filterInputs.value[col.field],
@@ -5880,15 +5931,17 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
5880
5931
  filterInputs.value[col.field] = val;
5881
5932
  emit("filterDatetimeUpdate", col.field, val);
5882
5933
  },
5883
- hasLabel: hasConditionSet(col) && props.all.useNewColumnFilter
5934
+ hasLabel: hasConditionSet(col) && props.all.useNewColumnFilter,
5935
+ onEnter: () => handleFilterEnter(col.field)
5884
5936
  }) : vue.withDirectives((vue.openBlock(), vue.createElementBlock("input", {
5885
5937
  key: 1,
5886
5938
  "onUpdate:modelValue": ($event) => filterInputs.value[col.field] = $event,
5887
5939
  type: "date",
5888
5940
  class: vue.normalizeClass(["bh-form-control", {
5889
5941
  "bh-form-control--with-label": hasConditionSet(col) && props.all.useNewColumnFilter
5890
- }])
5891
- }, null, 10, _hoisted_29$1)), [
5942
+ }]),
5943
+ onKeydown: vue.withKeys(($event) => handleFilterEnter(col.field), ["enter"])
5944
+ }, null, 42, _hoisted_29$1)), [
5892
5945
  [vue.vModelText, filterInputs.value[col.field]]
5893
5946
  ])
5894
5947
  ], 64)) : col.type === "bool" ? vue.withDirectives((vue.openBlock(), vue.createElementBlock("select", {
@@ -5896,8 +5949,9 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
5896
5949
  "onUpdate:modelValue": ($event) => filterInputs.value[col.field] = $event,
5897
5950
  class: "bh-form-control",
5898
5951
  onClick: _cache[2] || (_cache[2] = //@ts-ignore
5899
- (...args) => props.isOpenFilter && props.isOpenFilter(...args))
5900
- }, _hoisted_34$1, 8, _hoisted_30$1)), [
5952
+ (...args) => props.isOpenFilter && props.isOpenFilter(...args)),
5953
+ onKeydown: vue.withKeys(($event) => handleFilterEnter(col.field), ["enter"])
5954
+ }, _hoisted_34$1, 40, _hoisted_30$1)), [
5901
5955
  [vue.vModelSelect, filterInputs.value[col.field]]
5902
5956
  ]) : vue.createCommentVNode("", true)
5903
5957
  ])) : vue.createCommentVNode("", true),
@@ -6263,6 +6317,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
6263
6317
  return (col == null ? void 0 : col.field) || null;
6264
6318
  });
6265
6319
  const hasAnyActiveFilter = vue.ref(false);
6320
+ const columnHeaderRef = vue.ref(null);
6266
6321
  const updateHasAnyActiveFilter = () => {
6267
6322
  hasAnyActiveFilter.value = props.columns.some((col) => {
6268
6323
  return col.value !== void 0 && col.value !== null && col.value !== "";
@@ -6566,6 +6621,15 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
6566
6621
  }
6567
6622
  }
6568
6623
  return !!column;
6624
+ },
6625
+ /**
6626
+ * Flush all pending filter debounces
6627
+ * Call this before getColumnFilters() when Enter is pressed
6628
+ * to ensure all filter values are immediately processed
6629
+ */
6630
+ flushAllFilterDebounces() {
6631
+ var _a2, _b2;
6632
+ (_b2 = (_a2 = columnHeaderRef.value) == null ? void 0 : _a2.flushAllFilterDebounces) == null ? void 0 : _b2.call(_a2);
6569
6633
  }
6570
6634
  });
6571
6635
  vue.watch(
@@ -7059,6 +7123,8 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
7059
7123
  })
7060
7124
  }, [
7061
7125
  vue.createVNode(_sfc_main$1, {
7126
+ ref_key: "columnHeaderRef",
7127
+ ref: columnHeaderRef,
7062
7128
  all: props,
7063
7129
  expandedrows: expandedrows.value,
7064
7130
  currentSortColumn: currentSortColumn.value,
@@ -1,16 +1,16 @@
1
1
 
2
- .expandbtn[data-v-da3bc8d5] {
2
+ .expandbtn[data-v-4d01a2fa] {
3
3
  cursor: pointer;
4
- }
4
+ }
5
5
 
6
- .rightpanelbtn[data-v-b373d5f7] {
7
- cursor: pointer;
8
- display: inline-flex;
9
- align-items: center;
10
- justify-content: center;
11
- width: 24px;
6
+ .rightpanelbtn[data-v-d739c6bf] {
7
+ cursor: pointer;
8
+ display: inline-flex;
9
+ align-items: center;
10
+ justify-content: center;
11
+ width: 24px;
12
12
  height: 24px;
13
- }
13
+ }
14
14
  .splitpanes{display:flex;width:100%;height:100%}.splitpanes--vertical{flex-direction:row}.splitpanes--horizontal{flex-direction:column}.splitpanes--dragging .splitpanes__pane{-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:none}.splitpanes__pane{width:100%;height:100%;overflow:hidden}.splitpanes--vertical .splitpanes__pane{transition:width .2s ease-out}.splitpanes--horizontal .splitpanes__pane{transition:height .2s ease-out}.splitpanes--dragging .splitpanes__pane{transition:none}.splitpanes__splitter{touch-action:none}.splitpanes--vertical>.splitpanes__splitter{min-width:1px;cursor:col-resize}.splitpanes--horizontal>.splitpanes__splitter{min-height:1px;cursor:row-resize}.splitpanes.default-theme .splitpanes__pane{background-color:#f2f2f2}.splitpanes.default-theme .splitpanes__splitter{background-color:#fff;box-sizing:border-box;position:relative;flex-shrink:0}.splitpanes.default-theme .splitpanes__splitter:before,.splitpanes.default-theme .splitpanes__splitter:after{content:"";position:absolute;top:50%;left:50%;background-color:#00000026;transition:background-color .3s}.splitpanes.default-theme .splitpanes__splitter:hover:before,.splitpanes.default-theme .splitpanes__splitter:hover:after{background-color:#00000040}.splitpanes.default-theme .splitpanes__splitter:first-child{cursor:auto}.default-theme.splitpanes .splitpanes .splitpanes__splitter{z-index:1}.default-theme.splitpanes--vertical>.splitpanes__splitter,.default-theme .splitpanes--vertical>.splitpanes__splitter{width:7px;border-left:1px solid #eee;margin-left:-1px}.default-theme.splitpanes--vertical>.splitpanes__splitter:before,.default-theme.splitpanes--vertical>.splitpanes__splitter:after,.default-theme .splitpanes--vertical>.splitpanes__splitter:before,.default-theme .splitpanes--vertical>.splitpanes__splitter:after{transform:translateY(-50%);width:1px;height:30px}.default-theme.splitpanes--vertical>.splitpanes__splitter:before,.default-theme .splitpanes--vertical>.splitpanes__splitter:before{margin-left:-2px}.default-theme.splitpanes--vertical>.splitpanes__splitter:after,.default-theme .splitpanes--vertical>.splitpanes__splitter:after{margin-left:1px}.default-theme.splitpanes--horizontal>.splitpanes__splitter,.default-theme .splitpanes--horizontal>.splitpanes__splitter{height:7px;border-top:1px solid #eee;margin-top:-1px}.default-theme.splitpanes--horizontal>.splitpanes__splitter:before,.default-theme.splitpanes--horizontal>.splitpanes__splitter:after,.default-theme .splitpanes--horizontal>.splitpanes__splitter:before,.default-theme .splitpanes--horizontal>.splitpanes__splitter:after{transform:translate(-50%);width:30px;height:1px}.default-theme.splitpanes--horizontal>.splitpanes__splitter:before,.default-theme .splitpanes--horizontal>.splitpanes__splitter:before{margin-top:-2px}.default-theme.splitpanes--horizontal>.splitpanes__splitter:after,.default-theme .splitpanes--horizontal>.splitpanes__splitter:after{margin-top:1px}
15
15
 
16
16
  .left-menu-container {
@@ -2468,7 +2468,7 @@ const _export_sfc = (sfc, props) => {
2468
2468
  }
2469
2469
  return target;
2470
2470
  };
2471
- const ButtonExpand = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["__scopeId", "data-v-da3bc8d5"]]);
2471
+ const ButtonExpand = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["__scopeId", "data-v-4d01a2fa"]]);
2472
2472
  const __default__$4 = {
2473
2473
  name: "ButtonRightPanel"
2474
2474
  };
@@ -2494,7 +2494,7 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
2494
2494
  };
2495
2495
  }
2496
2496
  });
2497
- const ButtonRightPanel = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["__scopeId", "data-v-b373d5f7"]]);
2497
+ const ButtonRightPanel = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["__scopeId", "data-v-d739c6bf"]]);
2498
2498
  const sides = ["top", "right", "bottom", "left"];
2499
2499
  const alignments = ["start", "end"];
2500
2500
  const placements = /* @__PURE__ */ sides.reduce((acc, side) => acc.concat(side, side + "-" + alignments[0], side + "-" + alignments[1]), []);
@@ -5364,10 +5364,10 @@ const _hoisted_17$1 = {
5364
5364
  key: 0,
5365
5365
  class: "bh-filter bh-relative"
5366
5366
  };
5367
- const _hoisted_18$1 = ["onUpdate:modelValue"];
5368
- const _hoisted_19$1 = ["onUpdate:modelValue"];
5369
- const _hoisted_20$1 = ["onUpdate:modelValue"];
5370
- const _hoisted_21$1 = ["onUpdate:modelValue"];
5367
+ const _hoisted_18$1 = ["onUpdate:modelValue", "onKeydown"];
5368
+ const _hoisted_19$1 = ["onUpdate:modelValue", "onKeydown"];
5369
+ const _hoisted_20$1 = ["onUpdate:modelValue", "onKeydown"];
5370
+ const _hoisted_21$1 = ["onUpdate:modelValue", "onKeydown"];
5371
5371
  const _hoisted_22$1 = /* @__PURE__ */ createElementVNode("option", { value: void 0 }, "All", -1);
5372
5372
  const _hoisted_23$1 = /* @__PURE__ */ createElementVNode("option", { value: true }, "True", -1);
5373
5373
  const _hoisted_24$1 = /* @__PURE__ */ createElementVNode("option", { value: false }, "False", -1);
@@ -5380,10 +5380,10 @@ const _hoisted_26$1 = {
5380
5380
  key: 1,
5381
5381
  class: "bh-filter-input-wrapper"
5382
5382
  };
5383
- const _hoisted_27$1 = ["onUpdate:modelValue"];
5384
- const _hoisted_28$1 = ["onUpdate:modelValue"];
5385
- const _hoisted_29$1 = ["onUpdate:modelValue"];
5386
- const _hoisted_30$1 = ["onUpdate:modelValue"];
5383
+ const _hoisted_27$1 = ["onUpdate:modelValue", "onKeydown"];
5384
+ const _hoisted_28$1 = ["onUpdate:modelValue", "onKeydown"];
5385
+ const _hoisted_29$1 = ["onUpdate:modelValue", "onKeydown"];
5386
+ const _hoisted_30$1 = ["onUpdate:modelValue", "onKeydown"];
5387
5387
  const _hoisted_31$1 = /* @__PURE__ */ createElementVNode("option", { value: void 0 }, "All", -1);
5388
5388
  const _hoisted_32$1 = /* @__PURE__ */ createElementVNode("option", { value: true }, "True", -1);
5389
5389
  const _hoisted_33$1 = /* @__PURE__ */ createElementVNode("option", { value: false }, "False", -1);
@@ -5422,7 +5422,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
5422
5422
  "filterDatetimeUpdate",
5423
5423
  "clearAllFilters"
5424
5424
  ],
5425
- setup(__props, { emit: __emit }) {
5425
+ setup(__props, { expose: __expose, emit: __emit }) {
5426
5426
  const selectedAll = ref(null);
5427
5427
  const props = __props;
5428
5428
  const emit = __emit;
@@ -5435,6 +5435,8 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
5435
5435
  const filterInputs = ref({});
5436
5436
  const columnConditions = ref({});
5437
5437
  const watchedFields = ref(/* @__PURE__ */ new Set());
5438
+ const debounceTimers = /* @__PURE__ */ new Map();
5439
+ const processChangeFunctions = /* @__PURE__ */ new Map();
5438
5440
  const columnsMap = computed(() => {
5439
5441
  var _a;
5440
5442
  const map = /* @__PURE__ */ new Map();
@@ -5456,18 +5458,20 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
5456
5458
  filterInputs.value[col.field] = col.value || "";
5457
5459
  }
5458
5460
  watchedFields.value.add(col.field);
5459
- let debounceTimer = null;
5461
+ debounceTimers.set(col.field, null);
5460
5462
  watch(
5461
5463
  () => filterInputs.value[col.field],
5462
5464
  (newValue) => {
5463
5465
  const column = columnsMap.value.get(col.field);
5464
5466
  if (!column) return;
5465
5467
  const isEmpty = newValue === "" || newValue === null || newValue === void 0;
5466
- if (debounceTimer) {
5467
- clearTimeout(debounceTimer);
5468
- debounceTimer = null;
5468
+ const existingTimer = debounceTimers.get(col.field);
5469
+ if (existingTimer) {
5470
+ clearTimeout(existingTimer);
5471
+ debounceTimers.set(col.field, null);
5469
5472
  }
5470
5473
  const processChange = () => {
5474
+ debounceTimers.set(col.field, null);
5471
5475
  if (column.type === "string" || column.type === "String") {
5472
5476
  column.value = isEmpty ? "" : typeof newValue === "string" ? newValue.trim() : newValue;
5473
5477
  } else {
@@ -5484,16 +5488,43 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
5484
5488
  }
5485
5489
  emit("filterChange");
5486
5490
  };
5491
+ processChangeFunctions.set(col.field, processChange);
5487
5492
  if (isEmpty) {
5488
5493
  processChange();
5489
5494
  } else {
5490
- debounceTimer = setTimeout(processChange, 300);
5495
+ debounceTimers.set(col.field, setTimeout(processChange, 100));
5491
5496
  }
5492
5497
  }
5493
5498
  );
5494
5499
  }
5495
5500
  });
5496
5501
  };
5502
+ const flushFilterDebounce = (field) => {
5503
+ const timer = debounceTimers.get(field);
5504
+ if (timer) {
5505
+ clearTimeout(timer);
5506
+ debounceTimers.set(field, null);
5507
+ const processChange = processChangeFunctions.get(field);
5508
+ if (processChange) {
5509
+ processChange();
5510
+ }
5511
+ }
5512
+ };
5513
+ const flushAllFilterDebounces = () => {
5514
+ debounceTimers.forEach((timer, field) => {
5515
+ if (timer) {
5516
+ clearTimeout(timer);
5517
+ debounceTimers.set(field, null);
5518
+ const processChange = processChangeFunctions.get(field);
5519
+ if (processChange) {
5520
+ processChange();
5521
+ }
5522
+ }
5523
+ });
5524
+ };
5525
+ const handleFilterEnter = (field) => {
5526
+ flushFilterDebounce(field);
5527
+ };
5497
5528
  const handleClearAllFilters = () => {
5498
5529
  var _a;
5499
5530
  Object.keys(filterInputs.value).forEach((key) => {
@@ -5633,6 +5664,10 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
5633
5664
  }
5634
5665
  emit("filterChange");
5635
5666
  };
5667
+ __expose({
5668
+ flushFilterDebounce,
5669
+ flushAllFilterDebounces
5670
+ });
5636
5671
  return (_ctx, _cache) => {
5637
5672
  const _component_VDropdown = resolveComponent("VDropdown");
5638
5673
  return openBlock(), createElementBlock("tr", _hoisted_1$1, [
@@ -5664,7 +5699,10 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
5664
5699
  ])
5665
5700
  ]),
5666
5701
  props.all.columnFilter && !props.isFooter && clearButtonLocation.value === "checkbox" ? (openBlock(), createElementBlock("div", _hoisted_3$1, [
5667
- createVNode(unref(Vt), null, {
5702
+ createVNode(unref(Vt), {
5703
+ placement: "top",
5704
+ distance: 6
5705
+ }, {
5668
5706
  popper: withCtx(() => [
5669
5707
  createTextVNode("Clear all filters")
5670
5708
  ]),
@@ -5696,7 +5734,10 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
5696
5734
  })
5697
5735
  }, [
5698
5736
  props.all.columnFilter && !props.isFooter && clearButtonLocation.value === "rightpanel" ? (openBlock(), createElementBlock("div", _hoisted_7$1, [
5699
- createVNode(unref(Vt), null, {
5737
+ createVNode(unref(Vt), {
5738
+ placement: "top",
5739
+ distance: 6
5740
+ }, {
5700
5741
  popper: withCtx(() => [
5701
5742
  createTextVNode("Clear all filters")
5702
5743
  ]),
@@ -5728,7 +5769,10 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
5728
5769
  expandall: props.all.expandall
5729
5770
  }, null, 8, ["expandedrows", "expandall"])) : createCommentVNode("", true),
5730
5771
  props.all.columnFilter && !props.isFooter && clearButtonLocation.value === "subtable" ? (openBlock(), createElementBlock("div", _hoisted_11$1, [
5731
- createVNode(unref(Vt), null, {
5772
+ createVNode(unref(Vt), {
5773
+ placement: "top",
5774
+ distance: 6
5775
+ }, {
5732
5776
  popper: withCtx(() => [
5733
5777
  createTextVNode("Clear all filters")
5734
5778
  ]),
@@ -5796,16 +5840,18 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
5796
5840
  key: 0,
5797
5841
  "onUpdate:modelValue": ($event) => filterInputs.value[col.field] = $event,
5798
5842
  type: "text",
5799
- class: "bh-form-control"
5800
- }, null, 8, _hoisted_18$1)), [
5843
+ class: "bh-form-control",
5844
+ onKeydown: withKeys(($event) => handleFilterEnter(col.field), ["enter"])
5845
+ }, null, 40, _hoisted_18$1)), [
5801
5846
  [vModelText, filterInputs.value[col.field]]
5802
5847
  ]) : createCommentVNode("", true),
5803
5848
  col.type === "number" || col.type === "integer" || col.type === "Integer" ? withDirectives((openBlock(), createElementBlock("input", {
5804
5849
  key: 1,
5805
5850
  "onUpdate:modelValue": ($event) => filterInputs.value[col.field] = $event,
5806
5851
  type: "number",
5807
- class: "bh-form-control"
5808
- }, null, 8, _hoisted_19$1)), [
5852
+ class: "bh-form-control",
5853
+ onKeydown: withKeys(($event) => handleFilterEnter(col.field), ["enter"])
5854
+ }, null, 40, _hoisted_19$1)), [
5809
5855
  [
5810
5856
  vModelText,
5811
5857
  filterInputs.value[col.field],
@@ -5820,13 +5866,15 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
5820
5866
  updateValue: (val) => {
5821
5867
  filterInputs.value[col.field] = val;
5822
5868
  emit("filterDatetimeUpdate", col.field, val);
5823
- }
5869
+ },
5870
+ onEnter: () => handleFilterEnter(col.field)
5824
5871
  }) : withDirectives((openBlock(), createElementBlock("input", {
5825
5872
  key: 1,
5826
5873
  "onUpdate:modelValue": ($event) => filterInputs.value[col.field] = $event,
5827
5874
  type: "date",
5828
- class: "bh-form-control"
5829
- }, null, 8, _hoisted_20$1)), [
5875
+ class: "bh-form-control",
5876
+ onKeydown: withKeys(($event) => handleFilterEnter(col.field), ["enter"])
5877
+ }, null, 40, _hoisted_20$1)), [
5830
5878
  [vModelText, filterInputs.value[col.field]]
5831
5879
  ])
5832
5880
  ], 64)) : col.type === "bool" ? withDirectives((openBlock(), createElementBlock("select", {
@@ -5834,8 +5882,9 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
5834
5882
  "onUpdate:modelValue": ($event) => filterInputs.value[col.field] = $event,
5835
5883
  class: "bh-form-control",
5836
5884
  onClick: _cache[1] || (_cache[1] = //@ts-ignore
5837
- (...args) => props.isOpenFilter && props.isOpenFilter(...args))
5838
- }, _hoisted_25$1, 8, _hoisted_21$1)), [
5885
+ (...args) => props.isOpenFilter && props.isOpenFilter(...args)),
5886
+ onKeydown: withKeys(($event) => handleFilterEnter(col.field), ["enter"])
5887
+ }, _hoisted_25$1, 40, _hoisted_21$1)), [
5839
5888
  [vModelSelect, filterInputs.value[col.field]]
5840
5889
  ]) : createCommentVNode("", true)
5841
5890
  ], 64)) : createCommentVNode("", true),
@@ -5852,8 +5901,9 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
5852
5901
  type: "text",
5853
5902
  class: normalizeClass(["bh-form-control", {
5854
5903
  "bh-form-control--with-label": hasConditionSet(col) && props.all.useNewColumnFilter
5855
- }])
5856
- }, null, 10, _hoisted_27$1)), [
5904
+ }]),
5905
+ onKeydown: withKeys(($event) => handleFilterEnter(col.field), ["enter"])
5906
+ }, null, 42, _hoisted_27$1)), [
5857
5907
  [vModelText, filterInputs.value[col.field]]
5858
5908
  ]) : createCommentVNode("", true),
5859
5909
  col.type === "number" || col.type === "integer" || col.type === "Integer" ? withDirectives((openBlock(), createElementBlock("input", {
@@ -5862,8 +5912,9 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
5862
5912
  type: "number",
5863
5913
  class: normalizeClass(["bh-form-control", {
5864
5914
  "bh-form-control--with-label": hasConditionSet(col) && props.all.useNewColumnFilter
5865
- }])
5866
- }, null, 10, _hoisted_28$1)), [
5915
+ }]),
5916
+ onKeydown: withKeys(($event) => handleFilterEnter(col.field), ["enter"])
5917
+ }, null, 42, _hoisted_28$1)), [
5867
5918
  [
5868
5919
  vModelText,
5869
5920
  filterInputs.value[col.field],
@@ -5879,15 +5930,17 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
5879
5930
  filterInputs.value[col.field] = val;
5880
5931
  emit("filterDatetimeUpdate", col.field, val);
5881
5932
  },
5882
- hasLabel: hasConditionSet(col) && props.all.useNewColumnFilter
5933
+ hasLabel: hasConditionSet(col) && props.all.useNewColumnFilter,
5934
+ onEnter: () => handleFilterEnter(col.field)
5883
5935
  }) : withDirectives((openBlock(), createElementBlock("input", {
5884
5936
  key: 1,
5885
5937
  "onUpdate:modelValue": ($event) => filterInputs.value[col.field] = $event,
5886
5938
  type: "date",
5887
5939
  class: normalizeClass(["bh-form-control", {
5888
5940
  "bh-form-control--with-label": hasConditionSet(col) && props.all.useNewColumnFilter
5889
- }])
5890
- }, null, 10, _hoisted_29$1)), [
5941
+ }]),
5942
+ onKeydown: withKeys(($event) => handleFilterEnter(col.field), ["enter"])
5943
+ }, null, 42, _hoisted_29$1)), [
5891
5944
  [vModelText, filterInputs.value[col.field]]
5892
5945
  ])
5893
5946
  ], 64)) : col.type === "bool" ? withDirectives((openBlock(), createElementBlock("select", {
@@ -5895,8 +5948,9 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
5895
5948
  "onUpdate:modelValue": ($event) => filterInputs.value[col.field] = $event,
5896
5949
  class: "bh-form-control",
5897
5950
  onClick: _cache[2] || (_cache[2] = //@ts-ignore
5898
- (...args) => props.isOpenFilter && props.isOpenFilter(...args))
5899
- }, _hoisted_34$1, 8, _hoisted_30$1)), [
5951
+ (...args) => props.isOpenFilter && props.isOpenFilter(...args)),
5952
+ onKeydown: withKeys(($event) => handleFilterEnter(col.field), ["enter"])
5953
+ }, _hoisted_34$1, 40, _hoisted_30$1)), [
5900
5954
  [vModelSelect, filterInputs.value[col.field]]
5901
5955
  ]) : createCommentVNode("", true)
5902
5956
  ])) : createCommentVNode("", true),
@@ -6262,6 +6316,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
6262
6316
  return (col == null ? void 0 : col.field) || null;
6263
6317
  });
6264
6318
  const hasAnyActiveFilter = ref(false);
6319
+ const columnHeaderRef = ref(null);
6265
6320
  const updateHasAnyActiveFilter = () => {
6266
6321
  hasAnyActiveFilter.value = props.columns.some((col) => {
6267
6322
  return col.value !== void 0 && col.value !== null && col.value !== "";
@@ -6565,6 +6620,15 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
6565
6620
  }
6566
6621
  }
6567
6622
  return !!column;
6623
+ },
6624
+ /**
6625
+ * Flush all pending filter debounces
6626
+ * Call this before getColumnFilters() when Enter is pressed
6627
+ * to ensure all filter values are immediately processed
6628
+ */
6629
+ flushAllFilterDebounces() {
6630
+ var _a2, _b2;
6631
+ (_b2 = (_a2 = columnHeaderRef.value) == null ? void 0 : _a2.flushAllFilterDebounces) == null ? void 0 : _b2.call(_a2);
6568
6632
  }
6569
6633
  });
6570
6634
  watch(
@@ -7058,6 +7122,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
7058
7122
  })
7059
7123
  }, [
7060
7124
  createVNode(_sfc_main$1, {
7125
+ ref_key: "columnHeaderRef",
7126
+ ref: columnHeaderRef,
7061
7127
  all: props,
7062
7128
  expandedrows: expandedrows.value,
7063
7129
  currentSortColumn: currentSortColumn.value,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dolusoft/vue3-datatable",
3
- "version": "1.8.37",
3
+ "version": "1.8.40",
4
4
  "description": "Vue3 Datatable - fully customizable & easy to use datatable library",
5
5
  "private": false,
6
6
  "type": "module",