# @memberjunction/ng-deep-diff
Angular component for visualizing deep object differences using the non-visual `DeepDiffer` functionality from `@memberjunction/global`. Provides both an inline comparison view and a dialog wrapper.
## Overview
The `@memberjunction/ng-deep-diff` package renders a hierarchical diff of two JavaScript objects, highlighting additions, removals, and modifications. It supports expandable tree navigation, change type filtering, text search, copy-to-clipboard, and JSON export. A dialog variant wraps the inline component for modal use.
```mermaid
graph TD
A[DeepDiffModule] --> B[DeepDiffComponent]
A --> C[DeepDiffDialogComponent]
B --> D["Diff Computation
(DeepDiffer from @memberjunction/global)"]
B --> E["Tree Display"]
B --> F["Filter & Search"]
B --> G["Export & Copy"]
E --> E1["Added (green)"]
E --> E2["Removed (red)"]
E --> E3["Modified (blue)"]
E --> E4["Unchanged (gray)"]
style A fill:#2d6a9f,stroke:#1a4971,color:#fff
style B fill:#7c5295,stroke:#563a6b,color:#fff
style C fill:#2d8659,stroke:#1a5c3a,color:#fff
style D fill:#b8762f,stroke:#8a5722,color:#fff
```
## Installation
```bash
npm install @memberjunction/ng-deep-diff
```
## Usage
### Import the Module
```typescript
import { DeepDiffModule } from '@memberjunction/ng-deep-diff';
@NgModule({
imports: [
DeepDiffModule,
// ... other imports
]
})
export class YourModule { }
```
### Basic Component Usage
```html
```
### Dialog Usage
```html
```
## Component Properties
### DeepDiffComponent
| Property | Type | Default | Description |
|----------|------|---------|-------------|
| `oldValue` | `Record` | - | The original value to compare |
| `newValue` | `Record` | - | The new value to compare against |
| `title` | `string` | `'Deep Diff Analysis'` | Title displayed in the header |
| `showSummary` | `boolean` | `true` | Whether to show summary statistics |
| `showUnchanged` | `boolean` | `false` | Whether to show unchanged properties |
| `expandAll` | `boolean` | `false` | Whether to expand all nodes by default |
| `maxDepth` | `number` | `10` | Maximum depth to traverse in nested objects |
| `maxStringLength` | `number` | `100` | Maximum string length before truncation |
| `truncateValues` | `boolean` | `true` | Whether to truncate long values |
| `treatNullAsUndefined` | `boolean` | `false` | Whether to treat null values as equivalent to undefined |
### DeepDiffDialogComponent
All properties from DeepDiffComponent, plus:
| Property | Type | Default | Description |
|----------|------|---------|-------------|
| `visible` | `boolean` | `false` | Controls dialog visibility |
| `width` | `string` | `'80%'` | Dialog width |
| `height` | `string` | `'80vh'` | Dialog height |
## Features
- **Hierarchical Display**: Nested objects and arrays are displayed in an expandable tree structure
- **Change Type Filtering**: Filter by added, removed, modified, or unchanged items
- **Text Search**: Search through paths and descriptions
- **Copy Functionality**: Copy paths and values to clipboard
- **Export**: Export diff results as JSON
- **Responsive Design**: Works on desktop and mobile devices
- **Performance**: Handles large objects with configurable depth limits
- **Null Handling**: Optional treatment of null as undefined for API compatibility
## Examples
### Basic Comparison
```typescript
export class MyComponent {
originalData = {
name: 'John Doe',
age: 30,
email: 'john@example.com'
};
modifiedData = {
name: 'John Doe',
age: 31,
email: 'john.doe@example.com',
phone: '+1234567890'
};
}
```
```html
```
### API Response Comparison with Null Handling
```typescript
export class ApiComponent {
apiResponse1 = {
id: 123,
name: null,
description: 'Product',
price: 99.99
};
apiResponse2 = {
id: 123,
name: 'Updated Product',
description: null,
price: 89.99
};
}
```
```html
```
### Dialog with Custom Configuration
```typescript
export class ConfigComponent {
showComparison = false;
compareVersions() {
this.showComparison = true;
}
}
```
```html
```
## Styling
The component uses CSS classes that can be customized:
- `.diff-added` -- Added items (green)
- `.diff-removed` -- Removed items (red)
- `.diff-modified` -- Modified items (blue)
- `.diff-unchanged` -- Unchanged items (gray)
## Dependencies
| Package | Description |
|---------|-------------|
| `@memberjunction/global` | Provides the core `DeepDiffer` functionality |
| `@angular/common` | Angular common module |
| `@angular/core` | Angular core framework |
### Peer Dependencies
- `@angular/common` ^21.x
- `@angular/core` ^21.x
## Build
```bash
cd packages/Angular/Generic/deep-diff
npm run build
```
## License
ISC