@itwin/components-react 3.3.0-dev.54 → 3.3.0-dev.55

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.
@@ -3,27 +3,25 @@
3
3
  */
4
4
  import { Observable } from "rxjs/internal/Observable";
5
5
  /**
6
- * Controls observable subscription order and timing.
6
+ * Limits concurrent observable subscriptions to one.
7
7
  *
8
- * Scheduled observables are placed at the end of a queue. The scheduler always
9
- * subscribes to at most one observable from the queue and waits until observables
10
- * either complete or get unscheduled before removing them from the queue.
8
+ * Scheduled observables are placed at the end of a queue. Each queued observable is subscribed to and awaited until the
9
+ * completion.
11
10
  *
12
11
  * To schedule an observable, subscribe to the result of `scheduleSubscription()` call.
13
12
  * @internal
14
13
  */
15
14
  export declare class SubscriptionScheduler<T> {
16
- private _scheduledObservables;
17
15
  private _scheduler;
18
16
  constructor();
19
17
  /**
20
18
  * Schedules `source` for subscription in the current scheduler.
21
19
  *
22
- * The actual scheduling is performed when the returned observable is subscribed to.
23
- * To cancel, simply remove all subscribers from the returned observable.
20
+ * The actual scheduling is performed when the returned observable is subscribed to. To cancel, remove all subscribers
21
+ * from the returned observable.
24
22
  *
25
23
  * @param source Input observable for which to schedule a subscription.
26
- * @returns Multicast observable which mirrors `source`.
24
+ * @returns Hot observable which starts emitting `source` values after subscription.
27
25
  */
28
26
  scheduleSubscription(source: Observable<T>): Observable<T>;
29
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SubscriptionScheduler.d.ts","sourceRoot":"","sources":["../../../../src/components-react/common/SubscriptionScheduler.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAiBtD;;;;;;;;;GASG;AACH,qBAAa,qBAAqB,CAAC,CAAC;IAElC,OAAO,CAAC,qBAAqB,CAA2C;IAGxE,OAAO,CAAC,UAAU,CAA2C;;IA0B7D;;;;;;;;OAQG;IACI,oBAAoB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;CA8ClE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,SAAS,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAErH"}
1
+ {"version":3,"file":"SubscriptionScheduler.d.ts","sourceRoot":"","sources":["../../../../src/components-react/common/SubscriptionScheduler.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAkBtD;;;;;;;;GAQG;AACH,qBAAa,qBAAqB,CAAC,CAAC;IAClC,OAAO,CAAC,UAAU,CAA2C;;IAwB7D;;;;;;;;OAQG;IACI,oBAAoB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;CASlE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,SAAS,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAErH"}
@@ -8,8 +8,9 @@
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.scheduleSubscription = exports.SubscriptionScheduler = void 0;
11
- const BehaviorSubject_1 = require("rxjs/internal/BehaviorSubject");
12
11
  const defer_1 = require("rxjs/internal/observable/defer");
12
+ const empty_1 = require("rxjs/internal/observable/empty");
13
+ const iif_1 = require("rxjs/internal/observable/iif");
13
14
  const finalize_1 = require("rxjs/internal/operators/finalize");
14
15
  const mergeMap_1 = require("rxjs/internal/operators/mergeMap");
15
16
  const observeOn_1 = require("rxjs/internal/operators/observeOn");
@@ -17,87 +18,52 @@ const onErrorResumeNext_1 = require("rxjs/internal/operators/onErrorResumeNext")
17
18
  const publish_1 = require("rxjs/internal/operators/publish");
18
19
  const refCount_1 = require("rxjs/internal/operators/refCount");
19
20
  const subscribeOn_1 = require("rxjs/internal/operators/subscribeOn");
20
- const switchAll_1 = require("rxjs/internal/operators/switchAll");
21
21
  const asap_1 = require("rxjs/internal/scheduler/asap");
22
22
  const queue_1 = require("rxjs/internal/scheduler/queue");
23
23
  const Subject_1 = require("rxjs/internal/Subject");
24
24
  const MAX_CONCURRENT_SUBSCRIPTIONS = 1;
25
25
  /**
26
- * Controls observable subscription order and timing.
26
+ * Limits concurrent observable subscriptions to one.
27
27
  *
28
- * Scheduled observables are placed at the end of a queue. The scheduler always
29
- * subscribes to at most one observable from the queue and waits until observables
30
- * either complete or get unscheduled before removing them from the queue.
28
+ * Scheduled observables are placed at the end of a queue. Each queued observable is subscribed to and awaited until the
29
+ * completion.
31
30
  *
32
31
  * To schedule an observable, subscribe to the result of `scheduleSubscription()` call.
33
32
  * @internal
34
33
  */
35
34
  class SubscriptionScheduler {
36
35
  constructor() {
37
- // Maps source observables to scheduled observables.
38
- this._scheduledObservables = new Map();
39
- // Subject that does the actual subscription scheduling
40
36
  this._scheduler = new Subject_1.Subject();
41
37
  this._scheduler
42
- .pipe(
43
- // Process all observables one by one in sequence
44
- (0, mergeMap_1.mergeMap)((sourceObservable) => sourceObservable.pipe(
38
+ .pipe((0, mergeMap_1.mergeMap)((sourceObservable) => sourceObservable.pipe(
45
39
  // Connect the observable
46
40
  (0, refCount_1.refCount)(),
47
- // Guard against stack overflow when a lot of observables are scheduled.
48
- // Without this operation `mergeMap` will process each observable
49
- // that is present in the pipeline recursively.
41
+ // Guard against stack overflow when a lot of observables are scheduled. Without this operation `mergeMap`
42
+ // will process each observable that is present in the pipeline recursively.
50
43
  (0, observeOn_1.observeOn)(queue_1.queueScheduler),
51
- // Make sure that there is enough time to subscribe to a scheduled observable multiple times if needed
44
+ // Delay the connection until another event loop task
52
45
  (0, subscribeOn_1.subscribeOn)(asap_1.asapScheduler),
53
- // On error, proceed to the next observable. Outside subscribers will still receive an error notification.
46
+ // Ignore errors in this pipeline without suppressing them for other subscribers
54
47
  (0, onErrorResumeNext_1.onErrorResumeNext)()), MAX_CONCURRENT_SUBSCRIPTIONS))
55
- // Start the scheduler and wait for observables to be scheduled
48
+ // Start consuming scheduled observables
56
49
  .subscribe();
57
50
  }
58
51
  /**
59
52
  * Schedules `source` for subscription in the current scheduler.
60
53
  *
61
- * The actual scheduling is performed when the returned observable is subscribed to.
62
- * To cancel, simply remove all subscribers from the returned observable.
54
+ * The actual scheduling is performed when the returned observable is subscribed to. To cancel, remove all subscribers
55
+ * from the returned observable.
63
56
  *
64
57
  * @param source Input observable for which to schedule a subscription.
65
- * @returns Multicast observable which mirrors `source`.
58
+ * @returns Hot observable which starts emitting `source` values after subscription.
66
59
  */
67
60
  scheduleSubscription(source) {
68
- // On subscription, determine which observable to return
69
61
  return (0, defer_1.defer)(() => {
70
- // If this observable has already been scheduled, return the scheduled observable
71
- let scheduledObservable = this._scheduledObservables.get(source);
72
- if (scheduledObservable) {
73
- return scheduledObservable;
74
- }
75
- // Create a subject which emits observable sources
76
- const sourceSubject = new BehaviorSubject_1.BehaviorSubject(source.pipe(
77
- // When source completes, allow scheduler to move on to the next observable
78
- (0, finalize_1.finalize)(() => {
79
- sourceSubject.complete();
80
- })));
81
- // Create an observable which will be passed to the scheduler
82
- const connectableObservable = (0, publish_1.publish)()(sourceSubject.pipe(
83
- // Unsubscribe from previous observable before subscribing to the next one
84
- (0, switchAll_1.switchAll)()));
85
- // Create an observable which will be cached and returned
86
- scheduledObservable = connectableObservable.pipe((0, finalize_1.finalize)(() => {
87
- // Invalidate cached scheduled observable
88
- this._scheduledObservables.delete(source);
89
- // Allow scheduler to move on to the next observable
90
- sourceSubject.complete();
91
- }),
92
- // Multicast values
93
- (0, publish_1.publish)(),
94
- // Dispose the shared subscription when there are no subscribers left
95
- (0, refCount_1.refCount)());
96
- // Cache the scheduled observable
97
- this._scheduledObservables.set(source, scheduledObservable);
98
- // Schedule the subscription
62
+ let unsubscribed = false;
63
+ // Do not subscribe to source observable if it was unsubscribed from before being processed by the scheduler
64
+ const connectableObservable = (0, iif_1.iif)(() => unsubscribed, empty_1.EMPTY, source).pipe((0, publish_1.publish)());
99
65
  this._scheduler.next(connectableObservable);
100
- return scheduledObservable;
66
+ return connectableObservable.pipe((0, finalize_1.finalize)(() => unsubscribed = true));
101
67
  });
102
68
  }
103
69
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SubscriptionScheduler.js","sourceRoot":"","sources":["../../../../src/components-react/common/SubscriptionScheduler.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,mEAAgE;AAGhE,0DAAuD;AACvD,+DAA4D;AAC5D,+DAA4D;AAC5D,iEAA8D;AAC9D,iFAA8E;AAC9E,6DAA0D;AAC1D,+DAA4D;AAC5D,qEAAkE;AAClE,iEAA8D;AAC9D,uDAA6D;AAC7D,yDAA+D;AAC/D,mDAAgD;AAEhD,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAEvC;;;;;;;;;GASG;AACH,MAAa,qBAAqB;IAOhC;QANA,oDAAoD;QAC5C,0BAAqB,GAAG,IAAI,GAAG,EAAgC,CAAC;QAExE,uDAAuD;QAC/C,eAAU,GAAG,IAAI,iBAAO,EAA4B,CAAC;QAG3D,IAAI,CAAC,UAAU;aACZ,IAAI;QACH,iDAAiD;QACjD,IAAA,mBAAQ,EACN,CAAC,gBAAgB,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI;QACzC,yBAAyB;QACzB,IAAA,mBAAQ,GAAE;QACV,wEAAwE;QACxE,iEAAiE;QACjE,+CAA+C;QAC/C,IAAA,qBAAS,EAAC,sBAAc,CAAC;QACzB,sGAAsG;QACtG,IAAA,yBAAW,EAAC,oBAAa,CAAC;QAC1B,0GAA0G;QAC1G,IAAA,qCAAiB,GAAE,CACpB,EACD,4BAA4B,CAC7B,CACF;YACD,+DAA+D;aAC9D,SAAS,EAAE,CAAC;IACjB,CAAC;IAED;;;;;;;;OAQG;IACI,oBAAoB,CAAC,MAAqB;QAC/C,wDAAwD;QACxD,OAAO,IAAA,aAAK,EAAC,GAAG,EAAE;YAChB,iFAAiF;YACjF,IAAI,mBAAmB,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACjE,IAAI,mBAAmB,EAAE;gBACvB,OAAO,mBAAmB,CAAC;aAC5B;YAED,kDAAkD;YAClD,MAAM,aAAa,GAAG,IAAI,iCAAe,CAAgB,MAAM,CAAC,IAAI;YAClE,2EAA2E;YAC3E,IAAA,mBAAQ,EAAC,GAAG,EAAE;gBACZ,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC3B,CAAC,CAAC,CACH,CAAC,CAAC;YAEH,6DAA6D;YAC7D,MAAM,qBAAqB,GAAG,IAAA,iBAAO,GAAK,CAAC,aAAa,CAAC,IAAI;YAC3D,0EAA0E;YAC1E,IAAA,qBAAS,GAAE,CACZ,CAAC,CAAC;YAEH,yDAAyD;YACzD,mBAAmB,GAAG,qBAAqB,CAAC,IAAI,CAC9C,IAAA,mBAAQ,EAAC,GAAG,EAAE;gBACZ,yCAAyC;gBACzC,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAE1C,oDAAoD;gBACpD,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC3B,CAAC,CAAC;YACF,mBAAmB;YACnB,IAAA,iBAAO,GAAE;YACT,qEAAqE;YACrE,IAAA,mBAAQ,GAAE,CACX,CAAC;YAEF,iCAAiC;YACjC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;YAE5D,4BAA4B;YAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAC5C,OAAO,mBAAmB,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAtFD,sDAsFC;AAED;;;GAGG;AACH,SAAgB,oBAAoB,CAAI,SAAmC;IACzE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC5D,CAAC;AAFD,oDAEC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Common\r\n */\r\n\r\nimport { BehaviorSubject } from \"rxjs/internal/BehaviorSubject\";\r\nimport { Observable } from \"rxjs/internal/Observable\";\r\nimport { ConnectableObservable } from \"rxjs/internal/observable/ConnectableObservable\";\r\nimport { defer } from \"rxjs/internal/observable/defer\";\r\nimport { finalize } from \"rxjs/internal/operators/finalize\";\r\nimport { mergeMap } from \"rxjs/internal/operators/mergeMap\";\r\nimport { observeOn } from \"rxjs/internal/operators/observeOn\";\r\nimport { onErrorResumeNext } from \"rxjs/internal/operators/onErrorResumeNext\";\r\nimport { publish } from \"rxjs/internal/operators/publish\";\r\nimport { refCount } from \"rxjs/internal/operators/refCount\";\r\nimport { subscribeOn } from \"rxjs/internal/operators/subscribeOn\";\r\nimport { switchAll } from \"rxjs/internal/operators/switchAll\";\r\nimport { asapScheduler } from \"rxjs/internal/scheduler/asap\";\r\nimport { queueScheduler } from \"rxjs/internal/scheduler/queue\";\r\nimport { Subject } from \"rxjs/internal/Subject\";\r\n\r\nconst MAX_CONCURRENT_SUBSCRIPTIONS = 1;\r\n\r\n/**\r\n * Controls observable subscription order and timing.\r\n *\r\n * Scheduled observables are placed at the end of a queue. The scheduler always\r\n * subscribes to at most one observable from the queue and waits until observables\r\n * either complete or get unscheduled before removing them from the queue.\r\n *\r\n * To schedule an observable, subscribe to the result of `scheduleSubscription()` call.\r\n * @internal\r\n */\r\nexport class SubscriptionScheduler<T> {\r\n // Maps source observables to scheduled observables.\r\n private _scheduledObservables = new Map<Observable<T>, Observable<T>>();\r\n\r\n // Subject that does the actual subscription scheduling\r\n private _scheduler = new Subject<ConnectableObservable<T>>();\r\n\r\n constructor() {\r\n this._scheduler\r\n .pipe(\r\n // Process all observables one by one in sequence\r\n mergeMap(\r\n (sourceObservable) => sourceObservable.pipe(\r\n // Connect the observable\r\n refCount(),\r\n // Guard against stack overflow when a lot of observables are scheduled.\r\n // Without this operation `mergeMap` will process each observable\r\n // that is present in the pipeline recursively.\r\n observeOn(queueScheduler),\r\n // Make sure that there is enough time to subscribe to a scheduled observable multiple times if needed\r\n subscribeOn(asapScheduler),\r\n // On error, proceed to the next observable. Outside subscribers will still receive an error notification.\r\n onErrorResumeNext(),\r\n ),\r\n MAX_CONCURRENT_SUBSCRIPTIONS,\r\n ),\r\n )\r\n // Start the scheduler and wait for observables to be scheduled\r\n .subscribe();\r\n }\r\n\r\n /**\r\n * Schedules `source` for subscription in the current scheduler.\r\n *\r\n * The actual scheduling is performed when the returned observable is subscribed to.\r\n * To cancel, simply remove all subscribers from the returned observable.\r\n *\r\n * @param source Input observable for which to schedule a subscription.\r\n * @returns Multicast observable which mirrors `source`.\r\n */\r\n public scheduleSubscription(source: Observable<T>): Observable<T> {\r\n // On subscription, determine which observable to return\r\n return defer(() => {\r\n // If this observable has already been scheduled, return the scheduled observable\r\n let scheduledObservable = this._scheduledObservables.get(source);\r\n if (scheduledObservable) {\r\n return scheduledObservable;\r\n }\r\n\r\n // Create a subject which emits observable sources\r\n const sourceSubject = new BehaviorSubject<Observable<T>>(source.pipe(\r\n // When source completes, allow scheduler to move on to the next observable\r\n finalize(() => {\r\n sourceSubject.complete();\r\n }),\r\n ));\r\n\r\n // Create an observable which will be passed to the scheduler\r\n const connectableObservable = publish<T>()(sourceSubject.pipe(\r\n // Unsubscribe from previous observable before subscribing to the next one\r\n switchAll(),\r\n ));\r\n\r\n // Create an observable which will be cached and returned\r\n scheduledObservable = connectableObservable.pipe(\r\n finalize(() => {\r\n // Invalidate cached scheduled observable\r\n this._scheduledObservables.delete(source);\r\n\r\n // Allow scheduler to move on to the next observable\r\n sourceSubject.complete();\r\n }),\r\n // Multicast values\r\n publish(),\r\n // Dispose the shared subscription when there are no subscribers left\r\n refCount(),\r\n );\r\n\r\n // Cache the scheduled observable\r\n this._scheduledObservables.set(source, scheduledObservable);\r\n\r\n // Schedule the subscription\r\n this._scheduler.next(connectableObservable);\r\n return scheduledObservable;\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Helper function for use as a `pipe()` argument with `rxjs` observables.\r\n * @internal\r\n */\r\nexport function scheduleSubscription<T>(scheduler: SubscriptionScheduler<T>): (source: Observable<T>) => Observable<T> {\r\n return (source) => scheduler.scheduleSubscription(source);\r\n}\r\n"]}
1
+ {"version":3,"file":"SubscriptionScheduler.js","sourceRoot":"","sources":["../../../../src/components-react/common/SubscriptionScheduler.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAIH,0DAAuD;AACvD,0DAAuD;AACvD,sDAAmD;AACnD,+DAA4D;AAC5D,+DAA4D;AAC5D,iEAA8D;AAC9D,iFAA8E;AAC9E,6DAA0D;AAC1D,+DAA4D;AAC5D,qEAAkE;AAClE,uDAA6D;AAC7D,yDAA+D;AAC/D,mDAAgD;AAEhD,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAEvC;;;;;;;;GAQG;AACH,MAAa,qBAAqB;IAGhC;QAFQ,eAAU,GAAG,IAAI,iBAAO,EAA4B,CAAC;QAG3D,IAAI,CAAC,UAAU;aACZ,IAAI,CACH,IAAA,mBAAQ,EACN,CAAC,gBAAgB,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI;QACzC,yBAAyB;QACzB,IAAA,mBAAQ,GAAE;QACV,0GAA0G;QAC1G,4EAA4E;QAC5E,IAAA,qBAAS,EAAC,sBAAc,CAAC;QACzB,qDAAqD;QACrD,IAAA,yBAAW,EAAC,oBAAa,CAAC;QAC1B,gFAAgF;QAChF,IAAA,qCAAiB,GAAE,CACpB,EACD,4BAA4B,CAC7B,CACF;YACD,wCAAwC;aACvC,SAAS,EAAE,CAAC;IACjB,CAAC;IAED;;;;;;;;OAQG;IACI,oBAAoB,CAAC,MAAqB;QAC/C,OAAO,IAAA,aAAK,EAAC,GAAG,EAAE;YAChB,IAAI,YAAY,GAAG,KAAK,CAAC;YACzB,4GAA4G;YAC5G,MAAM,qBAAqB,GAAG,IAAA,SAAG,EAAC,GAAG,EAAE,CAAC,YAAY,EAAE,aAAK,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAA,iBAAO,GAAE,CAA6B,CAAC;YACjH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAC5C,OAAO,qBAAqB,CAAC,IAAI,CAAC,IAAA,mBAAQ,EAAC,GAAG,EAAE,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AA3CD,sDA2CC;AAED;;;GAGG;AACH,SAAgB,oBAAoB,CAAI,SAAmC;IACzE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC5D,CAAC;AAFD,oDAEC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Common\r\n */\r\n\r\nimport { Observable } from \"rxjs/internal/Observable\";\r\nimport { ConnectableObservable } from \"rxjs/internal/observable/ConnectableObservable\";\r\nimport { defer } from \"rxjs/internal/observable/defer\";\r\nimport { EMPTY } from \"rxjs/internal/observable/empty\";\r\nimport { iif } from \"rxjs/internal/observable/iif\";\r\nimport { finalize } from \"rxjs/internal/operators/finalize\";\r\nimport { mergeMap } from \"rxjs/internal/operators/mergeMap\";\r\nimport { observeOn } from \"rxjs/internal/operators/observeOn\";\r\nimport { onErrorResumeNext } from \"rxjs/internal/operators/onErrorResumeNext\";\r\nimport { publish } from \"rxjs/internal/operators/publish\";\r\nimport { refCount } from \"rxjs/internal/operators/refCount\";\r\nimport { subscribeOn } from \"rxjs/internal/operators/subscribeOn\";\r\nimport { asapScheduler } from \"rxjs/internal/scheduler/asap\";\r\nimport { queueScheduler } from \"rxjs/internal/scheduler/queue\";\r\nimport { Subject } from \"rxjs/internal/Subject\";\r\n\r\nconst MAX_CONCURRENT_SUBSCRIPTIONS = 1;\r\n\r\n/**\r\n * Limits concurrent observable subscriptions to one.\r\n *\r\n * Scheduled observables are placed at the end of a queue. Each queued observable is subscribed to and awaited until the\r\n * completion.\r\n *\r\n * To schedule an observable, subscribe to the result of `scheduleSubscription()` call.\r\n * @internal\r\n */\r\nexport class SubscriptionScheduler<T> {\r\n private _scheduler = new Subject<ConnectableObservable<T>>();\r\n\r\n constructor() {\r\n this._scheduler\r\n .pipe(\r\n mergeMap(\r\n (sourceObservable) => sourceObservable.pipe(\r\n // Connect the observable\r\n refCount(),\r\n // Guard against stack overflow when a lot of observables are scheduled. Without this operation `mergeMap`\r\n // will process each observable that is present in the pipeline recursively.\r\n observeOn(queueScheduler),\r\n // Delay the connection until another event loop task\r\n subscribeOn(asapScheduler),\r\n // Ignore errors in this pipeline without suppressing them for other subscribers\r\n onErrorResumeNext(),\r\n ),\r\n MAX_CONCURRENT_SUBSCRIPTIONS,\r\n ),\r\n )\r\n // Start consuming scheduled observables\r\n .subscribe();\r\n }\r\n\r\n /**\r\n * Schedules `source` for subscription in the current scheduler.\r\n *\r\n * The actual scheduling is performed when the returned observable is subscribed to. To cancel, remove all subscribers\r\n * from the returned observable.\r\n *\r\n * @param source Input observable for which to schedule a subscription.\r\n * @returns Hot observable which starts emitting `source` values after subscription.\r\n */\r\n public scheduleSubscription(source: Observable<T>): Observable<T> {\r\n return defer(() => {\r\n let unsubscribed = false;\r\n // Do not subscribe to source observable if it was unsubscribed from before being processed by the scheduler\r\n const connectableObservable = iif(() => unsubscribed, EMPTY, source).pipe(publish()) as ConnectableObservable<T>;\r\n this._scheduler.next(connectableObservable);\r\n return connectableObservable.pipe(finalize(() => unsubscribed = true));\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Helper function for use as a `pipe()` argument with `rxjs` observables.\r\n * @internal\r\n */\r\nexport function scheduleSubscription<T>(scheduler: SubscriptionScheduler<T>): (source: Observable<T>) => Observable<T> {\r\n return (source) => scheduler.scheduleSubscription(source);\r\n}\r\n"]}
@@ -71,6 +71,7 @@ export declare abstract class AbstractTreeNodeLoaderWithProvider<TDataProvider e
71
71
  export declare class TreeNodeLoader<TDataProvider extends TreeDataProvider> extends AbstractTreeNodeLoaderWithProvider<TDataProvider> implements IDisposable {
72
72
  private _treeDataSource;
73
73
  private _activeRequests;
74
+ private _scheduler;
74
75
  constructor(dataProvider: TDataProvider, modelSource: TreeModelSource);
75
76
  /** Disposes data source */
76
77
  dispose(): void;
@@ -78,16 +79,18 @@ export declare class TreeNodeLoader<TDataProvider extends TreeDataProvider> exte
78
79
  * Schedules to load children of node and returns an Observable.
79
80
  * @note It does not start loading node until '.subscribe()' is called on returned Observable.
80
81
  */
81
- protected load(parentNode: TreeModelNode | TreeModelRootNode): Observable<LoadedNodeHierarchy>;
82
- private loadForParent;
82
+ loadNode(parent: TreeModelNode | TreeModelRootNode, _childIndex?: number): Observable<TreeNodeLoadResult>;
83
+ protected load(): Observable<LoadedNodeHierarchy>;
83
84
  }
84
85
  /**
85
86
  * Default paged tree node loader with `TreeDataProvider` implementation.
86
87
  * @public
87
88
  */
88
89
  export declare class PagedTreeNodeLoader<TDataProvider extends TreeDataProvider> extends AbstractTreeNodeLoaderWithProvider<TDataProvider> implements IDisposable {
89
- private _pageLoader;
90
+ private _treeDataSource;
90
91
  private _pageSize;
92
+ private _activePageRequests;
93
+ private _scheduler;
91
94
  constructor(dataProvider: TDataProvider, modelSource: TreeModelSource, pageSize: number);
92
95
  /** Disposes data source */
93
96
  dispose(): void;
@@ -97,7 +100,8 @@ export declare class PagedTreeNodeLoader<TDataProvider extends TreeDataProvider>
97
100
  * Schedules to load one page of node children and returns an Observable.
98
101
  * @note It does not start loading node page until '.subscribe()' is called on returned Observable.
99
102
  */
100
- protected load(parentNode: TreeModelNode | TreeModelRootNode, childIndex: number): Observable<LoadedNodeHierarchy>;
103
+ loadNode(parent: TreeModelNode | TreeModelRootNode, childIndex: number): Observable<TreeNodeLoadResult>;
104
+ protected load(): Observable<LoadedNodeHierarchy>;
101
105
  }
102
106
  /**
103
107
  * Data structure that describes hierarchy loaded for parent node.
@@ -1 +1 @@
1
- {"version":3,"file":"TreeNodeLoader.d.ts","sourceRoot":"","sources":["../../../../../src/components-react/tree/controlled/TreeNodeLoader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TreeNodeLoader.d.ts","sourceRoot":"","sources":["../../../../../src/components-react/tree/controlled/TreeNodeLoader.ts"],"names":[],"mappings":"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"}
@@ -73,6 +73,7 @@ class TreeNodeLoader extends AbstractTreeNodeLoaderWithProvider {
73
73
  constructor(dataProvider, modelSource) {
74
74
  super(modelSource, dataProvider);
75
75
  this._activeRequests = new Map();
76
+ this._scheduler = new SubscriptionScheduler_1.SubscriptionScheduler();
76
77
  this._treeDataSource = new TreeDataSource(dataProvider);
77
78
  }
78
79
  /** Disposes data source */
@@ -81,19 +82,26 @@ class TreeNodeLoader extends AbstractTreeNodeLoaderWithProvider {
81
82
  * Schedules to load children of node and returns an Observable.
82
83
  * @note It does not start loading node until '.subscribe()' is called on returned Observable.
83
84
  */
84
- load(parentNode) {
85
- const parentItem = (0, TreeModel_1.isTreeModelNode)(parentNode) ? parentNode.item : undefined;
86
- return this.loadForParent(parentItem, parentNode.numChildren === undefined);
85
+ loadNode(parent, _childIndex) {
86
+ return (0, defer_1.defer)(() => {
87
+ const parentItem = (0, TreeModel_1.isTreeModelNode)(parent) ? parent.item : undefined;
88
+ const parentId = parentItem === null || parentItem === void 0 ? void 0 : parentItem.id;
89
+ const activeRequest = this._activeRequests.get(parentId);
90
+ if (activeRequest) {
91
+ return activeRequest;
92
+ }
93
+ const newRequest = requestLoadedHierarchy(parentItem, this._treeDataSource, 0, 0, parent.numChildren === undefined)
94
+ .pipe((0, map_1.map)((loadedHierarchy) => {
95
+ this.updateModel(loadedHierarchy);
96
+ return { loadedNodes: collectTreeNodeItems(loadedHierarchy.hierarchyItems) };
97
+ }), (0, SubscriptionScheduler_1.scheduleSubscription)(this._scheduler), (0, finalize_1.finalize)(() => this._activeRequests.delete(parentId)));
98
+ this._activeRequests.set(parentId, newRequest);
99
+ return newRequest;
100
+ });
87
101
  }
88
- loadForParent(parentItem, requestNumChildren) {
89
- const parentId = parentItem && parentItem.id;
90
- const activeRequest = this._activeRequests.get(parentId);
91
- if (activeRequest) {
92
- return activeRequest;
93
- }
94
- const newRequest = requestLoadedHierarchy(parentItem, this._treeDataSource, 0, 0, requestNumChildren, () => { this._activeRequests.delete(parentId); });
95
- this._activeRequests.set(parentId, newRequest);
96
- return newRequest;
102
+ // istanbul ignore next
103
+ load() {
104
+ throw new Error("Method not implemented.");
97
105
  }
98
106
  }
99
107
  exports.TreeNodeLoader = TreeNodeLoader;
@@ -104,51 +112,52 @@ exports.TreeNodeLoader = TreeNodeLoader;
104
112
  class PagedTreeNodeLoader extends AbstractTreeNodeLoaderWithProvider {
105
113
  constructor(dataProvider, modelSource, pageSize) {
106
114
  super(modelSource, dataProvider);
107
- this._pageLoader = new PageLoader(new TreeDataSource(dataProvider), pageSize);
115
+ this._treeDataSource = new TreeDataSource(dataProvider);
108
116
  this._pageSize = pageSize;
117
+ this._activePageRequests = new Map();
118
+ this._scheduler = new SubscriptionScheduler_1.SubscriptionScheduler();
109
119
  }
110
120
  /** Disposes data source */
111
- dispose() { this._pageLoader.dispose(); }
121
+ dispose() { this._treeDataSource.dispose(); }
112
122
  /** Returns page size used by tree node loader. */
113
123
  get pageSize() { return this._pageSize; }
114
124
  /**
115
125
  * Schedules to load one page of node children and returns an Observable.
116
126
  * @note It does not start loading node page until '.subscribe()' is called on returned Observable.
117
127
  */
118
- load(parentNode, childIndex) {
119
- const parentItem = (0, TreeModel_1.isTreeModelNode)(parentNode) ? parentNode.item : undefined;
120
- return this._pageLoader.loadPageWithItem(parentItem, childIndex, parentNode.numChildren === undefined);
121
- }
122
- }
123
- exports.PagedTreeNodeLoader = PagedTreeNodeLoader;
124
- class PageLoader {
125
- constructor(dataSource, pageSize) {
126
- this._activePageRequests = new Map();
127
- this._dataSource = dataSource;
128
- this._pageSize = pageSize;
129
- }
130
- dispose() { this._dataSource.dispose(); }
131
- loadPageWithItem(parentItem, itemIndex, requestNumChildren) {
132
- const parentId = parentItem && parentItem.id;
133
- const parentPageRequests = this._activePageRequests.get(parentId) || new Map();
134
- const page = Math.trunc(itemIndex / this._pageSize);
135
- const activeRequest = parentPageRequests.get(page);
136
- if (activeRequest) {
137
- return activeRequest;
138
- }
139
- const startIndex = page * this._pageSize;
140
- const newRequest = requestLoadedHierarchy(parentItem, this._dataSource, startIndex, this._pageSize, requestNumChildren, () => {
141
- parentPageRequests.delete(page);
142
- if (parentPageRequests.size === 0) {
143
- this._activePageRequests.delete(parentId);
128
+ loadNode(parent, childIndex) {
129
+ return (0, defer_1.defer)(() => {
130
+ var _a;
131
+ const parentItem = (0, TreeModel_1.isTreeModelNode)(parent) ? parent.item : undefined;
132
+ const parentId = parentItem === null || parentItem === void 0 ? void 0 : parentItem.id;
133
+ const parentPageRequests = (_a = this._activePageRequests.get(parentId)) !== null && _a !== void 0 ? _a : new Map();
134
+ const page = Math.trunc(childIndex / this._pageSize);
135
+ const activeRequest = parentPageRequests.get(page);
136
+ if (activeRequest) {
137
+ return activeRequest;
144
138
  }
139
+ const startIndex = page * this._pageSize;
140
+ const newRequest = requestLoadedHierarchy(parentItem, this._treeDataSource, startIndex, this._pageSize, parent.numChildren === undefined).pipe((0, map_1.map)((loadedHierarchy) => {
141
+ this.updateModel(loadedHierarchy);
142
+ return { loadedNodes: collectTreeNodeItems(loadedHierarchy.hierarchyItems) };
143
+ }), (0, SubscriptionScheduler_1.scheduleSubscription)(this._scheduler), (0, finalize_1.finalize)(() => {
144
+ parentPageRequests.delete(page);
145
+ if (parentPageRequests.size === 0) {
146
+ this._activePageRequests.delete(parentId);
147
+ }
148
+ }));
149
+ parentPageRequests.set(page, newRequest);
150
+ this._activePageRequests.set(parentId, parentPageRequests);
151
+ return newRequest;
145
152
  });
146
- parentPageRequests.set(page, newRequest);
147
- this._activePageRequests.set(parentId, parentPageRequests);
148
- return newRequest;
153
+ }
154
+ // istanbul ignore next
155
+ load() {
156
+ throw new Error("Method not implemented.");
149
157
  }
150
158
  }
151
- function requestLoadedHierarchy(parentItem, dataSource, start, take, requestNumChildren, finalizeCallback) {
159
+ exports.PagedTreeNodeLoader = PagedTreeNodeLoader;
160
+ function requestLoadedHierarchy(parentItem, dataSource, start, take, requestNumChildren) {
152
161
  const parentId = parentItem && parentItem.id;
153
162
  return dataSource.requestItems(parentItem, start, take, requestNumChildren)
154
163
  .pipe((0, concatMap_1.concatMap)(({ numChildren, loadedItems }) => loadHierarchy(loadedItems, dataSource, take)
@@ -157,7 +166,7 @@ function requestLoadedHierarchy(parentItem, dataSource, start, take, requestNumC
157
166
  offset: start,
158
167
  hierarchyItems,
159
168
  numChildren,
160
- })))), (0, finalize_1.finalize)(finalizeCallback), (0, publish_1.publish)(), (0, refCount_1.refCount)());
169
+ })))));
161
170
  }
162
171
  function loadHierarchy(rootItems, dataSource, take) {
163
172
  return (0, from_1.from)(rootItems)
@@ -1 +1 @@
1
- {"version":3,"file":"TreeNodeLoader.js","sourceRoot":"","sources":["../../../../../src/components-react/tree/controlled/TreeNodeLoader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Tree\r\n */\r\n\r\nimport { Observable as RxjsObservable } from \"rxjs/internal/Observable\";\r\nimport { defer } from \"rxjs/internal/observable/defer\";\r\nimport { from } from \"rxjs/internal/observable/from\";\r\nimport { of } from \"rxjs/internal/observable/of\";\r\nimport { concatAll } from \"rxjs/internal/operators/concatAll\";\r\nimport { concatMap } from \"rxjs/internal/operators/concatMap\";\r\nimport { finalize } from \"rxjs/internal/operators/finalize\";\r\nimport { map } from \"rxjs/internal/operators/map\";\r\nimport { publish } from \"rxjs/internal/operators/publish\";\r\nimport { refCount } from \"rxjs/internal/operators/refCount\";\r\nimport { toArray } from \"rxjs/internal/operators/toArray\";\r\nimport { BeEvent, IDisposable } from \"@itwin/core-bentley\";\r\nimport { UiError } from \"@itwin/appui-abstract\";\r\nimport { scheduleSubscription, SubscriptionScheduler } from \"../../common/SubscriptionScheduler\";\r\nimport { UiComponents } from \"../../UiComponents\";\r\nimport {\r\n ImmediatelyLoadedTreeNodeItem, isTreeDataProviderInterface, isTreeDataProviderMethod, isTreeDataProviderPromise, isTreeDataProviderRaw,\r\n TreeDataChangesListener, TreeDataProvider, TreeDataProviderRaw, TreeNodeItem,\r\n} from \"../TreeDataProvider\";\r\nimport { Observable, toRxjsObservable } from \"./Observable\";\r\nimport { isTreeModelNode, MutableTreeModel, TreeModelNode, TreeModelNodeInput, TreeModelRootNode, TreeNodeItemData } from \"./TreeModel\";\r\nimport { TreeModelSource } from \"./TreeModelSource\";\r\n\r\n/**\r\n * Data structure that describes node load result\r\n * @public\r\n */\r\nexport interface TreeNodeLoadResult {\r\n loadedNodes: TreeNodeItem[];\r\n}\r\n\r\n/**\r\n * Tree node loader which is used to load tree nodes.\r\n * @public\r\n */\r\nexport interface ITreeNodeLoader {\r\n /**\r\n * Loads node at specified place in tree.\r\n * @param parentId specifies tree branch\r\n * @param childIndex specifies offset in the branch.\r\n */\r\n loadNode(parentId: TreeModelNode | TreeModelRootNode, childIndex: number): Observable<TreeNodeLoadResult>;\r\n}\r\n\r\n/**\r\n * Tree node loader which uses `TreeDataProvider` to load nodes.\r\n * @public\r\n */\r\nexport interface ITreeNodeLoaderWithProvider<TDataProvider extends TreeDataProvider> extends ITreeNodeLoader {\r\n /** Returns `TreeDataProvider` used to load nodes. */\r\n readonly dataProvider: TDataProvider;\r\n}\r\n\r\n/**\r\n * Abstract node loader implementation which loads nodes into provided model source.\r\n * @public\r\n */\r\nexport abstract class AbstractTreeNodeLoader implements ITreeNodeLoader {\r\n private _treeModelSource: TreeModelSource;\r\n private _loadScheduler = new SubscriptionScheduler<TreeNodeLoadResult>();\r\n\r\n protected constructor(modelSource: TreeModelSource) {\r\n this._treeModelSource = modelSource;\r\n }\r\n\r\n public get modelSource() { return this._treeModelSource; }\r\n\r\n /** Do not override this method. @see `load` */\r\n public loadNode(parent: TreeModelNode | TreeModelRootNode, childIndex: number): Observable<TreeNodeLoadResult> {\r\n return toRxjsObservable(this.load(parent, childIndex)).pipe(\r\n map((loadedHierarchy) => {\r\n this.updateModel(loadedHierarchy);\r\n return { loadedNodes: collectTreeNodeItems(loadedHierarchy.hierarchyItems) };\r\n }),\r\n scheduleSubscription(this._loadScheduler),\r\n );\r\n }\r\n\r\n /**\r\n * A method that's called when `load` loads some nodes and we need to put them into model source. The\r\n * default implementation simply puts loaded child nodes under their parent at correct positions. Concrete\r\n * implementation may override this method to handle loaded nodes in a a custom way (put them at custom locations\r\n * in the hierarchy, etc.)\r\n */\r\n protected updateModel(loadedHierarchy: LoadedNodeHierarchy): void {\r\n handleLoadedNodeHierarchy(this._treeModelSource, loadedHierarchy);\r\n }\r\n\r\n /** An abstract method to load a node at the specific index for the specified parent. */\r\n protected abstract load(parent: TreeModelNode | TreeModelRootNode, childIndex: number): Observable<LoadedNodeHierarchy>;\r\n}\r\n\r\n/**\r\n * Abstract node loader with tree data provider which loads nodes into provided model source.\r\n * @public\r\n */\r\nexport abstract class AbstractTreeNodeLoaderWithProvider<TDataProvider extends TreeDataProvider> extends AbstractTreeNodeLoader implements ITreeNodeLoaderWithProvider<TDataProvider> {\r\n private _dataProvider: TDataProvider;\r\n\r\n protected constructor(modelSource: TreeModelSource, dataProvider: TDataProvider) {\r\n super(modelSource);\r\n this._dataProvider = dataProvider;\r\n }\r\n\r\n public get dataProvider() { return this._dataProvider; }\r\n}\r\n\r\n/**\r\n * Default tree node loader with `TreeDataProvider` implementation.\r\n * @public\r\n */\r\nexport class TreeNodeLoader<TDataProvider extends TreeDataProvider> extends AbstractTreeNodeLoaderWithProvider<TDataProvider> implements IDisposable {\r\n private _treeDataSource: TreeDataSource;\r\n private _activeRequests = new Map<string | undefined, RxjsObservable<LoadedNodeHierarchy>>();\r\n\r\n constructor(dataProvider: TDataProvider, modelSource: TreeModelSource) {\r\n super(modelSource, dataProvider);\r\n this._treeDataSource = new TreeDataSource(dataProvider);\r\n }\r\n\r\n /** Disposes data source */\r\n public dispose() { this._treeDataSource.dispose(); }\r\n\r\n /**\r\n * Schedules to load children of node and returns an Observable.\r\n * @note It does not start loading node until '.subscribe()' is called on returned Observable.\r\n */\r\n protected load(parentNode: TreeModelNode | TreeModelRootNode): Observable<LoadedNodeHierarchy> {\r\n const parentItem = isTreeModelNode(parentNode) ? parentNode.item : undefined;\r\n return this.loadForParent(parentItem, parentNode.numChildren === undefined);\r\n }\r\n\r\n private loadForParent(parentItem: TreeNodeItem | undefined, requestNumChildren: boolean): RxjsObservable<LoadedNodeHierarchy> {\r\n const parentId = parentItem && parentItem.id;\r\n const activeRequest = this._activeRequests.get(parentId);\r\n if (activeRequest) {\r\n return activeRequest;\r\n }\r\n\r\n const newRequest = requestLoadedHierarchy(parentItem, this._treeDataSource, 0, 0, requestNumChildren,\r\n () => { this._activeRequests.delete(parentId); },\r\n );\r\n\r\n this._activeRequests.set(parentId, newRequest);\r\n return newRequest;\r\n }\r\n}\r\n\r\n/**\r\n * Default paged tree node loader with `TreeDataProvider` implementation.\r\n * @public\r\n */\r\nexport class PagedTreeNodeLoader<TDataProvider extends TreeDataProvider> extends AbstractTreeNodeLoaderWithProvider<TDataProvider> implements IDisposable {\r\n private _pageLoader: PageLoader;\r\n private _pageSize: number;\r\n\r\n constructor(dataProvider: TDataProvider, modelSource: TreeModelSource, pageSize: number) {\r\n super(modelSource, dataProvider);\r\n this._pageLoader = new PageLoader(new TreeDataSource(dataProvider), pageSize);\r\n this._pageSize = pageSize;\r\n }\r\n\r\n /** Disposes data source */\r\n public dispose() { this._pageLoader.dispose(); }\r\n\r\n /** Returns page size used by tree node loader. */\r\n public get pageSize(): number { return this._pageSize; }\r\n\r\n /**\r\n * Schedules to load one page of node children and returns an Observable.\r\n * @note It does not start loading node page until '.subscribe()' is called on returned Observable.\r\n */\r\n protected load(parentNode: TreeModelNode | TreeModelRootNode, childIndex: number): Observable<LoadedNodeHierarchy> {\r\n const parentItem = isTreeModelNode(parentNode) ? parentNode.item : undefined;\r\n return this._pageLoader.loadPageWithItem(parentItem, childIndex, parentNode.numChildren === undefined);\r\n }\r\n}\r\n\r\n/**\r\n * Data structure that describes hierarchy loaded for parent node.\r\n * @public\r\n */\r\nexport interface LoadedNodeHierarchy {\r\n /** Node id of the parent node for loaded hierarchy. */\r\n parentId: string | undefined;\r\n /** Hierarchy items offset in parent node children array. */\r\n offset: number;\r\n /** Loaded hierarchy items. */\r\n hierarchyItems: LoadedNodeHierarchyItem[];\r\n /** Number of children parent node has. */\r\n numChildren?: number;\r\n}\r\n\r\n/**\r\n * Data structure that describes one loaded hierarchy item.\r\n * @public\r\n */\r\nexport interface LoadedNodeHierarchyItem {\r\n /** Loaded tree node item. */\r\n item: TreeNodeItemData;\r\n /** Children of loaded tree node item. */\r\n children?: LoadedNodeHierarchyItem[];\r\n /** Number of children tree node item has. */\r\n numChildren?: number;\r\n}\r\n\r\nclass PageLoader implements IDisposable {\r\n private _dataSource: TreeDataSource;\r\n private _pageSize: number;\r\n private _activePageRequests = new Map<string | undefined, Map<number, RxjsObservable<LoadedNodeHierarchy>>>();\r\n\r\n constructor(\r\n dataSource: TreeDataSource,\r\n pageSize: number,\r\n ) {\r\n this._dataSource = dataSource;\r\n this._pageSize = pageSize;\r\n }\r\n\r\n public dispose() { this._dataSource.dispose(); }\r\n\r\n public loadPageWithItem(\r\n parentItem: TreeNodeItem | undefined,\r\n itemIndex: number,\r\n requestNumChildren: boolean,\r\n ): RxjsObservable<LoadedNodeHierarchy> {\r\n const parentId = parentItem && parentItem.id;\r\n const parentPageRequests = this._activePageRequests.get(parentId) || new Map<number, RxjsObservable<LoadedNodeHierarchy>>();\r\n const page = Math.trunc(itemIndex / this._pageSize);\r\n const activeRequest = parentPageRequests.get(page);\r\n if (activeRequest) {\r\n return activeRequest;\r\n }\r\n\r\n const startIndex = page * this._pageSize;\r\n const newRequest = requestLoadedHierarchy(parentItem, this._dataSource, startIndex, this._pageSize, requestNumChildren,\r\n () => {\r\n parentPageRequests.delete(page);\r\n if (parentPageRequests.size === 0) {\r\n this._activePageRequests.delete(parentId);\r\n }\r\n },\r\n );\r\n\r\n parentPageRequests.set(page, newRequest);\r\n this._activePageRequests.set(parentId, parentPageRequests);\r\n return newRequest;\r\n }\r\n}\r\n\r\nfunction requestLoadedHierarchy(\r\n parentItem: TreeNodeItem | undefined,\r\n dataSource: TreeDataSource,\r\n start: number,\r\n take: number,\r\n requestNumChildren: boolean,\r\n finalizeCallback: () => void,\r\n) {\r\n const parentId = parentItem && parentItem.id;\r\n return dataSource.requestItems(parentItem, start, take, requestNumChildren)\r\n .pipe(\r\n concatMap(({ numChildren, loadedItems }) => loadHierarchy(loadedItems, dataSource, take)\r\n .pipe(\r\n map((hierarchyItems) => ({\r\n parentId,\r\n offset: start,\r\n hierarchyItems,\r\n numChildren,\r\n })),\r\n ),\r\n ),\r\n finalize(finalizeCallback),\r\n publish(),\r\n refCount(),\r\n );\r\n}\r\n\r\nfunction loadHierarchy(rootItems: TreeNodeItemData[], dataSource: TreeDataSource, take: number): RxjsObservable<LoadedNodeHierarchyItem[]> {\r\n return from(rootItems)\r\n .pipe(\r\n concatMap((item) => {\r\n if (!item.autoExpand || item.children) {\r\n return of(convertToLoadedNodeHierarchyItem(item));\r\n }\r\n\r\n return dataSource.requestItems(item, 0, take, true)\r\n .pipe(\r\n concatMap(({ numChildren, loadedItems }) => loadHierarchy(loadedItems, dataSource, take)\r\n .pipe(\r\n map((children) => ({ item, children, numChildren })),\r\n ),\r\n ),\r\n );\r\n }),\r\n toArray(),\r\n );\r\n}\r\n\r\nfunction convertToLoadedNodeHierarchyItem(item: TreeNodeItemData): LoadedNodeHierarchyItem {\r\n return {\r\n item,\r\n children: item.children ? item.children.map((child) => convertToLoadedNodeHierarchyItem(child)) : undefined,\r\n numChildren: item.children ? item.children.length : undefined,\r\n };\r\n}\r\n\r\nfunction collectTreeNodeItems(hierarchyItems: LoadedNodeHierarchyItem[], result: TreeNodeItem[] = []) {\r\n for (const hierarchyItem of hierarchyItems) {\r\n result.push(hierarchyItem.item);\r\n if (hierarchyItem.children)\r\n collectTreeNodeItems(hierarchyItem.children, result);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/** @internal */\r\nexport function handleLoadedNodeHierarchy(modelSource: TreeModelSource, loadedHierarchy: LoadedNodeHierarchy) {\r\n modelSource.modifyModel((model) => {\r\n if (loadedHierarchy.parentId !== undefined) {\r\n // Make sure the model sill contains the parent node\r\n /* istanbul ignore if */\r\n if (model.getNode(loadedHierarchy.parentId) === undefined)\r\n return;\r\n }\r\n\r\n updateChildren(model, loadedHierarchy.parentId, loadedHierarchy.hierarchyItems, loadedHierarchy.offset, loadedHierarchy.numChildren);\r\n if (loadedHierarchy.parentId !== undefined) {\r\n const parentNode = model.getNode(loadedHierarchy.parentId);\r\n /* istanbul ignore else */\r\n if (parentNode && parentNode.isLoading && parentNode.numChildren !== undefined) {\r\n parentNode.isLoading = false;\r\n }\r\n }\r\n });\r\n}\r\n\r\nfunction updateChildren(\r\n model: MutableTreeModel,\r\n parentId: string | undefined,\r\n hierarchyItems: LoadedNodeHierarchyItem[],\r\n startIndex: number,\r\n numChildren?: number,\r\n) {\r\n // numChildren set to undefined indicates that this is not the first request for children\r\n if (numChildren !== undefined) {\r\n model.setNumChildren(parentId, numChildren);\r\n }\r\n\r\n // if children array is undefined do not add children as they should be disposed\r\n if (model.getChildren(parentId) === undefined) {\r\n return;\r\n }\r\n\r\n let offset = startIndex;\r\n for (const hierarchyItem of hierarchyItems) {\r\n const nodeInput = convertToTreeModelNodeInput(hierarchyItem.item);\r\n const existingNode = model.getNode(hierarchyItem.item.id);\r\n\r\n // if same item exists in the same position and is expanded update it without removing it's subtree\r\n if (!existingNode || !existingNode.isExpanded || model.getChildOffset(parentId, existingNode.id) !== offset || nodeInput.numChildren === 0) {\r\n model.setChildren(parentId, [nodeInput], offset);\r\n } else {\r\n existingNode.label = nodeInput.label;\r\n existingNode.description = nodeInput.description ?? \"\";\r\n existingNode.item = nodeInput.item;\r\n }\r\n\r\n if (hierarchyItem.children) {\r\n updateChildren(model, hierarchyItem.item.id, hierarchyItem.children, 0, hierarchyItem.numChildren);\r\n }\r\n offset++;\r\n }\r\n}\r\n\r\nfunction convertToTreeModelNodeInput(item: TreeNodeItemData): TreeModelNodeInput {\r\n let numChildren: number | undefined;\r\n if (item.children) {\r\n numChildren = item.children.length;\r\n } else if (!item.hasChildren) {\r\n numChildren = 0;\r\n }\r\n\r\n return {\r\n description: item.description,\r\n isExpanded: !!item.autoExpand,\r\n id: item.id,\r\n item,\r\n label: item.label,\r\n isLoading: false,\r\n numChildren,\r\n isSelected: false,\r\n };\r\n}\r\n\r\ninterface TreeDataSourceResult {\r\n loadedItems: TreeNodeItemData[];\r\n numChildren?: number;\r\n}\r\n\r\n/**\r\n * Wrapper to handle different types of `TreeDataProvider`. Provides one method\r\n * to request items from `TreeDataProviderRaw`, `TreeDataProviderMethod`,\r\n * `TreeDataProviderPromise` or `TreeDataProviderInterface`.\r\n *\r\n * @internal\r\n */\r\nexport class TreeDataSource implements IDisposable {\r\n private _dataProvider: TreeDataProvider;\r\n private _disposeTreeNodesChangedListener?: () => void;\r\n\r\n public readonly onItemsChanged = new BeEvent<TreeDataChangesListener>();\r\n\r\n constructor(dataProvider: TreeDataProvider) {\r\n this._dataProvider = dataProvider;\r\n\r\n // eslint-disable-next-line deprecation/deprecation\r\n if (isTreeDataProviderInterface(this._dataProvider) && this._dataProvider.onTreeNodeChanged) {\r\n // eslint-disable-next-line deprecation/deprecation\r\n this._disposeTreeNodesChangedListener = this._dataProvider.onTreeNodeChanged.addListener(\r\n (changedItems) => this.onItemsChanged.raiseEvent(changedItems),\r\n );\r\n }\r\n }\r\n\r\n public dispose() {\r\n this._disposeTreeNodesChangedListener && this._disposeTreeNodesChangedListener();\r\n }\r\n\r\n public requestItems(\r\n parent: TreeNodeItem | undefined,\r\n firstItemIndex: number,\r\n numItems: number,\r\n requestNumChildren: boolean,\r\n ): RxjsObservable<TreeDataSourceResult> {\r\n // During each async operation there is a chance that data provider will become stale. Create an opportunity to\r\n // unsubscribe after each async operation so that we stop interacting with the stale data provider immediately.\r\n return defer(async () => {\r\n if (isTreeDataProviderInterface(this._dataProvider)) {\r\n const dataProvider = this._dataProvider;\r\n return from(requestNumChildren ? dataProvider.getNodesCount(parent) : [undefined])\r\n .pipe(\r\n concatMap(async (numChildren) => {\r\n const pageOptions = numItems !== 0 ? { size: numItems, start: firstItemIndex } : undefined;\r\n return {\r\n loadedItems: await dataProvider.getNodes(parent, pageOptions),\r\n numChildren,\r\n };\r\n }),\r\n );\r\n }\r\n\r\n return from(this.getItems(parent))\r\n .pipe(\r\n map((loadedItems) => ({\r\n loadedItems: numItems !== 0 ? loadedItems.slice(firstItemIndex, firstItemIndex + numItems) : loadedItems,\r\n numChildren: loadedItems.length,\r\n })),\r\n );\r\n })\r\n .pipe(\r\n concatAll(),\r\n publish(),\r\n refCount(),\r\n );\r\n }\r\n\r\n private async getItems(parent: TreeNodeItem | undefined): Promise<TreeNodeItemData[]> {\r\n if (isTreeDataProviderRaw(this._dataProvider)) {\r\n return this.getChildren(this._dataProvider, parent);\r\n }\r\n\r\n if (isTreeDataProviderMethod(this._dataProvider)) {\r\n return this._dataProvider(parent);\r\n }\r\n\r\n if (isTreeDataProviderPromise(this._dataProvider)) {\r\n this._dataProvider = await this._dataProvider;\r\n return this.getChildren(this._dataProvider, parent);\r\n }\r\n\r\n throw new UiError(UiComponents.loggerCategory(this), \"Unsupported TreeDataProvider.\");\r\n }\r\n\r\n private getChildren(rawProvider: TreeDataProviderRaw, parent: TreeNodeItem | undefined): TreeNodeItemData[] {\r\n if (parent === undefined)\r\n return rawProvider;\r\n\r\n return (parent as ImmediatelyLoadedTreeNodeItem).children ?? [];\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"TreeNodeLoader.js","sourceRoot":"","sources":["../../../../../src/components-react/tree/controlled/TreeNodeLoader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Tree\r\n */\r\n\r\nimport { Observable as RxjsObservable } from \"rxjs/internal/Observable\";\r\nimport { defer } from \"rxjs/internal/observable/defer\";\r\nimport { from } from \"rxjs/internal/observable/from\";\r\nimport { of } from \"rxjs/internal/observable/of\";\r\nimport { concatAll } from \"rxjs/internal/operators/concatAll\";\r\nimport { concatMap } from \"rxjs/internal/operators/concatMap\";\r\nimport { finalize } from \"rxjs/internal/operators/finalize\";\r\nimport { map } from \"rxjs/internal/operators/map\";\r\nimport { publish } from \"rxjs/internal/operators/publish\";\r\nimport { refCount } from \"rxjs/internal/operators/refCount\";\r\nimport { toArray } from \"rxjs/internal/operators/toArray\";\r\nimport { BeEvent, IDisposable } from \"@itwin/core-bentley\";\r\nimport { UiError } from \"@itwin/appui-abstract\";\r\nimport { scheduleSubscription, SubscriptionScheduler } from \"../../common/SubscriptionScheduler\";\r\nimport { UiComponents } from \"../../UiComponents\";\r\nimport {\r\n ImmediatelyLoadedTreeNodeItem, isTreeDataProviderInterface, isTreeDataProviderMethod, isTreeDataProviderPromise, isTreeDataProviderRaw,\r\n TreeDataChangesListener, TreeDataProvider, TreeDataProviderRaw, TreeNodeItem,\r\n} from \"../TreeDataProvider\";\r\nimport { Observable, toRxjsObservable } from \"./Observable\";\r\nimport { isTreeModelNode, MutableTreeModel, TreeModelNode, TreeModelNodeInput, TreeModelRootNode, TreeNodeItemData } from \"./TreeModel\";\r\nimport { TreeModelSource } from \"./TreeModelSource\";\r\n\r\n/**\r\n * Data structure that describes node load result\r\n * @public\r\n */\r\nexport interface TreeNodeLoadResult {\r\n loadedNodes: TreeNodeItem[];\r\n}\r\n\r\n/**\r\n * Tree node loader which is used to load tree nodes.\r\n * @public\r\n */\r\nexport interface ITreeNodeLoader {\r\n /**\r\n * Loads node at specified place in tree.\r\n * @param parentId specifies tree branch\r\n * @param childIndex specifies offset in the branch.\r\n */\r\n loadNode(parentId: TreeModelNode | TreeModelRootNode, childIndex: number): Observable<TreeNodeLoadResult>;\r\n}\r\n\r\n/**\r\n * Tree node loader which uses `TreeDataProvider` to load nodes.\r\n * @public\r\n */\r\nexport interface ITreeNodeLoaderWithProvider<TDataProvider extends TreeDataProvider> extends ITreeNodeLoader {\r\n /** Returns `TreeDataProvider` used to load nodes. */\r\n readonly dataProvider: TDataProvider;\r\n}\r\n\r\n/**\r\n * Abstract node loader implementation which loads nodes into provided model source.\r\n * @public\r\n */\r\nexport abstract class AbstractTreeNodeLoader implements ITreeNodeLoader {\r\n private _treeModelSource: TreeModelSource;\r\n private _loadScheduler = new SubscriptionScheduler<TreeNodeLoadResult>();\r\n\r\n protected constructor(modelSource: TreeModelSource) {\r\n this._treeModelSource = modelSource;\r\n }\r\n\r\n public get modelSource() { return this._treeModelSource; }\r\n\r\n /** Do not override this method. @see `load` */\r\n public loadNode(parent: TreeModelNode | TreeModelRootNode, childIndex: number): Observable<TreeNodeLoadResult> {\r\n return toRxjsObservable(this.load(parent, childIndex)).pipe(\r\n map((loadedHierarchy) => {\r\n this.updateModel(loadedHierarchy);\r\n return { loadedNodes: collectTreeNodeItems(loadedHierarchy.hierarchyItems) };\r\n }),\r\n scheduleSubscription(this._loadScheduler),\r\n );\r\n }\r\n\r\n /**\r\n * A method that's called when `load` loads some nodes and we need to put them into model source. The\r\n * default implementation simply puts loaded child nodes under their parent at correct positions. Concrete\r\n * implementation may override this method to handle loaded nodes in a a custom way (put them at custom locations\r\n * in the hierarchy, etc.)\r\n */\r\n protected updateModel(loadedHierarchy: LoadedNodeHierarchy): void {\r\n handleLoadedNodeHierarchy(this._treeModelSource, loadedHierarchy);\r\n }\r\n\r\n /** An abstract method to load a node at the specific index for the specified parent. */\r\n protected abstract load(parent: TreeModelNode | TreeModelRootNode, childIndex: number): Observable<LoadedNodeHierarchy>;\r\n}\r\n\r\n/**\r\n * Abstract node loader with tree data provider which loads nodes into provided model source.\r\n * @public\r\n */\r\nexport abstract class AbstractTreeNodeLoaderWithProvider<TDataProvider extends TreeDataProvider> extends AbstractTreeNodeLoader implements ITreeNodeLoaderWithProvider<TDataProvider> {\r\n private _dataProvider: TDataProvider;\r\n\r\n protected constructor(modelSource: TreeModelSource, dataProvider: TDataProvider) {\r\n super(modelSource);\r\n this._dataProvider = dataProvider;\r\n }\r\n\r\n public get dataProvider() { return this._dataProvider; }\r\n}\r\n\r\n/**\r\n * Default tree node loader with `TreeDataProvider` implementation.\r\n * @public\r\n */\r\nexport class TreeNodeLoader<TDataProvider extends TreeDataProvider> extends AbstractTreeNodeLoaderWithProvider<TDataProvider> implements IDisposable {\r\n private _treeDataSource: TreeDataSource;\r\n private _activeRequests = new Map<string | undefined, RxjsObservable<TreeNodeLoadResult>>();\r\n private _scheduler = new SubscriptionScheduler<TreeNodeLoadResult>();\r\n\r\n constructor(dataProvider: TDataProvider, modelSource: TreeModelSource) {\r\n super(modelSource, dataProvider);\r\n this._treeDataSource = new TreeDataSource(dataProvider);\r\n }\r\n\r\n /** Disposes data source */\r\n public dispose() { this._treeDataSource.dispose(); }\r\n\r\n /**\r\n * Schedules to load children of node and returns an Observable.\r\n * @note It does not start loading node until '.subscribe()' is called on returned Observable.\r\n */\r\n public override loadNode(parent: TreeModelNode | TreeModelRootNode, _childIndex?: number): Observable<TreeNodeLoadResult> {\r\n return defer(() => {\r\n const parentItem = isTreeModelNode(parent) ? parent.item : undefined;\r\n const parentId = parentItem?.id;\r\n const activeRequest = this._activeRequests.get(parentId);\r\n if (activeRequest) {\r\n return activeRequest;\r\n }\r\n\r\n const newRequest = requestLoadedHierarchy(parentItem, this._treeDataSource, 0, 0, parent.numChildren === undefined)\r\n .pipe(\r\n map((loadedHierarchy) => {\r\n this.updateModel(loadedHierarchy);\r\n return { loadedNodes: collectTreeNodeItems(loadedHierarchy.hierarchyItems) };\r\n }),\r\n scheduleSubscription(this._scheduler),\r\n finalize(() => this._activeRequests.delete(parentId))\r\n );\r\n this._activeRequests.set(parentId, newRequest);\r\n return newRequest;\r\n });\r\n }\r\n\r\n // istanbul ignore next\r\n protected load(): Observable<LoadedNodeHierarchy> {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n}\r\n\r\n/**\r\n * Default paged tree node loader with `TreeDataProvider` implementation.\r\n * @public\r\n */\r\nexport class PagedTreeNodeLoader<TDataProvider extends TreeDataProvider> extends AbstractTreeNodeLoaderWithProvider<TDataProvider> implements IDisposable {\r\n private _treeDataSource: TreeDataSource;\r\n private _pageSize: number;\r\n private _activePageRequests: Map<string | undefined, Map<number, Observable<TreeNodeLoadResult>>>;\r\n private _scheduler: SubscriptionScheduler<TreeNodeLoadResult>;\r\n\r\n constructor(dataProvider: TDataProvider, modelSource: TreeModelSource, pageSize: number) {\r\n super(modelSource, dataProvider);\r\n this._treeDataSource = new TreeDataSource(dataProvider);\r\n this._pageSize = pageSize;\r\n this._activePageRequests = new Map();\r\n this._scheduler = new SubscriptionScheduler();\r\n }\r\n\r\n /** Disposes data source */\r\n public dispose() { this._treeDataSource.dispose(); }\r\n\r\n /** Returns page size used by tree node loader. */\r\n public get pageSize(): number { return this._pageSize; }\r\n\r\n /**\r\n * Schedules to load one page of node children and returns an Observable.\r\n * @note It does not start loading node page until '.subscribe()' is called on returned Observable.\r\n */\r\n public override loadNode(parent: TreeModelNode | TreeModelRootNode, childIndex: number): Observable<TreeNodeLoadResult> {\r\n return defer(() => {\r\n const parentItem = isTreeModelNode(parent) ? parent.item : undefined;\r\n const parentId = parentItem?.id;\r\n const parentPageRequests = this._activePageRequests.get(parentId)\r\n ?? new Map<number, Observable<TreeNodeLoadResult>>();\r\n const page = Math.trunc(childIndex / this._pageSize);\r\n const activeRequest = parentPageRequests.get(page);\r\n if (activeRequest) {\r\n return activeRequest;\r\n }\r\n\r\n const startIndex = page * this._pageSize;\r\n const newRequest = requestLoadedHierarchy(\r\n parentItem,\r\n this._treeDataSource,\r\n startIndex,\r\n this._pageSize,\r\n parent.numChildren === undefined,\r\n ).pipe(\r\n map((loadedHierarchy) => {\r\n this.updateModel(loadedHierarchy);\r\n return { loadedNodes: collectTreeNodeItems(loadedHierarchy.hierarchyItems) };\r\n }),\r\n scheduleSubscription(this._scheduler),\r\n finalize(() => {\r\n parentPageRequests.delete(page);\r\n if (parentPageRequests.size === 0) {\r\n this._activePageRequests.delete(parentId);\r\n }\r\n }),\r\n );\r\n\r\n parentPageRequests.set(page, newRequest);\r\n this._activePageRequests.set(parentId, parentPageRequests);\r\n return newRequest;\r\n });\r\n }\r\n\r\n // istanbul ignore next\r\n protected load(): Observable<LoadedNodeHierarchy> {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n}\r\n\r\n/**\r\n * Data structure that describes hierarchy loaded for parent node.\r\n * @public\r\n */\r\nexport interface LoadedNodeHierarchy {\r\n /** Node id of the parent node for loaded hierarchy. */\r\n parentId: string | undefined;\r\n /** Hierarchy items offset in parent node children array. */\r\n offset: number;\r\n /** Loaded hierarchy items. */\r\n hierarchyItems: LoadedNodeHierarchyItem[];\r\n /** Number of children parent node has. */\r\n numChildren?: number;\r\n}\r\n\r\n/**\r\n * Data structure that describes one loaded hierarchy item.\r\n * @public\r\n */\r\nexport interface LoadedNodeHierarchyItem {\r\n /** Loaded tree node item. */\r\n item: TreeNodeItemData;\r\n /** Children of loaded tree node item. */\r\n children?: LoadedNodeHierarchyItem[];\r\n /** Number of children tree node item has. */\r\n numChildren?: number;\r\n}\r\n\r\nfunction requestLoadedHierarchy(\r\n parentItem: TreeNodeItem | undefined,\r\n dataSource: TreeDataSource,\r\n start: number,\r\n take: number,\r\n requestNumChildren: boolean,\r\n) {\r\n const parentId = parentItem && parentItem.id;\r\n return dataSource.requestItems(parentItem, start, take, requestNumChildren)\r\n .pipe(\r\n concatMap(({ numChildren, loadedItems }) => loadHierarchy(loadedItems, dataSource, take)\r\n .pipe(\r\n map((hierarchyItems) => ({\r\n parentId,\r\n offset: start,\r\n hierarchyItems,\r\n numChildren,\r\n })),\r\n ),\r\n ),\r\n );\r\n}\r\n\r\nfunction loadHierarchy(rootItems: TreeNodeItemData[], dataSource: TreeDataSource, take: number): RxjsObservable<LoadedNodeHierarchyItem[]> {\r\n return from(rootItems)\r\n .pipe(\r\n concatMap((item) => {\r\n if (!item.autoExpand || item.children) {\r\n return of(convertToLoadedNodeHierarchyItem(item));\r\n }\r\n\r\n return dataSource.requestItems(item, 0, take, true)\r\n .pipe(\r\n concatMap(({ numChildren, loadedItems }) => loadHierarchy(loadedItems, dataSource, take)\r\n .pipe(\r\n map((children) => ({ item, children, numChildren })),\r\n ),\r\n ),\r\n );\r\n }),\r\n toArray(),\r\n );\r\n}\r\n\r\nfunction convertToLoadedNodeHierarchyItem(item: TreeNodeItemData): LoadedNodeHierarchyItem {\r\n return {\r\n item,\r\n children: item.children ? item.children.map((child) => convertToLoadedNodeHierarchyItem(child)) : undefined,\r\n numChildren: item.children ? item.children.length : undefined,\r\n };\r\n}\r\n\r\nfunction collectTreeNodeItems(hierarchyItems: LoadedNodeHierarchyItem[], result: TreeNodeItem[] = []) {\r\n for (const hierarchyItem of hierarchyItems) {\r\n result.push(hierarchyItem.item);\r\n if (hierarchyItem.children)\r\n collectTreeNodeItems(hierarchyItem.children, result);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/** @internal */\r\nexport function handleLoadedNodeHierarchy(modelSource: TreeModelSource, loadedHierarchy: LoadedNodeHierarchy) {\r\n modelSource.modifyModel((model) => {\r\n if (loadedHierarchy.parentId !== undefined) {\r\n // Make sure the model sill contains the parent node\r\n /* istanbul ignore if */\r\n if (model.getNode(loadedHierarchy.parentId) === undefined)\r\n return;\r\n }\r\n\r\n updateChildren(model, loadedHierarchy.parentId, loadedHierarchy.hierarchyItems, loadedHierarchy.offset, loadedHierarchy.numChildren);\r\n if (loadedHierarchy.parentId !== undefined) {\r\n const parentNode = model.getNode(loadedHierarchy.parentId);\r\n /* istanbul ignore else */\r\n if (parentNode && parentNode.isLoading && parentNode.numChildren !== undefined) {\r\n parentNode.isLoading = false;\r\n }\r\n }\r\n });\r\n}\r\n\r\nfunction updateChildren(\r\n model: MutableTreeModel,\r\n parentId: string | undefined,\r\n hierarchyItems: LoadedNodeHierarchyItem[],\r\n startIndex: number,\r\n numChildren?: number,\r\n) {\r\n // numChildren set to undefined indicates that this is not the first request for children\r\n if (numChildren !== undefined) {\r\n model.setNumChildren(parentId, numChildren);\r\n }\r\n\r\n // if children array is undefined do not add children as they should be disposed\r\n if (model.getChildren(parentId) === undefined) {\r\n return;\r\n }\r\n\r\n let offset = startIndex;\r\n for (const hierarchyItem of hierarchyItems) {\r\n const nodeInput = convertToTreeModelNodeInput(hierarchyItem.item);\r\n const existingNode = model.getNode(hierarchyItem.item.id);\r\n\r\n // if same item exists in the same position and is expanded update it without removing it's subtree\r\n if (!existingNode || !existingNode.isExpanded || model.getChildOffset(parentId, existingNode.id) !== offset || nodeInput.numChildren === 0) {\r\n model.setChildren(parentId, [nodeInput], offset);\r\n } else {\r\n existingNode.label = nodeInput.label;\r\n existingNode.description = nodeInput.description ?? \"\";\r\n existingNode.item = nodeInput.item;\r\n }\r\n\r\n if (hierarchyItem.children) {\r\n updateChildren(model, hierarchyItem.item.id, hierarchyItem.children, 0, hierarchyItem.numChildren);\r\n }\r\n offset++;\r\n }\r\n}\r\n\r\nfunction convertToTreeModelNodeInput(item: TreeNodeItemData): TreeModelNodeInput {\r\n let numChildren: number | undefined;\r\n if (item.children) {\r\n numChildren = item.children.length;\r\n } else if (!item.hasChildren) {\r\n numChildren = 0;\r\n }\r\n\r\n return {\r\n description: item.description,\r\n isExpanded: !!item.autoExpand,\r\n id: item.id,\r\n item,\r\n label: item.label,\r\n isLoading: false,\r\n numChildren,\r\n isSelected: false,\r\n };\r\n}\r\n\r\ninterface TreeDataSourceResult {\r\n loadedItems: TreeNodeItemData[];\r\n numChildren?: number;\r\n}\r\n\r\n/**\r\n * Wrapper to handle different types of `TreeDataProvider`. Provides one method\r\n * to request items from `TreeDataProviderRaw`, `TreeDataProviderMethod`,\r\n * `TreeDataProviderPromise` or `TreeDataProviderInterface`.\r\n *\r\n * @internal\r\n */\r\nexport class TreeDataSource implements IDisposable {\r\n private _dataProvider: TreeDataProvider;\r\n private _disposeTreeNodesChangedListener?: () => void;\r\n\r\n public readonly onItemsChanged = new BeEvent<TreeDataChangesListener>();\r\n\r\n constructor(dataProvider: TreeDataProvider) {\r\n this._dataProvider = dataProvider;\r\n\r\n // eslint-disable-next-line deprecation/deprecation\r\n if (isTreeDataProviderInterface(this._dataProvider) && this._dataProvider.onTreeNodeChanged) {\r\n // eslint-disable-next-line deprecation/deprecation\r\n this._disposeTreeNodesChangedListener = this._dataProvider.onTreeNodeChanged.addListener(\r\n (changedItems) => this.onItemsChanged.raiseEvent(changedItems),\r\n );\r\n }\r\n }\r\n\r\n public dispose() {\r\n this._disposeTreeNodesChangedListener && this._disposeTreeNodesChangedListener();\r\n }\r\n\r\n public requestItems(\r\n parent: TreeNodeItem | undefined,\r\n firstItemIndex: number,\r\n numItems: number,\r\n requestNumChildren: boolean,\r\n ): RxjsObservable<TreeDataSourceResult> {\r\n // During each async operation there is a chance that data provider will become stale. Create an opportunity to\r\n // unsubscribe after each async operation so that we stop interacting with the stale data provider immediately.\r\n return defer(async () => {\r\n if (isTreeDataProviderInterface(this._dataProvider)) {\r\n const dataProvider = this._dataProvider;\r\n return from(requestNumChildren ? dataProvider.getNodesCount(parent) : [undefined])\r\n .pipe(\r\n concatMap(async (numChildren) => {\r\n const pageOptions = numItems !== 0 ? { size: numItems, start: firstItemIndex } : undefined;\r\n return {\r\n loadedItems: await dataProvider.getNodes(parent, pageOptions),\r\n numChildren,\r\n };\r\n }),\r\n );\r\n }\r\n\r\n return from(this.getItems(parent))\r\n .pipe(\r\n map((loadedItems) => ({\r\n loadedItems: numItems !== 0 ? loadedItems.slice(firstItemIndex, firstItemIndex + numItems) : loadedItems,\r\n numChildren: loadedItems.length,\r\n })),\r\n );\r\n })\r\n .pipe(\r\n concatAll(),\r\n publish(),\r\n refCount(),\r\n );\r\n }\r\n\r\n private async getItems(parent: TreeNodeItem | undefined): Promise<TreeNodeItemData[]> {\r\n if (isTreeDataProviderRaw(this._dataProvider)) {\r\n return this.getChildren(this._dataProvider, parent);\r\n }\r\n\r\n if (isTreeDataProviderMethod(this._dataProvider)) {\r\n return this._dataProvider(parent);\r\n }\r\n\r\n if (isTreeDataProviderPromise(this._dataProvider)) {\r\n this._dataProvider = await this._dataProvider;\r\n return this.getChildren(this._dataProvider, parent);\r\n }\r\n\r\n throw new UiError(UiComponents.loggerCategory(this), \"Unsupported TreeDataProvider.\");\r\n }\r\n\r\n private getChildren(rawProvider: TreeDataProviderRaw, parent: TreeNodeItem | undefined): TreeNodeItemData[] {\r\n if (parent === undefined)\r\n return rawProvider;\r\n\r\n return (parent as ImmediatelyLoadedTreeNodeItem).children ?? [];\r\n }\r\n}\r\n"]}
@@ -3,27 +3,25 @@
3
3
  */
4
4
  import { Observable } from "rxjs/internal/Observable";
5
5
  /**
6
- * Controls observable subscription order and timing.
6
+ * Limits concurrent observable subscriptions to one.
7
7
  *
8
- * Scheduled observables are placed at the end of a queue. The scheduler always
9
- * subscribes to at most one observable from the queue and waits until observables
10
- * either complete or get unscheduled before removing them from the queue.
8
+ * Scheduled observables are placed at the end of a queue. Each queued observable is subscribed to and awaited until the
9
+ * completion.
11
10
  *
12
11
  * To schedule an observable, subscribe to the result of `scheduleSubscription()` call.
13
12
  * @internal
14
13
  */
15
14
  export declare class SubscriptionScheduler<T> {
16
- private _scheduledObservables;
17
15
  private _scheduler;
18
16
  constructor();
19
17
  /**
20
18
  * Schedules `source` for subscription in the current scheduler.
21
19
  *
22
- * The actual scheduling is performed when the returned observable is subscribed to.
23
- * To cancel, simply remove all subscribers from the returned observable.
20
+ * The actual scheduling is performed when the returned observable is subscribed to. To cancel, remove all subscribers
21
+ * from the returned observable.
24
22
  *
25
23
  * @param source Input observable for which to schedule a subscription.
26
- * @returns Multicast observable which mirrors `source`.
24
+ * @returns Hot observable which starts emitting `source` values after subscription.
27
25
  */
28
26
  scheduleSubscription(source: Observable<T>): Observable<T>;
29
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SubscriptionScheduler.d.ts","sourceRoot":"","sources":["../../../../src/components-react/common/SubscriptionScheduler.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAiBtD;;;;;;;;;GASG;AACH,qBAAa,qBAAqB,CAAC,CAAC;IAElC,OAAO,CAAC,qBAAqB,CAA2C;IAGxE,OAAO,CAAC,UAAU,CAA2C;;IA0B7D;;;;;;;;OAQG;IACI,oBAAoB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;CA8ClE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,SAAS,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAErH"}
1
+ {"version":3,"file":"SubscriptionScheduler.d.ts","sourceRoot":"","sources":["../../../../src/components-react/common/SubscriptionScheduler.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAkBtD;;;;;;;;GAQG;AACH,qBAAa,qBAAqB,CAAC,CAAC;IAClC,OAAO,CAAC,UAAU,CAA2C;;IAwB7D;;;;;;;;OAQG;IACI,oBAAoB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;CASlE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,SAAS,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAErH"}
@@ -5,8 +5,9 @@
5
5
  /** @packageDocumentation
6
6
  * @module Common
7
7
  */
8
- import { BehaviorSubject } from "rxjs/internal/BehaviorSubject";
9
8
  import { defer } from "rxjs/internal/observable/defer";
9
+ import { EMPTY } from "rxjs/internal/observable/empty";
10
+ import { iif } from "rxjs/internal/observable/iif";
10
11
  import { finalize } from "rxjs/internal/operators/finalize";
11
12
  import { mergeMap } from "rxjs/internal/operators/mergeMap";
12
13
  import { observeOn } from "rxjs/internal/operators/observeOn";
@@ -14,87 +15,52 @@ import { onErrorResumeNext } from "rxjs/internal/operators/onErrorResumeNext";
14
15
  import { publish } from "rxjs/internal/operators/publish";
15
16
  import { refCount } from "rxjs/internal/operators/refCount";
16
17
  import { subscribeOn } from "rxjs/internal/operators/subscribeOn";
17
- import { switchAll } from "rxjs/internal/operators/switchAll";
18
18
  import { asapScheduler } from "rxjs/internal/scheduler/asap";
19
19
  import { queueScheduler } from "rxjs/internal/scheduler/queue";
20
20
  import { Subject } from "rxjs/internal/Subject";
21
21
  const MAX_CONCURRENT_SUBSCRIPTIONS = 1;
22
22
  /**
23
- * Controls observable subscription order and timing.
23
+ * Limits concurrent observable subscriptions to one.
24
24
  *
25
- * Scheduled observables are placed at the end of a queue. The scheduler always
26
- * subscribes to at most one observable from the queue and waits until observables
27
- * either complete or get unscheduled before removing them from the queue.
25
+ * Scheduled observables are placed at the end of a queue. Each queued observable is subscribed to and awaited until the
26
+ * completion.
28
27
  *
29
28
  * To schedule an observable, subscribe to the result of `scheduleSubscription()` call.
30
29
  * @internal
31
30
  */
32
31
  export class SubscriptionScheduler {
33
32
  constructor() {
34
- // Maps source observables to scheduled observables.
35
- this._scheduledObservables = new Map();
36
- // Subject that does the actual subscription scheduling
37
33
  this._scheduler = new Subject();
38
34
  this._scheduler
39
- .pipe(
40
- // Process all observables one by one in sequence
41
- mergeMap((sourceObservable) => sourceObservable.pipe(
35
+ .pipe(mergeMap((sourceObservable) => sourceObservable.pipe(
42
36
  // Connect the observable
43
37
  refCount(),
44
- // Guard against stack overflow when a lot of observables are scheduled.
45
- // Without this operation `mergeMap` will process each observable
46
- // that is present in the pipeline recursively.
38
+ // Guard against stack overflow when a lot of observables are scheduled. Without this operation `mergeMap`
39
+ // will process each observable that is present in the pipeline recursively.
47
40
  observeOn(queueScheduler),
48
- // Make sure that there is enough time to subscribe to a scheduled observable multiple times if needed
41
+ // Delay the connection until another event loop task
49
42
  subscribeOn(asapScheduler),
50
- // On error, proceed to the next observable. Outside subscribers will still receive an error notification.
43
+ // Ignore errors in this pipeline without suppressing them for other subscribers
51
44
  onErrorResumeNext()), MAX_CONCURRENT_SUBSCRIPTIONS))
52
- // Start the scheduler and wait for observables to be scheduled
45
+ // Start consuming scheduled observables
53
46
  .subscribe();
54
47
  }
55
48
  /**
56
49
  * Schedules `source` for subscription in the current scheduler.
57
50
  *
58
- * The actual scheduling is performed when the returned observable is subscribed to.
59
- * To cancel, simply remove all subscribers from the returned observable.
51
+ * The actual scheduling is performed when the returned observable is subscribed to. To cancel, remove all subscribers
52
+ * from the returned observable.
60
53
  *
61
54
  * @param source Input observable for which to schedule a subscription.
62
- * @returns Multicast observable which mirrors `source`.
55
+ * @returns Hot observable which starts emitting `source` values after subscription.
63
56
  */
64
57
  scheduleSubscription(source) {
65
- // On subscription, determine which observable to return
66
58
  return defer(() => {
67
- // If this observable has already been scheduled, return the scheduled observable
68
- let scheduledObservable = this._scheduledObservables.get(source);
69
- if (scheduledObservable) {
70
- return scheduledObservable;
71
- }
72
- // Create a subject which emits observable sources
73
- const sourceSubject = new BehaviorSubject(source.pipe(
74
- // When source completes, allow scheduler to move on to the next observable
75
- finalize(() => {
76
- sourceSubject.complete();
77
- })));
78
- // Create an observable which will be passed to the scheduler
79
- const connectableObservable = publish()(sourceSubject.pipe(
80
- // Unsubscribe from previous observable before subscribing to the next one
81
- switchAll()));
82
- // Create an observable which will be cached and returned
83
- scheduledObservable = connectableObservable.pipe(finalize(() => {
84
- // Invalidate cached scheduled observable
85
- this._scheduledObservables.delete(source);
86
- // Allow scheduler to move on to the next observable
87
- sourceSubject.complete();
88
- }),
89
- // Multicast values
90
- publish(),
91
- // Dispose the shared subscription when there are no subscribers left
92
- refCount());
93
- // Cache the scheduled observable
94
- this._scheduledObservables.set(source, scheduledObservable);
95
- // Schedule the subscription
59
+ let unsubscribed = false;
60
+ // Do not subscribe to source observable if it was unsubscribed from before being processed by the scheduler
61
+ const connectableObservable = iif(() => unsubscribed, EMPTY, source).pipe(publish());
96
62
  this._scheduler.next(connectableObservable);
97
- return scheduledObservable;
63
+ return connectableObservable.pipe(finalize(() => unsubscribed = true));
98
64
  });
99
65
  }
100
66
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SubscriptionScheduler.js","sourceRoot":"","sources":["../../../../src/components-react/common/SubscriptionScheduler.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Common\r\n */\r\n\r\nimport { BehaviorSubject } from \"rxjs/internal/BehaviorSubject\";\r\nimport { Observable } from \"rxjs/internal/Observable\";\r\nimport { ConnectableObservable } from \"rxjs/internal/observable/ConnectableObservable\";\r\nimport { defer } from \"rxjs/internal/observable/defer\";\r\nimport { finalize } from \"rxjs/internal/operators/finalize\";\r\nimport { mergeMap } from \"rxjs/internal/operators/mergeMap\";\r\nimport { observeOn } from \"rxjs/internal/operators/observeOn\";\r\nimport { onErrorResumeNext } from \"rxjs/internal/operators/onErrorResumeNext\";\r\nimport { publish } from \"rxjs/internal/operators/publish\";\r\nimport { refCount } from \"rxjs/internal/operators/refCount\";\r\nimport { subscribeOn } from \"rxjs/internal/operators/subscribeOn\";\r\nimport { switchAll } from \"rxjs/internal/operators/switchAll\";\r\nimport { asapScheduler } from \"rxjs/internal/scheduler/asap\";\r\nimport { queueScheduler } from \"rxjs/internal/scheduler/queue\";\r\nimport { Subject } from \"rxjs/internal/Subject\";\r\n\r\nconst MAX_CONCURRENT_SUBSCRIPTIONS = 1;\r\n\r\n/**\r\n * Controls observable subscription order and timing.\r\n *\r\n * Scheduled observables are placed at the end of a queue. The scheduler always\r\n * subscribes to at most one observable from the queue and waits until observables\r\n * either complete or get unscheduled before removing them from the queue.\r\n *\r\n * To schedule an observable, subscribe to the result of `scheduleSubscription()` call.\r\n * @internal\r\n */\r\nexport class SubscriptionScheduler<T> {\r\n // Maps source observables to scheduled observables.\r\n private _scheduledObservables = new Map<Observable<T>, Observable<T>>();\r\n\r\n // Subject that does the actual subscription scheduling\r\n private _scheduler = new Subject<ConnectableObservable<T>>();\r\n\r\n constructor() {\r\n this._scheduler\r\n .pipe(\r\n // Process all observables one by one in sequence\r\n mergeMap(\r\n (sourceObservable) => sourceObservable.pipe(\r\n // Connect the observable\r\n refCount(),\r\n // Guard against stack overflow when a lot of observables are scheduled.\r\n // Without this operation `mergeMap` will process each observable\r\n // that is present in the pipeline recursively.\r\n observeOn(queueScheduler),\r\n // Make sure that there is enough time to subscribe to a scheduled observable multiple times if needed\r\n subscribeOn(asapScheduler),\r\n // On error, proceed to the next observable. Outside subscribers will still receive an error notification.\r\n onErrorResumeNext(),\r\n ),\r\n MAX_CONCURRENT_SUBSCRIPTIONS,\r\n ),\r\n )\r\n // Start the scheduler and wait for observables to be scheduled\r\n .subscribe();\r\n }\r\n\r\n /**\r\n * Schedules `source` for subscription in the current scheduler.\r\n *\r\n * The actual scheduling is performed when the returned observable is subscribed to.\r\n * To cancel, simply remove all subscribers from the returned observable.\r\n *\r\n * @param source Input observable for which to schedule a subscription.\r\n * @returns Multicast observable which mirrors `source`.\r\n */\r\n public scheduleSubscription(source: Observable<T>): Observable<T> {\r\n // On subscription, determine which observable to return\r\n return defer(() => {\r\n // If this observable has already been scheduled, return the scheduled observable\r\n let scheduledObservable = this._scheduledObservables.get(source);\r\n if (scheduledObservable) {\r\n return scheduledObservable;\r\n }\r\n\r\n // Create a subject which emits observable sources\r\n const sourceSubject = new BehaviorSubject<Observable<T>>(source.pipe(\r\n // When source completes, allow scheduler to move on to the next observable\r\n finalize(() => {\r\n sourceSubject.complete();\r\n }),\r\n ));\r\n\r\n // Create an observable which will be passed to the scheduler\r\n const connectableObservable = publish<T>()(sourceSubject.pipe(\r\n // Unsubscribe from previous observable before subscribing to the next one\r\n switchAll(),\r\n ));\r\n\r\n // Create an observable which will be cached and returned\r\n scheduledObservable = connectableObservable.pipe(\r\n finalize(() => {\r\n // Invalidate cached scheduled observable\r\n this._scheduledObservables.delete(source);\r\n\r\n // Allow scheduler to move on to the next observable\r\n sourceSubject.complete();\r\n }),\r\n // Multicast values\r\n publish(),\r\n // Dispose the shared subscription when there are no subscribers left\r\n refCount(),\r\n );\r\n\r\n // Cache the scheduled observable\r\n this._scheduledObservables.set(source, scheduledObservable);\r\n\r\n // Schedule the subscription\r\n this._scheduler.next(connectableObservable);\r\n return scheduledObservable;\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Helper function for use as a `pipe()` argument with `rxjs` observables.\r\n * @internal\r\n */\r\nexport function scheduleSubscription<T>(scheduler: SubscriptionScheduler<T>): (source: Observable<T>) => Observable<T> {\r\n return (source) => scheduler.scheduleSubscription(source);\r\n}\r\n"]}
1
+ {"version":3,"file":"SubscriptionScheduler.js","sourceRoot":"","sources":["../../../../src/components-react/common/SubscriptionScheduler.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAIH,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAE,GAAG,EAAE,MAAM,8BAA8B,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAEvC;;;;;;;;GAQG;AACH,MAAM,OAAO,qBAAqB;IAGhC;QAFQ,eAAU,GAAG,IAAI,OAAO,EAA4B,CAAC;QAG3D,IAAI,CAAC,UAAU;aACZ,IAAI,CACH,QAAQ,CACN,CAAC,gBAAgB,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI;QACzC,yBAAyB;QACzB,QAAQ,EAAE;QACV,0GAA0G;QAC1G,4EAA4E;QAC5E,SAAS,CAAC,cAAc,CAAC;QACzB,qDAAqD;QACrD,WAAW,CAAC,aAAa,CAAC;QAC1B,gFAAgF;QAChF,iBAAiB,EAAE,CACpB,EACD,4BAA4B,CAC7B,CACF;YACD,wCAAwC;aACvC,SAAS,EAAE,CAAC;IACjB,CAAC;IAED;;;;;;;;OAQG;IACI,oBAAoB,CAAC,MAAqB;QAC/C,OAAO,KAAK,CAAC,GAAG,EAAE;YAChB,IAAI,YAAY,GAAG,KAAK,CAAC;YACzB,4GAA4G;YAC5G,MAAM,qBAAqB,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAA6B,CAAC;YACjH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAC5C,OAAO,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAI,SAAmC;IACzE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC5D,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Common\r\n */\r\n\r\nimport { Observable } from \"rxjs/internal/Observable\";\r\nimport { ConnectableObservable } from \"rxjs/internal/observable/ConnectableObservable\";\r\nimport { defer } from \"rxjs/internal/observable/defer\";\r\nimport { EMPTY } from \"rxjs/internal/observable/empty\";\r\nimport { iif } from \"rxjs/internal/observable/iif\";\r\nimport { finalize } from \"rxjs/internal/operators/finalize\";\r\nimport { mergeMap } from \"rxjs/internal/operators/mergeMap\";\r\nimport { observeOn } from \"rxjs/internal/operators/observeOn\";\r\nimport { onErrorResumeNext } from \"rxjs/internal/operators/onErrorResumeNext\";\r\nimport { publish } from \"rxjs/internal/operators/publish\";\r\nimport { refCount } from \"rxjs/internal/operators/refCount\";\r\nimport { subscribeOn } from \"rxjs/internal/operators/subscribeOn\";\r\nimport { asapScheduler } from \"rxjs/internal/scheduler/asap\";\r\nimport { queueScheduler } from \"rxjs/internal/scheduler/queue\";\r\nimport { Subject } from \"rxjs/internal/Subject\";\r\n\r\nconst MAX_CONCURRENT_SUBSCRIPTIONS = 1;\r\n\r\n/**\r\n * Limits concurrent observable subscriptions to one.\r\n *\r\n * Scheduled observables are placed at the end of a queue. Each queued observable is subscribed to and awaited until the\r\n * completion.\r\n *\r\n * To schedule an observable, subscribe to the result of `scheduleSubscription()` call.\r\n * @internal\r\n */\r\nexport class SubscriptionScheduler<T> {\r\n private _scheduler = new Subject<ConnectableObservable<T>>();\r\n\r\n constructor() {\r\n this._scheduler\r\n .pipe(\r\n mergeMap(\r\n (sourceObservable) => sourceObservable.pipe(\r\n // Connect the observable\r\n refCount(),\r\n // Guard against stack overflow when a lot of observables are scheduled. Without this operation `mergeMap`\r\n // will process each observable that is present in the pipeline recursively.\r\n observeOn(queueScheduler),\r\n // Delay the connection until another event loop task\r\n subscribeOn(asapScheduler),\r\n // Ignore errors in this pipeline without suppressing them for other subscribers\r\n onErrorResumeNext(),\r\n ),\r\n MAX_CONCURRENT_SUBSCRIPTIONS,\r\n ),\r\n )\r\n // Start consuming scheduled observables\r\n .subscribe();\r\n }\r\n\r\n /**\r\n * Schedules `source` for subscription in the current scheduler.\r\n *\r\n * The actual scheduling is performed when the returned observable is subscribed to. To cancel, remove all subscribers\r\n * from the returned observable.\r\n *\r\n * @param source Input observable for which to schedule a subscription.\r\n * @returns Hot observable which starts emitting `source` values after subscription.\r\n */\r\n public scheduleSubscription(source: Observable<T>): Observable<T> {\r\n return defer(() => {\r\n let unsubscribed = false;\r\n // Do not subscribe to source observable if it was unsubscribed from before being processed by the scheduler\r\n const connectableObservable = iif(() => unsubscribed, EMPTY, source).pipe(publish()) as ConnectableObservable<T>;\r\n this._scheduler.next(connectableObservable);\r\n return connectableObservable.pipe(finalize(() => unsubscribed = true));\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Helper function for use as a `pipe()` argument with `rxjs` observables.\r\n * @internal\r\n */\r\nexport function scheduleSubscription<T>(scheduler: SubscriptionScheduler<T>): (source: Observable<T>) => Observable<T> {\r\n return (source) => scheduler.scheduleSubscription(source);\r\n}\r\n"]}
@@ -71,6 +71,7 @@ export declare abstract class AbstractTreeNodeLoaderWithProvider<TDataProvider e
71
71
  export declare class TreeNodeLoader<TDataProvider extends TreeDataProvider> extends AbstractTreeNodeLoaderWithProvider<TDataProvider> implements IDisposable {
72
72
  private _treeDataSource;
73
73
  private _activeRequests;
74
+ private _scheduler;
74
75
  constructor(dataProvider: TDataProvider, modelSource: TreeModelSource);
75
76
  /** Disposes data source */
76
77
  dispose(): void;
@@ -78,16 +79,18 @@ export declare class TreeNodeLoader<TDataProvider extends TreeDataProvider> exte
78
79
  * Schedules to load children of node and returns an Observable.
79
80
  * @note It does not start loading node until '.subscribe()' is called on returned Observable.
80
81
  */
81
- protected load(parentNode: TreeModelNode | TreeModelRootNode): Observable<LoadedNodeHierarchy>;
82
- private loadForParent;
82
+ loadNode(parent: TreeModelNode | TreeModelRootNode, _childIndex?: number): Observable<TreeNodeLoadResult>;
83
+ protected load(): Observable<LoadedNodeHierarchy>;
83
84
  }
84
85
  /**
85
86
  * Default paged tree node loader with `TreeDataProvider` implementation.
86
87
  * @public
87
88
  */
88
89
  export declare class PagedTreeNodeLoader<TDataProvider extends TreeDataProvider> extends AbstractTreeNodeLoaderWithProvider<TDataProvider> implements IDisposable {
89
- private _pageLoader;
90
+ private _treeDataSource;
90
91
  private _pageSize;
92
+ private _activePageRequests;
93
+ private _scheduler;
91
94
  constructor(dataProvider: TDataProvider, modelSource: TreeModelSource, pageSize: number);
92
95
  /** Disposes data source */
93
96
  dispose(): void;
@@ -97,7 +100,8 @@ export declare class PagedTreeNodeLoader<TDataProvider extends TreeDataProvider>
97
100
  * Schedules to load one page of node children and returns an Observable.
98
101
  * @note It does not start loading node page until '.subscribe()' is called on returned Observable.
99
102
  */
100
- protected load(parentNode: TreeModelNode | TreeModelRootNode, childIndex: number): Observable<LoadedNodeHierarchy>;
103
+ loadNode(parent: TreeModelNode | TreeModelRootNode, childIndex: number): Observable<TreeNodeLoadResult>;
104
+ protected load(): Observable<LoadedNodeHierarchy>;
101
105
  }
102
106
  /**
103
107
  * Data structure that describes hierarchy loaded for parent node.
@@ -1 +1 @@
1
- {"version":3,"file":"TreeNodeLoader.d.ts","sourceRoot":"","sources":["../../../../../src/components-react/tree/controlled/TreeNodeLoader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TreeNodeLoader.d.ts","sourceRoot":"","sources":["../../../../../src/components-react/tree/controlled/TreeNodeLoader.ts"],"names":[],"mappings":"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"}
@@ -68,6 +68,7 @@ export class TreeNodeLoader extends AbstractTreeNodeLoaderWithProvider {
68
68
  constructor(dataProvider, modelSource) {
69
69
  super(modelSource, dataProvider);
70
70
  this._activeRequests = new Map();
71
+ this._scheduler = new SubscriptionScheduler();
71
72
  this._treeDataSource = new TreeDataSource(dataProvider);
72
73
  }
73
74
  /** Disposes data source */
@@ -76,19 +77,26 @@ export class TreeNodeLoader extends AbstractTreeNodeLoaderWithProvider {
76
77
  * Schedules to load children of node and returns an Observable.
77
78
  * @note It does not start loading node until '.subscribe()' is called on returned Observable.
78
79
  */
79
- load(parentNode) {
80
- const parentItem = isTreeModelNode(parentNode) ? parentNode.item : undefined;
81
- return this.loadForParent(parentItem, parentNode.numChildren === undefined);
80
+ loadNode(parent, _childIndex) {
81
+ return defer(() => {
82
+ const parentItem = isTreeModelNode(parent) ? parent.item : undefined;
83
+ const parentId = parentItem === null || parentItem === void 0 ? void 0 : parentItem.id;
84
+ const activeRequest = this._activeRequests.get(parentId);
85
+ if (activeRequest) {
86
+ return activeRequest;
87
+ }
88
+ const newRequest = requestLoadedHierarchy(parentItem, this._treeDataSource, 0, 0, parent.numChildren === undefined)
89
+ .pipe(map((loadedHierarchy) => {
90
+ this.updateModel(loadedHierarchy);
91
+ return { loadedNodes: collectTreeNodeItems(loadedHierarchy.hierarchyItems) };
92
+ }), scheduleSubscription(this._scheduler), finalize(() => this._activeRequests.delete(parentId)));
93
+ this._activeRequests.set(parentId, newRequest);
94
+ return newRequest;
95
+ });
82
96
  }
83
- loadForParent(parentItem, requestNumChildren) {
84
- const parentId = parentItem && parentItem.id;
85
- const activeRequest = this._activeRequests.get(parentId);
86
- if (activeRequest) {
87
- return activeRequest;
88
- }
89
- const newRequest = requestLoadedHierarchy(parentItem, this._treeDataSource, 0, 0, requestNumChildren, () => { this._activeRequests.delete(parentId); });
90
- this._activeRequests.set(parentId, newRequest);
91
- return newRequest;
97
+ // istanbul ignore next
98
+ load() {
99
+ throw new Error("Method not implemented.");
92
100
  }
93
101
  }
94
102
  /**
@@ -98,50 +106,51 @@ export class TreeNodeLoader extends AbstractTreeNodeLoaderWithProvider {
98
106
  export class PagedTreeNodeLoader extends AbstractTreeNodeLoaderWithProvider {
99
107
  constructor(dataProvider, modelSource, pageSize) {
100
108
  super(modelSource, dataProvider);
101
- this._pageLoader = new PageLoader(new TreeDataSource(dataProvider), pageSize);
109
+ this._treeDataSource = new TreeDataSource(dataProvider);
102
110
  this._pageSize = pageSize;
111
+ this._activePageRequests = new Map();
112
+ this._scheduler = new SubscriptionScheduler();
103
113
  }
104
114
  /** Disposes data source */
105
- dispose() { this._pageLoader.dispose(); }
115
+ dispose() { this._treeDataSource.dispose(); }
106
116
  /** Returns page size used by tree node loader. */
107
117
  get pageSize() { return this._pageSize; }
108
118
  /**
109
119
  * Schedules to load one page of node children and returns an Observable.
110
120
  * @note It does not start loading node page until '.subscribe()' is called on returned Observable.
111
121
  */
112
- load(parentNode, childIndex) {
113
- const parentItem = isTreeModelNode(parentNode) ? parentNode.item : undefined;
114
- return this._pageLoader.loadPageWithItem(parentItem, childIndex, parentNode.numChildren === undefined);
115
- }
116
- }
117
- class PageLoader {
118
- constructor(dataSource, pageSize) {
119
- this._activePageRequests = new Map();
120
- this._dataSource = dataSource;
121
- this._pageSize = pageSize;
122
- }
123
- dispose() { this._dataSource.dispose(); }
124
- loadPageWithItem(parentItem, itemIndex, requestNumChildren) {
125
- const parentId = parentItem && parentItem.id;
126
- const parentPageRequests = this._activePageRequests.get(parentId) || new Map();
127
- const page = Math.trunc(itemIndex / this._pageSize);
128
- const activeRequest = parentPageRequests.get(page);
129
- if (activeRequest) {
130
- return activeRequest;
131
- }
132
- const startIndex = page * this._pageSize;
133
- const newRequest = requestLoadedHierarchy(parentItem, this._dataSource, startIndex, this._pageSize, requestNumChildren, () => {
134
- parentPageRequests.delete(page);
135
- if (parentPageRequests.size === 0) {
136
- this._activePageRequests.delete(parentId);
122
+ loadNode(parent, childIndex) {
123
+ return defer(() => {
124
+ var _a;
125
+ const parentItem = isTreeModelNode(parent) ? parent.item : undefined;
126
+ const parentId = parentItem === null || parentItem === void 0 ? void 0 : parentItem.id;
127
+ const parentPageRequests = (_a = this._activePageRequests.get(parentId)) !== null && _a !== void 0 ? _a : new Map();
128
+ const page = Math.trunc(childIndex / this._pageSize);
129
+ const activeRequest = parentPageRequests.get(page);
130
+ if (activeRequest) {
131
+ return activeRequest;
137
132
  }
133
+ const startIndex = page * this._pageSize;
134
+ const newRequest = requestLoadedHierarchy(parentItem, this._treeDataSource, startIndex, this._pageSize, parent.numChildren === undefined).pipe(map((loadedHierarchy) => {
135
+ this.updateModel(loadedHierarchy);
136
+ return { loadedNodes: collectTreeNodeItems(loadedHierarchy.hierarchyItems) };
137
+ }), scheduleSubscription(this._scheduler), finalize(() => {
138
+ parentPageRequests.delete(page);
139
+ if (parentPageRequests.size === 0) {
140
+ this._activePageRequests.delete(parentId);
141
+ }
142
+ }));
143
+ parentPageRequests.set(page, newRequest);
144
+ this._activePageRequests.set(parentId, parentPageRequests);
145
+ return newRequest;
138
146
  });
139
- parentPageRequests.set(page, newRequest);
140
- this._activePageRequests.set(parentId, parentPageRequests);
141
- return newRequest;
147
+ }
148
+ // istanbul ignore next
149
+ load() {
150
+ throw new Error("Method not implemented.");
142
151
  }
143
152
  }
144
- function requestLoadedHierarchy(parentItem, dataSource, start, take, requestNumChildren, finalizeCallback) {
153
+ function requestLoadedHierarchy(parentItem, dataSource, start, take, requestNumChildren) {
145
154
  const parentId = parentItem && parentItem.id;
146
155
  return dataSource.requestItems(parentItem, start, take, requestNumChildren)
147
156
  .pipe(concatMap(({ numChildren, loadedItems }) => loadHierarchy(loadedItems, dataSource, take)
@@ -150,7 +159,7 @@ function requestLoadedHierarchy(parentItem, dataSource, start, take, requestNumC
150
159
  offset: start,
151
160
  hierarchyItems,
152
161
  numChildren,
153
- })))), finalize(finalizeCallback), publish(), refCount());
162
+ })))));
154
163
  }
155
164
  function loadHierarchy(rootItems, dataSource, take) {
156
165
  return from(rootItems)
@@ -1 +1 @@
1
- {"version":3,"file":"TreeNodeLoader.js","sourceRoot":"","sources":["../../../../../src/components-react/tree/controlled/TreeNodeLoader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Tree\r\n */\r\n\r\nimport { Observable as RxjsObservable } from \"rxjs/internal/Observable\";\r\nimport { defer } from \"rxjs/internal/observable/defer\";\r\nimport { from } from \"rxjs/internal/observable/from\";\r\nimport { of } from \"rxjs/internal/observable/of\";\r\nimport { concatAll } from \"rxjs/internal/operators/concatAll\";\r\nimport { concatMap } from \"rxjs/internal/operators/concatMap\";\r\nimport { finalize } from \"rxjs/internal/operators/finalize\";\r\nimport { map } from \"rxjs/internal/operators/map\";\r\nimport { publish } from \"rxjs/internal/operators/publish\";\r\nimport { refCount } from \"rxjs/internal/operators/refCount\";\r\nimport { toArray } from \"rxjs/internal/operators/toArray\";\r\nimport { BeEvent, IDisposable } from \"@itwin/core-bentley\";\r\nimport { UiError } from \"@itwin/appui-abstract\";\r\nimport { scheduleSubscription, SubscriptionScheduler } from \"../../common/SubscriptionScheduler\";\r\nimport { UiComponents } from \"../../UiComponents\";\r\nimport {\r\n ImmediatelyLoadedTreeNodeItem, isTreeDataProviderInterface, isTreeDataProviderMethod, isTreeDataProviderPromise, isTreeDataProviderRaw,\r\n TreeDataChangesListener, TreeDataProvider, TreeDataProviderRaw, TreeNodeItem,\r\n} from \"../TreeDataProvider\";\r\nimport { Observable, toRxjsObservable } from \"./Observable\";\r\nimport { isTreeModelNode, MutableTreeModel, TreeModelNode, TreeModelNodeInput, TreeModelRootNode, TreeNodeItemData } from \"./TreeModel\";\r\nimport { TreeModelSource } from \"./TreeModelSource\";\r\n\r\n/**\r\n * Data structure that describes node load result\r\n * @public\r\n */\r\nexport interface TreeNodeLoadResult {\r\n loadedNodes: TreeNodeItem[];\r\n}\r\n\r\n/**\r\n * Tree node loader which is used to load tree nodes.\r\n * @public\r\n */\r\nexport interface ITreeNodeLoader {\r\n /**\r\n * Loads node at specified place in tree.\r\n * @param parentId specifies tree branch\r\n * @param childIndex specifies offset in the branch.\r\n */\r\n loadNode(parentId: TreeModelNode | TreeModelRootNode, childIndex: number): Observable<TreeNodeLoadResult>;\r\n}\r\n\r\n/**\r\n * Tree node loader which uses `TreeDataProvider` to load nodes.\r\n * @public\r\n */\r\nexport interface ITreeNodeLoaderWithProvider<TDataProvider extends TreeDataProvider> extends ITreeNodeLoader {\r\n /** Returns `TreeDataProvider` used to load nodes. */\r\n readonly dataProvider: TDataProvider;\r\n}\r\n\r\n/**\r\n * Abstract node loader implementation which loads nodes into provided model source.\r\n * @public\r\n */\r\nexport abstract class AbstractTreeNodeLoader implements ITreeNodeLoader {\r\n private _treeModelSource: TreeModelSource;\r\n private _loadScheduler = new SubscriptionScheduler<TreeNodeLoadResult>();\r\n\r\n protected constructor(modelSource: TreeModelSource) {\r\n this._treeModelSource = modelSource;\r\n }\r\n\r\n public get modelSource() { return this._treeModelSource; }\r\n\r\n /** Do not override this method. @see `load` */\r\n public loadNode(parent: TreeModelNode | TreeModelRootNode, childIndex: number): Observable<TreeNodeLoadResult> {\r\n return toRxjsObservable(this.load(parent, childIndex)).pipe(\r\n map((loadedHierarchy) => {\r\n this.updateModel(loadedHierarchy);\r\n return { loadedNodes: collectTreeNodeItems(loadedHierarchy.hierarchyItems) };\r\n }),\r\n scheduleSubscription(this._loadScheduler),\r\n );\r\n }\r\n\r\n /**\r\n * A method that's called when `load` loads some nodes and we need to put them into model source. The\r\n * default implementation simply puts loaded child nodes under their parent at correct positions. Concrete\r\n * implementation may override this method to handle loaded nodes in a a custom way (put them at custom locations\r\n * in the hierarchy, etc.)\r\n */\r\n protected updateModel(loadedHierarchy: LoadedNodeHierarchy): void {\r\n handleLoadedNodeHierarchy(this._treeModelSource, loadedHierarchy);\r\n }\r\n\r\n /** An abstract method to load a node at the specific index for the specified parent. */\r\n protected abstract load(parent: TreeModelNode | TreeModelRootNode, childIndex: number): Observable<LoadedNodeHierarchy>;\r\n}\r\n\r\n/**\r\n * Abstract node loader with tree data provider which loads nodes into provided model source.\r\n * @public\r\n */\r\nexport abstract class AbstractTreeNodeLoaderWithProvider<TDataProvider extends TreeDataProvider> extends AbstractTreeNodeLoader implements ITreeNodeLoaderWithProvider<TDataProvider> {\r\n private _dataProvider: TDataProvider;\r\n\r\n protected constructor(modelSource: TreeModelSource, dataProvider: TDataProvider) {\r\n super(modelSource);\r\n this._dataProvider = dataProvider;\r\n }\r\n\r\n public get dataProvider() { return this._dataProvider; }\r\n}\r\n\r\n/**\r\n * Default tree node loader with `TreeDataProvider` implementation.\r\n * @public\r\n */\r\nexport class TreeNodeLoader<TDataProvider extends TreeDataProvider> extends AbstractTreeNodeLoaderWithProvider<TDataProvider> implements IDisposable {\r\n private _treeDataSource: TreeDataSource;\r\n private _activeRequests = new Map<string | undefined, RxjsObservable<LoadedNodeHierarchy>>();\r\n\r\n constructor(dataProvider: TDataProvider, modelSource: TreeModelSource) {\r\n super(modelSource, dataProvider);\r\n this._treeDataSource = new TreeDataSource(dataProvider);\r\n }\r\n\r\n /** Disposes data source */\r\n public dispose() { this._treeDataSource.dispose(); }\r\n\r\n /**\r\n * Schedules to load children of node and returns an Observable.\r\n * @note It does not start loading node until '.subscribe()' is called on returned Observable.\r\n */\r\n protected load(parentNode: TreeModelNode | TreeModelRootNode): Observable<LoadedNodeHierarchy> {\r\n const parentItem = isTreeModelNode(parentNode) ? parentNode.item : undefined;\r\n return this.loadForParent(parentItem, parentNode.numChildren === undefined);\r\n }\r\n\r\n private loadForParent(parentItem: TreeNodeItem | undefined, requestNumChildren: boolean): RxjsObservable<LoadedNodeHierarchy> {\r\n const parentId = parentItem && parentItem.id;\r\n const activeRequest = this._activeRequests.get(parentId);\r\n if (activeRequest) {\r\n return activeRequest;\r\n }\r\n\r\n const newRequest = requestLoadedHierarchy(parentItem, this._treeDataSource, 0, 0, requestNumChildren,\r\n () => { this._activeRequests.delete(parentId); },\r\n );\r\n\r\n this._activeRequests.set(parentId, newRequest);\r\n return newRequest;\r\n }\r\n}\r\n\r\n/**\r\n * Default paged tree node loader with `TreeDataProvider` implementation.\r\n * @public\r\n */\r\nexport class PagedTreeNodeLoader<TDataProvider extends TreeDataProvider> extends AbstractTreeNodeLoaderWithProvider<TDataProvider> implements IDisposable {\r\n private _pageLoader: PageLoader;\r\n private _pageSize: number;\r\n\r\n constructor(dataProvider: TDataProvider, modelSource: TreeModelSource, pageSize: number) {\r\n super(modelSource, dataProvider);\r\n this._pageLoader = new PageLoader(new TreeDataSource(dataProvider), pageSize);\r\n this._pageSize = pageSize;\r\n }\r\n\r\n /** Disposes data source */\r\n public dispose() { this._pageLoader.dispose(); }\r\n\r\n /** Returns page size used by tree node loader. */\r\n public get pageSize(): number { return this._pageSize; }\r\n\r\n /**\r\n * Schedules to load one page of node children and returns an Observable.\r\n * @note It does not start loading node page until '.subscribe()' is called on returned Observable.\r\n */\r\n protected load(parentNode: TreeModelNode | TreeModelRootNode, childIndex: number): Observable<LoadedNodeHierarchy> {\r\n const parentItem = isTreeModelNode(parentNode) ? parentNode.item : undefined;\r\n return this._pageLoader.loadPageWithItem(parentItem, childIndex, parentNode.numChildren === undefined);\r\n }\r\n}\r\n\r\n/**\r\n * Data structure that describes hierarchy loaded for parent node.\r\n * @public\r\n */\r\nexport interface LoadedNodeHierarchy {\r\n /** Node id of the parent node for loaded hierarchy. */\r\n parentId: string | undefined;\r\n /** Hierarchy items offset in parent node children array. */\r\n offset: number;\r\n /** Loaded hierarchy items. */\r\n hierarchyItems: LoadedNodeHierarchyItem[];\r\n /** Number of children parent node has. */\r\n numChildren?: number;\r\n}\r\n\r\n/**\r\n * Data structure that describes one loaded hierarchy item.\r\n * @public\r\n */\r\nexport interface LoadedNodeHierarchyItem {\r\n /** Loaded tree node item. */\r\n item: TreeNodeItemData;\r\n /** Children of loaded tree node item. */\r\n children?: LoadedNodeHierarchyItem[];\r\n /** Number of children tree node item has. */\r\n numChildren?: number;\r\n}\r\n\r\nclass PageLoader implements IDisposable {\r\n private _dataSource: TreeDataSource;\r\n private _pageSize: number;\r\n private _activePageRequests = new Map<string | undefined, Map<number, RxjsObservable<LoadedNodeHierarchy>>>();\r\n\r\n constructor(\r\n dataSource: TreeDataSource,\r\n pageSize: number,\r\n ) {\r\n this._dataSource = dataSource;\r\n this._pageSize = pageSize;\r\n }\r\n\r\n public dispose() { this._dataSource.dispose(); }\r\n\r\n public loadPageWithItem(\r\n parentItem: TreeNodeItem | undefined,\r\n itemIndex: number,\r\n requestNumChildren: boolean,\r\n ): RxjsObservable<LoadedNodeHierarchy> {\r\n const parentId = parentItem && parentItem.id;\r\n const parentPageRequests = this._activePageRequests.get(parentId) || new Map<number, RxjsObservable<LoadedNodeHierarchy>>();\r\n const page = Math.trunc(itemIndex / this._pageSize);\r\n const activeRequest = parentPageRequests.get(page);\r\n if (activeRequest) {\r\n return activeRequest;\r\n }\r\n\r\n const startIndex = page * this._pageSize;\r\n const newRequest = requestLoadedHierarchy(parentItem, this._dataSource, startIndex, this._pageSize, requestNumChildren,\r\n () => {\r\n parentPageRequests.delete(page);\r\n if (parentPageRequests.size === 0) {\r\n this._activePageRequests.delete(parentId);\r\n }\r\n },\r\n );\r\n\r\n parentPageRequests.set(page, newRequest);\r\n this._activePageRequests.set(parentId, parentPageRequests);\r\n return newRequest;\r\n }\r\n}\r\n\r\nfunction requestLoadedHierarchy(\r\n parentItem: TreeNodeItem | undefined,\r\n dataSource: TreeDataSource,\r\n start: number,\r\n take: number,\r\n requestNumChildren: boolean,\r\n finalizeCallback: () => void,\r\n) {\r\n const parentId = parentItem && parentItem.id;\r\n return dataSource.requestItems(parentItem, start, take, requestNumChildren)\r\n .pipe(\r\n concatMap(({ numChildren, loadedItems }) => loadHierarchy(loadedItems, dataSource, take)\r\n .pipe(\r\n map((hierarchyItems) => ({\r\n parentId,\r\n offset: start,\r\n hierarchyItems,\r\n numChildren,\r\n })),\r\n ),\r\n ),\r\n finalize(finalizeCallback),\r\n publish(),\r\n refCount(),\r\n );\r\n}\r\n\r\nfunction loadHierarchy(rootItems: TreeNodeItemData[], dataSource: TreeDataSource, take: number): RxjsObservable<LoadedNodeHierarchyItem[]> {\r\n return from(rootItems)\r\n .pipe(\r\n concatMap((item) => {\r\n if (!item.autoExpand || item.children) {\r\n return of(convertToLoadedNodeHierarchyItem(item));\r\n }\r\n\r\n return dataSource.requestItems(item, 0, take, true)\r\n .pipe(\r\n concatMap(({ numChildren, loadedItems }) => loadHierarchy(loadedItems, dataSource, take)\r\n .pipe(\r\n map((children) => ({ item, children, numChildren })),\r\n ),\r\n ),\r\n );\r\n }),\r\n toArray(),\r\n );\r\n}\r\n\r\nfunction convertToLoadedNodeHierarchyItem(item: TreeNodeItemData): LoadedNodeHierarchyItem {\r\n return {\r\n item,\r\n children: item.children ? item.children.map((child) => convertToLoadedNodeHierarchyItem(child)) : undefined,\r\n numChildren: item.children ? item.children.length : undefined,\r\n };\r\n}\r\n\r\nfunction collectTreeNodeItems(hierarchyItems: LoadedNodeHierarchyItem[], result: TreeNodeItem[] = []) {\r\n for (const hierarchyItem of hierarchyItems) {\r\n result.push(hierarchyItem.item);\r\n if (hierarchyItem.children)\r\n collectTreeNodeItems(hierarchyItem.children, result);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/** @internal */\r\nexport function handleLoadedNodeHierarchy(modelSource: TreeModelSource, loadedHierarchy: LoadedNodeHierarchy) {\r\n modelSource.modifyModel((model) => {\r\n if (loadedHierarchy.parentId !== undefined) {\r\n // Make sure the model sill contains the parent node\r\n /* istanbul ignore if */\r\n if (model.getNode(loadedHierarchy.parentId) === undefined)\r\n return;\r\n }\r\n\r\n updateChildren(model, loadedHierarchy.parentId, loadedHierarchy.hierarchyItems, loadedHierarchy.offset, loadedHierarchy.numChildren);\r\n if (loadedHierarchy.parentId !== undefined) {\r\n const parentNode = model.getNode(loadedHierarchy.parentId);\r\n /* istanbul ignore else */\r\n if (parentNode && parentNode.isLoading && parentNode.numChildren !== undefined) {\r\n parentNode.isLoading = false;\r\n }\r\n }\r\n });\r\n}\r\n\r\nfunction updateChildren(\r\n model: MutableTreeModel,\r\n parentId: string | undefined,\r\n hierarchyItems: LoadedNodeHierarchyItem[],\r\n startIndex: number,\r\n numChildren?: number,\r\n) {\r\n // numChildren set to undefined indicates that this is not the first request for children\r\n if (numChildren !== undefined) {\r\n model.setNumChildren(parentId, numChildren);\r\n }\r\n\r\n // if children array is undefined do not add children as they should be disposed\r\n if (model.getChildren(parentId) === undefined) {\r\n return;\r\n }\r\n\r\n let offset = startIndex;\r\n for (const hierarchyItem of hierarchyItems) {\r\n const nodeInput = convertToTreeModelNodeInput(hierarchyItem.item);\r\n const existingNode = model.getNode(hierarchyItem.item.id);\r\n\r\n // if same item exists in the same position and is expanded update it without removing it's subtree\r\n if (!existingNode || !existingNode.isExpanded || model.getChildOffset(parentId, existingNode.id) !== offset || nodeInput.numChildren === 0) {\r\n model.setChildren(parentId, [nodeInput], offset);\r\n } else {\r\n existingNode.label = nodeInput.label;\r\n existingNode.description = nodeInput.description ?? \"\";\r\n existingNode.item = nodeInput.item;\r\n }\r\n\r\n if (hierarchyItem.children) {\r\n updateChildren(model, hierarchyItem.item.id, hierarchyItem.children, 0, hierarchyItem.numChildren);\r\n }\r\n offset++;\r\n }\r\n}\r\n\r\nfunction convertToTreeModelNodeInput(item: TreeNodeItemData): TreeModelNodeInput {\r\n let numChildren: number | undefined;\r\n if (item.children) {\r\n numChildren = item.children.length;\r\n } else if (!item.hasChildren) {\r\n numChildren = 0;\r\n }\r\n\r\n return {\r\n description: item.description,\r\n isExpanded: !!item.autoExpand,\r\n id: item.id,\r\n item,\r\n label: item.label,\r\n isLoading: false,\r\n numChildren,\r\n isSelected: false,\r\n };\r\n}\r\n\r\ninterface TreeDataSourceResult {\r\n loadedItems: TreeNodeItemData[];\r\n numChildren?: number;\r\n}\r\n\r\n/**\r\n * Wrapper to handle different types of `TreeDataProvider`. Provides one method\r\n * to request items from `TreeDataProviderRaw`, `TreeDataProviderMethod`,\r\n * `TreeDataProviderPromise` or `TreeDataProviderInterface`.\r\n *\r\n * @internal\r\n */\r\nexport class TreeDataSource implements IDisposable {\r\n private _dataProvider: TreeDataProvider;\r\n private _disposeTreeNodesChangedListener?: () => void;\r\n\r\n public readonly onItemsChanged = new BeEvent<TreeDataChangesListener>();\r\n\r\n constructor(dataProvider: TreeDataProvider) {\r\n this._dataProvider = dataProvider;\r\n\r\n // eslint-disable-next-line deprecation/deprecation\r\n if (isTreeDataProviderInterface(this._dataProvider) && this._dataProvider.onTreeNodeChanged) {\r\n // eslint-disable-next-line deprecation/deprecation\r\n this._disposeTreeNodesChangedListener = this._dataProvider.onTreeNodeChanged.addListener(\r\n (changedItems) => this.onItemsChanged.raiseEvent(changedItems),\r\n );\r\n }\r\n }\r\n\r\n public dispose() {\r\n this._disposeTreeNodesChangedListener && this._disposeTreeNodesChangedListener();\r\n }\r\n\r\n public requestItems(\r\n parent: TreeNodeItem | undefined,\r\n firstItemIndex: number,\r\n numItems: number,\r\n requestNumChildren: boolean,\r\n ): RxjsObservable<TreeDataSourceResult> {\r\n // During each async operation there is a chance that data provider will become stale. Create an opportunity to\r\n // unsubscribe after each async operation so that we stop interacting with the stale data provider immediately.\r\n return defer(async () => {\r\n if (isTreeDataProviderInterface(this._dataProvider)) {\r\n const dataProvider = this._dataProvider;\r\n return from(requestNumChildren ? dataProvider.getNodesCount(parent) : [undefined])\r\n .pipe(\r\n concatMap(async (numChildren) => {\r\n const pageOptions = numItems !== 0 ? { size: numItems, start: firstItemIndex } : undefined;\r\n return {\r\n loadedItems: await dataProvider.getNodes(parent, pageOptions),\r\n numChildren,\r\n };\r\n }),\r\n );\r\n }\r\n\r\n return from(this.getItems(parent))\r\n .pipe(\r\n map((loadedItems) => ({\r\n loadedItems: numItems !== 0 ? loadedItems.slice(firstItemIndex, firstItemIndex + numItems) : loadedItems,\r\n numChildren: loadedItems.length,\r\n })),\r\n );\r\n })\r\n .pipe(\r\n concatAll(),\r\n publish(),\r\n refCount(),\r\n );\r\n }\r\n\r\n private async getItems(parent: TreeNodeItem | undefined): Promise<TreeNodeItemData[]> {\r\n if (isTreeDataProviderRaw(this._dataProvider)) {\r\n return this.getChildren(this._dataProvider, parent);\r\n }\r\n\r\n if (isTreeDataProviderMethod(this._dataProvider)) {\r\n return this._dataProvider(parent);\r\n }\r\n\r\n if (isTreeDataProviderPromise(this._dataProvider)) {\r\n this._dataProvider = await this._dataProvider;\r\n return this.getChildren(this._dataProvider, parent);\r\n }\r\n\r\n throw new UiError(UiComponents.loggerCategory(this), \"Unsupported TreeDataProvider.\");\r\n }\r\n\r\n private getChildren(rawProvider: TreeDataProviderRaw, parent: TreeNodeItem | undefined): TreeNodeItemData[] {\r\n if (parent === undefined)\r\n return rawProvider;\r\n\r\n return (parent as ImmediatelyLoadedTreeNodeItem).children ?? [];\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"TreeNodeLoader.js","sourceRoot":"","sources":["../../../../../src/components-react/tree/controlled/TreeNodeLoader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Tree\r\n */\r\n\r\nimport { Observable as RxjsObservable } from \"rxjs/internal/Observable\";\r\nimport { defer } from \"rxjs/internal/observable/defer\";\r\nimport { from } from \"rxjs/internal/observable/from\";\r\nimport { of } from \"rxjs/internal/observable/of\";\r\nimport { concatAll } from \"rxjs/internal/operators/concatAll\";\r\nimport { concatMap } from \"rxjs/internal/operators/concatMap\";\r\nimport { finalize } from \"rxjs/internal/operators/finalize\";\r\nimport { map } from \"rxjs/internal/operators/map\";\r\nimport { publish } from \"rxjs/internal/operators/publish\";\r\nimport { refCount } from \"rxjs/internal/operators/refCount\";\r\nimport { toArray } from \"rxjs/internal/operators/toArray\";\r\nimport { BeEvent, IDisposable } from \"@itwin/core-bentley\";\r\nimport { UiError } from \"@itwin/appui-abstract\";\r\nimport { scheduleSubscription, SubscriptionScheduler } from \"../../common/SubscriptionScheduler\";\r\nimport { UiComponents } from \"../../UiComponents\";\r\nimport {\r\n ImmediatelyLoadedTreeNodeItem, isTreeDataProviderInterface, isTreeDataProviderMethod, isTreeDataProviderPromise, isTreeDataProviderRaw,\r\n TreeDataChangesListener, TreeDataProvider, TreeDataProviderRaw, TreeNodeItem,\r\n} from \"../TreeDataProvider\";\r\nimport { Observable, toRxjsObservable } from \"./Observable\";\r\nimport { isTreeModelNode, MutableTreeModel, TreeModelNode, TreeModelNodeInput, TreeModelRootNode, TreeNodeItemData } from \"./TreeModel\";\r\nimport { TreeModelSource } from \"./TreeModelSource\";\r\n\r\n/**\r\n * Data structure that describes node load result\r\n * @public\r\n */\r\nexport interface TreeNodeLoadResult {\r\n loadedNodes: TreeNodeItem[];\r\n}\r\n\r\n/**\r\n * Tree node loader which is used to load tree nodes.\r\n * @public\r\n */\r\nexport interface ITreeNodeLoader {\r\n /**\r\n * Loads node at specified place in tree.\r\n * @param parentId specifies tree branch\r\n * @param childIndex specifies offset in the branch.\r\n */\r\n loadNode(parentId: TreeModelNode | TreeModelRootNode, childIndex: number): Observable<TreeNodeLoadResult>;\r\n}\r\n\r\n/**\r\n * Tree node loader which uses `TreeDataProvider` to load nodes.\r\n * @public\r\n */\r\nexport interface ITreeNodeLoaderWithProvider<TDataProvider extends TreeDataProvider> extends ITreeNodeLoader {\r\n /** Returns `TreeDataProvider` used to load nodes. */\r\n readonly dataProvider: TDataProvider;\r\n}\r\n\r\n/**\r\n * Abstract node loader implementation which loads nodes into provided model source.\r\n * @public\r\n */\r\nexport abstract class AbstractTreeNodeLoader implements ITreeNodeLoader {\r\n private _treeModelSource: TreeModelSource;\r\n private _loadScheduler = new SubscriptionScheduler<TreeNodeLoadResult>();\r\n\r\n protected constructor(modelSource: TreeModelSource) {\r\n this._treeModelSource = modelSource;\r\n }\r\n\r\n public get modelSource() { return this._treeModelSource; }\r\n\r\n /** Do not override this method. @see `load` */\r\n public loadNode(parent: TreeModelNode | TreeModelRootNode, childIndex: number): Observable<TreeNodeLoadResult> {\r\n return toRxjsObservable(this.load(parent, childIndex)).pipe(\r\n map((loadedHierarchy) => {\r\n this.updateModel(loadedHierarchy);\r\n return { loadedNodes: collectTreeNodeItems(loadedHierarchy.hierarchyItems) };\r\n }),\r\n scheduleSubscription(this._loadScheduler),\r\n );\r\n }\r\n\r\n /**\r\n * A method that's called when `load` loads some nodes and we need to put them into model source. The\r\n * default implementation simply puts loaded child nodes under their parent at correct positions. Concrete\r\n * implementation may override this method to handle loaded nodes in a a custom way (put them at custom locations\r\n * in the hierarchy, etc.)\r\n */\r\n protected updateModel(loadedHierarchy: LoadedNodeHierarchy): void {\r\n handleLoadedNodeHierarchy(this._treeModelSource, loadedHierarchy);\r\n }\r\n\r\n /** An abstract method to load a node at the specific index for the specified parent. */\r\n protected abstract load(parent: TreeModelNode | TreeModelRootNode, childIndex: number): Observable<LoadedNodeHierarchy>;\r\n}\r\n\r\n/**\r\n * Abstract node loader with tree data provider which loads nodes into provided model source.\r\n * @public\r\n */\r\nexport abstract class AbstractTreeNodeLoaderWithProvider<TDataProvider extends TreeDataProvider> extends AbstractTreeNodeLoader implements ITreeNodeLoaderWithProvider<TDataProvider> {\r\n private _dataProvider: TDataProvider;\r\n\r\n protected constructor(modelSource: TreeModelSource, dataProvider: TDataProvider) {\r\n super(modelSource);\r\n this._dataProvider = dataProvider;\r\n }\r\n\r\n public get dataProvider() { return this._dataProvider; }\r\n}\r\n\r\n/**\r\n * Default tree node loader with `TreeDataProvider` implementation.\r\n * @public\r\n */\r\nexport class TreeNodeLoader<TDataProvider extends TreeDataProvider> extends AbstractTreeNodeLoaderWithProvider<TDataProvider> implements IDisposable {\r\n private _treeDataSource: TreeDataSource;\r\n private _activeRequests = new Map<string | undefined, RxjsObservable<TreeNodeLoadResult>>();\r\n private _scheduler = new SubscriptionScheduler<TreeNodeLoadResult>();\r\n\r\n constructor(dataProvider: TDataProvider, modelSource: TreeModelSource) {\r\n super(modelSource, dataProvider);\r\n this._treeDataSource = new TreeDataSource(dataProvider);\r\n }\r\n\r\n /** Disposes data source */\r\n public dispose() { this._treeDataSource.dispose(); }\r\n\r\n /**\r\n * Schedules to load children of node and returns an Observable.\r\n * @note It does not start loading node until '.subscribe()' is called on returned Observable.\r\n */\r\n public override loadNode(parent: TreeModelNode | TreeModelRootNode, _childIndex?: number): Observable<TreeNodeLoadResult> {\r\n return defer(() => {\r\n const parentItem = isTreeModelNode(parent) ? parent.item : undefined;\r\n const parentId = parentItem?.id;\r\n const activeRequest = this._activeRequests.get(parentId);\r\n if (activeRequest) {\r\n return activeRequest;\r\n }\r\n\r\n const newRequest = requestLoadedHierarchy(parentItem, this._treeDataSource, 0, 0, parent.numChildren === undefined)\r\n .pipe(\r\n map((loadedHierarchy) => {\r\n this.updateModel(loadedHierarchy);\r\n return { loadedNodes: collectTreeNodeItems(loadedHierarchy.hierarchyItems) };\r\n }),\r\n scheduleSubscription(this._scheduler),\r\n finalize(() => this._activeRequests.delete(parentId))\r\n );\r\n this._activeRequests.set(parentId, newRequest);\r\n return newRequest;\r\n });\r\n }\r\n\r\n // istanbul ignore next\r\n protected load(): Observable<LoadedNodeHierarchy> {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n}\r\n\r\n/**\r\n * Default paged tree node loader with `TreeDataProvider` implementation.\r\n * @public\r\n */\r\nexport class PagedTreeNodeLoader<TDataProvider extends TreeDataProvider> extends AbstractTreeNodeLoaderWithProvider<TDataProvider> implements IDisposable {\r\n private _treeDataSource: TreeDataSource;\r\n private _pageSize: number;\r\n private _activePageRequests: Map<string | undefined, Map<number, Observable<TreeNodeLoadResult>>>;\r\n private _scheduler: SubscriptionScheduler<TreeNodeLoadResult>;\r\n\r\n constructor(dataProvider: TDataProvider, modelSource: TreeModelSource, pageSize: number) {\r\n super(modelSource, dataProvider);\r\n this._treeDataSource = new TreeDataSource(dataProvider);\r\n this._pageSize = pageSize;\r\n this._activePageRequests = new Map();\r\n this._scheduler = new SubscriptionScheduler();\r\n }\r\n\r\n /** Disposes data source */\r\n public dispose() { this._treeDataSource.dispose(); }\r\n\r\n /** Returns page size used by tree node loader. */\r\n public get pageSize(): number { return this._pageSize; }\r\n\r\n /**\r\n * Schedules to load one page of node children and returns an Observable.\r\n * @note It does not start loading node page until '.subscribe()' is called on returned Observable.\r\n */\r\n public override loadNode(parent: TreeModelNode | TreeModelRootNode, childIndex: number): Observable<TreeNodeLoadResult> {\r\n return defer(() => {\r\n const parentItem = isTreeModelNode(parent) ? parent.item : undefined;\r\n const parentId = parentItem?.id;\r\n const parentPageRequests = this._activePageRequests.get(parentId)\r\n ?? new Map<number, Observable<TreeNodeLoadResult>>();\r\n const page = Math.trunc(childIndex / this._pageSize);\r\n const activeRequest = parentPageRequests.get(page);\r\n if (activeRequest) {\r\n return activeRequest;\r\n }\r\n\r\n const startIndex = page * this._pageSize;\r\n const newRequest = requestLoadedHierarchy(\r\n parentItem,\r\n this._treeDataSource,\r\n startIndex,\r\n this._pageSize,\r\n parent.numChildren === undefined,\r\n ).pipe(\r\n map((loadedHierarchy) => {\r\n this.updateModel(loadedHierarchy);\r\n return { loadedNodes: collectTreeNodeItems(loadedHierarchy.hierarchyItems) };\r\n }),\r\n scheduleSubscription(this._scheduler),\r\n finalize(() => {\r\n parentPageRequests.delete(page);\r\n if (parentPageRequests.size === 0) {\r\n this._activePageRequests.delete(parentId);\r\n }\r\n }),\r\n );\r\n\r\n parentPageRequests.set(page, newRequest);\r\n this._activePageRequests.set(parentId, parentPageRequests);\r\n return newRequest;\r\n });\r\n }\r\n\r\n // istanbul ignore next\r\n protected load(): Observable<LoadedNodeHierarchy> {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n}\r\n\r\n/**\r\n * Data structure that describes hierarchy loaded for parent node.\r\n * @public\r\n */\r\nexport interface LoadedNodeHierarchy {\r\n /** Node id of the parent node for loaded hierarchy. */\r\n parentId: string | undefined;\r\n /** Hierarchy items offset in parent node children array. */\r\n offset: number;\r\n /** Loaded hierarchy items. */\r\n hierarchyItems: LoadedNodeHierarchyItem[];\r\n /** Number of children parent node has. */\r\n numChildren?: number;\r\n}\r\n\r\n/**\r\n * Data structure that describes one loaded hierarchy item.\r\n * @public\r\n */\r\nexport interface LoadedNodeHierarchyItem {\r\n /** Loaded tree node item. */\r\n item: TreeNodeItemData;\r\n /** Children of loaded tree node item. */\r\n children?: LoadedNodeHierarchyItem[];\r\n /** Number of children tree node item has. */\r\n numChildren?: number;\r\n}\r\n\r\nfunction requestLoadedHierarchy(\r\n parentItem: TreeNodeItem | undefined,\r\n dataSource: TreeDataSource,\r\n start: number,\r\n take: number,\r\n requestNumChildren: boolean,\r\n) {\r\n const parentId = parentItem && parentItem.id;\r\n return dataSource.requestItems(parentItem, start, take, requestNumChildren)\r\n .pipe(\r\n concatMap(({ numChildren, loadedItems }) => loadHierarchy(loadedItems, dataSource, take)\r\n .pipe(\r\n map((hierarchyItems) => ({\r\n parentId,\r\n offset: start,\r\n hierarchyItems,\r\n numChildren,\r\n })),\r\n ),\r\n ),\r\n );\r\n}\r\n\r\nfunction loadHierarchy(rootItems: TreeNodeItemData[], dataSource: TreeDataSource, take: number): RxjsObservable<LoadedNodeHierarchyItem[]> {\r\n return from(rootItems)\r\n .pipe(\r\n concatMap((item) => {\r\n if (!item.autoExpand || item.children) {\r\n return of(convertToLoadedNodeHierarchyItem(item));\r\n }\r\n\r\n return dataSource.requestItems(item, 0, take, true)\r\n .pipe(\r\n concatMap(({ numChildren, loadedItems }) => loadHierarchy(loadedItems, dataSource, take)\r\n .pipe(\r\n map((children) => ({ item, children, numChildren })),\r\n ),\r\n ),\r\n );\r\n }),\r\n toArray(),\r\n );\r\n}\r\n\r\nfunction convertToLoadedNodeHierarchyItem(item: TreeNodeItemData): LoadedNodeHierarchyItem {\r\n return {\r\n item,\r\n children: item.children ? item.children.map((child) => convertToLoadedNodeHierarchyItem(child)) : undefined,\r\n numChildren: item.children ? item.children.length : undefined,\r\n };\r\n}\r\n\r\nfunction collectTreeNodeItems(hierarchyItems: LoadedNodeHierarchyItem[], result: TreeNodeItem[] = []) {\r\n for (const hierarchyItem of hierarchyItems) {\r\n result.push(hierarchyItem.item);\r\n if (hierarchyItem.children)\r\n collectTreeNodeItems(hierarchyItem.children, result);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/** @internal */\r\nexport function handleLoadedNodeHierarchy(modelSource: TreeModelSource, loadedHierarchy: LoadedNodeHierarchy) {\r\n modelSource.modifyModel((model) => {\r\n if (loadedHierarchy.parentId !== undefined) {\r\n // Make sure the model sill contains the parent node\r\n /* istanbul ignore if */\r\n if (model.getNode(loadedHierarchy.parentId) === undefined)\r\n return;\r\n }\r\n\r\n updateChildren(model, loadedHierarchy.parentId, loadedHierarchy.hierarchyItems, loadedHierarchy.offset, loadedHierarchy.numChildren);\r\n if (loadedHierarchy.parentId !== undefined) {\r\n const parentNode = model.getNode(loadedHierarchy.parentId);\r\n /* istanbul ignore else */\r\n if (parentNode && parentNode.isLoading && parentNode.numChildren !== undefined) {\r\n parentNode.isLoading = false;\r\n }\r\n }\r\n });\r\n}\r\n\r\nfunction updateChildren(\r\n model: MutableTreeModel,\r\n parentId: string | undefined,\r\n hierarchyItems: LoadedNodeHierarchyItem[],\r\n startIndex: number,\r\n numChildren?: number,\r\n) {\r\n // numChildren set to undefined indicates that this is not the first request for children\r\n if (numChildren !== undefined) {\r\n model.setNumChildren(parentId, numChildren);\r\n }\r\n\r\n // if children array is undefined do not add children as they should be disposed\r\n if (model.getChildren(parentId) === undefined) {\r\n return;\r\n }\r\n\r\n let offset = startIndex;\r\n for (const hierarchyItem of hierarchyItems) {\r\n const nodeInput = convertToTreeModelNodeInput(hierarchyItem.item);\r\n const existingNode = model.getNode(hierarchyItem.item.id);\r\n\r\n // if same item exists in the same position and is expanded update it without removing it's subtree\r\n if (!existingNode || !existingNode.isExpanded || model.getChildOffset(parentId, existingNode.id) !== offset || nodeInput.numChildren === 0) {\r\n model.setChildren(parentId, [nodeInput], offset);\r\n } else {\r\n existingNode.label = nodeInput.label;\r\n existingNode.description = nodeInput.description ?? \"\";\r\n existingNode.item = nodeInput.item;\r\n }\r\n\r\n if (hierarchyItem.children) {\r\n updateChildren(model, hierarchyItem.item.id, hierarchyItem.children, 0, hierarchyItem.numChildren);\r\n }\r\n offset++;\r\n }\r\n}\r\n\r\nfunction convertToTreeModelNodeInput(item: TreeNodeItemData): TreeModelNodeInput {\r\n let numChildren: number | undefined;\r\n if (item.children) {\r\n numChildren = item.children.length;\r\n } else if (!item.hasChildren) {\r\n numChildren = 0;\r\n }\r\n\r\n return {\r\n description: item.description,\r\n isExpanded: !!item.autoExpand,\r\n id: item.id,\r\n item,\r\n label: item.label,\r\n isLoading: false,\r\n numChildren,\r\n isSelected: false,\r\n };\r\n}\r\n\r\ninterface TreeDataSourceResult {\r\n loadedItems: TreeNodeItemData[];\r\n numChildren?: number;\r\n}\r\n\r\n/**\r\n * Wrapper to handle different types of `TreeDataProvider`. Provides one method\r\n * to request items from `TreeDataProviderRaw`, `TreeDataProviderMethod`,\r\n * `TreeDataProviderPromise` or `TreeDataProviderInterface`.\r\n *\r\n * @internal\r\n */\r\nexport class TreeDataSource implements IDisposable {\r\n private _dataProvider: TreeDataProvider;\r\n private _disposeTreeNodesChangedListener?: () => void;\r\n\r\n public readonly onItemsChanged = new BeEvent<TreeDataChangesListener>();\r\n\r\n constructor(dataProvider: TreeDataProvider) {\r\n this._dataProvider = dataProvider;\r\n\r\n // eslint-disable-next-line deprecation/deprecation\r\n if (isTreeDataProviderInterface(this._dataProvider) && this._dataProvider.onTreeNodeChanged) {\r\n // eslint-disable-next-line deprecation/deprecation\r\n this._disposeTreeNodesChangedListener = this._dataProvider.onTreeNodeChanged.addListener(\r\n (changedItems) => this.onItemsChanged.raiseEvent(changedItems),\r\n );\r\n }\r\n }\r\n\r\n public dispose() {\r\n this._disposeTreeNodesChangedListener && this._disposeTreeNodesChangedListener();\r\n }\r\n\r\n public requestItems(\r\n parent: TreeNodeItem | undefined,\r\n firstItemIndex: number,\r\n numItems: number,\r\n requestNumChildren: boolean,\r\n ): RxjsObservable<TreeDataSourceResult> {\r\n // During each async operation there is a chance that data provider will become stale. Create an opportunity to\r\n // unsubscribe after each async operation so that we stop interacting with the stale data provider immediately.\r\n return defer(async () => {\r\n if (isTreeDataProviderInterface(this._dataProvider)) {\r\n const dataProvider = this._dataProvider;\r\n return from(requestNumChildren ? dataProvider.getNodesCount(parent) : [undefined])\r\n .pipe(\r\n concatMap(async (numChildren) => {\r\n const pageOptions = numItems !== 0 ? { size: numItems, start: firstItemIndex } : undefined;\r\n return {\r\n loadedItems: await dataProvider.getNodes(parent, pageOptions),\r\n numChildren,\r\n };\r\n }),\r\n );\r\n }\r\n\r\n return from(this.getItems(parent))\r\n .pipe(\r\n map((loadedItems) => ({\r\n loadedItems: numItems !== 0 ? loadedItems.slice(firstItemIndex, firstItemIndex + numItems) : loadedItems,\r\n numChildren: loadedItems.length,\r\n })),\r\n );\r\n })\r\n .pipe(\r\n concatAll(),\r\n publish(),\r\n refCount(),\r\n );\r\n }\r\n\r\n private async getItems(parent: TreeNodeItem | undefined): Promise<TreeNodeItemData[]> {\r\n if (isTreeDataProviderRaw(this._dataProvider)) {\r\n return this.getChildren(this._dataProvider, parent);\r\n }\r\n\r\n if (isTreeDataProviderMethod(this._dataProvider)) {\r\n return this._dataProvider(parent);\r\n }\r\n\r\n if (isTreeDataProviderPromise(this._dataProvider)) {\r\n this._dataProvider = await this._dataProvider;\r\n return this.getChildren(this._dataProvider, parent);\r\n }\r\n\r\n throw new UiError(UiComponents.loggerCategory(this), \"Unsupported TreeDataProvider.\");\r\n }\r\n\r\n private getChildren(rawProvider: TreeDataProviderRaw, parent: TreeNodeItem | undefined): TreeNodeItemData[] {\r\n if (parent === undefined)\r\n return rawProvider;\r\n\r\n return (parent as ImmediatelyLoadedTreeNodeItem).children ?? [];\r\n }\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/components-react",
3
- "version": "3.3.0-dev.54",
3
+ "version": "3.3.0-dev.55",
4
4
  "description": "iTwin.js UI complex components",
5
5
  "main": "lib/cjs/components-react.js",
6
6
  "module": "lib/esm/components-react.js",
@@ -20,9 +20,9 @@
20
20
  "url": "http://www.bentley.com"
21
21
  },
22
22
  "peerDependencies": {
23
- "@itwin/appui-abstract": "^3.3.0-dev.54",
24
- "@itwin/core-bentley": "^3.3.0-dev.54",
25
- "@itwin/core-react": "^3.3.0-dev.54",
23
+ "@itwin/appui-abstract": "^3.3.0-dev.55",
24
+ "@itwin/core-bentley": "^3.3.0-dev.55",
25
+ "@itwin/core-react": "^3.3.0-dev.55",
26
26
  "react": "^17.0.0",
27
27
  "react-dom": "^17.0.0"
28
28
  },
@@ -31,13 +31,13 @@
31
31
  "NOTE: All tools used by scripts in this package must be listed as devDependencies"
32
32
  ],
33
33
  "devDependencies": {
34
- "@itwin/appui-abstract": "3.3.0-dev.54",
35
- "@itwin/build-tools": "3.3.0-dev.54",
36
- "@itwin/core-bentley": "3.3.0-dev.54",
37
- "@itwin/core-common": "3.3.0-dev.54",
38
- "@itwin/core-i18n": "3.3.0-dev.54",
39
- "@itwin/core-react": "3.3.0-dev.54",
40
- "@itwin/eslint-plugin": "3.3.0-dev.54",
34
+ "@itwin/appui-abstract": "3.3.0-dev.55",
35
+ "@itwin/build-tools": "3.3.0-dev.55",
36
+ "@itwin/core-bentley": "3.3.0-dev.55",
37
+ "@itwin/core-common": "3.3.0-dev.55",
38
+ "@itwin/core-i18n": "3.3.0-dev.55",
39
+ "@itwin/core-react": "3.3.0-dev.55",
40
+ "@itwin/eslint-plugin": "3.3.0-dev.55",
41
41
  "@testing-library/dom": "^8.11.2",
42
42
  "@testing-library/react": "^12.0.0",
43
43
  "@testing-library/react-hooks": "^7.0.2",
@@ -86,7 +86,7 @@
86
86
  "rimraf": "^3.0.2",
87
87
  "sinon": "^9.0.2",
88
88
  "sinon-chai": "^3.2.0",
89
- "ts-node": "10.8.0",
89
+ "ts-node": "^10.8.2",
90
90
  "typemoq": "^2.1.0",
91
91
  "typescript": "~4.4.0",
92
92
  "xmlhttprequest": "^1.8.0"