From ac20206496c5da4ce8602bdf26b69f86e3349cae Mon Sep 17 00:00:00 2001 From: CoderLLamaPhone <157067336+CoderLLamaPhone@users.noreply.github.com> Date: Wed, 24 Sep 2025 16:57:03 -0600 Subject: [PATCH 01/10] ISS221 --- src/activities.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/activities.js b/src/activities.js index d46df2fe..2758c9b5 100644 --- a/src/activities.js +++ b/src/activities.js @@ -62,7 +62,6 @@ export const Activities = { ObjectTypes.Plasmids.id, ObjectTypes.Assembly.id, ObjectTypes.Build.id, - ObjectTypes.SampleDesigns.id, ObjectTypes.Strains.id ] }, @@ -72,6 +71,7 @@ export const Activities = { component: ExplorerActivityView, icon: BiSolidFlask, objectTypesToList: [ + ObjectTypes.SampleDesigns.id, ObjectTypes.Experiments.id, ObjectTypes.Metadata.id, ObjectTypes.Results.id //note: not all of these have templates From 4ac31855ca29f2e14bdc5b8c23caa1425348285d Mon Sep 17 00:00:00 2001 From: CoderLLamaPhone <157067336+CoderLLamaPhone@users.noreply.github.com> Date: Wed, 24 Sep 2025 16:57:47 -0600 Subject: [PATCH 02/10] ISS220 --- src/activities.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/activities.js b/src/activities.js index 2758c9b5..fff61956 100644 --- a/src/activities.js +++ b/src/activities.js @@ -60,9 +60,9 @@ export const Activities = { icon: GiThorHammer, objectTypesToList: [ ObjectTypes.Plasmids.id, + ObjectTypes.Strains.id, ObjectTypes.Assembly.id, ObjectTypes.Build.id, - ObjectTypes.Strains.id ] }, Test: { From a83f75821c05e55ce9059e4f2bf7d7e30b7a751f Mon Sep 17 00:00:00 2001 From: CoderLLamaPhone <157067336+CoderLLamaPhone@users.noreply.github.com> Date: Wed, 24 Sep 2025 17:08:57 -0600 Subject: [PATCH 03/10] ISS208 --- src/objectTypes.js | 132 ++++++++++++++++++++++----------------------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/src/objectTypes.js b/src/objectTypes.js index 5aca1a69..98435b56 100644 --- a/src/objectTypes.js +++ b/src/objectTypes.js @@ -21,6 +21,51 @@ export const ObjectTypes = { isRepository: true, defaultRegistry: "https://synbiohub.org" }, + Chassis: { + id: "synbio.object-type.chassis", + title: "Chassis", + listTitle: "Chassis", + fileNameMatch: /\.(xlsm|xlsx)$/, + icon: MdAlignVerticalTop, + createable: false, + importable: true, + subdirectory: "chassis", + downloadable: true, + }, + Chemicals: { + id: "synbio.object-type.chemicals", + title: "Chemicals", + listTitle: "Chemicals", + fileNameMatch: /\.(xlsm|xlsx)$/, + icon: MdAlignVerticalTop, + createable: false, + importable: true, + subdirectory: "chemicals", + downloadable: true, + }, + Medias: { + id: "synbio.object-type.medias", + title: "Medias", + listTitle: "Medias", + fileNameMatch: /\.(xlsm|xlsx)$/, + icon: MdAlignVerticalTop, + createable: false, + importable: true, + subdirectory: "medias", + downloadable: true, + }, + Parts: { + id: "synbio.object-type.parts", + title: "Parts", + listTitle: "Parts", + fileNameMatch: /\.(xlsm|xlsx)$/, + icon: MdAlignVerticalTop, + createable: false, + importable: true, + subdirectory: "parts", + downloadable: true, + + }, SBOL: { id: "synbio.object-type.sbol", title: "Design", @@ -71,6 +116,17 @@ export const ObjectTypes = { badgeLabel: "PLASMID", subdirectory: "plasmids" }, + Strains: { + id: "synbio.object-type.strains", + title: "Strains", + listTitle: "Strains", + fileNameMatch: /\.(xlsm|xlsx)$/, + icon: MdAlignVerticalTop, + createable: false, + importable: true, + subdirectory: "strains", + downloadable: true, + }, Assembly: { id: "synbio.object-type.assembly-plan", title: "Assembly Plan", @@ -91,72 +147,6 @@ export const ObjectTypes = { extension: '.json', subdirectory: "builds" }, - Experiments: { - id: "synbio.object-type.experiment", - title: "Experiments", - listTitle: "Experiments", - fileNameMatch: /\.xdc$/, - icon: GrTestDesktop, - createable: true, - extension: ".xdc", - subdirectory: "xdc" - }, - Chassis: { - id: "synbio.object-type.chassis", - title: "Chassis", - listTitle: "Chassis", - fileNameMatch: /\.(xlsm|xlsx)$/, - icon: MdAlignVerticalTop, - createable: false, - importable: true, - subdirectory: "chassis", - downloadable: true, - }, - Chemicals: { - id: "synbio.object-type.chemicals", - title: "Chemicals", - listTitle: "Chemicals", - fileNameMatch: /\.(xlsm|xlsx)$/, - icon: MdAlignVerticalTop, - createable: false, - importable: true, - subdirectory: "chemicals", - downloadable: true, - }, - Medias: { - id: "synbio.object-type.medias", - title: "Medias", - listTitle: "Medias", - fileNameMatch: /\.(xlsm|xlsx)$/, - icon: MdAlignVerticalTop, - createable: false, - importable: true, - subdirectory: "medias", - downloadable: true, - }, - Parts: { - id: "synbio.object-type.parts", - title: "Parts", - listTitle: "Parts", - fileNameMatch: /\.(xlsm|xlsx)$/, - icon: MdAlignVerticalTop, - createable: false, - importable: true, - subdirectory: "parts", - downloadable: true, - - }, - Strains: { - id: "synbio.object-type.strains", - title: "Strains", - listTitle: "Strains", - fileNameMatch: /\.(xlsm|xlsx)$/, - icon: MdAlignVerticalTop, - createable: false, - importable: true, - subdirectory: "strains", - downloadable: true, - }, SampleDesigns: { id: "synbio.object-type.sample-designs", title: "Sample Designs", @@ -168,6 +158,16 @@ export const ObjectTypes = { subdirectory: "sampleDesigns", downloadable: true, }, + Experiments: { + id: "synbio.object-type.experiment", + title: "Experiments", + listTitle: "Experiments", + fileNameMatch: /\.xdc$/, + icon: GrTestDesktop, + createable: true, + extension: ".xdc", + subdirectory: "xdc" + }, Metadata: { id: "synbio.object-type.experimental-data", title: "Metadata", From 832e29da0addf2865181054d080900084115357b Mon Sep 17 00:00:00 2001 From: CoderLLamaPhone <157067336+CoderLLamaPhone@users.noreply.github.com> Date: Wed, 24 Sep 2025 17:10:24 -0600 Subject: [PATCH 04/10] ISS209 --- src/activities.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/activities.js b/src/activities.js index fff61956..8e2f8bb4 100644 --- a/src/activities.js +++ b/src/activities.js @@ -22,7 +22,7 @@ export const Activities = { }, ResourceSelection: { id: "synbio.activity.resource-selection", - title: "Resource Selection", + title: "Resources", component: ExplorerActivityView, icon: HiOutlinePuzzlePiece, objectTypesToList: [ From 88054eca0338559189657ea5a2bee815e23e85f2 Mon Sep 17 00:00:00 2001 From: CoderLLamaPhone <157067336+CoderLLamaPhone@users.noreply.github.com> Date: Wed, 24 Sep 2025 17:17:10 -0600 Subject: [PATCH 05/10] ISS207 --- src/modules/modular_login/FJInstanceSelector.jsx | 6 +++--- src/modules/modular_login/FJModal.jsx | 10 +++++----- src/modules/modular_login/SBHInstanceSelector.jsx | 6 +++--- src/modules/modular_login/SBHModal.jsx | 10 +++++----- src/modules/modular_login/loginModal.jsx | 14 +++++++------- src/objectTypes.js | 8 ++++---- 6 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/modules/modular_login/FJInstanceSelector.jsx b/src/modules/modular_login/FJInstanceSelector.jsx index 13786c5f..ae427f40 100644 --- a/src/modules/modular_login/FJInstanceSelector.jsx +++ b/src/modules/modular_login/FJInstanceSelector.jsx @@ -39,7 +39,7 @@ const FJInstanceSelector = ({onClose, setRepoSelection }) => { if (!showNotificationFlag) { showNotification({ title: 'Logout Successful', - message: 'You have successfully logged out of the registry', + message: 'You have successfully logged out of the repository', color: 'green', }); } @@ -125,13 +125,13 @@ const FJInstanceSelector = ({onClose, setRepoSelection }) => { ) : ( <> {setNullSelected(false); setSelected(value)}} value={selected} /> - {nullSelected &&
No selected registry. Please select an registry
} + {nullSelected &&
No selected repository. Please select an repository
}
{selected && ( diff --git a/src/modules/modular_login/SBHModal.jsx b/src/modules/modular_login/SBHModal.jsx index 6545a239..31f33c89 100644 --- a/src/modules/modular_login/SBHModal.jsx +++ b/src/modules/modular_login/SBHModal.jsx @@ -26,7 +26,7 @@ function SBHModal({ opened, onClose, repoName }) { }, [opened]); return ( - + {repoSelection === "" ? ( <> @@ -39,7 +39,7 @@ function SBHModal({ opened, onClose, repoName }) { />
- Registry: {selectedSBH ? findInstance(selectedSBH, "SBH").instance : "Not Logged In"} + Repository: {selectedSBH ? findInstance(selectedSBH, "SBH").instance : "Not Logged In"} @@ -50,13 +50,13 @@ function SBHModal({ opened, onClose, repoName }) { {selectedSBH ? <> : }
diff --git a/src/modules/modular_login/loginModal.jsx b/src/modules/modular_login/loginModal.jsx index d78b7da5..2bbc8dab 100644 --- a/src/modules/modular_login/loginModal.jsx +++ b/src/modules/modular_login/loginModal.jsx @@ -35,7 +35,7 @@ function LoginModal({ opened, onClose, repoName }) { }, [opened]); return ( - + {repoSelection === "" ? ( <> @@ -48,7 +48,7 @@ function LoginModal({ opened, onClose, repoName }) { />
- Registry: {selectedSBH ? findInstance(selectedSBH, "SBH").instance : "Not Logged In"} + Repository: {selectedSBH ? findInstance(selectedSBH, "SBH").instance : "Not Logged In"} @@ -61,9 +61,9 @@ function LoginModal({ opened, onClose, repoName }) { {selectedSBH ? : }
@@ -77,7 +77,7 @@ function LoginModal({ opened, onClose, repoName }) { />
- Registry: {selectedFJ ? findInstance(selectedFJ, "FJ").instance : "Not Logged In"} + Repository: {selectedFJ ? findInstance(selectedFJ, "FJ").instance : "Not Logged In"} @@ -90,9 +90,9 @@ function LoginModal({ opened, onClose, repoName }) { {selectedFJ ? : }
diff --git a/src/objectTypes.js b/src/objectTypes.js index 98435b56..ce5be654 100644 --- a/src/objectTypes.js +++ b/src/objectTypes.js @@ -15,8 +15,8 @@ import download from "browser-downloads" export const ObjectTypes = { SYNBIOHUB: { id: "synbio.object-type.synbiohub", - title: "SynBioHub Registry", - listTitle: "SynBioHub Registries", + title: "SynBioHub Repository", + listTitle: "SynBioHub Repositories", icon: RiGitRepositoryLine, isRepository: true, defaultRegistry: "https://synbiohub.org" @@ -190,8 +190,8 @@ export const ObjectTypes = { }, Flapjack: { id: "synbio.object-type.flapjack", - title: "Flapjack Registry", - listTitle: "Flapjack Registries", + title: "Flapjack Repository", + listTitle: "Flapjack Repositories", icon: RiGitRepositoryLine, isRepository: true, defaultRegistry: "https://ebugsfj.synbiohub.org" From 74dc66524f8caa161470c0c2795aacda9ce5145b Mon Sep 17 00:00:00 2001 From: CoderLLamaPhone <157067336+CoderLLamaPhone@users.noreply.github.com> Date: Wed, 24 Sep 2025 17:25:33 -0600 Subject: [PATCH 06/10] ISS206 --- src/components/activities/explorer/ListRegistries.jsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/components/activities/explorer/ListRegistries.jsx b/src/components/activities/explorer/ListRegistries.jsx index a0517845..a2d4e3d5 100644 --- a/src/components/activities/explorer/ListRegistries.jsx +++ b/src/components/activities/explorer/ListRegistries.jsx @@ -29,10 +29,8 @@ export default function ListRegistries({registry, defaultRegistry, onConfirmDele // right click handler, opens up delete option const handleRightClick = (event) => { event.preventDefault() - if (registry !== defaultRegistry){ - setRegistryToDelete(registry) - setContextMenuOpen(true) - } + setRegistryToDelete(registry) + setContextMenuOpen(true) } // command list From 49f28265648a987f80c9be86213db9353b3b40f8 Mon Sep 17 00:00:00 2001 From: CoderLLamaPhone <157067336+CoderLLamaPhone@users.noreply.github.com> Date: Wed, 24 Sep 2025 17:25:58 -0600 Subject: [PATCH 07/10] ISS210 --- src/activities.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/activities.js b/src/activities.js index 8e2f8bb4..fdda89a9 100644 --- a/src/activities.js +++ b/src/activities.js @@ -4,7 +4,7 @@ import GitHubView from "./components/activities/explorer/GitHubView"; import LoginStatus from "./components/activities/explorer/LoginStatus"; import { FileIcon, RemoteControlIcon, BugReport, ProfileGreen, ProfileOrange, ProfileRed, ProfileWhite } from "./icons" import { RiGithubFill } from "react-icons/ri"; -import { GiThorHammer} from "react-icons/gi"; +import { TiPipette } from "react-icons/ti"; import { ObjectTypes } from "./objectTypes"; import { FaGraduationCap } from "react-icons/fa"; import { BsGraphUpArrow } from "react-icons/bs"; @@ -57,7 +57,7 @@ export const Activities = { id: "synbio.activity.build", title: "Build", component: ExplorerActivityView, - icon: GiThorHammer, + icon: TiPipette, objectTypesToList: [ ObjectTypes.Plasmids.id, ObjectTypes.Strains.id, From adcad35568d18fdb7f908623087461eb813b9777 Mon Sep 17 00:00:00 2001 From: CoderLLamaPhone <157067336+CoderLLamaPhone@users.noreply.github.com> Date: Wed, 24 Sep 2025 18:07:49 -0600 Subject: [PATCH 08/10] ISS215 --- src/commands.js | 55 +++++++++++++++++++ .../activities/explorer/ExplorerListItem.jsx | 1 + 2 files changed, 56 insertions(+) diff --git a/src/commands.js b/src/commands.js index 6b00e7b7..84223786 100644 --- a/src/commands.js +++ b/src/commands.js @@ -1,6 +1,7 @@ import store from "./redux/store" import { isPanelOpen, panelsActions, serializePanel } from "./redux/hooks/panelsHooks" import { workDirActions, writeToFileHandle } from "./redux/hooks/workingDirectoryHooks" +import { useOpenPanel } from "./redux/hooks/panelsHooks" export default { @@ -67,6 +68,60 @@ export default { // save await writeToFileHandle(file, serializePanel(file.id)) } + }, + + FileDownload: { + id: createId("file-download"), + title: "Download File", + shortTitle: "Download", + description: "Download a file", + arguments: [ + { + name: "fileNameOrId", + prompt: "Enter the file name or ID" + } + ], + execute: async fileNameOrId => { + const file = findFileByNameOrId(fileNameOrId); + if (!file) return "File doesn't exist."; + + const state = store.getState().workingDirectory; + let fileData = state.entities[file.id]?.data; + + if (!fileData) { + const dirHandle = state.directoryHandle; + if (dirHandle && typeof dirHandle.getFileHandle === 'function') { + try { + const parts = file.id.split('/'); + let cur = dirHandle; + for (let i = 0; i < parts.length - 1; i++) { + cur = await cur.getDirectoryHandle(parts[i]); + } + const fh = await cur.getFileHandle(parts[parts.length - 1]); + fileData = await fh.getFile(); + } catch (err) { + console.warn('Failed to read file from directoryHandle', err); + } + } else { + console.warn('No usable directoryHandle in store. directoryHandle:', dirHandle); + } + } + + if (!fileData) { + console.log("File data not found."); + return "File data not found."; + } + + const blob = typeof fileData === "string" ? new Blob([fileData], { type: "text/plain" }) : fileData; + const url = URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = file.name; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + } } } diff --git a/src/components/activities/explorer/ExplorerListItem.jsx b/src/components/activities/explorer/ExplorerListItem.jsx index 4509ab3c..d053a044 100644 --- a/src/components/activities/explorer/ExplorerListItem.jsx +++ b/src/components/activities/explorer/ExplorerListItem.jsx @@ -27,6 +27,7 @@ export default function ExplorerListItem({ fileId, icon }) { // command list const contextMenuCommands = [ + commands.FileDownload, commands.FileDelete ] From 2174fb86f73ccfdafc26d3bdc665cd35ebb76db3 Mon Sep 17 00:00:00 2001 From: CoderLLamaPhone <157067336+CoderLLamaPhone@users.noreply.github.com> Date: Wed, 24 Sep 2025 18:13:34 -0600 Subject: [PATCH 09/10] ISS224 --- src/redux/hooks/workingDirectoryHooks.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/redux/hooks/workingDirectoryHooks.js b/src/redux/hooks/workingDirectoryHooks.js index 8932a63d..e499b89c 100644 --- a/src/redux/hooks/workingDirectoryHooks.js +++ b/src/redux/hooks/workingDirectoryHooks.js @@ -54,7 +54,7 @@ export function useCreateFile() { return (fileName, objectType, directory = workDir) => { // Optional arg directory in which the file will be created directory.getFileHandle(fileName, { create: true }) .then(fileHandle => { - addFileMetadata(fileHandle, directory.name, { objectType }) + addFileMetadata(fileHandle, directory == workDir ? null : directory.name, { objectType }) dispatch(actions.addFile(fileHandle)) openPanel(fileHandle) }) From dcc37e7bd2a816779401fa0234ce472e834fba22 Mon Sep 17 00:00:00 2001 From: CoderLLamaPhone <157067336+CoderLLamaPhone@users.noreply.github.com> Date: Fri, 26 Sep 2025 09:23:53 -0600 Subject: [PATCH 10/10] Closes #225 --- src/components/activities/explorer/ExplorerList.jsx | 8 ++++++-- src/components/activities/explorer/Registries.jsx | 4 ++-- src/objectTypes.js | 3 +-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/components/activities/explorer/ExplorerList.jsx b/src/components/activities/explorer/ExplorerList.jsx index bab9e6b1..2ac1b7a1 100644 --- a/src/components/activities/explorer/ExplorerList.jsx +++ b/src/components/activities/explorer/ExplorerList.jsx @@ -118,11 +118,15 @@ export default function ExplorerList({workDir, objectTypesToList}) { } {createListItems(filesOfType, objectType.icon)} - {objectType.isRepository && + {objectType.isRepository ? objectType.id == "synbio.object-type.flapjack" ? : + + : <> } diff --git a/src/components/activities/explorer/Registries.jsx b/src/components/activities/explorer/Registries.jsx index 2c15ab5b..70821b5e 100644 --- a/src/components/activities/explorer/Registries.jsx +++ b/src/components/activities/explorer/Registries.jsx @@ -12,12 +12,12 @@ import { showNotification } from '@mantine/notifications'; /** * Component to handle the creation, deletion, and containment of SynBioHub registries. */ -export default function Registries({defaultRegistry, typeOfRegistry, title}){ +export default function Registries({typeOfRegistry, title, defaultRegistry = null}){ const dispatch = useDispatch() // Get default registry and additional ones from localStorage const storedRegistries = JSON.parse(localStorage.getItem(typeOfRegistry)) || []; - const [registries, setRegistries] = useState([defaultRegistry, ...storedRegistries]) + const [registries, setRegistries] = useState(defaultRegistry ? [defaultRegistry, ...storedRegistries] : [...storedRegistries]) const onCreate = (inputValue) => { diff --git a/src/objectTypes.js b/src/objectTypes.js index ce5be654..36194298 100644 --- a/src/objectTypes.js +++ b/src/objectTypes.js @@ -19,7 +19,7 @@ export const ObjectTypes = { listTitle: "SynBioHub Repositories", icon: RiGitRepositoryLine, isRepository: true, - defaultRegistry: "https://synbiohub.org" + defaultRegistry: "https://dev2.synbiohub.org" }, Chassis: { id: "synbio.object-type.chassis", @@ -194,7 +194,6 @@ export const ObjectTypes = { listTitle: "Flapjack Repositories", icon: RiGitRepositoryLine, isRepository: true, - defaultRegistry: "https://ebugsfj.synbiohub.org" }, }