# Historial de edición

- Human documentation: [https://docs.univer.ai/es-ES/guides/bases/features/edit-history](https://docs.univer.ai/es-ES/guides/bases/features/edit-history)

- Agent Markdown: [https://docs.univer.ai/es-ES/guides/bases/features/edit-history.md](https://docs.univer.ai/es-ES/guides/bases/features/edit-history.md)

- Requested language: `es-ES`

- Content language: `es-ES`

- Documentation version: `1.2.0`

- Source: [bases/features/edit-history.es-ES.mdx](https://github.com/dream-num/documentation/blob/dev/content/guides/bases/features/edit-history.es-ES.mdx)

---

#### Package metadata

```json
{
  "preset": [],
  "plugins": [
    {
      "client": "@univerjs-pro/edit-history",
      "facade": "@univerjs-pro/edit-history/facade"
    },
    {
      "client": "@univerjs-pro/edit-history-ui",
      "locale": "@univerjs-pro/edit-history-ui/locale/es-ES",
      "style": "@univerjs-pro/edit-history-ui/lib/index.css"
    },
    {
      "client": "@univerjs-pro/bases-history"
    },
    {
      "client": "@univerjs-pro/bases-history-ui",
      "locale": "@univerjs-pro/bases-history-ui/locale/es-ES",
      "style": "@univerjs-pro/bases-history-ui/lib/index.css"
    }
  ],
  "license": true,
  "server": true
}
```

Después de modificar campos, registros o vistas, abre el historial para consultar versiones anteriores, comparar cambios y restaurar una versión si tienes permiso. El historial lee las versiones guardadas de forma persistente en el servidor. Deshacer y rehacer se aplican a la sesión de edición actual y no necesitan un servicio de historial.

## Preparar los servicios de colaboración e historial

Completa la [integración de colaboración](https://docs.univer.ai/es-ES/server/collaboration/browser-integration.md) y la [configuración de la licencia](https://docs.univer.ai/es-ES/server/license.md). Verifica que dos sesiones puedan editar el mismo documento Bases y que los cambios se conserven al recargar.

Sigue las [extensiones de colaboración de Office](https://docs.univer.ai/es-ES/server/collaboration/extensions.md) y el [ejemplo de historial](https://docs.univer.ai/es-ES/server/collaboration/examples.md#history) para conectar el almacenamiento del historial y los permisos. La colaboración básica no activa automáticamente el historial. El backend también debe admitir listas de versiones, su contenido y su restauración.

## Añadir los plugins de historial

Añade lo siguiente a la configuración existente del producto, la licencia y la colaboración. Si un preset o una configuración existente ya registra estos plugins, modifica esa configuración en lugar de registrarlos dos veces.

#### npm

```bash
npm install @univerjs-pro/edit-history @univerjs-pro/edit-history-ui @univerjs-pro/bases-history @univerjs-pro/bases-history-ui
```

#### pnpm

```bash
pnpm add @univerjs-pro/edit-history @univerjs-pro/edit-history-ui @univerjs-pro/bases-history @univerjs-pro/bases-history-ui
```

#### yarn

```bash
yarn add @univerjs-pro/edit-history @univerjs-pro/edit-history-ui @univerjs-pro/bases-history @univerjs-pro/bases-history-ui
```

#### bun

```bash
bun add @univerjs-pro/edit-history @univerjs-pro/edit-history-ui @univerjs-pro/bases-history @univerjs-pro/bases-history-ui
```

```ts
import { UniverEditHistoryPlugin } from '@univerjs-pro/edit-history'
import EditHistoryLocale from '@univerjs-pro/edit-history-ui/locale/en-US'
import { UniverBasesHistoryPlugin } from '@univerjs-pro/bases-history'
import { UniverBasesHistoryUIPlugin } from '@univerjs-pro/bases-history-ui'
import HistoryLocale from '@univerjs-pro/bases-history-ui/locale/en-US'
import { LocaleType, mergeLocales } from '@univerjs/core'

import '@univerjs-pro/edit-history-ui/lib/index.css'
import '@univerjs-pro/bases-history-ui/lib/index.css'

const historyServerUrl = '/api/history'

univerAPI.loadLocales(LocaleType.EN_US, mergeLocales(EditHistoryLocale, HistoryLocale))
univer.registerPlugin(UniverEditHistoryPlugin, { historyServerUrl })
univer.registerPlugin(UniverBasesHistoryPlugin)
univer.registerPlugin(UniverBasesHistoryUIPlugin, {
  univerContainerId: 'app',
  historyServerUrl,
})
```

Sustituye `/api/history` por el endpoint de historial de tu aplicación y comprueba que su API corresponda a las solicitudes del cliente. Mantén idénticos ambos valores de `historyServerUrl`. Configura `univerContainerId` con el ID DOM del contenedor del editor y carga el idioma que corresponda al editor.

El visor del historial crea un editor independiente de solo lectura. Para contenido personalizado, utiliza `viewerPlugins` para añadir plugins que el visor no incluya ya. No vuelvas a registrar los plugins integrados en el visor.

## Consultar y restaurar versiones

Abre el historial desde el menú del editor y selecciona una versión para consultar su contenido y cambios. Restaurar modifica el documento compartido actual. Solo los usuarios con permiso de restauración deben poder hacerlo, y el servidor debe imponer ese permiso.

Para verificar la integración, modifica campos, registros o vistas, espera la confirmación de la colaboración y consulta la lista de versiones y su contenido. Vuelve a abrir la aplicación y reinicia el servicio para comprobar la persistencia. Restaura una versión anterior y verifica que otra sesión del navegador reciba el estado restaurado.

Si la lista está vacía, comprueba si se ha registrado historial para el documento y revisa su ID y la URL del servicio. Si puedes consultar pero no restaurar, revisa los permisos de restauración y la conexión de colaboración. Leer el historial también requiere autorización, ya que las versiones anteriores pueden contener datos que se hayan eliminado posteriormente.

## Comparar snapshots

Para crear una pantalla de revisión o proporcionar cambios a un AI Agent, usa `compareUnitData()` o prepara el resultado una sola vez con `prepareUnitComparison()`. Registra el plugin History del producto e importa la entrada Facade. Proporciona dos snapshots completos del mismo documento en `beforeSnapshot` y `afterSnapshot`. Esta comparación de solo lectura no necesita un servicio de historial y no restaura ni combina contenido.

```ts
import { UnitComparisonDetailLevel, UnitComparisonFidelity } from '@univerjs-pro/edit-history'
import { UniverInstanceType } from '@univerjs/core'

import '@univerjs-pro/edit-history/facade'

const comparison = univerAPI.prepareUnitComparison({
  comparisonId: 'review-1',
  unitId: beforeSnapshot.id,
  type: UniverInstanceType.UNIVER_BASE,
  fidelity: UnitComparisonFidelity.SNAPSHOT,
  leftData: beforeSnapshot,
  rightData: afterSnapshot,
})
const overview = comparison.query({ detail: UnitComparisonDetailLevel.SUMMARY })
const scope = overview.scopes[0]
const page = comparison.query({ scope, offset: 0, limit: 100 })
console.log(page.items, page.page.hasMore, page.diagnostics)
```

Lee `scopes` para obtener las vistas disponibles y pasa un ámbito a `query()` para filtrar sin recalcular las diferencias. Cada página devuelve 100 elementos de forma predeterminada, con un máximo de 1.000. Usa `page.hasMore` y `offset` para continuar. `summary` describe siempre la comparación completa, incluso al filtrar elementos. Comprueba `diagnostics.readiness` y `diagnostics.codes` antes de tratar el resultado como completo. Para Node.js o una CLI sin editor, consulta la [API de comparación sin interfaz](https://docs.univer.ai/es-ES/reference/packages/plugins/univerjs-pro/edit-history.md#headless-comparison).
