Skip to content

Commit 7108db1

Browse files
feat: Support File Manager for Prompts page (Issue #2191) (#563)
Co-authored-by: Palina_Kryvasheyeva <Palina_Kryvasheyeva@epam.com>
1 parent ef1b01a commit 7108db1

File tree

6 files changed

+96
-7
lines changed

6 files changed

+96
-7
lines changed

src/components/FileManager/FileManager.tsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ export type ToolbarOptions = Omit<
236236
uploadFiles?: NewAction;
237237
newFolder?: NewAction;
238238
uploadArchive?: NewAction;
239+
newItem?: NewAction;
239240
};
240241
showHiddenFilesToggle?: boolean;
241242
};
@@ -370,10 +371,17 @@ export interface DialFileManagerProps {
370371
onPreview?: (path?: string) => void;
371372
previewExtensions?: string[];
372373
isRenameFileAvailable?: boolean;
374+
isDuplicateFolderAvailable?: boolean;
373375
customUploadFileAction?: (
374376
currentPath?: string,
375377
currentFolder?: DialFile,
376378
) => void;
379+
customCreateNewItemAction?: (
380+
currentPath?: string,
381+
currentFolder?: DialFile,
382+
) => void;
383+
customDuplicateAction?: (items?: DialFile[]) => void;
384+
nonClickableTableColumns?: FileManagerColumnKey[];
377385
}
378386

379387
/**
@@ -618,10 +626,12 @@ export const DialFileManagerView: FC = () => {
618626
onPreview,
619627
previewExtensions,
620628
isRenameFileAvailable,
629+
isDuplicateFolderAvailable,
621630
getDisabledTooltip,
622631
fileTooLargeTooltip,
623632
unsupportedFileTypeTooltip,
624633
gridClassName,
634+
nonClickableTableColumns,
625635
} = useFileManagerContext();
626636

627637
const {
@@ -1232,6 +1242,7 @@ export const DialFileManagerView: FC = () => {
12321242
onPreview: (path) => onPreview?.(path),
12331243
previewExtensions,
12341244
isRenameFileAvailable,
1245+
isDuplicateFolderAvailable,
12351246
});
12361247

12371248
const getGridContextMenuItems = useCallback(
@@ -1282,15 +1293,19 @@ export const DialFileManagerView: FC = () => {
12821293
event.colDef.colId === 'ag-Grid-SelectionColumn' ||
12831294
event.colDef.colId === FileManagerColumnKey.Actions ||
12841295
(renamedPath && event.data?.path === renamedPath) ||
1285-
event.data?.isTemporary
1296+
event.data?.isTemporary ||
1297+
(nonClickableTableColumns &&
1298+
nonClickableTableColumns.includes(
1299+
event.colDef.colId as FileManagerColumnKey,
1300+
))
12861301
) {
12871302
return;
12881303
}
12891304
if (event.data) {
12901305
handleTableRowClick(event.data);
12911306
}
12921307
},
1293-
[renamedPath, handleTableRowClick],
1308+
[renamedPath, handleTableRowClick, nonClickableTableColumns],
12941309
);
12951310

12961311
const emptyStateRenderer = useCallback(

src/components/FileManager/FileManagerContext.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ import type {
2222
import type { FileUploadValidationMessages } from './hooks/use-file-upload';
2323
import type { DropdownItem } from '@/models/dropdown';
2424
import type { FileConflictDecision } from './components/ConflictResolutionPopup/ConflictResolutionPopup';
25-
import type { DestinationFolderMode } from '@/types/file-manager';
25+
import type {
26+
DestinationFolderMode,
27+
FileManagerColumnKey,
28+
} from '@/types/file-manager';
2629
import type {
2730
DialFileAcceptType,
2831
DialFileManagerActionsRef,
@@ -204,10 +207,17 @@ export interface FileManagerContextValue {
204207
onPreview?: (path?: string) => void;
205208
previewExtensions?: string[];
206209
isRenameFileAvailable?: boolean;
210+
isDuplicateFolderAvailable?: boolean;
207211
customUploadFileAction?: (
208212
currentPath?: string,
209213
currentFolder?: DialFile,
210214
) => void;
215+
customCreateNewItemAction?: (
216+
currentPath?: string,
217+
currentFolder?: DialFile,
218+
) => void;
219+
customDuplicateAction?: (items?: DialFile[]) => void;
220+
nonClickableTableColumns?: FileManagerColumnKey[];
211221
getDisabledTooltip?: (row: FileManagerGridRow) => string | undefined;
212222
fileTooLargeTooltip?: string;
213223
unsupportedFileTypeTooltip?: string;

src/components/FileManager/FileManagerProvider.tsx

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,13 @@ export const FileManagerProvider: FC<FileManagerProviderProps> = ({
127127
onPreview,
128128
previewExtensions,
129129
isRenameFileAvailable,
130+
isDuplicateFolderAvailable,
130131
customUploadFileAction,
132+
customCreateNewItemAction,
133+
customDuplicateAction,
131134
customBreakpointRef,
132135
gridClassName,
136+
nonClickableTableColumns,
133137
}) => {
134138
const {
135139
selectedPaths: effectiveSelectedPaths,
@@ -354,6 +358,17 @@ export const FileManagerProvider: FC<FileManagerProviderProps> = ({
354358
customUploadFileAction?.(currentPath, currentFolder);
355359
}, [customUploadFileAction, currentPath, currentFolder]);
356360

361+
const customCreateNewItem = useCallback(() => {
362+
customCreateNewItemAction?.(currentPath, currentFolder);
363+
}, [customCreateNewItemAction, currentPath, currentFolder]);
364+
365+
const customDuplicateHandle = useCallback(
366+
(items: DialFile[]) => {
367+
customDuplicateAction?.(items);
368+
},
369+
[customDuplicateAction],
370+
);
371+
357372
const {
358373
isCreatingFolder,
359374
newFolderTempId,
@@ -375,6 +390,7 @@ export const FileManagerProvider: FC<FileManagerProviderProps> = ({
375390
onUploadFiles: customUploadFileAction ? customUploadFile : openFileDialog,
376391
onUploadArchive: openArchiveUpload,
377392
onCreateFolder: startFolderCreation,
393+
onCreateNewItem: customCreateNewItem,
378394
isNewButtonDisabled: toolbarOptions?.isNewButtonDisabled,
379395
},
380396
);
@@ -599,7 +615,9 @@ export const FileManagerProvider: FC<FileManagerProviderProps> = ({
599615

600616
handleCopyTo,
601617
handleMoveTo,
602-
handleDuplicate,
618+
handleDuplicate: customDuplicateAction
619+
? customDuplicateHandle
620+
: handleDuplicate,
603621
handleSetCopiedFiles,
604622
handleSetMovedFiles,
605623
openDestinationFolderPopup,
@@ -707,8 +725,10 @@ export const FileManagerProvider: FC<FileManagerProviderProps> = ({
707725
onPreview,
708726
previewExtensions,
709727
isRenameFileAvailable,
728+
isDuplicateFolderAvailable,
710729
customUploadFileAction,
711730
customBreakpointRef,
731+
nonClickableTableColumns,
712732
getDisabledTooltip,
713733
fileTooLargeTooltip,
714734
unsupportedFileTypeTooltip,

src/components/FileManager/hooks/use-grid-context-menu.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ export interface UseGridContextMenuProps {
5555
onPreview?: (path?: string) => void;
5656
previewExtensions?: string[];
5757
isRenameFileAvailable?: boolean;
58+
isDuplicateFolderAvailable?: boolean;
5859
}
5960

6061
export const useGridContextMenu = ({
@@ -76,6 +77,7 @@ export const useGridContextMenu = ({
7677
onPreview,
7778
previewExtensions,
7879
isRenameFileAvailable = true,
80+
isDuplicateFolderAvailable = true,
7981
}: UseGridContextMenuProps) => {
8082
return useMemo(() => {
8183
return (file: DialFile): DropdownItem[] => {
@@ -129,7 +131,15 @@ export const useGridContextMenu = ({
129131
);
130132
}
131133

132-
if (actionLabels[DialFileManagerActions.Duplicate]) {
134+
const isDuplicateAvailable =
135+
file.nodeType === DialFileNodeType.ITEM ||
136+
(file.nodeType === DialFileNodeType.FOLDER &&
137+
isDuplicateFolderAvailable);
138+
139+
if (
140+
actionLabels[DialFileManagerActions.Duplicate] &&
141+
isDuplicateAvailable
142+
) {
133143
items.push({
134144
key: DialFileManagerActions.Duplicate,
135145
label: actionLabels[DialFileManagerActions.Duplicate],
@@ -311,5 +321,6 @@ export const useGridContextMenu = ({
311321
onPreview,
312322
previewExtensions,
313323
isRenameFileAvailable,
324+
isDuplicateFolderAvailable,
314325
]);
315326
};

src/components/FileManager/hooks/use-new-actions.tsx

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
import { useMemo } from 'react';
2-
import { IconFile, IconFileZip, IconFolder } from '@tabler/icons-react';
2+
import {
3+
IconFile,
4+
IconFileZip,
5+
IconFolder,
6+
IconPlus,
7+
} from '@tabler/icons-react';
38
import { BASE_ICON_PROPS } from '@/constants/icon';
49
import type { DropdownItem } from '@/models/dropdown';
510
import type { NewAction } from '../FileManager';
@@ -10,11 +15,13 @@ export interface UseNewActionsProps {
1015
uploadFiles?: NewAction;
1116
newFolder?: NewAction;
1217
uploadArchive?: NewAction;
18+
newItem?: NewAction;
1319
};
1420
currentFolder?: DialFile;
1521
onUploadFiles?: () => void;
1622
onCreateFolder?: () => void;
1723
onUploadArchive?: () => void;
24+
onCreateNewItem: () => void;
1825
isNewButtonDisabled?: boolean;
1926
}
2027

@@ -30,6 +37,7 @@ export const useNewActions = ({
3037
onUploadFiles,
3138
onCreateFolder,
3239
onUploadArchive,
40+
onCreateNewItem,
3341
isNewButtonDisabled: isNewButtonDisabledExternal,
3442
}: UseNewActionsProps): UseNewActionsResult => {
3543
const newActionItems = useMemo(() => {
@@ -57,6 +65,24 @@ export const useNewActions = ({
5765
});
5866
}
5967

68+
if (newActions.newItem) {
69+
actions.push({
70+
key: 'new-item',
71+
label: newActions.newItem.label,
72+
icon:
73+
newActions?.newItem?.icon !== undefined ? (
74+
newActions?.newItem?.icon
75+
) : (
76+
<IconPlus {...BASE_ICON_PROPS} className="text-secondary" />
77+
),
78+
onClick: () => {
79+
if (onCreateNewItem) {
80+
onCreateNewItem();
81+
}
82+
},
83+
});
84+
}
85+
6086
if (newActions.uploadFiles) {
6187
actions.push({
6288
key: 'upload-file',
@@ -94,7 +120,13 @@ export const useNewActions = ({
94120
}
95121

96122
return actions;
97-
}, [newActions, onCreateFolder, onUploadFiles, onUploadArchive]);
123+
}, [
124+
newActions,
125+
onCreateFolder,
126+
onUploadFiles,
127+
onUploadArchive,
128+
onCreateNewItem,
129+
]);
98130

99131
const isNewButtonVisible = useMemo(
100132
() => newActionItems?.length > 0,

src/types/file-manager.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,5 @@ export enum FileManagerColumnKey {
5151
Owner = 'owner',
5252
Path = 'path',
5353
Actions = '__actions',
54+
Version = 'version',
5455
}

0 commit comments

Comments
 (0)