Appearance
Folder Operations
Overview
The Folder Dialog System provides comprehensive folder management functionality through reusable dialog components. It supports folder creation, editing, moving, copying, deletion, and permission management across the DAM module.
Architecture
The system consists of:
- Core Dialog Components: Main folder dialog components for various operations
- Reusable Dialog Components: Shared components used for folder operations
- Integration Points: Pages and components that use folder dialogs
- API Integration: Backend endpoints for folder operations
File Structure
Core Folder Dialog Components
Main Folder Dialog Component
File: components/dam/Dialogs/FolderDialogs/FolderDialog.vue
Main folder dialog component that handles multiple folder operations.
Supported Operations:
- Add folder
- Move folder
- Move file
- Copy file
- Folder-file-move (combined operation)
- Multiple-folder-move
- Multiple-file-move
Props:
javascript
{
dialogType: {
type: String,
required: true,
validator: (value) => [
'add-folder',
'move-folder',
'move-file',
'copy-file',
'folder-file-move',
'multiple-folder-move',
'multiple-file-move'
].includes(value)
},
visible: {
type: Boolean,
default: false
},
// Additional props based on dialog type
}Methods:
javascript
// Handle folder selection
handleFolderSelect(folder) {
// Select folder for operation
}
// Execute folder operation
async executeOperation() {
// Perform move, copy, or create operation
// Call appropriate API endpoint
}
// Navigate folder tree
navigateToFolder(folderId) {
// Load folder contents for navigation
}Events:
javascript
{
'folder-created': (folder) => {},
'folder-moved': (result) => {},
'file-moved': (result) => {},
'file-copied': (result) => {},
'close': () => {}
}Folder Dialog List Item Component
File: components/dam/Dialogs/FolderDialogs/FolderDialogListItem.vue
Component for displaying individual folder items within the folder dialog.
Features:
- Folder selection
- Folder navigation
- Permission indicators
- Visual hierarchy display
Props:
javascript
{
folder: {
type: Object,
required: true
// Folder object with id, name, path, permissions, etc.
},
selectable: {
type: Boolean,
default: true
},
showPermissions: {
type: Boolean,
default: true
}
}Methods:
javascript
// Select folder
selectFolder() {
// Emit selection event
this.$emit('select', this.folder)
}
// Navigate into folder
navigate() {
// Emit navigation event
this.$emit('navigate', this.folder)
}Reusable Dialog Components
Create/Edit Folder Dialog
File: components/dam/Dialogs/CreateCollageDialog.vue
Reusable dialog component used for both folder creation and editing.
Usage as CreateFolderDialog:
vue
<CreateCollageDialog
:visible="showCreateFolder"
:is-folder="true"
@created="handleFolderCreated"
@close="showCreateFolder = false"
/>Usage as EditFolderDialog:
vue
<CreateCollageDialog
:visible="showEditFolder"
:is-folder="true"
:file-name="selectedFolder.name"
:file-description="selectedFolder.description"
@updated="handleFolderUpdated"
@close="showEditFolder = false"
/>Props:
javascript
{
visible: {
type: Boolean,
default: false
},
isFolder: {
type: Boolean,
default: false
},
fileName: {
type: String,
default: ''
// For edit mode - existing folder name
},
fileDescription: {
type: String,
default: ''
// Optional folder description
}
}Methods:
javascript
// Create folder
async createFolder() {
const folderData = {
name: this.folderName,
description: this.folderDescription,
parentId: this.currentFolderId
}
// Call API to create folder
const response = await this.$api.post('/folders', folderData)
this.$emit('created', response.data)
}
// Update folder
async updateFolder() {
const updateData = {
name: this.folderName,
description: this.folderDescription
}
// Call API to update folder
const response = await this.$api.put(`/folders/${this.folderId}`, updateData)
this.$emit('updated', response.data)
}Events:
javascript
{
'created': (folder) => {},
'updated': (folder) => {},
'close': () => {}
}Related Dialog Components
Permission Dialog
File: components/dam/Dialogs/PermissionDialog.vue
Dialog for setting folder permissions.
Usage:
vue
<PermissionDialog
:visible="showPermissionDialog"
:item="selectedFolder"
:item-type="'folder'"
@permissions-updated="handlePermissionsUpdated"
@close="showPermissionDialog = false"
/>Delete Confirmation Dialog
File: components/theme/global/Dialog/ConfirmationDialog.vue
Confirmation dialog for folder deletion.
Usage:
vue
<ConfirmationDialog
:visible="showDeleteDialog"
title="Delete Folder"
message="Are you sure you want to delete this folder?"
@confirm="handleDeleteFolder"
@cancel="showDeleteDialog = false"
/>Dialog Type Mappings
FolderDialog Types
| Dialog Type | Description | Use Case |
|---|---|---|
add-folder | Add new folder | Create folder in current location |
move-folder | Move folder | Relocate folder to another location |
move-file | Move file | Move file into folder |
copy-file | Copy file | Copy file into folder |
folder-file-move | Move folders and files | Combined move operation |
multiple-folder-move | Move multiple folders | Bulk folder relocation |
multiple-file-move | Move multiple files | Bulk file relocation |
CreateCollageDialog Usage
| Component Name | Props | Purpose |
|---|---|---|
CreateFolderDialog | isFolder: true | Create new folder |
EditFolderDialog | isFolder: true, fileName: <name> | Rename/edit folder |
Integration Points
Page Integration
Folders List Page
File: pages/_workspace_id/dam/folders/index.vue
Uses folder dialogs for folder management:
EditFolderDialog- Rename foldersMoveFolderDialog- Move foldersFolderDialog- Various folder operations
Example:
vue
<template>
<div>
<!-- Folder list -->
<FolderCard
v-for="folder in folders"
:key="folder.id"
:folder="folder"
@edit="openEditDialog"
@move="openMoveDialog"
/>
<!-- Dialogs -->
<EditFolderDialog
:visible="showEditDialog"
:folder="selectedFolder"
@updated="handleFolderUpdated"
/>
<MoveFolderDialog
:visible="showMoveDialog"
:folder="selectedFolder"
@moved="handleFolderMoved"
/>
</div>
</template>Folder Details Page
File: pages/_workspace_id/dam/folders_id/index.vue
Uses folder dialogs for folder operations:
FolderDialog- Move/copy operationsCreateFolderDialog- Create subfolders
Component Integration
Search Folders Component
File: components/dam/SearchFolders.vue
Uses folder dialogs in search results:
EditFolderDialog- Edit folders from searchMoveFolderDialog- Move folders from search
Search Assets Component
File: components/dam/SearchAssets.vue
Uses folder dialogs for asset operations:
FolderDialog- Move/copy assets to foldersCreateFolderDialog- Create folders for assets
Folder Card Component
File: components/dam/Folders/FolderCard.vue
Triggers folder dialogs for various operations:
- Edit folder
- Move folder
- Delete folder
- Set permissions
Example:
vue
<template>
<v-card @click="handleFolderClick">
<v-card-title>{{ folder.name }}</v-card-title>
<v-card-actions>
<v-btn @click.stop="openEditDialog">Edit</v-btn>
<v-btn @click.stop="openMoveDialog">Move</v-btn>
<v-btn @click.stop="openDeleteDialog">Delete</v-btn>
</v-card-actions>
</v-card>
</template>API Integration
Folder Creation
Endpoint: POST /api/folders
Request:
json
{
"name": "New Folder",
"description": "Folder description",
"parentId": "parent-folder-id",
"workspaceId": "workspace-id"
}Response:
json
{
"id": "folder-id",
"name": "New Folder",
"description": "Folder description",
"path": "/path/to/folder",
"parentId": "parent-folder-id",
"createdAt": "2024-01-01T00:00:00Z"
}Folder Update/Rename
Endpoint: PUT /api/folders/:folderId
Request:
json
{
"name": "Updated Folder Name",
"description": "Updated description"
}Response:
json
{
"id": "folder-id",
"name": "Updated Folder Name",
"description": "Updated description",
"updatedAt": "2024-01-01T00:00:00Z"
}Folder Move
Endpoint: POST /api/folders/:folderId/move
Request:
json
{
"targetFolderId": "destination-folder-id",
"workspaceId": "workspace-id"
}Response:
json
{
"id": "folder-id",
"name": "Folder Name",
"path": "/new/path/to/folder",
"parentId": "destination-folder-id"
}File Move to Folder
Endpoint: POST /api/files/:fileId/move
Request:
json
{
"targetFolderId": "destination-folder-id",
"workspaceId": "workspace-id"
}File Copy to Folder
Endpoint: POST /api/files/:fileId/copy
Request:
json
{
"targetFolderId": "destination-folder-id",
"workspaceId": "workspace-id"
}Bulk Operations
Endpoint: POST /api/folders/bulk-move
Request:
json
{
"folderIds": ["folder-id-1", "folder-id-2"],
"targetFolderId": "destination-folder-id",
"workspaceId": "workspace-id"
}Endpoint: POST /api/files/bulk-move
Request:
json
{
"fileIds": ["file-id-1", "file-id-2"],
"targetFolderId": "destination-folder-id",
"workspaceId": "workspace-id"
}Folder List for Dialog
Endpoint: GET /api/folders/tree
Query Parameters:
workspaceId- Workspace IDparentId- Parent folder ID (optional, for navigation)includePermissions- Include permission info (optional)
Response:
json
{
"folders": [
{
"id": "folder-id",
"name": "Folder Name",
"path": "/path/to/folder",
"parentId": "parent-id",
"hasChildren": true,
"permissions": {
"canRead": true,
"canWrite": true,
"canDelete": false
}
}
]
}Folder Deletion
Endpoint: DELETE /api/folders/:folderId
Request:
json
{
"workspaceId": "workspace-id",
"force": false // Force delete even if folder has contents
}Workflows
Create Folder Workflow
- User clicks "Create Folder" button
CreateFolderDialogopens- User enters folder name and optional description
- Dialog validates input
- API call to
POST /api/folders - Folder created, dialog emits
createdevent - Parent component updates folder list
- Dialog closes
Move Folder Workflow
- User selects folder and clicks "Move"
FolderDialogopens withdialogType: 'move-folder'- Dialog loads folder tree for navigation
- User navigates and selects destination folder
- Dialog validates move operation (no circular references)
- API call to
POST /api/folders/:folderId/move - Folder moved, dialog emits
movedevent - Parent component updates folder list
- Dialog closes
Move File to Folder Workflow
- User selects file and clicks "Move to Folder"
FolderDialogopens withdialogType: 'move-file'- Dialog loads folder tree
- User selects destination folder
- API call to
POST /api/files/:fileId/move - File moved, dialog emits
file-movedevent - Parent component updates file list
- Dialog closes
Bulk Move Workflow
- User selects multiple folders/files
- User clicks "Move Selected"
FolderDialogopens with appropriate dialog type- User selects destination folder
- API call to bulk move endpoint
- All items moved, dialog emits bulk operation event
- Parent component updates lists
- Dialog closes
Edit Folder Workflow
- User clicks "Edit" on folder
EditFolderDialogopens with current folder data- User modifies folder name/description
- Dialog validates input
- API call to
PUT /api/folders/:folderId - Folder updated, dialog emits
updatedevent - Parent component updates folder display
- Dialog closes
Component Integration Examples
Using FolderDialog in a Component
vue
<template>
<div>
<v-btn @click="openMoveDialog">Move Folder</v-btn>
<FolderDialog
:visible="showMoveDialog"
dialog-type="move-folder"
:folder="selectedFolder"
@moved="handleFolderMoved"
@close="showMoveDialog = false"
/>
</div>
</template>
<script>
export default {
data() {
return {
showMoveDialog: false,
selectedFolder: null
}
},
methods: {
openMoveDialog(folder) {
this.selectedFolder = folder
this.showMoveDialog = true
},
handleFolderMoved(result) {
// Update folder list
this.refreshFolders()
this.showMoveDialog = false
}
}
}
</script>Using CreateFolderDialog
vue
<template>
<div>
<v-btn @click="showCreateDialog = true">Create Folder</v-btn>
<CreateCollageDialog
:visible="showCreateDialog"
:is-folder="true"
@created="handleFolderCreated"
@close="showCreateDialog = false"
/>
</div>
</template>
<script>
export default {
data() {
return {
showCreateDialog: false
}
},
methods: {
handleFolderCreated(folder) {
// Add folder to list
this.folders.push(folder)
this.showCreateDialog = false
}
}
}
</script>Best Practices
- Dialog State Management: Always manage dialog visibility with reactive data properties
- Error Handling: Implement proper error handling for all API calls
- Validation: Validate folder names and operations before API calls
- Loading States: Show loading indicators during async operations
- Permission Checks: Verify user permissions before showing dialog options
- Event Handling: Always handle dialog close events to reset state
- Bulk Operations: Provide progress feedback for bulk operations
- Navigation: Implement proper folder tree navigation with breadcrumbs
Related Systems
- Permissions System: Folder dialogs integrate with permission management
- Search System: Folder dialogs used in search results
- Asset Management: Folder dialogs handle asset organization
- Workspace System: Folder operations are workspace-scoped