@anymux/ui-kit 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ExplorerLayout-CSIJd7N4.js +105 -0
- package/dist/ExplorerLayout-CSIJd7N4.js.map +1 -0
- package/dist/FileBrowserContext-B6jixa2j.js +11 -0
- package/dist/FileBrowserContext-B6jixa2j.js.map +1 -0
- package/dist/calendar-DSlrbHoj.js +761 -0
- package/dist/calendar-DSlrbHoj.js.map +1 -0
- package/dist/calendar.d.ts +3 -0
- package/dist/calendar.js +3 -0
- package/dist/contacts-DQXTZzHc.js +539 -0
- package/dist/contacts-DQXTZzHc.js.map +1 -0
- package/dist/contacts.d.ts +3 -0
- package/dist/contacts.js +3 -0
- package/dist/file-browser-m5atC3kF.js +6755 -0
- package/dist/file-browser-m5atC3kF.js.map +1 -0
- package/dist/file-browser.d.ts +11 -0
- package/dist/file-browser.js +9 -0
- package/dist/git-B55e6LL-.js +561 -0
- package/dist/git-B55e6LL-.js.map +1 -0
- package/dist/git.d.ts +2 -0
- package/dist/git.js +3 -0
- package/dist/iconMap-V4B8P-Uh.js +206 -0
- package/dist/iconMap-V4B8P-Uh.js.map +1 -0
- package/dist/icons-CIsIOZXR.js +0 -0
- package/dist/icons.d.ts +2 -0
- package/dist/icons.js +4 -0
- package/dist/index-BNmNIWBL.d.ts +71 -0
- package/dist/index-BNmNIWBL.d.ts.map +1 -0
- package/dist/index-Bryv_GCG.d.ts +1481 -0
- package/dist/index-Bryv_GCG.d.ts.map +1 -0
- package/dist/index-CuQIjSXs.d.ts +134 -0
- package/dist/index-CuQIjSXs.d.ts.map +1 -0
- package/dist/index-DSu19mq0.d.ts +153 -0
- package/dist/index-DSu19mq0.d.ts.map +1 -0
- package/dist/index-DmsyeHFr.d.ts +149 -0
- package/dist/index-DmsyeHFr.d.ts.map +1 -0
- package/dist/index-DxnJ8FYM.d.ts +17 -0
- package/dist/index-DxnJ8FYM.d.ts.map +1 -0
- package/dist/index-DzfY1Tok.d.ts +32 -0
- package/dist/index-DzfY1Tok.d.ts.map +1 -0
- package/dist/index-Ml_SgiKa.d.ts +1847 -0
- package/dist/index-Ml_SgiKa.d.ts.map +1 -0
- package/dist/index-kHr9udZD.d.ts +1025 -0
- package/dist/index-kHr9udZD.d.ts.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +15 -0
- package/dist/layout-Ca_4r8ka.js +89 -0
- package/dist/layout-Ca_4r8ka.js.map +1 -0
- package/dist/layout.d.ts +2 -0
- package/dist/layout.js +5 -0
- package/dist/list-CxfT6hix.js +6831 -0
- package/dist/list-CxfT6hix.js.map +1 -0
- package/dist/list.d.ts +2 -0
- package/dist/list.js +5 -0
- package/dist/media-DZ292aKK.js +557 -0
- package/dist/media-DZ292aKK.js.map +1 -0
- package/dist/media.d.ts +3 -0
- package/dist/media.js +3 -0
- package/dist/tree-Dd9Z0Aso.js +3351 -0
- package/dist/tree-Dd9Z0Aso.js.map +1 -0
- package/dist/tree.d.ts +2 -0
- package/dist/tree.js +6 -0
- package/dist/types-common-CB3kRek8.d.ts +26 -0
- package/dist/types-common-CB3kRek8.d.ts.map +1 -0
- package/dist/utils-B4fdKKsy.js +3 -0
- package/package.json +109 -0
- package/src/calendar/AgendaView.tsx +37 -0
- package/src/calendar/CalendarBrowser.tsx +90 -0
- package/src/calendar/CalendarModel.ts +142 -0
- package/src/calendar/CalendarSidebar.tsx +81 -0
- package/src/calendar/DayView.tsx +76 -0
- package/src/calendar/EventCard.tsx +51 -0
- package/src/calendar/MockCalendarProvider.ts +98 -0
- package/src/calendar/MonthView.tsx +77 -0
- package/src/calendar/WeekView.tsx +129 -0
- package/src/calendar/index.ts +18 -0
- package/src/calendar/types.ts +25 -0
- package/src/contacts/ContactAvatar.tsx +35 -0
- package/src/contacts/ContactBrowser.tsx +56 -0
- package/src/contacts/ContactCard.tsx +37 -0
- package/src/contacts/ContactDetail.tsx +63 -0
- package/src/contacts/ContactGroupSidebar.tsx +40 -0
- package/src/contacts/ContactList.tsx +32 -0
- package/src/contacts/ContactListModel.ts +120 -0
- package/src/contacts/MockContactProvider.ts +77 -0
- package/src/contacts/index.ts +17 -0
- package/src/contacts/types.ts +26 -0
- package/src/demos/CalendarBrowserDemo.tsx +15 -0
- package/src/demos/ContactBrowserDemo.tsx +15 -0
- package/src/demos/MediaBrowserDemo.tsx +15 -0
- package/src/file-browser/adapters/DocumentViewerAdapter.ts +371 -0
- package/src/file-browser/adapters/FileSystemBridge.ts +168 -0
- package/src/file-browser/adapters/GitBrowserAdapter.ts +546 -0
- package/src/file-browser/adapters/README.md +504 -0
- package/src/file-browser/adapters/index.ts +27 -0
- package/src/file-browser/adapters/types.ts +70 -0
- package/src/file-browser/architecture.md +645 -0
- package/src/file-browser/components/CreateItemDialog.tsx +71 -0
- package/src/file-browser/components/DeleteConfirmDialog.tsx +58 -0
- package/src/file-browser/components/FileBrowser.tsx +473 -0
- package/src/file-browser/components/FileBrowserContent.tsx +209 -0
- package/src/file-browser/components/FileBrowserHeader.tsx +151 -0
- package/src/file-browser/components/FileBrowserToolbar.tsx +145 -0
- package/src/file-browser/components/LeftPanel/LeftPanel.tsx +103 -0
- package/src/file-browser/components/LeftPanel/LeftPanelTabs.tsx +70 -0
- package/src/file-browser/components/LeftPanel/TreeNavigationView.tsx +256 -0
- package/src/file-browser/components/PreviewPane.tsx +146 -0
- package/src/file-browser/components/RightPanel/FilePreview.tsx +219 -0
- package/src/file-browser/components/RightPanel/RightPanel.tsx +186 -0
- package/src/file-browser/components/RightPanel/RightPanelToolbar.tsx +113 -0
- package/src/file-browser/components/UploadProgress.tsx +123 -0
- package/src/file-browser/components/ViewerHost.tsx +208 -0
- package/src/file-browser/components/mobile/MobileNavigation.tsx +227 -0
- package/src/file-browser/components/navigation/NavigationButtons.tsx +171 -0
- package/src/file-browser/components/shared/ErrorBoundary.tsx +116 -0
- package/src/file-browser/components/shared/FileBrowserItem.tsx +195 -0
- package/src/file-browser/components/shared/FileIcon.tsx +169 -0
- package/src/file-browser/components/toolbar/ViewModeToggle.tsx +200 -0
- package/src/file-browser/components/views/ListView/ListView.tsx +484 -0
- package/src/file-browser/components/views/ThumbnailView/ThumbnailView.tsx +323 -0
- package/src/file-browser/components/views/TreeView/TreeNode.tsx +186 -0
- package/src/file-browser/components/views/TreeView/TreeNodeList.tsx +191 -0
- package/src/file-browser/components/views/TreeView/TreeView.tsx +200 -0
- package/src/file-browser/components/views/TreemapView/TreemapView.tsx +339 -0
- package/src/file-browser/context/FileBrowserContext.tsx +13 -0
- package/src/file-browser/examples/BasicUsage.tsx +20 -0
- package/src/file-browser/index.ts +98 -0
- package/src/file-browser/models/FileBrowserModel.ts +623 -0
- package/src/file-browser/models/LeftPanelManagerModel.ts +105 -0
- package/src/file-browser/models/NavigationManagerModel.ts +312 -0
- package/src/file-browser/models/ResponsiveLayoutManagerModel.ts +437 -0
- package/src/file-browser/models/RightPanelManagerModel.ts +190 -0
- package/src/file-browser/models/SelectionManagerModel.ts +252 -0
- package/src/file-browser/models/ToolbarManagerModel.ts +144 -0
- package/src/file-browser/models/UploadModel.ts +147 -0
- package/src/file-browser/models/ViewModeManagerModel.ts +185 -0
- package/src/file-browser/models/ViewerHostModel.ts +44 -0
- package/src/file-browser/models/ui/ListViewUIModel.ts +265 -0
- package/src/file-browser/models/ui/PreviewUIModel.ts +297 -0
- package/src/file-browser/models/ui/ThumbnailViewUIModel.ts +254 -0
- package/src/file-browser/models/ui/TreeViewUIModel.ts +128 -0
- package/src/file-browser/models/ui/TreemapViewUIModel.ts +350 -0
- package/src/file-browser/providers/FileSystemListProvider.ts +552 -0
- package/src/file-browser/providers/FileSystemProvider.ts +401 -0
- package/src/file-browser/providers/FileSystemTreeProvider.ts +231 -0
- package/src/file-browser/providers/GitProvider.ts +337 -0
- package/src/file-browser/providers/GitRepositoryProvider.ts +376 -0
- package/src/file-browser/providers/IFileBrowserProvider.ts +56 -0
- package/src/file-browser/providers/MemoryProvider.ts +303 -0
- package/src/file-browser/providers/index.ts +4 -0
- package/src/file-browser/registry/ViewerRegistry.ts +551 -0
- package/src/file-browser/registry/types.ts +144 -0
- package/src/file-browser/scripts/performanceBenchmark.ts +553 -0
- package/src/file-browser/services/ThumbnailCacheService.ts +128 -0
- package/src/file-browser/tasks.md +537 -0
- package/src/file-browser/types/FileBrowserTypes.ts +126 -0
- package/src/file-browser/types/ProviderTypes.ts +155 -0
- package/src/file-browser/types/UITypes.ts +235 -0
- package/src/file-browser/types/ViewModeTypes.ts +150 -0
- package/src/file-browser/utils/gestures.ts +327 -0
- package/src/file-browser/utils/performance.ts +563 -0
- package/src/file-browser/viewers/ImageViewer.tsx +163 -0
- package/src/file-browser/viewers/ImageViewerModel.ts +79 -0
- package/src/file-browser/viewers/TextViewer.tsx +95 -0
- package/src/file-browser/viewers/UnsupportedFileViewer.tsx +57 -0
- package/src/file-browser/viewers/index.ts +61 -0
- package/src/git/BranchList.tsx +128 -0
- package/src/git/CommitGraph.tsx +239 -0
- package/src/git/CommitList.tsx +258 -0
- package/src/git/DiffViewer.tsx +219 -0
- package/src/git/index.ts +4 -0
- package/src/icons/iconMap.ts +146 -0
- package/src/icons/index.ts +9 -0
- package/src/index.ts +13 -0
- package/src/layout/README.md +307 -0
- package/src/layout/components/ExplorerLayout/ExplorerLayout.tsx +178 -0
- package/src/layout/examples/SimpleExample.tsx +60 -0
- package/src/layout/index.ts +6 -0
- package/src/lib/utils.ts +1 -0
- package/src/list/README.md +303 -0
- package/src/list/architecture.md +807 -0
- package/src/list/components/CalculatedGridView.tsx +252 -0
- package/src/list/components/DragPreview.tsx +102 -0
- package/src/list/components/ListContextMenu.tsx +274 -0
- package/src/list/components/ListItem.tsx +761 -0
- package/src/list/components/ListItems.tsx +919 -0
- package/src/list/components/MasonryView.tsx +241 -0
- package/src/list/components/SearchFilter.tsx +44 -0
- package/src/list/components/TreemapView.tsx +709 -0
- package/src/list/components/ViewSizeControls.tsx +205 -0
- package/src/list/components/ViewTypeSelector.tsx +312 -0
- package/src/list/components/VirtualizedDetailsView.tsx +231 -0
- package/src/list/components/VirtualizedGrid.tsx +164 -0
- package/src/list/components/VirtualizedList.tsx +154 -0
- package/src/list/components/VirtualizedMasonryView.tsx +344 -0
- package/src/list/components/shared/EmptyState.tsx +103 -0
- package/src/list/components/shared/ErrorBoundary.tsx +123 -0
- package/src/list/components/shared/ErrorDisplay.tsx +100 -0
- package/src/list/components/shared/ListLoader.tsx +146 -0
- package/src/list/components/shared/LoadingIndicator.tsx +80 -0
- package/src/list/index.ts +92 -0
- package/src/list/models/ListItemsModel.ts +1301 -0
- package/src/list/models/TreemapModel.ts +204 -0
- package/src/list/providers/ListItemsProvider.ts +313 -0
- package/src/list/providers/TestListProvider.ts +604 -0
- package/src/list/tasks.md +937 -0
- package/src/list/types/ListTypes.ts +178 -0
- package/src/list/utils/BenchmarkLogger.ts +243 -0
- package/src/list/utils/DragDropManager.ts +320 -0
- package/src/list/utils/GridLayoutCalculator.ts +290 -0
- package/src/list/utils/ListAccessibility.ts +367 -0
- package/src/list/utils/ListKeyboard.ts +414 -0
- package/src/list/utils/MasonryLayoutCalculator.ts +302 -0
- package/src/list/utils/MasonryLayoutEngine.ts +401 -0
- package/src/list/utils/__tests__/MasonryLayoutEngine.test.ts +157 -0
- package/src/list/utils/__tests__/VirtualizedMasonryView.test.tsx +251 -0
- package/src/media/AlbumSidebar.tsx +48 -0
- package/src/media/MediaBrowser.tsx +92 -0
- package/src/media/MediaBrowserModel.ts +138 -0
- package/src/media/MediaGrid.tsx +50 -0
- package/src/media/MediaList.tsx +49 -0
- package/src/media/MediaPreview.tsx +63 -0
- package/src/media/MediaTimeline.tsx +38 -0
- package/src/media/MockMediaProvider.ts +70 -0
- package/src/media/index.ts +18 -0
- package/src/media/types.ts +21 -0
- package/src/styles/variables.css +60 -0
- package/src/tree/DEVELOPMENT_SUMMARY.md +170 -0
- package/src/tree/__tests__/TreeModel.test.ts +16 -0
- package/src/tree/architecture.md +530 -0
- package/src/tree/components/Tree.tsx +283 -0
- package/src/tree/components/TreeCheckbox.tsx +147 -0
- package/src/tree/components/TreeContextMenu.tsx +139 -0
- package/src/tree/components/TreeNodeList.tsx +329 -0
- package/src/tree/components/TreeTable.tsx +382 -0
- package/src/tree/index.ts +58 -0
- package/src/tree/models/TreeModel.ts +839 -0
- package/src/tree/providers/SimpleTreeProvider.ts +463 -0
- package/src/tree/providers/TestTreeProvider.ts +946 -0
- package/src/tree/providers/TreeProvider.ts +308 -0
- package/src/tree/tasks.md +2046 -0
- package/src/tree/types/TreeTypes.ts +279 -0
- package/src/tree/utils/SelectionTheme.ts +150 -0
- package/src/tree/utils/logger.ts +203 -0
- package/src/types-common.ts +21 -0
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
import { IFileBrowserProvider } from './IFileBrowserProvider';
|
|
2
|
+
import { FileBrowserItem, IconDefinition, PreviewData } from '../types/FileBrowserTypes';
|
|
3
|
+
import { LeftPanelMode } from '../models/LeftPanelManagerModel';
|
|
4
|
+
import { ViewModeDefinition } from '../models/RightPanelManagerModel';
|
|
5
|
+
|
|
6
|
+
// Import Git Browser types (these would be imported from the actual Git Browser app)
|
|
7
|
+
interface GitRepositoryModel {
|
|
8
|
+
path: string;
|
|
9
|
+
fileTree: any[];
|
|
10
|
+
isLoadingFiles: boolean;
|
|
11
|
+
getFileContent(path: string): Promise<string>;
|
|
12
|
+
// Add other methods as needed
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
interface GitWrapperIntegration {
|
|
16
|
+
path: string;
|
|
17
|
+
fileTree: any[];
|
|
18
|
+
isLoadingFiles: boolean;
|
|
19
|
+
getFileContent(path: string): Promise<string>;
|
|
20
|
+
// Add other methods as needed
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface GitFileTreeNode {
|
|
24
|
+
name: string;
|
|
25
|
+
path: string;
|
|
26
|
+
type: 'file' | 'directory';
|
|
27
|
+
size?: number;
|
|
28
|
+
children?: GitFileTreeNode[];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export class GitProvider implements IFileBrowserProvider {
|
|
32
|
+
readonly id = 'git';
|
|
33
|
+
readonly name = 'Git Provider';
|
|
34
|
+
readonly version = '1.0.0';
|
|
35
|
+
|
|
36
|
+
private repository: GitRepositoryModel | GitWrapperIntegration;
|
|
37
|
+
|
|
38
|
+
constructor(repository: GitRepositoryModel | GitWrapperIntegration) {
|
|
39
|
+
this.repository = repository;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Core data operations
|
|
43
|
+
async loadItems(path: string): Promise<FileBrowserItem[]> {
|
|
44
|
+
try {
|
|
45
|
+
const normalizedPath = this.normalizePath(path);
|
|
46
|
+
|
|
47
|
+
// Wait for file tree to load if it's currently loading
|
|
48
|
+
if (this.repository.isLoadingFiles) {
|
|
49
|
+
// In a real implementation, we'd wait for the loading to complete
|
|
50
|
+
// For now, return empty array
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const fileTree = this.repository.fileTree;
|
|
55
|
+
if (!fileTree || fileTree.length === 0) {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Find the items for the current path
|
|
60
|
+
const items = this.getItemsForPath(normalizedPath, fileTree);
|
|
61
|
+
|
|
62
|
+
return items.map(node => this.convertGitNodeToFileBrowserItem(node));
|
|
63
|
+
} catch (error) {
|
|
64
|
+
console.error(`Failed to load Git items from ${path}:`, error);
|
|
65
|
+
throw new Error(`Failed to load Git repository items: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
private getItemsForPath(path: string, fileTree: GitFileTreeNode[]): GitFileTreeNode[] {
|
|
70
|
+
if (path === '/' || path === '') {
|
|
71
|
+
return fileTree;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Navigate to the specified path
|
|
75
|
+
const pathSegments = path.split('/').filter(segment => segment !== '');
|
|
76
|
+
let currentNodes = fileTree;
|
|
77
|
+
|
|
78
|
+
for (const segment of pathSegments) {
|
|
79
|
+
const node = currentNodes.find(n => n.name === segment && n.type === 'directory');
|
|
80
|
+
if (!node || !node.children) {
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
currentNodes = node.children;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return currentNodes;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
private convertGitNodeToFileBrowserItem(node: GitFileTreeNode): FileBrowserItem {
|
|
90
|
+
return {
|
|
91
|
+
id: node.path,
|
|
92
|
+
name: node.name,
|
|
93
|
+
path: node.path,
|
|
94
|
+
type: node.type === 'directory' ? 'directory' : 'file',
|
|
95
|
+
size: node.size,
|
|
96
|
+
lastModified: new Date(), // Git doesn't provide this directly
|
|
97
|
+
hasChildren: node.type === 'directory' && (node.children?.length || 0) > 0,
|
|
98
|
+
metadata: {
|
|
99
|
+
gitPath: node.path,
|
|
100
|
+
isGitFile: true
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Dual-panel support
|
|
106
|
+
getLeftPanelModes(): LeftPanelMode[] {
|
|
107
|
+
return [
|
|
108
|
+
{
|
|
109
|
+
id: 'tree',
|
|
110
|
+
name: 'Tree',
|
|
111
|
+
icon: 'folder-tree',
|
|
112
|
+
component: {} as any, // Will be set by consumer
|
|
113
|
+
isAvailable: () => true
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
id: 'git-graph',
|
|
117
|
+
name: 'Git Graph',
|
|
118
|
+
icon: 'git-branch',
|
|
119
|
+
component: {} as any, // Will be set by consumer
|
|
120
|
+
isAvailable: () => true
|
|
121
|
+
}
|
|
122
|
+
];
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
getRightPanelViewModes(): ViewModeDefinition[] {
|
|
126
|
+
return [
|
|
127
|
+
{
|
|
128
|
+
id: 'list',
|
|
129
|
+
name: 'List',
|
|
130
|
+
icon: 'list',
|
|
131
|
+
applicableFor: (contentType) => contentType === 'folder'
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
id: 'thumbnail',
|
|
135
|
+
name: 'Thumbnails',
|
|
136
|
+
icon: 'grid-3x3',
|
|
137
|
+
applicableFor: (contentType) => contentType === 'folder'
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
id: 'git-history',
|
|
141
|
+
name: 'History',
|
|
142
|
+
icon: 'history',
|
|
143
|
+
applicableFor: (contentType) => contentType === 'file'
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
id: 'git-diff',
|
|
147
|
+
name: 'Diff',
|
|
148
|
+
icon: 'git-compare',
|
|
149
|
+
applicableFor: (contentType) => contentType === 'file'
|
|
150
|
+
}
|
|
151
|
+
];
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Path operations
|
|
155
|
+
normalizePath(path: string): string {
|
|
156
|
+
if (!path || path === '') return '/';
|
|
157
|
+
|
|
158
|
+
let normalized = path.startsWith('/') ? path : '/' + path;
|
|
159
|
+
if (normalized.length > 1 && normalized.endsWith('/')) {
|
|
160
|
+
normalized = normalized.slice(0, -1);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return normalized;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
getParentPath(path: string): string | null {
|
|
167
|
+
const normalized = this.normalizePath(path);
|
|
168
|
+
if (normalized === '/') return null;
|
|
169
|
+
|
|
170
|
+
const lastSlashIndex = normalized.lastIndexOf('/');
|
|
171
|
+
if (lastSlashIndex === 0) return '/';
|
|
172
|
+
|
|
173
|
+
return normalized.substring(0, lastSlashIndex);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
resolvePath(basePath: string, relativePath: string): string {
|
|
177
|
+
const normalizedBase = this.normalizePath(basePath);
|
|
178
|
+
|
|
179
|
+
if (normalizedBase === '/') {
|
|
180
|
+
return '/' + relativePath;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return normalizedBase + '/' + relativePath;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Item customization
|
|
187
|
+
getItemIcon(item: FileBrowserItem): IconDefinition {
|
|
188
|
+
if (item.type === 'directory') {
|
|
189
|
+
return { type: 'lucide', name: 'folder-git-2', color: '#3b82f6' };
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
if (item.name) {
|
|
193
|
+
const extension = item.name.split('.').pop()?.toLowerCase();
|
|
194
|
+
switch (extension) {
|
|
195
|
+
case 'js':
|
|
196
|
+
case 'ts':
|
|
197
|
+
case 'mjs':
|
|
198
|
+
case 'cjs':
|
|
199
|
+
return { type: 'lucide', name: 'file-code', color: '#f7df1e' };
|
|
200
|
+
case 'jsx':
|
|
201
|
+
case 'tsx':
|
|
202
|
+
return { type: 'lucide', name: 'component', color: '#61dafb' };
|
|
203
|
+
case 'json':
|
|
204
|
+
return { type: 'lucide', name: 'braces', color: '#f7df1e' };
|
|
205
|
+
case 'md':
|
|
206
|
+
case 'markdown':
|
|
207
|
+
return { type: 'lucide', name: 'file-text', color: '#083fa1' };
|
|
208
|
+
case 'gitignore':
|
|
209
|
+
case 'gitattributes':
|
|
210
|
+
case 'gitmodules':
|
|
211
|
+
return { type: 'lucide', name: 'git-branch', color: '#f05032' };
|
|
212
|
+
case 'html':
|
|
213
|
+
case 'htm':
|
|
214
|
+
return { type: 'lucide', name: 'globe', color: '#e34c26' };
|
|
215
|
+
case 'css':
|
|
216
|
+
case 'scss':
|
|
217
|
+
case 'sass':
|
|
218
|
+
case 'less':
|
|
219
|
+
return { type: 'lucide', name: 'palette', color: '#1572b6' };
|
|
220
|
+
case 'jpg':
|
|
221
|
+
case 'jpeg':
|
|
222
|
+
case 'png':
|
|
223
|
+
case 'gif':
|
|
224
|
+
case 'webp':
|
|
225
|
+
case 'svg':
|
|
226
|
+
return { type: 'lucide', name: 'image', color: '#10b981' };
|
|
227
|
+
default:
|
|
228
|
+
return { type: 'lucide', name: 'file', color: '#6b7280' };
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
return { type: 'lucide', name: 'file', color: '#6b7280' };
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
getItemDisplayName(item: FileBrowserItem): string {
|
|
236
|
+
return item.name || 'Unknown';
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// File preview capabilities
|
|
240
|
+
canPreviewFile(item: FileBrowserItem): boolean {
|
|
241
|
+
if (item.type !== 'file' || !item.name) return false;
|
|
242
|
+
|
|
243
|
+
const extension = item.name.split('.').pop()?.toLowerCase();
|
|
244
|
+
const previewableExtensions = [
|
|
245
|
+
'txt', 'md', 'markdown', 'json', 'js', 'ts', 'jsx', 'tsx',
|
|
246
|
+
'html', 'htm', 'css', 'scss', 'sass', 'less', 'xml', 'yaml', 'yml',
|
|
247
|
+
'csv', 'log', 'ini', 'conf', 'config', 'gitignore', 'gitattributes'
|
|
248
|
+
];
|
|
249
|
+
|
|
250
|
+
return previewableExtensions.includes(extension || '');
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
async getFilePreview(item: FileBrowserItem): Promise<PreviewData> {
|
|
254
|
+
if (!this.canPreviewFile(item)) {
|
|
255
|
+
throw new Error(`Cannot preview file: ${item.name}`);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
try {
|
|
259
|
+
const content = await this.repository.getFileContent(item.path);
|
|
260
|
+
|
|
261
|
+
return {
|
|
262
|
+
type: 'text',
|
|
263
|
+
content: content,
|
|
264
|
+
metadata: {
|
|
265
|
+
size: item.size || 0,
|
|
266
|
+
lastModified: item.lastModified || new Date(),
|
|
267
|
+
gitPath: item.path,
|
|
268
|
+
encoding: 'utf8'
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
} catch (error) {
|
|
272
|
+
throw new Error(`Failed to read Git file: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
async getItemPreview(item: FileBrowserItem): Promise<PreviewData | null> {
|
|
277
|
+
if (item.type !== 'file' || !this.canPreviewFile(item)) return null;
|
|
278
|
+
|
|
279
|
+
try {
|
|
280
|
+
return await this.getFilePreview(item);
|
|
281
|
+
} catch (error) {
|
|
282
|
+
console.warn(`Failed to preview Git file ${item.name}:`, error);
|
|
283
|
+
return null;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// Optional capabilities
|
|
288
|
+
canPerformAction(action: string, items: FileBrowserItem[]): boolean {
|
|
289
|
+
switch (action) {
|
|
290
|
+
case 'git-checkout':
|
|
291
|
+
case 'git-diff':
|
|
292
|
+
case 'git-history':
|
|
293
|
+
return items.length === 1;
|
|
294
|
+
case 'git-stage':
|
|
295
|
+
case 'git-unstage':
|
|
296
|
+
return items.length > 0;
|
|
297
|
+
default:
|
|
298
|
+
return false;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
async performAction(action: string, items: FileBrowserItem[]): Promise<any> {
|
|
303
|
+
// Git-specific actions would be implemented here
|
|
304
|
+
switch (action) {
|
|
305
|
+
case 'git-checkout':
|
|
306
|
+
throw new Error('Git checkout action not implemented yet');
|
|
307
|
+
case 'git-diff':
|
|
308
|
+
throw new Error('Git diff action not implemented yet');
|
|
309
|
+
case 'git-history':
|
|
310
|
+
throw new Error('Git history action not implemented yet');
|
|
311
|
+
case 'git-stage':
|
|
312
|
+
throw new Error('Git stage action not implemented yet');
|
|
313
|
+
case 'git-unstage':
|
|
314
|
+
throw new Error('Git unstage action not implemented yet');
|
|
315
|
+
default:
|
|
316
|
+
throw new Error(`Unknown Git action: ${action}`);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// Lifecycle
|
|
321
|
+
async initialize(): Promise<void> {
|
|
322
|
+
// Validate that the repository is accessible
|
|
323
|
+
try {
|
|
324
|
+
if (!this.repository.path) {
|
|
325
|
+
throw new Error('Repository path is not set');
|
|
326
|
+
}
|
|
327
|
+
} catch (error) {
|
|
328
|
+
throw new Error(`Failed to initialize GitProvider: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
dispose(): void {
|
|
333
|
+
// Clean up any resources if needed
|
|
334
|
+
// The Git repository models don't specify a dispose method,
|
|
335
|
+
// so we don't need to do anything here
|
|
336
|
+
}
|
|
337
|
+
}
|