@form-guardian/dom
Универсальное автосохранение форм на основе DOM. Работает с любым фреймворком или обычными HTML-формами.
Установка
npm install @form-guardian/dom
attachFormAutosave(options)
Основная функция для подключения автосохранения к форме.
Импорт:
import { attachFormAutosave } from '@form-guardian/dom';
Параметры:
formId(string, обязательный) - Уникальный идентификатор формыroot(HTMLFormElement | HTMLElement, обязательный) - Корневой элемент (форма или контейнер)autoRestore(boolean, опциональный) - Автовосстановление при монтировании (по умолчанию: false)debounceMs(number, опциональный) - Задержка debounce в миллисекундах (по умолчанию: 500)ttl(object | number, опциональный) - Время жизни черновиковblacklist(string[], опциональный) - CSS селекторы для исключения полейwhitelist(string[], опциональный) - CSS селекторы для включения полейfieldSelector(string, опциональный) - Селектор для отслеживаемых полейexcludeSelector(string, опциональный) - Селектор для исключаемых полейonBeforeSave(function, опциональный) - Колбэк перед сохранением черновикаonAfterSave(function, опциональный) - Колбэк после успешного сохраненияonBeforeRestore(function, опциональный) - Колбэк перед восстановлениемonAfterRestore(function, опциональный) - Колбэк после успешного восстановленияonDraftExpired(function, опциональный) - Колбэк когда черновик истекаетbatchSaveInterval(number, опциональный) - Интервал пакетного сохранения в миллисекундахincludeOrigin(boolean, опциональный) - Включить origin в ID черновика (по умолчанию: true)storagePrefix(string, опциональный) - Префикс ключа хранилища (по умолчанию: 'fg')
Возвращает: FormAutosaveHandle
Пример:
const handle = attachFormAutosave({
formId: 'my-form',
root: document.getElementById('my-form'),
autoRestore: true,
debounceMs: 300,
onBeforeSave: async (values) => {
console.log('Сохраняем черновик...', values);
},
onAfterSave: async (values) => {
console.log('Черновик успешно сохранен!');
},
});
// Доступные методы:
handle.restore(); // Восстановить черновик
handle.clear(); // Очистить черновик
handle.destroy(); // Удалить обработчики событий
handle.hasDraft(); // Проверить наличие черновика
handle.getCurrentValues(); // Получить текущие значения формы
FormAutosaveHandle
Объект, возвращаемый функцией attachFormAutosave().
Методы
restore(): Promise<void>
Восстановить значения черновика в форму.
await handle.restore();
clear(): Promise<void>
Очистить черновик из хранилища.
await handle.clear();
destroy(): void
Удалить все обработчики событий и очистить. Вызывайте при размонтировании.
handle.destroy();
getCurrentValues(): Promise<T>
Получить текущие значения формы как объект.
const values = await handle.getCurrentValues();
console.log(values); // { name: 'Иван', email: 'ivan@example.com' }
hasDraft(): Promise<boolean>
Проверить, существует ли черновик для этой формы.
const exists = await handle.hasDraft();
if (exists) {
console.log('Черновик найден!');
}
getDraftMeta(): Promise<DraftMeta | null>
Получить метаданные черновика (временная метка, formId и т.д.) без загрузки значений.
const meta = await handle.getDraftMeta();
if (meta) {
console.log('Черновик обновлен:', new Date(meta.updatedAt));
}
Примеры использования
Vanilla JavaScript
import { attachFormAutosave } from '@form-guardian/dom';
const form = document.getElementById('contact-form');
const autosave = attachFormAutosave({
formId: 'contact-form',
root: form,
autoRestore: true,
debounceMs: 500,
});
form.addEventListener('submit', async (e) => {
e.preventDefault();
// Очистить черновик после успешной отправки
await autosave.clear();
// Отправить данные формы...
});
Vue 3
<script setup>
import { onMounted, onBeforeUnmount, ref } from 'vue';
import { attachFormAutosave } from '@form-guardian/dom';
const formRef = ref(null);
let autosave = null;
onMounted(() => {
autosave = attachFormAutosave({
formId: 'my-form',
root: formRef.value,
autoRestore: true,
});
});
onBeforeUnmount(() => {
if (autosave) {
autosave.destroy();
}
});
const handleSubmit = async () => {
await autosave.clear();
// Логика отправки...
};
</script>
<template>
<form ref="formRef" @submit.prevent="handleSubmit">
<!-- поля формы -->
</form>
</template>
Angular
import { Component, ElementRef, OnInit, OnDestroy, ViewChild } from '@angular/core';
import { attachFormAutosave, FormAutosaveHandle } from '@form-guardian/dom';
@Component({
selector: 'app-my-form',
template: `<form #myForm (submit)="onSubmit($event)">...</form>`
})
export class MyFormComponent implements OnInit, OnDestroy {
@ViewChild('myForm') formElement!: ElementRef;
private autosave: FormAutosaveHandle | null = null;
ngOnInit() {
this.autosave = attachFormAutosave({
formId: 'my-form',
root: this.formElement.nativeElement,
autoRestore: true,
});
}
ngOnDestroy() {
if (this.autosave) {
this.autosave.destroy();
}
}
async onSubmit(event: Event) {
event.preventDefault();
await this.autosave?.clear();
// Логика отправки...
}
}