azure-devops-ui
Version:
React components for building web UI in Azure DevOps
1 lines • 2.22 kB
JavaScript
import{Observable,ObservableLike}from"../Core/Observable";class AggregateItemProvider extends Observable{constructor(){super(),this.internalCollections=[],this.items=[]}get length(){return this.items.length}get value(){return this.items}get collections(){return this.internalCollections}push(e){let t;var s,i;ObservableLike.isObservable(e)?(s=e,i=this.getSubscriber(this.internalCollections.length),t={items:s.value,provider:s,subscriber:i},this.subscriberCount&&ObservableLike.subscribe(t.provider,i)):e.value?t={items:e.value,provider:e}:e.length&&(t={items:e}),t&&(this.internalCollections.push(t),t.items.length)&&(this.items.push(...t.items),this.subscriberCount)&&this.notify({addedItems:t.items,index:this.items.length-t.items.length},"push")}getItem(s){try{let t=0;for(let e=0;e<this.internalCollections.length;e++){var i,r=this.internalCollections[e],n=r.provider,o=(n||r.items).length;if(s<t+o)return i=s-t,n&&n.getItem?n.getItem(i):r.items[i];t+=o}}catch(e){document.dispatchEvent(new CustomEvent("vss-telemetry-proxy",{detail:{area:"VssDropdown",component:"AggregateItemProvider",feature:"VssDropdown.AggregateItemProvider",level:3,method:"getItem",message:"An error occurred while getting item",properties:{error:e.message,stack:e.stack,index:s,values:this.value}},bubbles:!0}))}}subscribe(e,t){e=super.subscribe(e,t);if(1===this.subscriberCount){for(const i of this.internalCollections)i.subscriber&&i.provider&&i.provider.subscribe&&i.provider.subscribe(i.subscriber);var s=[];for(const r of this.internalCollections)s.push(...r.items);this.items.splice(0,this.items.length,...s)}return e}unsubscribe(e,t){if(super.unsubscribe(e,t),0===this.subscriberCount)for(const s of this.internalCollections)s.subscriber&&s.provider&&s.provider.unsubscribe&&s.provider.unsubscribe(s.subscriber)}getSubscriber(i){return e=>{let t=e.index;for(let e=0;e<i;e++)t+=this.internalCollections[e].items.length;var s;e.changedItems?(this.items.splice(t,e.changedItems.length,...e.changedItems),this.notify({changedItems:e.changedItems,index:t},"change")):(s=e.removedItems||[],e=e.addedItems||[],this.items.splice(t,s.length,...e),this.notify({removedItems:s,addedItems:e,index:t},"splice"))}}}export{AggregateItemProvider};