summaryrefslogtreecommitdiff
path: root/components/file-manager
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-10-13 08:56:27 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-10-13 08:56:27 +0000
commitb9a2081a76e669688d5884f20482b37cc8acca22 (patch)
tree385e78c05d193a54daaced836f1e1152696153a8 /components/file-manager
parente84cf02a1cb4959a9d3bb5bbf37885c13a447f78 (diff)
(최겸, 임수민) 구매 입찰, 견적(그룹코드, tbe에러) 수정, data-room 수정
Diffstat (limited to 'components/file-manager')
-rw-r--r--components/file-manager/FileManager.tsx100
1 files changed, 73 insertions, 27 deletions
diff --git a/components/file-manager/FileManager.tsx b/components/file-manager/FileManager.tsx
index 587beb22..fa2d8c38 100644
--- a/components/file-manager/FileManager.tsx
+++ b/components/file-manager/FileManager.tsx
@@ -335,7 +335,7 @@ export function FileManager({ projectId }: FileManagerProps) {
const [searchQuery, setSearchQuery] = useState('');
const [loading, setLoading] = useState(false);
- console.log(items,"items")
+ console.log(items, "items")
// Upload states
const [uploadDialogOpen, setUploadDialogOpen] = useState(false);
@@ -754,9 +754,9 @@ export function FileManager({ projectId }: FileManagerProps) {
// View file with PDFTron
const viewFile = async (file: FileItem) => {
try {
-
-
+
+
setViewerFileUrl(file.filePath);
setSelectedFile(file);
setViewerDialogOpen(true);
@@ -991,7 +991,16 @@ export function FileManager({ projectId }: FileManagerProps) {
<Button
size="sm"
variant="outline"
- onClick={() => setUploadDialogOpen(true)}
+ onClick={() => {
+ // 현재 폴더의 카테고리를 기본값으로 설정
+ if (currentParentId) {
+ const currentFolder = items.find(item => item.parentId === currentParentId);
+ if (currentFolder) {
+ setUploadCategory(currentFolder.category);
+ }
+ }
+ setUploadDialogOpen(true);
+ }}
>
<Upload className="h-4 w-4 mr-1" />
Upload
@@ -1005,7 +1014,7 @@ export function FileManager({ projectId }: FileManagerProps) {
{items.filter(item =>
selectedItems.has(item.id) &&
item.type === 'file' &&
- item.permissions?.canDownload ==='true'
+ item.permissions?.canDownload === 'true'
).length > 0 && (
<Button
size="sm"
@@ -1296,16 +1305,42 @@ export function FileManager({ projectId }: FileManagerProps) {
<SelectValue />
</SelectTrigger>
<SelectContent>
- {Object.entries(categoryConfig).map(([key, config]) => (
- <SelectItem key={key} value={key}>
- <div className="flex items-center">
- <config.icon className={cn("h-4 w-4 mr-2", config.color)} />
- <span>{config.label}</span>
- </div>
- </SelectItem>
- ))}
+ {Object.entries(categoryConfig)
+ .filter(([key]) => {
+ // 현재 폴더가 있는 경우
+ if (currentParentId) {
+ const currentFolder = items.find(item => item.parentId === currentParentId);
+ // 현재 폴더가 public이 아니면 public 옵션 제외
+ if (currentFolder && currentFolder.category !== 'public') {
+ return key !== 'public';
+ }
+ }
+ // 루트 폴더이거나 현재 폴더가 public인 경우 모든 옵션 표시
+ return true;
+ })
+ .map(([key, config]) => (
+ <SelectItem key={key} value={key}>
+ <div className="flex items-center">
+ <config.icon className={cn("h-4 w-4 mr-2", config.color)} />
+ <span>{config.label}</span>
+ </div>
+ </SelectItem>
+ ))}
</SelectContent>
</Select>
+ {/* 현재 폴더 정보 표시 (선택사항) */}
+ {currentParentId && (() => {
+ const currentFolder = items.find(item => item.parentId === currentParentId);
+ if (currentFolder && currentFolder.category !== 'public') {
+ return (
+ <p className="text-xs text-muted-foreground mt-1 flex items-center">
+ <AlertCircle className="h-3 w-3 mr-1" />
+ Current folder is {categoryConfig[currentFolder.category].label}.
+ Public uploads are not allowed.
+ </p>
+ );
+ }
+ })()}
</div>
{/* Dropzone */}
@@ -1644,13 +1679,13 @@ export function FileManager({ projectId }: FileManagerProps) {
Changing category for {selectedFile?.name} folder.
</DialogDescription>
</DialogHeader>
-
+
<div className="space-y-4">
<div>
<Label>New Category</Label>
<div className="mt-2 space-y-2">
{Object.entries(categoryConfig).map(([key, config]) => (
- <div
+ <div
key={key}
className={cn(
"flex items-center p-3 rounded-lg border cursor-pointer transition-colors",
@@ -1672,24 +1707,35 @@ export function FileManager({ projectId }: FileManagerProps) {
))}
</div>
</div>
-
{selectedFile?.type === 'folder' && (
<div className="flex items-center space-x-2">
<Switch
id="apply-to-children"
- checked={applyToChildren}
- onCheckedChange={setApplyToChildren}
+ checked={newCategory !== 'public' ? true : applyToChildren}
+ onCheckedChange={(checked) => {
+ if (newCategory === 'public') {
+ setApplyToChildren(checked);
+ }
+ }}
+ disabled={newCategory !== 'public'}
/>
- <Label htmlFor="apply-to-children">
+ <Label htmlFor="apply-to-children" className={cn(
+ newCategory !== 'public' && "text-muted-foreground"
+ )}>
Apply to all files and subfolders
+ {newCategory !== 'public' && (
+ <span className="text-xs block mt-1">
+ (Required for security categories)
+ </span>
+ )}
</Label>
</div>
)}
</div>
-
+
<DialogFooter>
- <Button
- variant="outline"
+ <Button
+ variant="outline"
onClick={() => {
setCategoryDialogOpen(false);
setSelectedFile(null);
@@ -1698,7 +1744,7 @@ export function FileManager({ projectId }: FileManagerProps) {
>
Cancel
</Button>
- <Button
+ <Button
onClick={() => {
if (selectedFile) {
changeCategory(selectedFile.id, newCategory, applyToChildren);
@@ -1715,8 +1761,8 @@ export function FileManager({ projectId }: FileManagerProps) {
</Dialog>
{/* Secure Document Viewer Dialog */}
- <Dialog
- open={viewerDialogOpen}
+ <Dialog
+ open={viewerDialogOpen}
onOpenChange={(open) => {
if (!open) {
setViewerDialogOpen(false);
@@ -1747,7 +1793,7 @@ export function FileManager({ projectId }: FileManagerProps) {
</div>
</DialogDescription>
</DialogHeader>
-
+
<div className="relative flex-1 h-[calc(90vh-120px)]">
{viewerFileUrl && selectedFile && (
<SecurePDFViewer
@@ -1761,7 +1807,7 @@ export function FileManager({ projectId }: FileManagerProps) {
/>
)}
</div>
-
+
<div className="px-6 py-3 border-t bg-muted/50">
<div className="flex items-center justify-between text-xs text-muted-foreground">
<div className="flex items-center gap-4">