azure-devops-ui
Version:
React components for building web UI in Azure DevOps
1 lines • 5.73 kB
JavaScript
import{ObservableValue}from"../Core/Observable";class Selection extends ObservableValue{constructor(e){super([]),this.selectedRanges=[],this.lockCount=0,this.unselectableRangesValue=[],this.selectedCount=0,this.unselectableCount=0,this.onItemsChanged=(e,n)=>{var t=e.index;let s,l;"change"!==n&&(e.removedItems&&e.removedItems.length&&(s=this.removeUnselectableInternal(t,e.removedItems.length),l=this.unselectInternal(t,e.removedItems.length)),(e.addedItems||e.removedItems)&&(e=adjustRanges(t,n=(e.addedItems?e.addedItems.length:0)-(e.removedItems?e.removedItems.length:0),this.selectedRanges),t=adjustRanges(t,n,this.unselectableRanges),e.length&&this.notify(e,"set"),t.length)&&this.notify(t,"setUnselectable"),s&&this.notify([s],"removeUnselectable"),l)&&this.notify([l],"unselect")},"boolean"==typeof e||void 0===e?this.multiSelect=!!e||!1:(this.alwaysMerge=!!e.alwaysMerge,this.multiSelect=!!e.multiSelect,this.unselectableRanges=e.unselectableRanges||[],this.value=e.selectedRanges||[])}get value(){return this.selectedRanges}set value(e){this.selectedCount=0,this.selectedRanges=e.map(e=>(this.selectedCount+=e.endIndex-e.beginIndex+1,{beginIndex:e.beginIndex,endIndex:e.endIndex})),this.notify(e,"set")}get unselectableRanges(){return this.unselectableRangesValue}set unselectableRanges(e){this.unselectableCount=0,this.unselectableRangesValue=e.map(e=>(this.unselectableCount+=e.endIndex-e.beginIndex+1,{beginIndex:e.beginIndex,endIndex:e.endIndex})),this.notify(e,"setUnselectable")}clear(){var e=this.clearSelectedRanges();e&&this.notify(e,"unselect")}clearUnselectable(){var e=[...this.unselectableRangesValue];this.unselectableRanges=[],this.unselectableCount=0,this.notify(e,"removeUnselectable")}selectable(e){return!indexWithinRanges(e,this.unselectableRanges)}selected(e){return indexWithinRanges(e,this.selectedRanges)}addUnselectable(t,e){let s=!1;var n=t,l=t+(e||1)-1;for(e=e||1;0<e;e--){if(this.selectable(t)){let e=0,n;for(;e<this.unselectableRanges.length;e++){var i=this.unselectableRanges[e];if(t<i.beginIndex){t===i.beginIndex-1&&(n=i).beginIndex--;break}if(t===i.endIndex+1){e<this.unselectableRanges.length-1&&t===this.unselectableRanges[e+1].beginIndex-1?((n=i).endIndex=this.unselectableRanges[e+1].endIndex,this.unselectableRanges.splice(e+1,1)):(n=i).endIndex++;break}}n||(n={beginIndex:t,endIndex:t},this.unselectableRanges.splice(e,0,n)),s=!0,this.unselectableCount++}t++}s&&this.notify([{beginIndex:n,endIndex:l}],"addUnselectable")}removeUnselectable(e,n){e=this.removeUnselectableInternal(e,n);e&&this.notify([e],"removeUnselectable")}select(s,n,l=this.alwaysMerge,i=this.multiSelect){if(!this.lockCount){var d=s,a=d+(n||1)-1;let t=!1,e;if(i)for(l||(e=this.clearSelectedRanges()),n=n||1;0<n;n--)if(this.selected(s)||!this.selectable(s))s++;else{let e=0,n;for(;e<this.selectedRanges.length;e++){var c=this.selectedRanges[e];if(s<c.beginIndex){s===c.beginIndex-1&&(n=c).beginIndex--;break}if(s===c.endIndex+1){e<this.selectedRanges.length-1&&s===this.selectedRanges[e+1].beginIndex-1?((n=c).endIndex=this.selectedRanges[e+1].endIndex,this.selectedRanges.splice(e+1,1)):(n=c).endIndex++;break}}n||(n={beginIndex:s,endIndex:s},this.selectedRanges.splice(e,0,n)),this.selectedCount++,s++,t=!0}else!this.selected(s)&&this.selectable(s)&&(e=this.clearSelectedRanges(),this.selectedRanges.push({beginIndex:s,endIndex:s}),this.selectedCount++,t=!0);e&&this.notify(e,"unselect"),t&&this.notify([{beginIndex:d,endIndex:a}],"select")}}toggle(e,n=this.alwaysMerge,t=this.multiSelect){this.selected(e)?this.unselect(e):this.select(e,1,n,t)}unselect(e,n){e=this.unselectInternal(e,n);e&&this.notify([e],"unselect")}lock(){this.lockCount++}unlock(){this.lockCount--}removeUnselectableInternal(n,e){var t=n,s=t+(e||1)-1;let l=!1;for(e=e||1;0<e;e--){if(this.selectable(n));else for(let e=0;e<this.unselectableRanges.length;e++){var i=this.unselectableRanges[e];if(!(n<i.beginIndex)&&(n>=i.beginIndex&&n<=i.endIndex)){n===i.beginIndex?i.beginIndex++:n===i.endIndex?i.endIndex--:(this.unselectableRanges.splice(e+1,0,{beginIndex:n+1,endIndex:i.endIndex}),i.endIndex=n-1),i.beginIndex>i.endIndex&&this.unselectableRanges.splice(e,1),this.unselectableCount--,l=!0;break}}n++}if(l)return{beginIndex:t,endIndex:s}}unselectInternal(n,e){let t=!1;var s=n,l=s+(e||1)-1;if(!this.lockCount)for(e=e||1;0<e;e--){if(this.selected(n))for(let e=0;e<this.selectedRanges.length;e++){var i=this.selectedRanges[e];if(!(n<i.beginIndex)&&(n>=i.beginIndex&&n<=i.endIndex)){n===i.beginIndex?i.beginIndex++:n===i.endIndex?i.endIndex--:(this.selectedRanges.splice(e+1,0,{beginIndex:n+1,endIndex:i.endIndex}),i.endIndex=n-1),i.beginIndex>i.endIndex&&this.selectedRanges.splice(e,1),this.selectedCount--,t=!0;break}}n++}if(t)return{beginIndex:s,endIndex:l}}clearSelectedRanges(){var e;if(!this.lockCount&&0<this.selectedRanges.length)return e=[...this.selectedRanges],this.selectedRanges=[],this.selectedCount=0,e}}function indexWithinRanges(e,n){if(n)for(const t of n)if(e>=t.beginIndex&&e<=t.endIndex)return!0;return!1}function adjustRanges(n,t,s){var l=[];for(let e=0;e<s.length;e++){var i,d=s[e];n<=d.beginIndex?0<e&&d.beginIndex+t===s[e-1].endIndex+1?(s[e-1].endIndex=d.endIndex+t,s.splice(e--,1),l.push(s[e])):(d.beginIndex+=t,d.endIndex+=t,l.push(d)):n>d.beginIndex&&n<=d.endIndex&&(i={beginIndex:n+t,endIndex:d.endIndex+t},s.splice(++e,0,i),l.push(i),d.endIndex=n-1,l.push(d))}return l}function compareSelectionRanges(n,t){var s=[];for(let e=0;e<n.length;e++){var l=n[e];for(let e=l.beginIndex;e<=l.endIndex;e++)indexWithinRanges(e,t)||s.push(-1*e)}for(let e=0;e<t.length;e++){var i=t[e];for(let e=i.beginIndex;e<=i.endIndex;e++)indexWithinRanges(e,n)||s.push(e)}return s}export{Selection,indexWithinRanges,compareSelectionRanges};