@vaadin/component-base 24.2.0-beta3 → 24.2.0-beta4

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": "@vaadin/component-base",
3
- "version": "24.2.0-beta3",
3
+ "version": "24.2.0-beta4",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -42,5 +42,5 @@
42
42
  "@vaadin/testing-helpers": "^0.5.0",
43
43
  "sinon": "^13.0.2"
44
44
  },
45
- "gitHead": "91ea11e7ad706065340acdb93b92316919ce5e69"
45
+ "gitHead": "04da1e1e5c5713ea45e4b7d659dc6ac6b4604f4c"
46
46
  }
package/src/define.js CHANGED
@@ -3,16 +3,9 @@
3
3
  * Copyright (c) 2021 - 2023 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
-
7
6
  export function defineCustomElement(CustomElement) {
8
7
  const defined = customElements.get(CustomElement.is);
9
8
  if (!defined) {
10
- Object.defineProperty(CustomElement, 'version', {
11
- get() {
12
- return '24.2.0-beta3';
13
- },
14
- });
15
-
16
9
  customElements.define(CustomElement.is, CustomElement);
17
10
  } else {
18
11
  const definedVersion = defined.version;
@@ -44,6 +44,10 @@ const registered = new Set();
44
44
  */
45
45
  export const ElementMixin = (superClass) =>
46
46
  class VaadinElementMixin extends DirMixin(superClass) {
47
+ static get version() {
48
+ return '24.2.0-beta4';
49
+ }
50
+
47
51
  /** @protected */
48
52
  static finalize() {
49
53
  super.finalize();
@@ -82,24 +82,10 @@ export class IronListAdapter {
82
82
  return this.lastVisibleIndex + this._vidxOffset;
83
83
  }
84
84
 
85
- __hasPlaceholders() {
86
- return this.__getVisibleElements().some((el) => el.__virtualizerPlaceholder);
87
- }
88
-
89
85
  scrollToIndex(index) {
90
86
  if (typeof index !== 'number' || isNaN(index) || this.size === 0 || !this.scrollTarget.offsetHeight) {
91
87
  return;
92
88
  }
93
- delete this.__pendingScrollToIndex;
94
-
95
- if (this._physicalCount <= 3 /* iron-list-core.DEFAULT_PHYSICAL_COUNT */) {
96
- // The condition here is a performance improvement to avoid an unnecessary
97
- // re-render when the physical item pool is already covered.
98
-
99
- // Finish rendering at the current scroll position before scrolling
100
- this.flush();
101
- }
102
-
103
89
  index = this._clamp(index, 0, this.size - 1);
104
90
 
105
91
  const visibleElementCount = this.__getVisibleElements().length;
@@ -127,12 +113,6 @@ export class IronListAdapter {
127
113
  this._scrollTop -= this.__getIndexScrollOffset(index) || 0;
128
114
  }
129
115
  this._scrollHandler();
130
-
131
- if (this.__hasPlaceholders()) {
132
- // After rendering synchronously, there are still placeholders in the DOM.
133
- // Try again after the next elements update.
134
- this.__pendingScrollToIndex = index;
135
- }
136
116
  }
137
117
 
138
118
  flush() {
@@ -219,9 +199,8 @@ export class IronListAdapter {
219
199
 
220
200
  __updateElement(el, index, forceSameIndexUpdates) {
221
201
  // Clean up temporary placeholder sizing
222
- if (el.__virtualizerPlaceholder) {
202
+ if (el.style.paddingTop) {
223
203
  el.style.paddingTop = '';
224
- el.__virtualizerPlaceholder = false;
225
204
  }
226
205
 
227
206
  if (!this.__preventElementUpdates && (el.__lastUpdatedIndex !== index || forceSameIndexUpdates)) {
@@ -245,7 +224,6 @@ export class IronListAdapter {
245
224
  // Assign a temporary placeholder sizing to elements that would otherwise end up having
246
225
  // no height.
247
226
  el.style.paddingTop = `${this.__placeholderHeight}px`;
248
- el.__virtualizerPlaceholder = true;
249
227
 
250
228
  // Manually schedule the resize handler to make sure the placeholder padding is
251
229
  // cleared in case the resize observer never triggers.
@@ -263,10 +241,6 @@ export class IronListAdapter {
263
241
  this.__placeholderHeight = Math.round(filteredHeights.reduce((a, b) => a + b, 0) / filteredHeights.length);
264
242
  }
265
243
  });
266
-
267
- if (this.__pendingScrollToIndex !== undefined && !this.__hasPlaceholders()) {
268
- this.scrollToIndex(this.__pendingScrollToIndex);
269
- }
270
244
  }
271
245
 
272
246
  __getIndexScrollOffset(index) {
@@ -1,146 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright (c) 2021 - 2023 Vaadin Ltd.
4
- * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
- */
6
- import type { DataProviderCallback } from './data-provider-controller.js';
7
-
8
- export type CacheContext<TItem> = { isExpanded(item: TItem): boolean };
9
-
10
- /**
11
- * A class that stores items with their associated sub-caches.
12
- */
13
- export class Cache<TItem> {
14
- /**
15
- * A context object.
16
- */
17
- context: CacheContext<TItem>;
18
-
19
- /**
20
- * The number of items.
21
- */
22
- size: number;
23
-
24
- /**
25
- * The number of items to display per page.
26
- */
27
- pageSize: number;
28
-
29
- /**
30
- * An array of cached items.
31
- */
32
- items: TItem[];
33
-
34
- /**
35
- * A map where the key is a requested page and the value is a callback
36
- * that will be called with data once the request is complete.
37
- */
38
- pendingRequests: Record<number, DataProviderCallback<TItem>>;
39
-
40
- /**
41
- * An item in the parent cache that the current cache is associated with.
42
- */
43
- get parentItem(): TItem | undefined;
44
-
45
- /**
46
- * An array of sub-caches sorted in the same order as their associated items
47
- * appear in the `items` array.
48
- */
49
- get subCaches(): Array<Cache<TItem>>;
50
-
51
- /**
52
- * Whether the cache or any of its descendant caches have pending requests.
53
- */
54
- get isLoading(): boolean;
55
-
56
- /**
57
- * The total number of items, including items from expanded sub-caches.
58
- */
59
- get flatSize(): number;
60
-
61
- /**
62
- * The total number of items, including items from expanded sub-caches.
63
- *
64
- * @protected
65
- * @deprecated since 24.3 and will be removed in Vaadin 25.
66
- */
67
- get effectiveSize(): number;
68
-
69
- constructor(
70
- context: CacheContext<TItem>,
71
- pageSize: number,
72
- size: number,
73
- parentCache?: Cache<TItem>,
74
- parentCacheIndex?: number,
75
- );
76
-
77
- /**
78
- * Recalculates the flattened size for the cache and its descendant caches recursively.
79
- */
80
- recalculateFlatSize(): void;
81
-
82
- /**
83
- * Adds an array of items corresponding to the given page
84
- * to the `items` array.
85
- */
86
- setPage(page: number, items: unknown[]): void;
87
-
88
- /**
89
- * Retrieves the sub-cache associated with the item at the given index
90
- * in the `items` array.
91
- */
92
- getSubCache(index: number): Cache<TItem> | undefined;
93
-
94
- /**
95
- * Removes the sub-cache associated with the item at the given index
96
- * in the `items` array.
97
- */
98
- removeSubCache(index: number): void;
99
-
100
- /**
101
- * Removes all sub-caches.
102
- */
103
- removeSubCaches(): void;
104
-
105
- /**
106
- * Creates and associates a sub-cache for the item at the given index
107
- * in the `items` array.
108
- */
109
- createSubCache(index: number): Cache<TItem>;
110
-
111
- /**
112
- * Retrieves the flattened index corresponding to the given index
113
- * of an item in the `items` array.
114
- */
115
- getFlatIndex(index: number): number;
116
-
117
- /**
118
- * @deprecated since 24.3 and will be removed in Vaadin 25.
119
- */
120
- getItemForIndex(index: number): TItem | undefined;
121
-
122
- /**
123
- * @deprecated since 24.3 and will be removed in Vaadin 25.
124
- */
125
- getCacheAndIndex(index: number): { cache: Cache<TItem>; scaledIndex: number };
126
-
127
- /**
128
- * @deprecated since 24.3 and will be removed in Vaadin 25.
129
- */
130
- updateSize(): void;
131
-
132
- /**
133
- * @deprecated since 24.3 and will be removed in Vaadin 25.
134
- */
135
- ensureSubCacheForScaledIndex(scaledIndex: number): void;
136
-
137
- /**
138
- * @deprecated since 24.3 and will be removed in Vaadin 25.
139
- */
140
- get grid(): HTMLElement;
141
-
142
- /**
143
- * @deprecated since 24.3 and will be removed in Vaadin 25.
144
- */
145
- get itemCaches(): object;
146
- }
@@ -1,285 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright (c) 2021 - 2023 Vaadin Ltd.
4
- * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
- */
6
- import { getFlatIndexContext } from './helpers.js';
7
-
8
- /**
9
- * A class that stores items with their associated sub-caches.
10
- */
11
- export class Cache {
12
- /**
13
- * A context object.
14
- *
15
- * @type {{ isExpanded: (item: unknown) => boolean }}
16
- */
17
- context;
18
-
19
- /**
20
- * The number of items.
21
- *
22
- * @type {number}
23
- */
24
- size = 0;
25
-
26
- /**
27
- * The number of items to display per page.
28
- *
29
- * @type {number}
30
- */
31
- pageSize;
32
-
33
- /**
34
- * An array of cached items.
35
- *
36
- * @type {object[]}
37
- */
38
- items = [];
39
-
40
- /**
41
- * A map where the key is a requested page and the value is a callback
42
- * that will be called with data once the request is complete.
43
- *
44
- * @type {Record<number, Function>}
45
- */
46
- pendingRequests = {};
47
-
48
- /**
49
- * A map where the key is the index of an item in the `items` array
50
- * and the value is a sub-cache associated with that item.
51
- *
52
- * Note, it's intentionally defined as an object instead of a Map
53
- * to ensure that Object.entries() returns an array with keys sorted
54
- * in alphabetical order, rather than the order they were added.
55
- *
56
- * @type {Record<number, Cache>}
57
- * @private
58
- */
59
- __subCacheByIndex = {};
60
-
61
- /**
62
- * The total number of items, including items from expanded sub-caches.
63
- *
64
- * @type {number}
65
- * @private
66
- */
67
- __flatSize = 0;
68
-
69
- /**
70
- * @param {Cache['context']} context
71
- * @param {number} pageSize
72
- * @param {number | undefined} size
73
- * @param {Cache | undefined} parentCache
74
- * @param {number | undefined} parentCacheIndex
75
- */
76
- constructor(context, pageSize, size, parentCache, parentCacheIndex) {
77
- this.context = context;
78
- this.pageSize = pageSize;
79
- this.size = size || 0;
80
- this.parentCache = parentCache;
81
- this.parentCacheIndex = parentCacheIndex;
82
- this.__flatSize = size || 0;
83
- }
84
-
85
- /**
86
- * An item in the parent cache that the current cache is associated with.
87
- *
88
- * @return {object | undefined}
89
- */
90
- get parentItem() {
91
- return this.parentCache && this.parentCache.items[this.parentCacheIndex];
92
- }
93
-
94
- /**
95
- * An array of sub-caches sorted in the same order as their associated items
96
- * appear in the `items` array.
97
- *
98
- * @return {Cache[]}
99
- */
100
- get subCaches() {
101
- return Object.values(this.__subCacheByIndex);
102
- }
103
-
104
- /**
105
- * Whether the cache or any of its descendant caches have pending requests.
106
- *
107
- * @return {boolean}
108
- */
109
- get isLoading() {
110
- if (Object.keys(this.pendingRequests).length > 0) {
111
- return true;
112
- }
113
-
114
- return this.subCaches.some((subCache) => subCache.isLoading);
115
- }
116
-
117
- /**
118
- * The total number of items, including items from expanded sub-caches.
119
- *
120
- * @return {number}
121
- */
122
- get flatSize() {
123
- return this.__flatSize;
124
- }
125
-
126
- /**
127
- * The total number of items, including items from expanded sub-caches.
128
- *
129
- * @protected
130
- * @deprecated since 24.3 and will be removed in Vaadin 25.
131
- */
132
- get effectiveSize() {
133
- console.warn(
134
- '<vaadin-grid> The `effectiveSize` property of ItemCache is deprecated and will be removed in Vaadin 25.',
135
- );
136
- return this.flatSize;
137
- }
138
-
139
- /**
140
- * Recalculates the flattened size for the cache and its descendant caches recursively.
141
- */
142
- recalculateFlatSize() {
143
- this.__flatSize =
144
- !this.parentItem || this.context.isExpanded(this.parentItem)
145
- ? this.size +
146
- this.subCaches.reduce((total, subCache) => {
147
- subCache.recalculateFlatSize();
148
- return total + subCache.flatSize;
149
- }, 0)
150
- : 0;
151
- }
152
-
153
- /**
154
- * Adds an array of items corresponding to the given page
155
- * to the `items` array.
156
- *
157
- * @param {number} page
158
- * @param {object[]} items
159
- */
160
- setPage(page, items) {
161
- const startIndex = page * this.pageSize;
162
- items.forEach((item, i) => {
163
- this.items[startIndex + i] = item;
164
- });
165
- }
166
-
167
- /**
168
- * Retrieves the sub-cache associated with the item at the given index
169
- * in the `items` array.
170
- *
171
- * @param {number} index
172
- * @return {Cache | undefined}
173
- */
174
- getSubCache(index) {
175
- return this.__subCacheByIndex[index];
176
- }
177
-
178
- /**
179
- * Removes the sub-cache associated with the item at the given index
180
- * in the `items` array.
181
- *
182
- * @param {number} index
183
- */
184
- removeSubCache(index) {
185
- delete this.__subCacheByIndex[index];
186
- }
187
-
188
- /**
189
- * Removes all sub-caches.
190
- */
191
- removeSubCaches() {
192
- this.__subCacheByIndex = {};
193
- }
194
-
195
- /**
196
- * Creates and associates a sub-cache for the item at the given index
197
- * in the `items` array.
198
- *
199
- * @param {number} index
200
- * @return {Cache}
201
- */
202
- createSubCache(index) {
203
- const subCache = new Cache(this.context, this.pageSize, 0, this, index);
204
- this.__subCacheByIndex[index] = subCache;
205
- return subCache;
206
- }
207
-
208
- /**
209
- * Retrieves the flattened index corresponding to the given index
210
- * of an item in the `items` array.
211
- *
212
- * @param {number} index
213
- * @return {number}
214
- */
215
- getFlatIndex(index) {
216
- const clampedIndex = Math.max(0, Math.min(this.size - 1, index));
217
-
218
- return this.subCaches.reduce((prev, subCache) => {
219
- const index = subCache.parentCacheIndex;
220
- return clampedIndex > index ? prev + subCache.flatSize : prev;
221
- }, clampedIndex);
222
- }
223
-
224
- /**
225
- * @deprecated since 24.3 and will be removed in Vaadin 25.
226
- */
227
- getItemForIndex(index) {
228
- console.warn(
229
- '<vaadin-grid> The `getItemForIndex` method of ItemCache is deprecated and will be removed in Vaadin 25.',
230
- );
231
- const { item } = getFlatIndexContext(this, index);
232
- return item;
233
- }
234
-
235
- /**
236
- * @deprecated since 24.3 and will be removed in Vaadin 25.
237
- */
238
- getCacheAndIndex(index) {
239
- console.warn(
240
- '<vaadin-grid> The `getCacheAndIndex` method of ItemCache is deprecated and will be removed in Vaadin 25.',
241
- );
242
- const { cache, index: scaledIndex } = getFlatIndexContext(this, index);
243
- return { cache, scaledIndex };
244
- }
245
-
246
- /**
247
- * @deprecated since 24.3 and will be removed in Vaadin 25.
248
- */
249
- updateSize() {
250
- console.warn('<vaadin-grid> The `updateSize` method of ItemCache is deprecated and will be removed in Vaadin 25.');
251
- this.recalculateFlatSize();
252
- }
253
-
254
- /**
255
- * @deprecated since 24.3 and will be removed in Vaadin 25.
256
- */
257
- ensureSubCacheForScaledIndex(scaledIndex) {
258
- console.warn(
259
- '<vaadin-grid> The `ensureSubCacheForScaledIndex` method of ItemCache is deprecated and will be removed in Vaadin 25.',
260
- );
261
-
262
- if (!this.getSubCache(scaledIndex)) {
263
- const subCache = this.createSubCache(scaledIndex);
264
- this.context.__controller.__loadCachePage(subCache, 0);
265
- }
266
- }
267
-
268
- /**
269
- * @deprecated since 24.3 and will be removed in Vaadin 25.
270
- */
271
- get grid() {
272
- console.warn('<vaadin-grid> The `grid` property of ItemCache is deprecated and will be removed in Vaadin 25.');
273
- return this.context.__controller.host;
274
- }
275
-
276
- /**
277
- * @deprecated since 24.3 and will be removed in Vaadin 25.
278
- */
279
- get itemCaches() {
280
- console.warn(
281
- '<vaadin-grid> The `itemCaches` property of ItemCache is deprecated and will be removed in Vaadin 25.',
282
- );
283
- return this.__subCacheByIndex;
284
- }
285
- }
@@ -1,156 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright (c) 2021 - 2023 Vaadin Ltd.
4
- * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
- */
6
- import type { ReactiveController } from 'lit';
7
- import type { Cache } from './cache.js';
8
-
9
- type DataProviderDefaultParams = {
10
- page: number;
11
- pageSize: number;
12
- parentItem?: unknown;
13
- };
14
-
15
- export type DataProviderCallback<TItem> = (items: TItem[], size?: number) => void;
16
-
17
- export type DataProvider<TItem, TDataProviderParams extends Record<string, unknown>> = (
18
- params: DataProviderDefaultParams & TDataProviderParams,
19
- callback: DataProviderCallback<TItem>,
20
- ) => void;
21
-
22
- /**
23
- * A controller that stores and manages items loaded with a data provider.
24
- */
25
- export class DataProviderController<TItem, TDataProviderParams extends Record<string, unknown>>
26
- implements ReactiveController
27
- {
28
- /**
29
- * The controller host element.
30
- */
31
- host: HTMLElement;
32
-
33
- /**
34
- * A callback that returns data based on the passed params such as
35
- * `page`, `pageSize`, `parentItem`, etc.
36
- */
37
- dataProvider: DataProvider<TItem, TDataProviderParams>;
38
-
39
- /**
40
- * A callback that returns additional params that need to be passed
41
- * to the data provider callback with every request.
42
- */
43
- dataProviderParams: () => TDataProviderParams;
44
-
45
- /**
46
- * A number of items in the root cache.
47
- */
48
- size?: number;
49
-
50
- /**
51
- * A number of items to display per page.
52
- */
53
- pageSize: number;
54
-
55
- /**
56
- * A callback that returns whether the given item is expanded.
57
- */
58
- isExpanded: (item: TItem) => boolean;
59
-
60
- /**
61
- * A reference to the root cache instance.
62
- */
63
- rootCache: Cache<TItem>;
64
-
65
- constructor(
66
- host: HTMLElement,
67
- config: {
68
- size?: number;
69
- pageSize: number;
70
- isExpanded(item: TItem): boolean;
71
- dataProvider: DataProvider<TItem, TDataProviderParams>;
72
- dataProviderParams(): TDataProviderParams;
73
- },
74
- );
75
-
76
- /**
77
- * The total number of items, including items from expanded sub-caches.
78
- */
79
- get flatSize(): number;
80
-
81
- hostConnected(): void;
82
-
83
- hostDisconnected(): void;
84
-
85
- /**
86
- * Whether the root cache or any of its decendant caches have pending requests.
87
- */
88
- isLoading(): boolean;
89
-
90
- /**
91
- * Sets the size for the root cache and recalculates the flattened size.
92
- */
93
- setSize(size: number): void;
94
-
95
- /**
96
- * Sets the page size and clears the cache.
97
- */
98
- setPageSize(pageSize: number): void;
99
-
100
- /**
101
- * Sets the data provider callback and clears the cache.
102
- */
103
- setDataProvider(dataProvider: DataProvider<TItem, TDataProviderParams>): void;
104
-
105
- /**
106
- * Recalculates the flattened size.
107
- */
108
- recalculateFlatSize(): void;
109
-
110
- /**
111
- * Clears the cache.
112
- */
113
- clearCache(): void;
114
-
115
- /**
116
- * Returns context for the given flattened index, including:
117
- * - the corresponding cache
118
- * - the associated item (if loaded)
119
- * - the corresponding index in the cache's items array.
120
- * - the page containing the index.
121
- * - the cache level
122
- */
123
- getFlatIndexContext(flatIndex: number): {
124
- cache: Cache<TItem>;
125
- item: TItem | undefined;
126
- index: number;
127
- page: number;
128
- level: number;
129
- };
130
-
131
- /**
132
- * Returns the flattened index for the item that the given indexes point to.
133
- * Each index in the path array points to a sub-item of the previous index.
134
- * Using `Infinity` as an index will point to the last item on the level.
135
- */
136
- getFlatIndexByPath(path: number[]): number;
137
-
138
- /**
139
- * Requests the data provider to load the page with the item corresponding
140
- * to the given flattened index. If the item is already loaded, the method
141
- * returns immediatelly.
142
- */
143
- ensureFlatIndexLoaded(flatIndex: number): void;
144
-
145
- /**
146
- * Creates a sub-cache for the item corresponding to the given flattened index and
147
- * requests the data provider to load the first page into the created sub-cache.
148
- * If the sub-cache already exists, the method returns immediatelly.
149
- */
150
- ensureFlatIndexHierarchy(flatIndex: number): void;
151
-
152
- /**
153
- * Loads the first page into the root cache.
154
- */
155
- loadFirstPage(): void;
156
- }
@@ -1,248 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright (c) 2021 - 2023 Vaadin Ltd.
4
- * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
- */
6
- import { Cache } from './cache.js';
7
- import { getFlatIndexByPath, getFlatIndexContext } from './helpers.js';
8
-
9
- /**
10
- * A controller that stores and manages items loaded with a data provider.
11
- */
12
- export class DataProviderController extends EventTarget {
13
- /**
14
- * The controller host element.
15
- *
16
- * @param {HTMLElement}
17
- */
18
- host;
19
-
20
- /**
21
- * A callback that returns data based on the passed params such as
22
- * `page`, `pageSize`, `parentItem`, etc.
23
- */
24
- dataProvider;
25
-
26
- /**
27
- * A callback that returns additional params that need to be passed
28
- * to the data provider callback with every request.
29
- */
30
- dataProviderParams;
31
-
32
- /**
33
- * A number of items in the root cache.
34
- *
35
- * @type {number}
36
- */
37
- size;
38
-
39
- /**
40
- * A number of items to display per page.
41
- *
42
- * @type {number}
43
- */
44
- pageSize;
45
-
46
- /**
47
- * A callback that returns whether the given item is expanded.
48
- *
49
- * @type {(item: unknown) => boolean}
50
- */
51
- isExpanded;
52
-
53
- /**
54
- * A reference to the root cache instance.
55
- *
56
- * @param {Cache}
57
- */
58
- rootCache;
59
-
60
- constructor(host, { size, pageSize, isExpanded, dataProvider, dataProviderParams }) {
61
- super();
62
- this.host = host;
63
- this.size = size;
64
- this.pageSize = pageSize;
65
- this.isExpanded = isExpanded;
66
- this.dataProvider = dataProvider;
67
- this.dataProviderParams = dataProviderParams;
68
- this.rootCache = this.__createRootCache();
69
- }
70
-
71
- /**
72
- * The total number of items, including items from expanded sub-caches.
73
- */
74
- get flatSize() {
75
- return this.rootCache.flatSize;
76
- }
77
-
78
- /** @private */
79
- get __cacheContext() {
80
- return {
81
- isExpanded: this.isExpanded,
82
- // The controller instance is needed to ensure deprecated cache methods work.
83
- __controller: this,
84
- };
85
- }
86
-
87
- /**
88
- * Whether the root cache or any of its decendant caches have pending requests.
89
- *
90
- * @return {boolean}
91
- */
92
- isLoading() {
93
- return this.rootCache.isLoading;
94
- }
95
-
96
- /**
97
- * Sets the size for the root cache and recalculates the flattened size.
98
- *
99
- * @param {number} size
100
- */
101
- setSize(size) {
102
- this.size = size;
103
- this.rootCache.size = size;
104
- this.recalculateFlatSize();
105
- }
106
-
107
- /**
108
- * Sets the page size and clears the cache.
109
- *
110
- * @param {number} pageSize
111
- */
112
- setPageSize(pageSize) {
113
- this.pageSize = pageSize;
114
- this.clearCache();
115
- }
116
-
117
- /**
118
- * Sets the data provider callback and clears the cache.
119
- *
120
- * @type {Function}
121
- */
122
- setDataProvider(dataProvider) {
123
- this.dataProvider = dataProvider;
124
- this.clearCache();
125
- }
126
-
127
- /**
128
- * Recalculates the flattened size.
129
- */
130
- recalculateFlatSize() {
131
- this.rootCache.recalculateFlatSize();
132
- }
133
-
134
- /**
135
- * Clears the cache.
136
- */
137
- clearCache() {
138
- this.rootCache = this.__createRootCache();
139
- }
140
-
141
- /**
142
- * Returns context for the given flattened index, including:
143
- * - the corresponding cache
144
- * - the associated item (if loaded)
145
- * - the corresponding index in the cache's items array.
146
- * - the page containing the index.
147
- * - the cache level
148
- */
149
- getFlatIndexContext(flatIndex) {
150
- return getFlatIndexContext(this.rootCache, flatIndex);
151
- }
152
-
153
- /**
154
- * Returns the flattened index for the item that the given indexes point to.
155
- * Each index in the path array points to a sub-item of the previous index.
156
- * Using `Infinity` as an index will point to the last item on the level.
157
- *
158
- * @param {number[]} path
159
- * @return {number}
160
- */
161
- getFlatIndexByPath(path) {
162
- return getFlatIndexByPath(this.rootCache, path);
163
- }
164
-
165
- /**
166
- * Requests the data provider to load the page with the item corresponding
167
- * to the given flattened index. If the item is already loaded, the method
168
- * returns immediatelly.
169
- *
170
- * @param {number} flatIndex
171
- */
172
- ensureFlatIndexLoaded(flatIndex) {
173
- const { cache, page, item } = this.getFlatIndexContext(flatIndex);
174
-
175
- if (!item) {
176
- this.__loadCachePage(cache, page);
177
- }
178
- }
179
-
180
- /**
181
- * Creates a sub-cache for the item corresponding to the given flattened index and
182
- * requests the data provider to load the first page into the created sub-cache.
183
- * If the sub-cache already exists, the method returns immediatelly.
184
- *
185
- * @param {number} flatIndex
186
- */
187
- ensureFlatIndexHierarchy(flatIndex) {
188
- const { cache, item, index } = this.getFlatIndexContext(flatIndex);
189
-
190
- if (item && this.isExpanded(item) && !cache.getSubCache(index)) {
191
- const subCache = cache.createSubCache(index);
192
- this.__loadCachePage(subCache, 0);
193
- }
194
- }
195
-
196
- /**
197
- * Loads the first page into the root cache.
198
- */
199
- loadFirstPage() {
200
- this.__loadCachePage(this.rootCache, 0);
201
- }
202
-
203
- /** @private */
204
- __createRootCache() {
205
- return new Cache(this.__cacheContext, this.pageSize, this.size);
206
- }
207
-
208
- /** @private */
209
- __loadCachePage(cache, page) {
210
- if (!this.dataProvider || cache.pendingRequests[page]) {
211
- return;
212
- }
213
-
214
- let params = {
215
- page,
216
- pageSize: this.pageSize,
217
- parentItem: cache.parentItem,
218
- };
219
-
220
- if (this.dataProviderParams) {
221
- params = { ...params, ...this.dataProviderParams() };
222
- }
223
-
224
- const callback = (items, size) => {
225
- if (size !== undefined) {
226
- cache.size = size;
227
- } else if (params.parentItem) {
228
- cache.size = items.length;
229
- }
230
-
231
- cache.setPage(page, items);
232
-
233
- this.recalculateFlatSize();
234
-
235
- this.dispatchEvent(new CustomEvent('page-received'));
236
-
237
- delete cache.pendingRequests[page];
238
-
239
- this.dispatchEvent(new CustomEvent('page-loaded'));
240
- };
241
-
242
- cache.pendingRequests[page] = callback;
243
-
244
- this.dispatchEvent(new CustomEvent('page-requested'));
245
-
246
- this.dataProvider(params, callback);
247
- }
248
- }
@@ -1,32 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright (c) 2021 - 2023 Vaadin Ltd.
4
- * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
- */
6
-
7
- /**
8
- * Returns context for the given flattened index, including:
9
- * - the corresponding cache
10
- * - the associated item (if loaded)
11
- * - the corresponding index in the cache's items array.
12
- * - the page containing the index.
13
- * - the cache level
14
- */
15
- export function getFlatIndexContext(
16
- cache: Cache,
17
- flatIndex: number,
18
- level: number,
19
- ): {
20
- cache: Cache;
21
- item: unknown | undefined;
22
- index: number;
23
- page: number;
24
- level: number;
25
- };
26
-
27
- /**
28
- * Recursively returns the globally flat index of the item the given indexes point to.
29
- * Each index in the array points to a sub-item of the previous index.
30
- * Using `Infinity` as an index will point to the last item on the level.
31
- */
32
- export function getFlatIndexByPath(cache: Cache, path: number[], flatIndex: number): number;
@@ -1,63 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright (c) 2021 - 2023 Vaadin Ltd.
4
- * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
- */
6
-
7
- /**
8
- * Returns context for the given flattened index, including:
9
- * - the corresponding cache
10
- * - the associated item (if loaded)
11
- * - the corresponding index in the cache's items array.
12
- * - the page containing the index.
13
- * - the cache level
14
- *
15
- * @param {import('./cache.js').Cache} cache
16
- * @param {number} flatIndex
17
- * @return {{ cache: Cache, item: object | undefined, index: number, page: number, level: number }}
18
- */
19
- export function getFlatIndexContext(cache, flatIndex, level = 0) {
20
- let levelIndex = flatIndex;
21
-
22
- for (const subCache of cache.subCaches) {
23
- const index = subCache.parentCacheIndex;
24
- if (levelIndex <= index) {
25
- break;
26
- } else if (levelIndex <= index + subCache.flatSize) {
27
- return getFlatIndexContext(subCache, levelIndex - index - 1, level + 1);
28
- }
29
- levelIndex -= subCache.flatSize;
30
- }
31
-
32
- return {
33
- cache,
34
- item: cache.items[levelIndex],
35
- index: levelIndex,
36
- page: Math.floor(levelIndex / cache.pageSize),
37
- level,
38
- };
39
- }
40
-
41
- /**
42
- * Recursively returns the globally flat index of the item the given indexes point to.
43
- * Each index in the array points to a sub-item of the previous index.
44
- * Using `Infinity` as an index will point to the last item on the level.
45
- *
46
- * @param {Cache} cache
47
- * @param {number[]} path
48
- * @param {number} flatIndex
49
- * @return {number}
50
- */
51
- export function getFlatIndexByPath(cache, [levelIndex, ...subIndexes], flatIndex = 0) {
52
- if (levelIndex === Infinity) {
53
- // Treat Infinity as the last index on the level
54
- levelIndex = cache.size - 1;
55
- }
56
-
57
- const flatIndexOnLevel = cache.getFlatIndex(levelIndex);
58
- const subCache = cache.getSubCache(levelIndex);
59
- if (subCache && subCache.flatSize > 0 && subIndexes.length) {
60
- return getFlatIndexByPath(subCache, subIndexes, flatIndex + flatIndexOnLevel + 1);
61
- }
62
- return flatIndex + flatIndexOnLevel;
63
- }