Store Undo Redo для Angular | ng-hub-ui-history

Store отмены и повтора для Angular с API, дружественными к Signals, транзакциями, лимитами и поддержкой реактивных форм.

Справочник API

Вот полный контракт history: всё, что можно привязать, прослушать, спроецировать и тематизировать, собрано в одном месте. Подключите то, что нужно, и оформите так, как хотите — это standalone и дружит с сигналами.

Входные свойства

Настройте history с помощью 4 входных свойств. Привязывайте их, как любой @Input в Angular.

ИмяТипПо умолчаниюОписание
createHistoryStore(config)HistoryStoreConfig<T, K>Создаёт хранилище на основе Signals с необязательными ограничениями и пользовательскими функциями diff/patch.
registerObject(id, initialState)Обязательно(id: K, initialState: T) => voidРегистрирует базовое состояние объекта и начинает линейную историю для этого ключа.
commit(id, newState, options?)Обязательно(id: K, state: T, options?: { label?: string }) => booleanСохраняет diff-патч, инвалидирует ветку redo, если указатель не находился в конце.
watchForm(id, form, options?)(id: K, form: FormGroup, options?: WatchFormOptions) => () => voidАвтоматически фиксирует изменения значений формы и возвращает callback отписки.

События

Реагируйте на то, что делает history, — 1 событий, к которым можно подключить вашу логику.

ИмяТипОписание
statesSignal<Map<K, T>>Реактивная карта Signals с текущими неизменяемыми снимками для каждого id объекта.

Методы

Управляйте history из кода — 16 методов его программного интерфейса.

ИмяСигнатураВозвращаетОписание
createHistoryStorecreateHistoryStore<T, K>(config?: HistoryStoreConfig<T, K>): HistoryStore<T, K>HistoryStore<T, K>Фабрика, создающая хранилище истории на основе сигналов, отслеживающее несколько объектов по id. Принимает необязательные лимиты хранения (maxEntries, по умолчанию 100; maxBytes, по умолчанию 512000), keySelector и пользовательские стратегии diff/patch.
HistoryStore.statesstates: Signal<Map<K, T>>Signal<Map<K, T>>Вычисляемый сигнал, предоставляющий карту текущих иммутабельных снимков состояния с ключами по id объектов.
HistoryStore.registerObjectregisterObject(id: K, initialState: T): voidРегистрирует отслеживаемый объект с его начальным состоянием и начинает новую пустую хронологию истории для этого id.
HistoryStore.registerFromObjectregisterFromObject(initialState: T): KKРегистрирует отслеживаемый объект, выводя его id из настроенного keySelector, и возвращает этот id. Выбрасывает исключение, если keySelector не был настроен.
HistoryStore.commitcommit(id: K, newState: T, options?: HistoryCommitOptions): booleanbooleanФиксирует новый снимок состояния для зарегистрированного id, сохраняя прямой и обратный патчи и отбрасывая записи redo впереди указателя. Возвращает false, если новое состояние не даёт изменений. Внутри открытой транзакции лишь обновляет текущее состояние, не создавая записи.
HistoryStore.commitFromObjectcommitFromObject(newState: T, options?: HistoryCommitOptions): booleanbooleanФиксирует новое состояние, выводя id из настроенного keySelector. Выбрасывает исключение, если keySelector не был настроен.
HistoryStore.undoundo(id: K): booleanbooleanОткатывает один шаг истории, применяя обратный патч записи. Возвращает false, если отменять нечего.
HistoryStore.redoredo(id: K): booleanbooleanПовторно применяет один шаг истории, применяя прямой патч записи. Возвращает false, если повторять нечего.
HistoryStore.canUndocanUndo(id: K): booleanbooleanВозвращает, возможна ли сейчас отмена (undo) для указанного id объекта.
HistoryStore.canRedocanRedo(id: K): booleanbooleanВозвращает, возможен ли сейчас повтор (redo) для указанного id объекта.
HistoryStore.getStategetState(id: K): T | undefinedT | undefinedВозвращает глубокую копию текущего состояния для указанного id или undefined, если id не зарегистрирован.
HistoryStore.historyhistory(id: K): HistoryMetadataHistoryMetadataВозвращает доступные только для чтения метаданные истории объекта: указатель, количество записей, приблизительный объём хранимых байтов, а также подпись (label), временную метку и размер в байтах для каждой записи.
HistoryStore.beginTransactionbeginTransaction(id: K, label?: string): voidНачинает транзакцию, чтобы последующие фиксации сворачивались в одну сводную запись истории. Выбрасывает исключение, если для этого id транзакция уже открыта.
HistoryStore.endTransactionendTransaction(id: K): booleanbooleanЗавершает открытую транзакцию, фиксируя одну сводную запись от состояния на момент начала транзакции до текущего состояния. Возвращает false, если транзакция не была открыта или изменений не было.
HistoryStore.watchFormwatchForm(id: K, form: FormGroup, options?: WatchFormOptions): () => void() => voidПодписывается на valueChanges объекта FormGroup и автоматически фиксирует каждое испущенное значение, при необходимости пропуская первоначальное. Возвращает callback отписки.
HistoryStore.clearHistoryclearHistory(id: K): voidОчищает все записи истории для указанного id, сохраняя текущее состояние как новый базовый снимок и отбрасывая открытую транзакцию, если она была.

Шаблоны

Шаблоны пока не задокументированы.