# Protect Sheet Module data flow

## What It Does
Protect-sheet module manages sheet- and workbook-level protection: applying and removing protection, password dialogs, locking cells/columns, updating UI controls, and enforcing protected-state constraints across actions and keyboard interactions.

## Entry Points

**WorkbookProtectSheet (Core)**
- `protectsheetHandler(args)` - Core handler that marks a sheet protected, applies `protectSettings`, sets default column locks, and notifies workbook-level protection updates.
- `unprotectsheetHandler(args)` - Removes protection flags and restores protect settings when unprotecting.
- `lockCells(args)` - Locks/unlocks cells in a given range by calling `setCell` and `setColumn` on the `SheetModel`.

**ProtectSheet (Spreadsheet / UI)**
- UI event handlers that display password dialogs and option lists, collect user choices, and forward requests to the core via notifications (`protectsheetHandler`, `applyProtect`, etc.).
- `protectSheetHandler(args)` - UI responder that updates ribbon/button states and notifies `protectCellFormat` and other UI subsystems when protection changes.
- Dialog flows: `createDialogue()`, `selectOption()`, `reEnterSheetPassword()`, `protectWorkbook()`, `unProtectWorkbook()`, and related dialog helpers.

## Core Logic Flow

1. UI initiates protect/unprotect via notifications (e.g., `applyProtect`, `protectsheetHandler`), or programmatic calls.
2. `WorkbookProtectSheet.protectsheetHandler`:
   - Determines target `sheetIndex` and retrieves `SheetModel`.
   - Sets `isProtected` to true and writes `protectSettings` (selectCells, formatCells, formatRows, formatColumns, insertLink, selectUnLockedCells) using `setSheetPropertyOnMute` to avoid noisy binds.
   - Notifies `protectSheetWorkBook` and `updateToggle` to update higher-level workbook UI state.
   - Stores the optional password on the sheet and marks undefined column `isLocked` as `true`.
3. `WorkbookProtectSheet.unprotectsheetHandler` clears `isProtected`, resets protect settings, and notifies `protectSheetWorkBook` and `updateToggle`.
4. `WorkbookProtectSheet.lockCells` maps an A1 range to indices, iterates, calls `setColumn` when full columns are targeted, and `setCell` per cell to toggle `isLocked`. Optionally emits an `actionComplete` event when `triggerEvent` is provided.

## UI Logic Flow

1. User triggers protection via UI (menu/ribbon) or keyboard; `ProtectSheet` receives `applyProtect` / `protectSheet` events.
2. When enabling protection, `ProtectSheet.createDialogue()` shows a dialog with password input and a ListView of allowed actions (SelectCells, SelectUnlockedCells, FormatCells, FormatRows, FormatColumns, InsertLinks).
3. On confirm (`selectOption`) the UI gathers selected options and calls `this.parent.notify(protectsheetHandler, { protectSettings, password, triggerEvent: true })` to apply protection at the core level, then updates selection state and clears undo history (`clearUndoRedoCollection`).
4. When disabling protection or unprotecting, the UI shows password entry dialogs as needed (`unprotectdlgOkClick`, `unProtectWorkbook` flows) and calls core unprotect handlers.
5. UI `protectSheetHandler` responds to model protection changes by toggling ribbon/toolbar controls (lists of `disableHomeBtnId` / `enableHomeBtnId`) and calling `protectCellFormat` and `enableFormulaInput` to enforce UI restrictions. It also triggers `completeAction` when `triggerEvent` is true.
6. Additional UI flows handle import-protected files (`importProtectWorkbook` / `importProtectPasswordContent`) and toggling workbook-protection states.

## Operations Handled

- Apply Sheet Protection
  - Show password/options dialog, collect `protectSettings`, call core to set `isProtected` and `password`.
  - Update UI toggles, disable/enable ribbon buttons, clear undo/redo where appropriate.

- Remove Sheet Protection
  - Prompt for password when necessary, clear `isProtected`, and restore UI controls.

- Lock/Unlock Cells Programmatically
  - `lockCells` writes `isLocked` on targeted cells/columns and optionally emits `actionComplete` for caller visibility.

- Workbook Protection
  - UI exposes workbook-level protect/unprotect dialogs and sets `parent.password`/`parent.isProtected` accordingly; updates sheet tabs and toggle states.

- Import-protected Workbooks/Sheets
  - UI handles entering passwords for imported files and routes the unlock operation through existing protect/unprotect flows.

## Validation & Safety

- Dialog safeguards: `beforeOpen` and `beforeClose` hooks allow cancellation of dialogs through `dialogBeforeOpen` events.
- State mute updates: `setSheetPropertyOnMute` avoids noisy reactive updates while core state changes are applied.
- Column defaults: When protecting, undefined `column.isLocked` values are defaulted to `true` to avoid accidental edits.
- Protected actions gating: UI checks `sheet.isProtected` and `protectSettings` before allowing edits, formats, merges, or other mutations; keyboard handlers consult `isProtected` to block commands.

## Desired Outputs (Post-Protection)

- Model: Sheet `isProtected` flag and `protectSettings` set; `password` stored on sheet when provided; affected columns/cells marked with `isLocked`.
- UI: Ribbon and toolbar buttons disabled/enabled according to protection; protect toggles updated; dialogs closed and focus returned.
- Events: `protectSheetWorkBook`, `updateToggle`, `protectCellFormat`, `completeAction`, and `actionComplete` emitted for consumers and telemetry.

## System-Level

- Important types & events:
  - `ProtectSettings`, `UnprotectArgs`, `applyProtect`, `protectSheet`, `protectsheetHandler`, `protectSheetWorkBook`, `unprotectsheetHandler`, `setLockCells`, `clearUndoRedoCollection`, `protectCellFormat`, `updateToggleItem`, `completeAction`, `protectSelection`, `importModelUpdate`.

- Modules:
  - Core: `src/workbook/actions/protect-sheet.ts` (`WorkbookProtectSheet`)
  - UI: `src/spreadsheet/actions/protect-sheet.ts` (`ProtectSheet`)

## Test / Verification Actions

- Apply protection with various `protectSettings` combinations and verify restricted actions (formatting, inserting links, selecting cells) are disabled.
- Verify password dialog flows: setting a password and unprotecting with correct/incorrect password shows expected behavior and messages.
- Lock/unlock a specific range via `setLockCells` and confirm `isLocked` on cells and columns and that `actionComplete` fires when requested.
- Import an encrypted workbook and verify `importProtectWorkbook` prompts and the provided password unlocks the document.
- Confirm ribbon toolbar items toggle correctly and `protectCellFormat` is invoked with expected button id lists.

---