@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 3.63 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.33/esri/copyright.txt for details.
*/
import{_ as t}from"./chunks/tslib.es6.js";import s from"./core/Accessor.js";import i from"./core/Collection.js";import{whenOnce as o}from"./core/reactiveUtils.js";import{property as a}from"./core/accessorSupport/decorators/property.js";import"./core/has.js";import"./core/Logger.js";import"./core/RandomLCG.js";import{subclass as e}from"./core/accessorSupport/decorators/subclass.js";import{UpdatingHandles as n}from"./core/support/UpdatingHandles.js";import{OperationStatus as r}from"./undoredo/OperationStatus.js";import{UndoRedoExecutionMethod as c}from"./undoredo/UndoableOperation.js";import{UndoInvalidError as d,UndoRedoUpdatingError as h,RedoInvalidError as p}from"./undoredo/UndoRedoError.js";let u=class extends s{constructor(){super(...arguments),this._stack=new i,this._stackPosition=-1,this._updatingHandles=new n}get updating(){return this._updatingHandles.updating}get canUndo(){return this.hasUndo&&!this.updating}get hasUndo(){return this._stackPosition>=0}get canRedo(){return this.hasRedo&&!this.updating}get hasRedo(){return this._stackPosition<this._stack.length-1}_truncateForwardStack(){this._stack.splice(this._stackPosition+1,this._stack.length-this._stackPosition).forEach((t=>t.destroy()))}_drainStack(){this._stack.drain((t=>t.destroy())),this._stackPosition=-1}async undo(){if(!this.hasUndo)throw new d;if(this.updating)throw new h;const t=this._stack.getItemAt(this._stackPosition);t&&await this._updatingHandles.addPromise((async()=>{await t.executeUndoRedoOperation(c.Undo),--this._stackPosition,t.canRedo||this._truncateForwardStack()})())}async redo(){if(!this.hasRedo)throw new p;if(this.updating)throw new h;const t=this._stack.getItemAt(this._stackPosition+1);if(!t)throw new p;await this._updatingHandles.addPromise((async()=>{await t.executeUndoRedoOperation(c.Redo),++this._stackPosition})())}peekUndo(){if(this.canUndo)return this._stack.getItemAt(this._stackPosition)}peekRedo(){if(this.canRedo)return this._stack.getItemAt(this._stackPosition+1)}async inject(t){if(this.updating)throw new h;await this._updatingHandles.addPromise((async()=>{t.status===r.NeverApplied&&await t.executeUndoRedoOperation(c.Apply),t.canUndo?(this._stack.splice(this._stackPosition+1,0,t),this._stackPosition++):this._stackPosition>-1&&(this._stack.splice(0,this._stackPosition+1).forEach((t=>t.destroy())),this._stackPosition=-1)})())}async add(t){if(this.updating)throw new h;await this._updatingHandles.addPromise((async()=>{t.status===r.NeverApplied&&await t.executeUndoRedoOperation(c.Apply),this._stackPosition>=-1&&this._truncateForwardStack(),t.canUndo?(this._stack.push(t),this._stackPosition=this._stack.length-1):this._drainStack()})())}async removeTagged(t,s=!1){if(this.updating&&!s)return;await o((()=>!this.updating));const a=new i;for(let i=0;i<this._stack.length;i++){const s=this._stack.getItemAt(i);s&&(s.tag===t?(s.destroy(),i===this._stackPosition&&(this._stackPosition=a.length-1)):a.push(s))}this._stack=a,this._stackPosition>a.length-1&&(this._stackPosition=a.length-1)}async clear(t=!1){if(this.updating&&!t)throw new h;await o((()=>!this.updating)),this._drainStack()}};t([a()],u.prototype,"_stack",void 0),t([a()],u.prototype,"_stackPosition",void 0),t([a()],u.prototype,"updating",null),t([a({readOnly:!0})],u.prototype,"canUndo",null),t([a({readOnly:!0})],u.prototype,"hasUndo",null),t([a({readOnly:!0})],u.prototype,"canRedo",null),t([a({readOnly:!0})],u.prototype,"hasRedo",null),u=t([e("esri.UndoRedo")],u);export{u as UndoRedo};