Skip to content

Commit 0b00817

Browse files
committed
preserve order, force re-rendering when newly shown
1 parent ab5053f commit 0b00817

File tree

1 file changed

+64
-8
lines changed

1 file changed

+64
-8
lines changed

src/reactComponents/AddTabDialog.tsx

Lines changed: 64 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,15 @@ export default function AddTabDialog(props: AddTabDialogProps) {
6969
!props.currentTabs.some(tab => tab.key === item.path)
7070
);
7171

72-
const selectedModules = allItems.filter(item =>
73-
props.currentTabs.some(tab => tab.key === item.path)
74-
);
72+
// Preserve the order from currentTabs for selectedModules
73+
const selectedModules = props.currentTabs
74+
.map(tab => allItems.find(item => item.path === tab.key))
75+
.filter(item => item !== undefined) as Module[];
7576

7677
setAvailableItems(availableModules);
7778
setSelectedItems(selectedModules);
7879
}
79-
}, [props.project, props.currentTabs]);
80+
}, [props.project, props.currentTabs, props.isOpen]);
8081

8182
const handleAddNewItem = async () => {
8283
let trimmedName = newItemName.trim();
@@ -113,9 +114,10 @@ export default function AddTabDialog(props: AddTabDialogProps) {
113114
};
114115

115116
const handleSelectItem = (item: Module) => {
116-
if (!selectedItems.includes(item)) {
117+
const existingItem = selectedItems.find(i => i.path === item.path);
118+
if (!existingItem) {
117119
setSelectedItems([...selectedItems, item]);
118-
setAvailableItems(availableItems.filter(i => i !== item));
120+
setAvailableItems(availableItems.filter(i => i.path !== item.path));
119121
}
120122
};
121123

@@ -179,6 +181,7 @@ export default function AddTabDialog(props: AddTabDialogProps) {
179181
availableItems={availableItems}
180182
handleSelectItem={handleSelectItem}
181183
storage={props.storage}
184+
buttonLabel={t("New")}
182185
/>
183186
</div>
184187

@@ -218,6 +221,13 @@ export default function AddTabDialog(props: AddTabDialogProps) {
218221
dataSource={filteredAvailableItems}
219222
renderItem={(item) => (
220223
<Antd.List.Item
224+
draggable
225+
onDragStart={(e) => {
226+
e.dataTransfer.setData('application/json', JSON.stringify({
227+
type: 'available',
228+
item: item
229+
}));
230+
}}
221231
actions={[
222232
<Antd.Button
223233
size="small"
@@ -226,6 +236,7 @@ export default function AddTabDialog(props: AddTabDialogProps) {
226236
227237
</Antd.Button>
228238
]}
239+
style={{ cursor: 'grab' }}
229240
>
230241
<Antd.List.Item.Meta
231242
avatar={TabTypeUtils.getIcon(item.type)}
@@ -256,7 +267,31 @@ export default function AddTabDialog(props: AddTabDialogProps) {
256267
{t("Shown")}
257268
</h4>
258269
<div style={{ height: 32, marginBottom: 8 }}></div>
259-
<div style={{ height: 200, overflow: 'auto', border: '1px solid #d9d9d9' }}>
270+
<div
271+
style={{ height: 200, overflow: 'auto', border: '1px solid #d9d9d9' }}
272+
onDragOver={(e) => {
273+
e.preventDefault();
274+
}}
275+
onDrop={(e) => {
276+
e.preventDefault();
277+
try {
278+
const dragData = JSON.parse(e.dataTransfer.getData('application/json'));
279+
if (dragData.type === 'available') {
280+
handleSelectItem(dragData.item);
281+
}
282+
} catch (error) {
283+
// Handle reordering within shown list
284+
const fromIndex = parseInt(e.dataTransfer.getData('text/plain'));
285+
if (!isNaN(fromIndex)) {
286+
// This is a reorder operation within the shown list
287+
const items = Array.from(selectedItems);
288+
const [reorderedItem] = items.splice(fromIndex, 1);
289+
items.push(reorderedItem); // Add to end
290+
setSelectedItems(items);
291+
}
292+
}
293+
}}
294+
>
260295
{selectedItems.map((item, index) => (
261296
<div
262297
key={item.path}
@@ -269,10 +304,31 @@ export default function AddTabDialog(props: AddTabDialogProps) {
269304
}}
270305
onDrop={(e) => {
271306
e.preventDefault();
307+
e.stopPropagation();
308+
309+
// First check if it's an item from available list
310+
try {
311+
const dragData = JSON.parse(e.dataTransfer.getData('application/json'));
312+
if (dragData.type === 'available') {
313+
// Insert the available item at this position
314+
const existingItem = selectedItems.find(i => i.path === dragData.item.path);
315+
if (!existingItem) {
316+
const newItems = Array.from(selectedItems);
317+
newItems.splice(index, 0, dragData.item);
318+
setSelectedItems(newItems);
319+
setAvailableItems(availableItems.filter(i => i.path !== dragData.item.path));
320+
}
321+
return;
322+
}
323+
} catch (error) {
324+
// Not JSON data, continue with reordering logic
325+
}
326+
327+
// Handle reordering within shown list
272328
const fromIndex = parseInt(e.dataTransfer.getData('text/plain'));
273329
const toIndex = index;
274330

275-
if (fromIndex !== toIndex) {
331+
if (fromIndex !== toIndex && !isNaN(fromIndex)) {
276332
const items = Array.from(selectedItems);
277333
const [reorderedItem] = items.splice(fromIndex, 1);
278334
items.splice(toIndex, 0, reorderedItem);

0 commit comments

Comments
 (0)