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 событий, к которым можно подключить вашу логику.
| Имя | Тип | Описание |
|---|---|---|
states | Signal<Map<K, T>> | Реактивная карта Signals с текущими неизменяемыми снимками для каждого id объекта. |
Методы
Управляйте history из кода — 16 методов его программного интерфейса.
| Имя | Сигнатура | Возвращает | Описание |
|---|---|---|---|
createHistoryStore | createHistoryStore<T, K>(config?: HistoryStoreConfig<T, K>): HistoryStore<T, K> | HistoryStore<T, K> | Фабрика, создающая хранилище истории на основе сигналов, отслеживающее несколько объектов по id. Принимает необязательные лимиты хранения (maxEntries, по умолчанию 100; maxBytes, по умолчанию 512000), keySelector и пользовательские стратегии diff/patch. |
HistoryStore.states | states: Signal<Map<K, T>> | Signal<Map<K, T>> | Вычисляемый сигнал, предоставляющий карту текущих иммутабельных снимков состояния с ключами по id объектов. |
HistoryStore.registerObject | registerObject(id: K, initialState: T): void | — | Регистрирует отслеживаемый объект с его начальным состоянием и начинает новую пустую хронологию истории для этого id. |
HistoryStore.registerFromObject | registerFromObject(initialState: T): K | K | Регистрирует отслеживаемый объект, выводя его id из настроенного keySelector, и возвращает этот id. Выбрасывает исключение, если keySelector не был настроен. |
HistoryStore.commit | commit(id: K, newState: T, options?: HistoryCommitOptions): boolean | boolean | Фиксирует новый снимок состояния для зарегистрированного id, сохраняя прямой и обратный патчи и отбрасывая записи redo впереди указателя. Возвращает false, если новое состояние не даёт изменений. Внутри открытой транзакции лишь обновляет текущее состояние, не создавая записи. |
HistoryStore.commitFromObject | commitFromObject(newState: T, options?: HistoryCommitOptions): boolean | boolean | Фиксирует новое состояние, выводя id из настроенного keySelector. Выбрасывает исключение, если keySelector не был настроен. |
HistoryStore.undo | undo(id: K): boolean | boolean | Откатывает один шаг истории, применяя обратный патч записи. Возвращает false, если отменять нечего. |
HistoryStore.redo | redo(id: K): boolean | boolean | Повторно применяет один шаг истории, применяя прямой патч записи. Возвращает false, если повторять нечего. |
HistoryStore.canUndo | canUndo(id: K): boolean | boolean | Возвращает, возможна ли сейчас отмена (undo) для указанного id объекта. |
HistoryStore.canRedo | canRedo(id: K): boolean | boolean | Возвращает, возможен ли сейчас повтор (redo) для указанного id объекта. |
HistoryStore.getState | getState(id: K): T | undefined | T | undefined | Возвращает глубокую копию текущего состояния для указанного id или undefined, если id не зарегистрирован. |
HistoryStore.history | history(id: K): HistoryMetadata | HistoryMetadata | Возвращает доступные только для чтения метаданные истории объекта: указатель, количество записей, приблизительный объём хранимых байтов, а также подпись (label), временную метку и размер в байтах для каждой записи. |
HistoryStore.beginTransaction | beginTransaction(id: K, label?: string): void | — | Начинает транзакцию, чтобы последующие фиксации сворачивались в одну сводную запись истории. Выбрасывает исключение, если для этого id транзакция уже открыта. |
HistoryStore.endTransaction | endTransaction(id: K): boolean | boolean | Завершает открытую транзакцию, фиксируя одну сводную запись от состояния на момент начала транзакции до текущего состояния. Возвращает false, если транзакция не была открыта или изменений не было. |
HistoryStore.watchForm | watchForm(id: K, form: FormGroup, options?: WatchFormOptions): () => void | () => void | Подписывается на valueChanges объекта FormGroup и автоматически фиксирует каждое испущенное значение, при необходимости пропуская первоначальное. Возвращает callback отписки. |
HistoryStore.clearHistory | clearHistory(id: K): void | — | Очищает все записи истории для указанного id, сохраняя текущее состояние как новый базовый снимок и отбрасывая открытую транзакцию, если она была. |
Шаблоны
Шаблоны пока не задокументированы.