Skip to content

Commit c5f15ff

Browse files
authored
Fix bug with deleting the current project (#334)
* Modified handleDeleteProject to select the next project after deleteProject has finished. * Updated handleDeleteProject to select another project only if the current project is the one being deleted. Also keep the dialog up after deleting a project. Renamed project to currentProject and setProject to setCurrentProject in MenuProps. Renamed project to currentProject and setProject to setCurrentProject in ProjectManageModalProps. Added "Project Management" to i18n.
1 parent 80b3cf3 commit c5f15ff

File tree

6 files changed

+60
-55
lines changed

6 files changed

+60
-55
lines changed

src/App.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -499,8 +499,8 @@ const AppContent: React.FC<AppContentProps> = ({ project, setProject }): React.J
499499
storage={storage}
500500
setAlertErrorMessage={setAlertErrorMessage}
501501
gotoTab={setActiveTab}
502-
project={project}
503-
setProject={setProject}
502+
currentProject={project}
503+
setCurrentProject={setProject}
504504
onProjectChanged={onProjectChanged}
505505
openWPIToolboxSettings={() => setToolboxSettingsModalIsOpen(true)}
506506
theme={theme}

src/i18n/locales/en/translation.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
"ACTIONS": "Actions",
5555
"DELETE_PROJECT_CONFIRM": "Delete {{projectName}}?",
5656
"DELETE_CANNOT_BE_UNDONE": "This action cannot be undone.",
57+
"PROJECT_MANAGEMENT": "Project Management",
5758
"NO_PROJECTS_FOUND": "No projects found",
5859
"CREATE_PROJECT_TO_START": "Please create a new project to get started.",
5960
"PAGINATION_ITEMS": "{{range0}}-{{range1}} of {{total}} items",

src/i18n/locales/es/translation.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
"ACTIONS": "Acciones",
5252
"DELETE_PROJECT_CONFIRM": "¿Eliminar {{projectName}}?",
5353
"DELETE_CANNOT_BE_UNDONE": "Esta acción no se puede deshacer.",
54+
"PROJECT_MANAGEMENT": "Gestión de proyectos",
5455
"NO_PROJECTS_FOUND": "No se encontraron proyectos",
5556
"CREATE_PROJECT_TO_START": "Por favor crea un nuevo proyecto para comenzar.",
5657
"PAGINATION_ITEMS": "{{range0}}-{{range1}} de {{total}} elementos",

src/i18n/locales/he/translation.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
"ACTIONS": "פעולות",
5555
"DELETE_PROJECT_CONFIRM": "מחק את {{projectName}}?",
5656
"DELETE_CANNOT_BE_UNDONE": "פעולה זו לא ניתנת לביטול.",
57+
"PROJECT_MANAGEMENT": "ניהול פרויקטים",
5758
"NO_PROJECTS_FOUND": "לא נמצאו פרויקטים",
5859
"CREATE_PROJECT_TO_START": "אנא צור פרויקט חדש כדי להתחיל.",
5960
"PAGINATION_ITEMS": "{{range0}}-{{range1}} מתוך {{total}} פריטים",

src/reactComponents/Menu.tsx

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ export interface MenuProps {
5858
storage: commonStorage.Storage | null;
5959
setAlertErrorMessage: (message: string) => void;
6060
gotoTab: (tabKey: string) => void;
61-
project: storageProject.Project | null;
62-
setProject: (project: storageProject.Project | null) => void;
61+
currentProject: storageProject.Project | null;
62+
setCurrentProject: (project: storageProject.Project | null) => void;
6363
onProjectChanged: () => Promise<void>;
6464
openWPIToolboxSettings: () => void;
6565
theme: string;
@@ -137,20 +137,20 @@ function getMenuItems(t: (key: string) => string, project: storageProject.Projec
137137
getItem(t('THEME') + '...', 'theme', <BgColorsOutlined />),
138138
getItem(t('LANGUAGE'), 'language', <GlobalOutlined />, [
139139
getItem(
140-
t('ENGLISH'),
141-
'setlang:en',
140+
t('ENGLISH'),
141+
'setlang:en',
142142
currentLanguage === 'en' ? <CheckOutlined /> : undefined
143143
),
144144
getItem(
145-
t('SPANISH'),
146-
'setlang:es',
145+
t('SPANISH'),
146+
'setlang:es',
147147
currentLanguage === 'es' ? <CheckOutlined /> : undefined
148148
),
149149
getItem(
150-
t('HEBREW'),
151-
'setlang:he',
150+
t('HEBREW'),
151+
'setlang:he',
152152
currentLanguage === 'he' ? <CheckOutlined /> : undefined
153-
),
153+
),
154154
]),
155155
]),
156156
getItem(t('HELP'), 'help', <QuestionCircleOutlined />, [
@@ -223,7 +223,7 @@ export function Component(props: MenuProps): React.JSX.Element {
223223
}
224224
if (projectNameToFetch) {
225225
const project = await storageProject.fetchProject(props.storage, projectNameToFetch);
226-
props.setProject(project);
226+
props.setCurrentProject(project);
227227
}
228228
}
229229
};
@@ -233,15 +233,15 @@ export function Component(props: MenuProps): React.JSX.Element {
233233
if (props.storage) {
234234
await props.storage.saveEntry(
235235
MOST_RECENT_PROJECT_NAME_KEY,
236-
props.project?.projectName || ''
236+
props.currentProject?.projectName || ''
237237
);
238238
}
239239
};
240240

241241
/** Handles menu item clicks. */
242242
const handleClick: Antd.MenuProps['onClick'] = ({key}): void => {
243-
const newModule = props.project ?
244-
storageProject.findModuleByModulePath(props.project, key) :
243+
const newModule = props.currentProject ?
244+
storageProject.findModuleByModulePath(props.currentProject, key) :
245245
null;
246246

247247
if (newModule) {
@@ -284,7 +284,7 @@ export function Component(props: MenuProps): React.JSX.Element {
284284

285285
/** Handles the deploy action to generate and download Python files. */
286286
const handleDeploy = async (): Promise<void> => {
287-
if (!props.project) {
287+
if (!props.currentProject) {
288288
props.setAlertErrorMessage(t('NO_PROJECT_SELECTED'));
289289
return;
290290
}
@@ -293,16 +293,16 @@ export function Component(props: MenuProps): React.JSX.Element {
293293
}
294294

295295
try {
296-
const blobUrl = await createPythonFiles.producePythonProjectBlob(props.project, props.storage);
296+
const blobUrl = await createPythonFiles.producePythonProjectBlob(props.currentProject, props.storage);
297297

298298
// Create a temporary link to download the file
299299
const link = document.createElement('a');
300300
link.href = blobUrl;
301-
link.download = `${props.project.projectName}.zip`;
301+
link.download = `${props.currentProject.projectName}.zip`;
302302
document.body.appendChild(link);
303303
link.click();
304304
document.body.removeChild(link);
305-
305+
306306
// Clean up the blob URL
307307
URL.revokeObjectURL(blobUrl);
308308
} catch (error) {
@@ -314,7 +314,7 @@ export function Component(props: MenuProps): React.JSX.Element {
314314
// TODO: Add UI for the download action.
315315
/** Handles the download action to generate and download json files. */
316316
const handleDownload = async (): Promise<void> => {
317-
if (!props.project) {
317+
if (!props.currentProject) {
318318
props.setAlertErrorMessage(t('NO_PROJECT_SELECTED'));
319319
return;
320320
}
@@ -323,8 +323,8 @@ export function Component(props: MenuProps): React.JSX.Element {
323323
}
324324

325325
try {
326-
const blobUrl = await storageProject.downloadProject(props.storage, props.project.projectName);
327-
const filename = props.project.projectName + storageNames.UPLOAD_DOWNLOAD_FILE_EXTENSION;
326+
const blobUrl = await storageProject.downloadProject(props.storage, props.currentProject.projectName);
327+
const filename = props.currentProject.projectName + storageNames.UPLOAD_DOWNLOAD_FILE_EXTENSION;
328328

329329
// Create a temporary link to download the file
330330
const link = document.createElement('a');
@@ -415,19 +415,19 @@ export function Component(props: MenuProps): React.JSX.Element {
415415

416416
// Update menu items and save project when project or language changes
417417
React.useEffect(() => {
418-
if (props.project) {
418+
if (props.currentProject) {
419419
setMostRecentProjectName();
420-
setMenuItems(getMenuItems(t, props.project, i18n.language));
420+
setMenuItems(getMenuItems(t, props.currentProject, i18n.language));
421421
setNoProjects(false);
422422
}
423-
}, [props.project, i18n.language]);
423+
}, [props.currentProject, i18n.language]);
424424

425425
return (
426426
<>
427427
<FileManageModal
428428
isOpen={fileModalOpen}
429429
onClose={handleFileModalClose}
430-
project={props.project}
430+
project={props.currentProject}
431431
storage={props.storage}
432432
tabType={tabType}
433433
onProjectChanged={props.onProjectChanged}
@@ -439,7 +439,8 @@ export function Component(props: MenuProps): React.JSX.Element {
439439
isOpen={projectModalOpen}
440440
onCancel={handleProjectModalClose}
441441
storage={props.storage}
442-
setProject={props.setProject}
442+
currentProject={props.currentProject}
443+
setCurrentProject={props.setCurrentProject}
443444
setAlertErrorMessage={props.setAlertErrorMessage}
444445
/>
445446
<Antd.Menu
@@ -464,7 +465,7 @@ export function Component(props: MenuProps): React.JSX.Element {
464465
<Antd.Button
465466
icon={<DownloadOutlined />}
466467
size="small"
467-
disabled={!props.project}
468+
disabled={!props.currentProject}
468469
onClick={handleDownload}
469470
style={{ color: 'white' }}
470471
/>

src/reactComponents/ProjectManageModal.tsx

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ interface ProjectManageModalProps {
3131
isOpen: boolean;
3232
noProjects: boolean;
3333
onCancel: () => void;
34-
setProject: (project: storageProject.Project | null) => void;
34+
currentProject: storageProject.Project | null;
35+
setCurrentProject: (project: storageProject.Project | null) => void;
3536
setAlertErrorMessage: (message: string) => void;
3637
storage: commonStorage.Storage | null;
3738
}
@@ -87,7 +88,7 @@ export default function ProjectManageModal(props: ProjectManageModalProps): Reac
8788
if (projectNames.length > 0 && props.noProjects) {
8889
// Set the first project as the current project
8990
const project = await storageProject.fetchProject(storage, projectNames[0]);
90-
props.setProject(project);
91+
props.setCurrentProject(project);
9192
props.onCancel(); // Close the modal after selecting
9293
}
9394
};
@@ -109,7 +110,7 @@ export default function ProjectManageModal(props: ProjectManageModalProps): Reac
109110
console.error('Error renaming project:', error);
110111
props.setAlertErrorMessage(t('FAILED_TO_RENAME_PROJECT'));
111112
}
112-
113+
113114
setRenameModalOpen(false);
114115
};
115116

@@ -130,7 +131,7 @@ export default function ProjectManageModal(props: ProjectManageModalProps): Reac
130131
console.error('Error copying project:', error);
131132
props.setAlertErrorMessage(t('FAILED_TO_COPY_PROJECT'));
132133
}
133-
134+
134135
setCopyModalOpen(false);
135136
};
136137

@@ -157,37 +158,37 @@ export default function ProjectManageModal(props: ProjectManageModalProps): Reac
157158
};
158159

159160
/** Handles project deletion with proper cleanup. */
160-
const handleDeleteProject = async (project: ProjectRecord): Promise<void> => {
161+
const handleDeleteProject = async (projectToDelete: ProjectRecord): Promise<void> => {
161162
if (!props.storage) {
162163
return;
163164
}
164165

165-
const updatedProjectNames = allProjectNames.filter(projectName => projectName !== project.name);
166+
const updatedProjectNames = allProjectNames.filter(projectName => projectName !== projectToDelete.name);
166167
setAllProjectNames(updatedProjectNames);
167-
const updatedProjectRecords = allProjectRecords.filter((r) => r.name !== project.name);
168+
const updatedProjectRecords = allProjectRecords.filter((r) => r.name !== projectToDelete.name);
168169
setAllProjectRecords(updatedProjectRecords);
169170

170-
// Find another project to set as current
171-
let foundAnotherProject = false;
172-
for (const projectName of allProjectNames) {
173-
if (projectName !== project.name) {
174-
const project = await storageProject.fetchProject(props.storage, projectName);
175-
props.setProject(project);
176-
foundAnotherProject = true;
177-
break;
171+
let projectToSelect: storageProject.Project | null = null;
172+
if (props.currentProject && props.currentProject.projectName === projectToDelete.name) {
173+
// Find another project to set as current
174+
for (const projectName of allProjectNames) {
175+
if (projectName !== projectToDelete.name) {
176+
projectToSelect = await storageProject.fetchProject(props.storage, projectName);
177+
break;
178+
}
178179
}
179180
}
180181

181-
if (!foundAnotherProject) {
182-
props.setProject(null);
183-
}
184-
185182
try {
186-
await storageProject.deleteProject(props.storage, project.name);
183+
await storageProject.deleteProject(props.storage, projectToDelete.name);
187184
} catch (e) {
188185
console.error('Failed to delete the project:', e);
189186
props.setAlertErrorMessage(t('FAILED_TO_DELETE_PROJECT'));
190187
}
188+
189+
if (projectToSelect) {
190+
props.setCurrentProject(projectToSelect);
191+
}
191192
};
192193

193194
/** Handles project selection. */
@@ -197,7 +198,7 @@ export default function ProjectManageModal(props: ProjectManageModalProps): Reac
197198
}
198199

199200
const project = await storageProject.fetchProject(props.storage, projectRecord.name);
200-
props.setProject(project);
201+
props.setCurrentProject(project);
201202
props.onCancel();
202203
};
203204

@@ -256,8 +257,8 @@ export default function ProjectManageModal(props: ProjectManageModalProps): Reac
256257
handleRename(currentRecord.name, name);
257258
}
258259
}}
259-
okText={t('Rename')}
260-
cancelText={t('Cancel')}
260+
okText={t('RENAME')}
261+
cancelText={t('CANCEL')}
261262
>
262263
{currentRecord && (
263264
<ProjectNameComponent
@@ -282,8 +283,8 @@ export default function ProjectManageModal(props: ProjectManageModalProps): Reac
282283
handleCopy(currentRecord.name, name);
283284
}
284285
}}
285-
okText={t('Copy')}
286-
cancelText={t('Cancel')}
286+
okText={t('COPY')}
287+
cancelText={t('CANCEL')}
287288
>
288289
{currentRecord && (
289290
<ProjectNameComponent
@@ -300,7 +301,7 @@ export default function ProjectManageModal(props: ProjectManageModalProps): Reac
300301
</Antd.Modal>
301302

302303
<Antd.Modal
303-
title={t('Project Management')}
304+
title={t('PROJECT_MANAGEMENT')}
304305
open={props.isOpen}
305306
onCancel={props.onCancel}
306307
footer={null}
@@ -330,7 +331,7 @@ export default function ProjectManageModal(props: ProjectManageModalProps): Reac
330331
<br />
331332
<h4 style={{margin: '0 0 8px 0'}}>
332333
{t('CREATE_NEW', { type: t('PROJECT') })}
333-
</h4>
334+
</h4>
334335
<div style={getContainerStyle()}>
335336
<ProjectNameComponent
336337
newItemName={newItemName}

0 commit comments

Comments
 (0)