@adaptabletools/adaptable-cjs 21.0.0-canary.2 → 21.0.0-canary.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adaptabletools/adaptable-cjs",
3
- "version": "21.0.0-canary.2",
3
+ "version": "21.0.0-canary.4",
4
4
  "description": "Powerful data-agnostic HTML5 AG Grid extension which provides advanced, cutting-edge functionality to meet all DataGrid requirements",
5
5
  "keywords": [
6
6
  "web-components",
@@ -26,7 +26,7 @@ export interface FilterOptions<TData = any> {
26
26
  */
27
27
  clearFiltersOnStartUp?: boolean;
28
28
  /**
29
- * Provide custom values (or sorting / count info) when using the `In` Filter
29
+ * Provide custom values (or sorting / count info) when using `In` Predicate in Column or Grid Filter
30
30
  * @param context
31
31
  * @returns
32
32
  */
@@ -208,17 +208,16 @@ export interface InFilterValue<ValueType = any> {
208
208
  /**
209
209
  * Result when providing custom values for the IN Column Filter
210
210
  */
211
- export type InFilterValueResult = {
211
+ export interface InFilterValueResult {
212
212
  /**
213
213
  * List of Items to display in the IN Column Filter
214
214
  */
215
- values: InFilterValueInfo[];
215
+ values: InFilterValue[];
216
216
  /**
217
- * When TRUE, displays the provided values without any filtering.
218
- * When FALSE, the values are filtered based on the current search text.
217
+ * If true, AdapTable will not filter the list using the current search value
219
218
  */
220
219
  skipDefaultSearch?: boolean;
221
- };
220
+ }
222
221
  /**
223
222
  * Information about items in the IN Column Filter
224
223
  */
@@ -249,11 +248,11 @@ export interface CustomInFilterValuesContext<TData = any> extends AdaptableColum
249
248
  */
250
249
  defaultValues: Required<InFilterValueInfo>[];
251
250
  /**
252
- * Default values but Sorted based on Column's sort
251
+ * Default values but sorted (if Column is sorted)
253
252
  */
254
253
  sortedValues: Required<InFilterValueInfo>[];
255
254
  /**
256
- * Default values but in the order in which they are currently listed in the grid - (after all the sorting has been applied, or, if no sorting, in their natural order)
255
+ * Default values in order which currently listed in the grid
257
256
  */
258
257
  orderedValues: Required<InFilterValueInfo>[];
259
258
  /**
@@ -261,8 +260,7 @@ export interface CustomInFilterValuesContext<TData = any> extends AdaptableColum
261
260
  */
262
261
  currentSearchValue: string;
263
262
  /**
264
- * Memoized result from previous invocation. Helps avoid expensive recomputations,
265
- * especially for async operations (e.g. server-side filtering).
263
+ * Previous filter result; avoids expensive recomputations (e.g for async op or server-side filtering)
266
264
  */
267
265
  previousFilterResult?: InFilterValueResult;
268
266
  }
@@ -55,5 +55,6 @@ export declare class ColumnFilterInternalApi extends ApiBase {
55
55
  currentSearchValue: string;
56
56
  }): Promise<InFilterValueResult>;
57
57
  shouldAutoApplyColumnFilter(columnId: string): boolean;
58
+ getAdaptableFilterHandler(columnId: string): AdaptableFilterHandler | undefined;
58
59
  getAllAdaptableFilterHandlers(): AdaptableFilterHandler[];
59
60
  }
@@ -258,14 +258,14 @@ class ColumnFilterInternalApi extends ApiBase_1.ApiBase {
258
258
  this.logWarn(`No ColumnFilterHandler found for columnId: ${options.columnId}!`);
259
259
  return this.getGridApi().internalApi.getDistinctFilterDisplayValuesForColumn(newOptions);
260
260
  }
261
- if (typeof columnFilterHandler.getFilterDisplayValuesFromCache !== 'function') {
262
- this.logWarn(`ColumnFilterHandler for columnId: ${options.columnId} does not have getFilterDisplayValuesFromCache method!`);
261
+ if (typeof columnFilterHandler.getFromCacheOrFetchFilterDisplayValues !== 'function') {
262
+ this.logWarn(`ColumnFilterHandler for columnId: ${options.columnId} does not have getFromCacheOrFetchFilterDisplayValues method!`);
263
263
  return this.getGridApi().internalApi.getDistinctFilterDisplayValuesForColumn(newOptions);
264
264
  }
265
265
  if (filterOptions.customInFilterValues) {
266
266
  return columnFilterHandler.fetchFilterDisplayValues(newOptions);
267
267
  }
268
- return columnFilterHandler.getFilterDisplayValuesFromCache(newOptions);
268
+ return columnFilterHandler.getFromCacheOrFetchFilterDisplayValues(newOptions);
269
269
  }
270
270
  shouldAutoApplyColumnFilter(columnId) {
271
271
  const autoApplyColumnFilterOpt = this.getOptionsApi().getFilterOptions().columnFilterOptions?.autoApplyColumnFilter;
@@ -283,6 +283,9 @@ class ColumnFilterInternalApi extends ApiBase_1.ApiBase {
283
283
  // fallback, should never happen
284
284
  return true;
285
285
  }
286
+ getAdaptableFilterHandler(columnId) {
287
+ return this.getAgGridApi().getColumnFilterHandler(columnId);
288
+ }
286
289
  getAllAdaptableFilterHandlers() {
287
290
  const allFilterableColumns = this.getColumnApi().getFilterableColumns();
288
291
  const filterHandlers = allFilterableColumns
@@ -37,7 +37,9 @@ export declare function useDistinctFilterColumnValues(options: {
37
37
  skipDefaultSearch: boolean;
38
38
  searchValueUsedInFilterValue: boolean;
39
39
  }>>;
40
- triggerValuesLoad: () => void;
40
+ triggerValuesLoad: (options?: {
41
+ usePrevious: boolean;
42
+ }) => void;
41
43
  };
42
44
  /**
43
45
  * This component was ported and modified to not know about colum filter and predicates.
@@ -24,7 +24,10 @@ function useDistinctFilterColumnValues(options) {
24
24
  const { columnId, searchValueRef } = options;
25
25
  const { api } = (0, AdaptableContext_1.useAdaptable)();
26
26
  const [valuesLoadTrigger, setValuesLoadTrigger] = React.useState(0);
27
- const triggerValuesLoad = React.useCallback(() => {
27
+ const usePreviousValuesProbablyBecauseOfAGGridUnnecessaryFilterRemountRef = React.useRef(false);
28
+ const triggerValuesLoad = React.useCallback((options) => {
29
+ usePreviousValuesProbablyBecauseOfAGGridUnnecessaryFilterRemountRef.current =
30
+ !!options?.usePrevious;
28
31
  setValuesLoadTrigger((prev) => prev + 1);
29
32
  }, []);
30
33
  const [quickFilterValues, setQuickFilterValues] = React.useState({
@@ -42,15 +45,27 @@ function useDistinctFilterColumnValues(options) {
42
45
  let ignore = false;
43
46
  setIsDistinctColumnValuesLoading(true);
44
47
  let searchValueUsedInFilterValue = false;
45
- api.filterApi.columnFilterApi.internalApi
46
- .getColumnFilterValues({
47
- columnId,
48
- get currentSearchValue() {
49
- searchValueUsedInFilterValue = true;
50
- return searchValueRef ? searchValueRef.current : '';
51
- },
52
- })
53
- .then((distinctFilterDisplayValues) => {
48
+ const columnFilterinternalApi = api.filterApi.columnFilterApi.internalApi;
49
+ let promise = undefined;
50
+ if (usePreviousValuesProbablyBecauseOfAGGridUnnecessaryFilterRemountRef.current) {
51
+ const previousResult = columnFilterinternalApi
52
+ .getAdaptableFilterHandler(columnId)
53
+ ?.getLastCachedFilterDisplayValues();
54
+ if (previousResult) {
55
+ promise = Promise.resolve(previousResult);
56
+ }
57
+ }
58
+ usePreviousValuesProbablyBecauseOfAGGridUnnecessaryFilterRemountRef.current = false;
59
+ if (!promise) {
60
+ promise = columnFilterinternalApi.getColumnFilterValues({
61
+ columnId,
62
+ get currentSearchValue() {
63
+ searchValueUsedInFilterValue = true;
64
+ return searchValueRef ? searchValueRef.current : '';
65
+ },
66
+ });
67
+ }
68
+ promise.then((distinctFilterDisplayValues) => {
54
69
  if (ignore) {
55
70
  return;
56
71
  }
@@ -96,9 +111,15 @@ const FloatingFilterValues = (props) => {
96
111
  if (!value || !Array.isArray(value) || value.length === 0) {
97
112
  return;
98
113
  }
114
+ // see 😅 usePreviousValuesProbablyBecauseOfAGGridUnnecessaryFilterRemountRef 😅
115
+ const usePrevious = !!api.filterApi.columnFilterApi.internalApi
116
+ .getAdaptableFilterHandler(props.columnId)
117
+ ?.getLastCachedFilterDisplayValues();
99
118
  // however, if the `value` prop is a non-empty array, we need to load the values
100
119
  // so we know which labels to show
101
- triggerValuesLoad();
120
+ triggerValuesLoad({
121
+ usePrevious,
122
+ });
102
123
  }, []);
103
124
  const quickFilterValuesRef = React.useRef(quickFilterValues);
104
125
  quickFilterValuesRef.current = quickFilterValues;
@@ -13,7 +13,7 @@ const ColumnValuesSelect = (props) => {
13
13
  const column = props.column;
14
14
  const selectedColumnValues = props.value || [];
15
15
  const value = [];
16
- const options = props.options.filter((distinctValue, index) => {
16
+ const options = (Array.isArray(props.options) ? props.options : []).filter((distinctValue) => {
17
17
  let isActive = selectedColumnValues.indexOf(distinctValue.value) >= 0;
18
18
  // special case for date objects, need to check against string values
19
19
  if (!isActive && distinctValue.value && distinctValue.value instanceof Date) {
@@ -6,9 +6,12 @@ export declare class AdaptableFilterHandler implements FilterHandler {
6
6
  private adaptableApi;
7
7
  readonly colId: string;
8
8
  private filterDisplayValuesResult;
9
+ private previousFilterDisplayValuesResult;
9
10
  constructor(adaptableApi: AdaptableApi, columnSetup: ColumnSetupInfo);
10
11
  doesFilterPass(params: DoesFilterPassParams): boolean;
11
- getFilterDisplayValuesFromCache(options: {
12
+ getCachedFilterDisplayValues(): InFilterValueResult | undefined;
13
+ getLastCachedFilterDisplayValues(): InFilterValueResult | undefined;
14
+ getFromCacheOrFetchFilterDisplayValues(options: {
12
15
  currentSearchValue: string;
13
16
  }): Promise<InFilterValueResult>;
14
17
  fetchFilterDisplayValues(options: {
@@ -30,7 +30,13 @@ class AdaptableFilterHandler {
30
30
  return false;
31
31
  }
32
32
  }
33
- getFilterDisplayValuesFromCache(options) {
33
+ getCachedFilterDisplayValues() {
34
+ return this.filterDisplayValuesResult;
35
+ }
36
+ getLastCachedFilterDisplayValues() {
37
+ return this.filterDisplayValuesResult ?? this.previousFilterDisplayValuesResult;
38
+ }
39
+ getFromCacheOrFetchFilterDisplayValues(options) {
34
40
  if (this.filterDisplayValuesResult) {
35
41
  return Promise.resolve(this.filterDisplayValuesResult);
36
42
  }
@@ -64,12 +70,15 @@ class AdaptableFilterHandler {
64
70
  this.resetFilterDisplayValues();
65
71
  }
66
72
  resetFilterDisplayValues() {
73
+ if (this.filterDisplayValuesResult) {
74
+ this.previousFilterDisplayValuesResult = this.filterDisplayValuesResult;
75
+ }
67
76
  // Reset the filter display values manually
68
77
  this.filterDisplayValuesResult = undefined;
69
78
  }
70
79
  async refreshFilterDisplayValues() {
71
80
  this.resetFilterDisplayValues();
72
- return this.getFilterDisplayValuesFromCache({ currentSearchValue: '' });
81
+ return this.getFromCacheOrFetchFilterDisplayValues({ currentSearchValue: '' });
73
82
  }
74
83
  refresh(params) {
75
84
  // No specific refresh logic needed for this handler
@@ -77,6 +86,7 @@ class AdaptableFilterHandler {
77
86
  }
78
87
  destroy() {
79
88
  this.filterDisplayValuesResult = undefined;
89
+ this.previousFilterDisplayValuesResult = undefined;
80
90
  }
81
91
  }
82
92
  exports.AdaptableFilterHandler = AdaptableFilterHandler;
@@ -5,7 +5,6 @@ export declare const ensureLoadingScreenPortalElement: () => HTMLElement;
5
5
  export interface ModalProps extends FlexProps {
6
6
  isOpen?: boolean;
7
7
  baseZIndex?: number;
8
- backdropZIndexOffset?: number;
9
8
  onBringToFront?: () => void;
10
9
  }
11
10
  export declare const Modal: React.FunctionComponent<React.PropsWithChildren<ModalProps>>;
@@ -11,6 +11,7 @@ const rebass_1 = require("rebass");
11
11
  const Backdrop_1 = tslib_1.__importStar(require("./Backdrop"));
12
12
  const uuid_1 = require("../utils/uuid");
13
13
  const UIHelper_1 = require("../../View/UIHelper");
14
+ const useStacking_1 = require("../WindowModal/useStacking");
14
15
  let portalElement;
15
16
  let loadingScreenPortalElement;
16
17
  const ensurePortalElement = () => {
@@ -44,8 +45,9 @@ const Modal = (props) => {
44
45
  const uuid = (0, react_1.useMemo)(() => (0, uuid_1.createUuid)(), []);
45
46
  const counter = (0, react_1.useMemo)(() => globalCounter++, [isOpen]);
46
47
  const openTimestamp = counter;
47
- const backdropZIndexOffset = props.backdropZIndexOffset || 1;
48
- const zIndex = (props.baseZIndex || 2000) + counter;
48
+ const backdropZIndexOffset = 1;
49
+ const stacking = (0, useStacking_1.useStacking)();
50
+ const zIndex = stacking.zIndex;
49
51
  return (0, react_dom_1.createPortal)(isOpen ? (React.createElement(React.Fragment, null,
50
52
  React.createElement(Backdrop_1.default, { timestamp: openTimestamp, uuid: uuid, zIndex: zIndex - backdropZIndexOffset, onBringToFront: onBringToFront }),
51
53
  React.createElement(react_remove_scroll_1.RemoveScroll, null,
@@ -17,6 +17,7 @@ const contains_1 = tslib_1.__importDefault(require("../utils/contains"));
17
17
  const UIHelper_1 = require("../../View/UIHelper");
18
18
  const InfiniteTable_1 = require("../InfiniteTable");
19
19
  const AdaptableContext_1 = require("../../View/AdaptableContext");
20
+ const overlayBaseZIndex_1 = require("../overlayBaseZIndex");
20
21
  const getConstrainElement = (target, constrainTo) => {
21
22
  let el = null;
22
23
  if (typeof constrainTo === 'string') {
@@ -37,6 +38,7 @@ const getConstrainRect = (target, constrainTo) => {
37
38
  };
38
39
  exports.getConstrainRect = getConstrainRect;
39
40
  let portalElement;
41
+ const OVERLAY_TRIGGER_Z_INDEX = overlayBaseZIndex_1.OVERLAY_BASE_Z_INDEX;
40
42
  const ensurePortalElement = () => {
41
43
  if (!(0, UIHelper_1.isBrowserDocumentAvailable)()) {
42
44
  return;
@@ -46,7 +48,7 @@ const ensurePortalElement = () => {
46
48
  }
47
49
  portalElement = document.createElement('div');
48
50
  portalElement.style.position = 'absolute';
49
- portalElement.style.zIndex = '9999999';
51
+ portalElement.style.zIndex = OVERLAY_TRIGGER_Z_INDEX.toString();
50
52
  portalElement.style.top = '0px';
51
53
  portalElement.style.left = '0px';
52
54
  document.body.appendChild(portalElement);
@@ -13,6 +13,7 @@ const react_1 = require("react");
13
13
  const join_1 = tslib_1.__importDefault(require("../utils/join"));
14
14
  const re_resizable_1 = require("re-resizable");
15
15
  const Tooltip_1 = tslib_1.__importDefault(require("../Tooltip"));
16
+ const overlayBaseZIndex_1 = require("../overlayBaseZIndex");
16
17
  const resizableDirections = {
17
18
  right: true,
18
19
  bottom: true,
@@ -537,7 +538,7 @@ const Select = function (props) {
537
538
  menuPortal: (baseStyle) => {
538
539
  return {
539
540
  ...baseStyle,
540
- zIndex: 999999,
541
+ zIndex: overlayBaseZIndex_1.OVERLAY_BASE_Z_INDEX,
541
542
  textAlign: 'left',
542
543
  };
543
544
  },
@@ -545,7 +546,7 @@ const Select = function (props) {
545
546
  menu: (baseStyle, state) => {
546
547
  return {
547
548
  ...baseStyle,
548
- zIndex: 999999,
549
+ zIndex: overlayBaseZIndex_1.OVERLAY_BASE_Z_INDEX,
549
550
  boxShadow: 'var(--ab-cmp-select-menu__box-shadow)',
550
551
  minWidth: `var(--ab-cmp-select-menu__min-width)`,
551
552
  width: resizable ? '100%' : `${Math.max(maxLabelLength, 10)}ch`,
@@ -8,6 +8,15 @@ const setZIndexMap = {};
8
8
  const zIndexMap = [];
9
9
  // starts with 3000, to be above the default zIndex of the Modal component
10
10
  const BASE_Z_INDEX = 3000;
11
+ const Z_INDEX_GAP = 5;
12
+ let GLOBAL_COUNTER = 0;
13
+ const getNewOffset = () => {
14
+ const counter = GLOBAL_COUNTER++;
15
+ return counter * Z_INDEX_GAP;
16
+ };
17
+ const getNewZIndex = () => {
18
+ return BASE_Z_INDEX + getNewOffset();
19
+ };
11
20
  /**
12
21
  * Used to facilitate the stacking between multiple opened windows.
13
22
  * When calling 'bringToFront' brings caller to top.
@@ -15,7 +24,7 @@ const BASE_Z_INDEX = 3000;
15
24
  */
16
25
  const useStacking = () => {
17
26
  const modalZIndexId = React.useMemo(() => (0, uuid_1.createUuid)(), []);
18
- const [zIndex, setZIndex] = React.useState(BASE_Z_INDEX);
27
+ const [zIndex, setZIndex] = React.useState(getNewZIndex);
19
28
  React.useEffect(() => {
20
29
  setZIndexMap[modalZIndexId] = setZIndex;
21
30
  return () => {
@@ -34,8 +43,8 @@ const useStacking = () => {
34
43
  else {
35
44
  zIndexMap.push(modalZIndexId);
36
45
  }
37
- zIndexMap.forEach((id, index) => {
38
- setZIndexMap?.[id]?.(BASE_Z_INDEX + index * 10);
46
+ zIndexMap.forEach((id) => {
47
+ setZIndexMap?.[id]?.(getNewZIndex());
39
48
  });
40
49
  }, []);
41
50
  return {
@@ -0,0 +1 @@
1
+ export declare const OVERLAY_BASE_Z_INDEX = 9999999;
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OVERLAY_BASE_Z_INDEX = void 0;
4
+ exports.OVERLAY_BASE_Z_INDEX = 9999999;
package/src/env.js CHANGED
@@ -2,6 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.default = {
4
4
  NEXT_PUBLIC_INFINITE_TABLE_LICENSE_KEY: "StartDate=2021-06-29|EndDate=2030-01-01|Owner=Adaptable|Type=distribution|TS=1624971462479|C=137829811,1004007071,2756196225,1839832928,3994409405,636616862" || '',
5
- PUBLISH_TIMESTAMP: 1756992492609 || Date.now(),
6
- VERSION: "21.0.0-canary.2" || '--current-version--',
5
+ PUBLISH_TIMESTAMP: 1757087891356 || Date.now(),
6
+ VERSION: "21.0.0-canary.4" || '--current-version--',
7
7
  };
@@ -2464,11 +2464,19 @@ export declare const ADAPTABLE_METAMODEL: {
2464
2464
  name: string;
2465
2465
  kind: string;
2466
2466
  desc: string;
2467
- props: {
2467
+ props: ({
2468
2468
  name: string;
2469
2469
  kind: string;
2470
2470
  desc: string;
2471
- }[];
2471
+ isOpt?: undefined;
2472
+ ref?: undefined;
2473
+ } | {
2474
+ name: string;
2475
+ kind: string;
2476
+ desc: string;
2477
+ isOpt: boolean;
2478
+ ref: string;
2479
+ })[];
2472
2480
  };
2473
2481
  CustomQueryVariableContext: {
2474
2482
  name: string;
@@ -4086,6 +4094,22 @@ export declare const ADAPTABLE_METAMODEL: {
4086
4094
  isOpt: boolean;
4087
4095
  }[];
4088
4096
  };
4097
+ InFilterValueResult: {
4098
+ name: string;
4099
+ kind: string;
4100
+ desc: string;
4101
+ props: ({
4102
+ name: string;
4103
+ kind: string;
4104
+ desc: string;
4105
+ isOpt: boolean;
4106
+ } | {
4107
+ name: string;
4108
+ kind: string;
4109
+ desc: string;
4110
+ isOpt?: undefined;
4111
+ })[];
4112
+ };
4089
4113
  InitialState: {
4090
4114
  name: string;
4091
4115
  kind: string;