Skip to content

Commit c8d3675

Browse files
committed
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 2341f6e commit c8d3675

File tree

6 files changed

+56
-50
lines changed

6 files changed

+56
-50
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: 24 additions & 22 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,35 +158,36 @@ 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
171171
let projectToSelect: storageProject.Project | null = null;
172-
for (const projectName of allProjectNames) {
173-
if (projectName !== project.name) {
174-
projectToSelect = await storageProject.fetchProject(props.storage, projectName);
175-
break;
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+
}
176179
}
177180
}
178181

179182
try {
180-
await storageProject.deleteProject(props.storage, project.name);
183+
await storageProject.deleteProject(props.storage, projectToDelete.name);
181184
} catch (e) {
182185
console.error('Failed to delete the project:', e);
183186
props.setAlertErrorMessage(t('FAILED_TO_DELETE_PROJECT'));
184187
}
185188

186-
props.setProject(projectToSelect);
187189
if (projectToSelect) {
188-
props.onCancel();
190+
props.setCurrentProject(projectToSelect);
189191
}
190192
};
191193

@@ -196,7 +198,7 @@ export default function ProjectManageModal(props: ProjectManageModalProps): Reac
196198
}
197199

198200
const project = await storageProject.fetchProject(props.storage, projectRecord.name);
199-
props.setProject(project);
201+
props.setCurrentProject(project);
200202
props.onCancel();
201203
};
202204

@@ -255,8 +257,8 @@ export default function ProjectManageModal(props: ProjectManageModalProps): Reac
255257
handleRename(currentRecord.name, name);
256258
}
257259
}}
258-
okText={t('Rename')}
259-
cancelText={t('Cancel')}
260+
okText={t('RENAME')}
261+
cancelText={t('CANCEL')}
260262
>
261263
{currentRecord && (
262264
<ProjectNameComponent
@@ -281,8 +283,8 @@ export default function ProjectManageModal(props: ProjectManageModalProps): Reac
281283
handleCopy(currentRecord.name, name);
282284
}
283285
}}
284-
okText={t('Copy')}
285-
cancelText={t('Cancel')}
286+
okText={t('COPY')}
287+
cancelText={t('CANCEL')}
286288
>
287289
{currentRecord && (
288290
<ProjectNameComponent
@@ -299,7 +301,7 @@ export default function ProjectManageModal(props: ProjectManageModalProps): Reac
299301
</Antd.Modal>
300302

301303
<Antd.Modal
302-
title={t('Project Management')}
304+
title={t('PROJECT_MANAGEMENT')}
303305
open={props.isOpen}
304306
onCancel={props.onCancel}
305307
footer={null}
@@ -329,7 +331,7 @@ export default function ProjectManageModal(props: ProjectManageModalProps): Reac
329331
<br />
330332
<h4 style={{margin: '0 0 8px 0'}}>
331333
{t('CREATE_NEW', { type: t('PROJECT') })}
332-
</h4>
334+
</h4>
333335
<div style={getContainerStyle()}>
334336
<ProjectNameComponent
335337
newItemName={newItemName}

0 commit comments

Comments
 (0)