# Plan

- Human documentation: [https://docs.univer.ai/fr-FR/guides/sheets/features/outline](https://docs.univer.ai/fr-FR/guides/sheets/features/outline)

- Agent Markdown: [https://docs.univer.ai/fr-FR/guides/sheets/features/outline.md](https://docs.univer.ai/fr-FR/guides/sheets/features/outline.md)

- Requested language: `fr-FR`

- Content language: `fr-FR`

- Documentation version: `1.2.0`

- Source: [sheets/features/outline.fr-FR.mdx](https://github.com/dream-num/documentation/blob/dev/content/guides/sheets/features/outline.fr-FR.mdx)

---

#### Package metadata

```json
{
  "mobile": true,
  "preset": [
    {
      "client": "@univerjs/preset-sheets-advanced",
      "locale": "@univerjs/preset-sheets-advanced/locales/en-US",
      "style": "@univerjs/preset-sheets-advanced/lib/index.css"
    }
  ],
  "plugins": [
    {
      "client": "@univerjs-pro/sheets-outline",
      "facade": "@univerjs-pro/sheets-outline/facade"
    },
    {
      "client": "@univerjs-pro/sheets-outline-ui",
      "locale": "@univerjs-pro/sheets-outline-ui/locale/en-US",
      "style": "@univerjs-pro/sheets-outline-ui/lib/index.css"
    }
  ],
  "license": true,
  "server": false
}
```

La fonctionnalité de plan, également appelée regroupement ou plan de dimensions, permet de regrouper les lignes ou les colonnes d’une feuille de calcul. Elle facilite l’organisation et la synthèse de grands jeux de données grâce à des sections repliables.

## Introduction

Dans Univer Sheets, la fonctionnalité de plan permet de :

* **Regrouper des lignes ou des colonnes** : créez des groupes hiérarchiques de lignes ou de colonnes pour organiser les données.
* **Replier et déplier les groupes** : affichez ou masquez les lignes ou colonnes regroupées en un seul clic.
* **Imbriquer les groupes** : créez plusieurs niveaux de groupes pour représenter des hiérarchies de données complexes.

Les groupes de plan sont couramment utilisés dans les cas suivants :

* Synthétiser des données détaillées : regroupez les lignes de détail sous des lignes de synthèse afin d’alléger l’affichage.
* Organiser de grands jeux de données : regroupez les colonnes ou lignes associées pour faciliter la navigation.
* Créer des rapports repliables : permettez aux utilisateurs de déplier ou de replier les sections d’un rapport selon leurs besoins.

> Interactive example: [Open the playground](/playground/sheets/outline)

## Mode plugin

### Installation

#### npm

```bash
npm install @univerjs-pro/sheets-outline @univerjs-pro/sheets-outline-ui
```

#### pnpm

```bash
pnpm add @univerjs-pro/sheets-outline @univerjs-pro/sheets-outline-ui
```

#### yarn

```bash
yarn add @univerjs-pro/sheets-outline @univerjs-pro/sheets-outline-ui
```

#### bun

```bash
bun add @univerjs-pro/sheets-outline @univerjs-pro/sheets-outline-ui
```

### Utilisation

```typescript
import { UniverSheetsOutlinePlugin } from '@univerjs-pro/sheets-outline' // [!code ++]
import { UniverSheetsOutlineUIPlugin } from '@univerjs-pro/sheets-outline-ui' // [!code ++]
import SheetsOutlineUIEnUS from '@univerjs-pro/sheets-outline-ui/locale/en-US' // [!code ++]
import { LocaleType, mergeLocales, Univer } from '@univerjs/core'

import '@univerjs-pro/sheets-outline/facade' // [!code ++]

import '@univerjs-pro/sheets-outline-ui/lib/index.css' // [!code ++]

const univer = new Univer({
  locale: LocaleType.EN_US,
  locales: {
    [LocaleType.EN_US]: mergeLocales(
      SheetsOutlineUIEnUS, // [!code ++]
    ),
  },
})

univer.registerPlugin(UniverSheetsOutlinePlugin)
univer.registerPlugin(UniverSheetsOutlineUIPlugin)
```

Si vous disposez d’une licence commerciale Univer, consultez la page [Utiliser une licence côté client](https://docs.univer.ai/fr-FR/server/license.md#in-plugin-mode) pour effectuer la configuration.

## Prise en charge mobile

Configurez d’abord l’[éditeur mobile](https://docs.univer.ai/fr-FR/guides/sheets/getting-started/installation.md#mobile-support). Dans l’initialisation en mode plugin de cette page, remplacez les inscriptions de bureau ci-dessous par les exports mobiles des mêmes paquets **avant d’ouvrir un document**. Conservez modèles, styles, traductions et imports Facade ; n’enregistrez pas les deux variantes.

| Paquet                            | Inscription de bureau         | Inscription mobile                  |
| --------------------------------- | ----------------------------- | ----------------------------------- |
| `@univerjs-pro/sheets-outline-ui` | `UniverSheetsOutlineUIPlugin` | `UniverSheetsOutlineMobileUIPlugin` |

## Mode prédéfini

La fonctionnalité de plan est incluse dans le preset `@univerjs/preset-sheets-advanced`.

### Installation

#### npm

```bash
npm install @univerjs/preset-sheets-advanced
```

#### pnpm

```bash
pnpm add @univerjs/preset-sheets-advanced
```

#### yarn

```bash
yarn add @univerjs/preset-sheets-advanced
```

#### bun

```bash
bun add @univerjs/preset-sheets-advanced
```

### Utilisation

```typescript
import { UniverSheetsAdvancedPreset } from '@univerjs/preset-sheets-advanced' // [!code ++]
import UniverPresetSheetsAdvancedEnUS from '@univerjs/preset-sheets-advanced/locales/en-US' // [!code ++]
import { UniverSheetsCorePreset } from '@univerjs/preset-sheets-core'
import UniverPresetSheetsCoreEnUS from '@univerjs/preset-sheets-core/locales/en-US'
import { createUniver, LocaleType, mergeLocales } from '@univerjs/presets'

import '@univerjs/preset-sheets-core/lib/index.css'
import '@univerjs/preset-sheets-advanced/lib/index.css' // [!code ++]

const { univerAPI } = createUniver({
  locale: LocaleType.EN_US,
  locales: {
    [LocaleType.EN_US]: mergeLocales(
      UniverPresetSheetsCoreEnUS,
      UniverPresetSheetsAdvancedEnUS, // [!code ++]
    ),
  },
  presets: [
    UniverSheetsCorePreset(),
    UniverSheetsAdvancedPreset(), // [!code ++]
  ],
})
```

Si vous disposez d’une licence commerciale Univer, consultez la page [Utiliser une licence côté client](https://docs.univer.ai/fr-FR/server/license.md#in-preset-mode) pour effectuer la configuration.

## API Facade

La définition complète des types de l’API Facade est disponible dans la documentation de la [FacadeAPI](https://docs.univer.ai/fr-FR/reference/facade/univer.md).

### Importation

> [!INFO: Remarque sur le mode plugin]
> L’importation manuelle du package Facade n’est nécessaire qu’en mode plugin. Le mode prédéfini inclut déjà le package Facade correspondant, aucune importation supplémentaire n’est donc requise.

```typescript
import '@univerjs-pro/sheets-outline/facade'
```

### Création de plans de lignes

Vous pouvez créer un groupe de plan de lignes à l’aide de l’API Facade :

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const fWorksheet = fWorkbook.getActiveSheet()

// Group rows 2 to 6 (0-based index: startRow=1, numRows=5)
fWorksheet.addRowOutline(1, 5)
```

### Création de plans de colonnes

De la même manière, vous pouvez créer un groupe de plan de colonnes :

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const fWorksheet = fWorkbook.getActiveSheet()

// Group columns B to E (0-based index: startColumn=1, numColumns=4)
fWorksheet.addColumnOutline(1, 4)
```

### Repli et dépli des plans

Vous pouvez replier ou déplier un groupe de plan par programmation :

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const fWorksheet = fWorkbook.getActiveSheet()

const rowOutlines = fWorksheet.getDimensionOutlines(univerAPI.Enum.DimensionOutlineAxis.ROW)
if (rowOutlines.length > 0) {
  // Collapse the first row outline group
  fWorksheet.setDimensionOutlineCollapsed(rowOutlines[0].id, true)

  // Expand it later
  fWorksheet.setDimensionOutlineCollapsed(rowOutlines[0].id, false)
}
```

### Suppression de plans

Vous pouvez supprimer un groupe de plan donné à partir de son identifiant :

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const fWorksheet = fWorkbook.getActiveSheet()

const rowOutlines = fWorksheet.getDimensionOutlines(univerAPI.Enum.DimensionOutlineAxis.ROW)
if (rowOutlines.length > 0) {
  fWorksheet.removeDimensionOutline(rowOutlines[0].id)
}
```

### Effacement des plans dans une plage

Vous pouvez effacer tous les groupes de plan d’une plage donnée :

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const fWorksheet = fWorkbook.getActiveSheet()

// Remove all row outline groups fully contained in rows 2 to 10
fWorksheet.clearDimensionOutlines(univerAPI.Enum.DimensionOutlineAxis.ROW, 1, 9)
```

### Consultation des plans

Vous pouvez récupérer tous les groupes de plan d’une feuille de calcul :

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const fWorksheet = fWorkbook.getActiveSheet()

// Get all row outlines
const rowOutlines = fWorksheet.getDimensionOutlines(univerAPI.Enum.DimensionOutlineAxis.ROW)
rowOutlines.forEach((outline) => {
  console.log(outline.id, outline.start, outline.end, outline.collapsed)
})

// Get all outlines (both row and column)
const allOutlines = fWorksheet.getDimensionOutlines()
```

## Structure des données d’un plan

Chaque groupe de plan possède les propriétés suivantes :

| Propriété   | Type                   | Description                                  |
| ----------- | ---------------------- | -------------------------------------------- |
| `id`        | `string`               | Identifiant unique du groupe de plan         |
| `unitId`    | `string`               | Identifiant d’unité du classeur              |
| `subUnitId` | `string`               | Identifiant de la feuille de calcul          |
| `axis`      | `DimensionOutlineAxis` | Axe du plan (`row` ou `column`)              |
| `start`     | `number`               | Indice de début inclusif, à partir de zéro   |
| `end`       | `number`               | Indice de fin inclusif, à partir de zéro     |
| `collapsed` | `boolean`              | Indique si le groupe est actuellement replié |

## Validation et erreurs

Lors de la création de groupes de plan, les validations suivantes sont effectuées :

* **Plage non valide** : la plage doit être valide (valeurs non négatives et nombre d’éléments non nul).
* **Dépassement des limites** : la plage doit se trouver dans les limites de la feuille de calcul.
* **Chevauchement de groupes** : les nouveaux groupes ne peuvent pas croiser les groupes existants.
* **Profondeur maximale** : la profondeur d’imbrication des groupes de plan est limitée.

Pour dissocier un groupe, la plage doit contenir entièrement celle du groupe de plan ; sinon, la validation échoue.

En cas d’échec de la validation, la commande n’est pas exécutée et une erreur est émise via le `SheetsOutlineErrorService`.
