Store Undo Redo para Angular | ng-hub-ui-history

Store de undo y redo para Angular con APIs compatibles con Signals, transacciones, límites y soporte para formularios reactivos.

Referencia API

Aquí tienes el contrato completo de history: todo lo que puedes enlazar, escuchar, proyectar y personalizar, reunido en un solo sitio. Enlaza lo que necesites y dale el estilo que quieras — es standalone y reactivo con signals.

Inputs

Ajusta history a tu gusto con 4 inputs. Se enlazan como cualquier @Input de Angular.

NombreTipoPor defectoDescripción
createHistoryStore(config)HistoryStoreConfig<T, K>Crea un almacén basado en Signals con límites opcionales y funciones diff/patch personalizadas.
registerObject(id, initialState)Obligatorio(id: K, initialState: T) => voidRegistra el estado base del objeto e inicia un historial lineal para esa clave.
commit(id, newState, options?)Obligatorio(id: K, state: T, options?: { label?: string }) => booleanAlmacena el parche diff e invalida la rama de redo si el puntero no estaba al final.
watchForm(id, form, options?)(id: K, form: FormGroup, options?: WatchFormOptions) => () => voidConfirma automáticamente los cambios de valor del formulario y devuelve un callback de cancelación de suscripción.

Outputs

Reacciona a lo que hace history: 1 eventos a los que enganchar tu lógica.

NombreTipoDescripción
statesSignal<Map<K, T>>Mapa reactivo de signals con snapshots inmutables actuales por id de objeto.

Métodos

Controla history desde el código — 16 métodos en su superficie programática.

NombreFirmaDevuelveDescripción
createHistoryStorecreateHistoryStore<T, K>(config?: HistoryStoreConfig<T, K>): HistoryStore<T, K>HistoryStore<T, K>Factoría que crea un store de historial basado en signals que rastrea múltiples objetos por id. Acepta límites de retención opcionales (maxEntries, por defecto 100; maxBytes, por defecto 512000), un keySelector y estrategias de diff/patch personalizadas.
HistoryStore.statesstates: Signal<Map<K, T>>Signal<Map<K, T>>Signal computada que expone un mapa de las instantáneas de estado inmutables actuales indexadas por id de objeto.
HistoryStore.registerObjectregisterObject(id: K, initialState: T): voidRegistra un objeto rastreado con su estado inicial e inicia una línea de tiempo de historial nueva y vacía para ese id.
HistoryStore.registerFromObjectregisterFromObject(initialState: T): KKRegistra un objeto rastreado derivando su id del keySelector configurado y devuelve ese id. Lanza un error cuando no se configuró ningún keySelector.
HistoryStore.commitcommit(id: K, newState: T, options?: HistoryCommitOptions): booleanbooleanConfirma una nueva instantánea de estado para un id registrado, almacenando los patches hacia delante y hacia atrás y descartando cualquier entrada de redo por delante del puntero. Devuelve false cuando el nuevo estado no produce cambios. Dentro de una transacción abierta solo actualiza el estado actual sin crear una entrada.
HistoryStore.commitFromObjectcommitFromObject(newState: T, options?: HistoryCommitOptions): booleanbooleanConfirma un nuevo estado derivando el id del keySelector configurado. Lanza un error cuando no se configuró ningún keySelector.
HistoryStore.undoundo(id: K): booleanbooleanRevierte un paso del historial aplicando el patch hacia atrás de la entrada. Devuelve false cuando no hay nada que deshacer.
HistoryStore.redoredo(id: K): booleanbooleanReaplica un paso del historial aplicando el patch hacia delante de la entrada. Devuelve false cuando no hay nada que rehacer.
HistoryStore.canUndocanUndo(id: K): booleanbooleanDevuelve si undo es posible en este momento para el id de objeto dado.
HistoryStore.canRedocanRedo(id: K): booleanbooleanDevuelve si redo es posible en este momento para el id de objeto dado.
HistoryStore.getStategetState(id: K): T | undefinedT | undefinedDevuelve un clon profundo del estado actual para el id dado, o undefined cuando el id no está registrado.
HistoryStore.historyhistory(id: K): HistoryMetadataHistoryMetadataDevuelve metadatos de solo lectura del historial del objeto: el puntero, el número de entradas, los bytes retenidos aproximados y, por entrada, la etiqueta, la marca de tiempo y los bytes.
HistoryStore.beginTransactionbeginTransaction(id: K, label?: string): voidInicia una transacción para que los commits siguientes se colapsen en una única entrada de historial consolidada. Lanza un error cuando ya hay una transacción abierta para el id.
HistoryStore.endTransactionendTransaction(id: K): booleanbooleanFinaliza la transacción abierta, confirmando una entrada consolidada desde el estado inicial de la transacción hasta el estado actual. Devuelve false cuando no había ninguna transacción abierta o no se hicieron cambios.
HistoryStore.watchFormwatchForm(id: K, form: FormGroup, options?: WatchFormOptions): () => void() => voidSe suscribe al valueChanges de un FormGroup y confirma automáticamente cada emisión, omitiendo opcionalmente la inicial. Devuelve un callback de desuscripción.
HistoryStore.clearHistoryclearHistory(id: K): voidLimpia todas las entradas de historial del id dado, conservando el estado actual como nueva instantánea base y descartando cualquier transacción abierta.

Templates

Todavía no hay templates documentados.