Skip to content

Commit f250f5d

Browse files
Fixed an issue where delete/rename was done on the wrong file after sorting in Storage Manager. #8597
1 parent fa60ab0 commit f250f5d

File tree

1 file changed

+33
-25
lines changed

1 file changed

+33
-25
lines changed

web/pgadmin/misc/file_manager/static/js/components/FileManager.jsx

+33-25
Original file line numberDiff line numberDiff line change
@@ -439,21 +439,23 @@ export default function FileManager({params, closeModal, onOK, onCancel, sharedS
439439
type: null, idx: null
440440
});
441441

442+
// apply sort
442443
const sortedItems = useMemo(()=>(
443444
[...items].sort(getComparator(sortColumns[0]))
444445
), [items, sortColumns]);
445446

446-
const filteredItems = useMemo(()=>{
447+
// apply filter on sorted
448+
const finalItems = useMemo(()=>{
447449
return sortedItems.filter((i)=>i.Filename?.toLowerCase().includes(search?.toLocaleLowerCase()));
448450
}, [items, sortColumns, search]);
449451

450452
const itemsText = useMemo(()=>{
451453
let suffix = items.length == 1 ? 'item' : 'items';
452-
if(items.length == filteredItems.length) {
454+
if(items.length == finalItems.length) {
453455
return `${items.length} ${suffix}`;
454456
}
455-
return `${filteredItems.length} of ${items.length} ${suffix}`;
456-
}, [items, filteredItems]);
457+
return `${finalItems.length} of ${items.length} ${suffix}`;
458+
}, [items, finalItems]);
457459

458460
const changeDir = async(storage) => {
459461
setSelectedSS(storage);
@@ -478,7 +480,9 @@ export default function FileManager({params, closeModal, onOK, onCancel, sharedS
478480
setLoaderText('');
479481
};
480482

481-
const completeOperation = async (oldRow, newRow, rowIdx, selectedSS, func)=>{
483+
const completeOperation = async (oldRow, newRow, selectedSS, func)=>{
484+
// We need to find the index in actual items list not final items list
485+
const rowIdx = oldRow ? items.findIndex((i)=>i.Filename == oldRow?.Filename && i.Path == oldRow?.Path) : 0;
482486
setOperation({});
483487
if(oldRow?.Filename == newRow.Filename) {
484488
setItems((prev)=>[
@@ -519,7 +523,7 @@ export default function FileManager({params, closeModal, onOK, onCancel, sharedS
519523
const onDownload = async ()=>{
520524
setLoaderText('Downloading...');
521525
try {
522-
await fmUtilsObj.downloadFile(filteredItems[selectedRowIdx.current], selectedSS);
526+
await fmUtilsObj.downloadFile(finalItems[selectedRowIdx.current], selectedSS);
523527
} catch (error) {
524528
setErrorMsg(parseApiError(error));
525529
console.error(error);
@@ -534,10 +538,10 @@ export default function FileManager({params, closeModal, onOK, onCancel, sharedS
534538
setOperation({
535539
type: 'add',
536540
idx: 0,
537-
onComplete: async (row, rowIdx)=>{
541+
onComplete: async (row)=>{
538542
setErrorMsg('');
539543
setLoaderText('Creating folder...');
540-
await completeOperation(null, row, rowIdx, selectedSS, fmUtilsObj.addFolder.bind(fmUtilsObj));
544+
await completeOperation(null, row, selectedSS, fmUtilsObj.addFolder.bind(fmUtilsObj));
541545
setLoaderText('');
542546
}
543547
});
@@ -554,8 +558,8 @@ export default function FileManager({params, closeModal, onOK, onCancel, sharedS
554558
onComplete: async (row, rowIdx)=>{
555559
setErrorMsg('');
556560
setLoaderText('Renaming...');
557-
let oldRow = items[rowIdx];
558-
await completeOperation(oldRow, row, rowIdx, selectedSS,fmUtilsObj.renameItem.bind(fmUtilsObj));
561+
let oldRow = finalItems[rowIdx];
562+
await completeOperation(oldRow, row, selectedSS, fmUtilsObj.renameItem.bind(fmUtilsObj));
559563
setLoaderText('');
560564
}
561565
});
@@ -570,10 +574,14 @@ export default function FileManager({params, closeModal, onOK, onCancel, sharedS
570574
setConfirmFile([null, null]);
571575
setLoaderText('Deleting...');
572576
try {
573-
await fmUtilsObj.deleteItem(items[selectedRowIdx.current],selectedSS);
577+
// selectedRowIdx is index in finalItems, so we need to find the index in actual items list
578+
const oldRow = finalItems[selectedRowIdx.current];
579+
const itemsRowIdx = items.findIndex((i)=>i.Filename == oldRow?.Filename && i.Path == oldRow?.Path);
580+
581+
await fmUtilsObj.deleteItem(oldRow, selectedSS);
574582
setItems((prev)=>[
575-
...prev.slice(0, selectedRowIdx.current),
576-
...prev.slice(selectedRowIdx.current+1),
583+
...prev.slice(0, itemsRowIdx),
584+
...prev.slice(itemsRowIdx+1),
577585
]);
578586
} catch (error) {
579587
setErrorMsg(parseApiError(error));
@@ -613,33 +621,33 @@ export default function FileManager({params, closeModal, onOK, onCancel, sharedS
613621
}]);
614622
return;
615623
}
616-
} else if(selectedRowIdx?.current >= 0 && filteredItems[selectedRowIdx?.current]) {
617-
onOkPath = filteredItems[selectedRowIdx?.current]['Path'];
624+
} else if(selectedRowIdx?.current >= 0 && finalItems[selectedRowIdx?.current]) {
625+
onOkPath = finalItems[selectedRowIdx?.current]['Path'];
618626
}
619627
await fmUtilsObj.setLastVisitedDir(fmUtilsObj.currPath, selectedSS);
620628
onOK?.(onOkPath, selectedSS);
621629
closeModal();
622-
}, [filteredItems, saveAs, fileType]);
630+
}, [finalItems, saveAs, fileType]);
623631
const onItemEnter = useCallback(async (row)=>{
624632
if(row.file_type == 'dir' || row.file_type == 'drive') {
625633
await openDir(row.Path, selectedSS);
626634
} else if(params.dialog_type == 'select_file') {
627635
onOkClick();
628636
}
629-
}, [filteredItems]);
637+
}, [finalItems]);
630638
const onItemSelect = useCallback((idx)=>{
631639
selectedRowIdx.current = idx;
632640
fewBtnDisableCheck();
633-
}, [filteredItems]);
641+
}, [finalItems]);
634642
const onItemClick = useCallback((idx)=>{
635-
let row = filteredItems[selectedRowIdx.current];
643+
let row = finalItems[selectedRowIdx.current];
636644
if(params.dialog_type == 'create_file' && row?.file_type != 'dir' && row?.file_type != 'drive') {
637-
setSaveAs(filteredItems[idx]?.Filename);
645+
setSaveAs(finalItems[idx]?.Filename);
638646
}
639-
}, [filteredItems]);
647+
}, [finalItems]);
640648
const fewBtnDisableCheck = ()=>{
641649
let disabled = true;
642-
let row = filteredItems[selectedRowIdx.current];
650+
let row = finalItems[selectedRowIdx.current];
643651
if(params.dialog_type == 'create_file') {
644652
disabled = !saveAs?.trim();
645653
} else if(selectedRowIdx.current >= 0 && row) {
@@ -688,7 +696,7 @@ export default function FileManager({params, closeModal, onOK, onCancel, sharedS
688696

689697
useEffect(()=>{
690698
fewBtnDisableCheck();
691-
}, [saveAs, filteredItems.length]);
699+
}, [saveAs, finalItems.length]);
692700

693701
const isNoneSelected = _.isUndefined(selectedRow);
694702
let okBtnText = params.btn_primary;
@@ -812,10 +820,10 @@ export default function FileManager({params, closeModal, onOK, onCancel, sharedS
812820
}
813821
}}/>}
814822
{viewMode == 'list' &&
815-
<ListView key={fmUtilsObj.currPath} items={filteredItems} operation={operation} onItemEnter={onItemEnter}
823+
<ListView key={fmUtilsObj.currPath} items={finalItems} operation={operation} onItemEnter={onItemEnter}
816824
onItemSelect={onItemSelect} onItemClick={onItemClick} sortColumns={sortColumns} onSortColumnsChange={setSortColumns}/>}
817825
{viewMode == 'grid' &&
818-
<GridView key={fmUtilsObj.currPath} items={filteredItems} operation={operation} onItemEnter={onItemEnter}
826+
<GridView key={fmUtilsObj.currPath} items={finalItems} operation={operation} onItemEnter={onItemEnter}
819827
onItemSelect={onItemSelect} />}
820828
<FormFooterMessage type={MESSAGE_TYPE.ERROR} message={_.escape(errorMsg)} closable onClose={()=>setErrorMsg('')} />
821829
{params.dialog_type == 'create_file' &&

0 commit comments

Comments
 (0)