https://github.com/smartlabsat/directus-expandable-blocks
Advanced M2A interface for Directus with inline expandable editing, drag & drop sorting, and native save integration - no custom API calls needed
https://github.com/smartlabsat/directus-expandable-blocks
block-editor cms content-blocks content-management directus directus-extension directus-interface drag-and-drop inline-editing m2a typescript vue3 vuedraggable
Last synced: about 1 month ago
JSON representation
Advanced M2A interface for Directus with inline expandable editing, drag & drop sorting, and native save integration - no custom API calls needed
- Host: GitHub
- URL: https://github.com/smartlabsat/directus-expandable-blocks
- Owner: smartlabsAT
- License: mit
- Created: 2025-07-11T19:29:02.000Z (3 months ago)
- Default Branch: main
- Last Pushed: 2025-08-31T12:55:27.000Z (about 1 month ago)
- Last Synced: 2025-08-31T12:58:47.874Z (about 1 month ago)
- Topics: block-editor, cms, content-blocks, content-management, directus, directus-extension, directus-interface, drag-and-drop, inline-editing, m2a, typescript, vue3, vuedraggable
- Language: TypeScript
- Homepage: https://github.com/smartlabsAT/directus-expandable-blocks
- Size: 1.73 MB
- Stars: 17
- Watchers: 1
- Forks: 3
- Open Issues: 12
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Directus Expandable Blocks Interface
[](https://www.npmjs.com/package/directus-extension-expandable-blocks)
[](https://www.npmjs.com/package/directus-extension-expandable-blocks)
[](https://github.com/smartlabsAT/directus-expandable-blocks/releases)
[](https://github.com/smartlabsAT/directus-expandable-blocks/blob/master/LICENSE)
[](https://directus.io)
[](https://github.com/smartlabsAT/directus-expandable-blocks)
[](https://www.typescriptlang.org/)A powerful, production-ready M2A (Many-to-Any) interface extension for Directus with inline expandable editing, advanced item selection, comprehensive permissions, and seamless integration with Directus' native save system. **Also provides reusable ItemSelector components for other extensions.**

[๐ Documentation](https://github.com/smartlabsAT/directus-expandable-blocks/wiki) โข
[๐ Report Bug](https://github.com/smartlabsAT/directus-expandable-blocks/issues/new?template=bug_report.md) โข
[โจ Request Feature](https://github.com/smartlabsAT/directus-expandable-blocks/issues/new?template=feature_request.md) โข
[๐ฆ NPM Package](https://www.npmjs.com/package/directus-extension-expandable-blocks)## ๐ Table of Contents
- [Why Expandable Blocks?](#-why-expandable-blocks)
- [Features](#-features)
- [Installation](#-installation)
- [Usage](#-usage)
- [Configuration](#๏ธ-configuration)
- [Shared Components](#-shared-components-for-other-extensions)
- [Testing](#-testing)
- [Development](#-development)
- [Documentation](#-documentation)
- [Contributing](#-contributing)
- [License](#-license)## ๐ฏ Why Expandable Blocks?
Unlike other block editors, this extension **works directly with Directus' native form system** and provides **unique killer features**:
### ๐ Killer Features
- ๐ **Reference Tracking** - See EVERYWHERE an item is used across your entire system
- ๐ **Link or Copy** - Choose to reference existing items or create independent copies
- โ ๏ธ **Usage Protection** - Never accidentally delete content that's used elsewhere### โ Native Integration
- **Native Save & Stay** - Works perfectly with Directus' save options
- **Global Discard** - Integrates with Directus' "Discard Changes" button
- **Proper Dirty State** - Save button only appears when changes exist
- **No Data Loss** - All changes tracked through Directus' form state
- **Enterprise Ready** - Production-tested with comprehensive permissions
- **100% Test Coverage** - 470 unit tests ensuring reliability## โจ Features
### ๐จ Core Interface Features
#### **Block Management**
- ๐ **Inline Expandable Editing** - Edit content without opening separate forms
- ๐ฏ **Drag & Drop Sorting** - Intuitive block reordering with visual feedback
- ๐ **Visual NEW Indicator** - See unsaved blocks at a glance
- ๐ **Status Management** - Quick status changes with color-coded indicators
- ๐ **Duplicate Blocks** - Clone existing blocks with one click
- ๐๏ธ **Smart Delete** - Unlink or permanently delete with confirmation
- ๐ **Discard Changes** - Revert individual blocks to original state#### **Item Selection & Search**
- ๐ **Advanced Item Selector** - Select and link existing items from any collection
- ๐ **Link or Copy Mode** - Choose to reference existing items or create copies
- ๐ **Table View** - Browse items in a sortable, filterable table
- ๐ท๏ธ **Tag-Based Search** - Search with AND/OR operators and field-specific queries
- ๐ฏ **Smart Search** - Simple search mode with optional advanced tag search
- ๐ **Search Highlighting** - See matching terms highlighted in results
- ๐ **Search History** - Remember and reuse previous searches
- ๐ **Result Count** - See number of matching items instantly#### **Table Features**
- ๐ **Intelligent Columns** - Auto-sizing based on field types
- ๐ **Sticky Columns** - Keep important columns visible while scrolling
- โ๏ธ **Sortable Headers** - Sort by any field with 3-click cycle
- ๐จ **Field Display** - Smart rendering for all Directus field types
- ๐ผ๏ธ **Image Preview** - Hover to see full images
- ๐ **WYSIWYG Support** - Automatic HTML stripping for clean display
- โก **Virtual Scrolling** - Handle thousands of items efficiently### ๐ Advanced Features
#### **Translation Support**
- ๐ **Multi-Language** - Full support for Directus translations
- ๐ **Language Switching** - Change languages on the fly
- ๐ **Translation Search** - Search across all language versions
- ๐ท๏ธ **Language Indicators** - See which fields are translatable#### **Permissions & Security**
- ๐ **Directus Permissions** - Respects all native permissions
- ๐ฅ **Role-Based Control** - Configure per-role access
- ๐ **Read-Only Mode** - Automatic for restricted items
- โ ๏ธ **Permission Indicators** - Visual feedback for restricted actions
- ๐ก๏ธ **Security** - Built-in validation and permission checks#### **Usage Tracking & References** ๐ *(Requires API Extension)*
- ๐ **Reference Detection** - Instantly see ALL places where an item is used across your entire Directus instance
- ๐ **Cross-Collection References** - Track usage across different collections and relationships
- ๐ **Deep Links** - Navigate directly to parent items with one click
- โ ๏ธ **Usage Warnings** - Get alerts before deleting items that are referenced elsewhere
- ๐ **Usage Paths** - Visual breadcrumbs showing complete relationship chains
- ๐ฏ **Smart Prevention** - Prevents accidental deletion of referenced content> **Note:** These features require the optional [API extension](https://www.npmjs.com/package/directus-extension-expandable-blocks-api) to be installed.
#### **Inline Editing**
- โ๏ธ **Edit Drawer** - Edit items without leaving the interface
- ๐พ **Independent Saves** - Save edits without affecting main form
- ๐ **Live Updates** - See changes reflected immediately
- ๐ **Adjustable Width** - Resize drawer to your preference### โก Performance & Quality
#### **Performance**
- ๐ **Multi-Layer Caching** - Configurable TTLs for optimal speed
- ๐ **Smart Loading** - Load only what's needed
- ๐ **Debounced Operations** - Prevent excessive API calls
- โก **Optimized Re-renders** - Using Vue 3's advanced features
- ๐พ **Persistent Preferences** - Remember user settings#### **Code Quality**
- โ **100% Test Coverage** - 470 passing unit tests
- ๐ฏ **TypeScript Strict Mode** - Zero type errors
- ๐ **ESLint Compliant** - Zero linting errors
- ๐๏ธ **Modular Architecture** - 15+ reusable components
- ๐ **Comprehensive Docs** - Wiki, API docs, and inline comments### ๐ ๏ธ Developer Features
#### **Extension Architecture**
- ๐ฆ **Interface Extension** - Clean, focused interface implementation
- ๐ **Composable Architecture** - Reusable Vue composables
- ๐จ **Component Library** - Modular, tested components
- ๐ง **Utility Functions** - Shared helpers and validators
- ๐ **TypeScript Types** - Full type definitions## ๐ฆ Installation
### Via NPM (Recommended)
```bash
# Install the interface extension
npm install directus-extension-expandable-blocks# Optional: Install the API extension for advanced usage tracking
npm install directus-extension-expandable-blocks-api
```### Via pnpm
```bash
# Install the interface extension
pnpm add directus-extension-expandable-blocks# Optional: Install the API extension for advanced usage tracking
pnpm add directus-extension-expandable-blocks-api
```### Manual Installation
1. Download the latest release from [GitHub Releases](https://github.com/smartlabsAT/directus-expandable-blocks/releases)
2. Extract to your Directus `extensions/` directory
3. Restart Directus
4. **Optional**: Install the [API extension](https://github.com/smartlabsAT/directus-expandable-blocks-api) for usage tracking### Docker Installation
```dockerfile
# Install the interface extension
RUN npm install directus-extension-expandable-blocks# Optional: Install the API extension for advanced usage tracking
RUN npm install directus-extension-expandable-blocks-api
```### ๐ Important Note About the API Extension
**The API extension is now a separate, optional package.** The core Expandable Blocks interface works perfectly without it, using Directus' native API for all standard operations.
#### When to install the API extension:
- โ You want to see where items are used before deleting them
- โ You need to track references across M2A relationships
- โ You want protection against accidentally deleting referenced content#### The interface works without the API extension:
- โ All core features (editing, sorting, adding blocks) work normally
- โ Uses native Directus API for all operations
- โ ๏ธ Cannot verify item usage before deletion (shows warning instead)## ๐ Usage
### Basic Setup
#### 1๏ธโฃ Create an M2A Field
1. Navigate to **Settings โ Data Model โ [Your Collection]**
2. Click **"Create Field"**
3. Choose **"Many to Any Relationship (M2A)"**
4. Configure the relationship#### 2๏ธโฃ Select the Expandable Blocks Interface
1. In the field configuration, go to **"Interface"** tab
2. Select **"Expandable Blocks"** from the dropdown
3. Configure your options#### 3๏ธโฃ Configure Options
The interface provides extensive configuration grouped into logical sections:
- **Display Options** - Visual preferences
- **Permissions & Actions** - What users can do
- **Collections & Relations** - Available collections
- **Advanced Settings** - Caching, translations, etc.## โ๏ธ Configuration
### Display Settings
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| `enableSorting` | boolean | `true` | Enable drag & drop reordering |
| `showItemId` | boolean | `true` | Display item IDs |
| `showCollectionName` | boolean | `true` | Show collection type |
| `startExpanded` | boolean | `false` | Start with blocks expanded |
| `accordionMode` | boolean | `false` | One block open at a time |
| `compactMode` | boolean | `false` | Condensed view |### Permissions
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| `isAllowedDelete` | boolean | `true` | Allow deletion |
| `isAllowedDuplicate` | boolean | `true` | Allow duplication |
| `allowLinkExisting` | boolean | `true` | Allow linking existing |
| `allowDuplicateExisting` | boolean | `true` | Allow duplicating linked |
| `maxBlocks` | number | `null` | Maximum blocks allowed |### Collections
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| `collection` | array | `[]` | Collections for new blocks |
| `allowedCollectionsExisting` | array | `[]` | Collections for existing items |### Advanced
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| `enableCache` | boolean | `true` | Enable API caching |
| `enableTranslations` | boolean | `true` | Support translations |
| `showUsageWarnings` | boolean | `true` | Show usage indicators |### Environment Variables
Configure caching behavior:
```bash
# Cache TTL Settings (in minutes)
EXPANDABLE_BLOCKS_CACHE_TTL_METADATA=30
EXPANDABLE_BLOCKS_CACHE_TTL_SEARCH=5
EXPANDABLE_BLOCKS_CACHE_TTL_DETAIL=10
EXPANDABLE_BLOCKS_CACHE_TTL_PATHS=10# Maximum cache size
EXPANDABLE_BLOCKS_CACHE_MAX_SIZE=50000
```## ๐ Shared Components for Other Extensions
This extension provides **reusable ItemSelector components** that can be used in other Directus extensions, allowing you to avoid code duplication and maintain consistent UX across extensions.
### Quick Start for Extension Developers
```bash
# Add as dependency to your extension
npm install directus-extension-expandable-blocks
``````typescript
// Import shared components in your extension
import {
useItemSelector,
ItemSelectorDrawer,
type ItemSelectorConfig
} from 'directus-extension-expandable-blocks/shared';// Configure for your extension
const itemSelector = useItemSelector(api, ['pages', 'articles'], {
loggerPrefix: '[MyExtension]',
allowLink: true,
allowDuplicate: false,
collectionIcons: {
'pages': 'description',
'articles': 'article'
}
});
```### Available Shared Components
- **`useItemSelector`** - Core composable with all functionality
- **`ItemSelectorDrawer`** - Main selector interface
- **`ItemSearchPanel`** - Advanced search with operators
- **`FieldDisplay`** - Field value display component
- **`UsagePopover`** - Shows item usage across collections### Configuration Options
```typescript
interface ItemSelectorConfig {
loggerPrefix?: string; // Custom logging prefix
allowLink?: boolean; // Allow linking items
allowDuplicate?: boolean; // Allow duplicating items
defaultItemsPerPage?: number; // Pagination size
defaultLanguage?: string; // Translation language
collectionIcons?: Record; // Custom icons
fieldMappings?: Record; // Field name mappings
debug?: boolean; // Enable debug logging
}
```### Full Documentation
๐ **[Complete Shared Components Documentation](SHARED_COMPONENTS.md)** - Detailed usage guide, examples, and API reference for extension developers.
### Example Usage in LayoutBlocks Extension
```vue
import { useItemSelector, ItemSelectorDrawer } from 'directus-extension-expandable-blocks/shared';
const itemSelector = useItemSelector(api, ['layouts'], {
loggerPrefix: '[LayoutBlocks]',
allowDuplicate: false
});```
## ๐งช Testing
```bash
# Run all tests (100% coverage)
npm run test -- --run# Test with UI
npm run test:ui# Coverage report
npm run test:coverage# Type checking
npm run type-check# Linting
npm run lint
```### Test Statistics
- โ **470 unit tests** - All passing
- โ **100% coverage** - Full test coverage
- โ **0 TypeScript errors** - Strict mode compliant
- โ **0 ESLint errors** - Clean code## ๐ Development
```bash
# Install dependencies (we use pnpm)
pnpm install# Development mode
npm run dev# Production build
npm run build# Type checking
npm run type-check# Create demo videos
npm run demo:product
npm run demo:highlights
```### Project Structure
```
expandable-blocks/
โโโ config/ # Configuration files
โ โโโ scripts/ # Build scripts
โ โโโ *.config.* # Various configs
โโโ src/
โ โโโ components/ # Vue components
โ โโโ composables/ # Vue composables
โ โโโ types/ # TypeScript types
โ โโโ utils/ # Utilities
โโโ test/ # Test files
โโโ wiki/ # Documentation
```## ๐ Documentation
### Wiki Documentation
Visit our **[GitHub Wiki](https://github.com/smartlabsAT/directus-expandable-blocks/wiki)** for:
- ๐ [Getting Started](https://github.com/smartlabsAT/directus-expandable-blocks/wiki)
- ๐ฆ [Installation Guide](https://github.com/smartlabsAT/directus-expandable-blocks/wiki/Installation)
- โ๏ธ [Configuration](https://github.com/smartlabsAT/directus-expandable-blocks/wiki/Configuration)
- ๐๏ธ [Architecture](https://github.com/smartlabsAT/directus-expandable-blocks/wiki/Architecture-Overview)
- ๐ [Security](https://github.com/smartlabsAT/directus-expandable-blocks/wiki/Security)
- ๐ [Advanced Features](https://github.com/smartlabsAT/directus-expandable-blocks/wiki/Advanced-Features)
- ๐ฌ [Demo Videos](https://github.com/smartlabsAT/directus-expandable-blocks/wiki/Demo-Video-Recording)
- โก [Cache Configuration](https://github.com/smartlabsAT/directus-expandable-blocks/wiki/Cache-Configuration)## ๐ค Contributing
We welcome contributions! Please see our [Contributing Guide](https://github.com/smartlabsAT/directus-expandable-blocks/wiki/Contributing) for details.
## ๐ License
MIT License - see [LICENSE](LICENSE) file for details
## ๐ Acknowledgments
Made with โค๏ธ for the Directus community
## ๐ Stats
- **200+ commits** of continuous improvement
- **15+ components** for modular architecture
- **470 tests** ensuring reliability
- **0 errors** in TypeScript and ESLint
- **100% coverage** for peace of mind---
**Ready for production use!** ๐